From: Anton Gladky Date: Sat, 31 Dec 2016 08:54:59 +0000 (+0000) Subject: Import solvespace_2.3+repack1.orig.tar.xz X-Git-Tag: archive/raspbian/3.1+ds1-3+rpi1~1^2^2~5 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=f24c4a6625fcb7c9a481c0bb166cbac4a604248c;p=solvespace.git Import solvespace_2.3+repack1.orig.tar.xz [dgit import orig solvespace_2.3+repack1.orig.tar.xz] --- f24c4a6625fcb7c9a481c0bb166cbac4a604248c diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000..b51c80c --- /dev/null +++ b/.travis.yml @@ -0,0 +1,22 @@ +language: c +os: + - linux + - osx +sudo: required +dist: trusty +install: + - if [[ "$TRAVIS_OS_NAME" == "linux" ]]; then ./.travis/install-debian.sh; fi + - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then ./.travis/install-macos.sh; fi +script: + - if [[ "$TRAVIS_OS_NAME" == "linux" ]]; then ./.travis/build-debian.sh; fi + - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then ./.travis/build-macos.sh; fi +deploy: + - provider: releases + api_key: + secure: dDlkIawHcODlW9B/20/cQCtzeoocvs0hKuNngRKXKqzXLWTRq33oq/B7+39tAixWbmv6exTpijiKrRNFiSCW5Z4iwHLwaRD4XJznxw63e/Hus/dxg2Tvqx7XFpkCz8mT1Z+gZQE5YxAngeZPpI/sZbZtF1UO3yH5eLeeokZ15p26ZskQUPoYuzrTgTzYL3XfpG3F+20rNBawH1ycsCTVD/08/n31d2m3CrKAsbW7er92ek6w4fzKr7NW8WeXjrPJETVpw5fQg1Od3pRGW8dPQaJcvKQEogMp8Mm0ETYd0qigg89/giBz7QwOgmAWQ4dH+DfZH4Ojl//127QztBolMvyDMQBykWrtJoGcij05sT6K2IJr2FHeUBO12MAEdjiVvhQj3DtTzjPiZAHHDBSLWxLKWWhlhHE4pq7g1MQhqXkaAHI2BLNzwLmaowbMT0bECf9yfz6xx18h6XPQFX44oOktraobVALFlyHqeKa8zdcUt22LF6uAL1m5dxL0tny3eXCIPE4UH/RZgua/cHV9G3cUvKQa/QnFSLRhvWVSbGB+7YsHouBJcsUOOW1gmd5442XuC7mpppccRldh+GSxUk6TBJRAx7TeQ0ybDUaoco9MUqp2twv3KreR2+8Q12PDaAhfQVNEGdF3wTm1sShImjCN4VN3eSLlBEbve1QRQXM= + skip_cleanup: true + file: build/solvespace.dmg + on: + repo: solvespace/solvespace + tags: true + condition: "$TRAVIS_OS_NAME == osx" diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..095eee6 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,127 @@ +Changelog +========= + +2.3 +--- + +Bug fixes: + * Do not crash when applying a symmetry constraint to two points. + * Fix TTF font metrics again (properly this time). + * Fix the "draw back faces in red" option. + * Fix export of wireframe as 3D DXF. + * Various minor crashes. + +2.2 +--- + +Other new features: + * OS X: support 3Dconnexion devices (SpaceMouse, SpaceNavigator, etc). + * GTK: files with uppercase extensions can be opened. + +Bug fixes: + * Do not remove autosaves after successfully opening a file, preventing + data loss in case of two abnormal terminations in a row. + * Do not crash when changing autosave interval. + * Unbreak the "Show degrees of freedom" command. + * Three.js: correctly respond to controls when browser zoom is used. + * OS X: do not completely hide main window when defocused. + * GTK: unbreak 3Dconnexion support. + * When pasting transformed entities, multiply constraint values by scale. + * Fix TTF font metrics (restore the behavior from version 2.0). + * Forcibly show the current group once we start a drawing operation. + * DXF export: always declare layers before using them. + * Do not truncate operations on selections to first 32 selected entities. + * Translate and rotate groups inherit the "suppress solid model" setting. + * DXF: files with paths containing non-ASCII or spaces can be exported + or imported. + * Significantly improved performance when dragging an entity. + * Various crashes and minor glitches. + +2.1 +--- + +New sketch features: + * Lathe groups create circle and face entities. + * New toolbar button for creating lathe groups. + * Chord tolerance is separated into two: display chord tolerance (specified + in percents, relative to model bounding box), and export chord tolerance + (specified in millimeters as absolute value). + * Bezier spline points can be added and removed after the spline is created. + * When an unconstrained extrusion is switched between "union" and + "difference", its normal is flipped. + * Groups can be added in the middle of the stack. Note that this results + in files incompatible with version 2.0. + * Active group can be removed. + * Removing an imported group does not cause all subsequent groups to also + be removed. + * When a new group with a solid is created, the color is taken from + a previous group with a solid, if any. + * Entities in a newly active group do not become visible. + * When entities are selected, "Zoom to fit" zooms to fit only these + entities and not the entire sketch. + * Zero-length edges are reported with a "zero-length error", not + "points not all coplanar". + +New constraint features: + * Height of the font used for drawing constraint labels can be changed. + * New constraint, length difference, placed with J. + (Patch by Peter Ruevski) + * Horizontal/vertical constraints are automatically added if a line segment + is close enough to being horizontal/vertical. This can be disabled by + holding Ctrl. + * Reference dimensions and angles can be placed with Shift+D and Shift+N. + * Copying and pasting entities duplicates any constraints that only involve + entities in the clipboard, as well as selected comments. + * Diameter constraints can be shown as radius. + * The "pi" identifier can be used in expressions. + * Constraint labels can be snapped to grid. + * Integer angles are displayed without trailing zeroes. + * Angle constraints have proper reference lines and arrowheads. + * Extension lines are drawn for point-line distance constraints. + +New solver features: + * Sketches with redundant and unsolvable constraints are distinguished. + * New group setting, "allow redundant constraints". Note that it makes + the solver less stable. + +New rendering and styling features: + * New line style parameter: stippling, based on ISO 128. + * Outlines of solids can be drawn in a particular style (by default, thick + lines) controlled by the "Show outline of solid model" button. + * Occluded edges can be drawn in a particular style (by default, stippled + with short dashes) controlled by the "Show hidden lines" button. + * Solids can be made transparent. + +New export/import features: + * The old "import" command (for .slvs files) is renamed to "link". + * If a linked .slvs file is not found, first the relative path recorded + in the .slvs file is checked and then the absolute path; this is + an inversion of the previously used order. If it is still not found, + a dialog appears offering to locate it. + * DXF and DWG files can be imported, with point-coincident, horizontal and + vertical constraints automatically inferred from geometry, and distance + and angle constraints created when a dimension placed against geometry + exists. + * Triangle mesh can be exported for viewing in the browser through WebGL. + * Export dialogs remember the last file format used, and preselect it. + * Exported DXF files have exact circles, arcs and splines instead of + a piecewise linear approximation (unless hidden line removal was needed). + * Exported DXF files preserve color and line thickness. + * In exported DXF files, constraints are represented as DXF dimensions, + instead of piecewise linear geometry. + * When exporting 2d views, overlapping lines are removed. + +Other new features: + * Native Linux (GTK 2 and GTK 3) and Mac OS X ports. + * Automatically save and then restore sketches if SolveSpace crashes. + (Patch by Marc Britten) + * Unicode is supported everywhere (filenames, group names, TTF text, + comments), although RTL scripts and scripts making heavy use of ligatures + are not rendered correctly. + * The vector font is grid-fitted when rendered on screen to make it easier + to read regardless of its size. + +2.0 +--- + +Initial public release. diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..ea464e5 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,195 @@ +# cmake configuration + +cmake_minimum_required(VERSION 3.1.0 FATAL_ERROR) +cmake_policy(VERSION 3.1.0) +set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} + "${CMAKE_SOURCE_DIR}/cmake/") +set(CMAKE_CXX_STANDARD 11) +set(CMAKE_CXX_STANDARD_REQUIRED YES) + +include(CheckIncludeFile) + +# for /MT on MSVC +set(CMAKE_USER_MAKE_RULES_OVERRIDE + "${CMAKE_SOURCE_DIR}/cmake/c_flag_overrides.cmake") +set(CMAKE_USER_MAKE_RULES_OVERRIDE_CXX + "${CMAKE_SOURCE_DIR}/cmake/cxx_flag_overrides.cmake") + +# project + +# NOTE TO PACKAGERS: The embedded git commit hash is critical for rapid bug triage when the builds +# can come from a variety of sources. If you are mirroring the sources or otherwise build when +# the .git directory is not present, please comment the following line: +include(GetGitCommitHash) +# and instead uncomment the following, adding the complete git hash of the checkout you are using: +# set(GIT_COMMIT_HASH 0000000000000000000000000000000000000000) + +project(solvespace) +set(solvespace_VERSION_MAJOR 2) +set(solvespace_VERSION_MINOR 3) +string(SUBSTRING "${GIT_COMMIT_HASH}" 0 8 solvespace_GIT_HASH) + +if(NOT WIN32 AND NOT APPLE) + set(GUI gtk2 CACHE STRING "GUI toolkit to use (one of: gtk2 gtk3)") +endif() + +# compiler + +if(WIN32) + add_definitions( + -D_CRT_SECURE_NO_DEPRECATE + -D_CRT_SECURE_NO_WARNINGS + -D_SCL_SECURE_NO_WARNINGS + -D_WIN32_WINNT=0x500 + -D_WIN32_IE=_WIN32_WINNT + -DISOLATION_AWARE_ENABLED + -DWIN32 + -DWIN32_LEAN_AND_MEAN + -DUNICODE + -DNOMINMAX + -D_UNICODE) +endif() + +if(MSVC) + # Many versions of MSVC do not have the (C99) inline keyword, instead + # they have their own __inline; this breaks `static inline` functions. + # We do not want to care and so we fix this with a definition. + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /Dinline=__inline") +endif() + +if(CMAKE_CXX_COMPILER_ID STREQUAL GNU OR CMAKE_CXX_COMPILER_ID STREQUAL Clang) + set(WARNING_FLAGS "-Wall -Wextra -Wno-unused-parameter") + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${WARNING_FLAGS}") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 ${WARNING_FLAGS}") +endif() + +if(MINGW) + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -static-libgcc") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -static-libgcc -static-libstdc++") +endif() + +if(APPLE) + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -stdlib=libc++") +endif() + +if(CMAKE_SYSTEM_NAME STREQUAL "Linux") + set(CMAKE_EXE_LINKER_FLAGS "-Wl,--as-needed ${CMAKE_EXE_LINKER_FLAGS}") +endif() + +if(CMAKE_SYSTEM_NAME STREQUAL "FreeBSD") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -stdlib=libc++") + set(CMAKE_EXE_LINKER_FLAGS "-Wl,--as-needed ${CMAKE_EXE_LINKER_FLAGS}") +endif() + +if(SANITIZE) + if(NOT (CMAKE_C_COMPILER_ID STREQUAL Clang AND CMAKE_CXX_COMPILER_ID STREQUAL Clang)) + message(ERROR "Sanitizers are only available in Clang/Clang++") + endif() + set(SANITIZE_FLAGS "-O1 -fno-omit-frame-pointer -fno-optimize-sibling-calls") + set(SANITIZE_FLAGS "${SANITIZE_FLAGS} -fsanitize=address,undefined,integer") + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${SANITIZE_FLAGS}") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${SANITIZE_FLAGS}") +endif() + +# dependencies + +find_package(OpenGL REQUIRED) + +message(STATUS "Using in-tree libdxfrw") +add_subdirectory(extlib/libdxfrw) + +if(WIN32) + # Configure Freetype first. If done later, it will notice that + # zlib is available, try to use it and promptly break on MSVC + # in a very obscure way. Given that the only use of zlib, bzip2 + # and png support is in support for extremely obsolete Unix fonts, + # we don't care. + find_package(Freetype) + + if(NOT FREETYPE_FOUND) + message(STATUS "Using in-tree libfreetype") + + add_subdirectory(extlib/libfreetype EXCLUDE_FROM_ALL) + + set(FREETYPE_LIBRARY + freetype) + set(FREETYPE_INCLUDE_DIRS + "${CMAKE_SOURCE_DIR}/extlib/libfreetype/include") + find_package(Freetype REQUIRED) + endif() + + find_package(ZLIB) + + if(NOT ZLIB_FOUND) + message(STATUS "Using in-tree zlib") + add_subdirectory(extlib/zlib EXCLUDE_FROM_ALL) + + message(STATUS "Using in-tree libpng") + set(ZLIB_LIBRARY + zlibstatic) + set(ZLIB_INCLUDE_DIR + "${CMAKE_SOURCE_DIR}/extlib/zlib" + "${CMAKE_BINARY_DIR}/extlib/zlib") + find_package(ZLIB REQUIRED) + endif() + + find_package(PNG) + + if(NOT PNG_FOUND) + message(STATUS "Using in-tree libpng") + + set(SKIP_INSTALL_ALL + ON) + add_subdirectory(extlib/libpng EXCLUDE_FROM_ALL) + + set(PNG_LIBRARY + png16_static) + set(PNG_PNG_INCLUDE_DIR + "${CMAKE_SOURCE_DIR}/extlib/libpng" + "${CMAKE_BINARY_DIR}/extlib/libpng") + find_package(PNG REQUIRED) + endif() + + if(NOT MINGW) + message(STATUS "Using prebuilt SpaceWare") + set(SPACEWARE_FOUND TRUE) + set(SPACEWARE_INCLUDE_DIR + "${CMAKE_SOURCE_DIR}/extlib/si") + set(SPACEWARE_LIBRARIES + "${CMAKE_SOURCE_DIR}/extlib/si/siapp.lib") + endif() +elseif(APPLE) + set(CMAKE_FIND_FRAMEWORK LAST) + + find_package(PNG REQUIRED) + find_package(Freetype REQUIRED) + find_library(APPKIT_LIBRARY AppKit REQUIRED) +else() # Linux and compatible systems + find_package(SpaceWare) + + # Use freedesktop's pkg-config to locate everything. + find_package(PkgConfig REQUIRED) + pkg_check_modules(ZLIB REQUIRED zlib) + pkg_check_modules(PNG REQUIRED libpng) + pkg_check_modules(FONTCONFIG REQUIRED fontconfig) + pkg_check_modules(JSONC REQUIRED json-c) + pkg_check_modules(GLEW REQUIRED glew) + pkg_check_modules(FREETYPE REQUIRED freetype2) + + set(HAVE_GTK TRUE) + if(GUI STREQUAL "gtk3") + set(HAVE_GTK3 TRUE) + pkg_check_modules(GTKMM REQUIRED gtkmm-3.0 pangomm-1.4 x11) + elseif(GUI STREQUAL "gtk2") + set(HAVE_GTK2 TRUE) + pkg_check_modules(GTKMM REQUIRED gtkmm-2.4 pangomm-1.4 x11) + else() + message(FATAL_ERROR "GUI unrecognized: ${GUI}") + endif() +endif() + +# components + +add_subdirectory(tools) +add_subdirectory(src) +add_subdirectory(exposed) diff --git a/COPYING.txt b/COPYING.txt new file mode 100644 index 0000000..a737dcf --- /dev/null +++ b/COPYING.txt @@ -0,0 +1,675 @@ + + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git a/README.md b/README.md new file mode 100644 index 0000000..838b92f --- /dev/null +++ b/README.md @@ -0,0 +1,150 @@ +SolveSpace +========== + +This repository contains the source code of [SolveSpace][], a parametric +2d/3d CAD. + +[solvespace]: http://solvespace.com + +Installation +------------ + +### Mac OS X (>=10.6 64-bit), Debian (>=jessie) and Ubuntu (>=trusty) + +Binary packages for Mac OS X and Debian derivatives are available +via [GitHub releases][rel]. + +[rel]: https://github.com/solvespace/solvespace/releases + +### Other systems + +See below. + +Building on Linux +----------------- + +### Building for Linux + +You will need CMake, libpng, zlib, json-c, fontconfig, freetype, gtkmm 2.4, +pangomm 1.4, OpenGL, OpenGL GLU and OpenGL GLEW, and optionally, the Space Navigator +client library. +On a Debian derivative (e.g. Ubuntu) these can be installed with: + + apt-get install libpng12-dev libjson-c-dev libfreetype6-dev \ + libfontconfig1-dev libgtkmm-2.4-dev libpangomm-1.4-dev \ + libgl-dev libglu-dev libglew-dev libspnav-dev cmake + +Before building, check out the necessary submodules: + + git submodule update --init extlib/libdxfrw + +After that, build SolveSpace as following: + + mkdir build + cd build + cmake .. + make + sudo make install + +A fully functional port to GTK3 is available, but not recommended +for use due to bugs in this toolkit. + +### Building for Windows + +You will need CMake, a Windows cross-compiler, and Wine with binfmt support. +On a Debian derivative (e.g. Ubuntu) these can be installed with: + + apt-get install cmake mingw-w64 wine-binfmt + +Before building, check out the necessary submodules: + + git submodule update --init + +After that, build 32-bit SolveSpace as following: + + mkdir build + cd build + cmake -DCMAKE_TOOLCHAIN_FILE=../cmake/Toolchain-mingw32.cmake .. + make solvespace + +Or, build 64-bit SolveSpace as following: + + mkdir build + cd build + cmake -DCMAKE_TOOLCHAIN_FILE=../cmake/Toolchain-mingw64.cmake .. + make solvespace + +The application is built as `build/src/solvespace.exe`. + +Space Navigator support will not be available. + +Building on Mac OS X +-------------------- + +You will need XCode tools, CMake, libpng and Freetype. Assuming you use +[homebrew][], these can be installed with: + + brew install cmake libpng freetype + +XCode has to be installed via AppStore; it requires a free Apple ID. + +Before building, check out the necessary submodules: + + git submodule update --init extlib/libdxfrw + +After that, build SolveSpace as following: + + mkdir build + cd build + cmake .. + make + +The app bundle is built in `build/src/solvespace.app`. + +[homebrew]: http://brew.sh/ + +Building on Windows +------------------- + +You will need [cmake][cmakewin] and Visual C++. + +### GUI build + +Check out the git submodules. Create a directory `build` in +the source tree and point cmake-gui to the source tree and that directory. +Press "Configure" and "Generate", then open `build\solvespace.sln` with +Visual C++ and build it. + +### Command-line build + +First, ensure that git and cl (the Visual C++ compiler driver) are in your +`%PATH%`; the latter is usually done by invoking `vcvarsall.bat` from your +Visual Studio install. Then, run the following in cmd or PowerShell: + + git submodule update --init + mkdir build + cd build + cmake .. -G "NMake Makefiles" + nmake + +### MSVC build + +It is also possible to build SolveSpace using [MinGW][mingw], though +Space Navigator support will be disabled. + +First, ensure that git and gcc are in your `$PATH`. Then, run the following +in bash: + + git submodule update --init + mkdir build + cd build + cmake .. + make + +[cmakewin]: http://www.cmake.org/download/#latest +[mingw]: http://www.mingw.org/ + +License +------- + +SolveSpace is distributed under the terms of the [GPL3 license](COPYING.txt). diff --git a/appveyor.yml b/appveyor.yml new file mode 100644 index 0000000..4f4b3ae --- /dev/null +++ b/appveyor.yml @@ -0,0 +1,28 @@ +version: 2.2.{build} +clone_depth: 1 +before_build: + - git submodule update --init + - mkdir build + - cd build + - set tag=x%APPVEYOR_REPO_TAG_NAME% + - if %tag:~,2% == xv (set BUILD_TYPE=RelWithDebInfo) else (set BUILD_TYPE=Debug) + - cmake -G"Visual Studio 12" -T v120_xp -DCMAKE_BUILD_TYPE=%BUILD_TYPE% .. +build_script: + - msbuild "src\solvespace.vcxproj" /verbosity:minimal /property:Configuration=%BUILD_TYPE% /logger:"C:\Program Files\AppVeyor\BuildAgent\Appveyor.MSBuildLogger.dll" +artifacts: + - path: build\src\Debug\solvespace.exe + name: solvespace.exe + - path: build\src\Debug\solvespace.pdb + name: solvespace.pdb + - path: build\src\RelWithDebInfo\solvespace.exe + name: solvespace.exe + - path: build\src\RelWithDebInfo\solvespace.pdb + name: solvespace.pdb +deploy: + - provider: GitHub + auth_token: + secure: P9/pf2nM+jlWKe7pCjMp41HycBNP/+5AsmE/TETrDUoBOa/9WFHelqdVFrbRn9IC + description: "" + artifact: solvespace.exe + on: + appveyor_repo_tag: true diff --git a/cmake/FindSpaceWare.cmake b/cmake/FindSpaceWare.cmake new file mode 100644 index 0000000..135384a --- /dev/null +++ b/cmake/FindSpaceWare.cmake @@ -0,0 +1,28 @@ +# Find the libspnav library and header. +# +# Sets the usual variables expected for find_package scripts: +# +# SPACEWARE_INCLUDE_DIR - header location +# SPACEWARE_LIBRARIES - library to link against +# SPACEWARE_FOUND - true if pugixml was found. + +if(UNIX) + + find_path(SPACEWARE_INCLUDE_DIR + spnav.h) + + find_library(SPACEWARE_LIBRARY + NAMES spnav libspnav) + + # Support the REQUIRED and QUIET arguments, and set SPACEWARE_FOUND if found. + include(FindPackageHandleStandardArgs) + FIND_PACKAGE_HANDLE_STANDARD_ARGS(SPACEWARE DEFAULT_MSG + SPACEWARE_LIBRARY SPACEWARE_INCLUDE_DIR) + + if(SPACEWARE_FOUND) + set(SPACEWARE_LIBRARIES ${SPACEWARE_LIBRARY}) + endif() + + mark_as_advanced(SPACEWARE_LIBRARY SPACEWARE_INCLUDE_DIR) + +endif() diff --git a/cmake/GetGitCommitHash.cmake b/cmake/GetGitCommitHash.cmake new file mode 100644 index 0000000..f67a844 --- /dev/null +++ b/cmake/GetGitCommitHash.cmake @@ -0,0 +1,35 @@ +function(get_git_commit_hash) + get_filename_component(GIT_DESCRIBE_CMAKE_DIR ${CMAKE_CURRENT_LIST_FILE} PATH) + get_filename_component(GIT_ROOT ${GIT_DESCRIBE_CMAKE_DIR} PATH) + set(GIT_DIR "${GIT_ROOT}/.git") + + # Add a CMake configure dependency to the currently checked out revision. + set(GIT_DEPENDS ${GIT_DIR}/HEAD) + file(READ ${GIT_DIR}/HEAD HEAD_REF) + if(HEAD_REF MATCHES "ref: (.+)\n") + set(HEAD_REF ${CMAKE_MATCH_1}) + if(EXISTS "${GIT_DIR}/${HEAD_REF}") + list(APPEND GIT_DEPENDS ${GIT_DIR}/${HEAD_REF}) + file(READ ${GIT_DIR}/${HEAD_REF} HEAD_REF) + elseif(EXISTS "${GIT_DIR}/packed-refs") + list(APPEND GIT_DEPENDS ${GIT_DIR}/packed-refs) + file(READ "${GIT_DIR}/packed-refs" PACKED_REFS) + if(${PACKED_REFS} MATCHES "([0-9a-z]*) ${HEAD_REF}") + set(HEAD_REF ${CMAKE_MATCH_1}) + else() + set(HEAD_REF "") + endif() + else() + set(HEAD_REF "") + endif() + endif() + set_property(DIRECTORY APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS ${GIT_DEPENDS}) + + string(STRIP ${HEAD_REF} HEAD_REF) + if(HEAD_REF STREQUAL "") + message(WARNING "Cannot determine git HEAD") + else() + set(GIT_COMMIT_HASH ${HEAD_REF} PARENT_SCOPE) + endif() +endfunction() +get_git_commit_hash() diff --git a/cmake/MacOSXBundleInfo.plist.in b/cmake/MacOSXBundleInfo.plist.in new file mode 100644 index 0000000..c215c44 --- /dev/null +++ b/cmake/MacOSXBundleInfo.plist.in @@ -0,0 +1,47 @@ + + + + + CFBundleDevelopmentRegion + English + CFBundleExecutable + solvespace + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + SolveSpace + CFBundlePackageType + APPL + CFBundleVersion + ${solvespace_VERSION_MAJOR}.${solvespace_VERSION_MINOR} + CFBundleShortVersionString + ${solvespace_VERSION_MAJOR}.${solvespace_VERSION_MINOR} + NSHumanReadableCopyright + © 2008-2015 Jonathan Westhues and other authors + NSPrincipalClass + NSApplication + NSMainNibFile + MainMenu + CFBundleIconFile + AppIcon + CFBundleDocumentTypes + + + CFBundleTypeExtensions + + slvs + + CFBundleTypeIconFile + AppIcon.icns + CFBundleTypeName + SolveSpace sketch + CFBundleTypeOSTypes + + slvs + + CFBundleTypeRole + Editor + + + + diff --git a/cmake/Toolchain-mingw32.cmake b/cmake/Toolchain-mingw32.cmake new file mode 100644 index 0000000..a3591c8 --- /dev/null +++ b/cmake/Toolchain-mingw32.cmake @@ -0,0 +1,13 @@ +SET(CMAKE_SYSTEM_NAME Windows) + +SET(TRIPLE i686-w64-mingw32) + +SET(CMAKE_C_COMPILER ${TRIPLE}-gcc) +SET(CMAKE_CXX_COMPILER ${TRIPLE}-g++) +SET(CMAKE_RC_COMPILER ${TRIPLE}-windres) + +SET(CMAKE_FIND_ROOT_PATH /usr/${TRIPLE}) + +set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) +set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) +set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) diff --git a/cmake/Toolchain-mingw64.cmake b/cmake/Toolchain-mingw64.cmake new file mode 100644 index 0000000..6841214 --- /dev/null +++ b/cmake/Toolchain-mingw64.cmake @@ -0,0 +1,13 @@ +SET(CMAKE_SYSTEM_NAME Windows) + +SET(TRIPLE x86_64-w64-mingw32) + +SET(CMAKE_C_COMPILER ${TRIPLE}-gcc) +SET(CMAKE_CXX_COMPILER ${TRIPLE}-g++) +SET(CMAKE_RC_COMPILER ${TRIPLE}-windres) + +SET(CMAKE_FIND_ROOT_PATH /usr/${TRIPLE}) + +set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) +set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) +set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) diff --git a/cmake/c_flag_overrides.cmake b/cmake/c_flag_overrides.cmake new file mode 100644 index 0000000..b21f00e --- /dev/null +++ b/cmake/c_flag_overrides.cmake @@ -0,0 +1,6 @@ +if(MSVC) + set(CMAKE_C_FLAGS_DEBUG_INIT "/D_DEBUG /MTd /Zi /Ob0 /Od /RTC1") + set(CMAKE_C_FLAGS_MINSIZEREL_INIT "/MT /O1 /Ob1 /D NDEBUG") + set(CMAKE_C_FLAGS_RELEASE_INIT "/MT /O2 /Ob2 /D NDEBUG") + set(CMAKE_C_FLAGS_RELWITHDEBINFO_INIT "/MT /Zi /O2 /Ob1 /D NDEBUG") +endif() \ No newline at end of file diff --git a/cmake/cxx_flag_overrides.cmake b/cmake/cxx_flag_overrides.cmake new file mode 100644 index 0000000..67e0043 --- /dev/null +++ b/cmake/cxx_flag_overrides.cmake @@ -0,0 +1,6 @@ +if(MSVC) + set(CMAKE_CXX_FLAGS_DEBUG_INIT "/D_DEBUG /MTd /Zi /Ob0 /Od /RTC1") + set(CMAKE_CXX_FLAGS_MINSIZEREL_INIT "/MT /O1 /Ob1 /D NDEBUG") + set(CMAKE_CXX_FLAGS_RELEASE_INIT "/MT /O2 /Ob2 /D NDEBUG") + set(CMAKE_CXX_FLAGS_RELWITHDEBINFO_INIT "/MT /Zi /O2 /Ob1 /D NDEBUG") +endif() diff --git a/exposed/CDemo.c b/exposed/CDemo.c new file mode 100644 index 0000000..574f100 --- /dev/null +++ b/exposed/CDemo.c @@ -0,0 +1,274 @@ +/*----------------------------------------------------------------------------- + * Some sample code for slvs.dll. We draw some geometric entities, provide + * initial guesses for their positions, and then constrain them. The solver + * calculates their new positions, in order to satisfy the constraints. + * + * Copyright 2008-2013 Jonathan Westhues. + *---------------------------------------------------------------------------*/ +#ifdef HAVE_CONFIG_H +# include +#endif +#ifdef WIN32 +# include +#endif +#include +#include +#include +#ifdef HAVE_STDINT_H +# include +#endif + +#include + +static Slvs_System sys; + +static void *CheckMalloc(size_t n) +{ + void *r = malloc(n); + if(!r) { + printf("out of memory!\n"); + exit(-1); + } + return r; +} + +/*----------------------------------------------------------------------------- + * An example of a constraint in 3d. We create a single group, with some + * entities and constraints. + *---------------------------------------------------------------------------*/ +void Example3d(void) +{ + /* This will contain a single group, which will arbitrarily number 1. */ + Slvs_hGroup g = 1; + + /* A point, initially at (x y z) = (10 10 10) */ + sys.param[sys.params++] = Slvs_MakeParam(1, g, 10.0); + sys.param[sys.params++] = Slvs_MakeParam(2, g, 10.0); + sys.param[sys.params++] = Slvs_MakeParam(3, g, 10.0); + sys.entity[sys.entities++] = Slvs_MakePoint3d(101, g, 1, 2, 3); + /* and a second point at (20 20 20) */ + sys.param[sys.params++] = Slvs_MakeParam(4, g, 20.0); + sys.param[sys.params++] = Slvs_MakeParam(5, g, 20.0); + sys.param[sys.params++] = Slvs_MakeParam(6, g, 20.0); + sys.entity[sys.entities++] = Slvs_MakePoint3d(102, g, 4, 5, 6); + /* and a line segment connecting them. */ + sys.entity[sys.entities++] = Slvs_MakeLineSegment(200, g, + SLVS_FREE_IN_3D, 101, 102); + + /* The distance between the points should be 30.0 units. */ + sys.constraint[sys.constraints++] = Slvs_MakeConstraint( + 1, g, + SLVS_C_PT_PT_DISTANCE, + SLVS_FREE_IN_3D, + 30.0, + 101, 102, 0, 0); + + /* Let's tell the solver to keep the second point as close to constant + * as possible, instead moving the first point. */ + sys.dragged[0] = 4; + sys.dragged[1] = 5; + sys.dragged[2] = 6; + + /* Now that we have written our system, we solve. */ + Slvs_Solve(&sys, g); + + if(sys.result == SLVS_RESULT_OKAY) { + printf("okay; now at (%.3f %.3f %.3f)\n" + " (%.3f %.3f %.3f)\n", + sys.param[0].val, sys.param[1].val, sys.param[2].val, + sys.param[3].val, sys.param[4].val, sys.param[5].val); + printf("%d DOF\n", sys.dof); + } else { + printf("solve failed"); + } +} + +/*----------------------------------------------------------------------------- + * An example of a constraint in 2d. In our first group, we create a workplane + * along the reference frame's xy plane. In a second group, we create some + * entities in that group and dimension them. + *---------------------------------------------------------------------------*/ +void Example2d(void) +{ + Slvs_hGroup g; + double qw, qx, qy, qz; + + g = 1; + /* First, we create our workplane. Its origin corresponds to the origin + * of our base frame (x y z) = (0 0 0) */ + sys.param[sys.params++] = Slvs_MakeParam(1, g, 0.0); + sys.param[sys.params++] = Slvs_MakeParam(2, g, 0.0); + sys.param[sys.params++] = Slvs_MakeParam(3, g, 0.0); + sys.entity[sys.entities++] = Slvs_MakePoint3d(101, g, 1, 2, 3); + /* and it is parallel to the xy plane, so it has basis vectors (1 0 0) + * and (0 1 0). */ + Slvs_MakeQuaternion(1, 0, 0, + 0, 1, 0, &qw, &qx, &qy, &qz); + sys.param[sys.params++] = Slvs_MakeParam(4, g, qw); + sys.param[sys.params++] = Slvs_MakeParam(5, g, qx); + sys.param[sys.params++] = Slvs_MakeParam(6, g, qy); + sys.param[sys.params++] = Slvs_MakeParam(7, g, qz); + sys.entity[sys.entities++] = Slvs_MakeNormal3d(102, g, 4, 5, 6, 7); + + sys.entity[sys.entities++] = Slvs_MakeWorkplane(200, g, 101, 102); + + /* Now create a second group. We'll solve group 2, while leaving group 1 + * constant; so the workplane that we've created will be locked down, + * and the solver can't move it. */ + g = 2; + /* These points are represented by their coordinates (u v) within the + * workplane, so they need only two parameters each. */ + sys.param[sys.params++] = Slvs_MakeParam(11, g, 10.0); + sys.param[sys.params++] = Slvs_MakeParam(12, g, 20.0); + sys.entity[sys.entities++] = Slvs_MakePoint2d(301, g, 200, 11, 12); + + sys.param[sys.params++] = Slvs_MakeParam(13, g, 20.0); + sys.param[sys.params++] = Slvs_MakeParam(14, g, 10.0); + sys.entity[sys.entities++] = Slvs_MakePoint2d(302, g, 200, 13, 14); + + /* And we create a line segment with those endpoints. */ + sys.entity[sys.entities++] = Slvs_MakeLineSegment(400, g, + 200, 301, 302); + + /* Now three more points. */ + sys.param[sys.params++] = Slvs_MakeParam(15, g, 100.0); + sys.param[sys.params++] = Slvs_MakeParam(16, g, 120.0); + sys.entity[sys.entities++] = Slvs_MakePoint2d(303, g, 200, 15, 16); + + sys.param[sys.params++] = Slvs_MakeParam(17, g, 120.0); + sys.param[sys.params++] = Slvs_MakeParam(18, g, 110.0); + sys.entity[sys.entities++] = Slvs_MakePoint2d(304, g, 200, 17, 18); + + sys.param[sys.params++] = Slvs_MakeParam(19, g, 115.0); + sys.param[sys.params++] = Slvs_MakeParam(20, g, 115.0); + sys.entity[sys.entities++] = Slvs_MakePoint2d(305, g, 200, 19, 20); + + /* And arc, centered at point 303, starting at point 304, ending at + * point 305. */ + sys.entity[sys.entities++] = Slvs_MakeArcOfCircle(401, g, 200, 102, + 303, 304, 305); + + /* Now one more point, and a distance */ + sys.param[sys.params++] = Slvs_MakeParam(21, g, 200.0); + sys.param[sys.params++] = Slvs_MakeParam(22, g, 200.0); + sys.entity[sys.entities++] = Slvs_MakePoint2d(306, g, 200, 21, 22); + + sys.param[sys.params++] = Slvs_MakeParam(23, g, 30.0); + sys.entity[sys.entities++] = Slvs_MakeDistance(307, g, 200, 23); + + /* And a complete circle, centered at point 306 with radius equal to + * distance 307. The normal is 102, the same as our workplane. */ + sys.entity[sys.entities++] = Slvs_MakeCircle(402, g, 200, + 306, 102, 307); + + + /* The length of our line segment is 30.0 units. */ + sys.constraint[sys.constraints++] = Slvs_MakeConstraint( + 1, g, + SLVS_C_PT_PT_DISTANCE, + 200, + 30.0, + 301, 302, 0, 0); + + /* And the distance from our line segment to the origin is 10.0 units. */ + sys.constraint[sys.constraints++] = Slvs_MakeConstraint( + 2, g, + SLVS_C_PT_LINE_DISTANCE, + 200, + 10.0, + 101, 0, 400, 0); + /* And the line segment is vertical. */ + sys.constraint[sys.constraints++] = Slvs_MakeConstraint( + 3, g, + SLVS_C_VERTICAL, + 200, + 0.0, + 0, 0, 400, 0); + /* And the distance from one endpoint to the origin is 15.0 units. */ + sys.constraint[sys.constraints++] = Slvs_MakeConstraint( + 4, g, + SLVS_C_PT_PT_DISTANCE, + 200, + 15.0, + 301, 101, 0, 0); +#if 0 + /* And same for the other endpoint; so if you add this constraint then + * the sketch is overconstrained and will signal an error. */ + sys.constraint[sys.constraints++] = Slvs_MakeConstraint( + 5, g, + SLVS_C_PT_PT_DISTANCE, + 200, + 18.0, + 302, 101, 0, 0); +#endif /* 0 */ + + /* The arc and the circle have equal radius. */ + sys.constraint[sys.constraints++] = Slvs_MakeConstraint( + 6, g, + SLVS_C_EQUAL_RADIUS, + 200, + 0.0, + 0, 0, 401, 402); + /* The arc has radius 17.0 units. */ + sys.constraint[sys.constraints++] = Slvs_MakeConstraint( + 7, g, + SLVS_C_DIAMETER, + 200, + 17.0*2, + 0, 0, 401, 0); + + /* If the solver fails, then ask it to report which constraints caused + * the problem. */ + sys.calculateFaileds = 1; + + /* And solve. */ + Slvs_Solve(&sys, g); + + if(sys.result == SLVS_RESULT_OKAY) { + printf("solved okay\n"); + printf("line from (%.3f %.3f) to (%.3f %.3f)\n", + sys.param[7].val, sys.param[8].val, + sys.param[9].val, sys.param[10].val); + + printf("arc center (%.3f %.3f) start (%.3f %.3f) finish (%.3f %.3f)\n", + sys.param[11].val, sys.param[12].val, + sys.param[13].val, sys.param[14].val, + sys.param[15].val, sys.param[16].val); + + printf("circle center (%.3f %.3f) radius %.3f\n", + sys.param[17].val, sys.param[18].val, + sys.param[19].val); + printf("%d DOF\n", sys.dof); + } else { + int i; + printf("solve failed: problematic constraints are:"); + for(i = 0; i < sys.faileds; i++) { + printf(" %d", sys.failed[i]); + } + printf("\n"); + if(sys.result == SLVS_RESULT_INCONSISTENT) { + printf("system inconsistent\n"); + } else { + printf("system nonconvergent\n"); + } + } +} + +int main(void) +{ + sys.param = CheckMalloc(50*sizeof(sys.param[0])); + sys.entity = CheckMalloc(50*sizeof(sys.entity[0])); + sys.constraint = CheckMalloc(50*sizeof(sys.constraint[0])); + + sys.failed = CheckMalloc(50*sizeof(sys.failed[0])); + sys.faileds = 50; + + /*Example3d();*/ + for(;;) { + Example2d(); + sys.params = sys.constraints = sys.entities = 0; + break; + } + return 0; +} + diff --git a/exposed/CMakeLists.txt b/exposed/CMakeLists.txt new file mode 100644 index 0000000..bdc3fc3 --- /dev/null +++ b/exposed/CMakeLists.txt @@ -0,0 +1,8 @@ +include_directories( + ${CMAKE_SOURCE_DIR}/include) + +add_executable(CDemo + CDemo.c) + +target_link_libraries(CDemo + slvs) diff --git a/exposed/DOC.txt b/exposed/DOC.txt new file mode 100644 index 0000000..743349b --- /dev/null +++ b/exposed/DOC.txt @@ -0,0 +1,467 @@ + +INTRODUCTION +============ + +A sketch in SolveSpace consists of three basic elements: parameters, +entities, and constraints. + +A parameter (Slvs_Param) is a single real number, represented internally +by a double-precision floating point variable. The parameters are unknown +variables that the solver modifies in order to satisfy the constraints. + +An entity (Slvs_Entity) is a geometric thing, like a point or a line +segment or a circle. Entities are defined in terms of parameters, +and in terms of other entities. For example, a point in three-space +is represented by three parameters, corresponding to its x, y, and z +coordinates in our base coordinate frame. A line segment is represented +by two point entities, corresponding to its endpoints. + +A constraint (Slvs_Constraint) is a geometric property of an entity, +or a relationship among multiple entities. For example, a point-point +distance constraint will set the distance between two point entities. + +Parameters, entities, and constraints are typically referenced by their +handles (Slvs_hParam, Slvs_hEntity, Slvs_hConstraint). These handles are +32-bit integer values starting from 1. The zero handle is reserved. Each +object has a unique handle within its type (but it's acceptable, for +example to have a constraint with an Slvs_hConstraint of 7, and also to +have an entity with an Slvs_hEntity of 7). The use of handles instead +of pointers helps to avoid memory corruption. + +Entities and constraints are assigned into groups. A group is a set of +entities and constraints that is solved simultaneously. In a parametric +CAD system, a single group would typically correspond to a single sketch. +Constraints within a group may refer to entities outside that group, +but only the entities within that group will be modified by the solver. + +Consider point A in group 1, and point B in group 2. We have a constraint +in group 2 that makes the points coincident. When we solve group 2, the +solver is allowed to move point B to place it on top of point A. It is +not allowed to move point A to put it on top of point B, because point +A is outside the group being solved. + +This corresponds to the typical structure of a parametric CAD system. In a +later sketch, we may constrain our entities against existing geometry from +earlier sketches. The constraints will move the entities in our current +sketch, but will not change the geometry from the earlier sketches. + +To use the solver, we first define a set of parameters, entities, and +constraints. We provide an initial guess for each parameter; this is +necessary to achieve convergence, and also determines which solution +gets chosen when (finitely many) multiple solutions exist. Typically, +these initial guesses are provided by the initial configuration in which +the user drew the entities before constraining them. + +We then run the solver for a given group. The entities within that group +are modified in an attempt to satisfy the constraints. + +After running the solver, there are three possible outcomes: + + * All constraints were satisfied to within our numerical + tolerance (i.e., success). The result is equal to SLVS_RESULT_OKAY, + and the parameters in param[] have been updated. + + * The solver can prove that two constraints are inconsistent (for + example, if a line with nonzero length is constrained both + horizontal and vertical). In that case, a list of inconsistent + constraints is generated in failed[]. + + * The solver cannot prove that two constraints are inconsistent, but + it cannot find a solution. In that case, the list of unsatisfied + constraints is generated in failed[]. + + +TYPES OF ENTITIES +================= + +SLVS_E_POINT_IN_3D + + A point in 3d. Defined by three parameters: + + param[0] the point's x coordinate + param[1] y + param[1] z + + +SLVS_E_POINT_IN_2D + + A point within a workplane. Defined by the workplane + + wrkpl + + and by two parameters + + param[0] the point's u coordinate + param[1] v + + within the coordinate system of the workplane. For example, if the + workplane is the zx plane, then u = z and v = x. If the workplane is + parallel to the zx plane, but translated so that the workplane's + origin is (3, 4, 5), then u = z - 5 and v = x - 3. + + +SLVS_E_NORMAL_IN_3D + + A normal. In SolveSpace, "normals" represent a 3x3 rotation matrix + from our base coordinate system to a new frame. Defined by the + unit quaternion + + param[0] w + param[1] x + param[2] y + param[3] z + + where the quaternion is given by w + x*i + y*j + z*k. + + It is useful to think of this quaternion as representing a plane + through the origin. This plane has three associated vectors: basis + vectors U, V that lie within the plane, and normal N that is + perpendicular to it. This means that + + [ U V N ]' + + defines a 3x3 rotation matrix. So U, V, and N all have unit length, + and are orthogonal so that + + U cross V = N + V cross N = U + N cross U = V + + Convenience functions (Slvs_Quaternion*) are provided to convert + between this representation as vectors U, V, N and the unit + quaternion. + + A unit quaternion has only 3 degrees of freedom, but is specified in + terms of 4 parameters. An extra constraint is therefore generated + implicitly, that + + w^2 + x^2 + y^2 + z^2 = 1 + + +SLVS_E_NORMAL_IN_2D + + A normal within a workplane. This is identical to the workplane's + normal, so it is simply defined by + + wrkpl + + This entity type is used, for example, to define a circle that lies + within a workplane. The circle's normal is the same as the workplane's + normal, so we can use an SLVS_E_NORMAL_IN_2D to copy the workplane's + normal. + + +SLVS_E_DISTANCE + + A distance. This entity is used to define the radius of a circle, by + a single parameter + + param[0] r + + +SLVS_E_WORKPLANE + + An oriented plane, somewhere in 3d. This entity therefore has 6 + degrees of freedom: three translational, and three rotational. It is + specified in terms of its origin + + point[0] origin + + and a normal + + normal + + The normal describes three vectors U, V, N, as discussed in the + documentation for SLVS_E_NORMAL_IN_3D. The plane is therefore given + by the equation + + p = origin + s*U + t*V + + for any scalar s and t. + + +SLVS_E_LINE_SEGMENT + + A line segment between two endpoints + + point[0] + point[1] + + +SLVS_E_CUBIC + + A nonrational cubic Bezier segment + + point[0] starting point P0 + point[1] control point P1 + point[2] control point P2 + point[3] ending point P3 + + The curve then has equation + + p(t) = P0*(1 - t)^3 + 3*P1*(1 - t)^2*t + 3*P2*(1 - t)*t^2 + P3*t^3 + + as t goes from 0 to 1. + + +SLVS_E_CIRCLE + + A complete circle. The circle lies within a plane with normal + + normal + + The circle is centered at + + point[0] + + The circle's radius is + + distance + + +SLVS_E_ARC_OF_CIRCLE + + An arc of a circle. An arc must always lie within a workplane; it + cannot be free in 3d. So it is specified with a workplane + + wrkpl + + It is then defined by three points + + point[0] center of the circle + point[1] beginning of the arc + point[2] end of the arc + + and its normal + + normal identical to the normal of the workplane + + The arc runs counter-clockwise from its beginning to its end (with + the workplane's normal pointing towards the viewer). If the beginning + and end of the arc are coincident, then the arc is considered to + represent a full circle. + + This representation has an extra degree of freedom. An extra + constraint is therefore generated implicitly, so that + + distance(center, beginning) = distance(center, end) + + +TYPES OF CONSTRAINTS +==================== + +Many constraints can apply either in 3d, or in a workplane. This is +determined by the wrkpl member of the constraint. If that member is set +to SLVS_FREE_IN_3D, then the constraint applies in 3d. If that member +is set equal to a workplane, the the constraint applies projected into +that workplane. (For example, a constraint on the distance between two +points actually applies to the projected distance). + +Constraints that may be used in 3d or projected into a workplane are +marked with a single star (*). Constraints that must always be used with +a workplane are marked with a double star (**). Constraints that ignore +the wrkpl member are marked with no star. + +SLVS_C_PT_PT_DISTANCE* + + The distance between points ptA and ptB is equal to valA. This is an + unsigned distance, so valA must always be positive. + +SLVS_C_PROJ_PT_DISTANCE + + The distance between points ptA and ptB, as projected along the line + or normal entityA, is equal to valA. This is a signed distance. + +SLVS_C_POINTS_COINCIDENT* + + Points ptA and ptB are coincident (i.e., exactly on top of each + other). + +SLVS_C_PT_PLANE_DISTANCE + + The distance from point ptA to workplane entityA is equal to + valA. This is a signed distance; positive versus negative valA + correspond to a point that is above vs. below the plane. + +SLVS_C_PT_LINE_DISTANCE* + + The distance from point ptA to line segment entityA is equal to valA. + + If the constraint is projected, then valA is a signed distance; + positive versus negative valA correspond to a point that is above + vs. below the line. + + If the constraint applies in 3d, then valA must always be positive. + +SLVS_C_PT_IN_PLANE + + The point ptA lies in plane entityA. + +SLVS_C_PT_ON_LINE* + + The point ptA lies on the line entityA. + + Note that this constraint removes one degree of freedom when projected + in to the plane, but two degrees of freedom in 3d. + +SLVS_C_EQUAL_LENGTH_LINES* + + The lines entityA and entityB have equal length. + +SLVS_C_LENGTH_RATIO* + + The length of line entityA divided by the length of line entityB is + equal to valA. + +SLVS_C_LENGTH_DIFFERENCE* + + The lengths of line entityA and line entityB differ by valA. + +SLVS_C_EQ_LEN_PT_LINE_D* + + The length of the line entityA is equal to the distance from point + ptA to line entityB. + +SLVS_C_EQ_PT_LN_DISTANCES* + + The distance from the line entityA to the point ptA is equal to the + distance from the line entityB to the point ptB. + +SLVS_C_EQUAL_ANGLE* + + The angle between lines entityA and entityB is equal to the angle + between lines entityC and entityD. + + If other is true, then the angles are supplementary (i.e., theta1 = + 180 - theta2) instead of equal. + +SLVS_C_EQUAL_LINE_ARC_LEN* + + The length of the line entityA is equal to the length of the circular + arc entityB. + +SLVS_C_SYMMETRIC* + + The points ptA and ptB are symmetric about the plane entityA. This + means that they are on opposite sides of the plane and at equal + distances from the plane, and that the line connecting ptA and ptB + is normal to the plane. + +SLVS_C_SYMMETRIC_HORIZ +SLVS_C_SYMMETRIC_VERT** + + The points ptA and ptB are symmetric about the horizontal or vertical + axis of the specified workplane. + +SLVS_C_SYMMETRIC_LINE** + + The points ptA and ptB are symmetric about the line entityA. + +SLVS_C_AT_MIDPOINT* + + The point ptA lies at the midpoint of the line entityA. + +SLVS_C_HORIZONTAL +SLVS_C_VERTICAL** + + The line connecting points ptA and ptB is horizontal or vertical. Or, + the line segment entityA is horizontal or vertical. If points are + specified then the line segment should be left zero, and if a line + is specified then the points should be left zero. + +SLVS_C_DIAMETER + + The diameter of circle or arc entityA is equal to valA. + +SLVS_C_PT_ON_CIRCLE + + The point ptA lies on the right cylinder obtained by extruding circle + or arc entityA normal to its plane. + +SLVS_C_SAME_ORIENTATION + + The normals entityA and entityB describe identical rotations. This + constraint therefore restricts three degrees of freedom. + +SLVS_C_ANGLE* + + The angle between lines entityA and entityB is equal to valA, where + valA is specified in degrees. This constraint equation is written + in the form + + (A dot B)/(|A||B|) = cos(valA) + + where A and B are vectors in the directions of lines A and B. This + equation does not specify the angle unambiguously; for example, + note that valA = +/- 90 degrees will produce the same equation. + + If other is true, then the constraint is instead that + + (A dot B)/(|A||B|) = -cos(valA) + +SLVS_C_PERPENDICULAR* + + Identical to SLVS_C_ANGLE with valA = 90 degrees. + +SLVS_C_PARALLEL* + + Lines entityA and entityB are parallel. + + Note that this constraint removes one degree of freedom when projected + in to the plane, but two degrees of freedom in 3d. + +SLVS_C_ARC_LINE_TANGENT** + + The arc entityA is tangent to the line entityB. If other is false, + then the arc is tangent at its beginning (point[1]). If other is true, + then the arc is tangent at its end (point[2]). + +SLVS_C_CUBIC_LINE_TANGENT* + + The cubic entityA is tangent to the line entityB. The variable + other indicates: + + if false: the cubic is tangent at its beginning + if true: the cubic is tangent at its end + + The beginning of the cubic is point[0], and the end is point[3]. + +SLVS_C_CURVE_CURVE_TANGENT** + + The two entities entityA and entityB are tangent. These entities can + each be either an arc or a cubic, in any combination. The flags + other and other2 indicate which endpoint of the curve is tangent, + for entityA and entityB respectively: + + if false: the entity is tangent at its beginning + if true: the entity is tangent at its end + + For cubics, point[0] is the beginning, and point[3] is the end. For + arcs, point[1] is the beginning, and point[2] is the end. + +SLVS_C_EQUAL_RADIUS + + The circles or arcs entityA and entityB have equal radius. + +SLVS_C_WHERE_DRAGGED* + + The point ptA is locked at its initial numerical guess, and cannot + be moved. This constrains two degrees of freedom in a workplane, + and three in free space. It's therefore possible for this constraint + to overconstrain the sketch, for example if it's applied to a point + with one remaining degree of freedom. + + +USING THE SOLVER +================ + +The solver is provided as a DLL, and will be usable with most +Windows-based developement tools. Examples are provided: + + in C/C++ - CDemo.c + + in VB.NET - VbDemo.vb + + +Copyright 2009-2013 Jonathan Westhues. + diff --git a/exposed/VbDemo.vb b/exposed/VbDemo.vb new file mode 100644 index 0000000..6781fc4 --- /dev/null +++ b/exposed/VbDemo.vb @@ -0,0 +1,1252 @@ +'----------------------------------------------------------------------------- +' Some sample code for slvs.dll. We draw some geometric entities, provide +' initial guesses for their positions, and then constrain them. The solver +' calculates their new positions, in order to satisfy the constraints. +' +' The library is distributed as a DLL, but the functions are designed to +' be usable from .net languages through a P/Invoke. This file contains an +' example of that process, and a wrapper class around those P/Invoke'd +' functions that you may wish to use a starting point in your own +' application. +' +' Copyright 2008-2013 Jonathan Westhues. +'----------------------------------------------------------------------------- + +Imports System.Runtime.InteropServices + +Module VbDemo + + ' Call our example functions, which set up some kind of sketch, solve + ' it, and then print the result. + Sub Main() + Console.WriteLine("EXAMPLE IN 3d (by objects):") + Example3dWithObjects() + Console.WriteLine("") + + Console.WriteLine("EXAMPLE IN 2d (by objects):") + Example2dWithObjects() + Console.WriteLine("") + + Console.WriteLine("EXAMPLE IN 3d (by handles):") + Example3dWithHandles() + Console.WriteLine("") + + Console.WriteLine("EXAMPLE IN 2d (by handles):") + Example2dWithHandles() + Console.WriteLine("") + End Sub + + + ''''''''''''''''''''''''''''''' + ' This is the simplest way to use the library. A set of wrapper + ' classes allow us to represent entities (e.g., lines and points) + ' as .net objects. So we create an Slvs object, which will contain + ' the entire sketch, with all the entities and constraints. + ' + ' We then create entity objects (for example, points and lines) + ' associated with that sketch, indicating the initial positions of + ' those entities and any hierarchical relationships among them (e.g., + ' defining a line entity in terms of endpoint entities). We also add + ' constraints associated with those entities. + ' + ' Finally, we solve, and print the new positions of the entities. If the + ' solution succeeded, then the entities will satisfy the constraints. If + ' not, then the solver will suggest problematic constraints that, if + ' removed, would render the sketch solvable. + + Sub Example3dWithObjects() + Dim g As UInteger + Dim slv As New Slvs + + ' This will contain a single group, which will arbitrarily number 1. + g = 1 + + Dim p1, p2 As Slvs.Point3d + ' A point, initially at (x y z) = (10 10 10) + p1 = slv.NewPoint3d(g, 10.0, 10.0, 10.0) + ' and a second point at (20 20 20) + p2 = slv.NewPoint3d(g, 20.0, 20.0, 20.0) + + Dim ln As Slvs.LineSegment + ' and a line segment connecting them. + ln = slv.NewLineSegment(g, slv.FreeIn3d(), p1, p2) + + ' The distance between the points should be 30.0 units. + slv.AddConstraint(1, g, Slvs.SLVS_C_PT_PT_DISTANCE, _ + slv.FreeIn3d(), 30.0, p1, p2, Nothing, Nothing) + + ' Let's tell the solver to keep the second point as close to constant + ' as possible, instead moving the first point. + slv.Solve(g, p2, True) + + If (slv.GetResult() = Slvs.SLVS_RESULT_OKAY) Then + ' We call the GetX(), GetY(), and GetZ() functions to see + ' where the solver moved our points to. + Console.WriteLine(String.Format( _ + "okay; now at ({0:F3}, {1:F3}, {2:F3})", _ + p1.GetX(), p1.GetY(), p1.GetZ())) + Console.WriteLine(String.Format( _ + " ({0:F3}, {1:F3}, {2:F3})", _ + p2.GetX(), p2.GetY(), p2.GetZ())) + Console.WriteLine(slv.GetDof().ToString() + " DOF") + Else + Console.WriteLine("solve failed") + End If + End Sub + + Sub Example2dWithObjects() + Dim g As UInteger + Dim slv As New Slvs + + g = 1 + + ' First, we create our workplane. Its origin corresponds to the origin + ' of our base frame (x y z) = (0 0 0) + Dim origin As Slvs.Point3d + origin = slv.NewPoint3d(g, 0.0, 0.0, 0.0) + ' and it is parallel to the xy plane, so it has basis vectors (1 0 0) + ' and (0 1 0). + Dim normal As Slvs.Normal3d + normal = slv.NewNormal3d(g, 1.0, 0.0, 0.0, _ + 0.0, 1.0, 0.0) + + Dim wrkpl As Slvs.Workplane + wrkpl = slv.NewWorkplane(g, origin, normal) + + ' Now create a second group. We'll solve group 2, while leaving group 1 + ' constant; so the workplane that we've created will be locked down, + ' and the solver can't move it. + g = 2 + ' These points are represented by their coordinates (u v) within the + ' workplane, so they need only two parameters each. + Dim pl1, pl2 As Slvs.Point2d + pl1 = slv.NewPoint2d(g, wrkpl, 10.0, 20.0) + pl2 = slv.NewPoint2d(g, wrkpl, 20.0, 10.0) + + ' And we create a line segment with those endpoints. + Dim ln As Slvs.LineSegment + ln = slv.NewLineSegment(g, wrkpl, pl1, pl2) + + ' Now three more points. + Dim pc, ps, pf As Slvs.Point2d + pc = slv.NewPoint2d(g, wrkpl, 100.0, 120.0) + ps = slv.NewPoint2d(g, wrkpl, 120.0, 110.0) + pf = slv.NewPoint2d(g, wrkpl, 115.0, 115.0) + + ' And arc, centered at point pc, starting at point ps, ending at + ' point pf. + Dim arc As Slvs.ArcOfCircle + arc = slv.NewArcOfCircle(g, wrkpl, normal, pc, ps, pf) + + ' Now one more point, and a distance + Dim pcc As Slvs.Point2d + pcc = slv.NewPoint2d(g, wrkpl, 200.0, 200.0) + Dim r As Slvs.Distance + r = slv.NewDistance(g, wrkpl, 30.0) + + ' And a complete circle, centered at point pcc with radius equal to + ' distance r. The normal is the same as for our workplane. + Dim circle As Slvs.Circle + circle = slv.NewCircle(g, wrkpl, pcc, normal, r) + + ' The length of our line segment is 30.0 units. + slv.AddConstraint(1, g, Slvs.SLVS_C_PT_PT_DISTANCE, _ + wrkpl, 30.0, pl1, pl2, Nothing, Nothing) + + ' And the distance from our line segment to the origin is 10.0 units. + slv.AddConstraint(2, g, Slvs.SLVS_C_PT_LINE_DISTANCE, _ + wrkpl, 10.0, origin, Nothing, ln, Nothing) + + ' And the line segment is vertical. + slv.AddConstraint(3, g, Slvs.SLVS_C_VERTICAL, _ + wrkpl, 0.0, Nothing, Nothing, ln, Nothing) + + ' And the distance from one endpoint to the origin is 15.0 units. + slv.AddConstraint(4, g, Slvs.SLVS_C_PT_PT_DISTANCE, _ + wrkpl, 15.0, pl1, origin, Nothing, Nothing) + + ' And same for the other endpoint; so if you add this constraint then + ' the sketch is overconstrained and will signal an error. + 'slv.AddConstraint(5, g, Slvs.SLVS_C_PT_PT_DISTANCE, _ + ' wrkpl, 18.0, pl2, origin, Nothing, Nothing) + + ' The arc and the circle have equal radius. + slv.AddConstraint(6, g, Slvs.SLVS_C_EQUAL_RADIUS, _ + wrkpl, 0.0, Nothing, Nothing, arc, circle) + + ' The arc has radius 17.0 units. + slv.AddConstraint(7, g, Slvs.SLVS_C_DIAMETER, _ + wrkpl, 2 * 17.0, Nothing, Nothing, arc, Nothing) + + ' If the solver fails, then ask it to report which constraints caused + ' the problem. + slv.Solve(g, True) + + If (slv.GetResult() = Slvs.SLVS_RESULT_OKAY) Then + Console.WriteLine("solved okay") + ' We call the GetU(), GetV(), and GetDistance() functions to + ' see where the solver moved our points and distances to. + Console.WriteLine(String.Format( _ + "line from ({0:F3} {1:F3}) to ({2:F3} {3:F3})", _ + pl1.GetU(), pl1.GetV(), _ + pl2.GetU(), pl2.GetV())) + Console.WriteLine(String.Format( _ + "arc center ({0:F3} {1:F3}) start ({2:F3} {3:F3}) " + _ + "finish ({4:F3} {5:F3})", _ + pc.GetU(), pc.GetV(), _ + ps.GetU(), ps.GetV(), _ + pf.GetU(), pf.GetV())) + Console.WriteLine(String.Format( _ + "circle center ({0:F3} {1:F3}) radius {2:F3}", _ + pcc.GetU(), pcc.GetV(), _ + r.GetDistance())) + + Console.WriteLine(slv.GetDof().ToString() + " DOF") + Else + Console.Write("solve failed; problematic constraints are:") + Dim t As UInteger + For Each t In slv.GetFaileds() + Console.Write(" " + t.ToString()) + Next + Console.WriteLine("") + If (slv.GetResult() = Slvs.SLVS_RESULT_INCONSISTENT) Then + Console.WriteLine("system inconsistent") + Else + Console.WriteLine("system nonconvergent") + End If + End If + + End Sub + + + ''''''''''''''''''''''''''''''' + ' This is a lower-level way to use the library. Internally, the library + ' represents parameters, entities, and constraints by integer handles. + ' Here, those handles are assigned manually, and not by the wrapper + ' classes. + + Sub Example3dWithHandles() + Dim g As UInteger + Dim slv As New Slvs + + ' This will contain a single group, which will arbitrarily number 1. + g = 1 + + ' A point, initially at (x y z) = (10 10 10) + slv.AddParam(1, g, 10.0) + slv.AddParam(2, g, 10.0) + slv.AddParam(3, g, 10.0) + slv.AddPoint3d(101, g, 1, 2, 3) + + ' and a second point at (20 20 20) + slv.AddParam(4, g, 20.0) + slv.AddParam(5, g, 20.0) + slv.AddParam(6, g, 20.0) + slv.AddPoint3d(102, g, 4, 5, 6) + + ' and a line segment connecting them. + slv.AddLineSegment(200, g, Slvs.SLVS_FREE_IN_3D, 101, 102) + + ' The distance between the points should be 30.0 units. + slv.AddConstraint(1, g, Slvs.SLVS_C_PT_PT_DISTANCE, _ + Slvs.SLVS_FREE_IN_3D, 30.0, 101, 102, 0, 0) + + ' Let's tell the solver to keep the second point as close to constant + ' as possible, instead moving the first point. That's parameters + ' 4, 5, and 6. + slv.Solve(g, 4, 5, 6, 0, True) + + If (slv.GetResult() = Slvs.SLVS_RESULT_OKAY) Then + ' Note that we are referring to the parameters by their handles, + ' and not by their index in the list. This is a difference from + ' the C example. + Console.WriteLine(String.Format( _ + "okay; now at ({0:F3}, {1:F3}, {2:F3})", _ + slv.GetParamByHandle(1), slv.GetParamByHandle(2), _ + slv.GetParamByHandle(3))) + Console.WriteLine(String.Format( _ + " ({0:F3}, {1:F3}, {2:F3})", _ + slv.GetParamByHandle(4), slv.GetParamByHandle(5), _ + slv.GetParamByHandle(6))) + Console.WriteLine(slv.GetDof().ToString() + " DOF") + Else + Console.WriteLine("solve failed") + End If + End Sub + + + Sub Example2dWithHandles() + Dim g As UInteger + Dim qw, qx, qy, qz As Double + + Dim slv As New Slvs + + g = 1 + + ' First, we create our workplane. Its origin corresponds to the origin + ' of our base frame (x y z) = (0 0 0) + slv.AddParam(1, g, 0.0) + slv.AddParam(2, g, 0.0) + slv.AddParam(3, g, 0.0) + slv.AddPoint3d(101, g, 1, 2, 3) + ' and it is parallel to the xy plane, so it has basis vectors (1 0 0) + ' and (0 1 0). + slv.MakeQuaternion(1, 0, 0, _ + 0, 1, 0, qw, qx, qy, qz) + slv.AddParam(4, g, qw) + slv.AddParam(5, g, qx) + slv.AddParam(6, g, qy) + slv.AddParam(7, g, qz) + slv.AddNormal3d(102, g, 4, 5, 6, 7) + + slv.AddWorkplane(200, g, 101, 102) + + ' Now create a second group. We'll solve group 2, while leaving group 1 + ' constant; so the workplane that we've created will be locked down, + ' and the solver can't move it. + g = 2 + ' These points are represented by their coordinates (u v) within the + ' workplane, so they need only two parameters each. + slv.AddParam(11, g, 10.0) + slv.AddParam(12, g, 20.0) + slv.AddPoint2d(301, g, 200, 11, 12) + + slv.AddParam(13, g, 20.0) + slv.AddParam(14, g, 10.0) + slv.AddPoint2d(302, g, 200, 13, 14) + + ' And we create a line segment with those endpoints. + slv.AddLineSegment(400, g, 200, 301, 302) + + ' Now three more points. + slv.AddParam(15, g, 100.0) + slv.AddParam(16, g, 120.0) + slv.AddPoint2d(303, g, 200, 15, 16) + + slv.AddParam(17, g, 120.0) + slv.AddParam(18, g, 110.0) + slv.AddPoint2d(304, g, 200, 17, 18) + + slv.AddParam(19, g, 115.0) + slv.AddParam(20, g, 115.0) + slv.AddPoint2d(305, g, 200, 19, 20) + + ' And arc, centered at point 303, starting at point 304, ending at + ' point 305. + slv.AddArcOfCircle(401, g, 200, 102, 303, 304, 305) + + ' Now one more point, and a distance + slv.AddParam(21, g, 200.0) + slv.AddParam(22, g, 200.0) + slv.AddPoint2d(306, g, 200, 21, 22) + + slv.AddParam(23, g, 30.0) + slv.AddDistance(307, g, 200, 23) + + ' And a complete circle, centered at point 306 with radius equal to + ' distance 307. The normal is 102, the same as our workplane. + slv.AddCircle(402, g, 200, 306, 102, 307) + + ' The length of our line segment is 30.0 units. + slv.AddConstraint(1, g, Slvs.SLVS_C_PT_PT_DISTANCE, _ + 200, 30.0, 301, 302, 0, 0) + + ' And the distance from our line segment to the origin is 10.0 units. + slv.AddConstraint(2, g, Slvs.SLVS_C_PT_LINE_DISTANCE, _ + 200, 10.0, 101, 0, 400, 0) + + ' And the line segment is vertical. + slv.AddConstraint(3, g, Slvs.SLVS_C_VERTICAL, _ + 200, 0.0, 0, 0, 400, 0) + + ' And the distance from one endpoint to the origin is 15.0 units. + slv.AddConstraint(4, g, Slvs.SLVS_C_PT_PT_DISTANCE, _ + 200, 15.0, 301, 101, 0, 0) + + ' And same for the other endpoint; so if you add this constraint then + ' the sketch is overconstrained and will signal an error. + 'slv.AddConstraint(5, g, Slvs.SLVS_C_PT_PT_DISTANCE, _ + ' 200, 18.0, 302, 101, 0, 0) + + ' The arc and the circle have equal radius. + slv.AddConstraint(6, g, Slvs.SLVS_C_EQUAL_RADIUS, _ + 200, 0.0, 0, 0, 401, 402) + + ' The arc has radius 17.0 units. + slv.AddConstraint(7, g, Slvs.SLVS_C_DIAMETER, _ + 200, 2 * 17.0, 0, 0, 401, 0) + + ' If the solver fails, then ask it to report which constraints caused + ' the problem. + slv.Solve(g, 0, 0, 0, 0, True) + + If (slv.GetResult() = Slvs.SLVS_RESULT_OKAY) Then + Console.WriteLine("solved okay") + ' Note that we are referring to the parameters by their handles, + ' and not by their index in the list. This is a difference from + ' the C example. + Console.WriteLine(String.Format( _ + "line from ({0:F3} {1:F3}) to ({2:F3} {3:F3})", _ + slv.GetParamByHandle(11), slv.GetParamByHandle(12), _ + slv.GetParamByHandle(13), slv.GetParamByHandle(14))) + Console.WriteLine(String.Format( _ + "arc center ({0:F3} {1:F3}) start ({2:F3} {3:F3}) " + _ + "finish ({4:F3} {5:F3})", _ + slv.GetParamByHandle(15), slv.GetParamByHandle(16), _ + slv.GetParamByHandle(17), slv.GetParamByHandle(18), _ + slv.GetParamByHandle(19), slv.GetParamByHandle(20))) + Console.WriteLine(String.Format( _ + "circle center ({0:F3} {1:F3}) radius {2:F3}", _ + slv.GetParamByHandle(21), slv.GetParamByHandle(22), _ + slv.GetParamByHandle(23))) + + Console.WriteLine(slv.GetDof().ToString() + " DOF") + Else + Console.Write("solve failed; problematic constraints are:") + Dim t As UInteger + For Each t In slv.GetFaileds() + Console.Write(" " + t.ToString()) + Next + Console.WriteLine("") + If (slv.GetResult() = Slvs.SLVS_RESULT_INCONSISTENT) Then + Console.WriteLine("system inconsistent") + Else + Console.WriteLine("system nonconvergent") + End If + End If + + End Sub + + + ''''''''''''''''''''''''''''''' + ' The interface to the library, and the wrapper functions around + ' that interface, follow. + + ' These are the core functions imported from the DLL + _ + Public Sub Slvs_Solve(ByVal sys As IntPtr, ByVal hg As UInteger) + End Sub + + _ + Public Sub Slvs_MakeQuaternion( + ByVal ux As Double, ByVal uy As Double, ByVal uz As Double, + ByVal vx As Double, ByVal vy As Double, ByVal vz As Double, + ByRef qw As Double, ByRef qx As Double, ByRef qy As Double, + ByRef qz As Double) + End Sub + + ' And this is a thin wrapper around those functions, which provides + ' convenience functions similar to those provided in slvs.h for the C API. + Public Class Slvs + + Public Structure Slvs_Param + Public h As UInteger + Public group As UInteger + Public val As Double + End Structure + + Public Const SLVS_FREE_IN_3D As Integer = 0 + + Public Const SLVS_E_POINT_IN_3D As Integer = 50000 + Public Const SLVS_E_POINT_IN_2D As Integer = 50001 + Public Const SLVS_E_NORMAL_IN_3D As Integer = 60000 + Public Const SLVS_E_NORMAL_IN_2D As Integer = 60001 + Public Const SLVS_E_DISTANCE As Integer = 70000 + Public Const SLVS_E_WORKPLANE As Integer = 80000 + Public Const SLVS_E_LINE_SEGMENT As Integer = 80001 + Public Const SLVS_E_CUBIC As Integer = 80002 + Public Const SLVS_E_CIRCLE As Integer = 80003 + Public Const SLVS_E_ARC_OF_CIRCLE As Integer = 80004 + + Public Structure Slvs_Entity + Public h As UInteger + Public group As UInteger + + Public type As Integer + + Public wrkpl As UInteger + Public point0 As UInteger + Public point1 As UInteger + Public point2 As UInteger + Public point3 As UInteger + Public normal As UInteger + Public distance As UInteger + + Public param0 As UInteger + Public param1 As UInteger + Public param2 As UInteger + Public param3 As UInteger + End Structure + + Public Const SLVS_C_POINTS_COINCIDENT As Integer = 100000 + Public Const SLVS_C_PT_PT_DISTANCE As Integer = 100001 + Public Const SLVS_C_PT_PLANE_DISTANCE As Integer = 100002 + Public Const SLVS_C_PT_LINE_DISTANCE As Integer = 100003 + Public Const SLVS_C_PT_FACE_DISTANCE As Integer = 100004 + Public Const SLVS_C_PT_IN_PLANE As Integer = 100005 + Public Const SLVS_C_PT_ON_LINE As Integer = 100006 + Public Const SLVS_C_PT_ON_FACE As Integer = 100007 + Public Const SLVS_C_EQUAL_LENGTH_LINES As Integer = 100008 + Public Const SLVS_C_LENGTH_RATIO As Integer = 100009 + Public Const SLVS_C_EQ_LEN_PT_LINE_D As Integer = 100010 + Public Const SLVS_C_EQ_PT_LN_DISTANCES As Integer = 100011 + Public Const SLVS_C_EQUAL_ANGLE As Integer = 100012 + Public Const SLVS_C_EQUAL_LINE_ARC_LEN As Integer = 100013 + Public Const SLVS_C_SYMMETRIC As Integer = 100014 + Public Const SLVS_C_SYMMETRIC_HORIZ As Integer = 100015 + Public Const SLVS_C_SYMMETRIC_VERT As Integer = 100016 + Public Const SLVS_C_SYMMETRIC_LINE As Integer = 100017 + Public Const SLVS_C_AT_MIDPOINT As Integer = 100018 + Public Const SLVS_C_HORIZONTAL As Integer = 100019 + Public Const SLVS_C_VERTICAL As Integer = 100020 + Public Const SLVS_C_DIAMETER As Integer = 100021 + Public Const SLVS_C_PT_ON_CIRCLE As Integer = 100022 + Public Const SLVS_C_SAME_ORIENTATION As Integer = 100023 + Public Const SLVS_C_ANGLE As Integer = 100024 + Public Const SLVS_C_PARALLEL As Integer = 100025 + Public Const SLVS_C_PERPENDICULAR As Integer = 100026 + Public Const SLVS_C_ARC_LINE_TANGENT As Integer = 100027 + Public Const SLVS_C_CUBIC_LINE_TANGENT As Integer = 100028 + Public Const SLVS_C_EQUAL_RADIUS As Integer = 100029 + Public Const SLVS_C_PROJ_PT_DISTANCE As Integer = 100030 + Public Const SLVS_C_WHERE_DRAGGED As Integer = 100031 + Public Const SLVS_C_CURVE_CURVE_TANGENT As Integer = 100032 + Public Const SLVS_C_LENGTH_DIFFERENCE As Integer = 100033 + + Public Structure Slvs_Constraint + Public h As UInteger + Public group As UInteger + + Public type As Integer + + Public wrkpl As UInteger + + Public valA As Double + Public ptA As UInteger + Public ptB As UInteger + Public entityA As UInteger + Public entityB As UInteger + Public entityC As UInteger + Public entityD As UInteger + + Public other As Integer + Public other2 As Integer + End Structure + + Public Const SLVS_RESULT_OKAY As Integer = 0 + Public Const SLVS_RESULT_INCONSISTENT As Integer = 1 + Public Const SLVS_RESULT_DIDNT_CONVERGE As Integer = 2 + Public Const SLVS_RESULT_TOO_MANY_UNKNOWNS As Integer = 3 + + Public Structure Slvs_System + Public param As IntPtr + Public params As Integer + Public entity As IntPtr + Public entities As Integer + Public constraint As IntPtr + Public constraints As Integer + + Public dragged0 As UInteger + Public dragged1 As UInteger + Public dragged2 As UInteger + Public dragged3 As UInteger + + Public calculatedFaileds As Integer + + Public failed As IntPtr + Public faileds As Integer + + Public dof As Integer + + Public result As Integer + End Structure + + Dim Params As New List(Of Slvs_Param) + Dim Entities As New List(Of Slvs_Entity) + Dim Constraints As New List(Of Slvs_Constraint) + + Dim Faileds As New List(Of UInteger) + + Dim Result As Integer + Dim Dof As Integer + + ' Return the value of a parameter, by its handle. This function + ' may be used, for example, to obtain the new values of the + ' parameters after a call to Solve(). + Public Function GetParamByHandle(ByVal h As UInteger) As Double + Dim t As Slvs_Param + For Each t In Params + If (t.h = h) Then + Return t.val + End If + Next + Throw New Exception("Invalid parameter handle.") + End Function + + ' Return the value of a parameter, by its index in the list (where + ' that index is determined by the order in which the parameters + ' were inserted with AddParam(), not by its handle). + Public Function GetParamByIndex(ByVal i As Integer) As Double + Return Params(i).val + End Function + + ' Get the result after a call to Solve(). This may be + ' SLVS_RESULT_OKAY - it worked + ' SLVS_RESULT_INCONSISTENT - failed, inconsistent + ' SLVS_RESULT_DIDNT_CONVERGE - consistent, but still failed + ' SLVS_RESULT_TOO_MANY_UNKNOWNS - too many parameters in one group + Public Function GetResult() As Integer + Return Result + End Function + + ' After a call to Solve(), this returns the number of unconstrained + ' degrees of freedom for the sketch. + Public Function GetDof() As Integer + Return Dof + End Function + + ' After a failing call to Solve(), this returns the list of + ' constraints, identified by ther handle, that would fix the + ' system if they were deleted. This list will be populated only + ' if calculateFaileds is True in the Solve() call. + Public Function GetFaileds() As List(Of UInteger) + Return Faileds + End Function + + ' Clear our lists of entities, constraints, and parameters. + Public Sub ResetAll() + Params.Clear() + Entities.Clear() + Constraints.Clear() + End Sub + + + ''''''''''''''''''''''''''''''' + ' These functions are broadly similar to the Slvs_Make... + ' functions in slvs.h. See the file DOC.txt accompanying the + ' library for details. + + Public Sub AddParam(ByVal h As UInteger, ByVal group As UInteger, + ByVal val As Double) + Dim p As Slvs_Param + p.h = h + p.group = group + p.val = val + Params.Add(p) + End Sub + + Public Sub AddPoint2d(ByVal h As UInteger, ByVal group As UInteger, + ByVal wrkpl As UInteger, + ByVal u As UInteger, ByVal v As UInteger) + Dim e As Slvs_Entity + e.h = h + e.group = group + e.type = SLVS_E_POINT_IN_2D + e.wrkpl = wrkpl + e.param0 = u + e.param1 = v + Entities.Add(e) + End Sub + + Public Sub AddPoint3d(ByVal h As UInteger, ByVal group As UInteger, + ByVal x As UInteger, ByVal y As UInteger, ByVal z As UInteger) + Dim e As Slvs_Entity + e.h = h + e.group = group + e.type = SLVS_E_POINT_IN_3D + e.wrkpl = SLVS_FREE_IN_3D + e.param0 = x + e.param1 = y + e.param2 = z + Entities.Add(e) + End Sub + + Public Sub AddNormal3d(ByVal h As UInteger, ByVal group As UInteger, + ByVal qw As UInteger, ByVal qx As UInteger, + ByVal qy As UInteger, ByVal qz As UInteger) + Dim e As Slvs_Entity + e.h = h + e.group = group + e.type = SLVS_E_NORMAL_IN_3D + e.wrkpl = SLVS_FREE_IN_3D + e.param0 = qw + e.param1 = qx + e.param2 = qy + e.param3 = qz + Entities.Add(e) + End Sub + + Public Sub AddNormal2d(ByVal h As UInteger, ByVal group As UInteger, + ByVal wrkpl As UInteger) + Dim e As Slvs_Entity + e.h = h + e.group = group + e.type = SLVS_E_NORMAL_IN_2D + e.wrkpl = wrkpl + Entities.Add(e) + End Sub + + Public Sub AddDistance(ByVal h As UInteger, ByVal group As UInteger, + ByVal wrkpl As UInteger, ByVal d As UInteger) + Dim e As Slvs_Entity + e.h = h + e.group = group + e.type = SLVS_E_DISTANCE + e.wrkpl = wrkpl + e.param0 = d + Entities.Add(e) + End Sub + + Public Sub AddLineSegment(ByVal h As UInteger, ByVal group As UInteger, + ByVal wrkpl As UInteger, + ByVal ptA As UInteger, ByVal ptB As UInteger) + Dim e As Slvs_Entity + e.h = h + e.group = group + e.type = SLVS_E_LINE_SEGMENT + e.wrkpl = wrkpl + e.point0 = ptA + e.point1 = ptB + Entities.Add(e) + End Sub + + Public Sub AddCubic(ByVal h As UInteger, ByVal group As UInteger, + ByVal wrkpl As UInteger, + ByVal pt0 As UInteger, ByVal pt1 As UInteger, + ByVal pt2 As UInteger, ByVal pt3 As UInteger) + Dim e As Slvs_Entity + e.h = h + e.group = group + e.type = SLVS_E_CUBIC + e.wrkpl = wrkpl + e.point0 = pt0 + e.point1 = pt1 + e.point2 = pt2 + e.point3 = pt3 + Entities.Add(e) + End Sub + + Public Sub AddArcOfCircle(ByVal h As UInteger, ByVal group As UInteger, + ByVal wrkpl As UInteger, + ByVal normal As UInteger, + ByVal center As UInteger, + ByVal pstart As UInteger, + ByVal pend As UInteger) + Dim e As Slvs_Entity + e.h = h + e.group = group + e.type = SLVS_E_ARC_OF_CIRCLE + e.wrkpl = wrkpl + e.normal = normal + e.point0 = center + e.point1 = pstart + e.point2 = pend + Entities.Add(e) + End Sub + + Public Sub AddCircle(ByVal h As UInteger, ByVal group As UInteger, + ByVal wrkpl As UInteger, + ByVal center As UInteger, ByVal normal As UInteger, + ByVal radius As UInteger) + Dim e As Slvs_Entity + e.h = h + e.group = group + e.type = SLVS_E_CIRCLE + e.wrkpl = wrkpl + e.point0 = center + e.normal = normal + e.distance = radius + Entities.Add(e) + End Sub + + Public Sub AddWorkplane(ByVal h As UInteger, ByVal group As UInteger, + ByVal origin As UInteger, + ByVal normal As UInteger) + Dim e As Slvs_Entity + e.h = h + e.group = group + e.type = SLVS_E_WORKPLANE + e.wrkpl = SLVS_FREE_IN_3D + e.point0 = origin + e.normal = normal + Entities.Add(e) + End Sub + + Public Sub AddConstraint(ByVal h As UInteger, + ByVal group As UInteger, + ByVal type As Integer, + ByVal wrkpl As UInteger, + ByVal valA As Double, + ByVal ptA As UInteger, + ByVal ptB As UInteger, + ByVal entityA As UInteger, + ByVal entityB As UInteger) + Dim c As Slvs_Constraint + c.h = h + c.group = group + c.type = type + c.wrkpl = wrkpl + c.valA = valA + c.ptA = ptA + c.ptB = ptB + c.entityA = entityA + c.entityB = entityB + Constraints.Add(c) + End Sub + + ' Solve the system. The geometry of the system must already have + ' been specified through the Add...() calls. The result of the + ' solution process may be obtained by calling GetResult(), + ' GetFaileds(), GetDof(), and GetParamByXXX(). + ' + ' The parameters draggedx (indicated by their handles) will be held + ' as close as possible to their original positions, even if this + ' results in large moves for other parameters. This feature may be + ' useful if, for example, the user is dragging the point whose + ' location is defined by those parameters. Unused draggedx + ' parameters may be specified as zero. + Public Sub Solve(ByVal group As UInteger, + ByVal dragged0 As UInteger, ByVal dragged1 As UInteger, + ByVal dragged2 As UInteger, ByVal dragged3 As UInteger, + ByVal calculateFaileds As Boolean) + Dim i As Integer + + Dim pp, p(Params.Count()) As Slvs_Param + i = 0 + For Each pp In Params + p(i) = pp + i += 1 + Next + + Dim ee, e(Entities.Count()) As Slvs_Entity + i = 0 + For Each ee In Entities + e(i) = ee + i += 1 + Next + + Dim cc, c(Constraints.Count()) As Slvs_Constraint + i = 0 + For Each cc In Constraints + c(i) = cc + i += 1 + Next + Dim f(Constraints.Count()) As UInteger + + Dim sys As Slvs_System + + Dim pgc, egc, cgc As GCHandle + pgc = GCHandle.Alloc(p, GCHandleType.Pinned) + sys.param = pgc.AddrOfPinnedObject() + sys.params = Params.Count() + egc = GCHandle.Alloc(e, GCHandleType.Pinned) + sys.entity = egc.AddrOfPinnedObject() + sys.entities = Entities.Count() + cgc = GCHandle.Alloc(c, GCHandleType.Pinned) + sys.constraint = cgc.AddrOfPinnedObject() + sys.constraints = Constraints.Count() + + sys.dragged0 = dragged0 + sys.dragged1 = dragged1 + sys.dragged2 = dragged2 + sys.dragged3 = dragged3 + + Dim fgc As GCHandle + fgc = GCHandle.Alloc(f, GCHandleType.Pinned) + If calculateFaileds Then + sys.calculatedFaileds = 1 + Else + sys.calculatedFaileds = 0 + End If + sys.faileds = Constraints.Count() + sys.failed = fgc.AddrOfPinnedObject() + + Dim sysgc As GCHandle + sysgc = GCHandle.Alloc(sys, GCHandleType.Pinned) + + Slvs_Solve(sysgc.AddrOfPinnedObject(), group) + + sys = sysgc.Target + + For i = 0 To Params.Count() - 1 + Params(i) = p(i) + Next + + Faileds.Clear() + For i = 0 To sys.faileds - 1 + Faileds.Add(f(i)) + Next + + sysgc.Free() + fgc.Free() + pgc.Free() + egc.Free() + cgc.Free() + + Result = sys.result + Dof = sys.dof + End Sub + ' A simpler version of the function, if the parameters being dragged + ' correspond to a single point. + Public Sub Solve(ByVal group As UInteger, ByVal dragged As Point, + ByVal calculatedFaileds As Boolean) + If TypeOf dragged Is Point2d Then + Dim p As Point2d + p = dragged + Solve(group, p.up.H, p.vp.H, 0, 0, calculatedFaileds) + ElseIf TypeOf dragged Is Point3d Then + Dim p As Point3d + p = dragged + Solve(group, p.xp.H, p.yp.H, p.zp.H, 0, calculatedFaileds) + Else + Throw New Exception("Can't get dragged params for point.") + End If + End Sub + ' or if it's a single distance (e.g., the radius of a circle) + Public Sub Solve(ByVal group As UInteger, ByVal dragged As Distance, + ByVal calculatedFaileds As Boolean) + Solve(group, dragged.dp.H, 0, 0, 0, calculatedFaileds) + End Sub + ' or if it's nothing. + Public Sub Solve(ByVal group As UInteger, + ByVal calculateFaileds As Boolean) + Solve(group, 0, 0, 0, 0, calculateFaileds) + End Sub + + ' Return the quaternion in (qw, qx, qy, qz) that represents a + ' rotation from the base frame to a coordinate system with the + ' specified basis vectors u and v. For example, u = (0, 1, 0) + ' and v = (0, 0, 1) specifies the yz plane, such that a point with + ' (u, v) = (7, 12) has (x, y, z) = (0, 7, 12). + Public Sub MakeQuaternion( + ByVal ux As Double, ByVal uy As Double, ByVal uz As Double, + ByVal vx As Double, ByVal vy As Double, ByVal vz As Double, + ByRef qw As Double, ByRef qx As Double, ByRef qy As Double, + ByRef qz As Double) + Slvs_MakeQuaternion(ux, uy, uz, _ + vx, vy, vz, _ + qw, qx, qy, qz) + End Sub + + Public Function FreeIn3d() + Return New Workplane(Me) + End Function + + + ''''''''''''''''''''''''''''''' + ' Functions to create the object-oriented wrappers defined below. + + Public Function NewParam(ByVal group As UInteger, ByVal val As Double) + Return New Param(Me, group, val) + End Function + Public Function NewPoint2d(ByVal group As UInteger, + ByVal wrkpl As Workplane, + ByVal u As Double, ByVal v As Double) + Return New Point2d(Me, group, wrkpl, u, v) + End Function + Public Function NewPoint2d(ByVal group As UInteger, + ByVal wrkpl As Workplane, + ByVal u As Param, ByVal v As Param) + Return New Point2d(Me, group, wrkpl, u, v) + End Function + Public Function NewPoint3d(ByVal group As UInteger, + ByVal x As Double, + ByVal y As Double, + ByVal z As Double) + Return New Point3d(Me, group, x, y, z) + End Function + Public Function NewPoint3d(ByVal group As UInteger, + ByVal x As Param, + ByVal y As Param, + ByVal z As Param) + Return New Point3d(Me, group, x, y, z) + End Function + Public Function NewNormal3d(ByVal group As UInteger, + ByVal ux As Double, ByVal uy As Double, ByVal uz As Double, + ByVal vx As Double, ByVal vy As Double, ByVal vz As Double) + Return New Normal3d(Me, group, ux, uy, uz, vx, vy, vz) + End Function + Public Function NewNormal3d(ByVal group As UInteger, + ByVal qw As Param, ByVal qx As Param, + ByVal qy As Param, ByVal qz As Param) + Return New Normal3d(Me, group, qw, qx, qy, qz) + End Function + Public Function NewNormal2d(ByVal group As UInteger, + ByVal wrkpl As Workplane) + Return New Normal2d(Me, group, wrkpl) + End Function + Public Function NewDistance(ByVal group As UInteger, + ByVal wrkpl As Workplane, ByVal d As Double) + Return New Distance(Me, group, wrkpl, d) + End Function + Public Function NewDistance(ByVal group As UInteger, + ByVal wrkpl As Workplane, ByVal d As Param) + Return New Distance(Me, group, wrkpl, d) + End Function + Public Function NewLineSegment(ByVal group As UInteger, + ByVal wrkpl As Workplane, + ByVal ptA As Point, ByVal ptB As Point) + Return New LineSegment(Me, group, wrkpl, ptA, ptB) + End Function + Public Function NewArcOfCircle(ByVal group As UInteger, + ByVal wrkpl As Workplane, + ByVal normal As Normal, + ByVal center As Point, + ByVal pstart As Point, + ByVal pend As Point) + Return New ArcOfCircle(Me, group, wrkpl, normal, _ + center, pstart, pend) + End Function + Public Function NewCircle(ByVal group As UInteger, + ByVal wrkpl As Workplane, + ByVal center As Point, + ByVal normal As Normal, + ByVal radius As Distance) + Return New Circle(Me, group, wrkpl, center, normal, radius) + End Function + Public Function NewWorkplane(ByVal group As UInteger, + ByVal origin As Point, + ByVal normal As Normal) + Return New Workplane(Me, group, origin, normal) + End Function + + Public Sub AddConstraint(ByVal H As UInteger, ByVal group As UInteger, + ByVal type As Integer, + ByVal wrkpl As Workplane, + ByVal valA As Double, + ByVal ptA As Point, ByVal ptB As Point, + ByVal entityA As Entity, + ByVal entityB As Entity) + AddConstraint(H, group, type, _ + If(IsNothing(wrkpl), 0, wrkpl.H), _ + valA, _ + If(IsNothing(ptA), 0, ptA.H), _ + If(IsNothing(ptB), 0, ptB.H), _ + If(IsNothing(entityA), 0, entityA.H), _ + If(IsNothing(entityB), 0, entityB.H)) + End Sub + + + ''''''''''''''''''''''''''''''' + ' The object-oriented wrapper classes themselves, to allow the + ' representation of entities and constraints as .net objects, not + ' integer handles. These don't do any work themselves, beyond + ' allocating and storing a unique integer handle. + ' + ' These functions will assign parameters and entities with + ' consecutive handles starting from 1. If they are intermixed + ' with parameters and entities with user-specified handles, then + ' those handles must be chosen not to conflict, e.g. starting + ' from 100 000 or another large number. + + Public Class Param + Public Slv As Slvs + Public H As UInteger + + Public Sub New(ByVal s As Slvs, ByVal group As UInteger, + ByVal val As Double) + Slv = s + H = Slv.Params.Count() + 1 + Slv.AddParam(H, group, val) + End Sub + End Class + + Public MustInherit Class Entity + Public Slv As Slvs + Public H As UInteger + + Public Sub New(ByVal s As Slvs) + Slv = s + H = Slv.Entities.Count() + 1 + End Sub + End Class + + Public MustInherit Class Point + Inherits Entity + Public Sub New(ByVal s As Slvs) + MyBase.New(s) + End Sub + End Class + + Public MustInherit Class Normal + Inherits Entity + Public Sub New(ByVal s As Slvs) + MyBase.New(s) + End Sub + End Class + + Public Class Point2d + Inherits Point + Public up, vp As Param + Public Sub New(ByVal s As Slvs, ByVal group As UInteger, + ByVal wrkpl As Workplane, + ByVal u As Double, ByVal v As Double) + MyBase.New(s) + up = New Param(Slv, group, u) + vp = New Param(Slv, group, v) + Slv.AddPoint2d(H, group, wrkpl.H, up.H, vp.H) + End Sub + Public Sub New(ByVal s As Slvs, ByVal group As UInteger, + ByVal wrkpl As Workplane, + ByVal u As Param, ByVal v As Param) + MyBase.New(s) + Slv.AddPoint2d(H, group, wrkpl.H, u.H, v.H) + up = u + vp = v + End Sub + Function GetU() + Return Slv.GetParamByHandle(up.H) + End Function + Function GetV() + Return Slv.GetParamByHandle(vp.H) + End Function + End Class + + Public Class Point3d + Inherits Point + Public xp, yp, zp As Param + Public Sub New(ByVal s As Slvs, ByVal group As UInteger, + ByVal x As Double, ByVal y As Double, + ByVal z As Double) + MyBase.New(s) + xp = New Param(Slv, group, x) + yp = New Param(Slv, group, y) + zp = New Param(Slv, group, z) + Slv.AddPoint3d(H, group, xp.H, yp.H, zp.H) + End Sub + Public Sub New(ByVal s As Slvs, ByVal group As UInteger, + ByVal x As Param, ByVal y As Param, ByVal z As Param) + MyBase.New(s) + Slv.AddPoint3d(H, group, x.H, y.H, z.H) + xp = x + yp = y + zp = z + End Sub + Function GetX() + Return Slv.GetParamByHandle(xp.H) + End Function + Function GetY() + Return Slv.GetParamByHandle(yp.H) + End Function + Function GetZ() + Return Slv.GetParamByHandle(zp.H) + End Function + End Class + + Public Class Normal3d + Inherits Normal + Dim qwp, qxp, qyp, qzp As Param + Public Sub New(ByVal s As Slvs, ByVal group As UInteger, + ByVal ux As Double, ByVal uy As Double, ByVal uz As Double, + ByVal vx As Double, ByVal vy As Double, ByVal vz As Double) + MyBase.New(s) + Dim qw, qx, qy, qz As Double + Slv.MakeQuaternion(ux, uy, uz, vx, vy, vz, qw, qx, qy, qz) + qwp = New Param(Slv, group, qw) + qxp = New Param(Slv, group, qx) + qyp = New Param(Slv, group, qy) + qzp = New Param(Slv, group, qz) + Slv.AddNormal3d(H, group, qwp.H, qxp.H, qyp.H, qzp.H) + End Sub + Public Sub New(ByVal s As Slvs, ByVal group As UInteger, + ByVal qw As Param, ByVal qx As Param, + ByVal qy As Param, ByVal qz As Param) + MyBase.New(s) + Slv.AddNormal3d(H, group, qw.H, qx.H, qy.H, qz.H) + qwp = qw + qxp = qx + qyp = qy + qzp = qz + End Sub + End Class + + Public Class Normal2d + Inherits Normal + Public Sub New(ByVal s As Slvs, ByVal group As UInteger, + ByVal wrkpl As Workplane) + MyBase.New(s) + Slv.AddNormal2d(H, group, wrkpl.H) + End Sub + End Class + + Public Class Distance + Inherits Entity + Public dp As Param + + Public Sub New(ByVal s As Slvs, ByVal group As UInteger, + ByVal wrkpl As Workplane, ByVal d As Double) + MyBase.New(s) + dp = New Param(Slv, group, d) + Slv.AddDistance(H, group, wrkpl.H, dp.H) + End Sub + Public Sub New(ByVal s As Slvs, ByVal group As UInteger, + ByVal wrkpl As Workplane, ByVal d As Param) + MyBase.New(s) + Slv.AddDistance(H, group, wrkpl.H, d.H) + dp = d + End Sub + Function GetDistance() As Double + Return Slv.GetParamByHandle(dp.H) + End Function + End Class + + Public Class LineSegment + Inherits Entity + Public Sub New(ByVal s As Slvs, ByVal group As UInteger, + ByVal wrkpl As Workplane, + ByVal ptA As Point, ByVal ptB As Point) + MyBase.New(s) + Slv.AddLineSegment(H, group, wrkpl.H, ptA.H, ptB.H) + End Sub + End Class + + Public Class Cubic + Inherits Entity + Public Sub New(ByVal s As Slvs, ByVal group As UInteger, + ByVal wrkpl As Workplane, + ByVal pt0 As Point, ByVal pt1 As Point, + ByVal pt2 As Point, ByVal pt3 As Point) + MyBase.New(s) + Slv.AddCubic(H, group, wrkpl.H, pt0.H, pt1.H, pt2.H, pt3.H) + End Sub + End Class + + Public Class ArcOfCircle + Inherits Entity + Public Sub New(ByVal s As Slvs, ByVal group As UInteger, + ByVal wrkpl As Workplane, ByVal normal As Normal, + ByVal center As Point, ByVal pstart As Point, + ByVal pend As Point) + MyBase.New(s) + Slv.AddArcOfCircle(H, group, wrkpl.H, normal.H, _ + center.H, pstart.H, pend.H) + End Sub + End Class + + Public Class Circle + Inherits Entity + Public Sub New(ByVal s As Slvs, ByVal group As UInteger, + ByVal wrkpl As Workplane, ByVal center As Point, + ByVal normal As Normal, ByVal radius As Distance) + MyBase.New(s) + Slv.AddCircle(H, group, wrkpl.H, center.H, normal.H, radius.H) + End Sub + End Class + + Public Class Workplane + Inherits Entity + Public Sub New(ByVal s As Slvs) + MyBase.New(s) + H = SLVS_FREE_IN_3D + End Sub + Public Sub New(ByVal s As Slvs, ByVal group As UInteger, + ByVal origin As Point, ByVal normal As Normal) + MyBase.New(s) + Slv.AddWorkplane(H, group, origin.H, normal.H) + End Sub + End Class + + End Class + +End Module + diff --git a/extlib/libdxfrw/CMakeLists.txt b/extlib/libdxfrw/CMakeLists.txt new file mode 100644 index 0000000..564e91a --- /dev/null +++ b/extlib/libdxfrw/CMakeLists.txt @@ -0,0 +1,75 @@ +if(MSVC) + # Disable some overly strict MSVC warnings. + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -wd4244 -wd4800 -wd4805") +endif() + +set(intern_HEADERS + intern/drw_cptable932.h + intern/drw_cptable936.h + intern/drw_cptable949.h + intern/drw_cptable950.h + intern/drw_cptables.h + intern/drw_dbg.h + intern/drw_textcodec.h + intern/dwgbuffer.h + intern/dwgreader15.h + intern/dwgreader18.h + intern/dwgreader21.h + intern/dwgreader24.h + intern/dwgreader27.h + intern/dwgreader.h + intern/dwgutil.h + intern/dxfreader.h + intern/dxfwriter.h + intern/rscodec.h) + +set(intern_SOURCES + intern/drw_dbg.cpp + intern/drw_textcodec.cpp + intern/dwgbuffer.cpp + intern/dwgreader15.cpp + intern/dwgreader18.cpp + intern/dwgreader21.cpp + intern/dwgreader24.cpp + intern/dwgreader27.cpp + intern/dwgreader.cpp + intern/dwgutil.cpp + intern/dxfreader.cpp + intern/dxfwriter.cpp + intern/rscodec.cpp) + +set(libdxfrw_HEADERS + drw_base.h + drw_interface.h + drw_header.h + drw_classes.h + drw_entities.h + drw_objects.h + libdxfrw.h) + +set(libdxfrw_SOURCES + drw_header.cpp + drw_classes.cpp + drw_entities.cpp + drw_objects.cpp + libdxfrw.cpp) + +set(libdwgr_HEADERS + libdwgr.h) + +set(libdwgr_SOURCES + libdwgr.cpp) + +add_library(dxfrw STATIC + ${intern_HEADERS} + ${intern_SOURCES} + ${libdxfrw_HEADERS} + ${libdxfrw_SOURCES} + ${libdwgr_HEADERS} + ${libdwgr_SOURCES}) + +target_include_directories(dxfrw PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR}/intern/) + +target_include_directories(dxfrw PUBLIC + ${CMAKE_CURRENT_SOURCE_DIR}/) diff --git a/extlib/libdxfrw/drw_base.h b/extlib/libdxfrw/drw_base.h new file mode 100644 index 0000000..648f3e6 --- /dev/null +++ b/extlib/libdxfrw/drw_base.h @@ -0,0 +1,480 @@ +/****************************************************************************** +** libDXFrw - Library to read/write DXF files (ascii & binary) ** +** ** +** Copyright (C) 2011-2015 José F. Soriano, rallazz@gmail.com ** +** ** +** This library is free software, licensed under the terms of the GNU ** +** General Public License as published by the Free Software Foundation, ** +** either version 2 of the License, or (at your option) any later version. ** +** You should have received a copy of the GNU General Public License ** +** along with this program. If not, see . ** +******************************************************************************/ + +#ifndef DRW_BASE_H +#define DRW_BASE_H + +#define DRW_VERSION "0.6.3" + +#include +#include +#include + +#ifdef DRW_ASSERTS +# define drw_assert(a) assert(a) +#else +# define drw_assert(a) +#endif + +#define UTF8STRING std::string +#define DRW_UNUSED(x) (void)x + +#if defined(WIN64) || defined(_WIN64) || defined(__WIN64__) +# define DRW_WIN +#elif defined(WIN32) || defined(_WIN32) || defined(__WIN32__) || defined(__NT__) +# define DRW_WIN +#elif defined(__MWERKS__) && defined(__INTEL__) +# define DRW_WIN +#else +# define DRW_POSIX +#endif + +#ifndef M_PI + #define M_PI 3.141592653589793238462643 +#endif +#ifndef M_PI_2 + #define M_PI_2 1.57079632679489661923 +#endif +#define M_PIx2 6.283185307179586 // 2*PI +#define ARAD 57.29577951308232 + +typedef signed char dint8; /* 8 bit signed */ +typedef signed short dint16; /* 16 bit signed */ +typedef signed int dint32; /* 32 bit signed */ +typedef long long int dint64; /* 64 bit signed */ + +typedef unsigned char duint8; /* 8 bit unsigned */ +typedef unsigned short duint16; /* 16 bit unsigned */ +typedef unsigned int duint32; /* 32 bit unsigned */ +typedef unsigned long long int duint64; /* 64 bit unsigned */ + +typedef float dfloat32; /* 32 bit floating point */ +typedef double ddouble64; /* 64 bit floating point */ +typedef long double ddouble80; /* 80 bit floating point */ + + +namespace DRW { + +//! Version numbers for the DXF Format. +enum Version { + UNKNOWNV, /*!< UNKNOWN VERSION. */ + AC1006, /*!< R10. */ + AC1009, /*!< R11 & R12. */ + AC1012, /*!< R13. */ + AC1014, /*!< R14. */ + AC1015, /*!< ACAD 2000. */ + AC1018, /*!< ACAD 2004. */ + AC1021, /*!< ACAD 2007. */ + AC1024, /*!< ACAD 2010. */ + AC1027 /*!< ACAD 2013. */ +}; + +enum error { +BAD_NONE, /*!< No error. */ +BAD_UNKNOWN, /*!< UNKNOWN. */ +BAD_OPEN, /*!< error opening file. */ +BAD_VERSION, /*!< unsupported version. */ +BAD_READ_METADATA, /*!< error reading matadata. */ +BAD_READ_FILE_HEADER, /*!< error in file header read process. */ +BAD_READ_HEADER, /*!< error in header vars read process. */ +BAD_READ_HANDLES, /*!< error in object map read process. */ +BAD_READ_CLASSES, /*!< error in classes read process. */ +BAD_READ_TABLES, /*!< error in tables read process. */ +BAD_READ_BLOCKS, /*!< error in block read process. */ +BAD_READ_ENTITIES, /*!< error in entities read process. */ +BAD_READ_OBJECTS /*!< error in objects read process. */ +}; + +enum DBG_LEVEL { + NONE, + DEBUG +}; + +//! Special codes for colors +enum ColorCodes { + ColorByLayer = 256, + ColorByBlock = 0 +}; + +//! Spaces +enum Space { + ModelSpace = 0, + PaperSpace = 1 +}; + +//! Special kinds of handles +enum HandleCodes { + NoHandle = 0 +}; + +//! Shadow mode +enum ShadowMode { + CastAndReceieveShadows = 0, + CastShadows = 1, + ReceiveShadows = 2, + IgnoreShadows = 3 +}; + +//! Special kinds of materials +enum MaterialCodes { + MaterialByLayer = 0 +}; + +//! Special kinds of plot styles +enum PlotStyleCodes { + DefaultPlotStyle = 0 +}; + +//! Special kinds of transparencies +enum TransparencyCodes { + Opaque = 0, + Transparent = -1 +}; + +} // namespace DRW + +//! Class to handle 3D coordinate point +/*! +* Class to handle 3D coordinate point +* @author Rallaz +*/ +class DRW_Coord { +public: + DRW_Coord() { x = 0; y = 0; z = 0; } + DRW_Coord(double ix, double iy, double iz) { + x = ix; y = iy; z = iz; + } + + DRW_Coord operator = (const DRW_Coord& data) { + x = data.x; y = data.y; z = data.z; + return *this; + } +/*!< convert to unitary vector */ + void unitize(){ + double dist; + dist = sqrt(x*x + y*y + z*z); + if (dist > 0.0) { + x= x/dist; + y= y/dist; + z= z/dist; + } + } + +public: + double x; + double y; + double z; +}; + + +//! Class to handle vertex +/*! +* Class to handle vertex for lwpolyline entity +* @author Rallaz +*/ +class DRW_Vertex2D { +public: + DRW_Vertex2D() { +// eType = DRW::LWPOLYLINE; + stawidth = endwidth = bulge = 0; + } + DRW_Vertex2D(double sx, double sy, double b) { + stawidth = endwidth = 0; + x = sx; + y =sy; + bulge = b; + } + +public: + double x; /*!< x coordinate, code 10 */ + double y; /*!< y coordinate, code 20 */ + double stawidth; /*!< Start width, code 40 */ + double endwidth; /*!< End width, code 41 */ + double bulge; /*!< bulge, code 42 */ +}; + + +//! Class to handle header vars +/*! +* Class to handle header vars +* @author Rallaz +*/ +class DRW_Variant { +public: + enum TYPE { + STRING, + INTEGER, + DOUBLE, + COORD, + INVALID + }; +//TODO: add INT64 support + DRW_Variant() { + type = INVALID; + } + + DRW_Variant(int c, dint32 i) { + code = c; addInt(i); + } + DRW_Variant(int c, duint32 i) { + code = c; addInt(static_cast(i));//RLZ: verify if worrk with big numbers + } + DRW_Variant(int c, double d) { + code = c; addDouble(d); + } + DRW_Variant(int c, UTF8STRING s) { + code = c; addString(s); + } + DRW_Variant(int c, DRW_Coord crd) { + code = c; addCoord(crd); + } + DRW_Variant(const DRW_Variant& d) { + code = d.code; + type = d.type; + content = d.content; + if (d.type == COORD) { + vdata = d.vdata; + content.v = &vdata; + } + if (d.type == STRING) { + sdata = d.sdata; + content.s = &sdata; + } + } + + ~DRW_Variant() { + } + + void addString(UTF8STRING s) {setType(STRING); sdata = s; content.s = &sdata;} + void addInt(int i) {setType(INTEGER); content.i = i;} + void addDouble(double d) {setType(DOUBLE); content.d = d;} + void addCoord() {setType(COORD); vdata.x=0.0; vdata.y=0.0; vdata.z=0.0; content.v = &vdata;} + void addCoord(DRW_Coord v) {setType(COORD); vdata = v; content.v = &vdata;} + void setType(enum TYPE t) { type = t;} + void setCoordX(double d) { if (type == COORD) vdata.x = d;} + void setCoordY(double d) { if (type == COORD) vdata.y = d;} + void setCoordZ(double d) { if (type == COORD) vdata.z = d;} + +private: + typedef union { + UTF8STRING *s; + dint32 i; + double d; + DRW_Coord *v; + } DRW_VarContent; + +public: + DRW_VarContent content; + enum TYPE type; + int code; /*!< dxf code of this value*/ + +private: + std::string sdata; + DRW_Coord vdata; +}; + +//! Class to handle dwg handles +/*! +* Class to handle dwg handles +* @author Rallaz +*/ +class dwgHandle{ +public: + dwgHandle(){ + code=0; + size=0; + ref=0; + } + ~dwgHandle(){} + duint8 code; + duint8 size; + duint32 ref; +}; + +//! Class to convert between line width and integer +/*! +* Class to convert between line width and integer +* verifing valid values, if value is not valid +* returns widthDefault. +* @author Rallaz +*/ +class DRW_LW_Conv{ +public: + enum lineWidth { + width00 = 0, /*!< 0.00mm (dxf 0)*/ + width01 = 1, /*!< 0.05mm (dxf 5)*/ + width02 = 2, /*!< 0.09mm (dxf 9)*/ + width03 = 3, /*!< 0.13mm (dxf 13)*/ + width04 = 4, /*!< 0.15mm (dxf 15)*/ + width05 = 5, /*!< 0.18mm (dxf 18)*/ + width06 = 6, /*!< 0.20mm (dxf 20)*/ + width07 = 7, /*!< 0.25mm (dxf 25)*/ + width08 = 8, /*!< 0.30mm (dxf 30)*/ + width09 = 9, /*!< 0.35mm (dxf 35)*/ + width10 = 10, /*!< 0.40mm (dxf 40)*/ + width11 = 11, /*!< 0.50mm (dxf 50)*/ + width12 = 12, /*!< 0.53mm (dxf 53)*/ + width13 = 13, /*!< 0.60mm (dxf 60)*/ + width14 = 14, /*!< 0.70mm (dxf 70)*/ + width15 = 15, /*!< 0.80mm (dxf 80)*/ + width16 = 16, /*!< 0.90mm (dxf 90)*/ + width17 = 17, /*!< 1.00mm (dxf 100)*/ + width18 = 18, /*!< 1.06mm (dxf 106)*/ + width19 = 19, /*!< 1.20mm (dxf 120)*/ + width20 = 20, /*!< 1.40mm (dxf 140)*/ + width21 = 21, /*!< 1.58mm (dxf 158)*/ + width22 = 22, /*!< 2.00mm (dxf 200)*/ + width23 = 23, /*!< 2.11mm (dxf 211)*/ + widthByLayer = 29, /*!< by layer (dxf -1) */ + widthByBlock = 30, /*!< by block (dxf -2) */ + widthDefault = 31 /*!< by default (dxf -3) */ + }; + + static int lineWidth2dxfInt(enum lineWidth lw){ + switch (lw){ + case widthByLayer: + return -1; + case widthByBlock: + return -2; + case widthDefault: + return -3; + case width00: + return 0; + case width01: + return 5; + case width02: + return 9; + case width03: + return 13; + case width04: + return 15; + case width05: + return 18; + case width06: + return 20; + case width07: + return 25; + case width08: + return 30; + case width09: + return 35; + case width10: + return 40; + case width11: + return 50; + case width12: + return 53; + case width13: + return 60; + case width14: + return 70; + case width15: + return 80; + case width16: + return 90; + case width17: + return 100; + case width18: + return 106; + case width19: + return 120; + case width20: + return 140; + case width21: + return 158; + case width22: + return 200; + case width23: + return 211; + default: + break; + } + return -3; + } + + static int lineWidth2dwgInt(enum lineWidth lw){ + return static_cast (lw); + } + + static enum lineWidth dxfInt2lineWidth(int i){ + if (i<0) { + if (i==-1) + return widthByLayer; + else if (i==-2) + return widthByBlock; + else if (i==-3) + return widthDefault; + } else if (i<3) { + return width00; + } else if (i<7) { + return width01; + } else if (i<11) { + return width02; + } else if (i<14) { + return width03; + } else if (i<16) { + return width04; + } else if (i<19) { + return width05; + } else if (i<22) { + return width06; + } else if (i<27) { + return width07; + } else if (i<32) { + return width08; + } else if (i<37) { + return width09; + } else if (i<45) { + return width10; + } else if (i<52) { + return width11; + } else if (i<57) { + return width12; + } else if (i<65) { + return width13; + } else if (i<75) { + return width14; + } else if (i<85) { + return width15; + } else if (i<95) { + return width16; + } else if (i<103) { + return width17; + } else if (i<112) { + return width18; + } else if (i<130) { + return width19; + } else if (i<149) { + return width20; + } else if (i<180) { + return width21; + } else if (i<205) { + return width22; + } else { + return width23; + } + //default by default + return widthDefault; + } + + static enum lineWidth dwgInt2lineWidth(int i){ + if ( (i>-1 && i<24) || (i>28 && i<32) ) { + return static_cast (i); + } + //default by default + return widthDefault; + } +}; + +#endif + +// EOF diff --git a/extlib/libdxfrw/drw_classes.cpp b/extlib/libdxfrw/drw_classes.cpp new file mode 100644 index 0000000..02eb01d --- /dev/null +++ b/extlib/libdxfrw/drw_classes.cpp @@ -0,0 +1,115 @@ +/****************************************************************************** +** libDXFrw - Library to read/write DXF files (ascii & binary) ** +** ** +** Copyright (C) 2011-2015 José F. Soriano, rallazz@gmail.com ** +** ** +** This library is free software, licensed under the terms of the GNU ** +** General Public License as published by the Free Software Foundation, ** +** either version 2 of the License, or (at your option) any later version. ** +** You should have received a copy of the GNU General Public License ** +** along with this program. If not, see . ** +******************************************************************************/ + +#include "drw_classes.h" +#include "intern/dxfreader.h" +#include "intern/dxfwriter.h" +#include "intern/dwgbuffer.h" +#include "intern/drw_dbg.h" + +void DRW_Class::parseCode(int code, dxfReader *reader){ + switch (code) { + case 1: + recName = reader->getUtf8String(); + break; + case 2: + className = reader->getUtf8String(); + break; + case 3: + appName = reader->getUtf8String(); + break; + case 90: + proxyFlag = reader->getInt32(); + break; + case 91: + instanceCount = reader->getInt32(); + break; + case 280: + wasaProxyFlag = reader->getInt32(); + break; + case 281: + entityFlag = reader->getInt32(); + break; + default: + break; + } +} + +bool DRW_Class::parseDwg(DRW::Version version, dwgBuffer *buf, dwgBuffer *strBuf){ + DRW_DBG("\n***************************** parsing Class *********************************************\n"); + + classNum = buf->getBitShort(); + DRW_DBG("Class number: "); DRW_DBG(classNum); + proxyFlag = buf->getBitShort(); //in dwg specs says "version" + + appName = strBuf->getVariableText(version, false); + className = strBuf->getVariableText(version, false); + recName = strBuf->getVariableText(version, false); + + DRW_DBG("\napp name: "); DRW_DBG(appName.c_str()); + DRW_DBG("\nclass name: "); DRW_DBG(className.c_str()); + DRW_DBG("\ndxf rec name: "); DRW_DBG(recName.c_str()); + wasaProxyFlag = buf->getBit(); //in dwg says wasazombie + entityFlag = buf->getBitShort(); + entityFlag = entityFlag == 0x1F2 ? 1: 0; + + DRW_DBG("\nProxy capabilities flag: "); DRW_DBG(proxyFlag); + DRW_DBG(", proxy flag (280): "); DRW_DBG(wasaProxyFlag); + DRW_DBG(", entity flag: "); DRW_DBGH(entityFlag); + + if (version > DRW::AC1015) {//2004+ + instanceCount = buf->getBitLong(); + DRW_DBG("\nInstance Count: "); DRW_DBG(instanceCount); + duint32 dwgVersion = buf->getBitLong(); + DRW_DBG("\nDWG version: "); DRW_DBG(dwgVersion); + DRW_DBG("\nmaintenance version: "); DRW_DBG(buf->getBitLong()); + DRW_DBG("\nunknown 1: "); DRW_DBG(buf->getBitLong()); + DRW_DBG("\nunknown 2: "); DRW_DBG(buf->getBitLong()); + } + DRW_DBG("\n"); + toDwgType(); + return buf->isGood(); +} + +void DRW_Class::write(dxfWriter *writer, DRW::Version ver){ + if (ver > DRW::AC1009) { + writer->writeString(0, "CLASS"); + writer->writeString(1, recName); + writer->writeString(2, className); + writer->writeString(3, appName); + writer->writeInt32(90, proxyFlag); + if (ver > DRW::AC1015) { //2004+ + writer->writeInt32(91, instanceCount); + } + writer->writeInt16(280, wasaProxyFlag); + writer->writeInt16(281, entityFlag); + } +} + +void DRW_Class::toDwgType(){ + if (recName == "LWPOLYLINE") + dwgType = 77; + else if (recName == "HATCH") + dwgType = 78; + else if (recName == "GROUP") + dwgType = 72; +/* else if (recName == "GROUP") + dwgType = 72;*/ + else if (recName == "LAYOUT") + dwgType = 82; + else if (recName == "IMAGE") + dwgType = 101; + else if (recName == "IMAGEDEF") + dwgType = 102; + else + dwgType =0; +} diff --git a/extlib/libdxfrw/drw_classes.h b/extlib/libdxfrw/drw_classes.h new file mode 100644 index 0000000..84ea32d --- /dev/null +++ b/extlib/libdxfrw/drw_classes.h @@ -0,0 +1,58 @@ +/****************************************************************************** +** libDXFrw - Library to read/write DXF files (ascii & binary) ** +** ** +** Copyright (C) 2011-2015 José F. Soriano, rallazz@gmail.com ** +** ** +** This library is free software, licensed under the terms of the GNU ** +** General Public License as published by the Free Software Foundation, ** +** either version 2 of the License, or (at your option) any later version. ** +** You should have received a copy of the GNU General Public License ** +** along with this program. If not, see . ** +******************************************************************************/ + +#ifndef DRW_CLASSES_H +#define DRW_CLASSES_H + + +#include "drw_base.h" +//#include "libdwgr.h" + +class dxfReader; +class dxfWriter; +class dwgBuffer; + +//! Class to handle classes entries +/*! +* Class to handle classes table entries +* TODO: verify the dxf read/write part +* @author Rallaz +*/ +class DRW_Class { +public: + DRW_Class() { + } + ~DRW_Class() { + } + + void parseCode(int code, dxfReader *reader); + void write(dxfWriter *writer, DRW::Version ver); + bool parseDwg(DRW::Version version, dwgBuffer *buf, dwgBuffer *strBuf); + +private: + void toDwgType(); +public: + UTF8STRING recName; /*!< record name, code 1 */ + UTF8STRING className; /*!< C++ class name, code 2 */ + UTF8STRING appName; /*!< app name, code 3 */ + int proxyFlag; /*!< Proxy capabilities flag, code 90 */ + int instanceCount; /*!< number of instances for a custom class, code 91*/ + int wasaProxyFlag; /*!< proxy flag (app loaded on save), code 280 */ + int entityFlag; /*!< entity flag, code 281 (0 object, 1 entity)*/ +public: //only for read dwg + duint16 classNum; + int dwgType; +}; + +#endif + +// EOF diff --git a/extlib/libdxfrw/drw_entities.cpp b/extlib/libdxfrw/drw_entities.cpp new file mode 100644 index 0000000..0265f56 --- /dev/null +++ b/extlib/libdxfrw/drw_entities.cpp @@ -0,0 +1,3064 @@ +/****************************************************************************** +** libDXFrw - Library to read/write DXF files (ascii & binary) ** +** ** +** Copyright (C) 2011-2015 José F. Soriano, rallazz@gmail.com ** +** ** +** This library is free software, licensed under the terms of the GNU ** +** General Public License as published by the Free Software Foundation, ** +** either version 2 of the License, or (at your option) any later version. ** +** You should have received a copy of the GNU General Public License ** +** along with this program. If not, see . ** +******************************************************************************/ + +#include +#include "drw_entities.h" +#include "intern/dxfreader.h" +#include "intern/dwgbuffer.h" +#include "intern/drw_dbg.h" + + +//! Calculate arbitary axis +/*! +* Calculate arbitary axis for apply extrusions +* @author Rallaz +*/ +void DRW_Entity::calculateAxis(DRW_Coord extPoint){ + //Follow the arbitrary DXF definitions for extrusion axes. + if (fabs(extPoint.x) < 0.015625 && fabs(extPoint.y) < 0.015625) { + //If we get here, implement Ax = Wy x N where Wy is [0,1,0] per the DXF spec. + //The cross product works out to Wy.y*N.z-Wy.z*N.y, Wy.z*N.x-Wy.x*N.z, Wy.x*N.y-Wy.y*N.x + //Factoring in the fixed values for Wy gives N.z,0,-N.x + extAxisX.x = extPoint.z; + extAxisX.y = 0; + extAxisX.z = -extPoint.x; + } else { + //Otherwise, implement Ax = Wz x N where Wz is [0,0,1] per the DXF spec. + //The cross product works out to Wz.y*N.z-Wz.z*N.y, Wz.z*N.x-Wz.x*N.z, Wz.x*N.y-Wz.y*N.x + //Factoring in the fixed values for Wz gives -N.y,N.x,0. + extAxisX.x = -extPoint.y; + extAxisX.y = extPoint.x; + extAxisX.z = 0; + } + + extAxisX.unitize(); + + //Ay = N x Ax + extAxisY.x = (extPoint.y * extAxisX.z) - (extAxisX.y * extPoint.z); + extAxisY.y = (extPoint.z * extAxisX.x) - (extAxisX.z * extPoint.x); + extAxisY.z = (extPoint.x * extAxisX.y) - (extAxisX.x * extPoint.y); + + extAxisY.unitize(); +} + +//! Extrude a point using arbitary axis +/*! +* apply extrusion in a point using arbitary axis (previous calculated) +* @author Rallaz +*/ +void DRW_Entity::extrudePoint(DRW_Coord extPoint, DRW_Coord *point){ + double px, py, pz; + px = (extAxisX.x*point->x)+(extAxisY.x*point->y)+(extPoint.x*point->z); + py = (extAxisX.y*point->x)+(extAxisY.y*point->y)+(extPoint.y*point->z); + pz = (extAxisX.z*point->x)+(extAxisY.z*point->y)+(extPoint.z*point->z); + + point->x = px; + point->y = py; + point->z = pz; +} + +bool DRW_Entity::parseCode(int code, dxfReader *reader){ + switch (code) { + case 5: + handle = reader->getHandleString(); + break; + case 330: + parentHandle = reader->getHandleString(); + break; + case 8: + layer = reader->getUtf8String(); + break; + case 6: + lineType = reader->getUtf8String(); + break; + case 62: + color = reader->getInt32(); + break; + case 370: + lWeight = DRW_LW_Conv::dxfInt2lineWidth(reader->getInt32()); + break; + case 48: + ltypeScale = reader->getDouble(); + break; + case 60: + visible = reader->getBool(); + break; + case 420: + color24 = reader->getInt32(); + break; + case 430: + colorName = reader->getString(); + break; + case 67: + space = static_cast(reader->getInt32()); + break; + case 102: + parseDxfGroups(code, reader); + break; + case 1000: + case 1001: + case 1002: + case 1003: + case 1004: + case 1005: + extData.push_back(new DRW_Variant(code, reader->getString())); + break; + case 1010: + case 1011: + case 1012: + case 1013: + curr = new DRW_Variant(); + curr->addCoord(); + curr->setCoordX(reader->getDouble()); + curr->code = code; + extData.push_back(curr); + break; + case 1020: + case 1021: + case 1022: + case 1023: + if (curr) + curr->setCoordY(reader->getDouble()); + break; + case 1030: + case 1031: + case 1032: + case 1033: + if (curr) + curr->setCoordZ(reader->getDouble()); + curr=NULL; + break; + case 1040: + case 1041: + case 1042: + extData.push_back(new DRW_Variant(code, reader->getDouble() )); + break; + case 1070: + case 1071: + extData.push_back(new DRW_Variant(code, reader->getInt32() )); + break; + default: + break; + } + return true; +} + +//parses dxf 102 groups to read entity +bool DRW_Entity::parseDxfGroups(int code, dxfReader *reader){ + std::list ls; + DRW_Variant curr; + int nc; + std::string appName= reader->getString(); + if (!appName.empty() && appName.at(0)== '{'){ + curr.addString(appName.substr(1, (int) appName.size()-1)); + curr.code = code; + ls.push_back(curr); + while (code !=102 && appName.at(0)== '}'){ + reader->readRec(&nc); + curr.code = code; + if (code == 330 || code == 360) + curr.addInt(reader->getHandleString()); + else { + switch (reader->type) { + case dxfReader::STRING: + curr.addString(reader->getString()); + break; + case dxfReader::INT32: + case dxfReader::INT64: + curr.addInt(reader->getInt32()); + break; + case dxfReader::DOUBLE: + curr.addDouble(reader->getDouble()); + break; + case dxfReader::BOOL: + curr.addInt(reader->getInt32()); + break; + default: + break; + } + } + ls.push_back(curr); + } + } + + appData.push_back(ls); + return true; +} + +bool DRW_Entity::parseDwg(DRW::Version version, dwgBuffer *buf, dwgBuffer* strBuf, duint32 bs){ + objSize=0; + DRW_DBG("\n***************************** parsing entity *********************************************\n"); + oType = buf->getObjType(version); + DRW_DBG("Object type: "); DRW_DBG(oType); DRW_DBG(", "); DRW_DBGH(oType); + + if (version > DRW::AC1014 && version < DRW::AC1024) {//2000 & 2004 + objSize = buf->getRawLong32(); //RL 32bits object size in bits + DRW_DBG(" Object size: "); DRW_DBG(objSize); DRW_DBG("\n"); + } + if (version > DRW::AC1021) {//2010+ + duint32 ms = buf->size(); + objSize = ms*8 - bs; + DRW_DBG(" Object size: "); DRW_DBG(objSize); DRW_DBG("\n"); + } + + if (strBuf != NULL && version > DRW::AC1018) {//2007+ + strBuf->moveBitPos(objSize-1); + DRW_DBG(" strBuf strbit pos 2007: "); DRW_DBG(strBuf->getPosition()); DRW_DBG(" strBuf bpos 2007: "); DRW_DBG(strBuf->getBitPos()); DRW_DBG("\n"); + if (strBuf->getBit() == 1){ + DRW_DBG("DRW_TableEntry::parseDwg string bit is 1\n"); + strBuf->moveBitPos(-17); + duint16 strDataSize = strBuf->getRawShort16(); + DRW_DBG("\nDRW_TableEntry::parseDwg string strDataSize: "); DRW_DBGH(strDataSize); DRW_DBG("\n"); + if ( (strDataSize& 0x8000) == 0x8000){ + DRW_DBG("\nDRW_TableEntry::parseDwg string 0x8000 bit is set"); + strBuf->moveBitPos(-33);//RLZ pending to verify + duint16 hiSize = strBuf->getRawShort16(); + strDataSize = ((strDataSize&0x7fff) | (hiSize<<15)); + } + strBuf->moveBitPos( -strDataSize -16); //-14 + DRW_DBG("strBuf start strDataSize pos 2007: "); DRW_DBG(strBuf->getPosition()); DRW_DBG(" strBuf bpos 2007: "); DRW_DBG(strBuf->getBitPos()); DRW_DBG("\n"); + } else + DRW_DBG("\nDRW_TableEntry::parseDwg string bit is 0"); + DRW_DBG("strBuf start pos 2007: "); DRW_DBG(strBuf->getPosition()); DRW_DBG(" strBuf bpos 2007: "); DRW_DBG(strBuf->getBitPos()); DRW_DBG("\n"); + } + + dwgHandle ho = buf->getHandle(); + handle = ho.ref; + DRW_DBG("Entity Handle: "); DRW_DBGHL(ho.code, ho.size, ho.ref); + dint16 extDataSize = buf->getBitShort(); //BS + DRW_DBG(" ext data size: "); DRW_DBG(extDataSize); + while (extDataSize>0 && buf->isGood()) { + /* RLZ: TODO */ + dwgHandle ah = buf->getHandle(); + DRW_DBG("App Handle: "); DRW_DBGHL(ah.code, ah.size, ah.ref); + duint8 *tmpExtData = new duint8[extDataSize]; + buf->getBytes(tmpExtData, extDataSize); + dwgBuffer tmpExtDataBuf(tmpExtData, extDataSize, buf->decoder); + + duint8 dxfCode = tmpExtDataBuf.getRawChar8(); + DRW_DBG(" dxfCode: "); DRW_DBG(dxfCode); + switch (dxfCode){ + case 0:{ + duint8 strLength = tmpExtDataBuf.getRawChar8(); + DRW_DBG(" strLength: "); DRW_DBG(strLength); + duint16 cp = tmpExtDataBuf.getBERawShort16(); + DRW_DBG(" str codepage: "); DRW_DBG(cp); + for (int i=0;i< strLength+1;i++) {//string length + null terminating char + duint8 dxfChar = tmpExtDataBuf.getRawChar8(); + DRW_DBG(" dxfChar: "); DRW_DBG(dxfChar); + } + break; + } + default: + /* RLZ: TODO */ + break; + } + delete[]tmpExtData; + extDataSize = buf->getBitShort(); //BS + DRW_DBG(" ext data size: "); DRW_DBG(extDataSize); + } //end parsing extData (EED) + duint8 graphFlag = buf->getBit(); //B + DRW_DBG(" graphFlag: "); DRW_DBG(graphFlag); DRW_DBG("\n"); + if (graphFlag) { + duint32 graphDataSize = buf->getRawLong32(); //RL 32bits + DRW_DBG("graphData in bytes: "); DRW_DBG(graphDataSize); DRW_DBG("\n"); +// RLZ: TODO + //skip graphData bytes + duint8 *tmpGraphData = new duint8[graphDataSize]; + buf->getBytes(tmpGraphData, graphDataSize); + dwgBuffer tmpGraphDataBuf(tmpGraphData, graphDataSize, buf->decoder); + DRW_DBG("graph data remaining bytes: "); DRW_DBG(tmpGraphDataBuf.numRemainingBytes()); DRW_DBG("\n"); + delete[]tmpGraphData; + } + if (version < DRW::AC1015) {//14- + objSize = buf->getRawLong32(); //RL 32bits object size in bits + DRW_DBG(" Object size in bits: "); DRW_DBG(objSize); DRW_DBG("\n"); + } + + duint8 entmode = buf->get2Bits(); //BB + if (entmode == 0) + ownerHandle= true; +// entmode = 2; + else if(entmode ==2) + entmode = 0; + space = (DRW::Space)entmode; //RLZ verify cast values + DRW_DBG("entmode: "); DRW_DBG(entmode); + numReactors = buf->getBitShort(); //BS + DRW_DBG(", numReactors: "); DRW_DBG(numReactors); + + if (version < DRW::AC1015) {//14- + if(buf->getBit()) {//is bylayer line type + lineType = "BYLAYER"; + ltFlags = 0; + } else { + lineType = ""; + ltFlags = 3; + } + DRW_DBG(" lineType: "); DRW_DBG(lineType.c_str()); + DRW_DBG(" ltFlags: "); DRW_DBG(ltFlags); + } + if (version > DRW::AC1015) {//2004+ + xDictFlag = buf->getBit(); + DRW_DBG(" xDictFlag: "); DRW_DBG(xDictFlag); DRW_DBG("\n"); + } + + if (version > DRW::AC1024 || version < DRW::AC1018) { + haveNextLinks = buf->getBit(); //aka nolinks //B + DRW_DBG(", haveNextLinks (0 yes, 1 prev next): "); DRW_DBG(haveNextLinks); DRW_DBG("\n"); + } else { + haveNextLinks = 1; //aka nolinks //B + DRW_DBG(", haveNextLinks (forced): "); DRW_DBG(haveNextLinks); DRW_DBG("\n"); + } +//ENC color + color = buf->getEnColor(version); //BS or CMC //ok for R14 or negate + ltypeScale = buf->getBitDouble(); //BD + DRW_DBG(" entity color: "); DRW_DBG(color); + DRW_DBG(" ltScale: "); DRW_DBG(ltypeScale); DRW_DBG("\n"); + if (version > DRW::AC1014) {//2000+ + UTF8STRING plotStyleName; + for (duint8 i = 0; i<2;++i) { //two flags in one + plotFlags = buf->get2Bits(); //BB + if (plotFlags == 1) + plotStyleName = "byblock"; + else if (plotFlags == 2) + plotStyleName = "continuous"; + else if (plotFlags == 0) + plotStyleName = "bylayer"; + else //handle at end + plotStyleName = ""; + if (i == 0) { + ltFlags = plotFlags; + lineType = plotStyleName; //RLZ: howto solve? if needed plotStyleName; + DRW_DBG("ltFlags: "); DRW_DBG(ltFlags); + DRW_DBG(" lineType: "); DRW_DBG(lineType.c_str()); + } else { + DRW_DBG(", plotFlags: "); DRW_DBG(plotFlags); + } + } + } + if (version > DRW::AC1018) {//2007+ + materialFlag = buf->get2Bits(); //BB + DRW_DBG("materialFlag: "); DRW_DBG(materialFlag); + shadowFlag = buf->getRawChar8(); //RC + DRW_DBG("shadowFlag: "); DRW_DBG(shadowFlag); DRW_DBG("\n"); + } + if (version > DRW::AC1021) {//2010+ + duint8 visualFlags = buf->get2Bits(); //full & face visual style + DRW_DBG("shadowFlag 2: "); DRW_DBG(visualFlags); DRW_DBG("\n"); + duint8 unk = buf->getBit(); //edge visual style + DRW_DBG("unknown bit: "); DRW_DBG(unk); DRW_DBG("\n"); + } + dint16 invisibleFlag = buf->getBitShort(); //BS + DRW_DBG(" invisibleFlag: "); DRW_DBG(invisibleFlag); + if (version > DRW::AC1014) {//2000+ + lWeight = DRW_LW_Conv::dwgInt2lineWidth( buf->getRawChar8() ); //RC + DRW_DBG(" lwFlag (lWeight): "); DRW_DBG(lWeight); DRW_DBG("\n"); + } + //Only in blocks ???????? +// if (version > DRW::AC1018) {//2007+ +// duint8 unk = buf->getBit(); +// DRW_DBG("unknown bit: "); DRW_DBG(unk); DRW_DBG("\n"); +// } + return buf->isGood(); +} + +bool DRW_Entity::parseDwgEntHandle(DRW::Version version, dwgBuffer *buf){ + if (version > DRW::AC1018) {//2007+ skip string area + buf->setPosition(objSize >> 3); + buf->setBitPos(objSize & 7); + } + + if(ownerHandle){//entity are in block or in a polyline + dwgHandle ownerH = buf->getOffsetHandle(handle); + DRW_DBG("owner (parent) Handle: "); DRW_DBGHL(ownerH.code, ownerH.size, ownerH.ref); DRW_DBG("\n"); + DRW_DBG(" Remaining bytes: "); DRW_DBG(buf->numRemainingBytes()); DRW_DBG("\n"); + parentHandle = ownerH.ref; + DRW_DBG("Block (parent) Handle: "); DRW_DBGHL(ownerH.code, ownerH.size, parentHandle); DRW_DBG("\n"); + } else + DRW_DBG("NO Block (parent) Handle\n"); + + DRW_DBG("\n Remaining bytes: "); DRW_DBG(buf->numRemainingBytes()); DRW_DBG("\n"); + for (int i=0; i< numReactors;++i) { + dwgHandle reactorsH = buf->getHandle(); + DRW_DBG(" reactorsH control Handle: "); DRW_DBGHL(reactorsH.code, reactorsH.size, reactorsH.ref); DRW_DBG("\n"); + } + if (xDictFlag !=1){//linetype in 2004 seems not have XDicObjH or NULL handle + dwgHandle XDicObjH = buf->getHandle(); + DRW_DBG(" XDicObj control Handle: "); DRW_DBGHL(XDicObjH.code, XDicObjH.size, XDicObjH.ref); DRW_DBG("\n"); + } + DRW_DBG("Remaining bytes: "); DRW_DBG(buf->numRemainingBytes()); DRW_DBG("\n"); + + if (version < DRW::AC1015) {//R14- + //layer handle + layerH = buf->getOffsetHandle(handle); + DRW_DBG(" layer Handle: "); DRW_DBGHL(layerH.code, layerH.size, layerH.ref); DRW_DBG("\n"); + DRW_DBG(" Remaining bytes: "); DRW_DBG(buf->numRemainingBytes()); DRW_DBG("\n"); + //lineType handle + if(ltFlags == 3){ + lTypeH = buf->getOffsetHandle(handle); + DRW_DBG("linetype Handle: "); DRW_DBGHL(lTypeH.code, lTypeH.size, lTypeH.ref); DRW_DBG("\n"); + DRW_DBG(" Remaining bytes: "); DRW_DBG(buf->numRemainingBytes()); DRW_DBG("\n"); + } + } + if (version < DRW::AC1018) {//2000+ + if (haveNextLinks == 0) { + dwgHandle nextLinkH = buf->getOffsetHandle(handle); + DRW_DBG(" prev nextLinkers Handle: "); DRW_DBGHL(nextLinkH.code, nextLinkH.size, nextLinkH.ref); DRW_DBG("\n"); + DRW_DBG("\n Remaining bytes: "); DRW_DBG(buf->numRemainingBytes()); DRW_DBG("\n"); + prevEntLink = nextLinkH.ref; + nextLinkH = buf->getOffsetHandle(handle); + DRW_DBG(" next nextLinkers Handle: "); DRW_DBGHL(nextLinkH.code, nextLinkH.size, nextLinkH.ref); DRW_DBG("\n"); + DRW_DBG("\n Remaining bytes: "); DRW_DBG(buf->numRemainingBytes()); DRW_DBG("\n"); + nextEntLink = nextLinkH.ref; + } else { + nextEntLink = handle+1; + prevEntLink = handle-1; + } + } + if (version > DRW::AC1015) {//2004+ + //Parses Bookcolor handle + } + if (version > DRW::AC1014) {//2000+ + //layer handle + layerH = buf->getOffsetHandle(handle); + DRW_DBG(" layer Handle: "); DRW_DBGHL(layerH.code, layerH.size, layerH.ref); DRW_DBG("\n"); + DRW_DBG(" Remaining bytes: "); DRW_DBG(buf->numRemainingBytes()); DRW_DBG("\n"); + //lineType handle + if(ltFlags == 3){ + lTypeH = buf->getOffsetHandle(handle); + DRW_DBG("linetype Handle: "); DRW_DBGHL(lTypeH.code, lTypeH.size, lTypeH.ref); DRW_DBG("\n"); + DRW_DBG(" Remaining bytes: "); DRW_DBG(buf->numRemainingBytes()); DRW_DBG("\n"); + } + } + if (version > DRW::AC1014) {//2000+ + if (version > DRW::AC1018) {//2007+ + if (materialFlag == 3) { + dwgHandle materialH = buf->getOffsetHandle(handle); + DRW_DBG(" material Handle: "); DRW_DBGHL(materialH.code, materialH.size, materialH.ref); DRW_DBG("\n"); + DRW_DBG("\n Remaining bytes: "); DRW_DBG(buf->numRemainingBytes()); DRW_DBG("\n"); + } + if (shadowFlag == 3) { + dwgHandle shadowH = buf->getOffsetHandle(handle); + DRW_DBG(" shadow Handle: "); DRW_DBGHL(shadowH.code, shadowH.size, shadowH.ref); DRW_DBG("\n"); + DRW_DBG("\n Remaining bytes: "); DRW_DBG(buf->numRemainingBytes()); DRW_DBG("\n"); + } + } + if (plotFlags == 3) { + dwgHandle plotStyleH = buf->getOffsetHandle(handle); + DRW_DBG(" plot style Handle: "); DRW_DBGHL(plotStyleH.code, plotStyleH.size, plotStyleH.ref); DRW_DBG("\n"); + DRW_DBG("\n Remaining bytes: "); DRW_DBG(buf->numRemainingBytes()); DRW_DBG("\n"); + } + } + DRW_DBG("\n DRW_Entity::parseDwgEntHandle Remaining bytes: "); DRW_DBG(buf->numRemainingBytes()); DRW_DBG("\n"); + return buf->isGood(); +} + +void DRW_Point::parseCode(int code, dxfReader *reader){ + switch (code) { + case 10: + basePoint.x = reader->getDouble(); + break; + case 20: + basePoint.y = reader->getDouble(); + break; + case 30: + basePoint.z = reader->getDouble(); + break; + case 39: + thickness = reader->getDouble(); + break; + case 210: + haveExtrusion = true; + extPoint.x = reader->getDouble(); + break; + case 220: + extPoint.y = reader->getDouble(); + break; + case 230: + extPoint.z = reader->getDouble(); + break; + default: + DRW_Entity::parseCode(code, reader); + break; + } +} + +bool DRW_Point::parseDwg(DRW::Version version, dwgBuffer *buf, duint32 bs){ + bool ret = DRW_Entity::parseDwg(version, buf, NULL, bs); + if (!ret) + return ret; + DRW_DBG("\n***************************** parsing point *********************************************\n"); + + basePoint.x = buf->getBitDouble(); + basePoint.y = buf->getBitDouble(); + basePoint.z = buf->getBitDouble(); + DRW_DBG("point: "); DRW_DBGPT(basePoint.x, basePoint.y, basePoint.z); + thickness = buf->getThickness(version > DRW::AC1014);//BD + DRW_DBG("\nthickness: "); DRW_DBG(thickness); + extPoint = buf->getExtrusion(version > DRW::AC1014); + DRW_DBG(", Extrusion: "); DRW_DBGPT(extPoint.x, extPoint.y, extPoint.z); + + double x_axis = buf->getBitDouble();//BD + DRW_DBG("\n x_axis: ");DRW_DBG(x_axis);DRW_DBG("\n"); + ret = DRW_Entity::parseDwgEntHandle(version, buf); + if (!ret) + return ret; + // RS crc; //RS */ + + return buf->isGood(); +} + +void DRW_Line::parseCode(int code, dxfReader *reader){ + switch (code) { + case 11: + secPoint.x = reader->getDouble(); + break; + case 21: + secPoint.y = reader->getDouble(); + break; + case 31: + secPoint.z = reader->getDouble(); + break; + default: + DRW_Point::parseCode(code, reader); + break; + } +} + +bool DRW_Line::parseDwg(DRW::Version version, dwgBuffer *buf, duint32 bs){ + bool ret = DRW_Entity::parseDwg(version, buf, NULL, bs); + if (!ret) + return ret; + DRW_DBG("\n***************************** parsing line *********************************************\n"); + + if (version < DRW::AC1015) {//14- + basePoint.x = buf->getBitDouble(); + basePoint.y = buf->getBitDouble(); + basePoint.z = buf->getBitDouble(); + secPoint.x = buf->getBitDouble(); + secPoint.y = buf->getBitDouble(); + secPoint.z = buf->getBitDouble(); + } + if (version > DRW::AC1014) {//2000+ + bool zIsZero = buf->getBit(); //B + basePoint.x = buf->getRawDouble();//RD + secPoint.x = buf->getDefaultDouble(basePoint.x);//DD + basePoint.y = buf->getRawDouble();//RD + secPoint.y = buf->getDefaultDouble(basePoint.y);//DD + if (!zIsZero) { + basePoint.z = buf->getRawDouble();//RD + secPoint.z = buf->getDefaultDouble(basePoint.z);//DD + } + } + DRW_DBG("start point: "); DRW_DBGPT(basePoint.x, basePoint.y, basePoint.z); + DRW_DBG("\nend point: "); DRW_DBGPT(secPoint.x, secPoint.y, secPoint.z); + thickness = buf->getThickness(version > DRW::AC1014);//BD + DRW_DBG("\nthickness: "); DRW_DBG(thickness); + extPoint = buf->getExtrusion(version > DRW::AC1014); + DRW_DBG(", Extrusion: "); DRW_DBGPT(extPoint.x, extPoint.y, extPoint.z);DRW_DBG("\n"); + ret = DRW_Entity::parseDwgEntHandle(version, buf); + if (!ret) + return ret; +// RS crc; //RS */ + return buf->isGood(); +} + +bool DRW_Ray::parseDwg(DRW::Version version, dwgBuffer *buf, duint32 bs){ + bool ret = DRW_Entity::parseDwg(version, buf, NULL, bs); + if (!ret) + return ret; + DRW_DBG("\n***************************** parsing ray/xline *********************************************\n"); + basePoint.x = buf->getBitDouble(); + basePoint.y = buf->getBitDouble(); + basePoint.z = buf->getBitDouble(); + secPoint.x = buf->getBitDouble(); + secPoint.y = buf->getBitDouble(); + secPoint.z = buf->getBitDouble(); + DRW_DBG("start point: "); DRW_DBGPT(basePoint.x, basePoint.y, basePoint.z); + DRW_DBG("\nvector: "); DRW_DBGPT(secPoint.x, secPoint.y, secPoint.z); + ret = DRW_Entity::parseDwgEntHandle(version, buf); + if (!ret) + return ret; +// RS crc; //RS */ + return buf->isGood(); +} + +void DRW_Circle::applyExtrusion(){ + if (haveExtrusion) { + //NOTE: Commenting these out causes the the arcs being tested to be located + //on the other side of the y axis (all x dimensions are negated). + calculateAxis(extPoint); + extrudePoint(extPoint, &basePoint); + } +} + +void DRW_Circle::parseCode(int code, dxfReader *reader){ + switch (code) { + case 40: + radious = reader->getDouble(); + break; + default: + DRW_Point::parseCode(code, reader); + break; + } +} + +bool DRW_Circle::parseDwg(DRW::Version version, dwgBuffer *buf, duint32 bs){ + bool ret = DRW_Entity::parseDwg(version, buf, NULL, bs); + if (!ret) + return ret; + DRW_DBG("\n***************************** parsing circle *********************************************\n"); + + basePoint.x = buf->getBitDouble(); + basePoint.y = buf->getBitDouble(); + basePoint.z = buf->getBitDouble(); + DRW_DBG("center: "); DRW_DBGPT(basePoint.x, basePoint.y, basePoint.z); + radious = buf->getBitDouble(); + DRW_DBG("\nradius: "); DRW_DBG(radious); + + thickness = buf->getThickness(version > DRW::AC1014); + DRW_DBG(" thickness: "); DRW_DBG(thickness); + extPoint = buf->getExtrusion(version > DRW::AC1014); + DRW_DBG("\nextrusion: "); DRW_DBGPT(extPoint.x, extPoint.y, extPoint.z); DRW_DBG("\n"); + + ret = DRW_Entity::parseDwgEntHandle(version, buf); + if (!ret) + return ret; +// RS crc; //RS */ + return buf->isGood(); +} + +void DRW_Arc::applyExtrusion(){ + DRW_Circle::applyExtrusion(); + + if(haveExtrusion){ + // If the extrusion vector has a z value less than 0, the angles for the arc + // have to be mirrored since DXF files use the right hand rule. + // Note that the following code only handles the special case where there is a 2D + // drawing with the z axis heading into the paper (or rather screen). An arbitrary + // extrusion axis (with x and y values greater than 1/64) may still have issues. + if (fabs(extPoint.x) < 0.015625 && fabs(extPoint.y) < 0.015625 && extPoint.z < 0.0) { + staangle=M_PI-staangle; + endangle=M_PI-endangle; + + double temp = staangle; + staangle=endangle; + endangle=temp; + } + } +} + +void DRW_Arc::parseCode(int code, dxfReader *reader){ + switch (code) { + case 50: + staangle = reader->getDouble()/ ARAD; + break; + case 51: + endangle = reader->getDouble()/ ARAD; + break; + default: + DRW_Circle::parseCode(code, reader); + break; + } +} + +bool DRW_Arc::parseDwg(DRW::Version version, dwgBuffer *buf, duint32 bs){ + bool ret = DRW_Entity::parseDwg(version, buf, NULL, bs); + if (!ret) + return ret; + DRW_DBG("\n***************************** parsing circle arc *********************************************\n"); + + basePoint.x = buf->getBitDouble(); + basePoint.y = buf->getBitDouble(); + basePoint.z = buf->getBitDouble(); + DRW_DBG("center point: "); DRW_DBGPT(basePoint.x, basePoint.y, basePoint.z); + + radious = buf->getBitDouble(); + DRW_DBG("\nradius: "); DRW_DBG(radious); + thickness = buf->getThickness(version > DRW::AC1014); + DRW_DBG(" thickness: "); DRW_DBG(thickness); + extPoint = buf->getExtrusion(version > DRW::AC1014); + DRW_DBG("\nextrusion: "); DRW_DBGPT(extPoint.x, extPoint.y, extPoint.z); + staangle = buf->getBitDouble(); + DRW_DBG("\nstart angle: "); DRW_DBG(staangle); + endangle = buf->getBitDouble(); + DRW_DBG(" end angle: "); DRW_DBG(endangle); DRW_DBG("\n"); + ret = DRW_Entity::parseDwgEntHandle(version, buf); + if (!ret) + return ret; + return buf->isGood(); +} + +void DRW_Ellipse::parseCode(int code, dxfReader *reader){ + switch (code) { + case 40: + ratio = reader->getDouble(); + break; + case 41: + staparam = reader->getDouble(); + break; + case 42: + endparam = reader->getDouble(); + break; + default: + DRW_Line::parseCode(code, reader); + break; + } +} + +void DRW_Ellipse::applyExtrusion(){ + if (haveExtrusion) { + calculateAxis(extPoint); + extrudePoint(extPoint, &secPoint); + double intialparam = staparam; + if (extPoint.z < 0.){ + staparam = M_PIx2 - endparam; + endparam = M_PIx2 - intialparam; + } + } +} + +//if ratio > 1 minor axis are greather than major axis, correct it +void DRW_Ellipse::correctAxis(){ + bool complete = false; + if (staparam == endparam) { + staparam = 0.0; + endparam = M_PIx2; //2*M_PI; + complete = true; + } + if (ratio > 1){ + if ( fabs(endparam - staparam - M_PIx2) < 1.0e-10) + complete = true; + double incX = secPoint.x; + secPoint.x = -(secPoint.y * ratio); + secPoint.y = incX*ratio; + ratio = 1/ratio; + if (!complete){ + if (staparam < M_PI_2) + staparam += M_PI *2; + if (endparam < M_PI_2) + endparam += M_PI *2; + endparam -= M_PI_2; + staparam -= M_PI_2; + } + } +} + +bool DRW_Ellipse::parseDwg(DRW::Version version, dwgBuffer *buf, duint32 bs){ + bool ret = DRW_Entity::parseDwg(version, buf, NULL, bs); + if (!ret) + return ret; + DRW_DBG("\n***************************** parsing ellipse *********************************************\n"); + + basePoint =buf->get3BitDouble(); + DRW_DBG("center: "); DRW_DBGPT(basePoint.x, basePoint.y, basePoint.z); + secPoint =buf->get3BitDouble(); + DRW_DBG(", axis: "); DRW_DBGPT(secPoint.x, secPoint.y, secPoint.z); DRW_DBG("\n"); + extPoint =buf->get3BitDouble(); + DRW_DBG("Extrusion: "); DRW_DBGPT(extPoint.x, extPoint.y, extPoint.z); + ratio = buf->getBitDouble();//BD + DRW_DBG("\nratio: "); DRW_DBG(ratio); + staparam = buf->getBitDouble();//BD + DRW_DBG(" start param: "); DRW_DBG(staparam); + endparam = buf->getBitDouble();//BD + DRW_DBG(" end param: "); DRW_DBG(endparam); DRW_DBG("\n"); + + ret = DRW_Entity::parseDwgEntHandle(version, buf); + if (!ret) + return ret; +// RS crc; //RS */ + return buf->isGood(); +} + +//parts are the number of vertex to split polyline, default 128 +void DRW_Ellipse::toPolyline(DRW_Polyline *pol, int parts){ + double radMajor, radMinor, cosRot, sinRot, incAngle, curAngle; + double cosCurr, sinCurr; + radMajor = sqrt(secPoint.x*secPoint.x + secPoint.y*secPoint.y); + radMinor = radMajor*ratio; + //calculate sin & cos of included angle + incAngle = atan2(secPoint.y, secPoint.x); + cosRot = cos(incAngle); + sinRot = sin(incAngle); + incAngle = M_PIx2 / parts; + curAngle = staparam; + int i = static_cast(curAngle / incAngle); + do { + if (curAngle > endparam) { + curAngle = endparam; + i = parts+2; + } + cosCurr = cos(curAngle); + sinCurr = sin(curAngle); + double x = basePoint.x + (cosCurr*cosRot*radMajor) - (sinCurr*sinRot*radMinor); + double y = basePoint.y + (cosCurr*sinRot*radMajor) + (sinCurr*cosRot*radMinor); + pol->addVertex( DRW_Vertex(x, y, 0.0, 0.0)); + curAngle = (++i)*incAngle; + } while (iflags = 1; + } + pol->layer = this->layer; + pol->lineType = this->lineType; + pol->color = this->color; + pol->lWeight = this->lWeight; + pol->extPoint = this->extPoint; +} + +void DRW_Trace::applyExtrusion(){ + if (haveExtrusion) { + calculateAxis(extPoint); + extrudePoint(extPoint, &basePoint); + extrudePoint(extPoint, &secPoint); + extrudePoint(extPoint, &thirdPoint); + extrudePoint(extPoint, &fourPoint); + } +} + +void DRW_Trace::parseCode(int code, dxfReader *reader){ + switch (code) { + case 12: + thirdPoint.x = reader->getDouble(); + break; + case 22: + thirdPoint.y = reader->getDouble(); + break; + case 32: + thirdPoint.z = reader->getDouble(); + break; + case 13: + fourPoint.x = reader->getDouble(); + break; + case 23: + fourPoint.y = reader->getDouble(); + break; + case 33: + fourPoint.z = reader->getDouble(); + break; + default: + DRW_Line::parseCode(code, reader); + break; + } +} + +bool DRW_Trace::parseDwg(DRW::Version version, dwgBuffer *buf, duint32 bs){ + bool ret = DRW_Entity::parseDwg(version, buf, NULL, bs); + if (!ret) + return ret; + DRW_DBG("\n***************************** parsing Trace *********************************************\n"); + + thickness = buf->getThickness(version>DRW::AC1014); + basePoint.z = buf->getBitDouble(); + basePoint.x = buf->getRawDouble(); + basePoint.y = buf->getRawDouble(); + secPoint.x = buf->getRawDouble(); + secPoint.y = buf->getRawDouble(); + secPoint.z = basePoint.z; + thirdPoint.x = buf->getRawDouble(); + thirdPoint.y = buf->getRawDouble(); + thirdPoint.z = basePoint.z; + fourPoint.x = buf->getRawDouble(); + fourPoint.y = buf->getRawDouble(); + fourPoint.z = basePoint.z; + extPoint = buf->getExtrusion(version>DRW::AC1014); + + DRW_DBG(" - base "); DRW_DBGPT(basePoint.x, basePoint.y, basePoint.z); + DRW_DBG("\n - sec "); DRW_DBGPT(secPoint.x, secPoint.y, secPoint.z); + DRW_DBG("\n - third "); DRW_DBGPT(thirdPoint.x, thirdPoint.y, thirdPoint.z); + DRW_DBG("\n - fourth "); DRW_DBGPT(fourPoint.x, fourPoint.y, fourPoint.z); + DRW_DBG("\n - extrusion: "); DRW_DBGPT(extPoint.x, extPoint.y, extPoint.z); + DRW_DBG("\n - thickness: "); DRW_DBG(thickness); DRW_DBG("\n"); + + /* Common Entity Handle Data */ + ret = DRW_Entity::parseDwgEntHandle(version, buf); + if (!ret) + return ret; + + /* CRC X --- */ + return buf->isGood(); +} + + +void DRW_Solid::parseCode(int code, dxfReader *reader){ + DRW_Trace::parseCode(code, reader); +} + +bool DRW_Solid::parseDwg(DRW::Version v, dwgBuffer *buf, duint32 bs){ + DRW_DBG("\n***************************** parsing Solid *********************************************\n"); + return DRW_Trace::parseDwg(v, buf, bs); +} + +void DRW_3Dface::parseCode(int code, dxfReader *reader){ + switch (code) { + case 70: + invisibleflag = reader->getInt32(); + break; + default: + DRW_Trace::parseCode(code, reader); + break; + } +} + +bool DRW_3Dface::parseDwg(DRW::Version v, dwgBuffer *buf, duint32 bs){ + bool ret = DRW_Entity::parseDwg(v, buf, NULL, bs); + if (!ret) + return ret; + DRW_DBG("\n***************************** parsing 3Dface *********************************************\n"); + + if ( v < DRW::AC1015 ) {// R13 & R14 + basePoint.x = buf->getBitDouble(); + basePoint.y = buf->getBitDouble(); + basePoint.z = buf->getBitDouble(); + secPoint.x = buf->getBitDouble(); + secPoint.y = buf->getBitDouble(); + secPoint.z = buf->getBitDouble(); + thirdPoint.x = buf->getBitDouble(); + thirdPoint.y = buf->getBitDouble(); + thirdPoint.z = buf->getBitDouble(); + fourPoint.x = buf->getBitDouble(); + fourPoint.y = buf->getBitDouble(); + fourPoint.z = buf->getBitDouble(); + invisibleflag = buf->getBitShort(); + } else { // 2000+ + bool has_no_flag = buf->getBit(); + bool z_is_zero = buf->getBit(); + basePoint.x = buf->getRawDouble(); + basePoint.y = buf->getRawDouble(); + basePoint.z = z_is_zero ? 0.0 : buf->getRawDouble(); + secPoint.x = buf->getDefaultDouble(basePoint.x); + secPoint.y = buf->getDefaultDouble(basePoint.y); + secPoint.z = buf->getDefaultDouble(basePoint.z); + thirdPoint.x = buf->getDefaultDouble(secPoint.x); + thirdPoint.y = buf->getDefaultDouble(secPoint.y); + thirdPoint.z = buf->getDefaultDouble(secPoint.z); + fourPoint.x = buf->getDefaultDouble(thirdPoint.x); + fourPoint.y = buf->getDefaultDouble(thirdPoint.y); + fourPoint.z = buf->getDefaultDouble(thirdPoint.z); + invisibleflag = has_no_flag ? (int)NoEdge : buf->getBitShort(); + } + drw_assert(invisibleflag>=NoEdge); + drw_assert(invisibleflag<=AllEdges); + + DRW_DBG(" - base "); DRW_DBGPT(basePoint.x, basePoint.y, basePoint.z); DRW_DBG("\n"); + DRW_DBG(" - sec "); DRW_DBGPT(secPoint.x, secPoint.y, secPoint.z); DRW_DBG("\n"); + DRW_DBG(" - third "); DRW_DBGPT(thirdPoint.x, thirdPoint.y, thirdPoint.z); DRW_DBG("\n"); + DRW_DBG(" - fourth "); DRW_DBGPT(fourPoint.x, fourPoint.y, fourPoint.z); DRW_DBG("\n"); + DRW_DBG(" - Invisibility mask: "); DRW_DBG(invisibleflag); DRW_DBG("\n"); + + /* Common Entity Handle Data */ + ret = DRW_Entity::parseDwgEntHandle(v, buf); + if (!ret) + return ret; + return buf->isGood(); +} + +void DRW_Block::parseCode(int code, dxfReader *reader){ + switch (code) { + case 2: + name = reader->getUtf8String(); + break; + case 70: + flags = reader->getInt32(); + break; + default: + DRW_Point::parseCode(code, reader); + break; + } +} + +bool DRW_Block::parseDwg(DRW::Version version, dwgBuffer *buf, duint32 bs){ + dwgBuffer sBuff = *buf; + dwgBuffer *sBuf = buf; + if (version > DRW::AC1018) {//2007+ + sBuf = &sBuff; //separate buffer for strings + } + bool ret = DRW_Entity::parseDwg(version, buf, sBuf, bs); + if (!ret) + return ret; + if (!isEnd){ + DRW_DBG("\n***************************** parsing block *********************************************\n"); + name = sBuf->getVariableText(version, false); + DRW_DBG("Block name: "); DRW_DBG(name.c_str()); DRW_DBG("\n"); + } else { + DRW_DBG("\n***************************** parsing end block *********************************************\n"); + } + if (version > DRW::AC1018) {//2007+ + duint8 unk = buf->getBit(); + DRW_DBG("unknown bit: "); DRW_DBG(unk); DRW_DBG("\n"); + } +// X handleAssoc; //X + ret = DRW_Entity::parseDwgEntHandle(version, buf); + if (!ret) + return ret; +// RS crc; //RS */ + return buf->isGood(); +} + +void DRW_Insert::parseCode(int code, dxfReader *reader){ + switch (code) { + case 2: + name = reader->getUtf8String(); + break; + case 41: + xscale = reader->getDouble(); + break; + case 42: + yscale = reader->getDouble(); + break; + case 43: + zscale = reader->getDouble(); + break; + case 50: + angle = reader->getDouble(); + angle = angle/ARAD; //convert to radian + break; + case 70: + colcount = reader->getInt32(); + break; + case 71: + rowcount = reader->getInt32(); + break; + case 44: + colspace = reader->getDouble(); + break; + case 45: + rowspace = reader->getDouble(); + break; + default: + DRW_Point::parseCode(code, reader); + break; + } +} + +bool DRW_Insert::parseDwg(DRW::Version version, dwgBuffer *buf, duint32 bs){ + dint32 objCount = 0; + bool ret = DRW_Entity::parseDwg(version, buf, NULL, bs); + if (!ret) + return ret; + DRW_DBG("\n************************** parsing insert/minsert *****************************************\n"); + basePoint.x = buf->getBitDouble(); + basePoint.y = buf->getBitDouble(); + basePoint.z = buf->getBitDouble(); + DRW_DBG("insertion point: "); DRW_DBGPT(basePoint.x, basePoint.y, basePoint.z); DRW_DBG("\n"); + if (version < DRW::AC1015) {//14- + xscale = buf->getBitDouble(); + yscale = buf->getBitDouble(); + zscale = buf->getBitDouble(); + } else { + duint8 dataFlags = buf->get2Bits(); + if (dataFlags == 3){ + //none default value 1,1,1 + } else if (dataFlags == 1){ //x default value 1, y & z can be x value + yscale = buf->getDefaultDouble(xscale); + zscale = buf->getDefaultDouble(xscale); + } else if (dataFlags == 2){ + xscale = buf->getRawDouble(); + yscale = zscale = xscale; + } else { //dataFlags == 0 + xscale = buf->getRawDouble(); + yscale = buf->getDefaultDouble(xscale); + zscale = buf->getDefaultDouble(xscale); + } + } + angle = buf->getBitDouble(); + DRW_DBG("scale : "); DRW_DBGPT(xscale, yscale, zscale); DRW_DBG(", angle: "); DRW_DBG(angle); + extPoint = buf->getExtrusion(false); //3BD R14 style + DRW_DBG("\nextrusion: "); DRW_DBGPT(extPoint.x, extPoint.y, extPoint.z); + + bool hasAttrib = buf->getBit(); + DRW_DBG(" has Attrib: "); DRW_DBG(hasAttrib); + + if (hasAttrib && version > DRW::AC1015) {//2004+ + objCount = buf->getBitLong(); + DRW_UNUSED(objCount); + DRW_DBG(" objCount: "); DRW_DBG(objCount); DRW_DBG("\n"); + } + if (oType == 8) {//entity are minsert + colcount = buf->getBitShort(); + rowcount = buf->getBitShort(); + colspace = buf->getBitDouble(); + rowspace = buf->getBitDouble(); + } + DRW_DBG(" Remaining bytes: "); DRW_DBG(buf->numRemainingBytes()); DRW_DBG("\n"); + ret = DRW_Entity::parseDwgEntHandle(version, buf); + blockRecH = buf->getHandle(); /* H 2 BLOCK HEADER (hard pointer) */ + DRW_DBG("BLOCK HEADER Handle: "); DRW_DBGHL(blockRecH.code, blockRecH.size, blockRecH.ref); DRW_DBG("\n"); + DRW_DBG(" Remaining bytes: "); DRW_DBG(buf->numRemainingBytes()); DRW_DBG("\n"); + + /*attribs follows*/ + if (hasAttrib) { + if (version < DRW::AC1018) {//2000- + dwgHandle attH = buf->getHandle(); /* H 2 BLOCK HEADER (hard pointer) */ + DRW_DBG("first attrib Handle: "); DRW_DBGHL(attH.code, attH.size, attH.ref); DRW_DBG("\n"); + attH = buf->getHandle(); /* H 2 BLOCK HEADER (hard pointer) */ + DRW_DBG("second attrib Handle: "); DRW_DBGHL(attH.code, attH.size, attH.ref); DRW_DBG("\n"); + } else { + for (duint8 i=0; i< objCount; ++i){ + dwgHandle attH = buf->getHandle(); /* H 2 BLOCK HEADER (hard pointer) */ + DRW_DBG("attrib Handle #"); DRW_DBG(i); DRW_DBG(": "); DRW_DBGHL(attH.code, attH.size, attH.ref); DRW_DBG("\n"); + } + } + seqendH = buf->getHandle(); /* H 2 BLOCK HEADER (hard pointer) */ + DRW_DBG("seqendH Handle: "); DRW_DBGHL(seqendH.code, seqendH.size, seqendH.ref); DRW_DBG("\n"); + } + DRW_DBG(" Remaining bytes: "); DRW_DBG(buf->numRemainingBytes()); DRW_DBG("\n"); + + if (!ret) + return ret; +// RS crc; //RS */ + return buf->isGood(); +} + +void DRW_LWPolyline::applyExtrusion(){ + if (haveExtrusion) { + calculateAxis(extPoint); + for (unsigned int i=0; ix, vert->y, elevation); + extrudePoint(extPoint, &v); + vert->x = v.x; + vert->y = v.y; + } + } +} + +void DRW_LWPolyline::parseCode(int code, dxfReader *reader){ + switch (code) { + case 10: { + vertex = new DRW_Vertex2D(); + vertlist.push_back(vertex); + vertex->x = reader->getDouble(); + break; } + case 20: + if(vertex != NULL) + vertex->y = reader->getDouble(); + break; + case 40: + if(vertex != NULL) + vertex->stawidth = reader->getDouble(); + break; + case 41: + if(vertex != NULL) + vertex->endwidth = reader->getDouble(); + break; + case 42: + if(vertex != NULL) + vertex->bulge = reader->getDouble(); + break; + case 38: + elevation = reader->getDouble(); + break; + case 39: + thickness = reader->getDouble(); + break; + case 43: + width = reader->getDouble(); + break; + case 70: + flags = reader->getInt32(); + break; + case 90: + vertexnum = reader->getInt32(); + vertlist.reserve(vertexnum); + break; + case 210: + haveExtrusion = true; + extPoint.x = reader->getDouble(); + break; + case 220: + extPoint.y = reader->getDouble(); + break; + case 230: + extPoint.z = reader->getDouble(); + break; + default: + DRW_Entity::parseCode(code, reader); + break; + } +} + +bool DRW_LWPolyline::parseDwg(DRW::Version version, dwgBuffer *buf, duint32 bs){ + bool ret = DRW_Entity::parseDwg(version, buf, NULL, bs); + if (!ret) + return ret; + DRW_DBG("\n***************************** parsing LWPolyline *******************************************\n"); + + flags = buf->getBitShort(); + DRW_DBG("flags value: "); DRW_DBG(flags); + if (flags & 4) + width = buf->getBitDouble(); + if (flags & 8) + elevation = buf->getBitDouble(); + if (flags & 2) + thickness = buf->getBitDouble(); + if (flags & 1) + extPoint = buf->getExtrusion(false); + vertexnum = buf->getBitLong(); + vertlist.reserve(vertexnum); + unsigned int bulgesnum = 0; + if (flags & 16) + bulgesnum = buf->getBitLong(); + int vertexIdCount = 0; + if (version > DRW::AC1021) {//2010+ + if (flags & 1024) + vertexIdCount = buf->getBitLong(); + } + + unsigned int widthsnum = 0; + if (flags & 32) + widthsnum = buf->getBitLong(); + DRW_DBG("\nvertex num: "); DRW_DBG(vertexnum); DRW_DBG(" bulges num: "); DRW_DBG(bulgesnum); + DRW_DBG(" vertexIdCount: "); DRW_DBG(vertexIdCount); DRW_DBG(" widths num: "); DRW_DBG(widthsnum); + //clear all bit except 128 = plinegen and set 1 to open/close //RLZ:verify plinegen & open + //dxf: plinegen 128 & open 1 + flags = (flags & 512)? (flags | 1):(flags | 0); + flags &= 129; + DRW_DBG("end flags value: "); DRW_DBG(flags); + + if (vertexnum > 0) { //verify if is lwpol without vertex (empty) + // add vertexs + vertex = new DRW_Vertex2D(); + vertex->x = buf->getRawDouble(); + vertex->y = buf->getRawDouble(); + vertlist.push_back(vertex); + DRW_Vertex2D* pv = vertex; + for (int i = 1; i< vertexnum; i++){ + vertex = new DRW_Vertex2D(); + if (version < DRW::AC1015) {//14- + vertex->x = buf->getRawDouble(); + vertex->y = buf->getRawDouble(); + } else { +// DRW_Vertex2D *pv = vertlist.back(); + vertex->x = buf->getDefaultDouble(pv->x); + vertex->y = buf->getDefaultDouble(pv->y); + } + pv = vertex; + vertlist.push_back(vertex); + } + //add bulges + for (unsigned int i = 0; i < bulgesnum; i++){ + double bulge = buf->getBitDouble(); + if (vertlist.size()> i) + vertlist.at(i)->bulge = bulge; + } + //add vertexId + if (version > DRW::AC1021) {//2010+ + for (int i = 0; i < vertexIdCount; i++){ + dint32 vertexId = buf->getBitLong(); + //TODO implement vertexId, do not exist in dxf + DRW_UNUSED(vertexId); +// if (vertlist.size()< i) +// vertlist.at(i)->vertexId = vertexId; + } + } + //add widths + for (unsigned int i = 0; i < widthsnum; i++){ + double staW = buf->getBitDouble(); + double endW = buf->getBitDouble(); + if (vertlist.size()< i) { + vertlist.at(i)->stawidth = staW; + vertlist.at(i)->endwidth = endW; + } + } + } + if (DRW_DBGGL == DRW_dbg::DEBUG){ + DRW_DBG("\nVertex list: "); + for (std::vector::iterator it = vertlist.begin() ; it != vertlist.end(); ++it){ + DRW_Vertex2D* pv = *it; + DRW_DBG("\n x: "); DRW_DBG(pv->x); DRW_DBG(" y: "); DRW_DBG(pv->y); DRW_DBG(" bulge: "); DRW_DBG(pv->bulge); + DRW_DBG(" stawidth: "); DRW_DBG(pv->stawidth); DRW_DBG(" endwidth: "); DRW_DBG(pv->endwidth); + } + } + + DRW_DBG("\n"); + /* Common Entity Handle Data */ + ret = DRW_Entity::parseDwgEntHandle(version, buf); + if (!ret) + return ret; + /* CRC X --- */ + return buf->isGood(); +} + + +void DRW_Text::parseCode(int code, dxfReader *reader){ + switch (code) { + case 40: + height = reader->getDouble(); + break; + case 41: + widthscale = reader->getDouble(); + break; + case 50: + angle = reader->getDouble(); + break; + case 51: + oblique = reader->getDouble(); + break; + case 71: + textgen = reader->getInt32(); + break; + case 72: + alignH = (HAlign)reader->getInt32(); + break; + case 73: + alignV = (VAlign)reader->getInt32(); + break; + case 1: + text = reader->getUtf8String(); + break; + case 7: + style = reader->getUtf8String(); + break; + default: + DRW_Line::parseCode(code, reader); + break; + } +} + +bool DRW_Text::parseDwg(DRW::Version version, dwgBuffer *buf, duint32 bs){ + dwgBuffer sBuff = *buf; + dwgBuffer *sBuf = buf; + if (version > DRW::AC1018) {//2007+ + sBuf = &sBuff; //separate buffer for strings + } + bool ret = DRW_Entity::parseDwg(version, buf, sBuf, bs); + if (!ret) + return ret; + DRW_DBG("\n***************************** parsing text *********************************************\n"); + + // DataFlags RC Used to determine presence of subsquent data, set to 0xFF for R14- + duint8 data_flags = 0x00; + if (version > DRW::AC1014) {//2000+ + data_flags = buf->getRawChar8(); /* DataFlags RC Used to determine presence of subsquent data */ + DRW_DBG("data_flags: "); DRW_DBG(data_flags); DRW_DBG("\n"); + if ( !(data_flags & 0x01) ) { /* Elevation RD --- present if !(DataFlags & 0x01) */ + basePoint.z = buf->getRawDouble(); + } + } else {//14- + basePoint.z = buf->getBitDouble(); /* Elevation BD --- */ + } + basePoint.x = buf->getRawDouble(); /* Insertion pt 2RD 10 */ + basePoint.y = buf->getRawDouble(); + DRW_DBG("Insert point: "); DRW_DBGPT(basePoint.x, basePoint.y, basePoint.z); DRW_DBG("\n"); + if (version > DRW::AC1014) {//2000+ + if ( !(data_flags & 0x02) ) { /* Alignment pt 2DD 11 present if !(DataFlags & 0x02), use 10 & 20 values for 2 default values.*/ + secPoint.x = buf->getDefaultDouble(basePoint.x); + secPoint.y = buf->getDefaultDouble(basePoint.y); + } else { + secPoint = basePoint; + } + } else {//14- + secPoint.x = buf->getRawDouble(); /* Alignment pt 2RD 11 */ + secPoint.y = buf->getRawDouble(); + } + secPoint.z = basePoint.z; + DRW_DBG("Alignment: "); DRW_DBGPT(secPoint.x, secPoint.y, basePoint.z); DRW_DBG("\n"); + extPoint = buf->getExtrusion(version > DRW::AC1014); + DRW_DBG("Extrusion: "); DRW_DBGPT(extPoint.x, extPoint.y, extPoint.z); DRW_DBG("\n"); + thickness = buf->getThickness(version > DRW::AC1014); /* Thickness BD 39 */ + + if (version > DRW::AC1014) {//2000+ + if ( !(data_flags & 0x04) ) { /* Oblique ang RD 51 present if !(DataFlags & 0x04) */ + oblique = buf->getRawDouble(); + } + if ( !(data_flags & 0x08) ) { /* Rotation ang RD 50 present if !(DataFlags & 0x08) */ + angle = buf->getRawDouble(); + } + height = buf->getRawDouble(); /* Height RD 40 */ + if ( !(data_flags & 0x10) ) { /* Width factor RD 41 present if !(DataFlags & 0x10) */ + widthscale = buf->getRawDouble(); + } + } else {//14- + oblique = buf->getBitDouble(); /* Oblique ang BD 51 */ + angle = buf->getBitDouble(); /* Rotation ang BD 50 */ + height = buf->getBitDouble(); /* Height BD 40 */ + widthscale = buf->getBitDouble(); /* Width factor BD 41 */ + } + DRW_DBG("thickness: "); DRW_DBG(thickness); DRW_DBG(", Oblique ang: "); DRW_DBG(oblique); DRW_DBG(", Width: "); + DRW_DBG(widthscale); DRW_DBG(", Rotation: "); DRW_DBG(angle); DRW_DBG(", height: "); DRW_DBG(height); DRW_DBG("\n"); + text = sBuf->getVariableText(version, false); /* Text value TV 1 */ + DRW_DBG("text string: "); DRW_DBG(text.c_str());DRW_DBG("\n"); + //textgen, alignH, alignV always present in R14-, data_flags set in initialisation + if ( !(data_flags & 0x20) ) { /* Generation BS 71 present if !(DataFlags & 0x20) */ + textgen = buf->getBitShort(); + DRW_DBG("textgen: "); DRW_DBG(textgen); + } + if ( !(data_flags & 0x40) ) { /* Horiz align. BS 72 present if !(DataFlags & 0x40) */ + alignH = (HAlign)buf->getBitShort(); + DRW_DBG(", alignH: "); DRW_DBG(alignH); + } + if ( !(data_flags & 0x80) ) { /* Vert align. BS 73 present if !(DataFlags & 0x80) */ + alignV = (VAlign)buf->getBitShort(); + DRW_DBG(", alignV: "); DRW_DBG(alignV); + } + DRW_DBG("\n"); + + /* Common Entity Handle Data */ + ret = DRW_Entity::parseDwgEntHandle(version, buf); + if (!ret) + return ret; + + styleH = buf->getHandle(); /* H 7 STYLE (hard pointer) */ + DRW_DBG("text style Handle: "); DRW_DBGHL(styleH.code, styleH.size, styleH.ref); DRW_DBG("\n"); + + /* CRC X --- */ + return buf->isGood(); +} + +void DRW_MText::parseCode(int code, dxfReader *reader){ + switch (code) { + case 1: + text += reader->getString(); + text = reader->toUtf8String(text); + break; + case 11: + haveXAxis = true; + DRW_Text::parseCode(code, reader); + break; + case 3: + text += reader->getString(); + break; + case 44: + interlin = reader->getDouble(); + break; + case 71: { + // Attachment point + Attach a = (Attach)reader->getInt32(); + + switch(a) { + case TopLeft: + alignV = VTop; + alignH = HLeft; + break; + case TopCenter: + alignV = VTop; + alignH = HCenter; + break; + case TopRight: + alignV = VTop; + alignH = HRight; + break; + case MiddleLeft: + alignV = VMiddle; + alignH = HLeft; + break; + case MiddleCenter: + alignV = VMiddle; + alignH = HCenter; + break; + case MiddleRight: + alignV = VMiddle; + alignH = HRight; + break; + case BottomLeft: + alignV = VBottom; + alignH = HLeft; + break; + case BottomCenter: + alignV = VBottom; + alignH = HCenter; + break; + case BottomRight: + alignV = VBottom; + alignH = HRight; + break; + } + } break; + case 72: + // To prevent redirection to DRW_Text::parseCode. + // This code meaning is different for MTEXT. + // Actually: Drawing direction + break; + case 73: + // To prevent redirection to DRW_Text::parseCode. + // This code meaning is different for MTEXT. + // Actually: Mtext line spacing style + break; + default: + DRW_Text::parseCode(code, reader); + break; + } +} + +bool DRW_MText::parseDwg(DRW::Version version, dwgBuffer *buf, duint32 bs){ + dwgBuffer sBuff = *buf; + dwgBuffer *sBuf = buf; + if (version > DRW::AC1018) {//2007+ + sBuf = &sBuff; //separate buffer for strings + } + bool ret = DRW_Entity::parseDwg(version, buf, sBuf, bs); + if (!ret) + return ret; + DRW_DBG("\n***************************** parsing mtext *********************************************\n"); + + basePoint = buf->get3BitDouble(); /* Insertion pt 3BD 10 - First picked point. */ + DRW_DBG("Insertion: "); DRW_DBGPT(basePoint.x, basePoint.y, basePoint.z); DRW_DBG("\n"); + extPoint = buf->get3BitDouble(); /* Extrusion 3BD 210 Undocumented; */ + secPoint = buf->get3BitDouble(); /* X-axis dir 3BD 11 */ + updateAngle(); + widthscale = buf->getBitDouble(); /* Rect width BD 41 */ + if (version > DRW::AC1018) {//2007+ + /* Rect height BD 46 Reference rectangle height. */ + /** @todo */buf->getBitDouble(); + } + height = buf->getBitDouble();/* Text height BD 40 Undocumented */ + textgen = buf->getBitShort(); /* Attachment BS 71 Similar to justification; */ + /* Drawing dir BS 72 Left to right, etc.; see DXF doc */ + dint16 draw_dir = buf->getBitShort(); + DRW_UNUSED(draw_dir); + /* Extents ht BD Undocumented and not present in DXF or entget */ + double ext_ht = buf->getBitDouble(); + DRW_UNUSED(ext_ht); + /* Extents wid BD Undocumented and not present in DXF or entget The extents + rectangle, when rotated the same as the text, fits the actual text image on + the screen (altough we've seen it include an extra row of text in height). */ + double ext_wid = buf->getBitDouble(); + DRW_UNUSED(ext_wid); + /* Text TV 1 All text in one long string (without '\n's 3 for line wrapping). + ACAD seems to add braces ({ }) and backslash-P's to indicate paragraphs + based on the "\r\n"'s found in the imported file. But, all the text is in + this one long string -- not broken into 1- and 3-groups as in DXF and + entget. ACAD's entget breaks this string into 250-char pieces (not 255 as + doc'd) – even if it's mid-word. The 1-group always gets the tag end; + therefore, the 3's are always 250 chars long. */ + text = sBuf->getVariableText(version, false); /* Text value TV 1 */ + if (version > DRW::AC1014) {//2000+ + buf->getBitShort();/* Linespacing Style BS 73 */ + buf->getBitDouble();/* Linespacing Factor BD 44 */ + buf->getBit();/* Unknown bit B */ + } + if (version > DRW::AC1015) {//2004+ + /* Background flags BL 0 = no background, 1 = background fill, 2 =background + fill with drawing fill color. */ + dint32 bk_flags = buf->getBitLong(); /** @todo add to DRW_MText */ + if ( bk_flags == 1 ) { + /* Background scale factor BL Present if background flags = 1, default = 1.5*/ + buf->getBitLong(); + /* Background color CMC Present if background flags = 1 */ + buf->getCmColor(version); //RLZ: warning CMC or ENC + /** @todo buf->getCMC */ + /* Background transparency BL Present if background flags = 1 */ + buf->getBitLong(); + } + } + + /* Common Entity Handle Data */ + ret = DRW_Entity::parseDwgEntHandle(version, buf); + if (!ret) + return ret; + + styleH = buf->getHandle(); /* H 7 STYLE (hard pointer) */ + DRW_DBG("text style Handle: "); DRW_DBG(styleH.code); DRW_DBG("."); + DRW_DBG(styleH.size); DRW_DBG("."); DRW_DBG(styleH.ref); DRW_DBG("\n"); + + /* CRC X --- */ + return buf->isGood(); +} + +void DRW_MText::updateAngle(){ + if (haveXAxis) { + angle = atan2(secPoint.y, secPoint.x)*180/M_PI; + } +} + +void DRW_Polyline::parseCode(int code, dxfReader *reader){ + switch (code) { + case 70: + flags = reader->getInt32(); + break; + case 40: + defstawidth = reader->getDouble(); + break; + case 41: + defendwidth = reader->getDouble(); + break; + case 71: + vertexcount = reader->getInt32(); + break; + case 72: + facecount = reader->getInt32(); + break; + case 73: + smoothM = reader->getInt32(); + break; + case 74: + smoothN = reader->getInt32(); + break; + case 75: + curvetype = reader->getInt32(); + break; + default: + DRW_Point::parseCode(code, reader); + break; + } +} + +//0x0F polyline 2D bit 4(8) & 5(16) NOT set +//0x10 polyline 3D bit 4(8) set +//0x1D PFACE bit 5(16) set +bool DRW_Polyline::parseDwg(DRW::Version version, dwgBuffer *buf, duint32 bs){ + bool ret = DRW_Entity::parseDwg(version, buf, NULL, bs); + if (!ret) + return ret; + DRW_DBG("\n***************************** parsing polyline *********************************************\n"); + + dint32 ooCount = 0; + if (oType == 0x0F) { //pline 2D + flags = buf->getBitShort(); + DRW_DBG("flags value: "); DRW_DBG(flags); + curvetype = buf->getBitShort(); + defstawidth = buf->getBitDouble(); + defendwidth = buf->getBitDouble(); + thickness = buf->getThickness(version > DRW::AC1014); + basePoint = DRW_Coord(0,0,buf->getBitDouble()); + extPoint = buf->getExtrusion(version > DRW::AC1014); + } else if (oType == 0x10) { //pline 3D + duint8 tmpFlag = buf->getRawChar8(); + DRW_DBG("flags 1 value: "); DRW_DBG(tmpFlag); + if (tmpFlag & 1) + curvetype = 5; + else if (tmpFlag & 2) + curvetype = 6; + if (tmpFlag & 3) { + curvetype = 8; + flags |= 4; + } + tmpFlag = buf->getRawChar8(); + if (tmpFlag & 1) + flags |= 1; + flags |= 8; //indicate 3DPOL + DRW_DBG("flags 2 value: "); DRW_DBG(tmpFlag); + } else if (oType == 0x1D) { //PFACE + flags = 64; + vertexcount = buf->getBitShort(); + DRW_DBG("vertex count: "); DRW_DBG(vertexcount); + facecount = buf->getBitShort(); + DRW_DBG("face count: "); DRW_DBG(facecount); + DRW_DBG("flags value: "); DRW_DBG(flags); + } + if (version > DRW::AC1015){ //2004+ + ooCount = buf->getBitLong(); + } + + ret = DRW_Entity::parseDwgEntHandle(version, buf); + if (!ret) + return ret; + + if (version < DRW::AC1018){ //2000- + dwgHandle objectH = buf->getOffsetHandle(handle); + firstEH = objectH.ref; + DRW_DBG(" first Vertex Handle: "); DRW_DBGHL(objectH.code, objectH.size, objectH.ref); DRW_DBG("\n"); + objectH = buf->getOffsetHandle(handle); + lastEH = objectH.ref; + DRW_DBG(" last Vertex Handle: "); DRW_DBGHL(objectH.code, objectH.size, objectH.ref); DRW_DBG("\n"); + DRW_DBG("Remaining bytes: "); DRW_DBG(buf->numRemainingBytes()); DRW_DBG("\n"); + } else { + for (dint32 i = 0; i < ooCount; ++i){ + dwgHandle objectH = buf->getOffsetHandle(handle); + hadlesList.push_back (objectH.ref); + DRW_DBG(" Vertex Handle: "); DRW_DBGHL(objectH.code, objectH.size, objectH.ref); DRW_DBG("\n"); + DRW_DBG("Remaining bytes: "); DRW_DBG(buf->numRemainingBytes()); DRW_DBG("\n"); + } + } + seqEndH = buf->getOffsetHandle(handle); + DRW_DBG(" SEQEND Handle: "); DRW_DBGHL(seqEndH.code, seqEndH.size, seqEndH.ref); DRW_DBG("\n"); + DRW_DBG("Remaining bytes: "); DRW_DBG(buf->numRemainingBytes()); DRW_DBG("\n"); + +// RS crc; //RS */ + return buf->isGood(); +} + +void DRW_Vertex::parseCode(int code, dxfReader *reader){ + switch (code) { + case 70: + flags = reader->getInt32(); + break; + case 40: + stawidth = reader->getDouble(); + break; + case 41: + endwidth = reader->getDouble(); + break; + case 42: + bulge = reader->getDouble(); + break; + case 50: + tgdir = reader->getDouble(); + break; + case 71: + vindex1 = reader->getInt32(); + break; + case 72: + vindex2 = reader->getInt32(); + break; + case 73: + vindex3 = reader->getInt32(); + break; + case 74: + vindex4 = reader->getInt32(); + break; + case 91: + identifier = reader->getInt32(); + break; + default: + DRW_Point::parseCode(code, reader); + break; + } +} + +//0x0A vertex 2D +//0x0B vertex 3D +//0x0C MESH +//0x0D PFACE +//0x0E PFACE FACE +bool DRW_Vertex::parseDwg(DRW::Version version, dwgBuffer *buf, duint32 bs, double el){ + bool ret = DRW_Entity::parseDwg(version, buf, NULL, bs); + if (!ret) + return ret; + DRW_DBG("\n***************************** parsing pline Vertex *********************************************\n"); + + if (oType == 0x0A) { //pline 2D, needed example + flags = buf->getRawChar8(); //RLZ: EC unknown type + DRW_DBG("flags value: "); DRW_DBG(flags); + basePoint = buf->get3BitDouble(); + basePoint.z = el; + DRW_DBG("basePoint: "); DRW_DBGPT(basePoint.x, basePoint.y, basePoint.z); + stawidth = buf->getBitDouble(); + if (stawidth < 0) + endwidth = stawidth = fabs(stawidth); + else + endwidth = buf->getBitDouble(); + bulge = buf->getBitDouble(); + if (version > DRW::AC1021) //2010+ + DRW_DBG("Vertex ID: "); DRW_DBG(buf->getBitLong()); + tgdir = buf->getBitDouble(); + } else if (oType == 0x0B || oType == 0x0C || oType == 0x0D) { //PFACE + flags = buf->getRawChar8(); //RLZ: EC unknown type + DRW_DBG("flags value: "); DRW_DBG(flags); + basePoint = buf->get3BitDouble(); + DRW_DBG("basePoint: "); DRW_DBGPT(basePoint.x, basePoint.y, basePoint.z); + } else if (oType == 0x0E) { //PFACE FACE + vindex1 = buf->getBitShort(); + vindex2 = buf->getBitShort(); + vindex3 = buf->getBitShort(); + vindex4 = buf->getBitShort(); + } + + ret = DRW_Entity::parseDwgEntHandle(version, buf); + if (!ret) + return ret; +// RS crc; //RS */ + return buf->isGood(); +} + +void DRW_Hatch::parseCode(int code, dxfReader *reader){ + switch (code) { + case 2: + name = reader->getUtf8String(); + break; + case 70: + solid = reader->getInt32(); + break; + case 71: + associative = reader->getInt32(); + break; + case 72: /*edge type*/ + if (ispol){ //if is polyline is a as_bulge flag + break; + } else if (reader->getInt32() == 1){ //line + addLine(); + } else if (reader->getInt32() == 2){ //arc + addArc(); + } else if (reader->getInt32() == 3){ //elliptic arc + addEllipse(); + } else if (reader->getInt32() == 4){ //spline + addSpline(); + } + break; + case 10: + if (pt) pt->basePoint.x = reader->getDouble(); + else if (pline) { + plvert = pline->addVertex(); + plvert->x = reader->getDouble(); + } + break; + case 20: + if (pt) pt->basePoint.y = reader->getDouble(); + else if (plvert) plvert ->y = reader->getDouble(); + break; + case 11: + if (line) line->secPoint.x = reader->getDouble(); + else if (ellipse) ellipse->secPoint.x = reader->getDouble(); + break; + case 21: + if (line) line->secPoint.y = reader->getDouble(); + else if (ellipse) ellipse->secPoint.y = reader->getDouble(); + break; + case 40: + if (arc) arc->radious = reader->getDouble(); + else if (ellipse) ellipse->ratio = reader->getDouble(); + break; + case 41: + scale = reader->getDouble(); + break; + case 42: + if (plvert) plvert ->bulge = reader->getDouble(); + break; + case 50: + if (arc) arc->staangle = reader->getDouble()/ARAD; + else if (ellipse) ellipse->staparam = reader->getDouble()/ARAD; + break; + case 51: + if (arc) arc->endangle = reader->getDouble()/ARAD; + else if (ellipse) ellipse->endparam = reader->getDouble()/ARAD; + break; + case 52: + angle = reader->getDouble(); + break; + case 73: + if (arc) arc->isccw = reader->getInt32(); + else if (pline) pline->flags = reader->getInt32(); + break; + case 75: + hstyle = reader->getInt32(); + break; + case 76: + hpattern = reader->getInt32(); + break; + case 77: + doubleflag = reader->getInt32(); + break; + case 78: + deflines = reader->getInt32(); + break; + case 91: + loopsnum = reader->getInt32(); + looplist.reserve(loopsnum); + break; + case 92: + loop = new DRW_HatchLoop(reader->getInt32()); + looplist.push_back(loop); + if (reader->getInt32() & 2) { + ispol = true; + clearEntities(); + pline = new DRW_LWPolyline; + loop->objlist.push_back(pline); + } else ispol = false; + break; + case 93: + if (pline) pline->vertexnum = reader->getInt32(); + else loop->numedges = reader->getInt32();//aqui reserve + break; + case 98: //seed points ?? + clearEntities(); + break; + default: + DRW_Point::parseCode(code, reader); + break; + } +} + +bool DRW_Hatch::parseDwg(DRW::Version version, dwgBuffer *buf, duint32 bs){ + dwgBuffer sBuff = *buf; + dwgBuffer *sBuf = buf; + duint32 totalBoundItems = 0; + bool havePixelSize = false; + + if (version > DRW::AC1018) {//2007+ + sBuf = &sBuff; //separate buffer for strings + } + bool ret = DRW_Entity::parseDwg(version, buf, sBuf, bs); + if (!ret) + return ret; + DRW_DBG("\n***************************** parsing hatch *********************************************\n"); + + //Gradient data, RLZ: is ok or if grad > 0 continue read ? + if (version > DRW::AC1015) { //2004+ + dint32 isGradient = buf->getBitLong(); + DRW_DBG("is Gradient: "); DRW_DBG(isGradient); + dint32 res = buf->getBitLong(); + DRW_DBG(" reserved: "); DRW_DBG(res); + double gradAngle = buf->getBitDouble(); + DRW_DBG(" Gradient angle: "); DRW_DBG(gradAngle); + double gradShift = buf->getBitDouble(); + DRW_DBG(" Gradient shift: "); DRW_DBG(gradShift); + dint32 singleCol = buf->getBitLong(); + DRW_DBG("\nsingle color Grad: "); DRW_DBG(singleCol); + double gradTint = buf->getBitDouble(); + DRW_DBG(" Gradient tint: "); DRW_DBG(gradTint); + dint32 numCol = buf->getBitLong(); + DRW_DBG(" num colors: "); DRW_DBG(numCol); + for (dint32 i = 0 ; i < numCol; ++i){ + double unkDouble = buf->getBitDouble(); + DRW_DBG("\nunkDouble: "); DRW_DBG(unkDouble); + duint16 unkShort = buf->getBitShort(); + DRW_DBG(" unkShort: "); DRW_DBG(unkShort); + dint32 rgbCol = buf->getBitLong(); + DRW_DBG(" rgb color: "); DRW_DBG(rgbCol); + duint8 ignCol = buf->getRawChar8(); + DRW_DBG(" ignored color: "); DRW_DBG(ignCol); + } + UTF8STRING gradName = sBuf->getVariableText(version, false); + DRW_DBG("\ngradient name: "); DRW_DBG(gradName.c_str()); DRW_DBG("\n"); + } + basePoint.z = buf->getBitDouble(); + extPoint = buf->get3BitDouble(); + DRW_DBG("base point: "); DRW_DBGPT(basePoint.x, basePoint.y, basePoint.z); + DRW_DBG("\nextrusion: "); DRW_DBGPT(extPoint.x, extPoint.y, extPoint.z); + name = sBuf->getVariableText(version, false); + DRW_DBG("\nhatch pattern name: "); DRW_DBG(name.c_str()); DRW_DBG("\n"); + solid = buf->getBit(); + associative = buf->getBit(); + loopsnum = buf->getBitLong(); + + //read loops + for (dint32 i = 0 ; i < loopsnum; ++i){ + loop = new DRW_HatchLoop(buf->getBitLong()); + havePixelSize |= loop->type & 4; + if (!(loop->type & 2)){ //Not polyline + dint32 numPathSeg = buf->getBitLong(); + for (dint32 j = 0; jgetRawChar8(); + if (typePath == 1){ //line + addLine(); + line->basePoint = buf->get2RawDouble(); + line->secPoint = buf->get2RawDouble(); + } else if (typePath == 2){ //circle arc + addArc(); + arc->basePoint = buf->get2RawDouble(); + arc->radious = buf->getBitDouble(); + arc->staangle = buf->getBitDouble(); + arc->endangle = buf->getBitDouble(); + arc->isccw = buf->getBit(); + } else if (typePath == 3){ //ellipse arc + addEllipse(); + ellipse->basePoint = buf->get2RawDouble(); + ellipse->secPoint = buf->get2RawDouble(); + ellipse->ratio = buf->getBitDouble(); + ellipse->staparam = buf->getBitDouble(); + ellipse->endparam = buf->getBitDouble(); + ellipse->isccw = buf->getBit(); + } else if (typePath == 4){ //spline + addSpline(); + spline->degree = buf->getBitLong(); + bool isRational = buf->getBit(); + spline->flags |= (isRational << 2); //rational + spline->flags |= (buf->getBit() << 1); //periodic + spline->nknots = buf->getBitLong(); + spline->knotslist.reserve(spline->nknots); + for (dint32 j = 0; j < spline->nknots;++j){ + spline->knotslist.push_back (buf->getBitDouble()); + } + spline->ncontrol = buf->getBitLong(); + spline->controllist.reserve(spline->ncontrol); + for (dint32 j = 0; j < spline->ncontrol;++j){ + DRW_Coord* crd = new DRW_Coord(buf->get3BitDouble()); + if(isRational) + crd->z = buf->getBitDouble(); //RLZ: investigate how store weight + spline->controllist.push_back(crd); + } + if (version > DRW::AC1021) { //2010+ + spline->nfit = buf->getBitLong(); + spline->fitlist.reserve(spline->nfit); + for (dint32 j = 0; j < spline->nfit;++j){ + DRW_Coord* crd = new DRW_Coord(buf->get3BitDouble()); + spline->fitlist.push_back (crd); + } + spline->tgStart = buf->get2RawDouble(); + spline->tgEnd = buf->get2RawDouble(); + } + } + } + } else { //end not pline, start polyline + pline = new DRW_LWPolyline; + bool asBulge = buf->getBit(); + pline->flags = buf->getBit();//closed bit + dint32 numVert = buf->getBitLong(); + for (dint32 j = 0; jgetRawDouble(); + v.y = buf->getRawDouble(); + if (asBulge) + v.bulge = buf->getBitDouble(); + pline->addVertex(v); + } + loop->objlist.push_back(pline); + }//end polyline + loop->update(); + looplist.push_back(loop); + totalBoundItems += buf->getBitLong(); + DRW_DBG(" totalBoundItems: "); DRW_DBG(totalBoundItems); + } //end read loops + + hstyle = buf->getBitShort(); + hpattern = buf->getBitShort(); + DRW_DBG("\nhatch style: "); DRW_DBG(hstyle); DRW_DBG(" pattern type"); DRW_DBG(hpattern); + if (!solid){ + angle = buf->getBitDouble(); + scale = buf->getBitDouble(); + doubleflag = buf->getBit(); + deflines = buf->getBitShort(); + for (dint32 i = 0 ; i < deflines; ++i){ + DRW_Coord ptL, offL; + double angleL = buf->getBitDouble(); + ptL.x = buf->getBitDouble(); + ptL.y = buf->getBitDouble(); + offL.x = buf->getBitDouble(); + offL.y = buf->getBitDouble(); + duint16 numDashL = buf->getBitShort(); + DRW_DBG("\ndef line: "); DRW_DBG(angleL); DRW_DBG(","); DRW_DBG(ptL.x); DRW_DBG(","); DRW_DBG(ptL.y); + DRW_DBG(","); DRW_DBG(offL.x); DRW_DBG(","); DRW_DBG(offL.y); DRW_DBG(","); DRW_DBG(angleL); + for (duint16 i = 0 ; i < numDashL; ++i){ + double lenghtL = buf->getBitDouble(); + DRW_DBG(","); DRW_DBG(lenghtL); + } + }//end deflines + } //end not solid + + if (havePixelSize){ + ddouble64 pixsize = buf->getBitDouble(); + DRW_DBG("\npixel size: "); DRW_DBG(pixsize); + } + dint32 numSeedPoints = buf->getBitLong(); + DRW_DBG("\nnum Seed Points "); DRW_DBG(numSeedPoints); + //read Seed Points + DRW_Coord seedPt; + for (dint32 i = 0 ; i < numSeedPoints; ++i){ + seedPt.x = buf->getRawDouble(); + seedPt.y = buf->getRawDouble(); + DRW_DBG("\n "); DRW_DBG(seedPt.x); DRW_DBG(","); DRW_DBG(seedPt.y); + } + + DRW_DBG("\n"); + ret = DRW_Entity::parseDwgEntHandle(version, buf); + if (!ret) + return ret; + DRW_DBG("Remaining bytes: "); DRW_DBG(buf->numRemainingBytes()); DRW_DBG("\n"); + + for (duint32 i = 0 ; i < totalBoundItems; ++i){ + dwgHandle biH = buf->getHandle(); + DRW_DBG("Boundary Items Handle: "); DRW_DBGHL(biH.code, biH.size, biH.ref); + } + DRW_DBG("Remaining bytes: "); DRW_DBG(buf->numRemainingBytes()); DRW_DBG("\n"); +// RS crc; //RS */ + return buf->isGood(); +} + +void DRW_Spline::parseCode(int code, dxfReader *reader){ + switch (code) { + case 210: + normalVec.x = reader->getDouble(); + break; + case 220: + normalVec.y = reader->getDouble(); + break; + case 230: + normalVec.z = reader->getDouble(); + break; + case 12: + tgStart.x = reader->getDouble(); + break; + case 22: + tgStart.y = reader->getDouble(); + break; + case 32: + tgStart.z = reader->getDouble(); + break; + case 13: + tgEnd.x = reader->getDouble(); + break; + case 23: + tgEnd.y = reader->getDouble(); + break; + case 33: + tgEnd.z = reader->getDouble(); + break; + case 70: + flags = reader->getInt32(); + break; + case 71: + degree = reader->getInt32(); + break; + case 72: + nknots = reader->getInt32(); + break; + case 73: + ncontrol = reader->getInt32(); + break; + case 74: + nfit = reader->getInt32(); + break; + case 42: + tolknot = reader->getDouble(); + break; + case 43: + tolcontrol = reader->getDouble(); + break; + case 44: + tolfit = reader->getDouble(); + break; + case 10: { + controlpoint = new DRW_Coord(); + controllist.push_back(controlpoint); + controlpoint->x = reader->getDouble(); + break; } + case 20: + if(controlpoint != NULL) + controlpoint->y = reader->getDouble(); + break; + case 30: + if(controlpoint != NULL) + controlpoint->z = reader->getDouble(); + break; + case 11: { + fitpoint = new DRW_Coord(); + fitlist.push_back(fitpoint); + fitpoint->x = reader->getDouble(); + break; } + case 21: + if(fitpoint != NULL) + fitpoint->y = reader->getDouble(); + break; + case 31: + if(fitpoint != NULL) + fitpoint->z = reader->getDouble(); + break; + case 40: + knotslist.push_back(reader->getDouble()); + break; + case 41: + weightlist.push_back(reader->getDouble()); + break; + default: + DRW_Entity::parseCode(code, reader); + break; + } +} + +bool DRW_Spline::parseDwg(DRW::Version version, dwgBuffer *buf, duint32 bs){ + bool ret = DRW_Entity::parseDwg(version, buf, NULL, bs); + if (!ret) + return ret; + DRW_DBG("\n***************************** parsing spline *********************************************\n"); + duint8 weight = 0; // RLZ ??? flags, weight, code 70, bit 4 (16) + + dint32 scenario = buf->getBitLong(); + DRW_DBG("scenario: "); DRW_DBG(scenario); + if (version > DRW::AC1024) { + dint32 splFlag1 = buf->getBitLong(); + if (splFlag1 & 1) + scenario = 2; + dint32 knotParam = buf->getBitLong(); + DRW_DBG("2013 splFlag1: "); DRW_DBG(splFlag1); DRW_DBG(" 2013 knotParam: "); + DRW_DBG(knotParam); +// DRW_DBG("unk bit: "); DRW_DBG(buf->getBit()); + } + degree = buf->getBitLong(); //RLZ: code 71, verify with dxf + DRW_DBG(" degree: "); DRW_DBG(degree); DRW_DBG("\n"); + if (scenario == 2) { + flags = 8;//scenario 2 = not rational & planar + tolfit = buf->getBitDouble();//BD + DRW_DBG("flags: "); DRW_DBG(flags); DRW_DBG(" tolfit: "); DRW_DBG(tolfit); + tgStart =buf->get3BitDouble(); + DRW_DBG(" Start Tangent: "); DRW_DBGPT(tgStart.x, tgStart.y, tgStart.z); + tgEnd =buf->get3BitDouble(); + DRW_DBG("\nEnd Tangent: "); DRW_DBGPT(tgEnd.x, tgEnd.y, tgEnd.z); + nfit = buf->getBitLong(); + DRW_DBG("\nnumber of fit points: "); DRW_DBG(nfit); + } else if (scenario == 1) { + flags = 8;//scenario 1 = rational & planar + flags |= buf->getBit() << 2; //flags, rational, code 70, bit 2 (4) + flags |= buf->getBit(); //flags, closed, code 70, bit 0 (1) + flags |= buf->getBit() << 1; //flags, periodic, code 70, bit 1 (2) + tolknot = buf->getBitDouble(); + tolcontrol = buf->getBitDouble(); + DRW_DBG("flags: "); DRW_DBG(flags); DRW_DBG(" knot tolerance: "); DRW_DBG(tolknot); + DRW_DBG(" control point tolerance: "); DRW_DBG(tolcontrol); + nknots = buf->getBitLong(); + ncontrol = buf->getBitLong(); + weight = buf->getBit(); // RLZ ??? flags, weight, code 70, bit 4 (16) + DRW_DBG("\nnum of knots: "); DRW_DBG(nknots); DRW_DBG(" num of control pt: "); + DRW_DBG(ncontrol); DRW_DBG(" weight bit: "); DRW_DBG(weight); + } else { + DRW_DBG("\ndwg Ellipse, unknouwn scenario\n"); + return false; //RLZ: from doc only 1 or 2 are ok ? + } + + knotslist.reserve(nknots); + for (dint32 i= 0; igetBitDouble()); + } + controllist.reserve(ncontrol); + for (dint32 i= 0; iget3BitDouble()); + controllist.push_back(crd); + if (weight){ + DRW_DBG("\n w: "); DRW_DBG(buf->getBitDouble()); //RLZ Warning: D (BD or RD) + } + } + fitlist.reserve(nfit); + for (dint32 i= 0; iget3BitDouble()); + fitlist.push_back (crd); + } + if (DRW_DBGGL == DRW_dbg::DEBUG){ + DRW_DBG("\nknots list: "); + for (std::vector::iterator it = knotslist.begin() ; it != knotslist.end(); ++it){ + DRW_DBG("\n"); DRW_DBG(*it); + } + DRW_DBG("\ncontrol point list: "); + for (std::vector::iterator it = controllist.begin() ; it != controllist.end(); ++it){ + DRW_DBG("\n"); DRW_DBGPT((*it)->x,(*it)->y,(*it)->z); + } + DRW_DBG("\nfit point list: "); + for (std::vector::iterator it = fitlist.begin() ; it != fitlist.end(); ++it){ + DRW_DBG("\n"); DRW_DBGPT((*it)->x,(*it)->y,(*it)->z); + } + } + + /* Common Entity Handle Data */ + ret = DRW_Entity::parseDwgEntHandle(version, buf); + if (!ret) + return ret; +// RS crc; //RS */ + return buf->isGood(); +} + +void DRW_Image::parseCode(int code, dxfReader *reader){ + switch (code) { + case 12: + vVector.x = reader->getDouble(); + break; + case 22: + vVector.y = reader->getDouble(); + break; + case 32: + vVector.z = reader->getDouble(); + break; + case 13: + sizeu = reader->getDouble(); + break; + case 23: + sizev = reader->getDouble(); + break; + case 340: + ref = reader->getHandleString(); + break; + case 280: + clip = reader->getInt32(); + break; + case 281: + brightness = reader->getInt32(); + break; + case 282: + contrast = reader->getInt32(); + break; + case 283: + fade = reader->getInt32(); + break; + default: + DRW_Line::parseCode(code, reader); + break; + } +} + +bool DRW_Image::parseDwg(DRW::Version version, dwgBuffer *buf, duint32 bs){ + dwgBuffer sBuff = *buf; + dwgBuffer *sBuf = buf; + if (version > DRW::AC1018) {//2007+ + sBuf = &sBuff; //separate buffer for strings + } + bool ret = DRW_Entity::parseDwg(version, buf, sBuf, bs); + if (!ret) + return ret; + DRW_DBG("\n***************************** parsing image *********************************************\n"); + + dint32 classVersion = buf->getBitLong(); + DRW_DBG("class Version: "); DRW_DBG(classVersion); + basePoint = buf->get3BitDouble(); + DRW_DBG("\nbase point: "); DRW_DBGPT(basePoint.x, basePoint.y, basePoint.z); + secPoint = buf->get3BitDouble(); + DRW_DBG("\nU vector: "); DRW_DBGPT(secPoint.x, secPoint.y, secPoint.z); + vVector = buf->get3BitDouble(); + DRW_DBG("\nV vector: "); DRW_DBGPT(vVector.x, vVector.y, vVector.z); + sizeu = buf->getRawDouble(); + sizev = buf->getRawDouble(); + DRW_DBG("\nsize U: "); DRW_DBG(sizeu); DRW_DBG("\nsize V: "); DRW_DBG(sizev); + duint16 displayProps = buf->getBitShort(); + (void)displayProps; + clip = buf->getBit(); + brightness = buf->getRawChar8(); + contrast = buf->getRawChar8(); + fade = buf->getRawChar8(); + if (version > DRW::AC1021){ //2010+ + bool clipMode = buf->getBit(); + (void)clipMode; + } + duint16 clipType = buf->getBitShort(); + if (clipType == 1){ + buf->get2RawDouble(); + buf->get2RawDouble(); + } else { //clipType == 2 + dint32 numVerts = buf->getBitLong(); + for (int i= 0; i< numVerts;++i) + buf->get2RawDouble(); + } + + ret = DRW_Entity::parseDwgEntHandle(version, buf); + if (!ret) + return ret; + DRW_DBG("Remaining bytes: "); DRW_DBG(buf->numRemainingBytes()); DRW_DBG("\n"); + + dwgHandle biH = buf->getHandle(); + DRW_DBG("ImageDef Handle: "); DRW_DBGHL(biH.code, biH.size, biH.ref); + ref = biH.ref; + biH = buf->getHandle(); + DRW_DBG("ImageDefReactor Handle: "); DRW_DBGHL(biH.code, biH.size, biH.ref); + DRW_DBG("Remaining bytes: "); DRW_DBG(buf->numRemainingBytes()); DRW_DBG("\n"); +// RS crc; //RS */ + return buf->isGood(); +} + +void DRW_Dimension::parseCode(int code, dxfReader *reader){ + switch (code) { + case 1: + text = reader->getUtf8String(); + break; + case 2: + name = reader->getString(); + break; + case 3: + style = reader->getUtf8String(); + break; + case 70: + type = reader->getInt32(); + break; + case 71: + align = reader->getInt32(); + break; + case 72: + linesty = reader->getInt32(); + break; + case 10: + defPoint.x = reader->getDouble(); + break; + case 20: + defPoint.y = reader->getDouble(); + break; + case 30: + defPoint.z = reader->getDouble(); + break; + case 11: + textPoint.x = reader->getDouble(); + break; + case 21: + textPoint.y = reader->getDouble(); + break; + case 31: + textPoint.z = reader->getDouble(); + break; + case 12: + clonePoint.x = reader->getDouble(); + break; + case 22: + clonePoint.y = reader->getDouble(); + break; + case 32: + clonePoint.z = reader->getDouble(); + break; + case 13: + def1.x = reader->getDouble(); + break; + case 23: + def1.y = reader->getDouble(); + break; + case 33: + def1.z = reader->getDouble(); + break; + case 14: + def2.x = reader->getDouble(); + break; + case 24: + def2.y = reader->getDouble(); + break; + case 34: + def2.z = reader->getDouble(); + break; + case 15: + circlePoint.x = reader->getDouble(); + break; + case 25: + circlePoint.y = reader->getDouble(); + break; + case 35: + circlePoint.z = reader->getDouble(); + break; + case 16: + arcPoint.x = reader->getDouble(); + break; + case 26: + arcPoint.y = reader->getDouble(); + break; + case 36: + arcPoint.z = reader->getDouble(); + break; + case 41: + linefactor = reader->getDouble(); + break; + case 42: + actual = reader->getDouble(); + hasActual = (actual != 0.0); + break; + case 53: + rot = reader->getDouble(); + break; + case 50: + angle = reader->getDouble(); + break; + case 52: + oblique = reader->getDouble(); + break; + case 40: + length = reader->getDouble(); + break; + case 51: + hdir = reader->getDouble(); + break; + default: + DRW_Entity::parseCode(code, reader); + break; + } +} + +bool DRW_Dimension::parseDwg(DRW::Version version, dwgBuffer *buf, dwgBuffer *sBuf){ + DRW_DBG("\n***************************** parsing dimension *********************************************"); + if (version > DRW::AC1021) { //2010+ + duint8 dimVersion = buf->getRawChar8(); + DRW_DBG("\ndimVersion: "); DRW_DBG(dimVersion); + } + extPoint = buf->getExtrusion(version > DRW::AC1014); + DRW_DBG("\nextPoint: "); DRW_DBGPT(extPoint.x, extPoint.y, extPoint.z); + if (version > DRW::AC1014) { //2000+ + DRW_DBG("\nFive unknown bits: "); DRW_DBG(buf->getBit()); DRW_DBG(buf->getBit()); + DRW_DBG(buf->getBit()); DRW_DBG(buf->getBit()); DRW_DBG(buf->getBit()); + } + textPoint.x = buf->getRawDouble(); + textPoint.y = buf->getRawDouble(); + textPoint.z = buf->getBitDouble(); + DRW_DBG("\ntextPoint: "); DRW_DBGPT(textPoint.x, textPoint.y, textPoint.z); + type = buf->getRawChar8(); + DRW_DBG("\ntype (70) read: "); DRW_DBG(type); + type = (type & 1) ? type & 0x7F : type | 0x80; //set bit 7 + type = (type & 2) ? type | 0x20 : type & 0xDF; //set bit 5 + DRW_DBG(" type (70) set: "); DRW_DBG(type); + //clear last 3 bits to set integer dim type + type &= 0xF8; + text = sBuf->getVariableText(version, false); + DRW_DBG("\nforced dim text: "); DRW_DBG(text.c_str()); + rot = buf->getBitDouble(); + hdir = buf->getBitDouble(); + DRW_Coord inspoint = buf->get3BitDouble(); + DRW_DBG("\ninspoint: "); DRW_DBGPT(inspoint.x, inspoint.y, inspoint.z); + double insRot_code54 = buf->getBitDouble(); //RLZ: unknown, investigate + DRW_DBG(" insRot_code54: "); DRW_DBG(insRot_code54); + if (version > DRW::AC1014) { //2000+ + align = buf->getBitShort(); + linesty = buf->getBitShort(); + linefactor = buf->getBitDouble(); + double actMeas = buf->getBitDouble(); + DRW_DBG("\n actMeas_code42: "); DRW_DBG(actMeas); + if (version > DRW::AC1018) { //2007+ + bool unk = buf->getBit(); + bool flip1 = buf->getBit(); + bool flip2 = buf->getBit(); + DRW_DBG("\n2007, unk, flip1, flip2: "); DRW_DBG(unk); DRW_DBG(flip1); DRW_DBG(flip2); + } + } + clonePoint.x = buf->getRawDouble(); + clonePoint.y = buf->getRawDouble(); + DRW_DBG("\nclonePoint: "); DRW_DBGPT(clonePoint.x, clonePoint.y, clonePoint.z); + + return buf->isGood(); +} + +bool DRW_DimAligned::parseDwg(DRW::Version version, dwgBuffer *buf, duint32 bs){ + dwgBuffer sBuff = *buf; + dwgBuffer *sBuf = buf; + if (version > DRW::AC1018) {//2007+ + sBuf = &sBuff; //separate buffer for strings + } + bool ret = DRW_Entity::parseDwg(version, buf, sBuf, bs); + if (!ret) + return ret; + ret = DRW_Dimension::parseDwg(version, buf, sBuf); + if (!ret) + return ret; + if (oType == 0x15) + DRW_DBG("\n***************************** parsing dim linear *********************************************\n"); + else + DRW_DBG("\n***************************** parsing dim aligned *********************************************\n"); + DRW_Coord pt = buf->get3BitDouble(); + setPt3(pt); //def1 + DRW_DBG("def1: "); DRW_DBGPT(pt.x, pt.y, pt.z); + pt = buf->get3BitDouble(); + setPt4(pt); + DRW_DBG("\ndef2: "); DRW_DBGPT(pt.x, pt.y, pt.z); + pt = buf->get3BitDouble(); + setDefPoint(pt); + DRW_DBG("\ndefPoint: "); DRW_DBGPT(pt.x, pt.y, pt.z); + setOb52(buf->getBitDouble()); + if (oType == 0x15) + setAn50(buf->getBitDouble() * ARAD); + else + type |= 1; + DRW_DBG("\n type (70) final: "); DRW_DBG(type); DRW_DBG("\n"); + + ret = DRW_Entity::parseDwgEntHandle(version, buf); + DRW_DBG("Remaining bytes: "); DRW_DBG(buf->numRemainingBytes()); DRW_DBG("\n"); + if (!ret) + return ret; + dimStyleH = buf->getHandle(); + DRW_DBG("dim style Handle: "); DRW_DBGHL(dimStyleH.code, dimStyleH.size, dimStyleH.ref); DRW_DBG("\n"); + blockH = buf->getHandle(); /* H 7 STYLE (hard pointer) */ + DRW_DBG("anon block Handle: "); DRW_DBGHL(blockH.code, blockH.size, blockH.ref); DRW_DBG("\n"); + DRW_DBG("Remaining bytes: "); DRW_DBG(buf->numRemainingBytes()); DRW_DBG("\n"); + + // RS crc; //RS */ + return buf->isGood(); + } + + bool DRW_DimRadial::parseDwg(DRW::Version version, dwgBuffer *buf, duint32 bs){ + dwgBuffer sBuff = *buf; + dwgBuffer *sBuf = buf; + if (version > DRW::AC1018) {//2007+ + sBuf = &sBuff; //separate buffer for strings + } + bool ret = DRW_Entity::parseDwg(version, buf, sBuf, bs); + if (!ret) + return ret; + ret = DRW_Dimension::parseDwg(version, buf, sBuf); + if (!ret) + return ret; + DRW_DBG("\n***************************** parsing dim radial *********************************************\n"); + DRW_Coord pt = buf->get3BitDouble(); + setDefPoint(pt); //code 10 + DRW_DBG("defPoint: "); DRW_DBGPT(pt.x, pt.y, pt.z); + pt = buf->get3BitDouble(); + setPt5(pt); //center pt code 15 + DRW_DBG("\ncenter point: "); DRW_DBGPT(pt.x, pt.y, pt.z); + setRa40(buf->getBitDouble()); //leader length code 40 + DRW_DBG("\nleader length: "); DRW_DBG(getRa40()); + type |= 4; + DRW_DBG("\n type (70) final: "); DRW_DBG(type); DRW_DBG("\n"); + + ret = DRW_Entity::parseDwgEntHandle(version, buf); + DRW_DBG("Remaining bytes: "); DRW_DBG(buf->numRemainingBytes()); DRW_DBG("\n"); + if (!ret) + return ret; + dimStyleH = buf->getHandle(); + DRW_DBG("dim style Handle: "); DRW_DBGHL(dimStyleH.code, dimStyleH.size, dimStyleH.ref); DRW_DBG("\n"); + blockH = buf->getHandle(); /* H 7 STYLE (hard pointer) */ + DRW_DBG("anon block Handle: "); DRW_DBGHL(blockH.code, blockH.size, blockH.ref); DRW_DBG("\n"); + DRW_DBG("Remaining bytes: "); DRW_DBG(buf->numRemainingBytes()); DRW_DBG("\n"); + + // RS crc; //RS */ + return buf->isGood(); + } + + bool DRW_DimDiametric::parseDwg(DRW::Version version, dwgBuffer *buf, duint32 bs){ + dwgBuffer sBuff = *buf; + dwgBuffer *sBuf = buf; + if (version > DRW::AC1018) {//2007+ + sBuf = &sBuff; //separate buffer for strings + } + bool ret = DRW_Entity::parseDwg(version, buf, sBuf, bs); + if (!ret) + return ret; + ret = DRW_Dimension::parseDwg(version, buf, sBuf); + if (!ret) + return ret; + DRW_DBG("\n***************************** parsing dim diametric *********************************************\n"); + DRW_Coord pt = buf->get3BitDouble(); + setPt5(pt); //center pt code 15 + DRW_DBG("center point: "); DRW_DBGPT(pt.x, pt.y, pt.z); + pt = buf->get3BitDouble(); + setDefPoint(pt); //code 10 + DRW_DBG("\ndefPoint: "); DRW_DBGPT(pt.x, pt.y, pt.z); + setRa40(buf->getBitDouble()); //leader length code 40 + DRW_DBG("\nleader length: "); DRW_DBG(getRa40()); + type |= 3; + DRW_DBG("\n type (70) final: "); DRW_DBG(type); DRW_DBG("\n"); + + ret = DRW_Entity::parseDwgEntHandle(version, buf); + DRW_DBG("Remaining bytes: "); DRW_DBG(buf->numRemainingBytes()); DRW_DBG("\n"); + if (!ret) + return ret; + dimStyleH = buf->getHandle(); + DRW_DBG("dim style Handle: "); DRW_DBGHL(dimStyleH.code, dimStyleH.size, dimStyleH.ref); DRW_DBG("\n"); + blockH = buf->getHandle(); /* H 7 STYLE (hard pointer) */ + DRW_DBG("anon block Handle: "); DRW_DBGHL(blockH.code, blockH.size, blockH.ref); DRW_DBG("\n"); + DRW_DBG("Remaining bytes: "); DRW_DBG(buf->numRemainingBytes()); DRW_DBG("\n"); + + // RS crc; //RS */ + return buf->isGood(); + } + +bool DRW_DimAngular::parseDwg(DRW::Version version, dwgBuffer *buf, duint32 bs){ + dwgBuffer sBuff = *buf; + dwgBuffer *sBuf = buf; + if (version > DRW::AC1018) {//2007+ + sBuf = &sBuff; //separate buffer for strings + } + bool ret = DRW_Entity::parseDwg(version, buf, sBuf, bs); + if (!ret) + return ret; + ret = DRW_Dimension::parseDwg(version, buf, sBuf); + if (!ret) + return ret; + DRW_DBG("\n***************************** parsing dim angular *********************************************\n"); + DRW_Coord pt; + pt.x = buf->getRawDouble(); + pt.y = buf->getRawDouble(); + setPt6(pt); //code 16 + DRW_DBG("arc Point: "); DRW_DBGPT(pt.x, pt.y, pt.z); + pt = buf->get3BitDouble(); + setPt3(pt); //def1 code 13 + DRW_DBG("\ndef1: "); DRW_DBGPT(pt.x, pt.y, pt.z); + pt = buf->get3BitDouble(); + setPt4(pt); //def2 code 14 + DRW_DBG("\ndef2: "); DRW_DBGPT(pt.x, pt.y, pt.z); + pt = buf->get3BitDouble(); + setPt5(pt); //center pt code 15 + DRW_DBG("\ncenter point: "); DRW_DBGPT(pt.x, pt.y, pt.z); + pt = buf->get3BitDouble(); + setDefPoint(pt); //code 10 + DRW_DBG("\ndefPoint: "); DRW_DBGPT(pt.x, pt.y, pt.z); + type |= 0x02; + DRW_DBG("\n type (70) final: "); DRW_DBG(type); DRW_DBG("\n"); + + ret = DRW_Entity::parseDwgEntHandle(version, buf); + DRW_DBG("Remaining bytes: "); DRW_DBG(buf->numRemainingBytes()); DRW_DBG("\n"); + if (!ret) + return ret; + dimStyleH = buf->getHandle(); + DRW_DBG("dim style Handle: "); DRW_DBGHL(dimStyleH.code, dimStyleH.size, dimStyleH.ref); DRW_DBG("\n"); + blockH = buf->getHandle(); /* H 7 STYLE (hard pointer) */ + DRW_DBG("anon block Handle: "); DRW_DBGHL(blockH.code, blockH.size, blockH.ref); DRW_DBG("\n"); + DRW_DBG("Remaining bytes: "); DRW_DBG(buf->numRemainingBytes()); DRW_DBG("\n"); + + // RS crc; //RS */ + return buf->isGood(); +} + +bool DRW_DimAngular3p::parseDwg(DRW::Version version, dwgBuffer *buf, duint32 bs){ + dwgBuffer sBuff = *buf; + dwgBuffer *sBuf = buf; + if (version > DRW::AC1018) {//2007+ + sBuf = &sBuff; //separate buffer for strings + } + bool ret = DRW_Entity::parseDwg(version, buf, sBuf, bs); + if (!ret) + return ret; + ret = DRW_Dimension::parseDwg(version, buf, sBuf); + if (!ret) + return ret; + DRW_DBG("\n***************************** parsing dim angular3p *********************************************\n"); + DRW_Coord pt = buf->get3BitDouble(); + setDefPoint(pt); //code 10 + DRW_DBG("defPoint: "); DRW_DBGPT(pt.x, pt.y, pt.z); + pt = buf->get3BitDouble(); + setPt3(pt); //def1 code 13 + DRW_DBG("\ndef1: "); DRW_DBGPT(pt.x, pt.y, pt.z); + pt = buf->get3BitDouble(); + setPt4(pt); //def2 code 14 + DRW_DBG("\ndef2: "); DRW_DBGPT(pt.x, pt.y, pt.z); + pt = buf->get3BitDouble(); + setPt5(pt); //center pt code 15 + DRW_DBG("\ncenter point: "); DRW_DBGPT(pt.x, pt.y, pt.z); + type |= 0x05; + DRW_DBG("\n type (70) final: "); DRW_DBG(type); DRW_DBG("\n"); + + ret = DRW_Entity::parseDwgEntHandle(version, buf); + DRW_DBG("Remaining bytes: "); DRW_DBG(buf->numRemainingBytes()); DRW_DBG("\n"); + if (!ret) + return ret; + dimStyleH = buf->getHandle(); + DRW_DBG("dim style Handle: "); DRW_DBGHL(dimStyleH.code, dimStyleH.size, dimStyleH.ref); DRW_DBG("\n"); + blockH = buf->getHandle(); /* H 7 STYLE (hard pointer) */ + DRW_DBG("anon block Handle: "); DRW_DBGHL(blockH.code, blockH.size, blockH.ref); DRW_DBG("\n"); + DRW_DBG("Remaining bytes: "); DRW_DBG(buf->numRemainingBytes()); DRW_DBG("\n"); + + // RS crc; //RS */ + return buf->isGood(); +} + +bool DRW_DimOrdinate::parseDwg(DRW::Version version, dwgBuffer *buf, duint32 bs){ + dwgBuffer sBuff = *buf; + dwgBuffer *sBuf = buf; + if (version > DRW::AC1018) {//2007+ + sBuf = &sBuff; //separate buffer for strings + } + bool ret = DRW_Entity::parseDwg(version, buf, sBuf, bs); + if (!ret) + return ret; + ret = DRW_Dimension::parseDwg(version, buf, sBuf); + if (!ret) + return ret; + DRW_DBG("\n***************************** parsing dim ordinate *********************************************\n"); + DRW_Coord pt = buf->get3BitDouble(); + setDefPoint(pt); + DRW_DBG("defPoint: "); DRW_DBGPT(pt.x, pt.y, pt.z); + pt = buf->get3BitDouble(); + setPt3(pt); //def1 + DRW_DBG("\ndef1: "); DRW_DBGPT(pt.x, pt.y, pt.z); + pt = buf->get3BitDouble(); + setPt4(pt); + DRW_DBG("\ndef2: "); DRW_DBGPT(pt.x, pt.y, pt.z); + duint8 type2 = buf->getRawChar8();//RLZ: correct this + DRW_DBG("type2 (70) read: "); DRW_DBG(type2); + type = (type2 & 1) ? type | 0x80 : type & 0xBF; //set bit 6 + DRW_DBG(" type (70) set: "); DRW_DBG(type); + type |= 6; + DRW_DBG("\n type (70) final: "); DRW_DBG(type); + + ret = DRW_Entity::parseDwgEntHandle(version, buf); DRW_DBG("\n"); + DRW_DBG("Remaining bytes: "); DRW_DBG(buf->numRemainingBytes()); DRW_DBG("\n"); + if (!ret) + return ret; + dimStyleH = buf->getHandle(); + DRW_DBG("dim style Handle: "); DRW_DBGHL(dimStyleH.code, dimStyleH.size, dimStyleH.ref); DRW_DBG("\n"); + blockH = buf->getHandle(); /* H 7 STYLE (hard pointer) */ + DRW_DBG("anon block Handle: "); DRW_DBGHL(blockH.code, blockH.size, blockH.ref); DRW_DBG("\n"); + DRW_DBG("Remaining bytes: "); DRW_DBG(buf->numRemainingBytes()); DRW_DBG("\n"); + + // RS crc; //RS */ + return buf->isGood(); +} + +void DRW_Leader::parseCode(int code, dxfReader *reader){ + switch (code) { + case 3: + style = reader->getUtf8String(); + break; + case 71: + arrow = reader->getInt32(); + break; + case 72: + leadertype = reader->getInt32(); + break; + case 73: + flag = reader->getInt32(); + break; + case 74: + hookline = reader->getInt32(); + break; + case 75: + hookflag = reader->getInt32(); + break; + case 76: + vertnum = reader->getInt32(); + break; + case 77: + coloruse = reader->getInt32(); + break; + case 40: + textheight = reader->getDouble(); + break; + case 41: + textwidth = reader->getDouble(); + break; + case 10: { + vertexpoint = new DRW_Coord(); + vertexlist.push_back(vertexpoint); + vertexpoint->x = reader->getDouble(); + break; } + case 20: + if(vertexpoint != NULL) + vertexpoint->y = reader->getDouble(); + break; + case 30: + if(vertexpoint != NULL) + vertexpoint->z = reader->getDouble(); + break; + case 340: + annotHandle = reader->getHandleString(); + break; + case 210: + extrusionPoint.x = reader->getDouble(); + break; + case 220: + extrusionPoint.y = reader->getDouble(); + break; + case 230: + extrusionPoint.z = reader->getDouble(); + break; + case 211: + horizdir.x = reader->getDouble(); + break; + case 221: + horizdir.y = reader->getDouble(); + break; + case 231: + horizdir.z = reader->getDouble(); + break; + case 212: + offsetblock.x = reader->getDouble(); + break; + case 222: + offsetblock.y = reader->getDouble(); + break; + case 232: + offsetblock.z = reader->getDouble(); + break; + case 213: + offsettext.x = reader->getDouble(); + break; + case 223: + offsettext.y = reader->getDouble(); + break; + case 233: + offsettext.z = reader->getDouble(); + break; + default: + DRW_Entity::parseCode(code, reader); + break; + } +} + +bool DRW_Leader::parseDwg(DRW::Version version, dwgBuffer *buf, duint32 bs){ + dwgBuffer sBuff = *buf; + dwgBuffer *sBuf = buf; + if (version > DRW::AC1018) {//2007+ + sBuf = &sBuff; //separate buffer for strings + } + bool ret = DRW_Entity::parseDwg(version, buf, sBuf, bs); + if (!ret) + return ret; + DRW_DBG("\n***************************** parsing leader *********************************************\n"); + DRW_DBG("unknown bit "); DRW_DBG(buf->getBit()); + DRW_DBG(" annot type "); DRW_DBG(buf->getBitShort()); + DRW_DBG(" Path type "); DRW_DBG(buf->getBitShort()); + dint32 nPt = buf->getBitLong(); + DRW_DBG(" Num pts "); DRW_DBG(nPt); + + // add vertexs + for (int i = 0; i< nPt; i++){ + DRW_Coord* vertex = new DRW_Coord(buf->get3BitDouble()); + vertexlist.push_back(vertex); + DRW_DBG("\nvertex "); DRW_DBGPT(vertex->x, vertex->y, vertex->z); + } + DRW_Coord Endptproj = buf->get3BitDouble(); + DRW_DBG("\nEndptproj "); DRW_DBGPT(Endptproj.x, Endptproj.y, Endptproj.z); + extrusionPoint = buf->getExtrusion(version > DRW::AC1014); + DRW_DBG("\nextrusionPoint "); DRW_DBGPT(extrusionPoint.x, extrusionPoint.y, extrusionPoint.z); + if (version > DRW::AC1014) { //2000+ + DRW_DBG("\nFive unknown bits: "); DRW_DBG(buf->getBit()); DRW_DBG(buf->getBit()); + DRW_DBG(buf->getBit()); DRW_DBG(buf->getBit()); DRW_DBG(buf->getBit()); + } + horizdir = buf->get3BitDouble(); + DRW_DBG("\nhorizdir "); DRW_DBGPT(horizdir.x, horizdir.y, horizdir.z); + offsetblock = buf->get3BitDouble(); + DRW_DBG("\noffsetblock "); DRW_DBGPT(offsetblock.x, offsetblock.y, offsetblock.z); + if (version > DRW::AC1012) { //R14+ + DRW_Coord unk = buf->get3BitDouble(); + DRW_DBG("\nunknown "); DRW_DBGPT(unk.x, unk.y, unk.z); + } + if (version < DRW::AC1015) { //R14 - + DRW_DBG("\ndimgap "); DRW_DBG(buf->getBitDouble()); + } + if (version < DRW::AC1024) { //2010- + textheight = buf->getBitDouble(); + textwidth = buf->getBitDouble(); + DRW_DBG("\ntextheight "); DRW_DBG(textheight); DRW_DBG(" textwidth "); DRW_DBG(textwidth); + } + hookline = buf->getBit(); + arrow = buf->getBit(); + DRW_DBG(" hookline "); DRW_DBG(hookline); DRW_DBG(" arrow flag "); DRW_DBG(arrow); + + if (version < DRW::AC1015) { //R14 - + DRW_DBG("\nArrow head type "); DRW_DBG(buf->getBitShort()); + DRW_DBG("dimasz "); DRW_DBG(buf->getBitDouble()); + DRW_DBG("\nunk bit "); DRW_DBG(buf->getBit()); + DRW_DBG(" unk bit "); DRW_DBG(buf->getBit()); + DRW_DBG(" unk short "); DRW_DBG(buf->getBitShort()); + DRW_DBG(" byBlock color "); DRW_DBG(buf->getBitShort()); + DRW_DBG(" unk bit "); DRW_DBG(buf->getBit()); + DRW_DBG(" unk bit "); DRW_DBG(buf->getBit()); + } else { //R2000+ + DRW_DBG("\nunk short "); DRW_DBG(buf->getBitShort()); + DRW_DBG(" unk bit "); DRW_DBG(buf->getBit()); + DRW_DBG(" unk bit "); DRW_DBG(buf->getBit()); + } + DRW_DBG("\n"); + ret = DRW_Entity::parseDwgEntHandle(version, buf); + if (!ret) + return ret; + DRW_DBG("Remaining bytes: "); DRW_DBG(buf->numRemainingBytes()); DRW_DBG("\n"); + AnnotH = buf->getHandle(); + annotHandle = AnnotH.ref; + DRW_DBG("annot block Handle: "); DRW_DBGHL(AnnotH.code, AnnotH.size, dimStyleH.ref); DRW_DBG("\n"); + dimStyleH = buf->getHandle(); /* H 7 STYLE (hard pointer) */ + DRW_DBG("dim style Handle: "); DRW_DBGHL(dimStyleH.code, dimStyleH.size, dimStyleH.ref); DRW_DBG("\n"); + DRW_DBG("Remaining bytes: "); DRW_DBG(buf->numRemainingBytes()); DRW_DBG("\n"); +// RS crc; //RS */ + return buf->isGood(); +} + +void DRW_Viewport::parseCode(int code, dxfReader *reader){ + switch (code) { + case 40: + pswidth = reader->getDouble(); + break; + case 41: + psheight = reader->getDouble(); + break; + case 68: + vpstatus = reader->getInt32(); + break; + case 69: + vpID = reader->getInt32(); + break; + case 12: { + centerPX = reader->getDouble(); + break; } + case 22: + centerPY = reader->getDouble(); + break; + default: + DRW_Point::parseCode(code, reader); + break; + } +} +//ex 22 dec 34 +bool DRW_Viewport::parseDwg(DRW::Version version, dwgBuffer *buf, duint32 bs){ + dwgBuffer sBuff = *buf; + dwgBuffer *sBuf = buf; + if (version > DRW::AC1018) {//2007+ + sBuf = &sBuff; //separate buffer for strings + } + bool ret = DRW_Entity::parseDwg(version, buf, sBuf, bs); + if (!ret) + return ret; + DRW_DBG("\n***************************** parsing viewport *****************************************\n"); + basePoint.x = buf->getBitDouble(); + basePoint.y = buf->getBitDouble(); + basePoint.z = buf->getBitDouble(); + DRW_DBG("center "); DRW_DBGPT(basePoint.x, basePoint.y, basePoint.z); + pswidth = buf->getBitDouble(); + psheight = buf->getBitDouble(); + DRW_DBG("\nWidth: "); DRW_DBG(pswidth); DRW_DBG(", Height: "); DRW_DBG(psheight); DRW_DBG("\n"); + //RLZ TODO: complete in dxf + if (version > DRW::AC1014) {//2000+ + viewTarget.x = buf->getBitDouble(); + viewTarget.y = buf->getBitDouble(); + viewTarget.z = buf->getBitDouble(); + DRW_DBG("view Target "); DRW_DBGPT(viewTarget.x, viewTarget.y, viewTarget.z); + viewDir.x = buf->getBitDouble(); + viewDir.y = buf->getBitDouble(); + viewDir.z = buf->getBitDouble(); + DRW_DBG("\nview direction "); DRW_DBGPT(viewDir.x, viewDir.y, viewDir.z); + twistAngle = buf->getBitDouble(); + DRW_DBG("\nView twist Angle: "); DRW_DBG(twistAngle); + viewHeight = buf->getBitDouble(); + DRW_DBG("\nview Height: "); DRW_DBG(viewHeight); + viewLength = buf->getBitDouble(); + DRW_DBG(" Lens Length: "); DRW_DBG(viewLength); + frontClip = buf->getBitDouble(); + DRW_DBG("\nfront Clip Z: "); DRW_DBG(frontClip); + backClip = buf->getBitDouble(); + DRW_DBG(" back Clip Z: "); DRW_DBG(backClip); + snapAngle = buf->getBitDouble(); + DRW_DBG("\n snap Angle: "); DRW_DBG(snapAngle); + centerPX = buf->getRawDouble(); + centerPY = buf->getRawDouble(); + DRW_DBG("\nview center X: "); DRW_DBG(centerPX); DRW_DBG(", Y: "); DRW_DBG(centerPX); + snapPX = buf->getRawDouble(); + snapPY = buf->getRawDouble(); + DRW_DBG("\nSnap base point X: "); DRW_DBG(snapPX); DRW_DBG(", Y: "); DRW_DBG(snapPY); + snapSpPX = buf->getRawDouble(); + snapSpPY = buf->getRawDouble(); + DRW_DBG("\nSnap spacing X: "); DRW_DBG(snapSpPX); DRW_DBG(", Y: "); DRW_DBG(snapSpPY); + //RLZ: need to complete + DRW_DBG("\nGrid spacing X: "); DRW_DBG(buf->getRawDouble()); DRW_DBG(", Y: "); DRW_DBG(buf->getRawDouble());DRW_DBG("\n"); + DRW_DBG("Circle zoom?: "); DRW_DBG(buf->getBitShort()); DRW_DBG("\n"); + } + if (version > DRW::AC1018) {//2007+ + DRW_DBG("Grid major?: "); DRW_DBG(buf->getBitShort()); DRW_DBG("\n"); + } + if (version > DRW::AC1014) {//2000+ + frozenLyCount = buf->getBitLong(); + DRW_DBG("Frozen Layer count?: "); DRW_DBG(frozenLyCount); DRW_DBG("\n"); + DRW_DBG("Status Flags?: "); DRW_DBG(buf->getBitLong()); DRW_DBG("\n"); + //RLZ: Warning needed separate string bufer + DRW_DBG("Style sheet?: "); DRW_DBG(sBuf->getVariableText(version, false)); DRW_DBG("\n"); + DRW_DBG("Render mode?: "); DRW_DBG(buf->getRawChar8()); DRW_DBG("\n"); + DRW_DBG("UCS OMore...: "); DRW_DBG(buf->getBit()); DRW_DBG("\n"); + DRW_DBG("UCS VMore...: "); DRW_DBG(buf->getBit()); DRW_DBG("\n"); + DRW_DBG("UCS OMore...: "); DRW_DBGPT(buf->getBitDouble(), buf->getBitDouble(), buf->getBitDouble()); DRW_DBG("\n"); + DRW_DBG("ucs XAMore...: "); DRW_DBGPT(buf->getBitDouble(), buf->getBitDouble(), buf->getBitDouble()); DRW_DBG("\n"); + DRW_DBG("UCS YMore....: "); DRW_DBGPT(buf->getBitDouble(), buf->getBitDouble(), buf->getBitDouble()); DRW_DBG("\n"); + DRW_DBG("UCS EMore...: "); DRW_DBG(buf->getBitDouble()); DRW_DBG("\n"); + DRW_DBG("UCS OVMore...: "); DRW_DBG(buf->getBitShort()); DRW_DBG("\n"); + } + if (version > DRW::AC1015) {//2004+ + DRW_DBG("ShadePlot Mode...: "); DRW_DBG(buf->getBitShort()); DRW_DBG("\n"); + } + if (version > DRW::AC1018) {//2007+ + DRW_DBG("Use def Ligth...: "); DRW_DBG(buf->getBit()); DRW_DBG("\n"); + DRW_DBG("Def ligth tipe?: "); DRW_DBG(buf->getRawChar8()); DRW_DBG("\n"); + DRW_DBG("Brightness: "); DRW_DBG(buf->getBitDouble()); DRW_DBG("\n"); + DRW_DBG("Contrast: "); DRW_DBG(buf->getBitDouble()); DRW_DBG("\n"); +// DRW_DBG("Ambient Cmc or Enc: "); DRW_DBG(buf->getCmColor(version)); DRW_DBG("\n"); + DRW_DBG("Ambient (Cmc or Enc?), Enc: "); DRW_DBG(buf->getEnColor(version)); DRW_DBG("\n"); + } + ret = DRW_Entity::parseDwgEntHandle(version, buf); + + dwgHandle someHdl; + if (version < DRW::AC1015) {//R13 & R14 only + DRW_DBG("\n Remaining bytes: "); DRW_DBG(buf->numRemainingBytes()); DRW_DBG("\n"); + someHdl = buf->getHandle(); + DRW_DBG("ViewPort ent header: "); DRW_DBGHL(someHdl.code, someHdl.size, someHdl.ref); DRW_DBG("\n"); + } + if (version > DRW::AC1014) {//2000+ + for (duint8 i=0; i < frozenLyCount; ++i){ + someHdl = buf->getHandle(); + DRW_DBG("Frozen layer handle "); DRW_DBG(i); DRW_DBG(": "); DRW_DBGHL(someHdl.code, someHdl.size, someHdl.ref); DRW_DBG("\n"); + } + someHdl = buf->getHandle(); + DRW_DBG("Clip bpundary handle: "); DRW_DBGHL(someHdl.code, someHdl.size, someHdl.ref); DRW_DBG("\n"); + if (version == DRW::AC1015) {//2000 only + someHdl = buf->getHandle(); + DRW_DBG("ViewPort ent header: "); DRW_DBGHL(someHdl.code, someHdl.size, someHdl.ref); DRW_DBG("\n"); + } + someHdl = buf->getHandle(); + DRW_DBG("Named ucs handle: "); DRW_DBGHL(someHdl.code, someHdl.size, someHdl.ref); DRW_DBG("\n"); + DRW_DBG("\n Remaining bytes: "); DRW_DBG(buf->numRemainingBytes()); DRW_DBG("\n"); + someHdl = buf->getHandle(); + DRW_DBG("base ucs handle: "); DRW_DBGHL(someHdl.code, someHdl.size, someHdl.ref); DRW_DBG("\n"); + } + if (version > DRW::AC1018) {//2007+ + someHdl = buf->getHandle(); + DRW_DBG("background handle: "); DRW_DBGHL(someHdl.code, someHdl.size, someHdl.ref); DRW_DBG("\n"); + someHdl = buf->getHandle(); + DRW_DBG("visual style handle: "); DRW_DBGHL(someHdl.code, someHdl.size, someHdl.ref); DRW_DBG("\n"); + someHdl = buf->getHandle(); + DRW_DBG("shadeplot ID handle: "); DRW_DBGHL(someHdl.code, someHdl.size, someHdl.ref); DRW_DBG("\n"); + DRW_DBG("\n Remaining bytes: "); DRW_DBG(buf->numRemainingBytes()); DRW_DBG("\n"); + someHdl = buf->getHandle(); + DRW_DBG("SUN handle: "); DRW_DBGHL(someHdl.code, someHdl.size, someHdl.ref); DRW_DBG("\n"); + } + DRW_DBG("\n Remaining bytes: "); DRW_DBG(buf->numRemainingBytes()); DRW_DBG("\n"); + + if (!ret) + return ret; + return buf->isGood(); +} diff --git a/extlib/libdxfrw/drw_entities.h b/extlib/libdxfrw/drw_entities.h new file mode 100644 index 0000000..be0ab82 --- /dev/null +++ b/extlib/libdxfrw/drw_entities.h @@ -0,0 +1,1572 @@ +/****************************************************************************** +** libDXFrw - Library to read/write DXF files (ascii & binary) ** +** ** +** Copyright (C) 2011-2015 José F. Soriano, rallazz@gmail.com ** +** ** +** This library is free software, licensed under the terms of the GNU ** +** General Public License as published by the Free Software Foundation, ** +** either version 2 of the License, or (at your option) any later version. ** +** You should have received a copy of the GNU General Public License ** +** along with this program. If not, see . ** +******************************************************************************/ + +#ifndef DRW_ENTITIES_H +#define DRW_ENTITIES_H + + +#include +#include +#include +#include "drw_base.h" + +class dxfReader; +class dwgBuffer; +class DRW_Polyline; + +namespace DRW { + + //! Entity's type. + enum ETYPE { + E3DFACE, +// E3DSOLID, //encripted propietry data +// ACAD_PROXY_ENTITY, + ARC, +// ATTDEF, +// ATTRIB, + BLOCK,// and ENDBLK +// BODY, //encripted propietry data + CIRCLE, + DIMENSION, + DIMALIGNED, + DIMLINEAR, + DIMRADIAL, + DIMDIAMETRIC, + DIMANGULAR, + DIMANGULAR3P, + DIMORDINATE, + ELLIPSE, + HATCH, +// HELIX, + IMAGE, + INSERT, + LEADER, +// LIGHT, + LINE, + LWPOLYLINE, +// MESH, +// MLINE, +// MLEADERSTYLE, +// MLEADER, + MTEXT, +// OLEFRAME, +// OLE2FRAME, + POINT, + POLYLINE, + RAY, +// REGION, //encripted propietry data +// SECTION, +// SEQEND,//not needed?? used in polyline and insert/attrib and dwg +// SHAPE, + SOLID, + SPLINE, +// SUN, +// SURFACE, //encripted propietry data can be four types +// TABLE, + TEXT, +// TOLERANCE, + TRACE, + UNDERLAY, + VERTEX, + VIEWPORT, +// WIPEOUT, //WIPEOUTVARIABLE + XLINE, + UNKNOWN + }; + +} +//only in DWG: MINSERT, 5 types of vertex, 4 types of polylines: 2d, 3d, pface & mesh +//shape, dictionary, MLEADER, MLEADERSTYLE + +#define SETENTFRIENDS friend class dxfRW; \ + friend class dwgReader; + +//! Base class for entities +/*! +* Base class for entities +* @author Rallaz +*/ +class DRW_Entity { + SETENTFRIENDS +public: + //initializes default values + DRW_Entity() { + eType = DRW::UNKNOWN; + handle = parentHandle = DRW::NoHandle; //no handle (0) + lineType = "BYLAYER"; + color = DRW::ColorByLayer; // default BYLAYER (256) + ltypeScale = 1.0; + visible = true; + layer = "0"; + lWeight = DRW_LW_Conv::widthByLayer; // default BYLAYER (dxf -1, dwg 29) + space = DRW::ModelSpace; // default ModelSpace (0) + haveExtrusion = false; + color24 = -1; //default -1 not set + numProxyGraph = 0; + shadow = DRW::CastAndReceieveShadows; + material = DRW::MaterialByLayer; + plotStyle = DRW::DefaultPlotStyle; + transparency = DRW::Opaque; + nextEntLink = prevEntLink = 0; + numReactors = xDictFlag = 0; + curr = NULL; + ownerHandle= false; + } + + DRW_Entity(const DRW_Entity& e) { + eType = e.eType; + handle = e.handle; + parentHandle = e.parentHandle; //no handle (0) + lineType = e.lineType; + color = e.color; // default BYLAYER (256) + ltypeScale = e.ltypeScale; + visible = e.visible; + layer = e.layer; + lWeight = e.lWeight; + space = e.space; + haveExtrusion = e.haveExtrusion; + color24 = e.color24; //default -1 not set + numProxyGraph = e.numProxyGraph; + shadow = e.shadow; + material = e.material; + plotStyle = e.plotStyle; + transparency = e.transparency; + nextEntLink = e.nextEntLink; + prevEntLink = e.prevEntLink; + numReactors = e.numReactors; + xDictFlag = e.xDictFlag; + curr = NULL; + ownerHandle= false; +// curr = e.curr; + for (std::vector::const_iterator it=e.extData.begin(); it!=e.extData.end(); ++it){ + extData.push_back(new DRW_Variant(*(*it))); + } + } + + virtual ~DRW_Entity() { + for (std::vector::iterator it=extData.begin(); it!=extData.end(); ++it) + delete *it; + + extData.clear(); + } + + void reset(){ + for (std::vector::iterator it=extData.begin(); it!=extData.end(); ++it) + delete *it; + extData.clear(); + } + + virtual void applyExtrusion() = 0; + + void setWidthMm(double millimeters) { + if(millimeters < 0.0) { + lWeight = DRW_LW_Conv::widthByLayer; + return; + } + if(millimeters > 2.11) millimeters = 2.11; + lWeight = DRW_LW_Conv::dxfInt2lineWidth(int(floor(millimeters * 100.0))); + } + +protected: + //parses dxf pair to read entity + bool parseCode(int code, dxfReader *reader); + //calculates extrusion axis (normal vector) + void calculateAxis(DRW_Coord extPoint); + //apply extrusion to @extPoint and return data in @point + void extrudePoint(DRW_Coord extPoint, DRW_Coord *point); + virtual bool parseDwg(DRW::Version version, dwgBuffer *buf, duint32 bs=0)=0; + //parses dwg common start part to read entity + bool parseDwg(DRW::Version version, dwgBuffer *buf, dwgBuffer* strBuf, duint32 bs=0); + //parses dwg common handles part to read entity + bool parseDwgEntHandle(DRW::Version version, dwgBuffer *buf); + + //parses dxf 102 groups to read entity + bool parseDxfGroups(int code, dxfReader *reader); + +public: + enum DRW::ETYPE eType; /*!< enum: entity type, code 0 */ + duint32 handle; /*!< entity identifier, code 5 */ + std::list > appData; /*!< list of application data, code 102 */ + duint32 parentHandle; /*!< Soft-pointer ID/handle to owner BLOCK_RECORD object, code 330 */ + DRW::Space space; /*!< space indicator, code 67*/ + UTF8STRING layer; /*!< layer name, code 8 */ + UTF8STRING lineType; /*!< line type, code 6 */ + duint32 material; /*!< hard pointer id to material object, code 347 */ + int color; /*!< entity color, code 62 */ + enum DRW_LW_Conv::lineWidth lWeight; /*!< entity lineweight, code 370 */ + double ltypeScale; /*!< linetype scale, code 48 */ + bool visible; /*!< entity visibility, code 60 */ + int numProxyGraph; /*!< Number of bytes in proxy graphics, code 92 */ + std::string proxyGraphics; /*!< proxy graphics bytes, code 310 */ + int color24; /*!< 24-bit color, code 420 */ + std::string colorName; /*!< color name, code 430 */ + int transparency; /*!< transparency, code 440 */ + int plotStyle; /*!< hard pointer id to plot style object, code 390 */ + DRW::ShadowMode shadow; /*!< shadow mode, code 284 */ + bool haveExtrusion; /*!< set to true if the entity have extrusion*/ + std::vector extData; /*!< FIFO list of extended data, codes 1000 to 1071*/ + +protected: //only for read dwg + duint8 haveNextLinks; //aka nolinks //B + duint8 plotFlags; //presence of plot style //BB + duint8 ltFlags; //presence of linetype handle //BB + duint8 materialFlag; //presence of material handle //BB + duint8 shadowFlag; //presence of shadow handle ?? (in dwg may be plotflag)//RC + dwgHandle lTypeH; + dwgHandle layerH; + duint32 nextEntLink; + duint32 prevEntLink; + bool ownerHandle; + + duint8 xDictFlag; + dint32 numReactors; // + duint32 objSize; //RL 32bits object data size in bits + dint16 oType; + +private: + DRW_Coord extAxisX; + DRW_Coord extAxisY; + DRW_Variant* curr; +}; + + +//! Class to handle point entity +/*! +* Class to handle point entity +* @author Rallaz +*/ +class DRW_Point : public DRW_Entity { + SETENTFRIENDS +public: + DRW_Point() { + eType = DRW::POINT; + basePoint.z = extPoint.x = extPoint.y = 0; + extPoint.z = 1; + thickness = 0; + } + + virtual void applyExtrusion(){} + +protected: + void parseCode(int code, dxfReader *reader); + virtual bool parseDwg(DRW::Version version, dwgBuffer *buf, duint32 bs=0); + +public: + DRW_Coord basePoint; /*!< base point, code 10, 20 & 30 */ + double thickness; /*!< thickness, code 39 */ + DRW_Coord extPoint; /*!< Dir extrusion normal vector, code 210, 220 & 230 */ + // TNick: we're not handling code 50 - Angle of the X axis for + // the UCS in effect when the point was drawn +}; + +//! Class to handle line entity +/*! +* Class to handle line entity +* @author Rallaz +*/ +class DRW_Line : public DRW_Point { + SETENTFRIENDS +public: + DRW_Line() { + eType = DRW::LINE; + secPoint.z = 0; + } + + virtual void applyExtrusion(){} + +protected: + void parseCode(int code, dxfReader *reader); + virtual bool parseDwg(DRW::Version version, dwgBuffer *buf, duint32 bs=0); + +public: + DRW_Coord secPoint; /*!< second point, code 11, 21 & 31 */ +}; + +//! Class to handle ray entity +/*! +* Class to handle ray entity +* @author Rallaz +*/ +class DRW_Ray : public DRW_Line { + SETENTFRIENDS +public: + DRW_Ray() { + eType = DRW::RAY; + } +protected: + virtual bool parseDwg(DRW::Version version, dwgBuffer *buf, duint32 bs=0); +}; + +//! Class to handle xline entity +/*! +* Class to handle xline entity +* @author Rallaz +*/ +class DRW_Xline : public DRW_Ray { +public: + DRW_Xline() { + eType = DRW::XLINE; + } +}; + +//! Class to handle circle entity +/*! +* Class to handle circle entity +* @author Rallaz +*/ +class DRW_Circle : public DRW_Point { + SETENTFRIENDS +public: + DRW_Circle() { + eType = DRW::CIRCLE; + } + + virtual void applyExtrusion(); + +protected: + void parseCode(int code, dxfReader *reader); + virtual bool parseDwg(DRW::Version version, dwgBuffer *buf, duint32 bs=0); + +public: + double radious; /*!< radius, code 40 */ +}; + +//! Class to handle arc entity +/*! +* Class to handle arc entity +* @author Rallaz +*/ +class DRW_Arc : public DRW_Circle { + SETENTFRIENDS +public: + DRW_Arc() { + eType = DRW::ARC; + isccw = 1; + } + + virtual void applyExtrusion(); + + //! center point in OCS + const DRW_Coord & center() { return basePoint; } + //! the radius of the circle + double radius() { return radious; } + //! start angle in radians + double startAngle() { return staangle; } + //! end angle in radians + double endAngle() { return endangle; } + //! thickness + double thick() { return thickness; } + //! extrusion + const DRW_Coord & extrusion() { return extPoint; } + +protected: + //! interpret code in dxf reading process or dispatch to inherited class + void parseCode(int code, dxfReader *reader); + //! interpret dwg data (was already determined to be part of this object) + virtual bool parseDwg(DRW::Version v, dwgBuffer *buf, duint32 bs=0); + +public: + double staangle; /*!< start angle, code 50 in radians*/ + double endangle; /*!< end angle, code 51 in radians */ + int isccw; /*!< is counter clockwise arc?, only used in hatch, code 73 */ +}; + +//! Class to handle ellipse entity +/*! +* Class to handle ellipse and elliptic arc entity +* Note: start/end parameter are in radians for ellipse entity but +* for hatch boundary are in degrees +* @author Rallaz +*/ +class DRW_Ellipse : public DRW_Line { + SETENTFRIENDS +public: + DRW_Ellipse() { + eType = DRW::ELLIPSE; + isccw = 1; + } + + void toPolyline(DRW_Polyline *pol, int parts = 128); + virtual void applyExtrusion(); + +protected: + //! interpret code in dxf reading process or dispatch to inherited class + void parseCode(int code, dxfReader *reader); + //! interpret dwg data (was already determined to be part of this object) + virtual bool parseDwg(DRW::Version v, dwgBuffer *buf, duint32 bs=0); + +private: + void correctAxis(); + +public: + double ratio; /*!< ratio, code 40 */ + double staparam; /*!< start parameter, code 41, 0.0 for full ellipse*/ + double endparam; /*!< end parameter, code 42, 2*PI for full ellipse */ + int isccw; /*!< is counter clockwise arc?, only used in hatch, code 73 */ +}; + +//! Class to handle trace entity +/*! +* Class to handle trace entity +* @author Rallaz +*/ +class DRW_Trace : public DRW_Line { + SETENTFRIENDS +public: + DRW_Trace() { + eType = DRW::TRACE; + thirdPoint.z = 0; + fourPoint.z = 0; + } + + virtual void applyExtrusion(); + +protected: + void parseCode(int code, dxfReader *reader); + virtual bool parseDwg(DRW::Version v, dwgBuffer *buf, duint32 bs=0); + +public: + DRW_Coord thirdPoint; /*!< third point, code 12, 22 & 32 */ + DRW_Coord fourPoint; /*!< four point, code 13, 23 & 33 */ +}; + +//! Class to handle solid entity +/*! +* Class to handle solid entity +* @author Rallaz +*/ +class DRW_Solid : public DRW_Trace { + SETENTFRIENDS +public: + DRW_Solid() { + eType = DRW::SOLID; + } + +protected: + //! interpret code in dxf reading process or dispatch to inherited class + void parseCode(int code, dxfReader *reader); + //! interpret dwg data (was already determined to be part of this object) + virtual bool parseDwg(DRW::Version v, dwgBuffer *buf, duint32 bs=0); + +public: + //! first corner (2D) + const DRW_Coord & firstCorner() { return basePoint; } + //! second corner (2D) + const DRW_Coord & secondCorner() { return secPoint; } + //! third corner (2D) + const DRW_Coord & thirdCorner() { return thirdPoint; } + //! fourth corner (2D) + const DRW_Coord & fourthCorner() { return thirdPoint; } + //! thickness + double thick() { return thickness; } + //! elevation + double elevation() { return basePoint.z; } + //! extrusion + const DRW_Coord & extrusion() { return extPoint; } + +}; + +//! Class to handle 3dface entity +/*! +* Class to handle 3dface entity +* @author Rallaz +*/ +class DRW_3Dface : public DRW_Trace { + SETENTFRIENDS +public: + enum InvisibleEdgeFlags { + NoEdge = 0x00, + FirstEdge = 0x01, + SecodEdge = 0x02, + ThirdEdge = 0x04, + FourthEdge = 0x08, + AllEdges = 0x0F + }; + + DRW_3Dface() { + eType = DRW::E3DFACE; + invisibleflag = 0; + } + + virtual void applyExtrusion(){} + + //! first corner in WCS + const DRW_Coord & firstCorner() { return basePoint; } + //! second corner in WCS + const DRW_Coord & secondCorner() { return secPoint; } + //! third corner in WCS + const DRW_Coord & thirdCorner() { return thirdPoint; } + //! fourth corner in WCS + const DRW_Coord & fourthCorner() { return fourPoint; } + //! edge visibility flags + InvisibleEdgeFlags edgeFlags() { return (InvisibleEdgeFlags)invisibleflag; } + +protected: + //! interpret code in dxf reading process or dispatch to inherited class + void parseCode(int code, dxfReader *reader); + //! interpret dwg data (was already determined to be part of this object) + virtual bool parseDwg(DRW::Version v, dwgBuffer *buf, duint32 bs=0); + +public: + int invisibleflag; /*!< invisible edge flag, code 70 */ + +}; + +//! Class to handle block entries +/*! +* Class to handle block entries +* @author Rallaz +*/ +class DRW_Block : public DRW_Point { + SETENTFRIENDS +public: + DRW_Block() { + eType = DRW::BLOCK; + layer = "0"; + flags = 0; + name = "*U0"; + isEnd = false; + } + + virtual void applyExtrusion(){} + +protected: + void parseCode(int code, dxfReader *reader); + virtual bool parseDwg(DRW::Version v, dwgBuffer *buf, duint32 bs=0); + +public: + UTF8STRING name; /*!< block name, code 2 */ + int flags; /*!< block type, code 70 */ +private: + bool isEnd; //for dwg parsing +}; + + +//! Class to handle insert entries +/*! +* Class to handle insert entries +* @author Rallaz +*/ +class DRW_Insert : public DRW_Point { + SETENTFRIENDS +public: + DRW_Insert() { + eType = DRW::INSERT; + xscale = 1; + yscale = 1; + zscale = 1; + angle = 0; + colcount = 1; + rowcount = 1; + colspace = 0; + rowspace = 0; + } + + virtual void applyExtrusion(){DRW_Point::applyExtrusion();} + +protected: + void parseCode(int code, dxfReader *reader); + virtual bool parseDwg(DRW::Version v, dwgBuffer *buf, duint32 bs=0); + +public: + UTF8STRING name; /*!< block name, code 2 */ + double xscale; /*!< x scale factor, code 41 */ + double yscale; /*!< y scale factor, code 42 */ + double zscale; /*!< z scale factor, code 43 */ + double angle; /*!< rotation angle in radians, code 50 */ + int colcount; /*!< column count, code 70 */ + int rowcount; /*!< row count, code 71 */ + double colspace; /*!< column space, code 44 */ + double rowspace; /*!< row space, code 45 */ +public: //only for read dwg + dwgHandle blockRecH; + dwgHandle seqendH; //RLZ: on implement attrib remove this handle from obj list (see pline/vertex code) +}; + +//! Class to handle lwpolyline entity +/*! +* Class to handle lwpolyline entity +* @author Rallaz +*/ +class DRW_LWPolyline : public DRW_Entity { + SETENTFRIENDS +public: + DRW_LWPolyline() { + eType = DRW::LWPOLYLINE; + elevation = thickness = width = 0.0; + flags = 0; + extPoint.x = extPoint.y = 0; + extPoint.z = 1; + vertex = NULL; + } + + DRW_LWPolyline(const DRW_LWPolyline& p):DRW_Entity(p){ + this->eType = DRW::LWPOLYLINE; + this->elevation = p.elevation; + this->thickness = p.thickness; + this->width = p.width; + this->flags = p.flags; + this->extPoint = p.extPoint; + this->vertex = NULL; + for (unsigned i=0; ivertlist.push_back( new DRW_Vertex2D( *(p.vertlist.at(i)) ) ); + + this->vertex = NULL; + } + + ~DRW_LWPolyline() { + for(DRW_Vertex2D *item : vertlist) delete item; + } + virtual void applyExtrusion(); + void addVertex (DRW_Vertex2D v) { + DRW_Vertex2D *vert = new DRW_Vertex2D(); + vert->x = v.x; + vert->y = v.y; + vert->stawidth = v.stawidth; + vert->endwidth = v.endwidth; + vert->bulge = v.bulge; + vertlist.push_back(vert); + } + DRW_Vertex2D *addVertex () { + DRW_Vertex2D *vert = new DRW_Vertex2D(); + vert->stawidth = 0; + vert->endwidth = 0; + vert->bulge = 0; + vertlist.push_back(vert); + return vert; + } + +protected: + void parseCode(int code, dxfReader *reader); + bool parseDwg(DRW::Version v, dwgBuffer *buf, duint32 bs=0); + +public: + int vertexnum; /*!< number of vertex, code 90 */ + int flags; /*!< polyline flag, code 70, default 0 */ + double width; /*!< constant width, code 43 */ + double elevation; /*!< elevation, code 38 */ + double thickness; /*!< thickness, code 39 */ + DRW_Coord extPoint; /*!< Dir extrusion normal vector, code 210, 220 & 230 */ + DRW_Vertex2D *vertex; /*!< current vertex to add data */ + std::vector vertlist; /*!< vertex list */ +}; + +//! Class to handle insert entries +/*! +* Class to handle insert entries +* @author Rallaz +*/ +class DRW_Text : public DRW_Line { + SETENTFRIENDS +public: + //! Vertical alignments. + enum VAlign { + VBaseLine = 0, /*!< Top = 0 */ + VBottom, /*!< Bottom = 1 */ + VMiddle, /*!< Middle = 2 */ + VTop /*!< Top = 3 */ + }; + + //! Horizontal alignments. + enum HAlign { + HLeft = 0, /*!< Left = 0 */ + HCenter, /*!< Centered = 1 */ + HRight, /*!< Right = 2 */ + HAligned, /*!< Aligned = 3 (if VAlign==0) */ + HMiddle, /*!< middle = 4 (if VAlign==0) */ + HFit /*!< fit into point = 5 (if VAlign==0) */ + }; + + DRW_Text() { + eType = DRW::TEXT; + angle = 0; + widthscale = 1; + oblique = 0; + style = "STANDARD"; + textgen = 0; + alignH = HLeft; + alignV = VBaseLine; + } + + virtual void applyExtrusion(){} //RLZ TODO + +protected: + void parseCode(int code, dxfReader *reader); + virtual bool parseDwg(DRW::Version version, dwgBuffer *buf, duint32 bs=0); + +public: + double height; /*!< height text, code 40 */ + UTF8STRING text; /*!< text string, code 1 */ + double angle; /*!< rotation angle in degrees (360), code 50 */ + double widthscale; /*!< width factor, code 41 */ + double oblique; /*!< oblique angle, code 51 */ + UTF8STRING style; /*!< style name, code 7 */ + int textgen; /*!< text generation, code 71 */ + enum HAlign alignH; /*!< horizontal align, code 72 */ + enum VAlign alignV; /*!< vertical align, code 73 */ + dwgHandle styleH; /*!< handle for text style */ +}; + +//! Class to handle insert entries +/*! +* Class to handle insert entries +* @author Rallaz +*/ +class DRW_MText : public DRW_Text { + SETENTFRIENDS +public: + //! Attachments. + enum Attach { + TopLeft = 1, + TopCenter, + TopRight, + MiddleLeft, + MiddleCenter, + MiddleRight, + BottomLeft, + BottomCenter, + BottomRight + }; + + DRW_MText() { + eType = DRW::MTEXT; + interlin = 1; + alignV = (VAlign)TopLeft; + textgen = 1; + haveXAxis = false; //if true needed to recalculate angle + } + +protected: + void parseCode(int code, dxfReader *reader); + void updateAngle(); //recalculate angle if 'haveXAxis' is true + virtual bool parseDwg(DRW::Version version, dwgBuffer *buf, duint32 bs=0); + +public: + double interlin; /*!< width factor, code 44 */ +private: + bool haveXAxis; +}; + +//! Class to handle vertex +/*! +* Class to handle vertex for polyline entity +* @author Rallaz +*/ +class DRW_Vertex : public DRW_Point { + SETENTFRIENDS +public: + DRW_Vertex() { + eType = DRW::VERTEX; + stawidth = endwidth = bulge = 0; + vindex1 = vindex2 = vindex3 = vindex4 = 0; + flags = identifier = 0; + } + DRW_Vertex(double sx, double sy, double sz, double b) { + stawidth = endwidth = 0; + vindex1 = vindex2 = vindex3 = vindex4 = 0; + flags = identifier = 0; + basePoint.x = sx; + basePoint.y =sy; + basePoint.z =sz; + bulge = b; + } + +protected: + void parseCode(int code, dxfReader *reader); + bool parseDwg(DRW::Version version, dwgBuffer *buf, duint32 bs=0, double el=0); + virtual bool parseDwg(DRW::Version version, dwgBuffer* buf, duint32 bs=0){ + DRW_UNUSED(version); DRW_UNUSED(buf); DRW_UNUSED(bs); return true;} + +public: + double stawidth; /*!< Start width, code 40 */ + double endwidth; /*!< End width, code 41 */ + double bulge; /*!< bulge, code 42 */ + + int flags; /*!< vertex flag, code 70, default 0 */ + double tgdir; /*!< curve fit tangent direction, code 50 */ + int vindex1; /*!< polyface mesh vertex index, code 71, default 0 */ + int vindex2; /*!< polyface mesh vertex index, code 72, default 0 */ + int vindex3; /*!< polyface mesh vertex index, code 73, default 0 */ + int vindex4; /*!< polyface mesh vertex index, code 74, default 0 */ + int identifier; /*!< vertex identifier, code 91, default 0 */ +}; + +//! Class to handle polyline entity +/*! +* Class to handle polyline entity +* @author Rallaz +*/ +class DRW_Polyline : public DRW_Point { + SETENTFRIENDS +public: + DRW_Polyline() { + eType = DRW::POLYLINE; + defstawidth = defendwidth = 0.0; + basePoint.x = basePoint.y = 0.0; + flags = vertexcount = facecount = 0; + smoothM = smoothN = curvetype = 0; + } + + DRW_Polyline(const DRW_Polyline& p) : DRW_Point(p) { + flags = p.flags ; + defstawidth = p.defstawidth; + defendwidth = p.defendwidth; + vertexcount = p.vertexcount; + facecount = p.facecount ; + smoothM = p.smoothM ; + smoothN = p.smoothN ; + curvetype = p.curvetype ; + for (unsigned i=0; ivertlist.push_back( new DRW_Vertex( *(p.vertlist.at(i)) ) ); + } + + ~DRW_Polyline() { + for(DRW_Vertex *item : vertlist) delete item; + } + void addVertex (DRW_Vertex v) { + DRW_Vertex *vert = new DRW_Vertex(); + vert->basePoint.x = v.basePoint.x; + vert->basePoint.y = v.basePoint.y; + vert->basePoint.z = v.basePoint.z; + vert->stawidth = v.stawidth; + vert->endwidth = v.endwidth; + vert->bulge = v.bulge; + vertlist.push_back(vert); + } + void appendVertex (DRW_Vertex *v) { + vertlist.push_back(v); + } + +protected: + void parseCode(int code, dxfReader *reader); + virtual bool parseDwg(DRW::Version version, dwgBuffer *buf, duint32 bs=0); + +public: + int flags; /*!< polyline flag, code 70, default 0 */ + double defstawidth; /*!< Start width, code 40, default 0 */ + double defendwidth; /*!< End width, code 41, default 0 */ + int vertexcount; /*!< polygon mesh M vertex or polyface vertex num, code 71, default 0 */ + int facecount; /*!< polygon mesh N vertex or polyface face num, code 72, default 0 */ + int smoothM; /*!< smooth surface M density, code 73, default 0 */ + int smoothN; /*!< smooth surface M density, code 74, default 0 */ + int curvetype; /*!< curves & smooth surface type, code 75, default 0 */ + + std::vector vertlist; /*!< vertex list */ + +private: + std::listhadlesList; //list of handles, only in 2004+ + duint32 firstEH; //handle of first entity, only in pre-2004 + duint32 lastEH; //handle of last entity, only in pre-2004 + dwgHandle seqEndH; //handle of SEQEND entity +}; + + +//! Class to handle spline entity +/*! +* Class to handle spline entity +* @author Rallaz +*/ +class DRW_Spline : public DRW_Entity { + SETENTFRIENDS +public: + DRW_Spline() { + eType = DRW::SPLINE; + flags = nknots = ncontrol = nfit = 0; + tolknot = tolcontrol = tolfit = 0.0000001; + + } + + DRW_Spline(const DRW_Spline& p):DRW_Entity(p){ + eType = DRW::SPLINE; + normalVec = p.normalVec ; + tgStart = p.tgStart ; + tgEnd = p.tgEnd ; + flags = p.flags ; + degree = p.degree ; + nknots = p.nknots ; + ncontrol = p.ncontrol ; + nfit = p.nfit ; + tolknot = p.tolknot ; + tolcontrol = p.tolcontrol; + tolfit = p.tolfit ; + + for(double v : p.knotslist) knotslist.push_back(v); + for(double v : p.weightlist) weightlist.push_back(v); + for(DRW_Coord *v : p.controllist) controllist.push_back(new DRW_Coord(*v)); + for(DRW_Coord *v : p.fitlist) fitlist.push_back(new DRW_Coord(*v)); + } + + ~DRW_Spline() { + for(DRW_Coord *item : controllist) delete item; + for(DRW_Coord *item : fitlist) delete item; + } + virtual void applyExtrusion(){} + +protected: + void parseCode(int code, dxfReader *reader); + virtual bool parseDwg(DRW::Version version, dwgBuffer *buf, duint32 bs=0); + +public: +// double ex; /*!< normal vector x coordinate, code 210 */ +// double ey; /*!< normal vector y coordinate, code 220 */ +// double ez; /*!< normal vector z coordinate, code 230 */ + DRW_Coord normalVec; /*!< normal vector, code 210, 220, 230 */ + DRW_Coord tgStart; /*!< start tangent, code 12, 22, 32 */ +// double tgsx; /*!< start tangent x coordinate, code 12 */ +// double tgsy; /*!< start tangent y coordinate, code 22 */ +// double tgsz; /*!< start tangent z coordinate, code 32 */ + DRW_Coord tgEnd; /*!< end tangent, code 13, 23, 33 */ +// double tgex; /*!< end tangent x coordinate, code 13 */ +// double tgey; /*!< end tangent y coordinate, code 23 */ +// double tgez; /*!< end tangent z coordinate, code 33 */ + int flags; /*!< spline flag, code 70 */ + int degree; /*!< degree of the spline, code 71 */ + dint32 nknots; /*!< number of knots, code 72, default 0 */ + dint32 ncontrol; /*!< number of control points, code 73, default 0 */ + dint32 nfit; /*!< number of fit points, code 74, default 0 */ + double tolknot; /*!< knot tolerance, code 42, default 0.0000001 */ + double tolcontrol; /*!< control point tolerance, code 43, default 0.0000001 */ + double tolfit; /*!< fit point tolerance, code 44, default 0.0000001 */ + + std::vector knotslist; /*!< knots list, code 40 */ + std::vector weightlist; /*!< weight list, code 41 */ + std::vector controllist; /*!< control points list, code 10, 20 & 30 */ + std::vector fitlist; /*!< fit points list, code 11, 21 & 31 */ + +private: + DRW_Coord *controlpoint; /*!< current control point to add data */ + DRW_Coord *fitpoint; /*!< current fit point to add data */ +}; + +//! Class to handle hatch loop +/*! +* Class to handle hatch loop +* @author Rallaz +*/ +class DRW_HatchLoop { +public: + DRW_HatchLoop(int t) { + type = t; + numedges = 0; + } + + ~DRW_HatchLoop() { + // for(DRW_LWPolyline *item : pollist) delete item; + for(DRW_Entity *item : objlist) delete item; + } + + void update() { + numedges = objlist.size(); + } + +public: + int type; /*!< boundary path type, code 92, polyline=2, default=0 */ + int numedges; /*!< number of edges (if not a polyline), code 93 */ +//TODO: store lwpolylines as entities +// std::vector pollist; /*!< polyline list */ + std::vector objlist; /*!< entities list */ +}; + +//! Class to handle hatch entity +/*! +* Class to handle hatch entity +* @author Rallaz +*/ +//TODO: handle lwpolylines, splines and ellipses +class DRW_Hatch : public DRW_Point { + SETENTFRIENDS +public: + DRW_Hatch() { + eType = DRW::HATCH; + angle = scale = 0.0; + basePoint.x = basePoint.y = basePoint.z = 0.0; + loopsnum = hstyle = associative = 0; + solid = hpattern = 1; + deflines = doubleflag = 0; + loop = NULL; + clearEntities(); + } + + ~DRW_Hatch() { + for(DRW_HatchLoop *item : looplist) delete item; + } + + void appendLoop (DRW_HatchLoop *v) { + looplist.push_back(v); + } + + virtual void applyExtrusion(){} + +protected: + void parseCode(int code, dxfReader *reader); + virtual bool parseDwg(DRW::Version version, dwgBuffer *buf, duint32 bs=0); + +public: + UTF8STRING name; /*!< hatch pattern name, code 2 */ + int solid; /*!< solid fill flag, code 70, solid=1, pattern=0 */ + int associative; /*!< associativity, code 71, associatve=1, non-assoc.=0 */ + int hstyle; /*!< hatch style, code 75 */ + int hpattern; /*!< hatch pattern type, code 76 */ + int doubleflag; /*!< hatch pattern double flag, code 77, double=1, single=0 */ + int loopsnum; /*!< namber of boundary paths (loops), code 91 */ + double angle; /*!< hatch pattern angle, code 52 */ + double scale; /*!< hatch pattern scale, code 41 */ + int deflines; /*!< number of pattern definition lines, code 78 */ + + std::vector looplist; /*!< polyline list */ + +private: + void clearEntities(){ + pt = line = NULL; + pline = NULL; + arc = NULL; + ellipse = NULL; + spline = NULL; + plvert = NULL; + } + + void addLine() { + clearEntities(); + if (loop) { + pt = line = new DRW_Line; + loop->objlist.push_back(line); + } + } + + void addArc() { + clearEntities(); + if (loop) { + pt = arc = new DRW_Arc; + loop->objlist.push_back(arc); + } + } + + void addEllipse() { + clearEntities(); + if (loop) { + pt = ellipse = new DRW_Ellipse; + loop->objlist.push_back(ellipse); + } + } + + void addSpline() { + clearEntities(); + if (loop) { + pt = NULL; + spline = new DRW_Spline; + loop->objlist.push_back(spline); + } + } + + DRW_HatchLoop *loop; /*!< current loop to add data */ + DRW_Line *line; + DRW_Arc *arc; + DRW_Ellipse *ellipse; + DRW_Spline *spline; + DRW_LWPolyline *pline; + DRW_Point *pt; + DRW_Vertex2D *plvert; + bool ispol; +}; + +//! Class to handle image entity +/*! +* Class to handle image entity +* @author Rallaz +*/ +class DRW_Image : public DRW_Line { + SETENTFRIENDS +public: + DRW_Image() { + eType = DRW::IMAGE; + fade = clip = 0; + brightness = contrast = 50; + } + +protected: + void parseCode(int code, dxfReader *reader); + virtual bool parseDwg(DRW::Version version, dwgBuffer *buf, duint32 bs=0); + +public: + duint32 ref; /*!< Hard reference to imagedef object, code 340 */ + DRW_Coord vVector; /*!< V-vector of single pixel, x coordinate, code 12, 22 & 32 */ +// double vx; /*!< V-vector of single pixel, x coordinate, code 12 */ +// double vy; /*!< V-vector of single pixel, y coordinate, code 22 */ +// double vz; /*!< V-vector of single pixel, z coordinate, code 32 */ + double sizeu; /*!< image size in pixels, U value, code 13 */ + double sizev; /*!< image size in pixels, V value, code 23 */ + double dz; /*!< z coordinate, code 33 */ + int clip; /*!< Clipping state, code 280, 0=off 1=on */ + int brightness; /*!< Brightness value, code 281, (0-100) default 50 */ + int contrast; /*!< Brightness value, code 282, (0-100) default 50 */ + int fade; /*!< Brightness value, code 283, (0-100) default 0 */ + +}; + + +//! Base class for dimension entity +/*! +* Base class for dimension entity +* @author Rallaz +*/ +class DRW_Dimension : public DRW_Entity { + SETENTFRIENDS +public: + DRW_Dimension() { + eType = DRW::DIMENSION; + type = 0; + linesty = 1; + linefactor = extPoint.z = 1.0; + angle = oblique = rot = 0.0; + align = 5; + style = "STANDARD"; + defPoint.z = extPoint.x = extPoint.y = 0; + textPoint.z = rot = 0; + clonePoint.x = clonePoint.y = clonePoint.z = 0; + length = 0.0; + hasActual = false; + actual = 0.0; + } + + DRW_Dimension(const DRW_Dimension& d): DRW_Entity(d) { + eType = DRW::DIMENSION; + type =d.type; + name = d.name; + defPoint = d.defPoint; + textPoint = d.textPoint; + text = d.text; + style = d.style; + align = d.align; + linesty = d.linesty; + linefactor = d.linefactor; + rot = d.rot; + extPoint = d.extPoint; + clonePoint = d.clonePoint; + def1 = d.def1; + def2 = d.def2; + angle = d.angle; + oblique = d.oblique; + arcPoint = d.arcPoint; + circlePoint = d.circlePoint; + length = d.length; + hasActual = d.hasActual; + actual = d.actual; + //RLZ needed a def value for this: hdir = ??? + } + virtual ~DRW_Dimension() {} + + virtual void applyExtrusion(){} + +protected: + void parseCode(int code, dxfReader *reader); + bool parseDwg(DRW::Version version, dwgBuffer *buf, dwgBuffer *sBuf); + virtual bool parseDwg(DRW::Version version, dwgBuffer* buf, duint32 bs=0){ + DRW_UNUSED(version); DRW_UNUSED(buf); DRW_UNUSED(bs); return true;} + +public: + DRW_Coord getDefPoint() const {return defPoint;} /*!< Definition point, code 10, 20 & 30 */ + void setDefPoint(const DRW_Coord p) {defPoint =p;} + DRW_Coord getTextPoint() const {return textPoint;} /*!< Middle point of text, code 11, 21 & 31 */ + void setTextPoint(const DRW_Coord p) {textPoint =p;} + std::string getStyle() const {return style;} /*!< Dimension style, code 3 */ + void setStyle(const std::string s) {style = s;} + int getAlign() const { return align;} /*!< attachment point, code 71 */ + void setAlign(const int a) { align = a;} + int getTextLineStyle() const { return linesty;} /*!< Dimension text line spacing style, code 72, default 1 */ + void setTextLineStyle(const int l) { linesty = l;} + std::string getText() const {return text;} /*!< Dimension text explicitly entered by the user, code 1 */ + void setText(const std::string t) {text = t;} + double getTextLineFactor() const { return linefactor;} /*!< Dimension text line spacing factor, code 41, default 1? */ + void setTextLineFactor(const double l) { linefactor = l;} + double getDir() const { return rot;} /*!< rotation angle of the dimension text, code 53 (optional) default 0 */ + void setDir(const double d) { rot = d;} + + DRW_Coord getExtrusion(){return extPoint;} /*!< extrusion, code 210, 220 & 230 */ + void setExtrusion(const DRW_Coord p) {extPoint =p;} + std::string getName(){return name;} /*!< Name of the block that contains the entities, code 2 */ + void setName(const std::string s) {name = s;} +// int getType(){ return type;} /*!< Dimension type, code 70 */ + bool hasActualMeasurement() const { return hasActual; } + void setActualMeasurement(double value) { hasActual = true; actual = value; } + double getActualMeasurement() const { return actual; } + +protected: + DRW_Coord getPt2() const {return clonePoint;} + void setPt2(const DRW_Coord p) {clonePoint= p;} + DRW_Coord getPt3() const {return def1;} + void setPt3(const DRW_Coord p) {def1= p;} + DRW_Coord getPt4() const {return def2;} + void setPt4(const DRW_Coord p) {def2= p;} + DRW_Coord getPt5() const {return circlePoint;} + void setPt5(const DRW_Coord p) {circlePoint= p;} + DRW_Coord getPt6() const {return arcPoint;} + void setPt6(const DRW_Coord p) {arcPoint= p;} + double getAn50() const {return angle;} /*!< Angle of rotated, horizontal, or vertical dimensions, code 50 */ + void setAn50(const double d) {angle = d;} + double getOb52() const {return oblique;} /*!< oblique angle, code 52 */ + void setOb52(const double d) {oblique = d;} + double getRa40() const {return length;} /*!< Leader length, code 40 */ + void setRa40(const double d) {length = d;} +public: + int type; /*!< Dimension type, code 70 */ +private: + std::string name; /*!< Name of the block that contains the entities, code 2 */ + DRW_Coord defPoint; /*!< definition point, code 10, 20 & 30 (WCS) */ + DRW_Coord textPoint; /*!< Middle point of text, code 11, 21 & 31 (OCS) */ + UTF8STRING text; /*!< Dimension text explicitly entered by the user, code 1 */ + UTF8STRING style; /*!< Dimension style, code 3 */ + int align; /*!< attachment point, code 71 */ + int linesty; /*!< Dimension text line spacing style, code 72, default 1 */ + double linefactor; /*!< Dimension text line spacing factor, code 41, default 1? (value range 0.25 to 4.00*/ + double rot; /*!< rotation angle of the dimension text, code 53 */ + DRW_Coord extPoint; /*!< extrusion normal vector, code 210, 220 & 230 */ + + double hdir; /*!< horizontal direction for the dimension, code 51, default ? */ + DRW_Coord clonePoint; /*!< Insertion point for clones (Baseline & Continue), code 12, 22 & 32 (OCS) */ + DRW_Coord def1; /*!< Definition point 1for linear & angular, code 13, 23 & 33 (WCS) */ + DRW_Coord def2; /*!< Definition point 2, code 14, 24 & 34 (WCS) */ + double angle; /*!< Angle of rotated, horizontal, or vertical dimensions, code 50 */ + double oblique; /*!< oblique angle, code 52 */ + + DRW_Coord circlePoint; /*!< Definition point for diameter, radius & angular dims code 15, 25 & 35 (WCS) */ + DRW_Coord arcPoint; /*!< Point defining dimension arc, x coordinate, code 16, 26 & 36 (OCS) */ + double length; /*!< Leader length, code 40 */ + bool hasActual; /*!< Actual measurement has been read, code 42 */ + double actual; /*!< Actual measurement (optional; read-only value), code 42 */ + +protected: + dwgHandle dimStyleH; + dwgHandle blockH; +}; + + +//! Class to handle aligned dimension entity +/*! +* Class to handle aligned dimension entity +* @author Rallaz +*/ +class DRW_DimAligned : public DRW_Dimension { + SETENTFRIENDS +public: + DRW_DimAligned(){ + eType = DRW::DIMALIGNED; + type = 1; + } + DRW_DimAligned(const DRW_Dimension& d): DRW_Dimension(d) { + eType = DRW::DIMALIGNED; + } + + DRW_Coord getClonepoint() const {return getPt2();} /*!< Insertion for clones (Baseline & Continue), 12, 22 & 32 */ + void setClonePoint(DRW_Coord c){setPt2(c);} + + DRW_Coord getDimPoint() const {return getDefPoint();} /*!< dim line location point, code 10, 20 & 30 */ + void setDimPoint(const DRW_Coord p){setDefPoint(p);} + DRW_Coord getDef1Point() const {return getPt3();} /*!< Definition point 1, code 13, 23 & 33 */ + void setDef1Point(const DRW_Coord p) {setPt3(p);} + DRW_Coord getDef2Point() const {return getPt4();} /*!< Definition point 2, code 14, 24 & 34 */ + void setDef2Point(const DRW_Coord p) {setPt4(p);} + +protected: + virtual bool parseDwg(DRW::Version version, dwgBuffer *buf, duint32 bs=0); +}; + +//! Class to handle linear or rotated dimension entity +/*! +* Class to handle linear or rotated dimension entity +* @author Rallaz +*/ +class DRW_DimLinear : public DRW_DimAligned { +public: + DRW_DimLinear() { + eType = DRW::DIMLINEAR; + type = 0; + } + DRW_DimLinear(const DRW_Dimension& d): DRW_DimAligned(d) { + eType = DRW::DIMLINEAR; + } + + double getAngle() const {return getAn50();} /*!< Angle of rotated, horizontal, or vertical dimensions, code 50 */ + void setAngle(const double d) {setAn50(d);} + double getOblique() const {return getOb52();} /*!< oblique angle, code 52 */ + void setOblique(const double d) {setOb52(d);} +}; + +//! Class to handle radial dimension entity +/*! +* Class to handle aligned, linear or rotated dimension entity +* @author Rallaz +*/ +class DRW_DimRadial : public DRW_Dimension { + SETENTFRIENDS +public: + DRW_DimRadial() { + eType = DRW::DIMRADIAL; + type = 4; + } + DRW_DimRadial(const DRW_Dimension& d): DRW_Dimension(d) { + eType = DRW::DIMRADIAL; + } + + DRW_Coord getCenterPoint() const {return getDefPoint();} /*!< center point, code 10, 20 & 30 */ + void setCenterPoint(const DRW_Coord p){setDefPoint(p);} + DRW_Coord getDiameterPoint() const {return getPt5();} /*!< Definition point for radius, code 15, 25 & 35 */ + void setDiameterPoint(const DRW_Coord p){setPt5(p);} + double getLeaderLength() const {return getRa40();} /*!< Leader length, code 40 */ + void setLeaderLength(const double d) {setRa40(d);} + +protected: + virtual bool parseDwg(DRW::Version version, dwgBuffer *buf, duint32 bs=0); +}; + +//! Class to handle radial dimension entity +/*! +* Class to handle aligned, linear or rotated dimension entity +* @author Rallaz +*/ +class DRW_DimDiametric : public DRW_Dimension { + SETENTFRIENDS +public: + DRW_DimDiametric() { + eType = DRW::DIMDIAMETRIC; + type = 3; + } + DRW_DimDiametric(const DRW_Dimension& d): DRW_Dimension(d) { + eType = DRW::DIMDIAMETRIC; + } + + DRW_Coord getDiameter1Point() const {return getPt5();} /*!< First definition point for diameter, code 15, 25 & 35 */ + void setDiameter1Point(const DRW_Coord p){setPt5(p);} + DRW_Coord getDiameter2Point() const {return getDefPoint();} /*!< Oposite point for diameter, code 10, 20 & 30 */ + void setDiameter2Point(const DRW_Coord p){setDefPoint(p);} + double getLeaderLength() const {return getRa40();} /*!< Leader length, code 40 */ + void setLeaderLength(const double d) {setRa40(d);} + +protected: + virtual bool parseDwg(DRW::Version version, dwgBuffer *buf, duint32 bs=0); +}; + +//! Class to handle angular dimension entity +/*! +* Class to handle angular dimension entity +* @author Rallaz +*/ +class DRW_DimAngular : public DRW_Dimension { + SETENTFRIENDS +public: + DRW_DimAngular() { + eType = DRW::DIMANGULAR; + type = 2; + } + DRW_DimAngular(const DRW_Dimension& d): DRW_Dimension(d) { + eType = DRW::DIMANGULAR; + } + + DRW_Coord getFirstLine1() const {return getPt3();} /*!< Definition point line 1-1, code 13, 23 & 33 */ + void setFirstLine1(const DRW_Coord p) {setPt3(p);} + DRW_Coord getFirstLine2() const {return getPt4();} /*!< Definition point line 1-2, code 14, 24 & 34 */ + void setFirstLine2(const DRW_Coord p) {setPt4(p);} + DRW_Coord getSecondLine1() const {return getPt5();} /*!< Definition point line 2-1, code 15, 25 & 35 */ + void setSecondLine1(const DRW_Coord p) {setPt5(p);} + DRW_Coord getSecondLine2() const {return getDefPoint();} /*!< Definition point line 2-2, code 10, 20 & 30 */ + void setSecondLine2(const DRW_Coord p){setDefPoint(p);} + DRW_Coord getDimPoint() const {return getPt6();} /*!< Dimension definition point, code 16, 26 & 36 */ + void setDimPoint(const DRW_Coord p) {setPt6(p);} + +protected: + virtual bool parseDwg(DRW::Version version, dwgBuffer *buf, duint32 bs=0); +}; + + +//! Class to handle angular 3p dimension entity +/*! +* Class to handle angular 3p dimension entity +* @author Rallaz +*/ +class DRW_DimAngular3p : public DRW_Dimension { + SETENTFRIENDS +public: + DRW_DimAngular3p() { + eType = DRW::DIMANGULAR3P; + type = 5; + } + DRW_DimAngular3p(const DRW_Dimension& d): DRW_Dimension(d) { + eType = DRW::DIMANGULAR3P; + } + + DRW_Coord getFirstLine() const {return getPt3();} /*!< Definition point line 1, code 13, 23 & 33 */ + void setFirstLine(const DRW_Coord p) {setPt3(p);} + DRW_Coord getSecondLine() const {return getPt4();} /*!< Definition point line 2, code 14, 24 & 34 */ + void setSecondLine(const DRW_Coord p) {setPt4(p);} + DRW_Coord getVertexPoint() const {return getPt5();} /*!< Vertex point, code 15, 25 & 35 */ + void SetVertexPoint(const DRW_Coord p) {setPt5(p);} + DRW_Coord getDimPoint() const {return getDefPoint();} /*!< Dimension definition point, code 10, 20 & 30 */ + void setDimPoint(const DRW_Coord p) {setDefPoint(p);} + +protected: + virtual bool parseDwg(DRW::Version version, dwgBuffer *buf, duint32 bs=0); +}; + +//! Class to handle ordinate dimension entity +/*! +* Class to handle ordinate dimension entity +* @author Rallaz +*/ +class DRW_DimOrdinate : public DRW_Dimension { + SETENTFRIENDS +public: + DRW_DimOrdinate() { + eType = DRW::DIMORDINATE; + type = 6; + } + DRW_DimOrdinate(const DRW_Dimension& d): DRW_Dimension(d) { + eType = DRW::DIMORDINATE; + } + + DRW_Coord getOriginPoint() const {return getDefPoint();} /*!< Origin definition point, code 10, 20 & 30 */ + void setOriginPoint(const DRW_Coord p) {setDefPoint(p);} + DRW_Coord getFirstLine() const {return getPt3();} /*!< Feature location point, code 13, 23 & 33 */ + void setFirstLine(const DRW_Coord p) {setPt3(p);} + DRW_Coord getSecondLine() const {return getPt4();} /*!< Leader end point, code 14, 24 & 34 */ + void setSecondLine(const DRW_Coord p) {setPt4(p);} + +protected: + virtual bool parseDwg(DRW::Version version, dwgBuffer *buf, duint32 bs=0); +}; + + +//! Class to handle leader entity +/*! +* Class to handle leader entity +* @author Rallaz +*/ +class DRW_Leader : public DRW_Entity { + SETENTFRIENDS +public: + DRW_Leader() { + eType = DRW::LEADER; + flag = 3; + hookflag = vertnum = leadertype = 0; + extrusionPoint.x = extrusionPoint.y = 0.0; + arrow = 1; + extrusionPoint.z = 1.0; + } + ~DRW_Leader() { + for(DRW_Coord *item : vertexlist) delete item; + } + + virtual void applyExtrusion(){} + +protected: + void parseCode(int code, dxfReader *reader); + virtual bool parseDwg(DRW::Version version, dwgBuffer *buf, duint32 bs=0); + +public: + UTF8STRING style; /*!< Dimension style name, code 3 */ + int arrow; /*!< Arrowhead flag, code 71, 0=Disabled; 1=Enabled */ + int leadertype; /*!< Leader path type, code 72, 0=Straight line segments; 1=Spline */ + int flag; /*!< Leader creation flag, code 73, default 3 */ + int hookline; /*!< Hook line direction flag, code 74, default 1 */ + int hookflag; /*!< Hook line flag, code 75 */ + double textheight; /*!< Text annotation height, code 40 */ + double textwidth; /*!< Text annotation width, code 41 */ + int vertnum; /*!< Number of vertices, code 76 */ + int coloruse; /*!< Color to use if leader's DIMCLRD = BYBLOCK, code 77 */ + duint32 annotHandle; /*!< Hard reference to associated annotation, code 340 */ + DRW_Coord extrusionPoint; /*!< Normal vector, code 210, 220 & 230 */ + DRW_Coord horizdir; /*!< "Horizontal" direction for leader, code 211, 221 & 231 */ + DRW_Coord offsetblock; /*!< Offset of last leader vertex from block, code 212, 222 & 232 */ + DRW_Coord offsettext; /*!< Offset of last leader vertex from annotation, code 213, 223 & 233 */ + + std::vector vertexlist; /*!< vertex points list, code 10, 20 & 30 */ + +private: + DRW_Coord *vertexpoint; /*!< current control point to add data */ + dwgHandle dimStyleH; + dwgHandle AnnotH; +}; + +//! Class to handle viewport entity +/*! +* Class to handle viewport entity +* @author Rallaz +*/ +class DRW_Viewport : public DRW_Point { + SETENTFRIENDS +public: + DRW_Viewport() { + eType = DRW::VIEWPORT; + vpstatus = 0; + pswidth = 205; + psheight = 156; + centerPX = 128.5; + centerPY = 97.5; + } + + virtual void applyExtrusion(){} + +protected: + void parseCode(int code, dxfReader *reader); + virtual bool parseDwg(DRW::Version version, dwgBuffer *buf, duint32 bs=0); + +public: + double pswidth; /*!< Width in paper space units, code 40 */ + double psheight; /*!< Height in paper space units, code 41 */ + int vpstatus; /*!< Viewport status, code 68 */ + int vpID; /*!< Viewport ID, code 69 */ + double centerPX; /*!< view center point X, code 12 */ + double centerPY; /*!< view center point Y, code 22 */ + double snapPX; /*!< Snap base point X, code 13 */ + double snapPY; /*!< Snap base point Y, code 23 */ + double snapSpPX; /*!< Snap spacing X, code 14 */ + double snapSpPY; /*!< Snap spacing Y, code 24 */ + //TODO: complete in dxf + DRW_Coord viewDir; /*!< View direction vector, code 16, 26 & 36 */ + DRW_Coord viewTarget; /*!< View target point, code 17, 27, 37 */ + double viewLength; /*!< Perspective lens length, code 42 */ + double frontClip; /*!< Front clip plane Z value, code 43 */ + double backClip; /*!< Back clip plane Z value, code 44 */ + double viewHeight; /*!< View height in model space units, code 45 */ + double snapAngle; /*!< Snap angle, code 50 */ + double twistAngle; /*!< view twist angle, code 51 */ + +private: + duint32 frozenLyCount; +};//RLZ: missing 15,25, 72, 331, 90, 340, 1, 281, 71, 74, 110, 120, 130, 111, 121,131, 112,122, 132, 345,346, and more... + +//used //DRW_Coord basePoint; /*!< base point, code 10, 20 & 30 */ + +//double thickness; /*!< thickness, code 39 */ +//DRW_Coord extPoint; /*!< Dir extrusion normal vector, code 210, 220 & 230 */ +//enum DRW::ETYPE eType; /*!< enum: entity type, code 0 */ +//duint32 handle; /*!< entity identifier, code 5 */ +//std::list > appData; /*!< list of application data, code 102 */ +//duint32 parentHandle; /*!< Soft-pointer ID/handle to owner BLOCK_RECORD object, code 330 */ +//DRW::Space space; /*!< space indicator, code 67*/ +//UTF8STRING layer; /*!< layer name, code 8 */ +//UTF8STRING lineType; /*!< line type, code 6 */ +//duint32 material; /*!< hard pointer id to material object, code 347 */ +//int color; /*!< entity color, code 62 */ +//enum DRW_LW_Conv::lineWidth lWeight; /*!< entity lineweight, code 370 */ +//double ltypeScale; /*!< linetype scale, code 48 */ +//bool visible; /*!< entity visibility, code 60 */ +//int numProxyGraph; /*!< Number of bytes in proxy graphics, code 92 */ +//std::string proxyGraphics; /*!< proxy graphics bytes, code 310 */ +//int color24; /*!< 24-bit color, code 420 */ +//std::string colorName; /*!< color name, code 430 */ +//int transparency; /*!< transparency, code 440 */ +//int plotStyle; /*!< hard pointer id to plot style object, code 390 */ +//DRW::ShadowMode shadow; /*!< shadow mode, code 284 */ +//bool haveExtrusion; /*!< set to true if the entity have extrusion*/ + +#endif + +// EOF diff --git a/extlib/libdxfrw/drw_header.cpp b/extlib/libdxfrw/drw_header.cpp new file mode 100644 index 0000000..47e0643 --- /dev/null +++ b/extlib/libdxfrw/drw_header.cpp @@ -0,0 +1,2476 @@ +/****************************************************************************** +** libDXFrw - Library to read/write DXF files (ascii & binary) ** +** ** +** Copyright (C) 2011-2015 José F. Soriano, rallazz@gmail.com ** +** ** +** This library is free software, licensed under the terms of the GNU ** +** General Public License as published by the Free Software Foundation, ** +** either version 2 of the License, or (at your option) any later version. ** +** You should have received a copy of the GNU General Public License ** +** along with this program. If not, see . ** +******************************************************************************/ + +#include "drw_header.h" +#include "intern/dxfreader.h" +#include "intern/dxfwriter.h" +#include "intern/drw_dbg.h" +#include "intern/dwgbuffer.h" + +DRW_Header::DRW_Header() { + linetypeCtrl = layerCtrl = styleCtrl = dimstyleCtrl = appidCtrl = 0; + blockCtrl = viewCtrl = ucsCtrl = vportCtrl = vpEntHeaderCtrl = 0; + version = DRW::AC1021; +} + +void DRW_Header::addComment(std::string c){ + if (!comments.empty()) + comments += '\n'; + comments += c; +} + +void DRW_Header::parseCode(int code, dxfReader *reader){ + switch (code) { + case 9: + curr = new DRW_Variant(); + name = reader->getString(); + if (version < DRW::AC1015 && name == "$DIMUNIT") + name="$DIMLUNIT"; + vars[name]=curr; + break; + case 1: + curr->addString(reader->getUtf8String()); + if (name =="$ACADVER") { + reader->setVersion(curr->content.s, true); + version = reader->getVersion(); + } + curr->code = code; + break; + case 2: + curr->addString(reader->getUtf8String()); + curr->code = code; + break; + case 3: + curr->addString(reader->getUtf8String()); + if (name =="$DWGCODEPAGE") { + reader->setCodePage(curr->content.s); + curr->addString(reader->getCodePage()); + } + curr->code = code; + break; + case 6: + curr->addString(reader->getUtf8String()); + curr->code = code; + break; + case 7: + curr->addString(reader->getUtf8String()); + curr->code = code; + break; + case 8: + curr->addString(reader->getUtf8String()); + curr->code = code; + break; + case 10: + curr->addCoord(); + curr->setCoordX(reader->getDouble()); + curr->code = code; + break; + case 20: + curr->setCoordY(reader->getDouble()); + break; + case 30: + curr->setCoordZ(reader->getDouble()); + curr->code = code; + break; + case 40: + curr->addDouble(reader->getDouble()); + curr->code = code; + break; + case 50: + curr->addDouble(reader->getDouble()); + curr->code = code; + break; + case 62: + curr->addInt(reader->getInt32()); + curr->code = code; + break; + case 70: + curr->addInt(reader->getInt32()); + curr->code = code; + break; + case 280: + curr->addInt(reader->getInt32()); + curr->code = code; + break; + case 290: + curr->addInt(reader->getInt32()); + curr->code = code; + break; + case 370: + curr->addInt(reader->getInt32()); + curr->code = code; + break; + case 380: + curr->addInt(reader->getInt32()); + curr->code = code; + break; + case 390: + curr->addString(reader->getUtf8String()); + curr->code = code; + break; + default: + break; + } +} + +void DRW_Header::write(dxfWriter *writer, DRW::Version ver){ +/*RLZ: TODO complete all vars to AC1024*/ + double varDouble; + int varInt; + std::string varStr; + DRW_Coord varCoord; + writer->writeString(2, "HEADER"); + writer->writeString(9, "$ACADVER"); + switch (ver) { + case DRW::AC1006: //unsupported version acad 10 + case DRW::AC1009: //acad 11 & 12 + varStr = "AC1009"; + break; + case DRW::AC1012: //unsupported version acad 13 + case DRW::AC1014: //acad 14 + varStr = "AC1014"; + break; + case DRW::AC1015: //acad 2000 + varStr = "AC1015"; + break; + case DRW::AC1018: //acad 2004 + varStr = "AC1018"; + break; +/* case DRW::AC1021: //acad 2007 + varStr = "AC1021"; + break;*/ + case DRW::AC1024: //acad 2010 + varStr = "AC1024"; + break; + case DRW::AC1027: //acad 2013 + varStr = "AC1027"; + break; + default: //acad 2007 default version + varStr = "AC1021"; + break; + } + writer->writeString(1, varStr); + writer->setVersion(&varStr, true); + + getStr("$ACADVER", &varStr); + getStr("$ACADMAINTVER", &varStr); + + if (!getStr("$DWGCODEPAGE", &varStr)) { + varStr = "ANSI_1252"; + } + writer->writeString(9, "$DWGCODEPAGE"); + writer->setCodePage(&varStr); + writer->writeString(3, writer->getCodePage() ); + writer->writeString(9, "$INSBASE"); + if (getCoord("$INSBASE", &varCoord)) { + writer->writeDouble(10, varCoord.x); + writer->writeDouble(20, varCoord.y); + writer->writeDouble(30, varCoord.z); + } else { + writer->writeDouble(10, 0.0); + writer->writeDouble(20, 0.0); + writer->writeDouble(30, 0.0); + } + writer->writeString(9, "$EXTMIN"); + if (getCoord("$EXTMIN", &varCoord)) { + writer->writeDouble(10, varCoord.x); + writer->writeDouble(20, varCoord.y); + writer->writeDouble(30, varCoord.z); + } else { + writer->writeDouble(10, 1.0000000000000000E+020); + writer->writeDouble(20, 1.0000000000000000E+020); + writer->writeDouble(30, 1.0000000000000000E+020); + } + writer->writeString(9, "$EXTMAX"); + if (getCoord("$EXTMAX", &varCoord)) { + writer->writeDouble(10, varCoord.x); + writer->writeDouble(20, varCoord.y); + writer->writeDouble(30, varCoord.z); + } else { + writer->writeDouble(10, -1.0000000000000000E+020); + writer->writeDouble(20, -1.0000000000000000E+020); + writer->writeDouble(30, -1.0000000000000000E+020); + } + writer->writeString(9, "$LIMMIN"); + if (getCoord("$LIMMIN", &varCoord)) { + writer->writeDouble(10, varCoord.x); + writer->writeDouble(20, varCoord.y); + } else { + writer->writeDouble(10, 0.0); + writer->writeDouble(20, 0.0); + } + writer->writeString(9, "$LIMMAX"); + if (getCoord("$LIMMAX", &varCoord)) { + writer->writeDouble(10, varCoord.x); + writer->writeDouble(20, varCoord.y); + } else { + writer->writeDouble(10, 420.0); + writer->writeDouble(20, 297.0); + } + writer->writeString(9, "$ORTHOMODE"); + if (getInt("$ORTHOMODE", &varInt)) + writer->writeInt16(70, varInt); + else + writer->writeInt16(70, 0); + writer->writeString(9, "$REGENMODE"); + if (getInt("$REGENMODE", &varInt)) + writer->writeInt16(70, varInt); + else + writer->writeInt16(70, 1); + writer->writeString(9, "$FILLMODE"); + if (getInt("$FILLMODE", &varInt)) + writer->writeInt16(70, varInt); + else + writer->writeInt16(70, 1); + writer->writeString(9, "$QTEXTMODE"); + if (getInt("$QTEXTMODE", &varInt)) + writer->writeInt16(70, varInt); + else + writer->writeInt16(70, 0); + writer->writeString(9, "$MIRRTEXT"); + if (getInt("$MIRRTEXT", &varInt)) + writer->writeInt16(70, varInt); + else + writer->writeInt16(70, 0); + if (ver == DRW::AC1009){ + writer->writeString(9, "$DRAGMODE"); + if (getInt("$DRAGMODE", &varInt)) + writer->writeInt16(70, varInt); + else + writer->writeInt16(70, 2); + } + writer->writeString(9, "$LTSCALE"); + if (getDouble("$LTSCALE", &varDouble)) + writer->writeDouble(40, varDouble); + else + writer->writeDouble(40, 1.0); + if (ver == DRW::AC1009){ + writer->writeString(9, "$OSMODE"); + if (getInt("$OSMODE", &varInt)) + writer->writeInt16(70, varInt); + else + writer->writeInt16(70, 0); + } + writer->writeString(9, "$ATTMODE"); + if (getInt("$ATTMODE", &varInt)) + writer->writeInt16(70, varInt); + else + writer->writeInt16(70, 0); + writer->writeString(9, "$TEXTSIZE"); + if (getDouble("$TEXTSIZE", &varDouble)) + writer->writeDouble(40, varDouble); + else + writer->writeDouble(40, 2.5); + writer->writeString(9, "$TRACEWID"); + if (getDouble("$TRACEWID", &varDouble)) + writer->writeDouble(40, varDouble); + else + writer->writeDouble(40, 15.68); + writer->writeString(9, "$TEXTSTYLE"); + if (getStr("$TEXTSTYLE", &varStr)) + if (ver == DRW::AC1009) + writer->writeUtf8Caps(7, varStr); + else + writer->writeUtf8String(7, varStr); + else + writer->writeString(7, "STANDARD"); + writer->writeString(9, "$CLAYER"); + if (getStr("$CLAYER", &varStr)) + if (ver == DRW::AC1009) + writer->writeUtf8Caps(8, varStr); + else + writer->writeUtf8String(8, varStr); + else + writer->writeString(8, "0"); + writer->writeString(9, "$CELTYPE"); + if (getStr("$CELTYPE", &varStr)) + if (ver == DRW::AC1009) + writer->writeUtf8Caps(6, varStr); + else + writer->writeUtf8String(6, varStr); + else + writer->writeString(6, "BYLAYER"); + writer->writeString(9, "$CECOLOR"); + if (getInt("$CECOLOR", &varInt)) + writer->writeInt16(62, varInt); + else + writer->writeInt16(62, 256); + if (ver > DRW::AC1009){ + writer->writeString(9, "$CELTSCALE"); + if (getDouble("$CELTSCALE", &varDouble)) + writer->writeDouble(40, varDouble); + else + writer->writeDouble(40, 1.0); + writer->writeString(9, "$DISPSILH"); + if (getInt("$DISPSILH", &varInt)) + writer->writeInt16(70, varInt); + else + writer->writeInt16(70, 0); + } + + writer->writeString(9, "$DIMSCALE"); + if (getDouble("$DIMSCALE", &varDouble)) + writer->writeDouble(40, varDouble); + else + writer->writeDouble(40, 1.0); + writer->writeString(9, "$DIMASZ"); + if (getDouble("$DIMASZ", &varDouble)) + writer->writeDouble(40, varDouble); + else + writer->writeDouble(40, 2.5); + writer->writeString(9, "$DIMEXO"); + if (getDouble("$DIMEXO", &varDouble)) + writer->writeDouble(40, varDouble); + else + writer->writeDouble(40, 0.625); + writer->writeString(9, "$DIMDLI"); + if (getDouble("$DIMDLI", &varDouble)) + writer->writeDouble(40, varDouble); + else + writer->writeDouble(40, 3.75); + writer->writeString(9, "$DIMRND"); + if (getDouble("$DIMRND", &varDouble)) + writer->writeDouble(40, varDouble); + else + writer->writeDouble(40, 0.0); + writer->writeString(9, "$DIMDLE"); + if (getDouble("$DIMDLE", &varDouble)) + writer->writeDouble(40, varDouble); + else + writer->writeDouble(40, 0.0); + writer->writeString(9, "$DIMEXE"); + if (getDouble("$DIMEXE", &varDouble)) + writer->writeDouble(40, varDouble); + else + writer->writeDouble(40, 1.25); + writer->writeString(9, "$DIMTP"); + if (getDouble("$DIMTP", &varDouble)) + writer->writeDouble(40, varDouble); + else + writer->writeDouble(40, 0.0); + writer->writeString(9, "$DIMTM"); + if (getDouble("$DIMTM", &varDouble)) + writer->writeDouble(40, varDouble); + else + writer->writeDouble(40, 0.0); + writer->writeString(9, "$DIMTXT"); + if (getDouble("$DIMTXT", &varDouble)) + writer->writeDouble(40, varDouble); + else + writer->writeDouble(40, 2.5); + writer->writeString(9, "$DIMCEN"); + if (getDouble("$DIMCEN", &varDouble)) + writer->writeDouble(40, varDouble); + else + writer->writeDouble(40, 2.5); + writer->writeString(9, "$DIMTSZ"); + if (getDouble("$DIMTSZ", &varDouble)) + writer->writeDouble(40, varDouble); + else + writer->writeDouble(40, 0.0); + writer->writeString(9, "$DIMTOL"); + if (getInt("$DIMTOL", &varInt)) + writer->writeInt16(70, varInt); + else + writer->writeInt16(70, 0); + writer->writeString(9, "$DIMLIM"); + if (getInt("$DIMLIM", &varInt)) + writer->writeInt16(70, varInt); + else + writer->writeInt16(70, 0); + writer->writeString(9, "$DIMTIH"); + if (getInt("$DIMTIH", &varInt)) + writer->writeInt16(70, varInt); + else + writer->writeInt16(70, 0); + writer->writeString(9, "$DIMTOH"); + if (getInt("$DIMTOH", &varInt)) + writer->writeInt16(70, varInt); + else + writer->writeInt16(70, 0); + writer->writeString(9, "$DIMSE1"); + if (getInt("$DIMSE1", &varInt)) + writer->writeInt16(70, varInt); + else + writer->writeInt16(70, 0); + writer->writeString(9, "$DIMSE2"); + if (getInt("$DIMSE2", &varInt)) + writer->writeInt16(70, varInt); + else + writer->writeInt16(70, 0); + writer->writeString(9, "$DIMTAD"); + if (getInt("$DIMTAD", &varInt)) + writer->writeInt16(70, varInt); + else + writer->writeInt16(70, 1); + writer->writeString(9, "$DIMZIN"); + if (getInt("$DIMZIN", &varInt)) + writer->writeInt16(70, varInt); + else + writer->writeInt16(70, 8); + writer->writeString(9, "$DIMBLK"); + if (getStr("$DIMBLK", &varStr)) + if (ver == DRW::AC1009) + writer->writeUtf8Caps(1, varStr); + else + writer->writeUtf8String(1, varStr); + else + writer->writeString(1, ""); + writer->writeString(9, "$DIMASO"); + if (getInt("$DIMASO", &varInt)) + writer->writeInt16(70, varInt); + else + writer->writeInt16(70, 1); + writer->writeString(9, "$DIMSHO"); + if (getInt("$DIMSHO", &varInt)) + writer->writeInt16(70, varInt); + else + writer->writeInt16(70, 1); + writer->writeString(9, "$DIMPOST"); + if (getStr("$DIMPOST", &varStr)) + if (ver == DRW::AC1009) + writer->writeUtf8Caps(1, varStr); + else + writer->writeUtf8String(1, varStr); + else + writer->writeString(1, ""); + writer->writeString(9, "$DIMAPOST"); + if (getStr("$DIMAPOST", &varStr)) + if (ver == DRW::AC1009) + writer->writeUtf8Caps(1, varStr); + else + writer->writeUtf8String(1, varStr); + else + writer->writeString(1, ""); + writer->writeString(9, "$DIMALT"); + if (getInt("$DIMALT", &varInt)) + writer->writeInt16(70, varInt); + else + writer->writeInt16(70, 0); + writer->writeString(9, "$DIMALTD"); + if (getInt("$DIMALTD", &varInt)) + writer->writeInt16(70, varInt); + else + writer->writeInt16(70, 3); + writer->writeString(9, "$DIMALTF"); + if (getDouble("$DIMALTF", &varDouble)) + writer->writeDouble(40, varDouble); + else + writer->writeDouble(40, 0.03937); + writer->writeString(9, "$DIMLFAC"); + if (getDouble("$DIMLFAC", &varDouble)) + writer->writeDouble(40, varDouble); + else + writer->writeDouble(40, 1.0); + writer->writeString(9, "$DIMTOFL"); + if (getInt("$DIMTOFL", &varInt)) + writer->writeInt16(70, varInt); + else + writer->writeInt16(70, 1); + writer->writeString(9, "$DIMTVP"); + if (getDouble("$DIMTVP", &varDouble)) + writer->writeDouble(40, varDouble); + else + writer->writeDouble(40, 0.0); + writer->writeString(9, "$DIMTIX"); + if (getInt("$DIMTIX", &varInt)) + writer->writeInt16(70, varInt); + else + writer->writeInt16(70, 0); + writer->writeString(9, "$DIMSOXD"); + if (getInt("$DIMSOXD", &varInt)) + writer->writeInt16(70, varInt); + else + writer->writeInt16(70, 0); + writer->writeString(9, "$DIMSAH"); + if (getInt("$DIMSAH", &varInt)) + writer->writeInt16(70, varInt); + else + writer->writeInt16(70, 0); + writer->writeString(9, "$DIMBLK1"); + if (getStr("$DIMBLK1", &varStr)) + if (ver == DRW::AC1009) + writer->writeUtf8Caps(1, varStr); + else + writer->writeUtf8String(1, varStr); + else + writer->writeString(1, ""); + writer->writeString(9, "$DIMBLK2"); + if (getStr("$DIMBLK2", &varStr)) + if (ver == DRW::AC1009) + writer->writeUtf8Caps(1, varStr); + else + writer->writeUtf8String(1, varStr); + else + writer->writeString(1, ""); + writer->writeString(9, "$DIMSTYLE"); + if (getStr("$DIMSTYLE", &varStr)) + if (ver == DRW::AC1009) + writer->writeUtf8Caps(2, varStr); + else + writer->writeUtf8String(2, varStr); + else + writer->writeString(2, "STANDARD"); + writer->writeString(9, "$DIMCLRD"); + if (getInt("$DIMCLRD", &varInt)) + writer->writeInt16(70, varInt); + else + writer->writeInt16(70, 0); + writer->writeString(9, "$DIMCLRE"); + if (getInt("$DIMCLRE", &varInt)) + writer->writeInt16(70, varInt); + else + writer->writeInt16(70, 0); + writer->writeString(9, "$DIMCLRT"); + if (getInt("$DIMCLRT", &varInt)) + writer->writeInt16(70, varInt); + else + writer->writeInt16(70, 0); + writer->writeString(9, "$DIMTFAC"); + if (getDouble("$DIMTFAC", &varDouble)) + writer->writeDouble(40, varDouble); + else + writer->writeDouble(40, 1.0); + writer->writeString(9, "$DIMGAP"); + if (getDouble("$DIMGAP", &varDouble)) + writer->writeDouble(40, varDouble); + else + writer->writeDouble(40, 0.625); + //post r12 dim vars + if (ver > DRW::AC1009) { + writer->writeString(9, "$DIMJUST"); + if (getInt("$DIMJUST", &varInt)) + writer->writeInt16(70, varInt); + else + writer->writeInt16(70, 0); + writer->writeString(9, "$DIMSD1"); + if (getInt("$DIMSD1", &varInt)) + writer->writeInt16(70, varInt); + else + writer->writeInt16(70, 0); + writer->writeString(9, "$DIMSD2"); + if (getInt("$DIMSD2", &varInt)) + writer->writeInt16(70, varInt); + else + writer->writeInt16(70, 0); + writer->writeString(9, "$DIMTOLJ"); + if (getInt("$DIMTOLJ", &varInt)) + writer->writeInt16(70, varInt); + else + writer->writeInt16(70, 0); + writer->writeString(9, "$DIMTZIN"); + if (getInt("$DIMTZIN", &varInt)) + writer->writeInt16(70, varInt); + else + writer->writeInt16(70, 8); + writer->writeString(9, "$DIMALTZ"); + if (getInt("$DIMALTZ", &varInt)) + writer->writeInt16(70, varInt); + else + writer->writeInt16(70, 0); + writer->writeString(9, "$DIMALTTZ"); + if (getInt("$DIMALTTZ", &varInt)) + writer->writeInt16(70, varInt); + else + writer->writeInt16(70, 0); + writer->writeString(9, "$DIMUPT"); + if (getInt("$DIMUPT", &varInt)) + writer->writeInt16(70, varInt); + else + writer->writeInt16(70, 0); + writer->writeString(9, "$DIMDEC"); + if (getInt("$DIMDEC", &varInt)) + writer->writeInt16(70, varInt); + else + writer->writeInt16(70, 2); + writer->writeString(9, "$DIMTDEC"); + if (getInt("$DIMTDEC", &varInt)) + writer->writeInt16(70, varInt); + else + writer->writeInt16(70, 2); + writer->writeString(9, "$DIMALTU"); + if (getInt("$DIMALTU", &varInt)) + writer->writeInt16(70, varInt); + else + writer->writeInt16(70, 2); + writer->writeString(9, "$DIMALTTD"); + if (getInt("$DIMALTTD", &varInt)) + writer->writeInt16(70, varInt); + else + writer->writeInt16(70, 3); + writer->writeString(9, "$DIMTXSTY"); + if (getStr("$DIMTXSTY", &varStr)) + if (ver == DRW::AC1009) + writer->writeUtf8Caps(7, varStr); + else + writer->writeUtf8String(7, varStr); + else + writer->writeString(7, "STANDARD"); + writer->writeString(9, "$DIMAUNIT"); + if (getInt("$DIMAUNIT", &varInt)) + writer->writeInt16(70, varInt); + else + writer->writeInt16(70, 0); + writer->writeString(9, "$DIMADEC"); + if (getInt("$DIMADEC", &varInt)) + writer->writeInt16(70, varInt); + else + writer->writeInt16(70, 0); + writer->writeString(9, "$DIMALTRND"); + if (getDouble("$DIMALTRND", &varDouble)) + writer->writeDouble(40, varDouble); + else + writer->writeDouble(40, 0.0); + writer->writeString(9, "$DIMAZIN"); + if (getInt("$DIMAZIN", &varInt)) + writer->writeInt16(70, varInt); + else + writer->writeInt16(70, 0); + writer->writeString(9, "$DIMDSEP"); + if (getInt("$DIMDSEP", &varInt)) + writer->writeInt16(70, varInt); + else + writer->writeInt16(70, 44); + writer->writeString(9, "$DIMATFIT"); + if (getInt("$DIMATFIT", &varInt)) + writer->writeInt16(70, varInt); + else + writer->writeInt16(70, 3); + writer->writeString(9, "$DIMFRAC"); + if (getInt("$DIMFRAC", &varInt)) + writer->writeInt16(70, varInt); + else + writer->writeInt16(70, 0); + writer->writeString(9, "$DIMLDRBLK"); + if (getStr("$DIMLDRBLK", &varStr)) + if (ver == DRW::AC1009) + writer->writeUtf8Caps(1, varStr); + else + writer->writeUtf8String(1, varStr); + else + writer->writeString(1, "STANDARD"); + //verify if exist "$DIMLUNIT" or obsolete "$DIMUNIT" (pre v2000) + if ( !getInt("$DIMLUNIT", &varInt) ){ + if (!getInt("$DIMUNIT", &varInt)) + varInt = 2; + } + //verify valid values from 1 to 6 + if (varInt<1 || varInt>6) + varInt = 2; + if (ver > DRW::AC1014) { + writer->writeString(9, "$DIMLUNIT"); + writer->writeInt16(70, varInt); + } else { + writer->writeString(9, "$DIMUNIT"); + writer->writeInt16(70, varInt); + } + writer->writeString(9, "$DIMLWD"); + if (getInt("$DIMLWD", &varInt)) + writer->writeInt16(70, varInt); + else + writer->writeInt16(70, -2); + writer->writeString(9, "$DIMLWE"); + if (getInt("$DIMLWE", &varInt)) + writer->writeInt16(70, varInt); + else + writer->writeInt16(70, -2); + writer->writeString(9, "$DIMTMOVE"); + if (getInt("$DIMTMOVE", &varInt)) + writer->writeInt16(70, varInt); + else + writer->writeInt16(70, 0); + + if (ver > DRW::AC1018) {// and post v2004 dim vars + writer->writeString(9, "$DIMFXL"); + if (getDouble("$DIMFXL", &varDouble)) + writer->writeDouble(40, varDouble); + else + writer->writeDouble(40, 1.0); + writer->writeString(9, "$DIMFXLON"); + if (getInt("$DIMFXLON", &varInt)) + writer->writeInt16(70, varInt); + else + writer->writeInt16(70, 0); + writer->writeString(9, "$DIMJOGANG"); + if (getDouble("$DIMJOGANG", &varDouble)) + writer->writeDouble(40, varDouble); + else + writer->writeDouble(40, 0.7854); + writer->writeString(9, "$DIMTFILL"); + if (getInt("$DIMTFILL", &varInt)) + writer->writeInt16(70, varInt); + else + writer->writeInt16(70, 0); + writer->writeString(9, "$DIMTFILLCLR"); + if (getInt("$DIMTFILLCLR", &varInt)) + writer->writeInt16(70, varInt); + else + writer->writeInt16(70, 0); + writer->writeString(9, "$DIMARCSYM"); + if (getInt("$DIMARCSYM", &varInt)) + writer->writeInt16(70, varInt); + else + writer->writeInt16(70, 0); + writer->writeString(9, "$DIMLTYPE"); + if (getStr("$DIMLTYPE", &varStr)) + if (ver == DRW::AC1009) + writer->writeUtf8Caps(6, varStr); + else + writer->writeUtf8String(6, varStr); + else + writer->writeString(6, ""); + writer->writeString(9, "$DIMLTEX1"); + if (getStr("$DIMLTEX1", &varStr)) + if (ver == DRW::AC1009) + writer->writeUtf8Caps(6, varStr); + else + writer->writeUtf8String(6, varStr); + else + writer->writeString(6, ""); + writer->writeString(9, "$DIMLTEX2"); + if (getStr("$DIMLTEX2", &varStr)) + if (ver == DRW::AC1009) + writer->writeUtf8Caps(6, varStr); + else + writer->writeUtf8String(6, varStr); + else + writer->writeString(6, ""); + if (ver > DRW::AC1021) {// and post v2007 dim vars + writer->writeString(9, "$DIMTXTDIRECTION"); + if (getInt("$DIMTXTDIRECTION", &varInt)) + writer->writeInt16(70, varInt); + else + writer->writeInt16(70, 0); + } + }// end post v2004 dim vars + }//end post r12 dim vars + + writer->writeString(9, "$LUNITS"); + if (getInt("$LUNITS", &varInt)) + writer->writeInt16(70, varInt); + else + writer->writeInt16(70, 2); + writer->writeString(9, "$LUPREC"); + if (getInt("$LUPREC", &varInt)) + writer->writeInt16(70, varInt); + else + writer->writeInt16(70, 4); + writer->writeString(9, "$SKETCHINC"); + if (getDouble("$SKETCHINC", &varDouble)) + writer->writeDouble(40, varDouble); + else + writer->writeDouble(40, 1.0); + writer->writeString(9, "$FILLETRAD"); + if (getDouble("$FILLETRAD", &varDouble)) + writer->writeDouble(40, varDouble); + else + writer->writeDouble(40, 0.0); + writer->writeString(9, "$AUNITS"); + if (getInt("$AUNITS", &varInt)) + writer->writeInt16(70, varInt); + else + writer->writeInt16(70, 0); + writer->writeString(9, "$AUPREC"); + if (getInt("$AUPREC", &varInt)) + writer->writeInt16(70, varInt); + else + writer->writeInt16(70, 2); + writer->writeString(9, "$MENU"); + if (getStr("$MENU", &varStr)) + if (ver == DRW::AC1009) + writer->writeUtf8Caps(1, varStr); + else + writer->writeUtf8String(1, varStr); + else + writer->writeString(1, "."); + writer->writeString(9, "$ELEVATION"); + if (getDouble("$ELEVATION", &varDouble)) + writer->writeDouble(40, varDouble); + else + writer->writeDouble(40, 0.0); + writer->writeString(9, "$PELEVATION"); + if (getDouble("$PELEVATION", &varDouble)) + writer->writeDouble(40, varDouble); + else + writer->writeDouble(40, 0.0); + writer->writeString(9, "$THICKNESS"); + if (getDouble("$THICKNESS", &varDouble)) + writer->writeDouble(40, varDouble); + else + writer->writeDouble(40, 0.0); + writer->writeString(9, "$LIMCHECK"); + if (getInt("$LIMCHECK", &varInt)) + writer->writeInt16(70, varInt); + else + writer->writeInt16(70, 0); + if (ver < DRW::AC1015) { + writer->writeString(9, "$BLIPMODE"); + if (getInt("$BLIPMODE", &varInt)) + writer->writeInt16(70, varInt); + else + writer->writeInt16(70, 0); + } + writer->writeString(9, "$CHAMFERA"); + if (getDouble("$CHAMFERA", &varDouble)) + writer->writeDouble(40, varDouble); + else + writer->writeDouble(40, 0.0); + writer->writeString(9, "$CHAMFERB"); + if (getDouble("$CHAMFERB", &varDouble)) + writer->writeDouble(40, varDouble); + else + writer->writeDouble(40, 0.0); + if (ver > DRW::AC1009) { + writer->writeString(9, "$CHAMFERC"); + if (getDouble("$CHAMFERC", &varDouble)) + writer->writeDouble(40, varDouble); + else + writer->writeDouble(40, 0.0); + writer->writeString(9, "$CHAMFERD"); + if (getDouble("$CHAMFERD", &varDouble)) + writer->writeDouble(40, varDouble); + else + writer->writeDouble(40, 0.0); + } + writer->writeString(9, "$SKPOLY"); + if (getInt("$SKPOLY", &varInt)) { + writer->writeInt16(70, varInt); + } else + writer->writeInt16(70, 0); + //rlz: todo, times + writer->writeString(9, "$USRTIMER"); + if (getInt("$USRTIMER", &varInt)) { + writer->writeInt16(70, varInt); + } else + writer->writeInt16(70, 1); + writer->writeString(9, "$ANGBASE"); + if (getDouble("$ANGBASE", &varDouble)) + writer->writeDouble(50, varDouble); + else + writer->writeDouble(50, 0.0); + writer->writeString(9, "$ANGDIR"); + if (getInt("$ANGDIR", &varInt)) { + writer->writeInt16(70, varInt); + } else + writer->writeInt16(70, 0); + writer->writeString(9, "$PDMODE"); + if (getInt("$PDMODE", &varInt)) { + writer->writeInt16(70, varInt); + } else + writer->writeInt16(70, 34); + writer->writeString(9, "$PDSIZE"); + if (getDouble("$PDSIZE", &varDouble)) + writer->writeDouble(40, varDouble); + else + writer->writeDouble(40, 0.0); + writer->writeString(9, "$PLINEWID"); + if (getDouble("$PLINEWID", &varDouble)) + writer->writeDouble(40, varDouble); + else + writer->writeDouble(40, 0.0); + if (ver < DRW::AC1012) { + writer->writeString(9, "$COORDS"); + if (getInt("$COORDS", &varInt)) { + writer->writeInt16(70, varInt); + } else + writer->writeInt16(70, 2); + } + writer->writeString(9, "$SPLFRAME"); + if (getInt("$SPLFRAME", &varInt)) { + writer->writeInt16(70, varInt); + } else + writer->writeInt16(70, 0); + writer->writeString(9, "$SPLINETYPE"); + if (getInt("$SPLINETYPE", &varInt)) { + writer->writeInt16(70, varInt); + } else + writer->writeInt16(70, 2); + writer->writeString(9, "$SPLINESEGS"); + if (getInt("$SPLINESEGS", &varInt)) { + writer->writeInt16(70, varInt); + } else + writer->writeInt16(70, 8); + if (ver < DRW::AC1012) { + writer->writeString(9, "$ATTDIA"); + if (getInt("$ATTDIA", &varInt)) { + writer->writeInt16(70, varInt); + } else + writer->writeInt16(70, 1); + writer->writeString(9, "$ATTREQ"); + if (getInt("$ATTREQ", &varInt)) { + writer->writeInt16(70, varInt); + } else + writer->writeInt16(70, 1); + writer->writeString(9, "$HANDLING"); + if (getInt("$HANDLING", &varInt)) { + writer->writeInt16(70, varInt); + } else + writer->writeInt16(70, 1); + } + writer->writeString(9, "$HANDSEED"); + //RLZ dxfHex(5, 0xFFFF); + writer->writeString(5, "20000"); + writer->writeString(9, "$SURFTAB1"); + if (getInt("$SURFTAB1", &varInt)) { + writer->writeInt16(70, varInt); + } else + writer->writeInt16(70, 6); + writer->writeString(9, "$SURFTAB2"); + if (getInt("$SURFTAB2", &varInt)) { + writer->writeInt16(70, varInt); + } else + writer->writeInt16(70, 6); + writer->writeString(9, "$SURFTYPE"); + if (getInt("$SURFTYPE", &varInt)) { + writer->writeInt16(70, varInt); + } else + writer->writeInt16(70, 6); + writer->writeString(9, "$SURFU"); + if (getInt("$SURFU", &varInt)) { + writer->writeInt16(70, varInt); + } else + writer->writeInt16(70, 6); + writer->writeString(9, "$SURFV"); + if (getInt("$SURFV", &varInt)) { + writer->writeInt16(70, varInt); + } else + writer->writeInt16(70, 6); + if (ver > DRW::AC1009) { + writer->writeString(9, "$UCSBASE"); + if (getStr("$UCSBASE", &varStr)) + if (ver == DRW::AC1009) + writer->writeUtf8Caps(2, varStr); + else + writer->writeUtf8String(2, varStr); + else + writer->writeString(2, ""); +} + writer->writeString(9, "$UCSNAME"); + if (getStr("$UCSNAME", &varStr)) + if (ver == DRW::AC1009) + writer->writeUtf8Caps(2, varStr); + else + writer->writeUtf8String(2, varStr); + else + writer->writeString(2, ""); + writer->writeString(9, "$UCSORG"); + if (getCoord("$UCSORG", &varCoord)) { + writer->writeDouble(10, varCoord.x); + writer->writeDouble(20, varCoord.y); + writer->writeDouble(30, varCoord.z); + } else { + writer->writeDouble(10, 0.0); + writer->writeDouble(20, 0.0); + writer->writeDouble(30, 0.0); + } + writer->writeString(9, "$UCSXDIR"); + if (getCoord("$UCSXDIR", &varCoord)) { + writer->writeDouble(10, varCoord.x); + writer->writeDouble(20, varCoord.y); + writer->writeDouble(30, varCoord.z); + } else { + writer->writeDouble(10, 1.0); + writer->writeDouble(20, 0.0); + writer->writeDouble(30, 0.0); + } + writer->writeString(9, "$UCSYDIR"); + if (getCoord("$UCSYDIR", &varCoord)) { + writer->writeDouble(10, varCoord.x); + writer->writeDouble(20, varCoord.y); + writer->writeDouble(30, varCoord.z); + } else { + writer->writeDouble(10, 0.0); + writer->writeDouble(20, 1.0); + writer->writeDouble(30, 0.0); + } + if (ver > DRW::AC1009) { //begin post r12 UCS vars + writer->writeString(9, "$UCSORTHOREF"); + if (getStr("$UCSORTHOREF", &varStr)) + if (ver == DRW::AC1009) + writer->writeUtf8Caps(2, varStr); + else + writer->writeUtf8String(2, varStr); + else + writer->writeString(2, ""); + writer->writeString(9, "$UCSORTHOVIEW"); + if (getInt("$UCSORTHOVIEW", &varInt)) + writer->writeInt16(70, varInt); + else + writer->writeInt16(70, 0); + writer->writeString(9, "$UCSORGTOP"); + if (getCoord("$UCSORGTOP", &varCoord)) { + writer->writeDouble(10, varCoord.x); + writer->writeDouble(20, varCoord.y); + writer->writeDouble(30, varCoord.z); + } else { + writer->writeDouble(10, 0.0); + writer->writeDouble(20, 0.0); + writer->writeDouble(30, 0.0); + } + writer->writeString(9, "$UCSORGBOTTOM"); + if (getCoord("$UCSORGBOTTOM", &varCoord)) { + writer->writeDouble(10, varCoord.x); + writer->writeDouble(20, varCoord.y); + writer->writeDouble(30, varCoord.z); + } else { + writer->writeDouble(10, 0.0); + writer->writeDouble(20, 0.0); + writer->writeDouble(30, 0.0); + } + writer->writeString(9, "$UCSORGLEFT"); + if (getCoord("$UCSORGLEFT", &varCoord)) { + writer->writeDouble(10, varCoord.x); + writer->writeDouble(20, varCoord.y); + writer->writeDouble(30, varCoord.z); + } else { + writer->writeDouble(10, 0.0); + writer->writeDouble(20, 0.0); + writer->writeDouble(30, 0.0); + } + writer->writeString(9, "$UCSORGRIGHT"); + if (getCoord("$UCSORGRIGHT", &varCoord)) { + writer->writeDouble(10, varCoord.x); + writer->writeDouble(20, varCoord.y); + writer->writeDouble(30, varCoord.z); + } else { + writer->writeDouble(10, 0.0); + writer->writeDouble(20, 0.0); + writer->writeDouble(30, 0.0); + } + writer->writeString(9, "$UCSORGFRONT"); + if (getCoord("$UCSORGFRONT", &varCoord)) { + writer->writeDouble(10, varCoord.x); + writer->writeDouble(20, varCoord.y); + writer->writeDouble(30, varCoord.z); + } else { + writer->writeDouble(10, 0.0); + writer->writeDouble(20, 0.0); + writer->writeDouble(30, 0.0); + } + writer->writeString(9, "$UCSORGBACK"); + if (getCoord("$UCSORGBACK", &varCoord)) { + writer->writeDouble(10, varCoord.x); + writer->writeDouble(20, varCoord.y); + writer->writeDouble(30, varCoord.z); + } else { + writer->writeDouble(10, 0.0); + writer->writeDouble(20, 0.0); + writer->writeDouble(30, 0.0); + } + writer->writeString(9, "$PUCSBASE"); + if (getStr("$PUCSBASE", &varStr)) + if (ver == DRW::AC1009) + writer->writeUtf8Caps(2, varStr); + else + writer->writeUtf8String(2, varStr); + else + writer->writeString(2, ""); + } //end post r12 UCS vars + writer->writeString(9, "$PUCSNAME"); + if (getStr("$PUCSNAME", &varStr)) + if (ver == DRW::AC1009) + writer->writeUtf8Caps(2, varStr); + else + writer->writeUtf8String(2, varStr); + else + writer->writeString(2, ""); + writer->writeString(9, "$PUCSORG"); + if (getCoord("$PUCSORG", &varCoord)) { + writer->writeDouble(10, varCoord.x); + writer->writeDouble(20, varCoord.y); + writer->writeDouble(30, varCoord.z); + } else { + writer->writeDouble(10, 0.0); + writer->writeDouble(20, 0.0); + writer->writeDouble(30, 0.0); + } + writer->writeString(9, "$PUCSXDIR"); + if (getCoord("$PUCSXDIR", &varCoord)) { + writer->writeDouble(10, varCoord.x); + writer->writeDouble(20, varCoord.y); + writer->writeDouble(30, varCoord.z); + } else { + writer->writeDouble(10, 1.0); + writer->writeDouble(20, 0.0); + writer->writeDouble(30, 0.0); + } + writer->writeString(9, "$PUCSYDIR"); + if (getCoord("$PUCSYDIR", &varCoord)) { + writer->writeDouble(10, varCoord.x); + writer->writeDouble(20, varCoord.y); + writer->writeDouble(30, varCoord.z); + } else { + writer->writeDouble(10, 0.0); + writer->writeDouble(20, 1.0); + writer->writeDouble(30, 0.0); + } + if (ver > DRW::AC1009) { //begin post r12 PUCS vars + writer->writeString(9, "$PUCSORTHOREF"); + if (getStr("$PUCSORTHOREF", &varStr)) + if (ver == DRW::AC1009) + writer->writeUtf8Caps(2, varStr); + else + writer->writeUtf8String(2, varStr); + else + writer->writeString(2, ""); + writer->writeString(9, "$PUCSORTHOVIEW"); + if (getInt("$PUCSORTHOVIEW", &varInt)) + writer->writeInt16(70, varInt); + else + writer->writeInt16(70, 0); + writer->writeString(9, "$PUCSORGTOP"); + if (getCoord("$PUCSORGTOP", &varCoord)) { + writer->writeDouble(10, varCoord.x); + writer->writeDouble(20, varCoord.y); + writer->writeDouble(30, varCoord.z); + } else { + writer->writeDouble(10, 0.0); + writer->writeDouble(20, 0.0); + writer->writeDouble(30, 0.0); + } + writer->writeString(9, "$PUCSORGBOTTOM"); + if (getCoord("$PUCSORGBOTTOM", &varCoord)) { + writer->writeDouble(10, varCoord.x); + writer->writeDouble(20, varCoord.y); + writer->writeDouble(30, varCoord.z); + } else { + writer->writeDouble(10, 0.0); + writer->writeDouble(20, 0.0); + writer->writeDouble(30, 0.0); + } + writer->writeString(9, "$PUCSORGLEFT"); + if (getCoord("$PUCSORGLEFT", &varCoord)) { + writer->writeDouble(10, varCoord.x); + writer->writeDouble(20, varCoord.y); + writer->writeDouble(30, varCoord.z); + } else { + writer->writeDouble(10, 0.0); + writer->writeDouble(20, 0.0); + writer->writeDouble(30, 0.0); + } + writer->writeString(9, "$PUCSORGRIGHT"); + if (getCoord("$PUCSORGRIGHT", &varCoord)) { + writer->writeDouble(10, varCoord.x); + writer->writeDouble(20, varCoord.y); + writer->writeDouble(30, varCoord.z); + } else { + writer->writeDouble(10, 0.0); + writer->writeDouble(20, 0.0); + writer->writeDouble(30, 0.0); + } + writer->writeString(9, "$PUCSORGFRONT"); + if (getCoord("$PUCSORGFRONT", &varCoord)) { + writer->writeDouble(10, varCoord.x); + writer->writeDouble(20, varCoord.y); + writer->writeDouble(30, varCoord.z); + } else { + writer->writeDouble(10, 0.0); + writer->writeDouble(20, 0.0); + writer->writeDouble(30, 0.0); + } + writer->writeString(9, "$PUCSORGBACK"); + if (getCoord("$PUCSORGBACK", &varCoord)) { + writer->writeDouble(10, varCoord.x); + writer->writeDouble(20, varCoord.y); + writer->writeDouble(30, varCoord.z); + } else { + writer->writeDouble(10, 0.0); + writer->writeDouble(20, 0.0); + writer->writeDouble(30, 0.0); + } + } //end post r12 PUCS vars + + writer->writeString(9, "$USERI1"); + if (getInt("$USERI1", &varInt)) + writer->writeInt16(70, varInt); + else + writer->writeInt16(70, 0); + writer->writeString(9, "$USERI2"); + if (getInt("$USERI2", &varInt)) + writer->writeInt16(70, varInt); + else + writer->writeInt16(70, 0); + writer->writeString(9, "$USERI3"); + if (getInt("$USERI3", &varInt)) + writer->writeInt16(70, varInt); + else + writer->writeInt16(70, 0); + writer->writeString(9, "$USERI4"); + if (getInt("$USERI4", &varInt)) + writer->writeInt16(70, varInt); + else + writer->writeInt16(70, 0); + writer->writeString(9, "$USERI5"); + if (getInt("$USERI5", &varInt)) + writer->writeInt16(70, varInt); + else + writer->writeInt16(70, 0); + writer->writeString(9, "$USERR1"); + if (getDouble("$USERR1", &varDouble)) + writer->writeDouble(40, varDouble); + else + writer->writeDouble(40, 0.0); + writer->writeString(9, "$USERR2"); + if (getDouble("$USERR2", &varDouble)) + writer->writeDouble(40, varDouble); + else + writer->writeDouble(40, 0.0); + writer->writeString(9, "$USERR3"); + if (getDouble("$USERR3", &varDouble)) + writer->writeDouble(40, varDouble); + else + writer->writeDouble(40, 0.0); + writer->writeString(9, "$USERR4"); + if (getDouble("$USERR4", &varDouble)) + writer->writeDouble(40, varDouble); + else + writer->writeDouble(40, 0.0); + writer->writeString(9, "$USERR5"); + if (getDouble("$USERR5", &varDouble)) + writer->writeDouble(40, varDouble); + else + writer->writeDouble(40, 0.0); + writer->writeString(9, "$WORLDVIEW"); + if (getInt("$WORLDVIEW", &varInt)) + writer->writeInt16(70, varInt); + else + writer->writeInt16(70, 1); + writer->writeString(9, "$SHADEDGE"); + if (getInt("$SHADEDGE", &varInt)) + writer->writeInt16(70, varInt); + else + writer->writeInt16(70, 3); + writer->writeString(9, "$SHADEDIF"); + if (getInt("$SHADEDIF", &varInt)) + writer->writeInt16(70, varInt); + else + writer->writeInt16(70, 70); + writer->writeString(9, "$TILEMODE"); + if (getInt("$TILEMODE", &varInt)) + writer->writeInt16(70, varInt); + else + writer->writeInt16(70, 1); + writer->writeString(9, "$MAXACTVP"); + if (getInt("$MAXACTVP", &varInt)) + writer->writeInt16(70, varInt); + else + writer->writeInt16(70, 64); + if (ver > DRW::AC1009) { //begin post r12 PUCS vars + writer->writeString(9, "$PINSBASE"); + if (getCoord("$PINSBASE", &varCoord)) { + writer->writeDouble(10, varCoord.x); + writer->writeDouble(20, varCoord.y); + writer->writeDouble(30, varCoord.z); + } else { + writer->writeDouble(10, 0.0); + writer->writeDouble(20, 0.0); + writer->writeDouble(30, 0.0); + } + } + writer->writeString(9, "$PLIMCHECK"); + if (getInt("$PLIMCHECK", &varInt)) + writer->writeInt16(70, varInt); + else + writer->writeInt16(70, 0); + writer->writeString(9, "$PEXTMIN"); + if (getCoord("$PEXTMIN", &varCoord)) { + writer->writeDouble(10, varCoord.x); + writer->writeDouble(20, varCoord.y); + writer->writeDouble(30, varCoord.z); + } else { + writer->writeDouble(10, 0.0); + writer->writeDouble(20, 0.0); + writer->writeDouble(30, 0.0); + } + writer->writeString(9, "$PEXTMAX"); + if (getCoord("$PEXTMAX", &varCoord)) { + writer->writeDouble(10, varCoord.x); + writer->writeDouble(20, varCoord.y); + writer->writeDouble(30, varCoord.z); + } else { + writer->writeDouble(10, 0.0); + writer->writeDouble(20, 0.0); + writer->writeDouble(30, 0.0); + } + +/* RLZ: moved to active VPORT, but can write in header if present*/ + if (getInt("$GRIDMODE", &varInt)) { + writer->writeString(9, "$GRIDMODE"); + writer->writeInt16(70, varInt); + } + if (getInt("$SNAPSTYLE", &varInt)) { + writer->writeString(9, "$SNAPSTYLE"); + writer->writeInt16(70, varInt); + } + if (getCoord("$GRIDUNIT", &varCoord)) { + writer->writeString(9, "$GRIDUNIT"); + writer->writeDouble(10, varCoord.x); + writer->writeDouble(20, varCoord.y); + } + if (getCoord("$VIEWCTR", &varCoord)) { + writer->writeString(9, "$VIEWCTR"); + writer->writeDouble(10, varCoord.x); + writer->writeDouble(20, varCoord.y); + } +/* RLZ: moved to active VPORT, but can write in header if present*/ + + writer->writeString(9, "$PLIMMIN"); + if (getCoord("$PLIMMIN", &varCoord)) { + writer->writeDouble(10, varCoord.x); + writer->writeDouble(20, varCoord.y); + } else { + writer->writeDouble(10, 0.0); + writer->writeDouble(20, 0.0); + } + writer->writeString(9, "$PLIMMAX"); + if (getCoord("$PLIMMAX", &varCoord)) { + writer->writeDouble(10, varCoord.x); + writer->writeDouble(20, varCoord.y); + } else { + writer->writeDouble(10, 297.0); + writer->writeDouble(20, 210.0); + } + writer->writeString(9, "$UNITMODE"); + if (getInt("$UNITMODE", &varInt)) + writer->writeInt16(70, varInt); + else + writer->writeInt16(70, 0); + writer->writeString(9, "$VISRETAIN"); + if (getInt("$VISRETAIN", &varInt)) + writer->writeInt16(70, varInt); + else + writer->writeInt16(70, 1); + writer->writeString(9, "$PLINEGEN"); + if (getInt("$PLINEGEN", &varInt)) + writer->writeInt16(70, varInt); + else + writer->writeInt16(70, 0); + writer->writeString(9, "$PSLTSCALE"); + if (getInt("$PSLTSCALE", &varInt)) + writer->writeInt16(70, varInt); + else + writer->writeInt16(70, 1); + if (ver > DRW::AC1009){//start port r12 vars + writer->writeString(9, "$TREEDEPTH"); + if (getInt("$TREEDEPTH", &varInt)) + writer->writeInt16(70, varInt); + else + writer->writeInt16(70, 3020); + writer->writeString(9, "$CMLSTYLE"); + if (getStr("$CMLSTYLE", &varStr)) + if (ver == DRW::AC1009) + writer->writeUtf8Caps(2, varStr); + else + writer->writeUtf8String(2, varStr); + else + writer->writeString(2, "Standard"); + writer->writeString(9, "$CMLJUST"); + if (getInt("$CMLJUST", &varInt)) + writer->writeInt16(70, varInt); + else + writer->writeInt16(70, 0); + writer->writeString(9, "$CMLSCALE"); + if (getDouble("$CMLSCALE", &varDouble)) + writer->writeDouble(40, varDouble); + else + writer->writeDouble(40, 20.0); + writer->writeString(9, "$PROXYGRAPHICS"); + if (getInt("$PROXYGRAPHICS", &varInt)) + writer->writeInt16(70, varInt); + else + writer->writeInt16(70, 1); + writer->writeString(9, "$MEASUREMENT"); + if (getInt("$MEASUREMENT", &varInt)) + writer->writeInt16(70, varInt); + else + writer->writeInt16(70, 1); + writer->writeString(9, "$CELWEIGHT"); + if (getInt("$CELWEIGHT", &varInt)) + writer->writeInt16(370, varInt); + else + writer->writeInt16(370, -1); + writer->writeString(9, "$ENDCAPS"); + if (getInt("$ENDCAPS", &varInt)) + writer->writeInt16(280, varInt); + else + writer->writeInt16(280, 0); + writer->writeString(9, "$JOINSTYLE"); + if (getInt("$JOINSTYLE", &varInt)) + writer->writeInt16(280, varInt); + else + writer->writeInt16(280, 0); + writer->writeString(9, "$LWDISPLAY"); //RLZ bool flag, verify in bin version + if (getInt("$LWDISPLAY", &varInt)) + writer->writeInt16(290, varInt); + else + writer->writeInt16(290, 0); + if (ver > DRW::AC1014) { + writer->writeString(9, "$INSUNITS"); + if (getInt("$INSUNITS", &varInt)) + writer->writeInt16(70, varInt); + else + writer->writeInt16(70, 0); + } + writer->writeString(9, "$HYPERLINKBASE"); + if (getStr("$HYPERLINKBASE", &varStr)) + if (ver == DRW::AC1009) + writer->writeUtf8Caps(1, varStr); + else + writer->writeUtf8String(1, varStr); + else + writer->writeString(1, ""); + writer->writeString(9, "$STYLESHEET"); + if (getStr("$STYLESHEET", &varStr)) + if (ver == DRW::AC1009) + writer->writeUtf8Caps(1, varStr); + else + writer->writeUtf8String(1, varStr); + else + writer->writeString(1, ""); + writer->writeString(9, "$XEDIT"); //RLZ bool flag, verify in bin version + if (getInt("$XEDIT", &varInt)) + writer->writeInt16(290, varInt); + else + writer->writeInt16(290, 1); + writer->writeString(9, "$CEPSNTYPE"); + if (getInt("$CEPSNTYPE", &varInt)) + writer->writeInt16(380, varInt); + else + writer->writeInt16(380, 0); + writer->writeString(9, "$PSTYLEMODE"); //RLZ bool flag, verify in bin version + if (getInt("$PSTYLEMODE", &varInt)) + writer->writeInt16(290, varInt); + else + writer->writeInt16(290, 1); +//RLZ: here $FINGERPRINTGUID and $VERSIONGUID, do not add? + writer->writeString(9, "$EXTNAMES"); //RLZ bool flag, verify in bin version + if (getInt("$EXTNAMES", &varInt)) + writer->writeInt16(290, varInt); + else + writer->writeInt16(290, 1); + writer->writeString(9, "$PSVPSCALE"); + if (getDouble("$PSVPSCALE", &varDouble)) + writer->writeDouble(40, varDouble); + else + writer->writeDouble(40, 0.0); + writer->writeString(9, "$OLESTARTUP"); //RLZ bool flag, verify in bin version + if (getInt("$OLESTARTUP", &varInt)) + writer->writeInt16(290, varInt); + else + writer->writeInt16(290, 0); + } + if (ver > DRW::AC1015) {// and post v2004 vars + writer->writeString(9, "$SORTENTS"); + if (getInt("$SORTENTS", &varInt)) + writer->writeInt16(280, varInt); + else + writer->writeInt16(280, 127); + writer->writeString(9, "$INDEXCTL"); + if (getInt("$INDEXCTL", &varInt)) + writer->writeInt16(280, varInt); + else + writer->writeInt16(280, 0); + writer->writeString(9, "$HIDETEXT"); + if (getInt("$HIDETEXT", &varInt)) + writer->writeInt16(280, varInt); + else + writer->writeInt16(280, 1); + writer->writeString(9, "$XCLIPFRAME"); //RLZ bool flag, verify in bin version + if (ver > DRW::AC1021) { + if (getInt("$XCLIPFRAME", &varInt)) + writer->writeInt16(280, varInt); + else + writer->writeInt16(280, 0); + } else { + if (getInt("$XCLIPFRAME", &varInt)) + writer->writeInt16(290, varInt); + else + writer->writeInt16(290, 0); + } + writer->writeString(9, "$HALOGAP"); + if (getInt("$HALOGAP", &varInt)) + writer->writeInt16(280, varInt); + else + writer->writeInt16(280, 0); + writer->writeString(9, "$OBSCOLOR"); + if (getInt("$OBSCOLOR", &varInt)) + writer->writeInt16(70, varInt); + else + writer->writeInt16(70, 257); + writer->writeString(9, "$OBSLTYPE"); + if (getInt("$OBSLTYPE", &varInt)) + writer->writeInt16(280, varInt); + else + writer->writeInt16(280, 0); + writer->writeString(9, "$INTERSECTIONDISPLAY"); + if (getInt("$INTERSECTIONDISPLAY", &varInt)) + writer->writeInt16(280, varInt); + else + writer->writeInt16(280, 0); + writer->writeString(9, "$INTERSECTIONCOLOR"); + if (getInt("$INTERSECTIONCOLOR", &varInt)) + writer->writeInt16(70, varInt); + else + writer->writeInt16(70, 257); + writer->writeString(9, "$DIMASSOC"); + if (getInt("$DIMASSOC", &varInt)) + writer->writeInt16(280, varInt); + else + writer->writeInt16(280, 1); + writer->writeString(9, "$PROJECTNAME"); + if (getStr("$PROJECTNAME", &varStr)) + writer->writeUtf8String(1, varStr); + else + writer->writeString(1, ""); + } + if (ver > DRW::AC1018) {// and post v2007 vars + writer->writeString(9, "$CAMERADISPLAY"); //RLZ bool flag, verify in bin version + if (getInt("$CAMERADISPLAY", &varInt)) + writer->writeInt16(290, varInt); + else + writer->writeInt16(290, 0); + writer->writeString(9, "$LENSLENGTH"); + if (getDouble("$LENSLENGTH", &varDouble)) + writer->writeDouble(40, varDouble); + else + writer->writeDouble(40, 50.0); + writer->writeString(9, "$CAMERAHEIGHT"); + if (getDouble("$CAMERAHEIGTH", &varDouble)) + writer->writeDouble(40, varDouble); + else + writer->writeDouble(40, 0.0); + writer->writeString(9, "$STEPSPERSEC"); + if (getDouble("$STEPSPERSEC", &varDouble)) + writer->writeDouble(40, varDouble); + else + writer->writeDouble(40, 2.0); + writer->writeString(9, "$STEPSIZE"); + if (getDouble("$STEPSIZE", &varDouble)) + writer->writeDouble(40, varDouble); + else + writer->writeDouble(40, 50.0); + writer->writeString(9, "$3DDWFPREC"); + if (getDouble("$3DDWFPREC", &varDouble)) + writer->writeDouble(40, varDouble); + else + writer->writeDouble(40, 2.0); + writer->writeString(9, "$PSOLWIDTH"); + if (getDouble("$PSOLWIDTH", &varDouble)) + writer->writeDouble(40, varDouble); + else + writer->writeDouble(40, 5.0); + writer->writeString(9, "$PSOLHEIGHT"); + if (getDouble("$PSOLHEIGHT", &varDouble)) + writer->writeDouble(40, varDouble); + else + writer->writeDouble(40, 80.0); + writer->writeString(9, "$LOFTANG1"); + if (getDouble("$LOFTANG1", &varDouble)) + writer->writeDouble(40, varDouble); + else + writer->writeDouble(40, M_PI_2); + writer->writeString(9, "$LOFTANG2"); + if (getDouble("$LOFTANG2", &varDouble)) + writer->writeDouble(40, varDouble); + else + writer->writeDouble(40, M_PI_2); + writer->writeString(9, "$LOFTMAG1"); + if (getDouble("$LOFTMAG1", &varDouble)) + writer->writeDouble(40, varDouble); + else + writer->writeDouble(40, 0.0); + writer->writeString(9, "$LOFTMAG2"); + if (getDouble("$LOFTMAG2", &varDouble)) + writer->writeDouble(40, varDouble); + else + writer->writeDouble(40, 0.0); + writer->writeString(9, "$LOFTPARAM"); + if (getInt("$LOFTPARAM", &varInt)) + writer->writeInt16(70, varInt); + else + writer->writeInt16(70, 7); + writer->writeString(9, "$LOFTNORMALS"); + if (getInt("$LOFTNORMALS", &varInt)) + writer->writeInt16(280, varInt); + else + writer->writeInt16(280, 1); + writer->writeString(9, "$LATITUDE"); + if (getDouble("$LATITUDE", &varDouble)) + writer->writeDouble(40, varDouble); + else + writer->writeDouble(40, 1.0); + writer->writeString(9, "$LONGITUDE"); + if (getDouble("$LONGITUDE", &varDouble)) + writer->writeDouble(40, varDouble); + else + writer->writeDouble(40, 1.0); + writer->writeString(9, "$NORTHDIRECTION"); + if (getDouble("$LONGITUDE", &varDouble)) + writer->writeDouble(40, varDouble); + else + writer->writeDouble(40, 0.0); + writer->writeString(9, "$TIMEZONE"); + if (getInt("$TIMEZONE", &varInt)) + writer->writeInt16(70, varInt); + else + writer->writeInt16(70, -8000); + writer->writeString(9, "$LIGHTGLYPHDISPLAY"); + if (getInt("$LIGHTGLYPHDISPLAY", &varInt)) + writer->writeInt16(280, varInt); + else + writer->writeInt16(280, 1); + writer->writeString(9, "$TILEMODELIGHTSYNCH"); + if (getInt("$TILEMODELIGHTSYNCH", &varInt)) + writer->writeInt16(280, varInt); + else + writer->writeInt16(280, 1); + //$CMATERIAL is a handle + writer->writeString(9, "$SOLIDHIST"); + if (getInt("$SOLIDHIST", &varInt)) + writer->writeInt16(280, varInt); + else + writer->writeInt16(280, 1); + writer->writeString(9, "$SHOWHIST"); + if (getInt("$SHOWHIST", &varInt)) + writer->writeInt16(280, varInt); + else + writer->writeInt16(280, 1); + writer->writeString(9, "$DWFFRAME"); + if (getInt("$DWFFRAME", &varInt)) + writer->writeInt16(280, varInt); + else + writer->writeInt16(280, 2); + writer->writeString(9, "$DGNFRAME"); + if (getInt("$DGNFRAME", &varInt)) + writer->writeInt16(280, varInt); + else + writer->writeInt16(280, 0); + writer->writeString(9, "$REALWORLDSCALE"); //RLZ bool flag, verify in bin version + if (getInt("$REALWORLDSCALE", &varInt)) + writer->writeInt16(290, varInt); + else + writer->writeInt16(290, 1); + writer->writeString(9, "$INTERFERECOLOR"); + if (getInt("$INTERFERECOLOR", &varInt)) + writer->writeInt16(62, varInt); + else + writer->writeInt16(62, 1); + //$INTERFEREOBJVS is a handle + //$INTERFEREVPVS is a handle + writer->writeString(9, "$CSHADOW"); + if (getInt("$CSHADOW", &varInt)) + writer->writeInt16(280, varInt); + else + writer->writeInt16(280, 0); + writer->writeString(9, "$SHADOWPLANELOCATION"); + if (getDouble("$SHADOWPLANELOCATION", &varDouble)) + writer->writeDouble(40, varDouble); + else + writer->writeDouble(40, 0.0); + } + +#ifdef DRW_DBG + std::map::const_iterator it; + for ( it=vars.begin() ; it != vars.end(); ++it ){ + DRW_DBG((*it).first); DRW_DBG("\n"); + } +#endif +} + +void DRW_Header::addDouble(std::string key, double value, int code){ + curr = new DRW_Variant(); + curr->addDouble( value ); + curr->code = code; + vars[key] =curr; +} + +void DRW_Header::addInt(std::string key, int value, int code){ + curr = new DRW_Variant(); + curr->addInt( value ); + curr->code = code; + vars[key] =curr; +} + +void DRW_Header::addStr(std::string key, std::string value, int code){ + curr = new DRW_Variant(); + curr->addString( value ); + curr->code = code; + vars[key] =curr; +} + +void DRW_Header::addCoord(std::string key, DRW_Coord value, int code){ + curr = new DRW_Variant(); + curr->addCoord( value ); + curr->code = code; + vars[key] =curr; +} + +bool DRW_Header::getDouble(std::string key, double *varDouble){ + bool result = false; + std::map::iterator it; + it=vars.find( key); + if (it != vars.end()) { + DRW_Variant *var = (*it).second; + if (var->type == DRW_Variant::DOUBLE) { + *varDouble = var->content.d; + result = true; + } + delete var; + vars.erase (it); + } + return result; +} + +bool DRW_Header::getInt(std::string key, int *varInt){ + bool result = false; + std::map::iterator it; + it=vars.find( key); + if (it != vars.end()) { + DRW_Variant *var = (*it).second; + if (var->type == DRW_Variant::INTEGER) { + *varInt = var->content.i; + result = true; + } + delete var; + vars.erase (it); + } + return result; +} + +bool DRW_Header::getStr(std::string key, std::string *varStr){ + bool result = false; + std::map::iterator it; + it=vars.find( key); + if (it != vars.end()) { + DRW_Variant *var = (*it).second; + if (var->type == DRW_Variant::STRING) { + *varStr = *var->content.s; + result = true; + } + delete var; + vars.erase (it); + } + return result; +} + +bool DRW_Header::getCoord(std::string key, DRW_Coord *varCoord){ + bool result = false; + std::map::iterator it; + it=vars.find( key); + if (it != vars.end()) { + DRW_Variant *var = (*it).second; + if (var->type == DRW_Variant::COORD) { + *varCoord = *var->content.v; + result = true; + } + delete var; + vars.erase (it); + } + return result; +} + +bool DRW_Header::parseDwg(DRW::Version version, dwgBuffer *buf, dwgBuffer *hBbuf, duint8 mv){ + bool result = true; + duint32 size = buf->getRawLong32(); + duint32 bitSize = 0; + duint32 endBitPos = 160; //start bit: 16 sentinel + 4 size + DRW_DBG("\nbyte size of data: "); DRW_DBG(size); + if (version > DRW::AC1021 && mv > 3) { //2010+ + duint32 hSize = buf->getRawLong32(); + endBitPos += 32; //start bit: + 4 hight size + DRW_DBG("\n2010+ & MV> 3, higth 32b: "); DRW_DBG(hSize); + } +//RLZ TODO add $ACADVER var & $DWGCODEPAGE & $MEASUREMENT +//RLZ TODO EN 2000 falta $CELWEIGHT, $ENDCAPS, $EXTNAMES $JOINSTYLE $LWDISPLAY $PSTYLEMODE $TDUCREATE $TDUUPDATE $XEDIT + + //bit size of data needed to locate start of string stream in 2007+ + //and mark the start of handle stream + //header is one object reads data and continue read strings ??? + if (version > DRW::AC1018) {//2007+ + bitSize = buf->getRawLong32(); + DRW_DBG("\nsize in bits: "); DRW_DBG(bitSize); + endBitPos += bitSize; + hBbuf->setPosition(endBitPos >>3); + hBbuf->setBitPos(endBitPos&7); + } + + if (version > DRW::AC1024) {//2013+ + duint64 requiredVersions = buf->getBitLongLong(); + DRW_DBG("\nREQUIREDVERSIONS var: "); DRW_DBG(requiredVersions); + } + DRW_DBG("\nUnknown1: "); DRW_DBG(buf->getBitDouble()); + DRW_DBG("\nUnknown2: "); DRW_DBG(buf->getBitDouble()); + DRW_DBG("\nUnknown3: "); DRW_DBG(buf->getBitDouble()); + DRW_DBG("\nUnknown4: "); DRW_DBG(buf->getBitDouble()); + if (version < DRW::AC1021) {//2007- + DRW_DBG("\nUnknown text1: "); DRW_DBG(buf->getCP8Text()); + DRW_DBG("\nUnknown text2: "); DRW_DBG(buf->getCP8Text()); + DRW_DBG("\nUnknown text3: "); DRW_DBG(buf->getCP8Text()); + DRW_DBG("\nUnknown text4: "); DRW_DBG(buf->getCP8Text()); + } + DRW_DBG("\nUnknown long1 (24L): "); DRW_DBG(buf->getBitLong()); + DRW_DBG("\nUnknown long2 (0L): "); DRW_DBG(buf->getBitLong()); + if (version < DRW::AC1015) {//pre 2000 + DRW_DBG("\nUnknown short (0): "); DRW_DBG(buf->getBitShort()); + } + if (version < DRW::AC1018) {//pre 2004 + dwgHandle hcv = hBbuf->getHandle(); + DRW_DBG("\nhandle of current view: "); DRW_DBGHL(hcv.code, hcv.size, hcv.ref); + } + vars["DIMASO"]=new DRW_Variant(70, buf->getBit()); + vars["DIMSHO"]=new DRW_Variant(70, buf->getBit()); + if (version < DRW::AC1015) {//pre 2000 + vars["DIMSAV"]=new DRW_Variant(70, buf->getBit()); + } + vars["PLINEGEN"]=new DRW_Variant(70, buf->getBit()); + vars["ORTHOMODE"]=new DRW_Variant(70, buf->getBit()); + vars["REGENMODE"]=new DRW_Variant(70, buf->getBit()); + vars["FILLMODE"]=new DRW_Variant(70, buf->getBit()); + vars["QTEXTMODE"]=new DRW_Variant(70, buf->getBit()); + vars["PSLTSCALE"]=new DRW_Variant(70, buf->getBit()); + vars["LIMCHECK"]=new DRW_Variant(70, buf->getBit()); + if (version < DRW::AC1015) {//pre 2000 + vars["BLIPMODE"]=new DRW_Variant(70, buf->getBit()); + } + if (version > DRW::AC1015) {//2004+ + DRW_DBG("\nUndocumented: "); DRW_DBG(buf->getBit()); + } + vars["USRTIMER"]=new DRW_Variant(70, buf->getBit()); + vars["SKPOLY"]=new DRW_Variant(70, buf->getBit()); + vars["ANGDIR"]=new DRW_Variant(70, buf->getBit()); + vars["SPLFRAME"]=new DRW_Variant(70, buf->getBit()); + if (version < DRW::AC1015) {//pre 2000 + vars["ATTREQ"]=new DRW_Variant(70, buf->getBit()); + vars["ATTDIA"]=new DRW_Variant(70, buf->getBit()); + } + vars["MIRRTEXT"]=new DRW_Variant(70, buf->getBit()); + vars["WORLDVIEW"]=new DRW_Variant(70, buf->getBit()); + if (version < DRW::AC1015) {//pre 2000 + vars["WIREFRAME"]=new DRW_Variant(70, buf->getBit()); + } + vars["TILEMODE"]=new DRW_Variant(70, buf->getBit()); + vars["PLIMCHECK"]=new DRW_Variant(70, buf->getBit()); + vars["VISRETAIN"]=new DRW_Variant(70, buf->getBit()); + if (version < DRW::AC1015) {//pre 2000 + vars["DELOBJ"]=new DRW_Variant(70, buf->getBit()); + } + vars["DISPSILH"]=new DRW_Variant(70, buf->getBit()); + vars["PELLIPSE"]=new DRW_Variant(70, buf->getBit()); + vars["PROXIGRAPHICS"]=new DRW_Variant(70, buf->getBitShort());//RLZ short or bit?? + if (version < DRW::AC1015) {//pre 2000 + vars["DRAGMODE"]=new DRW_Variant(70, buf->getBitShort());//RLZ short or bit?? + } + vars["TREEDEPTH"]=new DRW_Variant(70, buf->getBitShort());//RLZ short or bit?? + vars["LUNITS"]=new DRW_Variant(70, buf->getBitShort()); + vars["LUPREC"]=new DRW_Variant(70, buf->getBitShort()); + vars["AUNITS"]=new DRW_Variant(70, buf->getBitShort()); + vars["AUPREC"]=new DRW_Variant(70, buf->getBitShort()); + if (version < DRW::AC1015) {//pre 2000 + vars["OSMODE"]=new DRW_Variant(70, buf->getBitShort()); + } + vars["ATTMODE"]=new DRW_Variant(70, buf->getBitShort()); + if (version < DRW::AC1015) {//pre 2000 + vars["COORDS"]=new DRW_Variant(70, buf->getBitShort()); + } + vars["PDMODE"]=new DRW_Variant(70, buf->getBitShort()); + if (version < DRW::AC1015) {//pre 2000 + vars["PICKSTYLE"]=new DRW_Variant(70, buf->getBitShort()); + } + if (version > DRW::AC1015) {//2004+ + DRW_DBG("\nUnknown long 1: "); DRW_DBG(buf->getBitLong()); + DRW_DBG("\nUnknown long 2: "); DRW_DBG(buf->getBitLong()); + DRW_DBG("\nUnknown long 3: "); DRW_DBG(buf->getBitLong()); + } + vars["USERI1"]=new DRW_Variant(70, buf->getBitShort()); + vars["USERI2"]=new DRW_Variant(70, buf->getBitShort()); + vars["USERI3"]=new DRW_Variant(70, buf->getBitShort()); + vars["USERI4"]=new DRW_Variant(70, buf->getBitShort()); + vars["USERI5"]=new DRW_Variant(70, buf->getBitShort()); + vars["SPLINESEGS"]=new DRW_Variant(70, buf->getBitShort()); + vars["SURFU"]=new DRW_Variant(70, buf->getBitShort()); + vars["SURFV"]=new DRW_Variant(70, buf->getBitShort()); + vars["SURFTYPE"]=new DRW_Variant(70, buf->getBitShort()); + vars["SURFTAB1"]=new DRW_Variant(70, buf->getBitShort()); + vars["SURFTAB2"]=new DRW_Variant(70, buf->getBitShort()); + vars["SPLINETYPE"]=new DRW_Variant(70, buf->getBitShort()); + vars["SHADEDGE"]=new DRW_Variant(70, buf->getBitShort()); + vars["SHADEDIF"]=new DRW_Variant(70, buf->getBitShort()); + vars["UNITMODE"]=new DRW_Variant(70, buf->getBitShort()); + vars["MAXACTVP"]=new DRW_Variant(70, buf->getBitShort()); + vars["ISOLINES"]=new DRW_Variant(70, buf->getBitShort());////////////////// + vars["CMLJUST"]=new DRW_Variant(70, buf->getBitShort()); + vars["TEXTQLTY"]=new DRW_Variant(70, buf->getBitShort());///////////////////// + vars["LTSCALE"]=new DRW_Variant(40, buf->getBitDouble()); + vars["TEXTSIZE"]=new DRW_Variant(40, buf->getBitDouble()); + vars["TRACEWID"]=new DRW_Variant(40, buf->getBitDouble()); + vars["SKETCHINC"]=new DRW_Variant(40, buf->getBitDouble()); + vars["FILLETRAD"]=new DRW_Variant(40, buf->getBitDouble()); + vars["THICKNESS"]=new DRW_Variant(40, buf->getBitDouble()); + vars["ANGBASE"]=new DRW_Variant(50, buf->getBitDouble()); + vars["PDSIZE"]=new DRW_Variant(40, buf->getBitDouble()); + vars["PLINEWID"]=new DRW_Variant(40, buf->getBitDouble()); + vars["USERR1"]=new DRW_Variant(40, buf->getBitDouble()); + vars["USERR2"]=new DRW_Variant(40, buf->getBitDouble()); + vars["USERR3"]=new DRW_Variant(40, buf->getBitDouble()); + vars["USERR4"]=new DRW_Variant(40, buf->getBitDouble()); + vars["USERR5"]=new DRW_Variant(40, buf->getBitDouble()); + vars["CHAMFERA"]=new DRW_Variant(40, buf->getBitDouble()); + vars["CHAMFERB"]=new DRW_Variant(40, buf->getBitDouble()); + vars["CHAMFERC"]=new DRW_Variant(40, buf->getBitDouble()); + vars["CHAMFERD"]=new DRW_Variant(40, buf->getBitDouble()); + vars["FACETRES"]=new DRW_Variant(40, buf->getBitDouble());///////////////////////// + vars["CMLSCALE"]=new DRW_Variant(40, buf->getBitDouble()); + vars["CELTSCALE"]=new DRW_Variant(40, buf->getBitDouble()); + if (version < DRW::AC1021) {//2004- + vars["MENU"]=new DRW_Variant(1, buf->getCP8Text()); + } + ddouble64 msec, day; + day = buf->getBitLong(); + msec = buf->getBitLong(); + while (msec > 0) + msec /=10; + vars["TDCREATE"]=new DRW_Variant(40, day+msec);//RLZ: TODO convert to day.msec +// vars["TDCREATE"]=new DRW_Variant(40, buf->getBitLong());//RLZ: TODO convert to day.msec +// vars["TDCREATE"]=new DRW_Variant(40, buf->getBitLong()); + day = buf->getBitLong(); + msec = buf->getBitLong(); + while (msec > 0) + msec /=10; + vars["TDUPDATE"]=new DRW_Variant(40, day+msec);//RLZ: TODO convert to day.msec +// vars["TDUPDATE"]=new DRW_Variant(40, buf->getBitLong());//RLZ: TODO convert to day.msec +// vars["TDUPDATE"]=new DRW_Variant(40, buf->getBitLong()); + if (version > DRW::AC1015) {//2004+ + DRW_DBG("\nUnknown long 4: "); DRW_DBG(buf->getBitLong()); + DRW_DBG("\nUnknown long 5: "); DRW_DBG(buf->getBitLong()); + DRW_DBG("\nUnknown long 6: "); DRW_DBG(buf->getBitLong()); + } + day = buf->getBitLong(); + msec = buf->getBitLong(); + while (msec > 0) + msec /=10; + vars["TDINDWG"]=new DRW_Variant(40, day+msec);//RLZ: TODO convert to day.msec +// vars["TDINDWG"]=new DRW_Variant(40, buf->getBitLong());//RLZ: TODO convert to day.msec +// vars["TDINDWG"]=new DRW_Variant(40, buf->getBitLong());//RLZ: TODO convert to day.msec + day = buf->getBitLong(); + msec = buf->getBitLong(); + while (msec > 0) + msec /=10; + vars["TDUSRTIMER"]=new DRW_Variant(40, day+msec);//RLZ: TODO convert to day.msec +// vars["TDUSRTIMER"]=new DRW_Variant(40, buf->getBitLong());//RLZ: TODO convert to day.msec +// vars["TDUSRTIMER"]=new DRW_Variant(40, buf->getBitLong());//RLZ: TODO convert to day.msec + vars["CECOLOR"]=new DRW_Variant(62, buf->getCmColor(version));//RLZ: TODO read CMC or EMC color + dwgHandle HANDSEED = buf->getHandle();//allways present in data stream + DRW_DBG("\nHANDSEED: "); DRW_DBGHL(HANDSEED.code, HANDSEED.size, HANDSEED.ref); + dwgHandle CLAYER = hBbuf->getHandle(); + DRW_DBG("\nCLAYER: "); DRW_DBGHL(CLAYER.code, CLAYER.size, CLAYER.ref); + dwgHandle TEXTSTYLE = hBbuf->getHandle(); + DRW_DBG("\nTEXTSTYLE: "); DRW_DBGHL(TEXTSTYLE.code, TEXTSTYLE.size, TEXTSTYLE.ref); + dwgHandle CELTYPE = hBbuf->getHandle(); + DRW_DBG("\nCELTYPE: "); DRW_DBGHL(CELTYPE.code, CELTYPE.size, CELTYPE.ref); + if (version > DRW::AC1018) {//2007+ + dwgHandle CMATERIAL = hBbuf->getHandle(); + DRW_DBG("\nCMATERIAL: "); DRW_DBGHL(CMATERIAL.code, CMATERIAL.size, CMATERIAL.ref); + } + dwgHandle DIMSTYLE = hBbuf->getHandle(); + DRW_DBG("\nDIMSTYLE: "); DRW_DBGHL(DIMSTYLE.code, DIMSTYLE.size, DIMSTYLE.ref); + dwgHandle CMLSTYLE = hBbuf->getHandle(); + DRW_DBG("\nCMLSTYLE: "); DRW_DBGHL(CMLSTYLE.code, CMLSTYLE.size, CMLSTYLE.ref); + if (version > DRW::AC1014) {//2000+ + vars["PSVPSCALE"]=new DRW_Variant(40, buf->getBitDouble()); + } + vars["PINSBASE"]=new DRW_Variant(10, buf->get3BitDouble()); + vars["PEXTMIN"]=new DRW_Variant(10, buf->get3BitDouble()); + vars["PEXTMAX"]=new DRW_Variant(10, buf->get3BitDouble()); + vars["PLIMMIN"]=new DRW_Variant(10, buf->get2RawDouble()); + vars["PLIMMAX"]=new DRW_Variant(10, buf->get2RawDouble()); + vars["PELEVATION"]=new DRW_Variant(40, buf->getBitDouble()); + vars["PUCSORG"]=new DRW_Variant(10, buf->get3BitDouble()); + vars["PUCSXDIR"]=new DRW_Variant(10, buf->get3BitDouble()); + vars["PUCSYDIR"]=new DRW_Variant(10, buf->get3BitDouble()); + dwgHandle PUCSNAME = hBbuf->getHandle(); + DRW_DBG("\nPUCSNAME: "); DRW_DBGHL(PUCSNAME.code, PUCSNAME.size, PUCSNAME.ref); + if (version > DRW::AC1014) {//2000+ + dwgHandle PUCSORTHOREF = hBbuf->getHandle(); + DRW_DBG("\nPUCSORTHOREF: "); DRW_DBGHL(PUCSORTHOREF.code, PUCSORTHOREF.size, PUCSORTHOREF.ref); + vars["PUCSORTHOVIEW"]=new DRW_Variant(70, buf->getBitShort()); + dwgHandle PUCSBASE = hBbuf->getHandle(); + DRW_DBG("\nPUCSBASE: "); DRW_DBGHL(PUCSBASE.code, PUCSBASE.size, PUCSBASE.ref); + vars["PUCSORGTOP"]=new DRW_Variant(10, buf->get3BitDouble()); + vars["PUCSORGBOTTOM"]=new DRW_Variant(10, buf->get3BitDouble()); + vars["PUCSORGLEFT"]=new DRW_Variant(10, buf->get3BitDouble()); + vars["PUCSORGRIGHT"]=new DRW_Variant(10, buf->get3BitDouble()); + vars["PUCSORGFRONT"]=new DRW_Variant(10, buf->get3BitDouble()); + vars["PUCSORGBACK"]=new DRW_Variant(10, buf->get3BitDouble()); + } + vars["INSBASE"]=new DRW_Variant(10, buf->get3BitDouble()); + vars["EXTMIN"]=new DRW_Variant(10, buf->get3BitDouble()); + vars["EXTMAX"]=new DRW_Variant(10, buf->get3BitDouble()); + vars["LIMMIN"]=new DRW_Variant(10, buf->get2RawDouble()); + vars["LIMMAX"]=new DRW_Variant(10, buf->get2RawDouble()); + vars["ELEVATION"]=new DRW_Variant(40, buf->getBitDouble()); + vars["UCSORG"]=new DRW_Variant(10, buf->get3BitDouble()); + vars["UCSXDIR"]=new DRW_Variant(10, buf->get3BitDouble()); + vars["UCSYDIR"]=new DRW_Variant(10, buf->get3BitDouble()); + dwgHandle UCSNAME = hBbuf->getHandle(); + DRW_DBG("\nUCSNAME: "); DRW_DBGHL(UCSNAME.code, UCSNAME.size, UCSNAME.ref); + if (version > DRW::AC1014) {//2000+ + dwgHandle UCSORTHOREF = hBbuf->getHandle(); + DRW_DBG("\nUCSORTHOREF: "); DRW_DBGHL(UCSORTHOREF.code, UCSORTHOREF.size, UCSORTHOREF.ref); + vars["UCSORTHOVIEW"]=new DRW_Variant(70, buf->getBitShort()); + dwgHandle UCSBASE = hBbuf->getHandle(); + DRW_DBG("\nUCSBASE: "); DRW_DBGHL(UCSBASE.code, UCSBASE.size, UCSBASE.ref); + vars["UCSORGTOP"]=new DRW_Variant(10, buf->get3BitDouble()); + vars["UCSORGBOTTOM"]=new DRW_Variant(10, buf->get3BitDouble()); + vars["UCSORGLEFT"]=new DRW_Variant(10, buf->get3BitDouble()); + vars["UCSORGRIGHT"]=new DRW_Variant(10, buf->get3BitDouble()); + vars["UCSORGFRONT"]=new DRW_Variant(10, buf->get3BitDouble()); + vars["UCSORGBACK"]=new DRW_Variant(10, buf->get3BitDouble()); + if (version < DRW::AC1021) {//2004- + vars["DIMPOST"]=new DRW_Variant(1, buf->getCP8Text()); + vars["DIMAPOST"]=new DRW_Variant(1, buf->getCP8Text()); + } + } + if (version < DRW::AC1015) {//r14- + vars["DIMTOL"]=new DRW_Variant(70, buf->getBit()); + vars["DIMLIM"]=new DRW_Variant(70, buf->getBit()); + vars["DIMTIH"]=new DRW_Variant(70, buf->getBit()); + vars["DIMTOH"]=new DRW_Variant(70, buf->getBit()); + vars["DIMSE1"]=new DRW_Variant(70, buf->getBit()); + vars["DIMSE2"]=new DRW_Variant(70, buf->getBit()); + vars["DIMALT"]=new DRW_Variant(70, buf->getBit()); + vars["DIMTOFL"]=new DRW_Variant(70, buf->getBit()); + vars["DIMSAH"]=new DRW_Variant(70, buf->getBit()); + vars["DIMTIX"]=new DRW_Variant(70, buf->getBit()); + vars["DIMSOXD"]=new DRW_Variant(70, buf->getBit()); + vars["DIMALTD"]=new DRW_Variant(70, buf->getRawChar8()); + vars["DIMZIN"]=new DRW_Variant(70, buf->getRawChar8()); + vars["DIMSD1"]=new DRW_Variant(70, buf->getBit()); + vars["DIMSD2"]=new DRW_Variant(70, buf->getBit()); + vars["DIMTOLJ"]=new DRW_Variant(70, buf->getRawChar8()); + vars["DIMJUST"]=new DRW_Variant(70, buf->getRawChar8()); + vars["DIMFIT"]=new DRW_Variant(70, buf->getRawChar8());/////////// + vars["DIMUPT"]=new DRW_Variant(70, buf->getBit()); + vars["DIMTZIN"]=new DRW_Variant(70, buf->getRawChar8()); + vars["DIMALTZ"]=new DRW_Variant(70, buf->getRawChar8()); + vars["DIMALTTZ"]=new DRW_Variant(70, buf->getRawChar8()); + vars["DIMTAD"]=new DRW_Variant(70, buf->getRawChar8()); + vars["DIMUNIT"]=new DRW_Variant(70, buf->getBitShort());/////////// + vars["DIMAUNIT"]=new DRW_Variant(70, buf->getBitShort()); + vars["DIMDEC"]=new DRW_Variant(70, buf->getBitShort()); + vars["DIMTDEC"]=new DRW_Variant(70, buf->getBitShort()); + vars["DIMALTU"]=new DRW_Variant(70, buf->getBitShort()); + vars["DIMALTTD"]=new DRW_Variant(70, buf->getBitShort()); + dwgHandle DIMTXSTY = hBbuf->getHandle(); + DRW_DBG("\nDIMTXSTY: "); DRW_DBGHL(DIMTXSTY.code, DIMTXSTY.size, DIMTXSTY.ref); + } + vars["DIMSCALE"]=new DRW_Variant(40, buf->getBitDouble()); + vars["DIMASZ"]=new DRW_Variant(40, buf->getBitDouble()); + vars["DIMEXO"]=new DRW_Variant(40, buf->getBitDouble()); + vars["DIMDLI"]=new DRW_Variant(40, buf->getBitDouble()); + vars["DIMEXE"]=new DRW_Variant(40, buf->getBitDouble()); + vars["DIMRND"]=new DRW_Variant(40, buf->getBitDouble()); + vars["DIMDLE"]=new DRW_Variant(40, buf->getBitDouble()); + vars["DIMTP"]=new DRW_Variant(40, buf->getBitDouble()); + vars["DIMTM"]=new DRW_Variant(40, buf->getBitDouble()); + if (version > DRW::AC1018) {//2007+ + vars["DIMFXL"]=new DRW_Variant(40, buf->getBitDouble());////////////////// + vars["DIMJOGANG"]=new DRW_Variant(40, buf->getBitDouble());/////////////// + vars["DIMTFILL"]=new DRW_Variant(70, buf->getBitShort()); + vars["DIMTFILLCLR"]=new DRW_Variant(62, buf->getCmColor(version)); + } + if (version > DRW::AC1014) {//2000+ + vars["DIMTOL"]=new DRW_Variant(70, buf->getBit()); + vars["DIMLIM"]=new DRW_Variant(70, buf->getBit()); + vars["DIMTIH"]=new DRW_Variant(70, buf->getBit()); + vars["DIMTOH"]=new DRW_Variant(70, buf->getBit()); + vars["DIMSE1"]=new DRW_Variant(70, buf->getBit()); + vars["DIMSE2"]=new DRW_Variant(70, buf->getBit()); + vars["DIMTAD"]=new DRW_Variant(70, buf->getBitShort()); + vars["DIMZIN"]=new DRW_Variant(70, buf->getBitShort()); + vars["DIMAZIN"]=new DRW_Variant(70, buf->getBitShort()); + } + if (version > DRW::AC1018) {//2007+ + vars["DIMARCSYM"]=new DRW_Variant(70, buf->getBitShort()); + } + vars["DIMTXT"]=new DRW_Variant(40, buf->getBitDouble()); + vars["DIMCEN"]=new DRW_Variant(40, buf->getBitDouble()); + vars["DIMTSZ"]=new DRW_Variant(40, buf->getBitDouble()); + vars["DIMALTF"]=new DRW_Variant(40, buf->getBitDouble()); + vars["DIMLFAC"]=new DRW_Variant(40, buf->getBitDouble()); + vars["DIMTVP"]=new DRW_Variant(40, buf->getBitDouble()); + vars["DIMTFAC"]=new DRW_Variant(40, buf->getBitDouble()); + vars["DIMGAP"]=new DRW_Variant(40, buf->getBitDouble()); + if (version < DRW::AC1015) {//r14- + vars["DIMPOST"]=new DRW_Variant(1, buf->getCP8Text()); + vars["DIMAPOST"]=new DRW_Variant(1, buf->getCP8Text()); + vars["DIMBLK"]=new DRW_Variant(1, buf->getCP8Text()); + vars["DIMBLK1"]=new DRW_Variant(1, buf->getCP8Text()); + vars["DIMBLK2"]=new DRW_Variant(1, buf->getCP8Text()); + } + if (version > DRW::AC1014) {//2000+ + vars["DIMALTRND"]=new DRW_Variant(40, buf->getBitDouble()); + vars["DIMALT"]=new DRW_Variant(70, buf->getBit()); + vars["DIMALTD"]=new DRW_Variant(70, buf->getBitShort()); + vars["DIMTOFL"]=new DRW_Variant(70, buf->getBit()); + vars["DIMSAH"]=new DRW_Variant(70, buf->getBit()); + vars["DIMTIX"]=new DRW_Variant(70, buf->getBit()); + vars["DIMSOXD"]=new DRW_Variant(70, buf->getBit()); + } + vars["DIMCLRD"]=new DRW_Variant(70, buf->getCmColor(version));//RLZ: TODO read CMC or EMC color + vars["DIMCLRE"]=new DRW_Variant(70, buf->getCmColor(version));//RLZ: TODO read CMC or EMC color + vars["DIMCLRT"]=new DRW_Variant(70, buf->getCmColor(version));//RLZ: TODO read CMC or EMC color + if (version > DRW::AC1014) {//2000+ + vars["DIAMDEC"]=new DRW_Variant(70, buf->getBitShort()); + vars["DIMDEC"]=new DRW_Variant(70, buf->getBitShort()); + vars["DIMTDEC"]=new DRW_Variant(70, buf->getBitShort()); + vars["DIMALTU"]=new DRW_Variant(70, buf->getBitShort()); + vars["DIMALTTD"]=new DRW_Variant(70, buf->getBitShort()); + vars["DIMAUNIT"]=new DRW_Variant(70, buf->getBitShort()); + vars["DIMFAC"]=new DRW_Variant(70, buf->getBitShort());///////////////// DIMFAC O DIMFRAC + vars["DIMLUNIT"]=new DRW_Variant(70, buf->getBitShort()); + vars["DIMDSEP"]=new DRW_Variant(70, buf->getBitShort()); + vars["DIMTMOVE"]=new DRW_Variant(70, buf->getBitShort()); + vars["DIMJUST"]=new DRW_Variant(70, buf->getBitShort()); + vars["DIMSD1"]=new DRW_Variant(70, buf->getBit()); + vars["DIMSD2"]=new DRW_Variant(70, buf->getBit()); + vars["DIMTOLJ"]=new DRW_Variant(70, buf->getBitShort()); + vars["DIMTZIN"]=new DRW_Variant(70, buf->getBitShort()); + vars["DIMALTZ"]=new DRW_Variant(70, buf->getBitShort()); + vars["DIMALTTZ"]=new DRW_Variant(70, buf->getBitShort()); + vars["DIMUPT"]=new DRW_Variant(70, buf->getBit()); + vars["DIMATFIT"]=new DRW_Variant(70, buf->getBitShort()); + } + if (version > DRW::AC1018) {//2007+ + vars["DIMFXLON"]=new DRW_Variant(70, buf->getBit());//////////////// + } + if (version > DRW::AC1021) {//2010+ + vars["DIMTXTDIRECTION"]=new DRW_Variant(70, buf->getBit());//////////////// + vars["DIMALTMZF"]=new DRW_Variant(40, buf->getBitDouble());//////////////// + vars["DIMMZF"]=new DRW_Variant(40, buf->getBitDouble());//////////////// + } + if (version > DRW::AC1014) {//2000+ + dwgHandle DIMTXSTY = hBbuf->getHandle(); + DRW_DBG("\nDIMTXSTY: "); DRW_DBGHL(DIMTXSTY.code, DIMTXSTY.size, DIMTXSTY.ref); + dwgHandle DIMLDRBLK = hBbuf->getHandle(); + DRW_DBG("\nDIMLDRBLK: "); DRW_DBGHL(DIMLDRBLK.code, DIMLDRBLK.size, DIMLDRBLK.ref); + dwgHandle DIMBLK = hBbuf->getHandle(); + DRW_DBG("\nDIMBLK: "); DRW_DBGHL(DIMBLK.code, DIMBLK.size, DIMBLK.ref); + dwgHandle DIMBLK1 = hBbuf->getHandle(); + DRW_DBG("\nDIMBLK1: "); DRW_DBGHL(DIMBLK1.code, DIMBLK1.size, DIMBLK1.ref); + dwgHandle DIMBLK2 = hBbuf->getHandle(); + DRW_DBG("\nDIMBLK2: "); DRW_DBGHL(DIMBLK2.code, DIMBLK2.size, DIMBLK2.ref); + } + if (version > DRW::AC1018) {//2007+ + dwgHandle DIMLTYPE = hBbuf->getHandle(); + DRW_DBG("\nDIMLTYPE: "); DRW_DBGHL(DIMLTYPE.code, DIMLTYPE.size, DIMLTYPE.ref); + dwgHandle DIMLTEX1 = hBbuf->getHandle(); + DRW_DBG("\nDIMLTEX1: "); DRW_DBGHL(DIMLTEX1.code, DIMLTEX1.size, DIMLTEX1.ref); + dwgHandle DIMLTEX2 = hBbuf->getHandle(); + DRW_DBG("\nDIMLTEX2: "); DRW_DBGHL(DIMLTEX2.code, DIMLTEX2.size, DIMLTEX2.ref); + } + if (version > DRW::AC1014) {//2000+ + vars["DIMLWD"]=new DRW_Variant(70, buf->getBitShort()); + vars["DIMLWE"]=new DRW_Variant(70, buf->getBitShort()); + } + dwgHandle CONTROL = hBbuf->getHandle(); + DRW_DBG("\nBLOCK CONTROL: "); DRW_DBGHL(CONTROL.code, CONTROL.size, CONTROL.ref); + blockCtrl = CONTROL.ref; + CONTROL = hBbuf->getHandle(); + DRW_DBG("\nLAYER CONTROL: "); DRW_DBGHL(CONTROL.code, CONTROL.size, CONTROL.ref); + layerCtrl = CONTROL.ref; + CONTROL = hBbuf->getHandle(); + DRW_DBG("\nSTYLE CONTROL: "); DRW_DBGHL(CONTROL.code, CONTROL.size, CONTROL.ref); + styleCtrl = CONTROL.ref; + CONTROL = hBbuf->getHandle(); + DRW_DBG("\nLINETYPE CONTROL: "); DRW_DBGHL(CONTROL.code, CONTROL.size, CONTROL.ref); + linetypeCtrl = CONTROL.ref; + CONTROL = hBbuf->getHandle(); + DRW_DBG("\nVIEW CONTROL: "); DRW_DBGHL(CONTROL.code, CONTROL.size, CONTROL.ref); + viewCtrl = CONTROL.ref; + CONTROL = hBbuf->getHandle(); + DRW_DBG("\nUCS CONTROL: "); DRW_DBGHL(CONTROL.code, CONTROL.size, CONTROL.ref); + ucsCtrl = CONTROL.ref; + CONTROL = hBbuf->getHandle(); + DRW_DBG("\nVPORT CONTROL: "); DRW_DBGHL(CONTROL.code, CONTROL.size, CONTROL.ref); + vportCtrl = CONTROL.ref; + CONTROL = hBbuf->getHandle(); + DRW_DBG("\nAPPID CONTROL: "); DRW_DBGHL(CONTROL.code, CONTROL.size, CONTROL.ref); + appidCtrl = CONTROL.ref; + CONTROL = hBbuf->getHandle(); + DRW_DBG("\nDIMSTYLE CONTROL: "); DRW_DBGHL(CONTROL.code, CONTROL.size, CONTROL.ref); + dimstyleCtrl = CONTROL.ref; + if (version < DRW::AC1018) {//r2000- + CONTROL = hBbuf->getHandle(); + DRW_DBG("\nVIEWPORT ENTITY HEADER CONTROL: "); DRW_DBGHL(CONTROL.code, CONTROL.size, CONTROL.ref); + vpEntHeaderCtrl = CONTROL.ref; //RLZ: only in R13-R15 ???? + } + CONTROL = hBbuf->getHandle(); + DRW_DBG("\nDICT ACAD_GROUP: "); DRW_DBGHL(CONTROL.code, CONTROL.size, CONTROL.ref); + CONTROL = hBbuf->getHandle(); + DRW_DBG("\nDICT ACAD_MLINESTYLE: "); DRW_DBGHL(CONTROL.code, CONTROL.size, CONTROL.ref); + CONTROL = hBbuf->getHandle(); + DRW_DBG("\nDICT NAMED OBJS: "); DRW_DBGHL(CONTROL.code, CONTROL.size, CONTROL.ref); + + if (version > DRW::AC1014) {//2000+ + vars["TSTACKALIGN"]=new DRW_Variant(70, buf->getBitShort()); + vars["TSTACKSIZE"]=new DRW_Variant(70, buf->getBitShort()); + if (version < DRW::AC1021) {//2004- + vars["HYPERLINKBASE"]=new DRW_Variant(1, buf->getCP8Text()); + vars["STYLESHEET"]=new DRW_Variant(1, buf->getCP8Text()); + } + CONTROL = hBbuf->getHandle(); + DRW_DBG("\nDICT LAYOUTS: "); DRW_DBGHL(CONTROL.code, CONTROL.size, CONTROL.ref); + CONTROL = hBbuf->getHandle(); + DRW_DBG("\nDICT PLOTSETTINGS: "); DRW_DBGHL(CONTROL.code, CONTROL.size, CONTROL.ref); + CONTROL = hBbuf->getHandle(); + DRW_DBG("\nDICT PLOTSTYLES: "); DRW_DBGHL(CONTROL.code, CONTROL.size, CONTROL.ref); + } + if (version > DRW::AC1015) {//2004+ + CONTROL = hBbuf->getHandle(); + DRW_DBG("\nDICT MATERIALS: "); DRW_DBGHL(CONTROL.code, CONTROL.size, CONTROL.ref); + CONTROL = hBbuf->getHandle(); + DRW_DBG("\nDICT COLORS: "); DRW_DBGHL(CONTROL.code, CONTROL.size, CONTROL.ref); + } + if (version > DRW::AC1018) {//2007+ + CONTROL = hBbuf->getHandle(); + DRW_DBG("\nDICT VISUALSTYLE: "); DRW_DBGHL(CONTROL.code, CONTROL.size, CONTROL.ref); + } + if (version > DRW::AC1024) {//2013+ + CONTROL = hBbuf->getHandle(); + DRW_DBG("\nUNKNOWN HANDLE: "); DRW_DBGHL(CONTROL.code, CONTROL.size, CONTROL.ref); + } + if (version > DRW::AC1014) {//2000+ + DRW_DBG("\nFlags: "); DRW_DBGH(buf->getBitLong());//RLZ TODO change to 8 vars + vars["INSUNITS"]=new DRW_Variant(70, buf->getBitShort()); + duint16 cepsntype = buf->getBitShort(); + vars["CEPSNTYPE"]=new DRW_Variant(70, cepsntype); + if (cepsntype == 3){ + CONTROL = hBbuf->getHandle(); + DRW_DBG("\nCPSNID HANDLE: "); DRW_DBGHL(CONTROL.code, CONTROL.size, CONTROL.ref); + } + if (version < DRW::AC1021) {//2004- + vars["FINGERPRINTGUID"]=new DRW_Variant(1, buf->getCP8Text()); + vars["VERSIONGUID"]=new DRW_Variant(1, buf->getCP8Text()); + } + } + if (version > DRW::AC1015) {//2004+ + vars["SORTENTS"]=new DRW_Variant(70, buf->getRawChar8()); + vars["INDEXCTL"]=new DRW_Variant(70, buf->getRawChar8()); + vars["HIDETEXT"]=new DRW_Variant(70, buf->getRawChar8()); + vars["XCLIPFRAME"]=new DRW_Variant(70, buf->getRawChar8()); + vars["DIMASSOC"]=new DRW_Variant(70, buf->getRawChar8()); + vars["HALOGAP"]=new DRW_Variant(70, buf->getRawChar8()); + vars["OBSCUREDCOLOR"]=new DRW_Variant(70, buf->getBitShort()); + vars["INTERSECTIONCOLOR"]=new DRW_Variant(70, buf->getBitShort()); + vars["OBSCUREDLTYPE"]=new DRW_Variant(70, buf->getRawChar8()); + vars["INTERSECTIONDISPLAY"]=new DRW_Variant(70, buf->getRawChar8()); + if (version < DRW::AC1021) {//2004- + vars["PROJECTNAME"]=new DRW_Variant(1, buf->getCP8Text()); + } + } + CONTROL = hBbuf->getHandle(); + DRW_DBG("\nBLOCK PAPER_SPACE: "); DRW_DBGHL(CONTROL.code, CONTROL.size, CONTROL.ref); + CONTROL = hBbuf->getHandle(); + DRW_DBG("\nBLOCK MODEL_SPACE: "); DRW_DBGHL(CONTROL.code, CONTROL.size, CONTROL.ref); + CONTROL = hBbuf->getHandle(); + DRW_DBG("\nLTYPE BYLAYER: "); DRW_DBGHL(CONTROL.code, CONTROL.size, CONTROL.ref); + CONTROL = hBbuf->getHandle(); + DRW_DBG("\nLTYPE BYBLOCK: "); DRW_DBGHL(CONTROL.code, CONTROL.size, CONTROL.ref); + CONTROL = hBbuf->getHandle(); + DRW_DBG("\nLTYPE CONTINUOUS: "); DRW_DBGHL(CONTROL.code, CONTROL.size, CONTROL.ref); + if (version > DRW::AC1018) {//2007+ + vars["CAMERADISPLAY"]=new DRW_Variant(70, buf->getBit()); + DRW_DBG("\nUnknown 2007+ long1: "); DRW_DBG(buf->getBitLong()); + DRW_DBG("\nUnknown 2007+ long2: "); DRW_DBG(buf->getBitLong()); + DRW_DBG("\nUnknown 2007+ double2: "); DRW_DBG(buf->getBitDouble()); + vars["STEPSPERSEC"]=new DRW_Variant(40, buf->getBitDouble()); + vars["STEPSIZE"]=new DRW_Variant(40, buf->getBitDouble()); + vars["3DDWFPREC"]=new DRW_Variant(40, buf->getBitDouble()); + vars["LENSLENGTH"]=new DRW_Variant(40, buf->getBitDouble()); + vars["CAMERAHEIGHT"]=new DRW_Variant(40, buf->getBitDouble()); + vars["SOLIDHIST"]=new DRW_Variant(70, buf->getRawChar8()); + vars["SHOWHIST"]=new DRW_Variant(70, buf->getRawChar8()); + vars["PSOLWIDTH"]=new DRW_Variant(40, buf->getBitDouble()); + vars["PSOLHEIGHT"]=new DRW_Variant(40, buf->getBitDouble()); + vars["LOFTANG1"]=new DRW_Variant(40, buf->getBitDouble()); + vars["LOFTANG2"]=new DRW_Variant(40, buf->getBitDouble()); + vars["LOFTMAG1"]=new DRW_Variant(40, buf->getBitDouble()); + vars["LOFTMAG2"]=new DRW_Variant(40, buf->getBitDouble()); + vars["LOFTPARAM"]=new DRW_Variant(70, buf->getBitShort()); + vars["LOFTNORMALS"]=new DRW_Variant(40, buf->getRawChar8()); + vars["LATITUDE"]=new DRW_Variant(40, buf->getBitDouble()); + vars["LONGITUDE"]=new DRW_Variant(40, buf->getBitDouble()); + vars["NORTHDIRECTION"]=new DRW_Variant(40, buf->getBitDouble()); + vars["TIMEZONE"]=new DRW_Variant(70, buf->getBitLong()); + vars["LIGHTGLYPHDISPLAY"]=new DRW_Variant(70, buf->getRawChar8()); + vars["TILEMODELIGHTSYNCH"]=new DRW_Variant(70, buf->getRawChar8()); + vars["DWFFRAME"]=new DRW_Variant(70, buf->getRawChar8()); + vars["DGNFRAME"]=new DRW_Variant(70, buf->getRawChar8()); + DRW_DBG("\nUnknown 2007+ BIT: "); DRW_DBG(buf->getBit()); + vars["INTERFERECOLOR"]=new DRW_Variant(70, buf->getCmColor(version)); + CONTROL = hBbuf->getHandle(); + DRW_DBG("\nINTERFEREOBJVS: "); DRW_DBGHL(CONTROL.code, CONTROL.size, CONTROL.ref); + CONTROL = hBbuf->getHandle(); + DRW_DBG("\nINTERFEREVPVS: "); DRW_DBGHL(CONTROL.code, CONTROL.size, CONTROL.ref); + CONTROL = hBbuf->getHandle(); + DRW_DBG("\nDRAGVS: "); DRW_DBGHL(CONTROL.code, CONTROL.size, CONTROL.ref); + vars["CSHADOW"]=new DRW_Variant(70, buf->getRawChar8()); + DRW_DBG("\nUnknown 2007+ double2: "); DRW_DBG(buf->getBitDouble()); + } + if (version > DRW::AC1012) {//R14+ + DRW_DBG("\nUnknown R14+ short1: "); DRW_DBG(buf->getBitShort()); + DRW_DBG("\nUnknown R14+ short2: "); DRW_DBG(buf->getBitShort()); + DRW_DBG("\nUnknown R14+ short3: "); DRW_DBG(buf->getBitShort()); + DRW_DBG("\nUnknown R14+ short4: "); DRW_DBG(buf->getBitShort()); + } + + DRW_DBG("\nbuf position: "); DRW_DBG(buf->getPosition()); + DRW_DBG(" buf bit position: "); DRW_DBG(buf->getBitPos()); + + + /**** RLZ: disabled, pending to read all data ***/ + //Start reading string stream for 2007 and further + if (version > DRW::AC1018) {//2007+ + duint32 strStartPos = endBitPos -1; + buf->setPosition(strStartPos >>3); + buf->setBitPos(strStartPos&7); + if (buf->getBit() == 1){ + strStartPos -= 16; + buf->setPosition(strStartPos >>3); + buf->setBitPos(strStartPos&7); + duint32 strDataSize = buf->getRawShort16(); + if (strDataSize & 0x8000) { + strStartPos -= 16;//decrement 16 bits + strDataSize &= 0x7FFF; //strip 0x8000; + buf->setPosition(strStartPos >> 3); + buf->setBitPos(strStartPos & 7); + duint32 hiSize = buf->getRawShort16(); + strDataSize |= (hiSize << 15); + } + strStartPos -= strDataSize; + buf->setPosition(strStartPos >> 3); + buf->setBitPos(strStartPos & 7); + + DRW_DBG("\nstring buf position: "); DRW_DBG(buf->getPosition()); + DRW_DBG("\nstring buf bit position: "); DRW_DBG(buf->getBitPos()); + } + DRW_DBG("\nUnknown text1: "); DRW_DBG(buf->getUCSText(false)); + DRW_DBG("\nUnknown text2: "); DRW_DBG(buf->getUCSText(false)); + DRW_DBG("\nUnknown text3: "); DRW_DBG(buf->getUCSText(false)); + DRW_DBG("\nUnknown text4: "); DRW_DBG(buf->getUCSText(false)); + vars["MENU"]=new DRW_Variant(1, buf->getUCSText(false)); + vars["DIMPOST"]=new DRW_Variant(1, buf->getUCSText(false)); + vars["DIMAPOST"]=new DRW_Variant(1, buf->getUCSText(false)); + if (version > DRW::AC1021) {//2010+ + vars["DIMALTMZS"]=new DRW_Variant(70, buf->getUCSText(false));//RLZ: pending to verify////////////// + vars["DIMMZS"]=new DRW_Variant(70, buf->getUCSText(false));//RLZ: pending to verify////////////// + } + vars["HYPERLINKBASE"]=new DRW_Variant(1, buf->getUCSText(false)); + vars["STYLESHEET"]=new DRW_Variant(1, buf->getUCSText(false)); + vars["FINGERPRINTGUID"]=new DRW_Variant(1, buf->getUCSText(false)); + DRW_DBG("\nstring buf position: "); DRW_DBG(buf->getPosition()); + DRW_DBG(" string buf bit position: "); DRW_DBG(buf->getBitPos()); + vars["VERSIONGUID"]=new DRW_Variant(1, buf->getUCSText(false)); + DRW_DBG("\nstring buf position: "); DRW_DBG(buf->getPosition()); + DRW_DBG(" string buf bit position: "); DRW_DBG(buf->getBitPos()); + vars["PROJECTNAME"]=new DRW_Variant(1, buf->getUCSText(false)); + } +/*** ****/ + DRW_DBG("\nstring buf position: "); DRW_DBG(buf->getPosition()); + DRW_DBG(" string buf bit position: "); DRW_DBG(buf->getBitPos()); + + if (DRW_DBGGL == DRW_dbg::DEBUG){ + for (std::map::iterator it=vars.begin(); it!=vars.end(); ++it){ + DRW_DBG("\n"); DRW_DBG(it->first); DRW_DBG(": "); + switch (it->second->type){ + case DRW_Variant::INTEGER: + DRW_DBG(it->second->content.i); + break; + case DRW_Variant::DOUBLE: + DRW_DBG(it->second->content.d); + break; + case DRW_Variant::STRING: + DRW_DBG(it->second->content.s->c_str()); + break; + case DRW_Variant::COORD: + DRW_DBG("x= "); DRW_DBG(it->second->content.v->x); + DRW_DBG(", y= "); DRW_DBG(it->second->content.v->y); + DRW_DBG(", z= "); DRW_DBG(it->second->content.v->z); + break; + default: + break; + } + DRW_DBG(" code: ");DRW_DBG(it->second->code); + } + } + + buf->setPosition(size+16+4); //readed size +16 start sentinel + 4 size + if (version > DRW::AC1021 && mv > 3) { //2010+ + buf->getRawLong32();//advance 4 bytes (hisize) + } + DRW_DBG("\nseting position to: "); DRW_DBG(buf->getPosition()); + DRW_DBG("\nHeader CRC: "); DRW_DBGH(buf->getRawShort16()); + DRW_DBG("\nbuf position: "); DRW_DBG(buf->getPosition()); + DRW_DBG("\ndwg header end sentinel= "); + for (int i=0; i<16;i++) { + DRW_DBGH(buf->getRawChar8()); DRW_DBG(" "); + } + + //temporary code to show header end sentinel + duint64 sz= buf->size()-1; + if (version < DRW::AC1018) {//pre 2004 + sz= buf->size()-16; + buf->setPosition(sz); + DRW_DBG("\nseting position to: "); DRW_DBG(buf->getPosition()); + DRW_DBG("\ndwg header end sentinel= "); + for (int i=0; i<16;i++) { + DRW_DBGH(buf->getRawChar8()); DRW_DBG(" "); + } + } else if (version == DRW::AC1018) {//2004 +// sz= buf->size()-132; +// buf->setPosition(sz); + buf->moveBitPos(-128); + DRW_DBG("\nseting position to: "); DRW_DBG(buf->getPosition()); + DRW_DBG("\ndwg header end sentinel= "); + for (int i=0; i<16;i++) { + DRW_DBGH(buf->getRawChar8()); DRW_DBG(" "); + } + } else if (version == DRW::AC1021) {//2007 + sz= buf->size()-16; + buf->setPosition(sz); + DRW_DBG("\nseting position to: "); DRW_DBG(buf->getPosition()); + DRW_DBG("\ndwg header end sentinel= "); + for (int i=0; i<16;i++) { + DRW_DBGH(buf->getRawChar8()); DRW_DBG(" "); + } + } else if (version == DRW::AC1024) {//2010 +// sz= buf->size()-93; +// buf->setPosition(sz); + buf->moveBitPos(-128); + DRW_DBG("\nseting position to: "); DRW_DBG(buf->getPosition()); + DRW_DBG("\ndwg header end sentinel= "); + for (int i=0; i<16;i++) { + DRW_DBGH(buf->getRawChar8()); DRW_DBG(" "); + } + } else if (version == DRW::AC1027) {//2013 +// sz= buf->size()-76; +// buf->setPosition(sz); + buf->moveBitPos(-128); + DRW_DBG("\nseting position to: "); DRW_DBG(buf->getPosition()); + DRW_DBG("\ndwg header end sentinel= "); + for (int i=0; i<16;i++) { + DRW_DBGH(buf->getRawChar8()); DRW_DBG(" "); + } + } + + return result; +} diff --git a/extlib/libdxfrw/drw_header.h b/extlib/libdxfrw/drw_header.h new file mode 100644 index 0000000..a8fdc8e --- /dev/null +++ b/extlib/libdxfrw/drw_header.h @@ -0,0 +1,107 @@ +/****************************************************************************** +** libDXFrw - Library to read/write DXF files (ascii & binary) ** +** ** +** Copyright (C) 2011-2015 José F. Soriano, rallazz@gmail.com ** +** ** +** This library is free software, licensed under the terms of the GNU ** +** General Public License as published by the Free Software Foundation, ** +** either version 2 of the License, or (at your option) any later version. ** +** You should have received a copy of the GNU General Public License ** +** along with this program. If not, see . ** +******************************************************************************/ + +#ifndef DRW_HEADER_H +#define DRW_HEADER_H + + +#include +#include "drw_base.h" + +class dxfReader; +class dxfWriter; +class dwgBuffer; + +#define SETHDRFRIENDS friend class dxfRW; \ + friend class dwgReader; + +//! Class to handle header entries +/*! +* Class to handle header vars, to read iterate over "std::map vars" +* to write add a DRW_Variant* into "std::map vars" (do not delete it, are cleared in dtor) +* or use add* helper functions. +* @author Rallaz +*/ +class DRW_Header { + SETHDRFRIENDS +public: + DRW_Header(); + ~DRW_Header() { + clearVars(); + } + + DRW_Header(const DRW_Header& h){ + this->version = h.version; + this->comments = h.comments; + for (std::map::const_iterator it=h.vars.begin(); it!=h.vars.end(); ++it){ + this->vars[it->first] = new DRW_Variant( *(it->second) ); + } + this->curr = NULL; + } + DRW_Header& operator=(const DRW_Header &h) { + if(this != &h) { + clearVars(); + this->version = h.version; + this->comments = h.comments; + for (std::map::const_iterator it=h.vars.begin(); it!=h.vars.end(); ++it){ + this->vars[it->first] = new DRW_Variant( *(it->second) ); + } + } + return *this; + } + + void addDouble(std::string key, double value, int code); + void addInt(std::string key, int value, int code); + void addStr(std::string key, std::string value, int code); + void addCoord(std::string key, DRW_Coord value, int code); + std::string getComments() const {return comments;} + void write(dxfWriter *writer, DRW::Version ver); + void addComment(std::string c); + +protected: + void parseCode(int code, dxfReader *reader); + bool parseDwg(DRW::Version version, dwgBuffer *buf, dwgBuffer *hBbuf, duint8 mv=0); +private: + bool getDouble(std::string key, double *varDouble); + bool getInt(std::string key, int *varInt); + bool getStr(std::string key, std::string *varStr); + bool getCoord(std::string key, DRW_Coord *varStr); + void clearVars(){ + for (std::map::iterator it=vars.begin(); it!=vars.end(); ++it) + delete it->second; + + vars.clear(); + } + +public: + std::map vars; +private: + std::string comments; + std::string name; + DRW_Variant* curr; + int version; //to use on read + + duint32 linetypeCtrl; + duint32 layerCtrl; + duint32 styleCtrl; + duint32 dimstyleCtrl; + duint32 appidCtrl; + duint32 blockCtrl; + duint32 viewCtrl; + duint32 ucsCtrl; + duint32 vportCtrl; + duint32 vpEntHeaderCtrl; +}; + +#endif + +// EOF diff --git a/extlib/libdxfrw/drw_interface.h b/extlib/libdxfrw/drw_interface.h new file mode 100644 index 0000000..1b1577e --- /dev/null +++ b/extlib/libdxfrw/drw_interface.h @@ -0,0 +1,191 @@ +/****************************************************************************** +** libDXFrw - Library to read/write DXF files (ascii & binary) ** +** ** +** Copyright (C) 2011-2015 José F. Soriano, rallazz@gmail.com ** +** ** +** This library is free software, licensed under the terms of the GNU ** +** General Public License as published by the Free Software Foundation, ** +** either version 2 of the License, or (at your option) any later version. ** +** You should have received a copy of the GNU General Public License ** +** along with this program. If not, see . ** +******************************************************************************/ + +#ifndef DRW_INTERFACE_H +#define DRW_INTERFACE_H + +#include + +#include "drw_entities.h" +#include "drw_objects.h" +#include "drw_header.h" + +/** + * Abstract class (interface) for comunicate dxfReader with the application. + * Inherit your class which takes care of the entities in the + * processed DXF file from this interface. + * + * @author Rallaz + */ +class DRW_Interface { +public: + DRW_Interface() { + } + virtual ~DRW_Interface() { + } + + /** Called when header is parsed. */ + virtual void addHeader(const DRW_Header *) { } + + /** Called for every line Type. */ + virtual void addLType(const DRW_LType &) { } + /** Called for every layer. */ + virtual void addLayer(const DRW_Layer &) { } + /** Called for every dim style. */ + virtual void addDimStyle(const DRW_Dimstyle &) { } + /** Called for every VPORT table. */ + virtual void addVport(const DRW_Vport &) { } + /** Called for every text style. */ + virtual void addTextStyle(const DRW_Textstyle &) { } + /** Called for every AppId entry. */ + virtual void addAppId(const DRW_AppId &) { } + + /** + * Called for every block. Note: all entities added after this + * command go into this block until endBlock() is called. + * + * @see endBlock() + */ + virtual void addBlock(const DRW_Block &) { } + + /** Called to end the current block */ + virtual void endBlock() { } + + /** Called for every point */ + virtual void addPoint(const DRW_Point &) { } + + /** Called for every line */ + virtual void addLine(const DRW_Line &) { } + + /** Called for every ray */ + virtual void addRay(const DRW_Ray &) { } + + /** Called for every xline */ + virtual void addXline(const DRW_Xline &) { } + + /** Called for every arc */ + virtual void addArc(const DRW_Arc &) { } + + /** Called for every circle */ + virtual void addCircle(const DRW_Circle &) { } + + /** Called for every ellipse */ + virtual void addEllipse(const DRW_Ellipse &) { } + + /** Called for every lwpolyline */ + virtual void addLWPolyline(const DRW_LWPolyline &) { } + + /** Called for every polyline start */ + virtual void addPolyline(const DRW_Polyline &) { } + + /** Called for every spline */ + virtual void addSpline(const DRW_Spline *) { } + + /** Called for every spline knot value */ + virtual void addKnot(const DRW_Entity &) { } + + /** Called for every insert. */ + virtual void addInsert(const DRW_Insert &) { } + + /** Called for every trace start */ + virtual void addTrace(const DRW_Trace &) { } + + /** Called for every 3dface start */ + virtual void add3dFace(const DRW_3Dface &) { } + + /** Called for every solid start */ + virtual void addSolid(const DRW_Solid &) { } + + + /** Called for every Multi Text entity. */ + virtual void addMText(const DRW_MText &) { } + + /** Called for every Text entity. */ + virtual void addText(const DRW_Text &) { } + + /** + * Called for every aligned dimension entity. + */ + virtual void addDimAlign(const DRW_DimAligned *) { } + /** + * Called for every linear or rotated dimension entity. + */ + virtual void addDimLinear(const DRW_DimLinear *) { } + + /** + * Called for every radial dimension entity. + */ + virtual void addDimRadial(const DRW_DimRadial *) { } + + /** + * Called for every diametric dimension entity. + */ + virtual void addDimDiametric(const DRW_DimDiametric *) { } + + /** + * Called for every angular dimension (2 lines version) entity. + */ + virtual void addDimAngular(const DRW_DimAngular *) { } + + /** + * Called for every angular dimension (3 points version) entity. + */ + virtual void addDimAngular3P(const DRW_DimAngular3p *) { } + + /** + * Called for every ordinate dimension entity. + */ + virtual void addDimOrdinate(const DRW_DimOrdinate *) { } + + /** + * Called for every leader start. + */ + virtual void addLeader(const DRW_Leader *) { } + + /** + * Called for every hatch entity. + */ + virtual void addHatch(const DRW_Hatch *) { } + + /** + * Called for every viewport entity. + */ + virtual void addViewport(const DRW_Viewport &) { } + + /** + * Called for every image entity. + */ + virtual void addImage(const DRW_Image *) { } + + /** + * Called for every image definition. + */ + virtual void linkImage(const DRW_ImageDef *) { } + + /** + * Called for every comment in the DXF file (code 999). + */ + virtual void addComment(const char *) { } + + virtual void writeHeader(DRW_Header &) { } + virtual void writeBlocks() { } + virtual void writeBlockRecords() { } + virtual void writeEntities() { } + virtual void writeLTypes() { } + virtual void writeLayers() { } + virtual void writeTextstyles() { } + virtual void writeVports() { } + virtual void writeDimstyles() { } + virtual void writeAppId() { } +}; + +#endif diff --git a/extlib/libdxfrw/drw_objects.cpp b/extlib/libdxfrw/drw_objects.cpp new file mode 100644 index 0000000..e7a3e7b --- /dev/null +++ b/extlib/libdxfrw/drw_objects.cpp @@ -0,0 +1,1235 @@ +/****************************************************************************** +** libDXFrw - Library to read/write DXF files (ascii & binary) ** +** ** +** Copyright (C) 2011-2015 José F. Soriano, rallazz@gmail.com ** +** ** +** This library is free software, licensed under the terms of the GNU ** +** General Public License as published by the Free Software Foundation, ** +** either version 2 of the License, or (at your option) any later version. ** +** You should have received a copy of the GNU General Public License ** +** along with this program. If not, see . ** +******************************************************************************/ + +#include +#include +#include "drw_objects.h" +#include "intern/dxfreader.h" +#include "intern/dxfwriter.h" +#include "intern/dwgbuffer.h" +#include "intern/drw_dbg.h" +#include "intern/dwgutil.h" + +//! Base class for tables entries +/*! +* Base class for tables entries +* @author Rallaz +*/ +void DRW_TableEntry::parseCode(int code, dxfReader *reader){ + switch (code) { + case 5: + handle = reader->getHandleString(); + break; + case 330: + parentHandle = reader->getHandleString(); + break; + case 2: + name = reader->getUtf8String(); + break; + case 70: + flags = reader->getInt32(); + break; + case 1000: + case 1001: + case 1002: + case 1003: + case 1004: + case 1005: + extData.push_back(new DRW_Variant(code, reader->getString())); + break; + case 1010: + case 1011: + case 1012: + case 1013: + curr = new DRW_Variant(); + curr->addCoord(); + curr->setCoordX(reader->getDouble()); + curr->code = code; + extData.push_back(curr); + break; + case 1020: + case 1021: + case 1022: + case 1023: + if (curr) + curr->setCoordY(reader->getDouble()); + break; + case 1030: + case 1031: + case 1032: + case 1033: + if (curr) + curr->setCoordZ(reader->getDouble()); + curr=NULL; + break; + case 1040: + case 1041: + case 1042: + extData.push_back(new DRW_Variant(code, reader->getDouble())); + break; + case 1070: + case 1071: + extData.push_back(new DRW_Variant(code, reader->getInt32() )); + break; + default: + break; + } +} + +bool DRW_TableEntry::parseDwg(DRW::Version version, dwgBuffer *buf, dwgBuffer *strBuf, duint32 bs){ +DRW_DBG("\n***************************** parsing table entry *********************************************\n"); + objSize=0; + oType = buf->getObjType(version); + DRW_DBG("Object type: "); DRW_DBG(oType); DRW_DBG(", "); DRW_DBGH(oType); + if (version > DRW::AC1014 && version < DRW::AC1024) {//2000 to 2007 + objSize = buf->getRawLong32(); //RL 32bits object size in bits + DRW_DBG(" Object size: "); DRW_DBG(objSize); DRW_DBG("\n"); + } + if (version > DRW::AC1021) {//2010+ + duint32 ms = buf->size(); + objSize = ms*8 - bs; + DRW_DBG(" Object size: "); DRW_DBG(objSize); DRW_DBG("\n"); + } + if (strBuf != NULL && version > DRW::AC1018) {//2007+ + strBuf->moveBitPos(objSize-1); + DRW_DBG(" strBuf strbit pos 2007: "); DRW_DBG(strBuf->getPosition()); DRW_DBG(" strBuf bpos 2007: "); DRW_DBG(strBuf->getBitPos()); DRW_DBG("\n"); + if (strBuf->getBit() == 1){ + DRW_DBG("DRW_TableEntry::parseDwg string bit is 1\n"); + strBuf->moveBitPos(-17); + duint16 strDataSize = strBuf->getRawShort16(); + DRW_DBG("\nDRW_TableEntry::parseDwg string strDataSize: "); DRW_DBGH(strDataSize); DRW_DBG("\n"); + if ( (strDataSize& 0x8000) == 0x8000){ + DRW_DBG("\nDRW_TableEntry::parseDwg string 0x8000 bit is set"); + strBuf->moveBitPos(-33);//RLZ pending to verify + duint16 hiSize = strBuf->getRawShort16(); + strDataSize = ((strDataSize&0x7fff) | (hiSize<<15)); + } + strBuf->moveBitPos( -strDataSize -16); //-14 + DRW_DBG("strBuf start strDataSize pos 2007: "); DRW_DBG(strBuf->getPosition()); DRW_DBG(" strBuf bpos 2007: "); DRW_DBG(strBuf->getBitPos()); DRW_DBG("\n"); + } else + DRW_DBG("\nDRW_TableEntry::parseDwg string bit is 0"); + DRW_DBG("strBuf start pos 2007: "); DRW_DBG(strBuf->getPosition()); DRW_DBG(" strBuf bpos 2007: "); DRW_DBG(strBuf->getBitPos()); DRW_DBG("\n"); + } + + dwgHandle ho = buf->getHandle(); + handle = ho.ref; + DRW_DBG("TableEntry Handle: "); DRW_DBGHL(ho.code, ho.size, ho.ref); + dint16 extDataSize = buf->getBitShort(); //BS + DRW_DBG(" ext data size: "); DRW_DBG(extDataSize); + while (extDataSize>0 && buf->isGood()) { + /* RLZ: TODO */ + dwgHandle ah = buf->getHandle(); + DRW_DBG("App Handle: "); DRW_DBGHL(ah.code, ah.size, ah.ref); + duint8 *tmpExtData = new duint8[extDataSize]; + buf->getBytes(tmpExtData, extDataSize); + dwgBuffer tmpExtDataBuf(tmpExtData, extDataSize, buf->decoder); + int pos = tmpExtDataBuf.getPosition(); + int bpos = tmpExtDataBuf.getBitPos(); + DRW_DBG("ext data pos: "); DRW_DBG(pos); DRW_DBG("."); DRW_DBG(bpos); DRW_DBG("\n"); + duint8 dxfCode = tmpExtDataBuf.getRawChar8(); + DRW_DBG(" dxfCode: "); DRW_DBG(dxfCode); + switch (dxfCode){ + case 0:{ + duint8 strLength = tmpExtDataBuf.getRawChar8(); + DRW_DBG(" strLength: "); DRW_DBG(strLength); + duint16 cp = tmpExtDataBuf.getBERawShort16(); + DRW_DBG(" str codepage: "); DRW_DBG(cp); + for (int i=0;i< strLength+1;i++) {//string length + null terminating char + duint8 dxfChar = tmpExtDataBuf.getRawChar8(); + DRW_DBG(" dxfChar: "); DRW_DBG(dxfChar); + } + break; + } + default: + /* RLZ: TODO */ + break; + } + DRW_DBG("ext data pos: "); DRW_DBG(tmpExtDataBuf.getPosition()); DRW_DBG("."); DRW_DBG(tmpExtDataBuf.getBitPos()); DRW_DBG("\n"); + delete[]tmpExtData; + extDataSize = buf->getBitShort(); //BS + DRW_DBG(" ext data size: "); DRW_DBG(extDataSize); + } //end parsing extData (EED) + if (version < DRW::AC1015) {//14- + objSize = buf->getRawLong32(); //RL 32bits size in bits + } + DRW_DBG(" objSize in bits: "); DRW_DBG(objSize); + + numReactors = buf->getBitLong(); //BL + DRW_DBG(", numReactors: "); DRW_DBG(numReactors); DRW_DBG("\n"); + if (version > DRW::AC1015) {//2004+ + xDictFlag = buf->getBit(); + DRW_DBG("xDictFlag: "); DRW_DBG(xDictFlag); + } + if (version > DRW::AC1024) {//2013+ + duint8 bd = buf->getBit(); + DRW_DBG(" Have binary data: "); DRW_DBG(bd); DRW_DBG("\n"); + } + return buf->isGood(); +} + +//! Class to handle dimstyle entries +/*! +* Class to handle ldim style symbol table entries +* @author Rallaz +*/ +void DRW_Dimstyle::parseCode(int code, dxfReader *reader){ + switch (code) { + case 105: + handle = reader->getHandleString(); + break; + case 3: + dimpost = reader->getUtf8String(); + break; + case 4: + dimapost = reader->getUtf8String(); + break; + case 5: + dimblk = reader->getUtf8String(); + break; + case 6: + dimblk1 = reader->getUtf8String(); + break; + case 7: + dimblk2 = reader->getUtf8String(); + break; + case 40: + dimscale = reader->getDouble(); + break; + case 41: + dimasz = reader->getDouble(); + break; + case 42: + dimexo = reader->getDouble(); + break; + case 43: + dimdli = reader->getDouble(); + break; + case 44: + dimexe = reader->getDouble(); + break; + case 45: + dimrnd = reader->getDouble(); + break; + case 46: + dimdle = reader->getDouble(); + break; + case 47: + dimtp = reader->getDouble(); + break; + case 48: + dimtm = reader->getDouble(); + break; + case 49: + dimfxl = reader->getDouble(); + break; + case 140: + dimtxt = reader->getDouble(); + break; + case 141: + dimcen = reader->getDouble(); + break; + case 142: + dimtsz = reader->getDouble(); + break; + case 143: + dimaltf = reader->getDouble(); + break; + case 144: + dimlfac = reader->getDouble(); + break; + case 145: + dimtvp = reader->getDouble(); + break; + case 146: + dimtfac = reader->getDouble(); + break; + case 147: + dimgap = reader->getDouble(); + break; + case 148: + dimaltrnd = reader->getDouble(); + break; + case 71: + dimtol = reader->getInt32(); + break; + case 72: + dimlim = reader->getInt32(); + break; + case 73: + dimtih = reader->getInt32(); + break; + case 74: + dimtoh = reader->getInt32(); + break; + case 75: + dimse1 = reader->getInt32(); + break; + case 76: + dimse2 = reader->getInt32(); + break; + case 77: + dimtad = reader->getInt32(); + break; + case 78: + dimzin = reader->getInt32(); + break; + case 79: + dimazin = reader->getInt32(); + break; + case 170: + dimalt = reader->getInt32(); + break; + case 171: + dimaltd = reader->getInt32(); + break; + case 172: + dimtofl = reader->getInt32(); + break; + case 173: + dimsah = reader->getInt32(); + break; + case 174: + dimtix = reader->getInt32(); + break; + case 175: + dimsoxd = reader->getInt32(); + break; + case 176: + dimclrd = reader->getInt32(); + break; + case 177: + dimclre = reader->getInt32(); + break; + case 178: + dimclrt = reader->getInt32(); + break; + case 179: + dimadec = reader->getInt32(); + break; + case 270: + dimunit = reader->getInt32(); + break; + case 271: + dimdec = reader->getInt32(); + break; + case 272: + dimtdec = reader->getInt32(); + break; + case 273: + dimaltu = reader->getInt32(); + break; + case 274: + dimalttd = reader->getInt32(); + break; + case 275: + dimaunit = reader->getInt32(); + break; + case 276: + dimfrac = reader->getInt32(); + break; + case 277: + dimlunit = reader->getInt32(); + break; + case 278: + dimdsep = reader->getInt32(); + break; + case 279: + dimtmove = reader->getInt32(); + break; + case 280: + dimjust = reader->getInt32(); + break; + case 281: + dimsd1 = reader->getInt32(); + break; + case 282: + dimsd2 = reader->getInt32(); + break; + case 283: + dimtolj = reader->getInt32(); + break; + case 284: + dimtzin = reader->getInt32(); + break; + case 285: + dimaltz = reader->getInt32(); + break; + case 286: + dimaltttz = reader->getInt32(); + break; + case 287: + dimfit = reader->getInt32(); + break; + case 288: + dimupt = reader->getInt32(); + break; + case 289: + dimatfit = reader->getInt32(); + break; + case 290: + dimfxlon = reader->getInt32(); + break; + case 340: + dimtxsty = reader->getUtf8String(); + break; + case 341: + dimldrblk = reader->getUtf8String(); + break; + case 342: + dimblk = reader->getUtf8String(); + break; + case 343: + dimblk1 = reader->getUtf8String(); + break; + case 344: + dimblk2 = reader->getUtf8String(); + break; + default: + DRW_TableEntry::parseCode(code, reader); + break; + } +} + +bool DRW_Dimstyle::parseDwg(DRW::Version version, dwgBuffer *buf, duint32 bs){ + dwgBuffer sBuff = *buf; + dwgBuffer *sBuf = buf; + if (version > DRW::AC1018) {//2007+ + sBuf = &sBuff; //separate buffer for strings + } + bool ret = DRW_TableEntry::parseDwg(version, buf, sBuf, bs); + DRW_DBG("\n***************************** parsing dimension style **************************************\n"); + if (!ret) + return ret; + name = sBuf->getVariableText(version, false); + DRW_DBG("dimension style name: "); DRW_DBG(name.c_str()); DRW_DBG("\n"); + +// handleObj = shpControlH.ref; + DRW_DBG("\n Remaining bytes: "); DRW_DBG(buf->numRemainingBytes()); DRW_DBG("\n"); + // RS crc; //RS */ + return buf->isGood(); +} + + +//! Class to handle line type entries +/*! +* Class to handle line type symbol table entries +* @author Rallaz +*/ +void DRW_LType::parseCode(int code, dxfReader *reader){ + switch (code) { + case 3: + desc = reader->getUtf8String(); + break; + case 73: + size = reader->getInt32(); + path.reserve(size); + break; + case 40: + length = reader->getDouble(); + break; + case 49: + path.push_back(reader->getDouble()); + pathIdx++; + break; +/* case 74: + haveShape = reader->getInt32(); + break;*/ + default: + DRW_TableEntry::parseCode(code, reader); + break; + } +} + +//! Update line type +/*! +* Update the size and length of line type acording to the path +* @author Rallaz +*/ +/*TODO: control max length permited */ +void DRW_LType::update(){ + double d =0; + size = path.size(); + for (int i = 0; i< size; i++){ + d += fabs(path.at(i)); + } + length = d; +} + +bool DRW_LType::parseDwg(DRW::Version version, dwgBuffer *buf, duint32 bs){ + dwgBuffer sBuff = *buf; + dwgBuffer *sBuf = buf; + if (version > DRW::AC1018) {//2007+ + sBuf = &sBuff; //separate buffer for strings + } + bool ret = DRW_TableEntry::parseDwg(version, buf, sBuf, bs); + DRW_DBG("\n***************************** parsing line type *********************************************\n"); + if (!ret) + return ret; + name = sBuf->getVariableText(version, false); + DRW_DBG("linetype name: "); DRW_DBG(name.c_str()); DRW_DBG("\n"); + flags = buf->getBit()<< 6; + DRW_DBG("flags: "); DRW_DBG(flags); + if (version > DRW::AC1018) {//2007+ + } else {//2004- //RLZ: verify in 2004, 2010 &2013 + dint16 xrefindex = buf->getBitShort(); + DRW_DBG(" xrefindex: "); DRW_DBG(xrefindex); + } + duint8 xdep = buf->getBit(); + DRW_DBG(" xdep: "); DRW_DBG(xdep); + flags |= xdep<< 4; + DRW_DBG(" flags: "); DRW_DBG(flags); + desc = sBuf->getVariableText(version, false); + DRW_DBG(" desc: "); DRW_DBG(desc.c_str()); + length = buf->getBitDouble(); + DRW_DBG(" pattern length: "); DRW_DBG(length); + char align = buf->getRawChar8(); + DRW_DBG(" align: "); DRW_DBG(std::string(&align, 1)); + size = buf->getRawChar8(); + DRW_DBG(" num dashes, size: "); DRW_DBG(size); + DRW_DBG("\n dashes:\n"); + bool haveStrArea = false; + for (int i=0; i< size; i++){ + path.push_back(buf->getBitDouble()); + /*int bs1 =*/ buf->getBitShort(); + /*double d1= */buf->getRawDouble(); + /*double d2=*/ buf->getRawDouble(); + /*double d3= */buf->getBitDouble(); + /*double d4= */buf->getBitDouble(); + int bs2 = buf->getBitShort(); + if((bs2 & 2) !=0) haveStrArea = true; + } + for (unsigned i=0; inumRemainingBytes()); DRW_DBG("\n"); + if (version < DRW::AC1021) { //2004- + duint8 strarea[256]; + buf->getBytes(strarea, 256); + DRW_DBG("string area 256 bytes:\n"); DRW_DBG(reinterpret_cast(strarea)); DRW_DBG("\n"); + } else { //2007+ + //first verify flag + if (haveStrArea) { + duint8 strarea[512]; + buf->getBytes(strarea, 512); + DRW_DBG("string area 512 bytes:\n"); DRW_DBG(reinterpret_cast(strarea)); DRW_DBG("\n"); + } else + DRW_DBG("string area 512 bytes not present\n"); + } + + if (version > DRW::AC1021) {//2007+ skip string area + DRW_DBG(" ltype end of object data pos 2010: "); DRW_DBG(buf->getPosition()); DRW_DBG(" strBuf bpos 2007: "); DRW_DBG(buf->getBitPos()); DRW_DBG("\n"); + } + if (version > DRW::AC1018) {//2007+ skip string area + buf->setPosition(objSize >> 3); + buf->setBitPos(objSize & 7); + } + + if (version > DRW::AC1021) {//2007+ skip string area + DRW_DBG(" ltype start of handles data pos 2010: "); DRW_DBG(buf->getPosition()); DRW_DBG(" strBuf bpos 2007: "); DRW_DBG(buf->getBitPos()); DRW_DBG("\n"); + } + + DRW_DBG("\n Remaining bytes: "); DRW_DBG(buf->numRemainingBytes()); DRW_DBG("\n"); + dwgHandle ltControlH = buf->getHandle(); + DRW_DBG("linetype control Handle: "); DRW_DBGHL(ltControlH.code, ltControlH.size, ltControlH.ref); + parentHandle = ltControlH.ref; + DRW_DBG("\n Remaining bytes: "); DRW_DBG(buf->numRemainingBytes()); DRW_DBG("\n"); + for (int i=0; i< numReactors;++i) { + dwgHandle reactorsH = buf->getHandle(); + DRW_DBG(" reactorsH control Handle: "); DRW_DBGHL(reactorsH.code, reactorsH.size, reactorsH.ref); DRW_DBG("\n"); + } + if (xDictFlag !=1){//linetype in 2004 seems not have XDicObjH or NULL handle + dwgHandle XDicObjH = buf->getHandle(); + DRW_DBG(" XDicObj control Handle: "); DRW_DBGHL(XDicObjH.code, XDicObjH.size, XDicObjH.ref); DRW_DBG("\n"); + DRW_DBG("\n Remaining bytes: "); DRW_DBG(buf->numRemainingBytes()); DRW_DBG("\n"); + } + if(size>0){ + dwgHandle XRefH = buf->getHandle(); + DRW_DBG(" XRefH control Handle: "); DRW_DBGHL(XRefH.code, XRefH.size, XRefH.ref); DRW_DBG("\n"); + dwgHandle shpHandle = buf->getHandle(); + DRW_DBG(" shapeFile Handle: "); DRW_DBGHL(shpHandle.code, shpHandle.size, shpHandle.ref); + DRW_DBG("\n Remaining bytes: "); DRW_DBG(buf->numRemainingBytes()); DRW_DBG("\n"); + } + dwgHandle shpHandle = buf->getHandle(); + DRW_DBG(" shapeFile +1 Handle ??: "); DRW_DBGHL(shpHandle.code, shpHandle.size, shpHandle.ref); DRW_DBG("\n"); + + DRW_DBG("\n Remaining bytes: "); DRW_DBG(buf->numRemainingBytes()); DRW_DBG("\n"); +// RS crc; //RS */ + return buf->isGood(); +} + +//! Class to handle layer entries +/*! +* Class to handle layer symbol table entries +* @author Rallaz +*/ +void DRW_Layer::parseCode(int code, dxfReader *reader){ + switch (code) { + case 6: + lineType = reader->getUtf8String(); + break; + case 62: + color = reader->getInt32(); + break; + case 290: + plotF = reader->getBool(); + break; + case 370: + lWeight = DRW_LW_Conv::dxfInt2lineWidth(reader->getInt32()); + break; + case 390: + handlePlotS = reader->getString(); + break; + case 347: + handleMaterialS = reader->getString(); + break; + case 420: + color24 = reader->getInt32(); + break; + default: + DRW_TableEntry::parseCode(code, reader); + break; + } +} + +bool DRW_Layer::parseDwg(DRW::Version version, dwgBuffer *buf, duint32 bs){ + dwgBuffer sBuff = *buf; + dwgBuffer *sBuf = buf; + if (version > DRW::AC1018) {//2007+ + sBuf = &sBuff; //separate buffer for strings + } + bool ret = DRW_TableEntry::parseDwg(version, buf, sBuf, bs); + DRW_DBG("\n***************************** parsing layer *********************************************\n"); + if (!ret) + return ret; + name = sBuf->getVariableText(version, false); + DRW_DBG("layer name: "); DRW_DBG(name.c_str()); + + flags |= buf->getBit()<< 6;//layer have entity + if (version < DRW::AC1021) {//2004- + DRW_DBG(", xrefindex = "); DRW_DBG(buf->getBitShort()); DRW_DBG("\n"); + //dint16 xrefindex = buf->getBitShort(); + } + flags |= buf->getBit() << 4;//is refx dependent + if (version < DRW::AC1015) {//14- + flags |= buf->getBit(); //layer frozen + /*flags |=*/ buf->getBit(); //unused, negate the color + flags |= buf->getBit() << 1;//frozen in new + flags |= buf->getBit()<< 3;//locked + } + if (version > DRW::AC1014) {//2000+ + dint16 f = buf->getSBitShort();//bit2 are layer on + DRW_DBG(", flags 2000+: "); DRW_DBG(f); DRW_DBG("\n"); + flags |= f & 0x0001; //layer frozen + flags |= ( f>> 1) & 0x0002;//frozen in new + flags |= ( f>> 1) & 0x0004;//locked + plotF = ( f>> 4) & 0x0001; + lWeight = DRW_LW_Conv::dwgInt2lineWidth( (f & 0x03E0) >> 5 ); + } + color = buf->getCmColor(version); //BS or CMC //ok for R14 or negate + DRW_DBG(", entity color: "); DRW_DBG(color); DRW_DBG("\n"); + + if (version > DRW::AC1018) {//2007+ skip string area + buf->setPosition(objSize >> 3); + buf->setBitPos(objSize & 7); + } + dwgHandle layerControlH = buf->getHandle(); + DRW_DBG("layer control Handle: "); DRW_DBGHL(layerControlH.code, layerControlH.size, layerControlH.ref); + parentHandle = layerControlH.ref; + + if (xDictFlag !=1){//linetype in 2004 seems not have XDicObjH or NULL handle + dwgHandle XDicObjH = buf->getHandle(); + DRW_DBG(" XDicObj control Handle: "); DRW_DBGHL(XDicObjH.code, XDicObjH.size, XDicObjH.ref); DRW_DBG("\n"); + } + dwgHandle XRefH = buf->getHandle(); + DRW_DBG(" XRefH control Handle: "); DRW_DBGHL(XRefH.code, XRefH.size, XRefH.ref); DRW_DBG("\n"); + if (version > DRW::AC1014) {//2000+ + dwgHandle plotStyH = buf->getHandle(); + DRW_DBG(" PLot style control Handle: "); DRW_DBGHL(plotStyH.code, plotStyH.size, plotStyH.ref); DRW_DBG("\n"); + handlePlotS = DRW::toHexStr(plotStyH.ref);// std::string(plotStyH.ref);//RLZ: verify conversion + } + if (version > DRW::AC1018) {//2007+ + dwgHandle materialH = buf->getHandle(); + DRW_DBG(" Material control Handle: "); DRW_DBGHL(materialH.code, materialH.size, materialH.ref); DRW_DBG("\n"); + handleMaterialS = DRW::toHexStr(materialH.ref);//RLZ: verify conversion + } + //lineType handle + DRW_DBG("Remaining bytes: "); DRW_DBG(buf->numRemainingBytes()); DRW_DBG("\n"); + lTypeH = buf->getHandle(); + DRW_DBG("line type Handle: "); DRW_DBGHL(lTypeH.code, lTypeH.size, lTypeH.ref); + DRW_DBG("\n Remaining bytes: "); DRW_DBG(buf->numRemainingBytes()); DRW_DBG("\n"); +// RS crc; //RS */ + return buf->isGood(); +} + +bool DRW_Block_Record::parseDwg(DRW::Version version, dwgBuffer *buf, duint32 bs){ + dwgBuffer sBuff = *buf; + dwgBuffer *sBuf = buf; + if (version > DRW::AC1018) {//2007+ + sBuf = &sBuff; //separate buffer for strings + } + bool ret = DRW_TableEntry::parseDwg(version, buf, sBuf, bs); + DRW_DBG("\n***************************** parsing block record ******************************************\n"); + if (!ret) + return ret; + duint32 insertCount = 0;//only 2000+ + duint32 objectCount = 0; //only 2004+ + + name = sBuf->getVariableText(version, false); + DRW_DBG("block record name: "); DRW_DBG(name.c_str()); DRW_DBG("\n"); + + flags |= buf->getBit()<< 6;//referenced external reference, block code 70, bit 7 (64) + if (version > DRW::AC1018) {//2007+ + } else {//2004- //RLZ: verify in 2004, 2010 &2013 + dint16 xrefindex = buf->getBitShort(); + DRW_DBG(" xrefindex: "); DRW_DBG(xrefindex); DRW_DBG("\n"); + } + flags |= buf->getBit() << 4;//is refx dependent, block code 70, bit 5 (16) + flags |= buf->getBit(); //if is anonimous block (*U) block code 70, bit 1 (1) + flags |= buf->getBit() << 1; //if block contains attdefs, block code 70, bit 2 (2) + bool blockIsXref = buf->getBit(); //if is a Xref, block code 70, bit 3 (4) + bool xrefOverlaid = buf->getBit(); //if is a overlaid Xref, block code 70, bit 4 (8) + flags |= blockIsXref << 2; //if is a Xref, block code 70, bit 3 (4) + flags |= xrefOverlaid << 3; //if is a overlaid Xref, block code 70, bit 4 (8) + if (version > DRW::AC1014) {//2000+ + flags |= buf->getBit() << 5; //if is a loaded Xref, block code 70, bit 6 (32) + } + DRW_DBG("flags: "); DRW_DBG(flags); DRW_DBG(", "); + if (version > DRW::AC1015) {//2004+ fails in 2007 + objectCount = buf->getBitLong(); //Number of objects owned by this block + entMap.reserve(objectCount); + } + basePoint.x = buf->getBitDouble(); + basePoint.y = buf->getBitDouble(); + basePoint.z = buf->getBitDouble(); + DRW_DBG("insertion point: "); DRW_DBGPT(basePoint.x, basePoint.y, basePoint.z); DRW_DBG("\n"); + UTF8STRING path = sBuf->getVariableText(version, false); + DRW_DBG("XRef path name: "); DRW_DBG(path.c_str()); DRW_DBG("\n"); + + if (version > DRW::AC1014) {//2000+ + insertCount = 0; + while (duint8 i = buf->getRawChar8() != 0) + insertCount +=i; + UTF8STRING bkdesc = sBuf->getVariableText(version, false); + DRW_DBG("Block description: "); DRW_DBG(bkdesc.c_str()); DRW_DBG("\n"); + + duint32 prevData = buf->getBitLong(); + for (unsigned int j= 0; j < prevData; ++j) + buf->getRawChar8(); + } + if (version > DRW::AC1018) {//2007+ + duint16 insUnits = buf->getBitShort(); + bool canExplode = buf->getBit(); //if block can be exploded + duint8 bkScaling = buf->getRawChar8(); + + DRW_UNUSED(insUnits); + DRW_UNUSED(canExplode); + DRW_UNUSED(bkScaling); + } + + if (version > DRW::AC1018) {//2007+ skip string area + buf->setPosition(objSize >> 3); + buf->setBitPos(objSize & 7); + } + + dwgHandle blockControlH = buf->getHandle(); + DRW_DBG("block control Handle: "); DRW_DBGHL(blockControlH.code, blockControlH.size, blockControlH.ref); DRW_DBG("\n"); + parentHandle = blockControlH.ref; + + for (int i=0; igetHandle(); + DRW_DBG(" reactor Handle #"); DRW_DBG(i); DRW_DBG(": "); DRW_DBGHL(reactorH.code, reactorH.size, reactorH.ref); DRW_DBG("\n"); + } + if (xDictFlag !=1) {//R14+ //seems present in 2000 + dwgHandle XDicObjH = buf->getHandle(); + DRW_DBG(" XDicObj control Handle: "); DRW_DBGHL(XDicObjH.code, XDicObjH.size, XDicObjH.ref); DRW_DBG("\n"); + } + if (version != DRW::AC1021) {//2007+ XDicObjH or NullH not present + } + dwgHandle NullH = buf->getHandle(); + DRW_DBG(" NullH control Handle: "); DRW_DBGHL(NullH.code, NullH.size, NullH.ref); DRW_DBG("\n"); + dwgHandle blockH = buf->getOffsetHandle(handle); + DRW_DBG(" blockH Handle: "); DRW_DBGHL(blockH.code, blockH.size, blockH.ref); DRW_DBG("\n"); + block = blockH.ref; + + if (version > DRW::AC1015) {//2004+ + for (unsigned int i=0; i< objectCount; i++){ + dwgHandle entityH = buf->getHandle(); + DRW_DBG(" entityH Handle #"); DRW_DBG(i); DRW_DBG(": "); DRW_DBGHL(entityH.code, entityH.size, entityH.ref); DRW_DBG("\n"); + entMap.push_back(entityH.ref); + } + } else {//2000- + if(!blockIsXref && !xrefOverlaid){ + dwgHandle firstH = buf->getHandle(); + DRW_DBG(" firstH entity Handle: "); DRW_DBGHL(firstH.code, firstH.size, firstH.ref); DRW_DBG("\n"); + firstEH = firstH.ref; + dwgHandle lastH = buf->getHandle(); + DRW_DBG(" lastH entity Handle: "); DRW_DBGHL(lastH.code, lastH.size, lastH.ref); DRW_DBG("\n"); + lastEH = lastH.ref; + } + } + DRW_DBG("Remaining bytes: "); DRW_DBG(buf->numRemainingBytes()); DRW_DBG("\n"); + dwgHandle endBlockH = buf->getOffsetHandle(handle); + DRW_DBG(" endBlockH Handle: "); DRW_DBGHL(endBlockH.code, endBlockH.size, endBlockH.ref); DRW_DBG("\n"); + endBlock = endBlockH.ref; + + if (version > DRW::AC1014) {//2000+ + for (unsigned int i=0; i< insertCount; i++){ + dwgHandle insertsH = buf->getHandle(); + DRW_DBG(" insertsH Handle #"); DRW_DBG(i); DRW_DBG(": "); DRW_DBGHL(insertsH.code, insertsH.size, insertsH.ref); DRW_DBG("\n"); + } + DRW_DBG("Remaining bytes: "); DRW_DBG(buf->numRemainingBytes()); DRW_DBG("\n"); + dwgHandle layoutH = buf->getHandle(); + DRW_DBG(" layoutH Handle: "); DRW_DBGHL(layoutH.code, layoutH.size, layoutH.ref); DRW_DBG("\n"); + } + DRW_DBG("Remaining bytes: "); DRW_DBG(buf->numRemainingBytes()); DRW_DBG("\n\n"); +// RS crc; //RS */ + return buf->isGood(); +} + +//! Class to handle text style entries +/*! +* Class to handle text style symbol table entries +* @author Rallaz +*/ +void DRW_Textstyle::parseCode(int code, dxfReader *reader){ + switch (code) { + case 3: + font = reader->getUtf8String(); + break; + case 4: + bigFont = reader->getUtf8String(); + break; + case 40: + height = reader->getDouble(); + break; + case 41: + width = reader->getDouble(); + break; + case 50: + oblique = reader->getDouble(); + break; + case 42: + lastHeight = reader->getDouble(); + break; + case 71: + genFlag = reader->getInt32(); + break; + case 1071: + fontFamily = reader->getInt32(); + break; + default: + DRW_TableEntry::parseCode(code, reader); + break; + } +} + +bool DRW_Textstyle::parseDwg(DRW::Version version, dwgBuffer *buf, duint32 bs){ + dwgBuffer sBuff = *buf; + dwgBuffer *sBuf = buf; + if (version > DRW::AC1018) {//2007+ + sBuf = &sBuff; //separate buffer for strings + } + bool ret = DRW_TableEntry::parseDwg(version, buf, sBuf, bs); + DRW_DBG("\n***************************** parsing text style *********************************************\n"); + if (!ret) + return ret; + name = sBuf->getVariableText(version, false); + DRW_DBG("text style name: "); DRW_DBG(name.c_str()); DRW_DBG("\n"); + flags |= buf->getBit()<< 6;//style are referenced for a entity, style code 70, bit 7 (64) + /*dint16 xrefindex =*/ buf->getBitShort(); + flags |= buf->getBit() << 4; //is refx dependent, style code 70, bit 5 (16) + flags |= buf->getBit() << 2; //vertical text, stile code 70, bit 3 (4) + flags |= buf->getBit(); //if is a shape file instead of text, style code 70, bit 1 (1) + height = buf->getBitDouble(); + width = buf->getBitDouble(); + oblique = buf->getBitDouble(); + genFlag = buf->getRawChar8(); + lastHeight = buf->getBitDouble(); + font = sBuf->getVariableText(version, false); + bigFont = sBuf->getVariableText(version, false); + if (version > DRW::AC1018) {//2007+ skip string area + buf->setPosition(objSize >> 3); + buf->setBitPos(objSize & 7); + } + dwgHandle shpControlH = buf->getHandle(); + DRW_DBG(" parentControlH Handle: "); DRW_DBGHL(shpControlH.code, shpControlH.size, shpControlH.ref); DRW_DBG("\n"); + parentHandle = shpControlH.ref; + DRW_DBG("Remaining bytes: "); DRW_DBG(buf->numRemainingBytes()); DRW_DBG("\n"); + if (xDictFlag !=1){//linetype in 2004 seems not have XDicObjH or NULL handle + dwgHandle XDicObjH = buf->getHandle(); + DRW_DBG(" XDicObj control Handle: "); DRW_DBGHL(XDicObjH.code, XDicObjH.size, XDicObjH.ref); DRW_DBG("\n"); + DRW_DBG("Remaining bytes: "); DRW_DBG(buf->numRemainingBytes()); DRW_DBG("\n"); + } +/*RLZ: fails verify this part*/ dwgHandle XRefH = buf->getHandle(); + DRW_DBG(" XRefH control Handle: "); DRW_DBGHL(XRefH.code, XRefH.size, XRefH.ref); DRW_DBG("\n"); + + DRW_DBG("Remaining bytes: "); DRW_DBG(buf->numRemainingBytes()); DRW_DBG("\n\n"); + // RS crc; //RS */ + return buf->isGood(); +} + +//! Class to handle vport entries +/*! +* Class to handle vport symbol table entries +* @author Rallaz +*/ +void DRW_Vport::parseCode(int code, dxfReader *reader){ + switch (code) { + case 10: + lowerLeft.x = reader->getDouble(); + break; + case 20: + lowerLeft.y = reader->getDouble(); + break; + case 11: + UpperRight.x = reader->getDouble(); + break; + case 21: + UpperRight.y = reader->getDouble(); + break; + case 12: + center.x = reader->getDouble(); + break; + case 22: + center.y = reader->getDouble(); + break; + case 13: + snapBase.x = reader->getDouble(); + break; + case 23: + snapBase.y = reader->getDouble(); + break; + case 14: + snapSpacing.x = reader->getDouble(); + break; + case 24: + snapSpacing.y = reader->getDouble(); + break; + case 15: + gridSpacing.x = reader->getDouble(); + break; + case 25: + gridSpacing.y = reader->getDouble(); + break; + case 16: + viewDir.x = reader->getDouble(); + break; + case 26: + viewDir.y = reader->getDouble(); + break; + case 36: + viewDir.z = reader->getDouble(); + break; + case 17: + viewTarget.x = reader->getDouble(); + break; + case 27: + viewTarget.y = reader->getDouble(); + break; + case 37: + viewTarget.z = reader->getDouble(); + break; + case 40: + height = reader->getDouble(); + break; + case 41: + ratio = reader->getDouble(); + break; + case 42: + lensHeight = reader->getDouble(); + break; + case 43: + frontClip = reader->getDouble(); + break; + case 44: + backClip = reader->getDouble(); + break; + case 50: + snapAngle = reader->getDouble(); + break; + case 51: + twistAngle = reader->getDouble(); + break; + case 71: + viewMode = reader->getInt32(); + break; + case 72: + circleZoom = reader->getInt32(); + break; + case 73: + fastZoom = reader->getInt32(); + break; + case 74: + ucsIcon = reader->getInt32(); + break; + case 75: + snap = reader->getInt32(); + break; + case 76: + grid = reader->getInt32(); + break; + case 77: + snapStyle = reader->getInt32(); + break; + case 78: + snapIsopair = reader->getInt32(); + break; + default: + DRW_TableEntry::parseCode(code, reader); + break; + } +} + +bool DRW_Vport::parseDwg(DRW::Version version, dwgBuffer *buf, duint32 bs){ + dwgBuffer sBuff = *buf; + dwgBuffer *sBuf = buf; + if (version > DRW::AC1018) {//2007+ + sBuf = &sBuff; //separate buffer for strings + } + bool ret = DRW_TableEntry::parseDwg(version, buf, sBuf, bs); + DRW_DBG("\n***************************** parsing VPort ************************************************\n"); + if (!ret) + return ret; + name = sBuf->getVariableText(version, false); + DRW_DBG("vport name: "); DRW_DBG(name.c_str()); DRW_DBG("\n"); + flags |= buf->getBit()<< 6;// code 70, bit 7 (64) + if (version < DRW::AC1021) { //2004- + /*dint16 xrefindex =*/ buf->getBitShort(); + } + flags |= buf->getBit() << 4; //is refx dependent, style code 70, bit 5 (16) + height = buf->getBitDouble(); + ratio = buf->getBitDouble(); + DRW_DBG("flags: "); DRW_DBG(flags); DRW_DBG(" height: "); DRW_DBG(height); + DRW_DBG(" ratio: "); DRW_DBG(ratio); + center = buf->get2RawDouble(); + DRW_DBG("\nview center: "); DRW_DBGPT(center.x, center.y, center.z); + viewTarget.x = buf->getBitDouble(); + viewTarget.y = buf->getBitDouble(); + viewTarget.z = buf->getBitDouble(); + DRW_DBG("\nview target: "); DRW_DBGPT(viewTarget.x, viewTarget.y, viewTarget.z); + viewDir.x = buf->getBitDouble(); + viewDir.y = buf->getBitDouble(); + viewDir.z = buf->getBitDouble(); + DRW_DBG("\nview dir: "); DRW_DBGPT(viewDir.x, viewDir.y, viewDir.z); + twistAngle = buf->getBitDouble(); + lensHeight = buf->getBitDouble(); + frontClip = buf->getBitDouble(); + backClip = buf->getBitDouble(); + DRW_DBG("\ntwistAngle: "); DRW_DBG(twistAngle); DRW_DBG(" lensHeight: "); DRW_DBG(lensHeight); + DRW_DBG(" frontClip: "); DRW_DBG(frontClip); DRW_DBG(" backClip: "); DRW_DBG(backClip); + viewMode = buf->getBit(); //view mode, code 71, bit 0 (1) + viewMode |= buf->getBit() << 1; //view mode, code 71, bit 1 (2) + viewMode |= buf->getBit() << 2; //view mode, code 71, bit 2 (4) + viewMode |= buf->getBit() << 4; //view mode, code 71, bit 4 (16) + if (version > DRW::AC1014) { //2000+ + //duint8 renderMode = buf->getRawChar8(); + DRW_DBG("\n renderMode: "); DRW_DBG(buf->getRawChar8()); + if (version > DRW::AC1018) { //2007+ + DRW_DBG("\n use default lights: "); DRW_DBG(buf->getBit()); + DRW_DBG(" default lighting type: "); DRW_DBG(buf->getRawChar8()); + DRW_DBG(" brightness: "); DRW_DBG(buf->getBitDouble()); + DRW_DBG("\n contrast: "); DRW_DBG(buf->getBitDouble()); DRW_DBG("\n"); + DRW_DBG(" ambient color CMC: "); DRW_DBG(buf->getCmColor(version)); + } + } + lowerLeft = buf->get2RawDouble(); + DRW_DBG("\nlowerLeft: "); DRW_DBGPT(lowerLeft.x, lowerLeft.y, lowerLeft.z); + UpperRight = buf->get2RawDouble(); + DRW_DBG("\nUpperRight: "); DRW_DBGPT(UpperRight.x, UpperRight.y, UpperRight.z); + viewMode |= buf->getBit() << 3; //UCSFOLLOW, view mode, code 71, bit 3 (8) + circleZoom = buf->getBitShort(); + fastZoom = buf->getBit(); + DRW_DBG("\nviewMode: "); DRW_DBG(viewMode); DRW_DBG(" circleZoom: "); + DRW_DBG(circleZoom); DRW_DBG(" fastZoom: "); DRW_DBG(fastZoom); + ucsIcon = buf->getBit(); //ucs Icon, code 74, bit 0 (1) + ucsIcon |= buf->getBit() << 1; //ucs Icon, code 74, bit 1 (2) + grid = buf->getBit(); + DRW_DBG("\nucsIcon: "); DRW_DBG(ucsIcon); DRW_DBG(" grid: "); DRW_DBG(grid); + gridSpacing = buf->get2RawDouble(); + DRW_DBG("\ngrid Spacing: "); DRW_DBGPT(gridSpacing.x, gridSpacing.y, gridSpacing.z); + snap = buf->getBit(); + snapStyle = buf->getBit(); + DRW_DBG("\nsnap on/off: "); DRW_DBG(snap); DRW_DBG(" snap Style: "); DRW_DBG(snapStyle); + snapIsopair = buf->getBitShort(); + snapAngle = buf->getBitDouble(); + DRW_DBG("\nsnap Isopair: "); DRW_DBG(snapIsopair); DRW_DBG(" snap Angle: "); DRW_DBG(snapAngle); + snapBase = buf->get2RawDouble(); + DRW_DBG("\nsnap Base: "); DRW_DBGPT(snapBase.x, snapBase.y, snapBase.z); + snapSpacing = buf->get2RawDouble(); + DRW_DBG("\nsnap Spacing: "); DRW_DBGPT(snapSpacing.x, snapSpacing.y, snapSpacing.z); + if (version > DRW::AC1014) { //2000+ + DRW_DBG("\n Unknown: "); DRW_DBG(buf->getBit()); + DRW_DBG(" UCS per Viewport: "); DRW_DBG(buf->getBit()); + DRW_DBG("\nUCS origin: "); DRW_DBGPT(buf->getBitDouble(), buf->getBitDouble(), buf->getBitDouble()); + DRW_DBG("\nUCS X Axis: "); DRW_DBGPT(buf->getBitDouble(), buf->getBitDouble(), buf->getBitDouble()); + DRW_DBG("\nUCS Y Axis: "); DRW_DBGPT(buf->getBitDouble(), buf->getBitDouble(), buf->getBitDouble()); + DRW_DBG("\nUCS elevation: "); DRW_DBG(buf->getBitDouble()); + DRW_DBG(" UCS Orthographic type: "); DRW_DBG(buf->getBitShort()); + if (version > DRW::AC1018) { //2007+ + gridBehavior = buf->getBitShort(); + DRW_DBG(" gridBehavior (flags): "); DRW_DBG(gridBehavior); + DRW_DBG(" Grid major: "); DRW_DBG(buf->getBitShort()); + } + } + + //common handles + if (version > DRW::AC1018) {//2007+ skip string area + buf->setPosition(objSize >> 3); + buf->setBitPos(objSize & 7); + } + dwgHandle vpControlH = buf->getHandle(); + DRW_DBG("\n parentControlH Handle: "); DRW_DBGHL(vpControlH.code, vpControlH.size, vpControlH.ref); DRW_DBG("\n"); + parentHandle = vpControlH.ref; + DRW_DBG("Remaining bytes: "); DRW_DBG(buf->numRemainingBytes()); DRW_DBG("\n"); + if (xDictFlag !=1){ + dwgHandle XDicObjH = buf->getHandle(); + DRW_DBG(" XDicObj control Handle: "); DRW_DBGHL(XDicObjH.code, XDicObjH.size, XDicObjH.ref); DRW_DBG("\n"); + DRW_DBG("Remaining bytes: "); DRW_DBG(buf->numRemainingBytes()); DRW_DBG("\n"); + } +/*RLZ: fails verify this part*/ dwgHandle XRefH = buf->getHandle(); + DRW_DBG(" XRefH control Handle: "); DRW_DBGHL(XRefH.code, XRefH.size, XRefH.ref); + + if (version > DRW::AC1014) { //2000+ + DRW_DBG("\nRemaining bytes: "); DRW_DBG(buf->numRemainingBytes()); + if (version > DRW::AC1018) { //2007+ + dwgHandle bkgrdH = buf->getHandle(); + DRW_DBG(" background Handle: "); DRW_DBGHL(bkgrdH.code, bkgrdH.size, bkgrdH.ref); + DRW_DBG("\nRemaining bytes: "); DRW_DBG(buf->numRemainingBytes()); + dwgHandle visualStH = buf->getHandle(); + DRW_DBG(" visual style Handle: "); DRW_DBGHL(visualStH.code, visualStH.size, visualStH.ref); + DRW_DBG("\nRemaining bytes: "); DRW_DBG(buf->numRemainingBytes()); + dwgHandle sunH = buf->getHandle(); + DRW_DBG(" sun Handle: "); DRW_DBGHL(sunH.code, sunH.size, sunH.ref); + DRW_DBG("\nRemaining bytes: "); DRW_DBG(buf->numRemainingBytes()); + } + dwgHandle namedUCSH = buf->getHandle(); + DRW_DBG(" named UCS Handle: "); DRW_DBGHL(namedUCSH.code, namedUCSH.size, namedUCSH.ref); + DRW_DBG("\nRemaining bytes: "); DRW_DBG(buf->numRemainingBytes()); + dwgHandle baseUCSH = buf->getHandle(); + DRW_DBG(" base UCS Handle: "); DRW_DBGHL(baseUCSH.code, baseUCSH.size, baseUCSH.ref); + } + + DRW_DBG("\n Remaining bytes: "); DRW_DBG(buf->numRemainingBytes()); DRW_DBG("\n"); + // RS crc; //RS */ + return buf->isGood(); +} + +void DRW_ImageDef::parseCode(int code, dxfReader *reader){ + switch (code) { + case 1: + name = reader->getUtf8String(); + break; + case 5: + handle = reader->getHandleString(); + break; + case 10: + u = reader->getDouble(); + break; + case 20: + v = reader->getDouble(); + break; + case 11: + up = reader->getDouble(); + break; + case 12: + vp = reader->getDouble(); + break; + case 21: + vp = reader->getDouble(); + break; + case 280: + loaded = reader->getInt32(); + break; + case 281: + resolution = reader->getInt32(); + break; + default: + break; + } +} + +bool DRW_ImageDef::parseDwg(DRW::Version version, dwgBuffer *buf, duint32 bs){ + dwgBuffer sBuff = *buf; + dwgBuffer *sBuf = buf; + if (version > DRW::AC1018) {//2007+ + sBuf = &sBuff; //separate buffer for strings + } + bool ret = DRW_TableEntry::parseDwg(version, buf, sBuf, bs); + DRW_DBG("\n***************************** parsing Image Def *********************************************\n"); + if (!ret) + return ret; + dint32 imgVersion = buf->getBitLong(); + DRW_DBG("class Version: "); DRW_DBG(imgVersion); + DRW_Coord size = buf->get2RawDouble(); + (void)size; + name = sBuf->getVariableText(version, false); + DRW_DBG("appId name: "); DRW_DBG(name.c_str()); DRW_DBG("\n"); + loaded = buf->getBit(); + resolution = buf->getRawChar8(); + up = buf->getRawDouble(); + vp = buf->getRawDouble(); + + dwgHandle parentH = buf->getHandle(); + DRW_DBG(" parentH Handle: "); DRW_DBGHL(parentH.code, parentH.size, parentH.ref); DRW_DBG("\n"); + parentHandle = parentH.ref; + DRW_DBG("Remaining bytes: "); DRW_DBG(buf->numRemainingBytes()); DRW_DBG("\n"); + //RLZ: Reactors handles + if (xDictFlag !=1){ + dwgHandle XDicObjH = buf->getHandle(); + DRW_DBG(" XDicObj control Handle: "); DRW_DBGHL(XDicObjH.code, XDicObjH.size, XDicObjH.ref); DRW_DBG("\n"); + DRW_DBG("Remaining bytes: "); DRW_DBG(buf->numRemainingBytes()); DRW_DBG("\n"); + } +/*RLZ: fails verify this part*/ dwgHandle XRefH = buf->getHandle(); + DRW_DBG(" XRefH control Handle: "); DRW_DBGHL(XRefH.code, XRefH.size, XRefH.ref); DRW_DBG("\n"); + + DRW_DBG("Remaining bytes: "); DRW_DBG(buf->numRemainingBytes()); DRW_DBG("\n\n"); + // RS crc; //RS */ + return buf->isGood(); +} + +bool DRW_AppId::parseDwg(DRW::Version version, dwgBuffer *buf, duint32 bs){ + dwgBuffer sBuff = *buf; + dwgBuffer *sBuf = buf; + if (version > DRW::AC1018) {//2007+ + sBuf = &sBuff; //separate buffer for strings + } + bool ret = DRW_TableEntry::parseDwg(version, buf, sBuf, bs); + DRW_DBG("\n***************************** parsing app Id *********************************************\n"); + if (!ret) + return ret; + name = sBuf->getVariableText(version, false); + DRW_DBG("appId name: "); DRW_DBG(name.c_str()); DRW_DBG("\n"); + flags |= buf->getBit()<< 6;// code 70, bit 7 (64) + /*dint16 xrefindex =*/ buf->getBitShort(); + flags |= buf->getBit() << 4; //is refx dependent, style code 70, bit 5 (16) + duint8 unknown = buf->getRawChar8(); // unknown code 71 + DRW_DBG("unknown code 71: "); DRW_DBG(unknown); DRW_DBG("\n"); + if (version > DRW::AC1018) {//2007+ skip string area + buf->setPosition(objSize >> 3); + buf->setBitPos(objSize & 7); + } + dwgHandle appIdControlH = buf->getHandle(); + DRW_DBG(" parentControlH Handle: "); DRW_DBGHL(appIdControlH.code, appIdControlH.size, appIdControlH.ref); DRW_DBG("\n"); + parentHandle = appIdControlH.ref; + DRW_DBG("Remaining bytes: "); DRW_DBG(buf->numRemainingBytes()); DRW_DBG("\n"); + if (xDictFlag !=1){//linetype in 2004 seems not have XDicObjH or NULL handle + dwgHandle XDicObjH = buf->getHandle(); + DRW_DBG(" XDicObj control Handle: "); DRW_DBGHL(XDicObjH.code, XDicObjH.size, XDicObjH.ref); DRW_DBG("\n"); + DRW_DBG("Remaining bytes: "); DRW_DBG(buf->numRemainingBytes()); DRW_DBG("\n"); + } +/*RLZ: fails verify this part*/ dwgHandle XRefH = buf->getHandle(); + DRW_DBG(" XRefH control Handle: "); DRW_DBGHL(XRefH.code, XRefH.size, XRefH.ref); DRW_DBG("\n"); + + DRW_DBG("Remaining bytes: "); DRW_DBG(buf->numRemainingBytes()); DRW_DBG("\n\n"); + // RS crc; //RS */ + return buf->isGood(); +} diff --git a/extlib/libdxfrw/drw_objects.h b/extlib/libdxfrw/drw_objects.h new file mode 100644 index 0000000..07cba08 --- /dev/null +++ b/extlib/libdxfrw/drw_objects.h @@ -0,0 +1,772 @@ +/****************************************************************************** +** libDXFrw - Library to read/write DXF files (ascii & binary) ** +** ** +** Copyright (C) 2011-2015 José F. Soriano, rallazz@gmail.com ** +** ** +** This library is free software, licensed under the terms of the GNU ** +** General Public License as published by the Free Software Foundation, ** +** either version 2 of the License, or (at your option) any later version. ** +** You should have received a copy of the GNU General Public License ** +** along with this program. If not, see . ** +******************************************************************************/ + +#ifndef DRW_OBJECTS_H +#define DRW_OBJECTS_H + + +#include +#include +#include +#include "drw_base.h" + +class dxfReader; +class dxfWriter; +class dwgBuffer; + +namespace DRW { + +//! Table entries type. + enum TTYPE { + UNKNOWNT, + LTYPE, + LAYER, + STYLE, + DIMSTYLE, + VPORT, + BLOCK_RECORD, + APPID, + IMAGEDEF + }; + +//pending VIEW, UCS, APPID, VP_ENT_HDR, GROUP, MLINESTYLE, LONG_TRANSACTION, XRECORD, +//ACDBPLACEHOLDER, VBA_PROJECT, ACAD_TABLE, CELLSTYLEMAP, DBCOLOR, DICTIONARYVAR, +//DICTIONARYWDFLT, FIELD, IDBUFFER, IMAGEDEF, IMAGEDEFREACTOR, LAYER_INDEX, LAYOUT +//MATERIAL, PLACEHOLDER, PLOTSETTINGS, RASTERVARIABLES, SCALE, SORTENTSTABLE, +//SPATIAL_INDEX, SPATIAL_FILTER, TABLEGEOMETRY, TABLESTYLES,VISUALSTYLE, +} + +#define SETOBJFRIENDS friend class dxfRW; \ + friend class dwgReader; + +//! Base class for tables entries +/*! +* Base class for tables entries +* @author Rallaz +*/ +class DRW_TableEntry { +public: + //initializes default values + DRW_TableEntry() { + tType = DRW::UNKNOWNT; + flags = 0; + numReactors = xDictFlag = 0; + parentHandle = 0; + curr = NULL; + } + + virtual~DRW_TableEntry() { + for (std::vector::iterator it=extData.begin(); it!=extData.end(); ++it) + delete *it; + + extData.clear(); + } + + DRW_TableEntry(const DRW_TableEntry& e) { + tType = e.tType; + handle = e.handle; + parentHandle = e.parentHandle; + name = e.name; + flags = e.flags; + numReactors = e.numReactors; + xDictFlag = e.xDictFlag; + curr = e.curr; + for (std::vector::const_iterator it=e.extData.begin(); it!=e.extData.end(); ++it){ + extData.push_back(new DRW_Variant(*(*it))); + } + } + +protected: + void parseCode(int code, dxfReader *reader); + virtual bool parseDwg(DRW::Version version, dwgBuffer *buf, duint32 bs=0) = 0; + bool parseDwg(DRW::Version version, dwgBuffer *buf, dwgBuffer* strBuf, duint32 bs=0); + void reset(){ + flags =0; + for (std::vector::iterator it=extData.begin(); it!=extData.end(); ++it) + delete *it; + extData.clear(); + } + +public: + enum DRW::TTYPE tType; /*!< enum: entity type, code 0 */ + duint32 handle; /*!< entity identifier, code 5 */ + int parentHandle; /*!< Soft-pointer ID/handle to owner object, code 330 */ + UTF8STRING name; /*!< entry name, code 2 */ + int flags; /*!< Flags relevant to entry, code 70 */ + std::vector extData; /*!< FIFO list of extended data, codes 1000 to 1071*/ + +private: + DRW_Variant* curr; + + //***** dwg parse ********/ +protected: + dint16 oType; + duint8 xDictFlag; + dint32 numReactors; // + duint32 objSize; //RL 32bits object data size in bits +}; + + +//! Class to handle dimstyle entries +/*! +* Class to handle dim style symbol table entries +* @author Rallaz +*/ +class DRW_Dimstyle : public DRW_TableEntry { + SETOBJFRIENDS +public: + DRW_Dimstyle() { reset();} + + void reset(){ + tType = DRW::DIMSTYLE; + dimasz = dimtxt = dimcen = 2.5; + dimexe = 1.25; + dimexo = dimgap = 0.625; + dimtxsty = ""; + dimscale = dimlfac = dimtfac = dimfxl = 1.0; + dimdli = 3.75; + dimrnd = dimdle = dimtp = dimtm = dimtsz = dimtvp = 0.0; + dimaltf = 1.0 / 25.4; + dimtol = dimlim = dimse1 = dimse2 = 0; + dimtad = 1; + dimzin = 8; + dimtoh = dimtolj = 0; + dimalt = dimsah = dimtix = dimsoxd = dimfxlon = 0; + dimtofl = 1; + dimunit = dimaltu = dimlunit = 2; + dimaltd = dimalttd = 3; + dimclrd = dimclre = dimclrt = dimjust = dimupt = 0; + dimtzin = 8; + dimazin = dimaltz = dimaltttz = dimfrac = 0; + dimtih = dimadec = dimaunit = dimsd1 = dimsd2 = dimtmove = 0; + dimaltrnd = 0.0; + dimdec = dimtdec = 2; + dimfit = dimatfit = 3; + dimdsep = ','; + dimlwd = dimlwe = -2; + DRW_TableEntry::reset(); + } + +protected: + void parseCode(int code, dxfReader *reader); + bool parseDwg(DRW::Version version, dwgBuffer *buf, duint32 bs=0); + +public: + //V12 + UTF8STRING dimpost; /*!< code 3 */ + UTF8STRING dimapost; /*!< code 4 */ +/* handle are code 105 */ + UTF8STRING dimblk; /*!< code 5, code 342 V2000+ */ + UTF8STRING dimblk1; /*!< code 6, code 343 V2000+ */ + UTF8STRING dimblk2; /*!< code 7, code 344 V2000+ */ + double dimscale; /*!< code 40 */ + double dimasz; /*!< code 41 */ + double dimexo; /*!< code 42 */ + double dimdli; /*!< code 43 */ + double dimexe; /*!< code 44 */ + double dimrnd; /*!< code 45 */ + double dimdle; /*!< code 46 */ + double dimtp; /*!< code 47 */ + double dimtm; /*!< code 48 */ + double dimfxl; /*!< code 49 V2007+ */ + double dimtxt; /*!< code 140 */ + double dimcen; /*!< code 141 */ + double dimtsz; /*!< code 142 */ + double dimaltf; /*!< code 143 */ + double dimlfac; /*!< code 144 */ + double dimtvp; /*!< code 145 */ + double dimtfac; /*!< code 146 */ + double dimgap; /*!< code 147 */ + double dimaltrnd; /*!< code 148 V2000+ */ + int dimtol; /*!< code 71 */ + int dimlim; /*!< code 72 */ + int dimtih; /*!< code 73 */ + int dimtoh; /*!< code 74 */ + int dimse1; /*!< code 75 */ + int dimse2; /*!< code 76 */ + int dimtad; /*!< code 77 */ + int dimzin; /*!< code 78 */ + int dimazin; /*!< code 79 V2000+ */ + int dimalt; /*!< code 170 */ + int dimaltd; /*!< code 171 */ + int dimtofl; /*!< code 172 */ + int dimsah; /*!< code 173 */ + int dimtix; /*!< code 174 */ + int dimsoxd; /*!< code 175 */ + int dimclrd; /*!< code 176 */ + int dimclre; /*!< code 177 */ + int dimclrt; /*!< code 178 */ + int dimadec; /*!< code 179 V2000+ */ + int dimunit; /*!< code 270 R13+ (obsolete 2000+, use dimlunit & dimfrac) */ + int dimdec; /*!< code 271 R13+ */ + int dimtdec; /*!< code 272 R13+ */ + int dimaltu; /*!< code 273 R13+ */ + int dimalttd; /*!< code 274 R13+ */ + int dimaunit; /*!< code 275 R13+ */ + int dimfrac; /*!< code 276 V2000+ */ + int dimlunit; /*!< code 277 V2000+ */ + int dimdsep; /*!< code 278 V2000+ */ + int dimtmove; /*!< code 279 V2000+ */ + int dimjust; /*!< code 280 R13+ */ + int dimsd1; /*!< code 281 R13+ */ + int dimsd2; /*!< code 282 R13+ */ + int dimtolj; /*!< code 283 R13+ */ + int dimtzin; /*!< code 284 R13+ */ + int dimaltz; /*!< code 285 R13+ */ + int dimaltttz; /*!< code 286 R13+ */ + int dimfit; /*!< code 287 R13+ (obsolete 2000+, use dimatfit & dimtmove)*/ + int dimupt; /*!< code 288 R13+ */ + int dimatfit; /*!< code 289 V2000+ */ + int dimfxlon; /*!< code 290 V2007+ */ + UTF8STRING dimtxsty; /*!< code 340 R13+ */ + UTF8STRING dimldrblk; /*!< code 341 V2000+ */ + int dimlwd; /*!< code 371 V2000+ */ + int dimlwe; /*!< code 372 V2000+ */ +}; + + +//! Class to handle line type entries +/*! +* Class to handle line type symbol table entries +* @author Rallaz +*/ +/*TODO: handle complex lineType*/ +class DRW_LType : public DRW_TableEntry { + SETOBJFRIENDS +public: + DRW_LType() { reset();} + + void reset(){ + tType = DRW::LTYPE; + desc = ""; + size = 0; + length = 0.0; + pathIdx = 0; + DRW_TableEntry::reset(); + } + +protected: + void parseCode(int code, dxfReader *reader); + bool parseDwg(DRW::Version version, dwgBuffer *buf, duint32 bs=0); + void update(); + +public: + UTF8STRING desc; /*!< descriptive string, code 3 */ +// int align; /*!< align code, always 65 ('A') code 72 */ + int size; /*!< element number, code 73 */ + double length; /*!< total length of pattern, code 40 */ +// int haveShape; /*!< complex linetype type, code 74 */ + std::vector path; /*!< trace, point or space length sequence, code 49 */ +private: + int pathIdx; +}; + + +//! Class to handle layer entries +/*! +* Class to handle layer symbol table entries +* @author Rallaz +*/ +class DRW_Layer : public DRW_TableEntry { + SETOBJFRIENDS +public: + DRW_Layer() { reset();} + + void reset() { + tType = DRW::LAYER; + lineType = "CONTINUOUS"; + color = 7; // default BYLAYER (256) + plotF = true; // default TRUE (plot yes) + lWeight = DRW_LW_Conv::widthDefault; // default BYDEFAULT (dxf -3, dwg 31) + color24 = -1; //default -1 not set + DRW_TableEntry::reset(); + } + +protected: + void parseCode(int code, dxfReader *reader); + bool parseDwg(DRW::Version version, dwgBuffer *buf, duint32 bs=0); + +public: + UTF8STRING lineType; /*!< line type, code 6 */ + int color; /*!< layer color, code 62 */ + int color24; /*!< 24-bit color, code 420 */ + bool plotF; /*!< Plot flag, code 290 */ + enum DRW_LW_Conv::lineWidth lWeight; /*!< layer lineweight, code 370 */ + std::string handlePlotS; /*!< Hard-pointer ID/handle of plotstyle, code 390 */ + std::string handleMaterialS; /*!< Hard-pointer ID/handle of materialstyle, code 347 */ +/*only used for read dwg*/ + dwgHandle lTypeH; +}; + +//! Class to handle block record entries +/*! +* Class to handle block record table entries +* @author Rallaz +*/ +class DRW_Block_Record : public DRW_TableEntry { + SETOBJFRIENDS +public: + DRW_Block_Record() { reset();} + void reset() { + tType = DRW::BLOCK_RECORD; + flags = 0; + firstEH = lastEH = DRW::NoHandle; + DRW_TableEntry::reset(); + } + +protected: +// void parseCode(int code, dxfReader *reader); + bool parseDwg(DRW::Version version, dwgBuffer *buf, duint32 bs=0); + +public: +//Note: int DRW_TableEntry::flags; contains code 70 of block + int insUnits; /*!< block insertion units, code 70 of block_record*/ + DRW_Coord basePoint; /*!< block insertion base point dwg only */ +protected: + //dwg parser +private: + duint32 block; //handle for block entity + duint32 endBlock;//handle for end block entity + duint32 firstEH; //handle of first entity, only in pre-2004 + duint32 lastEH; //handle of last entity, only in pre-2004 + std::vectorentMap; +}; + +//! Class to handle text style entries +/*! +* Class to handle text style symbol table entries +* @author Rallaz +*/ +class DRW_Textstyle : public DRW_TableEntry { + SETOBJFRIENDS +public: + DRW_Textstyle() { reset();} + + void reset(){ + tType = DRW::STYLE; + height = oblique = 0.0; + width = lastHeight = 1.0; + font="txt"; + genFlag = 0; //2= X mirror, 4= Y mirror + fontFamily = 0; + DRW_TableEntry::reset(); + } + +protected: + void parseCode(int code, dxfReader *reader); + bool parseDwg(DRW::Version version, dwgBuffer *buf, duint32 bs=0); + +public: + double height; /*!< Fixed text height (0 not set), code 40 */ + double width; /*!< Width factor, code 41 */ + double oblique; /*!< Oblique angle, code 50 */ + int genFlag; /*!< Text generation flags, code 71 */ + double lastHeight; /*!< Last height used, code 42 */ + UTF8STRING font; /*!< primary font file name, code 3 */ + UTF8STRING bigFont; /*!< bigfont file name or blank if none, code 4 */ + int fontFamily; /*!< ttf font family, italic and bold flags, code 1071 */ +}; + +//! Class to handle vport entries +/*! +* Class to handle vport symbol table entries +* @author Rallaz +*/ +class DRW_Vport : public DRW_TableEntry { + SETOBJFRIENDS +public: + DRW_Vport() { reset();} + + void reset(){ + tType = DRW::VPORT; + UpperRight.x = UpperRight.y = 1.0; + snapSpacing.x = snapSpacing.y = 10.0; + gridSpacing = snapSpacing; + center.x = 0.651828; + center.y = -0.16; + viewDir.z = 1; + height = 5.13732; + ratio = 2.4426877; + lensHeight = 50; + frontClip = backClip = snapAngle = twistAngle = 0.0; + viewMode = snap = grid = snapStyle = snapIsopair = 0; + fastZoom = 1; + circleZoom = 100; + ucsIcon = 3; + gridBehavior = 7; + DRW_TableEntry::reset(); + } + +protected: + void parseCode(int code, dxfReader *reader); + bool parseDwg(DRW::Version version, dwgBuffer *buf, duint32 bs=0); + +public: + DRW_Coord lowerLeft; /*!< Lower left corner, code 10 & 20 */ + DRW_Coord UpperRight; /*!< Upper right corner, code 11 & 21 */ + DRW_Coord center; /*!< center point in WCS, code 12 & 22 */ + DRW_Coord snapBase; /*!< snap base point in DCS, code 13 & 23 */ + DRW_Coord snapSpacing; /*!< snap Spacing, code 14 & 24 */ + DRW_Coord gridSpacing; /*!< grid Spacing, code 15 & 25 */ + DRW_Coord viewDir; /*!< view direction from target point, code 16, 26 & 36 */ + DRW_Coord viewTarget; /*!< view target point, code 17, 27 & 37 */ + double height; /*!< view height, code 40 */ + double ratio; /*!< viewport aspect ratio, code 41 */ + double lensHeight; /*!< lens height, code 42 */ + double frontClip; /*!< front clipping plane, code 43 */ + double backClip; /*!< back clipping plane, code 44 */ + double snapAngle; /*!< snap rotation angle, code 50 */ + double twistAngle; /*!< view twist angle, code 51 */ + int viewMode; /*!< view mode, code 71 */ + int circleZoom; /*!< circle zoom percent, code 72 */ + int fastZoom; /*!< fast zoom setting, code 73 */ + int ucsIcon; /*!< UCSICON setting, code 74 */ + int snap; /*!< snap on/off, code 75 */ + int grid; /*!< grid on/off, code 76 */ + int snapStyle; /*!< snap style, code 77 */ + int snapIsopair; /*!< snap isopair, code 78 */ + int gridBehavior; /*!< grid behavior, code 60, undocummented */ + /** code 60, bit coded possible value are + * bit 1 (1) show out of limits + * bit 2 (2) adaptive grid + * bit 3 (4) allow subdivision + * bit 4 (8) follow dinamic SCP + **/ +}; + + +//! Class to handle imagedef entries +/*! +* Class to handle image definitions object entries +* @author Rallaz +*/ +class DRW_ImageDef : public DRW_TableEntry {// + SETOBJFRIENDS +public: + DRW_ImageDef() { + reset(); + } + + void reset(){ + tType = DRW::IMAGEDEF; + imgVersion = 0; + DRW_TableEntry::reset(); + } + +protected: + void parseCode(int code, dxfReader *reader); + bool parseDwg(DRW::Version version, dwgBuffer *buf, duint32 bs=0); + +public: +// std::string handle; /*!< entity identifier, code 5 */ + UTF8STRING name; /*!< File name of image, code 1 */ + int imgVersion; /*!< class version, code 90, 0=R14 version */ + double u; /*!< image size in pixels U value, code 10 */ + double v; /*!< image size in pixels V value, code 20 */ + double up; /*!< default size of one pixel U value, code 11 */ + double vp; /*!< default size of one pixel V value, code 12 really is 21*/ + int loaded; /*!< image is loaded flag, code 280, 0=unloaded, 1=loaded */ + int resolution; /*!< resolution units, code 281, 0=no, 2=centimeters, 5=inch */ + + std::map reactors; +}; + +//! Class to handle AppId entries +/*! +* Class to handle AppId symbol table entries +* @author Rallaz +*/ +class DRW_AppId : public DRW_TableEntry { + SETOBJFRIENDS +public: + DRW_AppId() { reset();} + + void reset(){ + tType = DRW::APPID; + flags = 0; + name = ""; + } + +protected: + void parseCode(int code, dxfReader *reader){DRW_TableEntry::parseCode(code, reader);} + bool parseDwg(DRW::Version version, dwgBuffer *buf, duint32 bs=0); +}; + +namespace DRW { + +// Extended color palette: +// The first entry is only for direct indexing starting with [1] +// Color 1 is red (1,0,0) +const unsigned char dxfColors[][3] = { + { 0, 0, 0}, // unused + {255, 0, 0}, // 1 red + {255,255, 0}, // 2 yellow + { 0,255, 0}, // 3 green + { 0,255,255}, // 4 cyan + { 0, 0,255}, // 5 blue + {255, 0,255}, // 6 magenta + { 0, 0, 0}, // 7 black or white + {128,128,128}, // 8 50% gray + {192,192,192}, // 9 75% gray + {255, 0, 0}, // 10 + {255,127,127}, + {204, 0, 0}, + {204,102,102}, + {153, 0, 0}, + {153, 76, 76}, // 15 + {127, 0, 0}, + {127, 63, 63}, + { 76, 0, 0}, + { 76, 38, 38}, + {255, 63, 0}, // 20 + {255,159,127}, + {204, 51, 0}, + {204,127,102}, + {153, 38, 0}, + {153, 95, 76}, // 25 + {127, 31, 0}, + {127, 79, 63}, + { 76, 19, 0}, + { 76, 47, 38}, + {255,127, 0}, // 30 + {255,191,127}, + {204,102, 0}, + {204,153,102}, + {153, 76, 0}, + {153,114, 76}, // 35 + {127, 63, 0}, + {127, 95, 63}, + { 76, 38, 0}, + { 76, 57, 38}, + {255,191, 0}, // 40 + {255,223,127}, + {204,153, 0}, + {204,178,102}, + {153,114, 0}, + {153,133, 76}, // 45 + {127, 95, 0}, + {127,111, 63}, + { 76, 57, 0}, + { 76, 66, 38}, + {255,255, 0}, // 50 + {255,255,127}, + {204,204, 0}, + {204,204,102}, + {153,153, 0}, + {153,153, 76}, // 55 + {127,127, 0}, + {127,127, 63}, + { 76, 76, 0}, + { 76, 76, 38}, + {191,255, 0}, // 60 + {223,255,127}, + {153,204, 0}, + {178,204,102}, + {114,153, 0}, + {133,153, 76}, // 65 + { 95,127, 0}, + {111,127, 63}, + { 57, 76, 0}, + { 66, 76, 38}, + {127,255, 0}, // 70 + {191,255,127}, + {102,204, 0}, + {153,204,102}, + { 76,153, 0}, + {114,153, 76}, // 75 + { 63,127, 0}, + { 95,127, 63}, + { 38, 76, 0}, + { 57, 76, 38}, + { 63,255, 0}, // 80 + {159,255,127}, + { 51,204, 0}, + {127,204,102}, + { 38,153, 0}, + { 95,153, 76}, // 85 + { 31,127, 0}, + { 79,127, 63}, + { 19, 76, 0}, + { 47, 76, 38}, + { 0,255, 0}, // 90 + {127,255,127}, + { 0,204, 0}, + {102,204,102}, + { 0,153, 0}, + { 76,153, 76}, // 95 + { 0,127, 0}, + { 63,127, 63}, + { 0, 76, 0}, + { 38, 76, 38}, + { 0,255, 63}, // 100 + {127,255,159}, + { 0,204, 51}, + {102,204,127}, + { 0,153, 38}, + { 76,153, 95}, // 105 + { 0,127, 31}, + { 63,127, 79}, + { 0, 76, 19}, + { 38, 76, 47}, + { 0,255,127}, // 110 + {127,255,191}, + { 0,204,102}, + {102,204,153}, + { 0,153, 76}, + { 76,153,114}, // 115 + { 0,127, 63}, + { 63,127, 95}, + { 0, 76, 38}, + { 38, 76, 57}, + { 0,255,191}, // 120 + {127,255,223}, + { 0,204,153}, + {102,204,178}, + { 0,153,114}, + { 76,153,133}, // 125 + { 0,127, 95}, + { 63,127,111}, + { 0, 76, 57}, + { 38, 76, 66}, + { 0,255,255}, // 130 + {127,255,255}, + { 0,204,204}, + {102,204,204}, + { 0,153,153}, + { 76,153,153}, // 135 + { 0,127,127}, + { 63,127,127}, + { 0, 76, 76}, + { 38, 76, 76}, + { 0,191,255}, // 140 + {127,223,255}, + { 0,153,204}, + {102,178,204}, + { 0,114,153}, + { 76,133,153}, // 145 + { 0, 95,127}, + { 63,111,127}, + { 0, 57, 76}, + { 38, 66, 76}, + { 0,127,255}, // 150 + {127,191,255}, + { 0,102,204}, + {102,153,204}, + { 0, 76,153}, + { 76,114,153}, // 155 + { 0, 63,127}, + { 63, 95,127}, + { 0, 38, 76}, + { 38, 57, 76}, + { 0, 66,255}, // 160 + {127,159,255}, + { 0, 51,204}, + {102,127,204}, + { 0, 38,153}, + { 76, 95,153}, // 165 + { 0, 31,127}, + { 63, 79,127}, + { 0, 19, 76}, + { 38, 47, 76}, + { 0, 0,255}, // 170 + {127,127,255}, + { 0, 0,204}, + {102,102,204}, + { 0, 0,153}, + { 76, 76,153}, // 175 + { 0, 0,127}, + { 63, 63,127}, + { 0, 0, 76}, + { 38, 38, 76}, + { 63, 0,255}, // 180 + {159,127,255}, + { 50, 0,204}, + {127,102,204}, + { 38, 0,153}, + { 95, 76,153}, // 185 + { 31, 0,127}, + { 79, 63,127}, + { 19, 0, 76}, + { 47, 38, 76}, + {127, 0,255}, // 190 + {191,127,255}, + {102, 0,204}, + {153,102,204}, + { 76, 0,153}, + {114, 76,153}, // 195 + { 63, 0,127}, + { 95, 63,127}, + { 38, 0, 76}, + { 57, 38, 76}, + {191, 0,255}, // 200 + {223,127,255}, + {153, 0,204}, + {178,102,204}, + {114, 0,153}, + {133, 76,153}, // 205 + { 95, 0,127}, + {111, 63,127}, + { 57, 0, 76}, + { 66, 38, 76}, + {255, 0,255}, // 210 + {255,127,255}, + {204, 0,204}, + {204,102,204}, + {153, 0,153}, + {153, 76,153}, // 215 + {127, 0,127}, + {127, 63,127}, + { 76, 0, 76}, + { 76, 38, 76}, + {255, 0,191}, // 220 + {255,127,223}, + {204, 0,153}, + {204,102,178}, + {153, 0,114}, + {153, 76,133}, // 225 + {127, 0, 95}, + {127, 63, 11}, + { 76, 0, 57}, + { 76, 38, 66}, + {255, 0,127}, // 230 + {255,127,191}, + {204, 0,102}, + {204,102,153}, + {153, 0, 76}, + {153, 76,114}, // 235 + {127, 0, 63}, + {127, 63, 95}, + { 76, 0, 38}, + { 76, 38, 57}, + {255, 0, 63}, // 240 + {255,127,159}, + {204, 0, 51}, + {204,102,127}, + {153, 0, 38}, + {153, 76, 95}, // 245 + {127, 0, 31}, + {127, 63, 79}, + { 76, 0, 19}, + { 76, 38, 47}, + { 51, 51, 51}, // 250 + { 91, 91, 91}, + {132,132,132}, + {173,173,173}, + {214,214,214}, + {255,255,255} // 255 +}; + +} + +#endif + +// EOF diff --git a/extlib/libdxfrw/intern/drw_cptable932.h b/extlib/libdxfrw/intern/drw_cptable932.h new file mode 100644 index 0000000..0d9be10 --- /dev/null +++ b/extlib/libdxfrw/intern/drw_cptable932.h @@ -0,0 +1,7812 @@ +#ifndef DRW_CPTABLE932_H +#define DRW_CPTABLE932_H + +//Japanese + +//first entry in this table are 0xA1 +#define CPOFFSET932 0xFEC0 +//#define CP1LENGHT932 63 +#define CPLENGHT932 7724 +#define NOTFOUND932 0x30FB + +//Table 932 one byte are +//from 0xA1 -> 0xFF61 +//to 0xDF .> 0xFF9F +static const int DRW_Table932[1] = { +}; + +//Table 932 lead byte +//pairs of start/end in DRW_DoubleTable932 +static const int DRW_LeadTable932[] = { + 0, //1 #DBCS LEAD BYTE 0x81 + 147, //2 #DBCS LEAD BYTE 0x82 + 292, //3 #DBCS LEAD BYTE 0x83 + 426, //4 #DBCS LEAD BYTE 0x84 + 524, //5 #DBCS LEAD BYTE 0x85, empty + 524, //6 #DBCS LEAD BYTE 0x86, empty + 524, //7 #DBCS LEAD BYTE 0x87 + 607, //8 #DBCS LEAD BYTE 0x88 + 701, //9 #DBCS LEAD BYTE 0x89 + 889, //10 #DBCS LEAD BYTE 0x8A + 1077, //11 #DBCS LEAD BYTE 0x8B + 1265, //12 #DBCS LEAD BYTE 0x8C + 1453, //13 #DBCS LEAD BYTE 0x8D + 1641, //14 #DBCS LEAD BYTE 0x8E + 1829, //15 #DBCS LEAD BYTE 0x8F + 2017, //16 #DBCS LEAD BYTE 0x90 + 2205, //17 #DBCS LEAD BYTE 0x91 + 2393, //18 #DBCS LEAD BYTE 0x92 + 2581, //19 #DBCS LEAD BYTE 0x93 + 2769, //20 #DBCS LEAD BYTE 0x94 + 2957, //21 #DBCS LEAD BYTE 0x95 + 3145, //22 #DBCS LEAD BYTE 0x96 + 3333, //23 #DBCS LEAD BYTE 0x97 + 3521, //24 #DBCS LEAD BYTE 0x98 + 3666, //25 #DBCS LEAD BYTE 0x99 + 3854, //26 #DBCS LEAD BYTE 0x9A + 4042, //27 #DBCS LEAD BYTE 0x9B + 4230, //28 #DBCS LEAD BYTE 0x9C + 4418, //29 #DBCS LEAD BYTE 0x9D + 4606, //30 #DBCS LEAD BYTE 0x9E + 4794, //31 #DBCS LEAD BYTE 0x9F +//0xA0 to 0xDF are empty + 4982, //32 #DBCS LEAD BYTE 0xE0 + 5170, //33 #DBCS LEAD BYTE 0xE1 + 5358, //34 #DBCS LEAD BYTE 0xE2 + 5546, //35 #DBCS LEAD BYTE 0xE3 + 5734, //36 #DBCS LEAD BYTE 0xE4 + 5922, //37 #DBCS LEAD BYTE 0xE5 + 6110, //38 #DBCS LEAD BYTE 0xE6 + 6298, //39 #DBCS LEAD BYTE 0xE7 + 6486, //40 #DBCS LEAD BYTE 0xE8 + 6674, //41 #DBCS LEAD BYTE 0xE9 + 6862, //42 #DBCS LEAD BYTE 0xEA + 6962, //43 #DBCS LEAD BYTE 0xEB, empty + 6962, //44 #DBCS LEAD BYTE 0xEC, empty + 6962, //45 #DBCS LEAD BYTE 0xED + 7150, //46 #DBCS LEAD BYTE 0xEE + 7336, //47 #DBCS LEAD BYTE 0xEF, empty + 7336, //48 #DBCS LEAD BYTE 0xF0, empty + 7336, //49 #DBCS LEAD BYTE 0xF1, empty + 7336, //50 #DBCS LEAD BYTE 0xF2, empty + 7336, //51 #DBCS LEAD BYTE 0xF3, empty + 7336, //52 #DBCS LEAD BYTE 0xF4, empty + 7336, //53 #DBCS LEAD BYTE 0xF5, empty + 7336, //54 #DBCS LEAD BYTE 0xF6, empty + 7336, //55 #DBCS LEAD BYTE 0xF7, empty + 7336, //56 #DBCS LEAD BYTE 0xF8, empty + 7336, //57 #DBCS LEAD BYTE 0xF9, empty + 7336, //58 #DBCS LEAD BYTE 0xFA + 7524, //59 #DBCS LEAD BYTE 0xFB + 7712, //60 #DBCS LEAD BYTE 0xFC + 7724 //61 #END OF TABLE 0xFD +}; + +//Table 932 tail byte +static const int DRW_DoubleTable932[][2] = { + {0x8140, 0x3000}, //1 #IDEOGRAPHIC SPACE + {0x8141, 0x3001}, //2 #IDEOGRAPHIC COMMA + {0x8142, 0x3002}, //3 #IDEOGRAPHIC FULL STOP + {0x8143, 0xFF0C}, //4 #FULLWIDTH COMMA + {0x8144, 0xFF0E}, //5 #FULLWIDTH FULL STOP + {0x8145, 0x30FB}, //6 #KATAKANA MIDDLE DOT + {0x8146, 0xFF1A}, //7 #FULLWIDTH COLON + {0x8147, 0xFF1B}, //8 #FULLWIDTH SEMICOLON + {0x8148, 0xFF1F}, //9 #FULLWIDTH QUESTION MARK + {0x8149, 0xFF01}, //10 #FULLWIDTH EXCLAMATION MARK + {0x814A, 0x309B}, //11 #KATAKANA-HIRAGANA VOICED SOUND MARK + {0x814B, 0x309C}, //12 #KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK + {0x814C, 0x00B4}, //13 #ACUTE ACCENT + {0x814D, 0xFF40}, //14 #FULLWIDTH GRAVE ACCENT + {0x814E, 0x00A8}, //15 #DIAERESIS + {0x814F, 0xFF3E}, //16 #FULLWIDTH CIRCUMFLEX ACCENT + {0x8150, 0xFFE3}, //17 #FULLWIDTH MACRON + {0x8151, 0xFF3F}, //18 #FULLWIDTH LOW LINE + {0x8152, 0x30FD}, //19 #KATAKANA ITERATION MARK + {0x8153, 0x30FE}, //20 #KATAKANA VOICED ITERATION MARK + {0x8154, 0x309D}, //21 #HIRAGANA ITERATION MARK + {0x8155, 0x309E}, //22 #HIRAGANA VOICED ITERATION MARK + {0x8156, 0x3003}, //23 #DITTO MARK + {0x8157, 0x4EDD}, //24 #CJK UNIFIED IDEOGRAPH + {0x8158, 0x3005}, //25 #IDEOGRAPHIC ITERATION MARK + {0x8159, 0x3006}, //26 #IDEOGRAPHIC CLOSING MARK + {0x815A, 0x3007}, //27 #IDEOGRAPHIC NUMBER ZERO + {0x815B, 0x30FC}, //28 #KATAKANA-HIRAGANA PROLONGED SOUND MARK + {0x815C, 0x2015}, //29 #HORIZONTAL BAR + {0x815D, 0x2010}, //30 #HYPHEN + {0x815E, 0xFF0F}, //31 #FULLWIDTH SOLIDUS + {0x815F, 0xFF3C}, //32 #FULLWIDTH REVERSE SOLIDUS + {0x8160, 0xFF5E}, //33 #FULLWIDTH TILDE + {0x8161, 0x2225}, //34 #PARALLEL TO + {0x8162, 0xFF5C}, //35 #FULLWIDTH VERTICAL LINE + {0x8163, 0x2026}, //36 #HORIZONTAL ELLIPSIS + {0x8164, 0x2025}, //37 #TWO DOT LEADER + {0x8165, 0x2018}, //38 #LEFT SINGLE QUOTATION MARK + {0x8166, 0x2019}, //39 #RIGHT SINGLE QUOTATION MARK + {0x8167, 0x201C}, //40 #LEFT DOUBLE QUOTATION MARK + {0x8168, 0x201D}, //41 #RIGHT DOUBLE QUOTATION MARK + {0x8169, 0xFF08}, //42 #FULLWIDTH LEFT PARENTHESIS + {0x816A, 0xFF09}, //43 #FULLWIDTH RIGHT PARENTHESIS + {0x816B, 0x3014}, //44 #LEFT TORTOISE SHELL BRACKET + {0x816C, 0x3015}, //45 #RIGHT TORTOISE SHELL BRACKET + {0x816D, 0xFF3B}, //46 #FULLWIDTH LEFT SQUARE BRACKET + {0x816E, 0xFF3D}, //47 #FULLWIDTH RIGHT SQUARE BRACKET + {0x816F, 0xFF5B}, //48 #FULLWIDTH LEFT CURLY BRACKET + {0x8170, 0xFF5D}, //49 #FULLWIDTH RIGHT CURLY BRACKET + {0x8171, 0x3008}, //50 #LEFT ANGLE BRACKET + {0x8172, 0x3009}, //51 #RIGHT ANGLE BRACKET + {0x8173, 0x300A}, //52 #LEFT DOUBLE ANGLE BRACKET + {0x8174, 0x300B}, //53 #RIGHT DOUBLE ANGLE BRACKET + {0x8175, 0x300C}, //54 #LEFT CORNER BRACKET + {0x8176, 0x300D}, //55 #RIGHT CORNER BRACKET + {0x8177, 0x300E}, //56 #LEFT WHITE CORNER BRACKET + {0x8178, 0x300F}, //57 #RIGHT WHITE CORNER BRACKET + {0x8179, 0x3010}, //58 #LEFT BLACK LENTICULAR BRACKET + {0x817A, 0x3011}, //59 #RIGHT BLACK LENTICULAR BRACKET + {0x817B, 0xFF0B}, //60 #FULLWIDTH PLUS SIGN + {0x817C, 0xFF0D}, //61 #FULLWIDTH HYPHEN-MINUS + {0x817D, 0x00B1}, //62 #PLUS-MINUS SIGN + {0x817E, 0x00D7}, //63 #MULTIPLICATION SIGN + {0x8180, 0x00F7}, //64 #DIVISION SIGN + {0x8181, 0xFF1D}, //65 #FULLWIDTH EQUALS SIGN + {0x8182, 0x2260}, //66 #NOT EQUAL TO + {0x8183, 0xFF1C}, //67 #FULLWIDTH LESS-THAN SIGN + {0x8184, 0xFF1E}, //68 #FULLWIDTH GREATER-THAN SIGN + {0x8185, 0x2266}, //69 #LESS-THAN OVER EQUAL TO + {0x8186, 0x2267}, //70 #GREATER-THAN OVER EQUAL TO + {0x8187, 0x221E}, //71 #INFINITY + {0x8188, 0x2234}, //72 #THEREFORE + {0x8189, 0x2642}, //73 #MALE SIGN + {0x818A, 0x2640}, //74 #FEMALE SIGN + {0x818B, 0x00B0}, //75 #DEGREE SIGN + {0x818C, 0x2032}, //76 #PRIME + {0x818D, 0x2033}, //77 #DOUBLE PRIME + {0x818E, 0x2103}, //78 #DEGREE CELSIUS + {0x818F, 0xFFE5}, //79 #FULLWIDTH YEN SIGN + {0x8190, 0xFF04}, //80 #FULLWIDTH DOLLAR SIGN + {0x8191, 0xFFE0}, //81 #FULLWIDTH CENT SIGN + {0x8192, 0xFFE1}, //82 #FULLWIDTH POUND SIGN + {0x8193, 0xFF05}, //83 #FULLWIDTH PERCENT SIGN + {0x8194, 0xFF03}, //84 #FULLWIDTH NUMBER SIGN + {0x8195, 0xFF06}, //85 #FULLWIDTH AMPERSAND + {0x8196, 0xFF0A}, //86 #FULLWIDTH ASTERISK + {0x8197, 0xFF20}, //87 #FULLWIDTH COMMERCIAL AT + {0x8198, 0x00A7}, //88 #SECTION SIGN + {0x8199, 0x2606}, //89 #WHITE STAR + {0x819A, 0x2605}, //90 #BLACK STAR + {0x819B, 0x25CB}, //91 #WHITE CIRCLE + {0x819C, 0x25CF}, //92 #BLACK CIRCLE + {0x819D, 0x25CE}, //93 #BULLSEYE + {0x819E, 0x25C7}, //94 #WHITE DIAMOND + {0x819F, 0x25C6}, //95 #BLACK DIAMOND + {0x81A0, 0x25A1}, //96 #WHITE SQUARE + {0x81A1, 0x25A0}, //97 #BLACK SQUARE + {0x81A2, 0x25B3}, //98 #WHITE UP-POINTING TRIANGLE + {0x81A3, 0x25B2}, //99 #BLACK UP-POINTING TRIANGLE + {0x81A4, 0x25BD}, //100 #WHITE DOWN-POINTING TRIANGLE + {0x81A5, 0x25BC}, //101 #BLACK DOWN-POINTING TRIANGLE + {0x81A6, 0x203B}, //102 #REFERENCE MARK + {0x81A7, 0x3012}, //103 #POSTAL MARK + {0x81A8, 0x2192}, //104 #RIGHTWARDS ARROW + {0x81A9, 0x2190}, //105 #LEFTWARDS ARROW + {0x81AA, 0x2191}, //106 #UPWARDS ARROW + {0x81AB, 0x2193}, //107 #DOWNWARDS ARROW + {0x81AC, 0x3013}, //108 #GETA MARK + {0x81B8, 0x2208}, //109 #ELEMENT OF + {0x81B9, 0x220B}, //110 #CONTAINS AS MEMBER + {0x81BA, 0x2286}, //111 #SUBSET OF OR EQUAL TO + {0x81BB, 0x2287}, //112 #SUPERSET OF OR EQUAL TO + {0x81BC, 0x2282}, //113 #SUBSET OF + {0x81BD, 0x2283}, //114 #SUPERSET OF + {0x81BE, 0x222A}, //115 #UNION + {0x81BF, 0x2229}, //116 #INTERSECTION + {0x81C8, 0x2227}, //117 #LOGICAL AND + {0x81C9, 0x2228}, //118 #LOGICAL OR + {0x81CA, 0xFFE2}, //119 #FULLWIDTH NOT SIGN + {0x81CB, 0x21D2}, //120 #RIGHTWARDS DOUBLE ARROW + {0x81CC, 0x21D4}, //121 #LEFT RIGHT DOUBLE ARROW + {0x81CD, 0x2200}, //122 #FOR ALL + {0x81CE, 0x2203}, //123 #THERE EXISTS + {0x81DA, 0x2220}, //124 #ANGLE + {0x81DB, 0x22A5}, //125 #UP TACK + {0x81DC, 0x2312}, //126 #ARC + {0x81DD, 0x2202}, //127 #PARTIAL DIFFERENTIAL + {0x81DE, 0x2207}, //128 #NABLA + {0x81DF, 0x2261}, //129 #IDENTICAL TO + {0x81E0, 0x2252}, //130 #APPROXIMATELY EQUAL TO OR THE IMAGE OF + {0x81E1, 0x226A}, //131 #MUCH LESS-THAN + {0x81E2, 0x226B}, //132 #MUCH GREATER-THAN + {0x81E3, 0x221A}, //133 #SQUARE ROOT + {0x81E4, 0x223D}, //134 #REVERSED TILDE + {0x81E5, 0x221D}, //135 #PROPORTIONAL TO + {0x81E6, 0x2235}, //136 #BECAUSE + {0x81E7, 0x222B}, //137 #INTEGRAL + {0x81E8, 0x222C}, //138 #DOUBLE INTEGRAL + {0x81F0, 0x212B}, //139 #ANGSTROM SIGN + {0x81F1, 0x2030}, //140 #PER MILLE SIGN + {0x81F2, 0x266F}, //141 #MUSIC SHARP SIGN + {0x81F3, 0x266D}, //142 #MUSIC FLAT SIGN + {0x81F4, 0x266A}, //143 #EIGHTH NOTE + {0x81F5, 0x2020}, //144 #DAGGER + {0x81F6, 0x2021}, //145 #DOUBLE DAGGER + {0x81F7, 0x00B6}, //146 #PILCROW SIGN + {0x81FC, 0x25EF}, //147 #LARGE CIRCLE + {0x824F, 0xFF10}, //148 #FULLWIDTH DIGIT ZERO + {0x8250, 0xFF11}, //149 #FULLWIDTH DIGIT ONE + {0x8251, 0xFF12}, //150 #FULLWIDTH DIGIT TWO + {0x8252, 0xFF13}, //151 #FULLWIDTH DIGIT THREE + {0x8253, 0xFF14}, //152 #FULLWIDTH DIGIT FOUR + {0x8254, 0xFF15}, //153 #FULLWIDTH DIGIT FIVE + {0x8255, 0xFF16}, //154 #FULLWIDTH DIGIT SIX + {0x8256, 0xFF17}, //155 #FULLWIDTH DIGIT SEVEN + {0x8257, 0xFF18}, //156 #FULLWIDTH DIGIT EIGHT + {0x8258, 0xFF19}, //157 #FULLWIDTH DIGIT NINE + {0x8260, 0xFF21}, //158 #FULLWIDTH LATIN CAPITAL LETTER A + {0x8261, 0xFF22}, //159 #FULLWIDTH LATIN CAPITAL LETTER B + {0x8262, 0xFF23}, //160 #FULLWIDTH LATIN CAPITAL LETTER C + {0x8263, 0xFF24}, //161 #FULLWIDTH LATIN CAPITAL LETTER D + {0x8264, 0xFF25}, //162 #FULLWIDTH LATIN CAPITAL LETTER E + {0x8265, 0xFF26}, //163 #FULLWIDTH LATIN CAPITAL LETTER F + {0x8266, 0xFF27}, //164 #FULLWIDTH LATIN CAPITAL LETTER G + {0x8267, 0xFF28}, //165 #FULLWIDTH LATIN CAPITAL LETTER H + {0x8268, 0xFF29}, //166 #FULLWIDTH LATIN CAPITAL LETTER I + {0x8269, 0xFF2A}, //167 #FULLWIDTH LATIN CAPITAL LETTER J + {0x826A, 0xFF2B}, //168 #FULLWIDTH LATIN CAPITAL LETTER K + {0x826B, 0xFF2C}, //169 #FULLWIDTH LATIN CAPITAL LETTER L + {0x826C, 0xFF2D}, //170 #FULLWIDTH LATIN CAPITAL LETTER M + {0x826D, 0xFF2E}, //171 #FULLWIDTH LATIN CAPITAL LETTER N + {0x826E, 0xFF2F}, //172 #FULLWIDTH LATIN CAPITAL LETTER O + {0x826F, 0xFF30}, //173 #FULLWIDTH LATIN CAPITAL LETTER P + {0x8270, 0xFF31}, //174 #FULLWIDTH LATIN CAPITAL LETTER Q + {0x8271, 0xFF32}, //175 #FULLWIDTH LATIN CAPITAL LETTER R + {0x8272, 0xFF33}, //176 #FULLWIDTH LATIN CAPITAL LETTER S + {0x8273, 0xFF34}, //177 #FULLWIDTH LATIN CAPITAL LETTER T + {0x8274, 0xFF35}, //178 #FULLWIDTH LATIN CAPITAL LETTER U + {0x8275, 0xFF36}, //179 #FULLWIDTH LATIN CAPITAL LETTER V + {0x8276, 0xFF37}, //180 #FULLWIDTH LATIN CAPITAL LETTER W + {0x8277, 0xFF38}, //181 #FULLWIDTH LATIN CAPITAL LETTER X + {0x8278, 0xFF39}, //182 #FULLWIDTH LATIN CAPITAL LETTER Y + {0x8279, 0xFF3A}, //183 #FULLWIDTH LATIN CAPITAL LETTER Z + {0x8281, 0xFF41}, //184 #FULLWIDTH LATIN SMALL LETTER A + {0x8282, 0xFF42}, //185 #FULLWIDTH LATIN SMALL LETTER B + {0x8283, 0xFF43}, //186 #FULLWIDTH LATIN SMALL LETTER C + {0x8284, 0xFF44}, //187 #FULLWIDTH LATIN SMALL LETTER D + {0x8285, 0xFF45}, //188 #FULLWIDTH LATIN SMALL LETTER E + {0x8286, 0xFF46}, //189 #FULLWIDTH LATIN SMALL LETTER F + {0x8287, 0xFF47}, //190 #FULLWIDTH LATIN SMALL LETTER G + {0x8288, 0xFF48}, //191 #FULLWIDTH LATIN SMALL LETTER H + {0x8289, 0xFF49}, //192 #FULLWIDTH LATIN SMALL LETTER I + {0x828A, 0xFF4A}, //193 #FULLWIDTH LATIN SMALL LETTER J + {0x828B, 0xFF4B}, //194 #FULLWIDTH LATIN SMALL LETTER K + {0x828C, 0xFF4C}, //195 #FULLWIDTH LATIN SMALL LETTER L + {0x828D, 0xFF4D}, //196 #FULLWIDTH LATIN SMALL LETTER M + {0x828E, 0xFF4E}, //197 #FULLWIDTH LATIN SMALL LETTER N + {0x828F, 0xFF4F}, //198 #FULLWIDTH LATIN SMALL LETTER O + {0x8290, 0xFF50}, //199 #FULLWIDTH LATIN SMALL LETTER P + {0x8291, 0xFF51}, //200 #FULLWIDTH LATIN SMALL LETTER Q + {0x8292, 0xFF52}, //201 #FULLWIDTH LATIN SMALL LETTER R + {0x8293, 0xFF53}, //202 #FULLWIDTH LATIN SMALL LETTER S + {0x8294, 0xFF54}, //203 #FULLWIDTH LATIN SMALL LETTER T + {0x8295, 0xFF55}, //204 #FULLWIDTH LATIN SMALL LETTER U + {0x8296, 0xFF56}, //205 #FULLWIDTH LATIN SMALL LETTER V + {0x8297, 0xFF57}, //206 #FULLWIDTH LATIN SMALL LETTER W + {0x8298, 0xFF58}, //207 #FULLWIDTH LATIN SMALL LETTER X + {0x8299, 0xFF59}, //208 #FULLWIDTH LATIN SMALL LETTER Y + {0x829A, 0xFF5A}, //209 #FULLWIDTH LATIN SMALL LETTER Z + {0x829F, 0x3041}, //210 #HIRAGANA LETTER SMALL A + {0x82A0, 0x3042}, //211 #HIRAGANA LETTER A + {0x82A1, 0x3043}, //212 #HIRAGANA LETTER SMALL I + {0x82A2, 0x3044}, //213 #HIRAGANA LETTER I + {0x82A3, 0x3045}, //214 #HIRAGANA LETTER SMALL U + {0x82A4, 0x3046}, //215 #HIRAGANA LETTER U + {0x82A5, 0x3047}, //216 #HIRAGANA LETTER SMALL E + {0x82A6, 0x3048}, //217 #HIRAGANA LETTER E + {0x82A7, 0x3049}, //218 #HIRAGANA LETTER SMALL O + {0x82A8, 0x304A}, //219 #HIRAGANA LETTER O + {0x82A9, 0x304B}, //220 #HIRAGANA LETTER KA + {0x82AA, 0x304C}, //221 #HIRAGANA LETTER GA + {0x82AB, 0x304D}, //222 #HIRAGANA LETTER KI + {0x82AC, 0x304E}, //223 #HIRAGANA LETTER GI + {0x82AD, 0x304F}, //224 #HIRAGANA LETTER KU + {0x82AE, 0x3050}, //225 #HIRAGANA LETTER GU + {0x82AF, 0x3051}, //226 #HIRAGANA LETTER KE + {0x82B0, 0x3052}, //227 #HIRAGANA LETTER GE + {0x82B1, 0x3053}, //228 #HIRAGANA LETTER KO + {0x82B2, 0x3054}, //229 #HIRAGANA LETTER GO + {0x82B3, 0x3055}, //230 #HIRAGANA LETTER SA + {0x82B4, 0x3056}, //231 #HIRAGANA LETTER ZA + {0x82B5, 0x3057}, //232 #HIRAGANA LETTER SI + {0x82B6, 0x3058}, //233 #HIRAGANA LETTER ZI + {0x82B7, 0x3059}, //234 #HIRAGANA LETTER SU + {0x82B8, 0x305A}, //235 #HIRAGANA LETTER ZU + {0x82B9, 0x305B}, //236 #HIRAGANA LETTER SE + {0x82BA, 0x305C}, //237 #HIRAGANA LETTER ZE + {0x82BB, 0x305D}, //238 #HIRAGANA LETTER SO + {0x82BC, 0x305E}, //239 #HIRAGANA LETTER ZO + {0x82BD, 0x305F}, //240 #HIRAGANA LETTER TA + {0x82BE, 0x3060}, //241 #HIRAGANA LETTER DA + {0x82BF, 0x3061}, //242 #HIRAGANA LETTER TI + {0x82C0, 0x3062}, //243 #HIRAGANA LETTER DI + {0x82C1, 0x3063}, //244 #HIRAGANA LETTER SMALL TU + {0x82C2, 0x3064}, //245 #HIRAGANA LETTER TU + {0x82C3, 0x3065}, //246 #HIRAGANA LETTER DU + {0x82C4, 0x3066}, //247 #HIRAGANA LETTER TE + {0x82C5, 0x3067}, //248 #HIRAGANA LETTER DE + {0x82C6, 0x3068}, //249 #HIRAGANA LETTER TO + {0x82C7, 0x3069}, //250 #HIRAGANA LETTER DO + {0x82C8, 0x306A}, //251 #HIRAGANA LETTER NA + {0x82C9, 0x306B}, //252 #HIRAGANA LETTER NI + {0x82CA, 0x306C}, //253 #HIRAGANA LETTER NU + {0x82CB, 0x306D}, //254 #HIRAGANA LETTER NE + {0x82CC, 0x306E}, //255 #HIRAGANA LETTER NO + {0x82CD, 0x306F}, //256 #HIRAGANA LETTER HA + {0x82CE, 0x3070}, //257 #HIRAGANA LETTER BA + {0x82CF, 0x3071}, //258 #HIRAGANA LETTER PA + {0x82D0, 0x3072}, //259 #HIRAGANA LETTER HI + {0x82D1, 0x3073}, //260 #HIRAGANA LETTER BI + {0x82D2, 0x3074}, //261 #HIRAGANA LETTER PI + {0x82D3, 0x3075}, //262 #HIRAGANA LETTER HU + {0x82D4, 0x3076}, //263 #HIRAGANA LETTER BU + {0x82D5, 0x3077}, //264 #HIRAGANA LETTER PU + {0x82D6, 0x3078}, //265 #HIRAGANA LETTER HE + {0x82D7, 0x3079}, //266 #HIRAGANA LETTER BE + {0x82D8, 0x307A}, //267 #HIRAGANA LETTER PE + {0x82D9, 0x307B}, //268 #HIRAGANA LETTER HO + {0x82DA, 0x307C}, //269 #HIRAGANA LETTER BO + {0x82DB, 0x307D}, //270 #HIRAGANA LETTER PO + {0x82DC, 0x307E}, //271 #HIRAGANA LETTER MA + {0x82DD, 0x307F}, //272 #HIRAGANA LETTER MI + {0x82DE, 0x3080}, //273 #HIRAGANA LETTER MU + {0x82DF, 0x3081}, //274 #HIRAGANA LETTER ME + {0x82E0, 0x3082}, //275 #HIRAGANA LETTER MO + {0x82E1, 0x3083}, //276 #HIRAGANA LETTER SMALL YA + {0x82E2, 0x3084}, //277 #HIRAGANA LETTER YA + {0x82E3, 0x3085}, //278 #HIRAGANA LETTER SMALL YU + {0x82E4, 0x3086}, //279 #HIRAGANA LETTER YU + {0x82E5, 0x3087}, //280 #HIRAGANA LETTER SMALL YO + {0x82E6, 0x3088}, //281 #HIRAGANA LETTER YO + {0x82E7, 0x3089}, //282 #HIRAGANA LETTER RA + {0x82E8, 0x308A}, //283 #HIRAGANA LETTER RI + {0x82E9, 0x308B}, //284 #HIRAGANA LETTER RU + {0x82EA, 0x308C}, //285 #HIRAGANA LETTER RE + {0x82EB, 0x308D}, //286 #HIRAGANA LETTER RO + {0x82EC, 0x308E}, //287 #HIRAGANA LETTER SMALL WA + {0x82ED, 0x308F}, //288 #HIRAGANA LETTER WA + {0x82EE, 0x3090}, //289 #HIRAGANA LETTER WI + {0x82EF, 0x3091}, //290 #HIRAGANA LETTER WE + {0x82F0, 0x3092}, //291 #HIRAGANA LETTER WO + {0x82F1, 0x3093}, //292 #HIRAGANA LETTER N + {0x8340, 0x30A1}, //293 #KATAKANA LETTER SMALL A + {0x8341, 0x30A2}, //294 #KATAKANA LETTER A + {0x8342, 0x30A3}, //295 #KATAKANA LETTER SMALL I + {0x8343, 0x30A4}, //296 #KATAKANA LETTER I + {0x8344, 0x30A5}, //297 #KATAKANA LETTER SMALL U + {0x8345, 0x30A6}, //298 #KATAKANA LETTER U + {0x8346, 0x30A7}, //299 #KATAKANA LETTER SMALL E + {0x8347, 0x30A8}, //300 #KATAKANA LETTER E + {0x8348, 0x30A9}, //301 #KATAKANA LETTER SMALL O + {0x8349, 0x30AA}, //302 #KATAKANA LETTER O + {0x834A, 0x30AB}, //303 #KATAKANA LETTER KA + {0x834B, 0x30AC}, //304 #KATAKANA LETTER GA + {0x834C, 0x30AD}, //305 #KATAKANA LETTER KI + {0x834D, 0x30AE}, //306 #KATAKANA LETTER GI + {0x834E, 0x30AF}, //307 #KATAKANA LETTER KU + {0x834F, 0x30B0}, //308 #KATAKANA LETTER GU + {0x8350, 0x30B1}, //309 #KATAKANA LETTER KE + {0x8351, 0x30B2}, //310 #KATAKANA LETTER GE + {0x8352, 0x30B3}, //311 #KATAKANA LETTER KO + {0x8353, 0x30B4}, //312 #KATAKANA LETTER GO + {0x8354, 0x30B5}, //313 #KATAKANA LETTER SA + {0x8355, 0x30B6}, //314 #KATAKANA LETTER ZA + {0x8356, 0x30B7}, //315 #KATAKANA LETTER SI + {0x8357, 0x30B8}, //316 #KATAKANA LETTER ZI + {0x8358, 0x30B9}, //317 #KATAKANA LETTER SU + {0x8359, 0x30BA}, //318 #KATAKANA LETTER ZU + {0x835A, 0x30BB}, //319 #KATAKANA LETTER SE + {0x835B, 0x30BC}, //320 #KATAKANA LETTER ZE + {0x835C, 0x30BD}, //321 #KATAKANA LETTER SO + {0x835D, 0x30BE}, //322 #KATAKANA LETTER ZO + {0x835E, 0x30BF}, //323 #KATAKANA LETTER TA + {0x835F, 0x30C0}, //324 #KATAKANA LETTER DA + {0x8360, 0x30C1}, //325 #KATAKANA LETTER TI + {0x8361, 0x30C2}, //326 #KATAKANA LETTER DI + {0x8362, 0x30C3}, //327 #KATAKANA LETTER SMALL TU + {0x8363, 0x30C4}, //328 #KATAKANA LETTER TU + {0x8364, 0x30C5}, //329 #KATAKANA LETTER DU + {0x8365, 0x30C6}, //330 #KATAKANA LETTER TE + {0x8366, 0x30C7}, //331 #KATAKANA LETTER DE + {0x8367, 0x30C8}, //332 #KATAKANA LETTER TO + {0x8368, 0x30C9}, //333 #KATAKANA LETTER DO + {0x8369, 0x30CA}, //334 #KATAKANA LETTER NA + {0x836A, 0x30CB}, //335 #KATAKANA LETTER NI + {0x836B, 0x30CC}, //336 #KATAKANA LETTER NU + {0x836C, 0x30CD}, //337 #KATAKANA LETTER NE + {0x836D, 0x30CE}, //338 #KATAKANA LETTER NO + {0x836E, 0x30CF}, //339 #KATAKANA LETTER HA + {0x836F, 0x30D0}, //340 #KATAKANA LETTER BA + {0x8370, 0x30D1}, //341 #KATAKANA LETTER PA + {0x8371, 0x30D2}, //342 #KATAKANA LETTER HI + {0x8372, 0x30D3}, //343 #KATAKANA LETTER BI + {0x8373, 0x30D4}, //344 #KATAKANA LETTER PI + {0x8374, 0x30D5}, //345 #KATAKANA LETTER HU + {0x8375, 0x30D6}, //346 #KATAKANA LETTER BU + {0x8376, 0x30D7}, //347 #KATAKANA LETTER PU + {0x8377, 0x30D8}, //348 #KATAKANA LETTER HE + {0x8378, 0x30D9}, //349 #KATAKANA LETTER BE + {0x8379, 0x30DA}, //350 #KATAKANA LETTER PE + {0x837A, 0x30DB}, //351 #KATAKANA LETTER HO + {0x837B, 0x30DC}, //352 #KATAKANA LETTER BO + {0x837C, 0x30DD}, //353 #KATAKANA LETTER PO + {0x837D, 0x30DE}, //354 #KATAKANA LETTER MA + {0x837E, 0x30DF}, //355 #KATAKANA LETTER MI + {0x8380, 0x30E0}, //356 #KATAKANA LETTER MU + {0x8381, 0x30E1}, //357 #KATAKANA LETTER ME + {0x8382, 0x30E2}, //358 #KATAKANA LETTER MO + {0x8383, 0x30E3}, //359 #KATAKANA LETTER SMALL YA + {0x8384, 0x30E4}, //360 #KATAKANA LETTER YA + {0x8385, 0x30E5}, //361 #KATAKANA LETTER SMALL YU + {0x8386, 0x30E6}, //362 #KATAKANA LETTER YU + {0x8387, 0x30E7}, //363 #KATAKANA LETTER SMALL YO + {0x8388, 0x30E8}, //364 #KATAKANA LETTER YO + {0x8389, 0x30E9}, //365 #KATAKANA LETTER RA + {0x838A, 0x30EA}, //366 #KATAKANA LETTER RI + {0x838B, 0x30EB}, //367 #KATAKANA LETTER RU + {0x838C, 0x30EC}, //368 #KATAKANA LETTER RE + {0x838D, 0x30ED}, //369 #KATAKANA LETTER RO + {0x838E, 0x30EE}, //370 #KATAKANA LETTER SMALL WA + {0x838F, 0x30EF}, //371 #KATAKANA LETTER WA + {0x8390, 0x30F0}, //372 #KATAKANA LETTER WI + {0x8391, 0x30F1}, //373 #KATAKANA LETTER WE + {0x8392, 0x30F2}, //374 #KATAKANA LETTER WO + {0x8393, 0x30F3}, //375 #KATAKANA LETTER N + {0x8394, 0x30F4}, //376 #KATAKANA LETTER VU + {0x8395, 0x30F5}, //377 #KATAKANA LETTER SMALL KA + {0x8396, 0x30F6}, //378 #KATAKANA LETTER SMALL KE + {0x839F, 0x0391}, //379 #GREEK CAPITAL LETTER ALPHA + {0x83A0, 0x0392}, //380 #GREEK CAPITAL LETTER BETA + {0x83A1, 0x0393}, //381 #GREEK CAPITAL LETTER GAMMA + {0x83A2, 0x0394}, //382 #GREEK CAPITAL LETTER DELTA + {0x83A3, 0x0395}, //383 #GREEK CAPITAL LETTER EPSILON + {0x83A4, 0x0396}, //384 #GREEK CAPITAL LETTER ZETA + {0x83A5, 0x0397}, //385 #GREEK CAPITAL LETTER ETA + {0x83A6, 0x0398}, //386 #GREEK CAPITAL LETTER THETA + {0x83A7, 0x0399}, //387 #GREEK CAPITAL LETTER IOTA + {0x83A8, 0x039A}, //388 #GREEK CAPITAL LETTER KAPPA + {0x83A9, 0x039B}, //389 #GREEK CAPITAL LETTER LAMDA + {0x83AA, 0x039C}, //390 #GREEK CAPITAL LETTER MU + {0x83AB, 0x039D}, //391 #GREEK CAPITAL LETTER NU + {0x83AC, 0x039E}, //392 #GREEK CAPITAL LETTER XI + {0x83AD, 0x039F}, //393 #GREEK CAPITAL LETTER OMICRON + {0x83AE, 0x03A0}, //394 #GREEK CAPITAL LETTER PI + {0x83AF, 0x03A1}, //395 #GREEK CAPITAL LETTER RHO + {0x83B0, 0x03A3}, //396 #GREEK CAPITAL LETTER SIGMA + {0x83B1, 0x03A4}, //397 #GREEK CAPITAL LETTER TAU + {0x83B2, 0x03A5}, //398 #GREEK CAPITAL LETTER UPSILON + {0x83B3, 0x03A6}, //399 #GREEK CAPITAL LETTER PHI + {0x83B4, 0x03A7}, //400 #GREEK CAPITAL LETTER CHI + {0x83B5, 0x03A8}, //401 #GREEK CAPITAL LETTER PSI + {0x83B6, 0x03A9}, //402 #GREEK CAPITAL LETTER OMEGA + {0x83BF, 0x03B1}, //403 #GREEK SMALL LETTER ALPHA + {0x83C0, 0x03B2}, //404 #GREEK SMALL LETTER BETA + {0x83C1, 0x03B3}, //405 #GREEK SMALL LETTER GAMMA + {0x83C2, 0x03B4}, //406 #GREEK SMALL LETTER DELTA + {0x83C3, 0x03B5}, //407 #GREEK SMALL LETTER EPSILON + {0x83C4, 0x03B6}, //408 #GREEK SMALL LETTER ZETA + {0x83C5, 0x03B7}, //409 #GREEK SMALL LETTER ETA + {0x83C6, 0x03B8}, //410 #GREEK SMALL LETTER THETA + {0x83C7, 0x03B9}, //411 #GREEK SMALL LETTER IOTA + {0x83C8, 0x03BA}, //412 #GREEK SMALL LETTER KAPPA + {0x83C9, 0x03BB}, //413 #GREEK SMALL LETTER LAMDA + {0x83CA, 0x03BC}, //414 #GREEK SMALL LETTER MU + {0x83CB, 0x03BD}, //415 #GREEK SMALL LETTER NU + {0x83CC, 0x03BE}, //416 #GREEK SMALL LETTER XI + {0x83CD, 0x03BF}, //417 #GREEK SMALL LETTER OMICRON + {0x83CE, 0x03C0}, //418 #GREEK SMALL LETTER PI + {0x83CF, 0x03C1}, //419 #GREEK SMALL LETTER RHO + {0x83D0, 0x03C3}, //420 #GREEK SMALL LETTER SIGMA + {0x83D1, 0x03C4}, //421 #GREEK SMALL LETTER TAU + {0x83D2, 0x03C5}, //422 #GREEK SMALL LETTER UPSILON + {0x83D3, 0x03C6}, //423 #GREEK SMALL LETTER PHI + {0x83D4, 0x03C7}, //424 #GREEK SMALL LETTER CHI + {0x83D5, 0x03C8}, //425 #GREEK SMALL LETTER PSI + {0x83D6, 0x03C9}, //426 #GREEK SMALL LETTER OMEGA + {0x8440, 0x0410}, //427 #CYRILLIC CAPITAL LETTER A + {0x8441, 0x0411}, //428 #CYRILLIC CAPITAL LETTER BE + {0x8442, 0x0412}, //429 #CYRILLIC CAPITAL LETTER VE + {0x8443, 0x0413}, //430 #CYRILLIC CAPITAL LETTER GHE + {0x8444, 0x0414}, //431 #CYRILLIC CAPITAL LETTER DE + {0x8445, 0x0415}, //432 #CYRILLIC CAPITAL LETTER IE + {0x8446, 0x0401}, //433 #CYRILLIC CAPITAL LETTER IO + {0x8447, 0x0416}, //434 #CYRILLIC CAPITAL LETTER ZHE + {0x8448, 0x0417}, //435 #CYRILLIC CAPITAL LETTER ZE + {0x8449, 0x0418}, //436 #CYRILLIC CAPITAL LETTER I + {0x844A, 0x0419}, //437 #CYRILLIC CAPITAL LETTER SHORT I + {0x844B, 0x041A}, //438 #CYRILLIC CAPITAL LETTER KA + {0x844C, 0x041B}, //439 #CYRILLIC CAPITAL LETTER EL + {0x844D, 0x041C}, //440 #CYRILLIC CAPITAL LETTER EM + {0x844E, 0x041D}, //441 #CYRILLIC CAPITAL LETTER EN + {0x844F, 0x041E}, //442 #CYRILLIC CAPITAL LETTER O + {0x8450, 0x041F}, //443 #CYRILLIC CAPITAL LETTER PE + {0x8451, 0x0420}, //444 #CYRILLIC CAPITAL LETTER ER + {0x8452, 0x0421}, //445 #CYRILLIC CAPITAL LETTER ES + {0x8453, 0x0422}, //446 #CYRILLIC CAPITAL LETTER TE + {0x8454, 0x0423}, //447 #CYRILLIC CAPITAL LETTER U + {0x8455, 0x0424}, //448 #CYRILLIC CAPITAL LETTER EF + {0x8456, 0x0425}, //449 #CYRILLIC CAPITAL LETTER HA + {0x8457, 0x0426}, //450 #CYRILLIC CAPITAL LETTER TSE + {0x8458, 0x0427}, //451 #CYRILLIC CAPITAL LETTER CHE + {0x8459, 0x0428}, //452 #CYRILLIC CAPITAL LETTER SHA + {0x845A, 0x0429}, //453 #CYRILLIC CAPITAL LETTER SHCHA + {0x845B, 0x042A}, //454 #CYRILLIC CAPITAL LETTER HARD SIGN + {0x845C, 0x042B}, //455 #CYRILLIC CAPITAL LETTER YERU + {0x845D, 0x042C}, //456 #CYRILLIC CAPITAL LETTER SOFT SIGN + {0x845E, 0x042D}, //457 #CYRILLIC CAPITAL LETTER E + {0x845F, 0x042E}, //458 #CYRILLIC CAPITAL LETTER YU + {0x8460, 0x042F}, //459 #CYRILLIC CAPITAL LETTER YA + {0x8470, 0x0430}, //460 #CYRILLIC SMALL LETTER A + {0x8471, 0x0431}, //461 #CYRILLIC SMALL LETTER BE + {0x8472, 0x0432}, //462 #CYRILLIC SMALL LETTER VE + {0x8473, 0x0433}, //463 #CYRILLIC SMALL LETTER GHE + {0x8474, 0x0434}, //464 #CYRILLIC SMALL LETTER DE + {0x8475, 0x0435}, //465 #CYRILLIC SMALL LETTER IE + {0x8476, 0x0451}, //466 #CYRILLIC SMALL LETTER IO + {0x8477, 0x0436}, //467 #CYRILLIC SMALL LETTER ZHE + {0x8478, 0x0437}, //468 #CYRILLIC SMALL LETTER ZE + {0x8479, 0x0438}, //469 #CYRILLIC SMALL LETTER I + {0x847A, 0x0439}, //470 #CYRILLIC SMALL LETTER SHORT I + {0x847B, 0x043A}, //471 #CYRILLIC SMALL LETTER KA + {0x847C, 0x043B}, //472 #CYRILLIC SMALL LETTER EL + {0x847D, 0x043C}, //473 #CYRILLIC SMALL LETTER EM + {0x847E, 0x043D}, //474 #CYRILLIC SMALL LETTER EN + {0x8480, 0x043E}, //475 #CYRILLIC SMALL LETTER O + {0x8481, 0x043F}, //476 #CYRILLIC SMALL LETTER PE + {0x8482, 0x0440}, //477 #CYRILLIC SMALL LETTER ER + {0x8483, 0x0441}, //478 #CYRILLIC SMALL LETTER ES + {0x8484, 0x0442}, //479 #CYRILLIC SMALL LETTER TE + {0x8485, 0x0443}, //480 #CYRILLIC SMALL LETTER U + {0x8486, 0x0444}, //481 #CYRILLIC SMALL LETTER EF + {0x8487, 0x0445}, //482 #CYRILLIC SMALL LETTER HA + {0x8488, 0x0446}, //483 #CYRILLIC SMALL LETTER TSE + {0x8489, 0x0447}, //484 #CYRILLIC SMALL LETTER CHE + {0x848A, 0x0448}, //485 #CYRILLIC SMALL LETTER SHA + {0x848B, 0x0449}, //486 #CYRILLIC SMALL LETTER SHCHA + {0x848C, 0x044A}, //487 #CYRILLIC SMALL LETTER HARD SIGN + {0x848D, 0x044B}, //488 #CYRILLIC SMALL LETTER YERU + {0x848E, 0x044C}, //489 #CYRILLIC SMALL LETTER SOFT SIGN + {0x848F, 0x044D}, //490 #CYRILLIC SMALL LETTER E + {0x8490, 0x044E}, //491 #CYRILLIC SMALL LETTER YU + {0x8491, 0x044F}, //492 #CYRILLIC SMALL LETTER YA + {0x849F, 0x2500}, //493 #BOX DRAWINGS LIGHT HORIZONTAL + {0x84A0, 0x2502}, //494 #BOX DRAWINGS LIGHT VERTICAL + {0x84A1, 0x250C}, //495 #BOX DRAWINGS LIGHT DOWN AND RIGHT + {0x84A2, 0x2510}, //496 #BOX DRAWINGS LIGHT DOWN AND LEFT + {0x84A3, 0x2518}, //497 #BOX DRAWINGS LIGHT UP AND LEFT + {0x84A4, 0x2514}, //498 #BOX DRAWINGS LIGHT UP AND RIGHT + {0x84A5, 0x251C}, //499 #BOX DRAWINGS LIGHT VERTICAL AND RIGHT + {0x84A6, 0x252C}, //500 #BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + {0x84A7, 0x2524}, //501 #BOX DRAWINGS LIGHT VERTICAL AND LEFT + {0x84A8, 0x2534}, //502 #BOX DRAWINGS LIGHT UP AND HORIZONTAL + {0x84A9, 0x253C}, //503 #BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + {0x84AA, 0x2501}, //504 #BOX DRAWINGS HEAVY HORIZONTAL + {0x84AB, 0x2503}, //505 #BOX DRAWINGS HEAVY VERTICAL + {0x84AC, 0x250F}, //506 #BOX DRAWINGS HEAVY DOWN AND RIGHT + {0x84AD, 0x2513}, //507 #BOX DRAWINGS HEAVY DOWN AND LEFT + {0x84AE, 0x251B}, //508 #BOX DRAWINGS HEAVY UP AND LEFT + {0x84AF, 0x2517}, //509 #BOX DRAWINGS HEAVY UP AND RIGHT + {0x84B0, 0x2523}, //510 #BOX DRAWINGS HEAVY VERTICAL AND RIGHT + {0x84B1, 0x2533}, //511 #BOX DRAWINGS HEAVY DOWN AND HORIZONTAL + {0x84B2, 0x252B}, //512 #BOX DRAWINGS HEAVY VERTICAL AND LEFT + {0x84B3, 0x253B}, //513 #BOX DRAWINGS HEAVY UP AND HORIZONTAL + {0x84B4, 0x254B}, //514 #BOX DRAWINGS HEAVY VERTICAL AND HORIZONTAL + {0x84B5, 0x2520}, //515 #BOX DRAWINGS VERTICAL HEAVY AND RIGHT LIGHT + {0x84B6, 0x252F}, //516 #BOX DRAWINGS DOWN LIGHT AND HORIZONTAL HEAVY + {0x84B7, 0x2528}, //517 #BOX DRAWINGS VERTICAL HEAVY AND LEFT LIGHT + {0x84B8, 0x2537}, //518 #BOX DRAWINGS UP LIGHT AND HORIZONTAL HEAVY + {0x84B9, 0x253F}, //519 #BOX DRAWINGS VERTICAL LIGHT AND HORIZONTAL HEAVY + {0x84BA, 0x251D}, //520 #BOX DRAWINGS VERTICAL LIGHT AND RIGHT HEAVY + {0x84BB, 0x2530}, //521 #BOX DRAWINGS DOWN HEAVY AND HORIZONTAL LIGHT + {0x84BC, 0x2525}, //522 #BOX DRAWINGS VERTICAL LIGHT AND LEFT HEAVY + {0x84BD, 0x2538}, //523 #BOX DRAWINGS UP HEAVY AND HORIZONTAL LIGHT + {0x84BE, 0x2542}, //524 #BOX DRAWINGS VERTICAL HEAVY AND HORIZONTAL LIGHT + {0x8740, 0x2460}, //525 #CIRCLED DIGIT ONE + {0x8741, 0x2461}, //526 #CIRCLED DIGIT TWO + {0x8742, 0x2462}, //527 #CIRCLED DIGIT THREE + {0x8743, 0x2463}, //528 #CIRCLED DIGIT FOUR + {0x8744, 0x2464}, //529 #CIRCLED DIGIT FIVE + {0x8745, 0x2465}, //530 #CIRCLED DIGIT SIX + {0x8746, 0x2466}, //531 #CIRCLED DIGIT SEVEN + {0x8747, 0x2467}, //532 #CIRCLED DIGIT EIGHT + {0x8748, 0x2468}, //533 #CIRCLED DIGIT NINE + {0x8749, 0x2469}, //534 #CIRCLED NUMBER TEN + {0x874A, 0x246A}, //535 #CIRCLED NUMBER ELEVEN + {0x874B, 0x246B}, //536 #CIRCLED NUMBER TWELVE + {0x874C, 0x246C}, //537 #CIRCLED NUMBER THIRTEEN + {0x874D, 0x246D}, //538 #CIRCLED NUMBER FOURTEEN + {0x874E, 0x246E}, //539 #CIRCLED NUMBER FIFTEEN + {0x874F, 0x246F}, //540 #CIRCLED NUMBER SIXTEEN + {0x8750, 0x2470}, //541 #CIRCLED NUMBER SEVENTEEN + {0x8751, 0x2471}, //542 #CIRCLED NUMBER EIGHTEEN + {0x8752, 0x2472}, //543 #CIRCLED NUMBER NINETEEN + {0x8753, 0x2473}, //544 #CIRCLED NUMBER TWENTY + {0x8754, 0x2160}, //545 #ROMAN NUMERAL ONE + {0x8755, 0x2161}, //546 #ROMAN NUMERAL TWO + {0x8756, 0x2162}, //547 #ROMAN NUMERAL THREE + {0x8757, 0x2163}, //548 #ROMAN NUMERAL FOUR + {0x8758, 0x2164}, //549 #ROMAN NUMERAL FIVE + {0x8759, 0x2165}, //550 #ROMAN NUMERAL SIX + {0x875A, 0x2166}, //551 #ROMAN NUMERAL SEVEN + {0x875B, 0x2167}, //552 #ROMAN NUMERAL EIGHT + {0x875C, 0x2168}, //553 #ROMAN NUMERAL NINE + {0x875D, 0x2169}, //554 #ROMAN NUMERAL TEN + {0x875F, 0x3349}, //555 #SQUARE MIRI + {0x8760, 0x3314}, //556 #SQUARE KIRO + {0x8761, 0x3322}, //557 #SQUARE SENTI + {0x8762, 0x334D}, //558 #SQUARE MEETORU + {0x8763, 0x3318}, //559 #SQUARE GURAMU + {0x8764, 0x3327}, //560 #SQUARE TON + {0x8765, 0x3303}, //561 #SQUARE AARU + {0x8766, 0x3336}, //562 #SQUARE HEKUTAARU + {0x8767, 0x3351}, //563 #SQUARE RITTORU + {0x8768, 0x3357}, //564 #SQUARE WATTO + {0x8769, 0x330D}, //565 #SQUARE KARORII + {0x876A, 0x3326}, //566 #SQUARE DORU + {0x876B, 0x3323}, //567 #SQUARE SENTO + {0x876C, 0x332B}, //568 #SQUARE PAASENTO + {0x876D, 0x334A}, //569 #SQUARE MIRIBAARU + {0x876E, 0x333B}, //570 #SQUARE PEEZI + {0x876F, 0x339C}, //571 #SQUARE MM + {0x8770, 0x339D}, //572 #SQUARE CM + {0x8771, 0x339E}, //573 #SQUARE KM + {0x8772, 0x338E}, //574 #SQUARE MG + {0x8773, 0x338F}, //575 #SQUARE KG + {0x8774, 0x33C4}, //576 #SQUARE CC + {0x8775, 0x33A1}, //577 #SQUARE M SQUARED + {0x877E, 0x337B}, //578 #SQUARE ERA NAME HEISEI + {0x8780, 0x301D}, //579 #REVERSED DOUBLE PRIME QUOTATION MARK + {0x8781, 0x301F}, //580 #LOW DOUBLE PRIME QUOTATION MARK + {0x8782, 0x2116}, //581 #NUMERO SIGN + {0x8783, 0x33CD}, //582 #SQUARE KK + {0x8784, 0x2121}, //583 #TELEPHONE SIGN + {0x8785, 0x32A4}, //584 #CIRCLED IDEOGRAPH HIGH + {0x8786, 0x32A5}, //585 #CIRCLED IDEOGRAPH CENTRE + {0x8787, 0x32A6}, //586 #CIRCLED IDEOGRAPH LOW + {0x8788, 0x32A7}, //587 #CIRCLED IDEOGRAPH LEFT + {0x8789, 0x32A8}, //588 #CIRCLED IDEOGRAPH RIGHT + {0x878A, 0x3231}, //589 #PARENTHESIZED IDEOGRAPH STOCK + {0x878B, 0x3232}, //590 #PARENTHESIZED IDEOGRAPH HAVE + {0x878C, 0x3239}, //591 #PARENTHESIZED IDEOGRAPH REPRESENT + {0x878D, 0x337E}, //592 #SQUARE ERA NAME MEIZI + {0x878E, 0x337D}, //593 #SQUARE ERA NAME TAISYOU + {0x878F, 0x337C}, //594 #SQUARE ERA NAME SYOUWA + {0x8790, 0x2252}, //595 #APPROXIMATELY EQUAL TO OR THE IMAGE OF + {0x8791, 0x2261}, //596 #IDENTICAL TO + {0x8792, 0x222B}, //597 #INTEGRAL + {0x8793, 0x222E}, //598 #CONTOUR INTEGRAL + {0x8794, 0x2211}, //599 #N-ARY SUMMATION + {0x8795, 0x221A}, //600 #SQUARE ROOT + {0x8796, 0x22A5}, //601 #UP TACK + {0x8797, 0x2220}, //602 #ANGLE + {0x8798, 0x221F}, //603 #RIGHT ANGLE + {0x8799, 0x22BF}, //604 #RIGHT TRIANGLE + {0x879A, 0x2235}, //605 #BECAUSE + {0x879B, 0x2229}, //606 #INTERSECTION + {0x879C, 0x222A}, //607 #UNION + {0x889F, 0x4E9C}, //608 #CJK UNIFIED IDEOGRAPH + {0x88A0, 0x5516}, //609 #CJK UNIFIED IDEOGRAPH + {0x88A1, 0x5A03}, //610 #CJK UNIFIED IDEOGRAPH + {0x88A2, 0x963F}, //611 #CJK UNIFIED IDEOGRAPH + {0x88A3, 0x54C0}, //612 #CJK UNIFIED IDEOGRAPH + {0x88A4, 0x611B}, //613 #CJK UNIFIED IDEOGRAPH + {0x88A5, 0x6328}, //614 #CJK UNIFIED IDEOGRAPH + {0x88A6, 0x59F6}, //615 #CJK UNIFIED IDEOGRAPH + {0x88A7, 0x9022}, //616 #CJK UNIFIED IDEOGRAPH + {0x88A8, 0x8475}, //617 #CJK UNIFIED IDEOGRAPH + {0x88A9, 0x831C}, //618 #CJK UNIFIED IDEOGRAPH + {0x88AA, 0x7A50}, //619 #CJK UNIFIED IDEOGRAPH + {0x88AB, 0x60AA}, //620 #CJK UNIFIED IDEOGRAPH + {0x88AC, 0x63E1}, //621 #CJK UNIFIED IDEOGRAPH + {0x88AD, 0x6E25}, //622 #CJK UNIFIED IDEOGRAPH + {0x88AE, 0x65ED}, //623 #CJK UNIFIED IDEOGRAPH + {0x88AF, 0x8466}, //624 #CJK UNIFIED IDEOGRAPH + {0x88B0, 0x82A6}, //625 #CJK UNIFIED IDEOGRAPH + {0x88B1, 0x9BF5}, //626 #CJK UNIFIED IDEOGRAPH + {0x88B2, 0x6893}, //627 #CJK UNIFIED IDEOGRAPH + {0x88B3, 0x5727}, //628 #CJK UNIFIED IDEOGRAPH + {0x88B4, 0x65A1}, //629 #CJK UNIFIED IDEOGRAPH + {0x88B5, 0x6271}, //630 #CJK UNIFIED IDEOGRAPH + {0x88B6, 0x5B9B}, //631 #CJK UNIFIED IDEOGRAPH + {0x88B7, 0x59D0}, //632 #CJK UNIFIED IDEOGRAPH + {0x88B8, 0x867B}, //633 #CJK UNIFIED IDEOGRAPH + {0x88B9, 0x98F4}, //634 #CJK UNIFIED IDEOGRAPH + {0x88BA, 0x7D62}, //635 #CJK UNIFIED IDEOGRAPH + {0x88BB, 0x7DBE}, //636 #CJK UNIFIED IDEOGRAPH + {0x88BC, 0x9B8E}, //637 #CJK UNIFIED IDEOGRAPH + {0x88BD, 0x6216}, //638 #CJK UNIFIED IDEOGRAPH + {0x88BE, 0x7C9F}, //639 #CJK UNIFIED IDEOGRAPH + {0x88BF, 0x88B7}, //640 #CJK UNIFIED IDEOGRAPH + {0x88C0, 0x5B89}, //641 #CJK UNIFIED IDEOGRAPH + {0x88C1, 0x5EB5}, //642 #CJK UNIFIED IDEOGRAPH + {0x88C2, 0x6309}, //643 #CJK UNIFIED IDEOGRAPH + {0x88C3, 0x6697}, //644 #CJK UNIFIED IDEOGRAPH + {0x88C4, 0x6848}, //645 #CJK UNIFIED IDEOGRAPH + {0x88C5, 0x95C7}, //646 #CJK UNIFIED IDEOGRAPH + {0x88C6, 0x978D}, //647 #CJK UNIFIED IDEOGRAPH + {0x88C7, 0x674F}, //648 #CJK UNIFIED IDEOGRAPH + {0x88C8, 0x4EE5}, //649 #CJK UNIFIED IDEOGRAPH + {0x88C9, 0x4F0A}, //650 #CJK UNIFIED IDEOGRAPH + {0x88CA, 0x4F4D}, //651 #CJK UNIFIED IDEOGRAPH + {0x88CB, 0x4F9D}, //652 #CJK UNIFIED IDEOGRAPH + {0x88CC, 0x5049}, //653 #CJK UNIFIED IDEOGRAPH + {0x88CD, 0x56F2}, //654 #CJK UNIFIED IDEOGRAPH + {0x88CE, 0x5937}, //655 #CJK UNIFIED IDEOGRAPH + {0x88CF, 0x59D4}, //656 #CJK UNIFIED IDEOGRAPH + {0x88D0, 0x5A01}, //657 #CJK UNIFIED IDEOGRAPH + {0x88D1, 0x5C09}, //658 #CJK UNIFIED IDEOGRAPH + {0x88D2, 0x60DF}, //659 #CJK UNIFIED IDEOGRAPH + {0x88D3, 0x610F}, //660 #CJK UNIFIED IDEOGRAPH + {0x88D4, 0x6170}, //661 #CJK UNIFIED IDEOGRAPH + {0x88D5, 0x6613}, //662 #CJK UNIFIED IDEOGRAPH + {0x88D6, 0x6905}, //663 #CJK UNIFIED IDEOGRAPH + {0x88D7, 0x70BA}, //664 #CJK UNIFIED IDEOGRAPH + {0x88D8, 0x754F}, //665 #CJK UNIFIED IDEOGRAPH + {0x88D9, 0x7570}, //666 #CJK UNIFIED IDEOGRAPH + {0x88DA, 0x79FB}, //667 #CJK UNIFIED IDEOGRAPH + {0x88DB, 0x7DAD}, //668 #CJK UNIFIED IDEOGRAPH + {0x88DC, 0x7DEF}, //669 #CJK UNIFIED IDEOGRAPH + {0x88DD, 0x80C3}, //670 #CJK UNIFIED IDEOGRAPH + {0x88DE, 0x840E}, //671 #CJK UNIFIED IDEOGRAPH + {0x88DF, 0x8863}, //672 #CJK UNIFIED IDEOGRAPH + {0x88E0, 0x8B02}, //673 #CJK UNIFIED IDEOGRAPH + {0x88E1, 0x9055}, //674 #CJK UNIFIED IDEOGRAPH + {0x88E2, 0x907A}, //675 #CJK UNIFIED IDEOGRAPH + {0x88E3, 0x533B}, //676 #CJK UNIFIED IDEOGRAPH + {0x88E4, 0x4E95}, //677 #CJK UNIFIED IDEOGRAPH + {0x88E5, 0x4EA5}, //678 #CJK UNIFIED IDEOGRAPH + {0x88E6, 0x57DF}, //679 #CJK UNIFIED IDEOGRAPH + {0x88E7, 0x80B2}, //680 #CJK UNIFIED IDEOGRAPH + {0x88E8, 0x90C1}, //681 #CJK UNIFIED IDEOGRAPH + {0x88E9, 0x78EF}, //682 #CJK UNIFIED IDEOGRAPH + {0x88EA, 0x4E00}, //683 #CJK UNIFIED IDEOGRAPH + {0x88EB, 0x58F1}, //684 #CJK UNIFIED IDEOGRAPH + {0x88EC, 0x6EA2}, //685 #CJK UNIFIED IDEOGRAPH + {0x88ED, 0x9038}, //686 #CJK UNIFIED IDEOGRAPH + {0x88EE, 0x7A32}, //687 #CJK UNIFIED IDEOGRAPH + {0x88EF, 0x8328}, //688 #CJK UNIFIED IDEOGRAPH + {0x88F0, 0x828B}, //689 #CJK UNIFIED IDEOGRAPH + {0x88F1, 0x9C2F}, //690 #CJK UNIFIED IDEOGRAPH + {0x88F2, 0x5141}, //691 #CJK UNIFIED IDEOGRAPH + {0x88F3, 0x5370}, //692 #CJK UNIFIED IDEOGRAPH + {0x88F4, 0x54BD}, //693 #CJK UNIFIED IDEOGRAPH + {0x88F5, 0x54E1}, //694 #CJK UNIFIED IDEOGRAPH + {0x88F6, 0x56E0}, //695 #CJK UNIFIED IDEOGRAPH + {0x88F7, 0x59FB}, //696 #CJK UNIFIED IDEOGRAPH + {0x88F8, 0x5F15}, //697 #CJK UNIFIED IDEOGRAPH + {0x88F9, 0x98F2}, //698 #CJK UNIFIED IDEOGRAPH + {0x88FA, 0x6DEB}, //699 #CJK UNIFIED IDEOGRAPH + {0x88FB, 0x80E4}, //700 #CJK UNIFIED IDEOGRAPH + {0x88FC, 0x852D}, //701 #CJK UNIFIED IDEOGRAPH + {0x8940, 0x9662}, //702 #CJK UNIFIED IDEOGRAPH + {0x8941, 0x9670}, //703 #CJK UNIFIED IDEOGRAPH + {0x8942, 0x96A0}, //704 #CJK UNIFIED IDEOGRAPH + {0x8943, 0x97FB}, //705 #CJK UNIFIED IDEOGRAPH + {0x8944, 0x540B}, //706 #CJK UNIFIED IDEOGRAPH + {0x8945, 0x53F3}, //707 #CJK UNIFIED IDEOGRAPH + {0x8946, 0x5B87}, //708 #CJK UNIFIED IDEOGRAPH + {0x8947, 0x70CF}, //709 #CJK UNIFIED IDEOGRAPH + {0x8948, 0x7FBD}, //710 #CJK UNIFIED IDEOGRAPH + {0x8949, 0x8FC2}, //711 #CJK UNIFIED IDEOGRAPH + {0x894A, 0x96E8}, //712 #CJK UNIFIED IDEOGRAPH + {0x894B, 0x536F}, //713 #CJK UNIFIED IDEOGRAPH + {0x894C, 0x9D5C}, //714 #CJK UNIFIED IDEOGRAPH + {0x894D, 0x7ABA}, //715 #CJK UNIFIED IDEOGRAPH + {0x894E, 0x4E11}, //716 #CJK UNIFIED IDEOGRAPH + {0x894F, 0x7893}, //717 #CJK UNIFIED IDEOGRAPH + {0x8950, 0x81FC}, //718 #CJK UNIFIED IDEOGRAPH + {0x8951, 0x6E26}, //719 #CJK UNIFIED IDEOGRAPH + {0x8952, 0x5618}, //720 #CJK UNIFIED IDEOGRAPH + {0x8953, 0x5504}, //721 #CJK UNIFIED IDEOGRAPH + {0x8954, 0x6B1D}, //722 #CJK UNIFIED IDEOGRAPH + {0x8955, 0x851A}, //723 #CJK UNIFIED IDEOGRAPH + {0x8956, 0x9C3B}, //724 #CJK UNIFIED IDEOGRAPH + {0x8957, 0x59E5}, //725 #CJK UNIFIED IDEOGRAPH + {0x8958, 0x53A9}, //726 #CJK UNIFIED IDEOGRAPH + {0x8959, 0x6D66}, //727 #CJK UNIFIED IDEOGRAPH + {0x895A, 0x74DC}, //728 #CJK UNIFIED IDEOGRAPH + {0x895B, 0x958F}, //729 #CJK UNIFIED IDEOGRAPH + {0x895C, 0x5642}, //730 #CJK UNIFIED IDEOGRAPH + {0x895D, 0x4E91}, //731 #CJK UNIFIED IDEOGRAPH + {0x895E, 0x904B}, //732 #CJK UNIFIED IDEOGRAPH + {0x895F, 0x96F2}, //733 #CJK UNIFIED IDEOGRAPH + {0x8960, 0x834F}, //734 #CJK UNIFIED IDEOGRAPH + {0x8961, 0x990C}, //735 #CJK UNIFIED IDEOGRAPH + {0x8962, 0x53E1}, //736 #CJK UNIFIED IDEOGRAPH + {0x8963, 0x55B6}, //737 #CJK UNIFIED IDEOGRAPH + {0x8964, 0x5B30}, //738 #CJK UNIFIED IDEOGRAPH + {0x8965, 0x5F71}, //739 #CJK UNIFIED IDEOGRAPH + {0x8966, 0x6620}, //740 #CJK UNIFIED IDEOGRAPH + {0x8967, 0x66F3}, //741 #CJK UNIFIED IDEOGRAPH + {0x8968, 0x6804}, //742 #CJK UNIFIED IDEOGRAPH + {0x8969, 0x6C38}, //743 #CJK UNIFIED IDEOGRAPH + {0x896A, 0x6CF3}, //744 #CJK UNIFIED IDEOGRAPH + {0x896B, 0x6D29}, //745 #CJK UNIFIED IDEOGRAPH + {0x896C, 0x745B}, //746 #CJK UNIFIED IDEOGRAPH + {0x896D, 0x76C8}, //747 #CJK UNIFIED IDEOGRAPH + {0x896E, 0x7A4E}, //748 #CJK UNIFIED IDEOGRAPH + {0x896F, 0x9834}, //749 #CJK UNIFIED IDEOGRAPH + {0x8970, 0x82F1}, //750 #CJK UNIFIED IDEOGRAPH + {0x8971, 0x885B}, //751 #CJK UNIFIED IDEOGRAPH + {0x8972, 0x8A60}, //752 #CJK UNIFIED IDEOGRAPH + {0x8973, 0x92ED}, //753 #CJK UNIFIED IDEOGRAPH + {0x8974, 0x6DB2}, //754 #CJK UNIFIED IDEOGRAPH + {0x8975, 0x75AB}, //755 #CJK UNIFIED IDEOGRAPH + {0x8976, 0x76CA}, //756 #CJK UNIFIED IDEOGRAPH + {0x8977, 0x99C5}, //757 #CJK UNIFIED IDEOGRAPH + {0x8978, 0x60A6}, //758 #CJK UNIFIED IDEOGRAPH + {0x8979, 0x8B01}, //759 #CJK UNIFIED IDEOGRAPH + {0x897A, 0x8D8A}, //760 #CJK UNIFIED IDEOGRAPH + {0x897B, 0x95B2}, //761 #CJK UNIFIED IDEOGRAPH + {0x897C, 0x698E}, //762 #CJK UNIFIED IDEOGRAPH + {0x897D, 0x53AD}, //763 #CJK UNIFIED IDEOGRAPH + {0x897E, 0x5186}, //764 #CJK UNIFIED IDEOGRAPH + {0x8980, 0x5712}, //765 #CJK UNIFIED IDEOGRAPH + {0x8981, 0x5830}, //766 #CJK UNIFIED IDEOGRAPH + {0x8982, 0x5944}, //767 #CJK UNIFIED IDEOGRAPH + {0x8983, 0x5BB4}, //768 #CJK UNIFIED IDEOGRAPH + {0x8984, 0x5EF6}, //769 #CJK UNIFIED IDEOGRAPH + {0x8985, 0x6028}, //770 #CJK UNIFIED IDEOGRAPH + {0x8986, 0x63A9}, //771 #CJK UNIFIED IDEOGRAPH + {0x8987, 0x63F4}, //772 #CJK UNIFIED IDEOGRAPH + {0x8988, 0x6CBF}, //773 #CJK UNIFIED IDEOGRAPH + {0x8989, 0x6F14}, //774 #CJK UNIFIED IDEOGRAPH + {0x898A, 0x708E}, //775 #CJK UNIFIED IDEOGRAPH + {0x898B, 0x7114}, //776 #CJK UNIFIED IDEOGRAPH + {0x898C, 0x7159}, //777 #CJK UNIFIED IDEOGRAPH + {0x898D, 0x71D5}, //778 #CJK UNIFIED IDEOGRAPH + {0x898E, 0x733F}, //779 #CJK UNIFIED IDEOGRAPH + {0x898F, 0x7E01}, //780 #CJK UNIFIED IDEOGRAPH + {0x8990, 0x8276}, //781 #CJK UNIFIED IDEOGRAPH + {0x8991, 0x82D1}, //782 #CJK UNIFIED IDEOGRAPH + {0x8992, 0x8597}, //783 #CJK UNIFIED IDEOGRAPH + {0x8993, 0x9060}, //784 #CJK UNIFIED IDEOGRAPH + {0x8994, 0x925B}, //785 #CJK UNIFIED IDEOGRAPH + {0x8995, 0x9D1B}, //786 #CJK UNIFIED IDEOGRAPH + {0x8996, 0x5869}, //787 #CJK UNIFIED IDEOGRAPH + {0x8997, 0x65BC}, //788 #CJK UNIFIED IDEOGRAPH + {0x8998, 0x6C5A}, //789 #CJK UNIFIED IDEOGRAPH + {0x8999, 0x7525}, //790 #CJK UNIFIED IDEOGRAPH + {0x899A, 0x51F9}, //791 #CJK UNIFIED IDEOGRAPH + {0x899B, 0x592E}, //792 #CJK UNIFIED IDEOGRAPH + {0x899C, 0x5965}, //793 #CJK UNIFIED IDEOGRAPH + {0x899D, 0x5F80}, //794 #CJK UNIFIED IDEOGRAPH + {0x899E, 0x5FDC}, //795 #CJK UNIFIED IDEOGRAPH + {0x899F, 0x62BC}, //796 #CJK UNIFIED IDEOGRAPH + {0x89A0, 0x65FA}, //797 #CJK UNIFIED IDEOGRAPH + {0x89A1, 0x6A2A}, //798 #CJK UNIFIED IDEOGRAPH + {0x89A2, 0x6B27}, //799 #CJK UNIFIED IDEOGRAPH + {0x89A3, 0x6BB4}, //800 #CJK UNIFIED IDEOGRAPH + {0x89A4, 0x738B}, //801 #CJK UNIFIED IDEOGRAPH + {0x89A5, 0x7FC1}, //802 #CJK UNIFIED IDEOGRAPH + {0x89A6, 0x8956}, //803 #CJK UNIFIED IDEOGRAPH + {0x89A7, 0x9D2C}, //804 #CJK UNIFIED IDEOGRAPH + {0x89A8, 0x9D0E}, //805 #CJK UNIFIED IDEOGRAPH + {0x89A9, 0x9EC4}, //806 #CJK UNIFIED IDEOGRAPH + {0x89AA, 0x5CA1}, //807 #CJK UNIFIED IDEOGRAPH + {0x89AB, 0x6C96}, //808 #CJK UNIFIED IDEOGRAPH + {0x89AC, 0x837B}, //809 #CJK UNIFIED IDEOGRAPH + {0x89AD, 0x5104}, //810 #CJK UNIFIED IDEOGRAPH + {0x89AE, 0x5C4B}, //811 #CJK UNIFIED IDEOGRAPH + {0x89AF, 0x61B6}, //812 #CJK UNIFIED IDEOGRAPH + {0x89B0, 0x81C6}, //813 #CJK UNIFIED IDEOGRAPH + {0x89B1, 0x6876}, //814 #CJK UNIFIED IDEOGRAPH + {0x89B2, 0x7261}, //815 #CJK UNIFIED IDEOGRAPH + {0x89B3, 0x4E59}, //816 #CJK UNIFIED IDEOGRAPH + {0x89B4, 0x4FFA}, //817 #CJK UNIFIED IDEOGRAPH + {0x89B5, 0x5378}, //818 #CJK UNIFIED IDEOGRAPH + {0x89B6, 0x6069}, //819 #CJK UNIFIED IDEOGRAPH + {0x89B7, 0x6E29}, //820 #CJK UNIFIED IDEOGRAPH + {0x89B8, 0x7A4F}, //821 #CJK UNIFIED IDEOGRAPH + {0x89B9, 0x97F3}, //822 #CJK UNIFIED IDEOGRAPH + {0x89BA, 0x4E0B}, //823 #CJK UNIFIED IDEOGRAPH + {0x89BB, 0x5316}, //824 #CJK UNIFIED IDEOGRAPH + {0x89BC, 0x4EEE}, //825 #CJK UNIFIED IDEOGRAPH + {0x89BD, 0x4F55}, //826 #CJK UNIFIED IDEOGRAPH + {0x89BE, 0x4F3D}, //827 #CJK UNIFIED IDEOGRAPH + {0x89BF, 0x4FA1}, //828 #CJK UNIFIED IDEOGRAPH + {0x89C0, 0x4F73}, //829 #CJK UNIFIED IDEOGRAPH + {0x89C1, 0x52A0}, //830 #CJK UNIFIED IDEOGRAPH + {0x89C2, 0x53EF}, //831 #CJK UNIFIED IDEOGRAPH + {0x89C3, 0x5609}, //832 #CJK UNIFIED IDEOGRAPH + {0x89C4, 0x590F}, //833 #CJK UNIFIED IDEOGRAPH + {0x89C5, 0x5AC1}, //834 #CJK UNIFIED IDEOGRAPH + {0x89C6, 0x5BB6}, //835 #CJK UNIFIED IDEOGRAPH + {0x89C7, 0x5BE1}, //836 #CJK UNIFIED IDEOGRAPH + {0x89C8, 0x79D1}, //837 #CJK UNIFIED IDEOGRAPH + {0x89C9, 0x6687}, //838 #CJK UNIFIED IDEOGRAPH + {0x89CA, 0x679C}, //839 #CJK UNIFIED IDEOGRAPH + {0x89CB, 0x67B6}, //840 #CJK UNIFIED IDEOGRAPH + {0x89CC, 0x6B4C}, //841 #CJK UNIFIED IDEOGRAPH + {0x89CD, 0x6CB3}, //842 #CJK UNIFIED IDEOGRAPH + {0x89CE, 0x706B}, //843 #CJK UNIFIED IDEOGRAPH + {0x89CF, 0x73C2}, //844 #CJK UNIFIED IDEOGRAPH + {0x89D0, 0x798D}, //845 #CJK UNIFIED IDEOGRAPH + {0x89D1, 0x79BE}, //846 #CJK UNIFIED IDEOGRAPH + {0x89D2, 0x7A3C}, //847 #CJK UNIFIED IDEOGRAPH + {0x89D3, 0x7B87}, //848 #CJK UNIFIED IDEOGRAPH + {0x89D4, 0x82B1}, //849 #CJK UNIFIED IDEOGRAPH + {0x89D5, 0x82DB}, //850 #CJK UNIFIED IDEOGRAPH + {0x89D6, 0x8304}, //851 #CJK UNIFIED IDEOGRAPH + {0x89D7, 0x8377}, //852 #CJK UNIFIED IDEOGRAPH + {0x89D8, 0x83EF}, //853 #CJK UNIFIED IDEOGRAPH + {0x89D9, 0x83D3}, //854 #CJK UNIFIED IDEOGRAPH + {0x89DA, 0x8766}, //855 #CJK UNIFIED IDEOGRAPH + {0x89DB, 0x8AB2}, //856 #CJK UNIFIED IDEOGRAPH + {0x89DC, 0x5629}, //857 #CJK UNIFIED IDEOGRAPH + {0x89DD, 0x8CA8}, //858 #CJK UNIFIED IDEOGRAPH + {0x89DE, 0x8FE6}, //859 #CJK UNIFIED IDEOGRAPH + {0x89DF, 0x904E}, //860 #CJK UNIFIED IDEOGRAPH + {0x89E0, 0x971E}, //861 #CJK UNIFIED IDEOGRAPH + {0x89E1, 0x868A}, //862 #CJK UNIFIED IDEOGRAPH + {0x89E2, 0x4FC4}, //863 #CJK UNIFIED IDEOGRAPH + {0x89E3, 0x5CE8}, //864 #CJK UNIFIED IDEOGRAPH + {0x89E4, 0x6211}, //865 #CJK UNIFIED IDEOGRAPH + {0x89E5, 0x7259}, //866 #CJK UNIFIED IDEOGRAPH + {0x89E6, 0x753B}, //867 #CJK UNIFIED IDEOGRAPH + {0x89E7, 0x81E5}, //868 #CJK UNIFIED IDEOGRAPH + {0x89E8, 0x82BD}, //869 #CJK UNIFIED IDEOGRAPH + {0x89E9, 0x86FE}, //870 #CJK UNIFIED IDEOGRAPH + {0x89EA, 0x8CC0}, //871 #CJK UNIFIED IDEOGRAPH + {0x89EB, 0x96C5}, //872 #CJK UNIFIED IDEOGRAPH + {0x89EC, 0x9913}, //873 #CJK UNIFIED IDEOGRAPH + {0x89ED, 0x99D5}, //874 #CJK UNIFIED IDEOGRAPH + {0x89EE, 0x4ECB}, //875 #CJK UNIFIED IDEOGRAPH + {0x89EF, 0x4F1A}, //876 #CJK UNIFIED IDEOGRAPH + {0x89F0, 0x89E3}, //877 #CJK UNIFIED IDEOGRAPH + {0x89F1, 0x56DE}, //878 #CJK UNIFIED IDEOGRAPH + {0x89F2, 0x584A}, //879 #CJK UNIFIED IDEOGRAPH + {0x89F3, 0x58CA}, //880 #CJK UNIFIED IDEOGRAPH + {0x89F4, 0x5EFB}, //881 #CJK UNIFIED IDEOGRAPH + {0x89F5, 0x5FEB}, //882 #CJK UNIFIED IDEOGRAPH + {0x89F6, 0x602A}, //883 #CJK UNIFIED IDEOGRAPH + {0x89F7, 0x6094}, //884 #CJK UNIFIED IDEOGRAPH + {0x89F8, 0x6062}, //885 #CJK UNIFIED IDEOGRAPH + {0x89F9, 0x61D0}, //886 #CJK UNIFIED IDEOGRAPH + {0x89FA, 0x6212}, //887 #CJK UNIFIED IDEOGRAPH + {0x89FB, 0x62D0}, //888 #CJK UNIFIED IDEOGRAPH + {0x89FC, 0x6539}, //889 #CJK UNIFIED IDEOGRAPH + {0x8A40, 0x9B41}, //890 #CJK UNIFIED IDEOGRAPH + {0x8A41, 0x6666}, //891 #CJK UNIFIED IDEOGRAPH + {0x8A42, 0x68B0}, //892 #CJK UNIFIED IDEOGRAPH + {0x8A43, 0x6D77}, //893 #CJK UNIFIED IDEOGRAPH + {0x8A44, 0x7070}, //894 #CJK UNIFIED IDEOGRAPH + {0x8A45, 0x754C}, //895 #CJK UNIFIED IDEOGRAPH + {0x8A46, 0x7686}, //896 #CJK UNIFIED IDEOGRAPH + {0x8A47, 0x7D75}, //897 #CJK UNIFIED IDEOGRAPH + {0x8A48, 0x82A5}, //898 #CJK UNIFIED IDEOGRAPH + {0x8A49, 0x87F9}, //899 #CJK UNIFIED IDEOGRAPH + {0x8A4A, 0x958B}, //900 #CJK UNIFIED IDEOGRAPH + {0x8A4B, 0x968E}, //901 #CJK UNIFIED IDEOGRAPH + {0x8A4C, 0x8C9D}, //902 #CJK UNIFIED IDEOGRAPH + {0x8A4D, 0x51F1}, //903 #CJK UNIFIED IDEOGRAPH + {0x8A4E, 0x52BE}, //904 #CJK UNIFIED IDEOGRAPH + {0x8A4F, 0x5916}, //905 #CJK UNIFIED IDEOGRAPH + {0x8A50, 0x54B3}, //906 #CJK UNIFIED IDEOGRAPH + {0x8A51, 0x5BB3}, //907 #CJK UNIFIED IDEOGRAPH + {0x8A52, 0x5D16}, //908 #CJK UNIFIED IDEOGRAPH + {0x8A53, 0x6168}, //909 #CJK UNIFIED IDEOGRAPH + {0x8A54, 0x6982}, //910 #CJK UNIFIED IDEOGRAPH + {0x8A55, 0x6DAF}, //911 #CJK UNIFIED IDEOGRAPH + {0x8A56, 0x788D}, //912 #CJK UNIFIED IDEOGRAPH + {0x8A57, 0x84CB}, //913 #CJK UNIFIED IDEOGRAPH + {0x8A58, 0x8857}, //914 #CJK UNIFIED IDEOGRAPH + {0x8A59, 0x8A72}, //915 #CJK UNIFIED IDEOGRAPH + {0x8A5A, 0x93A7}, //916 #CJK UNIFIED IDEOGRAPH + {0x8A5B, 0x9AB8}, //917 #CJK UNIFIED IDEOGRAPH + {0x8A5C, 0x6D6C}, //918 #CJK UNIFIED IDEOGRAPH + {0x8A5D, 0x99A8}, //919 #CJK UNIFIED IDEOGRAPH + {0x8A5E, 0x86D9}, //920 #CJK UNIFIED IDEOGRAPH + {0x8A5F, 0x57A3}, //921 #CJK UNIFIED IDEOGRAPH + {0x8A60, 0x67FF}, //922 #CJK UNIFIED IDEOGRAPH + {0x8A61, 0x86CE}, //923 #CJK UNIFIED IDEOGRAPH + {0x8A62, 0x920E}, //924 #CJK UNIFIED IDEOGRAPH + {0x8A63, 0x5283}, //925 #CJK UNIFIED IDEOGRAPH + {0x8A64, 0x5687}, //926 #CJK UNIFIED IDEOGRAPH + {0x8A65, 0x5404}, //927 #CJK UNIFIED IDEOGRAPH + {0x8A66, 0x5ED3}, //928 #CJK UNIFIED IDEOGRAPH + {0x8A67, 0x62E1}, //929 #CJK UNIFIED IDEOGRAPH + {0x8A68, 0x64B9}, //930 #CJK UNIFIED IDEOGRAPH + {0x8A69, 0x683C}, //931 #CJK UNIFIED IDEOGRAPH + {0x8A6A, 0x6838}, //932 #CJK UNIFIED IDEOGRAPH + {0x8A6B, 0x6BBB}, //933 #CJK UNIFIED IDEOGRAPH + {0x8A6C, 0x7372}, //934 #CJK UNIFIED IDEOGRAPH + {0x8A6D, 0x78BA}, //935 #CJK UNIFIED IDEOGRAPH + {0x8A6E, 0x7A6B}, //936 #CJK UNIFIED IDEOGRAPH + {0x8A6F, 0x899A}, //937 #CJK UNIFIED IDEOGRAPH + {0x8A70, 0x89D2}, //938 #CJK UNIFIED IDEOGRAPH + {0x8A71, 0x8D6B}, //939 #CJK UNIFIED IDEOGRAPH + {0x8A72, 0x8F03}, //940 #CJK UNIFIED IDEOGRAPH + {0x8A73, 0x90ED}, //941 #CJK UNIFIED IDEOGRAPH + {0x8A74, 0x95A3}, //942 #CJK UNIFIED IDEOGRAPH + {0x8A75, 0x9694}, //943 #CJK UNIFIED IDEOGRAPH + {0x8A76, 0x9769}, //944 #CJK UNIFIED IDEOGRAPH + {0x8A77, 0x5B66}, //945 #CJK UNIFIED IDEOGRAPH + {0x8A78, 0x5CB3}, //946 #CJK UNIFIED IDEOGRAPH + {0x8A79, 0x697D}, //947 #CJK UNIFIED IDEOGRAPH + {0x8A7A, 0x984D}, //948 #CJK UNIFIED IDEOGRAPH + {0x8A7B, 0x984E}, //949 #CJK UNIFIED IDEOGRAPH + {0x8A7C, 0x639B}, //950 #CJK UNIFIED IDEOGRAPH + {0x8A7D, 0x7B20}, //951 #CJK UNIFIED IDEOGRAPH + {0x8A7E, 0x6A2B}, //952 #CJK UNIFIED IDEOGRAPH + {0x8A80, 0x6A7F}, //953 #CJK UNIFIED IDEOGRAPH + {0x8A81, 0x68B6}, //954 #CJK UNIFIED IDEOGRAPH + {0x8A82, 0x9C0D}, //955 #CJK UNIFIED IDEOGRAPH + {0x8A83, 0x6F5F}, //956 #CJK UNIFIED IDEOGRAPH + {0x8A84, 0x5272}, //957 #CJK UNIFIED IDEOGRAPH + {0x8A85, 0x559D}, //958 #CJK UNIFIED IDEOGRAPH + {0x8A86, 0x6070}, //959 #CJK UNIFIED IDEOGRAPH + {0x8A87, 0x62EC}, //960 #CJK UNIFIED IDEOGRAPH + {0x8A88, 0x6D3B}, //961 #CJK UNIFIED IDEOGRAPH + {0x8A89, 0x6E07}, //962 #CJK UNIFIED IDEOGRAPH + {0x8A8A, 0x6ED1}, //963 #CJK UNIFIED IDEOGRAPH + {0x8A8B, 0x845B}, //964 #CJK UNIFIED IDEOGRAPH + {0x8A8C, 0x8910}, //965 #CJK UNIFIED IDEOGRAPH + {0x8A8D, 0x8F44}, //966 #CJK UNIFIED IDEOGRAPH + {0x8A8E, 0x4E14}, //967 #CJK UNIFIED IDEOGRAPH + {0x8A8F, 0x9C39}, //968 #CJK UNIFIED IDEOGRAPH + {0x8A90, 0x53F6}, //969 #CJK UNIFIED IDEOGRAPH + {0x8A91, 0x691B}, //970 #CJK UNIFIED IDEOGRAPH + {0x8A92, 0x6A3A}, //971 #CJK UNIFIED IDEOGRAPH + {0x8A93, 0x9784}, //972 #CJK UNIFIED IDEOGRAPH + {0x8A94, 0x682A}, //973 #CJK UNIFIED IDEOGRAPH + {0x8A95, 0x515C}, //974 #CJK UNIFIED IDEOGRAPH + {0x8A96, 0x7AC3}, //975 #CJK UNIFIED IDEOGRAPH + {0x8A97, 0x84B2}, //976 #CJK UNIFIED IDEOGRAPH + {0x8A98, 0x91DC}, //977 #CJK UNIFIED IDEOGRAPH + {0x8A99, 0x938C}, //978 #CJK UNIFIED IDEOGRAPH + {0x8A9A, 0x565B}, //979 #CJK UNIFIED IDEOGRAPH + {0x8A9B, 0x9D28}, //980 #CJK UNIFIED IDEOGRAPH + {0x8A9C, 0x6822}, //981 #CJK UNIFIED IDEOGRAPH + {0x8A9D, 0x8305}, //982 #CJK UNIFIED IDEOGRAPH + {0x8A9E, 0x8431}, //983 #CJK UNIFIED IDEOGRAPH + {0x8A9F, 0x7CA5}, //984 #CJK UNIFIED IDEOGRAPH + {0x8AA0, 0x5208}, //985 #CJK UNIFIED IDEOGRAPH + {0x8AA1, 0x82C5}, //986 #CJK UNIFIED IDEOGRAPH + {0x8AA2, 0x74E6}, //987 #CJK UNIFIED IDEOGRAPH + {0x8AA3, 0x4E7E}, //988 #CJK UNIFIED IDEOGRAPH + {0x8AA4, 0x4F83}, //989 #CJK UNIFIED IDEOGRAPH + {0x8AA5, 0x51A0}, //990 #CJK UNIFIED IDEOGRAPH + {0x8AA6, 0x5BD2}, //991 #CJK UNIFIED IDEOGRAPH + {0x8AA7, 0x520A}, //992 #CJK UNIFIED IDEOGRAPH + {0x8AA8, 0x52D8}, //993 #CJK UNIFIED IDEOGRAPH + {0x8AA9, 0x52E7}, //994 #CJK UNIFIED IDEOGRAPH + {0x8AAA, 0x5DFB}, //995 #CJK UNIFIED IDEOGRAPH + {0x8AAB, 0x559A}, //996 #CJK UNIFIED IDEOGRAPH + {0x8AAC, 0x582A}, //997 #CJK UNIFIED IDEOGRAPH + {0x8AAD, 0x59E6}, //998 #CJK UNIFIED IDEOGRAPH + {0x8AAE, 0x5B8C}, //999 #CJK UNIFIED IDEOGRAPH + {0x8AAF, 0x5B98}, //1000 #CJK UNIFIED IDEOGRAPH + {0x8AB0, 0x5BDB}, //1001 #CJK UNIFIED IDEOGRAPH + {0x8AB1, 0x5E72}, //1002 #CJK UNIFIED IDEOGRAPH + {0x8AB2, 0x5E79}, //1003 #CJK UNIFIED IDEOGRAPH + {0x8AB3, 0x60A3}, //1004 #CJK UNIFIED IDEOGRAPH + {0x8AB4, 0x611F}, //1005 #CJK UNIFIED IDEOGRAPH + {0x8AB5, 0x6163}, //1006 #CJK UNIFIED IDEOGRAPH + {0x8AB6, 0x61BE}, //1007 #CJK UNIFIED IDEOGRAPH + {0x8AB7, 0x63DB}, //1008 #CJK UNIFIED IDEOGRAPH + {0x8AB8, 0x6562}, //1009 #CJK UNIFIED IDEOGRAPH + {0x8AB9, 0x67D1}, //1010 #CJK UNIFIED IDEOGRAPH + {0x8ABA, 0x6853}, //1011 #CJK UNIFIED IDEOGRAPH + {0x8ABB, 0x68FA}, //1012 #CJK UNIFIED IDEOGRAPH + {0x8ABC, 0x6B3E}, //1013 #CJK UNIFIED IDEOGRAPH + {0x8ABD, 0x6B53}, //1014 #CJK UNIFIED IDEOGRAPH + {0x8ABE, 0x6C57}, //1015 #CJK UNIFIED IDEOGRAPH + {0x8ABF, 0x6F22}, //1016 #CJK UNIFIED IDEOGRAPH + {0x8AC0, 0x6F97}, //1017 #CJK UNIFIED IDEOGRAPH + {0x8AC1, 0x6F45}, //1018 #CJK UNIFIED IDEOGRAPH + {0x8AC2, 0x74B0}, //1019 #CJK UNIFIED IDEOGRAPH + {0x8AC3, 0x7518}, //1020 #CJK UNIFIED IDEOGRAPH + {0x8AC4, 0x76E3}, //1021 #CJK UNIFIED IDEOGRAPH + {0x8AC5, 0x770B}, //1022 #CJK UNIFIED IDEOGRAPH + {0x8AC6, 0x7AFF}, //1023 #CJK UNIFIED IDEOGRAPH + {0x8AC7, 0x7BA1}, //1024 #CJK UNIFIED IDEOGRAPH + {0x8AC8, 0x7C21}, //1025 #CJK UNIFIED IDEOGRAPH + {0x8AC9, 0x7DE9}, //1026 #CJK UNIFIED IDEOGRAPH + {0x8ACA, 0x7F36}, //1027 #CJK UNIFIED IDEOGRAPH + {0x8ACB, 0x7FF0}, //1028 #CJK UNIFIED IDEOGRAPH + {0x8ACC, 0x809D}, //1029 #CJK UNIFIED IDEOGRAPH + {0x8ACD, 0x8266}, //1030 #CJK UNIFIED IDEOGRAPH + {0x8ACE, 0x839E}, //1031 #CJK UNIFIED IDEOGRAPH + {0x8ACF, 0x89B3}, //1032 #CJK UNIFIED IDEOGRAPH + {0x8AD0, 0x8ACC}, //1033 #CJK UNIFIED IDEOGRAPH + {0x8AD1, 0x8CAB}, //1034 #CJK UNIFIED IDEOGRAPH + {0x8AD2, 0x9084}, //1035 #CJK UNIFIED IDEOGRAPH + {0x8AD3, 0x9451}, //1036 #CJK UNIFIED IDEOGRAPH + {0x8AD4, 0x9593}, //1037 #CJK UNIFIED IDEOGRAPH + {0x8AD5, 0x9591}, //1038 #CJK UNIFIED IDEOGRAPH + {0x8AD6, 0x95A2}, //1039 #CJK UNIFIED IDEOGRAPH + {0x8AD7, 0x9665}, //1040 #CJK UNIFIED IDEOGRAPH + {0x8AD8, 0x97D3}, //1041 #CJK UNIFIED IDEOGRAPH + {0x8AD9, 0x9928}, //1042 #CJK UNIFIED IDEOGRAPH + {0x8ADA, 0x8218}, //1043 #CJK UNIFIED IDEOGRAPH + {0x8ADB, 0x4E38}, //1044 #CJK UNIFIED IDEOGRAPH + {0x8ADC, 0x542B}, //1045 #CJK UNIFIED IDEOGRAPH + {0x8ADD, 0x5CB8}, //1046 #CJK UNIFIED IDEOGRAPH + {0x8ADE, 0x5DCC}, //1047 #CJK UNIFIED IDEOGRAPH + {0x8ADF, 0x73A9}, //1048 #CJK UNIFIED IDEOGRAPH + {0x8AE0, 0x764C}, //1049 #CJK UNIFIED IDEOGRAPH + {0x8AE1, 0x773C}, //1050 #CJK UNIFIED IDEOGRAPH + {0x8AE2, 0x5CA9}, //1051 #CJK UNIFIED IDEOGRAPH + {0x8AE3, 0x7FEB}, //1052 #CJK UNIFIED IDEOGRAPH + {0x8AE4, 0x8D0B}, //1053 #CJK UNIFIED IDEOGRAPH + {0x8AE5, 0x96C1}, //1054 #CJK UNIFIED IDEOGRAPH + {0x8AE6, 0x9811}, //1055 #CJK UNIFIED IDEOGRAPH + {0x8AE7, 0x9854}, //1056 #CJK UNIFIED IDEOGRAPH + {0x8AE8, 0x9858}, //1057 #CJK UNIFIED IDEOGRAPH + {0x8AE9, 0x4F01}, //1058 #CJK UNIFIED IDEOGRAPH + {0x8AEA, 0x4F0E}, //1059 #CJK UNIFIED IDEOGRAPH + {0x8AEB, 0x5371}, //1060 #CJK UNIFIED IDEOGRAPH + {0x8AEC, 0x559C}, //1061 #CJK UNIFIED IDEOGRAPH + {0x8AED, 0x5668}, //1062 #CJK UNIFIED IDEOGRAPH + {0x8AEE, 0x57FA}, //1063 #CJK UNIFIED IDEOGRAPH + {0x8AEF, 0x5947}, //1064 #CJK UNIFIED IDEOGRAPH + {0x8AF0, 0x5B09}, //1065 #CJK UNIFIED IDEOGRAPH + {0x8AF1, 0x5BC4}, //1066 #CJK UNIFIED IDEOGRAPH + {0x8AF2, 0x5C90}, //1067 #CJK UNIFIED IDEOGRAPH + {0x8AF3, 0x5E0C}, //1068 #CJK UNIFIED IDEOGRAPH + {0x8AF4, 0x5E7E}, //1069 #CJK UNIFIED IDEOGRAPH + {0x8AF5, 0x5FCC}, //1070 #CJK UNIFIED IDEOGRAPH + {0x8AF6, 0x63EE}, //1071 #CJK UNIFIED IDEOGRAPH + {0x8AF7, 0x673A}, //1072 #CJK UNIFIED IDEOGRAPH + {0x8AF8, 0x65D7}, //1073 #CJK UNIFIED IDEOGRAPH + {0x8AF9, 0x65E2}, //1074 #CJK UNIFIED IDEOGRAPH + {0x8AFA, 0x671F}, //1075 #CJK UNIFIED IDEOGRAPH + {0x8AFB, 0x68CB}, //1076 #CJK UNIFIED IDEOGRAPH + {0x8AFC, 0x68C4}, //1077 #CJK UNIFIED IDEOGRAPH + {0x8B40, 0x6A5F}, //1078 #CJK UNIFIED IDEOGRAPH + {0x8B41, 0x5E30}, //1079 #CJK UNIFIED IDEOGRAPH + {0x8B42, 0x6BC5}, //1080 #CJK UNIFIED IDEOGRAPH + {0x8B43, 0x6C17}, //1081 #CJK UNIFIED IDEOGRAPH + {0x8B44, 0x6C7D}, //1082 #CJK UNIFIED IDEOGRAPH + {0x8B45, 0x757F}, //1083 #CJK UNIFIED IDEOGRAPH + {0x8B46, 0x7948}, //1084 #CJK UNIFIED IDEOGRAPH + {0x8B47, 0x5B63}, //1085 #CJK UNIFIED IDEOGRAPH + {0x8B48, 0x7A00}, //1086 #CJK UNIFIED IDEOGRAPH + {0x8B49, 0x7D00}, //1087 #CJK UNIFIED IDEOGRAPH + {0x8B4A, 0x5FBD}, //1088 #CJK UNIFIED IDEOGRAPH + {0x8B4B, 0x898F}, //1089 #CJK UNIFIED IDEOGRAPH + {0x8B4C, 0x8A18}, //1090 #CJK UNIFIED IDEOGRAPH + {0x8B4D, 0x8CB4}, //1091 #CJK UNIFIED IDEOGRAPH + {0x8B4E, 0x8D77}, //1092 #CJK UNIFIED IDEOGRAPH + {0x8B4F, 0x8ECC}, //1093 #CJK UNIFIED IDEOGRAPH + {0x8B50, 0x8F1D}, //1094 #CJK UNIFIED IDEOGRAPH + {0x8B51, 0x98E2}, //1095 #CJK UNIFIED IDEOGRAPH + {0x8B52, 0x9A0E}, //1096 #CJK UNIFIED IDEOGRAPH + {0x8B53, 0x9B3C}, //1097 #CJK UNIFIED IDEOGRAPH + {0x8B54, 0x4E80}, //1098 #CJK UNIFIED IDEOGRAPH + {0x8B55, 0x507D}, //1099 #CJK UNIFIED IDEOGRAPH + {0x8B56, 0x5100}, //1100 #CJK UNIFIED IDEOGRAPH + {0x8B57, 0x5993}, //1101 #CJK UNIFIED IDEOGRAPH + {0x8B58, 0x5B9C}, //1102 #CJK UNIFIED IDEOGRAPH + {0x8B59, 0x622F}, //1103 #CJK UNIFIED IDEOGRAPH + {0x8B5A, 0x6280}, //1104 #CJK UNIFIED IDEOGRAPH + {0x8B5B, 0x64EC}, //1105 #CJK UNIFIED IDEOGRAPH + {0x8B5C, 0x6B3A}, //1106 #CJK UNIFIED IDEOGRAPH + {0x8B5D, 0x72A0}, //1107 #CJK UNIFIED IDEOGRAPH + {0x8B5E, 0x7591}, //1108 #CJK UNIFIED IDEOGRAPH + {0x8B5F, 0x7947}, //1109 #CJK UNIFIED IDEOGRAPH + {0x8B60, 0x7FA9}, //1110 #CJK UNIFIED IDEOGRAPH + {0x8B61, 0x87FB}, //1111 #CJK UNIFIED IDEOGRAPH + {0x8B62, 0x8ABC}, //1112 #CJK UNIFIED IDEOGRAPH + {0x8B63, 0x8B70}, //1113 #CJK UNIFIED IDEOGRAPH + {0x8B64, 0x63AC}, //1114 #CJK UNIFIED IDEOGRAPH + {0x8B65, 0x83CA}, //1115 #CJK UNIFIED IDEOGRAPH + {0x8B66, 0x97A0}, //1116 #CJK UNIFIED IDEOGRAPH + {0x8B67, 0x5409}, //1117 #CJK UNIFIED IDEOGRAPH + {0x8B68, 0x5403}, //1118 #CJK UNIFIED IDEOGRAPH + {0x8B69, 0x55AB}, //1119 #CJK UNIFIED IDEOGRAPH + {0x8B6A, 0x6854}, //1120 #CJK UNIFIED IDEOGRAPH + {0x8B6B, 0x6A58}, //1121 #CJK UNIFIED IDEOGRAPH + {0x8B6C, 0x8A70}, //1122 #CJK UNIFIED IDEOGRAPH + {0x8B6D, 0x7827}, //1123 #CJK UNIFIED IDEOGRAPH + {0x8B6E, 0x6775}, //1124 #CJK UNIFIED IDEOGRAPH + {0x8B6F, 0x9ECD}, //1125 #CJK UNIFIED IDEOGRAPH + {0x8B70, 0x5374}, //1126 #CJK UNIFIED IDEOGRAPH + {0x8B71, 0x5BA2}, //1127 #CJK UNIFIED IDEOGRAPH + {0x8B72, 0x811A}, //1128 #CJK UNIFIED IDEOGRAPH + {0x8B73, 0x8650}, //1129 #CJK UNIFIED IDEOGRAPH + {0x8B74, 0x9006}, //1130 #CJK UNIFIED IDEOGRAPH + {0x8B75, 0x4E18}, //1131 #CJK UNIFIED IDEOGRAPH + {0x8B76, 0x4E45}, //1132 #CJK UNIFIED IDEOGRAPH + {0x8B77, 0x4EC7}, //1133 #CJK UNIFIED IDEOGRAPH + {0x8B78, 0x4F11}, //1134 #CJK UNIFIED IDEOGRAPH + {0x8B79, 0x53CA}, //1135 #CJK UNIFIED IDEOGRAPH + {0x8B7A, 0x5438}, //1136 #CJK UNIFIED IDEOGRAPH + {0x8B7B, 0x5BAE}, //1137 #CJK UNIFIED IDEOGRAPH + {0x8B7C, 0x5F13}, //1138 #CJK UNIFIED IDEOGRAPH + {0x8B7D, 0x6025}, //1139 #CJK UNIFIED IDEOGRAPH + {0x8B7E, 0x6551}, //1140 #CJK UNIFIED IDEOGRAPH + {0x8B80, 0x673D}, //1141 #CJK UNIFIED IDEOGRAPH + {0x8B81, 0x6C42}, //1142 #CJK UNIFIED IDEOGRAPH + {0x8B82, 0x6C72}, //1143 #CJK UNIFIED IDEOGRAPH + {0x8B83, 0x6CE3}, //1144 #CJK UNIFIED IDEOGRAPH + {0x8B84, 0x7078}, //1145 #CJK UNIFIED IDEOGRAPH + {0x8B85, 0x7403}, //1146 #CJK UNIFIED IDEOGRAPH + {0x8B86, 0x7A76}, //1147 #CJK UNIFIED IDEOGRAPH + {0x8B87, 0x7AAE}, //1148 #CJK UNIFIED IDEOGRAPH + {0x8B88, 0x7B08}, //1149 #CJK UNIFIED IDEOGRAPH + {0x8B89, 0x7D1A}, //1150 #CJK UNIFIED IDEOGRAPH + {0x8B8A, 0x7CFE}, //1151 #CJK UNIFIED IDEOGRAPH + {0x8B8B, 0x7D66}, //1152 #CJK UNIFIED IDEOGRAPH + {0x8B8C, 0x65E7}, //1153 #CJK UNIFIED IDEOGRAPH + {0x8B8D, 0x725B}, //1154 #CJK UNIFIED IDEOGRAPH + {0x8B8E, 0x53BB}, //1155 #CJK UNIFIED IDEOGRAPH + {0x8B8F, 0x5C45}, //1156 #CJK UNIFIED IDEOGRAPH + {0x8B90, 0x5DE8}, //1157 #CJK UNIFIED IDEOGRAPH + {0x8B91, 0x62D2}, //1158 #CJK UNIFIED IDEOGRAPH + {0x8B92, 0x62E0}, //1159 #CJK UNIFIED IDEOGRAPH + {0x8B93, 0x6319}, //1160 #CJK UNIFIED IDEOGRAPH + {0x8B94, 0x6E20}, //1161 #CJK UNIFIED IDEOGRAPH + {0x8B95, 0x865A}, //1162 #CJK UNIFIED IDEOGRAPH + {0x8B96, 0x8A31}, //1163 #CJK UNIFIED IDEOGRAPH + {0x8B97, 0x8DDD}, //1164 #CJK UNIFIED IDEOGRAPH + {0x8B98, 0x92F8}, //1165 #CJK UNIFIED IDEOGRAPH + {0x8B99, 0x6F01}, //1166 #CJK UNIFIED IDEOGRAPH + {0x8B9A, 0x79A6}, //1167 #CJK UNIFIED IDEOGRAPH + {0x8B9B, 0x9B5A}, //1168 #CJK UNIFIED IDEOGRAPH + {0x8B9C, 0x4EA8}, //1169 #CJK UNIFIED IDEOGRAPH + {0x8B9D, 0x4EAB}, //1170 #CJK UNIFIED IDEOGRAPH + {0x8B9E, 0x4EAC}, //1171 #CJK UNIFIED IDEOGRAPH + {0x8B9F, 0x4F9B}, //1172 #CJK UNIFIED IDEOGRAPH + {0x8BA0, 0x4FA0}, //1173 #CJK UNIFIED IDEOGRAPH + {0x8BA1, 0x50D1}, //1174 #CJK UNIFIED IDEOGRAPH + {0x8BA2, 0x5147}, //1175 #CJK UNIFIED IDEOGRAPH + {0x8BA3, 0x7AF6}, //1176 #CJK UNIFIED IDEOGRAPH + {0x8BA4, 0x5171}, //1177 #CJK UNIFIED IDEOGRAPH + {0x8BA5, 0x51F6}, //1178 #CJK UNIFIED IDEOGRAPH + {0x8BA6, 0x5354}, //1179 #CJK UNIFIED IDEOGRAPH + {0x8BA7, 0x5321}, //1180 #CJK UNIFIED IDEOGRAPH + {0x8BA8, 0x537F}, //1181 #CJK UNIFIED IDEOGRAPH + {0x8BA9, 0x53EB}, //1182 #CJK UNIFIED IDEOGRAPH + {0x8BAA, 0x55AC}, //1183 #CJK UNIFIED IDEOGRAPH + {0x8BAB, 0x5883}, //1184 #CJK UNIFIED IDEOGRAPH + {0x8BAC, 0x5CE1}, //1185 #CJK UNIFIED IDEOGRAPH + {0x8BAD, 0x5F37}, //1186 #CJK UNIFIED IDEOGRAPH + {0x8BAE, 0x5F4A}, //1187 #CJK UNIFIED IDEOGRAPH + {0x8BAF, 0x602F}, //1188 #CJK UNIFIED IDEOGRAPH + {0x8BB0, 0x6050}, //1189 #CJK UNIFIED IDEOGRAPH + {0x8BB1, 0x606D}, //1190 #CJK UNIFIED IDEOGRAPH + {0x8BB2, 0x631F}, //1191 #CJK UNIFIED IDEOGRAPH + {0x8BB3, 0x6559}, //1192 #CJK UNIFIED IDEOGRAPH + {0x8BB4, 0x6A4B}, //1193 #CJK UNIFIED IDEOGRAPH + {0x8BB5, 0x6CC1}, //1194 #CJK UNIFIED IDEOGRAPH + {0x8BB6, 0x72C2}, //1195 #CJK UNIFIED IDEOGRAPH + {0x8BB7, 0x72ED}, //1196 #CJK UNIFIED IDEOGRAPH + {0x8BB8, 0x77EF}, //1197 #CJK UNIFIED IDEOGRAPH + {0x8BB9, 0x80F8}, //1198 #CJK UNIFIED IDEOGRAPH + {0x8BBA, 0x8105}, //1199 #CJK UNIFIED IDEOGRAPH + {0x8BBB, 0x8208}, //1200 #CJK UNIFIED IDEOGRAPH + {0x8BBC, 0x854E}, //1201 #CJK UNIFIED IDEOGRAPH + {0x8BBD, 0x90F7}, //1202 #CJK UNIFIED IDEOGRAPH + {0x8BBE, 0x93E1}, //1203 #CJK UNIFIED IDEOGRAPH + {0x8BBF, 0x97FF}, //1204 #CJK UNIFIED IDEOGRAPH + {0x8BC0, 0x9957}, //1205 #CJK UNIFIED IDEOGRAPH + {0x8BC1, 0x9A5A}, //1206 #CJK UNIFIED IDEOGRAPH + {0x8BC2, 0x4EF0}, //1207 #CJK UNIFIED IDEOGRAPH + {0x8BC3, 0x51DD}, //1208 #CJK UNIFIED IDEOGRAPH + {0x8BC4, 0x5C2D}, //1209 #CJK UNIFIED IDEOGRAPH + {0x8BC5, 0x6681}, //1210 #CJK UNIFIED IDEOGRAPH + {0x8BC6, 0x696D}, //1211 #CJK UNIFIED IDEOGRAPH + {0x8BC7, 0x5C40}, //1212 #CJK UNIFIED IDEOGRAPH + {0x8BC8, 0x66F2}, //1213 #CJK UNIFIED IDEOGRAPH + {0x8BC9, 0x6975}, //1214 #CJK UNIFIED IDEOGRAPH + {0x8BCA, 0x7389}, //1215 #CJK UNIFIED IDEOGRAPH + {0x8BCB, 0x6850}, //1216 #CJK UNIFIED IDEOGRAPH + {0x8BCC, 0x7C81}, //1217 #CJK UNIFIED IDEOGRAPH + {0x8BCD, 0x50C5}, //1218 #CJK UNIFIED IDEOGRAPH + {0x8BCE, 0x52E4}, //1219 #CJK UNIFIED IDEOGRAPH + {0x8BCF, 0x5747}, //1220 #CJK UNIFIED IDEOGRAPH + {0x8BD0, 0x5DFE}, //1221 #CJK UNIFIED IDEOGRAPH + {0x8BD1, 0x9326}, //1222 #CJK UNIFIED IDEOGRAPH + {0x8BD2, 0x65A4}, //1223 #CJK UNIFIED IDEOGRAPH + {0x8BD3, 0x6B23}, //1224 #CJK UNIFIED IDEOGRAPH + {0x8BD4, 0x6B3D}, //1225 #CJK UNIFIED IDEOGRAPH + {0x8BD5, 0x7434}, //1226 #CJK UNIFIED IDEOGRAPH + {0x8BD6, 0x7981}, //1227 #CJK UNIFIED IDEOGRAPH + {0x8BD7, 0x79BD}, //1228 #CJK UNIFIED IDEOGRAPH + {0x8BD8, 0x7B4B}, //1229 #CJK UNIFIED IDEOGRAPH + {0x8BD9, 0x7DCA}, //1230 #CJK UNIFIED IDEOGRAPH + {0x8BDA, 0x82B9}, //1231 #CJK UNIFIED IDEOGRAPH + {0x8BDB, 0x83CC}, //1232 #CJK UNIFIED IDEOGRAPH + {0x8BDC, 0x887F}, //1233 #CJK UNIFIED IDEOGRAPH + {0x8BDD, 0x895F}, //1234 #CJK UNIFIED IDEOGRAPH + {0x8BDE, 0x8B39}, //1235 #CJK UNIFIED IDEOGRAPH + {0x8BDF, 0x8FD1}, //1236 #CJK UNIFIED IDEOGRAPH + {0x8BE0, 0x91D1}, //1237 #CJK UNIFIED IDEOGRAPH + {0x8BE1, 0x541F}, //1238 #CJK UNIFIED IDEOGRAPH + {0x8BE2, 0x9280}, //1239 #CJK UNIFIED IDEOGRAPH + {0x8BE3, 0x4E5D}, //1240 #CJK UNIFIED IDEOGRAPH + {0x8BE4, 0x5036}, //1241 #CJK UNIFIED IDEOGRAPH + {0x8BE5, 0x53E5}, //1242 #CJK UNIFIED IDEOGRAPH + {0x8BE6, 0x533A}, //1243 #CJK UNIFIED IDEOGRAPH + {0x8BE7, 0x72D7}, //1244 #CJK UNIFIED IDEOGRAPH + {0x8BE8, 0x7396}, //1245 #CJK UNIFIED IDEOGRAPH + {0x8BE9, 0x77E9}, //1246 #CJK UNIFIED IDEOGRAPH + {0x8BEA, 0x82E6}, //1247 #CJK UNIFIED IDEOGRAPH + {0x8BEB, 0x8EAF}, //1248 #CJK UNIFIED IDEOGRAPH + {0x8BEC, 0x99C6}, //1249 #CJK UNIFIED IDEOGRAPH + {0x8BED, 0x99C8}, //1250 #CJK UNIFIED IDEOGRAPH + {0x8BEE, 0x99D2}, //1251 #CJK UNIFIED IDEOGRAPH + {0x8BEF, 0x5177}, //1252 #CJK UNIFIED IDEOGRAPH + {0x8BF0, 0x611A}, //1253 #CJK UNIFIED IDEOGRAPH + {0x8BF1, 0x865E}, //1254 #CJK UNIFIED IDEOGRAPH + {0x8BF2, 0x55B0}, //1255 #CJK UNIFIED IDEOGRAPH + {0x8BF3, 0x7A7A}, //1256 #CJK UNIFIED IDEOGRAPH + {0x8BF4, 0x5076}, //1257 #CJK UNIFIED IDEOGRAPH + {0x8BF5, 0x5BD3}, //1258 #CJK UNIFIED IDEOGRAPH + {0x8BF6, 0x9047}, //1259 #CJK UNIFIED IDEOGRAPH + {0x8BF7, 0x9685}, //1260 #CJK UNIFIED IDEOGRAPH + {0x8BF8, 0x4E32}, //1261 #CJK UNIFIED IDEOGRAPH + {0x8BF9, 0x6ADB}, //1262 #CJK UNIFIED IDEOGRAPH + {0x8BFA, 0x91E7}, //1263 #CJK UNIFIED IDEOGRAPH + {0x8BFB, 0x5C51}, //1264 #CJK UNIFIED IDEOGRAPH + {0x8BFC, 0x5C48}, //1265 #CJK UNIFIED IDEOGRAPH + {0x8C40, 0x6398}, //1266 #CJK UNIFIED IDEOGRAPH + {0x8C41, 0x7A9F}, //1267 #CJK UNIFIED IDEOGRAPH + {0x8C42, 0x6C93}, //1268 #CJK UNIFIED IDEOGRAPH + {0x8C43, 0x9774}, //1269 #CJK UNIFIED IDEOGRAPH + {0x8C44, 0x8F61}, //1270 #CJK UNIFIED IDEOGRAPH + {0x8C45, 0x7AAA}, //1271 #CJK UNIFIED IDEOGRAPH + {0x8C46, 0x718A}, //1272 #CJK UNIFIED IDEOGRAPH + {0x8C47, 0x9688}, //1273 #CJK UNIFIED IDEOGRAPH + {0x8C48, 0x7C82}, //1274 #CJK UNIFIED IDEOGRAPH + {0x8C49, 0x6817}, //1275 #CJK UNIFIED IDEOGRAPH + {0x8C4A, 0x7E70}, //1276 #CJK UNIFIED IDEOGRAPH + {0x8C4B, 0x6851}, //1277 #CJK UNIFIED IDEOGRAPH + {0x8C4C, 0x936C}, //1278 #CJK UNIFIED IDEOGRAPH + {0x8C4D, 0x52F2}, //1279 #CJK UNIFIED IDEOGRAPH + {0x8C4E, 0x541B}, //1280 #CJK UNIFIED IDEOGRAPH + {0x8C4F, 0x85AB}, //1281 #CJK UNIFIED IDEOGRAPH + {0x8C50, 0x8A13}, //1282 #CJK UNIFIED IDEOGRAPH + {0x8C51, 0x7FA4}, //1283 #CJK UNIFIED IDEOGRAPH + {0x8C52, 0x8ECD}, //1284 #CJK UNIFIED IDEOGRAPH + {0x8C53, 0x90E1}, //1285 #CJK UNIFIED IDEOGRAPH + {0x8C54, 0x5366}, //1286 #CJK UNIFIED IDEOGRAPH + {0x8C55, 0x8888}, //1287 #CJK UNIFIED IDEOGRAPH + {0x8C56, 0x7941}, //1288 #CJK UNIFIED IDEOGRAPH + {0x8C57, 0x4FC2}, //1289 #CJK UNIFIED IDEOGRAPH + {0x8C58, 0x50BE}, //1290 #CJK UNIFIED IDEOGRAPH + {0x8C59, 0x5211}, //1291 #CJK UNIFIED IDEOGRAPH + {0x8C5A, 0x5144}, //1292 #CJK UNIFIED IDEOGRAPH + {0x8C5B, 0x5553}, //1293 #CJK UNIFIED IDEOGRAPH + {0x8C5C, 0x572D}, //1294 #CJK UNIFIED IDEOGRAPH + {0x8C5D, 0x73EA}, //1295 #CJK UNIFIED IDEOGRAPH + {0x8C5E, 0x578B}, //1296 #CJK UNIFIED IDEOGRAPH + {0x8C5F, 0x5951}, //1297 #CJK UNIFIED IDEOGRAPH + {0x8C60, 0x5F62}, //1298 #CJK UNIFIED IDEOGRAPH + {0x8C61, 0x5F84}, //1299 #CJK UNIFIED IDEOGRAPH + {0x8C62, 0x6075}, //1300 #CJK UNIFIED IDEOGRAPH + {0x8C63, 0x6176}, //1301 #CJK UNIFIED IDEOGRAPH + {0x8C64, 0x6167}, //1302 #CJK UNIFIED IDEOGRAPH + {0x8C65, 0x61A9}, //1303 #CJK UNIFIED IDEOGRAPH + {0x8C66, 0x63B2}, //1304 #CJK UNIFIED IDEOGRAPH + {0x8C67, 0x643A}, //1305 #CJK UNIFIED IDEOGRAPH + {0x8C68, 0x656C}, //1306 #CJK UNIFIED IDEOGRAPH + {0x8C69, 0x666F}, //1307 #CJK UNIFIED IDEOGRAPH + {0x8C6A, 0x6842}, //1308 #CJK UNIFIED IDEOGRAPH + {0x8C6B, 0x6E13}, //1309 #CJK UNIFIED IDEOGRAPH + {0x8C6C, 0x7566}, //1310 #CJK UNIFIED IDEOGRAPH + {0x8C6D, 0x7A3D}, //1311 #CJK UNIFIED IDEOGRAPH + {0x8C6E, 0x7CFB}, //1312 #CJK UNIFIED IDEOGRAPH + {0x8C6F, 0x7D4C}, //1313 #CJK UNIFIED IDEOGRAPH + {0x8C70, 0x7D99}, //1314 #CJK UNIFIED IDEOGRAPH + {0x8C71, 0x7E4B}, //1315 #CJK UNIFIED IDEOGRAPH + {0x8C72, 0x7F6B}, //1316 #CJK UNIFIED IDEOGRAPH + {0x8C73, 0x830E}, //1317 #CJK UNIFIED IDEOGRAPH + {0x8C74, 0x834A}, //1318 #CJK UNIFIED IDEOGRAPH + {0x8C75, 0x86CD}, //1319 #CJK UNIFIED IDEOGRAPH + {0x8C76, 0x8A08}, //1320 #CJK UNIFIED IDEOGRAPH + {0x8C77, 0x8A63}, //1321 #CJK UNIFIED IDEOGRAPH + {0x8C78, 0x8B66}, //1322 #CJK UNIFIED IDEOGRAPH + {0x8C79, 0x8EFD}, //1323 #CJK UNIFIED IDEOGRAPH + {0x8C7A, 0x981A}, //1324 #CJK UNIFIED IDEOGRAPH + {0x8C7B, 0x9D8F}, //1325 #CJK UNIFIED IDEOGRAPH + {0x8C7C, 0x82B8}, //1326 #CJK UNIFIED IDEOGRAPH + {0x8C7D, 0x8FCE}, //1327 #CJK UNIFIED IDEOGRAPH + {0x8C7E, 0x9BE8}, //1328 #CJK UNIFIED IDEOGRAPH + {0x8C80, 0x5287}, //1329 #CJK UNIFIED IDEOGRAPH + {0x8C81, 0x621F}, //1330 #CJK UNIFIED IDEOGRAPH + {0x8C82, 0x6483}, //1331 #CJK UNIFIED IDEOGRAPH + {0x8C83, 0x6FC0}, //1332 #CJK UNIFIED IDEOGRAPH + {0x8C84, 0x9699}, //1333 #CJK UNIFIED IDEOGRAPH + {0x8C85, 0x6841}, //1334 #CJK UNIFIED IDEOGRAPH + {0x8C86, 0x5091}, //1335 #CJK UNIFIED IDEOGRAPH + {0x8C87, 0x6B20}, //1336 #CJK UNIFIED IDEOGRAPH + {0x8C88, 0x6C7A}, //1337 #CJK UNIFIED IDEOGRAPH + {0x8C89, 0x6F54}, //1338 #CJK UNIFIED IDEOGRAPH + {0x8C8A, 0x7A74}, //1339 #CJK UNIFIED IDEOGRAPH + {0x8C8B, 0x7D50}, //1340 #CJK UNIFIED IDEOGRAPH + {0x8C8C, 0x8840}, //1341 #CJK UNIFIED IDEOGRAPH + {0x8C8D, 0x8A23}, //1342 #CJK UNIFIED IDEOGRAPH + {0x8C8E, 0x6708}, //1343 #CJK UNIFIED IDEOGRAPH + {0x8C8F, 0x4EF6}, //1344 #CJK UNIFIED IDEOGRAPH + {0x8C90, 0x5039}, //1345 #CJK UNIFIED IDEOGRAPH + {0x8C91, 0x5026}, //1346 #CJK UNIFIED IDEOGRAPH + {0x8C92, 0x5065}, //1347 #CJK UNIFIED IDEOGRAPH + {0x8C93, 0x517C}, //1348 #CJK UNIFIED IDEOGRAPH + {0x8C94, 0x5238}, //1349 #CJK UNIFIED IDEOGRAPH + {0x8C95, 0x5263}, //1350 #CJK UNIFIED IDEOGRAPH + {0x8C96, 0x55A7}, //1351 #CJK UNIFIED IDEOGRAPH + {0x8C97, 0x570F}, //1352 #CJK UNIFIED IDEOGRAPH + {0x8C98, 0x5805}, //1353 #CJK UNIFIED IDEOGRAPH + {0x8C99, 0x5ACC}, //1354 #CJK UNIFIED IDEOGRAPH + {0x8C9A, 0x5EFA}, //1355 #CJK UNIFIED IDEOGRAPH + {0x8C9B, 0x61B2}, //1356 #CJK UNIFIED IDEOGRAPH + {0x8C9C, 0x61F8}, //1357 #CJK UNIFIED IDEOGRAPH + {0x8C9D, 0x62F3}, //1358 #CJK UNIFIED IDEOGRAPH + {0x8C9E, 0x6372}, //1359 #CJK UNIFIED IDEOGRAPH + {0x8C9F, 0x691C}, //1360 #CJK UNIFIED IDEOGRAPH + {0x8CA0, 0x6A29}, //1361 #CJK UNIFIED IDEOGRAPH + {0x8CA1, 0x727D}, //1362 #CJK UNIFIED IDEOGRAPH + {0x8CA2, 0x72AC}, //1363 #CJK UNIFIED IDEOGRAPH + {0x8CA3, 0x732E}, //1364 #CJK UNIFIED IDEOGRAPH + {0x8CA4, 0x7814}, //1365 #CJK UNIFIED IDEOGRAPH + {0x8CA5, 0x786F}, //1366 #CJK UNIFIED IDEOGRAPH + {0x8CA6, 0x7D79}, //1367 #CJK UNIFIED IDEOGRAPH + {0x8CA7, 0x770C}, //1368 #CJK UNIFIED IDEOGRAPH + {0x8CA8, 0x80A9}, //1369 #CJK UNIFIED IDEOGRAPH + {0x8CA9, 0x898B}, //1370 #CJK UNIFIED IDEOGRAPH + {0x8CAA, 0x8B19}, //1371 #CJK UNIFIED IDEOGRAPH + {0x8CAB, 0x8CE2}, //1372 #CJK UNIFIED IDEOGRAPH + {0x8CAC, 0x8ED2}, //1373 #CJK UNIFIED IDEOGRAPH + {0x8CAD, 0x9063}, //1374 #CJK UNIFIED IDEOGRAPH + {0x8CAE, 0x9375}, //1375 #CJK UNIFIED IDEOGRAPH + {0x8CAF, 0x967A}, //1376 #CJK UNIFIED IDEOGRAPH + {0x8CB0, 0x9855}, //1377 #CJK UNIFIED IDEOGRAPH + {0x8CB1, 0x9A13}, //1378 #CJK UNIFIED IDEOGRAPH + {0x8CB2, 0x9E78}, //1379 #CJK UNIFIED IDEOGRAPH + {0x8CB3, 0x5143}, //1380 #CJK UNIFIED IDEOGRAPH + {0x8CB4, 0x539F}, //1381 #CJK UNIFIED IDEOGRAPH + {0x8CB5, 0x53B3}, //1382 #CJK UNIFIED IDEOGRAPH + {0x8CB6, 0x5E7B}, //1383 #CJK UNIFIED IDEOGRAPH + {0x8CB7, 0x5F26}, //1384 #CJK UNIFIED IDEOGRAPH + {0x8CB8, 0x6E1B}, //1385 #CJK UNIFIED IDEOGRAPH + {0x8CB9, 0x6E90}, //1386 #CJK UNIFIED IDEOGRAPH + {0x8CBA, 0x7384}, //1387 #CJK UNIFIED IDEOGRAPH + {0x8CBB, 0x73FE}, //1388 #CJK UNIFIED IDEOGRAPH + {0x8CBC, 0x7D43}, //1389 #CJK UNIFIED IDEOGRAPH + {0x8CBD, 0x8237}, //1390 #CJK UNIFIED IDEOGRAPH + {0x8CBE, 0x8A00}, //1391 #CJK UNIFIED IDEOGRAPH + {0x8CBF, 0x8AFA}, //1392 #CJK UNIFIED IDEOGRAPH + {0x8CC0, 0x9650}, //1393 #CJK UNIFIED IDEOGRAPH + {0x8CC1, 0x4E4E}, //1394 #CJK UNIFIED IDEOGRAPH + {0x8CC2, 0x500B}, //1395 #CJK UNIFIED IDEOGRAPH + {0x8CC3, 0x53E4}, //1396 #CJK UNIFIED IDEOGRAPH + {0x8CC4, 0x547C}, //1397 #CJK UNIFIED IDEOGRAPH + {0x8CC5, 0x56FA}, //1398 #CJK UNIFIED IDEOGRAPH + {0x8CC6, 0x59D1}, //1399 #CJK UNIFIED IDEOGRAPH + {0x8CC7, 0x5B64}, //1400 #CJK UNIFIED IDEOGRAPH + {0x8CC8, 0x5DF1}, //1401 #CJK UNIFIED IDEOGRAPH + {0x8CC9, 0x5EAB}, //1402 #CJK UNIFIED IDEOGRAPH + {0x8CCA, 0x5F27}, //1403 #CJK UNIFIED IDEOGRAPH + {0x8CCB, 0x6238}, //1404 #CJK UNIFIED IDEOGRAPH + {0x8CCC, 0x6545}, //1405 #CJK UNIFIED IDEOGRAPH + {0x8CCD, 0x67AF}, //1406 #CJK UNIFIED IDEOGRAPH + {0x8CCE, 0x6E56}, //1407 #CJK UNIFIED IDEOGRAPH + {0x8CCF, 0x72D0}, //1408 #CJK UNIFIED IDEOGRAPH + {0x8CD0, 0x7CCA}, //1409 #CJK UNIFIED IDEOGRAPH + {0x8CD1, 0x88B4}, //1410 #CJK UNIFIED IDEOGRAPH + {0x8CD2, 0x80A1}, //1411 #CJK UNIFIED IDEOGRAPH + {0x8CD3, 0x80E1}, //1412 #CJK UNIFIED IDEOGRAPH + {0x8CD4, 0x83F0}, //1413 #CJK UNIFIED IDEOGRAPH + {0x8CD5, 0x864E}, //1414 #CJK UNIFIED IDEOGRAPH + {0x8CD6, 0x8A87}, //1415 #CJK UNIFIED IDEOGRAPH + {0x8CD7, 0x8DE8}, //1416 #CJK UNIFIED IDEOGRAPH + {0x8CD8, 0x9237}, //1417 #CJK UNIFIED IDEOGRAPH + {0x8CD9, 0x96C7}, //1418 #CJK UNIFIED IDEOGRAPH + {0x8CDA, 0x9867}, //1419 #CJK UNIFIED IDEOGRAPH + {0x8CDB, 0x9F13}, //1420 #CJK UNIFIED IDEOGRAPH + {0x8CDC, 0x4E94}, //1421 #CJK UNIFIED IDEOGRAPH + {0x8CDD, 0x4E92}, //1422 #CJK UNIFIED IDEOGRAPH + {0x8CDE, 0x4F0D}, //1423 #CJK UNIFIED IDEOGRAPH + {0x8CDF, 0x5348}, //1424 #CJK UNIFIED IDEOGRAPH + {0x8CE0, 0x5449}, //1425 #CJK UNIFIED IDEOGRAPH + {0x8CE1, 0x543E}, //1426 #CJK UNIFIED IDEOGRAPH + {0x8CE2, 0x5A2F}, //1427 #CJK UNIFIED IDEOGRAPH + {0x8CE3, 0x5F8C}, //1428 #CJK UNIFIED IDEOGRAPH + {0x8CE4, 0x5FA1}, //1429 #CJK UNIFIED IDEOGRAPH + {0x8CE5, 0x609F}, //1430 #CJK UNIFIED IDEOGRAPH + {0x8CE6, 0x68A7}, //1431 #CJK UNIFIED IDEOGRAPH + {0x8CE7, 0x6A8E}, //1432 #CJK UNIFIED IDEOGRAPH + {0x8CE8, 0x745A}, //1433 #CJK UNIFIED IDEOGRAPH + {0x8CE9, 0x7881}, //1434 #CJK UNIFIED IDEOGRAPH + {0x8CEA, 0x8A9E}, //1435 #CJK UNIFIED IDEOGRAPH + {0x8CEB, 0x8AA4}, //1436 #CJK UNIFIED IDEOGRAPH + {0x8CEC, 0x8B77}, //1437 #CJK UNIFIED IDEOGRAPH + {0x8CED, 0x9190}, //1438 #CJK UNIFIED IDEOGRAPH + {0x8CEE, 0x4E5E}, //1439 #CJK UNIFIED IDEOGRAPH + {0x8CEF, 0x9BC9}, //1440 #CJK UNIFIED IDEOGRAPH + {0x8CF0, 0x4EA4}, //1441 #CJK UNIFIED IDEOGRAPH + {0x8CF1, 0x4F7C}, //1442 #CJK UNIFIED IDEOGRAPH + {0x8CF2, 0x4FAF}, //1443 #CJK UNIFIED IDEOGRAPH + {0x8CF3, 0x5019}, //1444 #CJK UNIFIED IDEOGRAPH + {0x8CF4, 0x5016}, //1445 #CJK UNIFIED IDEOGRAPH + {0x8CF5, 0x5149}, //1446 #CJK UNIFIED IDEOGRAPH + {0x8CF6, 0x516C}, //1447 #CJK UNIFIED IDEOGRAPH + {0x8CF7, 0x529F}, //1448 #CJK UNIFIED IDEOGRAPH + {0x8CF8, 0x52B9}, //1449 #CJK UNIFIED IDEOGRAPH + {0x8CF9, 0x52FE}, //1450 #CJK UNIFIED IDEOGRAPH + {0x8CFA, 0x539A}, //1451 #CJK UNIFIED IDEOGRAPH + {0x8CFB, 0x53E3}, //1452 #CJK UNIFIED IDEOGRAPH + {0x8CFC, 0x5411}, //1453 #CJK UNIFIED IDEOGRAPH + {0x8D40, 0x540E}, //1454 #CJK UNIFIED IDEOGRAPH + {0x8D41, 0x5589}, //1455 #CJK UNIFIED IDEOGRAPH + {0x8D42, 0x5751}, //1456 #CJK UNIFIED IDEOGRAPH + {0x8D43, 0x57A2}, //1457 #CJK UNIFIED IDEOGRAPH + {0x8D44, 0x597D}, //1458 #CJK UNIFIED IDEOGRAPH + {0x8D45, 0x5B54}, //1459 #CJK UNIFIED IDEOGRAPH + {0x8D46, 0x5B5D}, //1460 #CJK UNIFIED IDEOGRAPH + {0x8D47, 0x5B8F}, //1461 #CJK UNIFIED IDEOGRAPH + {0x8D48, 0x5DE5}, //1462 #CJK UNIFIED IDEOGRAPH + {0x8D49, 0x5DE7}, //1463 #CJK UNIFIED IDEOGRAPH + {0x8D4A, 0x5DF7}, //1464 #CJK UNIFIED IDEOGRAPH + {0x8D4B, 0x5E78}, //1465 #CJK UNIFIED IDEOGRAPH + {0x8D4C, 0x5E83}, //1466 #CJK UNIFIED IDEOGRAPH + {0x8D4D, 0x5E9A}, //1467 #CJK UNIFIED IDEOGRAPH + {0x8D4E, 0x5EB7}, //1468 #CJK UNIFIED IDEOGRAPH + {0x8D4F, 0x5F18}, //1469 #CJK UNIFIED IDEOGRAPH + {0x8D50, 0x6052}, //1470 #CJK UNIFIED IDEOGRAPH + {0x8D51, 0x614C}, //1471 #CJK UNIFIED IDEOGRAPH + {0x8D52, 0x6297}, //1472 #CJK UNIFIED IDEOGRAPH + {0x8D53, 0x62D8}, //1473 #CJK UNIFIED IDEOGRAPH + {0x8D54, 0x63A7}, //1474 #CJK UNIFIED IDEOGRAPH + {0x8D55, 0x653B}, //1475 #CJK UNIFIED IDEOGRAPH + {0x8D56, 0x6602}, //1476 #CJK UNIFIED IDEOGRAPH + {0x8D57, 0x6643}, //1477 #CJK UNIFIED IDEOGRAPH + {0x8D58, 0x66F4}, //1478 #CJK UNIFIED IDEOGRAPH + {0x8D59, 0x676D}, //1479 #CJK UNIFIED IDEOGRAPH + {0x8D5A, 0x6821}, //1480 #CJK UNIFIED IDEOGRAPH + {0x8D5B, 0x6897}, //1481 #CJK UNIFIED IDEOGRAPH + {0x8D5C, 0x69CB}, //1482 #CJK UNIFIED IDEOGRAPH + {0x8D5D, 0x6C5F}, //1483 #CJK UNIFIED IDEOGRAPH + {0x8D5E, 0x6D2A}, //1484 #CJK UNIFIED IDEOGRAPH + {0x8D5F, 0x6D69}, //1485 #CJK UNIFIED IDEOGRAPH + {0x8D60, 0x6E2F}, //1486 #CJK UNIFIED IDEOGRAPH + {0x8D61, 0x6E9D}, //1487 #CJK UNIFIED IDEOGRAPH + {0x8D62, 0x7532}, //1488 #CJK UNIFIED IDEOGRAPH + {0x8D63, 0x7687}, //1489 #CJK UNIFIED IDEOGRAPH + {0x8D64, 0x786C}, //1490 #CJK UNIFIED IDEOGRAPH + {0x8D65, 0x7A3F}, //1491 #CJK UNIFIED IDEOGRAPH + {0x8D66, 0x7CE0}, //1492 #CJK UNIFIED IDEOGRAPH + {0x8D67, 0x7D05}, //1493 #CJK UNIFIED IDEOGRAPH + {0x8D68, 0x7D18}, //1494 #CJK UNIFIED IDEOGRAPH + {0x8D69, 0x7D5E}, //1495 #CJK UNIFIED IDEOGRAPH + {0x8D6A, 0x7DB1}, //1496 #CJK UNIFIED IDEOGRAPH + {0x8D6B, 0x8015}, //1497 #CJK UNIFIED IDEOGRAPH + {0x8D6C, 0x8003}, //1498 #CJK UNIFIED IDEOGRAPH + {0x8D6D, 0x80AF}, //1499 #CJK UNIFIED IDEOGRAPH + {0x8D6E, 0x80B1}, //1500 #CJK UNIFIED IDEOGRAPH + {0x8D6F, 0x8154}, //1501 #CJK UNIFIED IDEOGRAPH + {0x8D70, 0x818F}, //1502 #CJK UNIFIED IDEOGRAPH + {0x8D71, 0x822A}, //1503 #CJK UNIFIED IDEOGRAPH + {0x8D72, 0x8352}, //1504 #CJK UNIFIED IDEOGRAPH + {0x8D73, 0x884C}, //1505 #CJK UNIFIED IDEOGRAPH + {0x8D74, 0x8861}, //1506 #CJK UNIFIED IDEOGRAPH + {0x8D75, 0x8B1B}, //1507 #CJK UNIFIED IDEOGRAPH + {0x8D76, 0x8CA2}, //1508 #CJK UNIFIED IDEOGRAPH + {0x8D77, 0x8CFC}, //1509 #CJK UNIFIED IDEOGRAPH + {0x8D78, 0x90CA}, //1510 #CJK UNIFIED IDEOGRAPH + {0x8D79, 0x9175}, //1511 #CJK UNIFIED IDEOGRAPH + {0x8D7A, 0x9271}, //1512 #CJK UNIFIED IDEOGRAPH + {0x8D7B, 0x783F}, //1513 #CJK UNIFIED IDEOGRAPH + {0x8D7C, 0x92FC}, //1514 #CJK UNIFIED IDEOGRAPH + {0x8D7D, 0x95A4}, //1515 #CJK UNIFIED IDEOGRAPH + {0x8D7E, 0x964D}, //1516 #CJK UNIFIED IDEOGRAPH + {0x8D80, 0x9805}, //1517 #CJK UNIFIED IDEOGRAPH + {0x8D81, 0x9999}, //1518 #CJK UNIFIED IDEOGRAPH + {0x8D82, 0x9AD8}, //1519 #CJK UNIFIED IDEOGRAPH + {0x8D83, 0x9D3B}, //1520 #CJK UNIFIED IDEOGRAPH + {0x8D84, 0x525B}, //1521 #CJK UNIFIED IDEOGRAPH + {0x8D85, 0x52AB}, //1522 #CJK UNIFIED IDEOGRAPH + {0x8D86, 0x53F7}, //1523 #CJK UNIFIED IDEOGRAPH + {0x8D87, 0x5408}, //1524 #CJK UNIFIED IDEOGRAPH + {0x8D88, 0x58D5}, //1525 #CJK UNIFIED IDEOGRAPH + {0x8D89, 0x62F7}, //1526 #CJK UNIFIED IDEOGRAPH + {0x8D8A, 0x6FE0}, //1527 #CJK UNIFIED IDEOGRAPH + {0x8D8B, 0x8C6A}, //1528 #CJK UNIFIED IDEOGRAPH + {0x8D8C, 0x8F5F}, //1529 #CJK UNIFIED IDEOGRAPH + {0x8D8D, 0x9EB9}, //1530 #CJK UNIFIED IDEOGRAPH + {0x8D8E, 0x514B}, //1531 #CJK UNIFIED IDEOGRAPH + {0x8D8F, 0x523B}, //1532 #CJK UNIFIED IDEOGRAPH + {0x8D90, 0x544A}, //1533 #CJK UNIFIED IDEOGRAPH + {0x8D91, 0x56FD}, //1534 #CJK UNIFIED IDEOGRAPH + {0x8D92, 0x7A40}, //1535 #CJK UNIFIED IDEOGRAPH + {0x8D93, 0x9177}, //1536 #CJK UNIFIED IDEOGRAPH + {0x8D94, 0x9D60}, //1537 #CJK UNIFIED IDEOGRAPH + {0x8D95, 0x9ED2}, //1538 #CJK UNIFIED IDEOGRAPH + {0x8D96, 0x7344}, //1539 #CJK UNIFIED IDEOGRAPH + {0x8D97, 0x6F09}, //1540 #CJK UNIFIED IDEOGRAPH + {0x8D98, 0x8170}, //1541 #CJK UNIFIED IDEOGRAPH + {0x8D99, 0x7511}, //1542 #CJK UNIFIED IDEOGRAPH + {0x8D9A, 0x5FFD}, //1543 #CJK UNIFIED IDEOGRAPH + {0x8D9B, 0x60DA}, //1544 #CJK UNIFIED IDEOGRAPH + {0x8D9C, 0x9AA8}, //1545 #CJK UNIFIED IDEOGRAPH + {0x8D9D, 0x72DB}, //1546 #CJK UNIFIED IDEOGRAPH + {0x8D9E, 0x8FBC}, //1547 #CJK UNIFIED IDEOGRAPH + {0x8D9F, 0x6B64}, //1548 #CJK UNIFIED IDEOGRAPH + {0x8DA0, 0x9803}, //1549 #CJK UNIFIED IDEOGRAPH + {0x8DA1, 0x4ECA}, //1550 #CJK UNIFIED IDEOGRAPH + {0x8DA2, 0x56F0}, //1551 #CJK UNIFIED IDEOGRAPH + {0x8DA3, 0x5764}, //1552 #CJK UNIFIED IDEOGRAPH + {0x8DA4, 0x58BE}, //1553 #CJK UNIFIED IDEOGRAPH + {0x8DA5, 0x5A5A}, //1554 #CJK UNIFIED IDEOGRAPH + {0x8DA6, 0x6068}, //1555 #CJK UNIFIED IDEOGRAPH + {0x8DA7, 0x61C7}, //1556 #CJK UNIFIED IDEOGRAPH + {0x8DA8, 0x660F}, //1557 #CJK UNIFIED IDEOGRAPH + {0x8DA9, 0x6606}, //1558 #CJK UNIFIED IDEOGRAPH + {0x8DAA, 0x6839}, //1559 #CJK UNIFIED IDEOGRAPH + {0x8DAB, 0x68B1}, //1560 #CJK UNIFIED IDEOGRAPH + {0x8DAC, 0x6DF7}, //1561 #CJK UNIFIED IDEOGRAPH + {0x8DAD, 0x75D5}, //1562 #CJK UNIFIED IDEOGRAPH + {0x8DAE, 0x7D3A}, //1563 #CJK UNIFIED IDEOGRAPH + {0x8DAF, 0x826E}, //1564 #CJK UNIFIED IDEOGRAPH + {0x8DB0, 0x9B42}, //1565 #CJK UNIFIED IDEOGRAPH + {0x8DB1, 0x4E9B}, //1566 #CJK UNIFIED IDEOGRAPH + {0x8DB2, 0x4F50}, //1567 #CJK UNIFIED IDEOGRAPH + {0x8DB3, 0x53C9}, //1568 #CJK UNIFIED IDEOGRAPH + {0x8DB4, 0x5506}, //1569 #CJK UNIFIED IDEOGRAPH + {0x8DB5, 0x5D6F}, //1570 #CJK UNIFIED IDEOGRAPH + {0x8DB6, 0x5DE6}, //1571 #CJK UNIFIED IDEOGRAPH + {0x8DB7, 0x5DEE}, //1572 #CJK UNIFIED IDEOGRAPH + {0x8DB8, 0x67FB}, //1573 #CJK UNIFIED IDEOGRAPH + {0x8DB9, 0x6C99}, //1574 #CJK UNIFIED IDEOGRAPH + {0x8DBA, 0x7473}, //1575 #CJK UNIFIED IDEOGRAPH + {0x8DBB, 0x7802}, //1576 #CJK UNIFIED IDEOGRAPH + {0x8DBC, 0x8A50}, //1577 #CJK UNIFIED IDEOGRAPH + {0x8DBD, 0x9396}, //1578 #CJK UNIFIED IDEOGRAPH + {0x8DBE, 0x88DF}, //1579 #CJK UNIFIED IDEOGRAPH + {0x8DBF, 0x5750}, //1580 #CJK UNIFIED IDEOGRAPH + {0x8DC0, 0x5EA7}, //1581 #CJK UNIFIED IDEOGRAPH + {0x8DC1, 0x632B}, //1582 #CJK UNIFIED IDEOGRAPH + {0x8DC2, 0x50B5}, //1583 #CJK UNIFIED IDEOGRAPH + {0x8DC3, 0x50AC}, //1584 #CJK UNIFIED IDEOGRAPH + {0x8DC4, 0x518D}, //1585 #CJK UNIFIED IDEOGRAPH + {0x8DC5, 0x6700}, //1586 #CJK UNIFIED IDEOGRAPH + {0x8DC6, 0x54C9}, //1587 #CJK UNIFIED IDEOGRAPH + {0x8DC7, 0x585E}, //1588 #CJK UNIFIED IDEOGRAPH + {0x8DC8, 0x59BB}, //1589 #CJK UNIFIED IDEOGRAPH + {0x8DC9, 0x5BB0}, //1590 #CJK UNIFIED IDEOGRAPH + {0x8DCA, 0x5F69}, //1591 #CJK UNIFIED IDEOGRAPH + {0x8DCB, 0x624D}, //1592 #CJK UNIFIED IDEOGRAPH + {0x8DCC, 0x63A1}, //1593 #CJK UNIFIED IDEOGRAPH + {0x8DCD, 0x683D}, //1594 #CJK UNIFIED IDEOGRAPH + {0x8DCE, 0x6B73}, //1595 #CJK UNIFIED IDEOGRAPH + {0x8DCF, 0x6E08}, //1596 #CJK UNIFIED IDEOGRAPH + {0x8DD0, 0x707D}, //1597 #CJK UNIFIED IDEOGRAPH + {0x8DD1, 0x91C7}, //1598 #CJK UNIFIED IDEOGRAPH + {0x8DD2, 0x7280}, //1599 #CJK UNIFIED IDEOGRAPH + {0x8DD3, 0x7815}, //1600 #CJK UNIFIED IDEOGRAPH + {0x8DD4, 0x7826}, //1601 #CJK UNIFIED IDEOGRAPH + {0x8DD5, 0x796D}, //1602 #CJK UNIFIED IDEOGRAPH + {0x8DD6, 0x658E}, //1603 #CJK UNIFIED IDEOGRAPH + {0x8DD7, 0x7D30}, //1604 #CJK UNIFIED IDEOGRAPH + {0x8DD8, 0x83DC}, //1605 #CJK UNIFIED IDEOGRAPH + {0x8DD9, 0x88C1}, //1606 #CJK UNIFIED IDEOGRAPH + {0x8DDA, 0x8F09}, //1607 #CJK UNIFIED IDEOGRAPH + {0x8DDB, 0x969B}, //1608 #CJK UNIFIED IDEOGRAPH + {0x8DDC, 0x5264}, //1609 #CJK UNIFIED IDEOGRAPH + {0x8DDD, 0x5728}, //1610 #CJK UNIFIED IDEOGRAPH + {0x8DDE, 0x6750}, //1611 #CJK UNIFIED IDEOGRAPH + {0x8DDF, 0x7F6A}, //1612 #CJK UNIFIED IDEOGRAPH + {0x8DE0, 0x8CA1}, //1613 #CJK UNIFIED IDEOGRAPH + {0x8DE1, 0x51B4}, //1614 #CJK UNIFIED IDEOGRAPH + {0x8DE2, 0x5742}, //1615 #CJK UNIFIED IDEOGRAPH + {0x8DE3, 0x962A}, //1616 #CJK UNIFIED IDEOGRAPH + {0x8DE4, 0x583A}, //1617 #CJK UNIFIED IDEOGRAPH + {0x8DE5, 0x698A}, //1618 #CJK UNIFIED IDEOGRAPH + {0x8DE6, 0x80B4}, //1619 #CJK UNIFIED IDEOGRAPH + {0x8DE7, 0x54B2}, //1620 #CJK UNIFIED IDEOGRAPH + {0x8DE8, 0x5D0E}, //1621 #CJK UNIFIED IDEOGRAPH + {0x8DE9, 0x57FC}, //1622 #CJK UNIFIED IDEOGRAPH + {0x8DEA, 0x7895}, //1623 #CJK UNIFIED IDEOGRAPH + {0x8DEB, 0x9DFA}, //1624 #CJK UNIFIED IDEOGRAPH + {0x8DEC, 0x4F5C}, //1625 #CJK UNIFIED IDEOGRAPH + {0x8DED, 0x524A}, //1626 #CJK UNIFIED IDEOGRAPH + {0x8DEE, 0x548B}, //1627 #CJK UNIFIED IDEOGRAPH + {0x8DEF, 0x643E}, //1628 #CJK UNIFIED IDEOGRAPH + {0x8DF0, 0x6628}, //1629 #CJK UNIFIED IDEOGRAPH + {0x8DF1, 0x6714}, //1630 #CJK UNIFIED IDEOGRAPH + {0x8DF2, 0x67F5}, //1631 #CJK UNIFIED IDEOGRAPH + {0x8DF3, 0x7A84}, //1632 #CJK UNIFIED IDEOGRAPH + {0x8DF4, 0x7B56}, //1633 #CJK UNIFIED IDEOGRAPH + {0x8DF5, 0x7D22}, //1634 #CJK UNIFIED IDEOGRAPH + {0x8DF6, 0x932F}, //1635 #CJK UNIFIED IDEOGRAPH + {0x8DF7, 0x685C}, //1636 #CJK UNIFIED IDEOGRAPH + {0x8DF8, 0x9BAD}, //1637 #CJK UNIFIED IDEOGRAPH + {0x8DF9, 0x7B39}, //1638 #CJK UNIFIED IDEOGRAPH + {0x8DFA, 0x5319}, //1639 #CJK UNIFIED IDEOGRAPH + {0x8DFB, 0x518A}, //1640 #CJK UNIFIED IDEOGRAPH + {0x8DFC, 0x5237}, //1641 #CJK UNIFIED IDEOGRAPH + {0x8E40, 0x5BDF}, //1642 #CJK UNIFIED IDEOGRAPH + {0x8E41, 0x62F6}, //1643 #CJK UNIFIED IDEOGRAPH + {0x8E42, 0x64AE}, //1644 #CJK UNIFIED IDEOGRAPH + {0x8E43, 0x64E6}, //1645 #CJK UNIFIED IDEOGRAPH + {0x8E44, 0x672D}, //1646 #CJK UNIFIED IDEOGRAPH + {0x8E45, 0x6BBA}, //1647 #CJK UNIFIED IDEOGRAPH + {0x8E46, 0x85A9}, //1648 #CJK UNIFIED IDEOGRAPH + {0x8E47, 0x96D1}, //1649 #CJK UNIFIED IDEOGRAPH + {0x8E48, 0x7690}, //1650 #CJK UNIFIED IDEOGRAPH + {0x8E49, 0x9BD6}, //1651 #CJK UNIFIED IDEOGRAPH + {0x8E4A, 0x634C}, //1652 #CJK UNIFIED IDEOGRAPH + {0x8E4B, 0x9306}, //1653 #CJK UNIFIED IDEOGRAPH + {0x8E4C, 0x9BAB}, //1654 #CJK UNIFIED IDEOGRAPH + {0x8E4D, 0x76BF}, //1655 #CJK UNIFIED IDEOGRAPH + {0x8E4E, 0x6652}, //1656 #CJK UNIFIED IDEOGRAPH + {0x8E4F, 0x4E09}, //1657 #CJK UNIFIED IDEOGRAPH + {0x8E50, 0x5098}, //1658 #CJK UNIFIED IDEOGRAPH + {0x8E51, 0x53C2}, //1659 #CJK UNIFIED IDEOGRAPH + {0x8E52, 0x5C71}, //1660 #CJK UNIFIED IDEOGRAPH + {0x8E53, 0x60E8}, //1661 #CJK UNIFIED IDEOGRAPH + {0x8E54, 0x6492}, //1662 #CJK UNIFIED IDEOGRAPH + {0x8E55, 0x6563}, //1663 #CJK UNIFIED IDEOGRAPH + {0x8E56, 0x685F}, //1664 #CJK UNIFIED IDEOGRAPH + {0x8E57, 0x71E6}, //1665 #CJK UNIFIED IDEOGRAPH + {0x8E58, 0x73CA}, //1666 #CJK UNIFIED IDEOGRAPH + {0x8E59, 0x7523}, //1667 #CJK UNIFIED IDEOGRAPH + {0x8E5A, 0x7B97}, //1668 #CJK UNIFIED IDEOGRAPH + {0x8E5B, 0x7E82}, //1669 #CJK UNIFIED IDEOGRAPH + {0x8E5C, 0x8695}, //1670 #CJK UNIFIED IDEOGRAPH + {0x8E5D, 0x8B83}, //1671 #CJK UNIFIED IDEOGRAPH + {0x8E5E, 0x8CDB}, //1672 #CJK UNIFIED IDEOGRAPH + {0x8E5F, 0x9178}, //1673 #CJK UNIFIED IDEOGRAPH + {0x8E60, 0x9910}, //1674 #CJK UNIFIED IDEOGRAPH + {0x8E61, 0x65AC}, //1675 #CJK UNIFIED IDEOGRAPH + {0x8E62, 0x66AB}, //1676 #CJK UNIFIED IDEOGRAPH + {0x8E63, 0x6B8B}, //1677 #CJK UNIFIED IDEOGRAPH + {0x8E64, 0x4ED5}, //1678 #CJK UNIFIED IDEOGRAPH + {0x8E65, 0x4ED4}, //1679 #CJK UNIFIED IDEOGRAPH + {0x8E66, 0x4F3A}, //1680 #CJK UNIFIED IDEOGRAPH + {0x8E67, 0x4F7F}, //1681 #CJK UNIFIED IDEOGRAPH + {0x8E68, 0x523A}, //1682 #CJK UNIFIED IDEOGRAPH + {0x8E69, 0x53F8}, //1683 #CJK UNIFIED IDEOGRAPH + {0x8E6A, 0x53F2}, //1684 #CJK UNIFIED IDEOGRAPH + {0x8E6B, 0x55E3}, //1685 #CJK UNIFIED IDEOGRAPH + {0x8E6C, 0x56DB}, //1686 #CJK UNIFIED IDEOGRAPH + {0x8E6D, 0x58EB}, //1687 #CJK UNIFIED IDEOGRAPH + {0x8E6E, 0x59CB}, //1688 #CJK UNIFIED IDEOGRAPH + {0x8E6F, 0x59C9}, //1689 #CJK UNIFIED IDEOGRAPH + {0x8E70, 0x59FF}, //1690 #CJK UNIFIED IDEOGRAPH + {0x8E71, 0x5B50}, //1691 #CJK UNIFIED IDEOGRAPH + {0x8E72, 0x5C4D}, //1692 #CJK UNIFIED IDEOGRAPH + {0x8E73, 0x5E02}, //1693 #CJK UNIFIED IDEOGRAPH + {0x8E74, 0x5E2B}, //1694 #CJK UNIFIED IDEOGRAPH + {0x8E75, 0x5FD7}, //1695 #CJK UNIFIED IDEOGRAPH + {0x8E76, 0x601D}, //1696 #CJK UNIFIED IDEOGRAPH + {0x8E77, 0x6307}, //1697 #CJK UNIFIED IDEOGRAPH + {0x8E78, 0x652F}, //1698 #CJK UNIFIED IDEOGRAPH + {0x8E79, 0x5B5C}, //1699 #CJK UNIFIED IDEOGRAPH + {0x8E7A, 0x65AF}, //1700 #CJK UNIFIED IDEOGRAPH + {0x8E7B, 0x65BD}, //1701 #CJK UNIFIED IDEOGRAPH + {0x8E7C, 0x65E8}, //1702 #CJK UNIFIED IDEOGRAPH + {0x8E7D, 0x679D}, //1703 #CJK UNIFIED IDEOGRAPH + {0x8E7E, 0x6B62}, //1704 #CJK UNIFIED IDEOGRAPH + {0x8E80, 0x6B7B}, //1705 #CJK UNIFIED IDEOGRAPH + {0x8E81, 0x6C0F}, //1706 #CJK UNIFIED IDEOGRAPH + {0x8E82, 0x7345}, //1707 #CJK UNIFIED IDEOGRAPH + {0x8E83, 0x7949}, //1708 #CJK UNIFIED IDEOGRAPH + {0x8E84, 0x79C1}, //1709 #CJK UNIFIED IDEOGRAPH + {0x8E85, 0x7CF8}, //1710 #CJK UNIFIED IDEOGRAPH + {0x8E86, 0x7D19}, //1711 #CJK UNIFIED IDEOGRAPH + {0x8E87, 0x7D2B}, //1712 #CJK UNIFIED IDEOGRAPH + {0x8E88, 0x80A2}, //1713 #CJK UNIFIED IDEOGRAPH + {0x8E89, 0x8102}, //1714 #CJK UNIFIED IDEOGRAPH + {0x8E8A, 0x81F3}, //1715 #CJK UNIFIED IDEOGRAPH + {0x8E8B, 0x8996}, //1716 #CJK UNIFIED IDEOGRAPH + {0x8E8C, 0x8A5E}, //1717 #CJK UNIFIED IDEOGRAPH + {0x8E8D, 0x8A69}, //1718 #CJK UNIFIED IDEOGRAPH + {0x8E8E, 0x8A66}, //1719 #CJK UNIFIED IDEOGRAPH + {0x8E8F, 0x8A8C}, //1720 #CJK UNIFIED IDEOGRAPH + {0x8E90, 0x8AEE}, //1721 #CJK UNIFIED IDEOGRAPH + {0x8E91, 0x8CC7}, //1722 #CJK UNIFIED IDEOGRAPH + {0x8E92, 0x8CDC}, //1723 #CJK UNIFIED IDEOGRAPH + {0x8E93, 0x96CC}, //1724 #CJK UNIFIED IDEOGRAPH + {0x8E94, 0x98FC}, //1725 #CJK UNIFIED IDEOGRAPH + {0x8E95, 0x6B6F}, //1726 #CJK UNIFIED IDEOGRAPH + {0x8E96, 0x4E8B}, //1727 #CJK UNIFIED IDEOGRAPH + {0x8E97, 0x4F3C}, //1728 #CJK UNIFIED IDEOGRAPH + {0x8E98, 0x4F8D}, //1729 #CJK UNIFIED IDEOGRAPH + {0x8E99, 0x5150}, //1730 #CJK UNIFIED IDEOGRAPH + {0x8E9A, 0x5B57}, //1731 #CJK UNIFIED IDEOGRAPH + {0x8E9B, 0x5BFA}, //1732 #CJK UNIFIED IDEOGRAPH + {0x8E9C, 0x6148}, //1733 #CJK UNIFIED IDEOGRAPH + {0x8E9D, 0x6301}, //1734 #CJK UNIFIED IDEOGRAPH + {0x8E9E, 0x6642}, //1735 #CJK UNIFIED IDEOGRAPH + {0x8E9F, 0x6B21}, //1736 #CJK UNIFIED IDEOGRAPH + {0x8EA0, 0x6ECB}, //1737 #CJK UNIFIED IDEOGRAPH + {0x8EA1, 0x6CBB}, //1738 #CJK UNIFIED IDEOGRAPH + {0x8EA2, 0x723E}, //1739 #CJK UNIFIED IDEOGRAPH + {0x8EA3, 0x74BD}, //1740 #CJK UNIFIED IDEOGRAPH + {0x8EA4, 0x75D4}, //1741 #CJK UNIFIED IDEOGRAPH + {0x8EA5, 0x78C1}, //1742 #CJK UNIFIED IDEOGRAPH + {0x8EA6, 0x793A}, //1743 #CJK UNIFIED IDEOGRAPH + {0x8EA7, 0x800C}, //1744 #CJK UNIFIED IDEOGRAPH + {0x8EA8, 0x8033}, //1745 #CJK UNIFIED IDEOGRAPH + {0x8EA9, 0x81EA}, //1746 #CJK UNIFIED IDEOGRAPH + {0x8EAA, 0x8494}, //1747 #CJK UNIFIED IDEOGRAPH + {0x8EAB, 0x8F9E}, //1748 #CJK UNIFIED IDEOGRAPH + {0x8EAC, 0x6C50}, //1749 #CJK UNIFIED IDEOGRAPH + {0x8EAD, 0x9E7F}, //1750 #CJK UNIFIED IDEOGRAPH + {0x8EAE, 0x5F0F}, //1751 #CJK UNIFIED IDEOGRAPH + {0x8EAF, 0x8B58}, //1752 #CJK UNIFIED IDEOGRAPH + {0x8EB0, 0x9D2B}, //1753 #CJK UNIFIED IDEOGRAPH + {0x8EB1, 0x7AFA}, //1754 #CJK UNIFIED IDEOGRAPH + {0x8EB2, 0x8EF8}, //1755 #CJK UNIFIED IDEOGRAPH + {0x8EB3, 0x5B8D}, //1756 #CJK UNIFIED IDEOGRAPH + {0x8EB4, 0x96EB}, //1757 #CJK UNIFIED IDEOGRAPH + {0x8EB5, 0x4E03}, //1758 #CJK UNIFIED IDEOGRAPH + {0x8EB6, 0x53F1}, //1759 #CJK UNIFIED IDEOGRAPH + {0x8EB7, 0x57F7}, //1760 #CJK UNIFIED IDEOGRAPH + {0x8EB8, 0x5931}, //1761 #CJK UNIFIED IDEOGRAPH + {0x8EB9, 0x5AC9}, //1762 #CJK UNIFIED IDEOGRAPH + {0x8EBA, 0x5BA4}, //1763 #CJK UNIFIED IDEOGRAPH + {0x8EBB, 0x6089}, //1764 #CJK UNIFIED IDEOGRAPH + {0x8EBC, 0x6E7F}, //1765 #CJK UNIFIED IDEOGRAPH + {0x8EBD, 0x6F06}, //1766 #CJK UNIFIED IDEOGRAPH + {0x8EBE, 0x75BE}, //1767 #CJK UNIFIED IDEOGRAPH + {0x8EBF, 0x8CEA}, //1768 #CJK UNIFIED IDEOGRAPH + {0x8EC0, 0x5B9F}, //1769 #CJK UNIFIED IDEOGRAPH + {0x8EC1, 0x8500}, //1770 #CJK UNIFIED IDEOGRAPH + {0x8EC2, 0x7BE0}, //1771 #CJK UNIFIED IDEOGRAPH + {0x8EC3, 0x5072}, //1772 #CJK UNIFIED IDEOGRAPH + {0x8EC4, 0x67F4}, //1773 #CJK UNIFIED IDEOGRAPH + {0x8EC5, 0x829D}, //1774 #CJK UNIFIED IDEOGRAPH + {0x8EC6, 0x5C61}, //1775 #CJK UNIFIED IDEOGRAPH + {0x8EC7, 0x854A}, //1776 #CJK UNIFIED IDEOGRAPH + {0x8EC8, 0x7E1E}, //1777 #CJK UNIFIED IDEOGRAPH + {0x8EC9, 0x820E}, //1778 #CJK UNIFIED IDEOGRAPH + {0x8ECA, 0x5199}, //1779 #CJK UNIFIED IDEOGRAPH + {0x8ECB, 0x5C04}, //1780 #CJK UNIFIED IDEOGRAPH + {0x8ECC, 0x6368}, //1781 #CJK UNIFIED IDEOGRAPH + {0x8ECD, 0x8D66}, //1782 #CJK UNIFIED IDEOGRAPH + {0x8ECE, 0x659C}, //1783 #CJK UNIFIED IDEOGRAPH + {0x8ECF, 0x716E}, //1784 #CJK UNIFIED IDEOGRAPH + {0x8ED0, 0x793E}, //1785 #CJK UNIFIED IDEOGRAPH + {0x8ED1, 0x7D17}, //1786 #CJK UNIFIED IDEOGRAPH + {0x8ED2, 0x8005}, //1787 #CJK UNIFIED IDEOGRAPH + {0x8ED3, 0x8B1D}, //1788 #CJK UNIFIED IDEOGRAPH + {0x8ED4, 0x8ECA}, //1789 #CJK UNIFIED IDEOGRAPH + {0x8ED5, 0x906E}, //1790 #CJK UNIFIED IDEOGRAPH + {0x8ED6, 0x86C7}, //1791 #CJK UNIFIED IDEOGRAPH + {0x8ED7, 0x90AA}, //1792 #CJK UNIFIED IDEOGRAPH + {0x8ED8, 0x501F}, //1793 #CJK UNIFIED IDEOGRAPH + {0x8ED9, 0x52FA}, //1794 #CJK UNIFIED IDEOGRAPH + {0x8EDA, 0x5C3A}, //1795 #CJK UNIFIED IDEOGRAPH + {0x8EDB, 0x6753}, //1796 #CJK UNIFIED IDEOGRAPH + {0x8EDC, 0x707C}, //1797 #CJK UNIFIED IDEOGRAPH + {0x8EDD, 0x7235}, //1798 #CJK UNIFIED IDEOGRAPH + {0x8EDE, 0x914C}, //1799 #CJK UNIFIED IDEOGRAPH + {0x8EDF, 0x91C8}, //1800 #CJK UNIFIED IDEOGRAPH + {0x8EE0, 0x932B}, //1801 #CJK UNIFIED IDEOGRAPH + {0x8EE1, 0x82E5}, //1802 #CJK UNIFIED IDEOGRAPH + {0x8EE2, 0x5BC2}, //1803 #CJK UNIFIED IDEOGRAPH + {0x8EE3, 0x5F31}, //1804 #CJK UNIFIED IDEOGRAPH + {0x8EE4, 0x60F9}, //1805 #CJK UNIFIED IDEOGRAPH + {0x8EE5, 0x4E3B}, //1806 #CJK UNIFIED IDEOGRAPH + {0x8EE6, 0x53D6}, //1807 #CJK UNIFIED IDEOGRAPH + {0x8EE7, 0x5B88}, //1808 #CJK UNIFIED IDEOGRAPH + {0x8EE8, 0x624B}, //1809 #CJK UNIFIED IDEOGRAPH + {0x8EE9, 0x6731}, //1810 #CJK UNIFIED IDEOGRAPH + {0x8EEA, 0x6B8A}, //1811 #CJK UNIFIED IDEOGRAPH + {0x8EEB, 0x72E9}, //1812 #CJK UNIFIED IDEOGRAPH + {0x8EEC, 0x73E0}, //1813 #CJK UNIFIED IDEOGRAPH + {0x8EED, 0x7A2E}, //1814 #CJK UNIFIED IDEOGRAPH + {0x8EEE, 0x816B}, //1815 #CJK UNIFIED IDEOGRAPH + {0x8EEF, 0x8DA3}, //1816 #CJK UNIFIED IDEOGRAPH + {0x8EF0, 0x9152}, //1817 #CJK UNIFIED IDEOGRAPH + {0x8EF1, 0x9996}, //1818 #CJK UNIFIED IDEOGRAPH + {0x8EF2, 0x5112}, //1819 #CJK UNIFIED IDEOGRAPH + {0x8EF3, 0x53D7}, //1820 #CJK UNIFIED IDEOGRAPH + {0x8EF4, 0x546A}, //1821 #CJK UNIFIED IDEOGRAPH + {0x8EF5, 0x5BFF}, //1822 #CJK UNIFIED IDEOGRAPH + {0x8EF6, 0x6388}, //1823 #CJK UNIFIED IDEOGRAPH + {0x8EF7, 0x6A39}, //1824 #CJK UNIFIED IDEOGRAPH + {0x8EF8, 0x7DAC}, //1825 #CJK UNIFIED IDEOGRAPH + {0x8EF9, 0x9700}, //1826 #CJK UNIFIED IDEOGRAPH + {0x8EFA, 0x56DA}, //1827 #CJK UNIFIED IDEOGRAPH + {0x8EFB, 0x53CE}, //1828 #CJK UNIFIED IDEOGRAPH + {0x8EFC, 0x5468}, //1829 #CJK UNIFIED IDEOGRAPH + {0x8F40, 0x5B97}, //1830 #CJK UNIFIED IDEOGRAPH + {0x8F41, 0x5C31}, //1831 #CJK UNIFIED IDEOGRAPH + {0x8F42, 0x5DDE}, //1832 #CJK UNIFIED IDEOGRAPH + {0x8F43, 0x4FEE}, //1833 #CJK UNIFIED IDEOGRAPH + {0x8F44, 0x6101}, //1834 #CJK UNIFIED IDEOGRAPH + {0x8F45, 0x62FE}, //1835 #CJK UNIFIED IDEOGRAPH + {0x8F46, 0x6D32}, //1836 #CJK UNIFIED IDEOGRAPH + {0x8F47, 0x79C0}, //1837 #CJK UNIFIED IDEOGRAPH + {0x8F48, 0x79CB}, //1838 #CJK UNIFIED IDEOGRAPH + {0x8F49, 0x7D42}, //1839 #CJK UNIFIED IDEOGRAPH + {0x8F4A, 0x7E4D}, //1840 #CJK UNIFIED IDEOGRAPH + {0x8F4B, 0x7FD2}, //1841 #CJK UNIFIED IDEOGRAPH + {0x8F4C, 0x81ED}, //1842 #CJK UNIFIED IDEOGRAPH + {0x8F4D, 0x821F}, //1843 #CJK UNIFIED IDEOGRAPH + {0x8F4E, 0x8490}, //1844 #CJK UNIFIED IDEOGRAPH + {0x8F4F, 0x8846}, //1845 #CJK UNIFIED IDEOGRAPH + {0x8F50, 0x8972}, //1846 #CJK UNIFIED IDEOGRAPH + {0x8F51, 0x8B90}, //1847 #CJK UNIFIED IDEOGRAPH + {0x8F52, 0x8E74}, //1848 #CJK UNIFIED IDEOGRAPH + {0x8F53, 0x8F2F}, //1849 #CJK UNIFIED IDEOGRAPH + {0x8F54, 0x9031}, //1850 #CJK UNIFIED IDEOGRAPH + {0x8F55, 0x914B}, //1851 #CJK UNIFIED IDEOGRAPH + {0x8F56, 0x916C}, //1852 #CJK UNIFIED IDEOGRAPH + {0x8F57, 0x96C6}, //1853 #CJK UNIFIED IDEOGRAPH + {0x8F58, 0x919C}, //1854 #CJK UNIFIED IDEOGRAPH + {0x8F59, 0x4EC0}, //1855 #CJK UNIFIED IDEOGRAPH + {0x8F5A, 0x4F4F}, //1856 #CJK UNIFIED IDEOGRAPH + {0x8F5B, 0x5145}, //1857 #CJK UNIFIED IDEOGRAPH + {0x8F5C, 0x5341}, //1858 #CJK UNIFIED IDEOGRAPH + {0x8F5D, 0x5F93}, //1859 #CJK UNIFIED IDEOGRAPH + {0x8F5E, 0x620E}, //1860 #CJK UNIFIED IDEOGRAPH + {0x8F5F, 0x67D4}, //1861 #CJK UNIFIED IDEOGRAPH + {0x8F60, 0x6C41}, //1862 #CJK UNIFIED IDEOGRAPH + {0x8F61, 0x6E0B}, //1863 #CJK UNIFIED IDEOGRAPH + {0x8F62, 0x7363}, //1864 #CJK UNIFIED IDEOGRAPH + {0x8F63, 0x7E26}, //1865 #CJK UNIFIED IDEOGRAPH + {0x8F64, 0x91CD}, //1866 #CJK UNIFIED IDEOGRAPH + {0x8F65, 0x9283}, //1867 #CJK UNIFIED IDEOGRAPH + {0x8F66, 0x53D4}, //1868 #CJK UNIFIED IDEOGRAPH + {0x8F67, 0x5919}, //1869 #CJK UNIFIED IDEOGRAPH + {0x8F68, 0x5BBF}, //1870 #CJK UNIFIED IDEOGRAPH + {0x8F69, 0x6DD1}, //1871 #CJK UNIFIED IDEOGRAPH + {0x8F6A, 0x795D}, //1872 #CJK UNIFIED IDEOGRAPH + {0x8F6B, 0x7E2E}, //1873 #CJK UNIFIED IDEOGRAPH + {0x8F6C, 0x7C9B}, //1874 #CJK UNIFIED IDEOGRAPH + {0x8F6D, 0x587E}, //1875 #CJK UNIFIED IDEOGRAPH + {0x8F6E, 0x719F}, //1876 #CJK UNIFIED IDEOGRAPH + {0x8F6F, 0x51FA}, //1877 #CJK UNIFIED IDEOGRAPH + {0x8F70, 0x8853}, //1878 #CJK UNIFIED IDEOGRAPH + {0x8F71, 0x8FF0}, //1879 #CJK UNIFIED IDEOGRAPH + {0x8F72, 0x4FCA}, //1880 #CJK UNIFIED IDEOGRAPH + {0x8F73, 0x5CFB}, //1881 #CJK UNIFIED IDEOGRAPH + {0x8F74, 0x6625}, //1882 #CJK UNIFIED IDEOGRAPH + {0x8F75, 0x77AC}, //1883 #CJK UNIFIED IDEOGRAPH + {0x8F76, 0x7AE3}, //1884 #CJK UNIFIED IDEOGRAPH + {0x8F77, 0x821C}, //1885 #CJK UNIFIED IDEOGRAPH + {0x8F78, 0x99FF}, //1886 #CJK UNIFIED IDEOGRAPH + {0x8F79, 0x51C6}, //1887 #CJK UNIFIED IDEOGRAPH + {0x8F7A, 0x5FAA}, //1888 #CJK UNIFIED IDEOGRAPH + {0x8F7B, 0x65EC}, //1889 #CJK UNIFIED IDEOGRAPH + {0x8F7C, 0x696F}, //1890 #CJK UNIFIED IDEOGRAPH + {0x8F7D, 0x6B89}, //1891 #CJK UNIFIED IDEOGRAPH + {0x8F7E, 0x6DF3}, //1892 #CJK UNIFIED IDEOGRAPH + {0x8F80, 0x6E96}, //1893 #CJK UNIFIED IDEOGRAPH + {0x8F81, 0x6F64}, //1894 #CJK UNIFIED IDEOGRAPH + {0x8F82, 0x76FE}, //1895 #CJK UNIFIED IDEOGRAPH + {0x8F83, 0x7D14}, //1896 #CJK UNIFIED IDEOGRAPH + {0x8F84, 0x5DE1}, //1897 #CJK UNIFIED IDEOGRAPH + {0x8F85, 0x9075}, //1898 #CJK UNIFIED IDEOGRAPH + {0x8F86, 0x9187}, //1899 #CJK UNIFIED IDEOGRAPH + {0x8F87, 0x9806}, //1900 #CJK UNIFIED IDEOGRAPH + {0x8F88, 0x51E6}, //1901 #CJK UNIFIED IDEOGRAPH + {0x8F89, 0x521D}, //1902 #CJK UNIFIED IDEOGRAPH + {0x8F8A, 0x6240}, //1903 #CJK UNIFIED IDEOGRAPH + {0x8F8B, 0x6691}, //1904 #CJK UNIFIED IDEOGRAPH + {0x8F8C, 0x66D9}, //1905 #CJK UNIFIED IDEOGRAPH + {0x8F8D, 0x6E1A}, //1906 #CJK UNIFIED IDEOGRAPH + {0x8F8E, 0x5EB6}, //1907 #CJK UNIFIED IDEOGRAPH + {0x8F8F, 0x7DD2}, //1908 #CJK UNIFIED IDEOGRAPH + {0x8F90, 0x7F72}, //1909 #CJK UNIFIED IDEOGRAPH + {0x8F91, 0x66F8}, //1910 #CJK UNIFIED IDEOGRAPH + {0x8F92, 0x85AF}, //1911 #CJK UNIFIED IDEOGRAPH + {0x8F93, 0x85F7}, //1912 #CJK UNIFIED IDEOGRAPH + {0x8F94, 0x8AF8}, //1913 #CJK UNIFIED IDEOGRAPH + {0x8F95, 0x52A9}, //1914 #CJK UNIFIED IDEOGRAPH + {0x8F96, 0x53D9}, //1915 #CJK UNIFIED IDEOGRAPH + {0x8F97, 0x5973}, //1916 #CJK UNIFIED IDEOGRAPH + {0x8F98, 0x5E8F}, //1917 #CJK UNIFIED IDEOGRAPH + {0x8F99, 0x5F90}, //1918 #CJK UNIFIED IDEOGRAPH + {0x8F9A, 0x6055}, //1919 #CJK UNIFIED IDEOGRAPH + {0x8F9B, 0x92E4}, //1920 #CJK UNIFIED IDEOGRAPH + {0x8F9C, 0x9664}, //1921 #CJK UNIFIED IDEOGRAPH + {0x8F9D, 0x50B7}, //1922 #CJK UNIFIED IDEOGRAPH + {0x8F9E, 0x511F}, //1923 #CJK UNIFIED IDEOGRAPH + {0x8F9F, 0x52DD}, //1924 #CJK UNIFIED IDEOGRAPH + {0x8FA0, 0x5320}, //1925 #CJK UNIFIED IDEOGRAPH + {0x8FA1, 0x5347}, //1926 #CJK UNIFIED IDEOGRAPH + {0x8FA2, 0x53EC}, //1927 #CJK UNIFIED IDEOGRAPH + {0x8FA3, 0x54E8}, //1928 #CJK UNIFIED IDEOGRAPH + {0x8FA4, 0x5546}, //1929 #CJK UNIFIED IDEOGRAPH + {0x8FA5, 0x5531}, //1930 #CJK UNIFIED IDEOGRAPH + {0x8FA6, 0x5617}, //1931 #CJK UNIFIED IDEOGRAPH + {0x8FA7, 0x5968}, //1932 #CJK UNIFIED IDEOGRAPH + {0x8FA8, 0x59BE}, //1933 #CJK UNIFIED IDEOGRAPH + {0x8FA9, 0x5A3C}, //1934 #CJK UNIFIED IDEOGRAPH + {0x8FAA, 0x5BB5}, //1935 #CJK UNIFIED IDEOGRAPH + {0x8FAB, 0x5C06}, //1936 #CJK UNIFIED IDEOGRAPH + {0x8FAC, 0x5C0F}, //1937 #CJK UNIFIED IDEOGRAPH + {0x8FAD, 0x5C11}, //1938 #CJK UNIFIED IDEOGRAPH + {0x8FAE, 0x5C1A}, //1939 #CJK UNIFIED IDEOGRAPH + {0x8FAF, 0x5E84}, //1940 #CJK UNIFIED IDEOGRAPH + {0x8FB0, 0x5E8A}, //1941 #CJK UNIFIED IDEOGRAPH + {0x8FB1, 0x5EE0}, //1942 #CJK UNIFIED IDEOGRAPH + {0x8FB2, 0x5F70}, //1943 #CJK UNIFIED IDEOGRAPH + {0x8FB3, 0x627F}, //1944 #CJK UNIFIED IDEOGRAPH + {0x8FB4, 0x6284}, //1945 #CJK UNIFIED IDEOGRAPH + {0x8FB5, 0x62DB}, //1946 #CJK UNIFIED IDEOGRAPH + {0x8FB6, 0x638C}, //1947 #CJK UNIFIED IDEOGRAPH + {0x8FB7, 0x6377}, //1948 #CJK UNIFIED IDEOGRAPH + {0x8FB8, 0x6607}, //1949 #CJK UNIFIED IDEOGRAPH + {0x8FB9, 0x660C}, //1950 #CJK UNIFIED IDEOGRAPH + {0x8FBA, 0x662D}, //1951 #CJK UNIFIED IDEOGRAPH + {0x8FBB, 0x6676}, //1952 #CJK UNIFIED IDEOGRAPH + {0x8FBC, 0x677E}, //1953 #CJK UNIFIED IDEOGRAPH + {0x8FBD, 0x68A2}, //1954 #CJK UNIFIED IDEOGRAPH + {0x8FBE, 0x6A1F}, //1955 #CJK UNIFIED IDEOGRAPH + {0x8FBF, 0x6A35}, //1956 #CJK UNIFIED IDEOGRAPH + {0x8FC0, 0x6CBC}, //1957 #CJK UNIFIED IDEOGRAPH + {0x8FC1, 0x6D88}, //1958 #CJK UNIFIED IDEOGRAPH + {0x8FC2, 0x6E09}, //1959 #CJK UNIFIED IDEOGRAPH + {0x8FC3, 0x6E58}, //1960 #CJK UNIFIED IDEOGRAPH + {0x8FC4, 0x713C}, //1961 #CJK UNIFIED IDEOGRAPH + {0x8FC5, 0x7126}, //1962 #CJK UNIFIED IDEOGRAPH + {0x8FC6, 0x7167}, //1963 #CJK UNIFIED IDEOGRAPH + {0x8FC7, 0x75C7}, //1964 #CJK UNIFIED IDEOGRAPH + {0x8FC8, 0x7701}, //1965 #CJK UNIFIED IDEOGRAPH + {0x8FC9, 0x785D}, //1966 #CJK UNIFIED IDEOGRAPH + {0x8FCA, 0x7901}, //1967 #CJK UNIFIED IDEOGRAPH + {0x8FCB, 0x7965}, //1968 #CJK UNIFIED IDEOGRAPH + {0x8FCC, 0x79F0}, //1969 #CJK UNIFIED IDEOGRAPH + {0x8FCD, 0x7AE0}, //1970 #CJK UNIFIED IDEOGRAPH + {0x8FCE, 0x7B11}, //1971 #CJK UNIFIED IDEOGRAPH + {0x8FCF, 0x7CA7}, //1972 #CJK UNIFIED IDEOGRAPH + {0x8FD0, 0x7D39}, //1973 #CJK UNIFIED IDEOGRAPH + {0x8FD1, 0x8096}, //1974 #CJK UNIFIED IDEOGRAPH + {0x8FD2, 0x83D6}, //1975 #CJK UNIFIED IDEOGRAPH + {0x8FD3, 0x848B}, //1976 #CJK UNIFIED IDEOGRAPH + {0x8FD4, 0x8549}, //1977 #CJK UNIFIED IDEOGRAPH + {0x8FD5, 0x885D}, //1978 #CJK UNIFIED IDEOGRAPH + {0x8FD6, 0x88F3}, //1979 #CJK UNIFIED IDEOGRAPH + {0x8FD7, 0x8A1F}, //1980 #CJK UNIFIED IDEOGRAPH + {0x8FD8, 0x8A3C}, //1981 #CJK UNIFIED IDEOGRAPH + {0x8FD9, 0x8A54}, //1982 #CJK UNIFIED IDEOGRAPH + {0x8FDA, 0x8A73}, //1983 #CJK UNIFIED IDEOGRAPH + {0x8FDB, 0x8C61}, //1984 #CJK UNIFIED IDEOGRAPH + {0x8FDC, 0x8CDE}, //1985 #CJK UNIFIED IDEOGRAPH + {0x8FDD, 0x91A4}, //1986 #CJK UNIFIED IDEOGRAPH + {0x8FDE, 0x9266}, //1987 #CJK UNIFIED IDEOGRAPH + {0x8FDF, 0x937E}, //1988 #CJK UNIFIED IDEOGRAPH + {0x8FE0, 0x9418}, //1989 #CJK UNIFIED IDEOGRAPH + {0x8FE1, 0x969C}, //1990 #CJK UNIFIED IDEOGRAPH + {0x8FE2, 0x9798}, //1991 #CJK UNIFIED IDEOGRAPH + {0x8FE3, 0x4E0A}, //1992 #CJK UNIFIED IDEOGRAPH + {0x8FE4, 0x4E08}, //1993 #CJK UNIFIED IDEOGRAPH + {0x8FE5, 0x4E1E}, //1994 #CJK UNIFIED IDEOGRAPH + {0x8FE6, 0x4E57}, //1995 #CJK UNIFIED IDEOGRAPH + {0x8FE7, 0x5197}, //1996 #CJK UNIFIED IDEOGRAPH + {0x8FE8, 0x5270}, //1997 #CJK UNIFIED IDEOGRAPH + {0x8FE9, 0x57CE}, //1998 #CJK UNIFIED IDEOGRAPH + {0x8FEA, 0x5834}, //1999 #CJK UNIFIED IDEOGRAPH + {0x8FEB, 0x58CC}, //2000 #CJK UNIFIED IDEOGRAPH + {0x8FEC, 0x5B22}, //2001 #CJK UNIFIED IDEOGRAPH + {0x8FED, 0x5E38}, //2002 #CJK UNIFIED IDEOGRAPH + {0x8FEE, 0x60C5}, //2003 #CJK UNIFIED IDEOGRAPH + {0x8FEF, 0x64FE}, //2004 #CJK UNIFIED IDEOGRAPH + {0x8FF0, 0x6761}, //2005 #CJK UNIFIED IDEOGRAPH + {0x8FF1, 0x6756}, //2006 #CJK UNIFIED IDEOGRAPH + {0x8FF2, 0x6D44}, //2007 #CJK UNIFIED IDEOGRAPH + {0x8FF3, 0x72B6}, //2008 #CJK UNIFIED IDEOGRAPH + {0x8FF4, 0x7573}, //2009 #CJK UNIFIED IDEOGRAPH + {0x8FF5, 0x7A63}, //2010 #CJK UNIFIED IDEOGRAPH + {0x8FF6, 0x84B8}, //2011 #CJK UNIFIED IDEOGRAPH + {0x8FF7, 0x8B72}, //2012 #CJK UNIFIED IDEOGRAPH + {0x8FF8, 0x91B8}, //2013 #CJK UNIFIED IDEOGRAPH + {0x8FF9, 0x9320}, //2014 #CJK UNIFIED IDEOGRAPH + {0x8FFA, 0x5631}, //2015 #CJK UNIFIED IDEOGRAPH + {0x8FFB, 0x57F4}, //2016 #CJK UNIFIED IDEOGRAPH + {0x8FFC, 0x98FE}, //2017 #CJK UNIFIED IDEOGRAPH + {0x9040, 0x62ED}, //2018 #CJK UNIFIED IDEOGRAPH + {0x9041, 0x690D}, //2019 #CJK UNIFIED IDEOGRAPH + {0x9042, 0x6B96}, //2020 #CJK UNIFIED IDEOGRAPH + {0x9043, 0x71ED}, //2021 #CJK UNIFIED IDEOGRAPH + {0x9044, 0x7E54}, //2022 #CJK UNIFIED IDEOGRAPH + {0x9045, 0x8077}, //2023 #CJK UNIFIED IDEOGRAPH + {0x9046, 0x8272}, //2024 #CJK UNIFIED IDEOGRAPH + {0x9047, 0x89E6}, //2025 #CJK UNIFIED IDEOGRAPH + {0x9048, 0x98DF}, //2026 #CJK UNIFIED IDEOGRAPH + {0x9049, 0x8755}, //2027 #CJK UNIFIED IDEOGRAPH + {0x904A, 0x8FB1}, //2028 #CJK UNIFIED IDEOGRAPH + {0x904B, 0x5C3B}, //2029 #CJK UNIFIED IDEOGRAPH + {0x904C, 0x4F38}, //2030 #CJK UNIFIED IDEOGRAPH + {0x904D, 0x4FE1}, //2031 #CJK UNIFIED IDEOGRAPH + {0x904E, 0x4FB5}, //2032 #CJK UNIFIED IDEOGRAPH + {0x904F, 0x5507}, //2033 #CJK UNIFIED IDEOGRAPH + {0x9050, 0x5A20}, //2034 #CJK UNIFIED IDEOGRAPH + {0x9051, 0x5BDD}, //2035 #CJK UNIFIED IDEOGRAPH + {0x9052, 0x5BE9}, //2036 #CJK UNIFIED IDEOGRAPH + {0x9053, 0x5FC3}, //2037 #CJK UNIFIED IDEOGRAPH + {0x9054, 0x614E}, //2038 #CJK UNIFIED IDEOGRAPH + {0x9055, 0x632F}, //2039 #CJK UNIFIED IDEOGRAPH + {0x9056, 0x65B0}, //2040 #CJK UNIFIED IDEOGRAPH + {0x9057, 0x664B}, //2041 #CJK UNIFIED IDEOGRAPH + {0x9058, 0x68EE}, //2042 #CJK UNIFIED IDEOGRAPH + {0x9059, 0x699B}, //2043 #CJK UNIFIED IDEOGRAPH + {0x905A, 0x6D78}, //2044 #CJK UNIFIED IDEOGRAPH + {0x905B, 0x6DF1}, //2045 #CJK UNIFIED IDEOGRAPH + {0x905C, 0x7533}, //2046 #CJK UNIFIED IDEOGRAPH + {0x905D, 0x75B9}, //2047 #CJK UNIFIED IDEOGRAPH + {0x905E, 0x771F}, //2048 #CJK UNIFIED IDEOGRAPH + {0x905F, 0x795E}, //2049 #CJK UNIFIED IDEOGRAPH + {0x9060, 0x79E6}, //2050 #CJK UNIFIED IDEOGRAPH + {0x9061, 0x7D33}, //2051 #CJK UNIFIED IDEOGRAPH + {0x9062, 0x81E3}, //2052 #CJK UNIFIED IDEOGRAPH + {0x9063, 0x82AF}, //2053 #CJK UNIFIED IDEOGRAPH + {0x9064, 0x85AA}, //2054 #CJK UNIFIED IDEOGRAPH + {0x9065, 0x89AA}, //2055 #CJK UNIFIED IDEOGRAPH + {0x9066, 0x8A3A}, //2056 #CJK UNIFIED IDEOGRAPH + {0x9067, 0x8EAB}, //2057 #CJK UNIFIED IDEOGRAPH + {0x9068, 0x8F9B}, //2058 #CJK UNIFIED IDEOGRAPH + {0x9069, 0x9032}, //2059 #CJK UNIFIED IDEOGRAPH + {0x906A, 0x91DD}, //2060 #CJK UNIFIED IDEOGRAPH + {0x906B, 0x9707}, //2061 #CJK UNIFIED IDEOGRAPH + {0x906C, 0x4EBA}, //2062 #CJK UNIFIED IDEOGRAPH + {0x906D, 0x4EC1}, //2063 #CJK UNIFIED IDEOGRAPH + {0x906E, 0x5203}, //2064 #CJK UNIFIED IDEOGRAPH + {0x906F, 0x5875}, //2065 #CJK UNIFIED IDEOGRAPH + {0x9070, 0x58EC}, //2066 #CJK UNIFIED IDEOGRAPH + {0x9071, 0x5C0B}, //2067 #CJK UNIFIED IDEOGRAPH + {0x9072, 0x751A}, //2068 #CJK UNIFIED IDEOGRAPH + {0x9073, 0x5C3D}, //2069 #CJK UNIFIED IDEOGRAPH + {0x9074, 0x814E}, //2070 #CJK UNIFIED IDEOGRAPH + {0x9075, 0x8A0A}, //2071 #CJK UNIFIED IDEOGRAPH + {0x9076, 0x8FC5}, //2072 #CJK UNIFIED IDEOGRAPH + {0x9077, 0x9663}, //2073 #CJK UNIFIED IDEOGRAPH + {0x9078, 0x976D}, //2074 #CJK UNIFIED IDEOGRAPH + {0x9079, 0x7B25}, //2075 #CJK UNIFIED IDEOGRAPH + {0x907A, 0x8ACF}, //2076 #CJK UNIFIED IDEOGRAPH + {0x907B, 0x9808}, //2077 #CJK UNIFIED IDEOGRAPH + {0x907C, 0x9162}, //2078 #CJK UNIFIED IDEOGRAPH + {0x907D, 0x56F3}, //2079 #CJK UNIFIED IDEOGRAPH + {0x907E, 0x53A8}, //2080 #CJK UNIFIED IDEOGRAPH + {0x9080, 0x9017}, //2081 #CJK UNIFIED IDEOGRAPH + {0x9081, 0x5439}, //2082 #CJK UNIFIED IDEOGRAPH + {0x9082, 0x5782}, //2083 #CJK UNIFIED IDEOGRAPH + {0x9083, 0x5E25}, //2084 #CJK UNIFIED IDEOGRAPH + {0x9084, 0x63A8}, //2085 #CJK UNIFIED IDEOGRAPH + {0x9085, 0x6C34}, //2086 #CJK UNIFIED IDEOGRAPH + {0x9086, 0x708A}, //2087 #CJK UNIFIED IDEOGRAPH + {0x9087, 0x7761}, //2088 #CJK UNIFIED IDEOGRAPH + {0x9088, 0x7C8B}, //2089 #CJK UNIFIED IDEOGRAPH + {0x9089, 0x7FE0}, //2090 #CJK UNIFIED IDEOGRAPH + {0x908A, 0x8870}, //2091 #CJK UNIFIED IDEOGRAPH + {0x908B, 0x9042}, //2092 #CJK UNIFIED IDEOGRAPH + {0x908C, 0x9154}, //2093 #CJK UNIFIED IDEOGRAPH + {0x908D, 0x9310}, //2094 #CJK UNIFIED IDEOGRAPH + {0x908E, 0x9318}, //2095 #CJK UNIFIED IDEOGRAPH + {0x908F, 0x968F}, //2096 #CJK UNIFIED IDEOGRAPH + {0x9090, 0x745E}, //2097 #CJK UNIFIED IDEOGRAPH + {0x9091, 0x9AC4}, //2098 #CJK UNIFIED IDEOGRAPH + {0x9092, 0x5D07}, //2099 #CJK UNIFIED IDEOGRAPH + {0x9093, 0x5D69}, //2100 #CJK UNIFIED IDEOGRAPH + {0x9094, 0x6570}, //2101 #CJK UNIFIED IDEOGRAPH + {0x9095, 0x67A2}, //2102 #CJK UNIFIED IDEOGRAPH + {0x9096, 0x8DA8}, //2103 #CJK UNIFIED IDEOGRAPH + {0x9097, 0x96DB}, //2104 #CJK UNIFIED IDEOGRAPH + {0x9098, 0x636E}, //2105 #CJK UNIFIED IDEOGRAPH + {0x9099, 0x6749}, //2106 #CJK UNIFIED IDEOGRAPH + {0x909A, 0x6919}, //2107 #CJK UNIFIED IDEOGRAPH + {0x909B, 0x83C5}, //2108 #CJK UNIFIED IDEOGRAPH + {0x909C, 0x9817}, //2109 #CJK UNIFIED IDEOGRAPH + {0x909D, 0x96C0}, //2110 #CJK UNIFIED IDEOGRAPH + {0x909E, 0x88FE}, //2111 #CJK UNIFIED IDEOGRAPH + {0x909F, 0x6F84}, //2112 #CJK UNIFIED IDEOGRAPH + {0x90A0, 0x647A}, //2113 #CJK UNIFIED IDEOGRAPH + {0x90A1, 0x5BF8}, //2114 #CJK UNIFIED IDEOGRAPH + {0x90A2, 0x4E16}, //2115 #CJK UNIFIED IDEOGRAPH + {0x90A3, 0x702C}, //2116 #CJK UNIFIED IDEOGRAPH + {0x90A4, 0x755D}, //2117 #CJK UNIFIED IDEOGRAPH + {0x90A5, 0x662F}, //2118 #CJK UNIFIED IDEOGRAPH + {0x90A6, 0x51C4}, //2119 #CJK UNIFIED IDEOGRAPH + {0x90A7, 0x5236}, //2120 #CJK UNIFIED IDEOGRAPH + {0x90A8, 0x52E2}, //2121 #CJK UNIFIED IDEOGRAPH + {0x90A9, 0x59D3}, //2122 #CJK UNIFIED IDEOGRAPH + {0x90AA, 0x5F81}, //2123 #CJK UNIFIED IDEOGRAPH + {0x90AB, 0x6027}, //2124 #CJK UNIFIED IDEOGRAPH + {0x90AC, 0x6210}, //2125 #CJK UNIFIED IDEOGRAPH + {0x90AD, 0x653F}, //2126 #CJK UNIFIED IDEOGRAPH + {0x90AE, 0x6574}, //2127 #CJK UNIFIED IDEOGRAPH + {0x90AF, 0x661F}, //2128 #CJK UNIFIED IDEOGRAPH + {0x90B0, 0x6674}, //2129 #CJK UNIFIED IDEOGRAPH + {0x90B1, 0x68F2}, //2130 #CJK UNIFIED IDEOGRAPH + {0x90B2, 0x6816}, //2131 #CJK UNIFIED IDEOGRAPH + {0x90B3, 0x6B63}, //2132 #CJK UNIFIED IDEOGRAPH + {0x90B4, 0x6E05}, //2133 #CJK UNIFIED IDEOGRAPH + {0x90B5, 0x7272}, //2134 #CJK UNIFIED IDEOGRAPH + {0x90B6, 0x751F}, //2135 #CJK UNIFIED IDEOGRAPH + {0x90B7, 0x76DB}, //2136 #CJK UNIFIED IDEOGRAPH + {0x90B8, 0x7CBE}, //2137 #CJK UNIFIED IDEOGRAPH + {0x90B9, 0x8056}, //2138 #CJK UNIFIED IDEOGRAPH + {0x90BA, 0x58F0}, //2139 #CJK UNIFIED IDEOGRAPH + {0x90BB, 0x88FD}, //2140 #CJK UNIFIED IDEOGRAPH + {0x90BC, 0x897F}, //2141 #CJK UNIFIED IDEOGRAPH + {0x90BD, 0x8AA0}, //2142 #CJK UNIFIED IDEOGRAPH + {0x90BE, 0x8A93}, //2143 #CJK UNIFIED IDEOGRAPH + {0x90BF, 0x8ACB}, //2144 #CJK UNIFIED IDEOGRAPH + {0x90C0, 0x901D}, //2145 #CJK UNIFIED IDEOGRAPH + {0x90C1, 0x9192}, //2146 #CJK UNIFIED IDEOGRAPH + {0x90C2, 0x9752}, //2147 #CJK UNIFIED IDEOGRAPH + {0x90C3, 0x9759}, //2148 #CJK UNIFIED IDEOGRAPH + {0x90C4, 0x6589}, //2149 #CJK UNIFIED IDEOGRAPH + {0x90C5, 0x7A0E}, //2150 #CJK UNIFIED IDEOGRAPH + {0x90C6, 0x8106}, //2151 #CJK UNIFIED IDEOGRAPH + {0x90C7, 0x96BB}, //2152 #CJK UNIFIED IDEOGRAPH + {0x90C8, 0x5E2D}, //2153 #CJK UNIFIED IDEOGRAPH + {0x90C9, 0x60DC}, //2154 #CJK UNIFIED IDEOGRAPH + {0x90CA, 0x621A}, //2155 #CJK UNIFIED IDEOGRAPH + {0x90CB, 0x65A5}, //2156 #CJK UNIFIED IDEOGRAPH + {0x90CC, 0x6614}, //2157 #CJK UNIFIED IDEOGRAPH + {0x90CD, 0x6790}, //2158 #CJK UNIFIED IDEOGRAPH + {0x90CE, 0x77F3}, //2159 #CJK UNIFIED IDEOGRAPH + {0x90CF, 0x7A4D}, //2160 #CJK UNIFIED IDEOGRAPH + {0x90D0, 0x7C4D}, //2161 #CJK UNIFIED IDEOGRAPH + {0x90D1, 0x7E3E}, //2162 #CJK UNIFIED IDEOGRAPH + {0x90D2, 0x810A}, //2163 #CJK UNIFIED IDEOGRAPH + {0x90D3, 0x8CAC}, //2164 #CJK UNIFIED IDEOGRAPH + {0x90D4, 0x8D64}, //2165 #CJK UNIFIED IDEOGRAPH + {0x90D5, 0x8DE1}, //2166 #CJK UNIFIED IDEOGRAPH + {0x90D6, 0x8E5F}, //2167 #CJK UNIFIED IDEOGRAPH + {0x90D7, 0x78A9}, //2168 #CJK UNIFIED IDEOGRAPH + {0x90D8, 0x5207}, //2169 #CJK UNIFIED IDEOGRAPH + {0x90D9, 0x62D9}, //2170 #CJK UNIFIED IDEOGRAPH + {0x90DA, 0x63A5}, //2171 #CJK UNIFIED IDEOGRAPH + {0x90DB, 0x6442}, //2172 #CJK UNIFIED IDEOGRAPH + {0x90DC, 0x6298}, //2173 #CJK UNIFIED IDEOGRAPH + {0x90DD, 0x8A2D}, //2174 #CJK UNIFIED IDEOGRAPH + {0x90DE, 0x7A83}, //2175 #CJK UNIFIED IDEOGRAPH + {0x90DF, 0x7BC0}, //2176 #CJK UNIFIED IDEOGRAPH + {0x90E0, 0x8AAC}, //2177 #CJK UNIFIED IDEOGRAPH + {0x90E1, 0x96EA}, //2178 #CJK UNIFIED IDEOGRAPH + {0x90E2, 0x7D76}, //2179 #CJK UNIFIED IDEOGRAPH + {0x90E3, 0x820C}, //2180 #CJK UNIFIED IDEOGRAPH + {0x90E4, 0x8749}, //2181 #CJK UNIFIED IDEOGRAPH + {0x90E5, 0x4ED9}, //2182 #CJK UNIFIED IDEOGRAPH + {0x90E6, 0x5148}, //2183 #CJK UNIFIED IDEOGRAPH + {0x90E7, 0x5343}, //2184 #CJK UNIFIED IDEOGRAPH + {0x90E8, 0x5360}, //2185 #CJK UNIFIED IDEOGRAPH + {0x90E9, 0x5BA3}, //2186 #CJK UNIFIED IDEOGRAPH + {0x90EA, 0x5C02}, //2187 #CJK UNIFIED IDEOGRAPH + {0x90EB, 0x5C16}, //2188 #CJK UNIFIED IDEOGRAPH + {0x90EC, 0x5DDD}, //2189 #CJK UNIFIED IDEOGRAPH + {0x90ED, 0x6226}, //2190 #CJK UNIFIED IDEOGRAPH + {0x90EE, 0x6247}, //2191 #CJK UNIFIED IDEOGRAPH + {0x90EF, 0x64B0}, //2192 #CJK UNIFIED IDEOGRAPH + {0x90F0, 0x6813}, //2193 #CJK UNIFIED IDEOGRAPH + {0x90F1, 0x6834}, //2194 #CJK UNIFIED IDEOGRAPH + {0x90F2, 0x6CC9}, //2195 #CJK UNIFIED IDEOGRAPH + {0x90F3, 0x6D45}, //2196 #CJK UNIFIED IDEOGRAPH + {0x90F4, 0x6D17}, //2197 #CJK UNIFIED IDEOGRAPH + {0x90F5, 0x67D3}, //2198 #CJK UNIFIED IDEOGRAPH + {0x90F6, 0x6F5C}, //2199 #CJK UNIFIED IDEOGRAPH + {0x90F7, 0x714E}, //2200 #CJK UNIFIED IDEOGRAPH + {0x90F8, 0x717D}, //2201 #CJK UNIFIED IDEOGRAPH + {0x90F9, 0x65CB}, //2202 #CJK UNIFIED IDEOGRAPH + {0x90FA, 0x7A7F}, //2203 #CJK UNIFIED IDEOGRAPH + {0x90FB, 0x7BAD}, //2204 #CJK UNIFIED IDEOGRAPH + {0x90FC, 0x7DDA}, //2205 #CJK UNIFIED IDEOGRAPH + {0x9140, 0x7E4A}, //2206 #CJK UNIFIED IDEOGRAPH + {0x9141, 0x7FA8}, //2207 #CJK UNIFIED IDEOGRAPH + {0x9142, 0x817A}, //2208 #CJK UNIFIED IDEOGRAPH + {0x9143, 0x821B}, //2209 #CJK UNIFIED IDEOGRAPH + {0x9144, 0x8239}, //2210 #CJK UNIFIED IDEOGRAPH + {0x9145, 0x85A6}, //2211 #CJK UNIFIED IDEOGRAPH + {0x9146, 0x8A6E}, //2212 #CJK UNIFIED IDEOGRAPH + {0x9147, 0x8CCE}, //2213 #CJK UNIFIED IDEOGRAPH + {0x9148, 0x8DF5}, //2214 #CJK UNIFIED IDEOGRAPH + {0x9149, 0x9078}, //2215 #CJK UNIFIED IDEOGRAPH + {0x914A, 0x9077}, //2216 #CJK UNIFIED IDEOGRAPH + {0x914B, 0x92AD}, //2217 #CJK UNIFIED IDEOGRAPH + {0x914C, 0x9291}, //2218 #CJK UNIFIED IDEOGRAPH + {0x914D, 0x9583}, //2219 #CJK UNIFIED IDEOGRAPH + {0x914E, 0x9BAE}, //2220 #CJK UNIFIED IDEOGRAPH + {0x914F, 0x524D}, //2221 #CJK UNIFIED IDEOGRAPH + {0x9150, 0x5584}, //2222 #CJK UNIFIED IDEOGRAPH + {0x9151, 0x6F38}, //2223 #CJK UNIFIED IDEOGRAPH + {0x9152, 0x7136}, //2224 #CJK UNIFIED IDEOGRAPH + {0x9153, 0x5168}, //2225 #CJK UNIFIED IDEOGRAPH + {0x9154, 0x7985}, //2226 #CJK UNIFIED IDEOGRAPH + {0x9155, 0x7E55}, //2227 #CJK UNIFIED IDEOGRAPH + {0x9156, 0x81B3}, //2228 #CJK UNIFIED IDEOGRAPH + {0x9157, 0x7CCE}, //2229 #CJK UNIFIED IDEOGRAPH + {0x9158, 0x564C}, //2230 #CJK UNIFIED IDEOGRAPH + {0x9159, 0x5851}, //2231 #CJK UNIFIED IDEOGRAPH + {0x915A, 0x5CA8}, //2232 #CJK UNIFIED IDEOGRAPH + {0x915B, 0x63AA}, //2233 #CJK UNIFIED IDEOGRAPH + {0x915C, 0x66FE}, //2234 #CJK UNIFIED IDEOGRAPH + {0x915D, 0x66FD}, //2235 #CJK UNIFIED IDEOGRAPH + {0x915E, 0x695A}, //2236 #CJK UNIFIED IDEOGRAPH + {0x915F, 0x72D9}, //2237 #CJK UNIFIED IDEOGRAPH + {0x9160, 0x758F}, //2238 #CJK UNIFIED IDEOGRAPH + {0x9161, 0x758E}, //2239 #CJK UNIFIED IDEOGRAPH + {0x9162, 0x790E}, //2240 #CJK UNIFIED IDEOGRAPH + {0x9163, 0x7956}, //2241 #CJK UNIFIED IDEOGRAPH + {0x9164, 0x79DF}, //2242 #CJK UNIFIED IDEOGRAPH + {0x9165, 0x7C97}, //2243 #CJK UNIFIED IDEOGRAPH + {0x9166, 0x7D20}, //2244 #CJK UNIFIED IDEOGRAPH + {0x9167, 0x7D44}, //2245 #CJK UNIFIED IDEOGRAPH + {0x9168, 0x8607}, //2246 #CJK UNIFIED IDEOGRAPH + {0x9169, 0x8A34}, //2247 #CJK UNIFIED IDEOGRAPH + {0x916A, 0x963B}, //2248 #CJK UNIFIED IDEOGRAPH + {0x916B, 0x9061}, //2249 #CJK UNIFIED IDEOGRAPH + {0x916C, 0x9F20}, //2250 #CJK UNIFIED IDEOGRAPH + {0x916D, 0x50E7}, //2251 #CJK UNIFIED IDEOGRAPH + {0x916E, 0x5275}, //2252 #CJK UNIFIED IDEOGRAPH + {0x916F, 0x53CC}, //2253 #CJK UNIFIED IDEOGRAPH + {0x9170, 0x53E2}, //2254 #CJK UNIFIED IDEOGRAPH + {0x9171, 0x5009}, //2255 #CJK UNIFIED IDEOGRAPH + {0x9172, 0x55AA}, //2256 #CJK UNIFIED IDEOGRAPH + {0x9173, 0x58EE}, //2257 #CJK UNIFIED IDEOGRAPH + {0x9174, 0x594F}, //2258 #CJK UNIFIED IDEOGRAPH + {0x9175, 0x723D}, //2259 #CJK UNIFIED IDEOGRAPH + {0x9176, 0x5B8B}, //2260 #CJK UNIFIED IDEOGRAPH + {0x9177, 0x5C64}, //2261 #CJK UNIFIED IDEOGRAPH + {0x9178, 0x531D}, //2262 #CJK UNIFIED IDEOGRAPH + {0x9179, 0x60E3}, //2263 #CJK UNIFIED IDEOGRAPH + {0x917A, 0x60F3}, //2264 #CJK UNIFIED IDEOGRAPH + {0x917B, 0x635C}, //2265 #CJK UNIFIED IDEOGRAPH + {0x917C, 0x6383}, //2266 #CJK UNIFIED IDEOGRAPH + {0x917D, 0x633F}, //2267 #CJK UNIFIED IDEOGRAPH + {0x917E, 0x63BB}, //2268 #CJK UNIFIED IDEOGRAPH + {0x9180, 0x64CD}, //2269 #CJK UNIFIED IDEOGRAPH + {0x9181, 0x65E9}, //2270 #CJK UNIFIED IDEOGRAPH + {0x9182, 0x66F9}, //2271 #CJK UNIFIED IDEOGRAPH + {0x9183, 0x5DE3}, //2272 #CJK UNIFIED IDEOGRAPH + {0x9184, 0x69CD}, //2273 #CJK UNIFIED IDEOGRAPH + {0x9185, 0x69FD}, //2274 #CJK UNIFIED IDEOGRAPH + {0x9186, 0x6F15}, //2275 #CJK UNIFIED IDEOGRAPH + {0x9187, 0x71E5}, //2276 #CJK UNIFIED IDEOGRAPH + {0x9188, 0x4E89}, //2277 #CJK UNIFIED IDEOGRAPH + {0x9189, 0x75E9}, //2278 #CJK UNIFIED IDEOGRAPH + {0x918A, 0x76F8}, //2279 #CJK UNIFIED IDEOGRAPH + {0x918B, 0x7A93}, //2280 #CJK UNIFIED IDEOGRAPH + {0x918C, 0x7CDF}, //2281 #CJK UNIFIED IDEOGRAPH + {0x918D, 0x7DCF}, //2282 #CJK UNIFIED IDEOGRAPH + {0x918E, 0x7D9C}, //2283 #CJK UNIFIED IDEOGRAPH + {0x918F, 0x8061}, //2284 #CJK UNIFIED IDEOGRAPH + {0x9190, 0x8349}, //2285 #CJK UNIFIED IDEOGRAPH + {0x9191, 0x8358}, //2286 #CJK UNIFIED IDEOGRAPH + {0x9192, 0x846C}, //2287 #CJK UNIFIED IDEOGRAPH + {0x9193, 0x84BC}, //2288 #CJK UNIFIED IDEOGRAPH + {0x9194, 0x85FB}, //2289 #CJK UNIFIED IDEOGRAPH + {0x9195, 0x88C5}, //2290 #CJK UNIFIED IDEOGRAPH + {0x9196, 0x8D70}, //2291 #CJK UNIFIED IDEOGRAPH + {0x9197, 0x9001}, //2292 #CJK UNIFIED IDEOGRAPH + {0x9198, 0x906D}, //2293 #CJK UNIFIED IDEOGRAPH + {0x9199, 0x9397}, //2294 #CJK UNIFIED IDEOGRAPH + {0x919A, 0x971C}, //2295 #CJK UNIFIED IDEOGRAPH + {0x919B, 0x9A12}, //2296 #CJK UNIFIED IDEOGRAPH + {0x919C, 0x50CF}, //2297 #CJK UNIFIED IDEOGRAPH + {0x919D, 0x5897}, //2298 #CJK UNIFIED IDEOGRAPH + {0x919E, 0x618E}, //2299 #CJK UNIFIED IDEOGRAPH + {0x919F, 0x81D3}, //2300 #CJK UNIFIED IDEOGRAPH + {0x91A0, 0x8535}, //2301 #CJK UNIFIED IDEOGRAPH + {0x91A1, 0x8D08}, //2302 #CJK UNIFIED IDEOGRAPH + {0x91A2, 0x9020}, //2303 #CJK UNIFIED IDEOGRAPH + {0x91A3, 0x4FC3}, //2304 #CJK UNIFIED IDEOGRAPH + {0x91A4, 0x5074}, //2305 #CJK UNIFIED IDEOGRAPH + {0x91A5, 0x5247}, //2306 #CJK UNIFIED IDEOGRAPH + {0x91A6, 0x5373}, //2307 #CJK UNIFIED IDEOGRAPH + {0x91A7, 0x606F}, //2308 #CJK UNIFIED IDEOGRAPH + {0x91A8, 0x6349}, //2309 #CJK UNIFIED IDEOGRAPH + {0x91A9, 0x675F}, //2310 #CJK UNIFIED IDEOGRAPH + {0x91AA, 0x6E2C}, //2311 #CJK UNIFIED IDEOGRAPH + {0x91AB, 0x8DB3}, //2312 #CJK UNIFIED IDEOGRAPH + {0x91AC, 0x901F}, //2313 #CJK UNIFIED IDEOGRAPH + {0x91AD, 0x4FD7}, //2314 #CJK UNIFIED IDEOGRAPH + {0x91AE, 0x5C5E}, //2315 #CJK UNIFIED IDEOGRAPH + {0x91AF, 0x8CCA}, //2316 #CJK UNIFIED IDEOGRAPH + {0x91B0, 0x65CF}, //2317 #CJK UNIFIED IDEOGRAPH + {0x91B1, 0x7D9A}, //2318 #CJK UNIFIED IDEOGRAPH + {0x91B2, 0x5352}, //2319 #CJK UNIFIED IDEOGRAPH + {0x91B3, 0x8896}, //2320 #CJK UNIFIED IDEOGRAPH + {0x91B4, 0x5176}, //2321 #CJK UNIFIED IDEOGRAPH + {0x91B5, 0x63C3}, //2322 #CJK UNIFIED IDEOGRAPH + {0x91B6, 0x5B58}, //2323 #CJK UNIFIED IDEOGRAPH + {0x91B7, 0x5B6B}, //2324 #CJK UNIFIED IDEOGRAPH + {0x91B8, 0x5C0A}, //2325 #CJK UNIFIED IDEOGRAPH + {0x91B9, 0x640D}, //2326 #CJK UNIFIED IDEOGRAPH + {0x91BA, 0x6751}, //2327 #CJK UNIFIED IDEOGRAPH + {0x91BB, 0x905C}, //2328 #CJK UNIFIED IDEOGRAPH + {0x91BC, 0x4ED6}, //2329 #CJK UNIFIED IDEOGRAPH + {0x91BD, 0x591A}, //2330 #CJK UNIFIED IDEOGRAPH + {0x91BE, 0x592A}, //2331 #CJK UNIFIED IDEOGRAPH + {0x91BF, 0x6C70}, //2332 #CJK UNIFIED IDEOGRAPH + {0x91C0, 0x8A51}, //2333 #CJK UNIFIED IDEOGRAPH + {0x91C1, 0x553E}, //2334 #CJK UNIFIED IDEOGRAPH + {0x91C2, 0x5815}, //2335 #CJK UNIFIED IDEOGRAPH + {0x91C3, 0x59A5}, //2336 #CJK UNIFIED IDEOGRAPH + {0x91C4, 0x60F0}, //2337 #CJK UNIFIED IDEOGRAPH + {0x91C5, 0x6253}, //2338 #CJK UNIFIED IDEOGRAPH + {0x91C6, 0x67C1}, //2339 #CJK UNIFIED IDEOGRAPH + {0x91C7, 0x8235}, //2340 #CJK UNIFIED IDEOGRAPH + {0x91C8, 0x6955}, //2341 #CJK UNIFIED IDEOGRAPH + {0x91C9, 0x9640}, //2342 #CJK UNIFIED IDEOGRAPH + {0x91CA, 0x99C4}, //2343 #CJK UNIFIED IDEOGRAPH + {0x91CB, 0x9A28}, //2344 #CJK UNIFIED IDEOGRAPH + {0x91CC, 0x4F53}, //2345 #CJK UNIFIED IDEOGRAPH + {0x91CD, 0x5806}, //2346 #CJK UNIFIED IDEOGRAPH + {0x91CE, 0x5BFE}, //2347 #CJK UNIFIED IDEOGRAPH + {0x91CF, 0x8010}, //2348 #CJK UNIFIED IDEOGRAPH + {0x91D0, 0x5CB1}, //2349 #CJK UNIFIED IDEOGRAPH + {0x91D1, 0x5E2F}, //2350 #CJK UNIFIED IDEOGRAPH + {0x91D2, 0x5F85}, //2351 #CJK UNIFIED IDEOGRAPH + {0x91D3, 0x6020}, //2352 #CJK UNIFIED IDEOGRAPH + {0x91D4, 0x614B}, //2353 #CJK UNIFIED IDEOGRAPH + {0x91D5, 0x6234}, //2354 #CJK UNIFIED IDEOGRAPH + {0x91D6, 0x66FF}, //2355 #CJK UNIFIED IDEOGRAPH + {0x91D7, 0x6CF0}, //2356 #CJK UNIFIED IDEOGRAPH + {0x91D8, 0x6EDE}, //2357 #CJK UNIFIED IDEOGRAPH + {0x91D9, 0x80CE}, //2358 #CJK UNIFIED IDEOGRAPH + {0x91DA, 0x817F}, //2359 #CJK UNIFIED IDEOGRAPH + {0x91DB, 0x82D4}, //2360 #CJK UNIFIED IDEOGRAPH + {0x91DC, 0x888B}, //2361 #CJK UNIFIED IDEOGRAPH + {0x91DD, 0x8CB8}, //2362 #CJK UNIFIED IDEOGRAPH + {0x91DE, 0x9000}, //2363 #CJK UNIFIED IDEOGRAPH + {0x91DF, 0x902E}, //2364 #CJK UNIFIED IDEOGRAPH + {0x91E0, 0x968A}, //2365 #CJK UNIFIED IDEOGRAPH + {0x91E1, 0x9EDB}, //2366 #CJK UNIFIED IDEOGRAPH + {0x91E2, 0x9BDB}, //2367 #CJK UNIFIED IDEOGRAPH + {0x91E3, 0x4EE3}, //2368 #CJK UNIFIED IDEOGRAPH + {0x91E4, 0x53F0}, //2369 #CJK UNIFIED IDEOGRAPH + {0x91E5, 0x5927}, //2370 #CJK UNIFIED IDEOGRAPH + {0x91E6, 0x7B2C}, //2371 #CJK UNIFIED IDEOGRAPH + {0x91E7, 0x918D}, //2372 #CJK UNIFIED IDEOGRAPH + {0x91E8, 0x984C}, //2373 #CJK UNIFIED IDEOGRAPH + {0x91E9, 0x9DF9}, //2374 #CJK UNIFIED IDEOGRAPH + {0x91EA, 0x6EDD}, //2375 #CJK UNIFIED IDEOGRAPH + {0x91EB, 0x7027}, //2376 #CJK UNIFIED IDEOGRAPH + {0x91EC, 0x5353}, //2377 #CJK UNIFIED IDEOGRAPH + {0x91ED, 0x5544}, //2378 #CJK UNIFIED IDEOGRAPH + {0x91EE, 0x5B85}, //2379 #CJK UNIFIED IDEOGRAPH + {0x91EF, 0x6258}, //2380 #CJK UNIFIED IDEOGRAPH + {0x91F0, 0x629E}, //2381 #CJK UNIFIED IDEOGRAPH + {0x91F1, 0x62D3}, //2382 #CJK UNIFIED IDEOGRAPH + {0x91F2, 0x6CA2}, //2383 #CJK UNIFIED IDEOGRAPH + {0x91F3, 0x6FEF}, //2384 #CJK UNIFIED IDEOGRAPH + {0x91F4, 0x7422}, //2385 #CJK UNIFIED IDEOGRAPH + {0x91F5, 0x8A17}, //2386 #CJK UNIFIED IDEOGRAPH + {0x91F6, 0x9438}, //2387 #CJK UNIFIED IDEOGRAPH + {0x91F7, 0x6FC1}, //2388 #CJK UNIFIED IDEOGRAPH + {0x91F8, 0x8AFE}, //2389 #CJK UNIFIED IDEOGRAPH + {0x91F9, 0x8338}, //2390 #CJK UNIFIED IDEOGRAPH + {0x91FA, 0x51E7}, //2391 #CJK UNIFIED IDEOGRAPH + {0x91FB, 0x86F8}, //2392 #CJK UNIFIED IDEOGRAPH + {0x91FC, 0x53EA}, //2393 #CJK UNIFIED IDEOGRAPH + {0x9240, 0x53E9}, //2394 #CJK UNIFIED IDEOGRAPH + {0x9241, 0x4F46}, //2395 #CJK UNIFIED IDEOGRAPH + {0x9242, 0x9054}, //2396 #CJK UNIFIED IDEOGRAPH + {0x9243, 0x8FB0}, //2397 #CJK UNIFIED IDEOGRAPH + {0x9244, 0x596A}, //2398 #CJK UNIFIED IDEOGRAPH + {0x9245, 0x8131}, //2399 #CJK UNIFIED IDEOGRAPH + {0x9246, 0x5DFD}, //2400 #CJK UNIFIED IDEOGRAPH + {0x9247, 0x7AEA}, //2401 #CJK UNIFIED IDEOGRAPH + {0x9248, 0x8FBF}, //2402 #CJK UNIFIED IDEOGRAPH + {0x9249, 0x68DA}, //2403 #CJK UNIFIED IDEOGRAPH + {0x924A, 0x8C37}, //2404 #CJK UNIFIED IDEOGRAPH + {0x924B, 0x72F8}, //2405 #CJK UNIFIED IDEOGRAPH + {0x924C, 0x9C48}, //2406 #CJK UNIFIED IDEOGRAPH + {0x924D, 0x6A3D}, //2407 #CJK UNIFIED IDEOGRAPH + {0x924E, 0x8AB0}, //2408 #CJK UNIFIED IDEOGRAPH + {0x924F, 0x4E39}, //2409 #CJK UNIFIED IDEOGRAPH + {0x9250, 0x5358}, //2410 #CJK UNIFIED IDEOGRAPH + {0x9251, 0x5606}, //2411 #CJK UNIFIED IDEOGRAPH + {0x9252, 0x5766}, //2412 #CJK UNIFIED IDEOGRAPH + {0x9253, 0x62C5}, //2413 #CJK UNIFIED IDEOGRAPH + {0x9254, 0x63A2}, //2414 #CJK UNIFIED IDEOGRAPH + {0x9255, 0x65E6}, //2415 #CJK UNIFIED IDEOGRAPH + {0x9256, 0x6B4E}, //2416 #CJK UNIFIED IDEOGRAPH + {0x9257, 0x6DE1}, //2417 #CJK UNIFIED IDEOGRAPH + {0x9258, 0x6E5B}, //2418 #CJK UNIFIED IDEOGRAPH + {0x9259, 0x70AD}, //2419 #CJK UNIFIED IDEOGRAPH + {0x925A, 0x77ED}, //2420 #CJK UNIFIED IDEOGRAPH + {0x925B, 0x7AEF}, //2421 #CJK UNIFIED IDEOGRAPH + {0x925C, 0x7BAA}, //2422 #CJK UNIFIED IDEOGRAPH + {0x925D, 0x7DBB}, //2423 #CJK UNIFIED IDEOGRAPH + {0x925E, 0x803D}, //2424 #CJK UNIFIED IDEOGRAPH + {0x925F, 0x80C6}, //2425 #CJK UNIFIED IDEOGRAPH + {0x9260, 0x86CB}, //2426 #CJK UNIFIED IDEOGRAPH + {0x9261, 0x8A95}, //2427 #CJK UNIFIED IDEOGRAPH + {0x9262, 0x935B}, //2428 #CJK UNIFIED IDEOGRAPH + {0x9263, 0x56E3}, //2429 #CJK UNIFIED IDEOGRAPH + {0x9264, 0x58C7}, //2430 #CJK UNIFIED IDEOGRAPH + {0x9265, 0x5F3E}, //2431 #CJK UNIFIED IDEOGRAPH + {0x9266, 0x65AD}, //2432 #CJK UNIFIED IDEOGRAPH + {0x9267, 0x6696}, //2433 #CJK UNIFIED IDEOGRAPH + {0x9268, 0x6A80}, //2434 #CJK UNIFIED IDEOGRAPH + {0x9269, 0x6BB5}, //2435 #CJK UNIFIED IDEOGRAPH + {0x926A, 0x7537}, //2436 #CJK UNIFIED IDEOGRAPH + {0x926B, 0x8AC7}, //2437 #CJK UNIFIED IDEOGRAPH + {0x926C, 0x5024}, //2438 #CJK UNIFIED IDEOGRAPH + {0x926D, 0x77E5}, //2439 #CJK UNIFIED IDEOGRAPH + {0x926E, 0x5730}, //2440 #CJK UNIFIED IDEOGRAPH + {0x926F, 0x5F1B}, //2441 #CJK UNIFIED IDEOGRAPH + {0x9270, 0x6065}, //2442 #CJK UNIFIED IDEOGRAPH + {0x9271, 0x667A}, //2443 #CJK UNIFIED IDEOGRAPH + {0x9272, 0x6C60}, //2444 #CJK UNIFIED IDEOGRAPH + {0x9273, 0x75F4}, //2445 #CJK UNIFIED IDEOGRAPH + {0x9274, 0x7A1A}, //2446 #CJK UNIFIED IDEOGRAPH + {0x9275, 0x7F6E}, //2447 #CJK UNIFIED IDEOGRAPH + {0x9276, 0x81F4}, //2448 #CJK UNIFIED IDEOGRAPH + {0x9277, 0x8718}, //2449 #CJK UNIFIED IDEOGRAPH + {0x9278, 0x9045}, //2450 #CJK UNIFIED IDEOGRAPH + {0x9279, 0x99B3}, //2451 #CJK UNIFIED IDEOGRAPH + {0x927A, 0x7BC9}, //2452 #CJK UNIFIED IDEOGRAPH + {0x927B, 0x755C}, //2453 #CJK UNIFIED IDEOGRAPH + {0x927C, 0x7AF9}, //2454 #CJK UNIFIED IDEOGRAPH + {0x927D, 0x7B51}, //2455 #CJK UNIFIED IDEOGRAPH + {0x927E, 0x84C4}, //2456 #CJK UNIFIED IDEOGRAPH + {0x9280, 0x9010}, //2457 #CJK UNIFIED IDEOGRAPH + {0x9281, 0x79E9}, //2458 #CJK UNIFIED IDEOGRAPH + {0x9282, 0x7A92}, //2459 #CJK UNIFIED IDEOGRAPH + {0x9283, 0x8336}, //2460 #CJK UNIFIED IDEOGRAPH + {0x9284, 0x5AE1}, //2461 #CJK UNIFIED IDEOGRAPH + {0x9285, 0x7740}, //2462 #CJK UNIFIED IDEOGRAPH + {0x9286, 0x4E2D}, //2463 #CJK UNIFIED IDEOGRAPH + {0x9287, 0x4EF2}, //2464 #CJK UNIFIED IDEOGRAPH + {0x9288, 0x5B99}, //2465 #CJK UNIFIED IDEOGRAPH + {0x9289, 0x5FE0}, //2466 #CJK UNIFIED IDEOGRAPH + {0x928A, 0x62BD}, //2467 #CJK UNIFIED IDEOGRAPH + {0x928B, 0x663C}, //2468 #CJK UNIFIED IDEOGRAPH + {0x928C, 0x67F1}, //2469 #CJK UNIFIED IDEOGRAPH + {0x928D, 0x6CE8}, //2470 #CJK UNIFIED IDEOGRAPH + {0x928E, 0x866B}, //2471 #CJK UNIFIED IDEOGRAPH + {0x928F, 0x8877}, //2472 #CJK UNIFIED IDEOGRAPH + {0x9290, 0x8A3B}, //2473 #CJK UNIFIED IDEOGRAPH + {0x9291, 0x914E}, //2474 #CJK UNIFIED IDEOGRAPH + {0x9292, 0x92F3}, //2475 #CJK UNIFIED IDEOGRAPH + {0x9293, 0x99D0}, //2476 #CJK UNIFIED IDEOGRAPH + {0x9294, 0x6A17}, //2477 #CJK UNIFIED IDEOGRAPH + {0x9295, 0x7026}, //2478 #CJK UNIFIED IDEOGRAPH + {0x9296, 0x732A}, //2479 #CJK UNIFIED IDEOGRAPH + {0x9297, 0x82E7}, //2480 #CJK UNIFIED IDEOGRAPH + {0x9298, 0x8457}, //2481 #CJK UNIFIED IDEOGRAPH + {0x9299, 0x8CAF}, //2482 #CJK UNIFIED IDEOGRAPH + {0x929A, 0x4E01}, //2483 #CJK UNIFIED IDEOGRAPH + {0x929B, 0x5146}, //2484 #CJK UNIFIED IDEOGRAPH + {0x929C, 0x51CB}, //2485 #CJK UNIFIED IDEOGRAPH + {0x929D, 0x558B}, //2486 #CJK UNIFIED IDEOGRAPH + {0x929E, 0x5BF5}, //2487 #CJK UNIFIED IDEOGRAPH + {0x929F, 0x5E16}, //2488 #CJK UNIFIED IDEOGRAPH + {0x92A0, 0x5E33}, //2489 #CJK UNIFIED IDEOGRAPH + {0x92A1, 0x5E81}, //2490 #CJK UNIFIED IDEOGRAPH + {0x92A2, 0x5F14}, //2491 #CJK UNIFIED IDEOGRAPH + {0x92A3, 0x5F35}, //2492 #CJK UNIFIED IDEOGRAPH + {0x92A4, 0x5F6B}, //2493 #CJK UNIFIED IDEOGRAPH + {0x92A5, 0x5FB4}, //2494 #CJK UNIFIED IDEOGRAPH + {0x92A6, 0x61F2}, //2495 #CJK UNIFIED IDEOGRAPH + {0x92A7, 0x6311}, //2496 #CJK UNIFIED IDEOGRAPH + {0x92A8, 0x66A2}, //2497 #CJK UNIFIED IDEOGRAPH + {0x92A9, 0x671D}, //2498 #CJK UNIFIED IDEOGRAPH + {0x92AA, 0x6F6E}, //2499 #CJK UNIFIED IDEOGRAPH + {0x92AB, 0x7252}, //2500 #CJK UNIFIED IDEOGRAPH + {0x92AC, 0x753A}, //2501 #CJK UNIFIED IDEOGRAPH + {0x92AD, 0x773A}, //2502 #CJK UNIFIED IDEOGRAPH + {0x92AE, 0x8074}, //2503 #CJK UNIFIED IDEOGRAPH + {0x92AF, 0x8139}, //2504 #CJK UNIFIED IDEOGRAPH + {0x92B0, 0x8178}, //2505 #CJK UNIFIED IDEOGRAPH + {0x92B1, 0x8776}, //2506 #CJK UNIFIED IDEOGRAPH + {0x92B2, 0x8ABF}, //2507 #CJK UNIFIED IDEOGRAPH + {0x92B3, 0x8ADC}, //2508 #CJK UNIFIED IDEOGRAPH + {0x92B4, 0x8D85}, //2509 #CJK UNIFIED IDEOGRAPH + {0x92B5, 0x8DF3}, //2510 #CJK UNIFIED IDEOGRAPH + {0x92B6, 0x929A}, //2511 #CJK UNIFIED IDEOGRAPH + {0x92B7, 0x9577}, //2512 #CJK UNIFIED IDEOGRAPH + {0x92B8, 0x9802}, //2513 #CJK UNIFIED IDEOGRAPH + {0x92B9, 0x9CE5}, //2514 #CJK UNIFIED IDEOGRAPH + {0x92BA, 0x52C5}, //2515 #CJK UNIFIED IDEOGRAPH + {0x92BB, 0x6357}, //2516 #CJK UNIFIED IDEOGRAPH + {0x92BC, 0x76F4}, //2517 #CJK UNIFIED IDEOGRAPH + {0x92BD, 0x6715}, //2518 #CJK UNIFIED IDEOGRAPH + {0x92BE, 0x6C88}, //2519 #CJK UNIFIED IDEOGRAPH + {0x92BF, 0x73CD}, //2520 #CJK UNIFIED IDEOGRAPH + {0x92C0, 0x8CC3}, //2521 #CJK UNIFIED IDEOGRAPH + {0x92C1, 0x93AE}, //2522 #CJK UNIFIED IDEOGRAPH + {0x92C2, 0x9673}, //2523 #CJK UNIFIED IDEOGRAPH + {0x92C3, 0x6D25}, //2524 #CJK UNIFIED IDEOGRAPH + {0x92C4, 0x589C}, //2525 #CJK UNIFIED IDEOGRAPH + {0x92C5, 0x690E}, //2526 #CJK UNIFIED IDEOGRAPH + {0x92C6, 0x69CC}, //2527 #CJK UNIFIED IDEOGRAPH + {0x92C7, 0x8FFD}, //2528 #CJK UNIFIED IDEOGRAPH + {0x92C8, 0x939A}, //2529 #CJK UNIFIED IDEOGRAPH + {0x92C9, 0x75DB}, //2530 #CJK UNIFIED IDEOGRAPH + {0x92CA, 0x901A}, //2531 #CJK UNIFIED IDEOGRAPH + {0x92CB, 0x585A}, //2532 #CJK UNIFIED IDEOGRAPH + {0x92CC, 0x6802}, //2533 #CJK UNIFIED IDEOGRAPH + {0x92CD, 0x63B4}, //2534 #CJK UNIFIED IDEOGRAPH + {0x92CE, 0x69FB}, //2535 #CJK UNIFIED IDEOGRAPH + {0x92CF, 0x4F43}, //2536 #CJK UNIFIED IDEOGRAPH + {0x92D0, 0x6F2C}, //2537 #CJK UNIFIED IDEOGRAPH + {0x92D1, 0x67D8}, //2538 #CJK UNIFIED IDEOGRAPH + {0x92D2, 0x8FBB}, //2539 #CJK UNIFIED IDEOGRAPH + {0x92D3, 0x8526}, //2540 #CJK UNIFIED IDEOGRAPH + {0x92D4, 0x7DB4}, //2541 #CJK UNIFIED IDEOGRAPH + {0x92D5, 0x9354}, //2542 #CJK UNIFIED IDEOGRAPH + {0x92D6, 0x693F}, //2543 #CJK UNIFIED IDEOGRAPH + {0x92D7, 0x6F70}, //2544 #CJK UNIFIED IDEOGRAPH + {0x92D8, 0x576A}, //2545 #CJK UNIFIED IDEOGRAPH + {0x92D9, 0x58F7}, //2546 #CJK UNIFIED IDEOGRAPH + {0x92DA, 0x5B2C}, //2547 #CJK UNIFIED IDEOGRAPH + {0x92DB, 0x7D2C}, //2548 #CJK UNIFIED IDEOGRAPH + {0x92DC, 0x722A}, //2549 #CJK UNIFIED IDEOGRAPH + {0x92DD, 0x540A}, //2550 #CJK UNIFIED IDEOGRAPH + {0x92DE, 0x91E3}, //2551 #CJK UNIFIED IDEOGRAPH + {0x92DF, 0x9DB4}, //2552 #CJK UNIFIED IDEOGRAPH + {0x92E0, 0x4EAD}, //2553 #CJK UNIFIED IDEOGRAPH + {0x92E1, 0x4F4E}, //2554 #CJK UNIFIED IDEOGRAPH + {0x92E2, 0x505C}, //2555 #CJK UNIFIED IDEOGRAPH + {0x92E3, 0x5075}, //2556 #CJK UNIFIED IDEOGRAPH + {0x92E4, 0x5243}, //2557 #CJK UNIFIED IDEOGRAPH + {0x92E5, 0x8C9E}, //2558 #CJK UNIFIED IDEOGRAPH + {0x92E6, 0x5448}, //2559 #CJK UNIFIED IDEOGRAPH + {0x92E7, 0x5824}, //2560 #CJK UNIFIED IDEOGRAPH + {0x92E8, 0x5B9A}, //2561 #CJK UNIFIED IDEOGRAPH + {0x92E9, 0x5E1D}, //2562 #CJK UNIFIED IDEOGRAPH + {0x92EA, 0x5E95}, //2563 #CJK UNIFIED IDEOGRAPH + {0x92EB, 0x5EAD}, //2564 #CJK UNIFIED IDEOGRAPH + {0x92EC, 0x5EF7}, //2565 #CJK UNIFIED IDEOGRAPH + {0x92ED, 0x5F1F}, //2566 #CJK UNIFIED IDEOGRAPH + {0x92EE, 0x608C}, //2567 #CJK UNIFIED IDEOGRAPH + {0x92EF, 0x62B5}, //2568 #CJK UNIFIED IDEOGRAPH + {0x92F0, 0x633A}, //2569 #CJK UNIFIED IDEOGRAPH + {0x92F1, 0x63D0}, //2570 #CJK UNIFIED IDEOGRAPH + {0x92F2, 0x68AF}, //2571 #CJK UNIFIED IDEOGRAPH + {0x92F3, 0x6C40}, //2572 #CJK UNIFIED IDEOGRAPH + {0x92F4, 0x7887}, //2573 #CJK UNIFIED IDEOGRAPH + {0x92F5, 0x798E}, //2574 #CJK UNIFIED IDEOGRAPH + {0x92F6, 0x7A0B}, //2575 #CJK UNIFIED IDEOGRAPH + {0x92F7, 0x7DE0}, //2576 #CJK UNIFIED IDEOGRAPH + {0x92F8, 0x8247}, //2577 #CJK UNIFIED IDEOGRAPH + {0x92F9, 0x8A02}, //2578 #CJK UNIFIED IDEOGRAPH + {0x92FA, 0x8AE6}, //2579 #CJK UNIFIED IDEOGRAPH + {0x92FB, 0x8E44}, //2580 #CJK UNIFIED IDEOGRAPH + {0x92FC, 0x9013}, //2581 #CJK UNIFIED IDEOGRAPH + {0x9340, 0x90B8}, //2582 #CJK UNIFIED IDEOGRAPH + {0x9341, 0x912D}, //2583 #CJK UNIFIED IDEOGRAPH + {0x9342, 0x91D8}, //2584 #CJK UNIFIED IDEOGRAPH + {0x9343, 0x9F0E}, //2585 #CJK UNIFIED IDEOGRAPH + {0x9344, 0x6CE5}, //2586 #CJK UNIFIED IDEOGRAPH + {0x9345, 0x6458}, //2587 #CJK UNIFIED IDEOGRAPH + {0x9346, 0x64E2}, //2588 #CJK UNIFIED IDEOGRAPH + {0x9347, 0x6575}, //2589 #CJK UNIFIED IDEOGRAPH + {0x9348, 0x6EF4}, //2590 #CJK UNIFIED IDEOGRAPH + {0x9349, 0x7684}, //2591 #CJK UNIFIED IDEOGRAPH + {0x934A, 0x7B1B}, //2592 #CJK UNIFIED IDEOGRAPH + {0x934B, 0x9069}, //2593 #CJK UNIFIED IDEOGRAPH + {0x934C, 0x93D1}, //2594 #CJK UNIFIED IDEOGRAPH + {0x934D, 0x6EBA}, //2595 #CJK UNIFIED IDEOGRAPH + {0x934E, 0x54F2}, //2596 #CJK UNIFIED IDEOGRAPH + {0x934F, 0x5FB9}, //2597 #CJK UNIFIED IDEOGRAPH + {0x9350, 0x64A4}, //2598 #CJK UNIFIED IDEOGRAPH + {0x9351, 0x8F4D}, //2599 #CJK UNIFIED IDEOGRAPH + {0x9352, 0x8FED}, //2600 #CJK UNIFIED IDEOGRAPH + {0x9353, 0x9244}, //2601 #CJK UNIFIED IDEOGRAPH + {0x9354, 0x5178}, //2602 #CJK UNIFIED IDEOGRAPH + {0x9355, 0x586B}, //2603 #CJK UNIFIED IDEOGRAPH + {0x9356, 0x5929}, //2604 #CJK UNIFIED IDEOGRAPH + {0x9357, 0x5C55}, //2605 #CJK UNIFIED IDEOGRAPH + {0x9358, 0x5E97}, //2606 #CJK UNIFIED IDEOGRAPH + {0x9359, 0x6DFB}, //2607 #CJK UNIFIED IDEOGRAPH + {0x935A, 0x7E8F}, //2608 #CJK UNIFIED IDEOGRAPH + {0x935B, 0x751C}, //2609 #CJK UNIFIED IDEOGRAPH + {0x935C, 0x8CBC}, //2610 #CJK UNIFIED IDEOGRAPH + {0x935D, 0x8EE2}, //2611 #CJK UNIFIED IDEOGRAPH + {0x935E, 0x985B}, //2612 #CJK UNIFIED IDEOGRAPH + {0x935F, 0x70B9}, //2613 #CJK UNIFIED IDEOGRAPH + {0x9360, 0x4F1D}, //2614 #CJK UNIFIED IDEOGRAPH + {0x9361, 0x6BBF}, //2615 #CJK UNIFIED IDEOGRAPH + {0x9362, 0x6FB1}, //2616 #CJK UNIFIED IDEOGRAPH + {0x9363, 0x7530}, //2617 #CJK UNIFIED IDEOGRAPH + {0x9364, 0x96FB}, //2618 #CJK UNIFIED IDEOGRAPH + {0x9365, 0x514E}, //2619 #CJK UNIFIED IDEOGRAPH + {0x9366, 0x5410}, //2620 #CJK UNIFIED IDEOGRAPH + {0x9367, 0x5835}, //2621 #CJK UNIFIED IDEOGRAPH + {0x9368, 0x5857}, //2622 #CJK UNIFIED IDEOGRAPH + {0x9369, 0x59AC}, //2623 #CJK UNIFIED IDEOGRAPH + {0x936A, 0x5C60}, //2624 #CJK UNIFIED IDEOGRAPH + {0x936B, 0x5F92}, //2625 #CJK UNIFIED IDEOGRAPH + {0x936C, 0x6597}, //2626 #CJK UNIFIED IDEOGRAPH + {0x936D, 0x675C}, //2627 #CJK UNIFIED IDEOGRAPH + {0x936E, 0x6E21}, //2628 #CJK UNIFIED IDEOGRAPH + {0x936F, 0x767B}, //2629 #CJK UNIFIED IDEOGRAPH + {0x9370, 0x83DF}, //2630 #CJK UNIFIED IDEOGRAPH + {0x9371, 0x8CED}, //2631 #CJK UNIFIED IDEOGRAPH + {0x9372, 0x9014}, //2632 #CJK UNIFIED IDEOGRAPH + {0x9373, 0x90FD}, //2633 #CJK UNIFIED IDEOGRAPH + {0x9374, 0x934D}, //2634 #CJK UNIFIED IDEOGRAPH + {0x9375, 0x7825}, //2635 #CJK UNIFIED IDEOGRAPH + {0x9376, 0x783A}, //2636 #CJK UNIFIED IDEOGRAPH + {0x9377, 0x52AA}, //2637 #CJK UNIFIED IDEOGRAPH + {0x9378, 0x5EA6}, //2638 #CJK UNIFIED IDEOGRAPH + {0x9379, 0x571F}, //2639 #CJK UNIFIED IDEOGRAPH + {0x937A, 0x5974}, //2640 #CJK UNIFIED IDEOGRAPH + {0x937B, 0x6012}, //2641 #CJK UNIFIED IDEOGRAPH + {0x937C, 0x5012}, //2642 #CJK UNIFIED IDEOGRAPH + {0x937D, 0x515A}, //2643 #CJK UNIFIED IDEOGRAPH + {0x937E, 0x51AC}, //2644 #CJK UNIFIED IDEOGRAPH + {0x9380, 0x51CD}, //2645 #CJK UNIFIED IDEOGRAPH + {0x9381, 0x5200}, //2646 #CJK UNIFIED IDEOGRAPH + {0x9382, 0x5510}, //2647 #CJK UNIFIED IDEOGRAPH + {0x9383, 0x5854}, //2648 #CJK UNIFIED IDEOGRAPH + {0x9384, 0x5858}, //2649 #CJK UNIFIED IDEOGRAPH + {0x9385, 0x5957}, //2650 #CJK UNIFIED IDEOGRAPH + {0x9386, 0x5B95}, //2651 #CJK UNIFIED IDEOGRAPH + {0x9387, 0x5CF6}, //2652 #CJK UNIFIED IDEOGRAPH + {0x9388, 0x5D8B}, //2653 #CJK UNIFIED IDEOGRAPH + {0x9389, 0x60BC}, //2654 #CJK UNIFIED IDEOGRAPH + {0x938A, 0x6295}, //2655 #CJK UNIFIED IDEOGRAPH + {0x938B, 0x642D}, //2656 #CJK UNIFIED IDEOGRAPH + {0x938C, 0x6771}, //2657 #CJK UNIFIED IDEOGRAPH + {0x938D, 0x6843}, //2658 #CJK UNIFIED IDEOGRAPH + {0x938E, 0x68BC}, //2659 #CJK UNIFIED IDEOGRAPH + {0x938F, 0x68DF}, //2660 #CJK UNIFIED IDEOGRAPH + {0x9390, 0x76D7}, //2661 #CJK UNIFIED IDEOGRAPH + {0x9391, 0x6DD8}, //2662 #CJK UNIFIED IDEOGRAPH + {0x9392, 0x6E6F}, //2663 #CJK UNIFIED IDEOGRAPH + {0x9393, 0x6D9B}, //2664 #CJK UNIFIED IDEOGRAPH + {0x9394, 0x706F}, //2665 #CJK UNIFIED IDEOGRAPH + {0x9395, 0x71C8}, //2666 #CJK UNIFIED IDEOGRAPH + {0x9396, 0x5F53}, //2667 #CJK UNIFIED IDEOGRAPH + {0x9397, 0x75D8}, //2668 #CJK UNIFIED IDEOGRAPH + {0x9398, 0x7977}, //2669 #CJK UNIFIED IDEOGRAPH + {0x9399, 0x7B49}, //2670 #CJK UNIFIED IDEOGRAPH + {0x939A, 0x7B54}, //2671 #CJK UNIFIED IDEOGRAPH + {0x939B, 0x7B52}, //2672 #CJK UNIFIED IDEOGRAPH + {0x939C, 0x7CD6}, //2673 #CJK UNIFIED IDEOGRAPH + {0x939D, 0x7D71}, //2674 #CJK UNIFIED IDEOGRAPH + {0x939E, 0x5230}, //2675 #CJK UNIFIED IDEOGRAPH + {0x939F, 0x8463}, //2676 #CJK UNIFIED IDEOGRAPH + {0x93A0, 0x8569}, //2677 #CJK UNIFIED IDEOGRAPH + {0x93A1, 0x85E4}, //2678 #CJK UNIFIED IDEOGRAPH + {0x93A2, 0x8A0E}, //2679 #CJK UNIFIED IDEOGRAPH + {0x93A3, 0x8B04}, //2680 #CJK UNIFIED IDEOGRAPH + {0x93A4, 0x8C46}, //2681 #CJK UNIFIED IDEOGRAPH + {0x93A5, 0x8E0F}, //2682 #CJK UNIFIED IDEOGRAPH + {0x93A6, 0x9003}, //2683 #CJK UNIFIED IDEOGRAPH + {0x93A7, 0x900F}, //2684 #CJK UNIFIED IDEOGRAPH + {0x93A8, 0x9419}, //2685 #CJK UNIFIED IDEOGRAPH + {0x93A9, 0x9676}, //2686 #CJK UNIFIED IDEOGRAPH + {0x93AA, 0x982D}, //2687 #CJK UNIFIED IDEOGRAPH + {0x93AB, 0x9A30}, //2688 #CJK UNIFIED IDEOGRAPH + {0x93AC, 0x95D8}, //2689 #CJK UNIFIED IDEOGRAPH + {0x93AD, 0x50CD}, //2690 #CJK UNIFIED IDEOGRAPH + {0x93AE, 0x52D5}, //2691 #CJK UNIFIED IDEOGRAPH + {0x93AF, 0x540C}, //2692 #CJK UNIFIED IDEOGRAPH + {0x93B0, 0x5802}, //2693 #CJK UNIFIED IDEOGRAPH + {0x93B1, 0x5C0E}, //2694 #CJK UNIFIED IDEOGRAPH + {0x93B2, 0x61A7}, //2695 #CJK UNIFIED IDEOGRAPH + {0x93B3, 0x649E}, //2696 #CJK UNIFIED IDEOGRAPH + {0x93B4, 0x6D1E}, //2697 #CJK UNIFIED IDEOGRAPH + {0x93B5, 0x77B3}, //2698 #CJK UNIFIED IDEOGRAPH + {0x93B6, 0x7AE5}, //2699 #CJK UNIFIED IDEOGRAPH + {0x93B7, 0x80F4}, //2700 #CJK UNIFIED IDEOGRAPH + {0x93B8, 0x8404}, //2701 #CJK UNIFIED IDEOGRAPH + {0x93B9, 0x9053}, //2702 #CJK UNIFIED IDEOGRAPH + {0x93BA, 0x9285}, //2703 #CJK UNIFIED IDEOGRAPH + {0x93BB, 0x5CE0}, //2704 #CJK UNIFIED IDEOGRAPH + {0x93BC, 0x9D07}, //2705 #CJK UNIFIED IDEOGRAPH + {0x93BD, 0x533F}, //2706 #CJK UNIFIED IDEOGRAPH + {0x93BE, 0x5F97}, //2707 #CJK UNIFIED IDEOGRAPH + {0x93BF, 0x5FB3}, //2708 #CJK UNIFIED IDEOGRAPH + {0x93C0, 0x6D9C}, //2709 #CJK UNIFIED IDEOGRAPH + {0x93C1, 0x7279}, //2710 #CJK UNIFIED IDEOGRAPH + {0x93C2, 0x7763}, //2711 #CJK UNIFIED IDEOGRAPH + {0x93C3, 0x79BF}, //2712 #CJK UNIFIED IDEOGRAPH + {0x93C4, 0x7BE4}, //2713 #CJK UNIFIED IDEOGRAPH + {0x93C5, 0x6BD2}, //2714 #CJK UNIFIED IDEOGRAPH + {0x93C6, 0x72EC}, //2715 #CJK UNIFIED IDEOGRAPH + {0x93C7, 0x8AAD}, //2716 #CJK UNIFIED IDEOGRAPH + {0x93C8, 0x6803}, //2717 #CJK UNIFIED IDEOGRAPH + {0x93C9, 0x6A61}, //2718 #CJK UNIFIED IDEOGRAPH + {0x93CA, 0x51F8}, //2719 #CJK UNIFIED IDEOGRAPH + {0x93CB, 0x7A81}, //2720 #CJK UNIFIED IDEOGRAPH + {0x93CC, 0x6934}, //2721 #CJK UNIFIED IDEOGRAPH + {0x93CD, 0x5C4A}, //2722 #CJK UNIFIED IDEOGRAPH + {0x93CE, 0x9CF6}, //2723 #CJK UNIFIED IDEOGRAPH + {0x93CF, 0x82EB}, //2724 #CJK UNIFIED IDEOGRAPH + {0x93D0, 0x5BC5}, //2725 #CJK UNIFIED IDEOGRAPH + {0x93D1, 0x9149}, //2726 #CJK UNIFIED IDEOGRAPH + {0x93D2, 0x701E}, //2727 #CJK UNIFIED IDEOGRAPH + {0x93D3, 0x5678}, //2728 #CJK UNIFIED IDEOGRAPH + {0x93D4, 0x5C6F}, //2729 #CJK UNIFIED IDEOGRAPH + {0x93D5, 0x60C7}, //2730 #CJK UNIFIED IDEOGRAPH + {0x93D6, 0x6566}, //2731 #CJK UNIFIED IDEOGRAPH + {0x93D7, 0x6C8C}, //2732 #CJK UNIFIED IDEOGRAPH + {0x93D8, 0x8C5A}, //2733 #CJK UNIFIED IDEOGRAPH + {0x93D9, 0x9041}, //2734 #CJK UNIFIED IDEOGRAPH + {0x93DA, 0x9813}, //2735 #CJK UNIFIED IDEOGRAPH + {0x93DB, 0x5451}, //2736 #CJK UNIFIED IDEOGRAPH + {0x93DC, 0x66C7}, //2737 #CJK UNIFIED IDEOGRAPH + {0x93DD, 0x920D}, //2738 #CJK UNIFIED IDEOGRAPH + {0x93DE, 0x5948}, //2739 #CJK UNIFIED IDEOGRAPH + {0x93DF, 0x90A3}, //2740 #CJK UNIFIED IDEOGRAPH + {0x93E0, 0x5185}, //2741 #CJK UNIFIED IDEOGRAPH + {0x93E1, 0x4E4D}, //2742 #CJK UNIFIED IDEOGRAPH + {0x93E2, 0x51EA}, //2743 #CJK UNIFIED IDEOGRAPH + {0x93E3, 0x8599}, //2744 #CJK UNIFIED IDEOGRAPH + {0x93E4, 0x8B0E}, //2745 #CJK UNIFIED IDEOGRAPH + {0x93E5, 0x7058}, //2746 #CJK UNIFIED IDEOGRAPH + {0x93E6, 0x637A}, //2747 #CJK UNIFIED IDEOGRAPH + {0x93E7, 0x934B}, //2748 #CJK UNIFIED IDEOGRAPH + {0x93E8, 0x6962}, //2749 #CJK UNIFIED IDEOGRAPH + {0x93E9, 0x99B4}, //2750 #CJK UNIFIED IDEOGRAPH + {0x93EA, 0x7E04}, //2751 #CJK UNIFIED IDEOGRAPH + {0x93EB, 0x7577}, //2752 #CJK UNIFIED IDEOGRAPH + {0x93EC, 0x5357}, //2753 #CJK UNIFIED IDEOGRAPH + {0x93ED, 0x6960}, //2754 #CJK UNIFIED IDEOGRAPH + {0x93EE, 0x8EDF}, //2755 #CJK UNIFIED IDEOGRAPH + {0x93EF, 0x96E3}, //2756 #CJK UNIFIED IDEOGRAPH + {0x93F0, 0x6C5D}, //2757 #CJK UNIFIED IDEOGRAPH + {0x93F1, 0x4E8C}, //2758 #CJK UNIFIED IDEOGRAPH + {0x93F2, 0x5C3C}, //2759 #CJK UNIFIED IDEOGRAPH + {0x93F3, 0x5F10}, //2760 #CJK UNIFIED IDEOGRAPH + {0x93F4, 0x8FE9}, //2761 #CJK UNIFIED IDEOGRAPH + {0x93F5, 0x5302}, //2762 #CJK UNIFIED IDEOGRAPH + {0x93F6, 0x8CD1}, //2763 #CJK UNIFIED IDEOGRAPH + {0x93F7, 0x8089}, //2764 #CJK UNIFIED IDEOGRAPH + {0x93F8, 0x8679}, //2765 #CJK UNIFIED IDEOGRAPH + {0x93F9, 0x5EFF}, //2766 #CJK UNIFIED IDEOGRAPH + {0x93FA, 0x65E5}, //2767 #CJK UNIFIED IDEOGRAPH + {0x93FB, 0x4E73}, //2768 #CJK UNIFIED IDEOGRAPH + {0x93FC, 0x5165}, //2769 #CJK UNIFIED IDEOGRAPH + {0x9440, 0x5982}, //2770 #CJK UNIFIED IDEOGRAPH + {0x9441, 0x5C3F}, //2771 #CJK UNIFIED IDEOGRAPH + {0x9442, 0x97EE}, //2772 #CJK UNIFIED IDEOGRAPH + {0x9443, 0x4EFB}, //2773 #CJK UNIFIED IDEOGRAPH + {0x9444, 0x598A}, //2774 #CJK UNIFIED IDEOGRAPH + {0x9445, 0x5FCD}, //2775 #CJK UNIFIED IDEOGRAPH + {0x9446, 0x8A8D}, //2776 #CJK UNIFIED IDEOGRAPH + {0x9447, 0x6FE1}, //2777 #CJK UNIFIED IDEOGRAPH + {0x9448, 0x79B0}, //2778 #CJK UNIFIED IDEOGRAPH + {0x9449, 0x7962}, //2779 #CJK UNIFIED IDEOGRAPH + {0x944A, 0x5BE7}, //2780 #CJK UNIFIED IDEOGRAPH + {0x944B, 0x8471}, //2781 #CJK UNIFIED IDEOGRAPH + {0x944C, 0x732B}, //2782 #CJK UNIFIED IDEOGRAPH + {0x944D, 0x71B1}, //2783 #CJK UNIFIED IDEOGRAPH + {0x944E, 0x5E74}, //2784 #CJK UNIFIED IDEOGRAPH + {0x944F, 0x5FF5}, //2785 #CJK UNIFIED IDEOGRAPH + {0x9450, 0x637B}, //2786 #CJK UNIFIED IDEOGRAPH + {0x9451, 0x649A}, //2787 #CJK UNIFIED IDEOGRAPH + {0x9452, 0x71C3}, //2788 #CJK UNIFIED IDEOGRAPH + {0x9453, 0x7C98}, //2789 #CJK UNIFIED IDEOGRAPH + {0x9454, 0x4E43}, //2790 #CJK UNIFIED IDEOGRAPH + {0x9455, 0x5EFC}, //2791 #CJK UNIFIED IDEOGRAPH + {0x9456, 0x4E4B}, //2792 #CJK UNIFIED IDEOGRAPH + {0x9457, 0x57DC}, //2793 #CJK UNIFIED IDEOGRAPH + {0x9458, 0x56A2}, //2794 #CJK UNIFIED IDEOGRAPH + {0x9459, 0x60A9}, //2795 #CJK UNIFIED IDEOGRAPH + {0x945A, 0x6FC3}, //2796 #CJK UNIFIED IDEOGRAPH + {0x945B, 0x7D0D}, //2797 #CJK UNIFIED IDEOGRAPH + {0x945C, 0x80FD}, //2798 #CJK UNIFIED IDEOGRAPH + {0x945D, 0x8133}, //2799 #CJK UNIFIED IDEOGRAPH + {0x945E, 0x81BF}, //2800 #CJK UNIFIED IDEOGRAPH + {0x945F, 0x8FB2}, //2801 #CJK UNIFIED IDEOGRAPH + {0x9460, 0x8997}, //2802 #CJK UNIFIED IDEOGRAPH + {0x9461, 0x86A4}, //2803 #CJK UNIFIED IDEOGRAPH + {0x9462, 0x5DF4}, //2804 #CJK UNIFIED IDEOGRAPH + {0x9463, 0x628A}, //2805 #CJK UNIFIED IDEOGRAPH + {0x9464, 0x64AD}, //2806 #CJK UNIFIED IDEOGRAPH + {0x9465, 0x8987}, //2807 #CJK UNIFIED IDEOGRAPH + {0x9466, 0x6777}, //2808 #CJK UNIFIED IDEOGRAPH + {0x9467, 0x6CE2}, //2809 #CJK UNIFIED IDEOGRAPH + {0x9468, 0x6D3E}, //2810 #CJK UNIFIED IDEOGRAPH + {0x9469, 0x7436}, //2811 #CJK UNIFIED IDEOGRAPH + {0x946A, 0x7834}, //2812 #CJK UNIFIED IDEOGRAPH + {0x946B, 0x5A46}, //2813 #CJK UNIFIED IDEOGRAPH + {0x946C, 0x7F75}, //2814 #CJK UNIFIED IDEOGRAPH + {0x946D, 0x82AD}, //2815 #CJK UNIFIED IDEOGRAPH + {0x946E, 0x99AC}, //2816 #CJK UNIFIED IDEOGRAPH + {0x946F, 0x4FF3}, //2817 #CJK UNIFIED IDEOGRAPH + {0x9470, 0x5EC3}, //2818 #CJK UNIFIED IDEOGRAPH + {0x9471, 0x62DD}, //2819 #CJK UNIFIED IDEOGRAPH + {0x9472, 0x6392}, //2820 #CJK UNIFIED IDEOGRAPH + {0x9473, 0x6557}, //2821 #CJK UNIFIED IDEOGRAPH + {0x9474, 0x676F}, //2822 #CJK UNIFIED IDEOGRAPH + {0x9475, 0x76C3}, //2823 #CJK UNIFIED IDEOGRAPH + {0x9476, 0x724C}, //2824 #CJK UNIFIED IDEOGRAPH + {0x9477, 0x80CC}, //2825 #CJK UNIFIED IDEOGRAPH + {0x9478, 0x80BA}, //2826 #CJK UNIFIED IDEOGRAPH + {0x9479, 0x8F29}, //2827 #CJK UNIFIED IDEOGRAPH + {0x947A, 0x914D}, //2828 #CJK UNIFIED IDEOGRAPH + {0x947B, 0x500D}, //2829 #CJK UNIFIED IDEOGRAPH + {0x947C, 0x57F9}, //2830 #CJK UNIFIED IDEOGRAPH + {0x947D, 0x5A92}, //2831 #CJK UNIFIED IDEOGRAPH + {0x947E, 0x6885}, //2832 #CJK UNIFIED IDEOGRAPH + {0x9480, 0x6973}, //2833 #CJK UNIFIED IDEOGRAPH + {0x9481, 0x7164}, //2834 #CJK UNIFIED IDEOGRAPH + {0x9482, 0x72FD}, //2835 #CJK UNIFIED IDEOGRAPH + {0x9483, 0x8CB7}, //2836 #CJK UNIFIED IDEOGRAPH + {0x9484, 0x58F2}, //2837 #CJK UNIFIED IDEOGRAPH + {0x9485, 0x8CE0}, //2838 #CJK UNIFIED IDEOGRAPH + {0x9486, 0x966A}, //2839 #CJK UNIFIED IDEOGRAPH + {0x9487, 0x9019}, //2840 #CJK UNIFIED IDEOGRAPH + {0x9488, 0x877F}, //2841 #CJK UNIFIED IDEOGRAPH + {0x9489, 0x79E4}, //2842 #CJK UNIFIED IDEOGRAPH + {0x948A, 0x77E7}, //2843 #CJK UNIFIED IDEOGRAPH + {0x948B, 0x8429}, //2844 #CJK UNIFIED IDEOGRAPH + {0x948C, 0x4F2F}, //2845 #CJK UNIFIED IDEOGRAPH + {0x948D, 0x5265}, //2846 #CJK UNIFIED IDEOGRAPH + {0x948E, 0x535A}, //2847 #CJK UNIFIED IDEOGRAPH + {0x948F, 0x62CD}, //2848 #CJK UNIFIED IDEOGRAPH + {0x9490, 0x67CF}, //2849 #CJK UNIFIED IDEOGRAPH + {0x9491, 0x6CCA}, //2850 #CJK UNIFIED IDEOGRAPH + {0x9492, 0x767D}, //2851 #CJK UNIFIED IDEOGRAPH + {0x9493, 0x7B94}, //2852 #CJK UNIFIED IDEOGRAPH + {0x9494, 0x7C95}, //2853 #CJK UNIFIED IDEOGRAPH + {0x9495, 0x8236}, //2854 #CJK UNIFIED IDEOGRAPH + {0x9496, 0x8584}, //2855 #CJK UNIFIED IDEOGRAPH + {0x9497, 0x8FEB}, //2856 #CJK UNIFIED IDEOGRAPH + {0x9498, 0x66DD}, //2857 #CJK UNIFIED IDEOGRAPH + {0x9499, 0x6F20}, //2858 #CJK UNIFIED IDEOGRAPH + {0x949A, 0x7206}, //2859 #CJK UNIFIED IDEOGRAPH + {0x949B, 0x7E1B}, //2860 #CJK UNIFIED IDEOGRAPH + {0x949C, 0x83AB}, //2861 #CJK UNIFIED IDEOGRAPH + {0x949D, 0x99C1}, //2862 #CJK UNIFIED IDEOGRAPH + {0x949E, 0x9EA6}, //2863 #CJK UNIFIED IDEOGRAPH + {0x949F, 0x51FD}, //2864 #CJK UNIFIED IDEOGRAPH + {0x94A0, 0x7BB1}, //2865 #CJK UNIFIED IDEOGRAPH + {0x94A1, 0x7872}, //2866 #CJK UNIFIED IDEOGRAPH + {0x94A2, 0x7BB8}, //2867 #CJK UNIFIED IDEOGRAPH + {0x94A3, 0x8087}, //2868 #CJK UNIFIED IDEOGRAPH + {0x94A4, 0x7B48}, //2869 #CJK UNIFIED IDEOGRAPH + {0x94A5, 0x6AE8}, //2870 #CJK UNIFIED IDEOGRAPH + {0x94A6, 0x5E61}, //2871 #CJK UNIFIED IDEOGRAPH + {0x94A7, 0x808C}, //2872 #CJK UNIFIED IDEOGRAPH + {0x94A8, 0x7551}, //2873 #CJK UNIFIED IDEOGRAPH + {0x94A9, 0x7560}, //2874 #CJK UNIFIED IDEOGRAPH + {0x94AA, 0x516B}, //2875 #CJK UNIFIED IDEOGRAPH + {0x94AB, 0x9262}, //2876 #CJK UNIFIED IDEOGRAPH + {0x94AC, 0x6E8C}, //2877 #CJK UNIFIED IDEOGRAPH + {0x94AD, 0x767A}, //2878 #CJK UNIFIED IDEOGRAPH + {0x94AE, 0x9197}, //2879 #CJK UNIFIED IDEOGRAPH + {0x94AF, 0x9AEA}, //2880 #CJK UNIFIED IDEOGRAPH + {0x94B0, 0x4F10}, //2881 #CJK UNIFIED IDEOGRAPH + {0x94B1, 0x7F70}, //2882 #CJK UNIFIED IDEOGRAPH + {0x94B2, 0x629C}, //2883 #CJK UNIFIED IDEOGRAPH + {0x94B3, 0x7B4F}, //2884 #CJK UNIFIED IDEOGRAPH + {0x94B4, 0x95A5}, //2885 #CJK UNIFIED IDEOGRAPH + {0x94B5, 0x9CE9}, //2886 #CJK UNIFIED IDEOGRAPH + {0x94B6, 0x567A}, //2887 #CJK UNIFIED IDEOGRAPH + {0x94B7, 0x5859}, //2888 #CJK UNIFIED IDEOGRAPH + {0x94B8, 0x86E4}, //2889 #CJK UNIFIED IDEOGRAPH + {0x94B9, 0x96BC}, //2890 #CJK UNIFIED IDEOGRAPH + {0x94BA, 0x4F34}, //2891 #CJK UNIFIED IDEOGRAPH + {0x94BB, 0x5224}, //2892 #CJK UNIFIED IDEOGRAPH + {0x94BC, 0x534A}, //2893 #CJK UNIFIED IDEOGRAPH + {0x94BD, 0x53CD}, //2894 #CJK UNIFIED IDEOGRAPH + {0x94BE, 0x53DB}, //2895 #CJK UNIFIED IDEOGRAPH + {0x94BF, 0x5E06}, //2896 #CJK UNIFIED IDEOGRAPH + {0x94C0, 0x642C}, //2897 #CJK UNIFIED IDEOGRAPH + {0x94C1, 0x6591}, //2898 #CJK UNIFIED IDEOGRAPH + {0x94C2, 0x677F}, //2899 #CJK UNIFIED IDEOGRAPH + {0x94C3, 0x6C3E}, //2900 #CJK UNIFIED IDEOGRAPH + {0x94C4, 0x6C4E}, //2901 #CJK UNIFIED IDEOGRAPH + {0x94C5, 0x7248}, //2902 #CJK UNIFIED IDEOGRAPH + {0x94C6, 0x72AF}, //2903 #CJK UNIFIED IDEOGRAPH + {0x94C7, 0x73ED}, //2904 #CJK UNIFIED IDEOGRAPH + {0x94C8, 0x7554}, //2905 #CJK UNIFIED IDEOGRAPH + {0x94C9, 0x7E41}, //2906 #CJK UNIFIED IDEOGRAPH + {0x94CA, 0x822C}, //2907 #CJK UNIFIED IDEOGRAPH + {0x94CB, 0x85E9}, //2908 #CJK UNIFIED IDEOGRAPH + {0x94CC, 0x8CA9}, //2909 #CJK UNIFIED IDEOGRAPH + {0x94CD, 0x7BC4}, //2910 #CJK UNIFIED IDEOGRAPH + {0x94CE, 0x91C6}, //2911 #CJK UNIFIED IDEOGRAPH + {0x94CF, 0x7169}, //2912 #CJK UNIFIED IDEOGRAPH + {0x94D0, 0x9812}, //2913 #CJK UNIFIED IDEOGRAPH + {0x94D1, 0x98EF}, //2914 #CJK UNIFIED IDEOGRAPH + {0x94D2, 0x633D}, //2915 #CJK UNIFIED IDEOGRAPH + {0x94D3, 0x6669}, //2916 #CJK UNIFIED IDEOGRAPH + {0x94D4, 0x756A}, //2917 #CJK UNIFIED IDEOGRAPH + {0x94D5, 0x76E4}, //2918 #CJK UNIFIED IDEOGRAPH + {0x94D6, 0x78D0}, //2919 #CJK UNIFIED IDEOGRAPH + {0x94D7, 0x8543}, //2920 #CJK UNIFIED IDEOGRAPH + {0x94D8, 0x86EE}, //2921 #CJK UNIFIED IDEOGRAPH + {0x94D9, 0x532A}, //2922 #CJK UNIFIED IDEOGRAPH + {0x94DA, 0x5351}, //2923 #CJK UNIFIED IDEOGRAPH + {0x94DB, 0x5426}, //2924 #CJK UNIFIED IDEOGRAPH + {0x94DC, 0x5983}, //2925 #CJK UNIFIED IDEOGRAPH + {0x94DD, 0x5E87}, //2926 #CJK UNIFIED IDEOGRAPH + {0x94DE, 0x5F7C}, //2927 #CJK UNIFIED IDEOGRAPH + {0x94DF, 0x60B2}, //2928 #CJK UNIFIED IDEOGRAPH + {0x94E0, 0x6249}, //2929 #CJK UNIFIED IDEOGRAPH + {0x94E1, 0x6279}, //2930 #CJK UNIFIED IDEOGRAPH + {0x94E2, 0x62AB}, //2931 #CJK UNIFIED IDEOGRAPH + {0x94E3, 0x6590}, //2932 #CJK UNIFIED IDEOGRAPH + {0x94E4, 0x6BD4}, //2933 #CJK UNIFIED IDEOGRAPH + {0x94E5, 0x6CCC}, //2934 #CJK UNIFIED IDEOGRAPH + {0x94E6, 0x75B2}, //2935 #CJK UNIFIED IDEOGRAPH + {0x94E7, 0x76AE}, //2936 #CJK UNIFIED IDEOGRAPH + {0x94E8, 0x7891}, //2937 #CJK UNIFIED IDEOGRAPH + {0x94E9, 0x79D8}, //2938 #CJK UNIFIED IDEOGRAPH + {0x94EA, 0x7DCB}, //2939 #CJK UNIFIED IDEOGRAPH + {0x94EB, 0x7F77}, //2940 #CJK UNIFIED IDEOGRAPH + {0x94EC, 0x80A5}, //2941 #CJK UNIFIED IDEOGRAPH + {0x94ED, 0x88AB}, //2942 #CJK UNIFIED IDEOGRAPH + {0x94EE, 0x8AB9}, //2943 #CJK UNIFIED IDEOGRAPH + {0x94EF, 0x8CBB}, //2944 #CJK UNIFIED IDEOGRAPH + {0x94F0, 0x907F}, //2945 #CJK UNIFIED IDEOGRAPH + {0x94F1, 0x975E}, //2946 #CJK UNIFIED IDEOGRAPH + {0x94F2, 0x98DB}, //2947 #CJK UNIFIED IDEOGRAPH + {0x94F3, 0x6A0B}, //2948 #CJK UNIFIED IDEOGRAPH + {0x94F4, 0x7C38}, //2949 #CJK UNIFIED IDEOGRAPH + {0x94F5, 0x5099}, //2950 #CJK UNIFIED IDEOGRAPH + {0x94F6, 0x5C3E}, //2951 #CJK UNIFIED IDEOGRAPH + {0x94F7, 0x5FAE}, //2952 #CJK UNIFIED IDEOGRAPH + {0x94F8, 0x6787}, //2953 #CJK UNIFIED IDEOGRAPH + {0x94F9, 0x6BD8}, //2954 #CJK UNIFIED IDEOGRAPH + {0x94FA, 0x7435}, //2955 #CJK UNIFIED IDEOGRAPH + {0x94FB, 0x7709}, //2956 #CJK UNIFIED IDEOGRAPH + {0x94FC, 0x7F8E}, //2957 #CJK UNIFIED IDEOGRAPH + {0x9540, 0x9F3B}, //2958 #CJK UNIFIED IDEOGRAPH + {0x9541, 0x67CA}, //2959 #CJK UNIFIED IDEOGRAPH + {0x9542, 0x7A17}, //2960 #CJK UNIFIED IDEOGRAPH + {0x9543, 0x5339}, //2961 #CJK UNIFIED IDEOGRAPH + {0x9544, 0x758B}, //2962 #CJK UNIFIED IDEOGRAPH + {0x9545, 0x9AED}, //2963 #CJK UNIFIED IDEOGRAPH + {0x9546, 0x5F66}, //2964 #CJK UNIFIED IDEOGRAPH + {0x9547, 0x819D}, //2965 #CJK UNIFIED IDEOGRAPH + {0x9548, 0x83F1}, //2966 #CJK UNIFIED IDEOGRAPH + {0x9549, 0x8098}, //2967 #CJK UNIFIED IDEOGRAPH + {0x954A, 0x5F3C}, //2968 #CJK UNIFIED IDEOGRAPH + {0x954B, 0x5FC5}, //2969 #CJK UNIFIED IDEOGRAPH + {0x954C, 0x7562}, //2970 #CJK UNIFIED IDEOGRAPH + {0x954D, 0x7B46}, //2971 #CJK UNIFIED IDEOGRAPH + {0x954E, 0x903C}, //2972 #CJK UNIFIED IDEOGRAPH + {0x954F, 0x6867}, //2973 #CJK UNIFIED IDEOGRAPH + {0x9550, 0x59EB}, //2974 #CJK UNIFIED IDEOGRAPH + {0x9551, 0x5A9B}, //2975 #CJK UNIFIED IDEOGRAPH + {0x9552, 0x7D10}, //2976 #CJK UNIFIED IDEOGRAPH + {0x9553, 0x767E}, //2977 #CJK UNIFIED IDEOGRAPH + {0x9554, 0x8B2C}, //2978 #CJK UNIFIED IDEOGRAPH + {0x9555, 0x4FF5}, //2979 #CJK UNIFIED IDEOGRAPH + {0x9556, 0x5F6A}, //2980 #CJK UNIFIED IDEOGRAPH + {0x9557, 0x6A19}, //2981 #CJK UNIFIED IDEOGRAPH + {0x9558, 0x6C37}, //2982 #CJK UNIFIED IDEOGRAPH + {0x9559, 0x6F02}, //2983 #CJK UNIFIED IDEOGRAPH + {0x955A, 0x74E2}, //2984 #CJK UNIFIED IDEOGRAPH + {0x955B, 0x7968}, //2985 #CJK UNIFIED IDEOGRAPH + {0x955C, 0x8868}, //2986 #CJK UNIFIED IDEOGRAPH + {0x955D, 0x8A55}, //2987 #CJK UNIFIED IDEOGRAPH + {0x955E, 0x8C79}, //2988 #CJK UNIFIED IDEOGRAPH + {0x955F, 0x5EDF}, //2989 #CJK UNIFIED IDEOGRAPH + {0x9560, 0x63CF}, //2990 #CJK UNIFIED IDEOGRAPH + {0x9561, 0x75C5}, //2991 #CJK UNIFIED IDEOGRAPH + {0x9562, 0x79D2}, //2992 #CJK UNIFIED IDEOGRAPH + {0x9563, 0x82D7}, //2993 #CJK UNIFIED IDEOGRAPH + {0x9564, 0x9328}, //2994 #CJK UNIFIED IDEOGRAPH + {0x9565, 0x92F2}, //2995 #CJK UNIFIED IDEOGRAPH + {0x9566, 0x849C}, //2996 #CJK UNIFIED IDEOGRAPH + {0x9567, 0x86ED}, //2997 #CJK UNIFIED IDEOGRAPH + {0x9568, 0x9C2D}, //2998 #CJK UNIFIED IDEOGRAPH + {0x9569, 0x54C1}, //2999 #CJK UNIFIED IDEOGRAPH + {0x956A, 0x5F6C}, //3000 #CJK UNIFIED IDEOGRAPH + {0x956B, 0x658C}, //3001 #CJK UNIFIED IDEOGRAPH + {0x956C, 0x6D5C}, //3002 #CJK UNIFIED IDEOGRAPH + {0x956D, 0x7015}, //3003 #CJK UNIFIED IDEOGRAPH + {0x956E, 0x8CA7}, //3004 #CJK UNIFIED IDEOGRAPH + {0x956F, 0x8CD3}, //3005 #CJK UNIFIED IDEOGRAPH + {0x9570, 0x983B}, //3006 #CJK UNIFIED IDEOGRAPH + {0x9571, 0x654F}, //3007 #CJK UNIFIED IDEOGRAPH + {0x9572, 0x74F6}, //3008 #CJK UNIFIED IDEOGRAPH + {0x9573, 0x4E0D}, //3009 #CJK UNIFIED IDEOGRAPH + {0x9574, 0x4ED8}, //3010 #CJK UNIFIED IDEOGRAPH + {0x9575, 0x57E0}, //3011 #CJK UNIFIED IDEOGRAPH + {0x9576, 0x592B}, //3012 #CJK UNIFIED IDEOGRAPH + {0x9577, 0x5A66}, //3013 #CJK UNIFIED IDEOGRAPH + {0x9578, 0x5BCC}, //3014 #CJK UNIFIED IDEOGRAPH + {0x9579, 0x51A8}, //3015 #CJK UNIFIED IDEOGRAPH + {0x957A, 0x5E03}, //3016 #CJK UNIFIED IDEOGRAPH + {0x957B, 0x5E9C}, //3017 #CJK UNIFIED IDEOGRAPH + {0x957C, 0x6016}, //3018 #CJK UNIFIED IDEOGRAPH + {0x957D, 0x6276}, //3019 #CJK UNIFIED IDEOGRAPH + {0x957E, 0x6577}, //3020 #CJK UNIFIED IDEOGRAPH + {0x9580, 0x65A7}, //3021 #CJK UNIFIED IDEOGRAPH + {0x9581, 0x666E}, //3022 #CJK UNIFIED IDEOGRAPH + {0x9582, 0x6D6E}, //3023 #CJK UNIFIED IDEOGRAPH + {0x9583, 0x7236}, //3024 #CJK UNIFIED IDEOGRAPH + {0x9584, 0x7B26}, //3025 #CJK UNIFIED IDEOGRAPH + {0x9585, 0x8150}, //3026 #CJK UNIFIED IDEOGRAPH + {0x9586, 0x819A}, //3027 #CJK UNIFIED IDEOGRAPH + {0x9587, 0x8299}, //3028 #CJK UNIFIED IDEOGRAPH + {0x9588, 0x8B5C}, //3029 #CJK UNIFIED IDEOGRAPH + {0x9589, 0x8CA0}, //3030 #CJK UNIFIED IDEOGRAPH + {0x958A, 0x8CE6}, //3031 #CJK UNIFIED IDEOGRAPH + {0x958B, 0x8D74}, //3032 #CJK UNIFIED IDEOGRAPH + {0x958C, 0x961C}, //3033 #CJK UNIFIED IDEOGRAPH + {0x958D, 0x9644}, //3034 #CJK UNIFIED IDEOGRAPH + {0x958E, 0x4FAE}, //3035 #CJK UNIFIED IDEOGRAPH + {0x958F, 0x64AB}, //3036 #CJK UNIFIED IDEOGRAPH + {0x9590, 0x6B66}, //3037 #CJK UNIFIED IDEOGRAPH + {0x9591, 0x821E}, //3038 #CJK UNIFIED IDEOGRAPH + {0x9592, 0x8461}, //3039 #CJK UNIFIED IDEOGRAPH + {0x9593, 0x856A}, //3040 #CJK UNIFIED IDEOGRAPH + {0x9594, 0x90E8}, //3041 #CJK UNIFIED IDEOGRAPH + {0x9595, 0x5C01}, //3042 #CJK UNIFIED IDEOGRAPH + {0x9596, 0x6953}, //3043 #CJK UNIFIED IDEOGRAPH + {0x9597, 0x98A8}, //3044 #CJK UNIFIED IDEOGRAPH + {0x9598, 0x847A}, //3045 #CJK UNIFIED IDEOGRAPH + {0x9599, 0x8557}, //3046 #CJK UNIFIED IDEOGRAPH + {0x959A, 0x4F0F}, //3047 #CJK UNIFIED IDEOGRAPH + {0x959B, 0x526F}, //3048 #CJK UNIFIED IDEOGRAPH + {0x959C, 0x5FA9}, //3049 #CJK UNIFIED IDEOGRAPH + {0x959D, 0x5E45}, //3050 #CJK UNIFIED IDEOGRAPH + {0x959E, 0x670D}, //3051 #CJK UNIFIED IDEOGRAPH + {0x959F, 0x798F}, //3052 #CJK UNIFIED IDEOGRAPH + {0x95A0, 0x8179}, //3053 #CJK UNIFIED IDEOGRAPH + {0x95A1, 0x8907}, //3054 #CJK UNIFIED IDEOGRAPH + {0x95A2, 0x8986}, //3055 #CJK UNIFIED IDEOGRAPH + {0x95A3, 0x6DF5}, //3056 #CJK UNIFIED IDEOGRAPH + {0x95A4, 0x5F17}, //3057 #CJK UNIFIED IDEOGRAPH + {0x95A5, 0x6255}, //3058 #CJK UNIFIED IDEOGRAPH + {0x95A6, 0x6CB8}, //3059 #CJK UNIFIED IDEOGRAPH + {0x95A7, 0x4ECF}, //3060 #CJK UNIFIED IDEOGRAPH + {0x95A8, 0x7269}, //3061 #CJK UNIFIED IDEOGRAPH + {0x95A9, 0x9B92}, //3062 #CJK UNIFIED IDEOGRAPH + {0x95AA, 0x5206}, //3063 #CJK UNIFIED IDEOGRAPH + {0x95AB, 0x543B}, //3064 #CJK UNIFIED IDEOGRAPH + {0x95AC, 0x5674}, //3065 #CJK UNIFIED IDEOGRAPH + {0x95AD, 0x58B3}, //3066 #CJK UNIFIED IDEOGRAPH + {0x95AE, 0x61A4}, //3067 #CJK UNIFIED IDEOGRAPH + {0x95AF, 0x626E}, //3068 #CJK UNIFIED IDEOGRAPH + {0x95B0, 0x711A}, //3069 #CJK UNIFIED IDEOGRAPH + {0x95B1, 0x596E}, //3070 #CJK UNIFIED IDEOGRAPH + {0x95B2, 0x7C89}, //3071 #CJK UNIFIED IDEOGRAPH + {0x95B3, 0x7CDE}, //3072 #CJK UNIFIED IDEOGRAPH + {0x95B4, 0x7D1B}, //3073 #CJK UNIFIED IDEOGRAPH + {0x95B5, 0x96F0}, //3074 #CJK UNIFIED IDEOGRAPH + {0x95B6, 0x6587}, //3075 #CJK UNIFIED IDEOGRAPH + {0x95B7, 0x805E}, //3076 #CJK UNIFIED IDEOGRAPH + {0x95B8, 0x4E19}, //3077 #CJK UNIFIED IDEOGRAPH + {0x95B9, 0x4F75}, //3078 #CJK UNIFIED IDEOGRAPH + {0x95BA, 0x5175}, //3079 #CJK UNIFIED IDEOGRAPH + {0x95BB, 0x5840}, //3080 #CJK UNIFIED IDEOGRAPH + {0x95BC, 0x5E63}, //3081 #CJK UNIFIED IDEOGRAPH + {0x95BD, 0x5E73}, //3082 #CJK UNIFIED IDEOGRAPH + {0x95BE, 0x5F0A}, //3083 #CJK UNIFIED IDEOGRAPH + {0x95BF, 0x67C4}, //3084 #CJK UNIFIED IDEOGRAPH + {0x95C0, 0x4E26}, //3085 #CJK UNIFIED IDEOGRAPH + {0x95C1, 0x853D}, //3086 #CJK UNIFIED IDEOGRAPH + {0x95C2, 0x9589}, //3087 #CJK UNIFIED IDEOGRAPH + {0x95C3, 0x965B}, //3088 #CJK UNIFIED IDEOGRAPH + {0x95C4, 0x7C73}, //3089 #CJK UNIFIED IDEOGRAPH + {0x95C5, 0x9801}, //3090 #CJK UNIFIED IDEOGRAPH + {0x95C6, 0x50FB}, //3091 #CJK UNIFIED IDEOGRAPH + {0x95C7, 0x58C1}, //3092 #CJK UNIFIED IDEOGRAPH + {0x95C8, 0x7656}, //3093 #CJK UNIFIED IDEOGRAPH + {0x95C9, 0x78A7}, //3094 #CJK UNIFIED IDEOGRAPH + {0x95CA, 0x5225}, //3095 #CJK UNIFIED IDEOGRAPH + {0x95CB, 0x77A5}, //3096 #CJK UNIFIED IDEOGRAPH + {0x95CC, 0x8511}, //3097 #CJK UNIFIED IDEOGRAPH + {0x95CD, 0x7B86}, //3098 #CJK UNIFIED IDEOGRAPH + {0x95CE, 0x504F}, //3099 #CJK UNIFIED IDEOGRAPH + {0x95CF, 0x5909}, //3100 #CJK UNIFIED IDEOGRAPH + {0x95D0, 0x7247}, //3101 #CJK UNIFIED IDEOGRAPH + {0x95D1, 0x7BC7}, //3102 #CJK UNIFIED IDEOGRAPH + {0x95D2, 0x7DE8}, //3103 #CJK UNIFIED IDEOGRAPH + {0x95D3, 0x8FBA}, //3104 #CJK UNIFIED IDEOGRAPH + {0x95D4, 0x8FD4}, //3105 #CJK UNIFIED IDEOGRAPH + {0x95D5, 0x904D}, //3106 #CJK UNIFIED IDEOGRAPH + {0x95D6, 0x4FBF}, //3107 #CJK UNIFIED IDEOGRAPH + {0x95D7, 0x52C9}, //3108 #CJK UNIFIED IDEOGRAPH + {0x95D8, 0x5A29}, //3109 #CJK UNIFIED IDEOGRAPH + {0x95D9, 0x5F01}, //3110 #CJK UNIFIED IDEOGRAPH + {0x95DA, 0x97AD}, //3111 #CJK UNIFIED IDEOGRAPH + {0x95DB, 0x4FDD}, //3112 #CJK UNIFIED IDEOGRAPH + {0x95DC, 0x8217}, //3113 #CJK UNIFIED IDEOGRAPH + {0x95DD, 0x92EA}, //3114 #CJK UNIFIED IDEOGRAPH + {0x95DE, 0x5703}, //3115 #CJK UNIFIED IDEOGRAPH + {0x95DF, 0x6355}, //3116 #CJK UNIFIED IDEOGRAPH + {0x95E0, 0x6B69}, //3117 #CJK UNIFIED IDEOGRAPH + {0x95E1, 0x752B}, //3118 #CJK UNIFIED IDEOGRAPH + {0x95E2, 0x88DC}, //3119 #CJK UNIFIED IDEOGRAPH + {0x95E3, 0x8F14}, //3120 #CJK UNIFIED IDEOGRAPH + {0x95E4, 0x7A42}, //3121 #CJK UNIFIED IDEOGRAPH + {0x95E5, 0x52DF}, //3122 #CJK UNIFIED IDEOGRAPH + {0x95E6, 0x5893}, //3123 #CJK UNIFIED IDEOGRAPH + {0x95E7, 0x6155}, //3124 #CJK UNIFIED IDEOGRAPH + {0x95E8, 0x620A}, //3125 #CJK UNIFIED IDEOGRAPH + {0x95E9, 0x66AE}, //3126 #CJK UNIFIED IDEOGRAPH + {0x95EA, 0x6BCD}, //3127 #CJK UNIFIED IDEOGRAPH + {0x95EB, 0x7C3F}, //3128 #CJK UNIFIED IDEOGRAPH + {0x95EC, 0x83E9}, //3129 #CJK UNIFIED IDEOGRAPH + {0x95ED, 0x5023}, //3130 #CJK UNIFIED IDEOGRAPH + {0x95EE, 0x4FF8}, //3131 #CJK UNIFIED IDEOGRAPH + {0x95EF, 0x5305}, //3132 #CJK UNIFIED IDEOGRAPH + {0x95F0, 0x5446}, //3133 #CJK UNIFIED IDEOGRAPH + {0x95F1, 0x5831}, //3134 #CJK UNIFIED IDEOGRAPH + {0x95F2, 0x5949}, //3135 #CJK UNIFIED IDEOGRAPH + {0x95F3, 0x5B9D}, //3136 #CJK UNIFIED IDEOGRAPH + {0x95F4, 0x5CF0}, //3137 #CJK UNIFIED IDEOGRAPH + {0x95F5, 0x5CEF}, //3138 #CJK UNIFIED IDEOGRAPH + {0x95F6, 0x5D29}, //3139 #CJK UNIFIED IDEOGRAPH + {0x95F7, 0x5E96}, //3140 #CJK UNIFIED IDEOGRAPH + {0x95F8, 0x62B1}, //3141 #CJK UNIFIED IDEOGRAPH + {0x95F9, 0x6367}, //3142 #CJK UNIFIED IDEOGRAPH + {0x95FA, 0x653E}, //3143 #CJK UNIFIED IDEOGRAPH + {0x95FB, 0x65B9}, //3144 #CJK UNIFIED IDEOGRAPH + {0x95FC, 0x670B}, //3145 #CJK UNIFIED IDEOGRAPH + {0x9640, 0x6CD5}, //3146 #CJK UNIFIED IDEOGRAPH + {0x9641, 0x6CE1}, //3147 #CJK UNIFIED IDEOGRAPH + {0x9642, 0x70F9}, //3148 #CJK UNIFIED IDEOGRAPH + {0x9643, 0x7832}, //3149 #CJK UNIFIED IDEOGRAPH + {0x9644, 0x7E2B}, //3150 #CJK UNIFIED IDEOGRAPH + {0x9645, 0x80DE}, //3151 #CJK UNIFIED IDEOGRAPH + {0x9646, 0x82B3}, //3152 #CJK UNIFIED IDEOGRAPH + {0x9647, 0x840C}, //3153 #CJK UNIFIED IDEOGRAPH + {0x9648, 0x84EC}, //3154 #CJK UNIFIED IDEOGRAPH + {0x9649, 0x8702}, //3155 #CJK UNIFIED IDEOGRAPH + {0x964A, 0x8912}, //3156 #CJK UNIFIED IDEOGRAPH + {0x964B, 0x8A2A}, //3157 #CJK UNIFIED IDEOGRAPH + {0x964C, 0x8C4A}, //3158 #CJK UNIFIED IDEOGRAPH + {0x964D, 0x90A6}, //3159 #CJK UNIFIED IDEOGRAPH + {0x964E, 0x92D2}, //3160 #CJK UNIFIED IDEOGRAPH + {0x964F, 0x98FD}, //3161 #CJK UNIFIED IDEOGRAPH + {0x9650, 0x9CF3}, //3162 #CJK UNIFIED IDEOGRAPH + {0x9651, 0x9D6C}, //3163 #CJK UNIFIED IDEOGRAPH + {0x9652, 0x4E4F}, //3164 #CJK UNIFIED IDEOGRAPH + {0x9653, 0x4EA1}, //3165 #CJK UNIFIED IDEOGRAPH + {0x9654, 0x508D}, //3166 #CJK UNIFIED IDEOGRAPH + {0x9655, 0x5256}, //3167 #CJK UNIFIED IDEOGRAPH + {0x9656, 0x574A}, //3168 #CJK UNIFIED IDEOGRAPH + {0x9657, 0x59A8}, //3169 #CJK UNIFIED IDEOGRAPH + {0x9658, 0x5E3D}, //3170 #CJK UNIFIED IDEOGRAPH + {0x9659, 0x5FD8}, //3171 #CJK UNIFIED IDEOGRAPH + {0x965A, 0x5FD9}, //3172 #CJK UNIFIED IDEOGRAPH + {0x965B, 0x623F}, //3173 #CJK UNIFIED IDEOGRAPH + {0x965C, 0x66B4}, //3174 #CJK UNIFIED IDEOGRAPH + {0x965D, 0x671B}, //3175 #CJK UNIFIED IDEOGRAPH + {0x965E, 0x67D0}, //3176 #CJK UNIFIED IDEOGRAPH + {0x965F, 0x68D2}, //3177 #CJK UNIFIED IDEOGRAPH + {0x9660, 0x5192}, //3178 #CJK UNIFIED IDEOGRAPH + {0x9661, 0x7D21}, //3179 #CJK UNIFIED IDEOGRAPH + {0x9662, 0x80AA}, //3180 #CJK UNIFIED IDEOGRAPH + {0x9663, 0x81A8}, //3181 #CJK UNIFIED IDEOGRAPH + {0x9664, 0x8B00}, //3182 #CJK UNIFIED IDEOGRAPH + {0x9665, 0x8C8C}, //3183 #CJK UNIFIED IDEOGRAPH + {0x9666, 0x8CBF}, //3184 #CJK UNIFIED IDEOGRAPH + {0x9667, 0x927E}, //3185 #CJK UNIFIED IDEOGRAPH + {0x9668, 0x9632}, //3186 #CJK UNIFIED IDEOGRAPH + {0x9669, 0x5420}, //3187 #CJK UNIFIED IDEOGRAPH + {0x966A, 0x982C}, //3188 #CJK UNIFIED IDEOGRAPH + {0x966B, 0x5317}, //3189 #CJK UNIFIED IDEOGRAPH + {0x966C, 0x50D5}, //3190 #CJK UNIFIED IDEOGRAPH + {0x966D, 0x535C}, //3191 #CJK UNIFIED IDEOGRAPH + {0x966E, 0x58A8}, //3192 #CJK UNIFIED IDEOGRAPH + {0x966F, 0x64B2}, //3193 #CJK UNIFIED IDEOGRAPH + {0x9670, 0x6734}, //3194 #CJK UNIFIED IDEOGRAPH + {0x9671, 0x7267}, //3195 #CJK UNIFIED IDEOGRAPH + {0x9672, 0x7766}, //3196 #CJK UNIFIED IDEOGRAPH + {0x9673, 0x7A46}, //3197 #CJK UNIFIED IDEOGRAPH + {0x9674, 0x91E6}, //3198 #CJK UNIFIED IDEOGRAPH + {0x9675, 0x52C3}, //3199 #CJK UNIFIED IDEOGRAPH + {0x9676, 0x6CA1}, //3200 #CJK UNIFIED IDEOGRAPH + {0x9677, 0x6B86}, //3201 #CJK UNIFIED IDEOGRAPH + {0x9678, 0x5800}, //3202 #CJK UNIFIED IDEOGRAPH + {0x9679, 0x5E4C}, //3203 #CJK UNIFIED IDEOGRAPH + {0x967A, 0x5954}, //3204 #CJK UNIFIED IDEOGRAPH + {0x967B, 0x672C}, //3205 #CJK UNIFIED IDEOGRAPH + {0x967C, 0x7FFB}, //3206 #CJK UNIFIED IDEOGRAPH + {0x967D, 0x51E1}, //3207 #CJK UNIFIED IDEOGRAPH + {0x967E, 0x76C6}, //3208 #CJK UNIFIED IDEOGRAPH + {0x9680, 0x6469}, //3209 #CJK UNIFIED IDEOGRAPH + {0x9681, 0x78E8}, //3210 #CJK UNIFIED IDEOGRAPH + {0x9682, 0x9B54}, //3211 #CJK UNIFIED IDEOGRAPH + {0x9683, 0x9EBB}, //3212 #CJK UNIFIED IDEOGRAPH + {0x9684, 0x57CB}, //3213 #CJK UNIFIED IDEOGRAPH + {0x9685, 0x59B9}, //3214 #CJK UNIFIED IDEOGRAPH + {0x9686, 0x6627}, //3215 #CJK UNIFIED IDEOGRAPH + {0x9687, 0x679A}, //3216 #CJK UNIFIED IDEOGRAPH + {0x9688, 0x6BCE}, //3217 #CJK UNIFIED IDEOGRAPH + {0x9689, 0x54E9}, //3218 #CJK UNIFIED IDEOGRAPH + {0x968A, 0x69D9}, //3219 #CJK UNIFIED IDEOGRAPH + {0x968B, 0x5E55}, //3220 #CJK UNIFIED IDEOGRAPH + {0x968C, 0x819C}, //3221 #CJK UNIFIED IDEOGRAPH + {0x968D, 0x6795}, //3222 #CJK UNIFIED IDEOGRAPH + {0x968E, 0x9BAA}, //3223 #CJK UNIFIED IDEOGRAPH + {0x968F, 0x67FE}, //3224 #CJK UNIFIED IDEOGRAPH + {0x9690, 0x9C52}, //3225 #CJK UNIFIED IDEOGRAPH + {0x9691, 0x685D}, //3226 #CJK UNIFIED IDEOGRAPH + {0x9692, 0x4EA6}, //3227 #CJK UNIFIED IDEOGRAPH + {0x9693, 0x4FE3}, //3228 #CJK UNIFIED IDEOGRAPH + {0x9694, 0x53C8}, //3229 #CJK UNIFIED IDEOGRAPH + {0x9695, 0x62B9}, //3230 #CJK UNIFIED IDEOGRAPH + {0x9696, 0x672B}, //3231 #CJK UNIFIED IDEOGRAPH + {0x9697, 0x6CAB}, //3232 #CJK UNIFIED IDEOGRAPH + {0x9698, 0x8FC4}, //3233 #CJK UNIFIED IDEOGRAPH + {0x9699, 0x4FAD}, //3234 #CJK UNIFIED IDEOGRAPH + {0x969A, 0x7E6D}, //3235 #CJK UNIFIED IDEOGRAPH + {0x969B, 0x9EBF}, //3236 #CJK UNIFIED IDEOGRAPH + {0x969C, 0x4E07}, //3237 #CJK UNIFIED IDEOGRAPH + {0x969D, 0x6162}, //3238 #CJK UNIFIED IDEOGRAPH + {0x969E, 0x6E80}, //3239 #CJK UNIFIED IDEOGRAPH + {0x969F, 0x6F2B}, //3240 #CJK UNIFIED IDEOGRAPH + {0x96A0, 0x8513}, //3241 #CJK UNIFIED IDEOGRAPH + {0x96A1, 0x5473}, //3242 #CJK UNIFIED IDEOGRAPH + {0x96A2, 0x672A}, //3243 #CJK UNIFIED IDEOGRAPH + {0x96A3, 0x9B45}, //3244 #CJK UNIFIED IDEOGRAPH + {0x96A4, 0x5DF3}, //3245 #CJK UNIFIED IDEOGRAPH + {0x96A5, 0x7B95}, //3246 #CJK UNIFIED IDEOGRAPH + {0x96A6, 0x5CAC}, //3247 #CJK UNIFIED IDEOGRAPH + {0x96A7, 0x5BC6}, //3248 #CJK UNIFIED IDEOGRAPH + {0x96A8, 0x871C}, //3249 #CJK UNIFIED IDEOGRAPH + {0x96A9, 0x6E4A}, //3250 #CJK UNIFIED IDEOGRAPH + {0x96AA, 0x84D1}, //3251 #CJK UNIFIED IDEOGRAPH + {0x96AB, 0x7A14}, //3252 #CJK UNIFIED IDEOGRAPH + {0x96AC, 0x8108}, //3253 #CJK UNIFIED IDEOGRAPH + {0x96AD, 0x5999}, //3254 #CJK UNIFIED IDEOGRAPH + {0x96AE, 0x7C8D}, //3255 #CJK UNIFIED IDEOGRAPH + {0x96AF, 0x6C11}, //3256 #CJK UNIFIED IDEOGRAPH + {0x96B0, 0x7720}, //3257 #CJK UNIFIED IDEOGRAPH + {0x96B1, 0x52D9}, //3258 #CJK UNIFIED IDEOGRAPH + {0x96B2, 0x5922}, //3259 #CJK UNIFIED IDEOGRAPH + {0x96B3, 0x7121}, //3260 #CJK UNIFIED IDEOGRAPH + {0x96B4, 0x725F}, //3261 #CJK UNIFIED IDEOGRAPH + {0x96B5, 0x77DB}, //3262 #CJK UNIFIED IDEOGRAPH + {0x96B6, 0x9727}, //3263 #CJK UNIFIED IDEOGRAPH + {0x96B7, 0x9D61}, //3264 #CJK UNIFIED IDEOGRAPH + {0x96B8, 0x690B}, //3265 #CJK UNIFIED IDEOGRAPH + {0x96B9, 0x5A7F}, //3266 #CJK UNIFIED IDEOGRAPH + {0x96BA, 0x5A18}, //3267 #CJK UNIFIED IDEOGRAPH + {0x96BB, 0x51A5}, //3268 #CJK UNIFIED IDEOGRAPH + {0x96BC, 0x540D}, //3269 #CJK UNIFIED IDEOGRAPH + {0x96BD, 0x547D}, //3270 #CJK UNIFIED IDEOGRAPH + {0x96BE, 0x660E}, //3271 #CJK UNIFIED IDEOGRAPH + {0x96BF, 0x76DF}, //3272 #CJK UNIFIED IDEOGRAPH + {0x96C0, 0x8FF7}, //3273 #CJK UNIFIED IDEOGRAPH + {0x96C1, 0x9298}, //3274 #CJK UNIFIED IDEOGRAPH + {0x96C2, 0x9CF4}, //3275 #CJK UNIFIED IDEOGRAPH + {0x96C3, 0x59EA}, //3276 #CJK UNIFIED IDEOGRAPH + {0x96C4, 0x725D}, //3277 #CJK UNIFIED IDEOGRAPH + {0x96C5, 0x6EC5}, //3278 #CJK UNIFIED IDEOGRAPH + {0x96C6, 0x514D}, //3279 #CJK UNIFIED IDEOGRAPH + {0x96C7, 0x68C9}, //3280 #CJK UNIFIED IDEOGRAPH + {0x96C8, 0x7DBF}, //3281 #CJK UNIFIED IDEOGRAPH + {0x96C9, 0x7DEC}, //3282 #CJK UNIFIED IDEOGRAPH + {0x96CA, 0x9762}, //3283 #CJK UNIFIED IDEOGRAPH + {0x96CB, 0x9EBA}, //3284 #CJK UNIFIED IDEOGRAPH + {0x96CC, 0x6478}, //3285 #CJK UNIFIED IDEOGRAPH + {0x96CD, 0x6A21}, //3286 #CJK UNIFIED IDEOGRAPH + {0x96CE, 0x8302}, //3287 #CJK UNIFIED IDEOGRAPH + {0x96CF, 0x5984}, //3288 #CJK UNIFIED IDEOGRAPH + {0x96D0, 0x5B5F}, //3289 #CJK UNIFIED IDEOGRAPH + {0x96D1, 0x6BDB}, //3290 #CJK UNIFIED IDEOGRAPH + {0x96D2, 0x731B}, //3291 #CJK UNIFIED IDEOGRAPH + {0x96D3, 0x76F2}, //3292 #CJK UNIFIED IDEOGRAPH + {0x96D4, 0x7DB2}, //3293 #CJK UNIFIED IDEOGRAPH + {0x96D5, 0x8017}, //3294 #CJK UNIFIED IDEOGRAPH + {0x96D6, 0x8499}, //3295 #CJK UNIFIED IDEOGRAPH + {0x96D7, 0x5132}, //3296 #CJK UNIFIED IDEOGRAPH + {0x96D8, 0x6728}, //3297 #CJK UNIFIED IDEOGRAPH + {0x96D9, 0x9ED9}, //3298 #CJK UNIFIED IDEOGRAPH + {0x96DA, 0x76EE}, //3299 #CJK UNIFIED IDEOGRAPH + {0x96DB, 0x6762}, //3300 #CJK UNIFIED IDEOGRAPH + {0x96DC, 0x52FF}, //3301 #CJK UNIFIED IDEOGRAPH + {0x96DD, 0x9905}, //3302 #CJK UNIFIED IDEOGRAPH + {0x96DE, 0x5C24}, //3303 #CJK UNIFIED IDEOGRAPH + {0x96DF, 0x623B}, //3304 #CJK UNIFIED IDEOGRAPH + {0x96E0, 0x7C7E}, //3305 #CJK UNIFIED IDEOGRAPH + {0x96E1, 0x8CB0}, //3306 #CJK UNIFIED IDEOGRAPH + {0x96E2, 0x554F}, //3307 #CJK UNIFIED IDEOGRAPH + {0x96E3, 0x60B6}, //3308 #CJK UNIFIED IDEOGRAPH + {0x96E4, 0x7D0B}, //3309 #CJK UNIFIED IDEOGRAPH + {0x96E5, 0x9580}, //3310 #CJK UNIFIED IDEOGRAPH + {0x96E6, 0x5301}, //3311 #CJK UNIFIED IDEOGRAPH + {0x96E7, 0x4E5F}, //3312 #CJK UNIFIED IDEOGRAPH + {0x96E8, 0x51B6}, //3313 #CJK UNIFIED IDEOGRAPH + {0x96E9, 0x591C}, //3314 #CJK UNIFIED IDEOGRAPH + {0x96EA, 0x723A}, //3315 #CJK UNIFIED IDEOGRAPH + {0x96EB, 0x8036}, //3316 #CJK UNIFIED IDEOGRAPH + {0x96EC, 0x91CE}, //3317 #CJK UNIFIED IDEOGRAPH + {0x96ED, 0x5F25}, //3318 #CJK UNIFIED IDEOGRAPH + {0x96EE, 0x77E2}, //3319 #CJK UNIFIED IDEOGRAPH + {0x96EF, 0x5384}, //3320 #CJK UNIFIED IDEOGRAPH + {0x96F0, 0x5F79}, //3321 #CJK UNIFIED IDEOGRAPH + {0x96F1, 0x7D04}, //3322 #CJK UNIFIED IDEOGRAPH + {0x96F2, 0x85AC}, //3323 #CJK UNIFIED IDEOGRAPH + {0x96F3, 0x8A33}, //3324 #CJK UNIFIED IDEOGRAPH + {0x96F4, 0x8E8D}, //3325 #CJK UNIFIED IDEOGRAPH + {0x96F5, 0x9756}, //3326 #CJK UNIFIED IDEOGRAPH + {0x96F6, 0x67F3}, //3327 #CJK UNIFIED IDEOGRAPH + {0x96F7, 0x85AE}, //3328 #CJK UNIFIED IDEOGRAPH + {0x96F8, 0x9453}, //3329 #CJK UNIFIED IDEOGRAPH + {0x96F9, 0x6109}, //3330 #CJK UNIFIED IDEOGRAPH + {0x96FA, 0x6108}, //3331 #CJK UNIFIED IDEOGRAPH + {0x96FB, 0x6CB9}, //3332 #CJK UNIFIED IDEOGRAPH + {0x96FC, 0x7652}, //3333 #CJK UNIFIED IDEOGRAPH + {0x9740, 0x8AED}, //3334 #CJK UNIFIED IDEOGRAPH + {0x9741, 0x8F38}, //3335 #CJK UNIFIED IDEOGRAPH + {0x9742, 0x552F}, //3336 #CJK UNIFIED IDEOGRAPH + {0x9743, 0x4F51}, //3337 #CJK UNIFIED IDEOGRAPH + {0x9744, 0x512A}, //3338 #CJK UNIFIED IDEOGRAPH + {0x9745, 0x52C7}, //3339 #CJK UNIFIED IDEOGRAPH + {0x9746, 0x53CB}, //3340 #CJK UNIFIED IDEOGRAPH + {0x9747, 0x5BA5}, //3341 #CJK UNIFIED IDEOGRAPH + {0x9748, 0x5E7D}, //3342 #CJK UNIFIED IDEOGRAPH + {0x9749, 0x60A0}, //3343 #CJK UNIFIED IDEOGRAPH + {0x974A, 0x6182}, //3344 #CJK UNIFIED IDEOGRAPH + {0x974B, 0x63D6}, //3345 #CJK UNIFIED IDEOGRAPH + {0x974C, 0x6709}, //3346 #CJK UNIFIED IDEOGRAPH + {0x974D, 0x67DA}, //3347 #CJK UNIFIED IDEOGRAPH + {0x974E, 0x6E67}, //3348 #CJK UNIFIED IDEOGRAPH + {0x974F, 0x6D8C}, //3349 #CJK UNIFIED IDEOGRAPH + {0x9750, 0x7336}, //3350 #CJK UNIFIED IDEOGRAPH + {0x9751, 0x7337}, //3351 #CJK UNIFIED IDEOGRAPH + {0x9752, 0x7531}, //3352 #CJK UNIFIED IDEOGRAPH + {0x9753, 0x7950}, //3353 #CJK UNIFIED IDEOGRAPH + {0x9754, 0x88D5}, //3354 #CJK UNIFIED IDEOGRAPH + {0x9755, 0x8A98}, //3355 #CJK UNIFIED IDEOGRAPH + {0x9756, 0x904A}, //3356 #CJK UNIFIED IDEOGRAPH + {0x9757, 0x9091}, //3357 #CJK UNIFIED IDEOGRAPH + {0x9758, 0x90F5}, //3358 #CJK UNIFIED IDEOGRAPH + {0x9759, 0x96C4}, //3359 #CJK UNIFIED IDEOGRAPH + {0x975A, 0x878D}, //3360 #CJK UNIFIED IDEOGRAPH + {0x975B, 0x5915}, //3361 #CJK UNIFIED IDEOGRAPH + {0x975C, 0x4E88}, //3362 #CJK UNIFIED IDEOGRAPH + {0x975D, 0x4F59}, //3363 #CJK UNIFIED IDEOGRAPH + {0x975E, 0x4E0E}, //3364 #CJK UNIFIED IDEOGRAPH + {0x975F, 0x8A89}, //3365 #CJK UNIFIED IDEOGRAPH + {0x9760, 0x8F3F}, //3366 #CJK UNIFIED IDEOGRAPH + {0x9761, 0x9810}, //3367 #CJK UNIFIED IDEOGRAPH + {0x9762, 0x50AD}, //3368 #CJK UNIFIED IDEOGRAPH + {0x9763, 0x5E7C}, //3369 #CJK UNIFIED IDEOGRAPH + {0x9764, 0x5996}, //3370 #CJK UNIFIED IDEOGRAPH + {0x9765, 0x5BB9}, //3371 #CJK UNIFIED IDEOGRAPH + {0x9766, 0x5EB8}, //3372 #CJK UNIFIED IDEOGRAPH + {0x9767, 0x63DA}, //3373 #CJK UNIFIED IDEOGRAPH + {0x9768, 0x63FA}, //3374 #CJK UNIFIED IDEOGRAPH + {0x9769, 0x64C1}, //3375 #CJK UNIFIED IDEOGRAPH + {0x976A, 0x66DC}, //3376 #CJK UNIFIED IDEOGRAPH + {0x976B, 0x694A}, //3377 #CJK UNIFIED IDEOGRAPH + {0x976C, 0x69D8}, //3378 #CJK UNIFIED IDEOGRAPH + {0x976D, 0x6D0B}, //3379 #CJK UNIFIED IDEOGRAPH + {0x976E, 0x6EB6}, //3380 #CJK UNIFIED IDEOGRAPH + {0x976F, 0x7194}, //3381 #CJK UNIFIED IDEOGRAPH + {0x9770, 0x7528}, //3382 #CJK UNIFIED IDEOGRAPH + {0x9771, 0x7AAF}, //3383 #CJK UNIFIED IDEOGRAPH + {0x9772, 0x7F8A}, //3384 #CJK UNIFIED IDEOGRAPH + {0x9773, 0x8000}, //3385 #CJK UNIFIED IDEOGRAPH + {0x9774, 0x8449}, //3386 #CJK UNIFIED IDEOGRAPH + {0x9775, 0x84C9}, //3387 #CJK UNIFIED IDEOGRAPH + {0x9776, 0x8981}, //3388 #CJK UNIFIED IDEOGRAPH + {0x9777, 0x8B21}, //3389 #CJK UNIFIED IDEOGRAPH + {0x9778, 0x8E0A}, //3390 #CJK UNIFIED IDEOGRAPH + {0x9779, 0x9065}, //3391 #CJK UNIFIED IDEOGRAPH + {0x977A, 0x967D}, //3392 #CJK UNIFIED IDEOGRAPH + {0x977B, 0x990A}, //3393 #CJK UNIFIED IDEOGRAPH + {0x977C, 0x617E}, //3394 #CJK UNIFIED IDEOGRAPH + {0x977D, 0x6291}, //3395 #CJK UNIFIED IDEOGRAPH + {0x977E, 0x6B32}, //3396 #CJK UNIFIED IDEOGRAPH + {0x9780, 0x6C83}, //3397 #CJK UNIFIED IDEOGRAPH + {0x9781, 0x6D74}, //3398 #CJK UNIFIED IDEOGRAPH + {0x9782, 0x7FCC}, //3399 #CJK UNIFIED IDEOGRAPH + {0x9783, 0x7FFC}, //3400 #CJK UNIFIED IDEOGRAPH + {0x9784, 0x6DC0}, //3401 #CJK UNIFIED IDEOGRAPH + {0x9785, 0x7F85}, //3402 #CJK UNIFIED IDEOGRAPH + {0x9786, 0x87BA}, //3403 #CJK UNIFIED IDEOGRAPH + {0x9787, 0x88F8}, //3404 #CJK UNIFIED IDEOGRAPH + {0x9788, 0x6765}, //3405 #CJK UNIFIED IDEOGRAPH + {0x9789, 0x83B1}, //3406 #CJK UNIFIED IDEOGRAPH + {0x978A, 0x983C}, //3407 #CJK UNIFIED IDEOGRAPH + {0x978B, 0x96F7}, //3408 #CJK UNIFIED IDEOGRAPH + {0x978C, 0x6D1B}, //3409 #CJK UNIFIED IDEOGRAPH + {0x978D, 0x7D61}, //3410 #CJK UNIFIED IDEOGRAPH + {0x978E, 0x843D}, //3411 #CJK UNIFIED IDEOGRAPH + {0x978F, 0x916A}, //3412 #CJK UNIFIED IDEOGRAPH + {0x9790, 0x4E71}, //3413 #CJK UNIFIED IDEOGRAPH + {0x9791, 0x5375}, //3414 #CJK UNIFIED IDEOGRAPH + {0x9792, 0x5D50}, //3415 #CJK UNIFIED IDEOGRAPH + {0x9793, 0x6B04}, //3416 #CJK UNIFIED IDEOGRAPH + {0x9794, 0x6FEB}, //3417 #CJK UNIFIED IDEOGRAPH + {0x9795, 0x85CD}, //3418 #CJK UNIFIED IDEOGRAPH + {0x9796, 0x862D}, //3419 #CJK UNIFIED IDEOGRAPH + {0x9797, 0x89A7}, //3420 #CJK UNIFIED IDEOGRAPH + {0x9798, 0x5229}, //3421 #CJK UNIFIED IDEOGRAPH + {0x9799, 0x540F}, //3422 #CJK UNIFIED IDEOGRAPH + {0x979A, 0x5C65}, //3423 #CJK UNIFIED IDEOGRAPH + {0x979B, 0x674E}, //3424 #CJK UNIFIED IDEOGRAPH + {0x979C, 0x68A8}, //3425 #CJK UNIFIED IDEOGRAPH + {0x979D, 0x7406}, //3426 #CJK UNIFIED IDEOGRAPH + {0x979E, 0x7483}, //3427 #CJK UNIFIED IDEOGRAPH + {0x979F, 0x75E2}, //3428 #CJK UNIFIED IDEOGRAPH + {0x97A0, 0x88CF}, //3429 #CJK UNIFIED IDEOGRAPH + {0x97A1, 0x88E1}, //3430 #CJK UNIFIED IDEOGRAPH + {0x97A2, 0x91CC}, //3431 #CJK UNIFIED IDEOGRAPH + {0x97A3, 0x96E2}, //3432 #CJK UNIFIED IDEOGRAPH + {0x97A4, 0x9678}, //3433 #CJK UNIFIED IDEOGRAPH + {0x97A5, 0x5F8B}, //3434 #CJK UNIFIED IDEOGRAPH + {0x97A6, 0x7387}, //3435 #CJK UNIFIED IDEOGRAPH + {0x97A7, 0x7ACB}, //3436 #CJK UNIFIED IDEOGRAPH + {0x97A8, 0x844E}, //3437 #CJK UNIFIED IDEOGRAPH + {0x97A9, 0x63A0}, //3438 #CJK UNIFIED IDEOGRAPH + {0x97AA, 0x7565}, //3439 #CJK UNIFIED IDEOGRAPH + {0x97AB, 0x5289}, //3440 #CJK UNIFIED IDEOGRAPH + {0x97AC, 0x6D41}, //3441 #CJK UNIFIED IDEOGRAPH + {0x97AD, 0x6E9C}, //3442 #CJK UNIFIED IDEOGRAPH + {0x97AE, 0x7409}, //3443 #CJK UNIFIED IDEOGRAPH + {0x97AF, 0x7559}, //3444 #CJK UNIFIED IDEOGRAPH + {0x97B0, 0x786B}, //3445 #CJK UNIFIED IDEOGRAPH + {0x97B1, 0x7C92}, //3446 #CJK UNIFIED IDEOGRAPH + {0x97B2, 0x9686}, //3447 #CJK UNIFIED IDEOGRAPH + {0x97B3, 0x7ADC}, //3448 #CJK UNIFIED IDEOGRAPH + {0x97B4, 0x9F8D}, //3449 #CJK UNIFIED IDEOGRAPH + {0x97B5, 0x4FB6}, //3450 #CJK UNIFIED IDEOGRAPH + {0x97B6, 0x616E}, //3451 #CJK UNIFIED IDEOGRAPH + {0x97B7, 0x65C5}, //3452 #CJK UNIFIED IDEOGRAPH + {0x97B8, 0x865C}, //3453 #CJK UNIFIED IDEOGRAPH + {0x97B9, 0x4E86}, //3454 #CJK UNIFIED IDEOGRAPH + {0x97BA, 0x4EAE}, //3455 #CJK UNIFIED IDEOGRAPH + {0x97BB, 0x50DA}, //3456 #CJK UNIFIED IDEOGRAPH + {0x97BC, 0x4E21}, //3457 #CJK UNIFIED IDEOGRAPH + {0x97BD, 0x51CC}, //3458 #CJK UNIFIED IDEOGRAPH + {0x97BE, 0x5BEE}, //3459 #CJK UNIFIED IDEOGRAPH + {0x97BF, 0x6599}, //3460 #CJK UNIFIED IDEOGRAPH + {0x97C0, 0x6881}, //3461 #CJK UNIFIED IDEOGRAPH + {0x97C1, 0x6DBC}, //3462 #CJK UNIFIED IDEOGRAPH + {0x97C2, 0x731F}, //3463 #CJK UNIFIED IDEOGRAPH + {0x97C3, 0x7642}, //3464 #CJK UNIFIED IDEOGRAPH + {0x97C4, 0x77AD}, //3465 #CJK UNIFIED IDEOGRAPH + {0x97C5, 0x7A1C}, //3466 #CJK UNIFIED IDEOGRAPH + {0x97C6, 0x7CE7}, //3467 #CJK UNIFIED IDEOGRAPH + {0x97C7, 0x826F}, //3468 #CJK UNIFIED IDEOGRAPH + {0x97C8, 0x8AD2}, //3469 #CJK UNIFIED IDEOGRAPH + {0x97C9, 0x907C}, //3470 #CJK UNIFIED IDEOGRAPH + {0x97CA, 0x91CF}, //3471 #CJK UNIFIED IDEOGRAPH + {0x97CB, 0x9675}, //3472 #CJK UNIFIED IDEOGRAPH + {0x97CC, 0x9818}, //3473 #CJK UNIFIED IDEOGRAPH + {0x97CD, 0x529B}, //3474 #CJK UNIFIED IDEOGRAPH + {0x97CE, 0x7DD1}, //3475 #CJK UNIFIED IDEOGRAPH + {0x97CF, 0x502B}, //3476 #CJK UNIFIED IDEOGRAPH + {0x97D0, 0x5398}, //3477 #CJK UNIFIED IDEOGRAPH + {0x97D1, 0x6797}, //3478 #CJK UNIFIED IDEOGRAPH + {0x97D2, 0x6DCB}, //3479 #CJK UNIFIED IDEOGRAPH + {0x97D3, 0x71D0}, //3480 #CJK UNIFIED IDEOGRAPH + {0x97D4, 0x7433}, //3481 #CJK UNIFIED IDEOGRAPH + {0x97D5, 0x81E8}, //3482 #CJK UNIFIED IDEOGRAPH + {0x97D6, 0x8F2A}, //3483 #CJK UNIFIED IDEOGRAPH + {0x97D7, 0x96A3}, //3484 #CJK UNIFIED IDEOGRAPH + {0x97D8, 0x9C57}, //3485 #CJK UNIFIED IDEOGRAPH + {0x97D9, 0x9E9F}, //3486 #CJK UNIFIED IDEOGRAPH + {0x97DA, 0x7460}, //3487 #CJK UNIFIED IDEOGRAPH + {0x97DB, 0x5841}, //3488 #CJK UNIFIED IDEOGRAPH + {0x97DC, 0x6D99}, //3489 #CJK UNIFIED IDEOGRAPH + {0x97DD, 0x7D2F}, //3490 #CJK UNIFIED IDEOGRAPH + {0x97DE, 0x985E}, //3491 #CJK UNIFIED IDEOGRAPH + {0x97DF, 0x4EE4}, //3492 #CJK UNIFIED IDEOGRAPH + {0x97E0, 0x4F36}, //3493 #CJK UNIFIED IDEOGRAPH + {0x97E1, 0x4F8B}, //3494 #CJK UNIFIED IDEOGRAPH + {0x97E2, 0x51B7}, //3495 #CJK UNIFIED IDEOGRAPH + {0x97E3, 0x52B1}, //3496 #CJK UNIFIED IDEOGRAPH + {0x97E4, 0x5DBA}, //3497 #CJK UNIFIED IDEOGRAPH + {0x97E5, 0x601C}, //3498 #CJK UNIFIED IDEOGRAPH + {0x97E6, 0x73B2}, //3499 #CJK UNIFIED IDEOGRAPH + {0x97E7, 0x793C}, //3500 #CJK UNIFIED IDEOGRAPH + {0x97E8, 0x82D3}, //3501 #CJK UNIFIED IDEOGRAPH + {0x97E9, 0x9234}, //3502 #CJK UNIFIED IDEOGRAPH + {0x97EA, 0x96B7}, //3503 #CJK UNIFIED IDEOGRAPH + {0x97EB, 0x96F6}, //3504 #CJK UNIFIED IDEOGRAPH + {0x97EC, 0x970A}, //3505 #CJK UNIFIED IDEOGRAPH + {0x97ED, 0x9E97}, //3506 #CJK UNIFIED IDEOGRAPH + {0x97EE, 0x9F62}, //3507 #CJK UNIFIED IDEOGRAPH + {0x97EF, 0x66A6}, //3508 #CJK UNIFIED IDEOGRAPH + {0x97F0, 0x6B74}, //3509 #CJK UNIFIED IDEOGRAPH + {0x97F1, 0x5217}, //3510 #CJK UNIFIED IDEOGRAPH + {0x97F2, 0x52A3}, //3511 #CJK UNIFIED IDEOGRAPH + {0x97F3, 0x70C8}, //3512 #CJK UNIFIED IDEOGRAPH + {0x97F4, 0x88C2}, //3513 #CJK UNIFIED IDEOGRAPH + {0x97F5, 0x5EC9}, //3514 #CJK UNIFIED IDEOGRAPH + {0x97F6, 0x604B}, //3515 #CJK UNIFIED IDEOGRAPH + {0x97F7, 0x6190}, //3516 #CJK UNIFIED IDEOGRAPH + {0x97F8, 0x6F23}, //3517 #CJK UNIFIED IDEOGRAPH + {0x97F9, 0x7149}, //3518 #CJK UNIFIED IDEOGRAPH + {0x97FA, 0x7C3E}, //3519 #CJK UNIFIED IDEOGRAPH + {0x97FB, 0x7DF4}, //3520 #CJK UNIFIED IDEOGRAPH + {0x97FC, 0x806F}, //3521 #CJK UNIFIED IDEOGRAPH + {0x9840, 0x84EE}, //3522 #CJK UNIFIED IDEOGRAPH + {0x9841, 0x9023}, //3523 #CJK UNIFIED IDEOGRAPH + {0x9842, 0x932C}, //3524 #CJK UNIFIED IDEOGRAPH + {0x9843, 0x5442}, //3525 #CJK UNIFIED IDEOGRAPH + {0x9844, 0x9B6F}, //3526 #CJK UNIFIED IDEOGRAPH + {0x9845, 0x6AD3}, //3527 #CJK UNIFIED IDEOGRAPH + {0x9846, 0x7089}, //3528 #CJK UNIFIED IDEOGRAPH + {0x9847, 0x8CC2}, //3529 #CJK UNIFIED IDEOGRAPH + {0x9848, 0x8DEF}, //3530 #CJK UNIFIED IDEOGRAPH + {0x9849, 0x9732}, //3531 #CJK UNIFIED IDEOGRAPH + {0x984A, 0x52B4}, //3532 #CJK UNIFIED IDEOGRAPH + {0x984B, 0x5A41}, //3533 #CJK UNIFIED IDEOGRAPH + {0x984C, 0x5ECA}, //3534 #CJK UNIFIED IDEOGRAPH + {0x984D, 0x5F04}, //3535 #CJK UNIFIED IDEOGRAPH + {0x984E, 0x6717}, //3536 #CJK UNIFIED IDEOGRAPH + {0x984F, 0x697C}, //3537 #CJK UNIFIED IDEOGRAPH + {0x9850, 0x6994}, //3538 #CJK UNIFIED IDEOGRAPH + {0x9851, 0x6D6A}, //3539 #CJK UNIFIED IDEOGRAPH + {0x9852, 0x6F0F}, //3540 #CJK UNIFIED IDEOGRAPH + {0x9853, 0x7262}, //3541 #CJK UNIFIED IDEOGRAPH + {0x9854, 0x72FC}, //3542 #CJK UNIFIED IDEOGRAPH + {0x9855, 0x7BED}, //3543 #CJK UNIFIED IDEOGRAPH + {0x9856, 0x8001}, //3544 #CJK UNIFIED IDEOGRAPH + {0x9857, 0x807E}, //3545 #CJK UNIFIED IDEOGRAPH + {0x9858, 0x874B}, //3546 #CJK UNIFIED IDEOGRAPH + {0x9859, 0x90CE}, //3547 #CJK UNIFIED IDEOGRAPH + {0x985A, 0x516D}, //3548 #CJK UNIFIED IDEOGRAPH + {0x985B, 0x9E93}, //3549 #CJK UNIFIED IDEOGRAPH + {0x985C, 0x7984}, //3550 #CJK UNIFIED IDEOGRAPH + {0x985D, 0x808B}, //3551 #CJK UNIFIED IDEOGRAPH + {0x985E, 0x9332}, //3552 #CJK UNIFIED IDEOGRAPH + {0x985F, 0x8AD6}, //3553 #CJK UNIFIED IDEOGRAPH + {0x9860, 0x502D}, //3554 #CJK UNIFIED IDEOGRAPH + {0x9861, 0x548C}, //3555 #CJK UNIFIED IDEOGRAPH + {0x9862, 0x8A71}, //3556 #CJK UNIFIED IDEOGRAPH + {0x9863, 0x6B6A}, //3557 #CJK UNIFIED IDEOGRAPH + {0x9864, 0x8CC4}, //3558 #CJK UNIFIED IDEOGRAPH + {0x9865, 0x8107}, //3559 #CJK UNIFIED IDEOGRAPH + {0x9866, 0x60D1}, //3560 #CJK UNIFIED IDEOGRAPH + {0x9867, 0x67A0}, //3561 #CJK UNIFIED IDEOGRAPH + {0x9868, 0x9DF2}, //3562 #CJK UNIFIED IDEOGRAPH + {0x9869, 0x4E99}, //3563 #CJK UNIFIED IDEOGRAPH + {0x986A, 0x4E98}, //3564 #CJK UNIFIED IDEOGRAPH + {0x986B, 0x9C10}, //3565 #CJK UNIFIED IDEOGRAPH + {0x986C, 0x8A6B}, //3566 #CJK UNIFIED IDEOGRAPH + {0x986D, 0x85C1}, //3567 #CJK UNIFIED IDEOGRAPH + {0x986E, 0x8568}, //3568 #CJK UNIFIED IDEOGRAPH + {0x986F, 0x6900}, //3569 #CJK UNIFIED IDEOGRAPH + {0x9870, 0x6E7E}, //3570 #CJK UNIFIED IDEOGRAPH + {0x9871, 0x7897}, //3571 #CJK UNIFIED IDEOGRAPH + {0x9872, 0x8155}, //3572 #CJK UNIFIED IDEOGRAPH + {0x989F, 0x5F0C}, //3573 #CJK UNIFIED IDEOGRAPH + {0x98A0, 0x4E10}, //3574 #CJK UNIFIED IDEOGRAPH + {0x98A1, 0x4E15}, //3575 #CJK UNIFIED IDEOGRAPH + {0x98A2, 0x4E2A}, //3576 #CJK UNIFIED IDEOGRAPH + {0x98A3, 0x4E31}, //3577 #CJK UNIFIED IDEOGRAPH + {0x98A4, 0x4E36}, //3578 #CJK UNIFIED IDEOGRAPH + {0x98A5, 0x4E3C}, //3579 #CJK UNIFIED IDEOGRAPH + {0x98A6, 0x4E3F}, //3580 #CJK UNIFIED IDEOGRAPH + {0x98A7, 0x4E42}, //3581 #CJK UNIFIED IDEOGRAPH + {0x98A8, 0x4E56}, //3582 #CJK UNIFIED IDEOGRAPH + {0x98A9, 0x4E58}, //3583 #CJK UNIFIED IDEOGRAPH + {0x98AA, 0x4E82}, //3584 #CJK UNIFIED IDEOGRAPH + {0x98AB, 0x4E85}, //3585 #CJK UNIFIED IDEOGRAPH + {0x98AC, 0x8C6B}, //3586 #CJK UNIFIED IDEOGRAPH + {0x98AD, 0x4E8A}, //3587 #CJK UNIFIED IDEOGRAPH + {0x98AE, 0x8212}, //3588 #CJK UNIFIED IDEOGRAPH + {0x98AF, 0x5F0D}, //3589 #CJK UNIFIED IDEOGRAPH + {0x98B0, 0x4E8E}, //3590 #CJK UNIFIED IDEOGRAPH + {0x98B1, 0x4E9E}, //3591 #CJK UNIFIED IDEOGRAPH + {0x98B2, 0x4E9F}, //3592 #CJK UNIFIED IDEOGRAPH + {0x98B3, 0x4EA0}, //3593 #CJK UNIFIED IDEOGRAPH + {0x98B4, 0x4EA2}, //3594 #CJK UNIFIED IDEOGRAPH + {0x98B5, 0x4EB0}, //3595 #CJK UNIFIED IDEOGRAPH + {0x98B6, 0x4EB3}, //3596 #CJK UNIFIED IDEOGRAPH + {0x98B7, 0x4EB6}, //3597 #CJK UNIFIED IDEOGRAPH + {0x98B8, 0x4ECE}, //3598 #CJK UNIFIED IDEOGRAPH + {0x98B9, 0x4ECD}, //3599 #CJK UNIFIED IDEOGRAPH + {0x98BA, 0x4EC4}, //3600 #CJK UNIFIED IDEOGRAPH + {0x98BB, 0x4EC6}, //3601 #CJK UNIFIED IDEOGRAPH + {0x98BC, 0x4EC2}, //3602 #CJK UNIFIED IDEOGRAPH + {0x98BD, 0x4ED7}, //3603 #CJK UNIFIED IDEOGRAPH + {0x98BE, 0x4EDE}, //3604 #CJK UNIFIED IDEOGRAPH + {0x98BF, 0x4EED}, //3605 #CJK UNIFIED IDEOGRAPH + {0x98C0, 0x4EDF}, //3606 #CJK UNIFIED IDEOGRAPH + {0x98C1, 0x4EF7}, //3607 #CJK UNIFIED IDEOGRAPH + {0x98C2, 0x4F09}, //3608 #CJK UNIFIED IDEOGRAPH + {0x98C3, 0x4F5A}, //3609 #CJK UNIFIED IDEOGRAPH + {0x98C4, 0x4F30}, //3610 #CJK UNIFIED IDEOGRAPH + {0x98C5, 0x4F5B}, //3611 #CJK UNIFIED IDEOGRAPH + {0x98C6, 0x4F5D}, //3612 #CJK UNIFIED IDEOGRAPH + {0x98C7, 0x4F57}, //3613 #CJK UNIFIED IDEOGRAPH + {0x98C8, 0x4F47}, //3614 #CJK UNIFIED IDEOGRAPH + {0x98C9, 0x4F76}, //3615 #CJK UNIFIED IDEOGRAPH + {0x98CA, 0x4F88}, //3616 #CJK UNIFIED IDEOGRAPH + {0x98CB, 0x4F8F}, //3617 #CJK UNIFIED IDEOGRAPH + {0x98CC, 0x4F98}, //3618 #CJK UNIFIED IDEOGRAPH + {0x98CD, 0x4F7B}, //3619 #CJK UNIFIED IDEOGRAPH + {0x98CE, 0x4F69}, //3620 #CJK UNIFIED IDEOGRAPH + {0x98CF, 0x4F70}, //3621 #CJK UNIFIED IDEOGRAPH + {0x98D0, 0x4F91}, //3622 #CJK UNIFIED IDEOGRAPH + {0x98D1, 0x4F6F}, //3623 #CJK UNIFIED IDEOGRAPH + {0x98D2, 0x4F86}, //3624 #CJK UNIFIED IDEOGRAPH + {0x98D3, 0x4F96}, //3625 #CJK UNIFIED IDEOGRAPH + {0x98D4, 0x5118}, //3626 #CJK UNIFIED IDEOGRAPH + {0x98D5, 0x4FD4}, //3627 #CJK UNIFIED IDEOGRAPH + {0x98D6, 0x4FDF}, //3628 #CJK UNIFIED IDEOGRAPH + {0x98D7, 0x4FCE}, //3629 #CJK UNIFIED IDEOGRAPH + {0x98D8, 0x4FD8}, //3630 #CJK UNIFIED IDEOGRAPH + {0x98D9, 0x4FDB}, //3631 #CJK UNIFIED IDEOGRAPH + {0x98DA, 0x4FD1}, //3632 #CJK UNIFIED IDEOGRAPH + {0x98DB, 0x4FDA}, //3633 #CJK UNIFIED IDEOGRAPH + {0x98DC, 0x4FD0}, //3634 #CJK UNIFIED IDEOGRAPH + {0x98DD, 0x4FE4}, //3635 #CJK UNIFIED IDEOGRAPH + {0x98DE, 0x4FE5}, //3636 #CJK UNIFIED IDEOGRAPH + {0x98DF, 0x501A}, //3637 #CJK UNIFIED IDEOGRAPH + {0x98E0, 0x5028}, //3638 #CJK UNIFIED IDEOGRAPH + {0x98E1, 0x5014}, //3639 #CJK UNIFIED IDEOGRAPH + {0x98E2, 0x502A}, //3640 #CJK UNIFIED IDEOGRAPH + {0x98E3, 0x5025}, //3641 #CJK UNIFIED IDEOGRAPH + {0x98E4, 0x5005}, //3642 #CJK UNIFIED IDEOGRAPH + {0x98E5, 0x4F1C}, //3643 #CJK UNIFIED IDEOGRAPH + {0x98E6, 0x4FF6}, //3644 #CJK UNIFIED IDEOGRAPH + {0x98E7, 0x5021}, //3645 #CJK UNIFIED IDEOGRAPH + {0x98E8, 0x5029}, //3646 #CJK UNIFIED IDEOGRAPH + {0x98E9, 0x502C}, //3647 #CJK UNIFIED IDEOGRAPH + {0x98EA, 0x4FFE}, //3648 #CJK UNIFIED IDEOGRAPH + {0x98EB, 0x4FEF}, //3649 #CJK UNIFIED IDEOGRAPH + {0x98EC, 0x5011}, //3650 #CJK UNIFIED IDEOGRAPH + {0x98ED, 0x5006}, //3651 #CJK UNIFIED IDEOGRAPH + {0x98EE, 0x5043}, //3652 #CJK UNIFIED IDEOGRAPH + {0x98EF, 0x5047}, //3653 #CJK UNIFIED IDEOGRAPH + {0x98F0, 0x6703}, //3654 #CJK UNIFIED IDEOGRAPH + {0x98F1, 0x5055}, //3655 #CJK UNIFIED IDEOGRAPH + {0x98F2, 0x5050}, //3656 #CJK UNIFIED IDEOGRAPH + {0x98F3, 0x5048}, //3657 #CJK UNIFIED IDEOGRAPH + {0x98F4, 0x505A}, //3658 #CJK UNIFIED IDEOGRAPH + {0x98F5, 0x5056}, //3659 #CJK UNIFIED IDEOGRAPH + {0x98F6, 0x506C}, //3660 #CJK UNIFIED IDEOGRAPH + {0x98F7, 0x5078}, //3661 #CJK UNIFIED IDEOGRAPH + {0x98F8, 0x5080}, //3662 #CJK UNIFIED IDEOGRAPH + {0x98F9, 0x509A}, //3663 #CJK UNIFIED IDEOGRAPH + {0x98FA, 0x5085}, //3664 #CJK UNIFIED IDEOGRAPH + {0x98FB, 0x50B4}, //3665 #CJK UNIFIED IDEOGRAPH + {0x98FC, 0x50B2}, //3666 #CJK UNIFIED IDEOGRAPH + {0x9940, 0x50C9}, //3667 #CJK UNIFIED IDEOGRAPH + {0x9941, 0x50CA}, //3668 #CJK UNIFIED IDEOGRAPH + {0x9942, 0x50B3}, //3669 #CJK UNIFIED IDEOGRAPH + {0x9943, 0x50C2}, //3670 #CJK UNIFIED IDEOGRAPH + {0x9944, 0x50D6}, //3671 #CJK UNIFIED IDEOGRAPH + {0x9945, 0x50DE}, //3672 #CJK UNIFIED IDEOGRAPH + {0x9946, 0x50E5}, //3673 #CJK UNIFIED IDEOGRAPH + {0x9947, 0x50ED}, //3674 #CJK UNIFIED IDEOGRAPH + {0x9948, 0x50E3}, //3675 #CJK UNIFIED IDEOGRAPH + {0x9949, 0x50EE}, //3676 #CJK UNIFIED IDEOGRAPH + {0x994A, 0x50F9}, //3677 #CJK UNIFIED IDEOGRAPH + {0x994B, 0x50F5}, //3678 #CJK UNIFIED IDEOGRAPH + {0x994C, 0x5109}, //3679 #CJK UNIFIED IDEOGRAPH + {0x994D, 0x5101}, //3680 #CJK UNIFIED IDEOGRAPH + {0x994E, 0x5102}, //3681 #CJK UNIFIED IDEOGRAPH + {0x994F, 0x5116}, //3682 #CJK UNIFIED IDEOGRAPH + {0x9950, 0x5115}, //3683 #CJK UNIFIED IDEOGRAPH + {0x9951, 0x5114}, //3684 #CJK UNIFIED IDEOGRAPH + {0x9952, 0x511A}, //3685 #CJK UNIFIED IDEOGRAPH + {0x9953, 0x5121}, //3686 #CJK UNIFIED IDEOGRAPH + {0x9954, 0x513A}, //3687 #CJK UNIFIED IDEOGRAPH + {0x9955, 0x5137}, //3688 #CJK UNIFIED IDEOGRAPH + {0x9956, 0x513C}, //3689 #CJK UNIFIED IDEOGRAPH + {0x9957, 0x513B}, //3690 #CJK UNIFIED IDEOGRAPH + {0x9958, 0x513F}, //3691 #CJK UNIFIED IDEOGRAPH + {0x9959, 0x5140}, //3692 #CJK UNIFIED IDEOGRAPH + {0x995A, 0x5152}, //3693 #CJK UNIFIED IDEOGRAPH + {0x995B, 0x514C}, //3694 #CJK UNIFIED IDEOGRAPH + {0x995C, 0x5154}, //3695 #CJK UNIFIED IDEOGRAPH + {0x995D, 0x5162}, //3696 #CJK UNIFIED IDEOGRAPH + {0x995E, 0x7AF8}, //3697 #CJK UNIFIED IDEOGRAPH + {0x995F, 0x5169}, //3698 #CJK UNIFIED IDEOGRAPH + {0x9960, 0x516A}, //3699 #CJK UNIFIED IDEOGRAPH + {0x9961, 0x516E}, //3700 #CJK UNIFIED IDEOGRAPH + {0x9962, 0x5180}, //3701 #CJK UNIFIED IDEOGRAPH + {0x9963, 0x5182}, //3702 #CJK UNIFIED IDEOGRAPH + {0x9964, 0x56D8}, //3703 #CJK UNIFIED IDEOGRAPH + {0x9965, 0x518C}, //3704 #CJK UNIFIED IDEOGRAPH + {0x9966, 0x5189}, //3705 #CJK UNIFIED IDEOGRAPH + {0x9967, 0x518F}, //3706 #CJK UNIFIED IDEOGRAPH + {0x9968, 0x5191}, //3707 #CJK UNIFIED IDEOGRAPH + {0x9969, 0x5193}, //3708 #CJK UNIFIED IDEOGRAPH + {0x996A, 0x5195}, //3709 #CJK UNIFIED IDEOGRAPH + {0x996B, 0x5196}, //3710 #CJK UNIFIED IDEOGRAPH + {0x996C, 0x51A4}, //3711 #CJK UNIFIED IDEOGRAPH + {0x996D, 0x51A6}, //3712 #CJK UNIFIED IDEOGRAPH + {0x996E, 0x51A2}, //3713 #CJK UNIFIED IDEOGRAPH + {0x996F, 0x51A9}, //3714 #CJK UNIFIED IDEOGRAPH + {0x9970, 0x51AA}, //3715 #CJK UNIFIED IDEOGRAPH + {0x9971, 0x51AB}, //3716 #CJK UNIFIED IDEOGRAPH + {0x9972, 0x51B3}, //3717 #CJK UNIFIED IDEOGRAPH + {0x9973, 0x51B1}, //3718 #CJK UNIFIED IDEOGRAPH + {0x9974, 0x51B2}, //3719 #CJK UNIFIED IDEOGRAPH + {0x9975, 0x51B0}, //3720 #CJK UNIFIED IDEOGRAPH + {0x9976, 0x51B5}, //3721 #CJK UNIFIED IDEOGRAPH + {0x9977, 0x51BD}, //3722 #CJK UNIFIED IDEOGRAPH + {0x9978, 0x51C5}, //3723 #CJK UNIFIED IDEOGRAPH + {0x9979, 0x51C9}, //3724 #CJK UNIFIED IDEOGRAPH + {0x997A, 0x51DB}, //3725 #CJK UNIFIED IDEOGRAPH + {0x997B, 0x51E0}, //3726 #CJK UNIFIED IDEOGRAPH + {0x997C, 0x8655}, //3727 #CJK UNIFIED IDEOGRAPH + {0x997D, 0x51E9}, //3728 #CJK UNIFIED IDEOGRAPH + {0x997E, 0x51ED}, //3729 #CJK UNIFIED IDEOGRAPH + {0x9980, 0x51F0}, //3730 #CJK UNIFIED IDEOGRAPH + {0x9981, 0x51F5}, //3731 #CJK UNIFIED IDEOGRAPH + {0x9982, 0x51FE}, //3732 #CJK UNIFIED IDEOGRAPH + {0x9983, 0x5204}, //3733 #CJK UNIFIED IDEOGRAPH + {0x9984, 0x520B}, //3734 #CJK UNIFIED IDEOGRAPH + {0x9985, 0x5214}, //3735 #CJK UNIFIED IDEOGRAPH + {0x9986, 0x520E}, //3736 #CJK UNIFIED IDEOGRAPH + {0x9987, 0x5227}, //3737 #CJK UNIFIED IDEOGRAPH + {0x9988, 0x522A}, //3738 #CJK UNIFIED IDEOGRAPH + {0x9989, 0x522E}, //3739 #CJK UNIFIED IDEOGRAPH + {0x998A, 0x5233}, //3740 #CJK UNIFIED IDEOGRAPH + {0x998B, 0x5239}, //3741 #CJK UNIFIED IDEOGRAPH + {0x998C, 0x524F}, //3742 #CJK UNIFIED IDEOGRAPH + {0x998D, 0x5244}, //3743 #CJK UNIFIED IDEOGRAPH + {0x998E, 0x524B}, //3744 #CJK UNIFIED IDEOGRAPH + {0x998F, 0x524C}, //3745 #CJK UNIFIED IDEOGRAPH + {0x9990, 0x525E}, //3746 #CJK UNIFIED IDEOGRAPH + {0x9991, 0x5254}, //3747 #CJK UNIFIED IDEOGRAPH + {0x9992, 0x526A}, //3748 #CJK UNIFIED IDEOGRAPH + {0x9993, 0x5274}, //3749 #CJK UNIFIED IDEOGRAPH + {0x9994, 0x5269}, //3750 #CJK UNIFIED IDEOGRAPH + {0x9995, 0x5273}, //3751 #CJK UNIFIED IDEOGRAPH + {0x9996, 0x527F}, //3752 #CJK UNIFIED IDEOGRAPH + {0x9997, 0x527D}, //3753 #CJK UNIFIED IDEOGRAPH + {0x9998, 0x528D}, //3754 #CJK UNIFIED IDEOGRAPH + {0x9999, 0x5294}, //3755 #CJK UNIFIED IDEOGRAPH + {0x999A, 0x5292}, //3756 #CJK UNIFIED IDEOGRAPH + {0x999B, 0x5271}, //3757 #CJK UNIFIED IDEOGRAPH + {0x999C, 0x5288}, //3758 #CJK UNIFIED IDEOGRAPH + {0x999D, 0x5291}, //3759 #CJK UNIFIED IDEOGRAPH + {0x999E, 0x8FA8}, //3760 #CJK UNIFIED IDEOGRAPH + {0x999F, 0x8FA7}, //3761 #CJK UNIFIED IDEOGRAPH + {0x99A0, 0x52AC}, //3762 #CJK UNIFIED IDEOGRAPH + {0x99A1, 0x52AD}, //3763 #CJK UNIFIED IDEOGRAPH + {0x99A2, 0x52BC}, //3764 #CJK UNIFIED IDEOGRAPH + {0x99A3, 0x52B5}, //3765 #CJK UNIFIED IDEOGRAPH + {0x99A4, 0x52C1}, //3766 #CJK UNIFIED IDEOGRAPH + {0x99A5, 0x52CD}, //3767 #CJK UNIFIED IDEOGRAPH + {0x99A6, 0x52D7}, //3768 #CJK UNIFIED IDEOGRAPH + {0x99A7, 0x52DE}, //3769 #CJK UNIFIED IDEOGRAPH + {0x99A8, 0x52E3}, //3770 #CJK UNIFIED IDEOGRAPH + {0x99A9, 0x52E6}, //3771 #CJK UNIFIED IDEOGRAPH + {0x99AA, 0x98ED}, //3772 #CJK UNIFIED IDEOGRAPH + {0x99AB, 0x52E0}, //3773 #CJK UNIFIED IDEOGRAPH + {0x99AC, 0x52F3}, //3774 #CJK UNIFIED IDEOGRAPH + {0x99AD, 0x52F5}, //3775 #CJK UNIFIED IDEOGRAPH + {0x99AE, 0x52F8}, //3776 #CJK UNIFIED IDEOGRAPH + {0x99AF, 0x52F9}, //3777 #CJK UNIFIED IDEOGRAPH + {0x99B0, 0x5306}, //3778 #CJK UNIFIED IDEOGRAPH + {0x99B1, 0x5308}, //3779 #CJK UNIFIED IDEOGRAPH + {0x99B2, 0x7538}, //3780 #CJK UNIFIED IDEOGRAPH + {0x99B3, 0x530D}, //3781 #CJK UNIFIED IDEOGRAPH + {0x99B4, 0x5310}, //3782 #CJK UNIFIED IDEOGRAPH + {0x99B5, 0x530F}, //3783 #CJK UNIFIED IDEOGRAPH + {0x99B6, 0x5315}, //3784 #CJK UNIFIED IDEOGRAPH + {0x99B7, 0x531A}, //3785 #CJK UNIFIED IDEOGRAPH + {0x99B8, 0x5323}, //3786 #CJK UNIFIED IDEOGRAPH + {0x99B9, 0x532F}, //3787 #CJK UNIFIED IDEOGRAPH + {0x99BA, 0x5331}, //3788 #CJK UNIFIED IDEOGRAPH + {0x99BB, 0x5333}, //3789 #CJK UNIFIED IDEOGRAPH + {0x99BC, 0x5338}, //3790 #CJK UNIFIED IDEOGRAPH + {0x99BD, 0x5340}, //3791 #CJK UNIFIED IDEOGRAPH + {0x99BE, 0x5346}, //3792 #CJK UNIFIED IDEOGRAPH + {0x99BF, 0x5345}, //3793 #CJK UNIFIED IDEOGRAPH + {0x99C0, 0x4E17}, //3794 #CJK UNIFIED IDEOGRAPH + {0x99C1, 0x5349}, //3795 #CJK UNIFIED IDEOGRAPH + {0x99C2, 0x534D}, //3796 #CJK UNIFIED IDEOGRAPH + {0x99C3, 0x51D6}, //3797 #CJK UNIFIED IDEOGRAPH + {0x99C4, 0x535E}, //3798 #CJK UNIFIED IDEOGRAPH + {0x99C5, 0x5369}, //3799 #CJK UNIFIED IDEOGRAPH + {0x99C6, 0x536E}, //3800 #CJK UNIFIED IDEOGRAPH + {0x99C7, 0x5918}, //3801 #CJK UNIFIED IDEOGRAPH + {0x99C8, 0x537B}, //3802 #CJK UNIFIED IDEOGRAPH + {0x99C9, 0x5377}, //3803 #CJK UNIFIED IDEOGRAPH + {0x99CA, 0x5382}, //3804 #CJK UNIFIED IDEOGRAPH + {0x99CB, 0x5396}, //3805 #CJK UNIFIED IDEOGRAPH + {0x99CC, 0x53A0}, //3806 #CJK UNIFIED IDEOGRAPH + {0x99CD, 0x53A6}, //3807 #CJK UNIFIED IDEOGRAPH + {0x99CE, 0x53A5}, //3808 #CJK UNIFIED IDEOGRAPH + {0x99CF, 0x53AE}, //3809 #CJK UNIFIED IDEOGRAPH + {0x99D0, 0x53B0}, //3810 #CJK UNIFIED IDEOGRAPH + {0x99D1, 0x53B6}, //3811 #CJK UNIFIED IDEOGRAPH + {0x99D2, 0x53C3}, //3812 #CJK UNIFIED IDEOGRAPH + {0x99D3, 0x7C12}, //3813 #CJK UNIFIED IDEOGRAPH + {0x99D4, 0x96D9}, //3814 #CJK UNIFIED IDEOGRAPH + {0x99D5, 0x53DF}, //3815 #CJK UNIFIED IDEOGRAPH + {0x99D6, 0x66FC}, //3816 #CJK UNIFIED IDEOGRAPH + {0x99D7, 0x71EE}, //3817 #CJK UNIFIED IDEOGRAPH + {0x99D8, 0x53EE}, //3818 #CJK UNIFIED IDEOGRAPH + {0x99D9, 0x53E8}, //3819 #CJK UNIFIED IDEOGRAPH + {0x99DA, 0x53ED}, //3820 #CJK UNIFIED IDEOGRAPH + {0x99DB, 0x53FA}, //3821 #CJK UNIFIED IDEOGRAPH + {0x99DC, 0x5401}, //3822 #CJK UNIFIED IDEOGRAPH + {0x99DD, 0x543D}, //3823 #CJK UNIFIED IDEOGRAPH + {0x99DE, 0x5440}, //3824 #CJK UNIFIED IDEOGRAPH + {0x99DF, 0x542C}, //3825 #CJK UNIFIED IDEOGRAPH + {0x99E0, 0x542D}, //3826 #CJK UNIFIED IDEOGRAPH + {0x99E1, 0x543C}, //3827 #CJK UNIFIED IDEOGRAPH + {0x99E2, 0x542E}, //3828 #CJK UNIFIED IDEOGRAPH + {0x99E3, 0x5436}, //3829 #CJK UNIFIED IDEOGRAPH + {0x99E4, 0x5429}, //3830 #CJK UNIFIED IDEOGRAPH + {0x99E5, 0x541D}, //3831 #CJK UNIFIED IDEOGRAPH + {0x99E6, 0x544E}, //3832 #CJK UNIFIED IDEOGRAPH + {0x99E7, 0x548F}, //3833 #CJK UNIFIED IDEOGRAPH + {0x99E8, 0x5475}, //3834 #CJK UNIFIED IDEOGRAPH + {0x99E9, 0x548E}, //3835 #CJK UNIFIED IDEOGRAPH + {0x99EA, 0x545F}, //3836 #CJK UNIFIED IDEOGRAPH + {0x99EB, 0x5471}, //3837 #CJK UNIFIED IDEOGRAPH + {0x99EC, 0x5477}, //3838 #CJK UNIFIED IDEOGRAPH + {0x99ED, 0x5470}, //3839 #CJK UNIFIED IDEOGRAPH + {0x99EE, 0x5492}, //3840 #CJK UNIFIED IDEOGRAPH + {0x99EF, 0x547B}, //3841 #CJK UNIFIED IDEOGRAPH + {0x99F0, 0x5480}, //3842 #CJK UNIFIED IDEOGRAPH + {0x99F1, 0x5476}, //3843 #CJK UNIFIED IDEOGRAPH + {0x99F2, 0x5484}, //3844 #CJK UNIFIED IDEOGRAPH + {0x99F3, 0x5490}, //3845 #CJK UNIFIED IDEOGRAPH + {0x99F4, 0x5486}, //3846 #CJK UNIFIED IDEOGRAPH + {0x99F5, 0x54C7}, //3847 #CJK UNIFIED IDEOGRAPH + {0x99F6, 0x54A2}, //3848 #CJK UNIFIED IDEOGRAPH + {0x99F7, 0x54B8}, //3849 #CJK UNIFIED IDEOGRAPH + {0x99F8, 0x54A5}, //3850 #CJK UNIFIED IDEOGRAPH + {0x99F9, 0x54AC}, //3851 #CJK UNIFIED IDEOGRAPH + {0x99FA, 0x54C4}, //3852 #CJK UNIFIED IDEOGRAPH + {0x99FB, 0x54C8}, //3853 #CJK UNIFIED IDEOGRAPH + {0x99FC, 0x54A8}, //3854 #CJK UNIFIED IDEOGRAPH + {0x9A40, 0x54AB}, //3855 #CJK UNIFIED IDEOGRAPH + {0x9A41, 0x54C2}, //3856 #CJK UNIFIED IDEOGRAPH + {0x9A42, 0x54A4}, //3857 #CJK UNIFIED IDEOGRAPH + {0x9A43, 0x54BE}, //3858 #CJK UNIFIED IDEOGRAPH + {0x9A44, 0x54BC}, //3859 #CJK UNIFIED IDEOGRAPH + {0x9A45, 0x54D8}, //3860 #CJK UNIFIED IDEOGRAPH + {0x9A46, 0x54E5}, //3861 #CJK UNIFIED IDEOGRAPH + {0x9A47, 0x54E6}, //3862 #CJK UNIFIED IDEOGRAPH + {0x9A48, 0x550F}, //3863 #CJK UNIFIED IDEOGRAPH + {0x9A49, 0x5514}, //3864 #CJK UNIFIED IDEOGRAPH + {0x9A4A, 0x54FD}, //3865 #CJK UNIFIED IDEOGRAPH + {0x9A4B, 0x54EE}, //3866 #CJK UNIFIED IDEOGRAPH + {0x9A4C, 0x54ED}, //3867 #CJK UNIFIED IDEOGRAPH + {0x9A4D, 0x54FA}, //3868 #CJK UNIFIED IDEOGRAPH + {0x9A4E, 0x54E2}, //3869 #CJK UNIFIED IDEOGRAPH + {0x9A4F, 0x5539}, //3870 #CJK UNIFIED IDEOGRAPH + {0x9A50, 0x5540}, //3871 #CJK UNIFIED IDEOGRAPH + {0x9A51, 0x5563}, //3872 #CJK UNIFIED IDEOGRAPH + {0x9A52, 0x554C}, //3873 #CJK UNIFIED IDEOGRAPH + {0x9A53, 0x552E}, //3874 #CJK UNIFIED IDEOGRAPH + {0x9A54, 0x555C}, //3875 #CJK UNIFIED IDEOGRAPH + {0x9A55, 0x5545}, //3876 #CJK UNIFIED IDEOGRAPH + {0x9A56, 0x5556}, //3877 #CJK UNIFIED IDEOGRAPH + {0x9A57, 0x5557}, //3878 #CJK UNIFIED IDEOGRAPH + {0x9A58, 0x5538}, //3879 #CJK UNIFIED IDEOGRAPH + {0x9A59, 0x5533}, //3880 #CJK UNIFIED IDEOGRAPH + {0x9A5A, 0x555D}, //3881 #CJK UNIFIED IDEOGRAPH + {0x9A5B, 0x5599}, //3882 #CJK UNIFIED IDEOGRAPH + {0x9A5C, 0x5580}, //3883 #CJK UNIFIED IDEOGRAPH + {0x9A5D, 0x54AF}, //3884 #CJK UNIFIED IDEOGRAPH + {0x9A5E, 0x558A}, //3885 #CJK UNIFIED IDEOGRAPH + {0x9A5F, 0x559F}, //3886 #CJK UNIFIED IDEOGRAPH + {0x9A60, 0x557B}, //3887 #CJK UNIFIED IDEOGRAPH + {0x9A61, 0x557E}, //3888 #CJK UNIFIED IDEOGRAPH + {0x9A62, 0x5598}, //3889 #CJK UNIFIED IDEOGRAPH + {0x9A63, 0x559E}, //3890 #CJK UNIFIED IDEOGRAPH + {0x9A64, 0x55AE}, //3891 #CJK UNIFIED IDEOGRAPH + {0x9A65, 0x557C}, //3892 #CJK UNIFIED IDEOGRAPH + {0x9A66, 0x5583}, //3893 #CJK UNIFIED IDEOGRAPH + {0x9A67, 0x55A9}, //3894 #CJK UNIFIED IDEOGRAPH + {0x9A68, 0x5587}, //3895 #CJK UNIFIED IDEOGRAPH + {0x9A69, 0x55A8}, //3896 #CJK UNIFIED IDEOGRAPH + {0x9A6A, 0x55DA}, //3897 #CJK UNIFIED IDEOGRAPH + {0x9A6B, 0x55C5}, //3898 #CJK UNIFIED IDEOGRAPH + {0x9A6C, 0x55DF}, //3899 #CJK UNIFIED IDEOGRAPH + {0x9A6D, 0x55C4}, //3900 #CJK UNIFIED IDEOGRAPH + {0x9A6E, 0x55DC}, //3901 #CJK UNIFIED IDEOGRAPH + {0x9A6F, 0x55E4}, //3902 #CJK UNIFIED IDEOGRAPH + {0x9A70, 0x55D4}, //3903 #CJK UNIFIED IDEOGRAPH + {0x9A71, 0x5614}, //3904 #CJK UNIFIED IDEOGRAPH + {0x9A72, 0x55F7}, //3905 #CJK UNIFIED IDEOGRAPH + {0x9A73, 0x5616}, //3906 #CJK UNIFIED IDEOGRAPH + {0x9A74, 0x55FE}, //3907 #CJK UNIFIED IDEOGRAPH + {0x9A75, 0x55FD}, //3908 #CJK UNIFIED IDEOGRAPH + {0x9A76, 0x561B}, //3909 #CJK UNIFIED IDEOGRAPH + {0x9A77, 0x55F9}, //3910 #CJK UNIFIED IDEOGRAPH + {0x9A78, 0x564E}, //3911 #CJK UNIFIED IDEOGRAPH + {0x9A79, 0x5650}, //3912 #CJK UNIFIED IDEOGRAPH + {0x9A7A, 0x71DF}, //3913 #CJK UNIFIED IDEOGRAPH + {0x9A7B, 0x5634}, //3914 #CJK UNIFIED IDEOGRAPH + {0x9A7C, 0x5636}, //3915 #CJK UNIFIED IDEOGRAPH + {0x9A7D, 0x5632}, //3916 #CJK UNIFIED IDEOGRAPH + {0x9A7E, 0x5638}, //3917 #CJK UNIFIED IDEOGRAPH + {0x9A80, 0x566B}, //3918 #CJK UNIFIED IDEOGRAPH + {0x9A81, 0x5664}, //3919 #CJK UNIFIED IDEOGRAPH + {0x9A82, 0x562F}, //3920 #CJK UNIFIED IDEOGRAPH + {0x9A83, 0x566C}, //3921 #CJK UNIFIED IDEOGRAPH + {0x9A84, 0x566A}, //3922 #CJK UNIFIED IDEOGRAPH + {0x9A85, 0x5686}, //3923 #CJK UNIFIED IDEOGRAPH + {0x9A86, 0x5680}, //3924 #CJK UNIFIED IDEOGRAPH + {0x9A87, 0x568A}, //3925 #CJK UNIFIED IDEOGRAPH + {0x9A88, 0x56A0}, //3926 #CJK UNIFIED IDEOGRAPH + {0x9A89, 0x5694}, //3927 #CJK UNIFIED IDEOGRAPH + {0x9A8A, 0x568F}, //3928 #CJK UNIFIED IDEOGRAPH + {0x9A8B, 0x56A5}, //3929 #CJK UNIFIED IDEOGRAPH + {0x9A8C, 0x56AE}, //3930 #CJK UNIFIED IDEOGRAPH + {0x9A8D, 0x56B6}, //3931 #CJK UNIFIED IDEOGRAPH + {0x9A8E, 0x56B4}, //3932 #CJK UNIFIED IDEOGRAPH + {0x9A8F, 0x56C2}, //3933 #CJK UNIFIED IDEOGRAPH + {0x9A90, 0x56BC}, //3934 #CJK UNIFIED IDEOGRAPH + {0x9A91, 0x56C1}, //3935 #CJK UNIFIED IDEOGRAPH + {0x9A92, 0x56C3}, //3936 #CJK UNIFIED IDEOGRAPH + {0x9A93, 0x56C0}, //3937 #CJK UNIFIED IDEOGRAPH + {0x9A94, 0x56C8}, //3938 #CJK UNIFIED IDEOGRAPH + {0x9A95, 0x56CE}, //3939 #CJK UNIFIED IDEOGRAPH + {0x9A96, 0x56D1}, //3940 #CJK UNIFIED IDEOGRAPH + {0x9A97, 0x56D3}, //3941 #CJK UNIFIED IDEOGRAPH + {0x9A98, 0x56D7}, //3942 #CJK UNIFIED IDEOGRAPH + {0x9A99, 0x56EE}, //3943 #CJK UNIFIED IDEOGRAPH + {0x9A9A, 0x56F9}, //3944 #CJK UNIFIED IDEOGRAPH + {0x9A9B, 0x5700}, //3945 #CJK UNIFIED IDEOGRAPH + {0x9A9C, 0x56FF}, //3946 #CJK UNIFIED IDEOGRAPH + {0x9A9D, 0x5704}, //3947 #CJK UNIFIED IDEOGRAPH + {0x9A9E, 0x5709}, //3948 #CJK UNIFIED IDEOGRAPH + {0x9A9F, 0x5708}, //3949 #CJK UNIFIED IDEOGRAPH + {0x9AA0, 0x570B}, //3950 #CJK UNIFIED IDEOGRAPH + {0x9AA1, 0x570D}, //3951 #CJK UNIFIED IDEOGRAPH + {0x9AA2, 0x5713}, //3952 #CJK UNIFIED IDEOGRAPH + {0x9AA3, 0x5718}, //3953 #CJK UNIFIED IDEOGRAPH + {0x9AA4, 0x5716}, //3954 #CJK UNIFIED IDEOGRAPH + {0x9AA5, 0x55C7}, //3955 #CJK UNIFIED IDEOGRAPH + {0x9AA6, 0x571C}, //3956 #CJK UNIFIED IDEOGRAPH + {0x9AA7, 0x5726}, //3957 #CJK UNIFIED IDEOGRAPH + {0x9AA8, 0x5737}, //3958 #CJK UNIFIED IDEOGRAPH + {0x9AA9, 0x5738}, //3959 #CJK UNIFIED IDEOGRAPH + {0x9AAA, 0x574E}, //3960 #CJK UNIFIED IDEOGRAPH + {0x9AAB, 0x573B}, //3961 #CJK UNIFIED IDEOGRAPH + {0x9AAC, 0x5740}, //3962 #CJK UNIFIED IDEOGRAPH + {0x9AAD, 0x574F}, //3963 #CJK UNIFIED IDEOGRAPH + {0x9AAE, 0x5769}, //3964 #CJK UNIFIED IDEOGRAPH + {0x9AAF, 0x57C0}, //3965 #CJK UNIFIED IDEOGRAPH + {0x9AB0, 0x5788}, //3966 #CJK UNIFIED IDEOGRAPH + {0x9AB1, 0x5761}, //3967 #CJK UNIFIED IDEOGRAPH + {0x9AB2, 0x577F}, //3968 #CJK UNIFIED IDEOGRAPH + {0x9AB3, 0x5789}, //3969 #CJK UNIFIED IDEOGRAPH + {0x9AB4, 0x5793}, //3970 #CJK UNIFIED IDEOGRAPH + {0x9AB5, 0x57A0}, //3971 #CJK UNIFIED IDEOGRAPH + {0x9AB6, 0x57B3}, //3972 #CJK UNIFIED IDEOGRAPH + {0x9AB7, 0x57A4}, //3973 #CJK UNIFIED IDEOGRAPH + {0x9AB8, 0x57AA}, //3974 #CJK UNIFIED IDEOGRAPH + {0x9AB9, 0x57B0}, //3975 #CJK UNIFIED IDEOGRAPH + {0x9ABA, 0x57C3}, //3976 #CJK UNIFIED IDEOGRAPH + {0x9ABB, 0x57C6}, //3977 #CJK UNIFIED IDEOGRAPH + {0x9ABC, 0x57D4}, //3978 #CJK UNIFIED IDEOGRAPH + {0x9ABD, 0x57D2}, //3979 #CJK UNIFIED IDEOGRAPH + {0x9ABE, 0x57D3}, //3980 #CJK UNIFIED IDEOGRAPH + {0x9ABF, 0x580A}, //3981 #CJK UNIFIED IDEOGRAPH + {0x9AC0, 0x57D6}, //3982 #CJK UNIFIED IDEOGRAPH + {0x9AC1, 0x57E3}, //3983 #CJK UNIFIED IDEOGRAPH + {0x9AC2, 0x580B}, //3984 #CJK UNIFIED IDEOGRAPH + {0x9AC3, 0x5819}, //3985 #CJK UNIFIED IDEOGRAPH + {0x9AC4, 0x581D}, //3986 #CJK UNIFIED IDEOGRAPH + {0x9AC5, 0x5872}, //3987 #CJK UNIFIED IDEOGRAPH + {0x9AC6, 0x5821}, //3988 #CJK UNIFIED IDEOGRAPH + {0x9AC7, 0x5862}, //3989 #CJK UNIFIED IDEOGRAPH + {0x9AC8, 0x584B}, //3990 #CJK UNIFIED IDEOGRAPH + {0x9AC9, 0x5870}, //3991 #CJK UNIFIED IDEOGRAPH + {0x9ACA, 0x6BC0}, //3992 #CJK UNIFIED IDEOGRAPH + {0x9ACB, 0x5852}, //3993 #CJK UNIFIED IDEOGRAPH + {0x9ACC, 0x583D}, //3994 #CJK UNIFIED IDEOGRAPH + {0x9ACD, 0x5879}, //3995 #CJK UNIFIED IDEOGRAPH + {0x9ACE, 0x5885}, //3996 #CJK UNIFIED IDEOGRAPH + {0x9ACF, 0x58B9}, //3997 #CJK UNIFIED IDEOGRAPH + {0x9AD0, 0x589F}, //3998 #CJK UNIFIED IDEOGRAPH + {0x9AD1, 0x58AB}, //3999 #CJK UNIFIED IDEOGRAPH + {0x9AD2, 0x58BA}, //4000 #CJK UNIFIED IDEOGRAPH + {0x9AD3, 0x58DE}, //4001 #CJK UNIFIED IDEOGRAPH + {0x9AD4, 0x58BB}, //4002 #CJK UNIFIED IDEOGRAPH + {0x9AD5, 0x58B8}, //4003 #CJK UNIFIED IDEOGRAPH + {0x9AD6, 0x58AE}, //4004 #CJK UNIFIED IDEOGRAPH + {0x9AD7, 0x58C5}, //4005 #CJK UNIFIED IDEOGRAPH + {0x9AD8, 0x58D3}, //4006 #CJK UNIFIED IDEOGRAPH + {0x9AD9, 0x58D1}, //4007 #CJK UNIFIED IDEOGRAPH + {0x9ADA, 0x58D7}, //4008 #CJK UNIFIED IDEOGRAPH + {0x9ADB, 0x58D9}, //4009 #CJK UNIFIED IDEOGRAPH + {0x9ADC, 0x58D8}, //4010 #CJK UNIFIED IDEOGRAPH + {0x9ADD, 0x58E5}, //4011 #CJK UNIFIED IDEOGRAPH + {0x9ADE, 0x58DC}, //4012 #CJK UNIFIED IDEOGRAPH + {0x9ADF, 0x58E4}, //4013 #CJK UNIFIED IDEOGRAPH + {0x9AE0, 0x58DF}, //4014 #CJK UNIFIED IDEOGRAPH + {0x9AE1, 0x58EF}, //4015 #CJK UNIFIED IDEOGRAPH + {0x9AE2, 0x58FA}, //4016 #CJK UNIFIED IDEOGRAPH + {0x9AE3, 0x58F9}, //4017 #CJK UNIFIED IDEOGRAPH + {0x9AE4, 0x58FB}, //4018 #CJK UNIFIED IDEOGRAPH + {0x9AE5, 0x58FC}, //4019 #CJK UNIFIED IDEOGRAPH + {0x9AE6, 0x58FD}, //4020 #CJK UNIFIED IDEOGRAPH + {0x9AE7, 0x5902}, //4021 #CJK UNIFIED IDEOGRAPH + {0x9AE8, 0x590A}, //4022 #CJK UNIFIED IDEOGRAPH + {0x9AE9, 0x5910}, //4023 #CJK UNIFIED IDEOGRAPH + {0x9AEA, 0x591B}, //4024 #CJK UNIFIED IDEOGRAPH + {0x9AEB, 0x68A6}, //4025 #CJK UNIFIED IDEOGRAPH + {0x9AEC, 0x5925}, //4026 #CJK UNIFIED IDEOGRAPH + {0x9AED, 0x592C}, //4027 #CJK UNIFIED IDEOGRAPH + {0x9AEE, 0x592D}, //4028 #CJK UNIFIED IDEOGRAPH + {0x9AEF, 0x5932}, //4029 #CJK UNIFIED IDEOGRAPH + {0x9AF0, 0x5938}, //4030 #CJK UNIFIED IDEOGRAPH + {0x9AF1, 0x593E}, //4031 #CJK UNIFIED IDEOGRAPH + {0x9AF2, 0x7AD2}, //4032 #CJK UNIFIED IDEOGRAPH + {0x9AF3, 0x5955}, //4033 #CJK UNIFIED IDEOGRAPH + {0x9AF4, 0x5950}, //4034 #CJK UNIFIED IDEOGRAPH + {0x9AF5, 0x594E}, //4035 #CJK UNIFIED IDEOGRAPH + {0x9AF6, 0x595A}, //4036 #CJK UNIFIED IDEOGRAPH + {0x9AF7, 0x5958}, //4037 #CJK UNIFIED IDEOGRAPH + {0x9AF8, 0x5962}, //4038 #CJK UNIFIED IDEOGRAPH + {0x9AF9, 0x5960}, //4039 #CJK UNIFIED IDEOGRAPH + {0x9AFA, 0x5967}, //4040 #CJK UNIFIED IDEOGRAPH + {0x9AFB, 0x596C}, //4041 #CJK UNIFIED IDEOGRAPH + {0x9AFC, 0x5969}, //4042 #CJK UNIFIED IDEOGRAPH + {0x9B40, 0x5978}, //4043 #CJK UNIFIED IDEOGRAPH + {0x9B41, 0x5981}, //4044 #CJK UNIFIED IDEOGRAPH + {0x9B42, 0x599D}, //4045 #CJK UNIFIED IDEOGRAPH + {0x9B43, 0x4F5E}, //4046 #CJK UNIFIED IDEOGRAPH + {0x9B44, 0x4FAB}, //4047 #CJK UNIFIED IDEOGRAPH + {0x9B45, 0x59A3}, //4048 #CJK UNIFIED IDEOGRAPH + {0x9B46, 0x59B2}, //4049 #CJK UNIFIED IDEOGRAPH + {0x9B47, 0x59C6}, //4050 #CJK UNIFIED IDEOGRAPH + {0x9B48, 0x59E8}, //4051 #CJK UNIFIED IDEOGRAPH + {0x9B49, 0x59DC}, //4052 #CJK UNIFIED IDEOGRAPH + {0x9B4A, 0x598D}, //4053 #CJK UNIFIED IDEOGRAPH + {0x9B4B, 0x59D9}, //4054 #CJK UNIFIED IDEOGRAPH + {0x9B4C, 0x59DA}, //4055 #CJK UNIFIED IDEOGRAPH + {0x9B4D, 0x5A25}, //4056 #CJK UNIFIED IDEOGRAPH + {0x9B4E, 0x5A1F}, //4057 #CJK UNIFIED IDEOGRAPH + {0x9B4F, 0x5A11}, //4058 #CJK UNIFIED IDEOGRAPH + {0x9B50, 0x5A1C}, //4059 #CJK UNIFIED IDEOGRAPH + {0x9B51, 0x5A09}, //4060 #CJK UNIFIED IDEOGRAPH + {0x9B52, 0x5A1A}, //4061 #CJK UNIFIED IDEOGRAPH + {0x9B53, 0x5A40}, //4062 #CJK UNIFIED IDEOGRAPH + {0x9B54, 0x5A6C}, //4063 #CJK UNIFIED IDEOGRAPH + {0x9B55, 0x5A49}, //4064 #CJK UNIFIED IDEOGRAPH + {0x9B56, 0x5A35}, //4065 #CJK UNIFIED IDEOGRAPH + {0x9B57, 0x5A36}, //4066 #CJK UNIFIED IDEOGRAPH + {0x9B58, 0x5A62}, //4067 #CJK UNIFIED IDEOGRAPH + {0x9B59, 0x5A6A}, //4068 #CJK UNIFIED IDEOGRAPH + {0x9B5A, 0x5A9A}, //4069 #CJK UNIFIED IDEOGRAPH + {0x9B5B, 0x5ABC}, //4070 #CJK UNIFIED IDEOGRAPH + {0x9B5C, 0x5ABE}, //4071 #CJK UNIFIED IDEOGRAPH + {0x9B5D, 0x5ACB}, //4072 #CJK UNIFIED IDEOGRAPH + {0x9B5E, 0x5AC2}, //4073 #CJK UNIFIED IDEOGRAPH + {0x9B5F, 0x5ABD}, //4074 #CJK UNIFIED IDEOGRAPH + {0x9B60, 0x5AE3}, //4075 #CJK UNIFIED IDEOGRAPH + {0x9B61, 0x5AD7}, //4076 #CJK UNIFIED IDEOGRAPH + {0x9B62, 0x5AE6}, //4077 #CJK UNIFIED IDEOGRAPH + {0x9B63, 0x5AE9}, //4078 #CJK UNIFIED IDEOGRAPH + {0x9B64, 0x5AD6}, //4079 #CJK UNIFIED IDEOGRAPH + {0x9B65, 0x5AFA}, //4080 #CJK UNIFIED IDEOGRAPH + {0x9B66, 0x5AFB}, //4081 #CJK UNIFIED IDEOGRAPH + {0x9B67, 0x5B0C}, //4082 #CJK UNIFIED IDEOGRAPH + {0x9B68, 0x5B0B}, //4083 #CJK UNIFIED IDEOGRAPH + {0x9B69, 0x5B16}, //4084 #CJK UNIFIED IDEOGRAPH + {0x9B6A, 0x5B32}, //4085 #CJK UNIFIED IDEOGRAPH + {0x9B6B, 0x5AD0}, //4086 #CJK UNIFIED IDEOGRAPH + {0x9B6C, 0x5B2A}, //4087 #CJK UNIFIED IDEOGRAPH + {0x9B6D, 0x5B36}, //4088 #CJK UNIFIED IDEOGRAPH + {0x9B6E, 0x5B3E}, //4089 #CJK UNIFIED IDEOGRAPH + {0x9B6F, 0x5B43}, //4090 #CJK UNIFIED IDEOGRAPH + {0x9B70, 0x5B45}, //4091 #CJK UNIFIED IDEOGRAPH + {0x9B71, 0x5B40}, //4092 #CJK UNIFIED IDEOGRAPH + {0x9B72, 0x5B51}, //4093 #CJK UNIFIED IDEOGRAPH + {0x9B73, 0x5B55}, //4094 #CJK UNIFIED IDEOGRAPH + {0x9B74, 0x5B5A}, //4095 #CJK UNIFIED IDEOGRAPH + {0x9B75, 0x5B5B}, //4096 #CJK UNIFIED IDEOGRAPH + {0x9B76, 0x5B65}, //4097 #CJK UNIFIED IDEOGRAPH + {0x9B77, 0x5B69}, //4098 #CJK UNIFIED IDEOGRAPH + {0x9B78, 0x5B70}, //4099 #CJK UNIFIED IDEOGRAPH + {0x9B79, 0x5B73}, //4100 #CJK UNIFIED IDEOGRAPH + {0x9B7A, 0x5B75}, //4101 #CJK UNIFIED IDEOGRAPH + {0x9B7B, 0x5B78}, //4102 #CJK UNIFIED IDEOGRAPH + {0x9B7C, 0x6588}, //4103 #CJK UNIFIED IDEOGRAPH + {0x9B7D, 0x5B7A}, //4104 #CJK UNIFIED IDEOGRAPH + {0x9B7E, 0x5B80}, //4105 #CJK UNIFIED IDEOGRAPH + {0x9B80, 0x5B83}, //4106 #CJK UNIFIED IDEOGRAPH + {0x9B81, 0x5BA6}, //4107 #CJK UNIFIED IDEOGRAPH + {0x9B82, 0x5BB8}, //4108 #CJK UNIFIED IDEOGRAPH + {0x9B83, 0x5BC3}, //4109 #CJK UNIFIED IDEOGRAPH + {0x9B84, 0x5BC7}, //4110 #CJK UNIFIED IDEOGRAPH + {0x9B85, 0x5BC9}, //4111 #CJK UNIFIED IDEOGRAPH + {0x9B86, 0x5BD4}, //4112 #CJK UNIFIED IDEOGRAPH + {0x9B87, 0x5BD0}, //4113 #CJK UNIFIED IDEOGRAPH + {0x9B88, 0x5BE4}, //4114 #CJK UNIFIED IDEOGRAPH + {0x9B89, 0x5BE6}, //4115 #CJK UNIFIED IDEOGRAPH + {0x9B8A, 0x5BE2}, //4116 #CJK UNIFIED IDEOGRAPH + {0x9B8B, 0x5BDE}, //4117 #CJK UNIFIED IDEOGRAPH + {0x9B8C, 0x5BE5}, //4118 #CJK UNIFIED IDEOGRAPH + {0x9B8D, 0x5BEB}, //4119 #CJK UNIFIED IDEOGRAPH + {0x9B8E, 0x5BF0}, //4120 #CJK UNIFIED IDEOGRAPH + {0x9B8F, 0x5BF6}, //4121 #CJK UNIFIED IDEOGRAPH + {0x9B90, 0x5BF3}, //4122 #CJK UNIFIED IDEOGRAPH + {0x9B91, 0x5C05}, //4123 #CJK UNIFIED IDEOGRAPH + {0x9B92, 0x5C07}, //4124 #CJK UNIFIED IDEOGRAPH + {0x9B93, 0x5C08}, //4125 #CJK UNIFIED IDEOGRAPH + {0x9B94, 0x5C0D}, //4126 #CJK UNIFIED IDEOGRAPH + {0x9B95, 0x5C13}, //4127 #CJK UNIFIED IDEOGRAPH + {0x9B96, 0x5C20}, //4128 #CJK UNIFIED IDEOGRAPH + {0x9B97, 0x5C22}, //4129 #CJK UNIFIED IDEOGRAPH + {0x9B98, 0x5C28}, //4130 #CJK UNIFIED IDEOGRAPH + {0x9B99, 0x5C38}, //4131 #CJK UNIFIED IDEOGRAPH + {0x9B9A, 0x5C39}, //4132 #CJK UNIFIED IDEOGRAPH + {0x9B9B, 0x5C41}, //4133 #CJK UNIFIED IDEOGRAPH + {0x9B9C, 0x5C46}, //4134 #CJK UNIFIED IDEOGRAPH + {0x9B9D, 0x5C4E}, //4135 #CJK UNIFIED IDEOGRAPH + {0x9B9E, 0x5C53}, //4136 #CJK UNIFIED IDEOGRAPH + {0x9B9F, 0x5C50}, //4137 #CJK UNIFIED IDEOGRAPH + {0x9BA0, 0x5C4F}, //4138 #CJK UNIFIED IDEOGRAPH + {0x9BA1, 0x5B71}, //4139 #CJK UNIFIED IDEOGRAPH + {0x9BA2, 0x5C6C}, //4140 #CJK UNIFIED IDEOGRAPH + {0x9BA3, 0x5C6E}, //4141 #CJK UNIFIED IDEOGRAPH + {0x9BA4, 0x4E62}, //4142 #CJK UNIFIED IDEOGRAPH + {0x9BA5, 0x5C76}, //4143 #CJK UNIFIED IDEOGRAPH + {0x9BA6, 0x5C79}, //4144 #CJK UNIFIED IDEOGRAPH + {0x9BA7, 0x5C8C}, //4145 #CJK UNIFIED IDEOGRAPH + {0x9BA8, 0x5C91}, //4146 #CJK UNIFIED IDEOGRAPH + {0x9BA9, 0x5C94}, //4147 #CJK UNIFIED IDEOGRAPH + {0x9BAA, 0x599B}, //4148 #CJK UNIFIED IDEOGRAPH + {0x9BAB, 0x5CAB}, //4149 #CJK UNIFIED IDEOGRAPH + {0x9BAC, 0x5CBB}, //4150 #CJK UNIFIED IDEOGRAPH + {0x9BAD, 0x5CB6}, //4151 #CJK UNIFIED IDEOGRAPH + {0x9BAE, 0x5CBC}, //4152 #CJK UNIFIED IDEOGRAPH + {0x9BAF, 0x5CB7}, //4153 #CJK UNIFIED IDEOGRAPH + {0x9BB0, 0x5CC5}, //4154 #CJK UNIFIED IDEOGRAPH + {0x9BB1, 0x5CBE}, //4155 #CJK UNIFIED IDEOGRAPH + {0x9BB2, 0x5CC7}, //4156 #CJK UNIFIED IDEOGRAPH + {0x9BB3, 0x5CD9}, //4157 #CJK UNIFIED IDEOGRAPH + {0x9BB4, 0x5CE9}, //4158 #CJK UNIFIED IDEOGRAPH + {0x9BB5, 0x5CFD}, //4159 #CJK UNIFIED IDEOGRAPH + {0x9BB6, 0x5CFA}, //4160 #CJK UNIFIED IDEOGRAPH + {0x9BB7, 0x5CED}, //4161 #CJK UNIFIED IDEOGRAPH + {0x9BB8, 0x5D8C}, //4162 #CJK UNIFIED IDEOGRAPH + {0x9BB9, 0x5CEA}, //4163 #CJK UNIFIED IDEOGRAPH + {0x9BBA, 0x5D0B}, //4164 #CJK UNIFIED IDEOGRAPH + {0x9BBB, 0x5D15}, //4165 #CJK UNIFIED IDEOGRAPH + {0x9BBC, 0x5D17}, //4166 #CJK UNIFIED IDEOGRAPH + {0x9BBD, 0x5D5C}, //4167 #CJK UNIFIED IDEOGRAPH + {0x9BBE, 0x5D1F}, //4168 #CJK UNIFIED IDEOGRAPH + {0x9BBF, 0x5D1B}, //4169 #CJK UNIFIED IDEOGRAPH + {0x9BC0, 0x5D11}, //4170 #CJK UNIFIED IDEOGRAPH + {0x9BC1, 0x5D14}, //4171 #CJK UNIFIED IDEOGRAPH + {0x9BC2, 0x5D22}, //4172 #CJK UNIFIED IDEOGRAPH + {0x9BC3, 0x5D1A}, //4173 #CJK UNIFIED IDEOGRAPH + {0x9BC4, 0x5D19}, //4174 #CJK UNIFIED IDEOGRAPH + {0x9BC5, 0x5D18}, //4175 #CJK UNIFIED IDEOGRAPH + {0x9BC6, 0x5D4C}, //4176 #CJK UNIFIED IDEOGRAPH + {0x9BC7, 0x5D52}, //4177 #CJK UNIFIED IDEOGRAPH + {0x9BC8, 0x5D4E}, //4178 #CJK UNIFIED IDEOGRAPH + {0x9BC9, 0x5D4B}, //4179 #CJK UNIFIED IDEOGRAPH + {0x9BCA, 0x5D6C}, //4180 #CJK UNIFIED IDEOGRAPH + {0x9BCB, 0x5D73}, //4181 #CJK UNIFIED IDEOGRAPH + {0x9BCC, 0x5D76}, //4182 #CJK UNIFIED IDEOGRAPH + {0x9BCD, 0x5D87}, //4183 #CJK UNIFIED IDEOGRAPH + {0x9BCE, 0x5D84}, //4184 #CJK UNIFIED IDEOGRAPH + {0x9BCF, 0x5D82}, //4185 #CJK UNIFIED IDEOGRAPH + {0x9BD0, 0x5DA2}, //4186 #CJK UNIFIED IDEOGRAPH + {0x9BD1, 0x5D9D}, //4187 #CJK UNIFIED IDEOGRAPH + {0x9BD2, 0x5DAC}, //4188 #CJK UNIFIED IDEOGRAPH + {0x9BD3, 0x5DAE}, //4189 #CJK UNIFIED IDEOGRAPH + {0x9BD4, 0x5DBD}, //4190 #CJK UNIFIED IDEOGRAPH + {0x9BD5, 0x5D90}, //4191 #CJK UNIFIED IDEOGRAPH + {0x9BD6, 0x5DB7}, //4192 #CJK UNIFIED IDEOGRAPH + {0x9BD7, 0x5DBC}, //4193 #CJK UNIFIED IDEOGRAPH + {0x9BD8, 0x5DC9}, //4194 #CJK UNIFIED IDEOGRAPH + {0x9BD9, 0x5DCD}, //4195 #CJK UNIFIED IDEOGRAPH + {0x9BDA, 0x5DD3}, //4196 #CJK UNIFIED IDEOGRAPH + {0x9BDB, 0x5DD2}, //4197 #CJK UNIFIED IDEOGRAPH + {0x9BDC, 0x5DD6}, //4198 #CJK UNIFIED IDEOGRAPH + {0x9BDD, 0x5DDB}, //4199 #CJK UNIFIED IDEOGRAPH + {0x9BDE, 0x5DEB}, //4200 #CJK UNIFIED IDEOGRAPH + {0x9BDF, 0x5DF2}, //4201 #CJK UNIFIED IDEOGRAPH + {0x9BE0, 0x5DF5}, //4202 #CJK UNIFIED IDEOGRAPH + {0x9BE1, 0x5E0B}, //4203 #CJK UNIFIED IDEOGRAPH + {0x9BE2, 0x5E1A}, //4204 #CJK UNIFIED IDEOGRAPH + {0x9BE3, 0x5E19}, //4205 #CJK UNIFIED IDEOGRAPH + {0x9BE4, 0x5E11}, //4206 #CJK UNIFIED IDEOGRAPH + {0x9BE5, 0x5E1B}, //4207 #CJK UNIFIED IDEOGRAPH + {0x9BE6, 0x5E36}, //4208 #CJK UNIFIED IDEOGRAPH + {0x9BE7, 0x5E37}, //4209 #CJK UNIFIED IDEOGRAPH + {0x9BE8, 0x5E44}, //4210 #CJK UNIFIED IDEOGRAPH + {0x9BE9, 0x5E43}, //4211 #CJK UNIFIED IDEOGRAPH + {0x9BEA, 0x5E40}, //4212 #CJK UNIFIED IDEOGRAPH + {0x9BEB, 0x5E4E}, //4213 #CJK UNIFIED IDEOGRAPH + {0x9BEC, 0x5E57}, //4214 #CJK UNIFIED IDEOGRAPH + {0x9BED, 0x5E54}, //4215 #CJK UNIFIED IDEOGRAPH + {0x9BEE, 0x5E5F}, //4216 #CJK UNIFIED IDEOGRAPH + {0x9BEF, 0x5E62}, //4217 #CJK UNIFIED IDEOGRAPH + {0x9BF0, 0x5E64}, //4218 #CJK UNIFIED IDEOGRAPH + {0x9BF1, 0x5E47}, //4219 #CJK UNIFIED IDEOGRAPH + {0x9BF2, 0x5E75}, //4220 #CJK UNIFIED IDEOGRAPH + {0x9BF3, 0x5E76}, //4221 #CJK UNIFIED IDEOGRAPH + {0x9BF4, 0x5E7A}, //4222 #CJK UNIFIED IDEOGRAPH + {0x9BF5, 0x9EBC}, //4223 #CJK UNIFIED IDEOGRAPH + {0x9BF6, 0x5E7F}, //4224 #CJK UNIFIED IDEOGRAPH + {0x9BF7, 0x5EA0}, //4225 #CJK UNIFIED IDEOGRAPH + {0x9BF8, 0x5EC1}, //4226 #CJK UNIFIED IDEOGRAPH + {0x9BF9, 0x5EC2}, //4227 #CJK UNIFIED IDEOGRAPH + {0x9BFA, 0x5EC8}, //4228 #CJK UNIFIED IDEOGRAPH + {0x9BFB, 0x5ED0}, //4229 #CJK UNIFIED IDEOGRAPH + {0x9BFC, 0x5ECF}, //4230 #CJK UNIFIED IDEOGRAPH + {0x9C40, 0x5ED6}, //4231 #CJK UNIFIED IDEOGRAPH + {0x9C41, 0x5EE3}, //4232 #CJK UNIFIED IDEOGRAPH + {0x9C42, 0x5EDD}, //4233 #CJK UNIFIED IDEOGRAPH + {0x9C43, 0x5EDA}, //4234 #CJK UNIFIED IDEOGRAPH + {0x9C44, 0x5EDB}, //4235 #CJK UNIFIED IDEOGRAPH + {0x9C45, 0x5EE2}, //4236 #CJK UNIFIED IDEOGRAPH + {0x9C46, 0x5EE1}, //4237 #CJK UNIFIED IDEOGRAPH + {0x9C47, 0x5EE8}, //4238 #CJK UNIFIED IDEOGRAPH + {0x9C48, 0x5EE9}, //4239 #CJK UNIFIED IDEOGRAPH + {0x9C49, 0x5EEC}, //4240 #CJK UNIFIED IDEOGRAPH + {0x9C4A, 0x5EF1}, //4241 #CJK UNIFIED IDEOGRAPH + {0x9C4B, 0x5EF3}, //4242 #CJK UNIFIED IDEOGRAPH + {0x9C4C, 0x5EF0}, //4243 #CJK UNIFIED IDEOGRAPH + {0x9C4D, 0x5EF4}, //4244 #CJK UNIFIED IDEOGRAPH + {0x9C4E, 0x5EF8}, //4245 #CJK UNIFIED IDEOGRAPH + {0x9C4F, 0x5EFE}, //4246 #CJK UNIFIED IDEOGRAPH + {0x9C50, 0x5F03}, //4247 #CJK UNIFIED IDEOGRAPH + {0x9C51, 0x5F09}, //4248 #CJK UNIFIED IDEOGRAPH + {0x9C52, 0x5F5D}, //4249 #CJK UNIFIED IDEOGRAPH + {0x9C53, 0x5F5C}, //4250 #CJK UNIFIED IDEOGRAPH + {0x9C54, 0x5F0B}, //4251 #CJK UNIFIED IDEOGRAPH + {0x9C55, 0x5F11}, //4252 #CJK UNIFIED IDEOGRAPH + {0x9C56, 0x5F16}, //4253 #CJK UNIFIED IDEOGRAPH + {0x9C57, 0x5F29}, //4254 #CJK UNIFIED IDEOGRAPH + {0x9C58, 0x5F2D}, //4255 #CJK UNIFIED IDEOGRAPH + {0x9C59, 0x5F38}, //4256 #CJK UNIFIED IDEOGRAPH + {0x9C5A, 0x5F41}, //4257 #CJK UNIFIED IDEOGRAPH + {0x9C5B, 0x5F48}, //4258 #CJK UNIFIED IDEOGRAPH + {0x9C5C, 0x5F4C}, //4259 #CJK UNIFIED IDEOGRAPH + {0x9C5D, 0x5F4E}, //4260 #CJK UNIFIED IDEOGRAPH + {0x9C5E, 0x5F2F}, //4261 #CJK UNIFIED IDEOGRAPH + {0x9C5F, 0x5F51}, //4262 #CJK UNIFIED IDEOGRAPH + {0x9C60, 0x5F56}, //4263 #CJK UNIFIED IDEOGRAPH + {0x9C61, 0x5F57}, //4264 #CJK UNIFIED IDEOGRAPH + {0x9C62, 0x5F59}, //4265 #CJK UNIFIED IDEOGRAPH + {0x9C63, 0x5F61}, //4266 #CJK UNIFIED IDEOGRAPH + {0x9C64, 0x5F6D}, //4267 #CJK UNIFIED IDEOGRAPH + {0x9C65, 0x5F73}, //4268 #CJK UNIFIED IDEOGRAPH + {0x9C66, 0x5F77}, //4269 #CJK UNIFIED IDEOGRAPH + {0x9C67, 0x5F83}, //4270 #CJK UNIFIED IDEOGRAPH + {0x9C68, 0x5F82}, //4271 #CJK UNIFIED IDEOGRAPH + {0x9C69, 0x5F7F}, //4272 #CJK UNIFIED IDEOGRAPH + {0x9C6A, 0x5F8A}, //4273 #CJK UNIFIED IDEOGRAPH + {0x9C6B, 0x5F88}, //4274 #CJK UNIFIED IDEOGRAPH + {0x9C6C, 0x5F91}, //4275 #CJK UNIFIED IDEOGRAPH + {0x9C6D, 0x5F87}, //4276 #CJK UNIFIED IDEOGRAPH + {0x9C6E, 0x5F9E}, //4277 #CJK UNIFIED IDEOGRAPH + {0x9C6F, 0x5F99}, //4278 #CJK UNIFIED IDEOGRAPH + {0x9C70, 0x5F98}, //4279 #CJK UNIFIED IDEOGRAPH + {0x9C71, 0x5FA0}, //4280 #CJK UNIFIED IDEOGRAPH + {0x9C72, 0x5FA8}, //4281 #CJK UNIFIED IDEOGRAPH + {0x9C73, 0x5FAD}, //4282 #CJK UNIFIED IDEOGRAPH + {0x9C74, 0x5FBC}, //4283 #CJK UNIFIED IDEOGRAPH + {0x9C75, 0x5FD6}, //4284 #CJK UNIFIED IDEOGRAPH + {0x9C76, 0x5FFB}, //4285 #CJK UNIFIED IDEOGRAPH + {0x9C77, 0x5FE4}, //4286 #CJK UNIFIED IDEOGRAPH + {0x9C78, 0x5FF8}, //4287 #CJK UNIFIED IDEOGRAPH + {0x9C79, 0x5FF1}, //4288 #CJK UNIFIED IDEOGRAPH + {0x9C7A, 0x5FDD}, //4289 #CJK UNIFIED IDEOGRAPH + {0x9C7B, 0x60B3}, //4290 #CJK UNIFIED IDEOGRAPH + {0x9C7C, 0x5FFF}, //4291 #CJK UNIFIED IDEOGRAPH + {0x9C7D, 0x6021}, //4292 #CJK UNIFIED IDEOGRAPH + {0x9C7E, 0x6060}, //4293 #CJK UNIFIED IDEOGRAPH + {0x9C80, 0x6019}, //4294 #CJK UNIFIED IDEOGRAPH + {0x9C81, 0x6010}, //4295 #CJK UNIFIED IDEOGRAPH + {0x9C82, 0x6029}, //4296 #CJK UNIFIED IDEOGRAPH + {0x9C83, 0x600E}, //4297 #CJK UNIFIED IDEOGRAPH + {0x9C84, 0x6031}, //4298 #CJK UNIFIED IDEOGRAPH + {0x9C85, 0x601B}, //4299 #CJK UNIFIED IDEOGRAPH + {0x9C86, 0x6015}, //4300 #CJK UNIFIED IDEOGRAPH + {0x9C87, 0x602B}, //4301 #CJK UNIFIED IDEOGRAPH + {0x9C88, 0x6026}, //4302 #CJK UNIFIED IDEOGRAPH + {0x9C89, 0x600F}, //4303 #CJK UNIFIED IDEOGRAPH + {0x9C8A, 0x603A}, //4304 #CJK UNIFIED IDEOGRAPH + {0x9C8B, 0x605A}, //4305 #CJK UNIFIED IDEOGRAPH + {0x9C8C, 0x6041}, //4306 #CJK UNIFIED IDEOGRAPH + {0x9C8D, 0x606A}, //4307 #CJK UNIFIED IDEOGRAPH + {0x9C8E, 0x6077}, //4308 #CJK UNIFIED IDEOGRAPH + {0x9C8F, 0x605F}, //4309 #CJK UNIFIED IDEOGRAPH + {0x9C90, 0x604A}, //4310 #CJK UNIFIED IDEOGRAPH + {0x9C91, 0x6046}, //4311 #CJK UNIFIED IDEOGRAPH + {0x9C92, 0x604D}, //4312 #CJK UNIFIED IDEOGRAPH + {0x9C93, 0x6063}, //4313 #CJK UNIFIED IDEOGRAPH + {0x9C94, 0x6043}, //4314 #CJK UNIFIED IDEOGRAPH + {0x9C95, 0x6064}, //4315 #CJK UNIFIED IDEOGRAPH + {0x9C96, 0x6042}, //4316 #CJK UNIFIED IDEOGRAPH + {0x9C97, 0x606C}, //4317 #CJK UNIFIED IDEOGRAPH + {0x9C98, 0x606B}, //4318 #CJK UNIFIED IDEOGRAPH + {0x9C99, 0x6059}, //4319 #CJK UNIFIED IDEOGRAPH + {0x9C9A, 0x6081}, //4320 #CJK UNIFIED IDEOGRAPH + {0x9C9B, 0x608D}, //4321 #CJK UNIFIED IDEOGRAPH + {0x9C9C, 0x60E7}, //4322 #CJK UNIFIED IDEOGRAPH + {0x9C9D, 0x6083}, //4323 #CJK UNIFIED IDEOGRAPH + {0x9C9E, 0x609A}, //4324 #CJK UNIFIED IDEOGRAPH + {0x9C9F, 0x6084}, //4325 #CJK UNIFIED IDEOGRAPH + {0x9CA0, 0x609B}, //4326 #CJK UNIFIED IDEOGRAPH + {0x9CA1, 0x6096}, //4327 #CJK UNIFIED IDEOGRAPH + {0x9CA2, 0x6097}, //4328 #CJK UNIFIED IDEOGRAPH + {0x9CA3, 0x6092}, //4329 #CJK UNIFIED IDEOGRAPH + {0x9CA4, 0x60A7}, //4330 #CJK UNIFIED IDEOGRAPH + {0x9CA5, 0x608B}, //4331 #CJK UNIFIED IDEOGRAPH + {0x9CA6, 0x60E1}, //4332 #CJK UNIFIED IDEOGRAPH + {0x9CA7, 0x60B8}, //4333 #CJK UNIFIED IDEOGRAPH + {0x9CA8, 0x60E0}, //4334 #CJK UNIFIED IDEOGRAPH + {0x9CA9, 0x60D3}, //4335 #CJK UNIFIED IDEOGRAPH + {0x9CAA, 0x60B4}, //4336 #CJK UNIFIED IDEOGRAPH + {0x9CAB, 0x5FF0}, //4337 #CJK UNIFIED IDEOGRAPH + {0x9CAC, 0x60BD}, //4338 #CJK UNIFIED IDEOGRAPH + {0x9CAD, 0x60C6}, //4339 #CJK UNIFIED IDEOGRAPH + {0x9CAE, 0x60B5}, //4340 #CJK UNIFIED IDEOGRAPH + {0x9CAF, 0x60D8}, //4341 #CJK UNIFIED IDEOGRAPH + {0x9CB0, 0x614D}, //4342 #CJK UNIFIED IDEOGRAPH + {0x9CB1, 0x6115}, //4343 #CJK UNIFIED IDEOGRAPH + {0x9CB2, 0x6106}, //4344 #CJK UNIFIED IDEOGRAPH + {0x9CB3, 0x60F6}, //4345 #CJK UNIFIED IDEOGRAPH + {0x9CB4, 0x60F7}, //4346 #CJK UNIFIED IDEOGRAPH + {0x9CB5, 0x6100}, //4347 #CJK UNIFIED IDEOGRAPH + {0x9CB6, 0x60F4}, //4348 #CJK UNIFIED IDEOGRAPH + {0x9CB7, 0x60FA}, //4349 #CJK UNIFIED IDEOGRAPH + {0x9CB8, 0x6103}, //4350 #CJK UNIFIED IDEOGRAPH + {0x9CB9, 0x6121}, //4351 #CJK UNIFIED IDEOGRAPH + {0x9CBA, 0x60FB}, //4352 #CJK UNIFIED IDEOGRAPH + {0x9CBB, 0x60F1}, //4353 #CJK UNIFIED IDEOGRAPH + {0x9CBC, 0x610D}, //4354 #CJK UNIFIED IDEOGRAPH + {0x9CBD, 0x610E}, //4355 #CJK UNIFIED IDEOGRAPH + {0x9CBE, 0x6147}, //4356 #CJK UNIFIED IDEOGRAPH + {0x9CBF, 0x613E}, //4357 #CJK UNIFIED IDEOGRAPH + {0x9CC0, 0x6128}, //4358 #CJK UNIFIED IDEOGRAPH + {0x9CC1, 0x6127}, //4359 #CJK UNIFIED IDEOGRAPH + {0x9CC2, 0x614A}, //4360 #CJK UNIFIED IDEOGRAPH + {0x9CC3, 0x613F}, //4361 #CJK UNIFIED IDEOGRAPH + {0x9CC4, 0x613C}, //4362 #CJK UNIFIED IDEOGRAPH + {0x9CC5, 0x612C}, //4363 #CJK UNIFIED IDEOGRAPH + {0x9CC6, 0x6134}, //4364 #CJK UNIFIED IDEOGRAPH + {0x9CC7, 0x613D}, //4365 #CJK UNIFIED IDEOGRAPH + {0x9CC8, 0x6142}, //4366 #CJK UNIFIED IDEOGRAPH + {0x9CC9, 0x6144}, //4367 #CJK UNIFIED IDEOGRAPH + {0x9CCA, 0x6173}, //4368 #CJK UNIFIED IDEOGRAPH + {0x9CCB, 0x6177}, //4369 #CJK UNIFIED IDEOGRAPH + {0x9CCC, 0x6158}, //4370 #CJK UNIFIED IDEOGRAPH + {0x9CCD, 0x6159}, //4371 #CJK UNIFIED IDEOGRAPH + {0x9CCE, 0x615A}, //4372 #CJK UNIFIED IDEOGRAPH + {0x9CCF, 0x616B}, //4373 #CJK UNIFIED IDEOGRAPH + {0x9CD0, 0x6174}, //4374 #CJK UNIFIED IDEOGRAPH + {0x9CD1, 0x616F}, //4375 #CJK UNIFIED IDEOGRAPH + {0x9CD2, 0x6165}, //4376 #CJK UNIFIED IDEOGRAPH + {0x9CD3, 0x6171}, //4377 #CJK UNIFIED IDEOGRAPH + {0x9CD4, 0x615F}, //4378 #CJK UNIFIED IDEOGRAPH + {0x9CD5, 0x615D}, //4379 #CJK UNIFIED IDEOGRAPH + {0x9CD6, 0x6153}, //4380 #CJK UNIFIED IDEOGRAPH + {0x9CD7, 0x6175}, //4381 #CJK UNIFIED IDEOGRAPH + {0x9CD8, 0x6199}, //4382 #CJK UNIFIED IDEOGRAPH + {0x9CD9, 0x6196}, //4383 #CJK UNIFIED IDEOGRAPH + {0x9CDA, 0x6187}, //4384 #CJK UNIFIED IDEOGRAPH + {0x9CDB, 0x61AC}, //4385 #CJK UNIFIED IDEOGRAPH + {0x9CDC, 0x6194}, //4386 #CJK UNIFIED IDEOGRAPH + {0x9CDD, 0x619A}, //4387 #CJK UNIFIED IDEOGRAPH + {0x9CDE, 0x618A}, //4388 #CJK UNIFIED IDEOGRAPH + {0x9CDF, 0x6191}, //4389 #CJK UNIFIED IDEOGRAPH + {0x9CE0, 0x61AB}, //4390 #CJK UNIFIED IDEOGRAPH + {0x9CE1, 0x61AE}, //4391 #CJK UNIFIED IDEOGRAPH + {0x9CE2, 0x61CC}, //4392 #CJK UNIFIED IDEOGRAPH + {0x9CE3, 0x61CA}, //4393 #CJK UNIFIED IDEOGRAPH + {0x9CE4, 0x61C9}, //4394 #CJK UNIFIED IDEOGRAPH + {0x9CE5, 0x61F7}, //4395 #CJK UNIFIED IDEOGRAPH + {0x9CE6, 0x61C8}, //4396 #CJK UNIFIED IDEOGRAPH + {0x9CE7, 0x61C3}, //4397 #CJK UNIFIED IDEOGRAPH + {0x9CE8, 0x61C6}, //4398 #CJK UNIFIED IDEOGRAPH + {0x9CE9, 0x61BA}, //4399 #CJK UNIFIED IDEOGRAPH + {0x9CEA, 0x61CB}, //4400 #CJK UNIFIED IDEOGRAPH + {0x9CEB, 0x7F79}, //4401 #CJK UNIFIED IDEOGRAPH + {0x9CEC, 0x61CD}, //4402 #CJK UNIFIED IDEOGRAPH + {0x9CED, 0x61E6}, //4403 #CJK UNIFIED IDEOGRAPH + {0x9CEE, 0x61E3}, //4404 #CJK UNIFIED IDEOGRAPH + {0x9CEF, 0x61F6}, //4405 #CJK UNIFIED IDEOGRAPH + {0x9CF0, 0x61FA}, //4406 #CJK UNIFIED IDEOGRAPH + {0x9CF1, 0x61F4}, //4407 #CJK UNIFIED IDEOGRAPH + {0x9CF2, 0x61FF}, //4408 #CJK UNIFIED IDEOGRAPH + {0x9CF3, 0x61FD}, //4409 #CJK UNIFIED IDEOGRAPH + {0x9CF4, 0x61FC}, //4410 #CJK UNIFIED IDEOGRAPH + {0x9CF5, 0x61FE}, //4411 #CJK UNIFIED IDEOGRAPH + {0x9CF6, 0x6200}, //4412 #CJK UNIFIED IDEOGRAPH + {0x9CF7, 0x6208}, //4413 #CJK UNIFIED IDEOGRAPH + {0x9CF8, 0x6209}, //4414 #CJK UNIFIED IDEOGRAPH + {0x9CF9, 0x620D}, //4415 #CJK UNIFIED IDEOGRAPH + {0x9CFA, 0x620C}, //4416 #CJK UNIFIED IDEOGRAPH + {0x9CFB, 0x6214}, //4417 #CJK UNIFIED IDEOGRAPH + {0x9CFC, 0x621B}, //4418 #CJK UNIFIED IDEOGRAPH + {0x9D40, 0x621E}, //4419 #CJK UNIFIED IDEOGRAPH + {0x9D41, 0x6221}, //4420 #CJK UNIFIED IDEOGRAPH + {0x9D42, 0x622A}, //4421 #CJK UNIFIED IDEOGRAPH + {0x9D43, 0x622E}, //4422 #CJK UNIFIED IDEOGRAPH + {0x9D44, 0x6230}, //4423 #CJK UNIFIED IDEOGRAPH + {0x9D45, 0x6232}, //4424 #CJK UNIFIED IDEOGRAPH + {0x9D46, 0x6233}, //4425 #CJK UNIFIED IDEOGRAPH + {0x9D47, 0x6241}, //4426 #CJK UNIFIED IDEOGRAPH + {0x9D48, 0x624E}, //4427 #CJK UNIFIED IDEOGRAPH + {0x9D49, 0x625E}, //4428 #CJK UNIFIED IDEOGRAPH + {0x9D4A, 0x6263}, //4429 #CJK UNIFIED IDEOGRAPH + {0x9D4B, 0x625B}, //4430 #CJK UNIFIED IDEOGRAPH + {0x9D4C, 0x6260}, //4431 #CJK UNIFIED IDEOGRAPH + {0x9D4D, 0x6268}, //4432 #CJK UNIFIED IDEOGRAPH + {0x9D4E, 0x627C}, //4433 #CJK UNIFIED IDEOGRAPH + {0x9D4F, 0x6282}, //4434 #CJK UNIFIED IDEOGRAPH + {0x9D50, 0x6289}, //4435 #CJK UNIFIED IDEOGRAPH + {0x9D51, 0x627E}, //4436 #CJK UNIFIED IDEOGRAPH + {0x9D52, 0x6292}, //4437 #CJK UNIFIED IDEOGRAPH + {0x9D53, 0x6293}, //4438 #CJK UNIFIED IDEOGRAPH + {0x9D54, 0x6296}, //4439 #CJK UNIFIED IDEOGRAPH + {0x9D55, 0x62D4}, //4440 #CJK UNIFIED IDEOGRAPH + {0x9D56, 0x6283}, //4441 #CJK UNIFIED IDEOGRAPH + {0x9D57, 0x6294}, //4442 #CJK UNIFIED IDEOGRAPH + {0x9D58, 0x62D7}, //4443 #CJK UNIFIED IDEOGRAPH + {0x9D59, 0x62D1}, //4444 #CJK UNIFIED IDEOGRAPH + {0x9D5A, 0x62BB}, //4445 #CJK UNIFIED IDEOGRAPH + {0x9D5B, 0x62CF}, //4446 #CJK UNIFIED IDEOGRAPH + {0x9D5C, 0x62FF}, //4447 #CJK UNIFIED IDEOGRAPH + {0x9D5D, 0x62C6}, //4448 #CJK UNIFIED IDEOGRAPH + {0x9D5E, 0x64D4}, //4449 #CJK UNIFIED IDEOGRAPH + {0x9D5F, 0x62C8}, //4450 #CJK UNIFIED IDEOGRAPH + {0x9D60, 0x62DC}, //4451 #CJK UNIFIED IDEOGRAPH + {0x9D61, 0x62CC}, //4452 #CJK UNIFIED IDEOGRAPH + {0x9D62, 0x62CA}, //4453 #CJK UNIFIED IDEOGRAPH + {0x9D63, 0x62C2}, //4454 #CJK UNIFIED IDEOGRAPH + {0x9D64, 0x62C7}, //4455 #CJK UNIFIED IDEOGRAPH + {0x9D65, 0x629B}, //4456 #CJK UNIFIED IDEOGRAPH + {0x9D66, 0x62C9}, //4457 #CJK UNIFIED IDEOGRAPH + {0x9D67, 0x630C}, //4458 #CJK UNIFIED IDEOGRAPH + {0x9D68, 0x62EE}, //4459 #CJK UNIFIED IDEOGRAPH + {0x9D69, 0x62F1}, //4460 #CJK UNIFIED IDEOGRAPH + {0x9D6A, 0x6327}, //4461 #CJK UNIFIED IDEOGRAPH + {0x9D6B, 0x6302}, //4462 #CJK UNIFIED IDEOGRAPH + {0x9D6C, 0x6308}, //4463 #CJK UNIFIED IDEOGRAPH + {0x9D6D, 0x62EF}, //4464 #CJK UNIFIED IDEOGRAPH + {0x9D6E, 0x62F5}, //4465 #CJK UNIFIED IDEOGRAPH + {0x9D6F, 0x6350}, //4466 #CJK UNIFIED IDEOGRAPH + {0x9D70, 0x633E}, //4467 #CJK UNIFIED IDEOGRAPH + {0x9D71, 0x634D}, //4468 #CJK UNIFIED IDEOGRAPH + {0x9D72, 0x641C}, //4469 #CJK UNIFIED IDEOGRAPH + {0x9D73, 0x634F}, //4470 #CJK UNIFIED IDEOGRAPH + {0x9D74, 0x6396}, //4471 #CJK UNIFIED IDEOGRAPH + {0x9D75, 0x638E}, //4472 #CJK UNIFIED IDEOGRAPH + {0x9D76, 0x6380}, //4473 #CJK UNIFIED IDEOGRAPH + {0x9D77, 0x63AB}, //4474 #CJK UNIFIED IDEOGRAPH + {0x9D78, 0x6376}, //4475 #CJK UNIFIED IDEOGRAPH + {0x9D79, 0x63A3}, //4476 #CJK UNIFIED IDEOGRAPH + {0x9D7A, 0x638F}, //4477 #CJK UNIFIED IDEOGRAPH + {0x9D7B, 0x6389}, //4478 #CJK UNIFIED IDEOGRAPH + {0x9D7C, 0x639F}, //4479 #CJK UNIFIED IDEOGRAPH + {0x9D7D, 0x63B5}, //4480 #CJK UNIFIED IDEOGRAPH + {0x9D7E, 0x636B}, //4481 #CJK UNIFIED IDEOGRAPH + {0x9D80, 0x6369}, //4482 #CJK UNIFIED IDEOGRAPH + {0x9D81, 0x63BE}, //4483 #CJK UNIFIED IDEOGRAPH + {0x9D82, 0x63E9}, //4484 #CJK UNIFIED IDEOGRAPH + {0x9D83, 0x63C0}, //4485 #CJK UNIFIED IDEOGRAPH + {0x9D84, 0x63C6}, //4486 #CJK UNIFIED IDEOGRAPH + {0x9D85, 0x63E3}, //4487 #CJK UNIFIED IDEOGRAPH + {0x9D86, 0x63C9}, //4488 #CJK UNIFIED IDEOGRAPH + {0x9D87, 0x63D2}, //4489 #CJK UNIFIED IDEOGRAPH + {0x9D88, 0x63F6}, //4490 #CJK UNIFIED IDEOGRAPH + {0x9D89, 0x63C4}, //4491 #CJK UNIFIED IDEOGRAPH + {0x9D8A, 0x6416}, //4492 #CJK UNIFIED IDEOGRAPH + {0x9D8B, 0x6434}, //4493 #CJK UNIFIED IDEOGRAPH + {0x9D8C, 0x6406}, //4494 #CJK UNIFIED IDEOGRAPH + {0x9D8D, 0x6413}, //4495 #CJK UNIFIED IDEOGRAPH + {0x9D8E, 0x6426}, //4496 #CJK UNIFIED IDEOGRAPH + {0x9D8F, 0x6436}, //4497 #CJK UNIFIED IDEOGRAPH + {0x9D90, 0x651D}, //4498 #CJK UNIFIED IDEOGRAPH + {0x9D91, 0x6417}, //4499 #CJK UNIFIED IDEOGRAPH + {0x9D92, 0x6428}, //4500 #CJK UNIFIED IDEOGRAPH + {0x9D93, 0x640F}, //4501 #CJK UNIFIED IDEOGRAPH + {0x9D94, 0x6467}, //4502 #CJK UNIFIED IDEOGRAPH + {0x9D95, 0x646F}, //4503 #CJK UNIFIED IDEOGRAPH + {0x9D96, 0x6476}, //4504 #CJK UNIFIED IDEOGRAPH + {0x9D97, 0x644E}, //4505 #CJK UNIFIED IDEOGRAPH + {0x9D98, 0x652A}, //4506 #CJK UNIFIED IDEOGRAPH + {0x9D99, 0x6495}, //4507 #CJK UNIFIED IDEOGRAPH + {0x9D9A, 0x6493}, //4508 #CJK UNIFIED IDEOGRAPH + {0x9D9B, 0x64A5}, //4509 #CJK UNIFIED IDEOGRAPH + {0x9D9C, 0x64A9}, //4510 #CJK UNIFIED IDEOGRAPH + {0x9D9D, 0x6488}, //4511 #CJK UNIFIED IDEOGRAPH + {0x9D9E, 0x64BC}, //4512 #CJK UNIFIED IDEOGRAPH + {0x9D9F, 0x64DA}, //4513 #CJK UNIFIED IDEOGRAPH + {0x9DA0, 0x64D2}, //4514 #CJK UNIFIED IDEOGRAPH + {0x9DA1, 0x64C5}, //4515 #CJK UNIFIED IDEOGRAPH + {0x9DA2, 0x64C7}, //4516 #CJK UNIFIED IDEOGRAPH + {0x9DA3, 0x64BB}, //4517 #CJK UNIFIED IDEOGRAPH + {0x9DA4, 0x64D8}, //4518 #CJK UNIFIED IDEOGRAPH + {0x9DA5, 0x64C2}, //4519 #CJK UNIFIED IDEOGRAPH + {0x9DA6, 0x64F1}, //4520 #CJK UNIFIED IDEOGRAPH + {0x9DA7, 0x64E7}, //4521 #CJK UNIFIED IDEOGRAPH + {0x9DA8, 0x8209}, //4522 #CJK UNIFIED IDEOGRAPH + {0x9DA9, 0x64E0}, //4523 #CJK UNIFIED IDEOGRAPH + {0x9DAA, 0x64E1}, //4524 #CJK UNIFIED IDEOGRAPH + {0x9DAB, 0x62AC}, //4525 #CJK UNIFIED IDEOGRAPH + {0x9DAC, 0x64E3}, //4526 #CJK UNIFIED IDEOGRAPH + {0x9DAD, 0x64EF}, //4527 #CJK UNIFIED IDEOGRAPH + {0x9DAE, 0x652C}, //4528 #CJK UNIFIED IDEOGRAPH + {0x9DAF, 0x64F6}, //4529 #CJK UNIFIED IDEOGRAPH + {0x9DB0, 0x64F4}, //4530 #CJK UNIFIED IDEOGRAPH + {0x9DB1, 0x64F2}, //4531 #CJK UNIFIED IDEOGRAPH + {0x9DB2, 0x64FA}, //4532 #CJK UNIFIED IDEOGRAPH + {0x9DB3, 0x6500}, //4533 #CJK UNIFIED IDEOGRAPH + {0x9DB4, 0x64FD}, //4534 #CJK UNIFIED IDEOGRAPH + {0x9DB5, 0x6518}, //4535 #CJK UNIFIED IDEOGRAPH + {0x9DB6, 0x651C}, //4536 #CJK UNIFIED IDEOGRAPH + {0x9DB7, 0x6505}, //4537 #CJK UNIFIED IDEOGRAPH + {0x9DB8, 0x6524}, //4538 #CJK UNIFIED IDEOGRAPH + {0x9DB9, 0x6523}, //4539 #CJK UNIFIED IDEOGRAPH + {0x9DBA, 0x652B}, //4540 #CJK UNIFIED IDEOGRAPH + {0x9DBB, 0x6534}, //4541 #CJK UNIFIED IDEOGRAPH + {0x9DBC, 0x6535}, //4542 #CJK UNIFIED IDEOGRAPH + {0x9DBD, 0x6537}, //4543 #CJK UNIFIED IDEOGRAPH + {0x9DBE, 0x6536}, //4544 #CJK UNIFIED IDEOGRAPH + {0x9DBF, 0x6538}, //4545 #CJK UNIFIED IDEOGRAPH + {0x9DC0, 0x754B}, //4546 #CJK UNIFIED IDEOGRAPH + {0x9DC1, 0x6548}, //4547 #CJK UNIFIED IDEOGRAPH + {0x9DC2, 0x6556}, //4548 #CJK UNIFIED IDEOGRAPH + {0x9DC3, 0x6555}, //4549 #CJK UNIFIED IDEOGRAPH + {0x9DC4, 0x654D}, //4550 #CJK UNIFIED IDEOGRAPH + {0x9DC5, 0x6558}, //4551 #CJK UNIFIED IDEOGRAPH + {0x9DC6, 0x655E}, //4552 #CJK UNIFIED IDEOGRAPH + {0x9DC7, 0x655D}, //4553 #CJK UNIFIED IDEOGRAPH + {0x9DC8, 0x6572}, //4554 #CJK UNIFIED IDEOGRAPH + {0x9DC9, 0x6578}, //4555 #CJK UNIFIED IDEOGRAPH + {0x9DCA, 0x6582}, //4556 #CJK UNIFIED IDEOGRAPH + {0x9DCB, 0x6583}, //4557 #CJK UNIFIED IDEOGRAPH + {0x9DCC, 0x8B8A}, //4558 #CJK UNIFIED IDEOGRAPH + {0x9DCD, 0x659B}, //4559 #CJK UNIFIED IDEOGRAPH + {0x9DCE, 0x659F}, //4560 #CJK UNIFIED IDEOGRAPH + {0x9DCF, 0x65AB}, //4561 #CJK UNIFIED IDEOGRAPH + {0x9DD0, 0x65B7}, //4562 #CJK UNIFIED IDEOGRAPH + {0x9DD1, 0x65C3}, //4563 #CJK UNIFIED IDEOGRAPH + {0x9DD2, 0x65C6}, //4564 #CJK UNIFIED IDEOGRAPH + {0x9DD3, 0x65C1}, //4565 #CJK UNIFIED IDEOGRAPH + {0x9DD4, 0x65C4}, //4566 #CJK UNIFIED IDEOGRAPH + {0x9DD5, 0x65CC}, //4567 #CJK UNIFIED IDEOGRAPH + {0x9DD6, 0x65D2}, //4568 #CJK UNIFIED IDEOGRAPH + {0x9DD7, 0x65DB}, //4569 #CJK UNIFIED IDEOGRAPH + {0x9DD8, 0x65D9}, //4570 #CJK UNIFIED IDEOGRAPH + {0x9DD9, 0x65E0}, //4571 #CJK UNIFIED IDEOGRAPH + {0x9DDA, 0x65E1}, //4572 #CJK UNIFIED IDEOGRAPH + {0x9DDB, 0x65F1}, //4573 #CJK UNIFIED IDEOGRAPH + {0x9DDC, 0x6772}, //4574 #CJK UNIFIED IDEOGRAPH + {0x9DDD, 0x660A}, //4575 #CJK UNIFIED IDEOGRAPH + {0x9DDE, 0x6603}, //4576 #CJK UNIFIED IDEOGRAPH + {0x9DDF, 0x65FB}, //4577 #CJK UNIFIED IDEOGRAPH + {0x9DE0, 0x6773}, //4578 #CJK UNIFIED IDEOGRAPH + {0x9DE1, 0x6635}, //4579 #CJK UNIFIED IDEOGRAPH + {0x9DE2, 0x6636}, //4580 #CJK UNIFIED IDEOGRAPH + {0x9DE3, 0x6634}, //4581 #CJK UNIFIED IDEOGRAPH + {0x9DE4, 0x661C}, //4582 #CJK UNIFIED IDEOGRAPH + {0x9DE5, 0x664F}, //4583 #CJK UNIFIED IDEOGRAPH + {0x9DE6, 0x6644}, //4584 #CJK UNIFIED IDEOGRAPH + {0x9DE7, 0x6649}, //4585 #CJK UNIFIED IDEOGRAPH + {0x9DE8, 0x6641}, //4586 #CJK UNIFIED IDEOGRAPH + {0x9DE9, 0x665E}, //4587 #CJK UNIFIED IDEOGRAPH + {0x9DEA, 0x665D}, //4588 #CJK UNIFIED IDEOGRAPH + {0x9DEB, 0x6664}, //4589 #CJK UNIFIED IDEOGRAPH + {0x9DEC, 0x6667}, //4590 #CJK UNIFIED IDEOGRAPH + {0x9DED, 0x6668}, //4591 #CJK UNIFIED IDEOGRAPH + {0x9DEE, 0x665F}, //4592 #CJK UNIFIED IDEOGRAPH + {0x9DEF, 0x6662}, //4593 #CJK UNIFIED IDEOGRAPH + {0x9DF0, 0x6670}, //4594 #CJK UNIFIED IDEOGRAPH + {0x9DF1, 0x6683}, //4595 #CJK UNIFIED IDEOGRAPH + {0x9DF2, 0x6688}, //4596 #CJK UNIFIED IDEOGRAPH + {0x9DF3, 0x668E}, //4597 #CJK UNIFIED IDEOGRAPH + {0x9DF4, 0x6689}, //4598 #CJK UNIFIED IDEOGRAPH + {0x9DF5, 0x6684}, //4599 #CJK UNIFIED IDEOGRAPH + {0x9DF6, 0x6698}, //4600 #CJK UNIFIED IDEOGRAPH + {0x9DF7, 0x669D}, //4601 #CJK UNIFIED IDEOGRAPH + {0x9DF8, 0x66C1}, //4602 #CJK UNIFIED IDEOGRAPH + {0x9DF9, 0x66B9}, //4603 #CJK UNIFIED IDEOGRAPH + {0x9DFA, 0x66C9}, //4604 #CJK UNIFIED IDEOGRAPH + {0x9DFB, 0x66BE}, //4605 #CJK UNIFIED IDEOGRAPH + {0x9DFC, 0x66BC}, //4606 #CJK UNIFIED IDEOGRAPH + {0x9E40, 0x66C4}, //4607 #CJK UNIFIED IDEOGRAPH + {0x9E41, 0x66B8}, //4608 #CJK UNIFIED IDEOGRAPH + {0x9E42, 0x66D6}, //4609 #CJK UNIFIED IDEOGRAPH + {0x9E43, 0x66DA}, //4610 #CJK UNIFIED IDEOGRAPH + {0x9E44, 0x66E0}, //4611 #CJK UNIFIED IDEOGRAPH + {0x9E45, 0x663F}, //4612 #CJK UNIFIED IDEOGRAPH + {0x9E46, 0x66E6}, //4613 #CJK UNIFIED IDEOGRAPH + {0x9E47, 0x66E9}, //4614 #CJK UNIFIED IDEOGRAPH + {0x9E48, 0x66F0}, //4615 #CJK UNIFIED IDEOGRAPH + {0x9E49, 0x66F5}, //4616 #CJK UNIFIED IDEOGRAPH + {0x9E4A, 0x66F7}, //4617 #CJK UNIFIED IDEOGRAPH + {0x9E4B, 0x670F}, //4618 #CJK UNIFIED IDEOGRAPH + {0x9E4C, 0x6716}, //4619 #CJK UNIFIED IDEOGRAPH + {0x9E4D, 0x671E}, //4620 #CJK UNIFIED IDEOGRAPH + {0x9E4E, 0x6726}, //4621 #CJK UNIFIED IDEOGRAPH + {0x9E4F, 0x6727}, //4622 #CJK UNIFIED IDEOGRAPH + {0x9E50, 0x9738}, //4623 #CJK UNIFIED IDEOGRAPH + {0x9E51, 0x672E}, //4624 #CJK UNIFIED IDEOGRAPH + {0x9E52, 0x673F}, //4625 #CJK UNIFIED IDEOGRAPH + {0x9E53, 0x6736}, //4626 #CJK UNIFIED IDEOGRAPH + {0x9E54, 0x6741}, //4627 #CJK UNIFIED IDEOGRAPH + {0x9E55, 0x6738}, //4628 #CJK UNIFIED IDEOGRAPH + {0x9E56, 0x6737}, //4629 #CJK UNIFIED IDEOGRAPH + {0x9E57, 0x6746}, //4630 #CJK UNIFIED IDEOGRAPH + {0x9E58, 0x675E}, //4631 #CJK UNIFIED IDEOGRAPH + {0x9E59, 0x6760}, //4632 #CJK UNIFIED IDEOGRAPH + {0x9E5A, 0x6759}, //4633 #CJK UNIFIED IDEOGRAPH + {0x9E5B, 0x6763}, //4634 #CJK UNIFIED IDEOGRAPH + {0x9E5C, 0x6764}, //4635 #CJK UNIFIED IDEOGRAPH + {0x9E5D, 0x6789}, //4636 #CJK UNIFIED IDEOGRAPH + {0x9E5E, 0x6770}, //4637 #CJK UNIFIED IDEOGRAPH + {0x9E5F, 0x67A9}, //4638 #CJK UNIFIED IDEOGRAPH + {0x9E60, 0x677C}, //4639 #CJK UNIFIED IDEOGRAPH + {0x9E61, 0x676A}, //4640 #CJK UNIFIED IDEOGRAPH + {0x9E62, 0x678C}, //4641 #CJK UNIFIED IDEOGRAPH + {0x9E63, 0x678B}, //4642 #CJK UNIFIED IDEOGRAPH + {0x9E64, 0x67A6}, //4643 #CJK UNIFIED IDEOGRAPH + {0x9E65, 0x67A1}, //4644 #CJK UNIFIED IDEOGRAPH + {0x9E66, 0x6785}, //4645 #CJK UNIFIED IDEOGRAPH + {0x9E67, 0x67B7}, //4646 #CJK UNIFIED IDEOGRAPH + {0x9E68, 0x67EF}, //4647 #CJK UNIFIED IDEOGRAPH + {0x9E69, 0x67B4}, //4648 #CJK UNIFIED IDEOGRAPH + {0x9E6A, 0x67EC}, //4649 #CJK UNIFIED IDEOGRAPH + {0x9E6B, 0x67B3}, //4650 #CJK UNIFIED IDEOGRAPH + {0x9E6C, 0x67E9}, //4651 #CJK UNIFIED IDEOGRAPH + {0x9E6D, 0x67B8}, //4652 #CJK UNIFIED IDEOGRAPH + {0x9E6E, 0x67E4}, //4653 #CJK UNIFIED IDEOGRAPH + {0x9E6F, 0x67DE}, //4654 #CJK UNIFIED IDEOGRAPH + {0x9E70, 0x67DD}, //4655 #CJK UNIFIED IDEOGRAPH + {0x9E71, 0x67E2}, //4656 #CJK UNIFIED IDEOGRAPH + {0x9E72, 0x67EE}, //4657 #CJK UNIFIED IDEOGRAPH + {0x9E73, 0x67B9}, //4658 #CJK UNIFIED IDEOGRAPH + {0x9E74, 0x67CE}, //4659 #CJK UNIFIED IDEOGRAPH + {0x9E75, 0x67C6}, //4660 #CJK UNIFIED IDEOGRAPH + {0x9E76, 0x67E7}, //4661 #CJK UNIFIED IDEOGRAPH + {0x9E77, 0x6A9C}, //4662 #CJK UNIFIED IDEOGRAPH + {0x9E78, 0x681E}, //4663 #CJK UNIFIED IDEOGRAPH + {0x9E79, 0x6846}, //4664 #CJK UNIFIED IDEOGRAPH + {0x9E7A, 0x6829}, //4665 #CJK UNIFIED IDEOGRAPH + {0x9E7B, 0x6840}, //4666 #CJK UNIFIED IDEOGRAPH + {0x9E7C, 0x684D}, //4667 #CJK UNIFIED IDEOGRAPH + {0x9E7D, 0x6832}, //4668 #CJK UNIFIED IDEOGRAPH + {0x9E7E, 0x684E}, //4669 #CJK UNIFIED IDEOGRAPH + {0x9E80, 0x68B3}, //4670 #CJK UNIFIED IDEOGRAPH + {0x9E81, 0x682B}, //4671 #CJK UNIFIED IDEOGRAPH + {0x9E82, 0x6859}, //4672 #CJK UNIFIED IDEOGRAPH + {0x9E83, 0x6863}, //4673 #CJK UNIFIED IDEOGRAPH + {0x9E84, 0x6877}, //4674 #CJK UNIFIED IDEOGRAPH + {0x9E85, 0x687F}, //4675 #CJK UNIFIED IDEOGRAPH + {0x9E86, 0x689F}, //4676 #CJK UNIFIED IDEOGRAPH + {0x9E87, 0x688F}, //4677 #CJK UNIFIED IDEOGRAPH + {0x9E88, 0x68AD}, //4678 #CJK UNIFIED IDEOGRAPH + {0x9E89, 0x6894}, //4679 #CJK UNIFIED IDEOGRAPH + {0x9E8A, 0x689D}, //4680 #CJK UNIFIED IDEOGRAPH + {0x9E8B, 0x689B}, //4681 #CJK UNIFIED IDEOGRAPH + {0x9E8C, 0x6883}, //4682 #CJK UNIFIED IDEOGRAPH + {0x9E8D, 0x6AAE}, //4683 #CJK UNIFIED IDEOGRAPH + {0x9E8E, 0x68B9}, //4684 #CJK UNIFIED IDEOGRAPH + {0x9E8F, 0x6874}, //4685 #CJK UNIFIED IDEOGRAPH + {0x9E90, 0x68B5}, //4686 #CJK UNIFIED IDEOGRAPH + {0x9E91, 0x68A0}, //4687 #CJK UNIFIED IDEOGRAPH + {0x9E92, 0x68BA}, //4688 #CJK UNIFIED IDEOGRAPH + {0x9E93, 0x690F}, //4689 #CJK UNIFIED IDEOGRAPH + {0x9E94, 0x688D}, //4690 #CJK UNIFIED IDEOGRAPH + {0x9E95, 0x687E}, //4691 #CJK UNIFIED IDEOGRAPH + {0x9E96, 0x6901}, //4692 #CJK UNIFIED IDEOGRAPH + {0x9E97, 0x68CA}, //4693 #CJK UNIFIED IDEOGRAPH + {0x9E98, 0x6908}, //4694 #CJK UNIFIED IDEOGRAPH + {0x9E99, 0x68D8}, //4695 #CJK UNIFIED IDEOGRAPH + {0x9E9A, 0x6922}, //4696 #CJK UNIFIED IDEOGRAPH + {0x9E9B, 0x6926}, //4697 #CJK UNIFIED IDEOGRAPH + {0x9E9C, 0x68E1}, //4698 #CJK UNIFIED IDEOGRAPH + {0x9E9D, 0x690C}, //4699 #CJK UNIFIED IDEOGRAPH + {0x9E9E, 0x68CD}, //4700 #CJK UNIFIED IDEOGRAPH + {0x9E9F, 0x68D4}, //4701 #CJK UNIFIED IDEOGRAPH + {0x9EA0, 0x68E7}, //4702 #CJK UNIFIED IDEOGRAPH + {0x9EA1, 0x68D5}, //4703 #CJK UNIFIED IDEOGRAPH + {0x9EA2, 0x6936}, //4704 #CJK UNIFIED IDEOGRAPH + {0x9EA3, 0x6912}, //4705 #CJK UNIFIED IDEOGRAPH + {0x9EA4, 0x6904}, //4706 #CJK UNIFIED IDEOGRAPH + {0x9EA5, 0x68D7}, //4707 #CJK UNIFIED IDEOGRAPH + {0x9EA6, 0x68E3}, //4708 #CJK UNIFIED IDEOGRAPH + {0x9EA7, 0x6925}, //4709 #CJK UNIFIED IDEOGRAPH + {0x9EA8, 0x68F9}, //4710 #CJK UNIFIED IDEOGRAPH + {0x9EA9, 0x68E0}, //4711 #CJK UNIFIED IDEOGRAPH + {0x9EAA, 0x68EF}, //4712 #CJK UNIFIED IDEOGRAPH + {0x9EAB, 0x6928}, //4713 #CJK UNIFIED IDEOGRAPH + {0x9EAC, 0x692A}, //4714 #CJK UNIFIED IDEOGRAPH + {0x9EAD, 0x691A}, //4715 #CJK UNIFIED IDEOGRAPH + {0x9EAE, 0x6923}, //4716 #CJK UNIFIED IDEOGRAPH + {0x9EAF, 0x6921}, //4717 #CJK UNIFIED IDEOGRAPH + {0x9EB0, 0x68C6}, //4718 #CJK UNIFIED IDEOGRAPH + {0x9EB1, 0x6979}, //4719 #CJK UNIFIED IDEOGRAPH + {0x9EB2, 0x6977}, //4720 #CJK UNIFIED IDEOGRAPH + {0x9EB3, 0x695C}, //4721 #CJK UNIFIED IDEOGRAPH + {0x9EB4, 0x6978}, //4722 #CJK UNIFIED IDEOGRAPH + {0x9EB5, 0x696B}, //4723 #CJK UNIFIED IDEOGRAPH + {0x9EB6, 0x6954}, //4724 #CJK UNIFIED IDEOGRAPH + {0x9EB7, 0x697E}, //4725 #CJK UNIFIED IDEOGRAPH + {0x9EB8, 0x696E}, //4726 #CJK UNIFIED IDEOGRAPH + {0x9EB9, 0x6939}, //4727 #CJK UNIFIED IDEOGRAPH + {0x9EBA, 0x6974}, //4728 #CJK UNIFIED IDEOGRAPH + {0x9EBB, 0x693D}, //4729 #CJK UNIFIED IDEOGRAPH + {0x9EBC, 0x6959}, //4730 #CJK UNIFIED IDEOGRAPH + {0x9EBD, 0x6930}, //4731 #CJK UNIFIED IDEOGRAPH + {0x9EBE, 0x6961}, //4732 #CJK UNIFIED IDEOGRAPH + {0x9EBF, 0x695E}, //4733 #CJK UNIFIED IDEOGRAPH + {0x9EC0, 0x695D}, //4734 #CJK UNIFIED IDEOGRAPH + {0x9EC1, 0x6981}, //4735 #CJK UNIFIED IDEOGRAPH + {0x9EC2, 0x696A}, //4736 #CJK UNIFIED IDEOGRAPH + {0x9EC3, 0x69B2}, //4737 #CJK UNIFIED IDEOGRAPH + {0x9EC4, 0x69AE}, //4738 #CJK UNIFIED IDEOGRAPH + {0x9EC5, 0x69D0}, //4739 #CJK UNIFIED IDEOGRAPH + {0x9EC6, 0x69BF}, //4740 #CJK UNIFIED IDEOGRAPH + {0x9EC7, 0x69C1}, //4741 #CJK UNIFIED IDEOGRAPH + {0x9EC8, 0x69D3}, //4742 #CJK UNIFIED IDEOGRAPH + {0x9EC9, 0x69BE}, //4743 #CJK UNIFIED IDEOGRAPH + {0x9ECA, 0x69CE}, //4744 #CJK UNIFIED IDEOGRAPH + {0x9ECB, 0x5BE8}, //4745 #CJK UNIFIED IDEOGRAPH + {0x9ECC, 0x69CA}, //4746 #CJK UNIFIED IDEOGRAPH + {0x9ECD, 0x69DD}, //4747 #CJK UNIFIED IDEOGRAPH + {0x9ECE, 0x69BB}, //4748 #CJK UNIFIED IDEOGRAPH + {0x9ECF, 0x69C3}, //4749 #CJK UNIFIED IDEOGRAPH + {0x9ED0, 0x69A7}, //4750 #CJK UNIFIED IDEOGRAPH + {0x9ED1, 0x6A2E}, //4751 #CJK UNIFIED IDEOGRAPH + {0x9ED2, 0x6991}, //4752 #CJK UNIFIED IDEOGRAPH + {0x9ED3, 0x69A0}, //4753 #CJK UNIFIED IDEOGRAPH + {0x9ED4, 0x699C}, //4754 #CJK UNIFIED IDEOGRAPH + {0x9ED5, 0x6995}, //4755 #CJK UNIFIED IDEOGRAPH + {0x9ED6, 0x69B4}, //4756 #CJK UNIFIED IDEOGRAPH + {0x9ED7, 0x69DE}, //4757 #CJK UNIFIED IDEOGRAPH + {0x9ED8, 0x69E8}, //4758 #CJK UNIFIED IDEOGRAPH + {0x9ED9, 0x6A02}, //4759 #CJK UNIFIED IDEOGRAPH + {0x9EDA, 0x6A1B}, //4760 #CJK UNIFIED IDEOGRAPH + {0x9EDB, 0x69FF}, //4761 #CJK UNIFIED IDEOGRAPH + {0x9EDC, 0x6B0A}, //4762 #CJK UNIFIED IDEOGRAPH + {0x9EDD, 0x69F9}, //4763 #CJK UNIFIED IDEOGRAPH + {0x9EDE, 0x69F2}, //4764 #CJK UNIFIED IDEOGRAPH + {0x9EDF, 0x69E7}, //4765 #CJK UNIFIED IDEOGRAPH + {0x9EE0, 0x6A05}, //4766 #CJK UNIFIED IDEOGRAPH + {0x9EE1, 0x69B1}, //4767 #CJK UNIFIED IDEOGRAPH + {0x9EE2, 0x6A1E}, //4768 #CJK UNIFIED IDEOGRAPH + {0x9EE3, 0x69ED}, //4769 #CJK UNIFIED IDEOGRAPH + {0x9EE4, 0x6A14}, //4770 #CJK UNIFIED IDEOGRAPH + {0x9EE5, 0x69EB}, //4771 #CJK UNIFIED IDEOGRAPH + {0x9EE6, 0x6A0A}, //4772 #CJK UNIFIED IDEOGRAPH + {0x9EE7, 0x6A12}, //4773 #CJK UNIFIED IDEOGRAPH + {0x9EE8, 0x6AC1}, //4774 #CJK UNIFIED IDEOGRAPH + {0x9EE9, 0x6A23}, //4775 #CJK UNIFIED IDEOGRAPH + {0x9EEA, 0x6A13}, //4776 #CJK UNIFIED IDEOGRAPH + {0x9EEB, 0x6A44}, //4777 #CJK UNIFIED IDEOGRAPH + {0x9EEC, 0x6A0C}, //4778 #CJK UNIFIED IDEOGRAPH + {0x9EED, 0x6A72}, //4779 #CJK UNIFIED IDEOGRAPH + {0x9EEE, 0x6A36}, //4780 #CJK UNIFIED IDEOGRAPH + {0x9EEF, 0x6A78}, //4781 #CJK UNIFIED IDEOGRAPH + {0x9EF0, 0x6A47}, //4782 #CJK UNIFIED IDEOGRAPH + {0x9EF1, 0x6A62}, //4783 #CJK UNIFIED IDEOGRAPH + {0x9EF2, 0x6A59}, //4784 #CJK UNIFIED IDEOGRAPH + {0x9EF3, 0x6A66}, //4785 #CJK UNIFIED IDEOGRAPH + {0x9EF4, 0x6A48}, //4786 #CJK UNIFIED IDEOGRAPH + {0x9EF5, 0x6A38}, //4787 #CJK UNIFIED IDEOGRAPH + {0x9EF6, 0x6A22}, //4788 #CJK UNIFIED IDEOGRAPH + {0x9EF7, 0x6A90}, //4789 #CJK UNIFIED IDEOGRAPH + {0x9EF8, 0x6A8D}, //4790 #CJK UNIFIED IDEOGRAPH + {0x9EF9, 0x6AA0}, //4791 #CJK UNIFIED IDEOGRAPH + {0x9EFA, 0x6A84}, //4792 #CJK UNIFIED IDEOGRAPH + {0x9EFB, 0x6AA2}, //4793 #CJK UNIFIED IDEOGRAPH + {0x9EFC, 0x6AA3}, //4794 #CJK UNIFIED IDEOGRAPH + {0x9F40, 0x6A97}, //4795 #CJK UNIFIED IDEOGRAPH + {0x9F41, 0x8617}, //4796 #CJK UNIFIED IDEOGRAPH + {0x9F42, 0x6ABB}, //4797 #CJK UNIFIED IDEOGRAPH + {0x9F43, 0x6AC3}, //4798 #CJK UNIFIED IDEOGRAPH + {0x9F44, 0x6AC2}, //4799 #CJK UNIFIED IDEOGRAPH + {0x9F45, 0x6AB8}, //4800 #CJK UNIFIED IDEOGRAPH + {0x9F46, 0x6AB3}, //4801 #CJK UNIFIED IDEOGRAPH + {0x9F47, 0x6AAC}, //4802 #CJK UNIFIED IDEOGRAPH + {0x9F48, 0x6ADE}, //4803 #CJK UNIFIED IDEOGRAPH + {0x9F49, 0x6AD1}, //4804 #CJK UNIFIED IDEOGRAPH + {0x9F4A, 0x6ADF}, //4805 #CJK UNIFIED IDEOGRAPH + {0x9F4B, 0x6AAA}, //4806 #CJK UNIFIED IDEOGRAPH + {0x9F4C, 0x6ADA}, //4807 #CJK UNIFIED IDEOGRAPH + {0x9F4D, 0x6AEA}, //4808 #CJK UNIFIED IDEOGRAPH + {0x9F4E, 0x6AFB}, //4809 #CJK UNIFIED IDEOGRAPH + {0x9F4F, 0x6B05}, //4810 #CJK UNIFIED IDEOGRAPH + {0x9F50, 0x8616}, //4811 #CJK UNIFIED IDEOGRAPH + {0x9F51, 0x6AFA}, //4812 #CJK UNIFIED IDEOGRAPH + {0x9F52, 0x6B12}, //4813 #CJK UNIFIED IDEOGRAPH + {0x9F53, 0x6B16}, //4814 #CJK UNIFIED IDEOGRAPH + {0x9F54, 0x9B31}, //4815 #CJK UNIFIED IDEOGRAPH + {0x9F55, 0x6B1F}, //4816 #CJK UNIFIED IDEOGRAPH + {0x9F56, 0x6B38}, //4817 #CJK UNIFIED IDEOGRAPH + {0x9F57, 0x6B37}, //4818 #CJK UNIFIED IDEOGRAPH + {0x9F58, 0x76DC}, //4819 #CJK UNIFIED IDEOGRAPH + {0x9F59, 0x6B39}, //4820 #CJK UNIFIED IDEOGRAPH + {0x9F5A, 0x98EE}, //4821 #CJK UNIFIED IDEOGRAPH + {0x9F5B, 0x6B47}, //4822 #CJK UNIFIED IDEOGRAPH + {0x9F5C, 0x6B43}, //4823 #CJK UNIFIED IDEOGRAPH + {0x9F5D, 0x6B49}, //4824 #CJK UNIFIED IDEOGRAPH + {0x9F5E, 0x6B50}, //4825 #CJK UNIFIED IDEOGRAPH + {0x9F5F, 0x6B59}, //4826 #CJK UNIFIED IDEOGRAPH + {0x9F60, 0x6B54}, //4827 #CJK UNIFIED IDEOGRAPH + {0x9F61, 0x6B5B}, //4828 #CJK UNIFIED IDEOGRAPH + {0x9F62, 0x6B5F}, //4829 #CJK UNIFIED IDEOGRAPH + {0x9F63, 0x6B61}, //4830 #CJK UNIFIED IDEOGRAPH + {0x9F64, 0x6B78}, //4831 #CJK UNIFIED IDEOGRAPH + {0x9F65, 0x6B79}, //4832 #CJK UNIFIED IDEOGRAPH + {0x9F66, 0x6B7F}, //4833 #CJK UNIFIED IDEOGRAPH + {0x9F67, 0x6B80}, //4834 #CJK UNIFIED IDEOGRAPH + {0x9F68, 0x6B84}, //4835 #CJK UNIFIED IDEOGRAPH + {0x9F69, 0x6B83}, //4836 #CJK UNIFIED IDEOGRAPH + {0x9F6A, 0x6B8D}, //4837 #CJK UNIFIED IDEOGRAPH + {0x9F6B, 0x6B98}, //4838 #CJK UNIFIED IDEOGRAPH + {0x9F6C, 0x6B95}, //4839 #CJK UNIFIED IDEOGRAPH + {0x9F6D, 0x6B9E}, //4840 #CJK UNIFIED IDEOGRAPH + {0x9F6E, 0x6BA4}, //4841 #CJK UNIFIED IDEOGRAPH + {0x9F6F, 0x6BAA}, //4842 #CJK UNIFIED IDEOGRAPH + {0x9F70, 0x6BAB}, //4843 #CJK UNIFIED IDEOGRAPH + {0x9F71, 0x6BAF}, //4844 #CJK UNIFIED IDEOGRAPH + {0x9F72, 0x6BB2}, //4845 #CJK UNIFIED IDEOGRAPH + {0x9F73, 0x6BB1}, //4846 #CJK UNIFIED IDEOGRAPH + {0x9F74, 0x6BB3}, //4847 #CJK UNIFIED IDEOGRAPH + {0x9F75, 0x6BB7}, //4848 #CJK UNIFIED IDEOGRAPH + {0x9F76, 0x6BBC}, //4849 #CJK UNIFIED IDEOGRAPH + {0x9F77, 0x6BC6}, //4850 #CJK UNIFIED IDEOGRAPH + {0x9F78, 0x6BCB}, //4851 #CJK UNIFIED IDEOGRAPH + {0x9F79, 0x6BD3}, //4852 #CJK UNIFIED IDEOGRAPH + {0x9F7A, 0x6BDF}, //4853 #CJK UNIFIED IDEOGRAPH + {0x9F7B, 0x6BEC}, //4854 #CJK UNIFIED IDEOGRAPH + {0x9F7C, 0x6BEB}, //4855 #CJK UNIFIED IDEOGRAPH + {0x9F7D, 0x6BF3}, //4856 #CJK UNIFIED IDEOGRAPH + {0x9F7E, 0x6BEF}, //4857 #CJK UNIFIED IDEOGRAPH + {0x9F80, 0x9EBE}, //4858 #CJK UNIFIED IDEOGRAPH + {0x9F81, 0x6C08}, //4859 #CJK UNIFIED IDEOGRAPH + {0x9F82, 0x6C13}, //4860 #CJK UNIFIED IDEOGRAPH + {0x9F83, 0x6C14}, //4861 #CJK UNIFIED IDEOGRAPH + {0x9F84, 0x6C1B}, //4862 #CJK UNIFIED IDEOGRAPH + {0x9F85, 0x6C24}, //4863 #CJK UNIFIED IDEOGRAPH + {0x9F86, 0x6C23}, //4864 #CJK UNIFIED IDEOGRAPH + {0x9F87, 0x6C5E}, //4865 #CJK UNIFIED IDEOGRAPH + {0x9F88, 0x6C55}, //4866 #CJK UNIFIED IDEOGRAPH + {0x9F89, 0x6C62}, //4867 #CJK UNIFIED IDEOGRAPH + {0x9F8A, 0x6C6A}, //4868 #CJK UNIFIED IDEOGRAPH + {0x9F8B, 0x6C82}, //4869 #CJK UNIFIED IDEOGRAPH + {0x9F8C, 0x6C8D}, //4870 #CJK UNIFIED IDEOGRAPH + {0x9F8D, 0x6C9A}, //4871 #CJK UNIFIED IDEOGRAPH + {0x9F8E, 0x6C81}, //4872 #CJK UNIFIED IDEOGRAPH + {0x9F8F, 0x6C9B}, //4873 #CJK UNIFIED IDEOGRAPH + {0x9F90, 0x6C7E}, //4874 #CJK UNIFIED IDEOGRAPH + {0x9F91, 0x6C68}, //4875 #CJK UNIFIED IDEOGRAPH + {0x9F92, 0x6C73}, //4876 #CJK UNIFIED IDEOGRAPH + {0x9F93, 0x6C92}, //4877 #CJK UNIFIED IDEOGRAPH + {0x9F94, 0x6C90}, //4878 #CJK UNIFIED IDEOGRAPH + {0x9F95, 0x6CC4}, //4879 #CJK UNIFIED IDEOGRAPH + {0x9F96, 0x6CF1}, //4880 #CJK UNIFIED IDEOGRAPH + {0x9F97, 0x6CD3}, //4881 #CJK UNIFIED IDEOGRAPH + {0x9F98, 0x6CBD}, //4882 #CJK UNIFIED IDEOGRAPH + {0x9F99, 0x6CD7}, //4883 #CJK UNIFIED IDEOGRAPH + {0x9F9A, 0x6CC5}, //4884 #CJK UNIFIED IDEOGRAPH + {0x9F9B, 0x6CDD}, //4885 #CJK UNIFIED IDEOGRAPH + {0x9F9C, 0x6CAE}, //4886 #CJK UNIFIED IDEOGRAPH + {0x9F9D, 0x6CB1}, //4887 #CJK UNIFIED IDEOGRAPH + {0x9F9E, 0x6CBE}, //4888 #CJK UNIFIED IDEOGRAPH + {0x9F9F, 0x6CBA}, //4889 #CJK UNIFIED IDEOGRAPH + {0x9FA0, 0x6CDB}, //4890 #CJK UNIFIED IDEOGRAPH + {0x9FA1, 0x6CEF}, //4891 #CJK UNIFIED IDEOGRAPH + {0x9FA2, 0x6CD9}, //4892 #CJK UNIFIED IDEOGRAPH + {0x9FA3, 0x6CEA}, //4893 #CJK UNIFIED IDEOGRAPH + {0x9FA4, 0x6D1F}, //4894 #CJK UNIFIED IDEOGRAPH + {0x9FA5, 0x884D}, //4895 #CJK UNIFIED IDEOGRAPH + {0x9FA6, 0x6D36}, //4896 #CJK UNIFIED IDEOGRAPH + {0x9FA7, 0x6D2B}, //4897 #CJK UNIFIED IDEOGRAPH + {0x9FA8, 0x6D3D}, //4898 #CJK UNIFIED IDEOGRAPH + {0x9FA9, 0x6D38}, //4899 #CJK UNIFIED IDEOGRAPH + {0x9FAA, 0x6D19}, //4900 #CJK UNIFIED IDEOGRAPH + {0x9FAB, 0x6D35}, //4901 #CJK UNIFIED IDEOGRAPH + {0x9FAC, 0x6D33}, //4902 #CJK UNIFIED IDEOGRAPH + {0x9FAD, 0x6D12}, //4903 #CJK UNIFIED IDEOGRAPH + {0x9FAE, 0x6D0C}, //4904 #CJK UNIFIED IDEOGRAPH + {0x9FAF, 0x6D63}, //4905 #CJK UNIFIED IDEOGRAPH + {0x9FB0, 0x6D93}, //4906 #CJK UNIFIED IDEOGRAPH + {0x9FB1, 0x6D64}, //4907 #CJK UNIFIED IDEOGRAPH + {0x9FB2, 0x6D5A}, //4908 #CJK UNIFIED IDEOGRAPH + {0x9FB3, 0x6D79}, //4909 #CJK UNIFIED IDEOGRAPH + {0x9FB4, 0x6D59}, //4910 #CJK UNIFIED IDEOGRAPH + {0x9FB5, 0x6D8E}, //4911 #CJK UNIFIED IDEOGRAPH + {0x9FB6, 0x6D95}, //4912 #CJK UNIFIED IDEOGRAPH + {0x9FB7, 0x6FE4}, //4913 #CJK UNIFIED IDEOGRAPH + {0x9FB8, 0x6D85}, //4914 #CJK UNIFIED IDEOGRAPH + {0x9FB9, 0x6DF9}, //4915 #CJK UNIFIED IDEOGRAPH + {0x9FBA, 0x6E15}, //4916 #CJK UNIFIED IDEOGRAPH + {0x9FBB, 0x6E0A}, //4917 #CJK UNIFIED IDEOGRAPH + {0x9FBC, 0x6DB5}, //4918 #CJK UNIFIED IDEOGRAPH + {0x9FBD, 0x6DC7}, //4919 #CJK UNIFIED IDEOGRAPH + {0x9FBE, 0x6DE6}, //4920 #CJK UNIFIED IDEOGRAPH + {0x9FBF, 0x6DB8}, //4921 #CJK UNIFIED IDEOGRAPH + {0x9FC0, 0x6DC6}, //4922 #CJK UNIFIED IDEOGRAPH + {0x9FC1, 0x6DEC}, //4923 #CJK UNIFIED IDEOGRAPH + {0x9FC2, 0x6DDE}, //4924 #CJK UNIFIED IDEOGRAPH + {0x9FC3, 0x6DCC}, //4925 #CJK UNIFIED IDEOGRAPH + {0x9FC4, 0x6DE8}, //4926 #CJK UNIFIED IDEOGRAPH + {0x9FC5, 0x6DD2}, //4927 #CJK UNIFIED IDEOGRAPH + {0x9FC6, 0x6DC5}, //4928 #CJK UNIFIED IDEOGRAPH + {0x9FC7, 0x6DFA}, //4929 #CJK UNIFIED IDEOGRAPH + {0x9FC8, 0x6DD9}, //4930 #CJK UNIFIED IDEOGRAPH + {0x9FC9, 0x6DE4}, //4931 #CJK UNIFIED IDEOGRAPH + {0x9FCA, 0x6DD5}, //4932 #CJK UNIFIED IDEOGRAPH + {0x9FCB, 0x6DEA}, //4933 #CJK UNIFIED IDEOGRAPH + {0x9FCC, 0x6DEE}, //4934 #CJK UNIFIED IDEOGRAPH + {0x9FCD, 0x6E2D}, //4935 #CJK UNIFIED IDEOGRAPH + {0x9FCE, 0x6E6E}, //4936 #CJK UNIFIED IDEOGRAPH + {0x9FCF, 0x6E2E}, //4937 #CJK UNIFIED IDEOGRAPH + {0x9FD0, 0x6E19}, //4938 #CJK UNIFIED IDEOGRAPH + {0x9FD1, 0x6E72}, //4939 #CJK UNIFIED IDEOGRAPH + {0x9FD2, 0x6E5F}, //4940 #CJK UNIFIED IDEOGRAPH + {0x9FD3, 0x6E3E}, //4941 #CJK UNIFIED IDEOGRAPH + {0x9FD4, 0x6E23}, //4942 #CJK UNIFIED IDEOGRAPH + {0x9FD5, 0x6E6B}, //4943 #CJK UNIFIED IDEOGRAPH + {0x9FD6, 0x6E2B}, //4944 #CJK UNIFIED IDEOGRAPH + {0x9FD7, 0x6E76}, //4945 #CJK UNIFIED IDEOGRAPH + {0x9FD8, 0x6E4D}, //4946 #CJK UNIFIED IDEOGRAPH + {0x9FD9, 0x6E1F}, //4947 #CJK UNIFIED IDEOGRAPH + {0x9FDA, 0x6E43}, //4948 #CJK UNIFIED IDEOGRAPH + {0x9FDB, 0x6E3A}, //4949 #CJK UNIFIED IDEOGRAPH + {0x9FDC, 0x6E4E}, //4950 #CJK UNIFIED IDEOGRAPH + {0x9FDD, 0x6E24}, //4951 #CJK UNIFIED IDEOGRAPH + {0x9FDE, 0x6EFF}, //4952 #CJK UNIFIED IDEOGRAPH + {0x9FDF, 0x6E1D}, //4953 #CJK UNIFIED IDEOGRAPH + {0x9FE0, 0x6E38}, //4954 #CJK UNIFIED IDEOGRAPH + {0x9FE1, 0x6E82}, //4955 #CJK UNIFIED IDEOGRAPH + {0x9FE2, 0x6EAA}, //4956 #CJK UNIFIED IDEOGRAPH + {0x9FE3, 0x6E98}, //4957 #CJK UNIFIED IDEOGRAPH + {0x9FE4, 0x6EC9}, //4958 #CJK UNIFIED IDEOGRAPH + {0x9FE5, 0x6EB7}, //4959 #CJK UNIFIED IDEOGRAPH + {0x9FE6, 0x6ED3}, //4960 #CJK UNIFIED IDEOGRAPH + {0x9FE7, 0x6EBD}, //4961 #CJK UNIFIED IDEOGRAPH + {0x9FE8, 0x6EAF}, //4962 #CJK UNIFIED IDEOGRAPH + {0x9FE9, 0x6EC4}, //4963 #CJK UNIFIED IDEOGRAPH + {0x9FEA, 0x6EB2}, //4964 #CJK UNIFIED IDEOGRAPH + {0x9FEB, 0x6ED4}, //4965 #CJK UNIFIED IDEOGRAPH + {0x9FEC, 0x6ED5}, //4966 #CJK UNIFIED IDEOGRAPH + {0x9FED, 0x6E8F}, //4967 #CJK UNIFIED IDEOGRAPH + {0x9FEE, 0x6EA5}, //4968 #CJK UNIFIED IDEOGRAPH + {0x9FEF, 0x6EC2}, //4969 #CJK UNIFIED IDEOGRAPH + {0x9FF0, 0x6E9F}, //4970 #CJK UNIFIED IDEOGRAPH + {0x9FF1, 0x6F41}, //4971 #CJK UNIFIED IDEOGRAPH + {0x9FF2, 0x6F11}, //4972 #CJK UNIFIED IDEOGRAPH + {0x9FF3, 0x704C}, //4973 #CJK UNIFIED IDEOGRAPH + {0x9FF4, 0x6EEC}, //4974 #CJK UNIFIED IDEOGRAPH + {0x9FF5, 0x6EF8}, //4975 #CJK UNIFIED IDEOGRAPH + {0x9FF6, 0x6EFE}, //4976 #CJK UNIFIED IDEOGRAPH + {0x9FF7, 0x6F3F}, //4977 #CJK UNIFIED IDEOGRAPH + {0x9FF8, 0x6EF2}, //4978 #CJK UNIFIED IDEOGRAPH + {0x9FF9, 0x6F31}, //4979 #CJK UNIFIED IDEOGRAPH + {0x9FFA, 0x6EEF}, //4980 #CJK UNIFIED IDEOGRAPH + {0x9FFB, 0x6F32}, //4981 #CJK UNIFIED IDEOGRAPH + {0x9FFC, 0x6ECC}, //4982 #CJK UNIFIED IDEOGRAPH + {0xE040, 0x6F3E}, //4983 #CJK UNIFIED IDEOGRAPH + {0xE041, 0x6F13}, //4984 #CJK UNIFIED IDEOGRAPH + {0xE042, 0x6EF7}, //4985 #CJK UNIFIED IDEOGRAPH + {0xE043, 0x6F86}, //4986 #CJK UNIFIED IDEOGRAPH + {0xE044, 0x6F7A}, //4987 #CJK UNIFIED IDEOGRAPH + {0xE045, 0x6F78}, //4988 #CJK UNIFIED IDEOGRAPH + {0xE046, 0x6F81}, //4989 #CJK UNIFIED IDEOGRAPH + {0xE047, 0x6F80}, //4990 #CJK UNIFIED IDEOGRAPH + {0xE048, 0x6F6F}, //4991 #CJK UNIFIED IDEOGRAPH + {0xE049, 0x6F5B}, //4992 #CJK UNIFIED IDEOGRAPH + {0xE04A, 0x6FF3}, //4993 #CJK UNIFIED IDEOGRAPH + {0xE04B, 0x6F6D}, //4994 #CJK UNIFIED IDEOGRAPH + {0xE04C, 0x6F82}, //4995 #CJK UNIFIED IDEOGRAPH + {0xE04D, 0x6F7C}, //4996 #CJK UNIFIED IDEOGRAPH + {0xE04E, 0x6F58}, //4997 #CJK UNIFIED IDEOGRAPH + {0xE04F, 0x6F8E}, //4998 #CJK UNIFIED IDEOGRAPH + {0xE050, 0x6F91}, //4999 #CJK UNIFIED IDEOGRAPH + {0xE051, 0x6FC2}, //5000 #CJK UNIFIED IDEOGRAPH + {0xE052, 0x6F66}, //5001 #CJK UNIFIED IDEOGRAPH + {0xE053, 0x6FB3}, //5002 #CJK UNIFIED IDEOGRAPH + {0xE054, 0x6FA3}, //5003 #CJK UNIFIED IDEOGRAPH + {0xE055, 0x6FA1}, //5004 #CJK UNIFIED IDEOGRAPH + {0xE056, 0x6FA4}, //5005 #CJK UNIFIED IDEOGRAPH + {0xE057, 0x6FB9}, //5006 #CJK UNIFIED IDEOGRAPH + {0xE058, 0x6FC6}, //5007 #CJK UNIFIED IDEOGRAPH + {0xE059, 0x6FAA}, //5008 #CJK UNIFIED IDEOGRAPH + {0xE05A, 0x6FDF}, //5009 #CJK UNIFIED IDEOGRAPH + {0xE05B, 0x6FD5}, //5010 #CJK UNIFIED IDEOGRAPH + {0xE05C, 0x6FEC}, //5011 #CJK UNIFIED IDEOGRAPH + {0xE05D, 0x6FD4}, //5012 #CJK UNIFIED IDEOGRAPH + {0xE05E, 0x6FD8}, //5013 #CJK UNIFIED IDEOGRAPH + {0xE05F, 0x6FF1}, //5014 #CJK UNIFIED IDEOGRAPH + {0xE060, 0x6FEE}, //5015 #CJK UNIFIED IDEOGRAPH + {0xE061, 0x6FDB}, //5016 #CJK UNIFIED IDEOGRAPH + {0xE062, 0x7009}, //5017 #CJK UNIFIED IDEOGRAPH + {0xE063, 0x700B}, //5018 #CJK UNIFIED IDEOGRAPH + {0xE064, 0x6FFA}, //5019 #CJK UNIFIED IDEOGRAPH + {0xE065, 0x7011}, //5020 #CJK UNIFIED IDEOGRAPH + {0xE066, 0x7001}, //5021 #CJK UNIFIED IDEOGRAPH + {0xE067, 0x700F}, //5022 #CJK UNIFIED IDEOGRAPH + {0xE068, 0x6FFE}, //5023 #CJK UNIFIED IDEOGRAPH + {0xE069, 0x701B}, //5024 #CJK UNIFIED IDEOGRAPH + {0xE06A, 0x701A}, //5025 #CJK UNIFIED IDEOGRAPH + {0xE06B, 0x6F74}, //5026 #CJK UNIFIED IDEOGRAPH + {0xE06C, 0x701D}, //5027 #CJK UNIFIED IDEOGRAPH + {0xE06D, 0x7018}, //5028 #CJK UNIFIED IDEOGRAPH + {0xE06E, 0x701F}, //5029 #CJK UNIFIED IDEOGRAPH + {0xE06F, 0x7030}, //5030 #CJK UNIFIED IDEOGRAPH + {0xE070, 0x703E}, //5031 #CJK UNIFIED IDEOGRAPH + {0xE071, 0x7032}, //5032 #CJK UNIFIED IDEOGRAPH + {0xE072, 0x7051}, //5033 #CJK UNIFIED IDEOGRAPH + {0xE073, 0x7063}, //5034 #CJK UNIFIED IDEOGRAPH + {0xE074, 0x7099}, //5035 #CJK UNIFIED IDEOGRAPH + {0xE075, 0x7092}, //5036 #CJK UNIFIED IDEOGRAPH + {0xE076, 0x70AF}, //5037 #CJK UNIFIED IDEOGRAPH + {0xE077, 0x70F1}, //5038 #CJK UNIFIED IDEOGRAPH + {0xE078, 0x70AC}, //5039 #CJK UNIFIED IDEOGRAPH + {0xE079, 0x70B8}, //5040 #CJK UNIFIED IDEOGRAPH + {0xE07A, 0x70B3}, //5041 #CJK UNIFIED IDEOGRAPH + {0xE07B, 0x70AE}, //5042 #CJK UNIFIED IDEOGRAPH + {0xE07C, 0x70DF}, //5043 #CJK UNIFIED IDEOGRAPH + {0xE07D, 0x70CB}, //5044 #CJK UNIFIED IDEOGRAPH + {0xE07E, 0x70DD}, //5045 #CJK UNIFIED IDEOGRAPH + {0xE080, 0x70D9}, //5046 #CJK UNIFIED IDEOGRAPH + {0xE081, 0x7109}, //5047 #CJK UNIFIED IDEOGRAPH + {0xE082, 0x70FD}, //5048 #CJK UNIFIED IDEOGRAPH + {0xE083, 0x711C}, //5049 #CJK UNIFIED IDEOGRAPH + {0xE084, 0x7119}, //5050 #CJK UNIFIED IDEOGRAPH + {0xE085, 0x7165}, //5051 #CJK UNIFIED IDEOGRAPH + {0xE086, 0x7155}, //5052 #CJK UNIFIED IDEOGRAPH + {0xE087, 0x7188}, //5053 #CJK UNIFIED IDEOGRAPH + {0xE088, 0x7166}, //5054 #CJK UNIFIED IDEOGRAPH + {0xE089, 0x7162}, //5055 #CJK UNIFIED IDEOGRAPH + {0xE08A, 0x714C}, //5056 #CJK UNIFIED IDEOGRAPH + {0xE08B, 0x7156}, //5057 #CJK UNIFIED IDEOGRAPH + {0xE08C, 0x716C}, //5058 #CJK UNIFIED IDEOGRAPH + {0xE08D, 0x718F}, //5059 #CJK UNIFIED IDEOGRAPH + {0xE08E, 0x71FB}, //5060 #CJK UNIFIED IDEOGRAPH + {0xE08F, 0x7184}, //5061 #CJK UNIFIED IDEOGRAPH + {0xE090, 0x7195}, //5062 #CJK UNIFIED IDEOGRAPH + {0xE091, 0x71A8}, //5063 #CJK UNIFIED IDEOGRAPH + {0xE092, 0x71AC}, //5064 #CJK UNIFIED IDEOGRAPH + {0xE093, 0x71D7}, //5065 #CJK UNIFIED IDEOGRAPH + {0xE094, 0x71B9}, //5066 #CJK UNIFIED IDEOGRAPH + {0xE095, 0x71BE}, //5067 #CJK UNIFIED IDEOGRAPH + {0xE096, 0x71D2}, //5068 #CJK UNIFIED IDEOGRAPH + {0xE097, 0x71C9}, //5069 #CJK UNIFIED IDEOGRAPH + {0xE098, 0x71D4}, //5070 #CJK UNIFIED IDEOGRAPH + {0xE099, 0x71CE}, //5071 #CJK UNIFIED IDEOGRAPH + {0xE09A, 0x71E0}, //5072 #CJK UNIFIED IDEOGRAPH + {0xE09B, 0x71EC}, //5073 #CJK UNIFIED IDEOGRAPH + {0xE09C, 0x71E7}, //5074 #CJK UNIFIED IDEOGRAPH + {0xE09D, 0x71F5}, //5075 #CJK UNIFIED IDEOGRAPH + {0xE09E, 0x71FC}, //5076 #CJK UNIFIED IDEOGRAPH + {0xE09F, 0x71F9}, //5077 #CJK UNIFIED IDEOGRAPH + {0xE0A0, 0x71FF}, //5078 #CJK UNIFIED IDEOGRAPH + {0xE0A1, 0x720D}, //5079 #CJK UNIFIED IDEOGRAPH + {0xE0A2, 0x7210}, //5080 #CJK UNIFIED IDEOGRAPH + {0xE0A3, 0x721B}, //5081 #CJK UNIFIED IDEOGRAPH + {0xE0A4, 0x7228}, //5082 #CJK UNIFIED IDEOGRAPH + {0xE0A5, 0x722D}, //5083 #CJK UNIFIED IDEOGRAPH + {0xE0A6, 0x722C}, //5084 #CJK UNIFIED IDEOGRAPH + {0xE0A7, 0x7230}, //5085 #CJK UNIFIED IDEOGRAPH + {0xE0A8, 0x7232}, //5086 #CJK UNIFIED IDEOGRAPH + {0xE0A9, 0x723B}, //5087 #CJK UNIFIED IDEOGRAPH + {0xE0AA, 0x723C}, //5088 #CJK UNIFIED IDEOGRAPH + {0xE0AB, 0x723F}, //5089 #CJK UNIFIED IDEOGRAPH + {0xE0AC, 0x7240}, //5090 #CJK UNIFIED IDEOGRAPH + {0xE0AD, 0x7246}, //5091 #CJK UNIFIED IDEOGRAPH + {0xE0AE, 0x724B}, //5092 #CJK UNIFIED IDEOGRAPH + {0xE0AF, 0x7258}, //5093 #CJK UNIFIED IDEOGRAPH + {0xE0B0, 0x7274}, //5094 #CJK UNIFIED IDEOGRAPH + {0xE0B1, 0x727E}, //5095 #CJK UNIFIED IDEOGRAPH + {0xE0B2, 0x7282}, //5096 #CJK UNIFIED IDEOGRAPH + {0xE0B3, 0x7281}, //5097 #CJK UNIFIED IDEOGRAPH + {0xE0B4, 0x7287}, //5098 #CJK UNIFIED IDEOGRAPH + {0xE0B5, 0x7292}, //5099 #CJK UNIFIED IDEOGRAPH + {0xE0B6, 0x7296}, //5100 #CJK UNIFIED IDEOGRAPH + {0xE0B7, 0x72A2}, //5101 #CJK UNIFIED IDEOGRAPH + {0xE0B8, 0x72A7}, //5102 #CJK UNIFIED IDEOGRAPH + {0xE0B9, 0x72B9}, //5103 #CJK UNIFIED IDEOGRAPH + {0xE0BA, 0x72B2}, //5104 #CJK UNIFIED IDEOGRAPH + {0xE0BB, 0x72C3}, //5105 #CJK UNIFIED IDEOGRAPH + {0xE0BC, 0x72C6}, //5106 #CJK UNIFIED IDEOGRAPH + {0xE0BD, 0x72C4}, //5107 #CJK UNIFIED IDEOGRAPH + {0xE0BE, 0x72CE}, //5108 #CJK UNIFIED IDEOGRAPH + {0xE0BF, 0x72D2}, //5109 #CJK UNIFIED IDEOGRAPH + {0xE0C0, 0x72E2}, //5110 #CJK UNIFIED IDEOGRAPH + {0xE0C1, 0x72E0}, //5111 #CJK UNIFIED IDEOGRAPH + {0xE0C2, 0x72E1}, //5112 #CJK UNIFIED IDEOGRAPH + {0xE0C3, 0x72F9}, //5113 #CJK UNIFIED IDEOGRAPH + {0xE0C4, 0x72F7}, //5114 #CJK UNIFIED IDEOGRAPH + {0xE0C5, 0x500F}, //5115 #CJK UNIFIED IDEOGRAPH + {0xE0C6, 0x7317}, //5116 #CJK UNIFIED IDEOGRAPH + {0xE0C7, 0x730A}, //5117 #CJK UNIFIED IDEOGRAPH + {0xE0C8, 0x731C}, //5118 #CJK UNIFIED IDEOGRAPH + {0xE0C9, 0x7316}, //5119 #CJK UNIFIED IDEOGRAPH + {0xE0CA, 0x731D}, //5120 #CJK UNIFIED IDEOGRAPH + {0xE0CB, 0x7334}, //5121 #CJK UNIFIED IDEOGRAPH + {0xE0CC, 0x732F}, //5122 #CJK UNIFIED IDEOGRAPH + {0xE0CD, 0x7329}, //5123 #CJK UNIFIED IDEOGRAPH + {0xE0CE, 0x7325}, //5124 #CJK UNIFIED IDEOGRAPH + {0xE0CF, 0x733E}, //5125 #CJK UNIFIED IDEOGRAPH + {0xE0D0, 0x734E}, //5126 #CJK UNIFIED IDEOGRAPH + {0xE0D1, 0x734F}, //5127 #CJK UNIFIED IDEOGRAPH + {0xE0D2, 0x9ED8}, //5128 #CJK UNIFIED IDEOGRAPH + {0xE0D3, 0x7357}, //5129 #CJK UNIFIED IDEOGRAPH + {0xE0D4, 0x736A}, //5130 #CJK UNIFIED IDEOGRAPH + {0xE0D5, 0x7368}, //5131 #CJK UNIFIED IDEOGRAPH + {0xE0D6, 0x7370}, //5132 #CJK UNIFIED IDEOGRAPH + {0xE0D7, 0x7378}, //5133 #CJK UNIFIED IDEOGRAPH + {0xE0D8, 0x7375}, //5134 #CJK UNIFIED IDEOGRAPH + {0xE0D9, 0x737B}, //5135 #CJK UNIFIED IDEOGRAPH + {0xE0DA, 0x737A}, //5136 #CJK UNIFIED IDEOGRAPH + {0xE0DB, 0x73C8}, //5137 #CJK UNIFIED IDEOGRAPH + {0xE0DC, 0x73B3}, //5138 #CJK UNIFIED IDEOGRAPH + {0xE0DD, 0x73CE}, //5139 #CJK UNIFIED IDEOGRAPH + {0xE0DE, 0x73BB}, //5140 #CJK UNIFIED IDEOGRAPH + {0xE0DF, 0x73C0}, //5141 #CJK UNIFIED IDEOGRAPH + {0xE0E0, 0x73E5}, //5142 #CJK UNIFIED IDEOGRAPH + {0xE0E1, 0x73EE}, //5143 #CJK UNIFIED IDEOGRAPH + {0xE0E2, 0x73DE}, //5144 #CJK UNIFIED IDEOGRAPH + {0xE0E3, 0x74A2}, //5145 #CJK UNIFIED IDEOGRAPH + {0xE0E4, 0x7405}, //5146 #CJK UNIFIED IDEOGRAPH + {0xE0E5, 0x746F}, //5147 #CJK UNIFIED IDEOGRAPH + {0xE0E6, 0x7425}, //5148 #CJK UNIFIED IDEOGRAPH + {0xE0E7, 0x73F8}, //5149 #CJK UNIFIED IDEOGRAPH + {0xE0E8, 0x7432}, //5150 #CJK UNIFIED IDEOGRAPH + {0xE0E9, 0x743A}, //5151 #CJK UNIFIED IDEOGRAPH + {0xE0EA, 0x7455}, //5152 #CJK UNIFIED IDEOGRAPH + {0xE0EB, 0x743F}, //5153 #CJK UNIFIED IDEOGRAPH + {0xE0EC, 0x745F}, //5154 #CJK UNIFIED IDEOGRAPH + {0xE0ED, 0x7459}, //5155 #CJK UNIFIED IDEOGRAPH + {0xE0EE, 0x7441}, //5156 #CJK UNIFIED IDEOGRAPH + {0xE0EF, 0x745C}, //5157 #CJK UNIFIED IDEOGRAPH + {0xE0F0, 0x7469}, //5158 #CJK UNIFIED IDEOGRAPH + {0xE0F1, 0x7470}, //5159 #CJK UNIFIED IDEOGRAPH + {0xE0F2, 0x7463}, //5160 #CJK UNIFIED IDEOGRAPH + {0xE0F3, 0x746A}, //5161 #CJK UNIFIED IDEOGRAPH + {0xE0F4, 0x7476}, //5162 #CJK UNIFIED IDEOGRAPH + {0xE0F5, 0x747E}, //5163 #CJK UNIFIED IDEOGRAPH + {0xE0F6, 0x748B}, //5164 #CJK UNIFIED IDEOGRAPH + {0xE0F7, 0x749E}, //5165 #CJK UNIFIED IDEOGRAPH + {0xE0F8, 0x74A7}, //5166 #CJK UNIFIED IDEOGRAPH + {0xE0F9, 0x74CA}, //5167 #CJK UNIFIED IDEOGRAPH + {0xE0FA, 0x74CF}, //5168 #CJK UNIFIED IDEOGRAPH + {0xE0FB, 0x74D4}, //5169 #CJK UNIFIED IDEOGRAPH + {0xE0FC, 0x73F1}, //5170 #CJK UNIFIED IDEOGRAPH + {0xE140, 0x74E0}, //5171 #CJK UNIFIED IDEOGRAPH + {0xE141, 0x74E3}, //5172 #CJK UNIFIED IDEOGRAPH + {0xE142, 0x74E7}, //5173 #CJK UNIFIED IDEOGRAPH + {0xE143, 0x74E9}, //5174 #CJK UNIFIED IDEOGRAPH + {0xE144, 0x74EE}, //5175 #CJK UNIFIED IDEOGRAPH + {0xE145, 0x74F2}, //5176 #CJK UNIFIED IDEOGRAPH + {0xE146, 0x74F0}, //5177 #CJK UNIFIED IDEOGRAPH + {0xE147, 0x74F1}, //5178 #CJK UNIFIED IDEOGRAPH + {0xE148, 0x74F8}, //5179 #CJK UNIFIED IDEOGRAPH + {0xE149, 0x74F7}, //5180 #CJK UNIFIED IDEOGRAPH + {0xE14A, 0x7504}, //5181 #CJK UNIFIED IDEOGRAPH + {0xE14B, 0x7503}, //5182 #CJK UNIFIED IDEOGRAPH + {0xE14C, 0x7505}, //5183 #CJK UNIFIED IDEOGRAPH + {0xE14D, 0x750C}, //5184 #CJK UNIFIED IDEOGRAPH + {0xE14E, 0x750E}, //5185 #CJK UNIFIED IDEOGRAPH + {0xE14F, 0x750D}, //5186 #CJK UNIFIED IDEOGRAPH + {0xE150, 0x7515}, //5187 #CJK UNIFIED IDEOGRAPH + {0xE151, 0x7513}, //5188 #CJK UNIFIED IDEOGRAPH + {0xE152, 0x751E}, //5189 #CJK UNIFIED IDEOGRAPH + {0xE153, 0x7526}, //5190 #CJK UNIFIED IDEOGRAPH + {0xE154, 0x752C}, //5191 #CJK UNIFIED IDEOGRAPH + {0xE155, 0x753C}, //5192 #CJK UNIFIED IDEOGRAPH + {0xE156, 0x7544}, //5193 #CJK UNIFIED IDEOGRAPH + {0xE157, 0x754D}, //5194 #CJK UNIFIED IDEOGRAPH + {0xE158, 0x754A}, //5195 #CJK UNIFIED IDEOGRAPH + {0xE159, 0x7549}, //5196 #CJK UNIFIED IDEOGRAPH + {0xE15A, 0x755B}, //5197 #CJK UNIFIED IDEOGRAPH + {0xE15B, 0x7546}, //5198 #CJK UNIFIED IDEOGRAPH + {0xE15C, 0x755A}, //5199 #CJK UNIFIED IDEOGRAPH + {0xE15D, 0x7569}, //5200 #CJK UNIFIED IDEOGRAPH + {0xE15E, 0x7564}, //5201 #CJK UNIFIED IDEOGRAPH + {0xE15F, 0x7567}, //5202 #CJK UNIFIED IDEOGRAPH + {0xE160, 0x756B}, //5203 #CJK UNIFIED IDEOGRAPH + {0xE161, 0x756D}, //5204 #CJK UNIFIED IDEOGRAPH + {0xE162, 0x7578}, //5205 #CJK UNIFIED IDEOGRAPH + {0xE163, 0x7576}, //5206 #CJK UNIFIED IDEOGRAPH + {0xE164, 0x7586}, //5207 #CJK UNIFIED IDEOGRAPH + {0xE165, 0x7587}, //5208 #CJK UNIFIED IDEOGRAPH + {0xE166, 0x7574}, //5209 #CJK UNIFIED IDEOGRAPH + {0xE167, 0x758A}, //5210 #CJK UNIFIED IDEOGRAPH + {0xE168, 0x7589}, //5211 #CJK UNIFIED IDEOGRAPH + {0xE169, 0x7582}, //5212 #CJK UNIFIED IDEOGRAPH + {0xE16A, 0x7594}, //5213 #CJK UNIFIED IDEOGRAPH + {0xE16B, 0x759A}, //5214 #CJK UNIFIED IDEOGRAPH + {0xE16C, 0x759D}, //5215 #CJK UNIFIED IDEOGRAPH + {0xE16D, 0x75A5}, //5216 #CJK UNIFIED IDEOGRAPH + {0xE16E, 0x75A3}, //5217 #CJK UNIFIED IDEOGRAPH + {0xE16F, 0x75C2}, //5218 #CJK UNIFIED IDEOGRAPH + {0xE170, 0x75B3}, //5219 #CJK UNIFIED IDEOGRAPH + {0xE171, 0x75C3}, //5220 #CJK UNIFIED IDEOGRAPH + {0xE172, 0x75B5}, //5221 #CJK UNIFIED IDEOGRAPH + {0xE173, 0x75BD}, //5222 #CJK UNIFIED IDEOGRAPH + {0xE174, 0x75B8}, //5223 #CJK UNIFIED IDEOGRAPH + {0xE175, 0x75BC}, //5224 #CJK UNIFIED IDEOGRAPH + {0xE176, 0x75B1}, //5225 #CJK UNIFIED IDEOGRAPH + {0xE177, 0x75CD}, //5226 #CJK UNIFIED IDEOGRAPH + {0xE178, 0x75CA}, //5227 #CJK UNIFIED IDEOGRAPH + {0xE179, 0x75D2}, //5228 #CJK UNIFIED IDEOGRAPH + {0xE17A, 0x75D9}, //5229 #CJK UNIFIED IDEOGRAPH + {0xE17B, 0x75E3}, //5230 #CJK UNIFIED IDEOGRAPH + {0xE17C, 0x75DE}, //5231 #CJK UNIFIED IDEOGRAPH + {0xE17D, 0x75FE}, //5232 #CJK UNIFIED IDEOGRAPH + {0xE17E, 0x75FF}, //5233 #CJK UNIFIED IDEOGRAPH + {0xE180, 0x75FC}, //5234 #CJK UNIFIED IDEOGRAPH + {0xE181, 0x7601}, //5235 #CJK UNIFIED IDEOGRAPH + {0xE182, 0x75F0}, //5236 #CJK UNIFIED IDEOGRAPH + {0xE183, 0x75FA}, //5237 #CJK UNIFIED IDEOGRAPH + {0xE184, 0x75F2}, //5238 #CJK UNIFIED IDEOGRAPH + {0xE185, 0x75F3}, //5239 #CJK UNIFIED IDEOGRAPH + {0xE186, 0x760B}, //5240 #CJK UNIFIED IDEOGRAPH + {0xE187, 0x760D}, //5241 #CJK UNIFIED IDEOGRAPH + {0xE188, 0x7609}, //5242 #CJK UNIFIED IDEOGRAPH + {0xE189, 0x761F}, //5243 #CJK UNIFIED IDEOGRAPH + {0xE18A, 0x7627}, //5244 #CJK UNIFIED IDEOGRAPH + {0xE18B, 0x7620}, //5245 #CJK UNIFIED IDEOGRAPH + {0xE18C, 0x7621}, //5246 #CJK UNIFIED IDEOGRAPH + {0xE18D, 0x7622}, //5247 #CJK UNIFIED IDEOGRAPH + {0xE18E, 0x7624}, //5248 #CJK UNIFIED IDEOGRAPH + {0xE18F, 0x7634}, //5249 #CJK UNIFIED IDEOGRAPH + {0xE190, 0x7630}, //5250 #CJK UNIFIED IDEOGRAPH + {0xE191, 0x763B}, //5251 #CJK UNIFIED IDEOGRAPH + {0xE192, 0x7647}, //5252 #CJK UNIFIED IDEOGRAPH + {0xE193, 0x7648}, //5253 #CJK UNIFIED IDEOGRAPH + {0xE194, 0x7646}, //5254 #CJK UNIFIED IDEOGRAPH + {0xE195, 0x765C}, //5255 #CJK UNIFIED IDEOGRAPH + {0xE196, 0x7658}, //5256 #CJK UNIFIED IDEOGRAPH + {0xE197, 0x7661}, //5257 #CJK UNIFIED IDEOGRAPH + {0xE198, 0x7662}, //5258 #CJK UNIFIED IDEOGRAPH + {0xE199, 0x7668}, //5259 #CJK UNIFIED IDEOGRAPH + {0xE19A, 0x7669}, //5260 #CJK UNIFIED IDEOGRAPH + {0xE19B, 0x766A}, //5261 #CJK UNIFIED IDEOGRAPH + {0xE19C, 0x7667}, //5262 #CJK UNIFIED IDEOGRAPH + {0xE19D, 0x766C}, //5263 #CJK UNIFIED IDEOGRAPH + {0xE19E, 0x7670}, //5264 #CJK UNIFIED IDEOGRAPH + {0xE19F, 0x7672}, //5265 #CJK UNIFIED IDEOGRAPH + {0xE1A0, 0x7676}, //5266 #CJK UNIFIED IDEOGRAPH + {0xE1A1, 0x7678}, //5267 #CJK UNIFIED IDEOGRAPH + {0xE1A2, 0x767C}, //5268 #CJK UNIFIED IDEOGRAPH + {0xE1A3, 0x7680}, //5269 #CJK UNIFIED IDEOGRAPH + {0xE1A4, 0x7683}, //5270 #CJK UNIFIED IDEOGRAPH + {0xE1A5, 0x7688}, //5271 #CJK UNIFIED IDEOGRAPH + {0xE1A6, 0x768B}, //5272 #CJK UNIFIED IDEOGRAPH + {0xE1A7, 0x768E}, //5273 #CJK UNIFIED IDEOGRAPH + {0xE1A8, 0x7696}, //5274 #CJK UNIFIED IDEOGRAPH + {0xE1A9, 0x7693}, //5275 #CJK UNIFIED IDEOGRAPH + {0xE1AA, 0x7699}, //5276 #CJK UNIFIED IDEOGRAPH + {0xE1AB, 0x769A}, //5277 #CJK UNIFIED IDEOGRAPH + {0xE1AC, 0x76B0}, //5278 #CJK UNIFIED IDEOGRAPH + {0xE1AD, 0x76B4}, //5279 #CJK UNIFIED IDEOGRAPH + {0xE1AE, 0x76B8}, //5280 #CJK UNIFIED IDEOGRAPH + {0xE1AF, 0x76B9}, //5281 #CJK UNIFIED IDEOGRAPH + {0xE1B0, 0x76BA}, //5282 #CJK UNIFIED IDEOGRAPH + {0xE1B1, 0x76C2}, //5283 #CJK UNIFIED IDEOGRAPH + {0xE1B2, 0x76CD}, //5284 #CJK UNIFIED IDEOGRAPH + {0xE1B3, 0x76D6}, //5285 #CJK UNIFIED IDEOGRAPH + {0xE1B4, 0x76D2}, //5286 #CJK UNIFIED IDEOGRAPH + {0xE1B5, 0x76DE}, //5287 #CJK UNIFIED IDEOGRAPH + {0xE1B6, 0x76E1}, //5288 #CJK UNIFIED IDEOGRAPH + {0xE1B7, 0x76E5}, //5289 #CJK UNIFIED IDEOGRAPH + {0xE1B8, 0x76E7}, //5290 #CJK UNIFIED IDEOGRAPH + {0xE1B9, 0x76EA}, //5291 #CJK UNIFIED IDEOGRAPH + {0xE1BA, 0x862F}, //5292 #CJK UNIFIED IDEOGRAPH + {0xE1BB, 0x76FB}, //5293 #CJK UNIFIED IDEOGRAPH + {0xE1BC, 0x7708}, //5294 #CJK UNIFIED IDEOGRAPH + {0xE1BD, 0x7707}, //5295 #CJK UNIFIED IDEOGRAPH + {0xE1BE, 0x7704}, //5296 #CJK UNIFIED IDEOGRAPH + {0xE1BF, 0x7729}, //5297 #CJK UNIFIED IDEOGRAPH + {0xE1C0, 0x7724}, //5298 #CJK UNIFIED IDEOGRAPH + {0xE1C1, 0x771E}, //5299 #CJK UNIFIED IDEOGRAPH + {0xE1C2, 0x7725}, //5300 #CJK UNIFIED IDEOGRAPH + {0xE1C3, 0x7726}, //5301 #CJK UNIFIED IDEOGRAPH + {0xE1C4, 0x771B}, //5302 #CJK UNIFIED IDEOGRAPH + {0xE1C5, 0x7737}, //5303 #CJK UNIFIED IDEOGRAPH + {0xE1C6, 0x7738}, //5304 #CJK UNIFIED IDEOGRAPH + {0xE1C7, 0x7747}, //5305 #CJK UNIFIED IDEOGRAPH + {0xE1C8, 0x775A}, //5306 #CJK UNIFIED IDEOGRAPH + {0xE1C9, 0x7768}, //5307 #CJK UNIFIED IDEOGRAPH + {0xE1CA, 0x776B}, //5308 #CJK UNIFIED IDEOGRAPH + {0xE1CB, 0x775B}, //5309 #CJK UNIFIED IDEOGRAPH + {0xE1CC, 0x7765}, //5310 #CJK UNIFIED IDEOGRAPH + {0xE1CD, 0x777F}, //5311 #CJK UNIFIED IDEOGRAPH + {0xE1CE, 0x777E}, //5312 #CJK UNIFIED IDEOGRAPH + {0xE1CF, 0x7779}, //5313 #CJK UNIFIED IDEOGRAPH + {0xE1D0, 0x778E}, //5314 #CJK UNIFIED IDEOGRAPH + {0xE1D1, 0x778B}, //5315 #CJK UNIFIED IDEOGRAPH + {0xE1D2, 0x7791}, //5316 #CJK UNIFIED IDEOGRAPH + {0xE1D3, 0x77A0}, //5317 #CJK UNIFIED IDEOGRAPH + {0xE1D4, 0x779E}, //5318 #CJK UNIFIED IDEOGRAPH + {0xE1D5, 0x77B0}, //5319 #CJK UNIFIED IDEOGRAPH + {0xE1D6, 0x77B6}, //5320 #CJK UNIFIED IDEOGRAPH + {0xE1D7, 0x77B9}, //5321 #CJK UNIFIED IDEOGRAPH + {0xE1D8, 0x77BF}, //5322 #CJK UNIFIED IDEOGRAPH + {0xE1D9, 0x77BC}, //5323 #CJK UNIFIED IDEOGRAPH + {0xE1DA, 0x77BD}, //5324 #CJK UNIFIED IDEOGRAPH + {0xE1DB, 0x77BB}, //5325 #CJK UNIFIED IDEOGRAPH + {0xE1DC, 0x77C7}, //5326 #CJK UNIFIED IDEOGRAPH + {0xE1DD, 0x77CD}, //5327 #CJK UNIFIED IDEOGRAPH + {0xE1DE, 0x77D7}, //5328 #CJK UNIFIED IDEOGRAPH + {0xE1DF, 0x77DA}, //5329 #CJK UNIFIED IDEOGRAPH + {0xE1E0, 0x77DC}, //5330 #CJK UNIFIED IDEOGRAPH + {0xE1E1, 0x77E3}, //5331 #CJK UNIFIED IDEOGRAPH + {0xE1E2, 0x77EE}, //5332 #CJK UNIFIED IDEOGRAPH + {0xE1E3, 0x77FC}, //5333 #CJK UNIFIED IDEOGRAPH + {0xE1E4, 0x780C}, //5334 #CJK UNIFIED IDEOGRAPH + {0xE1E5, 0x7812}, //5335 #CJK UNIFIED IDEOGRAPH + {0xE1E6, 0x7926}, //5336 #CJK UNIFIED IDEOGRAPH + {0xE1E7, 0x7820}, //5337 #CJK UNIFIED IDEOGRAPH + {0xE1E8, 0x792A}, //5338 #CJK UNIFIED IDEOGRAPH + {0xE1E9, 0x7845}, //5339 #CJK UNIFIED IDEOGRAPH + {0xE1EA, 0x788E}, //5340 #CJK UNIFIED IDEOGRAPH + {0xE1EB, 0x7874}, //5341 #CJK UNIFIED IDEOGRAPH + {0xE1EC, 0x7886}, //5342 #CJK UNIFIED IDEOGRAPH + {0xE1ED, 0x787C}, //5343 #CJK UNIFIED IDEOGRAPH + {0xE1EE, 0x789A}, //5344 #CJK UNIFIED IDEOGRAPH + {0xE1EF, 0x788C}, //5345 #CJK UNIFIED IDEOGRAPH + {0xE1F0, 0x78A3}, //5346 #CJK UNIFIED IDEOGRAPH + {0xE1F1, 0x78B5}, //5347 #CJK UNIFIED IDEOGRAPH + {0xE1F2, 0x78AA}, //5348 #CJK UNIFIED IDEOGRAPH + {0xE1F3, 0x78AF}, //5349 #CJK UNIFIED IDEOGRAPH + {0xE1F4, 0x78D1}, //5350 #CJK UNIFIED IDEOGRAPH + {0xE1F5, 0x78C6}, //5351 #CJK UNIFIED IDEOGRAPH + {0xE1F6, 0x78CB}, //5352 #CJK UNIFIED IDEOGRAPH + {0xE1F7, 0x78D4}, //5353 #CJK UNIFIED IDEOGRAPH + {0xE1F8, 0x78BE}, //5354 #CJK UNIFIED IDEOGRAPH + {0xE1F9, 0x78BC}, //5355 #CJK UNIFIED IDEOGRAPH + {0xE1FA, 0x78C5}, //5356 #CJK UNIFIED IDEOGRAPH + {0xE1FB, 0x78CA}, //5357 #CJK UNIFIED IDEOGRAPH + {0xE1FC, 0x78EC}, //5358 #CJK UNIFIED IDEOGRAPH + {0xE240, 0x78E7}, //5359 #CJK UNIFIED IDEOGRAPH + {0xE241, 0x78DA}, //5360 #CJK UNIFIED IDEOGRAPH + {0xE242, 0x78FD}, //5361 #CJK UNIFIED IDEOGRAPH + {0xE243, 0x78F4}, //5362 #CJK UNIFIED IDEOGRAPH + {0xE244, 0x7907}, //5363 #CJK UNIFIED IDEOGRAPH + {0xE245, 0x7912}, //5364 #CJK UNIFIED IDEOGRAPH + {0xE246, 0x7911}, //5365 #CJK UNIFIED IDEOGRAPH + {0xE247, 0x7919}, //5366 #CJK UNIFIED IDEOGRAPH + {0xE248, 0x792C}, //5367 #CJK UNIFIED IDEOGRAPH + {0xE249, 0x792B}, //5368 #CJK UNIFIED IDEOGRAPH + {0xE24A, 0x7940}, //5369 #CJK UNIFIED IDEOGRAPH + {0xE24B, 0x7960}, //5370 #CJK UNIFIED IDEOGRAPH + {0xE24C, 0x7957}, //5371 #CJK UNIFIED IDEOGRAPH + {0xE24D, 0x795F}, //5372 #CJK UNIFIED IDEOGRAPH + {0xE24E, 0x795A}, //5373 #CJK UNIFIED IDEOGRAPH + {0xE24F, 0x7955}, //5374 #CJK UNIFIED IDEOGRAPH + {0xE250, 0x7953}, //5375 #CJK UNIFIED IDEOGRAPH + {0xE251, 0x797A}, //5376 #CJK UNIFIED IDEOGRAPH + {0xE252, 0x797F}, //5377 #CJK UNIFIED IDEOGRAPH + {0xE253, 0x798A}, //5378 #CJK UNIFIED IDEOGRAPH + {0xE254, 0x799D}, //5379 #CJK UNIFIED IDEOGRAPH + {0xE255, 0x79A7}, //5380 #CJK UNIFIED IDEOGRAPH + {0xE256, 0x9F4B}, //5381 #CJK UNIFIED IDEOGRAPH + {0xE257, 0x79AA}, //5382 #CJK UNIFIED IDEOGRAPH + {0xE258, 0x79AE}, //5383 #CJK UNIFIED IDEOGRAPH + {0xE259, 0x79B3}, //5384 #CJK UNIFIED IDEOGRAPH + {0xE25A, 0x79B9}, //5385 #CJK UNIFIED IDEOGRAPH + {0xE25B, 0x79BA}, //5386 #CJK UNIFIED IDEOGRAPH + {0xE25C, 0x79C9}, //5387 #CJK UNIFIED IDEOGRAPH + {0xE25D, 0x79D5}, //5388 #CJK UNIFIED IDEOGRAPH + {0xE25E, 0x79E7}, //5389 #CJK UNIFIED IDEOGRAPH + {0xE25F, 0x79EC}, //5390 #CJK UNIFIED IDEOGRAPH + {0xE260, 0x79E1}, //5391 #CJK UNIFIED IDEOGRAPH + {0xE261, 0x79E3}, //5392 #CJK UNIFIED IDEOGRAPH + {0xE262, 0x7A08}, //5393 #CJK UNIFIED IDEOGRAPH + {0xE263, 0x7A0D}, //5394 #CJK UNIFIED IDEOGRAPH + {0xE264, 0x7A18}, //5395 #CJK UNIFIED IDEOGRAPH + {0xE265, 0x7A19}, //5396 #CJK UNIFIED IDEOGRAPH + {0xE266, 0x7A20}, //5397 #CJK UNIFIED IDEOGRAPH + {0xE267, 0x7A1F}, //5398 #CJK UNIFIED IDEOGRAPH + {0xE268, 0x7980}, //5399 #CJK UNIFIED IDEOGRAPH + {0xE269, 0x7A31}, //5400 #CJK UNIFIED IDEOGRAPH + {0xE26A, 0x7A3B}, //5401 #CJK UNIFIED IDEOGRAPH + {0xE26B, 0x7A3E}, //5402 #CJK UNIFIED IDEOGRAPH + {0xE26C, 0x7A37}, //5403 #CJK UNIFIED IDEOGRAPH + {0xE26D, 0x7A43}, //5404 #CJK UNIFIED IDEOGRAPH + {0xE26E, 0x7A57}, //5405 #CJK UNIFIED IDEOGRAPH + {0xE26F, 0x7A49}, //5406 #CJK UNIFIED IDEOGRAPH + {0xE270, 0x7A61}, //5407 #CJK UNIFIED IDEOGRAPH + {0xE271, 0x7A62}, //5408 #CJK UNIFIED IDEOGRAPH + {0xE272, 0x7A69}, //5409 #CJK UNIFIED IDEOGRAPH + {0xE273, 0x9F9D}, //5410 #CJK UNIFIED IDEOGRAPH + {0xE274, 0x7A70}, //5411 #CJK UNIFIED IDEOGRAPH + {0xE275, 0x7A79}, //5412 #CJK UNIFIED IDEOGRAPH + {0xE276, 0x7A7D}, //5413 #CJK UNIFIED IDEOGRAPH + {0xE277, 0x7A88}, //5414 #CJK UNIFIED IDEOGRAPH + {0xE278, 0x7A97}, //5415 #CJK UNIFIED IDEOGRAPH + {0xE279, 0x7A95}, //5416 #CJK UNIFIED IDEOGRAPH + {0xE27A, 0x7A98}, //5417 #CJK UNIFIED IDEOGRAPH + {0xE27B, 0x7A96}, //5418 #CJK UNIFIED IDEOGRAPH + {0xE27C, 0x7AA9}, //5419 #CJK UNIFIED IDEOGRAPH + {0xE27D, 0x7AC8}, //5420 #CJK UNIFIED IDEOGRAPH + {0xE27E, 0x7AB0}, //5421 #CJK UNIFIED IDEOGRAPH + {0xE280, 0x7AB6}, //5422 #CJK UNIFIED IDEOGRAPH + {0xE281, 0x7AC5}, //5423 #CJK UNIFIED IDEOGRAPH + {0xE282, 0x7AC4}, //5424 #CJK UNIFIED IDEOGRAPH + {0xE283, 0x7ABF}, //5425 #CJK UNIFIED IDEOGRAPH + {0xE284, 0x9083}, //5426 #CJK UNIFIED IDEOGRAPH + {0xE285, 0x7AC7}, //5427 #CJK UNIFIED IDEOGRAPH + {0xE286, 0x7ACA}, //5428 #CJK UNIFIED IDEOGRAPH + {0xE287, 0x7ACD}, //5429 #CJK UNIFIED IDEOGRAPH + {0xE288, 0x7ACF}, //5430 #CJK UNIFIED IDEOGRAPH + {0xE289, 0x7AD5}, //5431 #CJK UNIFIED IDEOGRAPH + {0xE28A, 0x7AD3}, //5432 #CJK UNIFIED IDEOGRAPH + {0xE28B, 0x7AD9}, //5433 #CJK UNIFIED IDEOGRAPH + {0xE28C, 0x7ADA}, //5434 #CJK UNIFIED IDEOGRAPH + {0xE28D, 0x7ADD}, //5435 #CJK UNIFIED IDEOGRAPH + {0xE28E, 0x7AE1}, //5436 #CJK UNIFIED IDEOGRAPH + {0xE28F, 0x7AE2}, //5437 #CJK UNIFIED IDEOGRAPH + {0xE290, 0x7AE6}, //5438 #CJK UNIFIED IDEOGRAPH + {0xE291, 0x7AED}, //5439 #CJK UNIFIED IDEOGRAPH + {0xE292, 0x7AF0}, //5440 #CJK UNIFIED IDEOGRAPH + {0xE293, 0x7B02}, //5441 #CJK UNIFIED IDEOGRAPH + {0xE294, 0x7B0F}, //5442 #CJK UNIFIED IDEOGRAPH + {0xE295, 0x7B0A}, //5443 #CJK UNIFIED IDEOGRAPH + {0xE296, 0x7B06}, //5444 #CJK UNIFIED IDEOGRAPH + {0xE297, 0x7B33}, //5445 #CJK UNIFIED IDEOGRAPH + {0xE298, 0x7B18}, //5446 #CJK UNIFIED IDEOGRAPH + {0xE299, 0x7B19}, //5447 #CJK UNIFIED IDEOGRAPH + {0xE29A, 0x7B1E}, //5448 #CJK UNIFIED IDEOGRAPH + {0xE29B, 0x7B35}, //5449 #CJK UNIFIED IDEOGRAPH + {0xE29C, 0x7B28}, //5450 #CJK UNIFIED IDEOGRAPH + {0xE29D, 0x7B36}, //5451 #CJK UNIFIED IDEOGRAPH + {0xE29E, 0x7B50}, //5452 #CJK UNIFIED IDEOGRAPH + {0xE29F, 0x7B7A}, //5453 #CJK UNIFIED IDEOGRAPH + {0xE2A0, 0x7B04}, //5454 #CJK UNIFIED IDEOGRAPH + {0xE2A1, 0x7B4D}, //5455 #CJK UNIFIED IDEOGRAPH + {0xE2A2, 0x7B0B}, //5456 #CJK UNIFIED IDEOGRAPH + {0xE2A3, 0x7B4C}, //5457 #CJK UNIFIED IDEOGRAPH + {0xE2A4, 0x7B45}, //5458 #CJK UNIFIED IDEOGRAPH + {0xE2A5, 0x7B75}, //5459 #CJK UNIFIED IDEOGRAPH + {0xE2A6, 0x7B65}, //5460 #CJK UNIFIED IDEOGRAPH + {0xE2A7, 0x7B74}, //5461 #CJK UNIFIED IDEOGRAPH + {0xE2A8, 0x7B67}, //5462 #CJK UNIFIED IDEOGRAPH + {0xE2A9, 0x7B70}, //5463 #CJK UNIFIED IDEOGRAPH + {0xE2AA, 0x7B71}, //5464 #CJK UNIFIED IDEOGRAPH + {0xE2AB, 0x7B6C}, //5465 #CJK UNIFIED IDEOGRAPH + {0xE2AC, 0x7B6E}, //5466 #CJK UNIFIED IDEOGRAPH + {0xE2AD, 0x7B9D}, //5467 #CJK UNIFIED IDEOGRAPH + {0xE2AE, 0x7B98}, //5468 #CJK UNIFIED IDEOGRAPH + {0xE2AF, 0x7B9F}, //5469 #CJK UNIFIED IDEOGRAPH + {0xE2B0, 0x7B8D}, //5470 #CJK UNIFIED IDEOGRAPH + {0xE2B1, 0x7B9C}, //5471 #CJK UNIFIED IDEOGRAPH + {0xE2B2, 0x7B9A}, //5472 #CJK UNIFIED IDEOGRAPH + {0xE2B3, 0x7B8B}, //5473 #CJK UNIFIED IDEOGRAPH + {0xE2B4, 0x7B92}, //5474 #CJK UNIFIED IDEOGRAPH + {0xE2B5, 0x7B8F}, //5475 #CJK UNIFIED IDEOGRAPH + {0xE2B6, 0x7B5D}, //5476 #CJK UNIFIED IDEOGRAPH + {0xE2B7, 0x7B99}, //5477 #CJK UNIFIED IDEOGRAPH + {0xE2B8, 0x7BCB}, //5478 #CJK UNIFIED IDEOGRAPH + {0xE2B9, 0x7BC1}, //5479 #CJK UNIFIED IDEOGRAPH + {0xE2BA, 0x7BCC}, //5480 #CJK UNIFIED IDEOGRAPH + {0xE2BB, 0x7BCF}, //5481 #CJK UNIFIED IDEOGRAPH + {0xE2BC, 0x7BB4}, //5482 #CJK UNIFIED IDEOGRAPH + {0xE2BD, 0x7BC6}, //5483 #CJK UNIFIED IDEOGRAPH + {0xE2BE, 0x7BDD}, //5484 #CJK UNIFIED IDEOGRAPH + {0xE2BF, 0x7BE9}, //5485 #CJK UNIFIED IDEOGRAPH + {0xE2C0, 0x7C11}, //5486 #CJK UNIFIED IDEOGRAPH + {0xE2C1, 0x7C14}, //5487 #CJK UNIFIED IDEOGRAPH + {0xE2C2, 0x7BE6}, //5488 #CJK UNIFIED IDEOGRAPH + {0xE2C3, 0x7BE5}, //5489 #CJK UNIFIED IDEOGRAPH + {0xE2C4, 0x7C60}, //5490 #CJK UNIFIED IDEOGRAPH + {0xE2C5, 0x7C00}, //5491 #CJK UNIFIED IDEOGRAPH + {0xE2C6, 0x7C07}, //5492 #CJK UNIFIED IDEOGRAPH + {0xE2C7, 0x7C13}, //5493 #CJK UNIFIED IDEOGRAPH + {0xE2C8, 0x7BF3}, //5494 #CJK UNIFIED IDEOGRAPH + {0xE2C9, 0x7BF7}, //5495 #CJK UNIFIED IDEOGRAPH + {0xE2CA, 0x7C17}, //5496 #CJK UNIFIED IDEOGRAPH + {0xE2CB, 0x7C0D}, //5497 #CJK UNIFIED IDEOGRAPH + {0xE2CC, 0x7BF6}, //5498 #CJK UNIFIED IDEOGRAPH + {0xE2CD, 0x7C23}, //5499 #CJK UNIFIED IDEOGRAPH + {0xE2CE, 0x7C27}, //5500 #CJK UNIFIED IDEOGRAPH + {0xE2CF, 0x7C2A}, //5501 #CJK UNIFIED IDEOGRAPH + {0xE2D0, 0x7C1F}, //5502 #CJK UNIFIED IDEOGRAPH + {0xE2D1, 0x7C37}, //5503 #CJK UNIFIED IDEOGRAPH + {0xE2D2, 0x7C2B}, //5504 #CJK UNIFIED IDEOGRAPH + {0xE2D3, 0x7C3D}, //5505 #CJK UNIFIED IDEOGRAPH + {0xE2D4, 0x7C4C}, //5506 #CJK UNIFIED IDEOGRAPH + {0xE2D5, 0x7C43}, //5507 #CJK UNIFIED IDEOGRAPH + {0xE2D6, 0x7C54}, //5508 #CJK UNIFIED IDEOGRAPH + {0xE2D7, 0x7C4F}, //5509 #CJK UNIFIED IDEOGRAPH + {0xE2D8, 0x7C40}, //5510 #CJK UNIFIED IDEOGRAPH + {0xE2D9, 0x7C50}, //5511 #CJK UNIFIED IDEOGRAPH + {0xE2DA, 0x7C58}, //5512 #CJK UNIFIED IDEOGRAPH + {0xE2DB, 0x7C5F}, //5513 #CJK UNIFIED IDEOGRAPH + {0xE2DC, 0x7C64}, //5514 #CJK UNIFIED IDEOGRAPH + {0xE2DD, 0x7C56}, //5515 #CJK UNIFIED IDEOGRAPH + {0xE2DE, 0x7C65}, //5516 #CJK UNIFIED IDEOGRAPH + {0xE2DF, 0x7C6C}, //5517 #CJK UNIFIED IDEOGRAPH + {0xE2E0, 0x7C75}, //5518 #CJK UNIFIED IDEOGRAPH + {0xE2E1, 0x7C83}, //5519 #CJK UNIFIED IDEOGRAPH + {0xE2E2, 0x7C90}, //5520 #CJK UNIFIED IDEOGRAPH + {0xE2E3, 0x7CA4}, //5521 #CJK UNIFIED IDEOGRAPH + {0xE2E4, 0x7CAD}, //5522 #CJK UNIFIED IDEOGRAPH + {0xE2E5, 0x7CA2}, //5523 #CJK UNIFIED IDEOGRAPH + {0xE2E6, 0x7CAB}, //5524 #CJK UNIFIED IDEOGRAPH + {0xE2E7, 0x7CA1}, //5525 #CJK UNIFIED IDEOGRAPH + {0xE2E8, 0x7CA8}, //5526 #CJK UNIFIED IDEOGRAPH + {0xE2E9, 0x7CB3}, //5527 #CJK UNIFIED IDEOGRAPH + {0xE2EA, 0x7CB2}, //5528 #CJK UNIFIED IDEOGRAPH + {0xE2EB, 0x7CB1}, //5529 #CJK UNIFIED IDEOGRAPH + {0xE2EC, 0x7CAE}, //5530 #CJK UNIFIED IDEOGRAPH + {0xE2ED, 0x7CB9}, //5531 #CJK UNIFIED IDEOGRAPH + {0xE2EE, 0x7CBD}, //5532 #CJK UNIFIED IDEOGRAPH + {0xE2EF, 0x7CC0}, //5533 #CJK UNIFIED IDEOGRAPH + {0xE2F0, 0x7CC5}, //5534 #CJK UNIFIED IDEOGRAPH + {0xE2F1, 0x7CC2}, //5535 #CJK UNIFIED IDEOGRAPH + {0xE2F2, 0x7CD8}, //5536 #CJK UNIFIED IDEOGRAPH + {0xE2F3, 0x7CD2}, //5537 #CJK UNIFIED IDEOGRAPH + {0xE2F4, 0x7CDC}, //5538 #CJK UNIFIED IDEOGRAPH + {0xE2F5, 0x7CE2}, //5539 #CJK UNIFIED IDEOGRAPH + {0xE2F6, 0x9B3B}, //5540 #CJK UNIFIED IDEOGRAPH + {0xE2F7, 0x7CEF}, //5541 #CJK UNIFIED IDEOGRAPH + {0xE2F8, 0x7CF2}, //5542 #CJK UNIFIED IDEOGRAPH + {0xE2F9, 0x7CF4}, //5543 #CJK UNIFIED IDEOGRAPH + {0xE2FA, 0x7CF6}, //5544 #CJK UNIFIED IDEOGRAPH + {0xE2FB, 0x7CFA}, //5545 #CJK UNIFIED IDEOGRAPH + {0xE2FC, 0x7D06}, //5546 #CJK UNIFIED IDEOGRAPH + {0xE340, 0x7D02}, //5547 #CJK UNIFIED IDEOGRAPH + {0xE341, 0x7D1C}, //5548 #CJK UNIFIED IDEOGRAPH + {0xE342, 0x7D15}, //5549 #CJK UNIFIED IDEOGRAPH + {0xE343, 0x7D0A}, //5550 #CJK UNIFIED IDEOGRAPH + {0xE344, 0x7D45}, //5551 #CJK UNIFIED IDEOGRAPH + {0xE345, 0x7D4B}, //5552 #CJK UNIFIED IDEOGRAPH + {0xE346, 0x7D2E}, //5553 #CJK UNIFIED IDEOGRAPH + {0xE347, 0x7D32}, //5554 #CJK UNIFIED IDEOGRAPH + {0xE348, 0x7D3F}, //5555 #CJK UNIFIED IDEOGRAPH + {0xE349, 0x7D35}, //5556 #CJK UNIFIED IDEOGRAPH + {0xE34A, 0x7D46}, //5557 #CJK UNIFIED IDEOGRAPH + {0xE34B, 0x7D73}, //5558 #CJK UNIFIED IDEOGRAPH + {0xE34C, 0x7D56}, //5559 #CJK UNIFIED IDEOGRAPH + {0xE34D, 0x7D4E}, //5560 #CJK UNIFIED IDEOGRAPH + {0xE34E, 0x7D72}, //5561 #CJK UNIFIED IDEOGRAPH + {0xE34F, 0x7D68}, //5562 #CJK UNIFIED IDEOGRAPH + {0xE350, 0x7D6E}, //5563 #CJK UNIFIED IDEOGRAPH + {0xE351, 0x7D4F}, //5564 #CJK UNIFIED IDEOGRAPH + {0xE352, 0x7D63}, //5565 #CJK UNIFIED IDEOGRAPH + {0xE353, 0x7D93}, //5566 #CJK UNIFIED IDEOGRAPH + {0xE354, 0x7D89}, //5567 #CJK UNIFIED IDEOGRAPH + {0xE355, 0x7D5B}, //5568 #CJK UNIFIED IDEOGRAPH + {0xE356, 0x7D8F}, //5569 #CJK UNIFIED IDEOGRAPH + {0xE357, 0x7D7D}, //5570 #CJK UNIFIED IDEOGRAPH + {0xE358, 0x7D9B}, //5571 #CJK UNIFIED IDEOGRAPH + {0xE359, 0x7DBA}, //5572 #CJK UNIFIED IDEOGRAPH + {0xE35A, 0x7DAE}, //5573 #CJK UNIFIED IDEOGRAPH + {0xE35B, 0x7DA3}, //5574 #CJK UNIFIED IDEOGRAPH + {0xE35C, 0x7DB5}, //5575 #CJK UNIFIED IDEOGRAPH + {0xE35D, 0x7DC7}, //5576 #CJK UNIFIED IDEOGRAPH + {0xE35E, 0x7DBD}, //5577 #CJK UNIFIED IDEOGRAPH + {0xE35F, 0x7DAB}, //5578 #CJK UNIFIED IDEOGRAPH + {0xE360, 0x7E3D}, //5579 #CJK UNIFIED IDEOGRAPH + {0xE361, 0x7DA2}, //5580 #CJK UNIFIED IDEOGRAPH + {0xE362, 0x7DAF}, //5581 #CJK UNIFIED IDEOGRAPH + {0xE363, 0x7DDC}, //5582 #CJK UNIFIED IDEOGRAPH + {0xE364, 0x7DB8}, //5583 #CJK UNIFIED IDEOGRAPH + {0xE365, 0x7D9F}, //5584 #CJK UNIFIED IDEOGRAPH + {0xE366, 0x7DB0}, //5585 #CJK UNIFIED IDEOGRAPH + {0xE367, 0x7DD8}, //5586 #CJK UNIFIED IDEOGRAPH + {0xE368, 0x7DDD}, //5587 #CJK UNIFIED IDEOGRAPH + {0xE369, 0x7DE4}, //5588 #CJK UNIFIED IDEOGRAPH + {0xE36A, 0x7DDE}, //5589 #CJK UNIFIED IDEOGRAPH + {0xE36B, 0x7DFB}, //5590 #CJK UNIFIED IDEOGRAPH + {0xE36C, 0x7DF2}, //5591 #CJK UNIFIED IDEOGRAPH + {0xE36D, 0x7DE1}, //5592 #CJK UNIFIED IDEOGRAPH + {0xE36E, 0x7E05}, //5593 #CJK UNIFIED IDEOGRAPH + {0xE36F, 0x7E0A}, //5594 #CJK UNIFIED IDEOGRAPH + {0xE370, 0x7E23}, //5595 #CJK UNIFIED IDEOGRAPH + {0xE371, 0x7E21}, //5596 #CJK UNIFIED IDEOGRAPH + {0xE372, 0x7E12}, //5597 #CJK UNIFIED IDEOGRAPH + {0xE373, 0x7E31}, //5598 #CJK UNIFIED IDEOGRAPH + {0xE374, 0x7E1F}, //5599 #CJK UNIFIED IDEOGRAPH + {0xE375, 0x7E09}, //5600 #CJK UNIFIED IDEOGRAPH + {0xE376, 0x7E0B}, //5601 #CJK UNIFIED IDEOGRAPH + {0xE377, 0x7E22}, //5602 #CJK UNIFIED IDEOGRAPH + {0xE378, 0x7E46}, //5603 #CJK UNIFIED IDEOGRAPH + {0xE379, 0x7E66}, //5604 #CJK UNIFIED IDEOGRAPH + {0xE37A, 0x7E3B}, //5605 #CJK UNIFIED IDEOGRAPH + {0xE37B, 0x7E35}, //5606 #CJK UNIFIED IDEOGRAPH + {0xE37C, 0x7E39}, //5607 #CJK UNIFIED IDEOGRAPH + {0xE37D, 0x7E43}, //5608 #CJK UNIFIED IDEOGRAPH + {0xE37E, 0x7E37}, //5609 #CJK UNIFIED IDEOGRAPH + {0xE380, 0x7E32}, //5610 #CJK UNIFIED IDEOGRAPH + {0xE381, 0x7E3A}, //5611 #CJK UNIFIED IDEOGRAPH + {0xE382, 0x7E67}, //5612 #CJK UNIFIED IDEOGRAPH + {0xE383, 0x7E5D}, //5613 #CJK UNIFIED IDEOGRAPH + {0xE384, 0x7E56}, //5614 #CJK UNIFIED IDEOGRAPH + {0xE385, 0x7E5E}, //5615 #CJK UNIFIED IDEOGRAPH + {0xE386, 0x7E59}, //5616 #CJK UNIFIED IDEOGRAPH + {0xE387, 0x7E5A}, //5617 #CJK UNIFIED IDEOGRAPH + {0xE388, 0x7E79}, //5618 #CJK UNIFIED IDEOGRAPH + {0xE389, 0x7E6A}, //5619 #CJK UNIFIED IDEOGRAPH + {0xE38A, 0x7E69}, //5620 #CJK UNIFIED IDEOGRAPH + {0xE38B, 0x7E7C}, //5621 #CJK UNIFIED IDEOGRAPH + {0xE38C, 0x7E7B}, //5622 #CJK UNIFIED IDEOGRAPH + {0xE38D, 0x7E83}, //5623 #CJK UNIFIED IDEOGRAPH + {0xE38E, 0x7DD5}, //5624 #CJK UNIFIED IDEOGRAPH + {0xE38F, 0x7E7D}, //5625 #CJK UNIFIED IDEOGRAPH + {0xE390, 0x8FAE}, //5626 #CJK UNIFIED IDEOGRAPH + {0xE391, 0x7E7F}, //5627 #CJK UNIFIED IDEOGRAPH + {0xE392, 0x7E88}, //5628 #CJK UNIFIED IDEOGRAPH + {0xE393, 0x7E89}, //5629 #CJK UNIFIED IDEOGRAPH + {0xE394, 0x7E8C}, //5630 #CJK UNIFIED IDEOGRAPH + {0xE395, 0x7E92}, //5631 #CJK UNIFIED IDEOGRAPH + {0xE396, 0x7E90}, //5632 #CJK UNIFIED IDEOGRAPH + {0xE397, 0x7E93}, //5633 #CJK UNIFIED IDEOGRAPH + {0xE398, 0x7E94}, //5634 #CJK UNIFIED IDEOGRAPH + {0xE399, 0x7E96}, //5635 #CJK UNIFIED IDEOGRAPH + {0xE39A, 0x7E8E}, //5636 #CJK UNIFIED IDEOGRAPH + {0xE39B, 0x7E9B}, //5637 #CJK UNIFIED IDEOGRAPH + {0xE39C, 0x7E9C}, //5638 #CJK UNIFIED IDEOGRAPH + {0xE39D, 0x7F38}, //5639 #CJK UNIFIED IDEOGRAPH + {0xE39E, 0x7F3A}, //5640 #CJK UNIFIED IDEOGRAPH + {0xE39F, 0x7F45}, //5641 #CJK UNIFIED IDEOGRAPH + {0xE3A0, 0x7F4C}, //5642 #CJK UNIFIED IDEOGRAPH + {0xE3A1, 0x7F4D}, //5643 #CJK UNIFIED IDEOGRAPH + {0xE3A2, 0x7F4E}, //5644 #CJK UNIFIED IDEOGRAPH + {0xE3A3, 0x7F50}, //5645 #CJK UNIFIED IDEOGRAPH + {0xE3A4, 0x7F51}, //5646 #CJK UNIFIED IDEOGRAPH + {0xE3A5, 0x7F55}, //5647 #CJK UNIFIED IDEOGRAPH + {0xE3A6, 0x7F54}, //5648 #CJK UNIFIED IDEOGRAPH + {0xE3A7, 0x7F58}, //5649 #CJK UNIFIED IDEOGRAPH + {0xE3A8, 0x7F5F}, //5650 #CJK UNIFIED IDEOGRAPH + {0xE3A9, 0x7F60}, //5651 #CJK UNIFIED IDEOGRAPH + {0xE3AA, 0x7F68}, //5652 #CJK UNIFIED IDEOGRAPH + {0xE3AB, 0x7F69}, //5653 #CJK UNIFIED IDEOGRAPH + {0xE3AC, 0x7F67}, //5654 #CJK UNIFIED IDEOGRAPH + {0xE3AD, 0x7F78}, //5655 #CJK UNIFIED IDEOGRAPH + {0xE3AE, 0x7F82}, //5656 #CJK UNIFIED IDEOGRAPH + {0xE3AF, 0x7F86}, //5657 #CJK UNIFIED IDEOGRAPH + {0xE3B0, 0x7F83}, //5658 #CJK UNIFIED IDEOGRAPH + {0xE3B1, 0x7F88}, //5659 #CJK UNIFIED IDEOGRAPH + {0xE3B2, 0x7F87}, //5660 #CJK UNIFIED IDEOGRAPH + {0xE3B3, 0x7F8C}, //5661 #CJK UNIFIED IDEOGRAPH + {0xE3B4, 0x7F94}, //5662 #CJK UNIFIED IDEOGRAPH + {0xE3B5, 0x7F9E}, //5663 #CJK UNIFIED IDEOGRAPH + {0xE3B6, 0x7F9D}, //5664 #CJK UNIFIED IDEOGRAPH + {0xE3B7, 0x7F9A}, //5665 #CJK UNIFIED IDEOGRAPH + {0xE3B8, 0x7FA3}, //5666 #CJK UNIFIED IDEOGRAPH + {0xE3B9, 0x7FAF}, //5667 #CJK UNIFIED IDEOGRAPH + {0xE3BA, 0x7FB2}, //5668 #CJK UNIFIED IDEOGRAPH + {0xE3BB, 0x7FB9}, //5669 #CJK UNIFIED IDEOGRAPH + {0xE3BC, 0x7FAE}, //5670 #CJK UNIFIED IDEOGRAPH + {0xE3BD, 0x7FB6}, //5671 #CJK UNIFIED IDEOGRAPH + {0xE3BE, 0x7FB8}, //5672 #CJK UNIFIED IDEOGRAPH + {0xE3BF, 0x8B71}, //5673 #CJK UNIFIED IDEOGRAPH + {0xE3C0, 0x7FC5}, //5674 #CJK UNIFIED IDEOGRAPH + {0xE3C1, 0x7FC6}, //5675 #CJK UNIFIED IDEOGRAPH + {0xE3C2, 0x7FCA}, //5676 #CJK UNIFIED IDEOGRAPH + {0xE3C3, 0x7FD5}, //5677 #CJK UNIFIED IDEOGRAPH + {0xE3C4, 0x7FD4}, //5678 #CJK UNIFIED IDEOGRAPH + {0xE3C5, 0x7FE1}, //5679 #CJK UNIFIED IDEOGRAPH + {0xE3C6, 0x7FE6}, //5680 #CJK UNIFIED IDEOGRAPH + {0xE3C7, 0x7FE9}, //5681 #CJK UNIFIED IDEOGRAPH + {0xE3C8, 0x7FF3}, //5682 #CJK UNIFIED IDEOGRAPH + {0xE3C9, 0x7FF9}, //5683 #CJK UNIFIED IDEOGRAPH + {0xE3CA, 0x98DC}, //5684 #CJK UNIFIED IDEOGRAPH + {0xE3CB, 0x8006}, //5685 #CJK UNIFIED IDEOGRAPH + {0xE3CC, 0x8004}, //5686 #CJK UNIFIED IDEOGRAPH + {0xE3CD, 0x800B}, //5687 #CJK UNIFIED IDEOGRAPH + {0xE3CE, 0x8012}, //5688 #CJK UNIFIED IDEOGRAPH + {0xE3CF, 0x8018}, //5689 #CJK UNIFIED IDEOGRAPH + {0xE3D0, 0x8019}, //5690 #CJK UNIFIED IDEOGRAPH + {0xE3D1, 0x801C}, //5691 #CJK UNIFIED IDEOGRAPH + {0xE3D2, 0x8021}, //5692 #CJK UNIFIED IDEOGRAPH + {0xE3D3, 0x8028}, //5693 #CJK UNIFIED IDEOGRAPH + {0xE3D4, 0x803F}, //5694 #CJK UNIFIED IDEOGRAPH + {0xE3D5, 0x803B}, //5695 #CJK UNIFIED IDEOGRAPH + {0xE3D6, 0x804A}, //5696 #CJK UNIFIED IDEOGRAPH + {0xE3D7, 0x8046}, //5697 #CJK UNIFIED IDEOGRAPH + {0xE3D8, 0x8052}, //5698 #CJK UNIFIED IDEOGRAPH + {0xE3D9, 0x8058}, //5699 #CJK UNIFIED IDEOGRAPH + {0xE3DA, 0x805A}, //5700 #CJK UNIFIED IDEOGRAPH + {0xE3DB, 0x805F}, //5701 #CJK UNIFIED IDEOGRAPH + {0xE3DC, 0x8062}, //5702 #CJK UNIFIED IDEOGRAPH + {0xE3DD, 0x8068}, //5703 #CJK UNIFIED IDEOGRAPH + {0xE3DE, 0x8073}, //5704 #CJK UNIFIED IDEOGRAPH + {0xE3DF, 0x8072}, //5705 #CJK UNIFIED IDEOGRAPH + {0xE3E0, 0x8070}, //5706 #CJK UNIFIED IDEOGRAPH + {0xE3E1, 0x8076}, //5707 #CJK UNIFIED IDEOGRAPH + {0xE3E2, 0x8079}, //5708 #CJK UNIFIED IDEOGRAPH + {0xE3E3, 0x807D}, //5709 #CJK UNIFIED IDEOGRAPH + {0xE3E4, 0x807F}, //5710 #CJK UNIFIED IDEOGRAPH + {0xE3E5, 0x8084}, //5711 #CJK UNIFIED IDEOGRAPH + {0xE3E6, 0x8086}, //5712 #CJK UNIFIED IDEOGRAPH + {0xE3E7, 0x8085}, //5713 #CJK UNIFIED IDEOGRAPH + {0xE3E8, 0x809B}, //5714 #CJK UNIFIED IDEOGRAPH + {0xE3E9, 0x8093}, //5715 #CJK UNIFIED IDEOGRAPH + {0xE3EA, 0x809A}, //5716 #CJK UNIFIED IDEOGRAPH + {0xE3EB, 0x80AD}, //5717 #CJK UNIFIED IDEOGRAPH + {0xE3EC, 0x5190}, //5718 #CJK UNIFIED IDEOGRAPH + {0xE3ED, 0x80AC}, //5719 #CJK UNIFIED IDEOGRAPH + {0xE3EE, 0x80DB}, //5720 #CJK UNIFIED IDEOGRAPH + {0xE3EF, 0x80E5}, //5721 #CJK UNIFIED IDEOGRAPH + {0xE3F0, 0x80D9}, //5722 #CJK UNIFIED IDEOGRAPH + {0xE3F1, 0x80DD}, //5723 #CJK UNIFIED IDEOGRAPH + {0xE3F2, 0x80C4}, //5724 #CJK UNIFIED IDEOGRAPH + {0xE3F3, 0x80DA}, //5725 #CJK UNIFIED IDEOGRAPH + {0xE3F4, 0x80D6}, //5726 #CJK UNIFIED IDEOGRAPH + {0xE3F5, 0x8109}, //5727 #CJK UNIFIED IDEOGRAPH + {0xE3F6, 0x80EF}, //5728 #CJK UNIFIED IDEOGRAPH + {0xE3F7, 0x80F1}, //5729 #CJK UNIFIED IDEOGRAPH + {0xE3F8, 0x811B}, //5730 #CJK UNIFIED IDEOGRAPH + {0xE3F9, 0x8129}, //5731 #CJK UNIFIED IDEOGRAPH + {0xE3FA, 0x8123}, //5732 #CJK UNIFIED IDEOGRAPH + {0xE3FB, 0x812F}, //5733 #CJK UNIFIED IDEOGRAPH + {0xE3FC, 0x814B}, //5734 #CJK UNIFIED IDEOGRAPH + {0xE440, 0x968B}, //5735 #CJK UNIFIED IDEOGRAPH + {0xE441, 0x8146}, //5736 #CJK UNIFIED IDEOGRAPH + {0xE442, 0x813E}, //5737 #CJK UNIFIED IDEOGRAPH + {0xE443, 0x8153}, //5738 #CJK UNIFIED IDEOGRAPH + {0xE444, 0x8151}, //5739 #CJK UNIFIED IDEOGRAPH + {0xE445, 0x80FC}, //5740 #CJK UNIFIED IDEOGRAPH + {0xE446, 0x8171}, //5741 #CJK UNIFIED IDEOGRAPH + {0xE447, 0x816E}, //5742 #CJK UNIFIED IDEOGRAPH + {0xE448, 0x8165}, //5743 #CJK UNIFIED IDEOGRAPH + {0xE449, 0x8166}, //5744 #CJK UNIFIED IDEOGRAPH + {0xE44A, 0x8174}, //5745 #CJK UNIFIED IDEOGRAPH + {0xE44B, 0x8183}, //5746 #CJK UNIFIED IDEOGRAPH + {0xE44C, 0x8188}, //5747 #CJK UNIFIED IDEOGRAPH + {0xE44D, 0x818A}, //5748 #CJK UNIFIED IDEOGRAPH + {0xE44E, 0x8180}, //5749 #CJK UNIFIED IDEOGRAPH + {0xE44F, 0x8182}, //5750 #CJK UNIFIED IDEOGRAPH + {0xE450, 0x81A0}, //5751 #CJK UNIFIED IDEOGRAPH + {0xE451, 0x8195}, //5752 #CJK UNIFIED IDEOGRAPH + {0xE452, 0x81A4}, //5753 #CJK UNIFIED IDEOGRAPH + {0xE453, 0x81A3}, //5754 #CJK UNIFIED IDEOGRAPH + {0xE454, 0x815F}, //5755 #CJK UNIFIED IDEOGRAPH + {0xE455, 0x8193}, //5756 #CJK UNIFIED IDEOGRAPH + {0xE456, 0x81A9}, //5757 #CJK UNIFIED IDEOGRAPH + {0xE457, 0x81B0}, //5758 #CJK UNIFIED IDEOGRAPH + {0xE458, 0x81B5}, //5759 #CJK UNIFIED IDEOGRAPH + {0xE459, 0x81BE}, //5760 #CJK UNIFIED IDEOGRAPH + {0xE45A, 0x81B8}, //5761 #CJK UNIFIED IDEOGRAPH + {0xE45B, 0x81BD}, //5762 #CJK UNIFIED IDEOGRAPH + {0xE45C, 0x81C0}, //5763 #CJK UNIFIED IDEOGRAPH + {0xE45D, 0x81C2}, //5764 #CJK UNIFIED IDEOGRAPH + {0xE45E, 0x81BA}, //5765 #CJK UNIFIED IDEOGRAPH + {0xE45F, 0x81C9}, //5766 #CJK UNIFIED IDEOGRAPH + {0xE460, 0x81CD}, //5767 #CJK UNIFIED IDEOGRAPH + {0xE461, 0x81D1}, //5768 #CJK UNIFIED IDEOGRAPH + {0xE462, 0x81D9}, //5769 #CJK UNIFIED IDEOGRAPH + {0xE463, 0x81D8}, //5770 #CJK UNIFIED IDEOGRAPH + {0xE464, 0x81C8}, //5771 #CJK UNIFIED IDEOGRAPH + {0xE465, 0x81DA}, //5772 #CJK UNIFIED IDEOGRAPH + {0xE466, 0x81DF}, //5773 #CJK UNIFIED IDEOGRAPH + {0xE467, 0x81E0}, //5774 #CJK UNIFIED IDEOGRAPH + {0xE468, 0x81E7}, //5775 #CJK UNIFIED IDEOGRAPH + {0xE469, 0x81FA}, //5776 #CJK UNIFIED IDEOGRAPH + {0xE46A, 0x81FB}, //5777 #CJK UNIFIED IDEOGRAPH + {0xE46B, 0x81FE}, //5778 #CJK UNIFIED IDEOGRAPH + {0xE46C, 0x8201}, //5779 #CJK UNIFIED IDEOGRAPH + {0xE46D, 0x8202}, //5780 #CJK UNIFIED IDEOGRAPH + {0xE46E, 0x8205}, //5781 #CJK UNIFIED IDEOGRAPH + {0xE46F, 0x8207}, //5782 #CJK UNIFIED IDEOGRAPH + {0xE470, 0x820A}, //5783 #CJK UNIFIED IDEOGRAPH + {0xE471, 0x820D}, //5784 #CJK UNIFIED IDEOGRAPH + {0xE472, 0x8210}, //5785 #CJK UNIFIED IDEOGRAPH + {0xE473, 0x8216}, //5786 #CJK UNIFIED IDEOGRAPH + {0xE474, 0x8229}, //5787 #CJK UNIFIED IDEOGRAPH + {0xE475, 0x822B}, //5788 #CJK UNIFIED IDEOGRAPH + {0xE476, 0x8238}, //5789 #CJK UNIFIED IDEOGRAPH + {0xE477, 0x8233}, //5790 #CJK UNIFIED IDEOGRAPH + {0xE478, 0x8240}, //5791 #CJK UNIFIED IDEOGRAPH + {0xE479, 0x8259}, //5792 #CJK UNIFIED IDEOGRAPH + {0xE47A, 0x8258}, //5793 #CJK UNIFIED IDEOGRAPH + {0xE47B, 0x825D}, //5794 #CJK UNIFIED IDEOGRAPH + {0xE47C, 0x825A}, //5795 #CJK UNIFIED IDEOGRAPH + {0xE47D, 0x825F}, //5796 #CJK UNIFIED IDEOGRAPH + {0xE47E, 0x8264}, //5797 #CJK UNIFIED IDEOGRAPH + {0xE480, 0x8262}, //5798 #CJK UNIFIED IDEOGRAPH + {0xE481, 0x8268}, //5799 #CJK UNIFIED IDEOGRAPH + {0xE482, 0x826A}, //5800 #CJK UNIFIED IDEOGRAPH + {0xE483, 0x826B}, //5801 #CJK UNIFIED IDEOGRAPH + {0xE484, 0x822E}, //5802 #CJK UNIFIED IDEOGRAPH + {0xE485, 0x8271}, //5803 #CJK UNIFIED IDEOGRAPH + {0xE486, 0x8277}, //5804 #CJK UNIFIED IDEOGRAPH + {0xE487, 0x8278}, //5805 #CJK UNIFIED IDEOGRAPH + {0xE488, 0x827E}, //5806 #CJK UNIFIED IDEOGRAPH + {0xE489, 0x828D}, //5807 #CJK UNIFIED IDEOGRAPH + {0xE48A, 0x8292}, //5808 #CJK UNIFIED IDEOGRAPH + {0xE48B, 0x82AB}, //5809 #CJK UNIFIED IDEOGRAPH + {0xE48C, 0x829F}, //5810 #CJK UNIFIED IDEOGRAPH + {0xE48D, 0x82BB}, //5811 #CJK UNIFIED IDEOGRAPH + {0xE48E, 0x82AC}, //5812 #CJK UNIFIED IDEOGRAPH + {0xE48F, 0x82E1}, //5813 #CJK UNIFIED IDEOGRAPH + {0xE490, 0x82E3}, //5814 #CJK UNIFIED IDEOGRAPH + {0xE491, 0x82DF}, //5815 #CJK UNIFIED IDEOGRAPH + {0xE492, 0x82D2}, //5816 #CJK UNIFIED IDEOGRAPH + {0xE493, 0x82F4}, //5817 #CJK UNIFIED IDEOGRAPH + {0xE494, 0x82F3}, //5818 #CJK UNIFIED IDEOGRAPH + {0xE495, 0x82FA}, //5819 #CJK UNIFIED IDEOGRAPH + {0xE496, 0x8393}, //5820 #CJK UNIFIED IDEOGRAPH + {0xE497, 0x8303}, //5821 #CJK UNIFIED IDEOGRAPH + {0xE498, 0x82FB}, //5822 #CJK UNIFIED IDEOGRAPH + {0xE499, 0x82F9}, //5823 #CJK UNIFIED IDEOGRAPH + {0xE49A, 0x82DE}, //5824 #CJK UNIFIED IDEOGRAPH + {0xE49B, 0x8306}, //5825 #CJK UNIFIED IDEOGRAPH + {0xE49C, 0x82DC}, //5826 #CJK UNIFIED IDEOGRAPH + {0xE49D, 0x8309}, //5827 #CJK UNIFIED IDEOGRAPH + {0xE49E, 0x82D9}, //5828 #CJK UNIFIED IDEOGRAPH + {0xE49F, 0x8335}, //5829 #CJK UNIFIED IDEOGRAPH + {0xE4A0, 0x8334}, //5830 #CJK UNIFIED IDEOGRAPH + {0xE4A1, 0x8316}, //5831 #CJK UNIFIED IDEOGRAPH + {0xE4A2, 0x8332}, //5832 #CJK UNIFIED IDEOGRAPH + {0xE4A3, 0x8331}, //5833 #CJK UNIFIED IDEOGRAPH + {0xE4A4, 0x8340}, //5834 #CJK UNIFIED IDEOGRAPH + {0xE4A5, 0x8339}, //5835 #CJK UNIFIED IDEOGRAPH + {0xE4A6, 0x8350}, //5836 #CJK UNIFIED IDEOGRAPH + {0xE4A7, 0x8345}, //5837 #CJK UNIFIED IDEOGRAPH + {0xE4A8, 0x832F}, //5838 #CJK UNIFIED IDEOGRAPH + {0xE4A9, 0x832B}, //5839 #CJK UNIFIED IDEOGRAPH + {0xE4AA, 0x8317}, //5840 #CJK UNIFIED IDEOGRAPH + {0xE4AB, 0x8318}, //5841 #CJK UNIFIED IDEOGRAPH + {0xE4AC, 0x8385}, //5842 #CJK UNIFIED IDEOGRAPH + {0xE4AD, 0x839A}, //5843 #CJK UNIFIED IDEOGRAPH + {0xE4AE, 0x83AA}, //5844 #CJK UNIFIED IDEOGRAPH + {0xE4AF, 0x839F}, //5845 #CJK UNIFIED IDEOGRAPH + {0xE4B0, 0x83A2}, //5846 #CJK UNIFIED IDEOGRAPH + {0xE4B1, 0x8396}, //5847 #CJK UNIFIED IDEOGRAPH + {0xE4B2, 0x8323}, //5848 #CJK UNIFIED IDEOGRAPH + {0xE4B3, 0x838E}, //5849 #CJK UNIFIED IDEOGRAPH + {0xE4B4, 0x8387}, //5850 #CJK UNIFIED IDEOGRAPH + {0xE4B5, 0x838A}, //5851 #CJK UNIFIED IDEOGRAPH + {0xE4B6, 0x837C}, //5852 #CJK UNIFIED IDEOGRAPH + {0xE4B7, 0x83B5}, //5853 #CJK UNIFIED IDEOGRAPH + {0xE4B8, 0x8373}, //5854 #CJK UNIFIED IDEOGRAPH + {0xE4B9, 0x8375}, //5855 #CJK UNIFIED IDEOGRAPH + {0xE4BA, 0x83A0}, //5856 #CJK UNIFIED IDEOGRAPH + {0xE4BB, 0x8389}, //5857 #CJK UNIFIED IDEOGRAPH + {0xE4BC, 0x83A8}, //5858 #CJK UNIFIED IDEOGRAPH + {0xE4BD, 0x83F4}, //5859 #CJK UNIFIED IDEOGRAPH + {0xE4BE, 0x8413}, //5860 #CJK UNIFIED IDEOGRAPH + {0xE4BF, 0x83EB}, //5861 #CJK UNIFIED IDEOGRAPH + {0xE4C0, 0x83CE}, //5862 #CJK UNIFIED IDEOGRAPH + {0xE4C1, 0x83FD}, //5863 #CJK UNIFIED IDEOGRAPH + {0xE4C2, 0x8403}, //5864 #CJK UNIFIED IDEOGRAPH + {0xE4C3, 0x83D8}, //5865 #CJK UNIFIED IDEOGRAPH + {0xE4C4, 0x840B}, //5866 #CJK UNIFIED IDEOGRAPH + {0xE4C5, 0x83C1}, //5867 #CJK UNIFIED IDEOGRAPH + {0xE4C6, 0x83F7}, //5868 #CJK UNIFIED IDEOGRAPH + {0xE4C7, 0x8407}, //5869 #CJK UNIFIED IDEOGRAPH + {0xE4C8, 0x83E0}, //5870 #CJK UNIFIED IDEOGRAPH + {0xE4C9, 0x83F2}, //5871 #CJK UNIFIED IDEOGRAPH + {0xE4CA, 0x840D}, //5872 #CJK UNIFIED IDEOGRAPH + {0xE4CB, 0x8422}, //5873 #CJK UNIFIED IDEOGRAPH + {0xE4CC, 0x8420}, //5874 #CJK UNIFIED IDEOGRAPH + {0xE4CD, 0x83BD}, //5875 #CJK UNIFIED IDEOGRAPH + {0xE4CE, 0x8438}, //5876 #CJK UNIFIED IDEOGRAPH + {0xE4CF, 0x8506}, //5877 #CJK UNIFIED IDEOGRAPH + {0xE4D0, 0x83FB}, //5878 #CJK UNIFIED IDEOGRAPH + {0xE4D1, 0x846D}, //5879 #CJK UNIFIED IDEOGRAPH + {0xE4D2, 0x842A}, //5880 #CJK UNIFIED IDEOGRAPH + {0xE4D3, 0x843C}, //5881 #CJK UNIFIED IDEOGRAPH + {0xE4D4, 0x855A}, //5882 #CJK UNIFIED IDEOGRAPH + {0xE4D5, 0x8484}, //5883 #CJK UNIFIED IDEOGRAPH + {0xE4D6, 0x8477}, //5884 #CJK UNIFIED IDEOGRAPH + {0xE4D7, 0x846B}, //5885 #CJK UNIFIED IDEOGRAPH + {0xE4D8, 0x84AD}, //5886 #CJK UNIFIED IDEOGRAPH + {0xE4D9, 0x846E}, //5887 #CJK UNIFIED IDEOGRAPH + {0xE4DA, 0x8482}, //5888 #CJK UNIFIED IDEOGRAPH + {0xE4DB, 0x8469}, //5889 #CJK UNIFIED IDEOGRAPH + {0xE4DC, 0x8446}, //5890 #CJK UNIFIED IDEOGRAPH + {0xE4DD, 0x842C}, //5891 #CJK UNIFIED IDEOGRAPH + {0xE4DE, 0x846F}, //5892 #CJK UNIFIED IDEOGRAPH + {0xE4DF, 0x8479}, //5893 #CJK UNIFIED IDEOGRAPH + {0xE4E0, 0x8435}, //5894 #CJK UNIFIED IDEOGRAPH + {0xE4E1, 0x84CA}, //5895 #CJK UNIFIED IDEOGRAPH + {0xE4E2, 0x8462}, //5896 #CJK UNIFIED IDEOGRAPH + {0xE4E3, 0x84B9}, //5897 #CJK UNIFIED IDEOGRAPH + {0xE4E4, 0x84BF}, //5898 #CJK UNIFIED IDEOGRAPH + {0xE4E5, 0x849F}, //5899 #CJK UNIFIED IDEOGRAPH + {0xE4E6, 0x84D9}, //5900 #CJK UNIFIED IDEOGRAPH + {0xE4E7, 0x84CD}, //5901 #CJK UNIFIED IDEOGRAPH + {0xE4E8, 0x84BB}, //5902 #CJK UNIFIED IDEOGRAPH + {0xE4E9, 0x84DA}, //5903 #CJK UNIFIED IDEOGRAPH + {0xE4EA, 0x84D0}, //5904 #CJK UNIFIED IDEOGRAPH + {0xE4EB, 0x84C1}, //5905 #CJK UNIFIED IDEOGRAPH + {0xE4EC, 0x84C6}, //5906 #CJK UNIFIED IDEOGRAPH + {0xE4ED, 0x84D6}, //5907 #CJK UNIFIED IDEOGRAPH + {0xE4EE, 0x84A1}, //5908 #CJK UNIFIED IDEOGRAPH + {0xE4EF, 0x8521}, //5909 #CJK UNIFIED IDEOGRAPH + {0xE4F0, 0x84FF}, //5910 #CJK UNIFIED IDEOGRAPH + {0xE4F1, 0x84F4}, //5911 #CJK UNIFIED IDEOGRAPH + {0xE4F2, 0x8517}, //5912 #CJK UNIFIED IDEOGRAPH + {0xE4F3, 0x8518}, //5913 #CJK UNIFIED IDEOGRAPH + {0xE4F4, 0x852C}, //5914 #CJK UNIFIED IDEOGRAPH + {0xE4F5, 0x851F}, //5915 #CJK UNIFIED IDEOGRAPH + {0xE4F6, 0x8515}, //5916 #CJK UNIFIED IDEOGRAPH + {0xE4F7, 0x8514}, //5917 #CJK UNIFIED IDEOGRAPH + {0xE4F8, 0x84FC}, //5918 #CJK UNIFIED IDEOGRAPH + {0xE4F9, 0x8540}, //5919 #CJK UNIFIED IDEOGRAPH + {0xE4FA, 0x8563}, //5920 #CJK UNIFIED IDEOGRAPH + {0xE4FB, 0x8558}, //5921 #CJK UNIFIED IDEOGRAPH + {0xE4FC, 0x8548}, //5922 #CJK UNIFIED IDEOGRAPH + {0xE540, 0x8541}, //5923 #CJK UNIFIED IDEOGRAPH + {0xE541, 0x8602}, //5924 #CJK UNIFIED IDEOGRAPH + {0xE542, 0x854B}, //5925 #CJK UNIFIED IDEOGRAPH + {0xE543, 0x8555}, //5926 #CJK UNIFIED IDEOGRAPH + {0xE544, 0x8580}, //5927 #CJK UNIFIED IDEOGRAPH + {0xE545, 0x85A4}, //5928 #CJK UNIFIED IDEOGRAPH + {0xE546, 0x8588}, //5929 #CJK UNIFIED IDEOGRAPH + {0xE547, 0x8591}, //5930 #CJK UNIFIED IDEOGRAPH + {0xE548, 0x858A}, //5931 #CJK UNIFIED IDEOGRAPH + {0xE549, 0x85A8}, //5932 #CJK UNIFIED IDEOGRAPH + {0xE54A, 0x856D}, //5933 #CJK UNIFIED IDEOGRAPH + {0xE54B, 0x8594}, //5934 #CJK UNIFIED IDEOGRAPH + {0xE54C, 0x859B}, //5935 #CJK UNIFIED IDEOGRAPH + {0xE54D, 0x85EA}, //5936 #CJK UNIFIED IDEOGRAPH + {0xE54E, 0x8587}, //5937 #CJK UNIFIED IDEOGRAPH + {0xE54F, 0x859C}, //5938 #CJK UNIFIED IDEOGRAPH + {0xE550, 0x8577}, //5939 #CJK UNIFIED IDEOGRAPH + {0xE551, 0x857E}, //5940 #CJK UNIFIED IDEOGRAPH + {0xE552, 0x8590}, //5941 #CJK UNIFIED IDEOGRAPH + {0xE553, 0x85C9}, //5942 #CJK UNIFIED IDEOGRAPH + {0xE554, 0x85BA}, //5943 #CJK UNIFIED IDEOGRAPH + {0xE555, 0x85CF}, //5944 #CJK UNIFIED IDEOGRAPH + {0xE556, 0x85B9}, //5945 #CJK UNIFIED IDEOGRAPH + {0xE557, 0x85D0}, //5946 #CJK UNIFIED IDEOGRAPH + {0xE558, 0x85D5}, //5947 #CJK UNIFIED IDEOGRAPH + {0xE559, 0x85DD}, //5948 #CJK UNIFIED IDEOGRAPH + {0xE55A, 0x85E5}, //5949 #CJK UNIFIED IDEOGRAPH + {0xE55B, 0x85DC}, //5950 #CJK UNIFIED IDEOGRAPH + {0xE55C, 0x85F9}, //5951 #CJK UNIFIED IDEOGRAPH + {0xE55D, 0x860A}, //5952 #CJK UNIFIED IDEOGRAPH + {0xE55E, 0x8613}, //5953 #CJK UNIFIED IDEOGRAPH + {0xE55F, 0x860B}, //5954 #CJK UNIFIED IDEOGRAPH + {0xE560, 0x85FE}, //5955 #CJK UNIFIED IDEOGRAPH + {0xE561, 0x85FA}, //5956 #CJK UNIFIED IDEOGRAPH + {0xE562, 0x8606}, //5957 #CJK UNIFIED IDEOGRAPH + {0xE563, 0x8622}, //5958 #CJK UNIFIED IDEOGRAPH + {0xE564, 0x861A}, //5959 #CJK UNIFIED IDEOGRAPH + {0xE565, 0x8630}, //5960 #CJK UNIFIED IDEOGRAPH + {0xE566, 0x863F}, //5961 #CJK UNIFIED IDEOGRAPH + {0xE567, 0x864D}, //5962 #CJK UNIFIED IDEOGRAPH + {0xE568, 0x4E55}, //5963 #CJK UNIFIED IDEOGRAPH + {0xE569, 0x8654}, //5964 #CJK UNIFIED IDEOGRAPH + {0xE56A, 0x865F}, //5965 #CJK UNIFIED IDEOGRAPH + {0xE56B, 0x8667}, //5966 #CJK UNIFIED IDEOGRAPH + {0xE56C, 0x8671}, //5967 #CJK UNIFIED IDEOGRAPH + {0xE56D, 0x8693}, //5968 #CJK UNIFIED IDEOGRAPH + {0xE56E, 0x86A3}, //5969 #CJK UNIFIED IDEOGRAPH + {0xE56F, 0x86A9}, //5970 #CJK UNIFIED IDEOGRAPH + {0xE570, 0x86AA}, //5971 #CJK UNIFIED IDEOGRAPH + {0xE571, 0x868B}, //5972 #CJK UNIFIED IDEOGRAPH + {0xE572, 0x868C}, //5973 #CJK UNIFIED IDEOGRAPH + {0xE573, 0x86B6}, //5974 #CJK UNIFIED IDEOGRAPH + {0xE574, 0x86AF}, //5975 #CJK UNIFIED IDEOGRAPH + {0xE575, 0x86C4}, //5976 #CJK UNIFIED IDEOGRAPH + {0xE576, 0x86C6}, //5977 #CJK UNIFIED IDEOGRAPH + {0xE577, 0x86B0}, //5978 #CJK UNIFIED IDEOGRAPH + {0xE578, 0x86C9}, //5979 #CJK UNIFIED IDEOGRAPH + {0xE579, 0x8823}, //5980 #CJK UNIFIED IDEOGRAPH + {0xE57A, 0x86AB}, //5981 #CJK UNIFIED IDEOGRAPH + {0xE57B, 0x86D4}, //5982 #CJK UNIFIED IDEOGRAPH + {0xE57C, 0x86DE}, //5983 #CJK UNIFIED IDEOGRAPH + {0xE57D, 0x86E9}, //5984 #CJK UNIFIED IDEOGRAPH + {0xE57E, 0x86EC}, //5985 #CJK UNIFIED IDEOGRAPH + {0xE580, 0x86DF}, //5986 #CJK UNIFIED IDEOGRAPH + {0xE581, 0x86DB}, //5987 #CJK UNIFIED IDEOGRAPH + {0xE582, 0x86EF}, //5988 #CJK UNIFIED IDEOGRAPH + {0xE583, 0x8712}, //5989 #CJK UNIFIED IDEOGRAPH + {0xE584, 0x8706}, //5990 #CJK UNIFIED IDEOGRAPH + {0xE585, 0x8708}, //5991 #CJK UNIFIED IDEOGRAPH + {0xE586, 0x8700}, //5992 #CJK UNIFIED IDEOGRAPH + {0xE587, 0x8703}, //5993 #CJK UNIFIED IDEOGRAPH + {0xE588, 0x86FB}, //5994 #CJK UNIFIED IDEOGRAPH + {0xE589, 0x8711}, //5995 #CJK UNIFIED IDEOGRAPH + {0xE58A, 0x8709}, //5996 #CJK UNIFIED IDEOGRAPH + {0xE58B, 0x870D}, //5997 #CJK UNIFIED IDEOGRAPH + {0xE58C, 0x86F9}, //5998 #CJK UNIFIED IDEOGRAPH + {0xE58D, 0x870A}, //5999 #CJK UNIFIED IDEOGRAPH + {0xE58E, 0x8734}, //6000 #CJK UNIFIED IDEOGRAPH + {0xE58F, 0x873F}, //6001 #CJK UNIFIED IDEOGRAPH + {0xE590, 0x8737}, //6002 #CJK UNIFIED IDEOGRAPH + {0xE591, 0x873B}, //6003 #CJK UNIFIED IDEOGRAPH + {0xE592, 0x8725}, //6004 #CJK UNIFIED IDEOGRAPH + {0xE593, 0x8729}, //6005 #CJK UNIFIED IDEOGRAPH + {0xE594, 0x871A}, //6006 #CJK UNIFIED IDEOGRAPH + {0xE595, 0x8760}, //6007 #CJK UNIFIED IDEOGRAPH + {0xE596, 0x875F}, //6008 #CJK UNIFIED IDEOGRAPH + {0xE597, 0x8778}, //6009 #CJK UNIFIED IDEOGRAPH + {0xE598, 0x874C}, //6010 #CJK UNIFIED IDEOGRAPH + {0xE599, 0x874E}, //6011 #CJK UNIFIED IDEOGRAPH + {0xE59A, 0x8774}, //6012 #CJK UNIFIED IDEOGRAPH + {0xE59B, 0x8757}, //6013 #CJK UNIFIED IDEOGRAPH + {0xE59C, 0x8768}, //6014 #CJK UNIFIED IDEOGRAPH + {0xE59D, 0x876E}, //6015 #CJK UNIFIED IDEOGRAPH + {0xE59E, 0x8759}, //6016 #CJK UNIFIED IDEOGRAPH + {0xE59F, 0x8753}, //6017 #CJK UNIFIED IDEOGRAPH + {0xE5A0, 0x8763}, //6018 #CJK UNIFIED IDEOGRAPH + {0xE5A1, 0x876A}, //6019 #CJK UNIFIED IDEOGRAPH + {0xE5A2, 0x8805}, //6020 #CJK UNIFIED IDEOGRAPH + {0xE5A3, 0x87A2}, //6021 #CJK UNIFIED IDEOGRAPH + {0xE5A4, 0x879F}, //6022 #CJK UNIFIED IDEOGRAPH + {0xE5A5, 0x8782}, //6023 #CJK UNIFIED IDEOGRAPH + {0xE5A6, 0x87AF}, //6024 #CJK UNIFIED IDEOGRAPH + {0xE5A7, 0x87CB}, //6025 #CJK UNIFIED IDEOGRAPH + {0xE5A8, 0x87BD}, //6026 #CJK UNIFIED IDEOGRAPH + {0xE5A9, 0x87C0}, //6027 #CJK UNIFIED IDEOGRAPH + {0xE5AA, 0x87D0}, //6028 #CJK UNIFIED IDEOGRAPH + {0xE5AB, 0x96D6}, //6029 #CJK UNIFIED IDEOGRAPH + {0xE5AC, 0x87AB}, //6030 #CJK UNIFIED IDEOGRAPH + {0xE5AD, 0x87C4}, //6031 #CJK UNIFIED IDEOGRAPH + {0xE5AE, 0x87B3}, //6032 #CJK UNIFIED IDEOGRAPH + {0xE5AF, 0x87C7}, //6033 #CJK UNIFIED IDEOGRAPH + {0xE5B0, 0x87C6}, //6034 #CJK UNIFIED IDEOGRAPH + {0xE5B1, 0x87BB}, //6035 #CJK UNIFIED IDEOGRAPH + {0xE5B2, 0x87EF}, //6036 #CJK UNIFIED IDEOGRAPH + {0xE5B3, 0x87F2}, //6037 #CJK UNIFIED IDEOGRAPH + {0xE5B4, 0x87E0}, //6038 #CJK UNIFIED IDEOGRAPH + {0xE5B5, 0x880F}, //6039 #CJK UNIFIED IDEOGRAPH + {0xE5B6, 0x880D}, //6040 #CJK UNIFIED IDEOGRAPH + {0xE5B7, 0x87FE}, //6041 #CJK UNIFIED IDEOGRAPH + {0xE5B8, 0x87F6}, //6042 #CJK UNIFIED IDEOGRAPH + {0xE5B9, 0x87F7}, //6043 #CJK UNIFIED IDEOGRAPH + {0xE5BA, 0x880E}, //6044 #CJK UNIFIED IDEOGRAPH + {0xE5BB, 0x87D2}, //6045 #CJK UNIFIED IDEOGRAPH + {0xE5BC, 0x8811}, //6046 #CJK UNIFIED IDEOGRAPH + {0xE5BD, 0x8816}, //6047 #CJK UNIFIED IDEOGRAPH + {0xE5BE, 0x8815}, //6048 #CJK UNIFIED IDEOGRAPH + {0xE5BF, 0x8822}, //6049 #CJK UNIFIED IDEOGRAPH + {0xE5C0, 0x8821}, //6050 #CJK UNIFIED IDEOGRAPH + {0xE5C1, 0x8831}, //6051 #CJK UNIFIED IDEOGRAPH + {0xE5C2, 0x8836}, //6052 #CJK UNIFIED IDEOGRAPH + {0xE5C3, 0x8839}, //6053 #CJK UNIFIED IDEOGRAPH + {0xE5C4, 0x8827}, //6054 #CJK UNIFIED IDEOGRAPH + {0xE5C5, 0x883B}, //6055 #CJK UNIFIED IDEOGRAPH + {0xE5C6, 0x8844}, //6056 #CJK UNIFIED IDEOGRAPH + {0xE5C7, 0x8842}, //6057 #CJK UNIFIED IDEOGRAPH + {0xE5C8, 0x8852}, //6058 #CJK UNIFIED IDEOGRAPH + {0xE5C9, 0x8859}, //6059 #CJK UNIFIED IDEOGRAPH + {0xE5CA, 0x885E}, //6060 #CJK UNIFIED IDEOGRAPH + {0xE5CB, 0x8862}, //6061 #CJK UNIFIED IDEOGRAPH + {0xE5CC, 0x886B}, //6062 #CJK UNIFIED IDEOGRAPH + {0xE5CD, 0x8881}, //6063 #CJK UNIFIED IDEOGRAPH + {0xE5CE, 0x887E}, //6064 #CJK UNIFIED IDEOGRAPH + {0xE5CF, 0x889E}, //6065 #CJK UNIFIED IDEOGRAPH + {0xE5D0, 0x8875}, //6066 #CJK UNIFIED IDEOGRAPH + {0xE5D1, 0x887D}, //6067 #CJK UNIFIED IDEOGRAPH + {0xE5D2, 0x88B5}, //6068 #CJK UNIFIED IDEOGRAPH + {0xE5D3, 0x8872}, //6069 #CJK UNIFIED IDEOGRAPH + {0xE5D4, 0x8882}, //6070 #CJK UNIFIED IDEOGRAPH + {0xE5D5, 0x8897}, //6071 #CJK UNIFIED IDEOGRAPH + {0xE5D6, 0x8892}, //6072 #CJK UNIFIED IDEOGRAPH + {0xE5D7, 0x88AE}, //6073 #CJK UNIFIED IDEOGRAPH + {0xE5D8, 0x8899}, //6074 #CJK UNIFIED IDEOGRAPH + {0xE5D9, 0x88A2}, //6075 #CJK UNIFIED IDEOGRAPH + {0xE5DA, 0x888D}, //6076 #CJK UNIFIED IDEOGRAPH + {0xE5DB, 0x88A4}, //6077 #CJK UNIFIED IDEOGRAPH + {0xE5DC, 0x88B0}, //6078 #CJK UNIFIED IDEOGRAPH + {0xE5DD, 0x88BF}, //6079 #CJK UNIFIED IDEOGRAPH + {0xE5DE, 0x88B1}, //6080 #CJK UNIFIED IDEOGRAPH + {0xE5DF, 0x88C3}, //6081 #CJK UNIFIED IDEOGRAPH + {0xE5E0, 0x88C4}, //6082 #CJK UNIFIED IDEOGRAPH + {0xE5E1, 0x88D4}, //6083 #CJK UNIFIED IDEOGRAPH + {0xE5E2, 0x88D8}, //6084 #CJK UNIFIED IDEOGRAPH + {0xE5E3, 0x88D9}, //6085 #CJK UNIFIED IDEOGRAPH + {0xE5E4, 0x88DD}, //6086 #CJK UNIFIED IDEOGRAPH + {0xE5E5, 0x88F9}, //6087 #CJK UNIFIED IDEOGRAPH + {0xE5E6, 0x8902}, //6088 #CJK UNIFIED IDEOGRAPH + {0xE5E7, 0x88FC}, //6089 #CJK UNIFIED IDEOGRAPH + {0xE5E8, 0x88F4}, //6090 #CJK UNIFIED IDEOGRAPH + {0xE5E9, 0x88E8}, //6091 #CJK UNIFIED IDEOGRAPH + {0xE5EA, 0x88F2}, //6092 #CJK UNIFIED IDEOGRAPH + {0xE5EB, 0x8904}, //6093 #CJK UNIFIED IDEOGRAPH + {0xE5EC, 0x890C}, //6094 #CJK UNIFIED IDEOGRAPH + {0xE5ED, 0x890A}, //6095 #CJK UNIFIED IDEOGRAPH + {0xE5EE, 0x8913}, //6096 #CJK UNIFIED IDEOGRAPH + {0xE5EF, 0x8943}, //6097 #CJK UNIFIED IDEOGRAPH + {0xE5F0, 0x891E}, //6098 #CJK UNIFIED IDEOGRAPH + {0xE5F1, 0x8925}, //6099 #CJK UNIFIED IDEOGRAPH + {0xE5F2, 0x892A}, //6100 #CJK UNIFIED IDEOGRAPH + {0xE5F3, 0x892B}, //6101 #CJK UNIFIED IDEOGRAPH + {0xE5F4, 0x8941}, //6102 #CJK UNIFIED IDEOGRAPH + {0xE5F5, 0x8944}, //6103 #CJK UNIFIED IDEOGRAPH + {0xE5F6, 0x893B}, //6104 #CJK UNIFIED IDEOGRAPH + {0xE5F7, 0x8936}, //6105 #CJK UNIFIED IDEOGRAPH + {0xE5F8, 0x8938}, //6106 #CJK UNIFIED IDEOGRAPH + {0xE5F9, 0x894C}, //6107 #CJK UNIFIED IDEOGRAPH + {0xE5FA, 0x891D}, //6108 #CJK UNIFIED IDEOGRAPH + {0xE5FB, 0x8960}, //6109 #CJK UNIFIED IDEOGRAPH + {0xE5FC, 0x895E}, //6110 #CJK UNIFIED IDEOGRAPH + {0xE640, 0x8966}, //6111 #CJK UNIFIED IDEOGRAPH + {0xE641, 0x8964}, //6112 #CJK UNIFIED IDEOGRAPH + {0xE642, 0x896D}, //6113 #CJK UNIFIED IDEOGRAPH + {0xE643, 0x896A}, //6114 #CJK UNIFIED IDEOGRAPH + {0xE644, 0x896F}, //6115 #CJK UNIFIED IDEOGRAPH + {0xE645, 0x8974}, //6116 #CJK UNIFIED IDEOGRAPH + {0xE646, 0x8977}, //6117 #CJK UNIFIED IDEOGRAPH + {0xE647, 0x897E}, //6118 #CJK UNIFIED IDEOGRAPH + {0xE648, 0x8983}, //6119 #CJK UNIFIED IDEOGRAPH + {0xE649, 0x8988}, //6120 #CJK UNIFIED IDEOGRAPH + {0xE64A, 0x898A}, //6121 #CJK UNIFIED IDEOGRAPH + {0xE64B, 0x8993}, //6122 #CJK UNIFIED IDEOGRAPH + {0xE64C, 0x8998}, //6123 #CJK UNIFIED IDEOGRAPH + {0xE64D, 0x89A1}, //6124 #CJK UNIFIED IDEOGRAPH + {0xE64E, 0x89A9}, //6125 #CJK UNIFIED IDEOGRAPH + {0xE64F, 0x89A6}, //6126 #CJK UNIFIED IDEOGRAPH + {0xE650, 0x89AC}, //6127 #CJK UNIFIED IDEOGRAPH + {0xE651, 0x89AF}, //6128 #CJK UNIFIED IDEOGRAPH + {0xE652, 0x89B2}, //6129 #CJK UNIFIED IDEOGRAPH + {0xE653, 0x89BA}, //6130 #CJK UNIFIED IDEOGRAPH + {0xE654, 0x89BD}, //6131 #CJK UNIFIED IDEOGRAPH + {0xE655, 0x89BF}, //6132 #CJK UNIFIED IDEOGRAPH + {0xE656, 0x89C0}, //6133 #CJK UNIFIED IDEOGRAPH + {0xE657, 0x89DA}, //6134 #CJK UNIFIED IDEOGRAPH + {0xE658, 0x89DC}, //6135 #CJK UNIFIED IDEOGRAPH + {0xE659, 0x89DD}, //6136 #CJK UNIFIED IDEOGRAPH + {0xE65A, 0x89E7}, //6137 #CJK UNIFIED IDEOGRAPH + {0xE65B, 0x89F4}, //6138 #CJK UNIFIED IDEOGRAPH + {0xE65C, 0x89F8}, //6139 #CJK UNIFIED IDEOGRAPH + {0xE65D, 0x8A03}, //6140 #CJK UNIFIED IDEOGRAPH + {0xE65E, 0x8A16}, //6141 #CJK UNIFIED IDEOGRAPH + {0xE65F, 0x8A10}, //6142 #CJK UNIFIED IDEOGRAPH + {0xE660, 0x8A0C}, //6143 #CJK UNIFIED IDEOGRAPH + {0xE661, 0x8A1B}, //6144 #CJK UNIFIED IDEOGRAPH + {0xE662, 0x8A1D}, //6145 #CJK UNIFIED IDEOGRAPH + {0xE663, 0x8A25}, //6146 #CJK UNIFIED IDEOGRAPH + {0xE664, 0x8A36}, //6147 #CJK UNIFIED IDEOGRAPH + {0xE665, 0x8A41}, //6148 #CJK UNIFIED IDEOGRAPH + {0xE666, 0x8A5B}, //6149 #CJK UNIFIED IDEOGRAPH + {0xE667, 0x8A52}, //6150 #CJK UNIFIED IDEOGRAPH + {0xE668, 0x8A46}, //6151 #CJK UNIFIED IDEOGRAPH + {0xE669, 0x8A48}, //6152 #CJK UNIFIED IDEOGRAPH + {0xE66A, 0x8A7C}, //6153 #CJK UNIFIED IDEOGRAPH + {0xE66B, 0x8A6D}, //6154 #CJK UNIFIED IDEOGRAPH + {0xE66C, 0x8A6C}, //6155 #CJK UNIFIED IDEOGRAPH + {0xE66D, 0x8A62}, //6156 #CJK UNIFIED IDEOGRAPH + {0xE66E, 0x8A85}, //6157 #CJK UNIFIED IDEOGRAPH + {0xE66F, 0x8A82}, //6158 #CJK UNIFIED IDEOGRAPH + {0xE670, 0x8A84}, //6159 #CJK UNIFIED IDEOGRAPH + {0xE671, 0x8AA8}, //6160 #CJK UNIFIED IDEOGRAPH + {0xE672, 0x8AA1}, //6161 #CJK UNIFIED IDEOGRAPH + {0xE673, 0x8A91}, //6162 #CJK UNIFIED IDEOGRAPH + {0xE674, 0x8AA5}, //6163 #CJK UNIFIED IDEOGRAPH + {0xE675, 0x8AA6}, //6164 #CJK UNIFIED IDEOGRAPH + {0xE676, 0x8A9A}, //6165 #CJK UNIFIED IDEOGRAPH + {0xE677, 0x8AA3}, //6166 #CJK UNIFIED IDEOGRAPH + {0xE678, 0x8AC4}, //6167 #CJK UNIFIED IDEOGRAPH + {0xE679, 0x8ACD}, //6168 #CJK UNIFIED IDEOGRAPH + {0xE67A, 0x8AC2}, //6169 #CJK UNIFIED IDEOGRAPH + {0xE67B, 0x8ADA}, //6170 #CJK UNIFIED IDEOGRAPH + {0xE67C, 0x8AEB}, //6171 #CJK UNIFIED IDEOGRAPH + {0xE67D, 0x8AF3}, //6172 #CJK UNIFIED IDEOGRAPH + {0xE67E, 0x8AE7}, //6173 #CJK UNIFIED IDEOGRAPH + {0xE680, 0x8AE4}, //6174 #CJK UNIFIED IDEOGRAPH + {0xE681, 0x8AF1}, //6175 #CJK UNIFIED IDEOGRAPH + {0xE682, 0x8B14}, //6176 #CJK UNIFIED IDEOGRAPH + {0xE683, 0x8AE0}, //6177 #CJK UNIFIED IDEOGRAPH + {0xE684, 0x8AE2}, //6178 #CJK UNIFIED IDEOGRAPH + {0xE685, 0x8AF7}, //6179 #CJK UNIFIED IDEOGRAPH + {0xE686, 0x8ADE}, //6180 #CJK UNIFIED IDEOGRAPH + {0xE687, 0x8ADB}, //6181 #CJK UNIFIED IDEOGRAPH + {0xE688, 0x8B0C}, //6182 #CJK UNIFIED IDEOGRAPH + {0xE689, 0x8B07}, //6183 #CJK UNIFIED IDEOGRAPH + {0xE68A, 0x8B1A}, //6184 #CJK UNIFIED IDEOGRAPH + {0xE68B, 0x8AE1}, //6185 #CJK UNIFIED IDEOGRAPH + {0xE68C, 0x8B16}, //6186 #CJK UNIFIED IDEOGRAPH + {0xE68D, 0x8B10}, //6187 #CJK UNIFIED IDEOGRAPH + {0xE68E, 0x8B17}, //6188 #CJK UNIFIED IDEOGRAPH + {0xE68F, 0x8B20}, //6189 #CJK UNIFIED IDEOGRAPH + {0xE690, 0x8B33}, //6190 #CJK UNIFIED IDEOGRAPH + {0xE691, 0x97AB}, //6191 #CJK UNIFIED IDEOGRAPH + {0xE692, 0x8B26}, //6192 #CJK UNIFIED IDEOGRAPH + {0xE693, 0x8B2B}, //6193 #CJK UNIFIED IDEOGRAPH + {0xE694, 0x8B3E}, //6194 #CJK UNIFIED IDEOGRAPH + {0xE695, 0x8B28}, //6195 #CJK UNIFIED IDEOGRAPH + {0xE696, 0x8B41}, //6196 #CJK UNIFIED IDEOGRAPH + {0xE697, 0x8B4C}, //6197 #CJK UNIFIED IDEOGRAPH + {0xE698, 0x8B4F}, //6198 #CJK UNIFIED IDEOGRAPH + {0xE699, 0x8B4E}, //6199 #CJK UNIFIED IDEOGRAPH + {0xE69A, 0x8B49}, //6200 #CJK UNIFIED IDEOGRAPH + {0xE69B, 0x8B56}, //6201 #CJK UNIFIED IDEOGRAPH + {0xE69C, 0x8B5B}, //6202 #CJK UNIFIED IDEOGRAPH + {0xE69D, 0x8B5A}, //6203 #CJK UNIFIED IDEOGRAPH + {0xE69E, 0x8B6B}, //6204 #CJK UNIFIED IDEOGRAPH + {0xE69F, 0x8B5F}, //6205 #CJK UNIFIED IDEOGRAPH + {0xE6A0, 0x8B6C}, //6206 #CJK UNIFIED IDEOGRAPH + {0xE6A1, 0x8B6F}, //6207 #CJK UNIFIED IDEOGRAPH + {0xE6A2, 0x8B74}, //6208 #CJK UNIFIED IDEOGRAPH + {0xE6A3, 0x8B7D}, //6209 #CJK UNIFIED IDEOGRAPH + {0xE6A4, 0x8B80}, //6210 #CJK UNIFIED IDEOGRAPH + {0xE6A5, 0x8B8C}, //6211 #CJK UNIFIED IDEOGRAPH + {0xE6A6, 0x8B8E}, //6212 #CJK UNIFIED IDEOGRAPH + {0xE6A7, 0x8B92}, //6213 #CJK UNIFIED IDEOGRAPH + {0xE6A8, 0x8B93}, //6214 #CJK UNIFIED IDEOGRAPH + {0xE6A9, 0x8B96}, //6215 #CJK UNIFIED IDEOGRAPH + {0xE6AA, 0x8B99}, //6216 #CJK UNIFIED IDEOGRAPH + {0xE6AB, 0x8B9A}, //6217 #CJK UNIFIED IDEOGRAPH + {0xE6AC, 0x8C3A}, //6218 #CJK UNIFIED IDEOGRAPH + {0xE6AD, 0x8C41}, //6219 #CJK UNIFIED IDEOGRAPH + {0xE6AE, 0x8C3F}, //6220 #CJK UNIFIED IDEOGRAPH + {0xE6AF, 0x8C48}, //6221 #CJK UNIFIED IDEOGRAPH + {0xE6B0, 0x8C4C}, //6222 #CJK UNIFIED IDEOGRAPH + {0xE6B1, 0x8C4E}, //6223 #CJK UNIFIED IDEOGRAPH + {0xE6B2, 0x8C50}, //6224 #CJK UNIFIED IDEOGRAPH + {0xE6B3, 0x8C55}, //6225 #CJK UNIFIED IDEOGRAPH + {0xE6B4, 0x8C62}, //6226 #CJK UNIFIED IDEOGRAPH + {0xE6B5, 0x8C6C}, //6227 #CJK UNIFIED IDEOGRAPH + {0xE6B6, 0x8C78}, //6228 #CJK UNIFIED IDEOGRAPH + {0xE6B7, 0x8C7A}, //6229 #CJK UNIFIED IDEOGRAPH + {0xE6B8, 0x8C82}, //6230 #CJK UNIFIED IDEOGRAPH + {0xE6B9, 0x8C89}, //6231 #CJK UNIFIED IDEOGRAPH + {0xE6BA, 0x8C85}, //6232 #CJK UNIFIED IDEOGRAPH + {0xE6BB, 0x8C8A}, //6233 #CJK UNIFIED IDEOGRAPH + {0xE6BC, 0x8C8D}, //6234 #CJK UNIFIED IDEOGRAPH + {0xE6BD, 0x8C8E}, //6235 #CJK UNIFIED IDEOGRAPH + {0xE6BE, 0x8C94}, //6236 #CJK UNIFIED IDEOGRAPH + {0xE6BF, 0x8C7C}, //6237 #CJK UNIFIED IDEOGRAPH + {0xE6C0, 0x8C98}, //6238 #CJK UNIFIED IDEOGRAPH + {0xE6C1, 0x621D}, //6239 #CJK UNIFIED IDEOGRAPH + {0xE6C2, 0x8CAD}, //6240 #CJK UNIFIED IDEOGRAPH + {0xE6C3, 0x8CAA}, //6241 #CJK UNIFIED IDEOGRAPH + {0xE6C4, 0x8CBD}, //6242 #CJK UNIFIED IDEOGRAPH + {0xE6C5, 0x8CB2}, //6243 #CJK UNIFIED IDEOGRAPH + {0xE6C6, 0x8CB3}, //6244 #CJK UNIFIED IDEOGRAPH + {0xE6C7, 0x8CAE}, //6245 #CJK UNIFIED IDEOGRAPH + {0xE6C8, 0x8CB6}, //6246 #CJK UNIFIED IDEOGRAPH + {0xE6C9, 0x8CC8}, //6247 #CJK UNIFIED IDEOGRAPH + {0xE6CA, 0x8CC1}, //6248 #CJK UNIFIED IDEOGRAPH + {0xE6CB, 0x8CE4}, //6249 #CJK UNIFIED IDEOGRAPH + {0xE6CC, 0x8CE3}, //6250 #CJK UNIFIED IDEOGRAPH + {0xE6CD, 0x8CDA}, //6251 #CJK UNIFIED IDEOGRAPH + {0xE6CE, 0x8CFD}, //6252 #CJK UNIFIED IDEOGRAPH + {0xE6CF, 0x8CFA}, //6253 #CJK UNIFIED IDEOGRAPH + {0xE6D0, 0x8CFB}, //6254 #CJK UNIFIED IDEOGRAPH + {0xE6D1, 0x8D04}, //6255 #CJK UNIFIED IDEOGRAPH + {0xE6D2, 0x8D05}, //6256 #CJK UNIFIED IDEOGRAPH + {0xE6D3, 0x8D0A}, //6257 #CJK UNIFIED IDEOGRAPH + {0xE6D4, 0x8D07}, //6258 #CJK UNIFIED IDEOGRAPH + {0xE6D5, 0x8D0F}, //6259 #CJK UNIFIED IDEOGRAPH + {0xE6D6, 0x8D0D}, //6260 #CJK UNIFIED IDEOGRAPH + {0xE6D7, 0x8D10}, //6261 #CJK UNIFIED IDEOGRAPH + {0xE6D8, 0x9F4E}, //6262 #CJK UNIFIED IDEOGRAPH + {0xE6D9, 0x8D13}, //6263 #CJK UNIFIED IDEOGRAPH + {0xE6DA, 0x8CCD}, //6264 #CJK UNIFIED IDEOGRAPH + {0xE6DB, 0x8D14}, //6265 #CJK UNIFIED IDEOGRAPH + {0xE6DC, 0x8D16}, //6266 #CJK UNIFIED IDEOGRAPH + {0xE6DD, 0x8D67}, //6267 #CJK UNIFIED IDEOGRAPH + {0xE6DE, 0x8D6D}, //6268 #CJK UNIFIED IDEOGRAPH + {0xE6DF, 0x8D71}, //6269 #CJK UNIFIED IDEOGRAPH + {0xE6E0, 0x8D73}, //6270 #CJK UNIFIED IDEOGRAPH + {0xE6E1, 0x8D81}, //6271 #CJK UNIFIED IDEOGRAPH + {0xE6E2, 0x8D99}, //6272 #CJK UNIFIED IDEOGRAPH + {0xE6E3, 0x8DC2}, //6273 #CJK UNIFIED IDEOGRAPH + {0xE6E4, 0x8DBE}, //6274 #CJK UNIFIED IDEOGRAPH + {0xE6E5, 0x8DBA}, //6275 #CJK UNIFIED IDEOGRAPH + {0xE6E6, 0x8DCF}, //6276 #CJK UNIFIED IDEOGRAPH + {0xE6E7, 0x8DDA}, //6277 #CJK UNIFIED IDEOGRAPH + {0xE6E8, 0x8DD6}, //6278 #CJK UNIFIED IDEOGRAPH + {0xE6E9, 0x8DCC}, //6279 #CJK UNIFIED IDEOGRAPH + {0xE6EA, 0x8DDB}, //6280 #CJK UNIFIED IDEOGRAPH + {0xE6EB, 0x8DCB}, //6281 #CJK UNIFIED IDEOGRAPH + {0xE6EC, 0x8DEA}, //6282 #CJK UNIFIED IDEOGRAPH + {0xE6ED, 0x8DEB}, //6283 #CJK UNIFIED IDEOGRAPH + {0xE6EE, 0x8DDF}, //6284 #CJK UNIFIED IDEOGRAPH + {0xE6EF, 0x8DE3}, //6285 #CJK UNIFIED IDEOGRAPH + {0xE6F0, 0x8DFC}, //6286 #CJK UNIFIED IDEOGRAPH + {0xE6F1, 0x8E08}, //6287 #CJK UNIFIED IDEOGRAPH + {0xE6F2, 0x8E09}, //6288 #CJK UNIFIED IDEOGRAPH + {0xE6F3, 0x8DFF}, //6289 #CJK UNIFIED IDEOGRAPH + {0xE6F4, 0x8E1D}, //6290 #CJK UNIFIED IDEOGRAPH + {0xE6F5, 0x8E1E}, //6291 #CJK UNIFIED IDEOGRAPH + {0xE6F6, 0x8E10}, //6292 #CJK UNIFIED IDEOGRAPH + {0xE6F7, 0x8E1F}, //6293 #CJK UNIFIED IDEOGRAPH + {0xE6F8, 0x8E42}, //6294 #CJK UNIFIED IDEOGRAPH + {0xE6F9, 0x8E35}, //6295 #CJK UNIFIED IDEOGRAPH + {0xE6FA, 0x8E30}, //6296 #CJK UNIFIED IDEOGRAPH + {0xE6FB, 0x8E34}, //6297 #CJK UNIFIED IDEOGRAPH + {0xE6FC, 0x8E4A}, //6298 #CJK UNIFIED IDEOGRAPH + {0xE740, 0x8E47}, //6299 #CJK UNIFIED IDEOGRAPH + {0xE741, 0x8E49}, //6300 #CJK UNIFIED IDEOGRAPH + {0xE742, 0x8E4C}, //6301 #CJK UNIFIED IDEOGRAPH + {0xE743, 0x8E50}, //6302 #CJK UNIFIED IDEOGRAPH + {0xE744, 0x8E48}, //6303 #CJK UNIFIED IDEOGRAPH + {0xE745, 0x8E59}, //6304 #CJK UNIFIED IDEOGRAPH + {0xE746, 0x8E64}, //6305 #CJK UNIFIED IDEOGRAPH + {0xE747, 0x8E60}, //6306 #CJK UNIFIED IDEOGRAPH + {0xE748, 0x8E2A}, //6307 #CJK UNIFIED IDEOGRAPH + {0xE749, 0x8E63}, //6308 #CJK UNIFIED IDEOGRAPH + {0xE74A, 0x8E55}, //6309 #CJK UNIFIED IDEOGRAPH + {0xE74B, 0x8E76}, //6310 #CJK UNIFIED IDEOGRAPH + {0xE74C, 0x8E72}, //6311 #CJK UNIFIED IDEOGRAPH + {0xE74D, 0x8E7C}, //6312 #CJK UNIFIED IDEOGRAPH + {0xE74E, 0x8E81}, //6313 #CJK UNIFIED IDEOGRAPH + {0xE74F, 0x8E87}, //6314 #CJK UNIFIED IDEOGRAPH + {0xE750, 0x8E85}, //6315 #CJK UNIFIED IDEOGRAPH + {0xE751, 0x8E84}, //6316 #CJK UNIFIED IDEOGRAPH + {0xE752, 0x8E8B}, //6317 #CJK UNIFIED IDEOGRAPH + {0xE753, 0x8E8A}, //6318 #CJK UNIFIED IDEOGRAPH + {0xE754, 0x8E93}, //6319 #CJK UNIFIED IDEOGRAPH + {0xE755, 0x8E91}, //6320 #CJK UNIFIED IDEOGRAPH + {0xE756, 0x8E94}, //6321 #CJK UNIFIED IDEOGRAPH + {0xE757, 0x8E99}, //6322 #CJK UNIFIED IDEOGRAPH + {0xE758, 0x8EAA}, //6323 #CJK UNIFIED IDEOGRAPH + {0xE759, 0x8EA1}, //6324 #CJK UNIFIED IDEOGRAPH + {0xE75A, 0x8EAC}, //6325 #CJK UNIFIED IDEOGRAPH + {0xE75B, 0x8EB0}, //6326 #CJK UNIFIED IDEOGRAPH + {0xE75C, 0x8EC6}, //6327 #CJK UNIFIED IDEOGRAPH + {0xE75D, 0x8EB1}, //6328 #CJK UNIFIED IDEOGRAPH + {0xE75E, 0x8EBE}, //6329 #CJK UNIFIED IDEOGRAPH + {0xE75F, 0x8EC5}, //6330 #CJK UNIFIED IDEOGRAPH + {0xE760, 0x8EC8}, //6331 #CJK UNIFIED IDEOGRAPH + {0xE761, 0x8ECB}, //6332 #CJK UNIFIED IDEOGRAPH + {0xE762, 0x8EDB}, //6333 #CJK UNIFIED IDEOGRAPH + {0xE763, 0x8EE3}, //6334 #CJK UNIFIED IDEOGRAPH + {0xE764, 0x8EFC}, //6335 #CJK UNIFIED IDEOGRAPH + {0xE765, 0x8EFB}, //6336 #CJK UNIFIED IDEOGRAPH + {0xE766, 0x8EEB}, //6337 #CJK UNIFIED IDEOGRAPH + {0xE767, 0x8EFE}, //6338 #CJK UNIFIED IDEOGRAPH + {0xE768, 0x8F0A}, //6339 #CJK UNIFIED IDEOGRAPH + {0xE769, 0x8F05}, //6340 #CJK UNIFIED IDEOGRAPH + {0xE76A, 0x8F15}, //6341 #CJK UNIFIED IDEOGRAPH + {0xE76B, 0x8F12}, //6342 #CJK UNIFIED IDEOGRAPH + {0xE76C, 0x8F19}, //6343 #CJK UNIFIED IDEOGRAPH + {0xE76D, 0x8F13}, //6344 #CJK UNIFIED IDEOGRAPH + {0xE76E, 0x8F1C}, //6345 #CJK UNIFIED IDEOGRAPH + {0xE76F, 0x8F1F}, //6346 #CJK UNIFIED IDEOGRAPH + {0xE770, 0x8F1B}, //6347 #CJK UNIFIED IDEOGRAPH + {0xE771, 0x8F0C}, //6348 #CJK UNIFIED IDEOGRAPH + {0xE772, 0x8F26}, //6349 #CJK UNIFIED IDEOGRAPH + {0xE773, 0x8F33}, //6350 #CJK UNIFIED IDEOGRAPH + {0xE774, 0x8F3B}, //6351 #CJK UNIFIED IDEOGRAPH + {0xE775, 0x8F39}, //6352 #CJK UNIFIED IDEOGRAPH + {0xE776, 0x8F45}, //6353 #CJK UNIFIED IDEOGRAPH + {0xE777, 0x8F42}, //6354 #CJK UNIFIED IDEOGRAPH + {0xE778, 0x8F3E}, //6355 #CJK UNIFIED IDEOGRAPH + {0xE779, 0x8F4C}, //6356 #CJK UNIFIED IDEOGRAPH + {0xE77A, 0x8F49}, //6357 #CJK UNIFIED IDEOGRAPH + {0xE77B, 0x8F46}, //6358 #CJK UNIFIED IDEOGRAPH + {0xE77C, 0x8F4E}, //6359 #CJK UNIFIED IDEOGRAPH + {0xE77D, 0x8F57}, //6360 #CJK UNIFIED IDEOGRAPH + {0xE77E, 0x8F5C}, //6361 #CJK UNIFIED IDEOGRAPH + {0xE780, 0x8F62}, //6362 #CJK UNIFIED IDEOGRAPH + {0xE781, 0x8F63}, //6363 #CJK UNIFIED IDEOGRAPH + {0xE782, 0x8F64}, //6364 #CJK UNIFIED IDEOGRAPH + {0xE783, 0x8F9C}, //6365 #CJK UNIFIED IDEOGRAPH + {0xE784, 0x8F9F}, //6366 #CJK UNIFIED IDEOGRAPH + {0xE785, 0x8FA3}, //6367 #CJK UNIFIED IDEOGRAPH + {0xE786, 0x8FAD}, //6368 #CJK UNIFIED IDEOGRAPH + {0xE787, 0x8FAF}, //6369 #CJK UNIFIED IDEOGRAPH + {0xE788, 0x8FB7}, //6370 #CJK UNIFIED IDEOGRAPH + {0xE789, 0x8FDA}, //6371 #CJK UNIFIED IDEOGRAPH + {0xE78A, 0x8FE5}, //6372 #CJK UNIFIED IDEOGRAPH + {0xE78B, 0x8FE2}, //6373 #CJK UNIFIED IDEOGRAPH + {0xE78C, 0x8FEA}, //6374 #CJK UNIFIED IDEOGRAPH + {0xE78D, 0x8FEF}, //6375 #CJK UNIFIED IDEOGRAPH + {0xE78E, 0x9087}, //6376 #CJK UNIFIED IDEOGRAPH + {0xE78F, 0x8FF4}, //6377 #CJK UNIFIED IDEOGRAPH + {0xE790, 0x9005}, //6378 #CJK UNIFIED IDEOGRAPH + {0xE791, 0x8FF9}, //6379 #CJK UNIFIED IDEOGRAPH + {0xE792, 0x8FFA}, //6380 #CJK UNIFIED IDEOGRAPH + {0xE793, 0x9011}, //6381 #CJK UNIFIED IDEOGRAPH + {0xE794, 0x9015}, //6382 #CJK UNIFIED IDEOGRAPH + {0xE795, 0x9021}, //6383 #CJK UNIFIED IDEOGRAPH + {0xE796, 0x900D}, //6384 #CJK UNIFIED IDEOGRAPH + {0xE797, 0x901E}, //6385 #CJK UNIFIED IDEOGRAPH + {0xE798, 0x9016}, //6386 #CJK UNIFIED IDEOGRAPH + {0xE799, 0x900B}, //6387 #CJK UNIFIED IDEOGRAPH + {0xE79A, 0x9027}, //6388 #CJK UNIFIED IDEOGRAPH + {0xE79B, 0x9036}, //6389 #CJK UNIFIED IDEOGRAPH + {0xE79C, 0x9035}, //6390 #CJK UNIFIED IDEOGRAPH + {0xE79D, 0x9039}, //6391 #CJK UNIFIED IDEOGRAPH + {0xE79E, 0x8FF8}, //6392 #CJK UNIFIED IDEOGRAPH + {0xE79F, 0x904F}, //6393 #CJK UNIFIED IDEOGRAPH + {0xE7A0, 0x9050}, //6394 #CJK UNIFIED IDEOGRAPH + {0xE7A1, 0x9051}, //6395 #CJK UNIFIED IDEOGRAPH + {0xE7A2, 0x9052}, //6396 #CJK UNIFIED IDEOGRAPH + {0xE7A3, 0x900E}, //6397 #CJK UNIFIED IDEOGRAPH + {0xE7A4, 0x9049}, //6398 #CJK UNIFIED IDEOGRAPH + {0xE7A5, 0x903E}, //6399 #CJK UNIFIED IDEOGRAPH + {0xE7A6, 0x9056}, //6400 #CJK UNIFIED IDEOGRAPH + {0xE7A7, 0x9058}, //6401 #CJK UNIFIED IDEOGRAPH + {0xE7A8, 0x905E}, //6402 #CJK UNIFIED IDEOGRAPH + {0xE7A9, 0x9068}, //6403 #CJK UNIFIED IDEOGRAPH + {0xE7AA, 0x906F}, //6404 #CJK UNIFIED IDEOGRAPH + {0xE7AB, 0x9076}, //6405 #CJK UNIFIED IDEOGRAPH + {0xE7AC, 0x96A8}, //6406 #CJK UNIFIED IDEOGRAPH + {0xE7AD, 0x9072}, //6407 #CJK UNIFIED IDEOGRAPH + {0xE7AE, 0x9082}, //6408 #CJK UNIFIED IDEOGRAPH + {0xE7AF, 0x907D}, //6409 #CJK UNIFIED IDEOGRAPH + {0xE7B0, 0x9081}, //6410 #CJK UNIFIED IDEOGRAPH + {0xE7B1, 0x9080}, //6411 #CJK UNIFIED IDEOGRAPH + {0xE7B2, 0x908A}, //6412 #CJK UNIFIED IDEOGRAPH + {0xE7B3, 0x9089}, //6413 #CJK UNIFIED IDEOGRAPH + {0xE7B4, 0x908F}, //6414 #CJK UNIFIED IDEOGRAPH + {0xE7B5, 0x90A8}, //6415 #CJK UNIFIED IDEOGRAPH + {0xE7B6, 0x90AF}, //6416 #CJK UNIFIED IDEOGRAPH + {0xE7B7, 0x90B1}, //6417 #CJK UNIFIED IDEOGRAPH + {0xE7B8, 0x90B5}, //6418 #CJK UNIFIED IDEOGRAPH + {0xE7B9, 0x90E2}, //6419 #CJK UNIFIED IDEOGRAPH + {0xE7BA, 0x90E4}, //6420 #CJK UNIFIED IDEOGRAPH + {0xE7BB, 0x6248}, //6421 #CJK UNIFIED IDEOGRAPH + {0xE7BC, 0x90DB}, //6422 #CJK UNIFIED IDEOGRAPH + {0xE7BD, 0x9102}, //6423 #CJK UNIFIED IDEOGRAPH + {0xE7BE, 0x9112}, //6424 #CJK UNIFIED IDEOGRAPH + {0xE7BF, 0x9119}, //6425 #CJK UNIFIED IDEOGRAPH + {0xE7C0, 0x9132}, //6426 #CJK UNIFIED IDEOGRAPH + {0xE7C1, 0x9130}, //6427 #CJK UNIFIED IDEOGRAPH + {0xE7C2, 0x914A}, //6428 #CJK UNIFIED IDEOGRAPH + {0xE7C3, 0x9156}, //6429 #CJK UNIFIED IDEOGRAPH + {0xE7C4, 0x9158}, //6430 #CJK UNIFIED IDEOGRAPH + {0xE7C5, 0x9163}, //6431 #CJK UNIFIED IDEOGRAPH + {0xE7C6, 0x9165}, //6432 #CJK UNIFIED IDEOGRAPH + {0xE7C7, 0x9169}, //6433 #CJK UNIFIED IDEOGRAPH + {0xE7C8, 0x9173}, //6434 #CJK UNIFIED IDEOGRAPH + {0xE7C9, 0x9172}, //6435 #CJK UNIFIED IDEOGRAPH + {0xE7CA, 0x918B}, //6436 #CJK UNIFIED IDEOGRAPH + {0xE7CB, 0x9189}, //6437 #CJK UNIFIED IDEOGRAPH + {0xE7CC, 0x9182}, //6438 #CJK UNIFIED IDEOGRAPH + {0xE7CD, 0x91A2}, //6439 #CJK UNIFIED IDEOGRAPH + {0xE7CE, 0x91AB}, //6440 #CJK UNIFIED IDEOGRAPH + {0xE7CF, 0x91AF}, //6441 #CJK UNIFIED IDEOGRAPH + {0xE7D0, 0x91AA}, //6442 #CJK UNIFIED IDEOGRAPH + {0xE7D1, 0x91B5}, //6443 #CJK UNIFIED IDEOGRAPH + {0xE7D2, 0x91B4}, //6444 #CJK UNIFIED IDEOGRAPH + {0xE7D3, 0x91BA}, //6445 #CJK UNIFIED IDEOGRAPH + {0xE7D4, 0x91C0}, //6446 #CJK UNIFIED IDEOGRAPH + {0xE7D5, 0x91C1}, //6447 #CJK UNIFIED IDEOGRAPH + {0xE7D6, 0x91C9}, //6448 #CJK UNIFIED IDEOGRAPH + {0xE7D7, 0x91CB}, //6449 #CJK UNIFIED IDEOGRAPH + {0xE7D8, 0x91D0}, //6450 #CJK UNIFIED IDEOGRAPH + {0xE7D9, 0x91D6}, //6451 #CJK UNIFIED IDEOGRAPH + {0xE7DA, 0x91DF}, //6452 #CJK UNIFIED IDEOGRAPH + {0xE7DB, 0x91E1}, //6453 #CJK UNIFIED IDEOGRAPH + {0xE7DC, 0x91DB}, //6454 #CJK UNIFIED IDEOGRAPH + {0xE7DD, 0x91FC}, //6455 #CJK UNIFIED IDEOGRAPH + {0xE7DE, 0x91F5}, //6456 #CJK UNIFIED IDEOGRAPH + {0xE7DF, 0x91F6}, //6457 #CJK UNIFIED IDEOGRAPH + {0xE7E0, 0x921E}, //6458 #CJK UNIFIED IDEOGRAPH + {0xE7E1, 0x91FF}, //6459 #CJK UNIFIED IDEOGRAPH + {0xE7E2, 0x9214}, //6460 #CJK UNIFIED IDEOGRAPH + {0xE7E3, 0x922C}, //6461 #CJK UNIFIED IDEOGRAPH + {0xE7E4, 0x9215}, //6462 #CJK UNIFIED IDEOGRAPH + {0xE7E5, 0x9211}, //6463 #CJK UNIFIED IDEOGRAPH + {0xE7E6, 0x925E}, //6464 #CJK UNIFIED IDEOGRAPH + {0xE7E7, 0x9257}, //6465 #CJK UNIFIED IDEOGRAPH + {0xE7E8, 0x9245}, //6466 #CJK UNIFIED IDEOGRAPH + {0xE7E9, 0x9249}, //6467 #CJK UNIFIED IDEOGRAPH + {0xE7EA, 0x9264}, //6468 #CJK UNIFIED IDEOGRAPH + {0xE7EB, 0x9248}, //6469 #CJK UNIFIED IDEOGRAPH + {0xE7EC, 0x9295}, //6470 #CJK UNIFIED IDEOGRAPH + {0xE7ED, 0x923F}, //6471 #CJK UNIFIED IDEOGRAPH + {0xE7EE, 0x924B}, //6472 #CJK UNIFIED IDEOGRAPH + {0xE7EF, 0x9250}, //6473 #CJK UNIFIED IDEOGRAPH + {0xE7F0, 0x929C}, //6474 #CJK UNIFIED IDEOGRAPH + {0xE7F1, 0x9296}, //6475 #CJK UNIFIED IDEOGRAPH + {0xE7F2, 0x9293}, //6476 #CJK UNIFIED IDEOGRAPH + {0xE7F3, 0x929B}, //6477 #CJK UNIFIED IDEOGRAPH + {0xE7F4, 0x925A}, //6478 #CJK UNIFIED IDEOGRAPH + {0xE7F5, 0x92CF}, //6479 #CJK UNIFIED IDEOGRAPH + {0xE7F6, 0x92B9}, //6480 #CJK UNIFIED IDEOGRAPH + {0xE7F7, 0x92B7}, //6481 #CJK UNIFIED IDEOGRAPH + {0xE7F8, 0x92E9}, //6482 #CJK UNIFIED IDEOGRAPH + {0xE7F9, 0x930F}, //6483 #CJK UNIFIED IDEOGRAPH + {0xE7FA, 0x92FA}, //6484 #CJK UNIFIED IDEOGRAPH + {0xE7FB, 0x9344}, //6485 #CJK UNIFIED IDEOGRAPH + {0xE7FC, 0x932E}, //6486 #CJK UNIFIED IDEOGRAPH + {0xE840, 0x9319}, //6487 #CJK UNIFIED IDEOGRAPH + {0xE841, 0x9322}, //6488 #CJK UNIFIED IDEOGRAPH + {0xE842, 0x931A}, //6489 #CJK UNIFIED IDEOGRAPH + {0xE843, 0x9323}, //6490 #CJK UNIFIED IDEOGRAPH + {0xE844, 0x933A}, //6491 #CJK UNIFIED IDEOGRAPH + {0xE845, 0x9335}, //6492 #CJK UNIFIED IDEOGRAPH + {0xE846, 0x933B}, //6493 #CJK UNIFIED IDEOGRAPH + {0xE847, 0x935C}, //6494 #CJK UNIFIED IDEOGRAPH + {0xE848, 0x9360}, //6495 #CJK UNIFIED IDEOGRAPH + {0xE849, 0x937C}, //6496 #CJK UNIFIED IDEOGRAPH + {0xE84A, 0x936E}, //6497 #CJK UNIFIED IDEOGRAPH + {0xE84B, 0x9356}, //6498 #CJK UNIFIED IDEOGRAPH + {0xE84C, 0x93B0}, //6499 #CJK UNIFIED IDEOGRAPH + {0xE84D, 0x93AC}, //6500 #CJK UNIFIED IDEOGRAPH + {0xE84E, 0x93AD}, //6501 #CJK UNIFIED IDEOGRAPH + {0xE84F, 0x9394}, //6502 #CJK UNIFIED IDEOGRAPH + {0xE850, 0x93B9}, //6503 #CJK UNIFIED IDEOGRAPH + {0xE851, 0x93D6}, //6504 #CJK UNIFIED IDEOGRAPH + {0xE852, 0x93D7}, //6505 #CJK UNIFIED IDEOGRAPH + {0xE853, 0x93E8}, //6506 #CJK UNIFIED IDEOGRAPH + {0xE854, 0x93E5}, //6507 #CJK UNIFIED IDEOGRAPH + {0xE855, 0x93D8}, //6508 #CJK UNIFIED IDEOGRAPH + {0xE856, 0x93C3}, //6509 #CJK UNIFIED IDEOGRAPH + {0xE857, 0x93DD}, //6510 #CJK UNIFIED IDEOGRAPH + {0xE858, 0x93D0}, //6511 #CJK UNIFIED IDEOGRAPH + {0xE859, 0x93C8}, //6512 #CJK UNIFIED IDEOGRAPH + {0xE85A, 0x93E4}, //6513 #CJK UNIFIED IDEOGRAPH + {0xE85B, 0x941A}, //6514 #CJK UNIFIED IDEOGRAPH + {0xE85C, 0x9414}, //6515 #CJK UNIFIED IDEOGRAPH + {0xE85D, 0x9413}, //6516 #CJK UNIFIED IDEOGRAPH + {0xE85E, 0x9403}, //6517 #CJK UNIFIED IDEOGRAPH + {0xE85F, 0x9407}, //6518 #CJK UNIFIED IDEOGRAPH + {0xE860, 0x9410}, //6519 #CJK UNIFIED IDEOGRAPH + {0xE861, 0x9436}, //6520 #CJK UNIFIED IDEOGRAPH + {0xE862, 0x942B}, //6521 #CJK UNIFIED IDEOGRAPH + {0xE863, 0x9435}, //6522 #CJK UNIFIED IDEOGRAPH + {0xE864, 0x9421}, //6523 #CJK UNIFIED IDEOGRAPH + {0xE865, 0x943A}, //6524 #CJK UNIFIED IDEOGRAPH + {0xE866, 0x9441}, //6525 #CJK UNIFIED IDEOGRAPH + {0xE867, 0x9452}, //6526 #CJK UNIFIED IDEOGRAPH + {0xE868, 0x9444}, //6527 #CJK UNIFIED IDEOGRAPH + {0xE869, 0x945B}, //6528 #CJK UNIFIED IDEOGRAPH + {0xE86A, 0x9460}, //6529 #CJK UNIFIED IDEOGRAPH + {0xE86B, 0x9462}, //6530 #CJK UNIFIED IDEOGRAPH + {0xE86C, 0x945E}, //6531 #CJK UNIFIED IDEOGRAPH + {0xE86D, 0x946A}, //6532 #CJK UNIFIED IDEOGRAPH + {0xE86E, 0x9229}, //6533 #CJK UNIFIED IDEOGRAPH + {0xE86F, 0x9470}, //6534 #CJK UNIFIED IDEOGRAPH + {0xE870, 0x9475}, //6535 #CJK UNIFIED IDEOGRAPH + {0xE871, 0x9477}, //6536 #CJK UNIFIED IDEOGRAPH + {0xE872, 0x947D}, //6537 #CJK UNIFIED IDEOGRAPH + {0xE873, 0x945A}, //6538 #CJK UNIFIED IDEOGRAPH + {0xE874, 0x947C}, //6539 #CJK UNIFIED IDEOGRAPH + {0xE875, 0x947E}, //6540 #CJK UNIFIED IDEOGRAPH + {0xE876, 0x9481}, //6541 #CJK UNIFIED IDEOGRAPH + {0xE877, 0x947F}, //6542 #CJK UNIFIED IDEOGRAPH + {0xE878, 0x9582}, //6543 #CJK UNIFIED IDEOGRAPH + {0xE879, 0x9587}, //6544 #CJK UNIFIED IDEOGRAPH + {0xE87A, 0x958A}, //6545 #CJK UNIFIED IDEOGRAPH + {0xE87B, 0x9594}, //6546 #CJK UNIFIED IDEOGRAPH + {0xE87C, 0x9596}, //6547 #CJK UNIFIED IDEOGRAPH + {0xE87D, 0x9598}, //6548 #CJK UNIFIED IDEOGRAPH + {0xE87E, 0x9599}, //6549 #CJK UNIFIED IDEOGRAPH + {0xE880, 0x95A0}, //6550 #CJK UNIFIED IDEOGRAPH + {0xE881, 0x95A8}, //6551 #CJK UNIFIED IDEOGRAPH + {0xE882, 0x95A7}, //6552 #CJK UNIFIED IDEOGRAPH + {0xE883, 0x95AD}, //6553 #CJK UNIFIED IDEOGRAPH + {0xE884, 0x95BC}, //6554 #CJK UNIFIED IDEOGRAPH + {0xE885, 0x95BB}, //6555 #CJK UNIFIED IDEOGRAPH + {0xE886, 0x95B9}, //6556 #CJK UNIFIED IDEOGRAPH + {0xE887, 0x95BE}, //6557 #CJK UNIFIED IDEOGRAPH + {0xE888, 0x95CA}, //6558 #CJK UNIFIED IDEOGRAPH + {0xE889, 0x6FF6}, //6559 #CJK UNIFIED IDEOGRAPH + {0xE88A, 0x95C3}, //6560 #CJK UNIFIED IDEOGRAPH + {0xE88B, 0x95CD}, //6561 #CJK UNIFIED IDEOGRAPH + {0xE88C, 0x95CC}, //6562 #CJK UNIFIED IDEOGRAPH + {0xE88D, 0x95D5}, //6563 #CJK UNIFIED IDEOGRAPH + {0xE88E, 0x95D4}, //6564 #CJK UNIFIED IDEOGRAPH + {0xE88F, 0x95D6}, //6565 #CJK UNIFIED IDEOGRAPH + {0xE890, 0x95DC}, //6566 #CJK UNIFIED IDEOGRAPH + {0xE891, 0x95E1}, //6567 #CJK UNIFIED IDEOGRAPH + {0xE892, 0x95E5}, //6568 #CJK UNIFIED IDEOGRAPH + {0xE893, 0x95E2}, //6569 #CJK UNIFIED IDEOGRAPH + {0xE894, 0x9621}, //6570 #CJK UNIFIED IDEOGRAPH + {0xE895, 0x9628}, //6571 #CJK UNIFIED IDEOGRAPH + {0xE896, 0x962E}, //6572 #CJK UNIFIED IDEOGRAPH + {0xE897, 0x962F}, //6573 #CJK UNIFIED IDEOGRAPH + {0xE898, 0x9642}, //6574 #CJK UNIFIED IDEOGRAPH + {0xE899, 0x964C}, //6575 #CJK UNIFIED IDEOGRAPH + {0xE89A, 0x964F}, //6576 #CJK UNIFIED IDEOGRAPH + {0xE89B, 0x964B}, //6577 #CJK UNIFIED IDEOGRAPH + {0xE89C, 0x9677}, //6578 #CJK UNIFIED IDEOGRAPH + {0xE89D, 0x965C}, //6579 #CJK UNIFIED IDEOGRAPH + {0xE89E, 0x965E}, //6580 #CJK UNIFIED IDEOGRAPH + {0xE89F, 0x965D}, //6581 #CJK UNIFIED IDEOGRAPH + {0xE8A0, 0x965F}, //6582 #CJK UNIFIED IDEOGRAPH + {0xE8A1, 0x9666}, //6583 #CJK UNIFIED IDEOGRAPH + {0xE8A2, 0x9672}, //6584 #CJK UNIFIED IDEOGRAPH + {0xE8A3, 0x966C}, //6585 #CJK UNIFIED IDEOGRAPH + {0xE8A4, 0x968D}, //6586 #CJK UNIFIED IDEOGRAPH + {0xE8A5, 0x9698}, //6587 #CJK UNIFIED IDEOGRAPH + {0xE8A6, 0x9695}, //6588 #CJK UNIFIED IDEOGRAPH + {0xE8A7, 0x9697}, //6589 #CJK UNIFIED IDEOGRAPH + {0xE8A8, 0x96AA}, //6590 #CJK UNIFIED IDEOGRAPH + {0xE8A9, 0x96A7}, //6591 #CJK UNIFIED IDEOGRAPH + {0xE8AA, 0x96B1}, //6592 #CJK UNIFIED IDEOGRAPH + {0xE8AB, 0x96B2}, //6593 #CJK UNIFIED IDEOGRAPH + {0xE8AC, 0x96B0}, //6594 #CJK UNIFIED IDEOGRAPH + {0xE8AD, 0x96B4}, //6595 #CJK UNIFIED IDEOGRAPH + {0xE8AE, 0x96B6}, //6596 #CJK UNIFIED IDEOGRAPH + {0xE8AF, 0x96B8}, //6597 #CJK UNIFIED IDEOGRAPH + {0xE8B0, 0x96B9}, //6598 #CJK UNIFIED IDEOGRAPH + {0xE8B1, 0x96CE}, //6599 #CJK UNIFIED IDEOGRAPH + {0xE8B2, 0x96CB}, //6600 #CJK UNIFIED IDEOGRAPH + {0xE8B3, 0x96C9}, //6601 #CJK UNIFIED IDEOGRAPH + {0xE8B4, 0x96CD}, //6602 #CJK UNIFIED IDEOGRAPH + {0xE8B5, 0x894D}, //6603 #CJK UNIFIED IDEOGRAPH + {0xE8B6, 0x96DC}, //6604 #CJK UNIFIED IDEOGRAPH + {0xE8B7, 0x970D}, //6605 #CJK UNIFIED IDEOGRAPH + {0xE8B8, 0x96D5}, //6606 #CJK UNIFIED IDEOGRAPH + {0xE8B9, 0x96F9}, //6607 #CJK UNIFIED IDEOGRAPH + {0xE8BA, 0x9704}, //6608 #CJK UNIFIED IDEOGRAPH + {0xE8BB, 0x9706}, //6609 #CJK UNIFIED IDEOGRAPH + {0xE8BC, 0x9708}, //6610 #CJK UNIFIED IDEOGRAPH + {0xE8BD, 0x9713}, //6611 #CJK UNIFIED IDEOGRAPH + {0xE8BE, 0x970E}, //6612 #CJK UNIFIED IDEOGRAPH + {0xE8BF, 0x9711}, //6613 #CJK UNIFIED IDEOGRAPH + {0xE8C0, 0x970F}, //6614 #CJK UNIFIED IDEOGRAPH + {0xE8C1, 0x9716}, //6615 #CJK UNIFIED IDEOGRAPH + {0xE8C2, 0x9719}, //6616 #CJK UNIFIED IDEOGRAPH + {0xE8C3, 0x9724}, //6617 #CJK UNIFIED IDEOGRAPH + {0xE8C4, 0x972A}, //6618 #CJK UNIFIED IDEOGRAPH + {0xE8C5, 0x9730}, //6619 #CJK UNIFIED IDEOGRAPH + {0xE8C6, 0x9739}, //6620 #CJK UNIFIED IDEOGRAPH + {0xE8C7, 0x973D}, //6621 #CJK UNIFIED IDEOGRAPH + {0xE8C8, 0x973E}, //6622 #CJK UNIFIED IDEOGRAPH + {0xE8C9, 0x9744}, //6623 #CJK UNIFIED IDEOGRAPH + {0xE8CA, 0x9746}, //6624 #CJK UNIFIED IDEOGRAPH + {0xE8CB, 0x9748}, //6625 #CJK UNIFIED IDEOGRAPH + {0xE8CC, 0x9742}, //6626 #CJK UNIFIED IDEOGRAPH + {0xE8CD, 0x9749}, //6627 #CJK UNIFIED IDEOGRAPH + {0xE8CE, 0x975C}, //6628 #CJK UNIFIED IDEOGRAPH + {0xE8CF, 0x9760}, //6629 #CJK UNIFIED IDEOGRAPH + {0xE8D0, 0x9764}, //6630 #CJK UNIFIED IDEOGRAPH + {0xE8D1, 0x9766}, //6631 #CJK UNIFIED IDEOGRAPH + {0xE8D2, 0x9768}, //6632 #CJK UNIFIED IDEOGRAPH + {0xE8D3, 0x52D2}, //6633 #CJK UNIFIED IDEOGRAPH + {0xE8D4, 0x976B}, //6634 #CJK UNIFIED IDEOGRAPH + {0xE8D5, 0x9771}, //6635 #CJK UNIFIED IDEOGRAPH + {0xE8D6, 0x9779}, //6636 #CJK UNIFIED IDEOGRAPH + {0xE8D7, 0x9785}, //6637 #CJK UNIFIED IDEOGRAPH + {0xE8D8, 0x977C}, //6638 #CJK UNIFIED IDEOGRAPH + {0xE8D9, 0x9781}, //6639 #CJK UNIFIED IDEOGRAPH + {0xE8DA, 0x977A}, //6640 #CJK UNIFIED IDEOGRAPH + {0xE8DB, 0x9786}, //6641 #CJK UNIFIED IDEOGRAPH + {0xE8DC, 0x978B}, //6642 #CJK UNIFIED IDEOGRAPH + {0xE8DD, 0x978F}, //6643 #CJK UNIFIED IDEOGRAPH + {0xE8DE, 0x9790}, //6644 #CJK UNIFIED IDEOGRAPH + {0xE8DF, 0x979C}, //6645 #CJK UNIFIED IDEOGRAPH + {0xE8E0, 0x97A8}, //6646 #CJK UNIFIED IDEOGRAPH + {0xE8E1, 0x97A6}, //6647 #CJK UNIFIED IDEOGRAPH + {0xE8E2, 0x97A3}, //6648 #CJK UNIFIED IDEOGRAPH + {0xE8E3, 0x97B3}, //6649 #CJK UNIFIED IDEOGRAPH + {0xE8E4, 0x97B4}, //6650 #CJK UNIFIED IDEOGRAPH + {0xE8E5, 0x97C3}, //6651 #CJK UNIFIED IDEOGRAPH + {0xE8E6, 0x97C6}, //6652 #CJK UNIFIED IDEOGRAPH + {0xE8E7, 0x97C8}, //6653 #CJK UNIFIED IDEOGRAPH + {0xE8E8, 0x97CB}, //6654 #CJK UNIFIED IDEOGRAPH + {0xE8E9, 0x97DC}, //6655 #CJK UNIFIED IDEOGRAPH + {0xE8EA, 0x97ED}, //6656 #CJK UNIFIED IDEOGRAPH + {0xE8EB, 0x9F4F}, //6657 #CJK UNIFIED IDEOGRAPH + {0xE8EC, 0x97F2}, //6658 #CJK UNIFIED IDEOGRAPH + {0xE8ED, 0x7ADF}, //6659 #CJK UNIFIED IDEOGRAPH + {0xE8EE, 0x97F6}, //6660 #CJK UNIFIED IDEOGRAPH + {0xE8EF, 0x97F5}, //6661 #CJK UNIFIED IDEOGRAPH + {0xE8F0, 0x980F}, //6662 #CJK UNIFIED IDEOGRAPH + {0xE8F1, 0x980C}, //6663 #CJK UNIFIED IDEOGRAPH + {0xE8F2, 0x9838}, //6664 #CJK UNIFIED IDEOGRAPH + {0xE8F3, 0x9824}, //6665 #CJK UNIFIED IDEOGRAPH + {0xE8F4, 0x9821}, //6666 #CJK UNIFIED IDEOGRAPH + {0xE8F5, 0x9837}, //6667 #CJK UNIFIED IDEOGRAPH + {0xE8F6, 0x983D}, //6668 #CJK UNIFIED IDEOGRAPH + {0xE8F7, 0x9846}, //6669 #CJK UNIFIED IDEOGRAPH + {0xE8F8, 0x984F}, //6670 #CJK UNIFIED IDEOGRAPH + {0xE8F9, 0x984B}, //6671 #CJK UNIFIED IDEOGRAPH + {0xE8FA, 0x986B}, //6672 #CJK UNIFIED IDEOGRAPH + {0xE8FB, 0x986F}, //6673 #CJK UNIFIED IDEOGRAPH + {0xE8FC, 0x9870}, //6674 #CJK UNIFIED IDEOGRAPH + {0xE940, 0x9871}, //6675 #CJK UNIFIED IDEOGRAPH + {0xE941, 0x9874}, //6676 #CJK UNIFIED IDEOGRAPH + {0xE942, 0x9873}, //6677 #CJK UNIFIED IDEOGRAPH + {0xE943, 0x98AA}, //6678 #CJK UNIFIED IDEOGRAPH + {0xE944, 0x98AF}, //6679 #CJK UNIFIED IDEOGRAPH + {0xE945, 0x98B1}, //6680 #CJK UNIFIED IDEOGRAPH + {0xE946, 0x98B6}, //6681 #CJK UNIFIED IDEOGRAPH + {0xE947, 0x98C4}, //6682 #CJK UNIFIED IDEOGRAPH + {0xE948, 0x98C3}, //6683 #CJK UNIFIED IDEOGRAPH + {0xE949, 0x98C6}, //6684 #CJK UNIFIED IDEOGRAPH + {0xE94A, 0x98E9}, //6685 #CJK UNIFIED IDEOGRAPH + {0xE94B, 0x98EB}, //6686 #CJK UNIFIED IDEOGRAPH + {0xE94C, 0x9903}, //6687 #CJK UNIFIED IDEOGRAPH + {0xE94D, 0x9909}, //6688 #CJK UNIFIED IDEOGRAPH + {0xE94E, 0x9912}, //6689 #CJK UNIFIED IDEOGRAPH + {0xE94F, 0x9914}, //6690 #CJK UNIFIED IDEOGRAPH + {0xE950, 0x9918}, //6691 #CJK UNIFIED IDEOGRAPH + {0xE951, 0x9921}, //6692 #CJK UNIFIED IDEOGRAPH + {0xE952, 0x991D}, //6693 #CJK UNIFIED IDEOGRAPH + {0xE953, 0x991E}, //6694 #CJK UNIFIED IDEOGRAPH + {0xE954, 0x9924}, //6695 #CJK UNIFIED IDEOGRAPH + {0xE955, 0x9920}, //6696 #CJK UNIFIED IDEOGRAPH + {0xE956, 0x992C}, //6697 #CJK UNIFIED IDEOGRAPH + {0xE957, 0x992E}, //6698 #CJK UNIFIED IDEOGRAPH + {0xE958, 0x993D}, //6699 #CJK UNIFIED IDEOGRAPH + {0xE959, 0x993E}, //6700 #CJK UNIFIED IDEOGRAPH + {0xE95A, 0x9942}, //6701 #CJK UNIFIED IDEOGRAPH + {0xE95B, 0x9949}, //6702 #CJK UNIFIED IDEOGRAPH + {0xE95C, 0x9945}, //6703 #CJK UNIFIED IDEOGRAPH + {0xE95D, 0x9950}, //6704 #CJK UNIFIED IDEOGRAPH + {0xE95E, 0x994B}, //6705 #CJK UNIFIED IDEOGRAPH + {0xE95F, 0x9951}, //6706 #CJK UNIFIED IDEOGRAPH + {0xE960, 0x9952}, //6707 #CJK UNIFIED IDEOGRAPH + {0xE961, 0x994C}, //6708 #CJK UNIFIED IDEOGRAPH + {0xE962, 0x9955}, //6709 #CJK UNIFIED IDEOGRAPH + {0xE963, 0x9997}, //6710 #CJK UNIFIED IDEOGRAPH + {0xE964, 0x9998}, //6711 #CJK UNIFIED IDEOGRAPH + {0xE965, 0x99A5}, //6712 #CJK UNIFIED IDEOGRAPH + {0xE966, 0x99AD}, //6713 #CJK UNIFIED IDEOGRAPH + {0xE967, 0x99AE}, //6714 #CJK UNIFIED IDEOGRAPH + {0xE968, 0x99BC}, //6715 #CJK UNIFIED IDEOGRAPH + {0xE969, 0x99DF}, //6716 #CJK UNIFIED IDEOGRAPH + {0xE96A, 0x99DB}, //6717 #CJK UNIFIED IDEOGRAPH + {0xE96B, 0x99DD}, //6718 #CJK UNIFIED IDEOGRAPH + {0xE96C, 0x99D8}, //6719 #CJK UNIFIED IDEOGRAPH + {0xE96D, 0x99D1}, //6720 #CJK UNIFIED IDEOGRAPH + {0xE96E, 0x99ED}, //6721 #CJK UNIFIED IDEOGRAPH + {0xE96F, 0x99EE}, //6722 #CJK UNIFIED IDEOGRAPH + {0xE970, 0x99F1}, //6723 #CJK UNIFIED IDEOGRAPH + {0xE971, 0x99F2}, //6724 #CJK UNIFIED IDEOGRAPH + {0xE972, 0x99FB}, //6725 #CJK UNIFIED IDEOGRAPH + {0xE973, 0x99F8}, //6726 #CJK UNIFIED IDEOGRAPH + {0xE974, 0x9A01}, //6727 #CJK UNIFIED IDEOGRAPH + {0xE975, 0x9A0F}, //6728 #CJK UNIFIED IDEOGRAPH + {0xE976, 0x9A05}, //6729 #CJK UNIFIED IDEOGRAPH + {0xE977, 0x99E2}, //6730 #CJK UNIFIED IDEOGRAPH + {0xE978, 0x9A19}, //6731 #CJK UNIFIED IDEOGRAPH + {0xE979, 0x9A2B}, //6732 #CJK UNIFIED IDEOGRAPH + {0xE97A, 0x9A37}, //6733 #CJK UNIFIED IDEOGRAPH + {0xE97B, 0x9A45}, //6734 #CJK UNIFIED IDEOGRAPH + {0xE97C, 0x9A42}, //6735 #CJK UNIFIED IDEOGRAPH + {0xE97D, 0x9A40}, //6736 #CJK UNIFIED IDEOGRAPH + {0xE97E, 0x9A43}, //6737 #CJK UNIFIED IDEOGRAPH + {0xE980, 0x9A3E}, //6738 #CJK UNIFIED IDEOGRAPH + {0xE981, 0x9A55}, //6739 #CJK UNIFIED IDEOGRAPH + {0xE982, 0x9A4D}, //6740 #CJK UNIFIED IDEOGRAPH + {0xE983, 0x9A5B}, //6741 #CJK UNIFIED IDEOGRAPH + {0xE984, 0x9A57}, //6742 #CJK UNIFIED IDEOGRAPH + {0xE985, 0x9A5F}, //6743 #CJK UNIFIED IDEOGRAPH + {0xE986, 0x9A62}, //6744 #CJK UNIFIED IDEOGRAPH + {0xE987, 0x9A65}, //6745 #CJK UNIFIED IDEOGRAPH + {0xE988, 0x9A64}, //6746 #CJK UNIFIED IDEOGRAPH + {0xE989, 0x9A69}, //6747 #CJK UNIFIED IDEOGRAPH + {0xE98A, 0x9A6B}, //6748 #CJK UNIFIED IDEOGRAPH + {0xE98B, 0x9A6A}, //6749 #CJK UNIFIED IDEOGRAPH + {0xE98C, 0x9AAD}, //6750 #CJK UNIFIED IDEOGRAPH + {0xE98D, 0x9AB0}, //6751 #CJK UNIFIED IDEOGRAPH + {0xE98E, 0x9ABC}, //6752 #CJK UNIFIED IDEOGRAPH + {0xE98F, 0x9AC0}, //6753 #CJK UNIFIED IDEOGRAPH + {0xE990, 0x9ACF}, //6754 #CJK UNIFIED IDEOGRAPH + {0xE991, 0x9AD1}, //6755 #CJK UNIFIED IDEOGRAPH + {0xE992, 0x9AD3}, //6756 #CJK UNIFIED IDEOGRAPH + {0xE993, 0x9AD4}, //6757 #CJK UNIFIED IDEOGRAPH + {0xE994, 0x9ADE}, //6758 #CJK UNIFIED IDEOGRAPH + {0xE995, 0x9ADF}, //6759 #CJK UNIFIED IDEOGRAPH + {0xE996, 0x9AE2}, //6760 #CJK UNIFIED IDEOGRAPH + {0xE997, 0x9AE3}, //6761 #CJK UNIFIED IDEOGRAPH + {0xE998, 0x9AE6}, //6762 #CJK UNIFIED IDEOGRAPH + {0xE999, 0x9AEF}, //6763 #CJK UNIFIED IDEOGRAPH + {0xE99A, 0x9AEB}, //6764 #CJK UNIFIED IDEOGRAPH + {0xE99B, 0x9AEE}, //6765 #CJK UNIFIED IDEOGRAPH + {0xE99C, 0x9AF4}, //6766 #CJK UNIFIED IDEOGRAPH + {0xE99D, 0x9AF1}, //6767 #CJK UNIFIED IDEOGRAPH + {0xE99E, 0x9AF7}, //6768 #CJK UNIFIED IDEOGRAPH + {0xE99F, 0x9AFB}, //6769 #CJK UNIFIED IDEOGRAPH + {0xE9A0, 0x9B06}, //6770 #CJK UNIFIED IDEOGRAPH + {0xE9A1, 0x9B18}, //6771 #CJK UNIFIED IDEOGRAPH + {0xE9A2, 0x9B1A}, //6772 #CJK UNIFIED IDEOGRAPH + {0xE9A3, 0x9B1F}, //6773 #CJK UNIFIED IDEOGRAPH + {0xE9A4, 0x9B22}, //6774 #CJK UNIFIED IDEOGRAPH + {0xE9A5, 0x9B23}, //6775 #CJK UNIFIED IDEOGRAPH + {0xE9A6, 0x9B25}, //6776 #CJK UNIFIED IDEOGRAPH + {0xE9A7, 0x9B27}, //6777 #CJK UNIFIED IDEOGRAPH + {0xE9A8, 0x9B28}, //6778 #CJK UNIFIED IDEOGRAPH + {0xE9A9, 0x9B29}, //6779 #CJK UNIFIED IDEOGRAPH + {0xE9AA, 0x9B2A}, //6780 #CJK UNIFIED IDEOGRAPH + {0xE9AB, 0x9B2E}, //6781 #CJK UNIFIED IDEOGRAPH + {0xE9AC, 0x9B2F}, //6782 #CJK UNIFIED IDEOGRAPH + {0xE9AD, 0x9B32}, //6783 #CJK UNIFIED IDEOGRAPH + {0xE9AE, 0x9B44}, //6784 #CJK UNIFIED IDEOGRAPH + {0xE9AF, 0x9B43}, //6785 #CJK UNIFIED IDEOGRAPH + {0xE9B0, 0x9B4F}, //6786 #CJK UNIFIED IDEOGRAPH + {0xE9B1, 0x9B4D}, //6787 #CJK UNIFIED IDEOGRAPH + {0xE9B2, 0x9B4E}, //6788 #CJK UNIFIED IDEOGRAPH + {0xE9B3, 0x9B51}, //6789 #CJK UNIFIED IDEOGRAPH + {0xE9B4, 0x9B58}, //6790 #CJK UNIFIED IDEOGRAPH + {0xE9B5, 0x9B74}, //6791 #CJK UNIFIED IDEOGRAPH + {0xE9B6, 0x9B93}, //6792 #CJK UNIFIED IDEOGRAPH + {0xE9B7, 0x9B83}, //6793 #CJK UNIFIED IDEOGRAPH + {0xE9B8, 0x9B91}, //6794 #CJK UNIFIED IDEOGRAPH + {0xE9B9, 0x9B96}, //6795 #CJK UNIFIED IDEOGRAPH + {0xE9BA, 0x9B97}, //6796 #CJK UNIFIED IDEOGRAPH + {0xE9BB, 0x9B9F}, //6797 #CJK UNIFIED IDEOGRAPH + {0xE9BC, 0x9BA0}, //6798 #CJK UNIFIED IDEOGRAPH + {0xE9BD, 0x9BA8}, //6799 #CJK UNIFIED IDEOGRAPH + {0xE9BE, 0x9BB4}, //6800 #CJK UNIFIED IDEOGRAPH + {0xE9BF, 0x9BC0}, //6801 #CJK UNIFIED IDEOGRAPH + {0xE9C0, 0x9BCA}, //6802 #CJK UNIFIED IDEOGRAPH + {0xE9C1, 0x9BB9}, //6803 #CJK UNIFIED IDEOGRAPH + {0xE9C2, 0x9BC6}, //6804 #CJK UNIFIED IDEOGRAPH + {0xE9C3, 0x9BCF}, //6805 #CJK UNIFIED IDEOGRAPH + {0xE9C4, 0x9BD1}, //6806 #CJK UNIFIED IDEOGRAPH + {0xE9C5, 0x9BD2}, //6807 #CJK UNIFIED IDEOGRAPH + {0xE9C6, 0x9BE3}, //6808 #CJK UNIFIED IDEOGRAPH + {0xE9C7, 0x9BE2}, //6809 #CJK UNIFIED IDEOGRAPH + {0xE9C8, 0x9BE4}, //6810 #CJK UNIFIED IDEOGRAPH + {0xE9C9, 0x9BD4}, //6811 #CJK UNIFIED IDEOGRAPH + {0xE9CA, 0x9BE1}, //6812 #CJK UNIFIED IDEOGRAPH + {0xE9CB, 0x9C3A}, //6813 #CJK UNIFIED IDEOGRAPH + {0xE9CC, 0x9BF2}, //6814 #CJK UNIFIED IDEOGRAPH + {0xE9CD, 0x9BF1}, //6815 #CJK UNIFIED IDEOGRAPH + {0xE9CE, 0x9BF0}, //6816 #CJK UNIFIED IDEOGRAPH + {0xE9CF, 0x9C15}, //6817 #CJK UNIFIED IDEOGRAPH + {0xE9D0, 0x9C14}, //6818 #CJK UNIFIED IDEOGRAPH + {0xE9D1, 0x9C09}, //6819 #CJK UNIFIED IDEOGRAPH + {0xE9D2, 0x9C13}, //6820 #CJK UNIFIED IDEOGRAPH + {0xE9D3, 0x9C0C}, //6821 #CJK UNIFIED IDEOGRAPH + {0xE9D4, 0x9C06}, //6822 #CJK UNIFIED IDEOGRAPH + {0xE9D5, 0x9C08}, //6823 #CJK UNIFIED IDEOGRAPH + {0xE9D6, 0x9C12}, //6824 #CJK UNIFIED IDEOGRAPH + {0xE9D7, 0x9C0A}, //6825 #CJK UNIFIED IDEOGRAPH + {0xE9D8, 0x9C04}, //6826 #CJK UNIFIED IDEOGRAPH + {0xE9D9, 0x9C2E}, //6827 #CJK UNIFIED IDEOGRAPH + {0xE9DA, 0x9C1B}, //6828 #CJK UNIFIED IDEOGRAPH + {0xE9DB, 0x9C25}, //6829 #CJK UNIFIED IDEOGRAPH + {0xE9DC, 0x9C24}, //6830 #CJK UNIFIED IDEOGRAPH + {0xE9DD, 0x9C21}, //6831 #CJK UNIFIED IDEOGRAPH + {0xE9DE, 0x9C30}, //6832 #CJK UNIFIED IDEOGRAPH + {0xE9DF, 0x9C47}, //6833 #CJK UNIFIED IDEOGRAPH + {0xE9E0, 0x9C32}, //6834 #CJK UNIFIED IDEOGRAPH + {0xE9E1, 0x9C46}, //6835 #CJK UNIFIED IDEOGRAPH + {0xE9E2, 0x9C3E}, //6836 #CJK UNIFIED IDEOGRAPH + {0xE9E3, 0x9C5A}, //6837 #CJK UNIFIED IDEOGRAPH + {0xE9E4, 0x9C60}, //6838 #CJK UNIFIED IDEOGRAPH + {0xE9E5, 0x9C67}, //6839 #CJK UNIFIED IDEOGRAPH + {0xE9E6, 0x9C76}, //6840 #CJK UNIFIED IDEOGRAPH + {0xE9E7, 0x9C78}, //6841 #CJK UNIFIED IDEOGRAPH + {0xE9E8, 0x9CE7}, //6842 #CJK UNIFIED IDEOGRAPH + {0xE9E9, 0x9CEC}, //6843 #CJK UNIFIED IDEOGRAPH + {0xE9EA, 0x9CF0}, //6844 #CJK UNIFIED IDEOGRAPH + {0xE9EB, 0x9D09}, //6845 #CJK UNIFIED IDEOGRAPH + {0xE9EC, 0x9D08}, //6846 #CJK UNIFIED IDEOGRAPH + {0xE9ED, 0x9CEB}, //6847 #CJK UNIFIED IDEOGRAPH + {0xE9EE, 0x9D03}, //6848 #CJK UNIFIED IDEOGRAPH + {0xE9EF, 0x9D06}, //6849 #CJK UNIFIED IDEOGRAPH + {0xE9F0, 0x9D2A}, //6850 #CJK UNIFIED IDEOGRAPH + {0xE9F1, 0x9D26}, //6851 #CJK UNIFIED IDEOGRAPH + {0xE9F2, 0x9DAF}, //6852 #CJK UNIFIED IDEOGRAPH + {0xE9F3, 0x9D23}, //6853 #CJK UNIFIED IDEOGRAPH + {0xE9F4, 0x9D1F}, //6854 #CJK UNIFIED IDEOGRAPH + {0xE9F5, 0x9D44}, //6855 #CJK UNIFIED IDEOGRAPH + {0xE9F6, 0x9D15}, //6856 #CJK UNIFIED IDEOGRAPH + {0xE9F7, 0x9D12}, //6857 #CJK UNIFIED IDEOGRAPH + {0xE9F8, 0x9D41}, //6858 #CJK UNIFIED IDEOGRAPH + {0xE9F9, 0x9D3F}, //6859 #CJK UNIFIED IDEOGRAPH + {0xE9FA, 0x9D3E}, //6860 #CJK UNIFIED IDEOGRAPH + {0xE9FB, 0x9D46}, //6861 #CJK UNIFIED IDEOGRAPH + {0xE9FC, 0x9D48}, //6862 #CJK UNIFIED IDEOGRAPH + {0xEA40, 0x9D5D}, //6863 #CJK UNIFIED IDEOGRAPH + {0xEA41, 0x9D5E}, //6864 #CJK UNIFIED IDEOGRAPH + {0xEA42, 0x9D64}, //6865 #CJK UNIFIED IDEOGRAPH + {0xEA43, 0x9D51}, //6866 #CJK UNIFIED IDEOGRAPH + {0xEA44, 0x9D50}, //6867 #CJK UNIFIED IDEOGRAPH + {0xEA45, 0x9D59}, //6868 #CJK UNIFIED IDEOGRAPH + {0xEA46, 0x9D72}, //6869 #CJK UNIFIED IDEOGRAPH + {0xEA47, 0x9D89}, //6870 #CJK UNIFIED IDEOGRAPH + {0xEA48, 0x9D87}, //6871 #CJK UNIFIED IDEOGRAPH + {0xEA49, 0x9DAB}, //6872 #CJK UNIFIED IDEOGRAPH + {0xEA4A, 0x9D6F}, //6873 #CJK UNIFIED IDEOGRAPH + {0xEA4B, 0x9D7A}, //6874 #CJK UNIFIED IDEOGRAPH + {0xEA4C, 0x9D9A}, //6875 #CJK UNIFIED IDEOGRAPH + {0xEA4D, 0x9DA4}, //6876 #CJK UNIFIED IDEOGRAPH + {0xEA4E, 0x9DA9}, //6877 #CJK UNIFIED IDEOGRAPH + {0xEA4F, 0x9DB2}, //6878 #CJK UNIFIED IDEOGRAPH + {0xEA50, 0x9DC4}, //6879 #CJK UNIFIED IDEOGRAPH + {0xEA51, 0x9DC1}, //6880 #CJK UNIFIED IDEOGRAPH + {0xEA52, 0x9DBB}, //6881 #CJK UNIFIED IDEOGRAPH + {0xEA53, 0x9DB8}, //6882 #CJK UNIFIED IDEOGRAPH + {0xEA54, 0x9DBA}, //6883 #CJK UNIFIED IDEOGRAPH + {0xEA55, 0x9DC6}, //6884 #CJK UNIFIED IDEOGRAPH + {0xEA56, 0x9DCF}, //6885 #CJK UNIFIED IDEOGRAPH + {0xEA57, 0x9DC2}, //6886 #CJK UNIFIED IDEOGRAPH + {0xEA58, 0x9DD9}, //6887 #CJK UNIFIED IDEOGRAPH + {0xEA59, 0x9DD3}, //6888 #CJK UNIFIED IDEOGRAPH + {0xEA5A, 0x9DF8}, //6889 #CJK UNIFIED IDEOGRAPH + {0xEA5B, 0x9DE6}, //6890 #CJK UNIFIED IDEOGRAPH + {0xEA5C, 0x9DED}, //6891 #CJK UNIFIED IDEOGRAPH + {0xEA5D, 0x9DEF}, //6892 #CJK UNIFIED IDEOGRAPH + {0xEA5E, 0x9DFD}, //6893 #CJK UNIFIED IDEOGRAPH + {0xEA5F, 0x9E1A}, //6894 #CJK UNIFIED IDEOGRAPH + {0xEA60, 0x9E1B}, //6895 #CJK UNIFIED IDEOGRAPH + {0xEA61, 0x9E1E}, //6896 #CJK UNIFIED IDEOGRAPH + {0xEA62, 0x9E75}, //6897 #CJK UNIFIED IDEOGRAPH + {0xEA63, 0x9E79}, //6898 #CJK UNIFIED IDEOGRAPH + {0xEA64, 0x9E7D}, //6899 #CJK UNIFIED IDEOGRAPH + {0xEA65, 0x9E81}, //6900 #CJK UNIFIED IDEOGRAPH + {0xEA66, 0x9E88}, //6901 #CJK UNIFIED IDEOGRAPH + {0xEA67, 0x9E8B}, //6902 #CJK UNIFIED IDEOGRAPH + {0xEA68, 0x9E8C}, //6903 #CJK UNIFIED IDEOGRAPH + {0xEA69, 0x9E92}, //6904 #CJK UNIFIED IDEOGRAPH + {0xEA6A, 0x9E95}, //6905 #CJK UNIFIED IDEOGRAPH + {0xEA6B, 0x9E91}, //6906 #CJK UNIFIED IDEOGRAPH + {0xEA6C, 0x9E9D}, //6907 #CJK UNIFIED IDEOGRAPH + {0xEA6D, 0x9EA5}, //6908 #CJK UNIFIED IDEOGRAPH + {0xEA6E, 0x9EA9}, //6909 #CJK UNIFIED IDEOGRAPH + {0xEA6F, 0x9EB8}, //6910 #CJK UNIFIED IDEOGRAPH + {0xEA70, 0x9EAA}, //6911 #CJK UNIFIED IDEOGRAPH + {0xEA71, 0x9EAD}, //6912 #CJK UNIFIED IDEOGRAPH + {0xEA72, 0x9761}, //6913 #CJK UNIFIED IDEOGRAPH + {0xEA73, 0x9ECC}, //6914 #CJK UNIFIED IDEOGRAPH + {0xEA74, 0x9ECE}, //6915 #CJK UNIFIED IDEOGRAPH + {0xEA75, 0x9ECF}, //6916 #CJK UNIFIED IDEOGRAPH + {0xEA76, 0x9ED0}, //6917 #CJK UNIFIED IDEOGRAPH + {0xEA77, 0x9ED4}, //6918 #CJK UNIFIED IDEOGRAPH + {0xEA78, 0x9EDC}, //6919 #CJK UNIFIED IDEOGRAPH + {0xEA79, 0x9EDE}, //6920 #CJK UNIFIED IDEOGRAPH + {0xEA7A, 0x9EDD}, //6921 #CJK UNIFIED IDEOGRAPH + {0xEA7B, 0x9EE0}, //6922 #CJK UNIFIED IDEOGRAPH + {0xEA7C, 0x9EE5}, //6923 #CJK UNIFIED IDEOGRAPH + {0xEA7D, 0x9EE8}, //6924 #CJK UNIFIED IDEOGRAPH + {0xEA7E, 0x9EEF}, //6925 #CJK UNIFIED IDEOGRAPH + {0xEA80, 0x9EF4}, //6926 #CJK UNIFIED IDEOGRAPH + {0xEA81, 0x9EF6}, //6927 #CJK UNIFIED IDEOGRAPH + {0xEA82, 0x9EF7}, //6928 #CJK UNIFIED IDEOGRAPH + {0xEA83, 0x9EF9}, //6929 #CJK UNIFIED IDEOGRAPH + {0xEA84, 0x9EFB}, //6930 #CJK UNIFIED IDEOGRAPH + {0xEA85, 0x9EFC}, //6931 #CJK UNIFIED IDEOGRAPH + {0xEA86, 0x9EFD}, //6932 #CJK UNIFIED IDEOGRAPH + {0xEA87, 0x9F07}, //6933 #CJK UNIFIED IDEOGRAPH + {0xEA88, 0x9F08}, //6934 #CJK UNIFIED IDEOGRAPH + {0xEA89, 0x76B7}, //6935 #CJK UNIFIED IDEOGRAPH + {0xEA8A, 0x9F15}, //6936 #CJK UNIFIED IDEOGRAPH + {0xEA8B, 0x9F21}, //6937 #CJK UNIFIED IDEOGRAPH + {0xEA8C, 0x9F2C}, //6938 #CJK UNIFIED IDEOGRAPH + {0xEA8D, 0x9F3E}, //6939 #CJK UNIFIED IDEOGRAPH + {0xEA8E, 0x9F4A}, //6940 #CJK UNIFIED IDEOGRAPH + {0xEA8F, 0x9F52}, //6941 #CJK UNIFIED IDEOGRAPH + {0xEA90, 0x9F54}, //6942 #CJK UNIFIED IDEOGRAPH + {0xEA91, 0x9F63}, //6943 #CJK UNIFIED IDEOGRAPH + {0xEA92, 0x9F5F}, //6944 #CJK UNIFIED IDEOGRAPH + {0xEA93, 0x9F60}, //6945 #CJK UNIFIED IDEOGRAPH + {0xEA94, 0x9F61}, //6946 #CJK UNIFIED IDEOGRAPH + {0xEA95, 0x9F66}, //6947 #CJK UNIFIED IDEOGRAPH + {0xEA96, 0x9F67}, //6948 #CJK UNIFIED IDEOGRAPH + {0xEA97, 0x9F6C}, //6949 #CJK UNIFIED IDEOGRAPH + {0xEA98, 0x9F6A}, //6950 #CJK UNIFIED IDEOGRAPH + {0xEA99, 0x9F77}, //6951 #CJK UNIFIED IDEOGRAPH + {0xEA9A, 0x9F72}, //6952 #CJK UNIFIED IDEOGRAPH + {0xEA9B, 0x9F76}, //6953 #CJK UNIFIED IDEOGRAPH + {0xEA9C, 0x9F95}, //6954 #CJK UNIFIED IDEOGRAPH + {0xEA9D, 0x9F9C}, //6955 #CJK UNIFIED IDEOGRAPH + {0xEA9E, 0x9FA0}, //6956 #CJK UNIFIED IDEOGRAPH + {0xEA9F, 0x582F}, //6957 #CJK UNIFIED IDEOGRAPH + {0xEAA0, 0x69C7}, //6958 #CJK UNIFIED IDEOGRAPH + {0xEAA1, 0x9059}, //6959 #CJK UNIFIED IDEOGRAPH + {0xEAA2, 0x7464}, //6960 #CJK UNIFIED IDEOGRAPH + {0xEAA3, 0x51DC}, //6961 #CJK UNIFIED IDEOGRAPH + {0xEAA4, 0x7199}, //6962 #CJK UNIFIED IDEOGRAPH + {0xED40, 0x7E8A}, //6963 #CJK UNIFIED IDEOGRAPH + {0xED41, 0x891C}, //6964 #CJK UNIFIED IDEOGRAPH + {0xED42, 0x9348}, //6965 #CJK UNIFIED IDEOGRAPH + {0xED43, 0x9288}, //6966 #CJK UNIFIED IDEOGRAPH + {0xED44, 0x84DC}, //6967 #CJK UNIFIED IDEOGRAPH + {0xED45, 0x4FC9}, //6968 #CJK UNIFIED IDEOGRAPH + {0xED46, 0x70BB}, //6969 #CJK UNIFIED IDEOGRAPH + {0xED47, 0x6631}, //6970 #CJK UNIFIED IDEOGRAPH + {0xED48, 0x68C8}, //6971 #CJK UNIFIED IDEOGRAPH + {0xED49, 0x92F9}, //6972 #CJK UNIFIED IDEOGRAPH + {0xED4A, 0x66FB}, //6973 #CJK UNIFIED IDEOGRAPH + {0xED4B, 0x5F45}, //6974 #CJK UNIFIED IDEOGRAPH + {0xED4C, 0x4E28}, //6975 #CJK UNIFIED IDEOGRAPH + {0xED4D, 0x4EE1}, //6976 #CJK UNIFIED IDEOGRAPH + {0xED4E, 0x4EFC}, //6977 #CJK UNIFIED IDEOGRAPH + {0xED4F, 0x4F00}, //6978 #CJK UNIFIED IDEOGRAPH + {0xED50, 0x4F03}, //6979 #CJK UNIFIED IDEOGRAPH + {0xED51, 0x4F39}, //6980 #CJK UNIFIED IDEOGRAPH + {0xED52, 0x4F56}, //6981 #CJK UNIFIED IDEOGRAPH + {0xED53, 0x4F92}, //6982 #CJK UNIFIED IDEOGRAPH + {0xED54, 0x4F8A}, //6983 #CJK UNIFIED IDEOGRAPH + {0xED55, 0x4F9A}, //6984 #CJK UNIFIED IDEOGRAPH + {0xED56, 0x4F94}, //6985 #CJK UNIFIED IDEOGRAPH + {0xED57, 0x4FCD}, //6986 #CJK UNIFIED IDEOGRAPH + {0xED58, 0x5040}, //6987 #CJK UNIFIED IDEOGRAPH + {0xED59, 0x5022}, //6988 #CJK UNIFIED IDEOGRAPH + {0xED5A, 0x4FFF}, //6989 #CJK UNIFIED IDEOGRAPH + {0xED5B, 0x501E}, //6990 #CJK UNIFIED IDEOGRAPH + {0xED5C, 0x5046}, //6991 #CJK UNIFIED IDEOGRAPH + {0xED5D, 0x5070}, //6992 #CJK UNIFIED IDEOGRAPH + {0xED5E, 0x5042}, //6993 #CJK UNIFIED IDEOGRAPH + {0xED5F, 0x5094}, //6994 #CJK UNIFIED IDEOGRAPH + {0xED60, 0x50F4}, //6995 #CJK UNIFIED IDEOGRAPH + {0xED61, 0x50D8}, //6996 #CJK UNIFIED IDEOGRAPH + {0xED62, 0x514A}, //6997 #CJK UNIFIED IDEOGRAPH + {0xED63, 0x5164}, //6998 #CJK UNIFIED IDEOGRAPH + {0xED64, 0x519D}, //6999 #CJK UNIFIED IDEOGRAPH + {0xED65, 0x51BE}, //7000 #CJK UNIFIED IDEOGRAPH + {0xED66, 0x51EC}, //7001 #CJK UNIFIED IDEOGRAPH + {0xED67, 0x5215}, //7002 #CJK UNIFIED IDEOGRAPH + {0xED68, 0x529C}, //7003 #CJK UNIFIED IDEOGRAPH + {0xED69, 0x52A6}, //7004 #CJK UNIFIED IDEOGRAPH + {0xED6A, 0x52C0}, //7005 #CJK UNIFIED IDEOGRAPH + {0xED6B, 0x52DB}, //7006 #CJK UNIFIED IDEOGRAPH + {0xED6C, 0x5300}, //7007 #CJK UNIFIED IDEOGRAPH + {0xED6D, 0x5307}, //7008 #CJK UNIFIED IDEOGRAPH + {0xED6E, 0x5324}, //7009 #CJK UNIFIED IDEOGRAPH + {0xED6F, 0x5372}, //7010 #CJK UNIFIED IDEOGRAPH + {0xED70, 0x5393}, //7011 #CJK UNIFIED IDEOGRAPH + {0xED71, 0x53B2}, //7012 #CJK UNIFIED IDEOGRAPH + {0xED72, 0x53DD}, //7013 #CJK UNIFIED IDEOGRAPH + {0xED73, 0xFA0E}, //7014 #CJK COMPATIBILITY IDEOGRAPH + {0xED74, 0x549C}, //7015 #CJK UNIFIED IDEOGRAPH + {0xED75, 0x548A}, //7016 #CJK UNIFIED IDEOGRAPH + {0xED76, 0x54A9}, //7017 #CJK UNIFIED IDEOGRAPH + {0xED77, 0x54FF}, //7018 #CJK UNIFIED IDEOGRAPH + {0xED78, 0x5586}, //7019 #CJK UNIFIED IDEOGRAPH + {0xED79, 0x5759}, //7020 #CJK UNIFIED IDEOGRAPH + {0xED7A, 0x5765}, //7021 #CJK UNIFIED IDEOGRAPH + {0xED7B, 0x57AC}, //7022 #CJK UNIFIED IDEOGRAPH + {0xED7C, 0x57C8}, //7023 #CJK UNIFIED IDEOGRAPH + {0xED7D, 0x57C7}, //7024 #CJK UNIFIED IDEOGRAPH + {0xED7E, 0xFA0F}, //7025 #CJK COMPATIBILITY IDEOGRAPH + {0xED80, 0xFA10}, //7026 #CJK COMPATIBILITY IDEOGRAPH + {0xED81, 0x589E}, //7027 #CJK UNIFIED IDEOGRAPH + {0xED82, 0x58B2}, //7028 #CJK UNIFIED IDEOGRAPH + {0xED83, 0x590B}, //7029 #CJK UNIFIED IDEOGRAPH + {0xED84, 0x5953}, //7030 #CJK UNIFIED IDEOGRAPH + {0xED85, 0x595B}, //7031 #CJK UNIFIED IDEOGRAPH + {0xED86, 0x595D}, //7032 #CJK UNIFIED IDEOGRAPH + {0xED87, 0x5963}, //7033 #CJK UNIFIED IDEOGRAPH + {0xED88, 0x59A4}, //7034 #CJK UNIFIED IDEOGRAPH + {0xED89, 0x59BA}, //7035 #CJK UNIFIED IDEOGRAPH + {0xED8A, 0x5B56}, //7036 #CJK UNIFIED IDEOGRAPH + {0xED8B, 0x5BC0}, //7037 #CJK UNIFIED IDEOGRAPH + {0xED8C, 0x752F}, //7038 #CJK UNIFIED IDEOGRAPH + {0xED8D, 0x5BD8}, //7039 #CJK UNIFIED IDEOGRAPH + {0xED8E, 0x5BEC}, //7040 #CJK UNIFIED IDEOGRAPH + {0xED8F, 0x5C1E}, //7041 #CJK UNIFIED IDEOGRAPH + {0xED90, 0x5CA6}, //7042 #CJK UNIFIED IDEOGRAPH + {0xED91, 0x5CBA}, //7043 #CJK UNIFIED IDEOGRAPH + {0xED92, 0x5CF5}, //7044 #CJK UNIFIED IDEOGRAPH + {0xED93, 0x5D27}, //7045 #CJK UNIFIED IDEOGRAPH + {0xED94, 0x5D53}, //7046 #CJK UNIFIED IDEOGRAPH + {0xED95, 0xFA11}, //7047 #CJK COMPATIBILITY IDEOGRAPH + {0xED96, 0x5D42}, //7048 #CJK UNIFIED IDEOGRAPH + {0xED97, 0x5D6D}, //7049 #CJK UNIFIED IDEOGRAPH + {0xED98, 0x5DB8}, //7050 #CJK UNIFIED IDEOGRAPH + {0xED99, 0x5DB9}, //7051 #CJK UNIFIED IDEOGRAPH + {0xED9A, 0x5DD0}, //7052 #CJK UNIFIED IDEOGRAPH + {0xED9B, 0x5F21}, //7053 #CJK UNIFIED IDEOGRAPH + {0xED9C, 0x5F34}, //7054 #CJK UNIFIED IDEOGRAPH + {0xED9D, 0x5F67}, //7055 #CJK UNIFIED IDEOGRAPH + {0xED9E, 0x5FB7}, //7056 #CJK UNIFIED IDEOGRAPH + {0xED9F, 0x5FDE}, //7057 #CJK UNIFIED IDEOGRAPH + {0xEDA0, 0x605D}, //7058 #CJK UNIFIED IDEOGRAPH + {0xEDA1, 0x6085}, //7059 #CJK UNIFIED IDEOGRAPH + {0xEDA2, 0x608A}, //7060 #CJK UNIFIED IDEOGRAPH + {0xEDA3, 0x60DE}, //7061 #CJK UNIFIED IDEOGRAPH + {0xEDA4, 0x60D5}, //7062 #CJK UNIFIED IDEOGRAPH + {0xEDA5, 0x6120}, //7063 #CJK UNIFIED IDEOGRAPH + {0xEDA6, 0x60F2}, //7064 #CJK UNIFIED IDEOGRAPH + {0xEDA7, 0x6111}, //7065 #CJK UNIFIED IDEOGRAPH + {0xEDA8, 0x6137}, //7066 #CJK UNIFIED IDEOGRAPH + {0xEDA9, 0x6130}, //7067 #CJK UNIFIED IDEOGRAPH + {0xEDAA, 0x6198}, //7068 #CJK UNIFIED IDEOGRAPH + {0xEDAB, 0x6213}, //7069 #CJK UNIFIED IDEOGRAPH + {0xEDAC, 0x62A6}, //7070 #CJK UNIFIED IDEOGRAPH + {0xEDAD, 0x63F5}, //7071 #CJK UNIFIED IDEOGRAPH + {0xEDAE, 0x6460}, //7072 #CJK UNIFIED IDEOGRAPH + {0xEDAF, 0x649D}, //7073 #CJK UNIFIED IDEOGRAPH + {0xEDB0, 0x64CE}, //7074 #CJK UNIFIED IDEOGRAPH + {0xEDB1, 0x654E}, //7075 #CJK UNIFIED IDEOGRAPH + {0xEDB2, 0x6600}, //7076 #CJK UNIFIED IDEOGRAPH + {0xEDB3, 0x6615}, //7077 #CJK UNIFIED IDEOGRAPH + {0xEDB4, 0x663B}, //7078 #CJK UNIFIED IDEOGRAPH + {0xEDB5, 0x6609}, //7079 #CJK UNIFIED IDEOGRAPH + {0xEDB6, 0x662E}, //7080 #CJK UNIFIED IDEOGRAPH + {0xEDB7, 0x661E}, //7081 #CJK UNIFIED IDEOGRAPH + {0xEDB8, 0x6624}, //7082 #CJK UNIFIED IDEOGRAPH + {0xEDB9, 0x6665}, //7083 #CJK UNIFIED IDEOGRAPH + {0xEDBA, 0x6657}, //7084 #CJK UNIFIED IDEOGRAPH + {0xEDBB, 0x6659}, //7085 #CJK UNIFIED IDEOGRAPH + {0xEDBC, 0xFA12}, //7086 #CJK COMPATIBILITY IDEOGRAPH + {0xEDBD, 0x6673}, //7087 #CJK UNIFIED IDEOGRAPH + {0xEDBE, 0x6699}, //7088 #CJK UNIFIED IDEOGRAPH + {0xEDBF, 0x66A0}, //7089 #CJK UNIFIED IDEOGRAPH + {0xEDC0, 0x66B2}, //7090 #CJK UNIFIED IDEOGRAPH + {0xEDC1, 0x66BF}, //7091 #CJK UNIFIED IDEOGRAPH + {0xEDC2, 0x66FA}, //7092 #CJK UNIFIED IDEOGRAPH + {0xEDC3, 0x670E}, //7093 #CJK UNIFIED IDEOGRAPH + {0xEDC4, 0xF929}, //7094 #CJK COMPATIBILITY IDEOGRAPH + {0xEDC5, 0x6766}, //7095 #CJK UNIFIED IDEOGRAPH + {0xEDC6, 0x67BB}, //7096 #CJK UNIFIED IDEOGRAPH + {0xEDC7, 0x6852}, //7097 #CJK UNIFIED IDEOGRAPH + {0xEDC8, 0x67C0}, //7098 #CJK UNIFIED IDEOGRAPH + {0xEDC9, 0x6801}, //7099 #CJK UNIFIED IDEOGRAPH + {0xEDCA, 0x6844}, //7100 #CJK UNIFIED IDEOGRAPH + {0xEDCB, 0x68CF}, //7101 #CJK UNIFIED IDEOGRAPH + {0xEDCC, 0xFA13}, //7102 #CJK COMPATIBILITY IDEOGRAPH + {0xEDCD, 0x6968}, //7103 #CJK UNIFIED IDEOGRAPH + {0xEDCE, 0xFA14}, //7104 #CJK COMPATIBILITY IDEOGRAPH + {0xEDCF, 0x6998}, //7105 #CJK UNIFIED IDEOGRAPH + {0xEDD0, 0x69E2}, //7106 #CJK UNIFIED IDEOGRAPH + {0xEDD1, 0x6A30}, //7107 #CJK UNIFIED IDEOGRAPH + {0xEDD2, 0x6A6B}, //7108 #CJK UNIFIED IDEOGRAPH + {0xEDD3, 0x6A46}, //7109 #CJK UNIFIED IDEOGRAPH + {0xEDD4, 0x6A73}, //7110 #CJK UNIFIED IDEOGRAPH + {0xEDD5, 0x6A7E}, //7111 #CJK UNIFIED IDEOGRAPH + {0xEDD6, 0x6AE2}, //7112 #CJK UNIFIED IDEOGRAPH + {0xEDD7, 0x6AE4}, //7113 #CJK UNIFIED IDEOGRAPH + {0xEDD8, 0x6BD6}, //7114 #CJK UNIFIED IDEOGRAPH + {0xEDD9, 0x6C3F}, //7115 #CJK UNIFIED IDEOGRAPH + {0xEDDA, 0x6C5C}, //7116 #CJK UNIFIED IDEOGRAPH + {0xEDDB, 0x6C86}, //7117 #CJK UNIFIED IDEOGRAPH + {0xEDDC, 0x6C6F}, //7118 #CJK UNIFIED IDEOGRAPH + {0xEDDD, 0x6CDA}, //7119 #CJK UNIFIED IDEOGRAPH + {0xEDDE, 0x6D04}, //7120 #CJK UNIFIED IDEOGRAPH + {0xEDDF, 0x6D87}, //7121 #CJK UNIFIED IDEOGRAPH + {0xEDE0, 0x6D6F}, //7122 #CJK UNIFIED IDEOGRAPH + {0xEDE1, 0x6D96}, //7123 #CJK UNIFIED IDEOGRAPH + {0xEDE2, 0x6DAC}, //7124 #CJK UNIFIED IDEOGRAPH + {0xEDE3, 0x6DCF}, //7125 #CJK UNIFIED IDEOGRAPH + {0xEDE4, 0x6DF8}, //7126 #CJK UNIFIED IDEOGRAPH + {0xEDE5, 0x6DF2}, //7127 #CJK UNIFIED IDEOGRAPH + {0xEDE6, 0x6DFC}, //7128 #CJK UNIFIED IDEOGRAPH + {0xEDE7, 0x6E39}, //7129 #CJK UNIFIED IDEOGRAPH + {0xEDE8, 0x6E5C}, //7130 #CJK UNIFIED IDEOGRAPH + {0xEDE9, 0x6E27}, //7131 #CJK UNIFIED IDEOGRAPH + {0xEDEA, 0x6E3C}, //7132 #CJK UNIFIED IDEOGRAPH + {0xEDEB, 0x6EBF}, //7133 #CJK UNIFIED IDEOGRAPH + {0xEDEC, 0x6F88}, //7134 #CJK UNIFIED IDEOGRAPH + {0xEDED, 0x6FB5}, //7135 #CJK UNIFIED IDEOGRAPH + {0xEDEE, 0x6FF5}, //7136 #CJK UNIFIED IDEOGRAPH + {0xEDEF, 0x7005}, //7137 #CJK UNIFIED IDEOGRAPH + {0xEDF0, 0x7007}, //7138 #CJK UNIFIED IDEOGRAPH + {0xEDF1, 0x7028}, //7139 #CJK UNIFIED IDEOGRAPH + {0xEDF2, 0x7085}, //7140 #CJK UNIFIED IDEOGRAPH + {0xEDF3, 0x70AB}, //7141 #CJK UNIFIED IDEOGRAPH + {0xEDF4, 0x710F}, //7142 #CJK UNIFIED IDEOGRAPH + {0xEDF5, 0x7104}, //7143 #CJK UNIFIED IDEOGRAPH + {0xEDF6, 0x715C}, //7144 #CJK UNIFIED IDEOGRAPH + {0xEDF7, 0x7146}, //7145 #CJK UNIFIED IDEOGRAPH + {0xEDF8, 0x7147}, //7146 #CJK UNIFIED IDEOGRAPH + {0xEDF9, 0xFA15}, //7147 #CJK COMPATIBILITY IDEOGRAPH + {0xEDFA, 0x71C1}, //7148 #CJK UNIFIED IDEOGRAPH + {0xEDFB, 0x71FE}, //7149 #CJK UNIFIED IDEOGRAPH + {0xEDFC, 0x72B1}, //7150 #CJK UNIFIED IDEOGRAPH + {0xEE40, 0x72BE}, //7151 #CJK UNIFIED IDEOGRAPH + {0xEE41, 0x7324}, //7152 #CJK UNIFIED IDEOGRAPH + {0xEE42, 0xFA16}, //7153 #CJK COMPATIBILITY IDEOGRAPH + {0xEE43, 0x7377}, //7154 #CJK UNIFIED IDEOGRAPH + {0xEE44, 0x73BD}, //7155 #CJK UNIFIED IDEOGRAPH + {0xEE45, 0x73C9}, //7156 #CJK UNIFIED IDEOGRAPH + {0xEE46, 0x73D6}, //7157 #CJK UNIFIED IDEOGRAPH + {0xEE47, 0x73E3}, //7158 #CJK UNIFIED IDEOGRAPH + {0xEE48, 0x73D2}, //7159 #CJK UNIFIED IDEOGRAPH + {0xEE49, 0x7407}, //7160 #CJK UNIFIED IDEOGRAPH + {0xEE4A, 0x73F5}, //7161 #CJK UNIFIED IDEOGRAPH + {0xEE4B, 0x7426}, //7162 #CJK UNIFIED IDEOGRAPH + {0xEE4C, 0x742A}, //7163 #CJK UNIFIED IDEOGRAPH + {0xEE4D, 0x7429}, //7164 #CJK UNIFIED IDEOGRAPH + {0xEE4E, 0x742E}, //7165 #CJK UNIFIED IDEOGRAPH + {0xEE4F, 0x7462}, //7166 #CJK UNIFIED IDEOGRAPH + {0xEE50, 0x7489}, //7167 #CJK UNIFIED IDEOGRAPH + {0xEE51, 0x749F}, //7168 #CJK UNIFIED IDEOGRAPH + {0xEE52, 0x7501}, //7169 #CJK UNIFIED IDEOGRAPH + {0xEE53, 0x756F}, //7170 #CJK UNIFIED IDEOGRAPH + {0xEE54, 0x7682}, //7171 #CJK UNIFIED IDEOGRAPH + {0xEE55, 0x769C}, //7172 #CJK UNIFIED IDEOGRAPH + {0xEE56, 0x769E}, //7173 #CJK UNIFIED IDEOGRAPH + {0xEE57, 0x769B}, //7174 #CJK UNIFIED IDEOGRAPH + {0xEE58, 0x76A6}, //7175 #CJK UNIFIED IDEOGRAPH + {0xEE59, 0xFA17}, //7176 #CJK COMPATIBILITY IDEOGRAPH + {0xEE5A, 0x7746}, //7177 #CJK UNIFIED IDEOGRAPH + {0xEE5B, 0x52AF}, //7178 #CJK UNIFIED IDEOGRAPH + {0xEE5C, 0x7821}, //7179 #CJK UNIFIED IDEOGRAPH + {0xEE5D, 0x784E}, //7180 #CJK UNIFIED IDEOGRAPH + {0xEE5E, 0x7864}, //7181 #CJK UNIFIED IDEOGRAPH + {0xEE5F, 0x787A}, //7182 #CJK UNIFIED IDEOGRAPH + {0xEE60, 0x7930}, //7183 #CJK UNIFIED IDEOGRAPH + {0xEE61, 0xFA18}, //7184 #CJK COMPATIBILITY IDEOGRAPH + {0xEE62, 0xFA19}, //7185 #CJK COMPATIBILITY IDEOGRAPH + {0xEE63, 0xFA1A}, //7186 #CJK COMPATIBILITY IDEOGRAPH + {0xEE64, 0x7994}, //7187 #CJK UNIFIED IDEOGRAPH + {0xEE65, 0xFA1B}, //7188 #CJK COMPATIBILITY IDEOGRAPH + {0xEE66, 0x799B}, //7189 #CJK UNIFIED IDEOGRAPH + {0xEE67, 0x7AD1}, //7190 #CJK UNIFIED IDEOGRAPH + {0xEE68, 0x7AE7}, //7191 #CJK UNIFIED IDEOGRAPH + {0xEE69, 0xFA1C}, //7192 #CJK COMPATIBILITY IDEOGRAPH + {0xEE6A, 0x7AEB}, //7193 #CJK UNIFIED IDEOGRAPH + {0xEE6B, 0x7B9E}, //7194 #CJK UNIFIED IDEOGRAPH + {0xEE6C, 0xFA1D}, //7195 #CJK COMPATIBILITY IDEOGRAPH + {0xEE6D, 0x7D48}, //7196 #CJK UNIFIED IDEOGRAPH + {0xEE6E, 0x7D5C}, //7197 #CJK UNIFIED IDEOGRAPH + {0xEE6F, 0x7DB7}, //7198 #CJK UNIFIED IDEOGRAPH + {0xEE70, 0x7DA0}, //7199 #CJK UNIFIED IDEOGRAPH + {0xEE71, 0x7DD6}, //7200 #CJK UNIFIED IDEOGRAPH + {0xEE72, 0x7E52}, //7201 #CJK UNIFIED IDEOGRAPH + {0xEE73, 0x7F47}, //7202 #CJK UNIFIED IDEOGRAPH + {0xEE74, 0x7FA1}, //7203 #CJK UNIFIED IDEOGRAPH + {0xEE75, 0xFA1E}, //7204 #CJK COMPATIBILITY IDEOGRAPH + {0xEE76, 0x8301}, //7205 #CJK UNIFIED IDEOGRAPH + {0xEE77, 0x8362}, //7206 #CJK UNIFIED IDEOGRAPH + {0xEE78, 0x837F}, //7207 #CJK UNIFIED IDEOGRAPH + {0xEE79, 0x83C7}, //7208 #CJK UNIFIED IDEOGRAPH + {0xEE7A, 0x83F6}, //7209 #CJK UNIFIED IDEOGRAPH + {0xEE7B, 0x8448}, //7210 #CJK UNIFIED IDEOGRAPH + {0xEE7C, 0x84B4}, //7211 #CJK UNIFIED IDEOGRAPH + {0xEE7D, 0x8553}, //7212 #CJK UNIFIED IDEOGRAPH + {0xEE7E, 0x8559}, //7213 #CJK UNIFIED IDEOGRAPH + {0xEE80, 0x856B}, //7214 #CJK UNIFIED IDEOGRAPH + {0xEE81, 0xFA1F}, //7215 #CJK COMPATIBILITY IDEOGRAPH + {0xEE82, 0x85B0}, //7216 #CJK UNIFIED IDEOGRAPH + {0xEE83, 0xFA20}, //7217 #CJK COMPATIBILITY IDEOGRAPH + {0xEE84, 0xFA21}, //7218 #CJK COMPATIBILITY IDEOGRAPH + {0xEE85, 0x8807}, //7219 #CJK UNIFIED IDEOGRAPH + {0xEE86, 0x88F5}, //7220 #CJK UNIFIED IDEOGRAPH + {0xEE87, 0x8A12}, //7221 #CJK UNIFIED IDEOGRAPH + {0xEE88, 0x8A37}, //7222 #CJK UNIFIED IDEOGRAPH + {0xEE89, 0x8A79}, //7223 #CJK UNIFIED IDEOGRAPH + {0xEE8A, 0x8AA7}, //7224 #CJK UNIFIED IDEOGRAPH + {0xEE8B, 0x8ABE}, //7225 #CJK UNIFIED IDEOGRAPH + {0xEE8C, 0x8ADF}, //7226 #CJK UNIFIED IDEOGRAPH + {0xEE8D, 0xFA22}, //7227 #CJK COMPATIBILITY IDEOGRAPH + {0xEE8E, 0x8AF6}, //7228 #CJK UNIFIED IDEOGRAPH + {0xEE8F, 0x8B53}, //7229 #CJK UNIFIED IDEOGRAPH + {0xEE90, 0x8B7F}, //7230 #CJK UNIFIED IDEOGRAPH + {0xEE91, 0x8CF0}, //7231 #CJK UNIFIED IDEOGRAPH + {0xEE92, 0x8CF4}, //7232 #CJK UNIFIED IDEOGRAPH + {0xEE93, 0x8D12}, //7233 #CJK UNIFIED IDEOGRAPH + {0xEE94, 0x8D76}, //7234 #CJK UNIFIED IDEOGRAPH + {0xEE95, 0xFA23}, //7235 #CJK COMPATIBILITY IDEOGRAPH + {0xEE96, 0x8ECF}, //7236 #CJK UNIFIED IDEOGRAPH + {0xEE97, 0xFA24}, //7237 #CJK COMPATIBILITY IDEOGRAPH + {0xEE98, 0xFA25}, //7238 #CJK COMPATIBILITY IDEOGRAPH + {0xEE99, 0x9067}, //7239 #CJK UNIFIED IDEOGRAPH + {0xEE9A, 0x90DE}, //7240 #CJK UNIFIED IDEOGRAPH + {0xEE9B, 0xFA26}, //7241 #CJK COMPATIBILITY IDEOGRAPH + {0xEE9C, 0x9115}, //7242 #CJK UNIFIED IDEOGRAPH + {0xEE9D, 0x9127}, //7243 #CJK UNIFIED IDEOGRAPH + {0xEE9E, 0x91DA}, //7244 #CJK UNIFIED IDEOGRAPH + {0xEE9F, 0x91D7}, //7245 #CJK UNIFIED IDEOGRAPH + {0xEEA0, 0x91DE}, //7246 #CJK UNIFIED IDEOGRAPH + {0xEEA1, 0x91ED}, //7247 #CJK UNIFIED IDEOGRAPH + {0xEEA2, 0x91EE}, //7248 #CJK UNIFIED IDEOGRAPH + {0xEEA3, 0x91E4}, //7249 #CJK UNIFIED IDEOGRAPH + {0xEEA4, 0x91E5}, //7250 #CJK UNIFIED IDEOGRAPH + {0xEEA5, 0x9206}, //7251 #CJK UNIFIED IDEOGRAPH + {0xEEA6, 0x9210}, //7252 #CJK UNIFIED IDEOGRAPH + {0xEEA7, 0x920A}, //7253 #CJK UNIFIED IDEOGRAPH + {0xEEA8, 0x923A}, //7254 #CJK UNIFIED IDEOGRAPH + {0xEEA9, 0x9240}, //7255 #CJK UNIFIED IDEOGRAPH + {0xEEAA, 0x923C}, //7256 #CJK UNIFIED IDEOGRAPH + {0xEEAB, 0x924E}, //7257 #CJK UNIFIED IDEOGRAPH + {0xEEAC, 0x9259}, //7258 #CJK UNIFIED IDEOGRAPH + {0xEEAD, 0x9251}, //7259 #CJK UNIFIED IDEOGRAPH + {0xEEAE, 0x9239}, //7260 #CJK UNIFIED IDEOGRAPH + {0xEEAF, 0x9267}, //7261 #CJK UNIFIED IDEOGRAPH + {0xEEB0, 0x92A7}, //7262 #CJK UNIFIED IDEOGRAPH + {0xEEB1, 0x9277}, //7263 #CJK UNIFIED IDEOGRAPH + {0xEEB2, 0x9278}, //7264 #CJK UNIFIED IDEOGRAPH + {0xEEB3, 0x92E7}, //7265 #CJK UNIFIED IDEOGRAPH + {0xEEB4, 0x92D7}, //7266 #CJK UNIFIED IDEOGRAPH + {0xEEB5, 0x92D9}, //7267 #CJK UNIFIED IDEOGRAPH + {0xEEB6, 0x92D0}, //7268 #CJK UNIFIED IDEOGRAPH + {0xEEB7, 0xFA27}, //7269 #CJK COMPATIBILITY IDEOGRAPH + {0xEEB8, 0x92D5}, //7270 #CJK UNIFIED IDEOGRAPH + {0xEEB9, 0x92E0}, //7271 #CJK UNIFIED IDEOGRAPH + {0xEEBA, 0x92D3}, //7272 #CJK UNIFIED IDEOGRAPH + {0xEEBB, 0x9325}, //7273 #CJK UNIFIED IDEOGRAPH + {0xEEBC, 0x9321}, //7274 #CJK UNIFIED IDEOGRAPH + {0xEEBD, 0x92FB}, //7275 #CJK UNIFIED IDEOGRAPH + {0xEEBE, 0xFA28}, //7276 #CJK COMPATIBILITY IDEOGRAPH + {0xEEBF, 0x931E}, //7277 #CJK UNIFIED IDEOGRAPH + {0xEEC0, 0x92FF}, //7278 #CJK UNIFIED IDEOGRAPH + {0xEEC1, 0x931D}, //7279 #CJK UNIFIED IDEOGRAPH + {0xEEC2, 0x9302}, //7280 #CJK UNIFIED IDEOGRAPH + {0xEEC3, 0x9370}, //7281 #CJK UNIFIED IDEOGRAPH + {0xEEC4, 0x9357}, //7282 #CJK UNIFIED IDEOGRAPH + {0xEEC5, 0x93A4}, //7283 #CJK UNIFIED IDEOGRAPH + {0xEEC6, 0x93C6}, //7284 #CJK UNIFIED IDEOGRAPH + {0xEEC7, 0x93DE}, //7285 #CJK UNIFIED IDEOGRAPH + {0xEEC8, 0x93F8}, //7286 #CJK UNIFIED IDEOGRAPH + {0xEEC9, 0x9431}, //7287 #CJK UNIFIED IDEOGRAPH + {0xEECA, 0x9445}, //7288 #CJK UNIFIED IDEOGRAPH + {0xEECB, 0x9448}, //7289 #CJK UNIFIED IDEOGRAPH + {0xEECC, 0x9592}, //7290 #CJK UNIFIED IDEOGRAPH + {0xEECD, 0xF9DC}, //7291 #CJK COMPATIBILITY IDEOGRAPH + {0xEECE, 0xFA29}, //7292 #CJK COMPATIBILITY IDEOGRAPH + {0xEECF, 0x969D}, //7293 #CJK UNIFIED IDEOGRAPH + {0xEED0, 0x96AF}, //7294 #CJK UNIFIED IDEOGRAPH + {0xEED1, 0x9733}, //7295 #CJK UNIFIED IDEOGRAPH + {0xEED2, 0x973B}, //7296 #CJK UNIFIED IDEOGRAPH + {0xEED3, 0x9743}, //7297 #CJK UNIFIED IDEOGRAPH + {0xEED4, 0x974D}, //7298 #CJK UNIFIED IDEOGRAPH + {0xEED5, 0x974F}, //7299 #CJK UNIFIED IDEOGRAPH + {0xEED6, 0x9751}, //7300 #CJK UNIFIED IDEOGRAPH + {0xEED7, 0x9755}, //7301 #CJK UNIFIED IDEOGRAPH + {0xEED8, 0x9857}, //7302 #CJK UNIFIED IDEOGRAPH + {0xEED9, 0x9865}, //7303 #CJK UNIFIED IDEOGRAPH + {0xEEDA, 0xFA2A}, //7304 #CJK COMPATIBILITY IDEOGRAPH + {0xEEDB, 0xFA2B}, //7305 #CJK COMPATIBILITY IDEOGRAPH + {0xEEDC, 0x9927}, //7306 #CJK UNIFIED IDEOGRAPH + {0xEEDD, 0xFA2C}, //7307 #CJK COMPATIBILITY IDEOGRAPH + {0xEEDE, 0x999E}, //7308 #CJK UNIFIED IDEOGRAPH + {0xEEDF, 0x9A4E}, //7309 #CJK UNIFIED IDEOGRAPH + {0xEEE0, 0x9AD9}, //7310 #CJK UNIFIED IDEOGRAPH + {0xEEE1, 0x9ADC}, //7311 #CJK UNIFIED IDEOGRAPH + {0xEEE2, 0x9B75}, //7312 #CJK UNIFIED IDEOGRAPH + {0xEEE3, 0x9B72}, //7313 #CJK UNIFIED IDEOGRAPH + {0xEEE4, 0x9B8F}, //7314 #CJK UNIFIED IDEOGRAPH + {0xEEE5, 0x9BB1}, //7315 #CJK UNIFIED IDEOGRAPH + {0xEEE6, 0x9BBB}, //7316 #CJK UNIFIED IDEOGRAPH + {0xEEE7, 0x9C00}, //7317 #CJK UNIFIED IDEOGRAPH + {0xEEE8, 0x9D70}, //7318 #CJK UNIFIED IDEOGRAPH + {0xEEE9, 0x9D6B}, //7319 #CJK UNIFIED IDEOGRAPH + {0xEEEA, 0xFA2D}, //7320 #CJK COMPATIBILITY IDEOGRAPH + {0xEEEB, 0x9E19}, //7321 #CJK UNIFIED IDEOGRAPH + {0xEEEC, 0x9ED1}, //7322 #CJK UNIFIED IDEOGRAPH + {0xEEEF, 0x2170}, //7323 #SMALL ROMAN NUMERAL ONE + {0xEEF0, 0x2171}, //7324 #SMALL ROMAN NUMERAL TWO + {0xEEF1, 0x2172}, //7325 #SMALL ROMAN NUMERAL THREE + {0xEEF2, 0x2173}, //7326 #SMALL ROMAN NUMERAL FOUR + {0xEEF3, 0x2174}, //7327 #SMALL ROMAN NUMERAL FIVE + {0xEEF4, 0x2175}, //7328 #SMALL ROMAN NUMERAL SIX + {0xEEF5, 0x2176}, //7329 #SMALL ROMAN NUMERAL SEVEN + {0xEEF6, 0x2177}, //7330 #SMALL ROMAN NUMERAL EIGHT + {0xEEF7, 0x2178}, //7331 #SMALL ROMAN NUMERAL NINE + {0xEEF8, 0x2179}, //7332 #SMALL ROMAN NUMERAL TEN + {0xEEF9, 0xFFE2}, //7333 #FULLWIDTH NOT SIGN + {0xEEFA, 0xFFE4}, //7334 #FULLWIDTH BROKEN BAR + {0xEEFB, 0xFF07}, //7335 #FULLWIDTH APOSTROPHE + {0xEEFC, 0xFF02}, //7336 #FULLWIDTH QUOTATION MARK + {0xFA40, 0x2170}, //7337 #SMALL ROMAN NUMERAL ONE + {0xFA41, 0x2171}, //7338 #SMALL ROMAN NUMERAL TWO + {0xFA42, 0x2172}, //7339 #SMALL ROMAN NUMERAL THREE + {0xFA43, 0x2173}, //7340 #SMALL ROMAN NUMERAL FOUR + {0xFA44, 0x2174}, //7341 #SMALL ROMAN NUMERAL FIVE + {0xFA45, 0x2175}, //7342 #SMALL ROMAN NUMERAL SIX + {0xFA46, 0x2176}, //7343 #SMALL ROMAN NUMERAL SEVEN + {0xFA47, 0x2177}, //7344 #SMALL ROMAN NUMERAL EIGHT + {0xFA48, 0x2178}, //7345 #SMALL ROMAN NUMERAL NINE + {0xFA49, 0x2179}, //7346 #SMALL ROMAN NUMERAL TEN + {0xFA4A, 0x2160}, //7347 #ROMAN NUMERAL ONE + {0xFA4B, 0x2161}, //7348 #ROMAN NUMERAL TWO + {0xFA4C, 0x2162}, //7349 #ROMAN NUMERAL THREE + {0xFA4D, 0x2163}, //7350 #ROMAN NUMERAL FOUR + {0xFA4E, 0x2164}, //7351 #ROMAN NUMERAL FIVE + {0xFA4F, 0x2165}, //7352 #ROMAN NUMERAL SIX + {0xFA50, 0x2166}, //7353 #ROMAN NUMERAL SEVEN + {0xFA51, 0x2167}, //7354 #ROMAN NUMERAL EIGHT + {0xFA52, 0x2168}, //7355 #ROMAN NUMERAL NINE + {0xFA53, 0x2169}, //7356 #ROMAN NUMERAL TEN + {0xFA54, 0xFFE2}, //7357 #FULLWIDTH NOT SIGN + {0xFA55, 0xFFE4}, //7358 #FULLWIDTH BROKEN BAR + {0xFA56, 0xFF07}, //7359 #FULLWIDTH APOSTROPHE + {0xFA57, 0xFF02}, //7360 #FULLWIDTH QUOTATION MARK + {0xFA58, 0x3231}, //7361 #PARENTHESIZED IDEOGRAPH STOCK + {0xFA59, 0x2116}, //7362 #NUMERO SIGN + {0xFA5A, 0x2121}, //7363 #TELEPHONE SIGN + {0xFA5B, 0x2235}, //7364 #BECAUSE + {0xFA5C, 0x7E8A}, //7365 #CJK UNIFIED IDEOGRAPH + {0xFA5D, 0x891C}, //7366 #CJK UNIFIED IDEOGRAPH + {0xFA5E, 0x9348}, //7367 #CJK UNIFIED IDEOGRAPH + {0xFA5F, 0x9288}, //7368 #CJK UNIFIED IDEOGRAPH + {0xFA60, 0x84DC}, //7369 #CJK UNIFIED IDEOGRAPH + {0xFA61, 0x4FC9}, //7370 #CJK UNIFIED IDEOGRAPH + {0xFA62, 0x70BB}, //7371 #CJK UNIFIED IDEOGRAPH + {0xFA63, 0x6631}, //7372 #CJK UNIFIED IDEOGRAPH + {0xFA64, 0x68C8}, //7373 #CJK UNIFIED IDEOGRAPH + {0xFA65, 0x92F9}, //7374 #CJK UNIFIED IDEOGRAPH + {0xFA66, 0x66FB}, //7375 #CJK UNIFIED IDEOGRAPH + {0xFA67, 0x5F45}, //7376 #CJK UNIFIED IDEOGRAPH + {0xFA68, 0x4E28}, //7377 #CJK UNIFIED IDEOGRAPH + {0xFA69, 0x4EE1}, //7378 #CJK UNIFIED IDEOGRAPH + {0xFA6A, 0x4EFC}, //7379 #CJK UNIFIED IDEOGRAPH + {0xFA6B, 0x4F00}, //7380 #CJK UNIFIED IDEOGRAPH + {0xFA6C, 0x4F03}, //7381 #CJK UNIFIED IDEOGRAPH + {0xFA6D, 0x4F39}, //7382 #CJK UNIFIED IDEOGRAPH + {0xFA6E, 0x4F56}, //7383 #CJK UNIFIED IDEOGRAPH + {0xFA6F, 0x4F92}, //7384 #CJK UNIFIED IDEOGRAPH + {0xFA70, 0x4F8A}, //7385 #CJK UNIFIED IDEOGRAPH + {0xFA71, 0x4F9A}, //7386 #CJK UNIFIED IDEOGRAPH + {0xFA72, 0x4F94}, //7387 #CJK UNIFIED IDEOGRAPH + {0xFA73, 0x4FCD}, //7388 #CJK UNIFIED IDEOGRAPH + {0xFA74, 0x5040}, //7389 #CJK UNIFIED IDEOGRAPH + {0xFA75, 0x5022}, //7390 #CJK UNIFIED IDEOGRAPH + {0xFA76, 0x4FFF}, //7391 #CJK UNIFIED IDEOGRAPH + {0xFA77, 0x501E}, //7392 #CJK UNIFIED IDEOGRAPH + {0xFA78, 0x5046}, //7393 #CJK UNIFIED IDEOGRAPH + {0xFA79, 0x5070}, //7394 #CJK UNIFIED IDEOGRAPH + {0xFA7A, 0x5042}, //7395 #CJK UNIFIED IDEOGRAPH + {0xFA7B, 0x5094}, //7396 #CJK UNIFIED IDEOGRAPH + {0xFA7C, 0x50F4}, //7397 #CJK UNIFIED IDEOGRAPH + {0xFA7D, 0x50D8}, //7398 #CJK UNIFIED IDEOGRAPH + {0xFA7E, 0x514A}, //7399 #CJK UNIFIED IDEOGRAPH + {0xFA80, 0x5164}, //7400 #CJK UNIFIED IDEOGRAPH + {0xFA81, 0x519D}, //7401 #CJK UNIFIED IDEOGRAPH + {0xFA82, 0x51BE}, //7402 #CJK UNIFIED IDEOGRAPH + {0xFA83, 0x51EC}, //7403 #CJK UNIFIED IDEOGRAPH + {0xFA84, 0x5215}, //7404 #CJK UNIFIED IDEOGRAPH + {0xFA85, 0x529C}, //7405 #CJK UNIFIED IDEOGRAPH + {0xFA86, 0x52A6}, //7406 #CJK UNIFIED IDEOGRAPH + {0xFA87, 0x52C0}, //7407 #CJK UNIFIED IDEOGRAPH + {0xFA88, 0x52DB}, //7408 #CJK UNIFIED IDEOGRAPH + {0xFA89, 0x5300}, //7409 #CJK UNIFIED IDEOGRAPH + {0xFA8A, 0x5307}, //7410 #CJK UNIFIED IDEOGRAPH + {0xFA8B, 0x5324}, //7411 #CJK UNIFIED IDEOGRAPH + {0xFA8C, 0x5372}, //7412 #CJK UNIFIED IDEOGRAPH + {0xFA8D, 0x5393}, //7413 #CJK UNIFIED IDEOGRAPH + {0xFA8E, 0x53B2}, //7414 #CJK UNIFIED IDEOGRAPH + {0xFA8F, 0x53DD}, //7415 #CJK UNIFIED IDEOGRAPH + {0xFA90, 0xFA0E}, //7416 #CJK COMPATIBILITY IDEOGRAPH + {0xFA91, 0x549C}, //7417 #CJK UNIFIED IDEOGRAPH + {0xFA92, 0x548A}, //7418 #CJK UNIFIED IDEOGRAPH + {0xFA93, 0x54A9}, //7419 #CJK UNIFIED IDEOGRAPH + {0xFA94, 0x54FF}, //7420 #CJK UNIFIED IDEOGRAPH + {0xFA95, 0x5586}, //7421 #CJK UNIFIED IDEOGRAPH + {0xFA96, 0x5759}, //7422 #CJK UNIFIED IDEOGRAPH + {0xFA97, 0x5765}, //7423 #CJK UNIFIED IDEOGRAPH + {0xFA98, 0x57AC}, //7424 #CJK UNIFIED IDEOGRAPH + {0xFA99, 0x57C8}, //7425 #CJK UNIFIED IDEOGRAPH + {0xFA9A, 0x57C7}, //7426 #CJK UNIFIED IDEOGRAPH + {0xFA9B, 0xFA0F}, //7427 #CJK COMPATIBILITY IDEOGRAPH + {0xFA9C, 0xFA10}, //7428 #CJK COMPATIBILITY IDEOGRAPH + {0xFA9D, 0x589E}, //7429 #CJK UNIFIED IDEOGRAPH + {0xFA9E, 0x58B2}, //7430 #CJK UNIFIED IDEOGRAPH + {0xFA9F, 0x590B}, //7431 #CJK UNIFIED IDEOGRAPH + {0xFAA0, 0x5953}, //7432 #CJK UNIFIED IDEOGRAPH + {0xFAA1, 0x595B}, //7433 #CJK UNIFIED IDEOGRAPH + {0xFAA2, 0x595D}, //7434 #CJK UNIFIED IDEOGRAPH + {0xFAA3, 0x5963}, //7435 #CJK UNIFIED IDEOGRAPH + {0xFAA4, 0x59A4}, //7436 #CJK UNIFIED IDEOGRAPH + {0xFAA5, 0x59BA}, //7437 #CJK UNIFIED IDEOGRAPH + {0xFAA6, 0x5B56}, //7438 #CJK UNIFIED IDEOGRAPH + {0xFAA7, 0x5BC0}, //7439 #CJK UNIFIED IDEOGRAPH + {0xFAA8, 0x752F}, //7440 #CJK UNIFIED IDEOGRAPH + {0xFAA9, 0x5BD8}, //7441 #CJK UNIFIED IDEOGRAPH + {0xFAAA, 0x5BEC}, //7442 #CJK UNIFIED IDEOGRAPH + {0xFAAB, 0x5C1E}, //7443 #CJK UNIFIED IDEOGRAPH + {0xFAAC, 0x5CA6}, //7444 #CJK UNIFIED IDEOGRAPH + {0xFAAD, 0x5CBA}, //7445 #CJK UNIFIED IDEOGRAPH + {0xFAAE, 0x5CF5}, //7446 #CJK UNIFIED IDEOGRAPH + {0xFAAF, 0x5D27}, //7447 #CJK UNIFIED IDEOGRAPH + {0xFAB0, 0x5D53}, //7448 #CJK UNIFIED IDEOGRAPH + {0xFAB1, 0xFA11}, //7449 #CJK COMPATIBILITY IDEOGRAPH + {0xFAB2, 0x5D42}, //7450 #CJK UNIFIED IDEOGRAPH + {0xFAB3, 0x5D6D}, //7451 #CJK UNIFIED IDEOGRAPH + {0xFAB4, 0x5DB8}, //7452 #CJK UNIFIED IDEOGRAPH + {0xFAB5, 0x5DB9}, //7453 #CJK UNIFIED IDEOGRAPH + {0xFAB6, 0x5DD0}, //7454 #CJK UNIFIED IDEOGRAPH + {0xFAB7, 0x5F21}, //7455 #CJK UNIFIED IDEOGRAPH + {0xFAB8, 0x5F34}, //7456 #CJK UNIFIED IDEOGRAPH + {0xFAB9, 0x5F67}, //7457 #CJK UNIFIED IDEOGRAPH + {0xFABA, 0x5FB7}, //7458 #CJK UNIFIED IDEOGRAPH + {0xFABB, 0x5FDE}, //7459 #CJK UNIFIED IDEOGRAPH + {0xFABC, 0x605D}, //7460 #CJK UNIFIED IDEOGRAPH + {0xFABD, 0x6085}, //7461 #CJK UNIFIED IDEOGRAPH + {0xFABE, 0x608A}, //7462 #CJK UNIFIED IDEOGRAPH + {0xFABF, 0x60DE}, //7463 #CJK UNIFIED IDEOGRAPH + {0xFAC0, 0x60D5}, //7464 #CJK UNIFIED IDEOGRAPH + {0xFAC1, 0x6120}, //7465 #CJK UNIFIED IDEOGRAPH + {0xFAC2, 0x60F2}, //7466 #CJK UNIFIED IDEOGRAPH + {0xFAC3, 0x6111}, //7467 #CJK UNIFIED IDEOGRAPH + {0xFAC4, 0x6137}, //7468 #CJK UNIFIED IDEOGRAPH + {0xFAC5, 0x6130}, //7469 #CJK UNIFIED IDEOGRAPH + {0xFAC6, 0x6198}, //7470 #CJK UNIFIED IDEOGRAPH + {0xFAC7, 0x6213}, //7471 #CJK UNIFIED IDEOGRAPH + {0xFAC8, 0x62A6}, //7472 #CJK UNIFIED IDEOGRAPH + {0xFAC9, 0x63F5}, //7473 #CJK UNIFIED IDEOGRAPH + {0xFACA, 0x6460}, //7474 #CJK UNIFIED IDEOGRAPH + {0xFACB, 0x649D}, //7475 #CJK UNIFIED IDEOGRAPH + {0xFACC, 0x64CE}, //7476 #CJK UNIFIED IDEOGRAPH + {0xFACD, 0x654E}, //7477 #CJK UNIFIED IDEOGRAPH + {0xFACE, 0x6600}, //7478 #CJK UNIFIED IDEOGRAPH + {0xFACF, 0x6615}, //7479 #CJK UNIFIED IDEOGRAPH + {0xFAD0, 0x663B}, //7480 #CJK UNIFIED IDEOGRAPH + {0xFAD1, 0x6609}, //7481 #CJK UNIFIED IDEOGRAPH + {0xFAD2, 0x662E}, //7482 #CJK UNIFIED IDEOGRAPH + {0xFAD3, 0x661E}, //7483 #CJK UNIFIED IDEOGRAPH + {0xFAD4, 0x6624}, //7484 #CJK UNIFIED IDEOGRAPH + {0xFAD5, 0x6665}, //7485 #CJK UNIFIED IDEOGRAPH + {0xFAD6, 0x6657}, //7486 #CJK UNIFIED IDEOGRAPH + {0xFAD7, 0x6659}, //7487 #CJK UNIFIED IDEOGRAPH + {0xFAD8, 0xFA12}, //7488 #CJK COMPATIBILITY IDEOGRAPH + {0xFAD9, 0x6673}, //7489 #CJK UNIFIED IDEOGRAPH + {0xFADA, 0x6699}, //7490 #CJK UNIFIED IDEOGRAPH + {0xFADB, 0x66A0}, //7491 #CJK UNIFIED IDEOGRAPH + {0xFADC, 0x66B2}, //7492 #CJK UNIFIED IDEOGRAPH + {0xFADD, 0x66BF}, //7493 #CJK UNIFIED IDEOGRAPH + {0xFADE, 0x66FA}, //7494 #CJK UNIFIED IDEOGRAPH + {0xFADF, 0x670E}, //7495 #CJK UNIFIED IDEOGRAPH + {0xFAE0, 0xF929}, //7496 #CJK COMPATIBILITY IDEOGRAPH + {0xFAE1, 0x6766}, //7497 #CJK UNIFIED IDEOGRAPH + {0xFAE2, 0x67BB}, //7498 #CJK UNIFIED IDEOGRAPH + {0xFAE3, 0x6852}, //7499 #CJK UNIFIED IDEOGRAPH + {0xFAE4, 0x67C0}, //7500 #CJK UNIFIED IDEOGRAPH + {0xFAE5, 0x6801}, //7501 #CJK UNIFIED IDEOGRAPH + {0xFAE6, 0x6844}, //7502 #CJK UNIFIED IDEOGRAPH + {0xFAE7, 0x68CF}, //7503 #CJK UNIFIED IDEOGRAPH + {0xFAE8, 0xFA13}, //7504 #CJK COMPATIBILITY IDEOGRAPH + {0xFAE9, 0x6968}, //7505 #CJK UNIFIED IDEOGRAPH + {0xFAEA, 0xFA14}, //7506 #CJK COMPATIBILITY IDEOGRAPH + {0xFAEB, 0x6998}, //7507 #CJK UNIFIED IDEOGRAPH + {0xFAEC, 0x69E2}, //7508 #CJK UNIFIED IDEOGRAPH + {0xFAED, 0x6A30}, //7509 #CJK UNIFIED IDEOGRAPH + {0xFAEE, 0x6A6B}, //7510 #CJK UNIFIED IDEOGRAPH + {0xFAEF, 0x6A46}, //7511 #CJK UNIFIED IDEOGRAPH + {0xFAF0, 0x6A73}, //7512 #CJK UNIFIED IDEOGRAPH + {0xFAF1, 0x6A7E}, //7513 #CJK UNIFIED IDEOGRAPH + {0xFAF2, 0x6AE2}, //7514 #CJK UNIFIED IDEOGRAPH + {0xFAF3, 0x6AE4}, //7515 #CJK UNIFIED IDEOGRAPH + {0xFAF4, 0x6BD6}, //7516 #CJK UNIFIED IDEOGRAPH + {0xFAF5, 0x6C3F}, //7517 #CJK UNIFIED IDEOGRAPH + {0xFAF6, 0x6C5C}, //7518 #CJK UNIFIED IDEOGRAPH + {0xFAF7, 0x6C86}, //7519 #CJK UNIFIED IDEOGRAPH + {0xFAF8, 0x6C6F}, //7520 #CJK UNIFIED IDEOGRAPH + {0xFAF9, 0x6CDA}, //7521 #CJK UNIFIED IDEOGRAPH + {0xFAFA, 0x6D04}, //7522 #CJK UNIFIED IDEOGRAPH + {0xFAFB, 0x6D87}, //7523 #CJK UNIFIED IDEOGRAPH + {0xFAFC, 0x6D6F}, //7524 #CJK UNIFIED IDEOGRAPH + {0xFB40, 0x6D96}, //7525 #CJK UNIFIED IDEOGRAPH + {0xFB41, 0x6DAC}, //7526 #CJK UNIFIED IDEOGRAPH + {0xFB42, 0x6DCF}, //7527 #CJK UNIFIED IDEOGRAPH + {0xFB43, 0x6DF8}, //7528 #CJK UNIFIED IDEOGRAPH + {0xFB44, 0x6DF2}, //7529 #CJK UNIFIED IDEOGRAPH + {0xFB45, 0x6DFC}, //7530 #CJK UNIFIED IDEOGRAPH + {0xFB46, 0x6E39}, //7531 #CJK UNIFIED IDEOGRAPH + {0xFB47, 0x6E5C}, //7532 #CJK UNIFIED IDEOGRAPH + {0xFB48, 0x6E27}, //7533 #CJK UNIFIED IDEOGRAPH + {0xFB49, 0x6E3C}, //7534 #CJK UNIFIED IDEOGRAPH + {0xFB4A, 0x6EBF}, //7535 #CJK UNIFIED IDEOGRAPH + {0xFB4B, 0x6F88}, //7536 #CJK UNIFIED IDEOGRAPH + {0xFB4C, 0x6FB5}, //7537 #CJK UNIFIED IDEOGRAPH + {0xFB4D, 0x6FF5}, //7538 #CJK UNIFIED IDEOGRAPH + {0xFB4E, 0x7005}, //7539 #CJK UNIFIED IDEOGRAPH + {0xFB4F, 0x7007}, //7540 #CJK UNIFIED IDEOGRAPH + {0xFB50, 0x7028}, //7541 #CJK UNIFIED IDEOGRAPH + {0xFB51, 0x7085}, //7542 #CJK UNIFIED IDEOGRAPH + {0xFB52, 0x70AB}, //7543 #CJK UNIFIED IDEOGRAPH + {0xFB53, 0x710F}, //7544 #CJK UNIFIED IDEOGRAPH + {0xFB54, 0x7104}, //7545 #CJK UNIFIED IDEOGRAPH + {0xFB55, 0x715C}, //7546 #CJK UNIFIED IDEOGRAPH + {0xFB56, 0x7146}, //7547 #CJK UNIFIED IDEOGRAPH + {0xFB57, 0x7147}, //7548 #CJK UNIFIED IDEOGRAPH + {0xFB58, 0xFA15}, //7549 #CJK COMPATIBILITY IDEOGRAPH + {0xFB59, 0x71C1}, //7550 #CJK UNIFIED IDEOGRAPH + {0xFB5A, 0x71FE}, //7551 #CJK UNIFIED IDEOGRAPH + {0xFB5B, 0x72B1}, //7552 #CJK UNIFIED IDEOGRAPH + {0xFB5C, 0x72BE}, //7553 #CJK UNIFIED IDEOGRAPH + {0xFB5D, 0x7324}, //7554 #CJK UNIFIED IDEOGRAPH + {0xFB5E, 0xFA16}, //7555 #CJK COMPATIBILITY IDEOGRAPH + {0xFB5F, 0x7377}, //7556 #CJK UNIFIED IDEOGRAPH + {0xFB60, 0x73BD}, //7557 #CJK UNIFIED IDEOGRAPH + {0xFB61, 0x73C9}, //7558 #CJK UNIFIED IDEOGRAPH + {0xFB62, 0x73D6}, //7559 #CJK UNIFIED IDEOGRAPH + {0xFB63, 0x73E3}, //7560 #CJK UNIFIED IDEOGRAPH + {0xFB64, 0x73D2}, //7561 #CJK UNIFIED IDEOGRAPH + {0xFB65, 0x7407}, //7562 #CJK UNIFIED IDEOGRAPH + {0xFB66, 0x73F5}, //7563 #CJK UNIFIED IDEOGRAPH + {0xFB67, 0x7426}, //7564 #CJK UNIFIED IDEOGRAPH + {0xFB68, 0x742A}, //7565 #CJK UNIFIED IDEOGRAPH + {0xFB69, 0x7429}, //7566 #CJK UNIFIED IDEOGRAPH + {0xFB6A, 0x742E}, //7567 #CJK UNIFIED IDEOGRAPH + {0xFB6B, 0x7462}, //7568 #CJK UNIFIED IDEOGRAPH + {0xFB6C, 0x7489}, //7569 #CJK UNIFIED IDEOGRAPH + {0xFB6D, 0x749F}, //7570 #CJK UNIFIED IDEOGRAPH + {0xFB6E, 0x7501}, //7571 #CJK UNIFIED IDEOGRAPH + {0xFB6F, 0x756F}, //7572 #CJK UNIFIED IDEOGRAPH + {0xFB70, 0x7682}, //7573 #CJK UNIFIED IDEOGRAPH + {0xFB71, 0x769C}, //7574 #CJK UNIFIED IDEOGRAPH + {0xFB72, 0x769E}, //7575 #CJK UNIFIED IDEOGRAPH + {0xFB73, 0x769B}, //7576 #CJK UNIFIED IDEOGRAPH + {0xFB74, 0x76A6}, //7577 #CJK UNIFIED IDEOGRAPH + {0xFB75, 0xFA17}, //7578 #CJK COMPATIBILITY IDEOGRAPH + {0xFB76, 0x7746}, //7579 #CJK UNIFIED IDEOGRAPH + {0xFB77, 0x52AF}, //7580 #CJK UNIFIED IDEOGRAPH + {0xFB78, 0x7821}, //7581 #CJK UNIFIED IDEOGRAPH + {0xFB79, 0x784E}, //7582 #CJK UNIFIED IDEOGRAPH + {0xFB7A, 0x7864}, //7583 #CJK UNIFIED IDEOGRAPH + {0xFB7B, 0x787A}, //7584 #CJK UNIFIED IDEOGRAPH + {0xFB7C, 0x7930}, //7585 #CJK UNIFIED IDEOGRAPH + {0xFB7D, 0xFA18}, //7586 #CJK COMPATIBILITY IDEOGRAPH + {0xFB7E, 0xFA19}, //7587 #CJK COMPATIBILITY IDEOGRAPH + {0xFB80, 0xFA1A}, //7588 #CJK COMPATIBILITY IDEOGRAPH + {0xFB81, 0x7994}, //7589 #CJK UNIFIED IDEOGRAPH + {0xFB82, 0xFA1B}, //7590 #CJK COMPATIBILITY IDEOGRAPH + {0xFB83, 0x799B}, //7591 #CJK UNIFIED IDEOGRAPH + {0xFB84, 0x7AD1}, //7592 #CJK UNIFIED IDEOGRAPH + {0xFB85, 0x7AE7}, //7593 #CJK UNIFIED IDEOGRAPH + {0xFB86, 0xFA1C}, //7594 #CJK COMPATIBILITY IDEOGRAPH + {0xFB87, 0x7AEB}, //7595 #CJK UNIFIED IDEOGRAPH + {0xFB88, 0x7B9E}, //7596 #CJK UNIFIED IDEOGRAPH + {0xFB89, 0xFA1D}, //7597 #CJK COMPATIBILITY IDEOGRAPH + {0xFB8A, 0x7D48}, //7598 #CJK UNIFIED IDEOGRAPH + {0xFB8B, 0x7D5C}, //7599 #CJK UNIFIED IDEOGRAPH + {0xFB8C, 0x7DB7}, //7600 #CJK UNIFIED IDEOGRAPH + {0xFB8D, 0x7DA0}, //7601 #CJK UNIFIED IDEOGRAPH + {0xFB8E, 0x7DD6}, //7602 #CJK UNIFIED IDEOGRAPH + {0xFB8F, 0x7E52}, //7603 #CJK UNIFIED IDEOGRAPH + {0xFB90, 0x7F47}, //7604 #CJK UNIFIED IDEOGRAPH + {0xFB91, 0x7FA1}, //7605 #CJK UNIFIED IDEOGRAPH + {0xFB92, 0xFA1E}, //7606 #CJK COMPATIBILITY IDEOGRAPH + {0xFB93, 0x8301}, //7607 #CJK UNIFIED IDEOGRAPH + {0xFB94, 0x8362}, //7608 #CJK UNIFIED IDEOGRAPH + {0xFB95, 0x837F}, //7609 #CJK UNIFIED IDEOGRAPH + {0xFB96, 0x83C7}, //7610 #CJK UNIFIED IDEOGRAPH + {0xFB97, 0x83F6}, //7611 #CJK UNIFIED IDEOGRAPH + {0xFB98, 0x8448}, //7612 #CJK UNIFIED IDEOGRAPH + {0xFB99, 0x84B4}, //7613 #CJK UNIFIED IDEOGRAPH + {0xFB9A, 0x8553}, //7614 #CJK UNIFIED IDEOGRAPH + {0xFB9B, 0x8559}, //7615 #CJK UNIFIED IDEOGRAPH + {0xFB9C, 0x856B}, //7616 #CJK UNIFIED IDEOGRAPH + {0xFB9D, 0xFA1F}, //7617 #CJK COMPATIBILITY IDEOGRAPH + {0xFB9E, 0x85B0}, //7618 #CJK UNIFIED IDEOGRAPH + {0xFB9F, 0xFA20}, //7619 #CJK COMPATIBILITY IDEOGRAPH + {0xFBA0, 0xFA21}, //7620 #CJK COMPATIBILITY IDEOGRAPH + {0xFBA1, 0x8807}, //7621 #CJK UNIFIED IDEOGRAPH + {0xFBA2, 0x88F5}, //7622 #CJK UNIFIED IDEOGRAPH + {0xFBA3, 0x8A12}, //7623 #CJK UNIFIED IDEOGRAPH + {0xFBA4, 0x8A37}, //7624 #CJK UNIFIED IDEOGRAPH + {0xFBA5, 0x8A79}, //7625 #CJK UNIFIED IDEOGRAPH + {0xFBA6, 0x8AA7}, //7626 #CJK UNIFIED IDEOGRAPH + {0xFBA7, 0x8ABE}, //7627 #CJK UNIFIED IDEOGRAPH + {0xFBA8, 0x8ADF}, //7628 #CJK UNIFIED IDEOGRAPH + {0xFBA9, 0xFA22}, //7629 #CJK COMPATIBILITY IDEOGRAPH + {0xFBAA, 0x8AF6}, //7630 #CJK UNIFIED IDEOGRAPH + {0xFBAB, 0x8B53}, //7631 #CJK UNIFIED IDEOGRAPH + {0xFBAC, 0x8B7F}, //7632 #CJK UNIFIED IDEOGRAPH + {0xFBAD, 0x8CF0}, //7633 #CJK UNIFIED IDEOGRAPH + {0xFBAE, 0x8CF4}, //7634 #CJK UNIFIED IDEOGRAPH + {0xFBAF, 0x8D12}, //7635 #CJK UNIFIED IDEOGRAPH + {0xFBB0, 0x8D76}, //7636 #CJK UNIFIED IDEOGRAPH + {0xFBB1, 0xFA23}, //7637 #CJK COMPATIBILITY IDEOGRAPH + {0xFBB2, 0x8ECF}, //7638 #CJK UNIFIED IDEOGRAPH + {0xFBB3, 0xFA24}, //7639 #CJK COMPATIBILITY IDEOGRAPH + {0xFBB4, 0xFA25}, //7640 #CJK COMPATIBILITY IDEOGRAPH + {0xFBB5, 0x9067}, //7641 #CJK UNIFIED IDEOGRAPH + {0xFBB6, 0x90DE}, //7642 #CJK UNIFIED IDEOGRAPH + {0xFBB7, 0xFA26}, //7643 #CJK COMPATIBILITY IDEOGRAPH + {0xFBB8, 0x9115}, //7644 #CJK UNIFIED IDEOGRAPH + {0xFBB9, 0x9127}, //7645 #CJK UNIFIED IDEOGRAPH + {0xFBBA, 0x91DA}, //7646 #CJK UNIFIED IDEOGRAPH + {0xFBBB, 0x91D7}, //7647 #CJK UNIFIED IDEOGRAPH + {0xFBBC, 0x91DE}, //7648 #CJK UNIFIED IDEOGRAPH + {0xFBBD, 0x91ED}, //7649 #CJK UNIFIED IDEOGRAPH + {0xFBBE, 0x91EE}, //7650 #CJK UNIFIED IDEOGRAPH + {0xFBBF, 0x91E4}, //7651 #CJK UNIFIED IDEOGRAPH + {0xFBC0, 0x91E5}, //7652 #CJK UNIFIED IDEOGRAPH + {0xFBC1, 0x9206}, //7653 #CJK UNIFIED IDEOGRAPH + {0xFBC2, 0x9210}, //7654 #CJK UNIFIED IDEOGRAPH + {0xFBC3, 0x920A}, //7655 #CJK UNIFIED IDEOGRAPH + {0xFBC4, 0x923A}, //7656 #CJK UNIFIED IDEOGRAPH + {0xFBC5, 0x9240}, //7657 #CJK UNIFIED IDEOGRAPH + {0xFBC6, 0x923C}, //7658 #CJK UNIFIED IDEOGRAPH + {0xFBC7, 0x924E}, //7659 #CJK UNIFIED IDEOGRAPH + {0xFBC8, 0x9259}, //7660 #CJK UNIFIED IDEOGRAPH + {0xFBC9, 0x9251}, //7661 #CJK UNIFIED IDEOGRAPH + {0xFBCA, 0x9239}, //7662 #CJK UNIFIED IDEOGRAPH + {0xFBCB, 0x9267}, //7663 #CJK UNIFIED IDEOGRAPH + {0xFBCC, 0x92A7}, //7664 #CJK UNIFIED IDEOGRAPH + {0xFBCD, 0x9277}, //7665 #CJK UNIFIED IDEOGRAPH + {0xFBCE, 0x9278}, //7666 #CJK UNIFIED IDEOGRAPH + {0xFBCF, 0x92E7}, //7667 #CJK UNIFIED IDEOGRAPH + {0xFBD0, 0x92D7}, //7668 #CJK UNIFIED IDEOGRAPH + {0xFBD1, 0x92D9}, //7669 #CJK UNIFIED IDEOGRAPH + {0xFBD2, 0x92D0}, //7670 #CJK UNIFIED IDEOGRAPH + {0xFBD3, 0xFA27}, //7671 #CJK COMPATIBILITY IDEOGRAPH + {0xFBD4, 0x92D5}, //7672 #CJK UNIFIED IDEOGRAPH + {0xFBD5, 0x92E0}, //7673 #CJK UNIFIED IDEOGRAPH + {0xFBD6, 0x92D3}, //7674 #CJK UNIFIED IDEOGRAPH + {0xFBD7, 0x9325}, //7675 #CJK UNIFIED IDEOGRAPH + {0xFBD8, 0x9321}, //7676 #CJK UNIFIED IDEOGRAPH + {0xFBD9, 0x92FB}, //7677 #CJK UNIFIED IDEOGRAPH + {0xFBDA, 0xFA28}, //7678 #CJK COMPATIBILITY IDEOGRAPH + {0xFBDB, 0x931E}, //7679 #CJK UNIFIED IDEOGRAPH + {0xFBDC, 0x92FF}, //7680 #CJK UNIFIED IDEOGRAPH + {0xFBDD, 0x931D}, //7681 #CJK UNIFIED IDEOGRAPH + {0xFBDE, 0x9302}, //7682 #CJK UNIFIED IDEOGRAPH + {0xFBDF, 0x9370}, //7683 #CJK UNIFIED IDEOGRAPH + {0xFBE0, 0x9357}, //7684 #CJK UNIFIED IDEOGRAPH + {0xFBE1, 0x93A4}, //7685 #CJK UNIFIED IDEOGRAPH + {0xFBE2, 0x93C6}, //7686 #CJK UNIFIED IDEOGRAPH + {0xFBE3, 0x93DE}, //7687 #CJK UNIFIED IDEOGRAPH + {0xFBE4, 0x93F8}, //7688 #CJK UNIFIED IDEOGRAPH + {0xFBE5, 0x9431}, //7689 #CJK UNIFIED IDEOGRAPH + {0xFBE6, 0x9445}, //7690 #CJK UNIFIED IDEOGRAPH + {0xFBE7, 0x9448}, //7691 #CJK UNIFIED IDEOGRAPH + {0xFBE8, 0x9592}, //7692 #CJK UNIFIED IDEOGRAPH + {0xFBE9, 0xF9DC}, //7693 #CJK COMPATIBILITY IDEOGRAPH + {0xFBEA, 0xFA29}, //7694 #CJK COMPATIBILITY IDEOGRAPH + {0xFBEB, 0x969D}, //7695 #CJK UNIFIED IDEOGRAPH + {0xFBEC, 0x96AF}, //7696 #CJK UNIFIED IDEOGRAPH + {0xFBED, 0x9733}, //7697 #CJK UNIFIED IDEOGRAPH + {0xFBEE, 0x973B}, //7698 #CJK UNIFIED IDEOGRAPH + {0xFBEF, 0x9743}, //7699 #CJK UNIFIED IDEOGRAPH + {0xFBF0, 0x974D}, //7700 #CJK UNIFIED IDEOGRAPH + {0xFBF1, 0x974F}, //7701 #CJK UNIFIED IDEOGRAPH + {0xFBF2, 0x9751}, //7702 #CJK UNIFIED IDEOGRAPH + {0xFBF3, 0x9755}, //7703 #CJK UNIFIED IDEOGRAPH + {0xFBF4, 0x9857}, //7704 #CJK UNIFIED IDEOGRAPH + {0xFBF5, 0x9865}, //7705 #CJK UNIFIED IDEOGRAPH + {0xFBF6, 0xFA2A}, //7706 #CJK COMPATIBILITY IDEOGRAPH + {0xFBF7, 0xFA2B}, //7707 #CJK COMPATIBILITY IDEOGRAPH + {0xFBF8, 0x9927}, //7708 #CJK UNIFIED IDEOGRAPH + {0xFBF9, 0xFA2C}, //7709 #CJK COMPATIBILITY IDEOGRAPH + {0xFBFA, 0x999E}, //7710 #CJK UNIFIED IDEOGRAPH + {0xFBFB, 0x9A4E}, //7711 #CJK UNIFIED IDEOGRAPH + {0xFBFC, 0x9AD9}, //7712 #CJK UNIFIED IDEOGRAPH + {0xFC40, 0x9ADC}, //7713 #CJK UNIFIED IDEOGRAPH + {0xFC41, 0x9B75}, //7714 #CJK UNIFIED IDEOGRAPH + {0xFC42, 0x9B72}, //7715 #CJK UNIFIED IDEOGRAPH + {0xFC43, 0x9B8F}, //7716 #CJK UNIFIED IDEOGRAPH + {0xFC44, 0x9BB1}, //7717 #CJK UNIFIED IDEOGRAPH + {0xFC45, 0x9BBB}, //7718 #CJK UNIFIED IDEOGRAPH + {0xFC46, 0x9C00}, //7719 #CJK UNIFIED IDEOGRAPH + {0xFC47, 0x9D70}, //7720 #CJK UNIFIED IDEOGRAPH + {0xFC48, 0x9D6B}, //7721 #CJK UNIFIED IDEOGRAPH + {0xFC49, 0xFA2D}, //7722 #CJK COMPATIBILITY IDEOGRAPH + {0xFC4A, 0x9E19}, //7723 #CJK UNIFIED IDEOGRAPH + {0xFC4B, 0x9ED1} //7724 #CJK UNIFIED IDEOGRAPH +}; +#endif // DRW_CPTABLE932_H diff --git a/extlib/libdxfrw/intern/drw_cptable936.h b/extlib/libdxfrw/intern/drw_cptable936.h new file mode 100644 index 0000000..4c1c141 --- /dev/null +++ b/extlib/libdxfrw/intern/drw_cptable936.h @@ -0,0 +1,21943 @@ +#ifndef DRW_CPTABLE936_H +#define DRW_CPTABLE936_H + +//Chinese PRC GBK (XGB) + +//first entry in this tables are 0x80 +#define CPOFFSET936 0x80 +#define CPLENGHT936 21791 +#define NOTFOUND936 0x003F + +//Table 949 one byte +static const int DRW_Table936[] = { + 0x20AC //1 #EURO SIGN 0x80 +// 0xF8F5 //2 #EURO SIGN 0x80 +}; + +//Table 936 +static const int DRW_LeadTable936[] = { + 0, //1#DBCS LEAD BYTE 0x81 + 190, //2#DBCS LEAD BYTE 0x82 + 380, //3#DBCS LEAD BYTE 0x83 + 570, //4#DBCS LEAD BYTE 0x84 + 760, //5#DBCS LEAD BYTE 0x85 + 950, //6#DBCS LEAD BYTE 0x86 + 1140, //7#DBCS LEAD BYTE 0x87 + 1330, //8#DBCS LEAD BYTE 0x88 + 1520, //9#DBCS LEAD BYTE 0x89 + 1710, //10#DBCS LEAD BYTE 0x8A + 1900, //11#DBCS LEAD BYTE 0x8B + 2090, //12#DBCS LEAD BYTE 0x8C + 2280, //13#DBCS LEAD BYTE 0x8D + 2470, //14#DBCS LEAD BYTE 0x8E + 2660, //15#DBCS LEAD BYTE 0x8F + 2850, //16#DBCS LEAD BYTE 0x90 + 3040, //17#DBCS LEAD BYTE 0x91 + 3230, //18#DBCS LEAD BYTE 0x92 + 3420, //19#DBCS LEAD BYTE 0x93 + 3610, //20#DBCS LEAD BYTE 0x94 + 3800, //21#DBCS LEAD BYTE 0x95 + 3990, //22#DBCS LEAD BYTE 0x96 + 4180, //23#DBCS LEAD BYTE 0x97 + 4370, //24#DBCS LEAD BYTE 0x98 + 4560, //25#DBCS LEAD BYTE 0x99 + 4750, //26#DBCS LEAD BYTE 0x9A + 4940, //27#DBCS LEAD BYTE 0x9B + 5130, //28#DBCS LEAD BYTE 0x9C + 5320, //29#DBCS LEAD BYTE 0x9D + 5510, //30#DBCS LEAD BYTE 0x9E + 5700, //31#DBCS LEAD BYTE 0x9F + 5906, //32#DBCS LEAD BYTE 0xA0 + 6080, //33#DBCS LEAD BYTE 0xA1 + 6174, //34#DBCS LEAD BYTE 0xA2 + 6256, //35#DBCS LEAD BYTE 0xA3 + 6350, //36#DBCS LEAD BYTE 0xA4 + 6433, //37#DBCS LEAD BYTE 0xA5 + 6519, //38#DBCS LEAD BYTE 0xA6 + 6586, //39#DBCS LEAD BYTE 0xA7 + 6652, //40#DBCS LEAD BYTE 0xA8 + 6804, //41#DBCS LEAD BYTE 0xA9 + 6948, //42#DBCS LEAD BYTE 0xAA + 7044, //43#DBCS LEAD BYTE 0xAB + 7140, //44#DBCS LEAD BYTE 0xAC + 7236, //45#DBCS LEAD BYTE 0xAD + 7332, //46#DBCS LEAD BYTE 0xAE + 7428, //47#DBCS LEAD BYTE 0xAF + 7524, //48#DBCS LEAD BYTE 0xB0 + 7714, //49#DBCS LEAD BYTE 0xB1 + 7904, //50#DBCS LEAD BYTE 0xB2 + 8094, //51#DBCS LEAD BYTE 0xB3 + 8284, //52#DBCS LEAD BYTE 0xB4 + 8474, //53#DBCS LEAD BYTE 0xB5 + 8664, //54#DBCS LEAD BYTE 0xB6 + 8854, //55#DBCS LEAD BYTE 0xB7 + 9044, //56#DBCS LEAD BYTE 0xB8 + 9224, //57#DBCS LEAD BYTE 0xB9 + 9424, //58#DBCS LEAD BYTE 0xBA + 9614, //59#DBCS LEAD BYTE 0xBB + 9804, //60#DBCS LEAD BYTE 0xBC + 9994, //61#DBCS LEAD BYTE 0xBD + 10184, //62#DBCS LEAD BYTE 0xBE + 10374, //63#DBCS LEAD BYTE 0xBF + 10564, //64#DBCS LEAD BYTE 0xC0 + 10754, //65#DBCS LEAD BYTE 0xC1 + 10944, //66#DBCS LEAD BYTE 0xC2 + 11134, //67#DBCS LEAD BYTE 0xC3 + 11324, //68#DBCS LEAD BYTE 0xC4 + 11514, //69#DBCS LEAD BYTE 0xC5 + 11704, //70#DBCS LEAD BYTE 0xC6 + 11894, //71#DBCS LEAD BYTE 0xC7 + 12084, //72#DBCS LEAD BYTE 0xC8 + 12274, //73#DBCS LEAD BYTE 0xC9 + 12464, //74#DBCS LEAD BYTE 0xCA + 12654, //75#DBCS LEAD BYTE 0xCB + 12844, //76#DBCS LEAD BYTE 0xCC + 13034, //77#DBCS LEAD BYTE 0xCD + 13224, //78#DBCS LEAD BYTE 0xCE + 13414, //79#DBCS LEAD BYTE 0xCF + 13604, //80#DBCS LEAD BYTE 0xD0 + 13794, //81#DBCS LEAD BYTE 0xD1 + 13984, //82#DBCS LEAD BYTE 0xD2 + 14174, //83#DBCS LEAD BYTE 0xD3 + 14364, //84#DBCS LEAD BYTE 0xD4 + 14554, //85#DBCS LEAD BYTE 0xD5 + 14744, //86#DBCS LEAD BYTE 0xD6 + 14934, //87#DBCS LEAD BYTE 0xD7 + 15119, //88#DBCS LEAD BYTE 0xD8 + 15309, //89#DBCS LEAD BYTE 0xD9 + 15499, //90#DBCS LEAD BYTE 0xDA + 15689, //91#DBCS LEAD BYTE 0xDB + 15879, //92#DBCS LEAD BYTE 0xDC + 16069, //93#DBCS LEAD BYTE 0xDD + 16259, //94#DBCS LEAD BYTE 0xDE + 16449, //95#DBCS LEAD BYTE 0xDF + 16639, //96#DBCS LEAD BYTE 0xE0 + 16829, //97#DBCS LEAD BYTE 0xE1 + 17019, //98#DBCS LEAD BYTE 0xE2 + 17209, //99#DBCS LEAD BYTE 0xE3 + 17399, //100#DBCS LEAD BYTE 0xE4 + 17589, //101#DBCS LEAD BYTE 0xE5 + 17779, //102#DBCS LEAD BYTE 0xE6 + 17969, //103#DBCS LEAD BYTE 0xE7 + 18159, //104#DBCS LEAD BYTE 0xE8 + 18349, //105#DBCS LEAD BYTE 0xE9 + 18539, //106#DBCS LEAD BYTE 0xEA + 18729, //107#DBCS LEAD BYTE 0xEB + 18919, //108#DBCS LEAD BYTE 0xEC + 19109, //109#DBCS LEAD BYTE 0xED + 19299, //110#DBCS LEAD BYTE 0xEE + 19489, //111#DBCS LEAD BYTE 0xEF + 19679, //112#DBCS LEAD BYTE 0xF0 + 19869, //113#DBCS LEAD BYTE 0xF1 + 20059, //114#DBCS LEAD BYTE 0xF2 + 20249, //115#DBCS LEAD BYTE 0xF3 + 20439, //116#DBCS LEAD BYTE 0xF4 + 20659, //117#DBCS LEAD BYTE 0xF5 + 20819, //118#DBCS LEAD BYTE 0xF6 + 21009, //119#DBCS LEAD BYTE 0xF7 + 21199, //120#DBCS LEAD BYTE 0xF8 + 21295, //121#DBCS LEAD BYTE 0xF9 + 21391, //122#DBCS LEAD BYTE 0xFA + 21487, //123#DBCS LEAD BYTE 0xFB + 21583, //124#DBCS LEAD BYTE 0xFC + 21679, //125#DBCS LEAD BYTE 0xFD + 21775, //126#DBCS LEAD BYTE 0xFE + 21791, //127#UNDEFINED 0xFF, END OF TABLE +}; + +//Table 936 tail byte +static const int DRW_DoubleTable936[][2] = { + {0x8140, 0x4E02}, //1 #CJK UNIFIED IDEOGRAPH + {0x8141, 0x4E04}, //2 #CJK UNIFIED IDEOGRAPH + {0x8142, 0x4E05}, //3 #CJK UNIFIED IDEOGRAPH + {0x8143, 0x4E06}, //4 #CJK UNIFIED IDEOGRAPH + {0x8144, 0x4E0F}, //5 #CJK UNIFIED IDEOGRAPH + {0x8145, 0x4E12}, //6 #CJK UNIFIED IDEOGRAPH + {0x8146, 0x4E17}, //7 #CJK UNIFIED IDEOGRAPH + {0x8147, 0x4E1F}, //8 #CJK UNIFIED IDEOGRAPH + {0x8148, 0x4E20}, //9 #CJK UNIFIED IDEOGRAPH + {0x8149, 0x4E21}, //10 #CJK UNIFIED IDEOGRAPH + {0x814A, 0x4E23}, //11 #CJK UNIFIED IDEOGRAPH + {0x814B, 0x4E26}, //12 #CJK UNIFIED IDEOGRAPH + {0x814C, 0x4E29}, //13 #CJK UNIFIED IDEOGRAPH + {0x814D, 0x4E2E}, //14 #CJK UNIFIED IDEOGRAPH + {0x814E, 0x4E2F}, //15 #CJK UNIFIED IDEOGRAPH + {0x814F, 0x4E31}, //16 #CJK UNIFIED IDEOGRAPH + {0x8150, 0x4E33}, //17 #CJK UNIFIED IDEOGRAPH + {0x8151, 0x4E35}, //18 #CJK UNIFIED IDEOGRAPH + {0x8152, 0x4E37}, //19 #CJK UNIFIED IDEOGRAPH + {0x8153, 0x4E3C}, //20 #CJK UNIFIED IDEOGRAPH + {0x8154, 0x4E40}, //21 #CJK UNIFIED IDEOGRAPH + {0x8155, 0x4E41}, //22 #CJK UNIFIED IDEOGRAPH + {0x8156, 0x4E42}, //23 #CJK UNIFIED IDEOGRAPH + {0x8157, 0x4E44}, //24 #CJK UNIFIED IDEOGRAPH + {0x8158, 0x4E46}, //25 #CJK UNIFIED IDEOGRAPH + {0x8159, 0x4E4A}, //26 #CJK UNIFIED IDEOGRAPH + {0x815A, 0x4E51}, //27 #CJK UNIFIED IDEOGRAPH + {0x815B, 0x4E55}, //28 #CJK UNIFIED IDEOGRAPH + {0x815C, 0x4E57}, //29 #CJK UNIFIED IDEOGRAPH + {0x815D, 0x4E5A}, //30 #CJK UNIFIED IDEOGRAPH + {0x815E, 0x4E5B}, //31 #CJK UNIFIED IDEOGRAPH + {0x815F, 0x4E62}, //32 #CJK UNIFIED IDEOGRAPH + {0x8160, 0x4E63}, //33 #CJK UNIFIED IDEOGRAPH + {0x8161, 0x4E64}, //34 #CJK UNIFIED IDEOGRAPH + {0x8162, 0x4E65}, //35 #CJK UNIFIED IDEOGRAPH + {0x8163, 0x4E67}, //36 #CJK UNIFIED IDEOGRAPH + {0x8164, 0x4E68}, //37 #CJK UNIFIED IDEOGRAPH + {0x8165, 0x4E6A}, //38 #CJK UNIFIED IDEOGRAPH + {0x8166, 0x4E6B}, //39 #CJK UNIFIED IDEOGRAPH + {0x8167, 0x4E6C}, //40 #CJK UNIFIED IDEOGRAPH + {0x8168, 0x4E6D}, //41 #CJK UNIFIED IDEOGRAPH + {0x8169, 0x4E6E}, //42 #CJK UNIFIED IDEOGRAPH + {0x816A, 0x4E6F}, //43 #CJK UNIFIED IDEOGRAPH + {0x816B, 0x4E72}, //44 #CJK UNIFIED IDEOGRAPH + {0x816C, 0x4E74}, //45 #CJK UNIFIED IDEOGRAPH + {0x816D, 0x4E75}, //46 #CJK UNIFIED IDEOGRAPH + {0x816E, 0x4E76}, //47 #CJK UNIFIED IDEOGRAPH + {0x816F, 0x4E77}, //48 #CJK UNIFIED IDEOGRAPH + {0x8170, 0x4E78}, //49 #CJK UNIFIED IDEOGRAPH + {0x8171, 0x4E79}, //50 #CJK UNIFIED IDEOGRAPH + {0x8172, 0x4E7A}, //51 #CJK UNIFIED IDEOGRAPH + {0x8173, 0x4E7B}, //52 #CJK UNIFIED IDEOGRAPH + {0x8174, 0x4E7C}, //53 #CJK UNIFIED IDEOGRAPH + {0x8175, 0x4E7D}, //54 #CJK UNIFIED IDEOGRAPH + {0x8176, 0x4E7F}, //55 #CJK UNIFIED IDEOGRAPH + {0x8177, 0x4E80}, //56 #CJK UNIFIED IDEOGRAPH + {0x8178, 0x4E81}, //57 #CJK UNIFIED IDEOGRAPH + {0x8179, 0x4E82}, //58 #CJK UNIFIED IDEOGRAPH + {0x817A, 0x4E83}, //59 #CJK UNIFIED IDEOGRAPH + {0x817B, 0x4E84}, //60 #CJK UNIFIED IDEOGRAPH + {0x817C, 0x4E85}, //61 #CJK UNIFIED IDEOGRAPH + {0x817D, 0x4E87}, //62 #CJK UNIFIED IDEOGRAPH + {0x817E, 0x4E8A}, //63 #CJK UNIFIED IDEOGRAPH + {0x8180, 0x4E90}, //64 #CJK UNIFIED IDEOGRAPH + {0x8181, 0x4E96}, //65 #CJK UNIFIED IDEOGRAPH + {0x8182, 0x4E97}, //66 #CJK UNIFIED IDEOGRAPH + {0x8183, 0x4E99}, //67 #CJK UNIFIED IDEOGRAPH + {0x8184, 0x4E9C}, //68 #CJK UNIFIED IDEOGRAPH + {0x8185, 0x4E9D}, //69 #CJK UNIFIED IDEOGRAPH + {0x8186, 0x4E9E}, //70 #CJK UNIFIED IDEOGRAPH + {0x8187, 0x4EA3}, //71 #CJK UNIFIED IDEOGRAPH + {0x8188, 0x4EAA}, //72 #CJK UNIFIED IDEOGRAPH + {0x8189, 0x4EAF}, //73 #CJK UNIFIED IDEOGRAPH + {0x818A, 0x4EB0}, //74 #CJK UNIFIED IDEOGRAPH + {0x818B, 0x4EB1}, //75 #CJK UNIFIED IDEOGRAPH + {0x818C, 0x4EB4}, //76 #CJK UNIFIED IDEOGRAPH + {0x818D, 0x4EB6}, //77 #CJK UNIFIED IDEOGRAPH + {0x818E, 0x4EB7}, //78 #CJK UNIFIED IDEOGRAPH + {0x818F, 0x4EB8}, //79 #CJK UNIFIED IDEOGRAPH + {0x8190, 0x4EB9}, //80 #CJK UNIFIED IDEOGRAPH + {0x8191, 0x4EBC}, //81 #CJK UNIFIED IDEOGRAPH + {0x8192, 0x4EBD}, //82 #CJK UNIFIED IDEOGRAPH + {0x8193, 0x4EBE}, //83 #CJK UNIFIED IDEOGRAPH + {0x8194, 0x4EC8}, //84 #CJK UNIFIED IDEOGRAPH + {0x8195, 0x4ECC}, //85 #CJK UNIFIED IDEOGRAPH + {0x8196, 0x4ECF}, //86 #CJK UNIFIED IDEOGRAPH + {0x8197, 0x4ED0}, //87 #CJK UNIFIED IDEOGRAPH + {0x8198, 0x4ED2}, //88 #CJK UNIFIED IDEOGRAPH + {0x8199, 0x4EDA}, //89 #CJK UNIFIED IDEOGRAPH + {0x819A, 0x4EDB}, //90 #CJK UNIFIED IDEOGRAPH + {0x819B, 0x4EDC}, //91 #CJK UNIFIED IDEOGRAPH + {0x819C, 0x4EE0}, //92 #CJK UNIFIED IDEOGRAPH + {0x819D, 0x4EE2}, //93 #CJK UNIFIED IDEOGRAPH + {0x819E, 0x4EE6}, //94 #CJK UNIFIED IDEOGRAPH + {0x819F, 0x4EE7}, //95 #CJK UNIFIED IDEOGRAPH + {0x81A0, 0x4EE9}, //96 #CJK UNIFIED IDEOGRAPH + {0x81A1, 0x4EED}, //97 #CJK UNIFIED IDEOGRAPH + {0x81A2, 0x4EEE}, //98 #CJK UNIFIED IDEOGRAPH + {0x81A3, 0x4EEF}, //99 #CJK UNIFIED IDEOGRAPH + {0x81A4, 0x4EF1}, //100 #CJK UNIFIED IDEOGRAPH + {0x81A5, 0x4EF4}, //101 #CJK UNIFIED IDEOGRAPH + {0x81A6, 0x4EF8}, //102 #CJK UNIFIED IDEOGRAPH + {0x81A7, 0x4EF9}, //103 #CJK UNIFIED IDEOGRAPH + {0x81A8, 0x4EFA}, //104 #CJK UNIFIED IDEOGRAPH + {0x81A9, 0x4EFC}, //105 #CJK UNIFIED IDEOGRAPH + {0x81AA, 0x4EFE}, //106 #CJK UNIFIED IDEOGRAPH + {0x81AB, 0x4F00}, //107 #CJK UNIFIED IDEOGRAPH + {0x81AC, 0x4F02}, //108 #CJK UNIFIED IDEOGRAPH + {0x81AD, 0x4F03}, //109 #CJK UNIFIED IDEOGRAPH + {0x81AE, 0x4F04}, //110 #CJK UNIFIED IDEOGRAPH + {0x81AF, 0x4F05}, //111 #CJK UNIFIED IDEOGRAPH + {0x81B0, 0x4F06}, //112 #CJK UNIFIED IDEOGRAPH + {0x81B1, 0x4F07}, //113 #CJK UNIFIED IDEOGRAPH + {0x81B2, 0x4F08}, //114 #CJK UNIFIED IDEOGRAPH + {0x81B3, 0x4F0B}, //115 #CJK UNIFIED IDEOGRAPH + {0x81B4, 0x4F0C}, //116 #CJK UNIFIED IDEOGRAPH + {0x81B5, 0x4F12}, //117 #CJK UNIFIED IDEOGRAPH + {0x81B6, 0x4F13}, //118 #CJK UNIFIED IDEOGRAPH + {0x81B7, 0x4F14}, //119 #CJK UNIFIED IDEOGRAPH + {0x81B8, 0x4F15}, //120 #CJK UNIFIED IDEOGRAPH + {0x81B9, 0x4F16}, //121 #CJK UNIFIED IDEOGRAPH + {0x81BA, 0x4F1C}, //122 #CJK UNIFIED IDEOGRAPH + {0x81BB, 0x4F1D}, //123 #CJK UNIFIED IDEOGRAPH + {0x81BC, 0x4F21}, //124 #CJK UNIFIED IDEOGRAPH + {0x81BD, 0x4F23}, //125 #CJK UNIFIED IDEOGRAPH + {0x81BE, 0x4F28}, //126 #CJK UNIFIED IDEOGRAPH + {0x81BF, 0x4F29}, //127 #CJK UNIFIED IDEOGRAPH + {0x81C0, 0x4F2C}, //128 #CJK UNIFIED IDEOGRAPH + {0x81C1, 0x4F2D}, //129 #CJK UNIFIED IDEOGRAPH + {0x81C2, 0x4F2E}, //130 #CJK UNIFIED IDEOGRAPH + {0x81C3, 0x4F31}, //131 #CJK UNIFIED IDEOGRAPH + {0x81C4, 0x4F33}, //132 #CJK UNIFIED IDEOGRAPH + {0x81C5, 0x4F35}, //133 #CJK UNIFIED IDEOGRAPH + {0x81C6, 0x4F37}, //134 #CJK UNIFIED IDEOGRAPH + {0x81C7, 0x4F39}, //135 #CJK UNIFIED IDEOGRAPH + {0x81C8, 0x4F3B}, //136 #CJK UNIFIED IDEOGRAPH + {0x81C9, 0x4F3E}, //137 #CJK UNIFIED IDEOGRAPH + {0x81CA, 0x4F3F}, //138 #CJK UNIFIED IDEOGRAPH + {0x81CB, 0x4F40}, //139 #CJK UNIFIED IDEOGRAPH + {0x81CC, 0x4F41}, //140 #CJK UNIFIED IDEOGRAPH + {0x81CD, 0x4F42}, //141 #CJK UNIFIED IDEOGRAPH + {0x81CE, 0x4F44}, //142 #CJK UNIFIED IDEOGRAPH + {0x81CF, 0x4F45}, //143 #CJK UNIFIED IDEOGRAPH + {0x81D0, 0x4F47}, //144 #CJK UNIFIED IDEOGRAPH + {0x81D1, 0x4F48}, //145 #CJK UNIFIED IDEOGRAPH + {0x81D2, 0x4F49}, //146 #CJK UNIFIED IDEOGRAPH + {0x81D3, 0x4F4A}, //147 #CJK UNIFIED IDEOGRAPH + {0x81D4, 0x4F4B}, //148 #CJK UNIFIED IDEOGRAPH + {0x81D5, 0x4F4C}, //149 #CJK UNIFIED IDEOGRAPH + {0x81D6, 0x4F52}, //150 #CJK UNIFIED IDEOGRAPH + {0x81D7, 0x4F54}, //151 #CJK UNIFIED IDEOGRAPH + {0x81D8, 0x4F56}, //152 #CJK UNIFIED IDEOGRAPH + {0x81D9, 0x4F61}, //153 #CJK UNIFIED IDEOGRAPH + {0x81DA, 0x4F62}, //154 #CJK UNIFIED IDEOGRAPH + {0x81DB, 0x4F66}, //155 #CJK UNIFIED IDEOGRAPH + {0x81DC, 0x4F68}, //156 #CJK UNIFIED IDEOGRAPH + {0x81DD, 0x4F6A}, //157 #CJK UNIFIED IDEOGRAPH + {0x81DE, 0x4F6B}, //158 #CJK UNIFIED IDEOGRAPH + {0x81DF, 0x4F6D}, //159 #CJK UNIFIED IDEOGRAPH + {0x81E0, 0x4F6E}, //160 #CJK UNIFIED IDEOGRAPH + {0x81E1, 0x4F71}, //161 #CJK UNIFIED IDEOGRAPH + {0x81E2, 0x4F72}, //162 #CJK UNIFIED IDEOGRAPH + {0x81E3, 0x4F75}, //163 #CJK UNIFIED IDEOGRAPH + {0x81E4, 0x4F77}, //164 #CJK UNIFIED IDEOGRAPH + {0x81E5, 0x4F78}, //165 #CJK UNIFIED IDEOGRAPH + {0x81E6, 0x4F79}, //166 #CJK UNIFIED IDEOGRAPH + {0x81E7, 0x4F7A}, //167 #CJK UNIFIED IDEOGRAPH + {0x81E8, 0x4F7D}, //168 #CJK UNIFIED IDEOGRAPH + {0x81E9, 0x4F80}, //169 #CJK UNIFIED IDEOGRAPH + {0x81EA, 0x4F81}, //170 #CJK UNIFIED IDEOGRAPH + {0x81EB, 0x4F82}, //171 #CJK UNIFIED IDEOGRAPH + {0x81EC, 0x4F85}, //172 #CJK UNIFIED IDEOGRAPH + {0x81ED, 0x4F86}, //173 #CJK UNIFIED IDEOGRAPH + {0x81EE, 0x4F87}, //174 #CJK UNIFIED IDEOGRAPH + {0x81EF, 0x4F8A}, //175 #CJK UNIFIED IDEOGRAPH + {0x81F0, 0x4F8C}, //176 #CJK UNIFIED IDEOGRAPH + {0x81F1, 0x4F8E}, //177 #CJK UNIFIED IDEOGRAPH + {0x81F2, 0x4F90}, //178 #CJK UNIFIED IDEOGRAPH + {0x81F3, 0x4F92}, //179 #CJK UNIFIED IDEOGRAPH + {0x81F4, 0x4F93}, //180 #CJK UNIFIED IDEOGRAPH + {0x81F5, 0x4F95}, //181 #CJK UNIFIED IDEOGRAPH + {0x81F6, 0x4F96}, //182 #CJK UNIFIED IDEOGRAPH + {0x81F7, 0x4F98}, //183 #CJK UNIFIED IDEOGRAPH + {0x81F8, 0x4F99}, //184 #CJK UNIFIED IDEOGRAPH + {0x81F9, 0x4F9A}, //185 #CJK UNIFIED IDEOGRAPH + {0x81FA, 0x4F9C}, //186 #CJK UNIFIED IDEOGRAPH + {0x81FB, 0x4F9E}, //187 #CJK UNIFIED IDEOGRAPH + {0x81FC, 0x4F9F}, //188 #CJK UNIFIED IDEOGRAPH + {0x81FD, 0x4FA1}, //189 #CJK UNIFIED IDEOGRAPH + {0x81FE, 0x4FA2}, //190 #CJK UNIFIED IDEOGRAPH + {0x8240, 0x4FA4}, //191 #CJK UNIFIED IDEOGRAPH + {0x8241, 0x4FAB}, //192 #CJK UNIFIED IDEOGRAPH + {0x8242, 0x4FAD}, //193 #CJK UNIFIED IDEOGRAPH + {0x8243, 0x4FB0}, //194 #CJK UNIFIED IDEOGRAPH + {0x8244, 0x4FB1}, //195 #CJK UNIFIED IDEOGRAPH + {0x8245, 0x4FB2}, //196 #CJK UNIFIED IDEOGRAPH + {0x8246, 0x4FB3}, //197 #CJK UNIFIED IDEOGRAPH + {0x8247, 0x4FB4}, //198 #CJK UNIFIED IDEOGRAPH + {0x8248, 0x4FB6}, //199 #CJK UNIFIED IDEOGRAPH + {0x8249, 0x4FB7}, //200 #CJK UNIFIED IDEOGRAPH + {0x824A, 0x4FB8}, //201 #CJK UNIFIED IDEOGRAPH + {0x824B, 0x4FB9}, //202 #CJK UNIFIED IDEOGRAPH + {0x824C, 0x4FBA}, //203 #CJK UNIFIED IDEOGRAPH + {0x824D, 0x4FBB}, //204 #CJK UNIFIED IDEOGRAPH + {0x824E, 0x4FBC}, //205 #CJK UNIFIED IDEOGRAPH + {0x824F, 0x4FBD}, //206 #CJK UNIFIED IDEOGRAPH + {0x8250, 0x4FBE}, //207 #CJK UNIFIED IDEOGRAPH + {0x8251, 0x4FC0}, //208 #CJK UNIFIED IDEOGRAPH + {0x8252, 0x4FC1}, //209 #CJK UNIFIED IDEOGRAPH + {0x8253, 0x4FC2}, //210 #CJK UNIFIED IDEOGRAPH + {0x8254, 0x4FC6}, //211 #CJK UNIFIED IDEOGRAPH + {0x8255, 0x4FC7}, //212 #CJK UNIFIED IDEOGRAPH + {0x8256, 0x4FC8}, //213 #CJK UNIFIED IDEOGRAPH + {0x8257, 0x4FC9}, //214 #CJK UNIFIED IDEOGRAPH + {0x8258, 0x4FCB}, //215 #CJK UNIFIED IDEOGRAPH + {0x8259, 0x4FCC}, //216 #CJK UNIFIED IDEOGRAPH + {0x825A, 0x4FCD}, //217 #CJK UNIFIED IDEOGRAPH + {0x825B, 0x4FD2}, //218 #CJK UNIFIED IDEOGRAPH + {0x825C, 0x4FD3}, //219 #CJK UNIFIED IDEOGRAPH + {0x825D, 0x4FD4}, //220 #CJK UNIFIED IDEOGRAPH + {0x825E, 0x4FD5}, //221 #CJK UNIFIED IDEOGRAPH + {0x825F, 0x4FD6}, //222 #CJK UNIFIED IDEOGRAPH + {0x8260, 0x4FD9}, //223 #CJK UNIFIED IDEOGRAPH + {0x8261, 0x4FDB}, //224 #CJK UNIFIED IDEOGRAPH + {0x8262, 0x4FE0}, //225 #CJK UNIFIED IDEOGRAPH + {0x8263, 0x4FE2}, //226 #CJK UNIFIED IDEOGRAPH + {0x8264, 0x4FE4}, //227 #CJK UNIFIED IDEOGRAPH + {0x8265, 0x4FE5}, //228 #CJK UNIFIED IDEOGRAPH + {0x8266, 0x4FE7}, //229 #CJK UNIFIED IDEOGRAPH + {0x8267, 0x4FEB}, //230 #CJK UNIFIED IDEOGRAPH + {0x8268, 0x4FEC}, //231 #CJK UNIFIED IDEOGRAPH + {0x8269, 0x4FF0}, //232 #CJK UNIFIED IDEOGRAPH + {0x826A, 0x4FF2}, //233 #CJK UNIFIED IDEOGRAPH + {0x826B, 0x4FF4}, //234 #CJK UNIFIED IDEOGRAPH + {0x826C, 0x4FF5}, //235 #CJK UNIFIED IDEOGRAPH + {0x826D, 0x4FF6}, //236 #CJK UNIFIED IDEOGRAPH + {0x826E, 0x4FF7}, //237 #CJK UNIFIED IDEOGRAPH + {0x826F, 0x4FF9}, //238 #CJK UNIFIED IDEOGRAPH + {0x8270, 0x4FFB}, //239 #CJK UNIFIED IDEOGRAPH + {0x8271, 0x4FFC}, //240 #CJK UNIFIED IDEOGRAPH + {0x8272, 0x4FFD}, //241 #CJK UNIFIED IDEOGRAPH + {0x8273, 0x4FFF}, //242 #CJK UNIFIED IDEOGRAPH + {0x8274, 0x5000}, //243 #CJK UNIFIED IDEOGRAPH + {0x8275, 0x5001}, //244 #CJK UNIFIED IDEOGRAPH + {0x8276, 0x5002}, //245 #CJK UNIFIED IDEOGRAPH + {0x8277, 0x5003}, //246 #CJK UNIFIED IDEOGRAPH + {0x8278, 0x5004}, //247 #CJK UNIFIED IDEOGRAPH + {0x8279, 0x5005}, //248 #CJK UNIFIED IDEOGRAPH + {0x827A, 0x5006}, //249 #CJK UNIFIED IDEOGRAPH + {0x827B, 0x5007}, //250 #CJK UNIFIED IDEOGRAPH + {0x827C, 0x5008}, //251 #CJK UNIFIED IDEOGRAPH + {0x827D, 0x5009}, //252 #CJK UNIFIED IDEOGRAPH + {0x827E, 0x500A}, //253 #CJK UNIFIED IDEOGRAPH + {0x8280, 0x500B}, //254 #CJK UNIFIED IDEOGRAPH + {0x8281, 0x500E}, //255 #CJK UNIFIED IDEOGRAPH + {0x8282, 0x5010}, //256 #CJK UNIFIED IDEOGRAPH + {0x8283, 0x5011}, //257 #CJK UNIFIED IDEOGRAPH + {0x8284, 0x5013}, //258 #CJK UNIFIED IDEOGRAPH + {0x8285, 0x5015}, //259 #CJK UNIFIED IDEOGRAPH + {0x8286, 0x5016}, //260 #CJK UNIFIED IDEOGRAPH + {0x8287, 0x5017}, //261 #CJK UNIFIED IDEOGRAPH + {0x8288, 0x501B}, //262 #CJK UNIFIED IDEOGRAPH + {0x8289, 0x501D}, //263 #CJK UNIFIED IDEOGRAPH + {0x828A, 0x501E}, //264 #CJK UNIFIED IDEOGRAPH + {0x828B, 0x5020}, //265 #CJK UNIFIED IDEOGRAPH + {0x828C, 0x5022}, //266 #CJK UNIFIED IDEOGRAPH + {0x828D, 0x5023}, //267 #CJK UNIFIED IDEOGRAPH + {0x828E, 0x5024}, //268 #CJK UNIFIED IDEOGRAPH + {0x828F, 0x5027}, //269 #CJK UNIFIED IDEOGRAPH + {0x8290, 0x502B}, //270 #CJK UNIFIED IDEOGRAPH + {0x8291, 0x502F}, //271 #CJK UNIFIED IDEOGRAPH + {0x8292, 0x5030}, //272 #CJK UNIFIED IDEOGRAPH + {0x8293, 0x5031}, //273 #CJK UNIFIED IDEOGRAPH + {0x8294, 0x5032}, //274 #CJK UNIFIED IDEOGRAPH + {0x8295, 0x5033}, //275 #CJK UNIFIED IDEOGRAPH + {0x8296, 0x5034}, //276 #CJK UNIFIED IDEOGRAPH + {0x8297, 0x5035}, //277 #CJK UNIFIED IDEOGRAPH + {0x8298, 0x5036}, //278 #CJK UNIFIED IDEOGRAPH + {0x8299, 0x5037}, //279 #CJK UNIFIED IDEOGRAPH + {0x829A, 0x5038}, //280 #CJK UNIFIED IDEOGRAPH + {0x829B, 0x5039}, //281 #CJK UNIFIED IDEOGRAPH + {0x829C, 0x503B}, //282 #CJK UNIFIED IDEOGRAPH + {0x829D, 0x503D}, //283 #CJK UNIFIED IDEOGRAPH + {0x829E, 0x503F}, //284 #CJK UNIFIED IDEOGRAPH + {0x829F, 0x5040}, //285 #CJK UNIFIED IDEOGRAPH + {0x82A0, 0x5041}, //286 #CJK UNIFIED IDEOGRAPH + {0x82A1, 0x5042}, //287 #CJK UNIFIED IDEOGRAPH + {0x82A2, 0x5044}, //288 #CJK UNIFIED IDEOGRAPH + {0x82A3, 0x5045}, //289 #CJK UNIFIED IDEOGRAPH + {0x82A4, 0x5046}, //290 #CJK UNIFIED IDEOGRAPH + {0x82A5, 0x5049}, //291 #CJK UNIFIED IDEOGRAPH + {0x82A6, 0x504A}, //292 #CJK UNIFIED IDEOGRAPH + {0x82A7, 0x504B}, //293 #CJK UNIFIED IDEOGRAPH + {0x82A8, 0x504D}, //294 #CJK UNIFIED IDEOGRAPH + {0x82A9, 0x5050}, //295 #CJK UNIFIED IDEOGRAPH + {0x82AA, 0x5051}, //296 #CJK UNIFIED IDEOGRAPH + {0x82AB, 0x5052}, //297 #CJK UNIFIED IDEOGRAPH + {0x82AC, 0x5053}, //298 #CJK UNIFIED IDEOGRAPH + {0x82AD, 0x5054}, //299 #CJK UNIFIED IDEOGRAPH + {0x82AE, 0x5056}, //300 #CJK UNIFIED IDEOGRAPH + {0x82AF, 0x5057}, //301 #CJK UNIFIED IDEOGRAPH + {0x82B0, 0x5058}, //302 #CJK UNIFIED IDEOGRAPH + {0x82B1, 0x5059}, //303 #CJK UNIFIED IDEOGRAPH + {0x82B2, 0x505B}, //304 #CJK UNIFIED IDEOGRAPH + {0x82B3, 0x505D}, //305 #CJK UNIFIED IDEOGRAPH + {0x82B4, 0x505E}, //306 #CJK UNIFIED IDEOGRAPH + {0x82B5, 0x505F}, //307 #CJK UNIFIED IDEOGRAPH + {0x82B6, 0x5060}, //308 #CJK UNIFIED IDEOGRAPH + {0x82B7, 0x5061}, //309 #CJK UNIFIED IDEOGRAPH + {0x82B8, 0x5062}, //310 #CJK UNIFIED IDEOGRAPH + {0x82B9, 0x5063}, //311 #CJK UNIFIED IDEOGRAPH + {0x82BA, 0x5064}, //312 #CJK UNIFIED IDEOGRAPH + {0x82BB, 0x5066}, //313 #CJK UNIFIED IDEOGRAPH + {0x82BC, 0x5067}, //314 #CJK UNIFIED IDEOGRAPH + {0x82BD, 0x5068}, //315 #CJK UNIFIED IDEOGRAPH + {0x82BE, 0x5069}, //316 #CJK UNIFIED IDEOGRAPH + {0x82BF, 0x506A}, //317 #CJK UNIFIED IDEOGRAPH + {0x82C0, 0x506B}, //318 #CJK UNIFIED IDEOGRAPH + {0x82C1, 0x506D}, //319 #CJK UNIFIED IDEOGRAPH + {0x82C2, 0x506E}, //320 #CJK UNIFIED IDEOGRAPH + {0x82C3, 0x506F}, //321 #CJK UNIFIED IDEOGRAPH + {0x82C4, 0x5070}, //322 #CJK UNIFIED IDEOGRAPH + {0x82C5, 0x5071}, //323 #CJK UNIFIED IDEOGRAPH + {0x82C6, 0x5072}, //324 #CJK UNIFIED IDEOGRAPH + {0x82C7, 0x5073}, //325 #CJK UNIFIED IDEOGRAPH + {0x82C8, 0x5074}, //326 #CJK UNIFIED IDEOGRAPH + {0x82C9, 0x5075}, //327 #CJK UNIFIED IDEOGRAPH + {0x82CA, 0x5078}, //328 #CJK UNIFIED IDEOGRAPH + {0x82CB, 0x5079}, //329 #CJK UNIFIED IDEOGRAPH + {0x82CC, 0x507A}, //330 #CJK UNIFIED IDEOGRAPH + {0x82CD, 0x507C}, //331 #CJK UNIFIED IDEOGRAPH + {0x82CE, 0x507D}, //332 #CJK UNIFIED IDEOGRAPH + {0x82CF, 0x5081}, //333 #CJK UNIFIED IDEOGRAPH + {0x82D0, 0x5082}, //334 #CJK UNIFIED IDEOGRAPH + {0x82D1, 0x5083}, //335 #CJK UNIFIED IDEOGRAPH + {0x82D2, 0x5084}, //336 #CJK UNIFIED IDEOGRAPH + {0x82D3, 0x5086}, //337 #CJK UNIFIED IDEOGRAPH + {0x82D4, 0x5087}, //338 #CJK UNIFIED IDEOGRAPH + {0x82D5, 0x5089}, //339 #CJK UNIFIED IDEOGRAPH + {0x82D6, 0x508A}, //340 #CJK UNIFIED IDEOGRAPH + {0x82D7, 0x508B}, //341 #CJK UNIFIED IDEOGRAPH + {0x82D8, 0x508C}, //342 #CJK UNIFIED IDEOGRAPH + {0x82D9, 0x508E}, //343 #CJK UNIFIED IDEOGRAPH + {0x82DA, 0x508F}, //344 #CJK UNIFIED IDEOGRAPH + {0x82DB, 0x5090}, //345 #CJK UNIFIED IDEOGRAPH + {0x82DC, 0x5091}, //346 #CJK UNIFIED IDEOGRAPH + {0x82DD, 0x5092}, //347 #CJK UNIFIED IDEOGRAPH + {0x82DE, 0x5093}, //348 #CJK UNIFIED IDEOGRAPH + {0x82DF, 0x5094}, //349 #CJK UNIFIED IDEOGRAPH + {0x82E0, 0x5095}, //350 #CJK UNIFIED IDEOGRAPH + {0x82E1, 0x5096}, //351 #CJK UNIFIED IDEOGRAPH + {0x82E2, 0x5097}, //352 #CJK UNIFIED IDEOGRAPH + {0x82E3, 0x5098}, //353 #CJK UNIFIED IDEOGRAPH + {0x82E4, 0x5099}, //354 #CJK UNIFIED IDEOGRAPH + {0x82E5, 0x509A}, //355 #CJK UNIFIED IDEOGRAPH + {0x82E6, 0x509B}, //356 #CJK UNIFIED IDEOGRAPH + {0x82E7, 0x509C}, //357 #CJK UNIFIED IDEOGRAPH + {0x82E8, 0x509D}, //358 #CJK UNIFIED IDEOGRAPH + {0x82E9, 0x509E}, //359 #CJK UNIFIED IDEOGRAPH + {0x82EA, 0x509F}, //360 #CJK UNIFIED IDEOGRAPH + {0x82EB, 0x50A0}, //361 #CJK UNIFIED IDEOGRAPH + {0x82EC, 0x50A1}, //362 #CJK UNIFIED IDEOGRAPH + {0x82ED, 0x50A2}, //363 #CJK UNIFIED IDEOGRAPH + {0x82EE, 0x50A4}, //364 #CJK UNIFIED IDEOGRAPH + {0x82EF, 0x50A6}, //365 #CJK UNIFIED IDEOGRAPH + {0x82F0, 0x50AA}, //366 #CJK UNIFIED IDEOGRAPH + {0x82F1, 0x50AB}, //367 #CJK UNIFIED IDEOGRAPH + {0x82F2, 0x50AD}, //368 #CJK UNIFIED IDEOGRAPH + {0x82F3, 0x50AE}, //369 #CJK UNIFIED IDEOGRAPH + {0x82F4, 0x50AF}, //370 #CJK UNIFIED IDEOGRAPH + {0x82F5, 0x50B0}, //371 #CJK UNIFIED IDEOGRAPH + {0x82F6, 0x50B1}, //372 #CJK UNIFIED IDEOGRAPH + {0x82F7, 0x50B3}, //373 #CJK UNIFIED IDEOGRAPH + {0x82F8, 0x50B4}, //374 #CJK UNIFIED IDEOGRAPH + {0x82F9, 0x50B5}, //375 #CJK UNIFIED IDEOGRAPH + {0x82FA, 0x50B6}, //376 #CJK UNIFIED IDEOGRAPH + {0x82FB, 0x50B7}, //377 #CJK UNIFIED IDEOGRAPH + {0x82FC, 0x50B8}, //378 #CJK UNIFIED IDEOGRAPH + {0x82FD, 0x50B9}, //379 #CJK UNIFIED IDEOGRAPH + {0x82FE, 0x50BC}, //380 #CJK UNIFIED IDEOGRAPH + {0x8340, 0x50BD}, //381 #CJK UNIFIED IDEOGRAPH + {0x8341, 0x50BE}, //382 #CJK UNIFIED IDEOGRAPH + {0x8342, 0x50BF}, //383 #CJK UNIFIED IDEOGRAPH + {0x8343, 0x50C0}, //384 #CJK UNIFIED IDEOGRAPH + {0x8344, 0x50C1}, //385 #CJK UNIFIED IDEOGRAPH + {0x8345, 0x50C2}, //386 #CJK UNIFIED IDEOGRAPH + {0x8346, 0x50C3}, //387 #CJK UNIFIED IDEOGRAPH + {0x8347, 0x50C4}, //388 #CJK UNIFIED IDEOGRAPH + {0x8348, 0x50C5}, //389 #CJK UNIFIED IDEOGRAPH + {0x8349, 0x50C6}, //390 #CJK UNIFIED IDEOGRAPH + {0x834A, 0x50C7}, //391 #CJK UNIFIED IDEOGRAPH + {0x834B, 0x50C8}, //392 #CJK UNIFIED IDEOGRAPH + {0x834C, 0x50C9}, //393 #CJK UNIFIED IDEOGRAPH + {0x834D, 0x50CA}, //394 #CJK UNIFIED IDEOGRAPH + {0x834E, 0x50CB}, //395 #CJK UNIFIED IDEOGRAPH + {0x834F, 0x50CC}, //396 #CJK UNIFIED IDEOGRAPH + {0x8350, 0x50CD}, //397 #CJK UNIFIED IDEOGRAPH + {0x8351, 0x50CE}, //398 #CJK UNIFIED IDEOGRAPH + {0x8352, 0x50D0}, //399 #CJK UNIFIED IDEOGRAPH + {0x8353, 0x50D1}, //400 #CJK UNIFIED IDEOGRAPH + {0x8354, 0x50D2}, //401 #CJK UNIFIED IDEOGRAPH + {0x8355, 0x50D3}, //402 #CJK UNIFIED IDEOGRAPH + {0x8356, 0x50D4}, //403 #CJK UNIFIED IDEOGRAPH + {0x8357, 0x50D5}, //404 #CJK UNIFIED IDEOGRAPH + {0x8358, 0x50D7}, //405 #CJK UNIFIED IDEOGRAPH + {0x8359, 0x50D8}, //406 #CJK UNIFIED IDEOGRAPH + {0x835A, 0x50D9}, //407 #CJK UNIFIED IDEOGRAPH + {0x835B, 0x50DB}, //408 #CJK UNIFIED IDEOGRAPH + {0x835C, 0x50DC}, //409 #CJK UNIFIED IDEOGRAPH + {0x835D, 0x50DD}, //410 #CJK UNIFIED IDEOGRAPH + {0x835E, 0x50DE}, //411 #CJK UNIFIED IDEOGRAPH + {0x835F, 0x50DF}, //412 #CJK UNIFIED IDEOGRAPH + {0x8360, 0x50E0}, //413 #CJK UNIFIED IDEOGRAPH + {0x8361, 0x50E1}, //414 #CJK UNIFIED IDEOGRAPH + {0x8362, 0x50E2}, //415 #CJK UNIFIED IDEOGRAPH + {0x8363, 0x50E3}, //416 #CJK UNIFIED IDEOGRAPH + {0x8364, 0x50E4}, //417 #CJK UNIFIED IDEOGRAPH + {0x8365, 0x50E5}, //418 #CJK UNIFIED IDEOGRAPH + {0x8366, 0x50E8}, //419 #CJK UNIFIED IDEOGRAPH + {0x8367, 0x50E9}, //420 #CJK UNIFIED IDEOGRAPH + {0x8368, 0x50EA}, //421 #CJK UNIFIED IDEOGRAPH + {0x8369, 0x50EB}, //422 #CJK UNIFIED IDEOGRAPH + {0x836A, 0x50EF}, //423 #CJK UNIFIED IDEOGRAPH + {0x836B, 0x50F0}, //424 #CJK UNIFIED IDEOGRAPH + {0x836C, 0x50F1}, //425 #CJK UNIFIED IDEOGRAPH + {0x836D, 0x50F2}, //426 #CJK UNIFIED IDEOGRAPH + {0x836E, 0x50F4}, //427 #CJK UNIFIED IDEOGRAPH + {0x836F, 0x50F6}, //428 #CJK UNIFIED IDEOGRAPH + {0x8370, 0x50F7}, //429 #CJK UNIFIED IDEOGRAPH + {0x8371, 0x50F8}, //430 #CJK UNIFIED IDEOGRAPH + {0x8372, 0x50F9}, //431 #CJK UNIFIED IDEOGRAPH + {0x8373, 0x50FA}, //432 #CJK UNIFIED IDEOGRAPH + {0x8374, 0x50FC}, //433 #CJK UNIFIED IDEOGRAPH + {0x8375, 0x50FD}, //434 #CJK UNIFIED IDEOGRAPH + {0x8376, 0x50FE}, //435 #CJK UNIFIED IDEOGRAPH + {0x8377, 0x50FF}, //436 #CJK UNIFIED IDEOGRAPH + {0x8378, 0x5100}, //437 #CJK UNIFIED IDEOGRAPH + {0x8379, 0x5101}, //438 #CJK UNIFIED IDEOGRAPH + {0x837A, 0x5102}, //439 #CJK UNIFIED IDEOGRAPH + {0x837B, 0x5103}, //440 #CJK UNIFIED IDEOGRAPH + {0x837C, 0x5104}, //441 #CJK UNIFIED IDEOGRAPH + {0x837D, 0x5105}, //442 #CJK UNIFIED IDEOGRAPH + {0x837E, 0x5108}, //443 #CJK UNIFIED IDEOGRAPH + {0x8380, 0x5109}, //444 #CJK UNIFIED IDEOGRAPH + {0x8381, 0x510A}, //445 #CJK UNIFIED IDEOGRAPH + {0x8382, 0x510C}, //446 #CJK UNIFIED IDEOGRAPH + {0x8383, 0x510D}, //447 #CJK UNIFIED IDEOGRAPH + {0x8384, 0x510E}, //448 #CJK UNIFIED IDEOGRAPH + {0x8385, 0x510F}, //449 #CJK UNIFIED IDEOGRAPH + {0x8386, 0x5110}, //450 #CJK UNIFIED IDEOGRAPH + {0x8387, 0x5111}, //451 #CJK UNIFIED IDEOGRAPH + {0x8388, 0x5113}, //452 #CJK UNIFIED IDEOGRAPH + {0x8389, 0x5114}, //453 #CJK UNIFIED IDEOGRAPH + {0x838A, 0x5115}, //454 #CJK UNIFIED IDEOGRAPH + {0x838B, 0x5116}, //455 #CJK UNIFIED IDEOGRAPH + {0x838C, 0x5117}, //456 #CJK UNIFIED IDEOGRAPH + {0x838D, 0x5118}, //457 #CJK UNIFIED IDEOGRAPH + {0x838E, 0x5119}, //458 #CJK UNIFIED IDEOGRAPH + {0x838F, 0x511A}, //459 #CJK UNIFIED IDEOGRAPH + {0x8390, 0x511B}, //460 #CJK UNIFIED IDEOGRAPH + {0x8391, 0x511C}, //461 #CJK UNIFIED IDEOGRAPH + {0x8392, 0x511D}, //462 #CJK UNIFIED IDEOGRAPH + {0x8393, 0x511E}, //463 #CJK UNIFIED IDEOGRAPH + {0x8394, 0x511F}, //464 #CJK UNIFIED IDEOGRAPH + {0x8395, 0x5120}, //465 #CJK UNIFIED IDEOGRAPH + {0x8396, 0x5122}, //466 #CJK UNIFIED IDEOGRAPH + {0x8397, 0x5123}, //467 #CJK UNIFIED IDEOGRAPH + {0x8398, 0x5124}, //468 #CJK UNIFIED IDEOGRAPH + {0x8399, 0x5125}, //469 #CJK UNIFIED IDEOGRAPH + {0x839A, 0x5126}, //470 #CJK UNIFIED IDEOGRAPH + {0x839B, 0x5127}, //471 #CJK UNIFIED IDEOGRAPH + {0x839C, 0x5128}, //472 #CJK UNIFIED IDEOGRAPH + {0x839D, 0x5129}, //473 #CJK UNIFIED IDEOGRAPH + {0x839E, 0x512A}, //474 #CJK UNIFIED IDEOGRAPH + {0x839F, 0x512B}, //475 #CJK UNIFIED IDEOGRAPH + {0x83A0, 0x512C}, //476 #CJK UNIFIED IDEOGRAPH + {0x83A1, 0x512D}, //477 #CJK UNIFIED IDEOGRAPH + {0x83A2, 0x512E}, //478 #CJK UNIFIED IDEOGRAPH + {0x83A3, 0x512F}, //479 #CJK UNIFIED IDEOGRAPH + {0x83A4, 0x5130}, //480 #CJK UNIFIED IDEOGRAPH + {0x83A5, 0x5131}, //481 #CJK UNIFIED IDEOGRAPH + {0x83A6, 0x5132}, //482 #CJK UNIFIED IDEOGRAPH + {0x83A7, 0x5133}, //483 #CJK UNIFIED IDEOGRAPH + {0x83A8, 0x5134}, //484 #CJK UNIFIED IDEOGRAPH + {0x83A9, 0x5135}, //485 #CJK UNIFIED IDEOGRAPH + {0x83AA, 0x5136}, //486 #CJK UNIFIED IDEOGRAPH + {0x83AB, 0x5137}, //487 #CJK UNIFIED IDEOGRAPH + {0x83AC, 0x5138}, //488 #CJK UNIFIED IDEOGRAPH + {0x83AD, 0x5139}, //489 #CJK UNIFIED IDEOGRAPH + {0x83AE, 0x513A}, //490 #CJK UNIFIED IDEOGRAPH + {0x83AF, 0x513B}, //491 #CJK UNIFIED IDEOGRAPH + {0x83B0, 0x513C}, //492 #CJK UNIFIED IDEOGRAPH + {0x83B1, 0x513D}, //493 #CJK UNIFIED IDEOGRAPH + {0x83B2, 0x513E}, //494 #CJK UNIFIED IDEOGRAPH + {0x83B3, 0x5142}, //495 #CJK UNIFIED IDEOGRAPH + {0x83B4, 0x5147}, //496 #CJK UNIFIED IDEOGRAPH + {0x83B5, 0x514A}, //497 #CJK UNIFIED IDEOGRAPH + {0x83B6, 0x514C}, //498 #CJK UNIFIED IDEOGRAPH + {0x83B7, 0x514E}, //499 #CJK UNIFIED IDEOGRAPH + {0x83B8, 0x514F}, //500 #CJK UNIFIED IDEOGRAPH + {0x83B9, 0x5150}, //501 #CJK UNIFIED IDEOGRAPH + {0x83BA, 0x5152}, //502 #CJK UNIFIED IDEOGRAPH + {0x83BB, 0x5153}, //503 #CJK UNIFIED IDEOGRAPH + {0x83BC, 0x5157}, //504 #CJK UNIFIED IDEOGRAPH + {0x83BD, 0x5158}, //505 #CJK UNIFIED IDEOGRAPH + {0x83BE, 0x5159}, //506 #CJK UNIFIED IDEOGRAPH + {0x83BF, 0x515B}, //507 #CJK UNIFIED IDEOGRAPH + {0x83C0, 0x515D}, //508 #CJK UNIFIED IDEOGRAPH + {0x83C1, 0x515E}, //509 #CJK UNIFIED IDEOGRAPH + {0x83C2, 0x515F}, //510 #CJK UNIFIED IDEOGRAPH + {0x83C3, 0x5160}, //511 #CJK UNIFIED IDEOGRAPH + {0x83C4, 0x5161}, //512 #CJK UNIFIED IDEOGRAPH + {0x83C5, 0x5163}, //513 #CJK UNIFIED IDEOGRAPH + {0x83C6, 0x5164}, //514 #CJK UNIFIED IDEOGRAPH + {0x83C7, 0x5166}, //515 #CJK UNIFIED IDEOGRAPH + {0x83C8, 0x5167}, //516 #CJK UNIFIED IDEOGRAPH + {0x83C9, 0x5169}, //517 #CJK UNIFIED IDEOGRAPH + {0x83CA, 0x516A}, //518 #CJK UNIFIED IDEOGRAPH + {0x83CB, 0x516F}, //519 #CJK UNIFIED IDEOGRAPH + {0x83CC, 0x5172}, //520 #CJK UNIFIED IDEOGRAPH + {0x83CD, 0x517A}, //521 #CJK UNIFIED IDEOGRAPH + {0x83CE, 0x517E}, //522 #CJK UNIFIED IDEOGRAPH + {0x83CF, 0x517F}, //523 #CJK UNIFIED IDEOGRAPH + {0x83D0, 0x5183}, //524 #CJK UNIFIED IDEOGRAPH + {0x83D1, 0x5184}, //525 #CJK UNIFIED IDEOGRAPH + {0x83D2, 0x5186}, //526 #CJK UNIFIED IDEOGRAPH + {0x83D3, 0x5187}, //527 #CJK UNIFIED IDEOGRAPH + {0x83D4, 0x518A}, //528 #CJK UNIFIED IDEOGRAPH + {0x83D5, 0x518B}, //529 #CJK UNIFIED IDEOGRAPH + {0x83D6, 0x518E}, //530 #CJK UNIFIED IDEOGRAPH + {0x83D7, 0x518F}, //531 #CJK UNIFIED IDEOGRAPH + {0x83D8, 0x5190}, //532 #CJK UNIFIED IDEOGRAPH + {0x83D9, 0x5191}, //533 #CJK UNIFIED IDEOGRAPH + {0x83DA, 0x5193}, //534 #CJK UNIFIED IDEOGRAPH + {0x83DB, 0x5194}, //535 #CJK UNIFIED IDEOGRAPH + {0x83DC, 0x5198}, //536 #CJK UNIFIED IDEOGRAPH + {0x83DD, 0x519A}, //537 #CJK UNIFIED IDEOGRAPH + {0x83DE, 0x519D}, //538 #CJK UNIFIED IDEOGRAPH + {0x83DF, 0x519E}, //539 #CJK UNIFIED IDEOGRAPH + {0x83E0, 0x519F}, //540 #CJK UNIFIED IDEOGRAPH + {0x83E1, 0x51A1}, //541 #CJK UNIFIED IDEOGRAPH + {0x83E2, 0x51A3}, //542 #CJK UNIFIED IDEOGRAPH + {0x83E3, 0x51A6}, //543 #CJK UNIFIED IDEOGRAPH + {0x83E4, 0x51A7}, //544 #CJK UNIFIED IDEOGRAPH + {0x83E5, 0x51A8}, //545 #CJK UNIFIED IDEOGRAPH + {0x83E6, 0x51A9}, //546 #CJK UNIFIED IDEOGRAPH + {0x83E7, 0x51AA}, //547 #CJK UNIFIED IDEOGRAPH + {0x83E8, 0x51AD}, //548 #CJK UNIFIED IDEOGRAPH + {0x83E9, 0x51AE}, //549 #CJK UNIFIED IDEOGRAPH + {0x83EA, 0x51B4}, //550 #CJK UNIFIED IDEOGRAPH + {0x83EB, 0x51B8}, //551 #CJK UNIFIED IDEOGRAPH + {0x83EC, 0x51B9}, //552 #CJK UNIFIED IDEOGRAPH + {0x83ED, 0x51BA}, //553 #CJK UNIFIED IDEOGRAPH + {0x83EE, 0x51BE}, //554 #CJK UNIFIED IDEOGRAPH + {0x83EF, 0x51BF}, //555 #CJK UNIFIED IDEOGRAPH + {0x83F0, 0x51C1}, //556 #CJK UNIFIED IDEOGRAPH + {0x83F1, 0x51C2}, //557 #CJK UNIFIED IDEOGRAPH + {0x83F2, 0x51C3}, //558 #CJK UNIFIED IDEOGRAPH + {0x83F3, 0x51C5}, //559 #CJK UNIFIED IDEOGRAPH + {0x83F4, 0x51C8}, //560 #CJK UNIFIED IDEOGRAPH + {0x83F5, 0x51CA}, //561 #CJK UNIFIED IDEOGRAPH + {0x83F6, 0x51CD}, //562 #CJK UNIFIED IDEOGRAPH + {0x83F7, 0x51CE}, //563 #CJK UNIFIED IDEOGRAPH + {0x83F8, 0x51D0}, //564 #CJK UNIFIED IDEOGRAPH + {0x83F9, 0x51D2}, //565 #CJK UNIFIED IDEOGRAPH + {0x83FA, 0x51D3}, //566 #CJK UNIFIED IDEOGRAPH + {0x83FB, 0x51D4}, //567 #CJK UNIFIED IDEOGRAPH + {0x83FC, 0x51D5}, //568 #CJK UNIFIED IDEOGRAPH + {0x83FD, 0x51D6}, //569 #CJK UNIFIED IDEOGRAPH + {0x83FE, 0x51D7}, //570 #CJK UNIFIED IDEOGRAPH + {0x8440, 0x51D8}, //571 #CJK UNIFIED IDEOGRAPH + {0x8441, 0x51D9}, //572 #CJK UNIFIED IDEOGRAPH + {0x8442, 0x51DA}, //573 #CJK UNIFIED IDEOGRAPH + {0x8443, 0x51DC}, //574 #CJK UNIFIED IDEOGRAPH + {0x8444, 0x51DE}, //575 #CJK UNIFIED IDEOGRAPH + {0x8445, 0x51DF}, //576 #CJK UNIFIED IDEOGRAPH + {0x8446, 0x51E2}, //577 #CJK UNIFIED IDEOGRAPH + {0x8447, 0x51E3}, //578 #CJK UNIFIED IDEOGRAPH + {0x8448, 0x51E5}, //579 #CJK UNIFIED IDEOGRAPH + {0x8449, 0x51E6}, //580 #CJK UNIFIED IDEOGRAPH + {0x844A, 0x51E7}, //581 #CJK UNIFIED IDEOGRAPH + {0x844B, 0x51E8}, //582 #CJK UNIFIED IDEOGRAPH + {0x844C, 0x51E9}, //583 #CJK UNIFIED IDEOGRAPH + {0x844D, 0x51EA}, //584 #CJK UNIFIED IDEOGRAPH + {0x844E, 0x51EC}, //585 #CJK UNIFIED IDEOGRAPH + {0x844F, 0x51EE}, //586 #CJK UNIFIED IDEOGRAPH + {0x8450, 0x51F1}, //587 #CJK UNIFIED IDEOGRAPH + {0x8451, 0x51F2}, //588 #CJK UNIFIED IDEOGRAPH + {0x8452, 0x51F4}, //589 #CJK UNIFIED IDEOGRAPH + {0x8453, 0x51F7}, //590 #CJK UNIFIED IDEOGRAPH + {0x8454, 0x51FE}, //591 #CJK UNIFIED IDEOGRAPH + {0x8455, 0x5204}, //592 #CJK UNIFIED IDEOGRAPH + {0x8456, 0x5205}, //593 #CJK UNIFIED IDEOGRAPH + {0x8457, 0x5209}, //594 #CJK UNIFIED IDEOGRAPH + {0x8458, 0x520B}, //595 #CJK UNIFIED IDEOGRAPH + {0x8459, 0x520C}, //596 #CJK UNIFIED IDEOGRAPH + {0x845A, 0x520F}, //597 #CJK UNIFIED IDEOGRAPH + {0x845B, 0x5210}, //598 #CJK UNIFIED IDEOGRAPH + {0x845C, 0x5213}, //599 #CJK UNIFIED IDEOGRAPH + {0x845D, 0x5214}, //600 #CJK UNIFIED IDEOGRAPH + {0x845E, 0x5215}, //601 #CJK UNIFIED IDEOGRAPH + {0x845F, 0x521C}, //602 #CJK UNIFIED IDEOGRAPH + {0x8460, 0x521E}, //603 #CJK UNIFIED IDEOGRAPH + {0x8461, 0x521F}, //604 #CJK UNIFIED IDEOGRAPH + {0x8462, 0x5221}, //605 #CJK UNIFIED IDEOGRAPH + {0x8463, 0x5222}, //606 #CJK UNIFIED IDEOGRAPH + {0x8464, 0x5223}, //607 #CJK UNIFIED IDEOGRAPH + {0x8465, 0x5225}, //608 #CJK UNIFIED IDEOGRAPH + {0x8466, 0x5226}, //609 #CJK UNIFIED IDEOGRAPH + {0x8467, 0x5227}, //610 #CJK UNIFIED IDEOGRAPH + {0x8468, 0x522A}, //611 #CJK UNIFIED IDEOGRAPH + {0x8469, 0x522C}, //612 #CJK UNIFIED IDEOGRAPH + {0x846A, 0x522F}, //613 #CJK UNIFIED IDEOGRAPH + {0x846B, 0x5231}, //614 #CJK UNIFIED IDEOGRAPH + {0x846C, 0x5232}, //615 #CJK UNIFIED IDEOGRAPH + {0x846D, 0x5234}, //616 #CJK UNIFIED IDEOGRAPH + {0x846E, 0x5235}, //617 #CJK UNIFIED IDEOGRAPH + {0x846F, 0x523C}, //618 #CJK UNIFIED IDEOGRAPH + {0x8470, 0x523E}, //619 #CJK UNIFIED IDEOGRAPH + {0x8471, 0x5244}, //620 #CJK UNIFIED IDEOGRAPH + {0x8472, 0x5245}, //621 #CJK UNIFIED IDEOGRAPH + {0x8473, 0x5246}, //622 #CJK UNIFIED IDEOGRAPH + {0x8474, 0x5247}, //623 #CJK UNIFIED IDEOGRAPH + {0x8475, 0x5248}, //624 #CJK UNIFIED IDEOGRAPH + {0x8476, 0x5249}, //625 #CJK UNIFIED IDEOGRAPH + {0x8477, 0x524B}, //626 #CJK UNIFIED IDEOGRAPH + {0x8478, 0x524E}, //627 #CJK UNIFIED IDEOGRAPH + {0x8479, 0x524F}, //628 #CJK UNIFIED IDEOGRAPH + {0x847A, 0x5252}, //629 #CJK UNIFIED IDEOGRAPH + {0x847B, 0x5253}, //630 #CJK UNIFIED IDEOGRAPH + {0x847C, 0x5255}, //631 #CJK UNIFIED IDEOGRAPH + {0x847D, 0x5257}, //632 #CJK UNIFIED IDEOGRAPH + {0x847E, 0x5258}, //633 #CJK UNIFIED IDEOGRAPH + {0x8480, 0x5259}, //634 #CJK UNIFIED IDEOGRAPH + {0x8481, 0x525A}, //635 #CJK UNIFIED IDEOGRAPH + {0x8482, 0x525B}, //636 #CJK UNIFIED IDEOGRAPH + {0x8483, 0x525D}, //637 #CJK UNIFIED IDEOGRAPH + {0x8484, 0x525F}, //638 #CJK UNIFIED IDEOGRAPH + {0x8485, 0x5260}, //639 #CJK UNIFIED IDEOGRAPH + {0x8486, 0x5262}, //640 #CJK UNIFIED IDEOGRAPH + {0x8487, 0x5263}, //641 #CJK UNIFIED IDEOGRAPH + {0x8488, 0x5264}, //642 #CJK UNIFIED IDEOGRAPH + {0x8489, 0x5266}, //643 #CJK UNIFIED IDEOGRAPH + {0x848A, 0x5268}, //644 #CJK UNIFIED IDEOGRAPH + {0x848B, 0x526B}, //645 #CJK UNIFIED IDEOGRAPH + {0x848C, 0x526C}, //646 #CJK UNIFIED IDEOGRAPH + {0x848D, 0x526D}, //647 #CJK UNIFIED IDEOGRAPH + {0x848E, 0x526E}, //648 #CJK UNIFIED IDEOGRAPH + {0x848F, 0x5270}, //649 #CJK UNIFIED IDEOGRAPH + {0x8490, 0x5271}, //650 #CJK UNIFIED IDEOGRAPH + {0x8491, 0x5273}, //651 #CJK UNIFIED IDEOGRAPH + {0x8492, 0x5274}, //652 #CJK UNIFIED IDEOGRAPH + {0x8493, 0x5275}, //653 #CJK UNIFIED IDEOGRAPH + {0x8494, 0x5276}, //654 #CJK UNIFIED IDEOGRAPH + {0x8495, 0x5277}, //655 #CJK UNIFIED IDEOGRAPH + {0x8496, 0x5278}, //656 #CJK UNIFIED IDEOGRAPH + {0x8497, 0x5279}, //657 #CJK UNIFIED IDEOGRAPH + {0x8498, 0x527A}, //658 #CJK UNIFIED IDEOGRAPH + {0x8499, 0x527B}, //659 #CJK UNIFIED IDEOGRAPH + {0x849A, 0x527C}, //660 #CJK UNIFIED IDEOGRAPH + {0x849B, 0x527E}, //661 #CJK UNIFIED IDEOGRAPH + {0x849C, 0x5280}, //662 #CJK UNIFIED IDEOGRAPH + {0x849D, 0x5283}, //663 #CJK UNIFIED IDEOGRAPH + {0x849E, 0x5284}, //664 #CJK UNIFIED IDEOGRAPH + {0x849F, 0x5285}, //665 #CJK UNIFIED IDEOGRAPH + {0x84A0, 0x5286}, //666 #CJK UNIFIED IDEOGRAPH + {0x84A1, 0x5287}, //667 #CJK UNIFIED IDEOGRAPH + {0x84A2, 0x5289}, //668 #CJK UNIFIED IDEOGRAPH + {0x84A3, 0x528A}, //669 #CJK UNIFIED IDEOGRAPH + {0x84A4, 0x528B}, //670 #CJK UNIFIED IDEOGRAPH + {0x84A5, 0x528C}, //671 #CJK UNIFIED IDEOGRAPH + {0x84A6, 0x528D}, //672 #CJK UNIFIED IDEOGRAPH + {0x84A7, 0x528E}, //673 #CJK UNIFIED IDEOGRAPH + {0x84A8, 0x528F}, //674 #CJK UNIFIED IDEOGRAPH + {0x84A9, 0x5291}, //675 #CJK UNIFIED IDEOGRAPH + {0x84AA, 0x5292}, //676 #CJK UNIFIED IDEOGRAPH + {0x84AB, 0x5294}, //677 #CJK UNIFIED IDEOGRAPH + {0x84AC, 0x5295}, //678 #CJK UNIFIED IDEOGRAPH + {0x84AD, 0x5296}, //679 #CJK UNIFIED IDEOGRAPH + {0x84AE, 0x5297}, //680 #CJK UNIFIED IDEOGRAPH + {0x84AF, 0x5298}, //681 #CJK UNIFIED IDEOGRAPH + {0x84B0, 0x5299}, //682 #CJK UNIFIED IDEOGRAPH + {0x84B1, 0x529A}, //683 #CJK UNIFIED IDEOGRAPH + {0x84B2, 0x529C}, //684 #CJK UNIFIED IDEOGRAPH + {0x84B3, 0x52A4}, //685 #CJK UNIFIED IDEOGRAPH + {0x84B4, 0x52A5}, //686 #CJK UNIFIED IDEOGRAPH + {0x84B5, 0x52A6}, //687 #CJK UNIFIED IDEOGRAPH + {0x84B6, 0x52A7}, //688 #CJK UNIFIED IDEOGRAPH + {0x84B7, 0x52AE}, //689 #CJK UNIFIED IDEOGRAPH + {0x84B8, 0x52AF}, //690 #CJK UNIFIED IDEOGRAPH + {0x84B9, 0x52B0}, //691 #CJK UNIFIED IDEOGRAPH + {0x84BA, 0x52B4}, //692 #CJK UNIFIED IDEOGRAPH + {0x84BB, 0x52B5}, //693 #CJK UNIFIED IDEOGRAPH + {0x84BC, 0x52B6}, //694 #CJK UNIFIED IDEOGRAPH + {0x84BD, 0x52B7}, //695 #CJK UNIFIED IDEOGRAPH + {0x84BE, 0x52B8}, //696 #CJK UNIFIED IDEOGRAPH + {0x84BF, 0x52B9}, //697 #CJK UNIFIED IDEOGRAPH + {0x84C0, 0x52BA}, //698 #CJK UNIFIED IDEOGRAPH + {0x84C1, 0x52BB}, //699 #CJK UNIFIED IDEOGRAPH + {0x84C2, 0x52BC}, //700 #CJK UNIFIED IDEOGRAPH + {0x84C3, 0x52BD}, //701 #CJK UNIFIED IDEOGRAPH + {0x84C4, 0x52C0}, //702 #CJK UNIFIED IDEOGRAPH + {0x84C5, 0x52C1}, //703 #CJK UNIFIED IDEOGRAPH + {0x84C6, 0x52C2}, //704 #CJK UNIFIED IDEOGRAPH + {0x84C7, 0x52C4}, //705 #CJK UNIFIED IDEOGRAPH + {0x84C8, 0x52C5}, //706 #CJK UNIFIED IDEOGRAPH + {0x84C9, 0x52C6}, //707 #CJK UNIFIED IDEOGRAPH + {0x84CA, 0x52C8}, //708 #CJK UNIFIED IDEOGRAPH + {0x84CB, 0x52CA}, //709 #CJK UNIFIED IDEOGRAPH + {0x84CC, 0x52CC}, //710 #CJK UNIFIED IDEOGRAPH + {0x84CD, 0x52CD}, //711 #CJK UNIFIED IDEOGRAPH + {0x84CE, 0x52CE}, //712 #CJK UNIFIED IDEOGRAPH + {0x84CF, 0x52CF}, //713 #CJK UNIFIED IDEOGRAPH + {0x84D0, 0x52D1}, //714 #CJK UNIFIED IDEOGRAPH + {0x84D1, 0x52D3}, //715 #CJK UNIFIED IDEOGRAPH + {0x84D2, 0x52D4}, //716 #CJK UNIFIED IDEOGRAPH + {0x84D3, 0x52D5}, //717 #CJK UNIFIED IDEOGRAPH + {0x84D4, 0x52D7}, //718 #CJK UNIFIED IDEOGRAPH + {0x84D5, 0x52D9}, //719 #CJK UNIFIED IDEOGRAPH + {0x84D6, 0x52DA}, //720 #CJK UNIFIED IDEOGRAPH + {0x84D7, 0x52DB}, //721 #CJK UNIFIED IDEOGRAPH + {0x84D8, 0x52DC}, //722 #CJK UNIFIED IDEOGRAPH + {0x84D9, 0x52DD}, //723 #CJK UNIFIED IDEOGRAPH + {0x84DA, 0x52DE}, //724 #CJK UNIFIED IDEOGRAPH + {0x84DB, 0x52E0}, //725 #CJK UNIFIED IDEOGRAPH + {0x84DC, 0x52E1}, //726 #CJK UNIFIED IDEOGRAPH + {0x84DD, 0x52E2}, //727 #CJK UNIFIED IDEOGRAPH + {0x84DE, 0x52E3}, //728 #CJK UNIFIED IDEOGRAPH + {0x84DF, 0x52E5}, //729 #CJK UNIFIED IDEOGRAPH + {0x84E0, 0x52E6}, //730 #CJK UNIFIED IDEOGRAPH + {0x84E1, 0x52E7}, //731 #CJK UNIFIED IDEOGRAPH + {0x84E2, 0x52E8}, //732 #CJK UNIFIED IDEOGRAPH + {0x84E3, 0x52E9}, //733 #CJK UNIFIED IDEOGRAPH + {0x84E4, 0x52EA}, //734 #CJK UNIFIED IDEOGRAPH + {0x84E5, 0x52EB}, //735 #CJK UNIFIED IDEOGRAPH + {0x84E6, 0x52EC}, //736 #CJK UNIFIED IDEOGRAPH + {0x84E7, 0x52ED}, //737 #CJK UNIFIED IDEOGRAPH + {0x84E8, 0x52EE}, //738 #CJK UNIFIED IDEOGRAPH + {0x84E9, 0x52EF}, //739 #CJK UNIFIED IDEOGRAPH + {0x84EA, 0x52F1}, //740 #CJK UNIFIED IDEOGRAPH + {0x84EB, 0x52F2}, //741 #CJK UNIFIED IDEOGRAPH + {0x84EC, 0x52F3}, //742 #CJK UNIFIED IDEOGRAPH + {0x84ED, 0x52F4}, //743 #CJK UNIFIED IDEOGRAPH + {0x84EE, 0x52F5}, //744 #CJK UNIFIED IDEOGRAPH + {0x84EF, 0x52F6}, //745 #CJK UNIFIED IDEOGRAPH + {0x84F0, 0x52F7}, //746 #CJK UNIFIED IDEOGRAPH + {0x84F1, 0x52F8}, //747 #CJK UNIFIED IDEOGRAPH + {0x84F2, 0x52FB}, //748 #CJK UNIFIED IDEOGRAPH + {0x84F3, 0x52FC}, //749 #CJK UNIFIED IDEOGRAPH + {0x84F4, 0x52FD}, //750 #CJK UNIFIED IDEOGRAPH + {0x84F5, 0x5301}, //751 #CJK UNIFIED IDEOGRAPH + {0x84F6, 0x5302}, //752 #CJK UNIFIED IDEOGRAPH + {0x84F7, 0x5303}, //753 #CJK UNIFIED IDEOGRAPH + {0x84F8, 0x5304}, //754 #CJK UNIFIED IDEOGRAPH + {0x84F9, 0x5307}, //755 #CJK UNIFIED IDEOGRAPH + {0x84FA, 0x5309}, //756 #CJK UNIFIED IDEOGRAPH + {0x84FB, 0x530A}, //757 #CJK UNIFIED IDEOGRAPH + {0x84FC, 0x530B}, //758 #CJK UNIFIED IDEOGRAPH + {0x84FD, 0x530C}, //759 #CJK UNIFIED IDEOGRAPH + {0x84FE, 0x530E}, //760 #CJK UNIFIED IDEOGRAPH + {0x8540, 0x5311}, //761 #CJK UNIFIED IDEOGRAPH + {0x8541, 0x5312}, //762 #CJK UNIFIED IDEOGRAPH + {0x8542, 0x5313}, //763 #CJK UNIFIED IDEOGRAPH + {0x8543, 0x5314}, //764 #CJK UNIFIED IDEOGRAPH + {0x8544, 0x5318}, //765 #CJK UNIFIED IDEOGRAPH + {0x8545, 0x531B}, //766 #CJK UNIFIED IDEOGRAPH + {0x8546, 0x531C}, //767 #CJK UNIFIED IDEOGRAPH + {0x8547, 0x531E}, //768 #CJK UNIFIED IDEOGRAPH + {0x8548, 0x531F}, //769 #CJK UNIFIED IDEOGRAPH + {0x8549, 0x5322}, //770 #CJK UNIFIED IDEOGRAPH + {0x854A, 0x5324}, //771 #CJK UNIFIED IDEOGRAPH + {0x854B, 0x5325}, //772 #CJK UNIFIED IDEOGRAPH + {0x854C, 0x5327}, //773 #CJK UNIFIED IDEOGRAPH + {0x854D, 0x5328}, //774 #CJK UNIFIED IDEOGRAPH + {0x854E, 0x5329}, //775 #CJK UNIFIED IDEOGRAPH + {0x854F, 0x532B}, //776 #CJK UNIFIED IDEOGRAPH + {0x8550, 0x532C}, //777 #CJK UNIFIED IDEOGRAPH + {0x8551, 0x532D}, //778 #CJK UNIFIED IDEOGRAPH + {0x8552, 0x532F}, //779 #CJK UNIFIED IDEOGRAPH + {0x8553, 0x5330}, //780 #CJK UNIFIED IDEOGRAPH + {0x8554, 0x5331}, //781 #CJK UNIFIED IDEOGRAPH + {0x8555, 0x5332}, //782 #CJK UNIFIED IDEOGRAPH + {0x8556, 0x5333}, //783 #CJK UNIFIED IDEOGRAPH + {0x8557, 0x5334}, //784 #CJK UNIFIED IDEOGRAPH + {0x8558, 0x5335}, //785 #CJK UNIFIED IDEOGRAPH + {0x8559, 0x5336}, //786 #CJK UNIFIED IDEOGRAPH + {0x855A, 0x5337}, //787 #CJK UNIFIED IDEOGRAPH + {0x855B, 0x5338}, //788 #CJK UNIFIED IDEOGRAPH + {0x855C, 0x533C}, //789 #CJK UNIFIED IDEOGRAPH + {0x855D, 0x533D}, //790 #CJK UNIFIED IDEOGRAPH + {0x855E, 0x5340}, //791 #CJK UNIFIED IDEOGRAPH + {0x855F, 0x5342}, //792 #CJK UNIFIED IDEOGRAPH + {0x8560, 0x5344}, //793 #CJK UNIFIED IDEOGRAPH + {0x8561, 0x5346}, //794 #CJK UNIFIED IDEOGRAPH + {0x8562, 0x534B}, //795 #CJK UNIFIED IDEOGRAPH + {0x8563, 0x534C}, //796 #CJK UNIFIED IDEOGRAPH + {0x8564, 0x534D}, //797 #CJK UNIFIED IDEOGRAPH + {0x8565, 0x5350}, //798 #CJK UNIFIED IDEOGRAPH + {0x8566, 0x5354}, //799 #CJK UNIFIED IDEOGRAPH + {0x8567, 0x5358}, //800 #CJK UNIFIED IDEOGRAPH + {0x8568, 0x5359}, //801 #CJK UNIFIED IDEOGRAPH + {0x8569, 0x535B}, //802 #CJK UNIFIED IDEOGRAPH + {0x856A, 0x535D}, //803 #CJK UNIFIED IDEOGRAPH + {0x856B, 0x5365}, //804 #CJK UNIFIED IDEOGRAPH + {0x856C, 0x5368}, //805 #CJK UNIFIED IDEOGRAPH + {0x856D, 0x536A}, //806 #CJK UNIFIED IDEOGRAPH + {0x856E, 0x536C}, //807 #CJK UNIFIED IDEOGRAPH + {0x856F, 0x536D}, //808 #CJK UNIFIED IDEOGRAPH + {0x8570, 0x5372}, //809 #CJK UNIFIED IDEOGRAPH + {0x8571, 0x5376}, //810 #CJK UNIFIED IDEOGRAPH + {0x8572, 0x5379}, //811 #CJK UNIFIED IDEOGRAPH + {0x8573, 0x537B}, //812 #CJK UNIFIED IDEOGRAPH + {0x8574, 0x537C}, //813 #CJK UNIFIED IDEOGRAPH + {0x8575, 0x537D}, //814 #CJK UNIFIED IDEOGRAPH + {0x8576, 0x537E}, //815 #CJK UNIFIED IDEOGRAPH + {0x8577, 0x5380}, //816 #CJK UNIFIED IDEOGRAPH + {0x8578, 0x5381}, //817 #CJK UNIFIED IDEOGRAPH + {0x8579, 0x5383}, //818 #CJK UNIFIED IDEOGRAPH + {0x857A, 0x5387}, //819 #CJK UNIFIED IDEOGRAPH + {0x857B, 0x5388}, //820 #CJK UNIFIED IDEOGRAPH + {0x857C, 0x538A}, //821 #CJK UNIFIED IDEOGRAPH + {0x857D, 0x538E}, //822 #CJK UNIFIED IDEOGRAPH + {0x857E, 0x538F}, //823 #CJK UNIFIED IDEOGRAPH + {0x8580, 0x5390}, //824 #CJK UNIFIED IDEOGRAPH + {0x8581, 0x5391}, //825 #CJK UNIFIED IDEOGRAPH + {0x8582, 0x5392}, //826 #CJK UNIFIED IDEOGRAPH + {0x8583, 0x5393}, //827 #CJK UNIFIED IDEOGRAPH + {0x8584, 0x5394}, //828 #CJK UNIFIED IDEOGRAPH + {0x8585, 0x5396}, //829 #CJK UNIFIED IDEOGRAPH + {0x8586, 0x5397}, //830 #CJK UNIFIED IDEOGRAPH + {0x8587, 0x5399}, //831 #CJK UNIFIED IDEOGRAPH + {0x8588, 0x539B}, //832 #CJK UNIFIED IDEOGRAPH + {0x8589, 0x539C}, //833 #CJK UNIFIED IDEOGRAPH + {0x858A, 0x539E}, //834 #CJK UNIFIED IDEOGRAPH + {0x858B, 0x53A0}, //835 #CJK UNIFIED IDEOGRAPH + {0x858C, 0x53A1}, //836 #CJK UNIFIED IDEOGRAPH + {0x858D, 0x53A4}, //837 #CJK UNIFIED IDEOGRAPH + {0x858E, 0x53A7}, //838 #CJK UNIFIED IDEOGRAPH + {0x858F, 0x53AA}, //839 #CJK UNIFIED IDEOGRAPH + {0x8590, 0x53AB}, //840 #CJK UNIFIED IDEOGRAPH + {0x8591, 0x53AC}, //841 #CJK UNIFIED IDEOGRAPH + {0x8592, 0x53AD}, //842 #CJK UNIFIED IDEOGRAPH + {0x8593, 0x53AF}, //843 #CJK UNIFIED IDEOGRAPH + {0x8594, 0x53B0}, //844 #CJK UNIFIED IDEOGRAPH + {0x8595, 0x53B1}, //845 #CJK UNIFIED IDEOGRAPH + {0x8596, 0x53B2}, //846 #CJK UNIFIED IDEOGRAPH + {0x8597, 0x53B3}, //847 #CJK UNIFIED IDEOGRAPH + {0x8598, 0x53B4}, //848 #CJK UNIFIED IDEOGRAPH + {0x8599, 0x53B5}, //849 #CJK UNIFIED IDEOGRAPH + {0x859A, 0x53B7}, //850 #CJK UNIFIED IDEOGRAPH + {0x859B, 0x53B8}, //851 #CJK UNIFIED IDEOGRAPH + {0x859C, 0x53B9}, //852 #CJK UNIFIED IDEOGRAPH + {0x859D, 0x53BA}, //853 #CJK UNIFIED IDEOGRAPH + {0x859E, 0x53BC}, //854 #CJK UNIFIED IDEOGRAPH + {0x859F, 0x53BD}, //855 #CJK UNIFIED IDEOGRAPH + {0x85A0, 0x53BE}, //856 #CJK UNIFIED IDEOGRAPH + {0x85A1, 0x53C0}, //857 #CJK UNIFIED IDEOGRAPH + {0x85A2, 0x53C3}, //858 #CJK UNIFIED IDEOGRAPH + {0x85A3, 0x53C4}, //859 #CJK UNIFIED IDEOGRAPH + {0x85A4, 0x53C5}, //860 #CJK UNIFIED IDEOGRAPH + {0x85A5, 0x53C6}, //861 #CJK UNIFIED IDEOGRAPH + {0x85A6, 0x53C7}, //862 #CJK UNIFIED IDEOGRAPH + {0x85A7, 0x53CE}, //863 #CJK UNIFIED IDEOGRAPH + {0x85A8, 0x53CF}, //864 #CJK UNIFIED IDEOGRAPH + {0x85A9, 0x53D0}, //865 #CJK UNIFIED IDEOGRAPH + {0x85AA, 0x53D2}, //866 #CJK UNIFIED IDEOGRAPH + {0x85AB, 0x53D3}, //867 #CJK UNIFIED IDEOGRAPH + {0x85AC, 0x53D5}, //868 #CJK UNIFIED IDEOGRAPH + {0x85AD, 0x53DA}, //869 #CJK UNIFIED IDEOGRAPH + {0x85AE, 0x53DC}, //870 #CJK UNIFIED IDEOGRAPH + {0x85AF, 0x53DD}, //871 #CJK UNIFIED IDEOGRAPH + {0x85B0, 0x53DE}, //872 #CJK UNIFIED IDEOGRAPH + {0x85B1, 0x53E1}, //873 #CJK UNIFIED IDEOGRAPH + {0x85B2, 0x53E2}, //874 #CJK UNIFIED IDEOGRAPH + {0x85B3, 0x53E7}, //875 #CJK UNIFIED IDEOGRAPH + {0x85B4, 0x53F4}, //876 #CJK UNIFIED IDEOGRAPH + {0x85B5, 0x53FA}, //877 #CJK UNIFIED IDEOGRAPH + {0x85B6, 0x53FE}, //878 #CJK UNIFIED IDEOGRAPH + {0x85B7, 0x53FF}, //879 #CJK UNIFIED IDEOGRAPH + {0x85B8, 0x5400}, //880 #CJK UNIFIED IDEOGRAPH + {0x85B9, 0x5402}, //881 #CJK UNIFIED IDEOGRAPH + {0x85BA, 0x5405}, //882 #CJK UNIFIED IDEOGRAPH + {0x85BB, 0x5407}, //883 #CJK UNIFIED IDEOGRAPH + {0x85BC, 0x540B}, //884 #CJK UNIFIED IDEOGRAPH + {0x85BD, 0x5414}, //885 #CJK UNIFIED IDEOGRAPH + {0x85BE, 0x5418}, //886 #CJK UNIFIED IDEOGRAPH + {0x85BF, 0x5419}, //887 #CJK UNIFIED IDEOGRAPH + {0x85C0, 0x541A}, //888 #CJK UNIFIED IDEOGRAPH + {0x85C1, 0x541C}, //889 #CJK UNIFIED IDEOGRAPH + {0x85C2, 0x5422}, //890 #CJK UNIFIED IDEOGRAPH + {0x85C3, 0x5424}, //891 #CJK UNIFIED IDEOGRAPH + {0x85C4, 0x5425}, //892 #CJK UNIFIED IDEOGRAPH + {0x85C5, 0x542A}, //893 #CJK UNIFIED IDEOGRAPH + {0x85C6, 0x5430}, //894 #CJK UNIFIED IDEOGRAPH + {0x85C7, 0x5433}, //895 #CJK UNIFIED IDEOGRAPH + {0x85C8, 0x5436}, //896 #CJK UNIFIED IDEOGRAPH + {0x85C9, 0x5437}, //897 #CJK UNIFIED IDEOGRAPH + {0x85CA, 0x543A}, //898 #CJK UNIFIED IDEOGRAPH + {0x85CB, 0x543D}, //899 #CJK UNIFIED IDEOGRAPH + {0x85CC, 0x543F}, //900 #CJK UNIFIED IDEOGRAPH + {0x85CD, 0x5441}, //901 #CJK UNIFIED IDEOGRAPH + {0x85CE, 0x5442}, //902 #CJK UNIFIED IDEOGRAPH + {0x85CF, 0x5444}, //903 #CJK UNIFIED IDEOGRAPH + {0x85D0, 0x5445}, //904 #CJK UNIFIED IDEOGRAPH + {0x85D1, 0x5447}, //905 #CJK UNIFIED IDEOGRAPH + {0x85D2, 0x5449}, //906 #CJK UNIFIED IDEOGRAPH + {0x85D3, 0x544C}, //907 #CJK UNIFIED IDEOGRAPH + {0x85D4, 0x544D}, //908 #CJK UNIFIED IDEOGRAPH + {0x85D5, 0x544E}, //909 #CJK UNIFIED IDEOGRAPH + {0x85D6, 0x544F}, //910 #CJK UNIFIED IDEOGRAPH + {0x85D7, 0x5451}, //911 #CJK UNIFIED IDEOGRAPH + {0x85D8, 0x545A}, //912 #CJK UNIFIED IDEOGRAPH + {0x85D9, 0x545D}, //913 #CJK UNIFIED IDEOGRAPH + {0x85DA, 0x545E}, //914 #CJK UNIFIED IDEOGRAPH + {0x85DB, 0x545F}, //915 #CJK UNIFIED IDEOGRAPH + {0x85DC, 0x5460}, //916 #CJK UNIFIED IDEOGRAPH + {0x85DD, 0x5461}, //917 #CJK UNIFIED IDEOGRAPH + {0x85DE, 0x5463}, //918 #CJK UNIFIED IDEOGRAPH + {0x85DF, 0x5465}, //919 #CJK UNIFIED IDEOGRAPH + {0x85E0, 0x5467}, //920 #CJK UNIFIED IDEOGRAPH + {0x85E1, 0x5469}, //921 #CJK UNIFIED IDEOGRAPH + {0x85E2, 0x546A}, //922 #CJK UNIFIED IDEOGRAPH + {0x85E3, 0x546B}, //923 #CJK UNIFIED IDEOGRAPH + {0x85E4, 0x546C}, //924 #CJK UNIFIED IDEOGRAPH + {0x85E5, 0x546D}, //925 #CJK UNIFIED IDEOGRAPH + {0x85E6, 0x546E}, //926 #CJK UNIFIED IDEOGRAPH + {0x85E7, 0x546F}, //927 #CJK UNIFIED IDEOGRAPH + {0x85E8, 0x5470}, //928 #CJK UNIFIED IDEOGRAPH + {0x85E9, 0x5474}, //929 #CJK UNIFIED IDEOGRAPH + {0x85EA, 0x5479}, //930 #CJK UNIFIED IDEOGRAPH + {0x85EB, 0x547A}, //931 #CJK UNIFIED IDEOGRAPH + {0x85EC, 0x547E}, //932 #CJK UNIFIED IDEOGRAPH + {0x85ED, 0x547F}, //933 #CJK UNIFIED IDEOGRAPH + {0x85EE, 0x5481}, //934 #CJK UNIFIED IDEOGRAPH + {0x85EF, 0x5483}, //935 #CJK UNIFIED IDEOGRAPH + {0x85F0, 0x5485}, //936 #CJK UNIFIED IDEOGRAPH + {0x85F1, 0x5487}, //937 #CJK UNIFIED IDEOGRAPH + {0x85F2, 0x5488}, //938 #CJK UNIFIED IDEOGRAPH + {0x85F3, 0x5489}, //939 #CJK UNIFIED IDEOGRAPH + {0x85F4, 0x548A}, //940 #CJK UNIFIED IDEOGRAPH + {0x85F5, 0x548D}, //941 #CJK UNIFIED IDEOGRAPH + {0x85F6, 0x5491}, //942 #CJK UNIFIED IDEOGRAPH + {0x85F7, 0x5493}, //943 #CJK UNIFIED IDEOGRAPH + {0x85F8, 0x5497}, //944 #CJK UNIFIED IDEOGRAPH + {0x85F9, 0x5498}, //945 #CJK UNIFIED IDEOGRAPH + {0x85FA, 0x549C}, //946 #CJK UNIFIED IDEOGRAPH + {0x85FB, 0x549E}, //947 #CJK UNIFIED IDEOGRAPH + {0x85FC, 0x549F}, //948 #CJK UNIFIED IDEOGRAPH + {0x85FD, 0x54A0}, //949 #CJK UNIFIED IDEOGRAPH + {0x85FE, 0x54A1}, //950 #CJK UNIFIED IDEOGRAPH + {0x8640, 0x54A2}, //951 #CJK UNIFIED IDEOGRAPH + {0x8641, 0x54A5}, //952 #CJK UNIFIED IDEOGRAPH + {0x8642, 0x54AE}, //953 #CJK UNIFIED IDEOGRAPH + {0x8643, 0x54B0}, //954 #CJK UNIFIED IDEOGRAPH + {0x8644, 0x54B2}, //955 #CJK UNIFIED IDEOGRAPH + {0x8645, 0x54B5}, //956 #CJK UNIFIED IDEOGRAPH + {0x8646, 0x54B6}, //957 #CJK UNIFIED IDEOGRAPH + {0x8647, 0x54B7}, //958 #CJK UNIFIED IDEOGRAPH + {0x8648, 0x54B9}, //959 #CJK UNIFIED IDEOGRAPH + {0x8649, 0x54BA}, //960 #CJK UNIFIED IDEOGRAPH + {0x864A, 0x54BC}, //961 #CJK UNIFIED IDEOGRAPH + {0x864B, 0x54BE}, //962 #CJK UNIFIED IDEOGRAPH + {0x864C, 0x54C3}, //963 #CJK UNIFIED IDEOGRAPH + {0x864D, 0x54C5}, //964 #CJK UNIFIED IDEOGRAPH + {0x864E, 0x54CA}, //965 #CJK UNIFIED IDEOGRAPH + {0x864F, 0x54CB}, //966 #CJK UNIFIED IDEOGRAPH + {0x8650, 0x54D6}, //967 #CJK UNIFIED IDEOGRAPH + {0x8651, 0x54D8}, //968 #CJK UNIFIED IDEOGRAPH + {0x8652, 0x54DB}, //969 #CJK UNIFIED IDEOGRAPH + {0x8653, 0x54E0}, //970 #CJK UNIFIED IDEOGRAPH + {0x8654, 0x54E1}, //971 #CJK UNIFIED IDEOGRAPH + {0x8655, 0x54E2}, //972 #CJK UNIFIED IDEOGRAPH + {0x8656, 0x54E3}, //973 #CJK UNIFIED IDEOGRAPH + {0x8657, 0x54E4}, //974 #CJK UNIFIED IDEOGRAPH + {0x8658, 0x54EB}, //975 #CJK UNIFIED IDEOGRAPH + {0x8659, 0x54EC}, //976 #CJK UNIFIED IDEOGRAPH + {0x865A, 0x54EF}, //977 #CJK UNIFIED IDEOGRAPH + {0x865B, 0x54F0}, //978 #CJK UNIFIED IDEOGRAPH + {0x865C, 0x54F1}, //979 #CJK UNIFIED IDEOGRAPH + {0x865D, 0x54F4}, //980 #CJK UNIFIED IDEOGRAPH + {0x865E, 0x54F5}, //981 #CJK UNIFIED IDEOGRAPH + {0x865F, 0x54F6}, //982 #CJK UNIFIED IDEOGRAPH + {0x8660, 0x54F7}, //983 #CJK UNIFIED IDEOGRAPH + {0x8661, 0x54F8}, //984 #CJK UNIFIED IDEOGRAPH + {0x8662, 0x54F9}, //985 #CJK UNIFIED IDEOGRAPH + {0x8663, 0x54FB}, //986 #CJK UNIFIED IDEOGRAPH + {0x8664, 0x54FE}, //987 #CJK UNIFIED IDEOGRAPH + {0x8665, 0x5500}, //988 #CJK UNIFIED IDEOGRAPH + {0x8666, 0x5502}, //989 #CJK UNIFIED IDEOGRAPH + {0x8667, 0x5503}, //990 #CJK UNIFIED IDEOGRAPH + {0x8668, 0x5504}, //991 #CJK UNIFIED IDEOGRAPH + {0x8669, 0x5505}, //992 #CJK UNIFIED IDEOGRAPH + {0x866A, 0x5508}, //993 #CJK UNIFIED IDEOGRAPH + {0x866B, 0x550A}, //994 #CJK UNIFIED IDEOGRAPH + {0x866C, 0x550B}, //995 #CJK UNIFIED IDEOGRAPH + {0x866D, 0x550C}, //996 #CJK UNIFIED IDEOGRAPH + {0x866E, 0x550D}, //997 #CJK UNIFIED IDEOGRAPH + {0x866F, 0x550E}, //998 #CJK UNIFIED IDEOGRAPH + {0x8670, 0x5512}, //999 #CJK UNIFIED IDEOGRAPH + {0x8671, 0x5513}, //1000 #CJK UNIFIED IDEOGRAPH + {0x8672, 0x5515}, //1001 #CJK UNIFIED IDEOGRAPH + {0x8673, 0x5516}, //1002 #CJK UNIFIED IDEOGRAPH + {0x8674, 0x5517}, //1003 #CJK UNIFIED IDEOGRAPH + {0x8675, 0x5518}, //1004 #CJK UNIFIED IDEOGRAPH + {0x8676, 0x5519}, //1005 #CJK UNIFIED IDEOGRAPH + {0x8677, 0x551A}, //1006 #CJK UNIFIED IDEOGRAPH + {0x8678, 0x551C}, //1007 #CJK UNIFIED IDEOGRAPH + {0x8679, 0x551D}, //1008 #CJK UNIFIED IDEOGRAPH + {0x867A, 0x551E}, //1009 #CJK UNIFIED IDEOGRAPH + {0x867B, 0x551F}, //1010 #CJK UNIFIED IDEOGRAPH + {0x867C, 0x5521}, //1011 #CJK UNIFIED IDEOGRAPH + {0x867D, 0x5525}, //1012 #CJK UNIFIED IDEOGRAPH + {0x867E, 0x5526}, //1013 #CJK UNIFIED IDEOGRAPH + {0x8680, 0x5528}, //1014 #CJK UNIFIED IDEOGRAPH + {0x8681, 0x5529}, //1015 #CJK UNIFIED IDEOGRAPH + {0x8682, 0x552B}, //1016 #CJK UNIFIED IDEOGRAPH + {0x8683, 0x552D}, //1017 #CJK UNIFIED IDEOGRAPH + {0x8684, 0x5532}, //1018 #CJK UNIFIED IDEOGRAPH + {0x8685, 0x5534}, //1019 #CJK UNIFIED IDEOGRAPH + {0x8686, 0x5535}, //1020 #CJK UNIFIED IDEOGRAPH + {0x8687, 0x5536}, //1021 #CJK UNIFIED IDEOGRAPH + {0x8688, 0x5538}, //1022 #CJK UNIFIED IDEOGRAPH + {0x8689, 0x5539}, //1023 #CJK UNIFIED IDEOGRAPH + {0x868A, 0x553A}, //1024 #CJK UNIFIED IDEOGRAPH + {0x868B, 0x553B}, //1025 #CJK UNIFIED IDEOGRAPH + {0x868C, 0x553D}, //1026 #CJK UNIFIED IDEOGRAPH + {0x868D, 0x5540}, //1027 #CJK UNIFIED IDEOGRAPH + {0x868E, 0x5542}, //1028 #CJK UNIFIED IDEOGRAPH + {0x868F, 0x5545}, //1029 #CJK UNIFIED IDEOGRAPH + {0x8690, 0x5547}, //1030 #CJK UNIFIED IDEOGRAPH + {0x8691, 0x5548}, //1031 #CJK UNIFIED IDEOGRAPH + {0x8692, 0x554B}, //1032 #CJK UNIFIED IDEOGRAPH + {0x8693, 0x554C}, //1033 #CJK UNIFIED IDEOGRAPH + {0x8694, 0x554D}, //1034 #CJK UNIFIED IDEOGRAPH + {0x8695, 0x554E}, //1035 #CJK UNIFIED IDEOGRAPH + {0x8696, 0x554F}, //1036 #CJK UNIFIED IDEOGRAPH + {0x8697, 0x5551}, //1037 #CJK UNIFIED IDEOGRAPH + {0x8698, 0x5552}, //1038 #CJK UNIFIED IDEOGRAPH + {0x8699, 0x5553}, //1039 #CJK UNIFIED IDEOGRAPH + {0x869A, 0x5554}, //1040 #CJK UNIFIED IDEOGRAPH + {0x869B, 0x5557}, //1041 #CJK UNIFIED IDEOGRAPH + {0x869C, 0x5558}, //1042 #CJK UNIFIED IDEOGRAPH + {0x869D, 0x5559}, //1043 #CJK UNIFIED IDEOGRAPH + {0x869E, 0x555A}, //1044 #CJK UNIFIED IDEOGRAPH + {0x869F, 0x555B}, //1045 #CJK UNIFIED IDEOGRAPH + {0x86A0, 0x555D}, //1046 #CJK UNIFIED IDEOGRAPH + {0x86A1, 0x555E}, //1047 #CJK UNIFIED IDEOGRAPH + {0x86A2, 0x555F}, //1048 #CJK UNIFIED IDEOGRAPH + {0x86A3, 0x5560}, //1049 #CJK UNIFIED IDEOGRAPH + {0x86A4, 0x5562}, //1050 #CJK UNIFIED IDEOGRAPH + {0x86A5, 0x5563}, //1051 #CJK UNIFIED IDEOGRAPH + {0x86A6, 0x5568}, //1052 #CJK UNIFIED IDEOGRAPH + {0x86A7, 0x5569}, //1053 #CJK UNIFIED IDEOGRAPH + {0x86A8, 0x556B}, //1054 #CJK UNIFIED IDEOGRAPH + {0x86A9, 0x556F}, //1055 #CJK UNIFIED IDEOGRAPH + {0x86AA, 0x5570}, //1056 #CJK UNIFIED IDEOGRAPH + {0x86AB, 0x5571}, //1057 #CJK UNIFIED IDEOGRAPH + {0x86AC, 0x5572}, //1058 #CJK UNIFIED IDEOGRAPH + {0x86AD, 0x5573}, //1059 #CJK UNIFIED IDEOGRAPH + {0x86AE, 0x5574}, //1060 #CJK UNIFIED IDEOGRAPH + {0x86AF, 0x5579}, //1061 #CJK UNIFIED IDEOGRAPH + {0x86B0, 0x557A}, //1062 #CJK UNIFIED IDEOGRAPH + {0x86B1, 0x557D}, //1063 #CJK UNIFIED IDEOGRAPH + {0x86B2, 0x557F}, //1064 #CJK UNIFIED IDEOGRAPH + {0x86B3, 0x5585}, //1065 #CJK UNIFIED IDEOGRAPH + {0x86B4, 0x5586}, //1066 #CJK UNIFIED IDEOGRAPH + {0x86B5, 0x558C}, //1067 #CJK UNIFIED IDEOGRAPH + {0x86B6, 0x558D}, //1068 #CJK UNIFIED IDEOGRAPH + {0x86B7, 0x558E}, //1069 #CJK UNIFIED IDEOGRAPH + {0x86B8, 0x5590}, //1070 #CJK UNIFIED IDEOGRAPH + {0x86B9, 0x5592}, //1071 #CJK UNIFIED IDEOGRAPH + {0x86BA, 0x5593}, //1072 #CJK UNIFIED IDEOGRAPH + {0x86BB, 0x5595}, //1073 #CJK UNIFIED IDEOGRAPH + {0x86BC, 0x5596}, //1074 #CJK UNIFIED IDEOGRAPH + {0x86BD, 0x5597}, //1075 #CJK UNIFIED IDEOGRAPH + {0x86BE, 0x559A}, //1076 #CJK UNIFIED IDEOGRAPH + {0x86BF, 0x559B}, //1077 #CJK UNIFIED IDEOGRAPH + {0x86C0, 0x559E}, //1078 #CJK UNIFIED IDEOGRAPH + {0x86C1, 0x55A0}, //1079 #CJK UNIFIED IDEOGRAPH + {0x86C2, 0x55A1}, //1080 #CJK UNIFIED IDEOGRAPH + {0x86C3, 0x55A2}, //1081 #CJK UNIFIED IDEOGRAPH + {0x86C4, 0x55A3}, //1082 #CJK UNIFIED IDEOGRAPH + {0x86C5, 0x55A4}, //1083 #CJK UNIFIED IDEOGRAPH + {0x86C6, 0x55A5}, //1084 #CJK UNIFIED IDEOGRAPH + {0x86C7, 0x55A6}, //1085 #CJK UNIFIED IDEOGRAPH + {0x86C8, 0x55A8}, //1086 #CJK UNIFIED IDEOGRAPH + {0x86C9, 0x55A9}, //1087 #CJK UNIFIED IDEOGRAPH + {0x86CA, 0x55AA}, //1088 #CJK UNIFIED IDEOGRAPH + {0x86CB, 0x55AB}, //1089 #CJK UNIFIED IDEOGRAPH + {0x86CC, 0x55AC}, //1090 #CJK UNIFIED IDEOGRAPH + {0x86CD, 0x55AD}, //1091 #CJK UNIFIED IDEOGRAPH + {0x86CE, 0x55AE}, //1092 #CJK UNIFIED IDEOGRAPH + {0x86CF, 0x55AF}, //1093 #CJK UNIFIED IDEOGRAPH + {0x86D0, 0x55B0}, //1094 #CJK UNIFIED IDEOGRAPH + {0x86D1, 0x55B2}, //1095 #CJK UNIFIED IDEOGRAPH + {0x86D2, 0x55B4}, //1096 #CJK UNIFIED IDEOGRAPH + {0x86D3, 0x55B6}, //1097 #CJK UNIFIED IDEOGRAPH + {0x86D4, 0x55B8}, //1098 #CJK UNIFIED IDEOGRAPH + {0x86D5, 0x55BA}, //1099 #CJK UNIFIED IDEOGRAPH + {0x86D6, 0x55BC}, //1100 #CJK UNIFIED IDEOGRAPH + {0x86D7, 0x55BF}, //1101 #CJK UNIFIED IDEOGRAPH + {0x86D8, 0x55C0}, //1102 #CJK UNIFIED IDEOGRAPH + {0x86D9, 0x55C1}, //1103 #CJK UNIFIED IDEOGRAPH + {0x86DA, 0x55C2}, //1104 #CJK UNIFIED IDEOGRAPH + {0x86DB, 0x55C3}, //1105 #CJK UNIFIED IDEOGRAPH + {0x86DC, 0x55C6}, //1106 #CJK UNIFIED IDEOGRAPH + {0x86DD, 0x55C7}, //1107 #CJK UNIFIED IDEOGRAPH + {0x86DE, 0x55C8}, //1108 #CJK UNIFIED IDEOGRAPH + {0x86DF, 0x55CA}, //1109 #CJK UNIFIED IDEOGRAPH + {0x86E0, 0x55CB}, //1110 #CJK UNIFIED IDEOGRAPH + {0x86E1, 0x55CE}, //1111 #CJK UNIFIED IDEOGRAPH + {0x86E2, 0x55CF}, //1112 #CJK UNIFIED IDEOGRAPH + {0x86E3, 0x55D0}, //1113 #CJK UNIFIED IDEOGRAPH + {0x86E4, 0x55D5}, //1114 #CJK UNIFIED IDEOGRAPH + {0x86E5, 0x55D7}, //1115 #CJK UNIFIED IDEOGRAPH + {0x86E6, 0x55D8}, //1116 #CJK UNIFIED IDEOGRAPH + {0x86E7, 0x55D9}, //1117 #CJK UNIFIED IDEOGRAPH + {0x86E8, 0x55DA}, //1118 #CJK UNIFIED IDEOGRAPH + {0x86E9, 0x55DB}, //1119 #CJK UNIFIED IDEOGRAPH + {0x86EA, 0x55DE}, //1120 #CJK UNIFIED IDEOGRAPH + {0x86EB, 0x55E0}, //1121 #CJK UNIFIED IDEOGRAPH + {0x86EC, 0x55E2}, //1122 #CJK UNIFIED IDEOGRAPH + {0x86ED, 0x55E7}, //1123 #CJK UNIFIED IDEOGRAPH + {0x86EE, 0x55E9}, //1124 #CJK UNIFIED IDEOGRAPH + {0x86EF, 0x55ED}, //1125 #CJK UNIFIED IDEOGRAPH + {0x86F0, 0x55EE}, //1126 #CJK UNIFIED IDEOGRAPH + {0x86F1, 0x55F0}, //1127 #CJK UNIFIED IDEOGRAPH + {0x86F2, 0x55F1}, //1128 #CJK UNIFIED IDEOGRAPH + {0x86F3, 0x55F4}, //1129 #CJK UNIFIED IDEOGRAPH + {0x86F4, 0x55F6}, //1130 #CJK UNIFIED IDEOGRAPH + {0x86F5, 0x55F8}, //1131 #CJK UNIFIED IDEOGRAPH + {0x86F6, 0x55F9}, //1132 #CJK UNIFIED IDEOGRAPH + {0x86F7, 0x55FA}, //1133 #CJK UNIFIED IDEOGRAPH + {0x86F8, 0x55FB}, //1134 #CJK UNIFIED IDEOGRAPH + {0x86F9, 0x55FC}, //1135 #CJK UNIFIED IDEOGRAPH + {0x86FA, 0x55FF}, //1136 #CJK UNIFIED IDEOGRAPH + {0x86FB, 0x5602}, //1137 #CJK UNIFIED IDEOGRAPH + {0x86FC, 0x5603}, //1138 #CJK UNIFIED IDEOGRAPH + {0x86FD, 0x5604}, //1139 #CJK UNIFIED IDEOGRAPH + {0x86FE, 0x5605}, //1140 #CJK UNIFIED IDEOGRAPH + {0x8740, 0x5606}, //1141 #CJK UNIFIED IDEOGRAPH + {0x8741, 0x5607}, //1142 #CJK UNIFIED IDEOGRAPH + {0x8742, 0x560A}, //1143 #CJK UNIFIED IDEOGRAPH + {0x8743, 0x560B}, //1144 #CJK UNIFIED IDEOGRAPH + {0x8744, 0x560D}, //1145 #CJK UNIFIED IDEOGRAPH + {0x8745, 0x5610}, //1146 #CJK UNIFIED IDEOGRAPH + {0x8746, 0x5611}, //1147 #CJK UNIFIED IDEOGRAPH + {0x8747, 0x5612}, //1148 #CJK UNIFIED IDEOGRAPH + {0x8748, 0x5613}, //1149 #CJK UNIFIED IDEOGRAPH + {0x8749, 0x5614}, //1150 #CJK UNIFIED IDEOGRAPH + {0x874A, 0x5615}, //1151 #CJK UNIFIED IDEOGRAPH + {0x874B, 0x5616}, //1152 #CJK UNIFIED IDEOGRAPH + {0x874C, 0x5617}, //1153 #CJK UNIFIED IDEOGRAPH + {0x874D, 0x5619}, //1154 #CJK UNIFIED IDEOGRAPH + {0x874E, 0x561A}, //1155 #CJK UNIFIED IDEOGRAPH + {0x874F, 0x561C}, //1156 #CJK UNIFIED IDEOGRAPH + {0x8750, 0x561D}, //1157 #CJK UNIFIED IDEOGRAPH + {0x8751, 0x5620}, //1158 #CJK UNIFIED IDEOGRAPH + {0x8752, 0x5621}, //1159 #CJK UNIFIED IDEOGRAPH + {0x8753, 0x5622}, //1160 #CJK UNIFIED IDEOGRAPH + {0x8754, 0x5625}, //1161 #CJK UNIFIED IDEOGRAPH + {0x8755, 0x5626}, //1162 #CJK UNIFIED IDEOGRAPH + {0x8756, 0x5628}, //1163 #CJK UNIFIED IDEOGRAPH + {0x8757, 0x5629}, //1164 #CJK UNIFIED IDEOGRAPH + {0x8758, 0x562A}, //1165 #CJK UNIFIED IDEOGRAPH + {0x8759, 0x562B}, //1166 #CJK UNIFIED IDEOGRAPH + {0x875A, 0x562E}, //1167 #CJK UNIFIED IDEOGRAPH + {0x875B, 0x562F}, //1168 #CJK UNIFIED IDEOGRAPH + {0x875C, 0x5630}, //1169 #CJK UNIFIED IDEOGRAPH + {0x875D, 0x5633}, //1170 #CJK UNIFIED IDEOGRAPH + {0x875E, 0x5635}, //1171 #CJK UNIFIED IDEOGRAPH + {0x875F, 0x5637}, //1172 #CJK UNIFIED IDEOGRAPH + {0x8760, 0x5638}, //1173 #CJK UNIFIED IDEOGRAPH + {0x8761, 0x563A}, //1174 #CJK UNIFIED IDEOGRAPH + {0x8762, 0x563C}, //1175 #CJK UNIFIED IDEOGRAPH + {0x8763, 0x563D}, //1176 #CJK UNIFIED IDEOGRAPH + {0x8764, 0x563E}, //1177 #CJK UNIFIED IDEOGRAPH + {0x8765, 0x5640}, //1178 #CJK UNIFIED IDEOGRAPH + {0x8766, 0x5641}, //1179 #CJK UNIFIED IDEOGRAPH + {0x8767, 0x5642}, //1180 #CJK UNIFIED IDEOGRAPH + {0x8768, 0x5643}, //1181 #CJK UNIFIED IDEOGRAPH + {0x8769, 0x5644}, //1182 #CJK UNIFIED IDEOGRAPH + {0x876A, 0x5645}, //1183 #CJK UNIFIED IDEOGRAPH + {0x876B, 0x5646}, //1184 #CJK UNIFIED IDEOGRAPH + {0x876C, 0x5647}, //1185 #CJK UNIFIED IDEOGRAPH + {0x876D, 0x5648}, //1186 #CJK UNIFIED IDEOGRAPH + {0x876E, 0x5649}, //1187 #CJK UNIFIED IDEOGRAPH + {0x876F, 0x564A}, //1188 #CJK UNIFIED IDEOGRAPH + {0x8770, 0x564B}, //1189 #CJK UNIFIED IDEOGRAPH + {0x8771, 0x564F}, //1190 #CJK UNIFIED IDEOGRAPH + {0x8772, 0x5650}, //1191 #CJK UNIFIED IDEOGRAPH + {0x8773, 0x5651}, //1192 #CJK UNIFIED IDEOGRAPH + {0x8774, 0x5652}, //1193 #CJK UNIFIED IDEOGRAPH + {0x8775, 0x5653}, //1194 #CJK UNIFIED IDEOGRAPH + {0x8776, 0x5655}, //1195 #CJK UNIFIED IDEOGRAPH + {0x8777, 0x5656}, //1196 #CJK UNIFIED IDEOGRAPH + {0x8778, 0x565A}, //1197 #CJK UNIFIED IDEOGRAPH + {0x8779, 0x565B}, //1198 #CJK UNIFIED IDEOGRAPH + {0x877A, 0x565D}, //1199 #CJK UNIFIED IDEOGRAPH + {0x877B, 0x565E}, //1200 #CJK UNIFIED IDEOGRAPH + {0x877C, 0x565F}, //1201 #CJK UNIFIED IDEOGRAPH + {0x877D, 0x5660}, //1202 #CJK UNIFIED IDEOGRAPH + {0x877E, 0x5661}, //1203 #CJK UNIFIED IDEOGRAPH + {0x8780, 0x5663}, //1204 #CJK UNIFIED IDEOGRAPH + {0x8781, 0x5665}, //1205 #CJK UNIFIED IDEOGRAPH + {0x8782, 0x5666}, //1206 #CJK UNIFIED IDEOGRAPH + {0x8783, 0x5667}, //1207 #CJK UNIFIED IDEOGRAPH + {0x8784, 0x566D}, //1208 #CJK UNIFIED IDEOGRAPH + {0x8785, 0x566E}, //1209 #CJK UNIFIED IDEOGRAPH + {0x8786, 0x566F}, //1210 #CJK UNIFIED IDEOGRAPH + {0x8787, 0x5670}, //1211 #CJK UNIFIED IDEOGRAPH + {0x8788, 0x5672}, //1212 #CJK UNIFIED IDEOGRAPH + {0x8789, 0x5673}, //1213 #CJK UNIFIED IDEOGRAPH + {0x878A, 0x5674}, //1214 #CJK UNIFIED IDEOGRAPH + {0x878B, 0x5675}, //1215 #CJK UNIFIED IDEOGRAPH + {0x878C, 0x5677}, //1216 #CJK UNIFIED IDEOGRAPH + {0x878D, 0x5678}, //1217 #CJK UNIFIED IDEOGRAPH + {0x878E, 0x5679}, //1218 #CJK UNIFIED IDEOGRAPH + {0x878F, 0x567A}, //1219 #CJK UNIFIED IDEOGRAPH + {0x8790, 0x567D}, //1220 #CJK UNIFIED IDEOGRAPH + {0x8791, 0x567E}, //1221 #CJK UNIFIED IDEOGRAPH + {0x8792, 0x567F}, //1222 #CJK UNIFIED IDEOGRAPH + {0x8793, 0x5680}, //1223 #CJK UNIFIED IDEOGRAPH + {0x8794, 0x5681}, //1224 #CJK UNIFIED IDEOGRAPH + {0x8795, 0x5682}, //1225 #CJK UNIFIED IDEOGRAPH + {0x8796, 0x5683}, //1226 #CJK UNIFIED IDEOGRAPH + {0x8797, 0x5684}, //1227 #CJK UNIFIED IDEOGRAPH + {0x8798, 0x5687}, //1228 #CJK UNIFIED IDEOGRAPH + {0x8799, 0x5688}, //1229 #CJK UNIFIED IDEOGRAPH + {0x879A, 0x5689}, //1230 #CJK UNIFIED IDEOGRAPH + {0x879B, 0x568A}, //1231 #CJK UNIFIED IDEOGRAPH + {0x879C, 0x568B}, //1232 #CJK UNIFIED IDEOGRAPH + {0x879D, 0x568C}, //1233 #CJK UNIFIED IDEOGRAPH + {0x879E, 0x568D}, //1234 #CJK UNIFIED IDEOGRAPH + {0x879F, 0x5690}, //1235 #CJK UNIFIED IDEOGRAPH + {0x87A0, 0x5691}, //1236 #CJK UNIFIED IDEOGRAPH + {0x87A1, 0x5692}, //1237 #CJK UNIFIED IDEOGRAPH + {0x87A2, 0x5694}, //1238 #CJK UNIFIED IDEOGRAPH + {0x87A3, 0x5695}, //1239 #CJK UNIFIED IDEOGRAPH + {0x87A4, 0x5696}, //1240 #CJK UNIFIED IDEOGRAPH + {0x87A5, 0x5697}, //1241 #CJK UNIFIED IDEOGRAPH + {0x87A6, 0x5698}, //1242 #CJK UNIFIED IDEOGRAPH + {0x87A7, 0x5699}, //1243 #CJK UNIFIED IDEOGRAPH + {0x87A8, 0x569A}, //1244 #CJK UNIFIED IDEOGRAPH + {0x87A9, 0x569B}, //1245 #CJK UNIFIED IDEOGRAPH + {0x87AA, 0x569C}, //1246 #CJK UNIFIED IDEOGRAPH + {0x87AB, 0x569D}, //1247 #CJK UNIFIED IDEOGRAPH + {0x87AC, 0x569E}, //1248 #CJK UNIFIED IDEOGRAPH + {0x87AD, 0x569F}, //1249 #CJK UNIFIED IDEOGRAPH + {0x87AE, 0x56A0}, //1250 #CJK UNIFIED IDEOGRAPH + {0x87AF, 0x56A1}, //1251 #CJK UNIFIED IDEOGRAPH + {0x87B0, 0x56A2}, //1252 #CJK UNIFIED IDEOGRAPH + {0x87B1, 0x56A4}, //1253 #CJK UNIFIED IDEOGRAPH + {0x87B2, 0x56A5}, //1254 #CJK UNIFIED IDEOGRAPH + {0x87B3, 0x56A6}, //1255 #CJK UNIFIED IDEOGRAPH + {0x87B4, 0x56A7}, //1256 #CJK UNIFIED IDEOGRAPH + {0x87B5, 0x56A8}, //1257 #CJK UNIFIED IDEOGRAPH + {0x87B6, 0x56A9}, //1258 #CJK UNIFIED IDEOGRAPH + {0x87B7, 0x56AA}, //1259 #CJK UNIFIED IDEOGRAPH + {0x87B8, 0x56AB}, //1260 #CJK UNIFIED IDEOGRAPH + {0x87B9, 0x56AC}, //1261 #CJK UNIFIED IDEOGRAPH + {0x87BA, 0x56AD}, //1262 #CJK UNIFIED IDEOGRAPH + {0x87BB, 0x56AE}, //1263 #CJK UNIFIED IDEOGRAPH + {0x87BC, 0x56B0}, //1264 #CJK UNIFIED IDEOGRAPH + {0x87BD, 0x56B1}, //1265 #CJK UNIFIED IDEOGRAPH + {0x87BE, 0x56B2}, //1266 #CJK UNIFIED IDEOGRAPH + {0x87BF, 0x56B3}, //1267 #CJK UNIFIED IDEOGRAPH + {0x87C0, 0x56B4}, //1268 #CJK UNIFIED IDEOGRAPH + {0x87C1, 0x56B5}, //1269 #CJK UNIFIED IDEOGRAPH + {0x87C2, 0x56B6}, //1270 #CJK UNIFIED IDEOGRAPH + {0x87C3, 0x56B8}, //1271 #CJK UNIFIED IDEOGRAPH + {0x87C4, 0x56B9}, //1272 #CJK UNIFIED IDEOGRAPH + {0x87C5, 0x56BA}, //1273 #CJK UNIFIED IDEOGRAPH + {0x87C6, 0x56BB}, //1274 #CJK UNIFIED IDEOGRAPH + {0x87C7, 0x56BD}, //1275 #CJK UNIFIED IDEOGRAPH + {0x87C8, 0x56BE}, //1276 #CJK UNIFIED IDEOGRAPH + {0x87C9, 0x56BF}, //1277 #CJK UNIFIED IDEOGRAPH + {0x87CA, 0x56C0}, //1278 #CJK UNIFIED IDEOGRAPH + {0x87CB, 0x56C1}, //1279 #CJK UNIFIED IDEOGRAPH + {0x87CC, 0x56C2}, //1280 #CJK UNIFIED IDEOGRAPH + {0x87CD, 0x56C3}, //1281 #CJK UNIFIED IDEOGRAPH + {0x87CE, 0x56C4}, //1282 #CJK UNIFIED IDEOGRAPH + {0x87CF, 0x56C5}, //1283 #CJK UNIFIED IDEOGRAPH + {0x87D0, 0x56C6}, //1284 #CJK UNIFIED IDEOGRAPH + {0x87D1, 0x56C7}, //1285 #CJK UNIFIED IDEOGRAPH + {0x87D2, 0x56C8}, //1286 #CJK UNIFIED IDEOGRAPH + {0x87D3, 0x56C9}, //1287 #CJK UNIFIED IDEOGRAPH + {0x87D4, 0x56CB}, //1288 #CJK UNIFIED IDEOGRAPH + {0x87D5, 0x56CC}, //1289 #CJK UNIFIED IDEOGRAPH + {0x87D6, 0x56CD}, //1290 #CJK UNIFIED IDEOGRAPH + {0x87D7, 0x56CE}, //1291 #CJK UNIFIED IDEOGRAPH + {0x87D8, 0x56CF}, //1292 #CJK UNIFIED IDEOGRAPH + {0x87D9, 0x56D0}, //1293 #CJK UNIFIED IDEOGRAPH + {0x87DA, 0x56D1}, //1294 #CJK UNIFIED IDEOGRAPH + {0x87DB, 0x56D2}, //1295 #CJK UNIFIED IDEOGRAPH + {0x87DC, 0x56D3}, //1296 #CJK UNIFIED IDEOGRAPH + {0x87DD, 0x56D5}, //1297 #CJK UNIFIED IDEOGRAPH + {0x87DE, 0x56D6}, //1298 #CJK UNIFIED IDEOGRAPH + {0x87DF, 0x56D8}, //1299 #CJK UNIFIED IDEOGRAPH + {0x87E0, 0x56D9}, //1300 #CJK UNIFIED IDEOGRAPH + {0x87E1, 0x56DC}, //1301 #CJK UNIFIED IDEOGRAPH + {0x87E2, 0x56E3}, //1302 #CJK UNIFIED IDEOGRAPH + {0x87E3, 0x56E5}, //1303 #CJK UNIFIED IDEOGRAPH + {0x87E4, 0x56E6}, //1304 #CJK UNIFIED IDEOGRAPH + {0x87E5, 0x56E7}, //1305 #CJK UNIFIED IDEOGRAPH + {0x87E6, 0x56E8}, //1306 #CJK UNIFIED IDEOGRAPH + {0x87E7, 0x56E9}, //1307 #CJK UNIFIED IDEOGRAPH + {0x87E8, 0x56EA}, //1308 #CJK UNIFIED IDEOGRAPH + {0x87E9, 0x56EC}, //1309 #CJK UNIFIED IDEOGRAPH + {0x87EA, 0x56EE}, //1310 #CJK UNIFIED IDEOGRAPH + {0x87EB, 0x56EF}, //1311 #CJK UNIFIED IDEOGRAPH + {0x87EC, 0x56F2}, //1312 #CJK UNIFIED IDEOGRAPH + {0x87ED, 0x56F3}, //1313 #CJK UNIFIED IDEOGRAPH + {0x87EE, 0x56F6}, //1314 #CJK UNIFIED IDEOGRAPH + {0x87EF, 0x56F7}, //1315 #CJK UNIFIED IDEOGRAPH + {0x87F0, 0x56F8}, //1316 #CJK UNIFIED IDEOGRAPH + {0x87F1, 0x56FB}, //1317 #CJK UNIFIED IDEOGRAPH + {0x87F2, 0x56FC}, //1318 #CJK UNIFIED IDEOGRAPH + {0x87F3, 0x5700}, //1319 #CJK UNIFIED IDEOGRAPH + {0x87F4, 0x5701}, //1320 #CJK UNIFIED IDEOGRAPH + {0x87F5, 0x5702}, //1321 #CJK UNIFIED IDEOGRAPH + {0x87F6, 0x5705}, //1322 #CJK UNIFIED IDEOGRAPH + {0x87F7, 0x5707}, //1323 #CJK UNIFIED IDEOGRAPH + {0x87F8, 0x570B}, //1324 #CJK UNIFIED IDEOGRAPH + {0x87F9, 0x570C}, //1325 #CJK UNIFIED IDEOGRAPH + {0x87FA, 0x570D}, //1326 #CJK UNIFIED IDEOGRAPH + {0x87FB, 0x570E}, //1327 #CJK UNIFIED IDEOGRAPH + {0x87FC, 0x570F}, //1328 #CJK UNIFIED IDEOGRAPH + {0x87FD, 0x5710}, //1329 #CJK UNIFIED IDEOGRAPH + {0x87FE, 0x5711}, //1330 #CJK UNIFIED IDEOGRAPH + {0x8840, 0x5712}, //1331 #CJK UNIFIED IDEOGRAPH + {0x8841, 0x5713}, //1332 #CJK UNIFIED IDEOGRAPH + {0x8842, 0x5714}, //1333 #CJK UNIFIED IDEOGRAPH + {0x8843, 0x5715}, //1334 #CJK UNIFIED IDEOGRAPH + {0x8844, 0x5716}, //1335 #CJK UNIFIED IDEOGRAPH + {0x8845, 0x5717}, //1336 #CJK UNIFIED IDEOGRAPH + {0x8846, 0x5718}, //1337 #CJK UNIFIED IDEOGRAPH + {0x8847, 0x5719}, //1338 #CJK UNIFIED IDEOGRAPH + {0x8848, 0x571A}, //1339 #CJK UNIFIED IDEOGRAPH + {0x8849, 0x571B}, //1340 #CJK UNIFIED IDEOGRAPH + {0x884A, 0x571D}, //1341 #CJK UNIFIED IDEOGRAPH + {0x884B, 0x571E}, //1342 #CJK UNIFIED IDEOGRAPH + {0x884C, 0x5720}, //1343 #CJK UNIFIED IDEOGRAPH + {0x884D, 0x5721}, //1344 #CJK UNIFIED IDEOGRAPH + {0x884E, 0x5722}, //1345 #CJK UNIFIED IDEOGRAPH + {0x884F, 0x5724}, //1346 #CJK UNIFIED IDEOGRAPH + {0x8850, 0x5725}, //1347 #CJK UNIFIED IDEOGRAPH + {0x8851, 0x5726}, //1348 #CJK UNIFIED IDEOGRAPH + {0x8852, 0x5727}, //1349 #CJK UNIFIED IDEOGRAPH + {0x8853, 0x572B}, //1350 #CJK UNIFIED IDEOGRAPH + {0x8854, 0x5731}, //1351 #CJK UNIFIED IDEOGRAPH + {0x8855, 0x5732}, //1352 #CJK UNIFIED IDEOGRAPH + {0x8856, 0x5734}, //1353 #CJK UNIFIED IDEOGRAPH + {0x8857, 0x5735}, //1354 #CJK UNIFIED IDEOGRAPH + {0x8858, 0x5736}, //1355 #CJK UNIFIED IDEOGRAPH + {0x8859, 0x5737}, //1356 #CJK UNIFIED IDEOGRAPH + {0x885A, 0x5738}, //1357 #CJK UNIFIED IDEOGRAPH + {0x885B, 0x573C}, //1358 #CJK UNIFIED IDEOGRAPH + {0x885C, 0x573D}, //1359 #CJK UNIFIED IDEOGRAPH + {0x885D, 0x573F}, //1360 #CJK UNIFIED IDEOGRAPH + {0x885E, 0x5741}, //1361 #CJK UNIFIED IDEOGRAPH + {0x885F, 0x5743}, //1362 #CJK UNIFIED IDEOGRAPH + {0x8860, 0x5744}, //1363 #CJK UNIFIED IDEOGRAPH + {0x8861, 0x5745}, //1364 #CJK UNIFIED IDEOGRAPH + {0x8862, 0x5746}, //1365 #CJK UNIFIED IDEOGRAPH + {0x8863, 0x5748}, //1366 #CJK UNIFIED IDEOGRAPH + {0x8864, 0x5749}, //1367 #CJK UNIFIED IDEOGRAPH + {0x8865, 0x574B}, //1368 #CJK UNIFIED IDEOGRAPH + {0x8866, 0x5752}, //1369 #CJK UNIFIED IDEOGRAPH + {0x8867, 0x5753}, //1370 #CJK UNIFIED IDEOGRAPH + {0x8868, 0x5754}, //1371 #CJK UNIFIED IDEOGRAPH + {0x8869, 0x5755}, //1372 #CJK UNIFIED IDEOGRAPH + {0x886A, 0x5756}, //1373 #CJK UNIFIED IDEOGRAPH + {0x886B, 0x5758}, //1374 #CJK UNIFIED IDEOGRAPH + {0x886C, 0x5759}, //1375 #CJK UNIFIED IDEOGRAPH + {0x886D, 0x5762}, //1376 #CJK UNIFIED IDEOGRAPH + {0x886E, 0x5763}, //1377 #CJK UNIFIED IDEOGRAPH + {0x886F, 0x5765}, //1378 #CJK UNIFIED IDEOGRAPH + {0x8870, 0x5767}, //1379 #CJK UNIFIED IDEOGRAPH + {0x8871, 0x576C}, //1380 #CJK UNIFIED IDEOGRAPH + {0x8872, 0x576E}, //1381 #CJK UNIFIED IDEOGRAPH + {0x8873, 0x5770}, //1382 #CJK UNIFIED IDEOGRAPH + {0x8874, 0x5771}, //1383 #CJK UNIFIED IDEOGRAPH + {0x8875, 0x5772}, //1384 #CJK UNIFIED IDEOGRAPH + {0x8876, 0x5774}, //1385 #CJK UNIFIED IDEOGRAPH + {0x8877, 0x5775}, //1386 #CJK UNIFIED IDEOGRAPH + {0x8878, 0x5778}, //1387 #CJK UNIFIED IDEOGRAPH + {0x8879, 0x5779}, //1388 #CJK UNIFIED IDEOGRAPH + {0x887A, 0x577A}, //1389 #CJK UNIFIED IDEOGRAPH + {0x887B, 0x577D}, //1390 #CJK UNIFIED IDEOGRAPH + {0x887C, 0x577E}, //1391 #CJK UNIFIED IDEOGRAPH + {0x887D, 0x577F}, //1392 #CJK UNIFIED IDEOGRAPH + {0x887E, 0x5780}, //1393 #CJK UNIFIED IDEOGRAPH + {0x8880, 0x5781}, //1394 #CJK UNIFIED IDEOGRAPH + {0x8881, 0x5787}, //1395 #CJK UNIFIED IDEOGRAPH + {0x8882, 0x5788}, //1396 #CJK UNIFIED IDEOGRAPH + {0x8883, 0x5789}, //1397 #CJK UNIFIED IDEOGRAPH + {0x8884, 0x578A}, //1398 #CJK UNIFIED IDEOGRAPH + {0x8885, 0x578D}, //1399 #CJK UNIFIED IDEOGRAPH + {0x8886, 0x578E}, //1400 #CJK UNIFIED IDEOGRAPH + {0x8887, 0x578F}, //1401 #CJK UNIFIED IDEOGRAPH + {0x8888, 0x5790}, //1402 #CJK UNIFIED IDEOGRAPH + {0x8889, 0x5791}, //1403 #CJK UNIFIED IDEOGRAPH + {0x888A, 0x5794}, //1404 #CJK UNIFIED IDEOGRAPH + {0x888B, 0x5795}, //1405 #CJK UNIFIED IDEOGRAPH + {0x888C, 0x5796}, //1406 #CJK UNIFIED IDEOGRAPH + {0x888D, 0x5797}, //1407 #CJK UNIFIED IDEOGRAPH + {0x888E, 0x5798}, //1408 #CJK UNIFIED IDEOGRAPH + {0x888F, 0x5799}, //1409 #CJK UNIFIED IDEOGRAPH + {0x8890, 0x579A}, //1410 #CJK UNIFIED IDEOGRAPH + {0x8891, 0x579C}, //1411 #CJK UNIFIED IDEOGRAPH + {0x8892, 0x579D}, //1412 #CJK UNIFIED IDEOGRAPH + {0x8893, 0x579E}, //1413 #CJK UNIFIED IDEOGRAPH + {0x8894, 0x579F}, //1414 #CJK UNIFIED IDEOGRAPH + {0x8895, 0x57A5}, //1415 #CJK UNIFIED IDEOGRAPH + {0x8896, 0x57A8}, //1416 #CJK UNIFIED IDEOGRAPH + {0x8897, 0x57AA}, //1417 #CJK UNIFIED IDEOGRAPH + {0x8898, 0x57AC}, //1418 #CJK UNIFIED IDEOGRAPH + {0x8899, 0x57AF}, //1419 #CJK UNIFIED IDEOGRAPH + {0x889A, 0x57B0}, //1420 #CJK UNIFIED IDEOGRAPH + {0x889B, 0x57B1}, //1421 #CJK UNIFIED IDEOGRAPH + {0x889C, 0x57B3}, //1422 #CJK UNIFIED IDEOGRAPH + {0x889D, 0x57B5}, //1423 #CJK UNIFIED IDEOGRAPH + {0x889E, 0x57B6}, //1424 #CJK UNIFIED IDEOGRAPH + {0x889F, 0x57B7}, //1425 #CJK UNIFIED IDEOGRAPH + {0x88A0, 0x57B9}, //1426 #CJK UNIFIED IDEOGRAPH + {0x88A1, 0x57BA}, //1427 #CJK UNIFIED IDEOGRAPH + {0x88A2, 0x57BB}, //1428 #CJK UNIFIED IDEOGRAPH + {0x88A3, 0x57BC}, //1429 #CJK UNIFIED IDEOGRAPH + {0x88A4, 0x57BD}, //1430 #CJK UNIFIED IDEOGRAPH + {0x88A5, 0x57BE}, //1431 #CJK UNIFIED IDEOGRAPH + {0x88A6, 0x57BF}, //1432 #CJK UNIFIED IDEOGRAPH + {0x88A7, 0x57C0}, //1433 #CJK UNIFIED IDEOGRAPH + {0x88A8, 0x57C1}, //1434 #CJK UNIFIED IDEOGRAPH + {0x88A9, 0x57C4}, //1435 #CJK UNIFIED IDEOGRAPH + {0x88AA, 0x57C5}, //1436 #CJK UNIFIED IDEOGRAPH + {0x88AB, 0x57C6}, //1437 #CJK UNIFIED IDEOGRAPH + {0x88AC, 0x57C7}, //1438 #CJK UNIFIED IDEOGRAPH + {0x88AD, 0x57C8}, //1439 #CJK UNIFIED IDEOGRAPH + {0x88AE, 0x57C9}, //1440 #CJK UNIFIED IDEOGRAPH + {0x88AF, 0x57CA}, //1441 #CJK UNIFIED IDEOGRAPH + {0x88B0, 0x57CC}, //1442 #CJK UNIFIED IDEOGRAPH + {0x88B1, 0x57CD}, //1443 #CJK UNIFIED IDEOGRAPH + {0x88B2, 0x57D0}, //1444 #CJK UNIFIED IDEOGRAPH + {0x88B3, 0x57D1}, //1445 #CJK UNIFIED IDEOGRAPH + {0x88B4, 0x57D3}, //1446 #CJK UNIFIED IDEOGRAPH + {0x88B5, 0x57D6}, //1447 #CJK UNIFIED IDEOGRAPH + {0x88B6, 0x57D7}, //1448 #CJK UNIFIED IDEOGRAPH + {0x88B7, 0x57DB}, //1449 #CJK UNIFIED IDEOGRAPH + {0x88B8, 0x57DC}, //1450 #CJK UNIFIED IDEOGRAPH + {0x88B9, 0x57DE}, //1451 #CJK UNIFIED IDEOGRAPH + {0x88BA, 0x57E1}, //1452 #CJK UNIFIED IDEOGRAPH + {0x88BB, 0x57E2}, //1453 #CJK UNIFIED IDEOGRAPH + {0x88BC, 0x57E3}, //1454 #CJK UNIFIED IDEOGRAPH + {0x88BD, 0x57E5}, //1455 #CJK UNIFIED IDEOGRAPH + {0x88BE, 0x57E6}, //1456 #CJK UNIFIED IDEOGRAPH + {0x88BF, 0x57E7}, //1457 #CJK UNIFIED IDEOGRAPH + {0x88C0, 0x57E8}, //1458 #CJK UNIFIED IDEOGRAPH + {0x88C1, 0x57E9}, //1459 #CJK UNIFIED IDEOGRAPH + {0x88C2, 0x57EA}, //1460 #CJK UNIFIED IDEOGRAPH + {0x88C3, 0x57EB}, //1461 #CJK UNIFIED IDEOGRAPH + {0x88C4, 0x57EC}, //1462 #CJK UNIFIED IDEOGRAPH + {0x88C5, 0x57EE}, //1463 #CJK UNIFIED IDEOGRAPH + {0x88C6, 0x57F0}, //1464 #CJK UNIFIED IDEOGRAPH + {0x88C7, 0x57F1}, //1465 #CJK UNIFIED IDEOGRAPH + {0x88C8, 0x57F2}, //1466 #CJK UNIFIED IDEOGRAPH + {0x88C9, 0x57F3}, //1467 #CJK UNIFIED IDEOGRAPH + {0x88CA, 0x57F5}, //1468 #CJK UNIFIED IDEOGRAPH + {0x88CB, 0x57F6}, //1469 #CJK UNIFIED IDEOGRAPH + {0x88CC, 0x57F7}, //1470 #CJK UNIFIED IDEOGRAPH + {0x88CD, 0x57FB}, //1471 #CJK UNIFIED IDEOGRAPH + {0x88CE, 0x57FC}, //1472 #CJK UNIFIED IDEOGRAPH + {0x88CF, 0x57FE}, //1473 #CJK UNIFIED IDEOGRAPH + {0x88D0, 0x57FF}, //1474 #CJK UNIFIED IDEOGRAPH + {0x88D1, 0x5801}, //1475 #CJK UNIFIED IDEOGRAPH + {0x88D2, 0x5803}, //1476 #CJK UNIFIED IDEOGRAPH + {0x88D3, 0x5804}, //1477 #CJK UNIFIED IDEOGRAPH + {0x88D4, 0x5805}, //1478 #CJK UNIFIED IDEOGRAPH + {0x88D5, 0x5808}, //1479 #CJK UNIFIED IDEOGRAPH + {0x88D6, 0x5809}, //1480 #CJK UNIFIED IDEOGRAPH + {0x88D7, 0x580A}, //1481 #CJK UNIFIED IDEOGRAPH + {0x88D8, 0x580C}, //1482 #CJK UNIFIED IDEOGRAPH + {0x88D9, 0x580E}, //1483 #CJK UNIFIED IDEOGRAPH + {0x88DA, 0x580F}, //1484 #CJK UNIFIED IDEOGRAPH + {0x88DB, 0x5810}, //1485 #CJK UNIFIED IDEOGRAPH + {0x88DC, 0x5812}, //1486 #CJK UNIFIED IDEOGRAPH + {0x88DD, 0x5813}, //1487 #CJK UNIFIED IDEOGRAPH + {0x88DE, 0x5814}, //1488 #CJK UNIFIED IDEOGRAPH + {0x88DF, 0x5816}, //1489 #CJK UNIFIED IDEOGRAPH + {0x88E0, 0x5817}, //1490 #CJK UNIFIED IDEOGRAPH + {0x88E1, 0x5818}, //1491 #CJK UNIFIED IDEOGRAPH + {0x88E2, 0x581A}, //1492 #CJK UNIFIED IDEOGRAPH + {0x88E3, 0x581B}, //1493 #CJK UNIFIED IDEOGRAPH + {0x88E4, 0x581C}, //1494 #CJK UNIFIED IDEOGRAPH + {0x88E5, 0x581D}, //1495 #CJK UNIFIED IDEOGRAPH + {0x88E6, 0x581F}, //1496 #CJK UNIFIED IDEOGRAPH + {0x88E7, 0x5822}, //1497 #CJK UNIFIED IDEOGRAPH + {0x88E8, 0x5823}, //1498 #CJK UNIFIED IDEOGRAPH + {0x88E9, 0x5825}, //1499 #CJK UNIFIED IDEOGRAPH + {0x88EA, 0x5826}, //1500 #CJK UNIFIED IDEOGRAPH + {0x88EB, 0x5827}, //1501 #CJK UNIFIED IDEOGRAPH + {0x88EC, 0x5828}, //1502 #CJK UNIFIED IDEOGRAPH + {0x88ED, 0x5829}, //1503 #CJK UNIFIED IDEOGRAPH + {0x88EE, 0x582B}, //1504 #CJK UNIFIED IDEOGRAPH + {0x88EF, 0x582C}, //1505 #CJK UNIFIED IDEOGRAPH + {0x88F0, 0x582D}, //1506 #CJK UNIFIED IDEOGRAPH + {0x88F1, 0x582E}, //1507 #CJK UNIFIED IDEOGRAPH + {0x88F2, 0x582F}, //1508 #CJK UNIFIED IDEOGRAPH + {0x88F3, 0x5831}, //1509 #CJK UNIFIED IDEOGRAPH + {0x88F4, 0x5832}, //1510 #CJK UNIFIED IDEOGRAPH + {0x88F5, 0x5833}, //1511 #CJK UNIFIED IDEOGRAPH + {0x88F6, 0x5834}, //1512 #CJK UNIFIED IDEOGRAPH + {0x88F7, 0x5836}, //1513 #CJK UNIFIED IDEOGRAPH + {0x88F8, 0x5837}, //1514 #CJK UNIFIED IDEOGRAPH + {0x88F9, 0x5838}, //1515 #CJK UNIFIED IDEOGRAPH + {0x88FA, 0x5839}, //1516 #CJK UNIFIED IDEOGRAPH + {0x88FB, 0x583A}, //1517 #CJK UNIFIED IDEOGRAPH + {0x88FC, 0x583B}, //1518 #CJK UNIFIED IDEOGRAPH + {0x88FD, 0x583C}, //1519 #CJK UNIFIED IDEOGRAPH + {0x88FE, 0x583D}, //1520 #CJK UNIFIED IDEOGRAPH + {0x8940, 0x583E}, //1521 #CJK UNIFIED IDEOGRAPH + {0x8941, 0x583F}, //1522 #CJK UNIFIED IDEOGRAPH + {0x8942, 0x5840}, //1523 #CJK UNIFIED IDEOGRAPH + {0x8943, 0x5841}, //1524 #CJK UNIFIED IDEOGRAPH + {0x8944, 0x5842}, //1525 #CJK UNIFIED IDEOGRAPH + {0x8945, 0x5843}, //1526 #CJK UNIFIED IDEOGRAPH + {0x8946, 0x5845}, //1527 #CJK UNIFIED IDEOGRAPH + {0x8947, 0x5846}, //1528 #CJK UNIFIED IDEOGRAPH + {0x8948, 0x5847}, //1529 #CJK UNIFIED IDEOGRAPH + {0x8949, 0x5848}, //1530 #CJK UNIFIED IDEOGRAPH + {0x894A, 0x5849}, //1531 #CJK UNIFIED IDEOGRAPH + {0x894B, 0x584A}, //1532 #CJK UNIFIED IDEOGRAPH + {0x894C, 0x584B}, //1533 #CJK UNIFIED IDEOGRAPH + {0x894D, 0x584E}, //1534 #CJK UNIFIED IDEOGRAPH + {0x894E, 0x584F}, //1535 #CJK UNIFIED IDEOGRAPH + {0x894F, 0x5850}, //1536 #CJK UNIFIED IDEOGRAPH + {0x8950, 0x5852}, //1537 #CJK UNIFIED IDEOGRAPH + {0x8951, 0x5853}, //1538 #CJK UNIFIED IDEOGRAPH + {0x8952, 0x5855}, //1539 #CJK UNIFIED IDEOGRAPH + {0x8953, 0x5856}, //1540 #CJK UNIFIED IDEOGRAPH + {0x8954, 0x5857}, //1541 #CJK UNIFIED IDEOGRAPH + {0x8955, 0x5859}, //1542 #CJK UNIFIED IDEOGRAPH + {0x8956, 0x585A}, //1543 #CJK UNIFIED IDEOGRAPH + {0x8957, 0x585B}, //1544 #CJK UNIFIED IDEOGRAPH + {0x8958, 0x585C}, //1545 #CJK UNIFIED IDEOGRAPH + {0x8959, 0x585D}, //1546 #CJK UNIFIED IDEOGRAPH + {0x895A, 0x585F}, //1547 #CJK UNIFIED IDEOGRAPH + {0x895B, 0x5860}, //1548 #CJK UNIFIED IDEOGRAPH + {0x895C, 0x5861}, //1549 #CJK UNIFIED IDEOGRAPH + {0x895D, 0x5862}, //1550 #CJK UNIFIED IDEOGRAPH + {0x895E, 0x5863}, //1551 #CJK UNIFIED IDEOGRAPH + {0x895F, 0x5864}, //1552 #CJK UNIFIED IDEOGRAPH + {0x8960, 0x5866}, //1553 #CJK UNIFIED IDEOGRAPH + {0x8961, 0x5867}, //1554 #CJK UNIFIED IDEOGRAPH + {0x8962, 0x5868}, //1555 #CJK UNIFIED IDEOGRAPH + {0x8963, 0x5869}, //1556 #CJK UNIFIED IDEOGRAPH + {0x8964, 0x586A}, //1557 #CJK UNIFIED IDEOGRAPH + {0x8965, 0x586D}, //1558 #CJK UNIFIED IDEOGRAPH + {0x8966, 0x586E}, //1559 #CJK UNIFIED IDEOGRAPH + {0x8967, 0x586F}, //1560 #CJK UNIFIED IDEOGRAPH + {0x8968, 0x5870}, //1561 #CJK UNIFIED IDEOGRAPH + {0x8969, 0x5871}, //1562 #CJK UNIFIED IDEOGRAPH + {0x896A, 0x5872}, //1563 #CJK UNIFIED IDEOGRAPH + {0x896B, 0x5873}, //1564 #CJK UNIFIED IDEOGRAPH + {0x896C, 0x5874}, //1565 #CJK UNIFIED IDEOGRAPH + {0x896D, 0x5875}, //1566 #CJK UNIFIED IDEOGRAPH + {0x896E, 0x5876}, //1567 #CJK UNIFIED IDEOGRAPH + {0x896F, 0x5877}, //1568 #CJK UNIFIED IDEOGRAPH + {0x8970, 0x5878}, //1569 #CJK UNIFIED IDEOGRAPH + {0x8971, 0x5879}, //1570 #CJK UNIFIED IDEOGRAPH + {0x8972, 0x587A}, //1571 #CJK UNIFIED IDEOGRAPH + {0x8973, 0x587B}, //1572 #CJK UNIFIED IDEOGRAPH + {0x8974, 0x587C}, //1573 #CJK UNIFIED IDEOGRAPH + {0x8975, 0x587D}, //1574 #CJK UNIFIED IDEOGRAPH + {0x8976, 0x587F}, //1575 #CJK UNIFIED IDEOGRAPH + {0x8977, 0x5882}, //1576 #CJK UNIFIED IDEOGRAPH + {0x8978, 0x5884}, //1577 #CJK UNIFIED IDEOGRAPH + {0x8979, 0x5886}, //1578 #CJK UNIFIED IDEOGRAPH + {0x897A, 0x5887}, //1579 #CJK UNIFIED IDEOGRAPH + {0x897B, 0x5888}, //1580 #CJK UNIFIED IDEOGRAPH + {0x897C, 0x588A}, //1581 #CJK UNIFIED IDEOGRAPH + {0x897D, 0x588B}, //1582 #CJK UNIFIED IDEOGRAPH + {0x897E, 0x588C}, //1583 #CJK UNIFIED IDEOGRAPH + {0x8980, 0x588D}, //1584 #CJK UNIFIED IDEOGRAPH + {0x8981, 0x588E}, //1585 #CJK UNIFIED IDEOGRAPH + {0x8982, 0x588F}, //1586 #CJK UNIFIED IDEOGRAPH + {0x8983, 0x5890}, //1587 #CJK UNIFIED IDEOGRAPH + {0x8984, 0x5891}, //1588 #CJK UNIFIED IDEOGRAPH + {0x8985, 0x5894}, //1589 #CJK UNIFIED IDEOGRAPH + {0x8986, 0x5895}, //1590 #CJK UNIFIED IDEOGRAPH + {0x8987, 0x5896}, //1591 #CJK UNIFIED IDEOGRAPH + {0x8988, 0x5897}, //1592 #CJK UNIFIED IDEOGRAPH + {0x8989, 0x5898}, //1593 #CJK UNIFIED IDEOGRAPH + {0x898A, 0x589B}, //1594 #CJK UNIFIED IDEOGRAPH + {0x898B, 0x589C}, //1595 #CJK UNIFIED IDEOGRAPH + {0x898C, 0x589D}, //1596 #CJK UNIFIED IDEOGRAPH + {0x898D, 0x58A0}, //1597 #CJK UNIFIED IDEOGRAPH + {0x898E, 0x58A1}, //1598 #CJK UNIFIED IDEOGRAPH + {0x898F, 0x58A2}, //1599 #CJK UNIFIED IDEOGRAPH + {0x8990, 0x58A3}, //1600 #CJK UNIFIED IDEOGRAPH + {0x8991, 0x58A4}, //1601 #CJK UNIFIED IDEOGRAPH + {0x8992, 0x58A5}, //1602 #CJK UNIFIED IDEOGRAPH + {0x8993, 0x58A6}, //1603 #CJK UNIFIED IDEOGRAPH + {0x8994, 0x58A7}, //1604 #CJK UNIFIED IDEOGRAPH + {0x8995, 0x58AA}, //1605 #CJK UNIFIED IDEOGRAPH + {0x8996, 0x58AB}, //1606 #CJK UNIFIED IDEOGRAPH + {0x8997, 0x58AC}, //1607 #CJK UNIFIED IDEOGRAPH + {0x8998, 0x58AD}, //1608 #CJK UNIFIED IDEOGRAPH + {0x8999, 0x58AE}, //1609 #CJK UNIFIED IDEOGRAPH + {0x899A, 0x58AF}, //1610 #CJK UNIFIED IDEOGRAPH + {0x899B, 0x58B0}, //1611 #CJK UNIFIED IDEOGRAPH + {0x899C, 0x58B1}, //1612 #CJK UNIFIED IDEOGRAPH + {0x899D, 0x58B2}, //1613 #CJK UNIFIED IDEOGRAPH + {0x899E, 0x58B3}, //1614 #CJK UNIFIED IDEOGRAPH + {0x899F, 0x58B4}, //1615 #CJK UNIFIED IDEOGRAPH + {0x89A0, 0x58B5}, //1616 #CJK UNIFIED IDEOGRAPH + {0x89A1, 0x58B6}, //1617 #CJK UNIFIED IDEOGRAPH + {0x89A2, 0x58B7}, //1618 #CJK UNIFIED IDEOGRAPH + {0x89A3, 0x58B8}, //1619 #CJK UNIFIED IDEOGRAPH + {0x89A4, 0x58B9}, //1620 #CJK UNIFIED IDEOGRAPH + {0x89A5, 0x58BA}, //1621 #CJK UNIFIED IDEOGRAPH + {0x89A6, 0x58BB}, //1622 #CJK UNIFIED IDEOGRAPH + {0x89A7, 0x58BD}, //1623 #CJK UNIFIED IDEOGRAPH + {0x89A8, 0x58BE}, //1624 #CJK UNIFIED IDEOGRAPH + {0x89A9, 0x58BF}, //1625 #CJK UNIFIED IDEOGRAPH + {0x89AA, 0x58C0}, //1626 #CJK UNIFIED IDEOGRAPH + {0x89AB, 0x58C2}, //1627 #CJK UNIFIED IDEOGRAPH + {0x89AC, 0x58C3}, //1628 #CJK UNIFIED IDEOGRAPH + {0x89AD, 0x58C4}, //1629 #CJK UNIFIED IDEOGRAPH + {0x89AE, 0x58C6}, //1630 #CJK UNIFIED IDEOGRAPH + {0x89AF, 0x58C7}, //1631 #CJK UNIFIED IDEOGRAPH + {0x89B0, 0x58C8}, //1632 #CJK UNIFIED IDEOGRAPH + {0x89B1, 0x58C9}, //1633 #CJK UNIFIED IDEOGRAPH + {0x89B2, 0x58CA}, //1634 #CJK UNIFIED IDEOGRAPH + {0x89B3, 0x58CB}, //1635 #CJK UNIFIED IDEOGRAPH + {0x89B4, 0x58CC}, //1636 #CJK UNIFIED IDEOGRAPH + {0x89B5, 0x58CD}, //1637 #CJK UNIFIED IDEOGRAPH + {0x89B6, 0x58CE}, //1638 #CJK UNIFIED IDEOGRAPH + {0x89B7, 0x58CF}, //1639 #CJK UNIFIED IDEOGRAPH + {0x89B8, 0x58D0}, //1640 #CJK UNIFIED IDEOGRAPH + {0x89B9, 0x58D2}, //1641 #CJK UNIFIED IDEOGRAPH + {0x89BA, 0x58D3}, //1642 #CJK UNIFIED IDEOGRAPH + {0x89BB, 0x58D4}, //1643 #CJK UNIFIED IDEOGRAPH + {0x89BC, 0x58D6}, //1644 #CJK UNIFIED IDEOGRAPH + {0x89BD, 0x58D7}, //1645 #CJK UNIFIED IDEOGRAPH + {0x89BE, 0x58D8}, //1646 #CJK UNIFIED IDEOGRAPH + {0x89BF, 0x58D9}, //1647 #CJK UNIFIED IDEOGRAPH + {0x89C0, 0x58DA}, //1648 #CJK UNIFIED IDEOGRAPH + {0x89C1, 0x58DB}, //1649 #CJK UNIFIED IDEOGRAPH + {0x89C2, 0x58DC}, //1650 #CJK UNIFIED IDEOGRAPH + {0x89C3, 0x58DD}, //1651 #CJK UNIFIED IDEOGRAPH + {0x89C4, 0x58DE}, //1652 #CJK UNIFIED IDEOGRAPH + {0x89C5, 0x58DF}, //1653 #CJK UNIFIED IDEOGRAPH + {0x89C6, 0x58E0}, //1654 #CJK UNIFIED IDEOGRAPH + {0x89C7, 0x58E1}, //1655 #CJK UNIFIED IDEOGRAPH + {0x89C8, 0x58E2}, //1656 #CJK UNIFIED IDEOGRAPH + {0x89C9, 0x58E3}, //1657 #CJK UNIFIED IDEOGRAPH + {0x89CA, 0x58E5}, //1658 #CJK UNIFIED IDEOGRAPH + {0x89CB, 0x58E6}, //1659 #CJK UNIFIED IDEOGRAPH + {0x89CC, 0x58E7}, //1660 #CJK UNIFIED IDEOGRAPH + {0x89CD, 0x58E8}, //1661 #CJK UNIFIED IDEOGRAPH + {0x89CE, 0x58E9}, //1662 #CJK UNIFIED IDEOGRAPH + {0x89CF, 0x58EA}, //1663 #CJK UNIFIED IDEOGRAPH + {0x89D0, 0x58ED}, //1664 #CJK UNIFIED IDEOGRAPH + {0x89D1, 0x58EF}, //1665 #CJK UNIFIED IDEOGRAPH + {0x89D2, 0x58F1}, //1666 #CJK UNIFIED IDEOGRAPH + {0x89D3, 0x58F2}, //1667 #CJK UNIFIED IDEOGRAPH + {0x89D4, 0x58F4}, //1668 #CJK UNIFIED IDEOGRAPH + {0x89D5, 0x58F5}, //1669 #CJK UNIFIED IDEOGRAPH + {0x89D6, 0x58F7}, //1670 #CJK UNIFIED IDEOGRAPH + {0x89D7, 0x58F8}, //1671 #CJK UNIFIED IDEOGRAPH + {0x89D8, 0x58FA}, //1672 #CJK UNIFIED IDEOGRAPH + {0x89D9, 0x58FB}, //1673 #CJK UNIFIED IDEOGRAPH + {0x89DA, 0x58FC}, //1674 #CJK UNIFIED IDEOGRAPH + {0x89DB, 0x58FD}, //1675 #CJK UNIFIED IDEOGRAPH + {0x89DC, 0x58FE}, //1676 #CJK UNIFIED IDEOGRAPH + {0x89DD, 0x58FF}, //1677 #CJK UNIFIED IDEOGRAPH + {0x89DE, 0x5900}, //1678 #CJK UNIFIED IDEOGRAPH + {0x89DF, 0x5901}, //1679 #CJK UNIFIED IDEOGRAPH + {0x89E0, 0x5903}, //1680 #CJK UNIFIED IDEOGRAPH + {0x89E1, 0x5905}, //1681 #CJK UNIFIED IDEOGRAPH + {0x89E2, 0x5906}, //1682 #CJK UNIFIED IDEOGRAPH + {0x89E3, 0x5908}, //1683 #CJK UNIFIED IDEOGRAPH + {0x89E4, 0x5909}, //1684 #CJK UNIFIED IDEOGRAPH + {0x89E5, 0x590A}, //1685 #CJK UNIFIED IDEOGRAPH + {0x89E6, 0x590B}, //1686 #CJK UNIFIED IDEOGRAPH + {0x89E7, 0x590C}, //1687 #CJK UNIFIED IDEOGRAPH + {0x89E8, 0x590E}, //1688 #CJK UNIFIED IDEOGRAPH + {0x89E9, 0x5910}, //1689 #CJK UNIFIED IDEOGRAPH + {0x89EA, 0x5911}, //1690 #CJK UNIFIED IDEOGRAPH + {0x89EB, 0x5912}, //1691 #CJK UNIFIED IDEOGRAPH + {0x89EC, 0x5913}, //1692 #CJK UNIFIED IDEOGRAPH + {0x89ED, 0x5917}, //1693 #CJK UNIFIED IDEOGRAPH + {0x89EE, 0x5918}, //1694 #CJK UNIFIED IDEOGRAPH + {0x89EF, 0x591B}, //1695 #CJK UNIFIED IDEOGRAPH + {0x89F0, 0x591D}, //1696 #CJK UNIFIED IDEOGRAPH + {0x89F1, 0x591E}, //1697 #CJK UNIFIED IDEOGRAPH + {0x89F2, 0x5920}, //1698 #CJK UNIFIED IDEOGRAPH + {0x89F3, 0x5921}, //1699 #CJK UNIFIED IDEOGRAPH + {0x89F4, 0x5922}, //1700 #CJK UNIFIED IDEOGRAPH + {0x89F5, 0x5923}, //1701 #CJK UNIFIED IDEOGRAPH + {0x89F6, 0x5926}, //1702 #CJK UNIFIED IDEOGRAPH + {0x89F7, 0x5928}, //1703 #CJK UNIFIED IDEOGRAPH + {0x89F8, 0x592C}, //1704 #CJK UNIFIED IDEOGRAPH + {0x89F9, 0x5930}, //1705 #CJK UNIFIED IDEOGRAPH + {0x89FA, 0x5932}, //1706 #CJK UNIFIED IDEOGRAPH + {0x89FB, 0x5933}, //1707 #CJK UNIFIED IDEOGRAPH + {0x89FC, 0x5935}, //1708 #CJK UNIFIED IDEOGRAPH + {0x89FD, 0x5936}, //1709 #CJK UNIFIED IDEOGRAPH + {0x89FE, 0x593B}, //1710 #CJK UNIFIED IDEOGRAPH + {0x8A40, 0x593D}, //1711 #CJK UNIFIED IDEOGRAPH + {0x8A41, 0x593E}, //1712 #CJK UNIFIED IDEOGRAPH + {0x8A42, 0x593F}, //1713 #CJK UNIFIED IDEOGRAPH + {0x8A43, 0x5940}, //1714 #CJK UNIFIED IDEOGRAPH + {0x8A44, 0x5943}, //1715 #CJK UNIFIED IDEOGRAPH + {0x8A45, 0x5945}, //1716 #CJK UNIFIED IDEOGRAPH + {0x8A46, 0x5946}, //1717 #CJK UNIFIED IDEOGRAPH + {0x8A47, 0x594A}, //1718 #CJK UNIFIED IDEOGRAPH + {0x8A48, 0x594C}, //1719 #CJK UNIFIED IDEOGRAPH + {0x8A49, 0x594D}, //1720 #CJK UNIFIED IDEOGRAPH + {0x8A4A, 0x5950}, //1721 #CJK UNIFIED IDEOGRAPH + {0x8A4B, 0x5952}, //1722 #CJK UNIFIED IDEOGRAPH + {0x8A4C, 0x5953}, //1723 #CJK UNIFIED IDEOGRAPH + {0x8A4D, 0x5959}, //1724 #CJK UNIFIED IDEOGRAPH + {0x8A4E, 0x595B}, //1725 #CJK UNIFIED IDEOGRAPH + {0x8A4F, 0x595C}, //1726 #CJK UNIFIED IDEOGRAPH + {0x8A50, 0x595D}, //1727 #CJK UNIFIED IDEOGRAPH + {0x8A51, 0x595E}, //1728 #CJK UNIFIED IDEOGRAPH + {0x8A52, 0x595F}, //1729 #CJK UNIFIED IDEOGRAPH + {0x8A53, 0x5961}, //1730 #CJK UNIFIED IDEOGRAPH + {0x8A54, 0x5963}, //1731 #CJK UNIFIED IDEOGRAPH + {0x8A55, 0x5964}, //1732 #CJK UNIFIED IDEOGRAPH + {0x8A56, 0x5966}, //1733 #CJK UNIFIED IDEOGRAPH + {0x8A57, 0x5967}, //1734 #CJK UNIFIED IDEOGRAPH + {0x8A58, 0x5968}, //1735 #CJK UNIFIED IDEOGRAPH + {0x8A59, 0x5969}, //1736 #CJK UNIFIED IDEOGRAPH + {0x8A5A, 0x596A}, //1737 #CJK UNIFIED IDEOGRAPH + {0x8A5B, 0x596B}, //1738 #CJK UNIFIED IDEOGRAPH + {0x8A5C, 0x596C}, //1739 #CJK UNIFIED IDEOGRAPH + {0x8A5D, 0x596D}, //1740 #CJK UNIFIED IDEOGRAPH + {0x8A5E, 0x596E}, //1741 #CJK UNIFIED IDEOGRAPH + {0x8A5F, 0x596F}, //1742 #CJK UNIFIED IDEOGRAPH + {0x8A60, 0x5970}, //1743 #CJK UNIFIED IDEOGRAPH + {0x8A61, 0x5971}, //1744 #CJK UNIFIED IDEOGRAPH + {0x8A62, 0x5972}, //1745 #CJK UNIFIED IDEOGRAPH + {0x8A63, 0x5975}, //1746 #CJK UNIFIED IDEOGRAPH + {0x8A64, 0x5977}, //1747 #CJK UNIFIED IDEOGRAPH + {0x8A65, 0x597A}, //1748 #CJK UNIFIED IDEOGRAPH + {0x8A66, 0x597B}, //1749 #CJK UNIFIED IDEOGRAPH + {0x8A67, 0x597C}, //1750 #CJK UNIFIED IDEOGRAPH + {0x8A68, 0x597E}, //1751 #CJK UNIFIED IDEOGRAPH + {0x8A69, 0x597F}, //1752 #CJK UNIFIED IDEOGRAPH + {0x8A6A, 0x5980}, //1753 #CJK UNIFIED IDEOGRAPH + {0x8A6B, 0x5985}, //1754 #CJK UNIFIED IDEOGRAPH + {0x8A6C, 0x5989}, //1755 #CJK UNIFIED IDEOGRAPH + {0x8A6D, 0x598B}, //1756 #CJK UNIFIED IDEOGRAPH + {0x8A6E, 0x598C}, //1757 #CJK UNIFIED IDEOGRAPH + {0x8A6F, 0x598E}, //1758 #CJK UNIFIED IDEOGRAPH + {0x8A70, 0x598F}, //1759 #CJK UNIFIED IDEOGRAPH + {0x8A71, 0x5990}, //1760 #CJK UNIFIED IDEOGRAPH + {0x8A72, 0x5991}, //1761 #CJK UNIFIED IDEOGRAPH + {0x8A73, 0x5994}, //1762 #CJK UNIFIED IDEOGRAPH + {0x8A74, 0x5995}, //1763 #CJK UNIFIED IDEOGRAPH + {0x8A75, 0x5998}, //1764 #CJK UNIFIED IDEOGRAPH + {0x8A76, 0x599A}, //1765 #CJK UNIFIED IDEOGRAPH + {0x8A77, 0x599B}, //1766 #CJK UNIFIED IDEOGRAPH + {0x8A78, 0x599C}, //1767 #CJK UNIFIED IDEOGRAPH + {0x8A79, 0x599D}, //1768 #CJK UNIFIED IDEOGRAPH + {0x8A7A, 0x599F}, //1769 #CJK UNIFIED IDEOGRAPH + {0x8A7B, 0x59A0}, //1770 #CJK UNIFIED IDEOGRAPH + {0x8A7C, 0x59A1}, //1771 #CJK UNIFIED IDEOGRAPH + {0x8A7D, 0x59A2}, //1772 #CJK UNIFIED IDEOGRAPH + {0x8A7E, 0x59A6}, //1773 #CJK UNIFIED IDEOGRAPH + {0x8A80, 0x59A7}, //1774 #CJK UNIFIED IDEOGRAPH + {0x8A81, 0x59AC}, //1775 #CJK UNIFIED IDEOGRAPH + {0x8A82, 0x59AD}, //1776 #CJK UNIFIED IDEOGRAPH + {0x8A83, 0x59B0}, //1777 #CJK UNIFIED IDEOGRAPH + {0x8A84, 0x59B1}, //1778 #CJK UNIFIED IDEOGRAPH + {0x8A85, 0x59B3}, //1779 #CJK UNIFIED IDEOGRAPH + {0x8A86, 0x59B4}, //1780 #CJK UNIFIED IDEOGRAPH + {0x8A87, 0x59B5}, //1781 #CJK UNIFIED IDEOGRAPH + {0x8A88, 0x59B6}, //1782 #CJK UNIFIED IDEOGRAPH + {0x8A89, 0x59B7}, //1783 #CJK UNIFIED IDEOGRAPH + {0x8A8A, 0x59B8}, //1784 #CJK UNIFIED IDEOGRAPH + {0x8A8B, 0x59BA}, //1785 #CJK UNIFIED IDEOGRAPH + {0x8A8C, 0x59BC}, //1786 #CJK UNIFIED IDEOGRAPH + {0x8A8D, 0x59BD}, //1787 #CJK UNIFIED IDEOGRAPH + {0x8A8E, 0x59BF}, //1788 #CJK UNIFIED IDEOGRAPH + {0x8A8F, 0x59C0}, //1789 #CJK UNIFIED IDEOGRAPH + {0x8A90, 0x59C1}, //1790 #CJK UNIFIED IDEOGRAPH + {0x8A91, 0x59C2}, //1791 #CJK UNIFIED IDEOGRAPH + {0x8A92, 0x59C3}, //1792 #CJK UNIFIED IDEOGRAPH + {0x8A93, 0x59C4}, //1793 #CJK UNIFIED IDEOGRAPH + {0x8A94, 0x59C5}, //1794 #CJK UNIFIED IDEOGRAPH + {0x8A95, 0x59C7}, //1795 #CJK UNIFIED IDEOGRAPH + {0x8A96, 0x59C8}, //1796 #CJK UNIFIED IDEOGRAPH + {0x8A97, 0x59C9}, //1797 #CJK UNIFIED IDEOGRAPH + {0x8A98, 0x59CC}, //1798 #CJK UNIFIED IDEOGRAPH + {0x8A99, 0x59CD}, //1799 #CJK UNIFIED IDEOGRAPH + {0x8A9A, 0x59CE}, //1800 #CJK UNIFIED IDEOGRAPH + {0x8A9B, 0x59CF}, //1801 #CJK UNIFIED IDEOGRAPH + {0x8A9C, 0x59D5}, //1802 #CJK UNIFIED IDEOGRAPH + {0x8A9D, 0x59D6}, //1803 #CJK UNIFIED IDEOGRAPH + {0x8A9E, 0x59D9}, //1804 #CJK UNIFIED IDEOGRAPH + {0x8A9F, 0x59DB}, //1805 #CJK UNIFIED IDEOGRAPH + {0x8AA0, 0x59DE}, //1806 #CJK UNIFIED IDEOGRAPH + {0x8AA1, 0x59DF}, //1807 #CJK UNIFIED IDEOGRAPH + {0x8AA2, 0x59E0}, //1808 #CJK UNIFIED IDEOGRAPH + {0x8AA3, 0x59E1}, //1809 #CJK UNIFIED IDEOGRAPH + {0x8AA4, 0x59E2}, //1810 #CJK UNIFIED IDEOGRAPH + {0x8AA5, 0x59E4}, //1811 #CJK UNIFIED IDEOGRAPH + {0x8AA6, 0x59E6}, //1812 #CJK UNIFIED IDEOGRAPH + {0x8AA7, 0x59E7}, //1813 #CJK UNIFIED IDEOGRAPH + {0x8AA8, 0x59E9}, //1814 #CJK UNIFIED IDEOGRAPH + {0x8AA9, 0x59EA}, //1815 #CJK UNIFIED IDEOGRAPH + {0x8AAA, 0x59EB}, //1816 #CJK UNIFIED IDEOGRAPH + {0x8AAB, 0x59ED}, //1817 #CJK UNIFIED IDEOGRAPH + {0x8AAC, 0x59EE}, //1818 #CJK UNIFIED IDEOGRAPH + {0x8AAD, 0x59EF}, //1819 #CJK UNIFIED IDEOGRAPH + {0x8AAE, 0x59F0}, //1820 #CJK UNIFIED IDEOGRAPH + {0x8AAF, 0x59F1}, //1821 #CJK UNIFIED IDEOGRAPH + {0x8AB0, 0x59F2}, //1822 #CJK UNIFIED IDEOGRAPH + {0x8AB1, 0x59F3}, //1823 #CJK UNIFIED IDEOGRAPH + {0x8AB2, 0x59F4}, //1824 #CJK UNIFIED IDEOGRAPH + {0x8AB3, 0x59F5}, //1825 #CJK UNIFIED IDEOGRAPH + {0x8AB4, 0x59F6}, //1826 #CJK UNIFIED IDEOGRAPH + {0x8AB5, 0x59F7}, //1827 #CJK UNIFIED IDEOGRAPH + {0x8AB6, 0x59F8}, //1828 #CJK UNIFIED IDEOGRAPH + {0x8AB7, 0x59FA}, //1829 #CJK UNIFIED IDEOGRAPH + {0x8AB8, 0x59FC}, //1830 #CJK UNIFIED IDEOGRAPH + {0x8AB9, 0x59FD}, //1831 #CJK UNIFIED IDEOGRAPH + {0x8ABA, 0x59FE}, //1832 #CJK UNIFIED IDEOGRAPH + {0x8ABB, 0x5A00}, //1833 #CJK UNIFIED IDEOGRAPH + {0x8ABC, 0x5A02}, //1834 #CJK UNIFIED IDEOGRAPH + {0x8ABD, 0x5A0A}, //1835 #CJK UNIFIED IDEOGRAPH + {0x8ABE, 0x5A0B}, //1836 #CJK UNIFIED IDEOGRAPH + {0x8ABF, 0x5A0D}, //1837 #CJK UNIFIED IDEOGRAPH + {0x8AC0, 0x5A0E}, //1838 #CJK UNIFIED IDEOGRAPH + {0x8AC1, 0x5A0F}, //1839 #CJK UNIFIED IDEOGRAPH + {0x8AC2, 0x5A10}, //1840 #CJK UNIFIED IDEOGRAPH + {0x8AC3, 0x5A12}, //1841 #CJK UNIFIED IDEOGRAPH + {0x8AC4, 0x5A14}, //1842 #CJK UNIFIED IDEOGRAPH + {0x8AC5, 0x5A15}, //1843 #CJK UNIFIED IDEOGRAPH + {0x8AC6, 0x5A16}, //1844 #CJK UNIFIED IDEOGRAPH + {0x8AC7, 0x5A17}, //1845 #CJK UNIFIED IDEOGRAPH + {0x8AC8, 0x5A19}, //1846 #CJK UNIFIED IDEOGRAPH + {0x8AC9, 0x5A1A}, //1847 #CJK UNIFIED IDEOGRAPH + {0x8ACA, 0x5A1B}, //1848 #CJK UNIFIED IDEOGRAPH + {0x8ACB, 0x5A1D}, //1849 #CJK UNIFIED IDEOGRAPH + {0x8ACC, 0x5A1E}, //1850 #CJK UNIFIED IDEOGRAPH + {0x8ACD, 0x5A21}, //1851 #CJK UNIFIED IDEOGRAPH + {0x8ACE, 0x5A22}, //1852 #CJK UNIFIED IDEOGRAPH + {0x8ACF, 0x5A24}, //1853 #CJK UNIFIED IDEOGRAPH + {0x8AD0, 0x5A26}, //1854 #CJK UNIFIED IDEOGRAPH + {0x8AD1, 0x5A27}, //1855 #CJK UNIFIED IDEOGRAPH + {0x8AD2, 0x5A28}, //1856 #CJK UNIFIED IDEOGRAPH + {0x8AD3, 0x5A2A}, //1857 #CJK UNIFIED IDEOGRAPH + {0x8AD4, 0x5A2B}, //1858 #CJK UNIFIED IDEOGRAPH + {0x8AD5, 0x5A2C}, //1859 #CJK UNIFIED IDEOGRAPH + {0x8AD6, 0x5A2D}, //1860 #CJK UNIFIED IDEOGRAPH + {0x8AD7, 0x5A2E}, //1861 #CJK UNIFIED IDEOGRAPH + {0x8AD8, 0x5A2F}, //1862 #CJK UNIFIED IDEOGRAPH + {0x8AD9, 0x5A30}, //1863 #CJK UNIFIED IDEOGRAPH + {0x8ADA, 0x5A33}, //1864 #CJK UNIFIED IDEOGRAPH + {0x8ADB, 0x5A35}, //1865 #CJK UNIFIED IDEOGRAPH + {0x8ADC, 0x5A37}, //1866 #CJK UNIFIED IDEOGRAPH + {0x8ADD, 0x5A38}, //1867 #CJK UNIFIED IDEOGRAPH + {0x8ADE, 0x5A39}, //1868 #CJK UNIFIED IDEOGRAPH + {0x8ADF, 0x5A3A}, //1869 #CJK UNIFIED IDEOGRAPH + {0x8AE0, 0x5A3B}, //1870 #CJK UNIFIED IDEOGRAPH + {0x8AE1, 0x5A3D}, //1871 #CJK UNIFIED IDEOGRAPH + {0x8AE2, 0x5A3E}, //1872 #CJK UNIFIED IDEOGRAPH + {0x8AE3, 0x5A3F}, //1873 #CJK UNIFIED IDEOGRAPH + {0x8AE4, 0x5A41}, //1874 #CJK UNIFIED IDEOGRAPH + {0x8AE5, 0x5A42}, //1875 #CJK UNIFIED IDEOGRAPH + {0x8AE6, 0x5A43}, //1876 #CJK UNIFIED IDEOGRAPH + {0x8AE7, 0x5A44}, //1877 #CJK UNIFIED IDEOGRAPH + {0x8AE8, 0x5A45}, //1878 #CJK UNIFIED IDEOGRAPH + {0x8AE9, 0x5A47}, //1879 #CJK UNIFIED IDEOGRAPH + {0x8AEA, 0x5A48}, //1880 #CJK UNIFIED IDEOGRAPH + {0x8AEB, 0x5A4B}, //1881 #CJK UNIFIED IDEOGRAPH + {0x8AEC, 0x5A4C}, //1882 #CJK UNIFIED IDEOGRAPH + {0x8AED, 0x5A4D}, //1883 #CJK UNIFIED IDEOGRAPH + {0x8AEE, 0x5A4E}, //1884 #CJK UNIFIED IDEOGRAPH + {0x8AEF, 0x5A4F}, //1885 #CJK UNIFIED IDEOGRAPH + {0x8AF0, 0x5A50}, //1886 #CJK UNIFIED IDEOGRAPH + {0x8AF1, 0x5A51}, //1887 #CJK UNIFIED IDEOGRAPH + {0x8AF2, 0x5A52}, //1888 #CJK UNIFIED IDEOGRAPH + {0x8AF3, 0x5A53}, //1889 #CJK UNIFIED IDEOGRAPH + {0x8AF4, 0x5A54}, //1890 #CJK UNIFIED IDEOGRAPH + {0x8AF5, 0x5A56}, //1891 #CJK UNIFIED IDEOGRAPH + {0x8AF6, 0x5A57}, //1892 #CJK UNIFIED IDEOGRAPH + {0x8AF7, 0x5A58}, //1893 #CJK UNIFIED IDEOGRAPH + {0x8AF8, 0x5A59}, //1894 #CJK UNIFIED IDEOGRAPH + {0x8AF9, 0x5A5B}, //1895 #CJK UNIFIED IDEOGRAPH + {0x8AFA, 0x5A5C}, //1896 #CJK UNIFIED IDEOGRAPH + {0x8AFB, 0x5A5D}, //1897 #CJK UNIFIED IDEOGRAPH + {0x8AFC, 0x5A5E}, //1898 #CJK UNIFIED IDEOGRAPH + {0x8AFD, 0x5A5F}, //1899 #CJK UNIFIED IDEOGRAPH + {0x8AFE, 0x5A60}, //1900 #CJK UNIFIED IDEOGRAPH + {0x8B40, 0x5A61}, //1901 #CJK UNIFIED IDEOGRAPH + {0x8B41, 0x5A63}, //1902 #CJK UNIFIED IDEOGRAPH + {0x8B42, 0x5A64}, //1903 #CJK UNIFIED IDEOGRAPH + {0x8B43, 0x5A65}, //1904 #CJK UNIFIED IDEOGRAPH + {0x8B44, 0x5A66}, //1905 #CJK UNIFIED IDEOGRAPH + {0x8B45, 0x5A68}, //1906 #CJK UNIFIED IDEOGRAPH + {0x8B46, 0x5A69}, //1907 #CJK UNIFIED IDEOGRAPH + {0x8B47, 0x5A6B}, //1908 #CJK UNIFIED IDEOGRAPH + {0x8B48, 0x5A6C}, //1909 #CJK UNIFIED IDEOGRAPH + {0x8B49, 0x5A6D}, //1910 #CJK UNIFIED IDEOGRAPH + {0x8B4A, 0x5A6E}, //1911 #CJK UNIFIED IDEOGRAPH + {0x8B4B, 0x5A6F}, //1912 #CJK UNIFIED IDEOGRAPH + {0x8B4C, 0x5A70}, //1913 #CJK UNIFIED IDEOGRAPH + {0x8B4D, 0x5A71}, //1914 #CJK UNIFIED IDEOGRAPH + {0x8B4E, 0x5A72}, //1915 #CJK UNIFIED IDEOGRAPH + {0x8B4F, 0x5A73}, //1916 #CJK UNIFIED IDEOGRAPH + {0x8B50, 0x5A78}, //1917 #CJK UNIFIED IDEOGRAPH + {0x8B51, 0x5A79}, //1918 #CJK UNIFIED IDEOGRAPH + {0x8B52, 0x5A7B}, //1919 #CJK UNIFIED IDEOGRAPH + {0x8B53, 0x5A7C}, //1920 #CJK UNIFIED IDEOGRAPH + {0x8B54, 0x5A7D}, //1921 #CJK UNIFIED IDEOGRAPH + {0x8B55, 0x5A7E}, //1922 #CJK UNIFIED IDEOGRAPH + {0x8B56, 0x5A80}, //1923 #CJK UNIFIED IDEOGRAPH + {0x8B57, 0x5A81}, //1924 #CJK UNIFIED IDEOGRAPH + {0x8B58, 0x5A82}, //1925 #CJK UNIFIED IDEOGRAPH + {0x8B59, 0x5A83}, //1926 #CJK UNIFIED IDEOGRAPH + {0x8B5A, 0x5A84}, //1927 #CJK UNIFIED IDEOGRAPH + {0x8B5B, 0x5A85}, //1928 #CJK UNIFIED IDEOGRAPH + {0x8B5C, 0x5A86}, //1929 #CJK UNIFIED IDEOGRAPH + {0x8B5D, 0x5A87}, //1930 #CJK UNIFIED IDEOGRAPH + {0x8B5E, 0x5A88}, //1931 #CJK UNIFIED IDEOGRAPH + {0x8B5F, 0x5A89}, //1932 #CJK UNIFIED IDEOGRAPH + {0x8B60, 0x5A8A}, //1933 #CJK UNIFIED IDEOGRAPH + {0x8B61, 0x5A8B}, //1934 #CJK UNIFIED IDEOGRAPH + {0x8B62, 0x5A8C}, //1935 #CJK UNIFIED IDEOGRAPH + {0x8B63, 0x5A8D}, //1936 #CJK UNIFIED IDEOGRAPH + {0x8B64, 0x5A8E}, //1937 #CJK UNIFIED IDEOGRAPH + {0x8B65, 0x5A8F}, //1938 #CJK UNIFIED IDEOGRAPH + {0x8B66, 0x5A90}, //1939 #CJK UNIFIED IDEOGRAPH + {0x8B67, 0x5A91}, //1940 #CJK UNIFIED IDEOGRAPH + {0x8B68, 0x5A93}, //1941 #CJK UNIFIED IDEOGRAPH + {0x8B69, 0x5A94}, //1942 #CJK UNIFIED IDEOGRAPH + {0x8B6A, 0x5A95}, //1943 #CJK UNIFIED IDEOGRAPH + {0x8B6B, 0x5A96}, //1944 #CJK UNIFIED IDEOGRAPH + {0x8B6C, 0x5A97}, //1945 #CJK UNIFIED IDEOGRAPH + {0x8B6D, 0x5A98}, //1946 #CJK UNIFIED IDEOGRAPH + {0x8B6E, 0x5A99}, //1947 #CJK UNIFIED IDEOGRAPH + {0x8B6F, 0x5A9C}, //1948 #CJK UNIFIED IDEOGRAPH + {0x8B70, 0x5A9D}, //1949 #CJK UNIFIED IDEOGRAPH + {0x8B71, 0x5A9E}, //1950 #CJK UNIFIED IDEOGRAPH + {0x8B72, 0x5A9F}, //1951 #CJK UNIFIED IDEOGRAPH + {0x8B73, 0x5AA0}, //1952 #CJK UNIFIED IDEOGRAPH + {0x8B74, 0x5AA1}, //1953 #CJK UNIFIED IDEOGRAPH + {0x8B75, 0x5AA2}, //1954 #CJK UNIFIED IDEOGRAPH + {0x8B76, 0x5AA3}, //1955 #CJK UNIFIED IDEOGRAPH + {0x8B77, 0x5AA4}, //1956 #CJK UNIFIED IDEOGRAPH + {0x8B78, 0x5AA5}, //1957 #CJK UNIFIED IDEOGRAPH + {0x8B79, 0x5AA6}, //1958 #CJK UNIFIED IDEOGRAPH + {0x8B7A, 0x5AA7}, //1959 #CJK UNIFIED IDEOGRAPH + {0x8B7B, 0x5AA8}, //1960 #CJK UNIFIED IDEOGRAPH + {0x8B7C, 0x5AA9}, //1961 #CJK UNIFIED IDEOGRAPH + {0x8B7D, 0x5AAB}, //1962 #CJK UNIFIED IDEOGRAPH + {0x8B7E, 0x5AAC}, //1963 #CJK UNIFIED IDEOGRAPH + {0x8B80, 0x5AAD}, //1964 #CJK UNIFIED IDEOGRAPH + {0x8B81, 0x5AAE}, //1965 #CJK UNIFIED IDEOGRAPH + {0x8B82, 0x5AAF}, //1966 #CJK UNIFIED IDEOGRAPH + {0x8B83, 0x5AB0}, //1967 #CJK UNIFIED IDEOGRAPH + {0x8B84, 0x5AB1}, //1968 #CJK UNIFIED IDEOGRAPH + {0x8B85, 0x5AB4}, //1969 #CJK UNIFIED IDEOGRAPH + {0x8B86, 0x5AB6}, //1970 #CJK UNIFIED IDEOGRAPH + {0x8B87, 0x5AB7}, //1971 #CJK UNIFIED IDEOGRAPH + {0x8B88, 0x5AB9}, //1972 #CJK UNIFIED IDEOGRAPH + {0x8B89, 0x5ABA}, //1973 #CJK UNIFIED IDEOGRAPH + {0x8B8A, 0x5ABB}, //1974 #CJK UNIFIED IDEOGRAPH + {0x8B8B, 0x5ABC}, //1975 #CJK UNIFIED IDEOGRAPH + {0x8B8C, 0x5ABD}, //1976 #CJK UNIFIED IDEOGRAPH + {0x8B8D, 0x5ABF}, //1977 #CJK UNIFIED IDEOGRAPH + {0x8B8E, 0x5AC0}, //1978 #CJK UNIFIED IDEOGRAPH + {0x8B8F, 0x5AC3}, //1979 #CJK UNIFIED IDEOGRAPH + {0x8B90, 0x5AC4}, //1980 #CJK UNIFIED IDEOGRAPH + {0x8B91, 0x5AC5}, //1981 #CJK UNIFIED IDEOGRAPH + {0x8B92, 0x5AC6}, //1982 #CJK UNIFIED IDEOGRAPH + {0x8B93, 0x5AC7}, //1983 #CJK UNIFIED IDEOGRAPH + {0x8B94, 0x5AC8}, //1984 #CJK UNIFIED IDEOGRAPH + {0x8B95, 0x5ACA}, //1985 #CJK UNIFIED IDEOGRAPH + {0x8B96, 0x5ACB}, //1986 #CJK UNIFIED IDEOGRAPH + {0x8B97, 0x5ACD}, //1987 #CJK UNIFIED IDEOGRAPH + {0x8B98, 0x5ACE}, //1988 #CJK UNIFIED IDEOGRAPH + {0x8B99, 0x5ACF}, //1989 #CJK UNIFIED IDEOGRAPH + {0x8B9A, 0x5AD0}, //1990 #CJK UNIFIED IDEOGRAPH + {0x8B9B, 0x5AD1}, //1991 #CJK UNIFIED IDEOGRAPH + {0x8B9C, 0x5AD3}, //1992 #CJK UNIFIED IDEOGRAPH + {0x8B9D, 0x5AD5}, //1993 #CJK UNIFIED IDEOGRAPH + {0x8B9E, 0x5AD7}, //1994 #CJK UNIFIED IDEOGRAPH + {0x8B9F, 0x5AD9}, //1995 #CJK UNIFIED IDEOGRAPH + {0x8BA0, 0x5ADA}, //1996 #CJK UNIFIED IDEOGRAPH + {0x8BA1, 0x5ADB}, //1997 #CJK UNIFIED IDEOGRAPH + {0x8BA2, 0x5ADD}, //1998 #CJK UNIFIED IDEOGRAPH + {0x8BA3, 0x5ADE}, //1999 #CJK UNIFIED IDEOGRAPH + {0x8BA4, 0x5ADF}, //2000 #CJK UNIFIED IDEOGRAPH + {0x8BA5, 0x5AE2}, //2001 #CJK UNIFIED IDEOGRAPH + {0x8BA6, 0x5AE4}, //2002 #CJK UNIFIED IDEOGRAPH + {0x8BA7, 0x5AE5}, //2003 #CJK UNIFIED IDEOGRAPH + {0x8BA8, 0x5AE7}, //2004 #CJK UNIFIED IDEOGRAPH + {0x8BA9, 0x5AE8}, //2005 #CJK UNIFIED IDEOGRAPH + {0x8BAA, 0x5AEA}, //2006 #CJK UNIFIED IDEOGRAPH + {0x8BAB, 0x5AEC}, //2007 #CJK UNIFIED IDEOGRAPH + {0x8BAC, 0x5AED}, //2008 #CJK UNIFIED IDEOGRAPH + {0x8BAD, 0x5AEE}, //2009 #CJK UNIFIED IDEOGRAPH + {0x8BAE, 0x5AEF}, //2010 #CJK UNIFIED IDEOGRAPH + {0x8BAF, 0x5AF0}, //2011 #CJK UNIFIED IDEOGRAPH + {0x8BB0, 0x5AF2}, //2012 #CJK UNIFIED IDEOGRAPH + {0x8BB1, 0x5AF3}, //2013 #CJK UNIFIED IDEOGRAPH + {0x8BB2, 0x5AF4}, //2014 #CJK UNIFIED IDEOGRAPH + {0x8BB3, 0x5AF5}, //2015 #CJK UNIFIED IDEOGRAPH + {0x8BB4, 0x5AF6}, //2016 #CJK UNIFIED IDEOGRAPH + {0x8BB5, 0x5AF7}, //2017 #CJK UNIFIED IDEOGRAPH + {0x8BB6, 0x5AF8}, //2018 #CJK UNIFIED IDEOGRAPH + {0x8BB7, 0x5AF9}, //2019 #CJK UNIFIED IDEOGRAPH + {0x8BB8, 0x5AFA}, //2020 #CJK UNIFIED IDEOGRAPH + {0x8BB9, 0x5AFB}, //2021 #CJK UNIFIED IDEOGRAPH + {0x8BBA, 0x5AFC}, //2022 #CJK UNIFIED IDEOGRAPH + {0x8BBB, 0x5AFD}, //2023 #CJK UNIFIED IDEOGRAPH + {0x8BBC, 0x5AFE}, //2024 #CJK UNIFIED IDEOGRAPH + {0x8BBD, 0x5AFF}, //2025 #CJK UNIFIED IDEOGRAPH + {0x8BBE, 0x5B00}, //2026 #CJK UNIFIED IDEOGRAPH + {0x8BBF, 0x5B01}, //2027 #CJK UNIFIED IDEOGRAPH + {0x8BC0, 0x5B02}, //2028 #CJK UNIFIED IDEOGRAPH + {0x8BC1, 0x5B03}, //2029 #CJK UNIFIED IDEOGRAPH + {0x8BC2, 0x5B04}, //2030 #CJK UNIFIED IDEOGRAPH + {0x8BC3, 0x5B05}, //2031 #CJK UNIFIED IDEOGRAPH + {0x8BC4, 0x5B06}, //2032 #CJK UNIFIED IDEOGRAPH + {0x8BC5, 0x5B07}, //2033 #CJK UNIFIED IDEOGRAPH + {0x8BC6, 0x5B08}, //2034 #CJK UNIFIED IDEOGRAPH + {0x8BC7, 0x5B0A}, //2035 #CJK UNIFIED IDEOGRAPH + {0x8BC8, 0x5B0B}, //2036 #CJK UNIFIED IDEOGRAPH + {0x8BC9, 0x5B0C}, //2037 #CJK UNIFIED IDEOGRAPH + {0x8BCA, 0x5B0D}, //2038 #CJK UNIFIED IDEOGRAPH + {0x8BCB, 0x5B0E}, //2039 #CJK UNIFIED IDEOGRAPH + {0x8BCC, 0x5B0F}, //2040 #CJK UNIFIED IDEOGRAPH + {0x8BCD, 0x5B10}, //2041 #CJK UNIFIED IDEOGRAPH + {0x8BCE, 0x5B11}, //2042 #CJK UNIFIED IDEOGRAPH + {0x8BCF, 0x5B12}, //2043 #CJK UNIFIED IDEOGRAPH + {0x8BD0, 0x5B13}, //2044 #CJK UNIFIED IDEOGRAPH + {0x8BD1, 0x5B14}, //2045 #CJK UNIFIED IDEOGRAPH + {0x8BD2, 0x5B15}, //2046 #CJK UNIFIED IDEOGRAPH + {0x8BD3, 0x5B18}, //2047 #CJK UNIFIED IDEOGRAPH + {0x8BD4, 0x5B19}, //2048 #CJK UNIFIED IDEOGRAPH + {0x8BD5, 0x5B1A}, //2049 #CJK UNIFIED IDEOGRAPH + {0x8BD6, 0x5B1B}, //2050 #CJK UNIFIED IDEOGRAPH + {0x8BD7, 0x5B1C}, //2051 #CJK UNIFIED IDEOGRAPH + {0x8BD8, 0x5B1D}, //2052 #CJK UNIFIED IDEOGRAPH + {0x8BD9, 0x5B1E}, //2053 #CJK UNIFIED IDEOGRAPH + {0x8BDA, 0x5B1F}, //2054 #CJK UNIFIED IDEOGRAPH + {0x8BDB, 0x5B20}, //2055 #CJK UNIFIED IDEOGRAPH + {0x8BDC, 0x5B21}, //2056 #CJK UNIFIED IDEOGRAPH + {0x8BDD, 0x5B22}, //2057 #CJK UNIFIED IDEOGRAPH + {0x8BDE, 0x5B23}, //2058 #CJK UNIFIED IDEOGRAPH + {0x8BDF, 0x5B24}, //2059 #CJK UNIFIED IDEOGRAPH + {0x8BE0, 0x5B25}, //2060 #CJK UNIFIED IDEOGRAPH + {0x8BE1, 0x5B26}, //2061 #CJK UNIFIED IDEOGRAPH + {0x8BE2, 0x5B27}, //2062 #CJK UNIFIED IDEOGRAPH + {0x8BE3, 0x5B28}, //2063 #CJK UNIFIED IDEOGRAPH + {0x8BE4, 0x5B29}, //2064 #CJK UNIFIED IDEOGRAPH + {0x8BE5, 0x5B2A}, //2065 #CJK UNIFIED IDEOGRAPH + {0x8BE6, 0x5B2B}, //2066 #CJK UNIFIED IDEOGRAPH + {0x8BE7, 0x5B2C}, //2067 #CJK UNIFIED IDEOGRAPH + {0x8BE8, 0x5B2D}, //2068 #CJK UNIFIED IDEOGRAPH + {0x8BE9, 0x5B2E}, //2069 #CJK UNIFIED IDEOGRAPH + {0x8BEA, 0x5B2F}, //2070 #CJK UNIFIED IDEOGRAPH + {0x8BEB, 0x5B30}, //2071 #CJK UNIFIED IDEOGRAPH + {0x8BEC, 0x5B31}, //2072 #CJK UNIFIED IDEOGRAPH + {0x8BED, 0x5B33}, //2073 #CJK UNIFIED IDEOGRAPH + {0x8BEE, 0x5B35}, //2074 #CJK UNIFIED IDEOGRAPH + {0x8BEF, 0x5B36}, //2075 #CJK UNIFIED IDEOGRAPH + {0x8BF0, 0x5B38}, //2076 #CJK UNIFIED IDEOGRAPH + {0x8BF1, 0x5B39}, //2077 #CJK UNIFIED IDEOGRAPH + {0x8BF2, 0x5B3A}, //2078 #CJK UNIFIED IDEOGRAPH + {0x8BF3, 0x5B3B}, //2079 #CJK UNIFIED IDEOGRAPH + {0x8BF4, 0x5B3C}, //2080 #CJK UNIFIED IDEOGRAPH + {0x8BF5, 0x5B3D}, //2081 #CJK UNIFIED IDEOGRAPH + {0x8BF6, 0x5B3E}, //2082 #CJK UNIFIED IDEOGRAPH + {0x8BF7, 0x5B3F}, //2083 #CJK UNIFIED IDEOGRAPH + {0x8BF8, 0x5B41}, //2084 #CJK UNIFIED IDEOGRAPH + {0x8BF9, 0x5B42}, //2085 #CJK UNIFIED IDEOGRAPH + {0x8BFA, 0x5B43}, //2086 #CJK UNIFIED IDEOGRAPH + {0x8BFB, 0x5B44}, //2087 #CJK UNIFIED IDEOGRAPH + {0x8BFC, 0x5B45}, //2088 #CJK UNIFIED IDEOGRAPH + {0x8BFD, 0x5B46}, //2089 #CJK UNIFIED IDEOGRAPH + {0x8BFE, 0x5B47}, //2090 #CJK UNIFIED IDEOGRAPH + {0x8C40, 0x5B48}, //2091 #CJK UNIFIED IDEOGRAPH + {0x8C41, 0x5B49}, //2092 #CJK UNIFIED IDEOGRAPH + {0x8C42, 0x5B4A}, //2093 #CJK UNIFIED IDEOGRAPH + {0x8C43, 0x5B4B}, //2094 #CJK UNIFIED IDEOGRAPH + {0x8C44, 0x5B4C}, //2095 #CJK UNIFIED IDEOGRAPH + {0x8C45, 0x5B4D}, //2096 #CJK UNIFIED IDEOGRAPH + {0x8C46, 0x5B4E}, //2097 #CJK UNIFIED IDEOGRAPH + {0x8C47, 0x5B4F}, //2098 #CJK UNIFIED IDEOGRAPH + {0x8C48, 0x5B52}, //2099 #CJK UNIFIED IDEOGRAPH + {0x8C49, 0x5B56}, //2100 #CJK UNIFIED IDEOGRAPH + {0x8C4A, 0x5B5E}, //2101 #CJK UNIFIED IDEOGRAPH + {0x8C4B, 0x5B60}, //2102 #CJK UNIFIED IDEOGRAPH + {0x8C4C, 0x5B61}, //2103 #CJK UNIFIED IDEOGRAPH + {0x8C4D, 0x5B67}, //2104 #CJK UNIFIED IDEOGRAPH + {0x8C4E, 0x5B68}, //2105 #CJK UNIFIED IDEOGRAPH + {0x8C4F, 0x5B6B}, //2106 #CJK UNIFIED IDEOGRAPH + {0x8C50, 0x5B6D}, //2107 #CJK UNIFIED IDEOGRAPH + {0x8C51, 0x5B6E}, //2108 #CJK UNIFIED IDEOGRAPH + {0x8C52, 0x5B6F}, //2109 #CJK UNIFIED IDEOGRAPH + {0x8C53, 0x5B72}, //2110 #CJK UNIFIED IDEOGRAPH + {0x8C54, 0x5B74}, //2111 #CJK UNIFIED IDEOGRAPH + {0x8C55, 0x5B76}, //2112 #CJK UNIFIED IDEOGRAPH + {0x8C56, 0x5B77}, //2113 #CJK UNIFIED IDEOGRAPH + {0x8C57, 0x5B78}, //2114 #CJK UNIFIED IDEOGRAPH + {0x8C58, 0x5B79}, //2115 #CJK UNIFIED IDEOGRAPH + {0x8C59, 0x5B7B}, //2116 #CJK UNIFIED IDEOGRAPH + {0x8C5A, 0x5B7C}, //2117 #CJK UNIFIED IDEOGRAPH + {0x8C5B, 0x5B7E}, //2118 #CJK UNIFIED IDEOGRAPH + {0x8C5C, 0x5B7F}, //2119 #CJK UNIFIED IDEOGRAPH + {0x8C5D, 0x5B82}, //2120 #CJK UNIFIED IDEOGRAPH + {0x8C5E, 0x5B86}, //2121 #CJK UNIFIED IDEOGRAPH + {0x8C5F, 0x5B8A}, //2122 #CJK UNIFIED IDEOGRAPH + {0x8C60, 0x5B8D}, //2123 #CJK UNIFIED IDEOGRAPH + {0x8C61, 0x5B8E}, //2124 #CJK UNIFIED IDEOGRAPH + {0x8C62, 0x5B90}, //2125 #CJK UNIFIED IDEOGRAPH + {0x8C63, 0x5B91}, //2126 #CJK UNIFIED IDEOGRAPH + {0x8C64, 0x5B92}, //2127 #CJK UNIFIED IDEOGRAPH + {0x8C65, 0x5B94}, //2128 #CJK UNIFIED IDEOGRAPH + {0x8C66, 0x5B96}, //2129 #CJK UNIFIED IDEOGRAPH + {0x8C67, 0x5B9F}, //2130 #CJK UNIFIED IDEOGRAPH + {0x8C68, 0x5BA7}, //2131 #CJK UNIFIED IDEOGRAPH + {0x8C69, 0x5BA8}, //2132 #CJK UNIFIED IDEOGRAPH + {0x8C6A, 0x5BA9}, //2133 #CJK UNIFIED IDEOGRAPH + {0x8C6B, 0x5BAC}, //2134 #CJK UNIFIED IDEOGRAPH + {0x8C6C, 0x5BAD}, //2135 #CJK UNIFIED IDEOGRAPH + {0x8C6D, 0x5BAE}, //2136 #CJK UNIFIED IDEOGRAPH + {0x8C6E, 0x5BAF}, //2137 #CJK UNIFIED IDEOGRAPH + {0x8C6F, 0x5BB1}, //2138 #CJK UNIFIED IDEOGRAPH + {0x8C70, 0x5BB2}, //2139 #CJK UNIFIED IDEOGRAPH + {0x8C71, 0x5BB7}, //2140 #CJK UNIFIED IDEOGRAPH + {0x8C72, 0x5BBA}, //2141 #CJK UNIFIED IDEOGRAPH + {0x8C73, 0x5BBB}, //2142 #CJK UNIFIED IDEOGRAPH + {0x8C74, 0x5BBC}, //2143 #CJK UNIFIED IDEOGRAPH + {0x8C75, 0x5BC0}, //2144 #CJK UNIFIED IDEOGRAPH + {0x8C76, 0x5BC1}, //2145 #CJK UNIFIED IDEOGRAPH + {0x8C77, 0x5BC3}, //2146 #CJK UNIFIED IDEOGRAPH + {0x8C78, 0x5BC8}, //2147 #CJK UNIFIED IDEOGRAPH + {0x8C79, 0x5BC9}, //2148 #CJK UNIFIED IDEOGRAPH + {0x8C7A, 0x5BCA}, //2149 #CJK UNIFIED IDEOGRAPH + {0x8C7B, 0x5BCB}, //2150 #CJK UNIFIED IDEOGRAPH + {0x8C7C, 0x5BCD}, //2151 #CJK UNIFIED IDEOGRAPH + {0x8C7D, 0x5BCE}, //2152 #CJK UNIFIED IDEOGRAPH + {0x8C7E, 0x5BCF}, //2153 #CJK UNIFIED IDEOGRAPH + {0x8C80, 0x5BD1}, //2154 #CJK UNIFIED IDEOGRAPH + {0x8C81, 0x5BD4}, //2155 #CJK UNIFIED IDEOGRAPH + {0x8C82, 0x5BD5}, //2156 #CJK UNIFIED IDEOGRAPH + {0x8C83, 0x5BD6}, //2157 #CJK UNIFIED IDEOGRAPH + {0x8C84, 0x5BD7}, //2158 #CJK UNIFIED IDEOGRAPH + {0x8C85, 0x5BD8}, //2159 #CJK UNIFIED IDEOGRAPH + {0x8C86, 0x5BD9}, //2160 #CJK UNIFIED IDEOGRAPH + {0x8C87, 0x5BDA}, //2161 #CJK UNIFIED IDEOGRAPH + {0x8C88, 0x5BDB}, //2162 #CJK UNIFIED IDEOGRAPH + {0x8C89, 0x5BDC}, //2163 #CJK UNIFIED IDEOGRAPH + {0x8C8A, 0x5BE0}, //2164 #CJK UNIFIED IDEOGRAPH + {0x8C8B, 0x5BE2}, //2165 #CJK UNIFIED IDEOGRAPH + {0x8C8C, 0x5BE3}, //2166 #CJK UNIFIED IDEOGRAPH + {0x8C8D, 0x5BE6}, //2167 #CJK UNIFIED IDEOGRAPH + {0x8C8E, 0x5BE7}, //2168 #CJK UNIFIED IDEOGRAPH + {0x8C8F, 0x5BE9}, //2169 #CJK UNIFIED IDEOGRAPH + {0x8C90, 0x5BEA}, //2170 #CJK UNIFIED IDEOGRAPH + {0x8C91, 0x5BEB}, //2171 #CJK UNIFIED IDEOGRAPH + {0x8C92, 0x5BEC}, //2172 #CJK UNIFIED IDEOGRAPH + {0x8C93, 0x5BED}, //2173 #CJK UNIFIED IDEOGRAPH + {0x8C94, 0x5BEF}, //2174 #CJK UNIFIED IDEOGRAPH + {0x8C95, 0x5BF1}, //2175 #CJK UNIFIED IDEOGRAPH + {0x8C96, 0x5BF2}, //2176 #CJK UNIFIED IDEOGRAPH + {0x8C97, 0x5BF3}, //2177 #CJK UNIFIED IDEOGRAPH + {0x8C98, 0x5BF4}, //2178 #CJK UNIFIED IDEOGRAPH + {0x8C99, 0x5BF5}, //2179 #CJK UNIFIED IDEOGRAPH + {0x8C9A, 0x5BF6}, //2180 #CJK UNIFIED IDEOGRAPH + {0x8C9B, 0x5BF7}, //2181 #CJK UNIFIED IDEOGRAPH + {0x8C9C, 0x5BFD}, //2182 #CJK UNIFIED IDEOGRAPH + {0x8C9D, 0x5BFE}, //2183 #CJK UNIFIED IDEOGRAPH + {0x8C9E, 0x5C00}, //2184 #CJK UNIFIED IDEOGRAPH + {0x8C9F, 0x5C02}, //2185 #CJK UNIFIED IDEOGRAPH + {0x8CA0, 0x5C03}, //2186 #CJK UNIFIED IDEOGRAPH + {0x8CA1, 0x5C05}, //2187 #CJK UNIFIED IDEOGRAPH + {0x8CA2, 0x5C07}, //2188 #CJK UNIFIED IDEOGRAPH + {0x8CA3, 0x5C08}, //2189 #CJK UNIFIED IDEOGRAPH + {0x8CA4, 0x5C0B}, //2190 #CJK UNIFIED IDEOGRAPH + {0x8CA5, 0x5C0C}, //2191 #CJK UNIFIED IDEOGRAPH + {0x8CA6, 0x5C0D}, //2192 #CJK UNIFIED IDEOGRAPH + {0x8CA7, 0x5C0E}, //2193 #CJK UNIFIED IDEOGRAPH + {0x8CA8, 0x5C10}, //2194 #CJK UNIFIED IDEOGRAPH + {0x8CA9, 0x5C12}, //2195 #CJK UNIFIED IDEOGRAPH + {0x8CAA, 0x5C13}, //2196 #CJK UNIFIED IDEOGRAPH + {0x8CAB, 0x5C17}, //2197 #CJK UNIFIED IDEOGRAPH + {0x8CAC, 0x5C19}, //2198 #CJK UNIFIED IDEOGRAPH + {0x8CAD, 0x5C1B}, //2199 #CJK UNIFIED IDEOGRAPH + {0x8CAE, 0x5C1E}, //2200 #CJK UNIFIED IDEOGRAPH + {0x8CAF, 0x5C1F}, //2201 #CJK UNIFIED IDEOGRAPH + {0x8CB0, 0x5C20}, //2202 #CJK UNIFIED IDEOGRAPH + {0x8CB1, 0x5C21}, //2203 #CJK UNIFIED IDEOGRAPH + {0x8CB2, 0x5C23}, //2204 #CJK UNIFIED IDEOGRAPH + {0x8CB3, 0x5C26}, //2205 #CJK UNIFIED IDEOGRAPH + {0x8CB4, 0x5C28}, //2206 #CJK UNIFIED IDEOGRAPH + {0x8CB5, 0x5C29}, //2207 #CJK UNIFIED IDEOGRAPH + {0x8CB6, 0x5C2A}, //2208 #CJK UNIFIED IDEOGRAPH + {0x8CB7, 0x5C2B}, //2209 #CJK UNIFIED IDEOGRAPH + {0x8CB8, 0x5C2D}, //2210 #CJK UNIFIED IDEOGRAPH + {0x8CB9, 0x5C2E}, //2211 #CJK UNIFIED IDEOGRAPH + {0x8CBA, 0x5C2F}, //2212 #CJK UNIFIED IDEOGRAPH + {0x8CBB, 0x5C30}, //2213 #CJK UNIFIED IDEOGRAPH + {0x8CBC, 0x5C32}, //2214 #CJK UNIFIED IDEOGRAPH + {0x8CBD, 0x5C33}, //2215 #CJK UNIFIED IDEOGRAPH + {0x8CBE, 0x5C35}, //2216 #CJK UNIFIED IDEOGRAPH + {0x8CBF, 0x5C36}, //2217 #CJK UNIFIED IDEOGRAPH + {0x8CC0, 0x5C37}, //2218 #CJK UNIFIED IDEOGRAPH + {0x8CC1, 0x5C43}, //2219 #CJK UNIFIED IDEOGRAPH + {0x8CC2, 0x5C44}, //2220 #CJK UNIFIED IDEOGRAPH + {0x8CC3, 0x5C46}, //2221 #CJK UNIFIED IDEOGRAPH + {0x8CC4, 0x5C47}, //2222 #CJK UNIFIED IDEOGRAPH + {0x8CC5, 0x5C4C}, //2223 #CJK UNIFIED IDEOGRAPH + {0x8CC6, 0x5C4D}, //2224 #CJK UNIFIED IDEOGRAPH + {0x8CC7, 0x5C52}, //2225 #CJK UNIFIED IDEOGRAPH + {0x8CC8, 0x5C53}, //2226 #CJK UNIFIED IDEOGRAPH + {0x8CC9, 0x5C54}, //2227 #CJK UNIFIED IDEOGRAPH + {0x8CCA, 0x5C56}, //2228 #CJK UNIFIED IDEOGRAPH + {0x8CCB, 0x5C57}, //2229 #CJK UNIFIED IDEOGRAPH + {0x8CCC, 0x5C58}, //2230 #CJK UNIFIED IDEOGRAPH + {0x8CCD, 0x5C5A}, //2231 #CJK UNIFIED IDEOGRAPH + {0x8CCE, 0x5C5B}, //2232 #CJK UNIFIED IDEOGRAPH + {0x8CCF, 0x5C5C}, //2233 #CJK UNIFIED IDEOGRAPH + {0x8CD0, 0x5C5D}, //2234 #CJK UNIFIED IDEOGRAPH + {0x8CD1, 0x5C5F}, //2235 #CJK UNIFIED IDEOGRAPH + {0x8CD2, 0x5C62}, //2236 #CJK UNIFIED IDEOGRAPH + {0x8CD3, 0x5C64}, //2237 #CJK UNIFIED IDEOGRAPH + {0x8CD4, 0x5C67}, //2238 #CJK UNIFIED IDEOGRAPH + {0x8CD5, 0x5C68}, //2239 #CJK UNIFIED IDEOGRAPH + {0x8CD6, 0x5C69}, //2240 #CJK UNIFIED IDEOGRAPH + {0x8CD7, 0x5C6A}, //2241 #CJK UNIFIED IDEOGRAPH + {0x8CD8, 0x5C6B}, //2242 #CJK UNIFIED IDEOGRAPH + {0x8CD9, 0x5C6C}, //2243 #CJK UNIFIED IDEOGRAPH + {0x8CDA, 0x5C6D}, //2244 #CJK UNIFIED IDEOGRAPH + {0x8CDB, 0x5C70}, //2245 #CJK UNIFIED IDEOGRAPH + {0x8CDC, 0x5C72}, //2246 #CJK UNIFIED IDEOGRAPH + {0x8CDD, 0x5C73}, //2247 #CJK UNIFIED IDEOGRAPH + {0x8CDE, 0x5C74}, //2248 #CJK UNIFIED IDEOGRAPH + {0x8CDF, 0x5C75}, //2249 #CJK UNIFIED IDEOGRAPH + {0x8CE0, 0x5C76}, //2250 #CJK UNIFIED IDEOGRAPH + {0x8CE1, 0x5C77}, //2251 #CJK UNIFIED IDEOGRAPH + {0x8CE2, 0x5C78}, //2252 #CJK UNIFIED IDEOGRAPH + {0x8CE3, 0x5C7B}, //2253 #CJK UNIFIED IDEOGRAPH + {0x8CE4, 0x5C7C}, //2254 #CJK UNIFIED IDEOGRAPH + {0x8CE5, 0x5C7D}, //2255 #CJK UNIFIED IDEOGRAPH + {0x8CE6, 0x5C7E}, //2256 #CJK UNIFIED IDEOGRAPH + {0x8CE7, 0x5C80}, //2257 #CJK UNIFIED IDEOGRAPH + {0x8CE8, 0x5C83}, //2258 #CJK UNIFIED IDEOGRAPH + {0x8CE9, 0x5C84}, //2259 #CJK UNIFIED IDEOGRAPH + {0x8CEA, 0x5C85}, //2260 #CJK UNIFIED IDEOGRAPH + {0x8CEB, 0x5C86}, //2261 #CJK UNIFIED IDEOGRAPH + {0x8CEC, 0x5C87}, //2262 #CJK UNIFIED IDEOGRAPH + {0x8CED, 0x5C89}, //2263 #CJK UNIFIED IDEOGRAPH + {0x8CEE, 0x5C8A}, //2264 #CJK UNIFIED IDEOGRAPH + {0x8CEF, 0x5C8B}, //2265 #CJK UNIFIED IDEOGRAPH + {0x8CF0, 0x5C8E}, //2266 #CJK UNIFIED IDEOGRAPH + {0x8CF1, 0x5C8F}, //2267 #CJK UNIFIED IDEOGRAPH + {0x8CF2, 0x5C92}, //2268 #CJK UNIFIED IDEOGRAPH + {0x8CF3, 0x5C93}, //2269 #CJK UNIFIED IDEOGRAPH + {0x8CF4, 0x5C95}, //2270 #CJK UNIFIED IDEOGRAPH + {0x8CF5, 0x5C9D}, //2271 #CJK UNIFIED IDEOGRAPH + {0x8CF6, 0x5C9E}, //2272 #CJK UNIFIED IDEOGRAPH + {0x8CF7, 0x5C9F}, //2273 #CJK UNIFIED IDEOGRAPH + {0x8CF8, 0x5CA0}, //2274 #CJK UNIFIED IDEOGRAPH + {0x8CF9, 0x5CA1}, //2275 #CJK UNIFIED IDEOGRAPH + {0x8CFA, 0x5CA4}, //2276 #CJK UNIFIED IDEOGRAPH + {0x8CFB, 0x5CA5}, //2277 #CJK UNIFIED IDEOGRAPH + {0x8CFC, 0x5CA6}, //2278 #CJK UNIFIED IDEOGRAPH + {0x8CFD, 0x5CA7}, //2279 #CJK UNIFIED IDEOGRAPH + {0x8CFE, 0x5CA8}, //2280 #CJK UNIFIED IDEOGRAPH + {0x8D40, 0x5CAA}, //2281 #CJK UNIFIED IDEOGRAPH + {0x8D41, 0x5CAE}, //2282 #CJK UNIFIED IDEOGRAPH + {0x8D42, 0x5CAF}, //2283 #CJK UNIFIED IDEOGRAPH + {0x8D43, 0x5CB0}, //2284 #CJK UNIFIED IDEOGRAPH + {0x8D44, 0x5CB2}, //2285 #CJK UNIFIED IDEOGRAPH + {0x8D45, 0x5CB4}, //2286 #CJK UNIFIED IDEOGRAPH + {0x8D46, 0x5CB6}, //2287 #CJK UNIFIED IDEOGRAPH + {0x8D47, 0x5CB9}, //2288 #CJK UNIFIED IDEOGRAPH + {0x8D48, 0x5CBA}, //2289 #CJK UNIFIED IDEOGRAPH + {0x8D49, 0x5CBB}, //2290 #CJK UNIFIED IDEOGRAPH + {0x8D4A, 0x5CBC}, //2291 #CJK UNIFIED IDEOGRAPH + {0x8D4B, 0x5CBE}, //2292 #CJK UNIFIED IDEOGRAPH + {0x8D4C, 0x5CC0}, //2293 #CJK UNIFIED IDEOGRAPH + {0x8D4D, 0x5CC2}, //2294 #CJK UNIFIED IDEOGRAPH + {0x8D4E, 0x5CC3}, //2295 #CJK UNIFIED IDEOGRAPH + {0x8D4F, 0x5CC5}, //2296 #CJK UNIFIED IDEOGRAPH + {0x8D50, 0x5CC6}, //2297 #CJK UNIFIED IDEOGRAPH + {0x8D51, 0x5CC7}, //2298 #CJK UNIFIED IDEOGRAPH + {0x8D52, 0x5CC8}, //2299 #CJK UNIFIED IDEOGRAPH + {0x8D53, 0x5CC9}, //2300 #CJK UNIFIED IDEOGRAPH + {0x8D54, 0x5CCA}, //2301 #CJK UNIFIED IDEOGRAPH + {0x8D55, 0x5CCC}, //2302 #CJK UNIFIED IDEOGRAPH + {0x8D56, 0x5CCD}, //2303 #CJK UNIFIED IDEOGRAPH + {0x8D57, 0x5CCE}, //2304 #CJK UNIFIED IDEOGRAPH + {0x8D58, 0x5CCF}, //2305 #CJK UNIFIED IDEOGRAPH + {0x8D59, 0x5CD0}, //2306 #CJK UNIFIED IDEOGRAPH + {0x8D5A, 0x5CD1}, //2307 #CJK UNIFIED IDEOGRAPH + {0x8D5B, 0x5CD3}, //2308 #CJK UNIFIED IDEOGRAPH + {0x8D5C, 0x5CD4}, //2309 #CJK UNIFIED IDEOGRAPH + {0x8D5D, 0x5CD5}, //2310 #CJK UNIFIED IDEOGRAPH + {0x8D5E, 0x5CD6}, //2311 #CJK UNIFIED IDEOGRAPH + {0x8D5F, 0x5CD7}, //2312 #CJK UNIFIED IDEOGRAPH + {0x8D60, 0x5CD8}, //2313 #CJK UNIFIED IDEOGRAPH + {0x8D61, 0x5CDA}, //2314 #CJK UNIFIED IDEOGRAPH + {0x8D62, 0x5CDB}, //2315 #CJK UNIFIED IDEOGRAPH + {0x8D63, 0x5CDC}, //2316 #CJK UNIFIED IDEOGRAPH + {0x8D64, 0x5CDD}, //2317 #CJK UNIFIED IDEOGRAPH + {0x8D65, 0x5CDE}, //2318 #CJK UNIFIED IDEOGRAPH + {0x8D66, 0x5CDF}, //2319 #CJK UNIFIED IDEOGRAPH + {0x8D67, 0x5CE0}, //2320 #CJK UNIFIED IDEOGRAPH + {0x8D68, 0x5CE2}, //2321 #CJK UNIFIED IDEOGRAPH + {0x8D69, 0x5CE3}, //2322 #CJK UNIFIED IDEOGRAPH + {0x8D6A, 0x5CE7}, //2323 #CJK UNIFIED IDEOGRAPH + {0x8D6B, 0x5CE9}, //2324 #CJK UNIFIED IDEOGRAPH + {0x8D6C, 0x5CEB}, //2325 #CJK UNIFIED IDEOGRAPH + {0x8D6D, 0x5CEC}, //2326 #CJK UNIFIED IDEOGRAPH + {0x8D6E, 0x5CEE}, //2327 #CJK UNIFIED IDEOGRAPH + {0x8D6F, 0x5CEF}, //2328 #CJK UNIFIED IDEOGRAPH + {0x8D70, 0x5CF1}, //2329 #CJK UNIFIED IDEOGRAPH + {0x8D71, 0x5CF2}, //2330 #CJK UNIFIED IDEOGRAPH + {0x8D72, 0x5CF3}, //2331 #CJK UNIFIED IDEOGRAPH + {0x8D73, 0x5CF4}, //2332 #CJK UNIFIED IDEOGRAPH + {0x8D74, 0x5CF5}, //2333 #CJK UNIFIED IDEOGRAPH + {0x8D75, 0x5CF6}, //2334 #CJK UNIFIED IDEOGRAPH + {0x8D76, 0x5CF7}, //2335 #CJK UNIFIED IDEOGRAPH + {0x8D77, 0x5CF8}, //2336 #CJK UNIFIED IDEOGRAPH + {0x8D78, 0x5CF9}, //2337 #CJK UNIFIED IDEOGRAPH + {0x8D79, 0x5CFA}, //2338 #CJK UNIFIED IDEOGRAPH + {0x8D7A, 0x5CFC}, //2339 #CJK UNIFIED IDEOGRAPH + {0x8D7B, 0x5CFD}, //2340 #CJK UNIFIED IDEOGRAPH + {0x8D7C, 0x5CFE}, //2341 #CJK UNIFIED IDEOGRAPH + {0x8D7D, 0x5CFF}, //2342 #CJK UNIFIED IDEOGRAPH + {0x8D7E, 0x5D00}, //2343 #CJK UNIFIED IDEOGRAPH + {0x8D80, 0x5D01}, //2344 #CJK UNIFIED IDEOGRAPH + {0x8D81, 0x5D04}, //2345 #CJK UNIFIED IDEOGRAPH + {0x8D82, 0x5D05}, //2346 #CJK UNIFIED IDEOGRAPH + {0x8D83, 0x5D08}, //2347 #CJK UNIFIED IDEOGRAPH + {0x8D84, 0x5D09}, //2348 #CJK UNIFIED IDEOGRAPH + {0x8D85, 0x5D0A}, //2349 #CJK UNIFIED IDEOGRAPH + {0x8D86, 0x5D0B}, //2350 #CJK UNIFIED IDEOGRAPH + {0x8D87, 0x5D0C}, //2351 #CJK UNIFIED IDEOGRAPH + {0x8D88, 0x5D0D}, //2352 #CJK UNIFIED IDEOGRAPH + {0x8D89, 0x5D0F}, //2353 #CJK UNIFIED IDEOGRAPH + {0x8D8A, 0x5D10}, //2354 #CJK UNIFIED IDEOGRAPH + {0x8D8B, 0x5D11}, //2355 #CJK UNIFIED IDEOGRAPH + {0x8D8C, 0x5D12}, //2356 #CJK UNIFIED IDEOGRAPH + {0x8D8D, 0x5D13}, //2357 #CJK UNIFIED IDEOGRAPH + {0x8D8E, 0x5D15}, //2358 #CJK UNIFIED IDEOGRAPH + {0x8D8F, 0x5D17}, //2359 #CJK UNIFIED IDEOGRAPH + {0x8D90, 0x5D18}, //2360 #CJK UNIFIED IDEOGRAPH + {0x8D91, 0x5D19}, //2361 #CJK UNIFIED IDEOGRAPH + {0x8D92, 0x5D1A}, //2362 #CJK UNIFIED IDEOGRAPH + {0x8D93, 0x5D1C}, //2363 #CJK UNIFIED IDEOGRAPH + {0x8D94, 0x5D1D}, //2364 #CJK UNIFIED IDEOGRAPH + {0x8D95, 0x5D1F}, //2365 #CJK UNIFIED IDEOGRAPH + {0x8D96, 0x5D20}, //2366 #CJK UNIFIED IDEOGRAPH + {0x8D97, 0x5D21}, //2367 #CJK UNIFIED IDEOGRAPH + {0x8D98, 0x5D22}, //2368 #CJK UNIFIED IDEOGRAPH + {0x8D99, 0x5D23}, //2369 #CJK UNIFIED IDEOGRAPH + {0x8D9A, 0x5D25}, //2370 #CJK UNIFIED IDEOGRAPH + {0x8D9B, 0x5D28}, //2371 #CJK UNIFIED IDEOGRAPH + {0x8D9C, 0x5D2A}, //2372 #CJK UNIFIED IDEOGRAPH + {0x8D9D, 0x5D2B}, //2373 #CJK UNIFIED IDEOGRAPH + {0x8D9E, 0x5D2C}, //2374 #CJK UNIFIED IDEOGRAPH + {0x8D9F, 0x5D2F}, //2375 #CJK UNIFIED IDEOGRAPH + {0x8DA0, 0x5D30}, //2376 #CJK UNIFIED IDEOGRAPH + {0x8DA1, 0x5D31}, //2377 #CJK UNIFIED IDEOGRAPH + {0x8DA2, 0x5D32}, //2378 #CJK UNIFIED IDEOGRAPH + {0x8DA3, 0x5D33}, //2379 #CJK UNIFIED IDEOGRAPH + {0x8DA4, 0x5D35}, //2380 #CJK UNIFIED IDEOGRAPH + {0x8DA5, 0x5D36}, //2381 #CJK UNIFIED IDEOGRAPH + {0x8DA6, 0x5D37}, //2382 #CJK UNIFIED IDEOGRAPH + {0x8DA7, 0x5D38}, //2383 #CJK UNIFIED IDEOGRAPH + {0x8DA8, 0x5D39}, //2384 #CJK UNIFIED IDEOGRAPH + {0x8DA9, 0x5D3A}, //2385 #CJK UNIFIED IDEOGRAPH + {0x8DAA, 0x5D3B}, //2386 #CJK UNIFIED IDEOGRAPH + {0x8DAB, 0x5D3C}, //2387 #CJK UNIFIED IDEOGRAPH + {0x8DAC, 0x5D3F}, //2388 #CJK UNIFIED IDEOGRAPH + {0x8DAD, 0x5D40}, //2389 #CJK UNIFIED IDEOGRAPH + {0x8DAE, 0x5D41}, //2390 #CJK UNIFIED IDEOGRAPH + {0x8DAF, 0x5D42}, //2391 #CJK UNIFIED IDEOGRAPH + {0x8DB0, 0x5D43}, //2392 #CJK UNIFIED IDEOGRAPH + {0x8DB1, 0x5D44}, //2393 #CJK UNIFIED IDEOGRAPH + {0x8DB2, 0x5D45}, //2394 #CJK UNIFIED IDEOGRAPH + {0x8DB3, 0x5D46}, //2395 #CJK UNIFIED IDEOGRAPH + {0x8DB4, 0x5D48}, //2396 #CJK UNIFIED IDEOGRAPH + {0x8DB5, 0x5D49}, //2397 #CJK UNIFIED IDEOGRAPH + {0x8DB6, 0x5D4D}, //2398 #CJK UNIFIED IDEOGRAPH + {0x8DB7, 0x5D4E}, //2399 #CJK UNIFIED IDEOGRAPH + {0x8DB8, 0x5D4F}, //2400 #CJK UNIFIED IDEOGRAPH + {0x8DB9, 0x5D50}, //2401 #CJK UNIFIED IDEOGRAPH + {0x8DBA, 0x5D51}, //2402 #CJK UNIFIED IDEOGRAPH + {0x8DBB, 0x5D52}, //2403 #CJK UNIFIED IDEOGRAPH + {0x8DBC, 0x5D53}, //2404 #CJK UNIFIED IDEOGRAPH + {0x8DBD, 0x5D54}, //2405 #CJK UNIFIED IDEOGRAPH + {0x8DBE, 0x5D55}, //2406 #CJK UNIFIED IDEOGRAPH + {0x8DBF, 0x5D56}, //2407 #CJK UNIFIED IDEOGRAPH + {0x8DC0, 0x5D57}, //2408 #CJK UNIFIED IDEOGRAPH + {0x8DC1, 0x5D59}, //2409 #CJK UNIFIED IDEOGRAPH + {0x8DC2, 0x5D5A}, //2410 #CJK UNIFIED IDEOGRAPH + {0x8DC3, 0x5D5C}, //2411 #CJK UNIFIED IDEOGRAPH + {0x8DC4, 0x5D5E}, //2412 #CJK UNIFIED IDEOGRAPH + {0x8DC5, 0x5D5F}, //2413 #CJK UNIFIED IDEOGRAPH + {0x8DC6, 0x5D60}, //2414 #CJK UNIFIED IDEOGRAPH + {0x8DC7, 0x5D61}, //2415 #CJK UNIFIED IDEOGRAPH + {0x8DC8, 0x5D62}, //2416 #CJK UNIFIED IDEOGRAPH + {0x8DC9, 0x5D63}, //2417 #CJK UNIFIED IDEOGRAPH + {0x8DCA, 0x5D64}, //2418 #CJK UNIFIED IDEOGRAPH + {0x8DCB, 0x5D65}, //2419 #CJK UNIFIED IDEOGRAPH + {0x8DCC, 0x5D66}, //2420 #CJK UNIFIED IDEOGRAPH + {0x8DCD, 0x5D67}, //2421 #CJK UNIFIED IDEOGRAPH + {0x8DCE, 0x5D68}, //2422 #CJK UNIFIED IDEOGRAPH + {0x8DCF, 0x5D6A}, //2423 #CJK UNIFIED IDEOGRAPH + {0x8DD0, 0x5D6D}, //2424 #CJK UNIFIED IDEOGRAPH + {0x8DD1, 0x5D6E}, //2425 #CJK UNIFIED IDEOGRAPH + {0x8DD2, 0x5D70}, //2426 #CJK UNIFIED IDEOGRAPH + {0x8DD3, 0x5D71}, //2427 #CJK UNIFIED IDEOGRAPH + {0x8DD4, 0x5D72}, //2428 #CJK UNIFIED IDEOGRAPH + {0x8DD5, 0x5D73}, //2429 #CJK UNIFIED IDEOGRAPH + {0x8DD6, 0x5D75}, //2430 #CJK UNIFIED IDEOGRAPH + {0x8DD7, 0x5D76}, //2431 #CJK UNIFIED IDEOGRAPH + {0x8DD8, 0x5D77}, //2432 #CJK UNIFIED IDEOGRAPH + {0x8DD9, 0x5D78}, //2433 #CJK UNIFIED IDEOGRAPH + {0x8DDA, 0x5D79}, //2434 #CJK UNIFIED IDEOGRAPH + {0x8DDB, 0x5D7A}, //2435 #CJK UNIFIED IDEOGRAPH + {0x8DDC, 0x5D7B}, //2436 #CJK UNIFIED IDEOGRAPH + {0x8DDD, 0x5D7C}, //2437 #CJK UNIFIED IDEOGRAPH + {0x8DDE, 0x5D7D}, //2438 #CJK UNIFIED IDEOGRAPH + {0x8DDF, 0x5D7E}, //2439 #CJK UNIFIED IDEOGRAPH + {0x8DE0, 0x5D7F}, //2440 #CJK UNIFIED IDEOGRAPH + {0x8DE1, 0x5D80}, //2441 #CJK UNIFIED IDEOGRAPH + {0x8DE2, 0x5D81}, //2442 #CJK UNIFIED IDEOGRAPH + {0x8DE3, 0x5D83}, //2443 #CJK UNIFIED IDEOGRAPH + {0x8DE4, 0x5D84}, //2444 #CJK UNIFIED IDEOGRAPH + {0x8DE5, 0x5D85}, //2445 #CJK UNIFIED IDEOGRAPH + {0x8DE6, 0x5D86}, //2446 #CJK UNIFIED IDEOGRAPH + {0x8DE7, 0x5D87}, //2447 #CJK UNIFIED IDEOGRAPH + {0x8DE8, 0x5D88}, //2448 #CJK UNIFIED IDEOGRAPH + {0x8DE9, 0x5D89}, //2449 #CJK UNIFIED IDEOGRAPH + {0x8DEA, 0x5D8A}, //2450 #CJK UNIFIED IDEOGRAPH + {0x8DEB, 0x5D8B}, //2451 #CJK UNIFIED IDEOGRAPH + {0x8DEC, 0x5D8C}, //2452 #CJK UNIFIED IDEOGRAPH + {0x8DED, 0x5D8D}, //2453 #CJK UNIFIED IDEOGRAPH + {0x8DEE, 0x5D8E}, //2454 #CJK UNIFIED IDEOGRAPH + {0x8DEF, 0x5D8F}, //2455 #CJK UNIFIED IDEOGRAPH + {0x8DF0, 0x5D90}, //2456 #CJK UNIFIED IDEOGRAPH + {0x8DF1, 0x5D91}, //2457 #CJK UNIFIED IDEOGRAPH + {0x8DF2, 0x5D92}, //2458 #CJK UNIFIED IDEOGRAPH + {0x8DF3, 0x5D93}, //2459 #CJK UNIFIED IDEOGRAPH + {0x8DF4, 0x5D94}, //2460 #CJK UNIFIED IDEOGRAPH + {0x8DF5, 0x5D95}, //2461 #CJK UNIFIED IDEOGRAPH + {0x8DF6, 0x5D96}, //2462 #CJK UNIFIED IDEOGRAPH + {0x8DF7, 0x5D97}, //2463 #CJK UNIFIED IDEOGRAPH + {0x8DF8, 0x5D98}, //2464 #CJK UNIFIED IDEOGRAPH + {0x8DF9, 0x5D9A}, //2465 #CJK UNIFIED IDEOGRAPH + {0x8DFA, 0x5D9B}, //2466 #CJK UNIFIED IDEOGRAPH + {0x8DFB, 0x5D9C}, //2467 #CJK UNIFIED IDEOGRAPH + {0x8DFC, 0x5D9E}, //2468 #CJK UNIFIED IDEOGRAPH + {0x8DFD, 0x5D9F}, //2469 #CJK UNIFIED IDEOGRAPH + {0x8DFE, 0x5DA0}, //2470 #CJK UNIFIED IDEOGRAPH + {0x8E40, 0x5DA1}, //2471 #CJK UNIFIED IDEOGRAPH + {0x8E41, 0x5DA2}, //2472 #CJK UNIFIED IDEOGRAPH + {0x8E42, 0x5DA3}, //2473 #CJK UNIFIED IDEOGRAPH + {0x8E43, 0x5DA4}, //2474 #CJK UNIFIED IDEOGRAPH + {0x8E44, 0x5DA5}, //2475 #CJK UNIFIED IDEOGRAPH + {0x8E45, 0x5DA6}, //2476 #CJK UNIFIED IDEOGRAPH + {0x8E46, 0x5DA7}, //2477 #CJK UNIFIED IDEOGRAPH + {0x8E47, 0x5DA8}, //2478 #CJK UNIFIED IDEOGRAPH + {0x8E48, 0x5DA9}, //2479 #CJK UNIFIED IDEOGRAPH + {0x8E49, 0x5DAA}, //2480 #CJK UNIFIED IDEOGRAPH + {0x8E4A, 0x5DAB}, //2481 #CJK UNIFIED IDEOGRAPH + {0x8E4B, 0x5DAC}, //2482 #CJK UNIFIED IDEOGRAPH + {0x8E4C, 0x5DAD}, //2483 #CJK UNIFIED IDEOGRAPH + {0x8E4D, 0x5DAE}, //2484 #CJK UNIFIED IDEOGRAPH + {0x8E4E, 0x5DAF}, //2485 #CJK UNIFIED IDEOGRAPH + {0x8E4F, 0x5DB0}, //2486 #CJK UNIFIED IDEOGRAPH + {0x8E50, 0x5DB1}, //2487 #CJK UNIFIED IDEOGRAPH + {0x8E51, 0x5DB2}, //2488 #CJK UNIFIED IDEOGRAPH + {0x8E52, 0x5DB3}, //2489 #CJK UNIFIED IDEOGRAPH + {0x8E53, 0x5DB4}, //2490 #CJK UNIFIED IDEOGRAPH + {0x8E54, 0x5DB5}, //2491 #CJK UNIFIED IDEOGRAPH + {0x8E55, 0x5DB6}, //2492 #CJK UNIFIED IDEOGRAPH + {0x8E56, 0x5DB8}, //2493 #CJK UNIFIED IDEOGRAPH + {0x8E57, 0x5DB9}, //2494 #CJK UNIFIED IDEOGRAPH + {0x8E58, 0x5DBA}, //2495 #CJK UNIFIED IDEOGRAPH + {0x8E59, 0x5DBB}, //2496 #CJK UNIFIED IDEOGRAPH + {0x8E5A, 0x5DBC}, //2497 #CJK UNIFIED IDEOGRAPH + {0x8E5B, 0x5DBD}, //2498 #CJK UNIFIED IDEOGRAPH + {0x8E5C, 0x5DBE}, //2499 #CJK UNIFIED IDEOGRAPH + {0x8E5D, 0x5DBF}, //2500 #CJK UNIFIED IDEOGRAPH + {0x8E5E, 0x5DC0}, //2501 #CJK UNIFIED IDEOGRAPH + {0x8E5F, 0x5DC1}, //2502 #CJK UNIFIED IDEOGRAPH + {0x8E60, 0x5DC2}, //2503 #CJK UNIFIED IDEOGRAPH + {0x8E61, 0x5DC3}, //2504 #CJK UNIFIED IDEOGRAPH + {0x8E62, 0x5DC4}, //2505 #CJK UNIFIED IDEOGRAPH + {0x8E63, 0x5DC6}, //2506 #CJK UNIFIED IDEOGRAPH + {0x8E64, 0x5DC7}, //2507 #CJK UNIFIED IDEOGRAPH + {0x8E65, 0x5DC8}, //2508 #CJK UNIFIED IDEOGRAPH + {0x8E66, 0x5DC9}, //2509 #CJK UNIFIED IDEOGRAPH + {0x8E67, 0x5DCA}, //2510 #CJK UNIFIED IDEOGRAPH + {0x8E68, 0x5DCB}, //2511 #CJK UNIFIED IDEOGRAPH + {0x8E69, 0x5DCC}, //2512 #CJK UNIFIED IDEOGRAPH + {0x8E6A, 0x5DCE}, //2513 #CJK UNIFIED IDEOGRAPH + {0x8E6B, 0x5DCF}, //2514 #CJK UNIFIED IDEOGRAPH + {0x8E6C, 0x5DD0}, //2515 #CJK UNIFIED IDEOGRAPH + {0x8E6D, 0x5DD1}, //2516 #CJK UNIFIED IDEOGRAPH + {0x8E6E, 0x5DD2}, //2517 #CJK UNIFIED IDEOGRAPH + {0x8E6F, 0x5DD3}, //2518 #CJK UNIFIED IDEOGRAPH + {0x8E70, 0x5DD4}, //2519 #CJK UNIFIED IDEOGRAPH + {0x8E71, 0x5DD5}, //2520 #CJK UNIFIED IDEOGRAPH + {0x8E72, 0x5DD6}, //2521 #CJK UNIFIED IDEOGRAPH + {0x8E73, 0x5DD7}, //2522 #CJK UNIFIED IDEOGRAPH + {0x8E74, 0x5DD8}, //2523 #CJK UNIFIED IDEOGRAPH + {0x8E75, 0x5DD9}, //2524 #CJK UNIFIED IDEOGRAPH + {0x8E76, 0x5DDA}, //2525 #CJK UNIFIED IDEOGRAPH + {0x8E77, 0x5DDC}, //2526 #CJK UNIFIED IDEOGRAPH + {0x8E78, 0x5DDF}, //2527 #CJK UNIFIED IDEOGRAPH + {0x8E79, 0x5DE0}, //2528 #CJK UNIFIED IDEOGRAPH + {0x8E7A, 0x5DE3}, //2529 #CJK UNIFIED IDEOGRAPH + {0x8E7B, 0x5DE4}, //2530 #CJK UNIFIED IDEOGRAPH + {0x8E7C, 0x5DEA}, //2531 #CJK UNIFIED IDEOGRAPH + {0x8E7D, 0x5DEC}, //2532 #CJK UNIFIED IDEOGRAPH + {0x8E7E, 0x5DED}, //2533 #CJK UNIFIED IDEOGRAPH + {0x8E80, 0x5DF0}, //2534 #CJK UNIFIED IDEOGRAPH + {0x8E81, 0x5DF5}, //2535 #CJK UNIFIED IDEOGRAPH + {0x8E82, 0x5DF6}, //2536 #CJK UNIFIED IDEOGRAPH + {0x8E83, 0x5DF8}, //2537 #CJK UNIFIED IDEOGRAPH + {0x8E84, 0x5DF9}, //2538 #CJK UNIFIED IDEOGRAPH + {0x8E85, 0x5DFA}, //2539 #CJK UNIFIED IDEOGRAPH + {0x8E86, 0x5DFB}, //2540 #CJK UNIFIED IDEOGRAPH + {0x8E87, 0x5DFC}, //2541 #CJK UNIFIED IDEOGRAPH + {0x8E88, 0x5DFF}, //2542 #CJK UNIFIED IDEOGRAPH + {0x8E89, 0x5E00}, //2543 #CJK UNIFIED IDEOGRAPH + {0x8E8A, 0x5E04}, //2544 #CJK UNIFIED IDEOGRAPH + {0x8E8B, 0x5E07}, //2545 #CJK UNIFIED IDEOGRAPH + {0x8E8C, 0x5E09}, //2546 #CJK UNIFIED IDEOGRAPH + {0x8E8D, 0x5E0A}, //2547 #CJK UNIFIED IDEOGRAPH + {0x8E8E, 0x5E0B}, //2548 #CJK UNIFIED IDEOGRAPH + {0x8E8F, 0x5E0D}, //2549 #CJK UNIFIED IDEOGRAPH + {0x8E90, 0x5E0E}, //2550 #CJK UNIFIED IDEOGRAPH + {0x8E91, 0x5E12}, //2551 #CJK UNIFIED IDEOGRAPH + {0x8E92, 0x5E13}, //2552 #CJK UNIFIED IDEOGRAPH + {0x8E93, 0x5E17}, //2553 #CJK UNIFIED IDEOGRAPH + {0x8E94, 0x5E1E}, //2554 #CJK UNIFIED IDEOGRAPH + {0x8E95, 0x5E1F}, //2555 #CJK UNIFIED IDEOGRAPH + {0x8E96, 0x5E20}, //2556 #CJK UNIFIED IDEOGRAPH + {0x8E97, 0x5E21}, //2557 #CJK UNIFIED IDEOGRAPH + {0x8E98, 0x5E22}, //2558 #CJK UNIFIED IDEOGRAPH + {0x8E99, 0x5E23}, //2559 #CJK UNIFIED IDEOGRAPH + {0x8E9A, 0x5E24}, //2560 #CJK UNIFIED IDEOGRAPH + {0x8E9B, 0x5E25}, //2561 #CJK UNIFIED IDEOGRAPH + {0x8E9C, 0x5E28}, //2562 #CJK UNIFIED IDEOGRAPH + {0x8E9D, 0x5E29}, //2563 #CJK UNIFIED IDEOGRAPH + {0x8E9E, 0x5E2A}, //2564 #CJK UNIFIED IDEOGRAPH + {0x8E9F, 0x5E2B}, //2565 #CJK UNIFIED IDEOGRAPH + {0x8EA0, 0x5E2C}, //2566 #CJK UNIFIED IDEOGRAPH + {0x8EA1, 0x5E2F}, //2567 #CJK UNIFIED IDEOGRAPH + {0x8EA2, 0x5E30}, //2568 #CJK UNIFIED IDEOGRAPH + {0x8EA3, 0x5E32}, //2569 #CJK UNIFIED IDEOGRAPH + {0x8EA4, 0x5E33}, //2570 #CJK UNIFIED IDEOGRAPH + {0x8EA5, 0x5E34}, //2571 #CJK UNIFIED IDEOGRAPH + {0x8EA6, 0x5E35}, //2572 #CJK UNIFIED IDEOGRAPH + {0x8EA7, 0x5E36}, //2573 #CJK UNIFIED IDEOGRAPH + {0x8EA8, 0x5E39}, //2574 #CJK UNIFIED IDEOGRAPH + {0x8EA9, 0x5E3A}, //2575 #CJK UNIFIED IDEOGRAPH + {0x8EAA, 0x5E3E}, //2576 #CJK UNIFIED IDEOGRAPH + {0x8EAB, 0x5E3F}, //2577 #CJK UNIFIED IDEOGRAPH + {0x8EAC, 0x5E40}, //2578 #CJK UNIFIED IDEOGRAPH + {0x8EAD, 0x5E41}, //2579 #CJK UNIFIED IDEOGRAPH + {0x8EAE, 0x5E43}, //2580 #CJK UNIFIED IDEOGRAPH + {0x8EAF, 0x5E46}, //2581 #CJK UNIFIED IDEOGRAPH + {0x8EB0, 0x5E47}, //2582 #CJK UNIFIED IDEOGRAPH + {0x8EB1, 0x5E48}, //2583 #CJK UNIFIED IDEOGRAPH + {0x8EB2, 0x5E49}, //2584 #CJK UNIFIED IDEOGRAPH + {0x8EB3, 0x5E4A}, //2585 #CJK UNIFIED IDEOGRAPH + {0x8EB4, 0x5E4B}, //2586 #CJK UNIFIED IDEOGRAPH + {0x8EB5, 0x5E4D}, //2587 #CJK UNIFIED IDEOGRAPH + {0x8EB6, 0x5E4E}, //2588 #CJK UNIFIED IDEOGRAPH + {0x8EB7, 0x5E4F}, //2589 #CJK UNIFIED IDEOGRAPH + {0x8EB8, 0x5E50}, //2590 #CJK UNIFIED IDEOGRAPH + {0x8EB9, 0x5E51}, //2591 #CJK UNIFIED IDEOGRAPH + {0x8EBA, 0x5E52}, //2592 #CJK UNIFIED IDEOGRAPH + {0x8EBB, 0x5E53}, //2593 #CJK UNIFIED IDEOGRAPH + {0x8EBC, 0x5E56}, //2594 #CJK UNIFIED IDEOGRAPH + {0x8EBD, 0x5E57}, //2595 #CJK UNIFIED IDEOGRAPH + {0x8EBE, 0x5E58}, //2596 #CJK UNIFIED IDEOGRAPH + {0x8EBF, 0x5E59}, //2597 #CJK UNIFIED IDEOGRAPH + {0x8EC0, 0x5E5A}, //2598 #CJK UNIFIED IDEOGRAPH + {0x8EC1, 0x5E5C}, //2599 #CJK UNIFIED IDEOGRAPH + {0x8EC2, 0x5E5D}, //2600 #CJK UNIFIED IDEOGRAPH + {0x8EC3, 0x5E5F}, //2601 #CJK UNIFIED IDEOGRAPH + {0x8EC4, 0x5E60}, //2602 #CJK UNIFIED IDEOGRAPH + {0x8EC5, 0x5E63}, //2603 #CJK UNIFIED IDEOGRAPH + {0x8EC6, 0x5E64}, //2604 #CJK UNIFIED IDEOGRAPH + {0x8EC7, 0x5E65}, //2605 #CJK UNIFIED IDEOGRAPH + {0x8EC8, 0x5E66}, //2606 #CJK UNIFIED IDEOGRAPH + {0x8EC9, 0x5E67}, //2607 #CJK UNIFIED IDEOGRAPH + {0x8ECA, 0x5E68}, //2608 #CJK UNIFIED IDEOGRAPH + {0x8ECB, 0x5E69}, //2609 #CJK UNIFIED IDEOGRAPH + {0x8ECC, 0x5E6A}, //2610 #CJK UNIFIED IDEOGRAPH + {0x8ECD, 0x5E6B}, //2611 #CJK UNIFIED IDEOGRAPH + {0x8ECE, 0x5E6C}, //2612 #CJK UNIFIED IDEOGRAPH + {0x8ECF, 0x5E6D}, //2613 #CJK UNIFIED IDEOGRAPH + {0x8ED0, 0x5E6E}, //2614 #CJK UNIFIED IDEOGRAPH + {0x8ED1, 0x5E6F}, //2615 #CJK UNIFIED IDEOGRAPH + {0x8ED2, 0x5E70}, //2616 #CJK UNIFIED IDEOGRAPH + {0x8ED3, 0x5E71}, //2617 #CJK UNIFIED IDEOGRAPH + {0x8ED4, 0x5E75}, //2618 #CJK UNIFIED IDEOGRAPH + {0x8ED5, 0x5E77}, //2619 #CJK UNIFIED IDEOGRAPH + {0x8ED6, 0x5E79}, //2620 #CJK UNIFIED IDEOGRAPH + {0x8ED7, 0x5E7E}, //2621 #CJK UNIFIED IDEOGRAPH + {0x8ED8, 0x5E81}, //2622 #CJK UNIFIED IDEOGRAPH + {0x8ED9, 0x5E82}, //2623 #CJK UNIFIED IDEOGRAPH + {0x8EDA, 0x5E83}, //2624 #CJK UNIFIED IDEOGRAPH + {0x8EDB, 0x5E85}, //2625 #CJK UNIFIED IDEOGRAPH + {0x8EDC, 0x5E88}, //2626 #CJK UNIFIED IDEOGRAPH + {0x8EDD, 0x5E89}, //2627 #CJK UNIFIED IDEOGRAPH + {0x8EDE, 0x5E8C}, //2628 #CJK UNIFIED IDEOGRAPH + {0x8EDF, 0x5E8D}, //2629 #CJK UNIFIED IDEOGRAPH + {0x8EE0, 0x5E8E}, //2630 #CJK UNIFIED IDEOGRAPH + {0x8EE1, 0x5E92}, //2631 #CJK UNIFIED IDEOGRAPH + {0x8EE2, 0x5E98}, //2632 #CJK UNIFIED IDEOGRAPH + {0x8EE3, 0x5E9B}, //2633 #CJK UNIFIED IDEOGRAPH + {0x8EE4, 0x5E9D}, //2634 #CJK UNIFIED IDEOGRAPH + {0x8EE5, 0x5EA1}, //2635 #CJK UNIFIED IDEOGRAPH + {0x8EE6, 0x5EA2}, //2636 #CJK UNIFIED IDEOGRAPH + {0x8EE7, 0x5EA3}, //2637 #CJK UNIFIED IDEOGRAPH + {0x8EE8, 0x5EA4}, //2638 #CJK UNIFIED IDEOGRAPH + {0x8EE9, 0x5EA8}, //2639 #CJK UNIFIED IDEOGRAPH + {0x8EEA, 0x5EA9}, //2640 #CJK UNIFIED IDEOGRAPH + {0x8EEB, 0x5EAA}, //2641 #CJK UNIFIED IDEOGRAPH + {0x8EEC, 0x5EAB}, //2642 #CJK UNIFIED IDEOGRAPH + {0x8EED, 0x5EAC}, //2643 #CJK UNIFIED IDEOGRAPH + {0x8EEE, 0x5EAE}, //2644 #CJK UNIFIED IDEOGRAPH + {0x8EEF, 0x5EAF}, //2645 #CJK UNIFIED IDEOGRAPH + {0x8EF0, 0x5EB0}, //2646 #CJK UNIFIED IDEOGRAPH + {0x8EF1, 0x5EB1}, //2647 #CJK UNIFIED IDEOGRAPH + {0x8EF2, 0x5EB2}, //2648 #CJK UNIFIED IDEOGRAPH + {0x8EF3, 0x5EB4}, //2649 #CJK UNIFIED IDEOGRAPH + {0x8EF4, 0x5EBA}, //2650 #CJK UNIFIED IDEOGRAPH + {0x8EF5, 0x5EBB}, //2651 #CJK UNIFIED IDEOGRAPH + {0x8EF6, 0x5EBC}, //2652 #CJK UNIFIED IDEOGRAPH + {0x8EF7, 0x5EBD}, //2653 #CJK UNIFIED IDEOGRAPH + {0x8EF8, 0x5EBF}, //2654 #CJK UNIFIED IDEOGRAPH + {0x8EF9, 0x5EC0}, //2655 #CJK UNIFIED IDEOGRAPH + {0x8EFA, 0x5EC1}, //2656 #CJK UNIFIED IDEOGRAPH + {0x8EFB, 0x5EC2}, //2657 #CJK UNIFIED IDEOGRAPH + {0x8EFC, 0x5EC3}, //2658 #CJK UNIFIED IDEOGRAPH + {0x8EFD, 0x5EC4}, //2659 #CJK UNIFIED IDEOGRAPH + {0x8EFE, 0x5EC5}, //2660 #CJK UNIFIED IDEOGRAPH + {0x8F40, 0x5EC6}, //2661 #CJK UNIFIED IDEOGRAPH + {0x8F41, 0x5EC7}, //2662 #CJK UNIFIED IDEOGRAPH + {0x8F42, 0x5EC8}, //2663 #CJK UNIFIED IDEOGRAPH + {0x8F43, 0x5ECB}, //2664 #CJK UNIFIED IDEOGRAPH + {0x8F44, 0x5ECC}, //2665 #CJK UNIFIED IDEOGRAPH + {0x8F45, 0x5ECD}, //2666 #CJK UNIFIED IDEOGRAPH + {0x8F46, 0x5ECE}, //2667 #CJK UNIFIED IDEOGRAPH + {0x8F47, 0x5ECF}, //2668 #CJK UNIFIED IDEOGRAPH + {0x8F48, 0x5ED0}, //2669 #CJK UNIFIED IDEOGRAPH + {0x8F49, 0x5ED4}, //2670 #CJK UNIFIED IDEOGRAPH + {0x8F4A, 0x5ED5}, //2671 #CJK UNIFIED IDEOGRAPH + {0x8F4B, 0x5ED7}, //2672 #CJK UNIFIED IDEOGRAPH + {0x8F4C, 0x5ED8}, //2673 #CJK UNIFIED IDEOGRAPH + {0x8F4D, 0x5ED9}, //2674 #CJK UNIFIED IDEOGRAPH + {0x8F4E, 0x5EDA}, //2675 #CJK UNIFIED IDEOGRAPH + {0x8F4F, 0x5EDC}, //2676 #CJK UNIFIED IDEOGRAPH + {0x8F50, 0x5EDD}, //2677 #CJK UNIFIED IDEOGRAPH + {0x8F51, 0x5EDE}, //2678 #CJK UNIFIED IDEOGRAPH + {0x8F52, 0x5EDF}, //2679 #CJK UNIFIED IDEOGRAPH + {0x8F53, 0x5EE0}, //2680 #CJK UNIFIED IDEOGRAPH + {0x8F54, 0x5EE1}, //2681 #CJK UNIFIED IDEOGRAPH + {0x8F55, 0x5EE2}, //2682 #CJK UNIFIED IDEOGRAPH + {0x8F56, 0x5EE3}, //2683 #CJK UNIFIED IDEOGRAPH + {0x8F57, 0x5EE4}, //2684 #CJK UNIFIED IDEOGRAPH + {0x8F58, 0x5EE5}, //2685 #CJK UNIFIED IDEOGRAPH + {0x8F59, 0x5EE6}, //2686 #CJK UNIFIED IDEOGRAPH + {0x8F5A, 0x5EE7}, //2687 #CJK UNIFIED IDEOGRAPH + {0x8F5B, 0x5EE9}, //2688 #CJK UNIFIED IDEOGRAPH + {0x8F5C, 0x5EEB}, //2689 #CJK UNIFIED IDEOGRAPH + {0x8F5D, 0x5EEC}, //2690 #CJK UNIFIED IDEOGRAPH + {0x8F5E, 0x5EED}, //2691 #CJK UNIFIED IDEOGRAPH + {0x8F5F, 0x5EEE}, //2692 #CJK UNIFIED IDEOGRAPH + {0x8F60, 0x5EEF}, //2693 #CJK UNIFIED IDEOGRAPH + {0x8F61, 0x5EF0}, //2694 #CJK UNIFIED IDEOGRAPH + {0x8F62, 0x5EF1}, //2695 #CJK UNIFIED IDEOGRAPH + {0x8F63, 0x5EF2}, //2696 #CJK UNIFIED IDEOGRAPH + {0x8F64, 0x5EF3}, //2697 #CJK UNIFIED IDEOGRAPH + {0x8F65, 0x5EF5}, //2698 #CJK UNIFIED IDEOGRAPH + {0x8F66, 0x5EF8}, //2699 #CJK UNIFIED IDEOGRAPH + {0x8F67, 0x5EF9}, //2700 #CJK UNIFIED IDEOGRAPH + {0x8F68, 0x5EFB}, //2701 #CJK UNIFIED IDEOGRAPH + {0x8F69, 0x5EFC}, //2702 #CJK UNIFIED IDEOGRAPH + {0x8F6A, 0x5EFD}, //2703 #CJK UNIFIED IDEOGRAPH + {0x8F6B, 0x5F05}, //2704 #CJK UNIFIED IDEOGRAPH + {0x8F6C, 0x5F06}, //2705 #CJK UNIFIED IDEOGRAPH + {0x8F6D, 0x5F07}, //2706 #CJK UNIFIED IDEOGRAPH + {0x8F6E, 0x5F09}, //2707 #CJK UNIFIED IDEOGRAPH + {0x8F6F, 0x5F0C}, //2708 #CJK UNIFIED IDEOGRAPH + {0x8F70, 0x5F0D}, //2709 #CJK UNIFIED IDEOGRAPH + {0x8F71, 0x5F0E}, //2710 #CJK UNIFIED IDEOGRAPH + {0x8F72, 0x5F10}, //2711 #CJK UNIFIED IDEOGRAPH + {0x8F73, 0x5F12}, //2712 #CJK UNIFIED IDEOGRAPH + {0x8F74, 0x5F14}, //2713 #CJK UNIFIED IDEOGRAPH + {0x8F75, 0x5F16}, //2714 #CJK UNIFIED IDEOGRAPH + {0x8F76, 0x5F19}, //2715 #CJK UNIFIED IDEOGRAPH + {0x8F77, 0x5F1A}, //2716 #CJK UNIFIED IDEOGRAPH + {0x8F78, 0x5F1C}, //2717 #CJK UNIFIED IDEOGRAPH + {0x8F79, 0x5F1D}, //2718 #CJK UNIFIED IDEOGRAPH + {0x8F7A, 0x5F1E}, //2719 #CJK UNIFIED IDEOGRAPH + {0x8F7B, 0x5F21}, //2720 #CJK UNIFIED IDEOGRAPH + {0x8F7C, 0x5F22}, //2721 #CJK UNIFIED IDEOGRAPH + {0x8F7D, 0x5F23}, //2722 #CJK UNIFIED IDEOGRAPH + {0x8F7E, 0x5F24}, //2723 #CJK UNIFIED IDEOGRAPH + {0x8F80, 0x5F28}, //2724 #CJK UNIFIED IDEOGRAPH + {0x8F81, 0x5F2B}, //2725 #CJK UNIFIED IDEOGRAPH + {0x8F82, 0x5F2C}, //2726 #CJK UNIFIED IDEOGRAPH + {0x8F83, 0x5F2E}, //2727 #CJK UNIFIED IDEOGRAPH + {0x8F84, 0x5F30}, //2728 #CJK UNIFIED IDEOGRAPH + {0x8F85, 0x5F32}, //2729 #CJK UNIFIED IDEOGRAPH + {0x8F86, 0x5F33}, //2730 #CJK UNIFIED IDEOGRAPH + {0x8F87, 0x5F34}, //2731 #CJK UNIFIED IDEOGRAPH + {0x8F88, 0x5F35}, //2732 #CJK UNIFIED IDEOGRAPH + {0x8F89, 0x5F36}, //2733 #CJK UNIFIED IDEOGRAPH + {0x8F8A, 0x5F37}, //2734 #CJK UNIFIED IDEOGRAPH + {0x8F8B, 0x5F38}, //2735 #CJK UNIFIED IDEOGRAPH + {0x8F8C, 0x5F3B}, //2736 #CJK UNIFIED IDEOGRAPH + {0x8F8D, 0x5F3D}, //2737 #CJK UNIFIED IDEOGRAPH + {0x8F8E, 0x5F3E}, //2738 #CJK UNIFIED IDEOGRAPH + {0x8F8F, 0x5F3F}, //2739 #CJK UNIFIED IDEOGRAPH + {0x8F90, 0x5F41}, //2740 #CJK UNIFIED IDEOGRAPH + {0x8F91, 0x5F42}, //2741 #CJK UNIFIED IDEOGRAPH + {0x8F92, 0x5F43}, //2742 #CJK UNIFIED IDEOGRAPH + {0x8F93, 0x5F44}, //2743 #CJK UNIFIED IDEOGRAPH + {0x8F94, 0x5F45}, //2744 #CJK UNIFIED IDEOGRAPH + {0x8F95, 0x5F46}, //2745 #CJK UNIFIED IDEOGRAPH + {0x8F96, 0x5F47}, //2746 #CJK UNIFIED IDEOGRAPH + {0x8F97, 0x5F48}, //2747 #CJK UNIFIED IDEOGRAPH + {0x8F98, 0x5F49}, //2748 #CJK UNIFIED IDEOGRAPH + {0x8F99, 0x5F4A}, //2749 #CJK UNIFIED IDEOGRAPH + {0x8F9A, 0x5F4B}, //2750 #CJK UNIFIED IDEOGRAPH + {0x8F9B, 0x5F4C}, //2751 #CJK UNIFIED IDEOGRAPH + {0x8F9C, 0x5F4D}, //2752 #CJK UNIFIED IDEOGRAPH + {0x8F9D, 0x5F4E}, //2753 #CJK UNIFIED IDEOGRAPH + {0x8F9E, 0x5F4F}, //2754 #CJK UNIFIED IDEOGRAPH + {0x8F9F, 0x5F51}, //2755 #CJK UNIFIED IDEOGRAPH + {0x8FA0, 0x5F54}, //2756 #CJK UNIFIED IDEOGRAPH + {0x8FA1, 0x5F59}, //2757 #CJK UNIFIED IDEOGRAPH + {0x8FA2, 0x5F5A}, //2758 #CJK UNIFIED IDEOGRAPH + {0x8FA3, 0x5F5B}, //2759 #CJK UNIFIED IDEOGRAPH + {0x8FA4, 0x5F5C}, //2760 #CJK UNIFIED IDEOGRAPH + {0x8FA5, 0x5F5E}, //2761 #CJK UNIFIED IDEOGRAPH + {0x8FA6, 0x5F5F}, //2762 #CJK UNIFIED IDEOGRAPH + {0x8FA7, 0x5F60}, //2763 #CJK UNIFIED IDEOGRAPH + {0x8FA8, 0x5F63}, //2764 #CJK UNIFIED IDEOGRAPH + {0x8FA9, 0x5F65}, //2765 #CJK UNIFIED IDEOGRAPH + {0x8FAA, 0x5F67}, //2766 #CJK UNIFIED IDEOGRAPH + {0x8FAB, 0x5F68}, //2767 #CJK UNIFIED IDEOGRAPH + {0x8FAC, 0x5F6B}, //2768 #CJK UNIFIED IDEOGRAPH + {0x8FAD, 0x5F6E}, //2769 #CJK UNIFIED IDEOGRAPH + {0x8FAE, 0x5F6F}, //2770 #CJK UNIFIED IDEOGRAPH + {0x8FAF, 0x5F72}, //2771 #CJK UNIFIED IDEOGRAPH + {0x8FB0, 0x5F74}, //2772 #CJK UNIFIED IDEOGRAPH + {0x8FB1, 0x5F75}, //2773 #CJK UNIFIED IDEOGRAPH + {0x8FB2, 0x5F76}, //2774 #CJK UNIFIED IDEOGRAPH + {0x8FB3, 0x5F78}, //2775 #CJK UNIFIED IDEOGRAPH + {0x8FB4, 0x5F7A}, //2776 #CJK UNIFIED IDEOGRAPH + {0x8FB5, 0x5F7D}, //2777 #CJK UNIFIED IDEOGRAPH + {0x8FB6, 0x5F7E}, //2778 #CJK UNIFIED IDEOGRAPH + {0x8FB7, 0x5F7F}, //2779 #CJK UNIFIED IDEOGRAPH + {0x8FB8, 0x5F83}, //2780 #CJK UNIFIED IDEOGRAPH + {0x8FB9, 0x5F86}, //2781 #CJK UNIFIED IDEOGRAPH + {0x8FBA, 0x5F8D}, //2782 #CJK UNIFIED IDEOGRAPH + {0x8FBB, 0x5F8E}, //2783 #CJK UNIFIED IDEOGRAPH + {0x8FBC, 0x5F8F}, //2784 #CJK UNIFIED IDEOGRAPH + {0x8FBD, 0x5F91}, //2785 #CJK UNIFIED IDEOGRAPH + {0x8FBE, 0x5F93}, //2786 #CJK UNIFIED IDEOGRAPH + {0x8FBF, 0x5F94}, //2787 #CJK UNIFIED IDEOGRAPH + {0x8FC0, 0x5F96}, //2788 #CJK UNIFIED IDEOGRAPH + {0x8FC1, 0x5F9A}, //2789 #CJK UNIFIED IDEOGRAPH + {0x8FC2, 0x5F9B}, //2790 #CJK UNIFIED IDEOGRAPH + {0x8FC3, 0x5F9D}, //2791 #CJK UNIFIED IDEOGRAPH + {0x8FC4, 0x5F9E}, //2792 #CJK UNIFIED IDEOGRAPH + {0x8FC5, 0x5F9F}, //2793 #CJK UNIFIED IDEOGRAPH + {0x8FC6, 0x5FA0}, //2794 #CJK UNIFIED IDEOGRAPH + {0x8FC7, 0x5FA2}, //2795 #CJK UNIFIED IDEOGRAPH + {0x8FC8, 0x5FA3}, //2796 #CJK UNIFIED IDEOGRAPH + {0x8FC9, 0x5FA4}, //2797 #CJK UNIFIED IDEOGRAPH + {0x8FCA, 0x5FA5}, //2798 #CJK UNIFIED IDEOGRAPH + {0x8FCB, 0x5FA6}, //2799 #CJK UNIFIED IDEOGRAPH + {0x8FCC, 0x5FA7}, //2800 #CJK UNIFIED IDEOGRAPH + {0x8FCD, 0x5FA9}, //2801 #CJK UNIFIED IDEOGRAPH + {0x8FCE, 0x5FAB}, //2802 #CJK UNIFIED IDEOGRAPH + {0x8FCF, 0x5FAC}, //2803 #CJK UNIFIED IDEOGRAPH + {0x8FD0, 0x5FAF}, //2804 #CJK UNIFIED IDEOGRAPH + {0x8FD1, 0x5FB0}, //2805 #CJK UNIFIED IDEOGRAPH + {0x8FD2, 0x5FB1}, //2806 #CJK UNIFIED IDEOGRAPH + {0x8FD3, 0x5FB2}, //2807 #CJK UNIFIED IDEOGRAPH + {0x8FD4, 0x5FB3}, //2808 #CJK UNIFIED IDEOGRAPH + {0x8FD5, 0x5FB4}, //2809 #CJK UNIFIED IDEOGRAPH + {0x8FD6, 0x5FB6}, //2810 #CJK UNIFIED IDEOGRAPH + {0x8FD7, 0x5FB8}, //2811 #CJK UNIFIED IDEOGRAPH + {0x8FD8, 0x5FB9}, //2812 #CJK UNIFIED IDEOGRAPH + {0x8FD9, 0x5FBA}, //2813 #CJK UNIFIED IDEOGRAPH + {0x8FDA, 0x5FBB}, //2814 #CJK UNIFIED IDEOGRAPH + {0x8FDB, 0x5FBE}, //2815 #CJK UNIFIED IDEOGRAPH + {0x8FDC, 0x5FBF}, //2816 #CJK UNIFIED IDEOGRAPH + {0x8FDD, 0x5FC0}, //2817 #CJK UNIFIED IDEOGRAPH + {0x8FDE, 0x5FC1}, //2818 #CJK UNIFIED IDEOGRAPH + {0x8FDF, 0x5FC2}, //2819 #CJK UNIFIED IDEOGRAPH + {0x8FE0, 0x5FC7}, //2820 #CJK UNIFIED IDEOGRAPH + {0x8FE1, 0x5FC8}, //2821 #CJK UNIFIED IDEOGRAPH + {0x8FE2, 0x5FCA}, //2822 #CJK UNIFIED IDEOGRAPH + {0x8FE3, 0x5FCB}, //2823 #CJK UNIFIED IDEOGRAPH + {0x8FE4, 0x5FCE}, //2824 #CJK UNIFIED IDEOGRAPH + {0x8FE5, 0x5FD3}, //2825 #CJK UNIFIED IDEOGRAPH + {0x8FE6, 0x5FD4}, //2826 #CJK UNIFIED IDEOGRAPH + {0x8FE7, 0x5FD5}, //2827 #CJK UNIFIED IDEOGRAPH + {0x8FE8, 0x5FDA}, //2828 #CJK UNIFIED IDEOGRAPH + {0x8FE9, 0x5FDB}, //2829 #CJK UNIFIED IDEOGRAPH + {0x8FEA, 0x5FDC}, //2830 #CJK UNIFIED IDEOGRAPH + {0x8FEB, 0x5FDE}, //2831 #CJK UNIFIED IDEOGRAPH + {0x8FEC, 0x5FDF}, //2832 #CJK UNIFIED IDEOGRAPH + {0x8FED, 0x5FE2}, //2833 #CJK UNIFIED IDEOGRAPH + {0x8FEE, 0x5FE3}, //2834 #CJK UNIFIED IDEOGRAPH + {0x8FEF, 0x5FE5}, //2835 #CJK UNIFIED IDEOGRAPH + {0x8FF0, 0x5FE6}, //2836 #CJK UNIFIED IDEOGRAPH + {0x8FF1, 0x5FE8}, //2837 #CJK UNIFIED IDEOGRAPH + {0x8FF2, 0x5FE9}, //2838 #CJK UNIFIED IDEOGRAPH + {0x8FF3, 0x5FEC}, //2839 #CJK UNIFIED IDEOGRAPH + {0x8FF4, 0x5FEF}, //2840 #CJK UNIFIED IDEOGRAPH + {0x8FF5, 0x5FF0}, //2841 #CJK UNIFIED IDEOGRAPH + {0x8FF6, 0x5FF2}, //2842 #CJK UNIFIED IDEOGRAPH + {0x8FF7, 0x5FF3}, //2843 #CJK UNIFIED IDEOGRAPH + {0x8FF8, 0x5FF4}, //2844 #CJK UNIFIED IDEOGRAPH + {0x8FF9, 0x5FF6}, //2845 #CJK UNIFIED IDEOGRAPH + {0x8FFA, 0x5FF7}, //2846 #CJK UNIFIED IDEOGRAPH + {0x8FFB, 0x5FF9}, //2847 #CJK UNIFIED IDEOGRAPH + {0x8FFC, 0x5FFA}, //2848 #CJK UNIFIED IDEOGRAPH + {0x8FFD, 0x5FFC}, //2849 #CJK UNIFIED IDEOGRAPH + {0x8FFE, 0x6007}, //2850 #CJK UNIFIED IDEOGRAPH + {0x9040, 0x6008}, //2851 #CJK UNIFIED IDEOGRAPH + {0x9041, 0x6009}, //2852 #CJK UNIFIED IDEOGRAPH + {0x9042, 0x600B}, //2853 #CJK UNIFIED IDEOGRAPH + {0x9043, 0x600C}, //2854 #CJK UNIFIED IDEOGRAPH + {0x9044, 0x6010}, //2855 #CJK UNIFIED IDEOGRAPH + {0x9045, 0x6011}, //2856 #CJK UNIFIED IDEOGRAPH + {0x9046, 0x6013}, //2857 #CJK UNIFIED IDEOGRAPH + {0x9047, 0x6017}, //2858 #CJK UNIFIED IDEOGRAPH + {0x9048, 0x6018}, //2859 #CJK UNIFIED IDEOGRAPH + {0x9049, 0x601A}, //2860 #CJK UNIFIED IDEOGRAPH + {0x904A, 0x601E}, //2861 #CJK UNIFIED IDEOGRAPH + {0x904B, 0x601F}, //2862 #CJK UNIFIED IDEOGRAPH + {0x904C, 0x6022}, //2863 #CJK UNIFIED IDEOGRAPH + {0x904D, 0x6023}, //2864 #CJK UNIFIED IDEOGRAPH + {0x904E, 0x6024}, //2865 #CJK UNIFIED IDEOGRAPH + {0x904F, 0x602C}, //2866 #CJK UNIFIED IDEOGRAPH + {0x9050, 0x602D}, //2867 #CJK UNIFIED IDEOGRAPH + {0x9051, 0x602E}, //2868 #CJK UNIFIED IDEOGRAPH + {0x9052, 0x6030}, //2869 #CJK UNIFIED IDEOGRAPH + {0x9053, 0x6031}, //2870 #CJK UNIFIED IDEOGRAPH + {0x9054, 0x6032}, //2871 #CJK UNIFIED IDEOGRAPH + {0x9055, 0x6033}, //2872 #CJK UNIFIED IDEOGRAPH + {0x9056, 0x6034}, //2873 #CJK UNIFIED IDEOGRAPH + {0x9057, 0x6036}, //2874 #CJK UNIFIED IDEOGRAPH + {0x9058, 0x6037}, //2875 #CJK UNIFIED IDEOGRAPH + {0x9059, 0x6038}, //2876 #CJK UNIFIED IDEOGRAPH + {0x905A, 0x6039}, //2877 #CJK UNIFIED IDEOGRAPH + {0x905B, 0x603A}, //2878 #CJK UNIFIED IDEOGRAPH + {0x905C, 0x603D}, //2879 #CJK UNIFIED IDEOGRAPH + {0x905D, 0x603E}, //2880 #CJK UNIFIED IDEOGRAPH + {0x905E, 0x6040}, //2881 #CJK UNIFIED IDEOGRAPH + {0x905F, 0x6044}, //2882 #CJK UNIFIED IDEOGRAPH + {0x9060, 0x6045}, //2883 #CJK UNIFIED IDEOGRAPH + {0x9061, 0x6046}, //2884 #CJK UNIFIED IDEOGRAPH + {0x9062, 0x6047}, //2885 #CJK UNIFIED IDEOGRAPH + {0x9063, 0x6048}, //2886 #CJK UNIFIED IDEOGRAPH + {0x9064, 0x6049}, //2887 #CJK UNIFIED IDEOGRAPH + {0x9065, 0x604A}, //2888 #CJK UNIFIED IDEOGRAPH + {0x9066, 0x604C}, //2889 #CJK UNIFIED IDEOGRAPH + {0x9067, 0x604E}, //2890 #CJK UNIFIED IDEOGRAPH + {0x9068, 0x604F}, //2891 #CJK UNIFIED IDEOGRAPH + {0x9069, 0x6051}, //2892 #CJK UNIFIED IDEOGRAPH + {0x906A, 0x6053}, //2893 #CJK UNIFIED IDEOGRAPH + {0x906B, 0x6054}, //2894 #CJK UNIFIED IDEOGRAPH + {0x906C, 0x6056}, //2895 #CJK UNIFIED IDEOGRAPH + {0x906D, 0x6057}, //2896 #CJK UNIFIED IDEOGRAPH + {0x906E, 0x6058}, //2897 #CJK UNIFIED IDEOGRAPH + {0x906F, 0x605B}, //2898 #CJK UNIFIED IDEOGRAPH + {0x9070, 0x605C}, //2899 #CJK UNIFIED IDEOGRAPH + {0x9071, 0x605E}, //2900 #CJK UNIFIED IDEOGRAPH + {0x9072, 0x605F}, //2901 #CJK UNIFIED IDEOGRAPH + {0x9073, 0x6060}, //2902 #CJK UNIFIED IDEOGRAPH + {0x9074, 0x6061}, //2903 #CJK UNIFIED IDEOGRAPH + {0x9075, 0x6065}, //2904 #CJK UNIFIED IDEOGRAPH + {0x9076, 0x6066}, //2905 #CJK UNIFIED IDEOGRAPH + {0x9077, 0x606E}, //2906 #CJK UNIFIED IDEOGRAPH + {0x9078, 0x6071}, //2907 #CJK UNIFIED IDEOGRAPH + {0x9079, 0x6072}, //2908 #CJK UNIFIED IDEOGRAPH + {0x907A, 0x6074}, //2909 #CJK UNIFIED IDEOGRAPH + {0x907B, 0x6075}, //2910 #CJK UNIFIED IDEOGRAPH + {0x907C, 0x6077}, //2911 #CJK UNIFIED IDEOGRAPH + {0x907D, 0x607E}, //2912 #CJK UNIFIED IDEOGRAPH + {0x907E, 0x6080}, //2913 #CJK UNIFIED IDEOGRAPH + {0x9080, 0x6081}, //2914 #CJK UNIFIED IDEOGRAPH + {0x9081, 0x6082}, //2915 #CJK UNIFIED IDEOGRAPH + {0x9082, 0x6085}, //2916 #CJK UNIFIED IDEOGRAPH + {0x9083, 0x6086}, //2917 #CJK UNIFIED IDEOGRAPH + {0x9084, 0x6087}, //2918 #CJK UNIFIED IDEOGRAPH + {0x9085, 0x6088}, //2919 #CJK UNIFIED IDEOGRAPH + {0x9086, 0x608A}, //2920 #CJK UNIFIED IDEOGRAPH + {0x9087, 0x608B}, //2921 #CJK UNIFIED IDEOGRAPH + {0x9088, 0x608E}, //2922 #CJK UNIFIED IDEOGRAPH + {0x9089, 0x608F}, //2923 #CJK UNIFIED IDEOGRAPH + {0x908A, 0x6090}, //2924 #CJK UNIFIED IDEOGRAPH + {0x908B, 0x6091}, //2925 #CJK UNIFIED IDEOGRAPH + {0x908C, 0x6093}, //2926 #CJK UNIFIED IDEOGRAPH + {0x908D, 0x6095}, //2927 #CJK UNIFIED IDEOGRAPH + {0x908E, 0x6097}, //2928 #CJK UNIFIED IDEOGRAPH + {0x908F, 0x6098}, //2929 #CJK UNIFIED IDEOGRAPH + {0x9090, 0x6099}, //2930 #CJK UNIFIED IDEOGRAPH + {0x9091, 0x609C}, //2931 #CJK UNIFIED IDEOGRAPH + {0x9092, 0x609E}, //2932 #CJK UNIFIED IDEOGRAPH + {0x9093, 0x60A1}, //2933 #CJK UNIFIED IDEOGRAPH + {0x9094, 0x60A2}, //2934 #CJK UNIFIED IDEOGRAPH + {0x9095, 0x60A4}, //2935 #CJK UNIFIED IDEOGRAPH + {0x9096, 0x60A5}, //2936 #CJK UNIFIED IDEOGRAPH + {0x9097, 0x60A7}, //2937 #CJK UNIFIED IDEOGRAPH + {0x9098, 0x60A9}, //2938 #CJK UNIFIED IDEOGRAPH + {0x9099, 0x60AA}, //2939 #CJK UNIFIED IDEOGRAPH + {0x909A, 0x60AE}, //2940 #CJK UNIFIED IDEOGRAPH + {0x909B, 0x60B0}, //2941 #CJK UNIFIED IDEOGRAPH + {0x909C, 0x60B3}, //2942 #CJK UNIFIED IDEOGRAPH + {0x909D, 0x60B5}, //2943 #CJK UNIFIED IDEOGRAPH + {0x909E, 0x60B6}, //2944 #CJK UNIFIED IDEOGRAPH + {0x909F, 0x60B7}, //2945 #CJK UNIFIED IDEOGRAPH + {0x90A0, 0x60B9}, //2946 #CJK UNIFIED IDEOGRAPH + {0x90A1, 0x60BA}, //2947 #CJK UNIFIED IDEOGRAPH + {0x90A2, 0x60BD}, //2948 #CJK UNIFIED IDEOGRAPH + {0x90A3, 0x60BE}, //2949 #CJK UNIFIED IDEOGRAPH + {0x90A4, 0x60BF}, //2950 #CJK UNIFIED IDEOGRAPH + {0x90A5, 0x60C0}, //2951 #CJK UNIFIED IDEOGRAPH + {0x90A6, 0x60C1}, //2952 #CJK UNIFIED IDEOGRAPH + {0x90A7, 0x60C2}, //2953 #CJK UNIFIED IDEOGRAPH + {0x90A8, 0x60C3}, //2954 #CJK UNIFIED IDEOGRAPH + {0x90A9, 0x60C4}, //2955 #CJK UNIFIED IDEOGRAPH + {0x90AA, 0x60C7}, //2956 #CJK UNIFIED IDEOGRAPH + {0x90AB, 0x60C8}, //2957 #CJK UNIFIED IDEOGRAPH + {0x90AC, 0x60C9}, //2958 #CJK UNIFIED IDEOGRAPH + {0x90AD, 0x60CC}, //2959 #CJK UNIFIED IDEOGRAPH + {0x90AE, 0x60CD}, //2960 #CJK UNIFIED IDEOGRAPH + {0x90AF, 0x60CE}, //2961 #CJK UNIFIED IDEOGRAPH + {0x90B0, 0x60CF}, //2962 #CJK UNIFIED IDEOGRAPH + {0x90B1, 0x60D0}, //2963 #CJK UNIFIED IDEOGRAPH + {0x90B2, 0x60D2}, //2964 #CJK UNIFIED IDEOGRAPH + {0x90B3, 0x60D3}, //2965 #CJK UNIFIED IDEOGRAPH + {0x90B4, 0x60D4}, //2966 #CJK UNIFIED IDEOGRAPH + {0x90B5, 0x60D6}, //2967 #CJK UNIFIED IDEOGRAPH + {0x90B6, 0x60D7}, //2968 #CJK UNIFIED IDEOGRAPH + {0x90B7, 0x60D9}, //2969 #CJK UNIFIED IDEOGRAPH + {0x90B8, 0x60DB}, //2970 #CJK UNIFIED IDEOGRAPH + {0x90B9, 0x60DE}, //2971 #CJK UNIFIED IDEOGRAPH + {0x90BA, 0x60E1}, //2972 #CJK UNIFIED IDEOGRAPH + {0x90BB, 0x60E2}, //2973 #CJK UNIFIED IDEOGRAPH + {0x90BC, 0x60E3}, //2974 #CJK UNIFIED IDEOGRAPH + {0x90BD, 0x60E4}, //2975 #CJK UNIFIED IDEOGRAPH + {0x90BE, 0x60E5}, //2976 #CJK UNIFIED IDEOGRAPH + {0x90BF, 0x60EA}, //2977 #CJK UNIFIED IDEOGRAPH + {0x90C0, 0x60F1}, //2978 #CJK UNIFIED IDEOGRAPH + {0x90C1, 0x60F2}, //2979 #CJK UNIFIED IDEOGRAPH + {0x90C2, 0x60F5}, //2980 #CJK UNIFIED IDEOGRAPH + {0x90C3, 0x60F7}, //2981 #CJK UNIFIED IDEOGRAPH + {0x90C4, 0x60F8}, //2982 #CJK UNIFIED IDEOGRAPH + {0x90C5, 0x60FB}, //2983 #CJK UNIFIED IDEOGRAPH + {0x90C6, 0x60FC}, //2984 #CJK UNIFIED IDEOGRAPH + {0x90C7, 0x60FD}, //2985 #CJK UNIFIED IDEOGRAPH + {0x90C8, 0x60FE}, //2986 #CJK UNIFIED IDEOGRAPH + {0x90C9, 0x60FF}, //2987 #CJK UNIFIED IDEOGRAPH + {0x90CA, 0x6102}, //2988 #CJK UNIFIED IDEOGRAPH + {0x90CB, 0x6103}, //2989 #CJK UNIFIED IDEOGRAPH + {0x90CC, 0x6104}, //2990 #CJK UNIFIED IDEOGRAPH + {0x90CD, 0x6105}, //2991 #CJK UNIFIED IDEOGRAPH + {0x90CE, 0x6107}, //2992 #CJK UNIFIED IDEOGRAPH + {0x90CF, 0x610A}, //2993 #CJK UNIFIED IDEOGRAPH + {0x90D0, 0x610B}, //2994 #CJK UNIFIED IDEOGRAPH + {0x90D1, 0x610C}, //2995 #CJK UNIFIED IDEOGRAPH + {0x90D2, 0x6110}, //2996 #CJK UNIFIED IDEOGRAPH + {0x90D3, 0x6111}, //2997 #CJK UNIFIED IDEOGRAPH + {0x90D4, 0x6112}, //2998 #CJK UNIFIED IDEOGRAPH + {0x90D5, 0x6113}, //2999 #CJK UNIFIED IDEOGRAPH + {0x90D6, 0x6114}, //3000 #CJK UNIFIED IDEOGRAPH + {0x90D7, 0x6116}, //3001 #CJK UNIFIED IDEOGRAPH + {0x90D8, 0x6117}, //3002 #CJK UNIFIED IDEOGRAPH + {0x90D9, 0x6118}, //3003 #CJK UNIFIED IDEOGRAPH + {0x90DA, 0x6119}, //3004 #CJK UNIFIED IDEOGRAPH + {0x90DB, 0x611B}, //3005 #CJK UNIFIED IDEOGRAPH + {0x90DC, 0x611C}, //3006 #CJK UNIFIED IDEOGRAPH + {0x90DD, 0x611D}, //3007 #CJK UNIFIED IDEOGRAPH + {0x90DE, 0x611E}, //3008 #CJK UNIFIED IDEOGRAPH + {0x90DF, 0x6121}, //3009 #CJK UNIFIED IDEOGRAPH + {0x90E0, 0x6122}, //3010 #CJK UNIFIED IDEOGRAPH + {0x90E1, 0x6125}, //3011 #CJK UNIFIED IDEOGRAPH + {0x90E2, 0x6128}, //3012 #CJK UNIFIED IDEOGRAPH + {0x90E3, 0x6129}, //3013 #CJK UNIFIED IDEOGRAPH + {0x90E4, 0x612A}, //3014 #CJK UNIFIED IDEOGRAPH + {0x90E5, 0x612C}, //3015 #CJK UNIFIED IDEOGRAPH + {0x90E6, 0x612D}, //3016 #CJK UNIFIED IDEOGRAPH + {0x90E7, 0x612E}, //3017 #CJK UNIFIED IDEOGRAPH + {0x90E8, 0x612F}, //3018 #CJK UNIFIED IDEOGRAPH + {0x90E9, 0x6130}, //3019 #CJK UNIFIED IDEOGRAPH + {0x90EA, 0x6131}, //3020 #CJK UNIFIED IDEOGRAPH + {0x90EB, 0x6132}, //3021 #CJK UNIFIED IDEOGRAPH + {0x90EC, 0x6133}, //3022 #CJK UNIFIED IDEOGRAPH + {0x90ED, 0x6134}, //3023 #CJK UNIFIED IDEOGRAPH + {0x90EE, 0x6135}, //3024 #CJK UNIFIED IDEOGRAPH + {0x90EF, 0x6136}, //3025 #CJK UNIFIED IDEOGRAPH + {0x90F0, 0x6137}, //3026 #CJK UNIFIED IDEOGRAPH + {0x90F1, 0x6138}, //3027 #CJK UNIFIED IDEOGRAPH + {0x90F2, 0x6139}, //3028 #CJK UNIFIED IDEOGRAPH + {0x90F3, 0x613A}, //3029 #CJK UNIFIED IDEOGRAPH + {0x90F4, 0x613B}, //3030 #CJK UNIFIED IDEOGRAPH + {0x90F5, 0x613C}, //3031 #CJK UNIFIED IDEOGRAPH + {0x90F6, 0x613D}, //3032 #CJK UNIFIED IDEOGRAPH + {0x90F7, 0x613E}, //3033 #CJK UNIFIED IDEOGRAPH + {0x90F8, 0x6140}, //3034 #CJK UNIFIED IDEOGRAPH + {0x90F9, 0x6141}, //3035 #CJK UNIFIED IDEOGRAPH + {0x90FA, 0x6142}, //3036 #CJK UNIFIED IDEOGRAPH + {0x90FB, 0x6143}, //3037 #CJK UNIFIED IDEOGRAPH + {0x90FC, 0x6144}, //3038 #CJK UNIFIED IDEOGRAPH + {0x90FD, 0x6145}, //3039 #CJK UNIFIED IDEOGRAPH + {0x90FE, 0x6146}, //3040 #CJK UNIFIED IDEOGRAPH + {0x9140, 0x6147}, //3041 #CJK UNIFIED IDEOGRAPH + {0x9141, 0x6149}, //3042 #CJK UNIFIED IDEOGRAPH + {0x9142, 0x614B}, //3043 #CJK UNIFIED IDEOGRAPH + {0x9143, 0x614D}, //3044 #CJK UNIFIED IDEOGRAPH + {0x9144, 0x614F}, //3045 #CJK UNIFIED IDEOGRAPH + {0x9145, 0x6150}, //3046 #CJK UNIFIED IDEOGRAPH + {0x9146, 0x6152}, //3047 #CJK UNIFIED IDEOGRAPH + {0x9147, 0x6153}, //3048 #CJK UNIFIED IDEOGRAPH + {0x9148, 0x6154}, //3049 #CJK UNIFIED IDEOGRAPH + {0x9149, 0x6156}, //3050 #CJK UNIFIED IDEOGRAPH + {0x914A, 0x6157}, //3051 #CJK UNIFIED IDEOGRAPH + {0x914B, 0x6158}, //3052 #CJK UNIFIED IDEOGRAPH + {0x914C, 0x6159}, //3053 #CJK UNIFIED IDEOGRAPH + {0x914D, 0x615A}, //3054 #CJK UNIFIED IDEOGRAPH + {0x914E, 0x615B}, //3055 #CJK UNIFIED IDEOGRAPH + {0x914F, 0x615C}, //3056 #CJK UNIFIED IDEOGRAPH + {0x9150, 0x615E}, //3057 #CJK UNIFIED IDEOGRAPH + {0x9151, 0x615F}, //3058 #CJK UNIFIED IDEOGRAPH + {0x9152, 0x6160}, //3059 #CJK UNIFIED IDEOGRAPH + {0x9153, 0x6161}, //3060 #CJK UNIFIED IDEOGRAPH + {0x9154, 0x6163}, //3061 #CJK UNIFIED IDEOGRAPH + {0x9155, 0x6164}, //3062 #CJK UNIFIED IDEOGRAPH + {0x9156, 0x6165}, //3063 #CJK UNIFIED IDEOGRAPH + {0x9157, 0x6166}, //3064 #CJK UNIFIED IDEOGRAPH + {0x9158, 0x6169}, //3065 #CJK UNIFIED IDEOGRAPH + {0x9159, 0x616A}, //3066 #CJK UNIFIED IDEOGRAPH + {0x915A, 0x616B}, //3067 #CJK UNIFIED IDEOGRAPH + {0x915B, 0x616C}, //3068 #CJK UNIFIED IDEOGRAPH + {0x915C, 0x616D}, //3069 #CJK UNIFIED IDEOGRAPH + {0x915D, 0x616E}, //3070 #CJK UNIFIED IDEOGRAPH + {0x915E, 0x616F}, //3071 #CJK UNIFIED IDEOGRAPH + {0x915F, 0x6171}, //3072 #CJK UNIFIED IDEOGRAPH + {0x9160, 0x6172}, //3073 #CJK UNIFIED IDEOGRAPH + {0x9161, 0x6173}, //3074 #CJK UNIFIED IDEOGRAPH + {0x9162, 0x6174}, //3075 #CJK UNIFIED IDEOGRAPH + {0x9163, 0x6176}, //3076 #CJK UNIFIED IDEOGRAPH + {0x9164, 0x6178}, //3077 #CJK UNIFIED IDEOGRAPH + {0x9165, 0x6179}, //3078 #CJK UNIFIED IDEOGRAPH + {0x9166, 0x617A}, //3079 #CJK UNIFIED IDEOGRAPH + {0x9167, 0x617B}, //3080 #CJK UNIFIED IDEOGRAPH + {0x9168, 0x617C}, //3081 #CJK UNIFIED IDEOGRAPH + {0x9169, 0x617D}, //3082 #CJK UNIFIED IDEOGRAPH + {0x916A, 0x617E}, //3083 #CJK UNIFIED IDEOGRAPH + {0x916B, 0x617F}, //3084 #CJK UNIFIED IDEOGRAPH + {0x916C, 0x6180}, //3085 #CJK UNIFIED IDEOGRAPH + {0x916D, 0x6181}, //3086 #CJK UNIFIED IDEOGRAPH + {0x916E, 0x6182}, //3087 #CJK UNIFIED IDEOGRAPH + {0x916F, 0x6183}, //3088 #CJK UNIFIED IDEOGRAPH + {0x9170, 0x6184}, //3089 #CJK UNIFIED IDEOGRAPH + {0x9171, 0x6185}, //3090 #CJK UNIFIED IDEOGRAPH + {0x9172, 0x6186}, //3091 #CJK UNIFIED IDEOGRAPH + {0x9173, 0x6187}, //3092 #CJK UNIFIED IDEOGRAPH + {0x9174, 0x6188}, //3093 #CJK UNIFIED IDEOGRAPH + {0x9175, 0x6189}, //3094 #CJK UNIFIED IDEOGRAPH + {0x9176, 0x618A}, //3095 #CJK UNIFIED IDEOGRAPH + {0x9177, 0x618C}, //3096 #CJK UNIFIED IDEOGRAPH + {0x9178, 0x618D}, //3097 #CJK UNIFIED IDEOGRAPH + {0x9179, 0x618F}, //3098 #CJK UNIFIED IDEOGRAPH + {0x917A, 0x6190}, //3099 #CJK UNIFIED IDEOGRAPH + {0x917B, 0x6191}, //3100 #CJK UNIFIED IDEOGRAPH + {0x917C, 0x6192}, //3101 #CJK UNIFIED IDEOGRAPH + {0x917D, 0x6193}, //3102 #CJK UNIFIED IDEOGRAPH + {0x917E, 0x6195}, //3103 #CJK UNIFIED IDEOGRAPH + {0x9180, 0x6196}, //3104 #CJK UNIFIED IDEOGRAPH + {0x9181, 0x6197}, //3105 #CJK UNIFIED IDEOGRAPH + {0x9182, 0x6198}, //3106 #CJK UNIFIED IDEOGRAPH + {0x9183, 0x6199}, //3107 #CJK UNIFIED IDEOGRAPH + {0x9184, 0x619A}, //3108 #CJK UNIFIED IDEOGRAPH + {0x9185, 0x619B}, //3109 #CJK UNIFIED IDEOGRAPH + {0x9186, 0x619C}, //3110 #CJK UNIFIED IDEOGRAPH + {0x9187, 0x619E}, //3111 #CJK UNIFIED IDEOGRAPH + {0x9188, 0x619F}, //3112 #CJK UNIFIED IDEOGRAPH + {0x9189, 0x61A0}, //3113 #CJK UNIFIED IDEOGRAPH + {0x918A, 0x61A1}, //3114 #CJK UNIFIED IDEOGRAPH + {0x918B, 0x61A2}, //3115 #CJK UNIFIED IDEOGRAPH + {0x918C, 0x61A3}, //3116 #CJK UNIFIED IDEOGRAPH + {0x918D, 0x61A4}, //3117 #CJK UNIFIED IDEOGRAPH + {0x918E, 0x61A5}, //3118 #CJK UNIFIED IDEOGRAPH + {0x918F, 0x61A6}, //3119 #CJK UNIFIED IDEOGRAPH + {0x9190, 0x61AA}, //3120 #CJK UNIFIED IDEOGRAPH + {0x9191, 0x61AB}, //3121 #CJK UNIFIED IDEOGRAPH + {0x9192, 0x61AD}, //3122 #CJK UNIFIED IDEOGRAPH + {0x9193, 0x61AE}, //3123 #CJK UNIFIED IDEOGRAPH + {0x9194, 0x61AF}, //3124 #CJK UNIFIED IDEOGRAPH + {0x9195, 0x61B0}, //3125 #CJK UNIFIED IDEOGRAPH + {0x9196, 0x61B1}, //3126 #CJK UNIFIED IDEOGRAPH + {0x9197, 0x61B2}, //3127 #CJK UNIFIED IDEOGRAPH + {0x9198, 0x61B3}, //3128 #CJK UNIFIED IDEOGRAPH + {0x9199, 0x61B4}, //3129 #CJK UNIFIED IDEOGRAPH + {0x919A, 0x61B5}, //3130 #CJK UNIFIED IDEOGRAPH + {0x919B, 0x61B6}, //3131 #CJK UNIFIED IDEOGRAPH + {0x919C, 0x61B8}, //3132 #CJK UNIFIED IDEOGRAPH + {0x919D, 0x61B9}, //3133 #CJK UNIFIED IDEOGRAPH + {0x919E, 0x61BA}, //3134 #CJK UNIFIED IDEOGRAPH + {0x919F, 0x61BB}, //3135 #CJK UNIFIED IDEOGRAPH + {0x91A0, 0x61BC}, //3136 #CJK UNIFIED IDEOGRAPH + {0x91A1, 0x61BD}, //3137 #CJK UNIFIED IDEOGRAPH + {0x91A2, 0x61BF}, //3138 #CJK UNIFIED IDEOGRAPH + {0x91A3, 0x61C0}, //3139 #CJK UNIFIED IDEOGRAPH + {0x91A4, 0x61C1}, //3140 #CJK UNIFIED IDEOGRAPH + {0x91A5, 0x61C3}, //3141 #CJK UNIFIED IDEOGRAPH + {0x91A6, 0x61C4}, //3142 #CJK UNIFIED IDEOGRAPH + {0x91A7, 0x61C5}, //3143 #CJK UNIFIED IDEOGRAPH + {0x91A8, 0x61C6}, //3144 #CJK UNIFIED IDEOGRAPH + {0x91A9, 0x61C7}, //3145 #CJK UNIFIED IDEOGRAPH + {0x91AA, 0x61C9}, //3146 #CJK UNIFIED IDEOGRAPH + {0x91AB, 0x61CC}, //3147 #CJK UNIFIED IDEOGRAPH + {0x91AC, 0x61CD}, //3148 #CJK UNIFIED IDEOGRAPH + {0x91AD, 0x61CE}, //3149 #CJK UNIFIED IDEOGRAPH + {0x91AE, 0x61CF}, //3150 #CJK UNIFIED IDEOGRAPH + {0x91AF, 0x61D0}, //3151 #CJK UNIFIED IDEOGRAPH + {0x91B0, 0x61D3}, //3152 #CJK UNIFIED IDEOGRAPH + {0x91B1, 0x61D5}, //3153 #CJK UNIFIED IDEOGRAPH + {0x91B2, 0x61D6}, //3154 #CJK UNIFIED IDEOGRAPH + {0x91B3, 0x61D7}, //3155 #CJK UNIFIED IDEOGRAPH + {0x91B4, 0x61D8}, //3156 #CJK UNIFIED IDEOGRAPH + {0x91B5, 0x61D9}, //3157 #CJK UNIFIED IDEOGRAPH + {0x91B6, 0x61DA}, //3158 #CJK UNIFIED IDEOGRAPH + {0x91B7, 0x61DB}, //3159 #CJK UNIFIED IDEOGRAPH + {0x91B8, 0x61DC}, //3160 #CJK UNIFIED IDEOGRAPH + {0x91B9, 0x61DD}, //3161 #CJK UNIFIED IDEOGRAPH + {0x91BA, 0x61DE}, //3162 #CJK UNIFIED IDEOGRAPH + {0x91BB, 0x61DF}, //3163 #CJK UNIFIED IDEOGRAPH + {0x91BC, 0x61E0}, //3164 #CJK UNIFIED IDEOGRAPH + {0x91BD, 0x61E1}, //3165 #CJK UNIFIED IDEOGRAPH + {0x91BE, 0x61E2}, //3166 #CJK UNIFIED IDEOGRAPH + {0x91BF, 0x61E3}, //3167 #CJK UNIFIED IDEOGRAPH + {0x91C0, 0x61E4}, //3168 #CJK UNIFIED IDEOGRAPH + {0x91C1, 0x61E5}, //3169 #CJK UNIFIED IDEOGRAPH + {0x91C2, 0x61E7}, //3170 #CJK UNIFIED IDEOGRAPH + {0x91C3, 0x61E8}, //3171 #CJK UNIFIED IDEOGRAPH + {0x91C4, 0x61E9}, //3172 #CJK UNIFIED IDEOGRAPH + {0x91C5, 0x61EA}, //3173 #CJK UNIFIED IDEOGRAPH + {0x91C6, 0x61EB}, //3174 #CJK UNIFIED IDEOGRAPH + {0x91C7, 0x61EC}, //3175 #CJK UNIFIED IDEOGRAPH + {0x91C8, 0x61ED}, //3176 #CJK UNIFIED IDEOGRAPH + {0x91C9, 0x61EE}, //3177 #CJK UNIFIED IDEOGRAPH + {0x91CA, 0x61EF}, //3178 #CJK UNIFIED IDEOGRAPH + {0x91CB, 0x61F0}, //3179 #CJK UNIFIED IDEOGRAPH + {0x91CC, 0x61F1}, //3180 #CJK UNIFIED IDEOGRAPH + {0x91CD, 0x61F2}, //3181 #CJK UNIFIED IDEOGRAPH + {0x91CE, 0x61F3}, //3182 #CJK UNIFIED IDEOGRAPH + {0x91CF, 0x61F4}, //3183 #CJK UNIFIED IDEOGRAPH + {0x91D0, 0x61F6}, //3184 #CJK UNIFIED IDEOGRAPH + {0x91D1, 0x61F7}, //3185 #CJK UNIFIED IDEOGRAPH + {0x91D2, 0x61F8}, //3186 #CJK UNIFIED IDEOGRAPH + {0x91D3, 0x61F9}, //3187 #CJK UNIFIED IDEOGRAPH + {0x91D4, 0x61FA}, //3188 #CJK UNIFIED IDEOGRAPH + {0x91D5, 0x61FB}, //3189 #CJK UNIFIED IDEOGRAPH + {0x91D6, 0x61FC}, //3190 #CJK UNIFIED IDEOGRAPH + {0x91D7, 0x61FD}, //3191 #CJK UNIFIED IDEOGRAPH + {0x91D8, 0x61FE}, //3192 #CJK UNIFIED IDEOGRAPH + {0x91D9, 0x6200}, //3193 #CJK UNIFIED IDEOGRAPH + {0x91DA, 0x6201}, //3194 #CJK UNIFIED IDEOGRAPH + {0x91DB, 0x6202}, //3195 #CJK UNIFIED IDEOGRAPH + {0x91DC, 0x6203}, //3196 #CJK UNIFIED IDEOGRAPH + {0x91DD, 0x6204}, //3197 #CJK UNIFIED IDEOGRAPH + {0x91DE, 0x6205}, //3198 #CJK UNIFIED IDEOGRAPH + {0x91DF, 0x6207}, //3199 #CJK UNIFIED IDEOGRAPH + {0x91E0, 0x6209}, //3200 #CJK UNIFIED IDEOGRAPH + {0x91E1, 0x6213}, //3201 #CJK UNIFIED IDEOGRAPH + {0x91E2, 0x6214}, //3202 #CJK UNIFIED IDEOGRAPH + {0x91E3, 0x6219}, //3203 #CJK UNIFIED IDEOGRAPH + {0x91E4, 0x621C}, //3204 #CJK UNIFIED IDEOGRAPH + {0x91E5, 0x621D}, //3205 #CJK UNIFIED IDEOGRAPH + {0x91E6, 0x621E}, //3206 #CJK UNIFIED IDEOGRAPH + {0x91E7, 0x6220}, //3207 #CJK UNIFIED IDEOGRAPH + {0x91E8, 0x6223}, //3208 #CJK UNIFIED IDEOGRAPH + {0x91E9, 0x6226}, //3209 #CJK UNIFIED IDEOGRAPH + {0x91EA, 0x6227}, //3210 #CJK UNIFIED IDEOGRAPH + {0x91EB, 0x6228}, //3211 #CJK UNIFIED IDEOGRAPH + {0x91EC, 0x6229}, //3212 #CJK UNIFIED IDEOGRAPH + {0x91ED, 0x622B}, //3213 #CJK UNIFIED IDEOGRAPH + {0x91EE, 0x622D}, //3214 #CJK UNIFIED IDEOGRAPH + {0x91EF, 0x622F}, //3215 #CJK UNIFIED IDEOGRAPH + {0x91F0, 0x6230}, //3216 #CJK UNIFIED IDEOGRAPH + {0x91F1, 0x6231}, //3217 #CJK UNIFIED IDEOGRAPH + {0x91F2, 0x6232}, //3218 #CJK UNIFIED IDEOGRAPH + {0x91F3, 0x6235}, //3219 #CJK UNIFIED IDEOGRAPH + {0x91F4, 0x6236}, //3220 #CJK UNIFIED IDEOGRAPH + {0x91F5, 0x6238}, //3221 #CJK UNIFIED IDEOGRAPH + {0x91F6, 0x6239}, //3222 #CJK UNIFIED IDEOGRAPH + {0x91F7, 0x623A}, //3223 #CJK UNIFIED IDEOGRAPH + {0x91F8, 0x623B}, //3224 #CJK UNIFIED IDEOGRAPH + {0x91F9, 0x623C}, //3225 #CJK UNIFIED IDEOGRAPH + {0x91FA, 0x6242}, //3226 #CJK UNIFIED IDEOGRAPH + {0x91FB, 0x6244}, //3227 #CJK UNIFIED IDEOGRAPH + {0x91FC, 0x6245}, //3228 #CJK UNIFIED IDEOGRAPH + {0x91FD, 0x6246}, //3229 #CJK UNIFIED IDEOGRAPH + {0x91FE, 0x624A}, //3230 #CJK UNIFIED IDEOGRAPH + {0x9240, 0x624F}, //3231 #CJK UNIFIED IDEOGRAPH + {0x9241, 0x6250}, //3232 #CJK UNIFIED IDEOGRAPH + {0x9242, 0x6255}, //3233 #CJK UNIFIED IDEOGRAPH + {0x9243, 0x6256}, //3234 #CJK UNIFIED IDEOGRAPH + {0x9244, 0x6257}, //3235 #CJK UNIFIED IDEOGRAPH + {0x9245, 0x6259}, //3236 #CJK UNIFIED IDEOGRAPH + {0x9246, 0x625A}, //3237 #CJK UNIFIED IDEOGRAPH + {0x9247, 0x625C}, //3238 #CJK UNIFIED IDEOGRAPH + {0x9248, 0x625D}, //3239 #CJK UNIFIED IDEOGRAPH + {0x9249, 0x625E}, //3240 #CJK UNIFIED IDEOGRAPH + {0x924A, 0x625F}, //3241 #CJK UNIFIED IDEOGRAPH + {0x924B, 0x6260}, //3242 #CJK UNIFIED IDEOGRAPH + {0x924C, 0x6261}, //3243 #CJK UNIFIED IDEOGRAPH + {0x924D, 0x6262}, //3244 #CJK UNIFIED IDEOGRAPH + {0x924E, 0x6264}, //3245 #CJK UNIFIED IDEOGRAPH + {0x924F, 0x6265}, //3246 #CJK UNIFIED IDEOGRAPH + {0x9250, 0x6268}, //3247 #CJK UNIFIED IDEOGRAPH + {0x9251, 0x6271}, //3248 #CJK UNIFIED IDEOGRAPH + {0x9252, 0x6272}, //3249 #CJK UNIFIED IDEOGRAPH + {0x9253, 0x6274}, //3250 #CJK UNIFIED IDEOGRAPH + {0x9254, 0x6275}, //3251 #CJK UNIFIED IDEOGRAPH + {0x9255, 0x6277}, //3252 #CJK UNIFIED IDEOGRAPH + {0x9256, 0x6278}, //3253 #CJK UNIFIED IDEOGRAPH + {0x9257, 0x627A}, //3254 #CJK UNIFIED IDEOGRAPH + {0x9258, 0x627B}, //3255 #CJK UNIFIED IDEOGRAPH + {0x9259, 0x627D}, //3256 #CJK UNIFIED IDEOGRAPH + {0x925A, 0x6281}, //3257 #CJK UNIFIED IDEOGRAPH + {0x925B, 0x6282}, //3258 #CJK UNIFIED IDEOGRAPH + {0x925C, 0x6283}, //3259 #CJK UNIFIED IDEOGRAPH + {0x925D, 0x6285}, //3260 #CJK UNIFIED IDEOGRAPH + {0x925E, 0x6286}, //3261 #CJK UNIFIED IDEOGRAPH + {0x925F, 0x6287}, //3262 #CJK UNIFIED IDEOGRAPH + {0x9260, 0x6288}, //3263 #CJK UNIFIED IDEOGRAPH + {0x9261, 0x628B}, //3264 #CJK UNIFIED IDEOGRAPH + {0x9262, 0x628C}, //3265 #CJK UNIFIED IDEOGRAPH + {0x9263, 0x628D}, //3266 #CJK UNIFIED IDEOGRAPH + {0x9264, 0x628E}, //3267 #CJK UNIFIED IDEOGRAPH + {0x9265, 0x628F}, //3268 #CJK UNIFIED IDEOGRAPH + {0x9266, 0x6290}, //3269 #CJK UNIFIED IDEOGRAPH + {0x9267, 0x6294}, //3270 #CJK UNIFIED IDEOGRAPH + {0x9268, 0x6299}, //3271 #CJK UNIFIED IDEOGRAPH + {0x9269, 0x629C}, //3272 #CJK UNIFIED IDEOGRAPH + {0x926A, 0x629D}, //3273 #CJK UNIFIED IDEOGRAPH + {0x926B, 0x629E}, //3274 #CJK UNIFIED IDEOGRAPH + {0x926C, 0x62A3}, //3275 #CJK UNIFIED IDEOGRAPH + {0x926D, 0x62A6}, //3276 #CJK UNIFIED IDEOGRAPH + {0x926E, 0x62A7}, //3277 #CJK UNIFIED IDEOGRAPH + {0x926F, 0x62A9}, //3278 #CJK UNIFIED IDEOGRAPH + {0x9270, 0x62AA}, //3279 #CJK UNIFIED IDEOGRAPH + {0x9271, 0x62AD}, //3280 #CJK UNIFIED IDEOGRAPH + {0x9272, 0x62AE}, //3281 #CJK UNIFIED IDEOGRAPH + {0x9273, 0x62AF}, //3282 #CJK UNIFIED IDEOGRAPH + {0x9274, 0x62B0}, //3283 #CJK UNIFIED IDEOGRAPH + {0x9275, 0x62B2}, //3284 #CJK UNIFIED IDEOGRAPH + {0x9276, 0x62B3}, //3285 #CJK UNIFIED IDEOGRAPH + {0x9277, 0x62B4}, //3286 #CJK UNIFIED IDEOGRAPH + {0x9278, 0x62B6}, //3287 #CJK UNIFIED IDEOGRAPH + {0x9279, 0x62B7}, //3288 #CJK UNIFIED IDEOGRAPH + {0x927A, 0x62B8}, //3289 #CJK UNIFIED IDEOGRAPH + {0x927B, 0x62BA}, //3290 #CJK UNIFIED IDEOGRAPH + {0x927C, 0x62BE}, //3291 #CJK UNIFIED IDEOGRAPH + {0x927D, 0x62C0}, //3292 #CJK UNIFIED IDEOGRAPH + {0x927E, 0x62C1}, //3293 #CJK UNIFIED IDEOGRAPH + {0x9280, 0x62C3}, //3294 #CJK UNIFIED IDEOGRAPH + {0x9281, 0x62CB}, //3295 #CJK UNIFIED IDEOGRAPH + {0x9282, 0x62CF}, //3296 #CJK UNIFIED IDEOGRAPH + {0x9283, 0x62D1}, //3297 #CJK UNIFIED IDEOGRAPH + {0x9284, 0x62D5}, //3298 #CJK UNIFIED IDEOGRAPH + {0x9285, 0x62DD}, //3299 #CJK UNIFIED IDEOGRAPH + {0x9286, 0x62DE}, //3300 #CJK UNIFIED IDEOGRAPH + {0x9287, 0x62E0}, //3301 #CJK UNIFIED IDEOGRAPH + {0x9288, 0x62E1}, //3302 #CJK UNIFIED IDEOGRAPH + {0x9289, 0x62E4}, //3303 #CJK UNIFIED IDEOGRAPH + {0x928A, 0x62EA}, //3304 #CJK UNIFIED IDEOGRAPH + {0x928B, 0x62EB}, //3305 #CJK UNIFIED IDEOGRAPH + {0x928C, 0x62F0}, //3306 #CJK UNIFIED IDEOGRAPH + {0x928D, 0x62F2}, //3307 #CJK UNIFIED IDEOGRAPH + {0x928E, 0x62F5}, //3308 #CJK UNIFIED IDEOGRAPH + {0x928F, 0x62F8}, //3309 #CJK UNIFIED IDEOGRAPH + {0x9290, 0x62F9}, //3310 #CJK UNIFIED IDEOGRAPH + {0x9291, 0x62FA}, //3311 #CJK UNIFIED IDEOGRAPH + {0x9292, 0x62FB}, //3312 #CJK UNIFIED IDEOGRAPH + {0x9293, 0x6300}, //3313 #CJK UNIFIED IDEOGRAPH + {0x9294, 0x6303}, //3314 #CJK UNIFIED IDEOGRAPH + {0x9295, 0x6304}, //3315 #CJK UNIFIED IDEOGRAPH + {0x9296, 0x6305}, //3316 #CJK UNIFIED IDEOGRAPH + {0x9297, 0x6306}, //3317 #CJK UNIFIED IDEOGRAPH + {0x9298, 0x630A}, //3318 #CJK UNIFIED IDEOGRAPH + {0x9299, 0x630B}, //3319 #CJK UNIFIED IDEOGRAPH + {0x929A, 0x630C}, //3320 #CJK UNIFIED IDEOGRAPH + {0x929B, 0x630D}, //3321 #CJK UNIFIED IDEOGRAPH + {0x929C, 0x630F}, //3322 #CJK UNIFIED IDEOGRAPH + {0x929D, 0x6310}, //3323 #CJK UNIFIED IDEOGRAPH + {0x929E, 0x6312}, //3324 #CJK UNIFIED IDEOGRAPH + {0x929F, 0x6313}, //3325 #CJK UNIFIED IDEOGRAPH + {0x92A0, 0x6314}, //3326 #CJK UNIFIED IDEOGRAPH + {0x92A1, 0x6315}, //3327 #CJK UNIFIED IDEOGRAPH + {0x92A2, 0x6317}, //3328 #CJK UNIFIED IDEOGRAPH + {0x92A3, 0x6318}, //3329 #CJK UNIFIED IDEOGRAPH + {0x92A4, 0x6319}, //3330 #CJK UNIFIED IDEOGRAPH + {0x92A5, 0x631C}, //3331 #CJK UNIFIED IDEOGRAPH + {0x92A6, 0x6326}, //3332 #CJK UNIFIED IDEOGRAPH + {0x92A7, 0x6327}, //3333 #CJK UNIFIED IDEOGRAPH + {0x92A8, 0x6329}, //3334 #CJK UNIFIED IDEOGRAPH + {0x92A9, 0x632C}, //3335 #CJK UNIFIED IDEOGRAPH + {0x92AA, 0x632D}, //3336 #CJK UNIFIED IDEOGRAPH + {0x92AB, 0x632E}, //3337 #CJK UNIFIED IDEOGRAPH + {0x92AC, 0x6330}, //3338 #CJK UNIFIED IDEOGRAPH + {0x92AD, 0x6331}, //3339 #CJK UNIFIED IDEOGRAPH + {0x92AE, 0x6333}, //3340 #CJK UNIFIED IDEOGRAPH + {0x92AF, 0x6334}, //3341 #CJK UNIFIED IDEOGRAPH + {0x92B0, 0x6335}, //3342 #CJK UNIFIED IDEOGRAPH + {0x92B1, 0x6336}, //3343 #CJK UNIFIED IDEOGRAPH + {0x92B2, 0x6337}, //3344 #CJK UNIFIED IDEOGRAPH + {0x92B3, 0x6338}, //3345 #CJK UNIFIED IDEOGRAPH + {0x92B4, 0x633B}, //3346 #CJK UNIFIED IDEOGRAPH + {0x92B5, 0x633C}, //3347 #CJK UNIFIED IDEOGRAPH + {0x92B6, 0x633E}, //3348 #CJK UNIFIED IDEOGRAPH + {0x92B7, 0x633F}, //3349 #CJK UNIFIED IDEOGRAPH + {0x92B8, 0x6340}, //3350 #CJK UNIFIED IDEOGRAPH + {0x92B9, 0x6341}, //3351 #CJK UNIFIED IDEOGRAPH + {0x92BA, 0x6344}, //3352 #CJK UNIFIED IDEOGRAPH + {0x92BB, 0x6347}, //3353 #CJK UNIFIED IDEOGRAPH + {0x92BC, 0x6348}, //3354 #CJK UNIFIED IDEOGRAPH + {0x92BD, 0x634A}, //3355 #CJK UNIFIED IDEOGRAPH + {0x92BE, 0x6351}, //3356 #CJK UNIFIED IDEOGRAPH + {0x92BF, 0x6352}, //3357 #CJK UNIFIED IDEOGRAPH + {0x92C0, 0x6353}, //3358 #CJK UNIFIED IDEOGRAPH + {0x92C1, 0x6354}, //3359 #CJK UNIFIED IDEOGRAPH + {0x92C2, 0x6356}, //3360 #CJK UNIFIED IDEOGRAPH + {0x92C3, 0x6357}, //3361 #CJK UNIFIED IDEOGRAPH + {0x92C4, 0x6358}, //3362 #CJK UNIFIED IDEOGRAPH + {0x92C5, 0x6359}, //3363 #CJK UNIFIED IDEOGRAPH + {0x92C6, 0x635A}, //3364 #CJK UNIFIED IDEOGRAPH + {0x92C7, 0x635B}, //3365 #CJK UNIFIED IDEOGRAPH + {0x92C8, 0x635C}, //3366 #CJK UNIFIED IDEOGRAPH + {0x92C9, 0x635D}, //3367 #CJK UNIFIED IDEOGRAPH + {0x92CA, 0x6360}, //3368 #CJK UNIFIED IDEOGRAPH + {0x92CB, 0x6364}, //3369 #CJK UNIFIED IDEOGRAPH + {0x92CC, 0x6365}, //3370 #CJK UNIFIED IDEOGRAPH + {0x92CD, 0x6366}, //3371 #CJK UNIFIED IDEOGRAPH + {0x92CE, 0x6368}, //3372 #CJK UNIFIED IDEOGRAPH + {0x92CF, 0x636A}, //3373 #CJK UNIFIED IDEOGRAPH + {0x92D0, 0x636B}, //3374 #CJK UNIFIED IDEOGRAPH + {0x92D1, 0x636C}, //3375 #CJK UNIFIED IDEOGRAPH + {0x92D2, 0x636F}, //3376 #CJK UNIFIED IDEOGRAPH + {0x92D3, 0x6370}, //3377 #CJK UNIFIED IDEOGRAPH + {0x92D4, 0x6372}, //3378 #CJK UNIFIED IDEOGRAPH + {0x92D5, 0x6373}, //3379 #CJK UNIFIED IDEOGRAPH + {0x92D6, 0x6374}, //3380 #CJK UNIFIED IDEOGRAPH + {0x92D7, 0x6375}, //3381 #CJK UNIFIED IDEOGRAPH + {0x92D8, 0x6378}, //3382 #CJK UNIFIED IDEOGRAPH + {0x92D9, 0x6379}, //3383 #CJK UNIFIED IDEOGRAPH + {0x92DA, 0x637C}, //3384 #CJK UNIFIED IDEOGRAPH + {0x92DB, 0x637D}, //3385 #CJK UNIFIED IDEOGRAPH + {0x92DC, 0x637E}, //3386 #CJK UNIFIED IDEOGRAPH + {0x92DD, 0x637F}, //3387 #CJK UNIFIED IDEOGRAPH + {0x92DE, 0x6381}, //3388 #CJK UNIFIED IDEOGRAPH + {0x92DF, 0x6383}, //3389 #CJK UNIFIED IDEOGRAPH + {0x92E0, 0x6384}, //3390 #CJK UNIFIED IDEOGRAPH + {0x92E1, 0x6385}, //3391 #CJK UNIFIED IDEOGRAPH + {0x92E2, 0x6386}, //3392 #CJK UNIFIED IDEOGRAPH + {0x92E3, 0x638B}, //3393 #CJK UNIFIED IDEOGRAPH + {0x92E4, 0x638D}, //3394 #CJK UNIFIED IDEOGRAPH + {0x92E5, 0x6391}, //3395 #CJK UNIFIED IDEOGRAPH + {0x92E6, 0x6393}, //3396 #CJK UNIFIED IDEOGRAPH + {0x92E7, 0x6394}, //3397 #CJK UNIFIED IDEOGRAPH + {0x92E8, 0x6395}, //3398 #CJK UNIFIED IDEOGRAPH + {0x92E9, 0x6397}, //3399 #CJK UNIFIED IDEOGRAPH + {0x92EA, 0x6399}, //3400 #CJK UNIFIED IDEOGRAPH + {0x92EB, 0x639A}, //3401 #CJK UNIFIED IDEOGRAPH + {0x92EC, 0x639B}, //3402 #CJK UNIFIED IDEOGRAPH + {0x92ED, 0x639C}, //3403 #CJK UNIFIED IDEOGRAPH + {0x92EE, 0x639D}, //3404 #CJK UNIFIED IDEOGRAPH + {0x92EF, 0x639E}, //3405 #CJK UNIFIED IDEOGRAPH + {0x92F0, 0x639F}, //3406 #CJK UNIFIED IDEOGRAPH + {0x92F1, 0x63A1}, //3407 #CJK UNIFIED IDEOGRAPH + {0x92F2, 0x63A4}, //3408 #CJK UNIFIED IDEOGRAPH + {0x92F3, 0x63A6}, //3409 #CJK UNIFIED IDEOGRAPH + {0x92F4, 0x63AB}, //3410 #CJK UNIFIED IDEOGRAPH + {0x92F5, 0x63AF}, //3411 #CJK UNIFIED IDEOGRAPH + {0x92F6, 0x63B1}, //3412 #CJK UNIFIED IDEOGRAPH + {0x92F7, 0x63B2}, //3413 #CJK UNIFIED IDEOGRAPH + {0x92F8, 0x63B5}, //3414 #CJK UNIFIED IDEOGRAPH + {0x92F9, 0x63B6}, //3415 #CJK UNIFIED IDEOGRAPH + {0x92FA, 0x63B9}, //3416 #CJK UNIFIED IDEOGRAPH + {0x92FB, 0x63BB}, //3417 #CJK UNIFIED IDEOGRAPH + {0x92FC, 0x63BD}, //3418 #CJK UNIFIED IDEOGRAPH + {0x92FD, 0x63BF}, //3419 #CJK UNIFIED IDEOGRAPH + {0x92FE, 0x63C0}, //3420 #CJK UNIFIED IDEOGRAPH + {0x9340, 0x63C1}, //3421 #CJK UNIFIED IDEOGRAPH + {0x9341, 0x63C2}, //3422 #CJK UNIFIED IDEOGRAPH + {0x9342, 0x63C3}, //3423 #CJK UNIFIED IDEOGRAPH + {0x9343, 0x63C5}, //3424 #CJK UNIFIED IDEOGRAPH + {0x9344, 0x63C7}, //3425 #CJK UNIFIED IDEOGRAPH + {0x9345, 0x63C8}, //3426 #CJK UNIFIED IDEOGRAPH + {0x9346, 0x63CA}, //3427 #CJK UNIFIED IDEOGRAPH + {0x9347, 0x63CB}, //3428 #CJK UNIFIED IDEOGRAPH + {0x9348, 0x63CC}, //3429 #CJK UNIFIED IDEOGRAPH + {0x9349, 0x63D1}, //3430 #CJK UNIFIED IDEOGRAPH + {0x934A, 0x63D3}, //3431 #CJK UNIFIED IDEOGRAPH + {0x934B, 0x63D4}, //3432 #CJK UNIFIED IDEOGRAPH + {0x934C, 0x63D5}, //3433 #CJK UNIFIED IDEOGRAPH + {0x934D, 0x63D7}, //3434 #CJK UNIFIED IDEOGRAPH + {0x934E, 0x63D8}, //3435 #CJK UNIFIED IDEOGRAPH + {0x934F, 0x63D9}, //3436 #CJK UNIFIED IDEOGRAPH + {0x9350, 0x63DA}, //3437 #CJK UNIFIED IDEOGRAPH + {0x9351, 0x63DB}, //3438 #CJK UNIFIED IDEOGRAPH + {0x9352, 0x63DC}, //3439 #CJK UNIFIED IDEOGRAPH + {0x9353, 0x63DD}, //3440 #CJK UNIFIED IDEOGRAPH + {0x9354, 0x63DF}, //3441 #CJK UNIFIED IDEOGRAPH + {0x9355, 0x63E2}, //3442 #CJK UNIFIED IDEOGRAPH + {0x9356, 0x63E4}, //3443 #CJK UNIFIED IDEOGRAPH + {0x9357, 0x63E5}, //3444 #CJK UNIFIED IDEOGRAPH + {0x9358, 0x63E6}, //3445 #CJK UNIFIED IDEOGRAPH + {0x9359, 0x63E7}, //3446 #CJK UNIFIED IDEOGRAPH + {0x935A, 0x63E8}, //3447 #CJK UNIFIED IDEOGRAPH + {0x935B, 0x63EB}, //3448 #CJK UNIFIED IDEOGRAPH + {0x935C, 0x63EC}, //3449 #CJK UNIFIED IDEOGRAPH + {0x935D, 0x63EE}, //3450 #CJK UNIFIED IDEOGRAPH + {0x935E, 0x63EF}, //3451 #CJK UNIFIED IDEOGRAPH + {0x935F, 0x63F0}, //3452 #CJK UNIFIED IDEOGRAPH + {0x9360, 0x63F1}, //3453 #CJK UNIFIED IDEOGRAPH + {0x9361, 0x63F3}, //3454 #CJK UNIFIED IDEOGRAPH + {0x9362, 0x63F5}, //3455 #CJK UNIFIED IDEOGRAPH + {0x9363, 0x63F7}, //3456 #CJK UNIFIED IDEOGRAPH + {0x9364, 0x63F9}, //3457 #CJK UNIFIED IDEOGRAPH + {0x9365, 0x63FA}, //3458 #CJK UNIFIED IDEOGRAPH + {0x9366, 0x63FB}, //3459 #CJK UNIFIED IDEOGRAPH + {0x9367, 0x63FC}, //3460 #CJK UNIFIED IDEOGRAPH + {0x9368, 0x63FE}, //3461 #CJK UNIFIED IDEOGRAPH + {0x9369, 0x6403}, //3462 #CJK UNIFIED IDEOGRAPH + {0x936A, 0x6404}, //3463 #CJK UNIFIED IDEOGRAPH + {0x936B, 0x6406}, //3464 #CJK UNIFIED IDEOGRAPH + {0x936C, 0x6407}, //3465 #CJK UNIFIED IDEOGRAPH + {0x936D, 0x6408}, //3466 #CJK UNIFIED IDEOGRAPH + {0x936E, 0x6409}, //3467 #CJK UNIFIED IDEOGRAPH + {0x936F, 0x640A}, //3468 #CJK UNIFIED IDEOGRAPH + {0x9370, 0x640D}, //3469 #CJK UNIFIED IDEOGRAPH + {0x9371, 0x640E}, //3470 #CJK UNIFIED IDEOGRAPH + {0x9372, 0x6411}, //3471 #CJK UNIFIED IDEOGRAPH + {0x9373, 0x6412}, //3472 #CJK UNIFIED IDEOGRAPH + {0x9374, 0x6415}, //3473 #CJK UNIFIED IDEOGRAPH + {0x9375, 0x6416}, //3474 #CJK UNIFIED IDEOGRAPH + {0x9376, 0x6417}, //3475 #CJK UNIFIED IDEOGRAPH + {0x9377, 0x6418}, //3476 #CJK UNIFIED IDEOGRAPH + {0x9378, 0x6419}, //3477 #CJK UNIFIED IDEOGRAPH + {0x9379, 0x641A}, //3478 #CJK UNIFIED IDEOGRAPH + {0x937A, 0x641D}, //3479 #CJK UNIFIED IDEOGRAPH + {0x937B, 0x641F}, //3480 #CJK UNIFIED IDEOGRAPH + {0x937C, 0x6422}, //3481 #CJK UNIFIED IDEOGRAPH + {0x937D, 0x6423}, //3482 #CJK UNIFIED IDEOGRAPH + {0x937E, 0x6424}, //3483 #CJK UNIFIED IDEOGRAPH + {0x9380, 0x6425}, //3484 #CJK UNIFIED IDEOGRAPH + {0x9381, 0x6427}, //3485 #CJK UNIFIED IDEOGRAPH + {0x9382, 0x6428}, //3486 #CJK UNIFIED IDEOGRAPH + {0x9383, 0x6429}, //3487 #CJK UNIFIED IDEOGRAPH + {0x9384, 0x642B}, //3488 #CJK UNIFIED IDEOGRAPH + {0x9385, 0x642E}, //3489 #CJK UNIFIED IDEOGRAPH + {0x9386, 0x642F}, //3490 #CJK UNIFIED IDEOGRAPH + {0x9387, 0x6430}, //3491 #CJK UNIFIED IDEOGRAPH + {0x9388, 0x6431}, //3492 #CJK UNIFIED IDEOGRAPH + {0x9389, 0x6432}, //3493 #CJK UNIFIED IDEOGRAPH + {0x938A, 0x6433}, //3494 #CJK UNIFIED IDEOGRAPH + {0x938B, 0x6435}, //3495 #CJK UNIFIED IDEOGRAPH + {0x938C, 0x6436}, //3496 #CJK UNIFIED IDEOGRAPH + {0x938D, 0x6437}, //3497 #CJK UNIFIED IDEOGRAPH + {0x938E, 0x6438}, //3498 #CJK UNIFIED IDEOGRAPH + {0x938F, 0x6439}, //3499 #CJK UNIFIED IDEOGRAPH + {0x9390, 0x643B}, //3500 #CJK UNIFIED IDEOGRAPH + {0x9391, 0x643C}, //3501 #CJK UNIFIED IDEOGRAPH + {0x9392, 0x643E}, //3502 #CJK UNIFIED IDEOGRAPH + {0x9393, 0x6440}, //3503 #CJK UNIFIED IDEOGRAPH + {0x9394, 0x6442}, //3504 #CJK UNIFIED IDEOGRAPH + {0x9395, 0x6443}, //3505 #CJK UNIFIED IDEOGRAPH + {0x9396, 0x6449}, //3506 #CJK UNIFIED IDEOGRAPH + {0x9397, 0x644B}, //3507 #CJK UNIFIED IDEOGRAPH + {0x9398, 0x644C}, //3508 #CJK UNIFIED IDEOGRAPH + {0x9399, 0x644D}, //3509 #CJK UNIFIED IDEOGRAPH + {0x939A, 0x644E}, //3510 #CJK UNIFIED IDEOGRAPH + {0x939B, 0x644F}, //3511 #CJK UNIFIED IDEOGRAPH + {0x939C, 0x6450}, //3512 #CJK UNIFIED IDEOGRAPH + {0x939D, 0x6451}, //3513 #CJK UNIFIED IDEOGRAPH + {0x939E, 0x6453}, //3514 #CJK UNIFIED IDEOGRAPH + {0x939F, 0x6455}, //3515 #CJK UNIFIED IDEOGRAPH + {0x93A0, 0x6456}, //3516 #CJK UNIFIED IDEOGRAPH + {0x93A1, 0x6457}, //3517 #CJK UNIFIED IDEOGRAPH + {0x93A2, 0x6459}, //3518 #CJK UNIFIED IDEOGRAPH + {0x93A3, 0x645A}, //3519 #CJK UNIFIED IDEOGRAPH + {0x93A4, 0x645B}, //3520 #CJK UNIFIED IDEOGRAPH + {0x93A5, 0x645C}, //3521 #CJK UNIFIED IDEOGRAPH + {0x93A6, 0x645D}, //3522 #CJK UNIFIED IDEOGRAPH + {0x93A7, 0x645F}, //3523 #CJK UNIFIED IDEOGRAPH + {0x93A8, 0x6460}, //3524 #CJK UNIFIED IDEOGRAPH + {0x93A9, 0x6461}, //3525 #CJK UNIFIED IDEOGRAPH + {0x93AA, 0x6462}, //3526 #CJK UNIFIED IDEOGRAPH + {0x93AB, 0x6463}, //3527 #CJK UNIFIED IDEOGRAPH + {0x93AC, 0x6464}, //3528 #CJK UNIFIED IDEOGRAPH + {0x93AD, 0x6465}, //3529 #CJK UNIFIED IDEOGRAPH + {0x93AE, 0x6466}, //3530 #CJK UNIFIED IDEOGRAPH + {0x93AF, 0x6468}, //3531 #CJK UNIFIED IDEOGRAPH + {0x93B0, 0x646A}, //3532 #CJK UNIFIED IDEOGRAPH + {0x93B1, 0x646B}, //3533 #CJK UNIFIED IDEOGRAPH + {0x93B2, 0x646C}, //3534 #CJK UNIFIED IDEOGRAPH + {0x93B3, 0x646E}, //3535 #CJK UNIFIED IDEOGRAPH + {0x93B4, 0x646F}, //3536 #CJK UNIFIED IDEOGRAPH + {0x93B5, 0x6470}, //3537 #CJK UNIFIED IDEOGRAPH + {0x93B6, 0x6471}, //3538 #CJK UNIFIED IDEOGRAPH + {0x93B7, 0x6472}, //3539 #CJK UNIFIED IDEOGRAPH + {0x93B8, 0x6473}, //3540 #CJK UNIFIED IDEOGRAPH + {0x93B9, 0x6474}, //3541 #CJK UNIFIED IDEOGRAPH + {0x93BA, 0x6475}, //3542 #CJK UNIFIED IDEOGRAPH + {0x93BB, 0x6476}, //3543 #CJK UNIFIED IDEOGRAPH + {0x93BC, 0x6477}, //3544 #CJK UNIFIED IDEOGRAPH + {0x93BD, 0x647B}, //3545 #CJK UNIFIED IDEOGRAPH + {0x93BE, 0x647C}, //3546 #CJK UNIFIED IDEOGRAPH + {0x93BF, 0x647D}, //3547 #CJK UNIFIED IDEOGRAPH + {0x93C0, 0x647E}, //3548 #CJK UNIFIED IDEOGRAPH + {0x93C1, 0x647F}, //3549 #CJK UNIFIED IDEOGRAPH + {0x93C2, 0x6480}, //3550 #CJK UNIFIED IDEOGRAPH + {0x93C3, 0x6481}, //3551 #CJK UNIFIED IDEOGRAPH + {0x93C4, 0x6483}, //3552 #CJK UNIFIED IDEOGRAPH + {0x93C5, 0x6486}, //3553 #CJK UNIFIED IDEOGRAPH + {0x93C6, 0x6488}, //3554 #CJK UNIFIED IDEOGRAPH + {0x93C7, 0x6489}, //3555 #CJK UNIFIED IDEOGRAPH + {0x93C8, 0x648A}, //3556 #CJK UNIFIED IDEOGRAPH + {0x93C9, 0x648B}, //3557 #CJK UNIFIED IDEOGRAPH + {0x93CA, 0x648C}, //3558 #CJK UNIFIED IDEOGRAPH + {0x93CB, 0x648D}, //3559 #CJK UNIFIED IDEOGRAPH + {0x93CC, 0x648E}, //3560 #CJK UNIFIED IDEOGRAPH + {0x93CD, 0x648F}, //3561 #CJK UNIFIED IDEOGRAPH + {0x93CE, 0x6490}, //3562 #CJK UNIFIED IDEOGRAPH + {0x93CF, 0x6493}, //3563 #CJK UNIFIED IDEOGRAPH + {0x93D0, 0x6494}, //3564 #CJK UNIFIED IDEOGRAPH + {0x93D1, 0x6497}, //3565 #CJK UNIFIED IDEOGRAPH + {0x93D2, 0x6498}, //3566 #CJK UNIFIED IDEOGRAPH + {0x93D3, 0x649A}, //3567 #CJK UNIFIED IDEOGRAPH + {0x93D4, 0x649B}, //3568 #CJK UNIFIED IDEOGRAPH + {0x93D5, 0x649C}, //3569 #CJK UNIFIED IDEOGRAPH + {0x93D6, 0x649D}, //3570 #CJK UNIFIED IDEOGRAPH + {0x93D7, 0x649F}, //3571 #CJK UNIFIED IDEOGRAPH + {0x93D8, 0x64A0}, //3572 #CJK UNIFIED IDEOGRAPH + {0x93D9, 0x64A1}, //3573 #CJK UNIFIED IDEOGRAPH + {0x93DA, 0x64A2}, //3574 #CJK UNIFIED IDEOGRAPH + {0x93DB, 0x64A3}, //3575 #CJK UNIFIED IDEOGRAPH + {0x93DC, 0x64A5}, //3576 #CJK UNIFIED IDEOGRAPH + {0x93DD, 0x64A6}, //3577 #CJK UNIFIED IDEOGRAPH + {0x93DE, 0x64A7}, //3578 #CJK UNIFIED IDEOGRAPH + {0x93DF, 0x64A8}, //3579 #CJK UNIFIED IDEOGRAPH + {0x93E0, 0x64AA}, //3580 #CJK UNIFIED IDEOGRAPH + {0x93E1, 0x64AB}, //3581 #CJK UNIFIED IDEOGRAPH + {0x93E2, 0x64AF}, //3582 #CJK UNIFIED IDEOGRAPH + {0x93E3, 0x64B1}, //3583 #CJK UNIFIED IDEOGRAPH + {0x93E4, 0x64B2}, //3584 #CJK UNIFIED IDEOGRAPH + {0x93E5, 0x64B3}, //3585 #CJK UNIFIED IDEOGRAPH + {0x93E6, 0x64B4}, //3586 #CJK UNIFIED IDEOGRAPH + {0x93E7, 0x64B6}, //3587 #CJK UNIFIED IDEOGRAPH + {0x93E8, 0x64B9}, //3588 #CJK UNIFIED IDEOGRAPH + {0x93E9, 0x64BB}, //3589 #CJK UNIFIED IDEOGRAPH + {0x93EA, 0x64BD}, //3590 #CJK UNIFIED IDEOGRAPH + {0x93EB, 0x64BE}, //3591 #CJK UNIFIED IDEOGRAPH + {0x93EC, 0x64BF}, //3592 #CJK UNIFIED IDEOGRAPH + {0x93ED, 0x64C1}, //3593 #CJK UNIFIED IDEOGRAPH + {0x93EE, 0x64C3}, //3594 #CJK UNIFIED IDEOGRAPH + {0x93EF, 0x64C4}, //3595 #CJK UNIFIED IDEOGRAPH + {0x93F0, 0x64C6}, //3596 #CJK UNIFIED IDEOGRAPH + {0x93F1, 0x64C7}, //3597 #CJK UNIFIED IDEOGRAPH + {0x93F2, 0x64C8}, //3598 #CJK UNIFIED IDEOGRAPH + {0x93F3, 0x64C9}, //3599 #CJK UNIFIED IDEOGRAPH + {0x93F4, 0x64CA}, //3600 #CJK UNIFIED IDEOGRAPH + {0x93F5, 0x64CB}, //3601 #CJK UNIFIED IDEOGRAPH + {0x93F6, 0x64CC}, //3602 #CJK UNIFIED IDEOGRAPH + {0x93F7, 0x64CF}, //3603 #CJK UNIFIED IDEOGRAPH + {0x93F8, 0x64D1}, //3604 #CJK UNIFIED IDEOGRAPH + {0x93F9, 0x64D3}, //3605 #CJK UNIFIED IDEOGRAPH + {0x93FA, 0x64D4}, //3606 #CJK UNIFIED IDEOGRAPH + {0x93FB, 0x64D5}, //3607 #CJK UNIFIED IDEOGRAPH + {0x93FC, 0x64D6}, //3608 #CJK UNIFIED IDEOGRAPH + {0x93FD, 0x64D9}, //3609 #CJK UNIFIED IDEOGRAPH + {0x93FE, 0x64DA}, //3610 #CJK UNIFIED IDEOGRAPH + {0x9440, 0x64DB}, //3611 #CJK UNIFIED IDEOGRAPH + {0x9441, 0x64DC}, //3612 #CJK UNIFIED IDEOGRAPH + {0x9442, 0x64DD}, //3613 #CJK UNIFIED IDEOGRAPH + {0x9443, 0x64DF}, //3614 #CJK UNIFIED IDEOGRAPH + {0x9444, 0x64E0}, //3615 #CJK UNIFIED IDEOGRAPH + {0x9445, 0x64E1}, //3616 #CJK UNIFIED IDEOGRAPH + {0x9446, 0x64E3}, //3617 #CJK UNIFIED IDEOGRAPH + {0x9447, 0x64E5}, //3618 #CJK UNIFIED IDEOGRAPH + {0x9448, 0x64E7}, //3619 #CJK UNIFIED IDEOGRAPH + {0x9449, 0x64E8}, //3620 #CJK UNIFIED IDEOGRAPH + {0x944A, 0x64E9}, //3621 #CJK UNIFIED IDEOGRAPH + {0x944B, 0x64EA}, //3622 #CJK UNIFIED IDEOGRAPH + {0x944C, 0x64EB}, //3623 #CJK UNIFIED IDEOGRAPH + {0x944D, 0x64EC}, //3624 #CJK UNIFIED IDEOGRAPH + {0x944E, 0x64ED}, //3625 #CJK UNIFIED IDEOGRAPH + {0x944F, 0x64EE}, //3626 #CJK UNIFIED IDEOGRAPH + {0x9450, 0x64EF}, //3627 #CJK UNIFIED IDEOGRAPH + {0x9451, 0x64F0}, //3628 #CJK UNIFIED IDEOGRAPH + {0x9452, 0x64F1}, //3629 #CJK UNIFIED IDEOGRAPH + {0x9453, 0x64F2}, //3630 #CJK UNIFIED IDEOGRAPH + {0x9454, 0x64F3}, //3631 #CJK UNIFIED IDEOGRAPH + {0x9455, 0x64F4}, //3632 #CJK UNIFIED IDEOGRAPH + {0x9456, 0x64F5}, //3633 #CJK UNIFIED IDEOGRAPH + {0x9457, 0x64F6}, //3634 #CJK UNIFIED IDEOGRAPH + {0x9458, 0x64F7}, //3635 #CJK UNIFIED IDEOGRAPH + {0x9459, 0x64F8}, //3636 #CJK UNIFIED IDEOGRAPH + {0x945A, 0x64F9}, //3637 #CJK UNIFIED IDEOGRAPH + {0x945B, 0x64FA}, //3638 #CJK UNIFIED IDEOGRAPH + {0x945C, 0x64FB}, //3639 #CJK UNIFIED IDEOGRAPH + {0x945D, 0x64FC}, //3640 #CJK UNIFIED IDEOGRAPH + {0x945E, 0x64FD}, //3641 #CJK UNIFIED IDEOGRAPH + {0x945F, 0x64FE}, //3642 #CJK UNIFIED IDEOGRAPH + {0x9460, 0x64FF}, //3643 #CJK UNIFIED IDEOGRAPH + {0x9461, 0x6501}, //3644 #CJK UNIFIED IDEOGRAPH + {0x9462, 0x6502}, //3645 #CJK UNIFIED IDEOGRAPH + {0x9463, 0x6503}, //3646 #CJK UNIFIED IDEOGRAPH + {0x9464, 0x6504}, //3647 #CJK UNIFIED IDEOGRAPH + {0x9465, 0x6505}, //3648 #CJK UNIFIED IDEOGRAPH + {0x9466, 0x6506}, //3649 #CJK UNIFIED IDEOGRAPH + {0x9467, 0x6507}, //3650 #CJK UNIFIED IDEOGRAPH + {0x9468, 0x6508}, //3651 #CJK UNIFIED IDEOGRAPH + {0x9469, 0x650A}, //3652 #CJK UNIFIED IDEOGRAPH + {0x946A, 0x650B}, //3653 #CJK UNIFIED IDEOGRAPH + {0x946B, 0x650C}, //3654 #CJK UNIFIED IDEOGRAPH + {0x946C, 0x650D}, //3655 #CJK UNIFIED IDEOGRAPH + {0x946D, 0x650E}, //3656 #CJK UNIFIED IDEOGRAPH + {0x946E, 0x650F}, //3657 #CJK UNIFIED IDEOGRAPH + {0x946F, 0x6510}, //3658 #CJK UNIFIED IDEOGRAPH + {0x9470, 0x6511}, //3659 #CJK UNIFIED IDEOGRAPH + {0x9471, 0x6513}, //3660 #CJK UNIFIED IDEOGRAPH + {0x9472, 0x6514}, //3661 #CJK UNIFIED IDEOGRAPH + {0x9473, 0x6515}, //3662 #CJK UNIFIED IDEOGRAPH + {0x9474, 0x6516}, //3663 #CJK UNIFIED IDEOGRAPH + {0x9475, 0x6517}, //3664 #CJK UNIFIED IDEOGRAPH + {0x9476, 0x6519}, //3665 #CJK UNIFIED IDEOGRAPH + {0x9477, 0x651A}, //3666 #CJK UNIFIED IDEOGRAPH + {0x9478, 0x651B}, //3667 #CJK UNIFIED IDEOGRAPH + {0x9479, 0x651C}, //3668 #CJK UNIFIED IDEOGRAPH + {0x947A, 0x651D}, //3669 #CJK UNIFIED IDEOGRAPH + {0x947B, 0x651E}, //3670 #CJK UNIFIED IDEOGRAPH + {0x947C, 0x651F}, //3671 #CJK UNIFIED IDEOGRAPH + {0x947D, 0x6520}, //3672 #CJK UNIFIED IDEOGRAPH + {0x947E, 0x6521}, //3673 #CJK UNIFIED IDEOGRAPH + {0x9480, 0x6522}, //3674 #CJK UNIFIED IDEOGRAPH + {0x9481, 0x6523}, //3675 #CJK UNIFIED IDEOGRAPH + {0x9482, 0x6524}, //3676 #CJK UNIFIED IDEOGRAPH + {0x9483, 0x6526}, //3677 #CJK UNIFIED IDEOGRAPH + {0x9484, 0x6527}, //3678 #CJK UNIFIED IDEOGRAPH + {0x9485, 0x6528}, //3679 #CJK UNIFIED IDEOGRAPH + {0x9486, 0x6529}, //3680 #CJK UNIFIED IDEOGRAPH + {0x9487, 0x652A}, //3681 #CJK UNIFIED IDEOGRAPH + {0x9488, 0x652C}, //3682 #CJK UNIFIED IDEOGRAPH + {0x9489, 0x652D}, //3683 #CJK UNIFIED IDEOGRAPH + {0x948A, 0x6530}, //3684 #CJK UNIFIED IDEOGRAPH + {0x948B, 0x6531}, //3685 #CJK UNIFIED IDEOGRAPH + {0x948C, 0x6532}, //3686 #CJK UNIFIED IDEOGRAPH + {0x948D, 0x6533}, //3687 #CJK UNIFIED IDEOGRAPH + {0x948E, 0x6537}, //3688 #CJK UNIFIED IDEOGRAPH + {0x948F, 0x653A}, //3689 #CJK UNIFIED IDEOGRAPH + {0x9490, 0x653C}, //3690 #CJK UNIFIED IDEOGRAPH + {0x9491, 0x653D}, //3691 #CJK UNIFIED IDEOGRAPH + {0x9492, 0x6540}, //3692 #CJK UNIFIED IDEOGRAPH + {0x9493, 0x6541}, //3693 #CJK UNIFIED IDEOGRAPH + {0x9494, 0x6542}, //3694 #CJK UNIFIED IDEOGRAPH + {0x9495, 0x6543}, //3695 #CJK UNIFIED IDEOGRAPH + {0x9496, 0x6544}, //3696 #CJK UNIFIED IDEOGRAPH + {0x9497, 0x6546}, //3697 #CJK UNIFIED IDEOGRAPH + {0x9498, 0x6547}, //3698 #CJK UNIFIED IDEOGRAPH + {0x9499, 0x654A}, //3699 #CJK UNIFIED IDEOGRAPH + {0x949A, 0x654B}, //3700 #CJK UNIFIED IDEOGRAPH + {0x949B, 0x654D}, //3701 #CJK UNIFIED IDEOGRAPH + {0x949C, 0x654E}, //3702 #CJK UNIFIED IDEOGRAPH + {0x949D, 0x6550}, //3703 #CJK UNIFIED IDEOGRAPH + {0x949E, 0x6552}, //3704 #CJK UNIFIED IDEOGRAPH + {0x949F, 0x6553}, //3705 #CJK UNIFIED IDEOGRAPH + {0x94A0, 0x6554}, //3706 #CJK UNIFIED IDEOGRAPH + {0x94A1, 0x6557}, //3707 #CJK UNIFIED IDEOGRAPH + {0x94A2, 0x6558}, //3708 #CJK UNIFIED IDEOGRAPH + {0x94A3, 0x655A}, //3709 #CJK UNIFIED IDEOGRAPH + {0x94A4, 0x655C}, //3710 #CJK UNIFIED IDEOGRAPH + {0x94A5, 0x655F}, //3711 #CJK UNIFIED IDEOGRAPH + {0x94A6, 0x6560}, //3712 #CJK UNIFIED IDEOGRAPH + {0x94A7, 0x6561}, //3713 #CJK UNIFIED IDEOGRAPH + {0x94A8, 0x6564}, //3714 #CJK UNIFIED IDEOGRAPH + {0x94A9, 0x6565}, //3715 #CJK UNIFIED IDEOGRAPH + {0x94AA, 0x6567}, //3716 #CJK UNIFIED IDEOGRAPH + {0x94AB, 0x6568}, //3717 #CJK UNIFIED IDEOGRAPH + {0x94AC, 0x6569}, //3718 #CJK UNIFIED IDEOGRAPH + {0x94AD, 0x656A}, //3719 #CJK UNIFIED IDEOGRAPH + {0x94AE, 0x656D}, //3720 #CJK UNIFIED IDEOGRAPH + {0x94AF, 0x656E}, //3721 #CJK UNIFIED IDEOGRAPH + {0x94B0, 0x656F}, //3722 #CJK UNIFIED IDEOGRAPH + {0x94B1, 0x6571}, //3723 #CJK UNIFIED IDEOGRAPH + {0x94B2, 0x6573}, //3724 #CJK UNIFIED IDEOGRAPH + {0x94B3, 0x6575}, //3725 #CJK UNIFIED IDEOGRAPH + {0x94B4, 0x6576}, //3726 #CJK UNIFIED IDEOGRAPH + {0x94B5, 0x6578}, //3727 #CJK UNIFIED IDEOGRAPH + {0x94B6, 0x6579}, //3728 #CJK UNIFIED IDEOGRAPH + {0x94B7, 0x657A}, //3729 #CJK UNIFIED IDEOGRAPH + {0x94B8, 0x657B}, //3730 #CJK UNIFIED IDEOGRAPH + {0x94B9, 0x657C}, //3731 #CJK UNIFIED IDEOGRAPH + {0x94BA, 0x657D}, //3732 #CJK UNIFIED IDEOGRAPH + {0x94BB, 0x657E}, //3733 #CJK UNIFIED IDEOGRAPH + {0x94BC, 0x657F}, //3734 #CJK UNIFIED IDEOGRAPH + {0x94BD, 0x6580}, //3735 #CJK UNIFIED IDEOGRAPH + {0x94BE, 0x6581}, //3736 #CJK UNIFIED IDEOGRAPH + {0x94BF, 0x6582}, //3737 #CJK UNIFIED IDEOGRAPH + {0x94C0, 0x6583}, //3738 #CJK UNIFIED IDEOGRAPH + {0x94C1, 0x6584}, //3739 #CJK UNIFIED IDEOGRAPH + {0x94C2, 0x6585}, //3740 #CJK UNIFIED IDEOGRAPH + {0x94C3, 0x6586}, //3741 #CJK UNIFIED IDEOGRAPH + {0x94C4, 0x6588}, //3742 #CJK UNIFIED IDEOGRAPH + {0x94C5, 0x6589}, //3743 #CJK UNIFIED IDEOGRAPH + {0x94C6, 0x658A}, //3744 #CJK UNIFIED IDEOGRAPH + {0x94C7, 0x658D}, //3745 #CJK UNIFIED IDEOGRAPH + {0x94C8, 0x658E}, //3746 #CJK UNIFIED IDEOGRAPH + {0x94C9, 0x658F}, //3747 #CJK UNIFIED IDEOGRAPH + {0x94CA, 0x6592}, //3748 #CJK UNIFIED IDEOGRAPH + {0x94CB, 0x6594}, //3749 #CJK UNIFIED IDEOGRAPH + {0x94CC, 0x6595}, //3750 #CJK UNIFIED IDEOGRAPH + {0x94CD, 0x6596}, //3751 #CJK UNIFIED IDEOGRAPH + {0x94CE, 0x6598}, //3752 #CJK UNIFIED IDEOGRAPH + {0x94CF, 0x659A}, //3753 #CJK UNIFIED IDEOGRAPH + {0x94D0, 0x659D}, //3754 #CJK UNIFIED IDEOGRAPH + {0x94D1, 0x659E}, //3755 #CJK UNIFIED IDEOGRAPH + {0x94D2, 0x65A0}, //3756 #CJK UNIFIED IDEOGRAPH + {0x94D3, 0x65A2}, //3757 #CJK UNIFIED IDEOGRAPH + {0x94D4, 0x65A3}, //3758 #CJK UNIFIED IDEOGRAPH + {0x94D5, 0x65A6}, //3759 #CJK UNIFIED IDEOGRAPH + {0x94D6, 0x65A8}, //3760 #CJK UNIFIED IDEOGRAPH + {0x94D7, 0x65AA}, //3761 #CJK UNIFIED IDEOGRAPH + {0x94D8, 0x65AC}, //3762 #CJK UNIFIED IDEOGRAPH + {0x94D9, 0x65AE}, //3763 #CJK UNIFIED IDEOGRAPH + {0x94DA, 0x65B1}, //3764 #CJK UNIFIED IDEOGRAPH + {0x94DB, 0x65B2}, //3765 #CJK UNIFIED IDEOGRAPH + {0x94DC, 0x65B3}, //3766 #CJK UNIFIED IDEOGRAPH + {0x94DD, 0x65B4}, //3767 #CJK UNIFIED IDEOGRAPH + {0x94DE, 0x65B5}, //3768 #CJK UNIFIED IDEOGRAPH + {0x94DF, 0x65B6}, //3769 #CJK UNIFIED IDEOGRAPH + {0x94E0, 0x65B7}, //3770 #CJK UNIFIED IDEOGRAPH + {0x94E1, 0x65B8}, //3771 #CJK UNIFIED IDEOGRAPH + {0x94E2, 0x65BA}, //3772 #CJK UNIFIED IDEOGRAPH + {0x94E3, 0x65BB}, //3773 #CJK UNIFIED IDEOGRAPH + {0x94E4, 0x65BE}, //3774 #CJK UNIFIED IDEOGRAPH + {0x94E5, 0x65BF}, //3775 #CJK UNIFIED IDEOGRAPH + {0x94E6, 0x65C0}, //3776 #CJK UNIFIED IDEOGRAPH + {0x94E7, 0x65C2}, //3777 #CJK UNIFIED IDEOGRAPH + {0x94E8, 0x65C7}, //3778 #CJK UNIFIED IDEOGRAPH + {0x94E9, 0x65C8}, //3779 #CJK UNIFIED IDEOGRAPH + {0x94EA, 0x65C9}, //3780 #CJK UNIFIED IDEOGRAPH + {0x94EB, 0x65CA}, //3781 #CJK UNIFIED IDEOGRAPH + {0x94EC, 0x65CD}, //3782 #CJK UNIFIED IDEOGRAPH + {0x94ED, 0x65D0}, //3783 #CJK UNIFIED IDEOGRAPH + {0x94EE, 0x65D1}, //3784 #CJK UNIFIED IDEOGRAPH + {0x94EF, 0x65D3}, //3785 #CJK UNIFIED IDEOGRAPH + {0x94F0, 0x65D4}, //3786 #CJK UNIFIED IDEOGRAPH + {0x94F1, 0x65D5}, //3787 #CJK UNIFIED IDEOGRAPH + {0x94F2, 0x65D8}, //3788 #CJK UNIFIED IDEOGRAPH + {0x94F3, 0x65D9}, //3789 #CJK UNIFIED IDEOGRAPH + {0x94F4, 0x65DA}, //3790 #CJK UNIFIED IDEOGRAPH + {0x94F5, 0x65DB}, //3791 #CJK UNIFIED IDEOGRAPH + {0x94F6, 0x65DC}, //3792 #CJK UNIFIED IDEOGRAPH + {0x94F7, 0x65DD}, //3793 #CJK UNIFIED IDEOGRAPH + {0x94F8, 0x65DE}, //3794 #CJK UNIFIED IDEOGRAPH + {0x94F9, 0x65DF}, //3795 #CJK UNIFIED IDEOGRAPH + {0x94FA, 0x65E1}, //3796 #CJK UNIFIED IDEOGRAPH + {0x94FB, 0x65E3}, //3797 #CJK UNIFIED IDEOGRAPH + {0x94FC, 0x65E4}, //3798 #CJK UNIFIED IDEOGRAPH + {0x94FD, 0x65EA}, //3799 #CJK UNIFIED IDEOGRAPH + {0x94FE, 0x65EB}, //3800 #CJK UNIFIED IDEOGRAPH + {0x9540, 0x65F2}, //3801 #CJK UNIFIED IDEOGRAPH + {0x9541, 0x65F3}, //3802 #CJK UNIFIED IDEOGRAPH + {0x9542, 0x65F4}, //3803 #CJK UNIFIED IDEOGRAPH + {0x9543, 0x65F5}, //3804 #CJK UNIFIED IDEOGRAPH + {0x9544, 0x65F8}, //3805 #CJK UNIFIED IDEOGRAPH + {0x9545, 0x65F9}, //3806 #CJK UNIFIED IDEOGRAPH + {0x9546, 0x65FB}, //3807 #CJK UNIFIED IDEOGRAPH + {0x9547, 0x65FC}, //3808 #CJK UNIFIED IDEOGRAPH + {0x9548, 0x65FD}, //3809 #CJK UNIFIED IDEOGRAPH + {0x9549, 0x65FE}, //3810 #CJK UNIFIED IDEOGRAPH + {0x954A, 0x65FF}, //3811 #CJK UNIFIED IDEOGRAPH + {0x954B, 0x6601}, //3812 #CJK UNIFIED IDEOGRAPH + {0x954C, 0x6604}, //3813 #CJK UNIFIED IDEOGRAPH + {0x954D, 0x6605}, //3814 #CJK UNIFIED IDEOGRAPH + {0x954E, 0x6607}, //3815 #CJK UNIFIED IDEOGRAPH + {0x954F, 0x6608}, //3816 #CJK UNIFIED IDEOGRAPH + {0x9550, 0x6609}, //3817 #CJK UNIFIED IDEOGRAPH + {0x9551, 0x660B}, //3818 #CJK UNIFIED IDEOGRAPH + {0x9552, 0x660D}, //3819 #CJK UNIFIED IDEOGRAPH + {0x9553, 0x6610}, //3820 #CJK UNIFIED IDEOGRAPH + {0x9554, 0x6611}, //3821 #CJK UNIFIED IDEOGRAPH + {0x9555, 0x6612}, //3822 #CJK UNIFIED IDEOGRAPH + {0x9556, 0x6616}, //3823 #CJK UNIFIED IDEOGRAPH + {0x9557, 0x6617}, //3824 #CJK UNIFIED IDEOGRAPH + {0x9558, 0x6618}, //3825 #CJK UNIFIED IDEOGRAPH + {0x9559, 0x661A}, //3826 #CJK UNIFIED IDEOGRAPH + {0x955A, 0x661B}, //3827 #CJK UNIFIED IDEOGRAPH + {0x955B, 0x661C}, //3828 #CJK UNIFIED IDEOGRAPH + {0x955C, 0x661E}, //3829 #CJK UNIFIED IDEOGRAPH + {0x955D, 0x6621}, //3830 #CJK UNIFIED IDEOGRAPH + {0x955E, 0x6622}, //3831 #CJK UNIFIED IDEOGRAPH + {0x955F, 0x6623}, //3832 #CJK UNIFIED IDEOGRAPH + {0x9560, 0x6624}, //3833 #CJK UNIFIED IDEOGRAPH + {0x9561, 0x6626}, //3834 #CJK UNIFIED IDEOGRAPH + {0x9562, 0x6629}, //3835 #CJK UNIFIED IDEOGRAPH + {0x9563, 0x662A}, //3836 #CJK UNIFIED IDEOGRAPH + {0x9564, 0x662B}, //3837 #CJK UNIFIED IDEOGRAPH + {0x9565, 0x662C}, //3838 #CJK UNIFIED IDEOGRAPH + {0x9566, 0x662E}, //3839 #CJK UNIFIED IDEOGRAPH + {0x9567, 0x6630}, //3840 #CJK UNIFIED IDEOGRAPH + {0x9568, 0x6632}, //3841 #CJK UNIFIED IDEOGRAPH + {0x9569, 0x6633}, //3842 #CJK UNIFIED IDEOGRAPH + {0x956A, 0x6637}, //3843 #CJK UNIFIED IDEOGRAPH + {0x956B, 0x6638}, //3844 #CJK UNIFIED IDEOGRAPH + {0x956C, 0x6639}, //3845 #CJK UNIFIED IDEOGRAPH + {0x956D, 0x663A}, //3846 #CJK UNIFIED IDEOGRAPH + {0x956E, 0x663B}, //3847 #CJK UNIFIED IDEOGRAPH + {0x956F, 0x663D}, //3848 #CJK UNIFIED IDEOGRAPH + {0x9570, 0x663F}, //3849 #CJK UNIFIED IDEOGRAPH + {0x9571, 0x6640}, //3850 #CJK UNIFIED IDEOGRAPH + {0x9572, 0x6642}, //3851 #CJK UNIFIED IDEOGRAPH + {0x9573, 0x6644}, //3852 #CJK UNIFIED IDEOGRAPH + {0x9574, 0x6645}, //3853 #CJK UNIFIED IDEOGRAPH + {0x9575, 0x6646}, //3854 #CJK UNIFIED IDEOGRAPH + {0x9576, 0x6647}, //3855 #CJK UNIFIED IDEOGRAPH + {0x9577, 0x6648}, //3856 #CJK UNIFIED IDEOGRAPH + {0x9578, 0x6649}, //3857 #CJK UNIFIED IDEOGRAPH + {0x9579, 0x664A}, //3858 #CJK UNIFIED IDEOGRAPH + {0x957A, 0x664D}, //3859 #CJK UNIFIED IDEOGRAPH + {0x957B, 0x664E}, //3860 #CJK UNIFIED IDEOGRAPH + {0x957C, 0x6650}, //3861 #CJK UNIFIED IDEOGRAPH + {0x957D, 0x6651}, //3862 #CJK UNIFIED IDEOGRAPH + {0x957E, 0x6658}, //3863 #CJK UNIFIED IDEOGRAPH + {0x9580, 0x6659}, //3864 #CJK UNIFIED IDEOGRAPH + {0x9581, 0x665B}, //3865 #CJK UNIFIED IDEOGRAPH + {0x9582, 0x665C}, //3866 #CJK UNIFIED IDEOGRAPH + {0x9583, 0x665D}, //3867 #CJK UNIFIED IDEOGRAPH + {0x9584, 0x665E}, //3868 #CJK UNIFIED IDEOGRAPH + {0x9585, 0x6660}, //3869 #CJK UNIFIED IDEOGRAPH + {0x9586, 0x6662}, //3870 #CJK UNIFIED IDEOGRAPH + {0x9587, 0x6663}, //3871 #CJK UNIFIED IDEOGRAPH + {0x9588, 0x6665}, //3872 #CJK UNIFIED IDEOGRAPH + {0x9589, 0x6667}, //3873 #CJK UNIFIED IDEOGRAPH + {0x958A, 0x6669}, //3874 #CJK UNIFIED IDEOGRAPH + {0x958B, 0x666A}, //3875 #CJK UNIFIED IDEOGRAPH + {0x958C, 0x666B}, //3876 #CJK UNIFIED IDEOGRAPH + {0x958D, 0x666C}, //3877 #CJK UNIFIED IDEOGRAPH + {0x958E, 0x666D}, //3878 #CJK UNIFIED IDEOGRAPH + {0x958F, 0x6671}, //3879 #CJK UNIFIED IDEOGRAPH + {0x9590, 0x6672}, //3880 #CJK UNIFIED IDEOGRAPH + {0x9591, 0x6673}, //3881 #CJK UNIFIED IDEOGRAPH + {0x9592, 0x6675}, //3882 #CJK UNIFIED IDEOGRAPH + {0x9593, 0x6678}, //3883 #CJK UNIFIED IDEOGRAPH + {0x9594, 0x6679}, //3884 #CJK UNIFIED IDEOGRAPH + {0x9595, 0x667B}, //3885 #CJK UNIFIED IDEOGRAPH + {0x9596, 0x667C}, //3886 #CJK UNIFIED IDEOGRAPH + {0x9597, 0x667D}, //3887 #CJK UNIFIED IDEOGRAPH + {0x9598, 0x667F}, //3888 #CJK UNIFIED IDEOGRAPH + {0x9599, 0x6680}, //3889 #CJK UNIFIED IDEOGRAPH + {0x959A, 0x6681}, //3890 #CJK UNIFIED IDEOGRAPH + {0x959B, 0x6683}, //3891 #CJK UNIFIED IDEOGRAPH + {0x959C, 0x6685}, //3892 #CJK UNIFIED IDEOGRAPH + {0x959D, 0x6686}, //3893 #CJK UNIFIED IDEOGRAPH + {0x959E, 0x6688}, //3894 #CJK UNIFIED IDEOGRAPH + {0x959F, 0x6689}, //3895 #CJK UNIFIED IDEOGRAPH + {0x95A0, 0x668A}, //3896 #CJK UNIFIED IDEOGRAPH + {0x95A1, 0x668B}, //3897 #CJK UNIFIED IDEOGRAPH + {0x95A2, 0x668D}, //3898 #CJK UNIFIED IDEOGRAPH + {0x95A3, 0x668E}, //3899 #CJK UNIFIED IDEOGRAPH + {0x95A4, 0x668F}, //3900 #CJK UNIFIED IDEOGRAPH + {0x95A5, 0x6690}, //3901 #CJK UNIFIED IDEOGRAPH + {0x95A6, 0x6692}, //3902 #CJK UNIFIED IDEOGRAPH + {0x95A7, 0x6693}, //3903 #CJK UNIFIED IDEOGRAPH + {0x95A8, 0x6694}, //3904 #CJK UNIFIED IDEOGRAPH + {0x95A9, 0x6695}, //3905 #CJK UNIFIED IDEOGRAPH + {0x95AA, 0x6698}, //3906 #CJK UNIFIED IDEOGRAPH + {0x95AB, 0x6699}, //3907 #CJK UNIFIED IDEOGRAPH + {0x95AC, 0x669A}, //3908 #CJK UNIFIED IDEOGRAPH + {0x95AD, 0x669B}, //3909 #CJK UNIFIED IDEOGRAPH + {0x95AE, 0x669C}, //3910 #CJK UNIFIED IDEOGRAPH + {0x95AF, 0x669E}, //3911 #CJK UNIFIED IDEOGRAPH + {0x95B0, 0x669F}, //3912 #CJK UNIFIED IDEOGRAPH + {0x95B1, 0x66A0}, //3913 #CJK UNIFIED IDEOGRAPH + {0x95B2, 0x66A1}, //3914 #CJK UNIFIED IDEOGRAPH + {0x95B3, 0x66A2}, //3915 #CJK UNIFIED IDEOGRAPH + {0x95B4, 0x66A3}, //3916 #CJK UNIFIED IDEOGRAPH + {0x95B5, 0x66A4}, //3917 #CJK UNIFIED IDEOGRAPH + {0x95B6, 0x66A5}, //3918 #CJK UNIFIED IDEOGRAPH + {0x95B7, 0x66A6}, //3919 #CJK UNIFIED IDEOGRAPH + {0x95B8, 0x66A9}, //3920 #CJK UNIFIED IDEOGRAPH + {0x95B9, 0x66AA}, //3921 #CJK UNIFIED IDEOGRAPH + {0x95BA, 0x66AB}, //3922 #CJK UNIFIED IDEOGRAPH + {0x95BB, 0x66AC}, //3923 #CJK UNIFIED IDEOGRAPH + {0x95BC, 0x66AD}, //3924 #CJK UNIFIED IDEOGRAPH + {0x95BD, 0x66AF}, //3925 #CJK UNIFIED IDEOGRAPH + {0x95BE, 0x66B0}, //3926 #CJK UNIFIED IDEOGRAPH + {0x95BF, 0x66B1}, //3927 #CJK UNIFIED IDEOGRAPH + {0x95C0, 0x66B2}, //3928 #CJK UNIFIED IDEOGRAPH + {0x95C1, 0x66B3}, //3929 #CJK UNIFIED IDEOGRAPH + {0x95C2, 0x66B5}, //3930 #CJK UNIFIED IDEOGRAPH + {0x95C3, 0x66B6}, //3931 #CJK UNIFIED IDEOGRAPH + {0x95C4, 0x66B7}, //3932 #CJK UNIFIED IDEOGRAPH + {0x95C5, 0x66B8}, //3933 #CJK UNIFIED IDEOGRAPH + {0x95C6, 0x66BA}, //3934 #CJK UNIFIED IDEOGRAPH + {0x95C7, 0x66BB}, //3935 #CJK UNIFIED IDEOGRAPH + {0x95C8, 0x66BC}, //3936 #CJK UNIFIED IDEOGRAPH + {0x95C9, 0x66BD}, //3937 #CJK UNIFIED IDEOGRAPH + {0x95CA, 0x66BF}, //3938 #CJK UNIFIED IDEOGRAPH + {0x95CB, 0x66C0}, //3939 #CJK UNIFIED IDEOGRAPH + {0x95CC, 0x66C1}, //3940 #CJK UNIFIED IDEOGRAPH + {0x95CD, 0x66C2}, //3941 #CJK UNIFIED IDEOGRAPH + {0x95CE, 0x66C3}, //3942 #CJK UNIFIED IDEOGRAPH + {0x95CF, 0x66C4}, //3943 #CJK UNIFIED IDEOGRAPH + {0x95D0, 0x66C5}, //3944 #CJK UNIFIED IDEOGRAPH + {0x95D1, 0x66C6}, //3945 #CJK UNIFIED IDEOGRAPH + {0x95D2, 0x66C7}, //3946 #CJK UNIFIED IDEOGRAPH + {0x95D3, 0x66C8}, //3947 #CJK UNIFIED IDEOGRAPH + {0x95D4, 0x66C9}, //3948 #CJK UNIFIED IDEOGRAPH + {0x95D5, 0x66CA}, //3949 #CJK UNIFIED IDEOGRAPH + {0x95D6, 0x66CB}, //3950 #CJK UNIFIED IDEOGRAPH + {0x95D7, 0x66CC}, //3951 #CJK UNIFIED IDEOGRAPH + {0x95D8, 0x66CD}, //3952 #CJK UNIFIED IDEOGRAPH + {0x95D9, 0x66CE}, //3953 #CJK UNIFIED IDEOGRAPH + {0x95DA, 0x66CF}, //3954 #CJK UNIFIED IDEOGRAPH + {0x95DB, 0x66D0}, //3955 #CJK UNIFIED IDEOGRAPH + {0x95DC, 0x66D1}, //3956 #CJK UNIFIED IDEOGRAPH + {0x95DD, 0x66D2}, //3957 #CJK UNIFIED IDEOGRAPH + {0x95DE, 0x66D3}, //3958 #CJK UNIFIED IDEOGRAPH + {0x95DF, 0x66D4}, //3959 #CJK UNIFIED IDEOGRAPH + {0x95E0, 0x66D5}, //3960 #CJK UNIFIED IDEOGRAPH + {0x95E1, 0x66D6}, //3961 #CJK UNIFIED IDEOGRAPH + {0x95E2, 0x66D7}, //3962 #CJK UNIFIED IDEOGRAPH + {0x95E3, 0x66D8}, //3963 #CJK UNIFIED IDEOGRAPH + {0x95E4, 0x66DA}, //3964 #CJK UNIFIED IDEOGRAPH + {0x95E5, 0x66DE}, //3965 #CJK UNIFIED IDEOGRAPH + {0x95E6, 0x66DF}, //3966 #CJK UNIFIED IDEOGRAPH + {0x95E7, 0x66E0}, //3967 #CJK UNIFIED IDEOGRAPH + {0x95E8, 0x66E1}, //3968 #CJK UNIFIED IDEOGRAPH + {0x95E9, 0x66E2}, //3969 #CJK UNIFIED IDEOGRAPH + {0x95EA, 0x66E3}, //3970 #CJK UNIFIED IDEOGRAPH + {0x95EB, 0x66E4}, //3971 #CJK UNIFIED IDEOGRAPH + {0x95EC, 0x66E5}, //3972 #CJK UNIFIED IDEOGRAPH + {0x95ED, 0x66E7}, //3973 #CJK UNIFIED IDEOGRAPH + {0x95EE, 0x66E8}, //3974 #CJK UNIFIED IDEOGRAPH + {0x95EF, 0x66EA}, //3975 #CJK UNIFIED IDEOGRAPH + {0x95F0, 0x66EB}, //3976 #CJK UNIFIED IDEOGRAPH + {0x95F1, 0x66EC}, //3977 #CJK UNIFIED IDEOGRAPH + {0x95F2, 0x66ED}, //3978 #CJK UNIFIED IDEOGRAPH + {0x95F3, 0x66EE}, //3979 #CJK UNIFIED IDEOGRAPH + {0x95F4, 0x66EF}, //3980 #CJK UNIFIED IDEOGRAPH + {0x95F5, 0x66F1}, //3981 #CJK UNIFIED IDEOGRAPH + {0x95F6, 0x66F5}, //3982 #CJK UNIFIED IDEOGRAPH + {0x95F7, 0x66F6}, //3983 #CJK UNIFIED IDEOGRAPH + {0x95F8, 0x66F8}, //3984 #CJK UNIFIED IDEOGRAPH + {0x95F9, 0x66FA}, //3985 #CJK UNIFIED IDEOGRAPH + {0x95FA, 0x66FB}, //3986 #CJK UNIFIED IDEOGRAPH + {0x95FB, 0x66FD}, //3987 #CJK UNIFIED IDEOGRAPH + {0x95FC, 0x6701}, //3988 #CJK UNIFIED IDEOGRAPH + {0x95FD, 0x6702}, //3989 #CJK UNIFIED IDEOGRAPH + {0x95FE, 0x6703}, //3990 #CJK UNIFIED IDEOGRAPH + {0x9640, 0x6704}, //3991 #CJK UNIFIED IDEOGRAPH + {0x9641, 0x6705}, //3992 #CJK UNIFIED IDEOGRAPH + {0x9642, 0x6706}, //3993 #CJK UNIFIED IDEOGRAPH + {0x9643, 0x6707}, //3994 #CJK UNIFIED IDEOGRAPH + {0x9644, 0x670C}, //3995 #CJK UNIFIED IDEOGRAPH + {0x9645, 0x670E}, //3996 #CJK UNIFIED IDEOGRAPH + {0x9646, 0x670F}, //3997 #CJK UNIFIED IDEOGRAPH + {0x9647, 0x6711}, //3998 #CJK UNIFIED IDEOGRAPH + {0x9648, 0x6712}, //3999 #CJK UNIFIED IDEOGRAPH + {0x9649, 0x6713}, //4000 #CJK UNIFIED IDEOGRAPH + {0x964A, 0x6716}, //4001 #CJK UNIFIED IDEOGRAPH + {0x964B, 0x6718}, //4002 #CJK UNIFIED IDEOGRAPH + {0x964C, 0x6719}, //4003 #CJK UNIFIED IDEOGRAPH + {0x964D, 0x671A}, //4004 #CJK UNIFIED IDEOGRAPH + {0x964E, 0x671C}, //4005 #CJK UNIFIED IDEOGRAPH + {0x964F, 0x671E}, //4006 #CJK UNIFIED IDEOGRAPH + {0x9650, 0x6720}, //4007 #CJK UNIFIED IDEOGRAPH + {0x9651, 0x6721}, //4008 #CJK UNIFIED IDEOGRAPH + {0x9652, 0x6722}, //4009 #CJK UNIFIED IDEOGRAPH + {0x9653, 0x6723}, //4010 #CJK UNIFIED IDEOGRAPH + {0x9654, 0x6724}, //4011 #CJK UNIFIED IDEOGRAPH + {0x9655, 0x6725}, //4012 #CJK UNIFIED IDEOGRAPH + {0x9656, 0x6727}, //4013 #CJK UNIFIED IDEOGRAPH + {0x9657, 0x6729}, //4014 #CJK UNIFIED IDEOGRAPH + {0x9658, 0x672E}, //4015 #CJK UNIFIED IDEOGRAPH + {0x9659, 0x6730}, //4016 #CJK UNIFIED IDEOGRAPH + {0x965A, 0x6732}, //4017 #CJK UNIFIED IDEOGRAPH + {0x965B, 0x6733}, //4018 #CJK UNIFIED IDEOGRAPH + {0x965C, 0x6736}, //4019 #CJK UNIFIED IDEOGRAPH + {0x965D, 0x6737}, //4020 #CJK UNIFIED IDEOGRAPH + {0x965E, 0x6738}, //4021 #CJK UNIFIED IDEOGRAPH + {0x965F, 0x6739}, //4022 #CJK UNIFIED IDEOGRAPH + {0x9660, 0x673B}, //4023 #CJK UNIFIED IDEOGRAPH + {0x9661, 0x673C}, //4024 #CJK UNIFIED IDEOGRAPH + {0x9662, 0x673E}, //4025 #CJK UNIFIED IDEOGRAPH + {0x9663, 0x673F}, //4026 #CJK UNIFIED IDEOGRAPH + {0x9664, 0x6741}, //4027 #CJK UNIFIED IDEOGRAPH + {0x9665, 0x6744}, //4028 #CJK UNIFIED IDEOGRAPH + {0x9666, 0x6745}, //4029 #CJK UNIFIED IDEOGRAPH + {0x9667, 0x6747}, //4030 #CJK UNIFIED IDEOGRAPH + {0x9668, 0x674A}, //4031 #CJK UNIFIED IDEOGRAPH + {0x9669, 0x674B}, //4032 #CJK UNIFIED IDEOGRAPH + {0x966A, 0x674D}, //4033 #CJK UNIFIED IDEOGRAPH + {0x966B, 0x6752}, //4034 #CJK UNIFIED IDEOGRAPH + {0x966C, 0x6754}, //4035 #CJK UNIFIED IDEOGRAPH + {0x966D, 0x6755}, //4036 #CJK UNIFIED IDEOGRAPH + {0x966E, 0x6757}, //4037 #CJK UNIFIED IDEOGRAPH + {0x966F, 0x6758}, //4038 #CJK UNIFIED IDEOGRAPH + {0x9670, 0x6759}, //4039 #CJK UNIFIED IDEOGRAPH + {0x9671, 0x675A}, //4040 #CJK UNIFIED IDEOGRAPH + {0x9672, 0x675B}, //4041 #CJK UNIFIED IDEOGRAPH + {0x9673, 0x675D}, //4042 #CJK UNIFIED IDEOGRAPH + {0x9674, 0x6762}, //4043 #CJK UNIFIED IDEOGRAPH + {0x9675, 0x6763}, //4044 #CJK UNIFIED IDEOGRAPH + {0x9676, 0x6764}, //4045 #CJK UNIFIED IDEOGRAPH + {0x9677, 0x6766}, //4046 #CJK UNIFIED IDEOGRAPH + {0x9678, 0x6767}, //4047 #CJK UNIFIED IDEOGRAPH + {0x9679, 0x676B}, //4048 #CJK UNIFIED IDEOGRAPH + {0x967A, 0x676C}, //4049 #CJK UNIFIED IDEOGRAPH + {0x967B, 0x676E}, //4050 #CJK UNIFIED IDEOGRAPH + {0x967C, 0x6771}, //4051 #CJK UNIFIED IDEOGRAPH + {0x967D, 0x6774}, //4052 #CJK UNIFIED IDEOGRAPH + {0x967E, 0x6776}, //4053 #CJK UNIFIED IDEOGRAPH + {0x9680, 0x6778}, //4054 #CJK UNIFIED IDEOGRAPH + {0x9681, 0x6779}, //4055 #CJK UNIFIED IDEOGRAPH + {0x9682, 0x677A}, //4056 #CJK UNIFIED IDEOGRAPH + {0x9683, 0x677B}, //4057 #CJK UNIFIED IDEOGRAPH + {0x9684, 0x677D}, //4058 #CJK UNIFIED IDEOGRAPH + {0x9685, 0x6780}, //4059 #CJK UNIFIED IDEOGRAPH + {0x9686, 0x6782}, //4060 #CJK UNIFIED IDEOGRAPH + {0x9687, 0x6783}, //4061 #CJK UNIFIED IDEOGRAPH + {0x9688, 0x6785}, //4062 #CJK UNIFIED IDEOGRAPH + {0x9689, 0x6786}, //4063 #CJK UNIFIED IDEOGRAPH + {0x968A, 0x6788}, //4064 #CJK UNIFIED IDEOGRAPH + {0x968B, 0x678A}, //4065 #CJK UNIFIED IDEOGRAPH + {0x968C, 0x678C}, //4066 #CJK UNIFIED IDEOGRAPH + {0x968D, 0x678D}, //4067 #CJK UNIFIED IDEOGRAPH + {0x968E, 0x678E}, //4068 #CJK UNIFIED IDEOGRAPH + {0x968F, 0x678F}, //4069 #CJK UNIFIED IDEOGRAPH + {0x9690, 0x6791}, //4070 #CJK UNIFIED IDEOGRAPH + {0x9691, 0x6792}, //4071 #CJK UNIFIED IDEOGRAPH + {0x9692, 0x6793}, //4072 #CJK UNIFIED IDEOGRAPH + {0x9693, 0x6794}, //4073 #CJK UNIFIED IDEOGRAPH + {0x9694, 0x6796}, //4074 #CJK UNIFIED IDEOGRAPH + {0x9695, 0x6799}, //4075 #CJK UNIFIED IDEOGRAPH + {0x9696, 0x679B}, //4076 #CJK UNIFIED IDEOGRAPH + {0x9697, 0x679F}, //4077 #CJK UNIFIED IDEOGRAPH + {0x9698, 0x67A0}, //4078 #CJK UNIFIED IDEOGRAPH + {0x9699, 0x67A1}, //4079 #CJK UNIFIED IDEOGRAPH + {0x969A, 0x67A4}, //4080 #CJK UNIFIED IDEOGRAPH + {0x969B, 0x67A6}, //4081 #CJK UNIFIED IDEOGRAPH + {0x969C, 0x67A9}, //4082 #CJK UNIFIED IDEOGRAPH + {0x969D, 0x67AC}, //4083 #CJK UNIFIED IDEOGRAPH + {0x969E, 0x67AE}, //4084 #CJK UNIFIED IDEOGRAPH + {0x969F, 0x67B1}, //4085 #CJK UNIFIED IDEOGRAPH + {0x96A0, 0x67B2}, //4086 #CJK UNIFIED IDEOGRAPH + {0x96A1, 0x67B4}, //4087 #CJK UNIFIED IDEOGRAPH + {0x96A2, 0x67B9}, //4088 #CJK UNIFIED IDEOGRAPH + {0x96A3, 0x67BA}, //4089 #CJK UNIFIED IDEOGRAPH + {0x96A4, 0x67BB}, //4090 #CJK UNIFIED IDEOGRAPH + {0x96A5, 0x67BC}, //4091 #CJK UNIFIED IDEOGRAPH + {0x96A6, 0x67BD}, //4092 #CJK UNIFIED IDEOGRAPH + {0x96A7, 0x67BE}, //4093 #CJK UNIFIED IDEOGRAPH + {0x96A8, 0x67BF}, //4094 #CJK UNIFIED IDEOGRAPH + {0x96A9, 0x67C0}, //4095 #CJK UNIFIED IDEOGRAPH + {0x96AA, 0x67C2}, //4096 #CJK UNIFIED IDEOGRAPH + {0x96AB, 0x67C5}, //4097 #CJK UNIFIED IDEOGRAPH + {0x96AC, 0x67C6}, //4098 #CJK UNIFIED IDEOGRAPH + {0x96AD, 0x67C7}, //4099 #CJK UNIFIED IDEOGRAPH + {0x96AE, 0x67C8}, //4100 #CJK UNIFIED IDEOGRAPH + {0x96AF, 0x67C9}, //4101 #CJK UNIFIED IDEOGRAPH + {0x96B0, 0x67CA}, //4102 #CJK UNIFIED IDEOGRAPH + {0x96B1, 0x67CB}, //4103 #CJK UNIFIED IDEOGRAPH + {0x96B2, 0x67CC}, //4104 #CJK UNIFIED IDEOGRAPH + {0x96B3, 0x67CD}, //4105 #CJK UNIFIED IDEOGRAPH + {0x96B4, 0x67CE}, //4106 #CJK UNIFIED IDEOGRAPH + {0x96B5, 0x67D5}, //4107 #CJK UNIFIED IDEOGRAPH + {0x96B6, 0x67D6}, //4108 #CJK UNIFIED IDEOGRAPH + {0x96B7, 0x67D7}, //4109 #CJK UNIFIED IDEOGRAPH + {0x96B8, 0x67DB}, //4110 #CJK UNIFIED IDEOGRAPH + {0x96B9, 0x67DF}, //4111 #CJK UNIFIED IDEOGRAPH + {0x96BA, 0x67E1}, //4112 #CJK UNIFIED IDEOGRAPH + {0x96BB, 0x67E3}, //4113 #CJK UNIFIED IDEOGRAPH + {0x96BC, 0x67E4}, //4114 #CJK UNIFIED IDEOGRAPH + {0x96BD, 0x67E6}, //4115 #CJK UNIFIED IDEOGRAPH + {0x96BE, 0x67E7}, //4116 #CJK UNIFIED IDEOGRAPH + {0x96BF, 0x67E8}, //4117 #CJK UNIFIED IDEOGRAPH + {0x96C0, 0x67EA}, //4118 #CJK UNIFIED IDEOGRAPH + {0x96C1, 0x67EB}, //4119 #CJK UNIFIED IDEOGRAPH + {0x96C2, 0x67ED}, //4120 #CJK UNIFIED IDEOGRAPH + {0x96C3, 0x67EE}, //4121 #CJK UNIFIED IDEOGRAPH + {0x96C4, 0x67F2}, //4122 #CJK UNIFIED IDEOGRAPH + {0x96C5, 0x67F5}, //4123 #CJK UNIFIED IDEOGRAPH + {0x96C6, 0x67F6}, //4124 #CJK UNIFIED IDEOGRAPH + {0x96C7, 0x67F7}, //4125 #CJK UNIFIED IDEOGRAPH + {0x96C8, 0x67F8}, //4126 #CJK UNIFIED IDEOGRAPH + {0x96C9, 0x67F9}, //4127 #CJK UNIFIED IDEOGRAPH + {0x96CA, 0x67FA}, //4128 #CJK UNIFIED IDEOGRAPH + {0x96CB, 0x67FB}, //4129 #CJK UNIFIED IDEOGRAPH + {0x96CC, 0x67FC}, //4130 #CJK UNIFIED IDEOGRAPH + {0x96CD, 0x67FE}, //4131 #CJK UNIFIED IDEOGRAPH + {0x96CE, 0x6801}, //4132 #CJK UNIFIED IDEOGRAPH + {0x96CF, 0x6802}, //4133 #CJK UNIFIED IDEOGRAPH + {0x96D0, 0x6803}, //4134 #CJK UNIFIED IDEOGRAPH + {0x96D1, 0x6804}, //4135 #CJK UNIFIED IDEOGRAPH + {0x96D2, 0x6806}, //4136 #CJK UNIFIED IDEOGRAPH + {0x96D3, 0x680D}, //4137 #CJK UNIFIED IDEOGRAPH + {0x96D4, 0x6810}, //4138 #CJK UNIFIED IDEOGRAPH + {0x96D5, 0x6812}, //4139 #CJK UNIFIED IDEOGRAPH + {0x96D6, 0x6814}, //4140 #CJK UNIFIED IDEOGRAPH + {0x96D7, 0x6815}, //4141 #CJK UNIFIED IDEOGRAPH + {0x96D8, 0x6818}, //4142 #CJK UNIFIED IDEOGRAPH + {0x96D9, 0x6819}, //4143 #CJK UNIFIED IDEOGRAPH + {0x96DA, 0x681A}, //4144 #CJK UNIFIED IDEOGRAPH + {0x96DB, 0x681B}, //4145 #CJK UNIFIED IDEOGRAPH + {0x96DC, 0x681C}, //4146 #CJK UNIFIED IDEOGRAPH + {0x96DD, 0x681E}, //4147 #CJK UNIFIED IDEOGRAPH + {0x96DE, 0x681F}, //4148 #CJK UNIFIED IDEOGRAPH + {0x96DF, 0x6820}, //4149 #CJK UNIFIED IDEOGRAPH + {0x96E0, 0x6822}, //4150 #CJK UNIFIED IDEOGRAPH + {0x96E1, 0x6823}, //4151 #CJK UNIFIED IDEOGRAPH + {0x96E2, 0x6824}, //4152 #CJK UNIFIED IDEOGRAPH + {0x96E3, 0x6825}, //4153 #CJK UNIFIED IDEOGRAPH + {0x96E4, 0x6826}, //4154 #CJK UNIFIED IDEOGRAPH + {0x96E5, 0x6827}, //4155 #CJK UNIFIED IDEOGRAPH + {0x96E6, 0x6828}, //4156 #CJK UNIFIED IDEOGRAPH + {0x96E7, 0x682B}, //4157 #CJK UNIFIED IDEOGRAPH + {0x96E8, 0x682C}, //4158 #CJK UNIFIED IDEOGRAPH + {0x96E9, 0x682D}, //4159 #CJK UNIFIED IDEOGRAPH + {0x96EA, 0x682E}, //4160 #CJK UNIFIED IDEOGRAPH + {0x96EB, 0x682F}, //4161 #CJK UNIFIED IDEOGRAPH + {0x96EC, 0x6830}, //4162 #CJK UNIFIED IDEOGRAPH + {0x96ED, 0x6831}, //4163 #CJK UNIFIED IDEOGRAPH + {0x96EE, 0x6834}, //4164 #CJK UNIFIED IDEOGRAPH + {0x96EF, 0x6835}, //4165 #CJK UNIFIED IDEOGRAPH + {0x96F0, 0x6836}, //4166 #CJK UNIFIED IDEOGRAPH + {0x96F1, 0x683A}, //4167 #CJK UNIFIED IDEOGRAPH + {0x96F2, 0x683B}, //4168 #CJK UNIFIED IDEOGRAPH + {0x96F3, 0x683F}, //4169 #CJK UNIFIED IDEOGRAPH + {0x96F4, 0x6847}, //4170 #CJK UNIFIED IDEOGRAPH + {0x96F5, 0x684B}, //4171 #CJK UNIFIED IDEOGRAPH + {0x96F6, 0x684D}, //4172 #CJK UNIFIED IDEOGRAPH + {0x96F7, 0x684F}, //4173 #CJK UNIFIED IDEOGRAPH + {0x96F8, 0x6852}, //4174 #CJK UNIFIED IDEOGRAPH + {0x96F9, 0x6856}, //4175 #CJK UNIFIED IDEOGRAPH + {0x96FA, 0x6857}, //4176 #CJK UNIFIED IDEOGRAPH + {0x96FB, 0x6858}, //4177 #CJK UNIFIED IDEOGRAPH + {0x96FC, 0x6859}, //4178 #CJK UNIFIED IDEOGRAPH + {0x96FD, 0x685A}, //4179 #CJK UNIFIED IDEOGRAPH + {0x96FE, 0x685B}, //4180 #CJK UNIFIED IDEOGRAPH + {0x9740, 0x685C}, //4181 #CJK UNIFIED IDEOGRAPH + {0x9741, 0x685D}, //4182 #CJK UNIFIED IDEOGRAPH + {0x9742, 0x685E}, //4183 #CJK UNIFIED IDEOGRAPH + {0x9743, 0x685F}, //4184 #CJK UNIFIED IDEOGRAPH + {0x9744, 0x686A}, //4185 #CJK UNIFIED IDEOGRAPH + {0x9745, 0x686C}, //4186 #CJK UNIFIED IDEOGRAPH + {0x9746, 0x686D}, //4187 #CJK UNIFIED IDEOGRAPH + {0x9747, 0x686E}, //4188 #CJK UNIFIED IDEOGRAPH + {0x9748, 0x686F}, //4189 #CJK UNIFIED IDEOGRAPH + {0x9749, 0x6870}, //4190 #CJK UNIFIED IDEOGRAPH + {0x974A, 0x6871}, //4191 #CJK UNIFIED IDEOGRAPH + {0x974B, 0x6872}, //4192 #CJK UNIFIED IDEOGRAPH + {0x974C, 0x6873}, //4193 #CJK UNIFIED IDEOGRAPH + {0x974D, 0x6875}, //4194 #CJK UNIFIED IDEOGRAPH + {0x974E, 0x6878}, //4195 #CJK UNIFIED IDEOGRAPH + {0x974F, 0x6879}, //4196 #CJK UNIFIED IDEOGRAPH + {0x9750, 0x687A}, //4197 #CJK UNIFIED IDEOGRAPH + {0x9751, 0x687B}, //4198 #CJK UNIFIED IDEOGRAPH + {0x9752, 0x687C}, //4199 #CJK UNIFIED IDEOGRAPH + {0x9753, 0x687D}, //4200 #CJK UNIFIED IDEOGRAPH + {0x9754, 0x687E}, //4201 #CJK UNIFIED IDEOGRAPH + {0x9755, 0x687F}, //4202 #CJK UNIFIED IDEOGRAPH + {0x9756, 0x6880}, //4203 #CJK UNIFIED IDEOGRAPH + {0x9757, 0x6882}, //4204 #CJK UNIFIED IDEOGRAPH + {0x9758, 0x6884}, //4205 #CJK UNIFIED IDEOGRAPH + {0x9759, 0x6887}, //4206 #CJK UNIFIED IDEOGRAPH + {0x975A, 0x6888}, //4207 #CJK UNIFIED IDEOGRAPH + {0x975B, 0x6889}, //4208 #CJK UNIFIED IDEOGRAPH + {0x975C, 0x688A}, //4209 #CJK UNIFIED IDEOGRAPH + {0x975D, 0x688B}, //4210 #CJK UNIFIED IDEOGRAPH + {0x975E, 0x688C}, //4211 #CJK UNIFIED IDEOGRAPH + {0x975F, 0x688D}, //4212 #CJK UNIFIED IDEOGRAPH + {0x9760, 0x688E}, //4213 #CJK UNIFIED IDEOGRAPH + {0x9761, 0x6890}, //4214 #CJK UNIFIED IDEOGRAPH + {0x9762, 0x6891}, //4215 #CJK UNIFIED IDEOGRAPH + {0x9763, 0x6892}, //4216 #CJK UNIFIED IDEOGRAPH + {0x9764, 0x6894}, //4217 #CJK UNIFIED IDEOGRAPH + {0x9765, 0x6895}, //4218 #CJK UNIFIED IDEOGRAPH + {0x9766, 0x6896}, //4219 #CJK UNIFIED IDEOGRAPH + {0x9767, 0x6898}, //4220 #CJK UNIFIED IDEOGRAPH + {0x9768, 0x6899}, //4221 #CJK UNIFIED IDEOGRAPH + {0x9769, 0x689A}, //4222 #CJK UNIFIED IDEOGRAPH + {0x976A, 0x689B}, //4223 #CJK UNIFIED IDEOGRAPH + {0x976B, 0x689C}, //4224 #CJK UNIFIED IDEOGRAPH + {0x976C, 0x689D}, //4225 #CJK UNIFIED IDEOGRAPH + {0x976D, 0x689E}, //4226 #CJK UNIFIED IDEOGRAPH + {0x976E, 0x689F}, //4227 #CJK UNIFIED IDEOGRAPH + {0x976F, 0x68A0}, //4228 #CJK UNIFIED IDEOGRAPH + {0x9770, 0x68A1}, //4229 #CJK UNIFIED IDEOGRAPH + {0x9771, 0x68A3}, //4230 #CJK UNIFIED IDEOGRAPH + {0x9772, 0x68A4}, //4231 #CJK UNIFIED IDEOGRAPH + {0x9773, 0x68A5}, //4232 #CJK UNIFIED IDEOGRAPH + {0x9774, 0x68A9}, //4233 #CJK UNIFIED IDEOGRAPH + {0x9775, 0x68AA}, //4234 #CJK UNIFIED IDEOGRAPH + {0x9776, 0x68AB}, //4235 #CJK UNIFIED IDEOGRAPH + {0x9777, 0x68AC}, //4236 #CJK UNIFIED IDEOGRAPH + {0x9778, 0x68AE}, //4237 #CJK UNIFIED IDEOGRAPH + {0x9779, 0x68B1}, //4238 #CJK UNIFIED IDEOGRAPH + {0x977A, 0x68B2}, //4239 #CJK UNIFIED IDEOGRAPH + {0x977B, 0x68B4}, //4240 #CJK UNIFIED IDEOGRAPH + {0x977C, 0x68B6}, //4241 #CJK UNIFIED IDEOGRAPH + {0x977D, 0x68B7}, //4242 #CJK UNIFIED IDEOGRAPH + {0x977E, 0x68B8}, //4243 #CJK UNIFIED IDEOGRAPH + {0x9780, 0x68B9}, //4244 #CJK UNIFIED IDEOGRAPH + {0x9781, 0x68BA}, //4245 #CJK UNIFIED IDEOGRAPH + {0x9782, 0x68BB}, //4246 #CJK UNIFIED IDEOGRAPH + {0x9783, 0x68BC}, //4247 #CJK UNIFIED IDEOGRAPH + {0x9784, 0x68BD}, //4248 #CJK UNIFIED IDEOGRAPH + {0x9785, 0x68BE}, //4249 #CJK UNIFIED IDEOGRAPH + {0x9786, 0x68BF}, //4250 #CJK UNIFIED IDEOGRAPH + {0x9787, 0x68C1}, //4251 #CJK UNIFIED IDEOGRAPH + {0x9788, 0x68C3}, //4252 #CJK UNIFIED IDEOGRAPH + {0x9789, 0x68C4}, //4253 #CJK UNIFIED IDEOGRAPH + {0x978A, 0x68C5}, //4254 #CJK UNIFIED IDEOGRAPH + {0x978B, 0x68C6}, //4255 #CJK UNIFIED IDEOGRAPH + {0x978C, 0x68C7}, //4256 #CJK UNIFIED IDEOGRAPH + {0x978D, 0x68C8}, //4257 #CJK UNIFIED IDEOGRAPH + {0x978E, 0x68CA}, //4258 #CJK UNIFIED IDEOGRAPH + {0x978F, 0x68CC}, //4259 #CJK UNIFIED IDEOGRAPH + {0x9790, 0x68CE}, //4260 #CJK UNIFIED IDEOGRAPH + {0x9791, 0x68CF}, //4261 #CJK UNIFIED IDEOGRAPH + {0x9792, 0x68D0}, //4262 #CJK UNIFIED IDEOGRAPH + {0x9793, 0x68D1}, //4263 #CJK UNIFIED IDEOGRAPH + {0x9794, 0x68D3}, //4264 #CJK UNIFIED IDEOGRAPH + {0x9795, 0x68D4}, //4265 #CJK UNIFIED IDEOGRAPH + {0x9796, 0x68D6}, //4266 #CJK UNIFIED IDEOGRAPH + {0x9797, 0x68D7}, //4267 #CJK UNIFIED IDEOGRAPH + {0x9798, 0x68D9}, //4268 #CJK UNIFIED IDEOGRAPH + {0x9799, 0x68DB}, //4269 #CJK UNIFIED IDEOGRAPH + {0x979A, 0x68DC}, //4270 #CJK UNIFIED IDEOGRAPH + {0x979B, 0x68DD}, //4271 #CJK UNIFIED IDEOGRAPH + {0x979C, 0x68DE}, //4272 #CJK UNIFIED IDEOGRAPH + {0x979D, 0x68DF}, //4273 #CJK UNIFIED IDEOGRAPH + {0x979E, 0x68E1}, //4274 #CJK UNIFIED IDEOGRAPH + {0x979F, 0x68E2}, //4275 #CJK UNIFIED IDEOGRAPH + {0x97A0, 0x68E4}, //4276 #CJK UNIFIED IDEOGRAPH + {0x97A1, 0x68E5}, //4277 #CJK UNIFIED IDEOGRAPH + {0x97A2, 0x68E6}, //4278 #CJK UNIFIED IDEOGRAPH + {0x97A3, 0x68E7}, //4279 #CJK UNIFIED IDEOGRAPH + {0x97A4, 0x68E8}, //4280 #CJK UNIFIED IDEOGRAPH + {0x97A5, 0x68E9}, //4281 #CJK UNIFIED IDEOGRAPH + {0x97A6, 0x68EA}, //4282 #CJK UNIFIED IDEOGRAPH + {0x97A7, 0x68EB}, //4283 #CJK UNIFIED IDEOGRAPH + {0x97A8, 0x68EC}, //4284 #CJK UNIFIED IDEOGRAPH + {0x97A9, 0x68ED}, //4285 #CJK UNIFIED IDEOGRAPH + {0x97AA, 0x68EF}, //4286 #CJK UNIFIED IDEOGRAPH + {0x97AB, 0x68F2}, //4287 #CJK UNIFIED IDEOGRAPH + {0x97AC, 0x68F3}, //4288 #CJK UNIFIED IDEOGRAPH + {0x97AD, 0x68F4}, //4289 #CJK UNIFIED IDEOGRAPH + {0x97AE, 0x68F6}, //4290 #CJK UNIFIED IDEOGRAPH + {0x97AF, 0x68F7}, //4291 #CJK UNIFIED IDEOGRAPH + {0x97B0, 0x68F8}, //4292 #CJK UNIFIED IDEOGRAPH + {0x97B1, 0x68FB}, //4293 #CJK UNIFIED IDEOGRAPH + {0x97B2, 0x68FD}, //4294 #CJK UNIFIED IDEOGRAPH + {0x97B3, 0x68FE}, //4295 #CJK UNIFIED IDEOGRAPH + {0x97B4, 0x68FF}, //4296 #CJK UNIFIED IDEOGRAPH + {0x97B5, 0x6900}, //4297 #CJK UNIFIED IDEOGRAPH + {0x97B6, 0x6902}, //4298 #CJK UNIFIED IDEOGRAPH + {0x97B7, 0x6903}, //4299 #CJK UNIFIED IDEOGRAPH + {0x97B8, 0x6904}, //4300 #CJK UNIFIED IDEOGRAPH + {0x97B9, 0x6906}, //4301 #CJK UNIFIED IDEOGRAPH + {0x97BA, 0x6907}, //4302 #CJK UNIFIED IDEOGRAPH + {0x97BB, 0x6908}, //4303 #CJK UNIFIED IDEOGRAPH + {0x97BC, 0x6909}, //4304 #CJK UNIFIED IDEOGRAPH + {0x97BD, 0x690A}, //4305 #CJK UNIFIED IDEOGRAPH + {0x97BE, 0x690C}, //4306 #CJK UNIFIED IDEOGRAPH + {0x97BF, 0x690F}, //4307 #CJK UNIFIED IDEOGRAPH + {0x97C0, 0x6911}, //4308 #CJK UNIFIED IDEOGRAPH + {0x97C1, 0x6913}, //4309 #CJK UNIFIED IDEOGRAPH + {0x97C2, 0x6914}, //4310 #CJK UNIFIED IDEOGRAPH + {0x97C3, 0x6915}, //4311 #CJK UNIFIED IDEOGRAPH + {0x97C4, 0x6916}, //4312 #CJK UNIFIED IDEOGRAPH + {0x97C5, 0x6917}, //4313 #CJK UNIFIED IDEOGRAPH + {0x97C6, 0x6918}, //4314 #CJK UNIFIED IDEOGRAPH + {0x97C7, 0x6919}, //4315 #CJK UNIFIED IDEOGRAPH + {0x97C8, 0x691A}, //4316 #CJK UNIFIED IDEOGRAPH + {0x97C9, 0x691B}, //4317 #CJK UNIFIED IDEOGRAPH + {0x97CA, 0x691C}, //4318 #CJK UNIFIED IDEOGRAPH + {0x97CB, 0x691D}, //4319 #CJK UNIFIED IDEOGRAPH + {0x97CC, 0x691E}, //4320 #CJK UNIFIED IDEOGRAPH + {0x97CD, 0x6921}, //4321 #CJK UNIFIED IDEOGRAPH + {0x97CE, 0x6922}, //4322 #CJK UNIFIED IDEOGRAPH + {0x97CF, 0x6923}, //4323 #CJK UNIFIED IDEOGRAPH + {0x97D0, 0x6925}, //4324 #CJK UNIFIED IDEOGRAPH + {0x97D1, 0x6926}, //4325 #CJK UNIFIED IDEOGRAPH + {0x97D2, 0x6927}, //4326 #CJK UNIFIED IDEOGRAPH + {0x97D3, 0x6928}, //4327 #CJK UNIFIED IDEOGRAPH + {0x97D4, 0x6929}, //4328 #CJK UNIFIED IDEOGRAPH + {0x97D5, 0x692A}, //4329 #CJK UNIFIED IDEOGRAPH + {0x97D6, 0x692B}, //4330 #CJK UNIFIED IDEOGRAPH + {0x97D7, 0x692C}, //4331 #CJK UNIFIED IDEOGRAPH + {0x97D8, 0x692E}, //4332 #CJK UNIFIED IDEOGRAPH + {0x97D9, 0x692F}, //4333 #CJK UNIFIED IDEOGRAPH + {0x97DA, 0x6931}, //4334 #CJK UNIFIED IDEOGRAPH + {0x97DB, 0x6932}, //4335 #CJK UNIFIED IDEOGRAPH + {0x97DC, 0x6933}, //4336 #CJK UNIFIED IDEOGRAPH + {0x97DD, 0x6935}, //4337 #CJK UNIFIED IDEOGRAPH + {0x97DE, 0x6936}, //4338 #CJK UNIFIED IDEOGRAPH + {0x97DF, 0x6937}, //4339 #CJK UNIFIED IDEOGRAPH + {0x97E0, 0x6938}, //4340 #CJK UNIFIED IDEOGRAPH + {0x97E1, 0x693A}, //4341 #CJK UNIFIED IDEOGRAPH + {0x97E2, 0x693B}, //4342 #CJK UNIFIED IDEOGRAPH + {0x97E3, 0x693C}, //4343 #CJK UNIFIED IDEOGRAPH + {0x97E4, 0x693E}, //4344 #CJK UNIFIED IDEOGRAPH + {0x97E5, 0x6940}, //4345 #CJK UNIFIED IDEOGRAPH + {0x97E6, 0x6941}, //4346 #CJK UNIFIED IDEOGRAPH + {0x97E7, 0x6943}, //4347 #CJK UNIFIED IDEOGRAPH + {0x97E8, 0x6944}, //4348 #CJK UNIFIED IDEOGRAPH + {0x97E9, 0x6945}, //4349 #CJK UNIFIED IDEOGRAPH + {0x97EA, 0x6946}, //4350 #CJK UNIFIED IDEOGRAPH + {0x97EB, 0x6947}, //4351 #CJK UNIFIED IDEOGRAPH + {0x97EC, 0x6948}, //4352 #CJK UNIFIED IDEOGRAPH + {0x97ED, 0x6949}, //4353 #CJK UNIFIED IDEOGRAPH + {0x97EE, 0x694A}, //4354 #CJK UNIFIED IDEOGRAPH + {0x97EF, 0x694B}, //4355 #CJK UNIFIED IDEOGRAPH + {0x97F0, 0x694C}, //4356 #CJK UNIFIED IDEOGRAPH + {0x97F1, 0x694D}, //4357 #CJK UNIFIED IDEOGRAPH + {0x97F2, 0x694E}, //4358 #CJK UNIFIED IDEOGRAPH + {0x97F3, 0x694F}, //4359 #CJK UNIFIED IDEOGRAPH + {0x97F4, 0x6950}, //4360 #CJK UNIFIED IDEOGRAPH + {0x97F5, 0x6951}, //4361 #CJK UNIFIED IDEOGRAPH + {0x97F6, 0x6952}, //4362 #CJK UNIFIED IDEOGRAPH + {0x97F7, 0x6953}, //4363 #CJK UNIFIED IDEOGRAPH + {0x97F8, 0x6955}, //4364 #CJK UNIFIED IDEOGRAPH + {0x97F9, 0x6956}, //4365 #CJK UNIFIED IDEOGRAPH + {0x97FA, 0x6958}, //4366 #CJK UNIFIED IDEOGRAPH + {0x97FB, 0x6959}, //4367 #CJK UNIFIED IDEOGRAPH + {0x97FC, 0x695B}, //4368 #CJK UNIFIED IDEOGRAPH + {0x97FD, 0x695C}, //4369 #CJK UNIFIED IDEOGRAPH + {0x97FE, 0x695F}, //4370 #CJK UNIFIED IDEOGRAPH + {0x9840, 0x6961}, //4371 #CJK UNIFIED IDEOGRAPH + {0x9841, 0x6962}, //4372 #CJK UNIFIED IDEOGRAPH + {0x9842, 0x6964}, //4373 #CJK UNIFIED IDEOGRAPH + {0x9843, 0x6965}, //4374 #CJK UNIFIED IDEOGRAPH + {0x9844, 0x6967}, //4375 #CJK UNIFIED IDEOGRAPH + {0x9845, 0x6968}, //4376 #CJK UNIFIED IDEOGRAPH + {0x9846, 0x6969}, //4377 #CJK UNIFIED IDEOGRAPH + {0x9847, 0x696A}, //4378 #CJK UNIFIED IDEOGRAPH + {0x9848, 0x696C}, //4379 #CJK UNIFIED IDEOGRAPH + {0x9849, 0x696D}, //4380 #CJK UNIFIED IDEOGRAPH + {0x984A, 0x696F}, //4381 #CJK UNIFIED IDEOGRAPH + {0x984B, 0x6970}, //4382 #CJK UNIFIED IDEOGRAPH + {0x984C, 0x6972}, //4383 #CJK UNIFIED IDEOGRAPH + {0x984D, 0x6973}, //4384 #CJK UNIFIED IDEOGRAPH + {0x984E, 0x6974}, //4385 #CJK UNIFIED IDEOGRAPH + {0x984F, 0x6975}, //4386 #CJK UNIFIED IDEOGRAPH + {0x9850, 0x6976}, //4387 #CJK UNIFIED IDEOGRAPH + {0x9851, 0x697A}, //4388 #CJK UNIFIED IDEOGRAPH + {0x9852, 0x697B}, //4389 #CJK UNIFIED IDEOGRAPH + {0x9853, 0x697D}, //4390 #CJK UNIFIED IDEOGRAPH + {0x9854, 0x697E}, //4391 #CJK UNIFIED IDEOGRAPH + {0x9855, 0x697F}, //4392 #CJK UNIFIED IDEOGRAPH + {0x9856, 0x6981}, //4393 #CJK UNIFIED IDEOGRAPH + {0x9857, 0x6983}, //4394 #CJK UNIFIED IDEOGRAPH + {0x9858, 0x6985}, //4395 #CJK UNIFIED IDEOGRAPH + {0x9859, 0x698A}, //4396 #CJK UNIFIED IDEOGRAPH + {0x985A, 0x698B}, //4397 #CJK UNIFIED IDEOGRAPH + {0x985B, 0x698C}, //4398 #CJK UNIFIED IDEOGRAPH + {0x985C, 0x698E}, //4399 #CJK UNIFIED IDEOGRAPH + {0x985D, 0x698F}, //4400 #CJK UNIFIED IDEOGRAPH + {0x985E, 0x6990}, //4401 #CJK UNIFIED IDEOGRAPH + {0x985F, 0x6991}, //4402 #CJK UNIFIED IDEOGRAPH + {0x9860, 0x6992}, //4403 #CJK UNIFIED IDEOGRAPH + {0x9861, 0x6993}, //4404 #CJK UNIFIED IDEOGRAPH + {0x9862, 0x6996}, //4405 #CJK UNIFIED IDEOGRAPH + {0x9863, 0x6997}, //4406 #CJK UNIFIED IDEOGRAPH + {0x9864, 0x6999}, //4407 #CJK UNIFIED IDEOGRAPH + {0x9865, 0x699A}, //4408 #CJK UNIFIED IDEOGRAPH + {0x9866, 0x699D}, //4409 #CJK UNIFIED IDEOGRAPH + {0x9867, 0x699E}, //4410 #CJK UNIFIED IDEOGRAPH + {0x9868, 0x699F}, //4411 #CJK UNIFIED IDEOGRAPH + {0x9869, 0x69A0}, //4412 #CJK UNIFIED IDEOGRAPH + {0x986A, 0x69A1}, //4413 #CJK UNIFIED IDEOGRAPH + {0x986B, 0x69A2}, //4414 #CJK UNIFIED IDEOGRAPH + {0x986C, 0x69A3}, //4415 #CJK UNIFIED IDEOGRAPH + {0x986D, 0x69A4}, //4416 #CJK UNIFIED IDEOGRAPH + {0x986E, 0x69A5}, //4417 #CJK UNIFIED IDEOGRAPH + {0x986F, 0x69A6}, //4418 #CJK UNIFIED IDEOGRAPH + {0x9870, 0x69A9}, //4419 #CJK UNIFIED IDEOGRAPH + {0x9871, 0x69AA}, //4420 #CJK UNIFIED IDEOGRAPH + {0x9872, 0x69AC}, //4421 #CJK UNIFIED IDEOGRAPH + {0x9873, 0x69AE}, //4422 #CJK UNIFIED IDEOGRAPH + {0x9874, 0x69AF}, //4423 #CJK UNIFIED IDEOGRAPH + {0x9875, 0x69B0}, //4424 #CJK UNIFIED IDEOGRAPH + {0x9876, 0x69B2}, //4425 #CJK UNIFIED IDEOGRAPH + {0x9877, 0x69B3}, //4426 #CJK UNIFIED IDEOGRAPH + {0x9878, 0x69B5}, //4427 #CJK UNIFIED IDEOGRAPH + {0x9879, 0x69B6}, //4428 #CJK UNIFIED IDEOGRAPH + {0x987A, 0x69B8}, //4429 #CJK UNIFIED IDEOGRAPH + {0x987B, 0x69B9}, //4430 #CJK UNIFIED IDEOGRAPH + {0x987C, 0x69BA}, //4431 #CJK UNIFIED IDEOGRAPH + {0x987D, 0x69BC}, //4432 #CJK UNIFIED IDEOGRAPH + {0x987E, 0x69BD}, //4433 #CJK UNIFIED IDEOGRAPH + {0x9880, 0x69BE}, //4434 #CJK UNIFIED IDEOGRAPH + {0x9881, 0x69BF}, //4435 #CJK UNIFIED IDEOGRAPH + {0x9882, 0x69C0}, //4436 #CJK UNIFIED IDEOGRAPH + {0x9883, 0x69C2}, //4437 #CJK UNIFIED IDEOGRAPH + {0x9884, 0x69C3}, //4438 #CJK UNIFIED IDEOGRAPH + {0x9885, 0x69C4}, //4439 #CJK UNIFIED IDEOGRAPH + {0x9886, 0x69C5}, //4440 #CJK UNIFIED IDEOGRAPH + {0x9887, 0x69C6}, //4441 #CJK UNIFIED IDEOGRAPH + {0x9888, 0x69C7}, //4442 #CJK UNIFIED IDEOGRAPH + {0x9889, 0x69C8}, //4443 #CJK UNIFIED IDEOGRAPH + {0x988A, 0x69C9}, //4444 #CJK UNIFIED IDEOGRAPH + {0x988B, 0x69CB}, //4445 #CJK UNIFIED IDEOGRAPH + {0x988C, 0x69CD}, //4446 #CJK UNIFIED IDEOGRAPH + {0x988D, 0x69CF}, //4447 #CJK UNIFIED IDEOGRAPH + {0x988E, 0x69D1}, //4448 #CJK UNIFIED IDEOGRAPH + {0x988F, 0x69D2}, //4449 #CJK UNIFIED IDEOGRAPH + {0x9890, 0x69D3}, //4450 #CJK UNIFIED IDEOGRAPH + {0x9891, 0x69D5}, //4451 #CJK UNIFIED IDEOGRAPH + {0x9892, 0x69D6}, //4452 #CJK UNIFIED IDEOGRAPH + {0x9893, 0x69D7}, //4453 #CJK UNIFIED IDEOGRAPH + {0x9894, 0x69D8}, //4454 #CJK UNIFIED IDEOGRAPH + {0x9895, 0x69D9}, //4455 #CJK UNIFIED IDEOGRAPH + {0x9896, 0x69DA}, //4456 #CJK UNIFIED IDEOGRAPH + {0x9897, 0x69DC}, //4457 #CJK UNIFIED IDEOGRAPH + {0x9898, 0x69DD}, //4458 #CJK UNIFIED IDEOGRAPH + {0x9899, 0x69DE}, //4459 #CJK UNIFIED IDEOGRAPH + {0x989A, 0x69E1}, //4460 #CJK UNIFIED IDEOGRAPH + {0x989B, 0x69E2}, //4461 #CJK UNIFIED IDEOGRAPH + {0x989C, 0x69E3}, //4462 #CJK UNIFIED IDEOGRAPH + {0x989D, 0x69E4}, //4463 #CJK UNIFIED IDEOGRAPH + {0x989E, 0x69E5}, //4464 #CJK UNIFIED IDEOGRAPH + {0x989F, 0x69E6}, //4465 #CJK UNIFIED IDEOGRAPH + {0x98A0, 0x69E7}, //4466 #CJK UNIFIED IDEOGRAPH + {0x98A1, 0x69E8}, //4467 #CJK UNIFIED IDEOGRAPH + {0x98A2, 0x69E9}, //4468 #CJK UNIFIED IDEOGRAPH + {0x98A3, 0x69EA}, //4469 #CJK UNIFIED IDEOGRAPH + {0x98A4, 0x69EB}, //4470 #CJK UNIFIED IDEOGRAPH + {0x98A5, 0x69EC}, //4471 #CJK UNIFIED IDEOGRAPH + {0x98A6, 0x69EE}, //4472 #CJK UNIFIED IDEOGRAPH + {0x98A7, 0x69EF}, //4473 #CJK UNIFIED IDEOGRAPH + {0x98A8, 0x69F0}, //4474 #CJK UNIFIED IDEOGRAPH + {0x98A9, 0x69F1}, //4475 #CJK UNIFIED IDEOGRAPH + {0x98AA, 0x69F3}, //4476 #CJK UNIFIED IDEOGRAPH + {0x98AB, 0x69F4}, //4477 #CJK UNIFIED IDEOGRAPH + {0x98AC, 0x69F5}, //4478 #CJK UNIFIED IDEOGRAPH + {0x98AD, 0x69F6}, //4479 #CJK UNIFIED IDEOGRAPH + {0x98AE, 0x69F7}, //4480 #CJK UNIFIED IDEOGRAPH + {0x98AF, 0x69F8}, //4481 #CJK UNIFIED IDEOGRAPH + {0x98B0, 0x69F9}, //4482 #CJK UNIFIED IDEOGRAPH + {0x98B1, 0x69FA}, //4483 #CJK UNIFIED IDEOGRAPH + {0x98B2, 0x69FB}, //4484 #CJK UNIFIED IDEOGRAPH + {0x98B3, 0x69FC}, //4485 #CJK UNIFIED IDEOGRAPH + {0x98B4, 0x69FE}, //4486 #CJK UNIFIED IDEOGRAPH + {0x98B5, 0x6A00}, //4487 #CJK UNIFIED IDEOGRAPH + {0x98B6, 0x6A01}, //4488 #CJK UNIFIED IDEOGRAPH + {0x98B7, 0x6A02}, //4489 #CJK UNIFIED IDEOGRAPH + {0x98B8, 0x6A03}, //4490 #CJK UNIFIED IDEOGRAPH + {0x98B9, 0x6A04}, //4491 #CJK UNIFIED IDEOGRAPH + {0x98BA, 0x6A05}, //4492 #CJK UNIFIED IDEOGRAPH + {0x98BB, 0x6A06}, //4493 #CJK UNIFIED IDEOGRAPH + {0x98BC, 0x6A07}, //4494 #CJK UNIFIED IDEOGRAPH + {0x98BD, 0x6A08}, //4495 #CJK UNIFIED IDEOGRAPH + {0x98BE, 0x6A09}, //4496 #CJK UNIFIED IDEOGRAPH + {0x98BF, 0x6A0B}, //4497 #CJK UNIFIED IDEOGRAPH + {0x98C0, 0x6A0C}, //4498 #CJK UNIFIED IDEOGRAPH + {0x98C1, 0x6A0D}, //4499 #CJK UNIFIED IDEOGRAPH + {0x98C2, 0x6A0E}, //4500 #CJK UNIFIED IDEOGRAPH + {0x98C3, 0x6A0F}, //4501 #CJK UNIFIED IDEOGRAPH + {0x98C4, 0x6A10}, //4502 #CJK UNIFIED IDEOGRAPH + {0x98C5, 0x6A11}, //4503 #CJK UNIFIED IDEOGRAPH + {0x98C6, 0x6A12}, //4504 #CJK UNIFIED IDEOGRAPH + {0x98C7, 0x6A13}, //4505 #CJK UNIFIED IDEOGRAPH + {0x98C8, 0x6A14}, //4506 #CJK UNIFIED IDEOGRAPH + {0x98C9, 0x6A15}, //4507 #CJK UNIFIED IDEOGRAPH + {0x98CA, 0x6A16}, //4508 #CJK UNIFIED IDEOGRAPH + {0x98CB, 0x6A19}, //4509 #CJK UNIFIED IDEOGRAPH + {0x98CC, 0x6A1A}, //4510 #CJK UNIFIED IDEOGRAPH + {0x98CD, 0x6A1B}, //4511 #CJK UNIFIED IDEOGRAPH + {0x98CE, 0x6A1C}, //4512 #CJK UNIFIED IDEOGRAPH + {0x98CF, 0x6A1D}, //4513 #CJK UNIFIED IDEOGRAPH + {0x98D0, 0x6A1E}, //4514 #CJK UNIFIED IDEOGRAPH + {0x98D1, 0x6A20}, //4515 #CJK UNIFIED IDEOGRAPH + {0x98D2, 0x6A22}, //4516 #CJK UNIFIED IDEOGRAPH + {0x98D3, 0x6A23}, //4517 #CJK UNIFIED IDEOGRAPH + {0x98D4, 0x6A24}, //4518 #CJK UNIFIED IDEOGRAPH + {0x98D5, 0x6A25}, //4519 #CJK UNIFIED IDEOGRAPH + {0x98D6, 0x6A26}, //4520 #CJK UNIFIED IDEOGRAPH + {0x98D7, 0x6A27}, //4521 #CJK UNIFIED IDEOGRAPH + {0x98D8, 0x6A29}, //4522 #CJK UNIFIED IDEOGRAPH + {0x98D9, 0x6A2B}, //4523 #CJK UNIFIED IDEOGRAPH + {0x98DA, 0x6A2C}, //4524 #CJK UNIFIED IDEOGRAPH + {0x98DB, 0x6A2D}, //4525 #CJK UNIFIED IDEOGRAPH + {0x98DC, 0x6A2E}, //4526 #CJK UNIFIED IDEOGRAPH + {0x98DD, 0x6A30}, //4527 #CJK UNIFIED IDEOGRAPH + {0x98DE, 0x6A32}, //4528 #CJK UNIFIED IDEOGRAPH + {0x98DF, 0x6A33}, //4529 #CJK UNIFIED IDEOGRAPH + {0x98E0, 0x6A34}, //4530 #CJK UNIFIED IDEOGRAPH + {0x98E1, 0x6A36}, //4531 #CJK UNIFIED IDEOGRAPH + {0x98E2, 0x6A37}, //4532 #CJK UNIFIED IDEOGRAPH + {0x98E3, 0x6A38}, //4533 #CJK UNIFIED IDEOGRAPH + {0x98E4, 0x6A39}, //4534 #CJK UNIFIED IDEOGRAPH + {0x98E5, 0x6A3A}, //4535 #CJK UNIFIED IDEOGRAPH + {0x98E6, 0x6A3B}, //4536 #CJK UNIFIED IDEOGRAPH + {0x98E7, 0x6A3C}, //4537 #CJK UNIFIED IDEOGRAPH + {0x98E8, 0x6A3F}, //4538 #CJK UNIFIED IDEOGRAPH + {0x98E9, 0x6A40}, //4539 #CJK UNIFIED IDEOGRAPH + {0x98EA, 0x6A41}, //4540 #CJK UNIFIED IDEOGRAPH + {0x98EB, 0x6A42}, //4541 #CJK UNIFIED IDEOGRAPH + {0x98EC, 0x6A43}, //4542 #CJK UNIFIED IDEOGRAPH + {0x98ED, 0x6A45}, //4543 #CJK UNIFIED IDEOGRAPH + {0x98EE, 0x6A46}, //4544 #CJK UNIFIED IDEOGRAPH + {0x98EF, 0x6A48}, //4545 #CJK UNIFIED IDEOGRAPH + {0x98F0, 0x6A49}, //4546 #CJK UNIFIED IDEOGRAPH + {0x98F1, 0x6A4A}, //4547 #CJK UNIFIED IDEOGRAPH + {0x98F2, 0x6A4B}, //4548 #CJK UNIFIED IDEOGRAPH + {0x98F3, 0x6A4C}, //4549 #CJK UNIFIED IDEOGRAPH + {0x98F4, 0x6A4D}, //4550 #CJK UNIFIED IDEOGRAPH + {0x98F5, 0x6A4E}, //4551 #CJK UNIFIED IDEOGRAPH + {0x98F6, 0x6A4F}, //4552 #CJK UNIFIED IDEOGRAPH + {0x98F7, 0x6A51}, //4553 #CJK UNIFIED IDEOGRAPH + {0x98F8, 0x6A52}, //4554 #CJK UNIFIED IDEOGRAPH + {0x98F9, 0x6A53}, //4555 #CJK UNIFIED IDEOGRAPH + {0x98FA, 0x6A54}, //4556 #CJK UNIFIED IDEOGRAPH + {0x98FB, 0x6A55}, //4557 #CJK UNIFIED IDEOGRAPH + {0x98FC, 0x6A56}, //4558 #CJK UNIFIED IDEOGRAPH + {0x98FD, 0x6A57}, //4559 #CJK UNIFIED IDEOGRAPH + {0x98FE, 0x6A5A}, //4560 #CJK UNIFIED IDEOGRAPH + {0x9940, 0x6A5C}, //4561 #CJK UNIFIED IDEOGRAPH + {0x9941, 0x6A5D}, //4562 #CJK UNIFIED IDEOGRAPH + {0x9942, 0x6A5E}, //4563 #CJK UNIFIED IDEOGRAPH + {0x9943, 0x6A5F}, //4564 #CJK UNIFIED IDEOGRAPH + {0x9944, 0x6A60}, //4565 #CJK UNIFIED IDEOGRAPH + {0x9945, 0x6A62}, //4566 #CJK UNIFIED IDEOGRAPH + {0x9946, 0x6A63}, //4567 #CJK UNIFIED IDEOGRAPH + {0x9947, 0x6A64}, //4568 #CJK UNIFIED IDEOGRAPH + {0x9948, 0x6A66}, //4569 #CJK UNIFIED IDEOGRAPH + {0x9949, 0x6A67}, //4570 #CJK UNIFIED IDEOGRAPH + {0x994A, 0x6A68}, //4571 #CJK UNIFIED IDEOGRAPH + {0x994B, 0x6A69}, //4572 #CJK UNIFIED IDEOGRAPH + {0x994C, 0x6A6A}, //4573 #CJK UNIFIED IDEOGRAPH + {0x994D, 0x6A6B}, //4574 #CJK UNIFIED IDEOGRAPH + {0x994E, 0x6A6C}, //4575 #CJK UNIFIED IDEOGRAPH + {0x994F, 0x6A6D}, //4576 #CJK UNIFIED IDEOGRAPH + {0x9950, 0x6A6E}, //4577 #CJK UNIFIED IDEOGRAPH + {0x9951, 0x6A6F}, //4578 #CJK UNIFIED IDEOGRAPH + {0x9952, 0x6A70}, //4579 #CJK UNIFIED IDEOGRAPH + {0x9953, 0x6A72}, //4580 #CJK UNIFIED IDEOGRAPH + {0x9954, 0x6A73}, //4581 #CJK UNIFIED IDEOGRAPH + {0x9955, 0x6A74}, //4582 #CJK UNIFIED IDEOGRAPH + {0x9956, 0x6A75}, //4583 #CJK UNIFIED IDEOGRAPH + {0x9957, 0x6A76}, //4584 #CJK UNIFIED IDEOGRAPH + {0x9958, 0x6A77}, //4585 #CJK UNIFIED IDEOGRAPH + {0x9959, 0x6A78}, //4586 #CJK UNIFIED IDEOGRAPH + {0x995A, 0x6A7A}, //4587 #CJK UNIFIED IDEOGRAPH + {0x995B, 0x6A7B}, //4588 #CJK UNIFIED IDEOGRAPH + {0x995C, 0x6A7D}, //4589 #CJK UNIFIED IDEOGRAPH + {0x995D, 0x6A7E}, //4590 #CJK UNIFIED IDEOGRAPH + {0x995E, 0x6A7F}, //4591 #CJK UNIFIED IDEOGRAPH + {0x995F, 0x6A81}, //4592 #CJK UNIFIED IDEOGRAPH + {0x9960, 0x6A82}, //4593 #CJK UNIFIED IDEOGRAPH + {0x9961, 0x6A83}, //4594 #CJK UNIFIED IDEOGRAPH + {0x9962, 0x6A85}, //4595 #CJK UNIFIED IDEOGRAPH + {0x9963, 0x6A86}, //4596 #CJK UNIFIED IDEOGRAPH + {0x9964, 0x6A87}, //4597 #CJK UNIFIED IDEOGRAPH + {0x9965, 0x6A88}, //4598 #CJK UNIFIED IDEOGRAPH + {0x9966, 0x6A89}, //4599 #CJK UNIFIED IDEOGRAPH + {0x9967, 0x6A8A}, //4600 #CJK UNIFIED IDEOGRAPH + {0x9968, 0x6A8B}, //4601 #CJK UNIFIED IDEOGRAPH + {0x9969, 0x6A8C}, //4602 #CJK UNIFIED IDEOGRAPH + {0x996A, 0x6A8D}, //4603 #CJK UNIFIED IDEOGRAPH + {0x996B, 0x6A8F}, //4604 #CJK UNIFIED IDEOGRAPH + {0x996C, 0x6A92}, //4605 #CJK UNIFIED IDEOGRAPH + {0x996D, 0x6A93}, //4606 #CJK UNIFIED IDEOGRAPH + {0x996E, 0x6A94}, //4607 #CJK UNIFIED IDEOGRAPH + {0x996F, 0x6A95}, //4608 #CJK UNIFIED IDEOGRAPH + {0x9970, 0x6A96}, //4609 #CJK UNIFIED IDEOGRAPH + {0x9971, 0x6A98}, //4610 #CJK UNIFIED IDEOGRAPH + {0x9972, 0x6A99}, //4611 #CJK UNIFIED IDEOGRAPH + {0x9973, 0x6A9A}, //4612 #CJK UNIFIED IDEOGRAPH + {0x9974, 0x6A9B}, //4613 #CJK UNIFIED IDEOGRAPH + {0x9975, 0x6A9C}, //4614 #CJK UNIFIED IDEOGRAPH + {0x9976, 0x6A9D}, //4615 #CJK UNIFIED IDEOGRAPH + {0x9977, 0x6A9E}, //4616 #CJK UNIFIED IDEOGRAPH + {0x9978, 0x6A9F}, //4617 #CJK UNIFIED IDEOGRAPH + {0x9979, 0x6AA1}, //4618 #CJK UNIFIED IDEOGRAPH + {0x997A, 0x6AA2}, //4619 #CJK UNIFIED IDEOGRAPH + {0x997B, 0x6AA3}, //4620 #CJK UNIFIED IDEOGRAPH + {0x997C, 0x6AA4}, //4621 #CJK UNIFIED IDEOGRAPH + {0x997D, 0x6AA5}, //4622 #CJK UNIFIED IDEOGRAPH + {0x997E, 0x6AA6}, //4623 #CJK UNIFIED IDEOGRAPH + {0x9980, 0x6AA7}, //4624 #CJK UNIFIED IDEOGRAPH + {0x9981, 0x6AA8}, //4625 #CJK UNIFIED IDEOGRAPH + {0x9982, 0x6AAA}, //4626 #CJK UNIFIED IDEOGRAPH + {0x9983, 0x6AAD}, //4627 #CJK UNIFIED IDEOGRAPH + {0x9984, 0x6AAE}, //4628 #CJK UNIFIED IDEOGRAPH + {0x9985, 0x6AAF}, //4629 #CJK UNIFIED IDEOGRAPH + {0x9986, 0x6AB0}, //4630 #CJK UNIFIED IDEOGRAPH + {0x9987, 0x6AB1}, //4631 #CJK UNIFIED IDEOGRAPH + {0x9988, 0x6AB2}, //4632 #CJK UNIFIED IDEOGRAPH + {0x9989, 0x6AB3}, //4633 #CJK UNIFIED IDEOGRAPH + {0x998A, 0x6AB4}, //4634 #CJK UNIFIED IDEOGRAPH + {0x998B, 0x6AB5}, //4635 #CJK UNIFIED IDEOGRAPH + {0x998C, 0x6AB6}, //4636 #CJK UNIFIED IDEOGRAPH + {0x998D, 0x6AB7}, //4637 #CJK UNIFIED IDEOGRAPH + {0x998E, 0x6AB8}, //4638 #CJK UNIFIED IDEOGRAPH + {0x998F, 0x6AB9}, //4639 #CJK UNIFIED IDEOGRAPH + {0x9990, 0x6ABA}, //4640 #CJK UNIFIED IDEOGRAPH + {0x9991, 0x6ABB}, //4641 #CJK UNIFIED IDEOGRAPH + {0x9992, 0x6ABC}, //4642 #CJK UNIFIED IDEOGRAPH + {0x9993, 0x6ABD}, //4643 #CJK UNIFIED IDEOGRAPH + {0x9994, 0x6ABE}, //4644 #CJK UNIFIED IDEOGRAPH + {0x9995, 0x6ABF}, //4645 #CJK UNIFIED IDEOGRAPH + {0x9996, 0x6AC0}, //4646 #CJK UNIFIED IDEOGRAPH + {0x9997, 0x6AC1}, //4647 #CJK UNIFIED IDEOGRAPH + {0x9998, 0x6AC2}, //4648 #CJK UNIFIED IDEOGRAPH + {0x9999, 0x6AC3}, //4649 #CJK UNIFIED IDEOGRAPH + {0x999A, 0x6AC4}, //4650 #CJK UNIFIED IDEOGRAPH + {0x999B, 0x6AC5}, //4651 #CJK UNIFIED IDEOGRAPH + {0x999C, 0x6AC6}, //4652 #CJK UNIFIED IDEOGRAPH + {0x999D, 0x6AC7}, //4653 #CJK UNIFIED IDEOGRAPH + {0x999E, 0x6AC8}, //4654 #CJK UNIFIED IDEOGRAPH + {0x999F, 0x6AC9}, //4655 #CJK UNIFIED IDEOGRAPH + {0x99A0, 0x6ACA}, //4656 #CJK UNIFIED IDEOGRAPH + {0x99A1, 0x6ACB}, //4657 #CJK UNIFIED IDEOGRAPH + {0x99A2, 0x6ACC}, //4658 #CJK UNIFIED IDEOGRAPH + {0x99A3, 0x6ACD}, //4659 #CJK UNIFIED IDEOGRAPH + {0x99A4, 0x6ACE}, //4660 #CJK UNIFIED IDEOGRAPH + {0x99A5, 0x6ACF}, //4661 #CJK UNIFIED IDEOGRAPH + {0x99A6, 0x6AD0}, //4662 #CJK UNIFIED IDEOGRAPH + {0x99A7, 0x6AD1}, //4663 #CJK UNIFIED IDEOGRAPH + {0x99A8, 0x6AD2}, //4664 #CJK UNIFIED IDEOGRAPH + {0x99A9, 0x6AD3}, //4665 #CJK UNIFIED IDEOGRAPH + {0x99AA, 0x6AD4}, //4666 #CJK UNIFIED IDEOGRAPH + {0x99AB, 0x6AD5}, //4667 #CJK UNIFIED IDEOGRAPH + {0x99AC, 0x6AD6}, //4668 #CJK UNIFIED IDEOGRAPH + {0x99AD, 0x6AD7}, //4669 #CJK UNIFIED IDEOGRAPH + {0x99AE, 0x6AD8}, //4670 #CJK UNIFIED IDEOGRAPH + {0x99AF, 0x6AD9}, //4671 #CJK UNIFIED IDEOGRAPH + {0x99B0, 0x6ADA}, //4672 #CJK UNIFIED IDEOGRAPH + {0x99B1, 0x6ADB}, //4673 #CJK UNIFIED IDEOGRAPH + {0x99B2, 0x6ADC}, //4674 #CJK UNIFIED IDEOGRAPH + {0x99B3, 0x6ADD}, //4675 #CJK UNIFIED IDEOGRAPH + {0x99B4, 0x6ADE}, //4676 #CJK UNIFIED IDEOGRAPH + {0x99B5, 0x6ADF}, //4677 #CJK UNIFIED IDEOGRAPH + {0x99B6, 0x6AE0}, //4678 #CJK UNIFIED IDEOGRAPH + {0x99B7, 0x6AE1}, //4679 #CJK UNIFIED IDEOGRAPH + {0x99B8, 0x6AE2}, //4680 #CJK UNIFIED IDEOGRAPH + {0x99B9, 0x6AE3}, //4681 #CJK UNIFIED IDEOGRAPH + {0x99BA, 0x6AE4}, //4682 #CJK UNIFIED IDEOGRAPH + {0x99BB, 0x6AE5}, //4683 #CJK UNIFIED IDEOGRAPH + {0x99BC, 0x6AE6}, //4684 #CJK UNIFIED IDEOGRAPH + {0x99BD, 0x6AE7}, //4685 #CJK UNIFIED IDEOGRAPH + {0x99BE, 0x6AE8}, //4686 #CJK UNIFIED IDEOGRAPH + {0x99BF, 0x6AE9}, //4687 #CJK UNIFIED IDEOGRAPH + {0x99C0, 0x6AEA}, //4688 #CJK UNIFIED IDEOGRAPH + {0x99C1, 0x6AEB}, //4689 #CJK UNIFIED IDEOGRAPH + {0x99C2, 0x6AEC}, //4690 #CJK UNIFIED IDEOGRAPH + {0x99C3, 0x6AED}, //4691 #CJK UNIFIED IDEOGRAPH + {0x99C4, 0x6AEE}, //4692 #CJK UNIFIED IDEOGRAPH + {0x99C5, 0x6AEF}, //4693 #CJK UNIFIED IDEOGRAPH + {0x99C6, 0x6AF0}, //4694 #CJK UNIFIED IDEOGRAPH + {0x99C7, 0x6AF1}, //4695 #CJK UNIFIED IDEOGRAPH + {0x99C8, 0x6AF2}, //4696 #CJK UNIFIED IDEOGRAPH + {0x99C9, 0x6AF3}, //4697 #CJK UNIFIED IDEOGRAPH + {0x99CA, 0x6AF4}, //4698 #CJK UNIFIED IDEOGRAPH + {0x99CB, 0x6AF5}, //4699 #CJK UNIFIED IDEOGRAPH + {0x99CC, 0x6AF6}, //4700 #CJK UNIFIED IDEOGRAPH + {0x99CD, 0x6AF7}, //4701 #CJK UNIFIED IDEOGRAPH + {0x99CE, 0x6AF8}, //4702 #CJK UNIFIED IDEOGRAPH + {0x99CF, 0x6AF9}, //4703 #CJK UNIFIED IDEOGRAPH + {0x99D0, 0x6AFA}, //4704 #CJK UNIFIED IDEOGRAPH + {0x99D1, 0x6AFB}, //4705 #CJK UNIFIED IDEOGRAPH + {0x99D2, 0x6AFC}, //4706 #CJK UNIFIED IDEOGRAPH + {0x99D3, 0x6AFD}, //4707 #CJK UNIFIED IDEOGRAPH + {0x99D4, 0x6AFE}, //4708 #CJK UNIFIED IDEOGRAPH + {0x99D5, 0x6AFF}, //4709 #CJK UNIFIED IDEOGRAPH + {0x99D6, 0x6B00}, //4710 #CJK UNIFIED IDEOGRAPH + {0x99D7, 0x6B01}, //4711 #CJK UNIFIED IDEOGRAPH + {0x99D8, 0x6B02}, //4712 #CJK UNIFIED IDEOGRAPH + {0x99D9, 0x6B03}, //4713 #CJK UNIFIED IDEOGRAPH + {0x99DA, 0x6B04}, //4714 #CJK UNIFIED IDEOGRAPH + {0x99DB, 0x6B05}, //4715 #CJK UNIFIED IDEOGRAPH + {0x99DC, 0x6B06}, //4716 #CJK UNIFIED IDEOGRAPH + {0x99DD, 0x6B07}, //4717 #CJK UNIFIED IDEOGRAPH + {0x99DE, 0x6B08}, //4718 #CJK UNIFIED IDEOGRAPH + {0x99DF, 0x6B09}, //4719 #CJK UNIFIED IDEOGRAPH + {0x99E0, 0x6B0A}, //4720 #CJK UNIFIED IDEOGRAPH + {0x99E1, 0x6B0B}, //4721 #CJK UNIFIED IDEOGRAPH + {0x99E2, 0x6B0C}, //4722 #CJK UNIFIED IDEOGRAPH + {0x99E3, 0x6B0D}, //4723 #CJK UNIFIED IDEOGRAPH + {0x99E4, 0x6B0E}, //4724 #CJK UNIFIED IDEOGRAPH + {0x99E5, 0x6B0F}, //4725 #CJK UNIFIED IDEOGRAPH + {0x99E6, 0x6B10}, //4726 #CJK UNIFIED IDEOGRAPH + {0x99E7, 0x6B11}, //4727 #CJK UNIFIED IDEOGRAPH + {0x99E8, 0x6B12}, //4728 #CJK UNIFIED IDEOGRAPH + {0x99E9, 0x6B13}, //4729 #CJK UNIFIED IDEOGRAPH + {0x99EA, 0x6B14}, //4730 #CJK UNIFIED IDEOGRAPH + {0x99EB, 0x6B15}, //4731 #CJK UNIFIED IDEOGRAPH + {0x99EC, 0x6B16}, //4732 #CJK UNIFIED IDEOGRAPH + {0x99ED, 0x6B17}, //4733 #CJK UNIFIED IDEOGRAPH + {0x99EE, 0x6B18}, //4734 #CJK UNIFIED IDEOGRAPH + {0x99EF, 0x6B19}, //4735 #CJK UNIFIED IDEOGRAPH + {0x99F0, 0x6B1A}, //4736 #CJK UNIFIED IDEOGRAPH + {0x99F1, 0x6B1B}, //4737 #CJK UNIFIED IDEOGRAPH + {0x99F2, 0x6B1C}, //4738 #CJK UNIFIED IDEOGRAPH + {0x99F3, 0x6B1D}, //4739 #CJK UNIFIED IDEOGRAPH + {0x99F4, 0x6B1E}, //4740 #CJK UNIFIED IDEOGRAPH + {0x99F5, 0x6B1F}, //4741 #CJK UNIFIED IDEOGRAPH + {0x99F6, 0x6B25}, //4742 #CJK UNIFIED IDEOGRAPH + {0x99F7, 0x6B26}, //4743 #CJK UNIFIED IDEOGRAPH + {0x99F8, 0x6B28}, //4744 #CJK UNIFIED IDEOGRAPH + {0x99F9, 0x6B29}, //4745 #CJK UNIFIED IDEOGRAPH + {0x99FA, 0x6B2A}, //4746 #CJK UNIFIED IDEOGRAPH + {0x99FB, 0x6B2B}, //4747 #CJK UNIFIED IDEOGRAPH + {0x99FC, 0x6B2C}, //4748 #CJK UNIFIED IDEOGRAPH + {0x99FD, 0x6B2D}, //4749 #CJK UNIFIED IDEOGRAPH + {0x99FE, 0x6B2E}, //4750 #CJK UNIFIED IDEOGRAPH + {0x9A40, 0x6B2F}, //4751 #CJK UNIFIED IDEOGRAPH + {0x9A41, 0x6B30}, //4752 #CJK UNIFIED IDEOGRAPH + {0x9A42, 0x6B31}, //4753 #CJK UNIFIED IDEOGRAPH + {0x9A43, 0x6B33}, //4754 #CJK UNIFIED IDEOGRAPH + {0x9A44, 0x6B34}, //4755 #CJK UNIFIED IDEOGRAPH + {0x9A45, 0x6B35}, //4756 #CJK UNIFIED IDEOGRAPH + {0x9A46, 0x6B36}, //4757 #CJK UNIFIED IDEOGRAPH + {0x9A47, 0x6B38}, //4758 #CJK UNIFIED IDEOGRAPH + {0x9A48, 0x6B3B}, //4759 #CJK UNIFIED IDEOGRAPH + {0x9A49, 0x6B3C}, //4760 #CJK UNIFIED IDEOGRAPH + {0x9A4A, 0x6B3D}, //4761 #CJK UNIFIED IDEOGRAPH + {0x9A4B, 0x6B3F}, //4762 #CJK UNIFIED IDEOGRAPH + {0x9A4C, 0x6B40}, //4763 #CJK UNIFIED IDEOGRAPH + {0x9A4D, 0x6B41}, //4764 #CJK UNIFIED IDEOGRAPH + {0x9A4E, 0x6B42}, //4765 #CJK UNIFIED IDEOGRAPH + {0x9A4F, 0x6B44}, //4766 #CJK UNIFIED IDEOGRAPH + {0x9A50, 0x6B45}, //4767 #CJK UNIFIED IDEOGRAPH + {0x9A51, 0x6B48}, //4768 #CJK UNIFIED IDEOGRAPH + {0x9A52, 0x6B4A}, //4769 #CJK UNIFIED IDEOGRAPH + {0x9A53, 0x6B4B}, //4770 #CJK UNIFIED IDEOGRAPH + {0x9A54, 0x6B4D}, //4771 #CJK UNIFIED IDEOGRAPH + {0x9A55, 0x6B4E}, //4772 #CJK UNIFIED IDEOGRAPH + {0x9A56, 0x6B4F}, //4773 #CJK UNIFIED IDEOGRAPH + {0x9A57, 0x6B50}, //4774 #CJK UNIFIED IDEOGRAPH + {0x9A58, 0x6B51}, //4775 #CJK UNIFIED IDEOGRAPH + {0x9A59, 0x6B52}, //4776 #CJK UNIFIED IDEOGRAPH + {0x9A5A, 0x6B53}, //4777 #CJK UNIFIED IDEOGRAPH + {0x9A5B, 0x6B54}, //4778 #CJK UNIFIED IDEOGRAPH + {0x9A5C, 0x6B55}, //4779 #CJK UNIFIED IDEOGRAPH + {0x9A5D, 0x6B56}, //4780 #CJK UNIFIED IDEOGRAPH + {0x9A5E, 0x6B57}, //4781 #CJK UNIFIED IDEOGRAPH + {0x9A5F, 0x6B58}, //4782 #CJK UNIFIED IDEOGRAPH + {0x9A60, 0x6B5A}, //4783 #CJK UNIFIED IDEOGRAPH + {0x9A61, 0x6B5B}, //4784 #CJK UNIFIED IDEOGRAPH + {0x9A62, 0x6B5C}, //4785 #CJK UNIFIED IDEOGRAPH + {0x9A63, 0x6B5D}, //4786 #CJK UNIFIED IDEOGRAPH + {0x9A64, 0x6B5E}, //4787 #CJK UNIFIED IDEOGRAPH + {0x9A65, 0x6B5F}, //4788 #CJK UNIFIED IDEOGRAPH + {0x9A66, 0x6B60}, //4789 #CJK UNIFIED IDEOGRAPH + {0x9A67, 0x6B61}, //4790 #CJK UNIFIED IDEOGRAPH + {0x9A68, 0x6B68}, //4791 #CJK UNIFIED IDEOGRAPH + {0x9A69, 0x6B69}, //4792 #CJK UNIFIED IDEOGRAPH + {0x9A6A, 0x6B6B}, //4793 #CJK UNIFIED IDEOGRAPH + {0x9A6B, 0x6B6C}, //4794 #CJK UNIFIED IDEOGRAPH + {0x9A6C, 0x6B6D}, //4795 #CJK UNIFIED IDEOGRAPH + {0x9A6D, 0x6B6E}, //4796 #CJK UNIFIED IDEOGRAPH + {0x9A6E, 0x6B6F}, //4797 #CJK UNIFIED IDEOGRAPH + {0x9A6F, 0x6B70}, //4798 #CJK UNIFIED IDEOGRAPH + {0x9A70, 0x6B71}, //4799 #CJK UNIFIED IDEOGRAPH + {0x9A71, 0x6B72}, //4800 #CJK UNIFIED IDEOGRAPH + {0x9A72, 0x6B73}, //4801 #CJK UNIFIED IDEOGRAPH + {0x9A73, 0x6B74}, //4802 #CJK UNIFIED IDEOGRAPH + {0x9A74, 0x6B75}, //4803 #CJK UNIFIED IDEOGRAPH + {0x9A75, 0x6B76}, //4804 #CJK UNIFIED IDEOGRAPH + {0x9A76, 0x6B77}, //4805 #CJK UNIFIED IDEOGRAPH + {0x9A77, 0x6B78}, //4806 #CJK UNIFIED IDEOGRAPH + {0x9A78, 0x6B7A}, //4807 #CJK UNIFIED IDEOGRAPH + {0x9A79, 0x6B7D}, //4808 #CJK UNIFIED IDEOGRAPH + {0x9A7A, 0x6B7E}, //4809 #CJK UNIFIED IDEOGRAPH + {0x9A7B, 0x6B7F}, //4810 #CJK UNIFIED IDEOGRAPH + {0x9A7C, 0x6B80}, //4811 #CJK UNIFIED IDEOGRAPH + {0x9A7D, 0x6B85}, //4812 #CJK UNIFIED IDEOGRAPH + {0x9A7E, 0x6B88}, //4813 #CJK UNIFIED IDEOGRAPH + {0x9A80, 0x6B8C}, //4814 #CJK UNIFIED IDEOGRAPH + {0x9A81, 0x6B8E}, //4815 #CJK UNIFIED IDEOGRAPH + {0x9A82, 0x6B8F}, //4816 #CJK UNIFIED IDEOGRAPH + {0x9A83, 0x6B90}, //4817 #CJK UNIFIED IDEOGRAPH + {0x9A84, 0x6B91}, //4818 #CJK UNIFIED IDEOGRAPH + {0x9A85, 0x6B94}, //4819 #CJK UNIFIED IDEOGRAPH + {0x9A86, 0x6B95}, //4820 #CJK UNIFIED IDEOGRAPH + {0x9A87, 0x6B97}, //4821 #CJK UNIFIED IDEOGRAPH + {0x9A88, 0x6B98}, //4822 #CJK UNIFIED IDEOGRAPH + {0x9A89, 0x6B99}, //4823 #CJK UNIFIED IDEOGRAPH + {0x9A8A, 0x6B9C}, //4824 #CJK UNIFIED IDEOGRAPH + {0x9A8B, 0x6B9D}, //4825 #CJK UNIFIED IDEOGRAPH + {0x9A8C, 0x6B9E}, //4826 #CJK UNIFIED IDEOGRAPH + {0x9A8D, 0x6B9F}, //4827 #CJK UNIFIED IDEOGRAPH + {0x9A8E, 0x6BA0}, //4828 #CJK UNIFIED IDEOGRAPH + {0x9A8F, 0x6BA2}, //4829 #CJK UNIFIED IDEOGRAPH + {0x9A90, 0x6BA3}, //4830 #CJK UNIFIED IDEOGRAPH + {0x9A91, 0x6BA4}, //4831 #CJK UNIFIED IDEOGRAPH + {0x9A92, 0x6BA5}, //4832 #CJK UNIFIED IDEOGRAPH + {0x9A93, 0x6BA6}, //4833 #CJK UNIFIED IDEOGRAPH + {0x9A94, 0x6BA7}, //4834 #CJK UNIFIED IDEOGRAPH + {0x9A95, 0x6BA8}, //4835 #CJK UNIFIED IDEOGRAPH + {0x9A96, 0x6BA9}, //4836 #CJK UNIFIED IDEOGRAPH + {0x9A97, 0x6BAB}, //4837 #CJK UNIFIED IDEOGRAPH + {0x9A98, 0x6BAC}, //4838 #CJK UNIFIED IDEOGRAPH + {0x9A99, 0x6BAD}, //4839 #CJK UNIFIED IDEOGRAPH + {0x9A9A, 0x6BAE}, //4840 #CJK UNIFIED IDEOGRAPH + {0x9A9B, 0x6BAF}, //4841 #CJK UNIFIED IDEOGRAPH + {0x9A9C, 0x6BB0}, //4842 #CJK UNIFIED IDEOGRAPH + {0x9A9D, 0x6BB1}, //4843 #CJK UNIFIED IDEOGRAPH + {0x9A9E, 0x6BB2}, //4844 #CJK UNIFIED IDEOGRAPH + {0x9A9F, 0x6BB6}, //4845 #CJK UNIFIED IDEOGRAPH + {0x9AA0, 0x6BB8}, //4846 #CJK UNIFIED IDEOGRAPH + {0x9AA1, 0x6BB9}, //4847 #CJK UNIFIED IDEOGRAPH + {0x9AA2, 0x6BBA}, //4848 #CJK UNIFIED IDEOGRAPH + {0x9AA3, 0x6BBB}, //4849 #CJK UNIFIED IDEOGRAPH + {0x9AA4, 0x6BBC}, //4850 #CJK UNIFIED IDEOGRAPH + {0x9AA5, 0x6BBD}, //4851 #CJK UNIFIED IDEOGRAPH + {0x9AA6, 0x6BBE}, //4852 #CJK UNIFIED IDEOGRAPH + {0x9AA7, 0x6BC0}, //4853 #CJK UNIFIED IDEOGRAPH + {0x9AA8, 0x6BC3}, //4854 #CJK UNIFIED IDEOGRAPH + {0x9AA9, 0x6BC4}, //4855 #CJK UNIFIED IDEOGRAPH + {0x9AAA, 0x6BC6}, //4856 #CJK UNIFIED IDEOGRAPH + {0x9AAB, 0x6BC7}, //4857 #CJK UNIFIED IDEOGRAPH + {0x9AAC, 0x6BC8}, //4858 #CJK UNIFIED IDEOGRAPH + {0x9AAD, 0x6BC9}, //4859 #CJK UNIFIED IDEOGRAPH + {0x9AAE, 0x6BCA}, //4860 #CJK UNIFIED IDEOGRAPH + {0x9AAF, 0x6BCC}, //4861 #CJK UNIFIED IDEOGRAPH + {0x9AB0, 0x6BCE}, //4862 #CJK UNIFIED IDEOGRAPH + {0x9AB1, 0x6BD0}, //4863 #CJK UNIFIED IDEOGRAPH + {0x9AB2, 0x6BD1}, //4864 #CJK UNIFIED IDEOGRAPH + {0x9AB3, 0x6BD8}, //4865 #CJK UNIFIED IDEOGRAPH + {0x9AB4, 0x6BDA}, //4866 #CJK UNIFIED IDEOGRAPH + {0x9AB5, 0x6BDC}, //4867 #CJK UNIFIED IDEOGRAPH + {0x9AB6, 0x6BDD}, //4868 #CJK UNIFIED IDEOGRAPH + {0x9AB7, 0x6BDE}, //4869 #CJK UNIFIED IDEOGRAPH + {0x9AB8, 0x6BDF}, //4870 #CJK UNIFIED IDEOGRAPH + {0x9AB9, 0x6BE0}, //4871 #CJK UNIFIED IDEOGRAPH + {0x9ABA, 0x6BE2}, //4872 #CJK UNIFIED IDEOGRAPH + {0x9ABB, 0x6BE3}, //4873 #CJK UNIFIED IDEOGRAPH + {0x9ABC, 0x6BE4}, //4874 #CJK UNIFIED IDEOGRAPH + {0x9ABD, 0x6BE5}, //4875 #CJK UNIFIED IDEOGRAPH + {0x9ABE, 0x6BE6}, //4876 #CJK UNIFIED IDEOGRAPH + {0x9ABF, 0x6BE7}, //4877 #CJK UNIFIED IDEOGRAPH + {0x9AC0, 0x6BE8}, //4878 #CJK UNIFIED IDEOGRAPH + {0x9AC1, 0x6BE9}, //4879 #CJK UNIFIED IDEOGRAPH + {0x9AC2, 0x6BEC}, //4880 #CJK UNIFIED IDEOGRAPH + {0x9AC3, 0x6BED}, //4881 #CJK UNIFIED IDEOGRAPH + {0x9AC4, 0x6BEE}, //4882 #CJK UNIFIED IDEOGRAPH + {0x9AC5, 0x6BF0}, //4883 #CJK UNIFIED IDEOGRAPH + {0x9AC6, 0x6BF1}, //4884 #CJK UNIFIED IDEOGRAPH + {0x9AC7, 0x6BF2}, //4885 #CJK UNIFIED IDEOGRAPH + {0x9AC8, 0x6BF4}, //4886 #CJK UNIFIED IDEOGRAPH + {0x9AC9, 0x6BF6}, //4887 #CJK UNIFIED IDEOGRAPH + {0x9ACA, 0x6BF7}, //4888 #CJK UNIFIED IDEOGRAPH + {0x9ACB, 0x6BF8}, //4889 #CJK UNIFIED IDEOGRAPH + {0x9ACC, 0x6BFA}, //4890 #CJK UNIFIED IDEOGRAPH + {0x9ACD, 0x6BFB}, //4891 #CJK UNIFIED IDEOGRAPH + {0x9ACE, 0x6BFC}, //4892 #CJK UNIFIED IDEOGRAPH + {0x9ACF, 0x6BFE}, //4893 #CJK UNIFIED IDEOGRAPH + {0x9AD0, 0x6BFF}, //4894 #CJK UNIFIED IDEOGRAPH + {0x9AD1, 0x6C00}, //4895 #CJK UNIFIED IDEOGRAPH + {0x9AD2, 0x6C01}, //4896 #CJK UNIFIED IDEOGRAPH + {0x9AD3, 0x6C02}, //4897 #CJK UNIFIED IDEOGRAPH + {0x9AD4, 0x6C03}, //4898 #CJK UNIFIED IDEOGRAPH + {0x9AD5, 0x6C04}, //4899 #CJK UNIFIED IDEOGRAPH + {0x9AD6, 0x6C08}, //4900 #CJK UNIFIED IDEOGRAPH + {0x9AD7, 0x6C09}, //4901 #CJK UNIFIED IDEOGRAPH + {0x9AD8, 0x6C0A}, //4902 #CJK UNIFIED IDEOGRAPH + {0x9AD9, 0x6C0B}, //4903 #CJK UNIFIED IDEOGRAPH + {0x9ADA, 0x6C0C}, //4904 #CJK UNIFIED IDEOGRAPH + {0x9ADB, 0x6C0E}, //4905 #CJK UNIFIED IDEOGRAPH + {0x9ADC, 0x6C12}, //4906 #CJK UNIFIED IDEOGRAPH + {0x9ADD, 0x6C17}, //4907 #CJK UNIFIED IDEOGRAPH + {0x9ADE, 0x6C1C}, //4908 #CJK UNIFIED IDEOGRAPH + {0x9ADF, 0x6C1D}, //4909 #CJK UNIFIED IDEOGRAPH + {0x9AE0, 0x6C1E}, //4910 #CJK UNIFIED IDEOGRAPH + {0x9AE1, 0x6C20}, //4911 #CJK UNIFIED IDEOGRAPH + {0x9AE2, 0x6C23}, //4912 #CJK UNIFIED IDEOGRAPH + {0x9AE3, 0x6C25}, //4913 #CJK UNIFIED IDEOGRAPH + {0x9AE4, 0x6C2B}, //4914 #CJK UNIFIED IDEOGRAPH + {0x9AE5, 0x6C2C}, //4915 #CJK UNIFIED IDEOGRAPH + {0x9AE6, 0x6C2D}, //4916 #CJK UNIFIED IDEOGRAPH + {0x9AE7, 0x6C31}, //4917 #CJK UNIFIED IDEOGRAPH + {0x9AE8, 0x6C33}, //4918 #CJK UNIFIED IDEOGRAPH + {0x9AE9, 0x6C36}, //4919 #CJK UNIFIED IDEOGRAPH + {0x9AEA, 0x6C37}, //4920 #CJK UNIFIED IDEOGRAPH + {0x9AEB, 0x6C39}, //4921 #CJK UNIFIED IDEOGRAPH + {0x9AEC, 0x6C3A}, //4922 #CJK UNIFIED IDEOGRAPH + {0x9AED, 0x6C3B}, //4923 #CJK UNIFIED IDEOGRAPH + {0x9AEE, 0x6C3C}, //4924 #CJK UNIFIED IDEOGRAPH + {0x9AEF, 0x6C3E}, //4925 #CJK UNIFIED IDEOGRAPH + {0x9AF0, 0x6C3F}, //4926 #CJK UNIFIED IDEOGRAPH + {0x9AF1, 0x6C43}, //4927 #CJK UNIFIED IDEOGRAPH + {0x9AF2, 0x6C44}, //4928 #CJK UNIFIED IDEOGRAPH + {0x9AF3, 0x6C45}, //4929 #CJK UNIFIED IDEOGRAPH + {0x9AF4, 0x6C48}, //4930 #CJK UNIFIED IDEOGRAPH + {0x9AF5, 0x6C4B}, //4931 #CJK UNIFIED IDEOGRAPH + {0x9AF6, 0x6C4C}, //4932 #CJK UNIFIED IDEOGRAPH + {0x9AF7, 0x6C4D}, //4933 #CJK UNIFIED IDEOGRAPH + {0x9AF8, 0x6C4E}, //4934 #CJK UNIFIED IDEOGRAPH + {0x9AF9, 0x6C4F}, //4935 #CJK UNIFIED IDEOGRAPH + {0x9AFA, 0x6C51}, //4936 #CJK UNIFIED IDEOGRAPH + {0x9AFB, 0x6C52}, //4937 #CJK UNIFIED IDEOGRAPH + {0x9AFC, 0x6C53}, //4938 #CJK UNIFIED IDEOGRAPH + {0x9AFD, 0x6C56}, //4939 #CJK UNIFIED IDEOGRAPH + {0x9AFE, 0x6C58}, //4940 #CJK UNIFIED IDEOGRAPH + {0x9B40, 0x6C59}, //4941 #CJK UNIFIED IDEOGRAPH + {0x9B41, 0x6C5A}, //4942 #CJK UNIFIED IDEOGRAPH + {0x9B42, 0x6C62}, //4943 #CJK UNIFIED IDEOGRAPH + {0x9B43, 0x6C63}, //4944 #CJK UNIFIED IDEOGRAPH + {0x9B44, 0x6C65}, //4945 #CJK UNIFIED IDEOGRAPH + {0x9B45, 0x6C66}, //4946 #CJK UNIFIED IDEOGRAPH + {0x9B46, 0x6C67}, //4947 #CJK UNIFIED IDEOGRAPH + {0x9B47, 0x6C6B}, //4948 #CJK UNIFIED IDEOGRAPH + {0x9B48, 0x6C6C}, //4949 #CJK UNIFIED IDEOGRAPH + {0x9B49, 0x6C6D}, //4950 #CJK UNIFIED IDEOGRAPH + {0x9B4A, 0x6C6E}, //4951 #CJK UNIFIED IDEOGRAPH + {0x9B4B, 0x6C6F}, //4952 #CJK UNIFIED IDEOGRAPH + {0x9B4C, 0x6C71}, //4953 #CJK UNIFIED IDEOGRAPH + {0x9B4D, 0x6C73}, //4954 #CJK UNIFIED IDEOGRAPH + {0x9B4E, 0x6C75}, //4955 #CJK UNIFIED IDEOGRAPH + {0x9B4F, 0x6C77}, //4956 #CJK UNIFIED IDEOGRAPH + {0x9B50, 0x6C78}, //4957 #CJK UNIFIED IDEOGRAPH + {0x9B51, 0x6C7A}, //4958 #CJK UNIFIED IDEOGRAPH + {0x9B52, 0x6C7B}, //4959 #CJK UNIFIED IDEOGRAPH + {0x9B53, 0x6C7C}, //4960 #CJK UNIFIED IDEOGRAPH + {0x9B54, 0x6C7F}, //4961 #CJK UNIFIED IDEOGRAPH + {0x9B55, 0x6C80}, //4962 #CJK UNIFIED IDEOGRAPH + {0x9B56, 0x6C84}, //4963 #CJK UNIFIED IDEOGRAPH + {0x9B57, 0x6C87}, //4964 #CJK UNIFIED IDEOGRAPH + {0x9B58, 0x6C8A}, //4965 #CJK UNIFIED IDEOGRAPH + {0x9B59, 0x6C8B}, //4966 #CJK UNIFIED IDEOGRAPH + {0x9B5A, 0x6C8D}, //4967 #CJK UNIFIED IDEOGRAPH + {0x9B5B, 0x6C8E}, //4968 #CJK UNIFIED IDEOGRAPH + {0x9B5C, 0x6C91}, //4969 #CJK UNIFIED IDEOGRAPH + {0x9B5D, 0x6C92}, //4970 #CJK UNIFIED IDEOGRAPH + {0x9B5E, 0x6C95}, //4971 #CJK UNIFIED IDEOGRAPH + {0x9B5F, 0x6C96}, //4972 #CJK UNIFIED IDEOGRAPH + {0x9B60, 0x6C97}, //4973 #CJK UNIFIED IDEOGRAPH + {0x9B61, 0x6C98}, //4974 #CJK UNIFIED IDEOGRAPH + {0x9B62, 0x6C9A}, //4975 #CJK UNIFIED IDEOGRAPH + {0x9B63, 0x6C9C}, //4976 #CJK UNIFIED IDEOGRAPH + {0x9B64, 0x6C9D}, //4977 #CJK UNIFIED IDEOGRAPH + {0x9B65, 0x6C9E}, //4978 #CJK UNIFIED IDEOGRAPH + {0x9B66, 0x6CA0}, //4979 #CJK UNIFIED IDEOGRAPH + {0x9B67, 0x6CA2}, //4980 #CJK UNIFIED IDEOGRAPH + {0x9B68, 0x6CA8}, //4981 #CJK UNIFIED IDEOGRAPH + {0x9B69, 0x6CAC}, //4982 #CJK UNIFIED IDEOGRAPH + {0x9B6A, 0x6CAF}, //4983 #CJK UNIFIED IDEOGRAPH + {0x9B6B, 0x6CB0}, //4984 #CJK UNIFIED IDEOGRAPH + {0x9B6C, 0x6CB4}, //4985 #CJK UNIFIED IDEOGRAPH + {0x9B6D, 0x6CB5}, //4986 #CJK UNIFIED IDEOGRAPH + {0x9B6E, 0x6CB6}, //4987 #CJK UNIFIED IDEOGRAPH + {0x9B6F, 0x6CB7}, //4988 #CJK UNIFIED IDEOGRAPH + {0x9B70, 0x6CBA}, //4989 #CJK UNIFIED IDEOGRAPH + {0x9B71, 0x6CC0}, //4990 #CJK UNIFIED IDEOGRAPH + {0x9B72, 0x6CC1}, //4991 #CJK UNIFIED IDEOGRAPH + {0x9B73, 0x6CC2}, //4992 #CJK UNIFIED IDEOGRAPH + {0x9B74, 0x6CC3}, //4993 #CJK UNIFIED IDEOGRAPH + {0x9B75, 0x6CC6}, //4994 #CJK UNIFIED IDEOGRAPH + {0x9B76, 0x6CC7}, //4995 #CJK UNIFIED IDEOGRAPH + {0x9B77, 0x6CC8}, //4996 #CJK UNIFIED IDEOGRAPH + {0x9B78, 0x6CCB}, //4997 #CJK UNIFIED IDEOGRAPH + {0x9B79, 0x6CCD}, //4998 #CJK UNIFIED IDEOGRAPH + {0x9B7A, 0x6CCE}, //4999 #CJK UNIFIED IDEOGRAPH + {0x9B7B, 0x6CCF}, //5000 #CJK UNIFIED IDEOGRAPH + {0x9B7C, 0x6CD1}, //5001 #CJK UNIFIED IDEOGRAPH + {0x9B7D, 0x6CD2}, //5002 #CJK UNIFIED IDEOGRAPH + {0x9B7E, 0x6CD8}, //5003 #CJK UNIFIED IDEOGRAPH + {0x9B80, 0x6CD9}, //5004 #CJK UNIFIED IDEOGRAPH + {0x9B81, 0x6CDA}, //5005 #CJK UNIFIED IDEOGRAPH + {0x9B82, 0x6CDC}, //5006 #CJK UNIFIED IDEOGRAPH + {0x9B83, 0x6CDD}, //5007 #CJK UNIFIED IDEOGRAPH + {0x9B84, 0x6CDF}, //5008 #CJK UNIFIED IDEOGRAPH + {0x9B85, 0x6CE4}, //5009 #CJK UNIFIED IDEOGRAPH + {0x9B86, 0x6CE6}, //5010 #CJK UNIFIED IDEOGRAPH + {0x9B87, 0x6CE7}, //5011 #CJK UNIFIED IDEOGRAPH + {0x9B88, 0x6CE9}, //5012 #CJK UNIFIED IDEOGRAPH + {0x9B89, 0x6CEC}, //5013 #CJK UNIFIED IDEOGRAPH + {0x9B8A, 0x6CED}, //5014 #CJK UNIFIED IDEOGRAPH + {0x9B8B, 0x6CF2}, //5015 #CJK UNIFIED IDEOGRAPH + {0x9B8C, 0x6CF4}, //5016 #CJK UNIFIED IDEOGRAPH + {0x9B8D, 0x6CF9}, //5017 #CJK UNIFIED IDEOGRAPH + {0x9B8E, 0x6CFF}, //5018 #CJK UNIFIED IDEOGRAPH + {0x9B8F, 0x6D00}, //5019 #CJK UNIFIED IDEOGRAPH + {0x9B90, 0x6D02}, //5020 #CJK UNIFIED IDEOGRAPH + {0x9B91, 0x6D03}, //5021 #CJK UNIFIED IDEOGRAPH + {0x9B92, 0x6D05}, //5022 #CJK UNIFIED IDEOGRAPH + {0x9B93, 0x6D06}, //5023 #CJK UNIFIED IDEOGRAPH + {0x9B94, 0x6D08}, //5024 #CJK UNIFIED IDEOGRAPH + {0x9B95, 0x6D09}, //5025 #CJK UNIFIED IDEOGRAPH + {0x9B96, 0x6D0A}, //5026 #CJK UNIFIED IDEOGRAPH + {0x9B97, 0x6D0D}, //5027 #CJK UNIFIED IDEOGRAPH + {0x9B98, 0x6D0F}, //5028 #CJK UNIFIED IDEOGRAPH + {0x9B99, 0x6D10}, //5029 #CJK UNIFIED IDEOGRAPH + {0x9B9A, 0x6D11}, //5030 #CJK UNIFIED IDEOGRAPH + {0x9B9B, 0x6D13}, //5031 #CJK UNIFIED IDEOGRAPH + {0x9B9C, 0x6D14}, //5032 #CJK UNIFIED IDEOGRAPH + {0x9B9D, 0x6D15}, //5033 #CJK UNIFIED IDEOGRAPH + {0x9B9E, 0x6D16}, //5034 #CJK UNIFIED IDEOGRAPH + {0x9B9F, 0x6D18}, //5035 #CJK UNIFIED IDEOGRAPH + {0x9BA0, 0x6D1C}, //5036 #CJK UNIFIED IDEOGRAPH + {0x9BA1, 0x6D1D}, //5037 #CJK UNIFIED IDEOGRAPH + {0x9BA2, 0x6D1F}, //5038 #CJK UNIFIED IDEOGRAPH + {0x9BA3, 0x6D20}, //5039 #CJK UNIFIED IDEOGRAPH + {0x9BA4, 0x6D21}, //5040 #CJK UNIFIED IDEOGRAPH + {0x9BA5, 0x6D22}, //5041 #CJK UNIFIED IDEOGRAPH + {0x9BA6, 0x6D23}, //5042 #CJK UNIFIED IDEOGRAPH + {0x9BA7, 0x6D24}, //5043 #CJK UNIFIED IDEOGRAPH + {0x9BA8, 0x6D26}, //5044 #CJK UNIFIED IDEOGRAPH + {0x9BA9, 0x6D28}, //5045 #CJK UNIFIED IDEOGRAPH + {0x9BAA, 0x6D29}, //5046 #CJK UNIFIED IDEOGRAPH + {0x9BAB, 0x6D2C}, //5047 #CJK UNIFIED IDEOGRAPH + {0x9BAC, 0x6D2D}, //5048 #CJK UNIFIED IDEOGRAPH + {0x9BAD, 0x6D2F}, //5049 #CJK UNIFIED IDEOGRAPH + {0x9BAE, 0x6D30}, //5050 #CJK UNIFIED IDEOGRAPH + {0x9BAF, 0x6D34}, //5051 #CJK UNIFIED IDEOGRAPH + {0x9BB0, 0x6D36}, //5052 #CJK UNIFIED IDEOGRAPH + {0x9BB1, 0x6D37}, //5053 #CJK UNIFIED IDEOGRAPH + {0x9BB2, 0x6D38}, //5054 #CJK UNIFIED IDEOGRAPH + {0x9BB3, 0x6D3A}, //5055 #CJK UNIFIED IDEOGRAPH + {0x9BB4, 0x6D3F}, //5056 #CJK UNIFIED IDEOGRAPH + {0x9BB5, 0x6D40}, //5057 #CJK UNIFIED IDEOGRAPH + {0x9BB6, 0x6D42}, //5058 #CJK UNIFIED IDEOGRAPH + {0x9BB7, 0x6D44}, //5059 #CJK UNIFIED IDEOGRAPH + {0x9BB8, 0x6D49}, //5060 #CJK UNIFIED IDEOGRAPH + {0x9BB9, 0x6D4C}, //5061 #CJK UNIFIED IDEOGRAPH + {0x9BBA, 0x6D50}, //5062 #CJK UNIFIED IDEOGRAPH + {0x9BBB, 0x6D55}, //5063 #CJK UNIFIED IDEOGRAPH + {0x9BBC, 0x6D56}, //5064 #CJK UNIFIED IDEOGRAPH + {0x9BBD, 0x6D57}, //5065 #CJK UNIFIED IDEOGRAPH + {0x9BBE, 0x6D58}, //5066 #CJK UNIFIED IDEOGRAPH + {0x9BBF, 0x6D5B}, //5067 #CJK UNIFIED IDEOGRAPH + {0x9BC0, 0x6D5D}, //5068 #CJK UNIFIED IDEOGRAPH + {0x9BC1, 0x6D5F}, //5069 #CJK UNIFIED IDEOGRAPH + {0x9BC2, 0x6D61}, //5070 #CJK UNIFIED IDEOGRAPH + {0x9BC3, 0x6D62}, //5071 #CJK UNIFIED IDEOGRAPH + {0x9BC4, 0x6D64}, //5072 #CJK UNIFIED IDEOGRAPH + {0x9BC5, 0x6D65}, //5073 #CJK UNIFIED IDEOGRAPH + {0x9BC6, 0x6D67}, //5074 #CJK UNIFIED IDEOGRAPH + {0x9BC7, 0x6D68}, //5075 #CJK UNIFIED IDEOGRAPH + {0x9BC8, 0x6D6B}, //5076 #CJK UNIFIED IDEOGRAPH + {0x9BC9, 0x6D6C}, //5077 #CJK UNIFIED IDEOGRAPH + {0x9BCA, 0x6D6D}, //5078 #CJK UNIFIED IDEOGRAPH + {0x9BCB, 0x6D70}, //5079 #CJK UNIFIED IDEOGRAPH + {0x9BCC, 0x6D71}, //5080 #CJK UNIFIED IDEOGRAPH + {0x9BCD, 0x6D72}, //5081 #CJK UNIFIED IDEOGRAPH + {0x9BCE, 0x6D73}, //5082 #CJK UNIFIED IDEOGRAPH + {0x9BCF, 0x6D75}, //5083 #CJK UNIFIED IDEOGRAPH + {0x9BD0, 0x6D76}, //5084 #CJK UNIFIED IDEOGRAPH + {0x9BD1, 0x6D79}, //5085 #CJK UNIFIED IDEOGRAPH + {0x9BD2, 0x6D7A}, //5086 #CJK UNIFIED IDEOGRAPH + {0x9BD3, 0x6D7B}, //5087 #CJK UNIFIED IDEOGRAPH + {0x9BD4, 0x6D7D}, //5088 #CJK UNIFIED IDEOGRAPH + {0x9BD5, 0x6D7E}, //5089 #CJK UNIFIED IDEOGRAPH + {0x9BD6, 0x6D7F}, //5090 #CJK UNIFIED IDEOGRAPH + {0x9BD7, 0x6D80}, //5091 #CJK UNIFIED IDEOGRAPH + {0x9BD8, 0x6D81}, //5092 #CJK UNIFIED IDEOGRAPH + {0x9BD9, 0x6D83}, //5093 #CJK UNIFIED IDEOGRAPH + {0x9BDA, 0x6D84}, //5094 #CJK UNIFIED IDEOGRAPH + {0x9BDB, 0x6D86}, //5095 #CJK UNIFIED IDEOGRAPH + {0x9BDC, 0x6D87}, //5096 #CJK UNIFIED IDEOGRAPH + {0x9BDD, 0x6D8A}, //5097 #CJK UNIFIED IDEOGRAPH + {0x9BDE, 0x6D8B}, //5098 #CJK UNIFIED IDEOGRAPH + {0x9BDF, 0x6D8D}, //5099 #CJK UNIFIED IDEOGRAPH + {0x9BE0, 0x6D8F}, //5100 #CJK UNIFIED IDEOGRAPH + {0x9BE1, 0x6D90}, //5101 #CJK UNIFIED IDEOGRAPH + {0x9BE2, 0x6D92}, //5102 #CJK UNIFIED IDEOGRAPH + {0x9BE3, 0x6D96}, //5103 #CJK UNIFIED IDEOGRAPH + {0x9BE4, 0x6D97}, //5104 #CJK UNIFIED IDEOGRAPH + {0x9BE5, 0x6D98}, //5105 #CJK UNIFIED IDEOGRAPH + {0x9BE6, 0x6D99}, //5106 #CJK UNIFIED IDEOGRAPH + {0x9BE7, 0x6D9A}, //5107 #CJK UNIFIED IDEOGRAPH + {0x9BE8, 0x6D9C}, //5108 #CJK UNIFIED IDEOGRAPH + {0x9BE9, 0x6DA2}, //5109 #CJK UNIFIED IDEOGRAPH + {0x9BEA, 0x6DA5}, //5110 #CJK UNIFIED IDEOGRAPH + {0x9BEB, 0x6DAC}, //5111 #CJK UNIFIED IDEOGRAPH + {0x9BEC, 0x6DAD}, //5112 #CJK UNIFIED IDEOGRAPH + {0x9BED, 0x6DB0}, //5113 #CJK UNIFIED IDEOGRAPH + {0x9BEE, 0x6DB1}, //5114 #CJK UNIFIED IDEOGRAPH + {0x9BEF, 0x6DB3}, //5115 #CJK UNIFIED IDEOGRAPH + {0x9BF0, 0x6DB4}, //5116 #CJK UNIFIED IDEOGRAPH + {0x9BF1, 0x6DB6}, //5117 #CJK UNIFIED IDEOGRAPH + {0x9BF2, 0x6DB7}, //5118 #CJK UNIFIED IDEOGRAPH + {0x9BF3, 0x6DB9}, //5119 #CJK UNIFIED IDEOGRAPH + {0x9BF4, 0x6DBA}, //5120 #CJK UNIFIED IDEOGRAPH + {0x9BF5, 0x6DBB}, //5121 #CJK UNIFIED IDEOGRAPH + {0x9BF6, 0x6DBC}, //5122 #CJK UNIFIED IDEOGRAPH + {0x9BF7, 0x6DBD}, //5123 #CJK UNIFIED IDEOGRAPH + {0x9BF8, 0x6DBE}, //5124 #CJK UNIFIED IDEOGRAPH + {0x9BF9, 0x6DC1}, //5125 #CJK UNIFIED IDEOGRAPH + {0x9BFA, 0x6DC2}, //5126 #CJK UNIFIED IDEOGRAPH + {0x9BFB, 0x6DC3}, //5127 #CJK UNIFIED IDEOGRAPH + {0x9BFC, 0x6DC8}, //5128 #CJK UNIFIED IDEOGRAPH + {0x9BFD, 0x6DC9}, //5129 #CJK UNIFIED IDEOGRAPH + {0x9BFE, 0x6DCA}, //5130 #CJK UNIFIED IDEOGRAPH + {0x9C40, 0x6DCD}, //5131 #CJK UNIFIED IDEOGRAPH + {0x9C41, 0x6DCE}, //5132 #CJK UNIFIED IDEOGRAPH + {0x9C42, 0x6DCF}, //5133 #CJK UNIFIED IDEOGRAPH + {0x9C43, 0x6DD0}, //5134 #CJK UNIFIED IDEOGRAPH + {0x9C44, 0x6DD2}, //5135 #CJK UNIFIED IDEOGRAPH + {0x9C45, 0x6DD3}, //5136 #CJK UNIFIED IDEOGRAPH + {0x9C46, 0x6DD4}, //5137 #CJK UNIFIED IDEOGRAPH + {0x9C47, 0x6DD5}, //5138 #CJK UNIFIED IDEOGRAPH + {0x9C48, 0x6DD7}, //5139 #CJK UNIFIED IDEOGRAPH + {0x9C49, 0x6DDA}, //5140 #CJK UNIFIED IDEOGRAPH + {0x9C4A, 0x6DDB}, //5141 #CJK UNIFIED IDEOGRAPH + {0x9C4B, 0x6DDC}, //5142 #CJK UNIFIED IDEOGRAPH + {0x9C4C, 0x6DDF}, //5143 #CJK UNIFIED IDEOGRAPH + {0x9C4D, 0x6DE2}, //5144 #CJK UNIFIED IDEOGRAPH + {0x9C4E, 0x6DE3}, //5145 #CJK UNIFIED IDEOGRAPH + {0x9C4F, 0x6DE5}, //5146 #CJK UNIFIED IDEOGRAPH + {0x9C50, 0x6DE7}, //5147 #CJK UNIFIED IDEOGRAPH + {0x9C51, 0x6DE8}, //5148 #CJK UNIFIED IDEOGRAPH + {0x9C52, 0x6DE9}, //5149 #CJK UNIFIED IDEOGRAPH + {0x9C53, 0x6DEA}, //5150 #CJK UNIFIED IDEOGRAPH + {0x9C54, 0x6DED}, //5151 #CJK UNIFIED IDEOGRAPH + {0x9C55, 0x6DEF}, //5152 #CJK UNIFIED IDEOGRAPH + {0x9C56, 0x6DF0}, //5153 #CJK UNIFIED IDEOGRAPH + {0x9C57, 0x6DF2}, //5154 #CJK UNIFIED IDEOGRAPH + {0x9C58, 0x6DF4}, //5155 #CJK UNIFIED IDEOGRAPH + {0x9C59, 0x6DF5}, //5156 #CJK UNIFIED IDEOGRAPH + {0x9C5A, 0x6DF6}, //5157 #CJK UNIFIED IDEOGRAPH + {0x9C5B, 0x6DF8}, //5158 #CJK UNIFIED IDEOGRAPH + {0x9C5C, 0x6DFA}, //5159 #CJK UNIFIED IDEOGRAPH + {0x9C5D, 0x6DFD}, //5160 #CJK UNIFIED IDEOGRAPH + {0x9C5E, 0x6DFE}, //5161 #CJK UNIFIED IDEOGRAPH + {0x9C5F, 0x6DFF}, //5162 #CJK UNIFIED IDEOGRAPH + {0x9C60, 0x6E00}, //5163 #CJK UNIFIED IDEOGRAPH + {0x9C61, 0x6E01}, //5164 #CJK UNIFIED IDEOGRAPH + {0x9C62, 0x6E02}, //5165 #CJK UNIFIED IDEOGRAPH + {0x9C63, 0x6E03}, //5166 #CJK UNIFIED IDEOGRAPH + {0x9C64, 0x6E04}, //5167 #CJK UNIFIED IDEOGRAPH + {0x9C65, 0x6E06}, //5168 #CJK UNIFIED IDEOGRAPH + {0x9C66, 0x6E07}, //5169 #CJK UNIFIED IDEOGRAPH + {0x9C67, 0x6E08}, //5170 #CJK UNIFIED IDEOGRAPH + {0x9C68, 0x6E09}, //5171 #CJK UNIFIED IDEOGRAPH + {0x9C69, 0x6E0B}, //5172 #CJK UNIFIED IDEOGRAPH + {0x9C6A, 0x6E0F}, //5173 #CJK UNIFIED IDEOGRAPH + {0x9C6B, 0x6E12}, //5174 #CJK UNIFIED IDEOGRAPH + {0x9C6C, 0x6E13}, //5175 #CJK UNIFIED IDEOGRAPH + {0x9C6D, 0x6E15}, //5176 #CJK UNIFIED IDEOGRAPH + {0x9C6E, 0x6E18}, //5177 #CJK UNIFIED IDEOGRAPH + {0x9C6F, 0x6E19}, //5178 #CJK UNIFIED IDEOGRAPH + {0x9C70, 0x6E1B}, //5179 #CJK UNIFIED IDEOGRAPH + {0x9C71, 0x6E1C}, //5180 #CJK UNIFIED IDEOGRAPH + {0x9C72, 0x6E1E}, //5181 #CJK UNIFIED IDEOGRAPH + {0x9C73, 0x6E1F}, //5182 #CJK UNIFIED IDEOGRAPH + {0x9C74, 0x6E22}, //5183 #CJK UNIFIED IDEOGRAPH + {0x9C75, 0x6E26}, //5184 #CJK UNIFIED IDEOGRAPH + {0x9C76, 0x6E27}, //5185 #CJK UNIFIED IDEOGRAPH + {0x9C77, 0x6E28}, //5186 #CJK UNIFIED IDEOGRAPH + {0x9C78, 0x6E2A}, //5187 #CJK UNIFIED IDEOGRAPH + {0x9C79, 0x6E2C}, //5188 #CJK UNIFIED IDEOGRAPH + {0x9C7A, 0x6E2E}, //5189 #CJK UNIFIED IDEOGRAPH + {0x9C7B, 0x6E30}, //5190 #CJK UNIFIED IDEOGRAPH + {0x9C7C, 0x6E31}, //5191 #CJK UNIFIED IDEOGRAPH + {0x9C7D, 0x6E33}, //5192 #CJK UNIFIED IDEOGRAPH + {0x9C7E, 0x6E35}, //5193 #CJK UNIFIED IDEOGRAPH + {0x9C80, 0x6E36}, //5194 #CJK UNIFIED IDEOGRAPH + {0x9C81, 0x6E37}, //5195 #CJK UNIFIED IDEOGRAPH + {0x9C82, 0x6E39}, //5196 #CJK UNIFIED IDEOGRAPH + {0x9C83, 0x6E3B}, //5197 #CJK UNIFIED IDEOGRAPH + {0x9C84, 0x6E3C}, //5198 #CJK UNIFIED IDEOGRAPH + {0x9C85, 0x6E3D}, //5199 #CJK UNIFIED IDEOGRAPH + {0x9C86, 0x6E3E}, //5200 #CJK UNIFIED IDEOGRAPH + {0x9C87, 0x6E3F}, //5201 #CJK UNIFIED IDEOGRAPH + {0x9C88, 0x6E40}, //5202 #CJK UNIFIED IDEOGRAPH + {0x9C89, 0x6E41}, //5203 #CJK UNIFIED IDEOGRAPH + {0x9C8A, 0x6E42}, //5204 #CJK UNIFIED IDEOGRAPH + {0x9C8B, 0x6E45}, //5205 #CJK UNIFIED IDEOGRAPH + {0x9C8C, 0x6E46}, //5206 #CJK UNIFIED IDEOGRAPH + {0x9C8D, 0x6E47}, //5207 #CJK UNIFIED IDEOGRAPH + {0x9C8E, 0x6E48}, //5208 #CJK UNIFIED IDEOGRAPH + {0x9C8F, 0x6E49}, //5209 #CJK UNIFIED IDEOGRAPH + {0x9C90, 0x6E4A}, //5210 #CJK UNIFIED IDEOGRAPH + {0x9C91, 0x6E4B}, //5211 #CJK UNIFIED IDEOGRAPH + {0x9C92, 0x6E4C}, //5212 #CJK UNIFIED IDEOGRAPH + {0x9C93, 0x6E4F}, //5213 #CJK UNIFIED IDEOGRAPH + {0x9C94, 0x6E50}, //5214 #CJK UNIFIED IDEOGRAPH + {0x9C95, 0x6E51}, //5215 #CJK UNIFIED IDEOGRAPH + {0x9C96, 0x6E52}, //5216 #CJK UNIFIED IDEOGRAPH + {0x9C97, 0x6E55}, //5217 #CJK UNIFIED IDEOGRAPH + {0x9C98, 0x6E57}, //5218 #CJK UNIFIED IDEOGRAPH + {0x9C99, 0x6E59}, //5219 #CJK UNIFIED IDEOGRAPH + {0x9C9A, 0x6E5A}, //5220 #CJK UNIFIED IDEOGRAPH + {0x9C9B, 0x6E5C}, //5221 #CJK UNIFIED IDEOGRAPH + {0x9C9C, 0x6E5D}, //5222 #CJK UNIFIED IDEOGRAPH + {0x9C9D, 0x6E5E}, //5223 #CJK UNIFIED IDEOGRAPH + {0x9C9E, 0x6E60}, //5224 #CJK UNIFIED IDEOGRAPH + {0x9C9F, 0x6E61}, //5225 #CJK UNIFIED IDEOGRAPH + {0x9CA0, 0x6E62}, //5226 #CJK UNIFIED IDEOGRAPH + {0x9CA1, 0x6E63}, //5227 #CJK UNIFIED IDEOGRAPH + {0x9CA2, 0x6E64}, //5228 #CJK UNIFIED IDEOGRAPH + {0x9CA3, 0x6E65}, //5229 #CJK UNIFIED IDEOGRAPH + {0x9CA4, 0x6E66}, //5230 #CJK UNIFIED IDEOGRAPH + {0x9CA5, 0x6E67}, //5231 #CJK UNIFIED IDEOGRAPH + {0x9CA6, 0x6E68}, //5232 #CJK UNIFIED IDEOGRAPH + {0x9CA7, 0x6E69}, //5233 #CJK UNIFIED IDEOGRAPH + {0x9CA8, 0x6E6A}, //5234 #CJK UNIFIED IDEOGRAPH + {0x9CA9, 0x6E6C}, //5235 #CJK UNIFIED IDEOGRAPH + {0x9CAA, 0x6E6D}, //5236 #CJK UNIFIED IDEOGRAPH + {0x9CAB, 0x6E6F}, //5237 #CJK UNIFIED IDEOGRAPH + {0x9CAC, 0x6E70}, //5238 #CJK UNIFIED IDEOGRAPH + {0x9CAD, 0x6E71}, //5239 #CJK UNIFIED IDEOGRAPH + {0x9CAE, 0x6E72}, //5240 #CJK UNIFIED IDEOGRAPH + {0x9CAF, 0x6E73}, //5241 #CJK UNIFIED IDEOGRAPH + {0x9CB0, 0x6E74}, //5242 #CJK UNIFIED IDEOGRAPH + {0x9CB1, 0x6E75}, //5243 #CJK UNIFIED IDEOGRAPH + {0x9CB2, 0x6E76}, //5244 #CJK UNIFIED IDEOGRAPH + {0x9CB3, 0x6E77}, //5245 #CJK UNIFIED IDEOGRAPH + {0x9CB4, 0x6E78}, //5246 #CJK UNIFIED IDEOGRAPH + {0x9CB5, 0x6E79}, //5247 #CJK UNIFIED IDEOGRAPH + {0x9CB6, 0x6E7A}, //5248 #CJK UNIFIED IDEOGRAPH + {0x9CB7, 0x6E7B}, //5249 #CJK UNIFIED IDEOGRAPH + {0x9CB8, 0x6E7C}, //5250 #CJK UNIFIED IDEOGRAPH + {0x9CB9, 0x6E7D}, //5251 #CJK UNIFIED IDEOGRAPH + {0x9CBA, 0x6E80}, //5252 #CJK UNIFIED IDEOGRAPH + {0x9CBB, 0x6E81}, //5253 #CJK UNIFIED IDEOGRAPH + {0x9CBC, 0x6E82}, //5254 #CJK UNIFIED IDEOGRAPH + {0x9CBD, 0x6E84}, //5255 #CJK UNIFIED IDEOGRAPH + {0x9CBE, 0x6E87}, //5256 #CJK UNIFIED IDEOGRAPH + {0x9CBF, 0x6E88}, //5257 #CJK UNIFIED IDEOGRAPH + {0x9CC0, 0x6E8A}, //5258 #CJK UNIFIED IDEOGRAPH + {0x9CC1, 0x6E8B}, //5259 #CJK UNIFIED IDEOGRAPH + {0x9CC2, 0x6E8C}, //5260 #CJK UNIFIED IDEOGRAPH + {0x9CC3, 0x6E8D}, //5261 #CJK UNIFIED IDEOGRAPH + {0x9CC4, 0x6E8E}, //5262 #CJK UNIFIED IDEOGRAPH + {0x9CC5, 0x6E91}, //5263 #CJK UNIFIED IDEOGRAPH + {0x9CC6, 0x6E92}, //5264 #CJK UNIFIED IDEOGRAPH + {0x9CC7, 0x6E93}, //5265 #CJK UNIFIED IDEOGRAPH + {0x9CC8, 0x6E94}, //5266 #CJK UNIFIED IDEOGRAPH + {0x9CC9, 0x6E95}, //5267 #CJK UNIFIED IDEOGRAPH + {0x9CCA, 0x6E96}, //5268 #CJK UNIFIED IDEOGRAPH + {0x9CCB, 0x6E97}, //5269 #CJK UNIFIED IDEOGRAPH + {0x9CCC, 0x6E99}, //5270 #CJK UNIFIED IDEOGRAPH + {0x9CCD, 0x6E9A}, //5271 #CJK UNIFIED IDEOGRAPH + {0x9CCE, 0x6E9B}, //5272 #CJK UNIFIED IDEOGRAPH + {0x9CCF, 0x6E9D}, //5273 #CJK UNIFIED IDEOGRAPH + {0x9CD0, 0x6E9E}, //5274 #CJK UNIFIED IDEOGRAPH + {0x9CD1, 0x6EA0}, //5275 #CJK UNIFIED IDEOGRAPH + {0x9CD2, 0x6EA1}, //5276 #CJK UNIFIED IDEOGRAPH + {0x9CD3, 0x6EA3}, //5277 #CJK UNIFIED IDEOGRAPH + {0x9CD4, 0x6EA4}, //5278 #CJK UNIFIED IDEOGRAPH + {0x9CD5, 0x6EA6}, //5279 #CJK UNIFIED IDEOGRAPH + {0x9CD6, 0x6EA8}, //5280 #CJK UNIFIED IDEOGRAPH + {0x9CD7, 0x6EA9}, //5281 #CJK UNIFIED IDEOGRAPH + {0x9CD8, 0x6EAB}, //5282 #CJK UNIFIED IDEOGRAPH + {0x9CD9, 0x6EAC}, //5283 #CJK UNIFIED IDEOGRAPH + {0x9CDA, 0x6EAD}, //5284 #CJK UNIFIED IDEOGRAPH + {0x9CDB, 0x6EAE}, //5285 #CJK UNIFIED IDEOGRAPH + {0x9CDC, 0x6EB0}, //5286 #CJK UNIFIED IDEOGRAPH + {0x9CDD, 0x6EB3}, //5287 #CJK UNIFIED IDEOGRAPH + {0x9CDE, 0x6EB5}, //5288 #CJK UNIFIED IDEOGRAPH + {0x9CDF, 0x6EB8}, //5289 #CJK UNIFIED IDEOGRAPH + {0x9CE0, 0x6EB9}, //5290 #CJK UNIFIED IDEOGRAPH + {0x9CE1, 0x6EBC}, //5291 #CJK UNIFIED IDEOGRAPH + {0x9CE2, 0x6EBE}, //5292 #CJK UNIFIED IDEOGRAPH + {0x9CE3, 0x6EBF}, //5293 #CJK UNIFIED IDEOGRAPH + {0x9CE4, 0x6EC0}, //5294 #CJK UNIFIED IDEOGRAPH + {0x9CE5, 0x6EC3}, //5295 #CJK UNIFIED IDEOGRAPH + {0x9CE6, 0x6EC4}, //5296 #CJK UNIFIED IDEOGRAPH + {0x9CE7, 0x6EC5}, //5297 #CJK UNIFIED IDEOGRAPH + {0x9CE8, 0x6EC6}, //5298 #CJK UNIFIED IDEOGRAPH + {0x9CE9, 0x6EC8}, //5299 #CJK UNIFIED IDEOGRAPH + {0x9CEA, 0x6EC9}, //5300 #CJK UNIFIED IDEOGRAPH + {0x9CEB, 0x6ECA}, //5301 #CJK UNIFIED IDEOGRAPH + {0x9CEC, 0x6ECC}, //5302 #CJK UNIFIED IDEOGRAPH + {0x9CED, 0x6ECD}, //5303 #CJK UNIFIED IDEOGRAPH + {0x9CEE, 0x6ECE}, //5304 #CJK UNIFIED IDEOGRAPH + {0x9CEF, 0x6ED0}, //5305 #CJK UNIFIED IDEOGRAPH + {0x9CF0, 0x6ED2}, //5306 #CJK UNIFIED IDEOGRAPH + {0x9CF1, 0x6ED6}, //5307 #CJK UNIFIED IDEOGRAPH + {0x9CF2, 0x6ED8}, //5308 #CJK UNIFIED IDEOGRAPH + {0x9CF3, 0x6ED9}, //5309 #CJK UNIFIED IDEOGRAPH + {0x9CF4, 0x6EDB}, //5310 #CJK UNIFIED IDEOGRAPH + {0x9CF5, 0x6EDC}, //5311 #CJK UNIFIED IDEOGRAPH + {0x9CF6, 0x6EDD}, //5312 #CJK UNIFIED IDEOGRAPH + {0x9CF7, 0x6EE3}, //5313 #CJK UNIFIED IDEOGRAPH + {0x9CF8, 0x6EE7}, //5314 #CJK UNIFIED IDEOGRAPH + {0x9CF9, 0x6EEA}, //5315 #CJK UNIFIED IDEOGRAPH + {0x9CFA, 0x6EEB}, //5316 #CJK UNIFIED IDEOGRAPH + {0x9CFB, 0x6EEC}, //5317 #CJK UNIFIED IDEOGRAPH + {0x9CFC, 0x6EED}, //5318 #CJK UNIFIED IDEOGRAPH + {0x9CFD, 0x6EEE}, //5319 #CJK UNIFIED IDEOGRAPH + {0x9CFE, 0x6EEF}, //5320 #CJK UNIFIED IDEOGRAPH + {0x9D40, 0x6EF0}, //5321 #CJK UNIFIED IDEOGRAPH + {0x9D41, 0x6EF1}, //5322 #CJK UNIFIED IDEOGRAPH + {0x9D42, 0x6EF2}, //5323 #CJK UNIFIED IDEOGRAPH + {0x9D43, 0x6EF3}, //5324 #CJK UNIFIED IDEOGRAPH + {0x9D44, 0x6EF5}, //5325 #CJK UNIFIED IDEOGRAPH + {0x9D45, 0x6EF6}, //5326 #CJK UNIFIED IDEOGRAPH + {0x9D46, 0x6EF7}, //5327 #CJK UNIFIED IDEOGRAPH + {0x9D47, 0x6EF8}, //5328 #CJK UNIFIED IDEOGRAPH + {0x9D48, 0x6EFA}, //5329 #CJK UNIFIED IDEOGRAPH + {0x9D49, 0x6EFB}, //5330 #CJK UNIFIED IDEOGRAPH + {0x9D4A, 0x6EFC}, //5331 #CJK UNIFIED IDEOGRAPH + {0x9D4B, 0x6EFD}, //5332 #CJK UNIFIED IDEOGRAPH + {0x9D4C, 0x6EFE}, //5333 #CJK UNIFIED IDEOGRAPH + {0x9D4D, 0x6EFF}, //5334 #CJK UNIFIED IDEOGRAPH + {0x9D4E, 0x6F00}, //5335 #CJK UNIFIED IDEOGRAPH + {0x9D4F, 0x6F01}, //5336 #CJK UNIFIED IDEOGRAPH + {0x9D50, 0x6F03}, //5337 #CJK UNIFIED IDEOGRAPH + {0x9D51, 0x6F04}, //5338 #CJK UNIFIED IDEOGRAPH + {0x9D52, 0x6F05}, //5339 #CJK UNIFIED IDEOGRAPH + {0x9D53, 0x6F07}, //5340 #CJK UNIFIED IDEOGRAPH + {0x9D54, 0x6F08}, //5341 #CJK UNIFIED IDEOGRAPH + {0x9D55, 0x6F0A}, //5342 #CJK UNIFIED IDEOGRAPH + {0x9D56, 0x6F0B}, //5343 #CJK UNIFIED IDEOGRAPH + {0x9D57, 0x6F0C}, //5344 #CJK UNIFIED IDEOGRAPH + {0x9D58, 0x6F0D}, //5345 #CJK UNIFIED IDEOGRAPH + {0x9D59, 0x6F0E}, //5346 #CJK UNIFIED IDEOGRAPH + {0x9D5A, 0x6F10}, //5347 #CJK UNIFIED IDEOGRAPH + {0x9D5B, 0x6F11}, //5348 #CJK UNIFIED IDEOGRAPH + {0x9D5C, 0x6F12}, //5349 #CJK UNIFIED IDEOGRAPH + {0x9D5D, 0x6F16}, //5350 #CJK UNIFIED IDEOGRAPH + {0x9D5E, 0x6F17}, //5351 #CJK UNIFIED IDEOGRAPH + {0x9D5F, 0x6F18}, //5352 #CJK UNIFIED IDEOGRAPH + {0x9D60, 0x6F19}, //5353 #CJK UNIFIED IDEOGRAPH + {0x9D61, 0x6F1A}, //5354 #CJK UNIFIED IDEOGRAPH + {0x9D62, 0x6F1B}, //5355 #CJK UNIFIED IDEOGRAPH + {0x9D63, 0x6F1C}, //5356 #CJK UNIFIED IDEOGRAPH + {0x9D64, 0x6F1D}, //5357 #CJK UNIFIED IDEOGRAPH + {0x9D65, 0x6F1E}, //5358 #CJK UNIFIED IDEOGRAPH + {0x9D66, 0x6F1F}, //5359 #CJK UNIFIED IDEOGRAPH + {0x9D67, 0x6F21}, //5360 #CJK UNIFIED IDEOGRAPH + {0x9D68, 0x6F22}, //5361 #CJK UNIFIED IDEOGRAPH + {0x9D69, 0x6F23}, //5362 #CJK UNIFIED IDEOGRAPH + {0x9D6A, 0x6F25}, //5363 #CJK UNIFIED IDEOGRAPH + {0x9D6B, 0x6F26}, //5364 #CJK UNIFIED IDEOGRAPH + {0x9D6C, 0x6F27}, //5365 #CJK UNIFIED IDEOGRAPH + {0x9D6D, 0x6F28}, //5366 #CJK UNIFIED IDEOGRAPH + {0x9D6E, 0x6F2C}, //5367 #CJK UNIFIED IDEOGRAPH + {0x9D6F, 0x6F2E}, //5368 #CJK UNIFIED IDEOGRAPH + {0x9D70, 0x6F30}, //5369 #CJK UNIFIED IDEOGRAPH + {0x9D71, 0x6F32}, //5370 #CJK UNIFIED IDEOGRAPH + {0x9D72, 0x6F34}, //5371 #CJK UNIFIED IDEOGRAPH + {0x9D73, 0x6F35}, //5372 #CJK UNIFIED IDEOGRAPH + {0x9D74, 0x6F37}, //5373 #CJK UNIFIED IDEOGRAPH + {0x9D75, 0x6F38}, //5374 #CJK UNIFIED IDEOGRAPH + {0x9D76, 0x6F39}, //5375 #CJK UNIFIED IDEOGRAPH + {0x9D77, 0x6F3A}, //5376 #CJK UNIFIED IDEOGRAPH + {0x9D78, 0x6F3B}, //5377 #CJK UNIFIED IDEOGRAPH + {0x9D79, 0x6F3C}, //5378 #CJK UNIFIED IDEOGRAPH + {0x9D7A, 0x6F3D}, //5379 #CJK UNIFIED IDEOGRAPH + {0x9D7B, 0x6F3F}, //5380 #CJK UNIFIED IDEOGRAPH + {0x9D7C, 0x6F40}, //5381 #CJK UNIFIED IDEOGRAPH + {0x9D7D, 0x6F41}, //5382 #CJK UNIFIED IDEOGRAPH + {0x9D7E, 0x6F42}, //5383 #CJK UNIFIED IDEOGRAPH + {0x9D80, 0x6F43}, //5384 #CJK UNIFIED IDEOGRAPH + {0x9D81, 0x6F44}, //5385 #CJK UNIFIED IDEOGRAPH + {0x9D82, 0x6F45}, //5386 #CJK UNIFIED IDEOGRAPH + {0x9D83, 0x6F48}, //5387 #CJK UNIFIED IDEOGRAPH + {0x9D84, 0x6F49}, //5388 #CJK UNIFIED IDEOGRAPH + {0x9D85, 0x6F4A}, //5389 #CJK UNIFIED IDEOGRAPH + {0x9D86, 0x6F4C}, //5390 #CJK UNIFIED IDEOGRAPH + {0x9D87, 0x6F4E}, //5391 #CJK UNIFIED IDEOGRAPH + {0x9D88, 0x6F4F}, //5392 #CJK UNIFIED IDEOGRAPH + {0x9D89, 0x6F50}, //5393 #CJK UNIFIED IDEOGRAPH + {0x9D8A, 0x6F51}, //5394 #CJK UNIFIED IDEOGRAPH + {0x9D8B, 0x6F52}, //5395 #CJK UNIFIED IDEOGRAPH + {0x9D8C, 0x6F53}, //5396 #CJK UNIFIED IDEOGRAPH + {0x9D8D, 0x6F54}, //5397 #CJK UNIFIED IDEOGRAPH + {0x9D8E, 0x6F55}, //5398 #CJK UNIFIED IDEOGRAPH + {0x9D8F, 0x6F56}, //5399 #CJK UNIFIED IDEOGRAPH + {0x9D90, 0x6F57}, //5400 #CJK UNIFIED IDEOGRAPH + {0x9D91, 0x6F59}, //5401 #CJK UNIFIED IDEOGRAPH + {0x9D92, 0x6F5A}, //5402 #CJK UNIFIED IDEOGRAPH + {0x9D93, 0x6F5B}, //5403 #CJK UNIFIED IDEOGRAPH + {0x9D94, 0x6F5D}, //5404 #CJK UNIFIED IDEOGRAPH + {0x9D95, 0x6F5F}, //5405 #CJK UNIFIED IDEOGRAPH + {0x9D96, 0x6F60}, //5406 #CJK UNIFIED IDEOGRAPH + {0x9D97, 0x6F61}, //5407 #CJK UNIFIED IDEOGRAPH + {0x9D98, 0x6F63}, //5408 #CJK UNIFIED IDEOGRAPH + {0x9D99, 0x6F64}, //5409 #CJK UNIFIED IDEOGRAPH + {0x9D9A, 0x6F65}, //5410 #CJK UNIFIED IDEOGRAPH + {0x9D9B, 0x6F67}, //5411 #CJK UNIFIED IDEOGRAPH + {0x9D9C, 0x6F68}, //5412 #CJK UNIFIED IDEOGRAPH + {0x9D9D, 0x6F69}, //5413 #CJK UNIFIED IDEOGRAPH + {0x9D9E, 0x6F6A}, //5414 #CJK UNIFIED IDEOGRAPH + {0x9D9F, 0x6F6B}, //5415 #CJK UNIFIED IDEOGRAPH + {0x9DA0, 0x6F6C}, //5416 #CJK UNIFIED IDEOGRAPH + {0x9DA1, 0x6F6F}, //5417 #CJK UNIFIED IDEOGRAPH + {0x9DA2, 0x6F70}, //5418 #CJK UNIFIED IDEOGRAPH + {0x9DA3, 0x6F71}, //5419 #CJK UNIFIED IDEOGRAPH + {0x9DA4, 0x6F73}, //5420 #CJK UNIFIED IDEOGRAPH + {0x9DA5, 0x6F75}, //5421 #CJK UNIFIED IDEOGRAPH + {0x9DA6, 0x6F76}, //5422 #CJK UNIFIED IDEOGRAPH + {0x9DA7, 0x6F77}, //5423 #CJK UNIFIED IDEOGRAPH + {0x9DA8, 0x6F79}, //5424 #CJK UNIFIED IDEOGRAPH + {0x9DA9, 0x6F7B}, //5425 #CJK UNIFIED IDEOGRAPH + {0x9DAA, 0x6F7D}, //5426 #CJK UNIFIED IDEOGRAPH + {0x9DAB, 0x6F7E}, //5427 #CJK UNIFIED IDEOGRAPH + {0x9DAC, 0x6F7F}, //5428 #CJK UNIFIED IDEOGRAPH + {0x9DAD, 0x6F80}, //5429 #CJK UNIFIED IDEOGRAPH + {0x9DAE, 0x6F81}, //5430 #CJK UNIFIED IDEOGRAPH + {0x9DAF, 0x6F82}, //5431 #CJK UNIFIED IDEOGRAPH + {0x9DB0, 0x6F83}, //5432 #CJK UNIFIED IDEOGRAPH + {0x9DB1, 0x6F85}, //5433 #CJK UNIFIED IDEOGRAPH + {0x9DB2, 0x6F86}, //5434 #CJK UNIFIED IDEOGRAPH + {0x9DB3, 0x6F87}, //5435 #CJK UNIFIED IDEOGRAPH + {0x9DB4, 0x6F8A}, //5436 #CJK UNIFIED IDEOGRAPH + {0x9DB5, 0x6F8B}, //5437 #CJK UNIFIED IDEOGRAPH + {0x9DB6, 0x6F8F}, //5438 #CJK UNIFIED IDEOGRAPH + {0x9DB7, 0x6F90}, //5439 #CJK UNIFIED IDEOGRAPH + {0x9DB8, 0x6F91}, //5440 #CJK UNIFIED IDEOGRAPH + {0x9DB9, 0x6F92}, //5441 #CJK UNIFIED IDEOGRAPH + {0x9DBA, 0x6F93}, //5442 #CJK UNIFIED IDEOGRAPH + {0x9DBB, 0x6F94}, //5443 #CJK UNIFIED IDEOGRAPH + {0x9DBC, 0x6F95}, //5444 #CJK UNIFIED IDEOGRAPH + {0x9DBD, 0x6F96}, //5445 #CJK UNIFIED IDEOGRAPH + {0x9DBE, 0x6F97}, //5446 #CJK UNIFIED IDEOGRAPH + {0x9DBF, 0x6F98}, //5447 #CJK UNIFIED IDEOGRAPH + {0x9DC0, 0x6F99}, //5448 #CJK UNIFIED IDEOGRAPH + {0x9DC1, 0x6F9A}, //5449 #CJK UNIFIED IDEOGRAPH + {0x9DC2, 0x6F9B}, //5450 #CJK UNIFIED IDEOGRAPH + {0x9DC3, 0x6F9D}, //5451 #CJK UNIFIED IDEOGRAPH + {0x9DC4, 0x6F9E}, //5452 #CJK UNIFIED IDEOGRAPH + {0x9DC5, 0x6F9F}, //5453 #CJK UNIFIED IDEOGRAPH + {0x9DC6, 0x6FA0}, //5454 #CJK UNIFIED IDEOGRAPH + {0x9DC7, 0x6FA2}, //5455 #CJK UNIFIED IDEOGRAPH + {0x9DC8, 0x6FA3}, //5456 #CJK UNIFIED IDEOGRAPH + {0x9DC9, 0x6FA4}, //5457 #CJK UNIFIED IDEOGRAPH + {0x9DCA, 0x6FA5}, //5458 #CJK UNIFIED IDEOGRAPH + {0x9DCB, 0x6FA6}, //5459 #CJK UNIFIED IDEOGRAPH + {0x9DCC, 0x6FA8}, //5460 #CJK UNIFIED IDEOGRAPH + {0x9DCD, 0x6FA9}, //5461 #CJK UNIFIED IDEOGRAPH + {0x9DCE, 0x6FAA}, //5462 #CJK UNIFIED IDEOGRAPH + {0x9DCF, 0x6FAB}, //5463 #CJK UNIFIED IDEOGRAPH + {0x9DD0, 0x6FAC}, //5464 #CJK UNIFIED IDEOGRAPH + {0x9DD1, 0x6FAD}, //5465 #CJK UNIFIED IDEOGRAPH + {0x9DD2, 0x6FAE}, //5466 #CJK UNIFIED IDEOGRAPH + {0x9DD3, 0x6FAF}, //5467 #CJK UNIFIED IDEOGRAPH + {0x9DD4, 0x6FB0}, //5468 #CJK UNIFIED IDEOGRAPH + {0x9DD5, 0x6FB1}, //5469 #CJK UNIFIED IDEOGRAPH + {0x9DD6, 0x6FB2}, //5470 #CJK UNIFIED IDEOGRAPH + {0x9DD7, 0x6FB4}, //5471 #CJK UNIFIED IDEOGRAPH + {0x9DD8, 0x6FB5}, //5472 #CJK UNIFIED IDEOGRAPH + {0x9DD9, 0x6FB7}, //5473 #CJK UNIFIED IDEOGRAPH + {0x9DDA, 0x6FB8}, //5474 #CJK UNIFIED IDEOGRAPH + {0x9DDB, 0x6FBA}, //5475 #CJK UNIFIED IDEOGRAPH + {0x9DDC, 0x6FBB}, //5476 #CJK UNIFIED IDEOGRAPH + {0x9DDD, 0x6FBC}, //5477 #CJK UNIFIED IDEOGRAPH + {0x9DDE, 0x6FBD}, //5478 #CJK UNIFIED IDEOGRAPH + {0x9DDF, 0x6FBE}, //5479 #CJK UNIFIED IDEOGRAPH + {0x9DE0, 0x6FBF}, //5480 #CJK UNIFIED IDEOGRAPH + {0x9DE1, 0x6FC1}, //5481 #CJK UNIFIED IDEOGRAPH + {0x9DE2, 0x6FC3}, //5482 #CJK UNIFIED IDEOGRAPH + {0x9DE3, 0x6FC4}, //5483 #CJK UNIFIED IDEOGRAPH + {0x9DE4, 0x6FC5}, //5484 #CJK UNIFIED IDEOGRAPH + {0x9DE5, 0x6FC6}, //5485 #CJK UNIFIED IDEOGRAPH + {0x9DE6, 0x6FC7}, //5486 #CJK UNIFIED IDEOGRAPH + {0x9DE7, 0x6FC8}, //5487 #CJK UNIFIED IDEOGRAPH + {0x9DE8, 0x6FCA}, //5488 #CJK UNIFIED IDEOGRAPH + {0x9DE9, 0x6FCB}, //5489 #CJK UNIFIED IDEOGRAPH + {0x9DEA, 0x6FCC}, //5490 #CJK UNIFIED IDEOGRAPH + {0x9DEB, 0x6FCD}, //5491 #CJK UNIFIED IDEOGRAPH + {0x9DEC, 0x6FCE}, //5492 #CJK UNIFIED IDEOGRAPH + {0x9DED, 0x6FCF}, //5493 #CJK UNIFIED IDEOGRAPH + {0x9DEE, 0x6FD0}, //5494 #CJK UNIFIED IDEOGRAPH + {0x9DEF, 0x6FD3}, //5495 #CJK UNIFIED IDEOGRAPH + {0x9DF0, 0x6FD4}, //5496 #CJK UNIFIED IDEOGRAPH + {0x9DF1, 0x6FD5}, //5497 #CJK UNIFIED IDEOGRAPH + {0x9DF2, 0x6FD6}, //5498 #CJK UNIFIED IDEOGRAPH + {0x9DF3, 0x6FD7}, //5499 #CJK UNIFIED IDEOGRAPH + {0x9DF4, 0x6FD8}, //5500 #CJK UNIFIED IDEOGRAPH + {0x9DF5, 0x6FD9}, //5501 #CJK UNIFIED IDEOGRAPH + {0x9DF6, 0x6FDA}, //5502 #CJK UNIFIED IDEOGRAPH + {0x9DF7, 0x6FDB}, //5503 #CJK UNIFIED IDEOGRAPH + {0x9DF8, 0x6FDC}, //5504 #CJK UNIFIED IDEOGRAPH + {0x9DF9, 0x6FDD}, //5505 #CJK UNIFIED IDEOGRAPH + {0x9DFA, 0x6FDF}, //5506 #CJK UNIFIED IDEOGRAPH + {0x9DFB, 0x6FE2}, //5507 #CJK UNIFIED IDEOGRAPH + {0x9DFC, 0x6FE3}, //5508 #CJK UNIFIED IDEOGRAPH + {0x9DFD, 0x6FE4}, //5509 #CJK UNIFIED IDEOGRAPH + {0x9DFE, 0x6FE5}, //5510 #CJK UNIFIED IDEOGRAPH + {0x9E40, 0x6FE6}, //5511 #CJK UNIFIED IDEOGRAPH + {0x9E41, 0x6FE7}, //5512 #CJK UNIFIED IDEOGRAPH + {0x9E42, 0x6FE8}, //5513 #CJK UNIFIED IDEOGRAPH + {0x9E43, 0x6FE9}, //5514 #CJK UNIFIED IDEOGRAPH + {0x9E44, 0x6FEA}, //5515 #CJK UNIFIED IDEOGRAPH + {0x9E45, 0x6FEB}, //5516 #CJK UNIFIED IDEOGRAPH + {0x9E46, 0x6FEC}, //5517 #CJK UNIFIED IDEOGRAPH + {0x9E47, 0x6FED}, //5518 #CJK UNIFIED IDEOGRAPH + {0x9E48, 0x6FF0}, //5519 #CJK UNIFIED IDEOGRAPH + {0x9E49, 0x6FF1}, //5520 #CJK UNIFIED IDEOGRAPH + {0x9E4A, 0x6FF2}, //5521 #CJK UNIFIED IDEOGRAPH + {0x9E4B, 0x6FF3}, //5522 #CJK UNIFIED IDEOGRAPH + {0x9E4C, 0x6FF4}, //5523 #CJK UNIFIED IDEOGRAPH + {0x9E4D, 0x6FF5}, //5524 #CJK UNIFIED IDEOGRAPH + {0x9E4E, 0x6FF6}, //5525 #CJK UNIFIED IDEOGRAPH + {0x9E4F, 0x6FF7}, //5526 #CJK UNIFIED IDEOGRAPH + {0x9E50, 0x6FF8}, //5527 #CJK UNIFIED IDEOGRAPH + {0x9E51, 0x6FF9}, //5528 #CJK UNIFIED IDEOGRAPH + {0x9E52, 0x6FFA}, //5529 #CJK UNIFIED IDEOGRAPH + {0x9E53, 0x6FFB}, //5530 #CJK UNIFIED IDEOGRAPH + {0x9E54, 0x6FFC}, //5531 #CJK UNIFIED IDEOGRAPH + {0x9E55, 0x6FFD}, //5532 #CJK UNIFIED IDEOGRAPH + {0x9E56, 0x6FFE}, //5533 #CJK UNIFIED IDEOGRAPH + {0x9E57, 0x6FFF}, //5534 #CJK UNIFIED IDEOGRAPH + {0x9E58, 0x7000}, //5535 #CJK UNIFIED IDEOGRAPH + {0x9E59, 0x7001}, //5536 #CJK UNIFIED IDEOGRAPH + {0x9E5A, 0x7002}, //5537 #CJK UNIFIED IDEOGRAPH + {0x9E5B, 0x7003}, //5538 #CJK UNIFIED IDEOGRAPH + {0x9E5C, 0x7004}, //5539 #CJK UNIFIED IDEOGRAPH + {0x9E5D, 0x7005}, //5540 #CJK UNIFIED IDEOGRAPH + {0x9E5E, 0x7006}, //5541 #CJK UNIFIED IDEOGRAPH + {0x9E5F, 0x7007}, //5542 #CJK UNIFIED IDEOGRAPH + {0x9E60, 0x7008}, //5543 #CJK UNIFIED IDEOGRAPH + {0x9E61, 0x7009}, //5544 #CJK UNIFIED IDEOGRAPH + {0x9E62, 0x700A}, //5545 #CJK UNIFIED IDEOGRAPH + {0x9E63, 0x700B}, //5546 #CJK UNIFIED IDEOGRAPH + {0x9E64, 0x700C}, //5547 #CJK UNIFIED IDEOGRAPH + {0x9E65, 0x700D}, //5548 #CJK UNIFIED IDEOGRAPH + {0x9E66, 0x700E}, //5549 #CJK UNIFIED IDEOGRAPH + {0x9E67, 0x700F}, //5550 #CJK UNIFIED IDEOGRAPH + {0x9E68, 0x7010}, //5551 #CJK UNIFIED IDEOGRAPH + {0x9E69, 0x7012}, //5552 #CJK UNIFIED IDEOGRAPH + {0x9E6A, 0x7013}, //5553 #CJK UNIFIED IDEOGRAPH + {0x9E6B, 0x7014}, //5554 #CJK UNIFIED IDEOGRAPH + {0x9E6C, 0x7015}, //5555 #CJK UNIFIED IDEOGRAPH + {0x9E6D, 0x7016}, //5556 #CJK UNIFIED IDEOGRAPH + {0x9E6E, 0x7017}, //5557 #CJK UNIFIED IDEOGRAPH + {0x9E6F, 0x7018}, //5558 #CJK UNIFIED IDEOGRAPH + {0x9E70, 0x7019}, //5559 #CJK UNIFIED IDEOGRAPH + {0x9E71, 0x701C}, //5560 #CJK UNIFIED IDEOGRAPH + {0x9E72, 0x701D}, //5561 #CJK UNIFIED IDEOGRAPH + {0x9E73, 0x701E}, //5562 #CJK UNIFIED IDEOGRAPH + {0x9E74, 0x701F}, //5563 #CJK UNIFIED IDEOGRAPH + {0x9E75, 0x7020}, //5564 #CJK UNIFIED IDEOGRAPH + {0x9E76, 0x7021}, //5565 #CJK UNIFIED IDEOGRAPH + {0x9E77, 0x7022}, //5566 #CJK UNIFIED IDEOGRAPH + {0x9E78, 0x7024}, //5567 #CJK UNIFIED IDEOGRAPH + {0x9E79, 0x7025}, //5568 #CJK UNIFIED IDEOGRAPH + {0x9E7A, 0x7026}, //5569 #CJK UNIFIED IDEOGRAPH + {0x9E7B, 0x7027}, //5570 #CJK UNIFIED IDEOGRAPH + {0x9E7C, 0x7028}, //5571 #CJK UNIFIED IDEOGRAPH + {0x9E7D, 0x7029}, //5572 #CJK UNIFIED IDEOGRAPH + {0x9E7E, 0x702A}, //5573 #CJK UNIFIED IDEOGRAPH + {0x9E80, 0x702B}, //5574 #CJK UNIFIED IDEOGRAPH + {0x9E81, 0x702C}, //5575 #CJK UNIFIED IDEOGRAPH + {0x9E82, 0x702D}, //5576 #CJK UNIFIED IDEOGRAPH + {0x9E83, 0x702E}, //5577 #CJK UNIFIED IDEOGRAPH + {0x9E84, 0x702F}, //5578 #CJK UNIFIED IDEOGRAPH + {0x9E85, 0x7030}, //5579 #CJK UNIFIED IDEOGRAPH + {0x9E86, 0x7031}, //5580 #CJK UNIFIED IDEOGRAPH + {0x9E87, 0x7032}, //5581 #CJK UNIFIED IDEOGRAPH + {0x9E88, 0x7033}, //5582 #CJK UNIFIED IDEOGRAPH + {0x9E89, 0x7034}, //5583 #CJK UNIFIED IDEOGRAPH + {0x9E8A, 0x7036}, //5584 #CJK UNIFIED IDEOGRAPH + {0x9E8B, 0x7037}, //5585 #CJK UNIFIED IDEOGRAPH + {0x9E8C, 0x7038}, //5586 #CJK UNIFIED IDEOGRAPH + {0x9E8D, 0x703A}, //5587 #CJK UNIFIED IDEOGRAPH + {0x9E8E, 0x703B}, //5588 #CJK UNIFIED IDEOGRAPH + {0x9E8F, 0x703C}, //5589 #CJK UNIFIED IDEOGRAPH + {0x9E90, 0x703D}, //5590 #CJK UNIFIED IDEOGRAPH + {0x9E91, 0x703E}, //5591 #CJK UNIFIED IDEOGRAPH + {0x9E92, 0x703F}, //5592 #CJK UNIFIED IDEOGRAPH + {0x9E93, 0x7040}, //5593 #CJK UNIFIED IDEOGRAPH + {0x9E94, 0x7041}, //5594 #CJK UNIFIED IDEOGRAPH + {0x9E95, 0x7042}, //5595 #CJK UNIFIED IDEOGRAPH + {0x9E96, 0x7043}, //5596 #CJK UNIFIED IDEOGRAPH + {0x9E97, 0x7044}, //5597 #CJK UNIFIED IDEOGRAPH + {0x9E98, 0x7045}, //5598 #CJK UNIFIED IDEOGRAPH + {0x9E99, 0x7046}, //5599 #CJK UNIFIED IDEOGRAPH + {0x9E9A, 0x7047}, //5600 #CJK UNIFIED IDEOGRAPH + {0x9E9B, 0x7048}, //5601 #CJK UNIFIED IDEOGRAPH + {0x9E9C, 0x7049}, //5602 #CJK UNIFIED IDEOGRAPH + {0x9E9D, 0x704A}, //5603 #CJK UNIFIED IDEOGRAPH + {0x9E9E, 0x704B}, //5604 #CJK UNIFIED IDEOGRAPH + {0x9E9F, 0x704D}, //5605 #CJK UNIFIED IDEOGRAPH + {0x9EA0, 0x704E}, //5606 #CJK UNIFIED IDEOGRAPH + {0x9EA1, 0x7050}, //5607 #CJK UNIFIED IDEOGRAPH + {0x9EA2, 0x7051}, //5608 #CJK UNIFIED IDEOGRAPH + {0x9EA3, 0x7052}, //5609 #CJK UNIFIED IDEOGRAPH + {0x9EA4, 0x7053}, //5610 #CJK UNIFIED IDEOGRAPH + {0x9EA5, 0x7054}, //5611 #CJK UNIFIED IDEOGRAPH + {0x9EA6, 0x7055}, //5612 #CJK UNIFIED IDEOGRAPH + {0x9EA7, 0x7056}, //5613 #CJK UNIFIED IDEOGRAPH + {0x9EA8, 0x7057}, //5614 #CJK UNIFIED IDEOGRAPH + {0x9EA9, 0x7058}, //5615 #CJK UNIFIED IDEOGRAPH + {0x9EAA, 0x7059}, //5616 #CJK UNIFIED IDEOGRAPH + {0x9EAB, 0x705A}, //5617 #CJK UNIFIED IDEOGRAPH + {0x9EAC, 0x705B}, //5618 #CJK UNIFIED IDEOGRAPH + {0x9EAD, 0x705C}, //5619 #CJK UNIFIED IDEOGRAPH + {0x9EAE, 0x705D}, //5620 #CJK UNIFIED IDEOGRAPH + {0x9EAF, 0x705F}, //5621 #CJK UNIFIED IDEOGRAPH + {0x9EB0, 0x7060}, //5622 #CJK UNIFIED IDEOGRAPH + {0x9EB1, 0x7061}, //5623 #CJK UNIFIED IDEOGRAPH + {0x9EB2, 0x7062}, //5624 #CJK UNIFIED IDEOGRAPH + {0x9EB3, 0x7063}, //5625 #CJK UNIFIED IDEOGRAPH + {0x9EB4, 0x7064}, //5626 #CJK UNIFIED IDEOGRAPH + {0x9EB5, 0x7065}, //5627 #CJK UNIFIED IDEOGRAPH + {0x9EB6, 0x7066}, //5628 #CJK UNIFIED IDEOGRAPH + {0x9EB7, 0x7067}, //5629 #CJK UNIFIED IDEOGRAPH + {0x9EB8, 0x7068}, //5630 #CJK UNIFIED IDEOGRAPH + {0x9EB9, 0x7069}, //5631 #CJK UNIFIED IDEOGRAPH + {0x9EBA, 0x706A}, //5632 #CJK UNIFIED IDEOGRAPH + {0x9EBB, 0x706E}, //5633 #CJK UNIFIED IDEOGRAPH + {0x9EBC, 0x7071}, //5634 #CJK UNIFIED IDEOGRAPH + {0x9EBD, 0x7072}, //5635 #CJK UNIFIED IDEOGRAPH + {0x9EBE, 0x7073}, //5636 #CJK UNIFIED IDEOGRAPH + {0x9EBF, 0x7074}, //5637 #CJK UNIFIED IDEOGRAPH + {0x9EC0, 0x7077}, //5638 #CJK UNIFIED IDEOGRAPH + {0x9EC1, 0x7079}, //5639 #CJK UNIFIED IDEOGRAPH + {0x9EC2, 0x707A}, //5640 #CJK UNIFIED IDEOGRAPH + {0x9EC3, 0x707B}, //5641 #CJK UNIFIED IDEOGRAPH + {0x9EC4, 0x707D}, //5642 #CJK UNIFIED IDEOGRAPH + {0x9EC5, 0x7081}, //5643 #CJK UNIFIED IDEOGRAPH + {0x9EC6, 0x7082}, //5644 #CJK UNIFIED IDEOGRAPH + {0x9EC7, 0x7083}, //5645 #CJK UNIFIED IDEOGRAPH + {0x9EC8, 0x7084}, //5646 #CJK UNIFIED IDEOGRAPH + {0x9EC9, 0x7086}, //5647 #CJK UNIFIED IDEOGRAPH + {0x9ECA, 0x7087}, //5648 #CJK UNIFIED IDEOGRAPH + {0x9ECB, 0x7088}, //5649 #CJK UNIFIED IDEOGRAPH + {0x9ECC, 0x708B}, //5650 #CJK UNIFIED IDEOGRAPH + {0x9ECD, 0x708C}, //5651 #CJK UNIFIED IDEOGRAPH + {0x9ECE, 0x708D}, //5652 #CJK UNIFIED IDEOGRAPH + {0x9ECF, 0x708F}, //5653 #CJK UNIFIED IDEOGRAPH + {0x9ED0, 0x7090}, //5654 #CJK UNIFIED IDEOGRAPH + {0x9ED1, 0x7091}, //5655 #CJK UNIFIED IDEOGRAPH + {0x9ED2, 0x7093}, //5656 #CJK UNIFIED IDEOGRAPH + {0x9ED3, 0x7097}, //5657 #CJK UNIFIED IDEOGRAPH + {0x9ED4, 0x7098}, //5658 #CJK UNIFIED IDEOGRAPH + {0x9ED5, 0x709A}, //5659 #CJK UNIFIED IDEOGRAPH + {0x9ED6, 0x709B}, //5660 #CJK UNIFIED IDEOGRAPH + {0x9ED7, 0x709E}, //5661 #CJK UNIFIED IDEOGRAPH + {0x9ED8, 0x709F}, //5662 #CJK UNIFIED IDEOGRAPH + {0x9ED9, 0x70A0}, //5663 #CJK UNIFIED IDEOGRAPH + {0x9EDA, 0x70A1}, //5664 #CJK UNIFIED IDEOGRAPH + {0x9EDB, 0x70A2}, //5665 #CJK UNIFIED IDEOGRAPH + {0x9EDC, 0x70A3}, //5666 #CJK UNIFIED IDEOGRAPH + {0x9EDD, 0x70A4}, //5667 #CJK UNIFIED IDEOGRAPH + {0x9EDE, 0x70A5}, //5668 #CJK UNIFIED IDEOGRAPH + {0x9EDF, 0x70A6}, //5669 #CJK UNIFIED IDEOGRAPH + {0x9EE0, 0x70A7}, //5670 #CJK UNIFIED IDEOGRAPH + {0x9EE1, 0x70A8}, //5671 #CJK UNIFIED IDEOGRAPH + {0x9EE2, 0x70A9}, //5672 #CJK UNIFIED IDEOGRAPH + {0x9EE3, 0x70AA}, //5673 #CJK UNIFIED IDEOGRAPH + {0x9EE4, 0x70B0}, //5674 #CJK UNIFIED IDEOGRAPH + {0x9EE5, 0x70B2}, //5675 #CJK UNIFIED IDEOGRAPH + {0x9EE6, 0x70B4}, //5676 #CJK UNIFIED IDEOGRAPH + {0x9EE7, 0x70B5}, //5677 #CJK UNIFIED IDEOGRAPH + {0x9EE8, 0x70B6}, //5678 #CJK UNIFIED IDEOGRAPH + {0x9EE9, 0x70BA}, //5679 #CJK UNIFIED IDEOGRAPH + {0x9EEA, 0x70BE}, //5680 #CJK UNIFIED IDEOGRAPH + {0x9EEB, 0x70BF}, //5681 #CJK UNIFIED IDEOGRAPH + {0x9EEC, 0x70C4}, //5682 #CJK UNIFIED IDEOGRAPH + {0x9EED, 0x70C5}, //5683 #CJK UNIFIED IDEOGRAPH + {0x9EEE, 0x70C6}, //5684 #CJK UNIFIED IDEOGRAPH + {0x9EEF, 0x70C7}, //5685 #CJK UNIFIED IDEOGRAPH + {0x9EF0, 0x70C9}, //5686 #CJK UNIFIED IDEOGRAPH + {0x9EF1, 0x70CB}, //5687 #CJK UNIFIED IDEOGRAPH + {0x9EF2, 0x70CC}, //5688 #CJK UNIFIED IDEOGRAPH + {0x9EF3, 0x70CD}, //5689 #CJK UNIFIED IDEOGRAPH + {0x9EF4, 0x70CE}, //5690 #CJK UNIFIED IDEOGRAPH + {0x9EF5, 0x70CF}, //5691 #CJK UNIFIED IDEOGRAPH + {0x9EF6, 0x70D0}, //5692 #CJK UNIFIED IDEOGRAPH + {0x9EF7, 0x70D1}, //5693 #CJK UNIFIED IDEOGRAPH + {0x9EF8, 0x70D2}, //5694 #CJK UNIFIED IDEOGRAPH + {0x9EF9, 0x70D3}, //5695 #CJK UNIFIED IDEOGRAPH + {0x9EFA, 0x70D4}, //5696 #CJK UNIFIED IDEOGRAPH + {0x9EFB, 0x70D5}, //5697 #CJK UNIFIED IDEOGRAPH + {0x9EFC, 0x70D6}, //5698 #CJK UNIFIED IDEOGRAPH + {0x9EFD, 0x70D7}, //5699 #CJK UNIFIED IDEOGRAPH + {0x9EFE, 0x70DA}, //5700 #CJK UNIFIED IDEOGRAPH + {0x9F40, 0x70DC}, //5701 #CJK UNIFIED IDEOGRAPH + {0x9F41, 0x70DD}, //5702 #CJK UNIFIED IDEOGRAPH + {0x9F42, 0x70DE}, //5703 #CJK UNIFIED IDEOGRAPH + {0x9F43, 0x70E0}, //5704 #CJK UNIFIED IDEOGRAPH + {0x9F44, 0x70E1}, //5705 #CJK UNIFIED IDEOGRAPH + {0x9F45, 0x70E2}, //5706 #CJK UNIFIED IDEOGRAPH + {0x9F46, 0x70E3}, //5707 #CJK UNIFIED IDEOGRAPH + {0x9F47, 0x70E5}, //5708 #CJK UNIFIED IDEOGRAPH + {0x9F48, 0x70EA}, //5709 #CJK UNIFIED IDEOGRAPH + {0x9F49, 0x70EE}, //5710 #CJK UNIFIED IDEOGRAPH + {0x9F4A, 0x70F0}, //5711 #CJK UNIFIED IDEOGRAPH + {0x9F4B, 0x70F1}, //5712 #CJK UNIFIED IDEOGRAPH + {0x9F4C, 0x70F2}, //5713 #CJK UNIFIED IDEOGRAPH + {0x9F4D, 0x70F3}, //5714 #CJK UNIFIED IDEOGRAPH + {0x9F4E, 0x70F4}, //5715 #CJK UNIFIED IDEOGRAPH + {0x9F4F, 0x70F5}, //5716 #CJK UNIFIED IDEOGRAPH + {0x9F50, 0x70F6}, //5717 #CJK UNIFIED IDEOGRAPH + {0x9F51, 0x70F8}, //5718 #CJK UNIFIED IDEOGRAPH + {0x9F52, 0x70FA}, //5719 #CJK UNIFIED IDEOGRAPH + {0x9F53, 0x70FB}, //5720 #CJK UNIFIED IDEOGRAPH + {0x9F54, 0x70FC}, //5721 #CJK UNIFIED IDEOGRAPH + {0x9F55, 0x70FE}, //5722 #CJK UNIFIED IDEOGRAPH + {0x9F56, 0x70FF}, //5723 #CJK UNIFIED IDEOGRAPH + {0x9F57, 0x7100}, //5724 #CJK UNIFIED IDEOGRAPH + {0x9F58, 0x7101}, //5725 #CJK UNIFIED IDEOGRAPH + {0x9F59, 0x7102}, //5726 #CJK UNIFIED IDEOGRAPH + {0x9F5A, 0x7103}, //5727 #CJK UNIFIED IDEOGRAPH + {0x9F5B, 0x7104}, //5728 #CJK UNIFIED IDEOGRAPH + {0x9F5C, 0x7105}, //5729 #CJK UNIFIED IDEOGRAPH + {0x9F5D, 0x7106}, //5730 #CJK UNIFIED IDEOGRAPH + {0x9F5E, 0x7107}, //5731 #CJK UNIFIED IDEOGRAPH + {0x9F5F, 0x7108}, //5732 #CJK UNIFIED IDEOGRAPH + {0x9F60, 0x710B}, //5733 #CJK UNIFIED IDEOGRAPH + {0x9F61, 0x710C}, //5734 #CJK UNIFIED IDEOGRAPH + {0x9F62, 0x710D}, //5735 #CJK UNIFIED IDEOGRAPH + {0x9F63, 0x710E}, //5736 #CJK UNIFIED IDEOGRAPH + {0x9F64, 0x710F}, //5737 #CJK UNIFIED IDEOGRAPH + {0x9F65, 0x7111}, //5738 #CJK UNIFIED IDEOGRAPH + {0x9F66, 0x7112}, //5739 #CJK UNIFIED IDEOGRAPH + {0x9F67, 0x7114}, //5740 #CJK UNIFIED IDEOGRAPH + {0x9F68, 0x7117}, //5741 #CJK UNIFIED IDEOGRAPH + {0x9F69, 0x711B}, //5742 #CJK UNIFIED IDEOGRAPH + {0x9F6A, 0x711C}, //5743 #CJK UNIFIED IDEOGRAPH + {0x9F6B, 0x711D}, //5744 #CJK UNIFIED IDEOGRAPH + {0x9F6C, 0x711E}, //5745 #CJK UNIFIED IDEOGRAPH + {0x9F6D, 0x711F}, //5746 #CJK UNIFIED IDEOGRAPH + {0x9F6E, 0x7120}, //5747 #CJK UNIFIED IDEOGRAPH + {0x9F6F, 0x7121}, //5748 #CJK UNIFIED IDEOGRAPH + {0x9F70, 0x7122}, //5749 #CJK UNIFIED IDEOGRAPH + {0x9F71, 0x7123}, //5750 #CJK UNIFIED IDEOGRAPH + {0x9F72, 0x7124}, //5751 #CJK UNIFIED IDEOGRAPH + {0x9F73, 0x7125}, //5752 #CJK UNIFIED IDEOGRAPH + {0x9F74, 0x7127}, //5753 #CJK UNIFIED IDEOGRAPH + {0x9F75, 0x7128}, //5754 #CJK UNIFIED IDEOGRAPH + {0x9F76, 0x7129}, //5755 #CJK UNIFIED IDEOGRAPH + {0x9F77, 0x712A}, //5756 #CJK UNIFIED IDEOGRAPH + {0x9F78, 0x712B}, //5757 #CJK UNIFIED IDEOGRAPH + {0x9F79, 0x712C}, //5758 #CJK UNIFIED IDEOGRAPH + {0x9F7A, 0x712D}, //5759 #CJK UNIFIED IDEOGRAPH + {0x9F7B, 0x712E}, //5760 #CJK UNIFIED IDEOGRAPH + {0x9F7C, 0x7132}, //5761 #CJK UNIFIED IDEOGRAPH + {0x9F7D, 0x7133}, //5762 #CJK UNIFIED IDEOGRAPH + {0x9F7E, 0x7134}, //5763 #CJK UNIFIED IDEOGRAPH + {0x9F80, 0x7135}, //5764 #CJK UNIFIED IDEOGRAPH + {0x9F81, 0x7137}, //5765 #CJK UNIFIED IDEOGRAPH + {0x9F82, 0x7138}, //5766 #CJK UNIFIED IDEOGRAPH + {0x9F83, 0x7139}, //5767 #CJK UNIFIED IDEOGRAPH + {0x9F84, 0x713A}, //5768 #CJK UNIFIED IDEOGRAPH + {0x9F85, 0x713B}, //5769 #CJK UNIFIED IDEOGRAPH + {0x9F86, 0x713C}, //5770 #CJK UNIFIED IDEOGRAPH + {0x9F87, 0x713D}, //5771 #CJK UNIFIED IDEOGRAPH + {0x9F88, 0x713E}, //5772 #CJK UNIFIED IDEOGRAPH + {0x9F89, 0x713F}, //5773 #CJK UNIFIED IDEOGRAPH + {0x9F8A, 0x7140}, //5774 #CJK UNIFIED IDEOGRAPH + {0x9F8B, 0x7141}, //5775 #CJK UNIFIED IDEOGRAPH + {0x9F8C, 0x7142}, //5776 #CJK UNIFIED IDEOGRAPH + {0x9F8D, 0x7143}, //5777 #CJK UNIFIED IDEOGRAPH + {0x9F8E, 0x7144}, //5778 #CJK UNIFIED IDEOGRAPH + {0x9F8F, 0x7146}, //5779 #CJK UNIFIED IDEOGRAPH + {0x9F90, 0x7147}, //5780 #CJK UNIFIED IDEOGRAPH + {0x9F91, 0x7148}, //5781 #CJK UNIFIED IDEOGRAPH + {0x9F92, 0x7149}, //5782 #CJK UNIFIED IDEOGRAPH + {0x9F93, 0x714B}, //5783 #CJK UNIFIED IDEOGRAPH + {0x9F94, 0x714D}, //5784 #CJK UNIFIED IDEOGRAPH + {0x9F95, 0x714F}, //5785 #CJK UNIFIED IDEOGRAPH + {0x9F96, 0x7150}, //5786 #CJK UNIFIED IDEOGRAPH + {0x9F97, 0x7151}, //5787 #CJK UNIFIED IDEOGRAPH + {0x9F98, 0x7152}, //5788 #CJK UNIFIED IDEOGRAPH + {0x9F99, 0x7153}, //5789 #CJK UNIFIED IDEOGRAPH + {0x9F9A, 0x7154}, //5790 #CJK UNIFIED IDEOGRAPH + {0x9F9B, 0x7155}, //5791 #CJK UNIFIED IDEOGRAPH + {0x9F9C, 0x7156}, //5792 #CJK UNIFIED IDEOGRAPH + {0x9F9D, 0x7157}, //5793 #CJK UNIFIED IDEOGRAPH + {0x9F9E, 0x7158}, //5794 #CJK UNIFIED IDEOGRAPH + {0x9F9F, 0x7159}, //5795 #CJK UNIFIED IDEOGRAPH + {0x9FA0, 0x715A}, //5796 #CJK UNIFIED IDEOGRAPH + {0x9FA1, 0x715B}, //5797 #CJK UNIFIED IDEOGRAPH + {0x9FA2, 0x715D}, //5798 #CJK UNIFIED IDEOGRAPH + {0x9FA3, 0x715F}, //5799 #CJK UNIFIED IDEOGRAPH + {0x9FA4, 0x7160}, //5800 #CJK UNIFIED IDEOGRAPH + {0x9FA5, 0x7161}, //5801 #CJK UNIFIED IDEOGRAPH + {0x9FA6, 0x7162}, //5802 #CJK UNIFIED IDEOGRAPH + {0x9FA7, 0x7163}, //5803 #CJK UNIFIED IDEOGRAPH + {0x9FA8, 0x7165}, //5804 #CJK UNIFIED IDEOGRAPH + {0x9FA9, 0x7169}, //5805 #CJK UNIFIED IDEOGRAPH + {0x9FAA, 0x716A}, //5806 #CJK UNIFIED IDEOGRAPH + {0x9FAB, 0x716B}, //5807 #CJK UNIFIED IDEOGRAPH + {0x9FAC, 0x716C}, //5808 #CJK UNIFIED IDEOGRAPH + {0x9FAD, 0x716D}, //5809 #CJK UNIFIED IDEOGRAPH + {0x9FAE, 0x716F}, //5810 #CJK UNIFIED IDEOGRAPH + {0x9FAF, 0x7170}, //5811 #CJK UNIFIED IDEOGRAPH + {0x9FB0, 0x7171}, //5812 #CJK UNIFIED IDEOGRAPH + {0x9FB1, 0x7174}, //5813 #CJK UNIFIED IDEOGRAPH + {0x9FB2, 0x7175}, //5814 #CJK UNIFIED IDEOGRAPH + {0x9FB3, 0x7176}, //5815 #CJK UNIFIED IDEOGRAPH + {0x9FB4, 0x7177}, //5816 #CJK UNIFIED IDEOGRAPH + {0x9FB5, 0x7179}, //5817 #CJK UNIFIED IDEOGRAPH + {0x9FB6, 0x717B}, //5818 #CJK UNIFIED IDEOGRAPH + {0x9FB7, 0x717C}, //5819 #CJK UNIFIED IDEOGRAPH + {0x9FB8, 0x717E}, //5820 #CJK UNIFIED IDEOGRAPH + {0x9FB9, 0x717F}, //5821 #CJK UNIFIED IDEOGRAPH + {0x9FBA, 0x7180}, //5822 #CJK UNIFIED IDEOGRAPH + {0x9FBB, 0x7181}, //5823 #CJK UNIFIED IDEOGRAPH + {0x9FBC, 0x7182}, //5824 #CJK UNIFIED IDEOGRAPH + {0x9FBD, 0x7183}, //5825 #CJK UNIFIED IDEOGRAPH + {0x9FBE, 0x7185}, //5826 #CJK UNIFIED IDEOGRAPH + {0x9FBF, 0x7186}, //5827 #CJK UNIFIED IDEOGRAPH + {0x9FC0, 0x7187}, //5828 #CJK UNIFIED IDEOGRAPH + {0x9FC1, 0x7188}, //5829 #CJK UNIFIED IDEOGRAPH + {0x9FC2, 0x7189}, //5830 #CJK UNIFIED IDEOGRAPH + {0x9FC3, 0x718B}, //5831 #CJK UNIFIED IDEOGRAPH + {0x9FC4, 0x718C}, //5832 #CJK UNIFIED IDEOGRAPH + {0x9FC5, 0x718D}, //5833 #CJK UNIFIED IDEOGRAPH + {0x9FC6, 0x718E}, //5834 #CJK UNIFIED IDEOGRAPH + {0x9FC7, 0x7190}, //5835 #CJK UNIFIED IDEOGRAPH + {0x9FC8, 0x7191}, //5836 #CJK UNIFIED IDEOGRAPH + {0x9FC9, 0x7192}, //5837 #CJK UNIFIED IDEOGRAPH + {0x9FCA, 0x7193}, //5838 #CJK UNIFIED IDEOGRAPH + {0x9FCB, 0x7195}, //5839 #CJK UNIFIED IDEOGRAPH + {0x9FCC, 0x7196}, //5840 #CJK UNIFIED IDEOGRAPH + {0x9FCD, 0x7197}, //5841 #CJK UNIFIED IDEOGRAPH + {0x9FCE, 0x719A}, //5842 #CJK UNIFIED IDEOGRAPH + {0x9FCF, 0x719B}, //5843 #CJK UNIFIED IDEOGRAPH + {0x9FD0, 0x719C}, //5844 #CJK UNIFIED IDEOGRAPH + {0x9FD1, 0x719D}, //5845 #CJK UNIFIED IDEOGRAPH + {0x9FD2, 0x719E}, //5846 #CJK UNIFIED IDEOGRAPH + {0x9FD3, 0x71A1}, //5847 #CJK UNIFIED IDEOGRAPH + {0x9FD4, 0x71A2}, //5848 #CJK UNIFIED IDEOGRAPH + {0x9FD5, 0x71A3}, //5849 #CJK UNIFIED IDEOGRAPH + {0x9FD6, 0x71A4}, //5850 #CJK UNIFIED IDEOGRAPH + {0x9FD7, 0x71A5}, //5851 #CJK UNIFIED IDEOGRAPH + {0x9FD8, 0x71A6}, //5852 #CJK UNIFIED IDEOGRAPH + {0x9FD9, 0x71A7}, //5853 #CJK UNIFIED IDEOGRAPH + {0x9FDA, 0x71A9}, //5854 #CJK UNIFIED IDEOGRAPH + {0x9FDB, 0x71AA}, //5855 #CJK UNIFIED IDEOGRAPH + {0x9FDC, 0x71AB}, //5856 #CJK UNIFIED IDEOGRAPH + {0x9FDD, 0x71AD}, //5857 #CJK UNIFIED IDEOGRAPH + {0x9FDE, 0x71AE}, //5858 #CJK UNIFIED IDEOGRAPH + {0x9FDF, 0x71AF}, //5859 #CJK UNIFIED IDEOGRAPH + {0x9FE0, 0x71B0}, //5860 #CJK UNIFIED IDEOGRAPH + {0x9FE1, 0x71B1}, //5861 #CJK UNIFIED IDEOGRAPH + {0x9FE2, 0x71B2}, //5862 #CJK UNIFIED IDEOGRAPH + {0x9FE3, 0x71B4}, //5863 #CJK UNIFIED IDEOGRAPH + {0x9FE4, 0x71B6}, //5864 #CJK UNIFIED IDEOGRAPH + {0x9FE5, 0x71B7}, //5865 #CJK UNIFIED IDEOGRAPH + {0x9FE6, 0x71B8}, //5866 #CJK UNIFIED IDEOGRAPH + {0x9FE7, 0x71BA}, //5867 #CJK UNIFIED IDEOGRAPH + {0x9FE8, 0x71BB}, //5868 #CJK UNIFIED IDEOGRAPH + {0x9FE9, 0x71BC}, //5869 #CJK UNIFIED IDEOGRAPH + {0x9FEA, 0x71BD}, //5870 #CJK UNIFIED IDEOGRAPH + {0x9FEB, 0x71BE}, //5871 #CJK UNIFIED IDEOGRAPH + {0x9FEC, 0x71BF}, //5872 #CJK UNIFIED IDEOGRAPH + {0x9FED, 0x71C0}, //5873 #CJK UNIFIED IDEOGRAPH + {0x9FEE, 0x71C1}, //5874 #CJK UNIFIED IDEOGRAPH + {0x9FEF, 0x71C2}, //5875 #CJK UNIFIED IDEOGRAPH + {0x9FF0, 0x71C4}, //5876 #CJK UNIFIED IDEOGRAPH + {0x9FF1, 0x71C5}, //5877 #CJK UNIFIED IDEOGRAPH + {0x9FF2, 0x71C6}, //5878 #CJK UNIFIED IDEOGRAPH + {0x9FF3, 0x71C7}, //5879 #CJK UNIFIED IDEOGRAPH + {0x9FF4, 0x71C8}, //5880 #CJK UNIFIED IDEOGRAPH + {0x9FF5, 0x71C9}, //5881 #CJK UNIFIED IDEOGRAPH + {0x9FF6, 0x71CA}, //5882 #CJK UNIFIED IDEOGRAPH + {0x9FF7, 0x71CB}, //5883 #CJK UNIFIED IDEOGRAPH + {0x9FF8, 0x71CC}, //5884 #CJK UNIFIED IDEOGRAPH + {0x9FF9, 0x71CD}, //5885 #CJK UNIFIED IDEOGRAPH + {0x9FFA, 0x71CF}, //5886 #CJK UNIFIED IDEOGRAPH + {0x9FFB, 0x71D0}, //5887 #CJK UNIFIED IDEOGRAPH + {0x9FFC, 0x71D1}, //5888 #CJK UNIFIED IDEOGRAPH + {0x9FFD, 0x71D2}, //5889 #CJK UNIFIED IDEOGRAPH + {0x9FFE, 0x71D3}, //5890 #CJK UNIFIED IDEOGRAPH + {0xA040, 0x71D6}, //5891 #CJK UNIFIED IDEOGRAPH + {0xA041, 0x71D7}, //5892 #CJK UNIFIED IDEOGRAPH + {0xA042, 0x71D8}, //5893 #CJK UNIFIED IDEOGRAPH + {0xA043, 0x71D9}, //5894 #CJK UNIFIED IDEOGRAPH + {0xA044, 0x71DA}, //5895 #CJK UNIFIED IDEOGRAPH + {0xA045, 0x71DB}, //5896 #CJK UNIFIED IDEOGRAPH + {0xA046, 0x71DC}, //5897 #CJK UNIFIED IDEOGRAPH + {0xA047, 0x71DD}, //5898 #CJK UNIFIED IDEOGRAPH + {0xA048, 0x71DE}, //5899 #CJK UNIFIED IDEOGRAPH + {0xA049, 0x71DF}, //5900 #CJK UNIFIED IDEOGRAPH + {0xA04A, 0x71E1}, //5901 #CJK UNIFIED IDEOGRAPH + {0xA04B, 0x71E2}, //5902 #CJK UNIFIED IDEOGRAPH + {0xA04C, 0x71E3}, //5903 #CJK UNIFIED IDEOGRAPH + {0xA04D, 0x71E4}, //5904 #CJK UNIFIED IDEOGRAPH + {0xA04E, 0x71E6}, //5905 #CJK UNIFIED IDEOGRAPH + {0xA04F, 0x71E8}, //5906 #CJK UNIFIED IDEOGRAPH + {0xA050, 0x71E9}, //5907 #CJK UNIFIED IDEOGRAPH + {0xA051, 0x71EA}, //5908 #CJK UNIFIED IDEOGRAPH + {0xA052, 0x71EB}, //5909 #CJK UNIFIED IDEOGRAPH + {0xA053, 0x71EC}, //5910 #CJK UNIFIED IDEOGRAPH + {0xA054, 0x71ED}, //5911 #CJK UNIFIED IDEOGRAPH + {0xA055, 0x71EF}, //5912 #CJK UNIFIED IDEOGRAPH + {0xA056, 0x71F0}, //5913 #CJK UNIFIED IDEOGRAPH + {0xA057, 0x71F1}, //5914 #CJK UNIFIED IDEOGRAPH + {0xA058, 0x71F2}, //5915 #CJK UNIFIED IDEOGRAPH + {0xA059, 0x71F3}, //5916 #CJK UNIFIED IDEOGRAPH + {0xA05A, 0x71F4}, //5917 #CJK UNIFIED IDEOGRAPH + {0xA05B, 0x71F5}, //5918 #CJK UNIFIED IDEOGRAPH + {0xA05C, 0x71F6}, //5919 #CJK UNIFIED IDEOGRAPH + {0xA05D, 0x71F7}, //5920 #CJK UNIFIED IDEOGRAPH + {0xA05E, 0x71F8}, //5921 #CJK UNIFIED IDEOGRAPH + {0xA05F, 0x71FA}, //5922 #CJK UNIFIED IDEOGRAPH + {0xA060, 0x71FB}, //5923 #CJK UNIFIED IDEOGRAPH + {0xA061, 0x71FC}, //5924 #CJK UNIFIED IDEOGRAPH + {0xA062, 0x71FD}, //5925 #CJK UNIFIED IDEOGRAPH + {0xA063, 0x71FE}, //5926 #CJK UNIFIED IDEOGRAPH + {0xA064, 0x71FF}, //5927 #CJK UNIFIED IDEOGRAPH + {0xA065, 0x7200}, //5928 #CJK UNIFIED IDEOGRAPH + {0xA066, 0x7201}, //5929 #CJK UNIFIED IDEOGRAPH + {0xA067, 0x7202}, //5930 #CJK UNIFIED IDEOGRAPH + {0xA068, 0x7203}, //5931 #CJK UNIFIED IDEOGRAPH + {0xA069, 0x7204}, //5932 #CJK UNIFIED IDEOGRAPH + {0xA06A, 0x7205}, //5933 #CJK UNIFIED IDEOGRAPH + {0xA06B, 0x7207}, //5934 #CJK UNIFIED IDEOGRAPH + {0xA06C, 0x7208}, //5935 #CJK UNIFIED IDEOGRAPH + {0xA06D, 0x7209}, //5936 #CJK UNIFIED IDEOGRAPH + {0xA06E, 0x720A}, //5937 #CJK UNIFIED IDEOGRAPH + {0xA06F, 0x720B}, //5938 #CJK UNIFIED IDEOGRAPH + {0xA070, 0x720C}, //5939 #CJK UNIFIED IDEOGRAPH + {0xA071, 0x720D}, //5940 #CJK UNIFIED IDEOGRAPH + {0xA072, 0x720E}, //5941 #CJK UNIFIED IDEOGRAPH + {0xA073, 0x720F}, //5942 #CJK UNIFIED IDEOGRAPH + {0xA074, 0x7210}, //5943 #CJK UNIFIED IDEOGRAPH + {0xA075, 0x7211}, //5944 #CJK UNIFIED IDEOGRAPH + {0xA076, 0x7212}, //5945 #CJK UNIFIED IDEOGRAPH + {0xA077, 0x7213}, //5946 #CJK UNIFIED IDEOGRAPH + {0xA078, 0x7214}, //5947 #CJK UNIFIED IDEOGRAPH + {0xA079, 0x7215}, //5948 #CJK UNIFIED IDEOGRAPH + {0xA07A, 0x7216}, //5949 #CJK UNIFIED IDEOGRAPH + {0xA07B, 0x7217}, //5950 #CJK UNIFIED IDEOGRAPH + {0xA07C, 0x7218}, //5951 #CJK UNIFIED IDEOGRAPH + {0xA07D, 0x7219}, //5952 #CJK UNIFIED IDEOGRAPH + {0xA07E, 0x721A}, //5953 #CJK UNIFIED IDEOGRAPH + {0xA080, 0x721B}, //5954 #CJK UNIFIED IDEOGRAPH + {0xA081, 0x721C}, //5955 #CJK UNIFIED IDEOGRAPH + {0xA082, 0x721E}, //5956 #CJK UNIFIED IDEOGRAPH + {0xA083, 0x721F}, //5957 #CJK UNIFIED IDEOGRAPH + {0xA084, 0x7220}, //5958 #CJK UNIFIED IDEOGRAPH + {0xA085, 0x7221}, //5959 #CJK UNIFIED IDEOGRAPH + {0xA086, 0x7222}, //5960 #CJK UNIFIED IDEOGRAPH + {0xA087, 0x7223}, //5961 #CJK UNIFIED IDEOGRAPH + {0xA088, 0x7224}, //5962 #CJK UNIFIED IDEOGRAPH + {0xA089, 0x7225}, //5963 #CJK UNIFIED IDEOGRAPH + {0xA08A, 0x7226}, //5964 #CJK UNIFIED IDEOGRAPH + {0xA08B, 0x7227}, //5965 #CJK UNIFIED IDEOGRAPH + {0xA08C, 0x7229}, //5966 #CJK UNIFIED IDEOGRAPH + {0xA08D, 0x722B}, //5967 #CJK UNIFIED IDEOGRAPH + {0xA08E, 0x722D}, //5968 #CJK UNIFIED IDEOGRAPH + {0xA08F, 0x722E}, //5969 #CJK UNIFIED IDEOGRAPH + {0xA090, 0x722F}, //5970 #CJK UNIFIED IDEOGRAPH + {0xA091, 0x7232}, //5971 #CJK UNIFIED IDEOGRAPH + {0xA092, 0x7233}, //5972 #CJK UNIFIED IDEOGRAPH + {0xA093, 0x7234}, //5973 #CJK UNIFIED IDEOGRAPH + {0xA094, 0x723A}, //5974 #CJK UNIFIED IDEOGRAPH + {0xA095, 0x723C}, //5975 #CJK UNIFIED IDEOGRAPH + {0xA096, 0x723E}, //5976 #CJK UNIFIED IDEOGRAPH + {0xA097, 0x7240}, //5977 #CJK UNIFIED IDEOGRAPH + {0xA098, 0x7241}, //5978 #CJK UNIFIED IDEOGRAPH + {0xA099, 0x7242}, //5979 #CJK UNIFIED IDEOGRAPH + {0xA09A, 0x7243}, //5980 #CJK UNIFIED IDEOGRAPH + {0xA09B, 0x7244}, //5981 #CJK UNIFIED IDEOGRAPH + {0xA09C, 0x7245}, //5982 #CJK UNIFIED IDEOGRAPH + {0xA09D, 0x7246}, //5983 #CJK UNIFIED IDEOGRAPH + {0xA09E, 0x7249}, //5984 #CJK UNIFIED IDEOGRAPH + {0xA09F, 0x724A}, //5985 #CJK UNIFIED IDEOGRAPH + {0xA0A0, 0x724B}, //5986 #CJK UNIFIED IDEOGRAPH + {0xA0A1, 0x724E}, //5987 #CJK UNIFIED IDEOGRAPH + {0xA0A2, 0x724F}, //5988 #CJK UNIFIED IDEOGRAPH + {0xA0A3, 0x7250}, //5989 #CJK UNIFIED IDEOGRAPH + {0xA0A4, 0x7251}, //5990 #CJK UNIFIED IDEOGRAPH + {0xA0A5, 0x7253}, //5991 #CJK UNIFIED IDEOGRAPH + {0xA0A6, 0x7254}, //5992 #CJK UNIFIED IDEOGRAPH + {0xA0A7, 0x7255}, //5993 #CJK UNIFIED IDEOGRAPH + {0xA0A8, 0x7257}, //5994 #CJK UNIFIED IDEOGRAPH + {0xA0A9, 0x7258}, //5995 #CJK UNIFIED IDEOGRAPH + {0xA0AA, 0x725A}, //5996 #CJK UNIFIED IDEOGRAPH + {0xA0AB, 0x725C}, //5997 #CJK UNIFIED IDEOGRAPH + {0xA0AC, 0x725E}, //5998 #CJK UNIFIED IDEOGRAPH + {0xA0AD, 0x7260}, //5999 #CJK UNIFIED IDEOGRAPH + {0xA0AE, 0x7263}, //6000 #CJK UNIFIED IDEOGRAPH + {0xA0AF, 0x7264}, //6001 #CJK UNIFIED IDEOGRAPH + {0xA0B0, 0x7265}, //6002 #CJK UNIFIED IDEOGRAPH + {0xA0B1, 0x7268}, //6003 #CJK UNIFIED IDEOGRAPH + {0xA0B2, 0x726A}, //6004 #CJK UNIFIED IDEOGRAPH + {0xA0B3, 0x726B}, //6005 #CJK UNIFIED IDEOGRAPH + {0xA0B4, 0x726C}, //6006 #CJK UNIFIED IDEOGRAPH + {0xA0B5, 0x726D}, //6007 #CJK UNIFIED IDEOGRAPH + {0xA0B6, 0x7270}, //6008 #CJK UNIFIED IDEOGRAPH + {0xA0B7, 0x7271}, //6009 #CJK UNIFIED IDEOGRAPH + {0xA0B8, 0x7273}, //6010 #CJK UNIFIED IDEOGRAPH + {0xA0B9, 0x7274}, //6011 #CJK UNIFIED IDEOGRAPH + {0xA0BA, 0x7276}, //6012 #CJK UNIFIED IDEOGRAPH + {0xA0BB, 0x7277}, //6013 #CJK UNIFIED IDEOGRAPH + {0xA0BC, 0x7278}, //6014 #CJK UNIFIED IDEOGRAPH + {0xA0BD, 0x727B}, //6015 #CJK UNIFIED IDEOGRAPH + {0xA0BE, 0x727C}, //6016 #CJK UNIFIED IDEOGRAPH + {0xA0BF, 0x727D}, //6017 #CJK UNIFIED IDEOGRAPH + {0xA0C0, 0x7282}, //6018 #CJK UNIFIED IDEOGRAPH + {0xA0C1, 0x7283}, //6019 #CJK UNIFIED IDEOGRAPH + {0xA0C2, 0x7285}, //6020 #CJK UNIFIED IDEOGRAPH + {0xA0C3, 0x7286}, //6021 #CJK UNIFIED IDEOGRAPH + {0xA0C4, 0x7287}, //6022 #CJK UNIFIED IDEOGRAPH + {0xA0C5, 0x7288}, //6023 #CJK UNIFIED IDEOGRAPH + {0xA0C6, 0x7289}, //6024 #CJK UNIFIED IDEOGRAPH + {0xA0C7, 0x728C}, //6025 #CJK UNIFIED IDEOGRAPH + {0xA0C8, 0x728E}, //6026 #CJK UNIFIED IDEOGRAPH + {0xA0C9, 0x7290}, //6027 #CJK UNIFIED IDEOGRAPH + {0xA0CA, 0x7291}, //6028 #CJK UNIFIED IDEOGRAPH + {0xA0CB, 0x7293}, //6029 #CJK UNIFIED IDEOGRAPH + {0xA0CC, 0x7294}, //6030 #CJK UNIFIED IDEOGRAPH + {0xA0CD, 0x7295}, //6031 #CJK UNIFIED IDEOGRAPH + {0xA0CE, 0x7296}, //6032 #CJK UNIFIED IDEOGRAPH + {0xA0CF, 0x7297}, //6033 #CJK UNIFIED IDEOGRAPH + {0xA0D0, 0x7298}, //6034 #CJK UNIFIED IDEOGRAPH + {0xA0D1, 0x7299}, //6035 #CJK UNIFIED IDEOGRAPH + {0xA0D2, 0x729A}, //6036 #CJK UNIFIED IDEOGRAPH + {0xA0D3, 0x729B}, //6037 #CJK UNIFIED IDEOGRAPH + {0xA0D4, 0x729C}, //6038 #CJK UNIFIED IDEOGRAPH + {0xA0D5, 0x729D}, //6039 #CJK UNIFIED IDEOGRAPH + {0xA0D6, 0x729E}, //6040 #CJK UNIFIED IDEOGRAPH + {0xA0D7, 0x72A0}, //6041 #CJK UNIFIED IDEOGRAPH + {0xA0D8, 0x72A1}, //6042 #CJK UNIFIED IDEOGRAPH + {0xA0D9, 0x72A2}, //6043 #CJK UNIFIED IDEOGRAPH + {0xA0DA, 0x72A3}, //6044 #CJK UNIFIED IDEOGRAPH + {0xA0DB, 0x72A4}, //6045 #CJK UNIFIED IDEOGRAPH + {0xA0DC, 0x72A5}, //6046 #CJK UNIFIED IDEOGRAPH + {0xA0DD, 0x72A6}, //6047 #CJK UNIFIED IDEOGRAPH + {0xA0DE, 0x72A7}, //6048 #CJK UNIFIED IDEOGRAPH + {0xA0DF, 0x72A8}, //6049 #CJK UNIFIED IDEOGRAPH + {0xA0E0, 0x72A9}, //6050 #CJK UNIFIED IDEOGRAPH + {0xA0E1, 0x72AA}, //6051 #CJK UNIFIED IDEOGRAPH + {0xA0E2, 0x72AB}, //6052 #CJK UNIFIED IDEOGRAPH + {0xA0E3, 0x72AE}, //6053 #CJK UNIFIED IDEOGRAPH + {0xA0E4, 0x72B1}, //6054 #CJK UNIFIED IDEOGRAPH + {0xA0E5, 0x72B2}, //6055 #CJK UNIFIED IDEOGRAPH + {0xA0E6, 0x72B3}, //6056 #CJK UNIFIED IDEOGRAPH + {0xA0E7, 0x72B5}, //6057 #CJK UNIFIED IDEOGRAPH + {0xA0E8, 0x72BA}, //6058 #CJK UNIFIED IDEOGRAPH + {0xA0E9, 0x72BB}, //6059 #CJK UNIFIED IDEOGRAPH + {0xA0EA, 0x72BC}, //6060 #CJK UNIFIED IDEOGRAPH + {0xA0EB, 0x72BD}, //6061 #CJK UNIFIED IDEOGRAPH + {0xA0EC, 0x72BE}, //6062 #CJK UNIFIED IDEOGRAPH + {0xA0ED, 0x72BF}, //6063 #CJK UNIFIED IDEOGRAPH + {0xA0EE, 0x72C0}, //6064 #CJK UNIFIED IDEOGRAPH + {0xA0EF, 0x72C5}, //6065 #CJK UNIFIED IDEOGRAPH + {0xA0F0, 0x72C6}, //6066 #CJK UNIFIED IDEOGRAPH + {0xA0F1, 0x72C7}, //6067 #CJK UNIFIED IDEOGRAPH + {0xA0F2, 0x72C9}, //6068 #CJK UNIFIED IDEOGRAPH + {0xA0F3, 0x72CA}, //6069 #CJK UNIFIED IDEOGRAPH + {0xA0F4, 0x72CB}, //6070 #CJK UNIFIED IDEOGRAPH + {0xA0F5, 0x72CC}, //6071 #CJK UNIFIED IDEOGRAPH + {0xA0F6, 0x72CF}, //6072 #CJK UNIFIED IDEOGRAPH + {0xA0F7, 0x72D1}, //6073 #CJK UNIFIED IDEOGRAPH + {0xA0F8, 0x72D3}, //6074 #CJK UNIFIED IDEOGRAPH + {0xA0F9, 0x72D4}, //6075 #CJK UNIFIED IDEOGRAPH + {0xA0FA, 0x72D5}, //6076 #CJK UNIFIED IDEOGRAPH + {0xA0FB, 0x72D6}, //6077 #CJK UNIFIED IDEOGRAPH + {0xA0FC, 0x72D8}, //6078 #CJK UNIFIED IDEOGRAPH + {0xA0FD, 0x72DA}, //6079 #CJK UNIFIED IDEOGRAPH + {0xA0FE, 0x72DB}, //6080 #CJK UNIFIED IDEOGRAPH + {0xA1A1, 0x3000}, //6081 #IDEOGRAPHIC SPACE + {0xA1A2, 0x3001}, //6082 #IDEOGRAPHIC COMMA + {0xA1A3, 0x3002}, //6083 #IDEOGRAPHIC FULL STOP + {0xA1A4, 0x00B7}, //6084 #MIDDLE DOT + {0xA1A5, 0x02C9}, //6085 #MODIFIER LETTER MACRON + {0xA1A6, 0x02C7}, //6086 #CARON + {0xA1A7, 0x00A8}, //6087 #DIAERESIS + {0xA1A8, 0x3003}, //6088 #DITTO MARK + {0xA1A9, 0x3005}, //6089 #IDEOGRAPHIC ITERATION MARK + {0xA1AA, 0x2014}, //6090 #EM DASH + {0xA1AB, 0xFF5E}, //6091 #FULLWIDTH TILDE + {0xA1AC, 0x2016}, //6092 #DOUBLE VERTICAL LINE + {0xA1AD, 0x2026}, //6093 #HORIZONTAL ELLIPSIS + {0xA1AE, 0x2018}, //6094 #LEFT SINGLE QUOTATION MARK + {0xA1AF, 0x2019}, //6095 #RIGHT SINGLE QUOTATION MARK + {0xA1B0, 0x201C}, //6096 #LEFT DOUBLE QUOTATION MARK + {0xA1B1, 0x201D}, //6097 #RIGHT DOUBLE QUOTATION MARK + {0xA1B2, 0x3014}, //6098 #LEFT TORTOISE SHELL BRACKET + {0xA1B3, 0x3015}, //6099 #RIGHT TORTOISE SHELL BRACKET + {0xA1B4, 0x3008}, //6100 #LEFT ANGLE BRACKET + {0xA1B5, 0x3009}, //6101 #RIGHT ANGLE BRACKET + {0xA1B6, 0x300A}, //6102 #LEFT DOUBLE ANGLE BRACKET + {0xA1B7, 0x300B}, //6103 #RIGHT DOUBLE ANGLE BRACKET + {0xA1B8, 0x300C}, //6104 #LEFT CORNER BRACKET + {0xA1B9, 0x300D}, //6105 #RIGHT CORNER BRACKET + {0xA1BA, 0x300E}, //6106 #LEFT WHITE CORNER BRACKET + {0xA1BB, 0x300F}, //6107 #RIGHT WHITE CORNER BRACKET + {0xA1BC, 0x3016}, //6108 #LEFT WHITE LENTICULAR BRACKET + {0xA1BD, 0x3017}, //6109 #RIGHT WHITE LENTICULAR BRACKET + {0xA1BE, 0x3010}, //6110 #LEFT BLACK LENTICULAR BRACKET + {0xA1BF, 0x3011}, //6111 #RIGHT BLACK LENTICULAR BRACKET + {0xA1C0, 0x00B1}, //6112 #PLUS-MINUS SIGN + {0xA1C1, 0x00D7}, //6113 #MULTIPLICATION SIGN + {0xA1C2, 0x00F7}, //6114 #DIVISION SIGN + {0xA1C3, 0x2236}, //6115 #RATIO + {0xA1C4, 0x2227}, //6116 #LOGICAL AND + {0xA1C5, 0x2228}, //6117 #LOGICAL OR + {0xA1C6, 0x2211}, //6118 #N-ARY SUMMATION + {0xA1C7, 0x220F}, //6119 #N-ARY PRODUCT + {0xA1C8, 0x222A}, //6120 #UNION + {0xA1C9, 0x2229}, //6121 #INTERSECTION + {0xA1CA, 0x2208}, //6122 #ELEMENT OF + {0xA1CB, 0x2237}, //6123 #PROPORTION + {0xA1CC, 0x221A}, //6124 #SQUARE ROOT + {0xA1CD, 0x22A5}, //6125 #UP TACK + {0xA1CE, 0x2225}, //6126 #PARALLEL TO + {0xA1CF, 0x2220}, //6127 #ANGLE + {0xA1D0, 0x2312}, //6128 #ARC + {0xA1D1, 0x2299}, //6129 #CIRCLED DOT OPERATOR + {0xA1D2, 0x222B}, //6130 #INTEGRAL + {0xA1D3, 0x222E}, //6131 #CONTOUR INTEGRAL + {0xA1D4, 0x2261}, //6132 #IDENTICAL TO + {0xA1D5, 0x224C}, //6133 #ALL EQUAL TO + {0xA1D6, 0x2248}, //6134 #ALMOST EQUAL TO + {0xA1D7, 0x223D}, //6135 #REVERSED TILDE + {0xA1D8, 0x221D}, //6136 #PROPORTIONAL TO + {0xA1D9, 0x2260}, //6137 #NOT EQUAL TO + {0xA1DA, 0x226E}, //6138 #NOT LESS-THAN + {0xA1DB, 0x226F}, //6139 #NOT GREATER-THAN + {0xA1DC, 0x2264}, //6140 #LESS-THAN OR EQUAL TO + {0xA1DD, 0x2265}, //6141 #GREATER-THAN OR EQUAL TO + {0xA1DE, 0x221E}, //6142 #INFINITY + {0xA1DF, 0x2235}, //6143 #BECAUSE + {0xA1E0, 0x2234}, //6144 #THEREFORE + {0xA1E1, 0x2642}, //6145 #MALE SIGN + {0xA1E2, 0x2640}, //6146 #FEMALE SIGN + {0xA1E3, 0x00B0}, //6147 #DEGREE SIGN + {0xA1E4, 0x2032}, //6148 #PRIME + {0xA1E5, 0x2033}, //6149 #DOUBLE PRIME + {0xA1E6, 0x2103}, //6150 #DEGREE CELSIUS + {0xA1E7, 0xFF04}, //6151 #FULLWIDTH DOLLAR SIGN + {0xA1E8, 0x00A4}, //6152 #CURRENCY SIGN + {0xA1E9, 0xFFE0}, //6153 #FULLWIDTH CENT SIGN + {0xA1EA, 0xFFE1}, //6154 #FULLWIDTH POUND SIGN + {0xA1EB, 0x2030}, //6155 #PER MILLE SIGN + {0xA1EC, 0x00A7}, //6156 #SECTION SIGN + {0xA1ED, 0x2116}, //6157 #NUMERO SIGN + {0xA1EE, 0x2606}, //6158 #WHITE STAR + {0xA1EF, 0x2605}, //6159 #BLACK STAR + {0xA1F0, 0x25CB}, //6160 #WHITE CIRCLE + {0xA1F1, 0x25CF}, //6161 #BLACK CIRCLE + {0xA1F2, 0x25CE}, //6162 #BULLSEYE + {0xA1F3, 0x25C7}, //6163 #WHITE DIAMOND + {0xA1F4, 0x25C6}, //6164 #BLACK DIAMOND + {0xA1F5, 0x25A1}, //6165 #WHITE SQUARE + {0xA1F6, 0x25A0}, //6166 #BLACK SQUARE + {0xA1F7, 0x25B3}, //6167 #WHITE UP-POINTING TRIANGLE + {0xA1F8, 0x25B2}, //6168 #BLACK UP-POINTING TRIANGLE + {0xA1F9, 0x203B}, //6169 #REFERENCE MARK + {0xA1FA, 0x2192}, //6170 #RIGHTWARDS ARROW + {0xA1FB, 0x2190}, //6171 #LEFTWARDS ARROW + {0xA1FC, 0x2191}, //6172 #UPWARDS ARROW + {0xA1FD, 0x2193}, //6173 #DOWNWARDS ARROW + {0xA1FE, 0x3013}, //6174 #GETA MARK + {0xA2A1, 0x2170}, //6175 #SMALL ROMAN NUMERAL ONE + {0xA2A2, 0x2171}, //6176 #SMALL ROMAN NUMERAL TWO + {0xA2A3, 0x2172}, //6177 #SMALL ROMAN NUMERAL THREE + {0xA2A4, 0x2173}, //6178 #SMALL ROMAN NUMERAL FOUR + {0xA2A5, 0x2174}, //6179 #SMALL ROMAN NUMERAL FIVE + {0xA2A6, 0x2175}, //6180 #SMALL ROMAN NUMERAL SIX + {0xA2A7, 0x2176}, //6181 #SMALL ROMAN NUMERAL SEVEN + {0xA2A8, 0x2177}, //6182 #SMALL ROMAN NUMERAL EIGHT + {0xA2A9, 0x2178}, //6183 #SMALL ROMAN NUMERAL NINE + {0xA2AA, 0x2179}, //6184 #SMALL ROMAN NUMERAL TEN + {0xA2B1, 0x2488}, //6185 #DIGIT ONE FULL STOP + {0xA2B2, 0x2489}, //6186 #DIGIT TWO FULL STOP + {0xA2B3, 0x248A}, //6187 #DIGIT THREE FULL STOP + {0xA2B4, 0x248B}, //6188 #DIGIT FOUR FULL STOP + {0xA2B5, 0x248C}, //6189 #DIGIT FIVE FULL STOP + {0xA2B6, 0x248D}, //6190 #DIGIT SIX FULL STOP + {0xA2B7, 0x248E}, //6191 #DIGIT SEVEN FULL STOP + {0xA2B8, 0x248F}, //6192 #DIGIT EIGHT FULL STOP + {0xA2B9, 0x2490}, //6193 #DIGIT NINE FULL STOP + {0xA2BA, 0x2491}, //6194 #NUMBER TEN FULL STOP + {0xA2BB, 0x2492}, //6195 #NUMBER ELEVEN FULL STOP + {0xA2BC, 0x2493}, //6196 #NUMBER TWELVE FULL STOP + {0xA2BD, 0x2494}, //6197 #NUMBER THIRTEEN FULL STOP + {0xA2BE, 0x2495}, //6198 #NUMBER FOURTEEN FULL STOP + {0xA2BF, 0x2496}, //6199 #NUMBER FIFTEEN FULL STOP + {0xA2C0, 0x2497}, //6200 #NUMBER SIXTEEN FULL STOP + {0xA2C1, 0x2498}, //6201 #NUMBER SEVENTEEN FULL STOP + {0xA2C2, 0x2499}, //6202 #NUMBER EIGHTEEN FULL STOP + {0xA2C3, 0x249A}, //6203 #NUMBER NINETEEN FULL STOP + {0xA2C4, 0x249B}, //6204 #NUMBER TWENTY FULL STOP + {0xA2C5, 0x2474}, //6205 #PARENTHESIZED DIGIT ONE + {0xA2C6, 0x2475}, //6206 #PARENTHESIZED DIGIT TWO + {0xA2C7, 0x2476}, //6207 #PARENTHESIZED DIGIT THREE + {0xA2C8, 0x2477}, //6208 #PARENTHESIZED DIGIT FOUR + {0xA2C9, 0x2478}, //6209 #PARENTHESIZED DIGIT FIVE + {0xA2CA, 0x2479}, //6210 #PARENTHESIZED DIGIT SIX + {0xA2CB, 0x247A}, //6211 #PARENTHESIZED DIGIT SEVEN + {0xA2CC, 0x247B}, //6212 #PARENTHESIZED DIGIT EIGHT + {0xA2CD, 0x247C}, //6213 #PARENTHESIZED DIGIT NINE + {0xA2CE, 0x247D}, //6214 #PARENTHESIZED NUMBER TEN + {0xA2CF, 0x247E}, //6215 #PARENTHESIZED NUMBER ELEVEN + {0xA2D0, 0x247F}, //6216 #PARENTHESIZED NUMBER TWELVE + {0xA2D1, 0x2480}, //6217 #PARENTHESIZED NUMBER THIRTEEN + {0xA2D2, 0x2481}, //6218 #PARENTHESIZED NUMBER FOURTEEN + {0xA2D3, 0x2482}, //6219 #PARENTHESIZED NUMBER FIFTEEN + {0xA2D4, 0x2483}, //6220 #PARENTHESIZED NUMBER SIXTEEN + {0xA2D5, 0x2484}, //6221 #PARENTHESIZED NUMBER SEVENTEEN + {0xA2D6, 0x2485}, //6222 #PARENTHESIZED NUMBER EIGHTEEN + {0xA2D7, 0x2486}, //6223 #PARENTHESIZED NUMBER NINETEEN + {0xA2D8, 0x2487}, //6224 #PARENTHESIZED NUMBER TWENTY + {0xA2D9, 0x2460}, //6225 #CIRCLED DIGIT ONE + {0xA2DA, 0x2461}, //6226 #CIRCLED DIGIT TWO + {0xA2DB, 0x2462}, //6227 #CIRCLED DIGIT THREE + {0xA2DC, 0x2463}, //6228 #CIRCLED DIGIT FOUR + {0xA2DD, 0x2464}, //6229 #CIRCLED DIGIT FIVE + {0xA2DE, 0x2465}, //6230 #CIRCLED DIGIT SIX + {0xA2DF, 0x2466}, //6231 #CIRCLED DIGIT SEVEN + {0xA2E0, 0x2467}, //6232 #CIRCLED DIGIT EIGHT + {0xA2E1, 0x2468}, //6233 #CIRCLED DIGIT NINE + {0xA2E2, 0x2469}, //6234 #CIRCLED NUMBER TEN + {0xA2E5, 0x3220}, //6235 #PARENTHESIZED IDEOGRAPH ONE + {0xA2E6, 0x3221}, //6236 #PARENTHESIZED IDEOGRAPH TWO + {0xA2E7, 0x3222}, //6237 #PARENTHESIZED IDEOGRAPH THREE + {0xA2E8, 0x3223}, //6238 #PARENTHESIZED IDEOGRAPH FOUR + {0xA2E9, 0x3224}, //6239 #PARENTHESIZED IDEOGRAPH FIVE + {0xA2EA, 0x3225}, //6240 #PARENTHESIZED IDEOGRAPH SIX + {0xA2EB, 0x3226}, //6241 #PARENTHESIZED IDEOGRAPH SEVEN + {0xA2EC, 0x3227}, //6242 #PARENTHESIZED IDEOGRAPH EIGHT + {0xA2ED, 0x3228}, //6243 #PARENTHESIZED IDEOGRAPH NINE + {0xA2EE, 0x3229}, //6244 #PARENTHESIZED IDEOGRAPH TEN + {0xA2F1, 0x2160}, //6245 #ROMAN NUMERAL ONE + {0xA2F2, 0x2161}, //6246 #ROMAN NUMERAL TWO + {0xA2F3, 0x2162}, //6247 #ROMAN NUMERAL THREE + {0xA2F4, 0x2163}, //6248 #ROMAN NUMERAL FOUR + {0xA2F5, 0x2164}, //6249 #ROMAN NUMERAL FIVE + {0xA2F6, 0x2165}, //6250 #ROMAN NUMERAL SIX + {0xA2F7, 0x2166}, //6251 #ROMAN NUMERAL SEVEN + {0xA2F8, 0x2167}, //6252 #ROMAN NUMERAL EIGHT + {0xA2F9, 0x2168}, //6253 #ROMAN NUMERAL NINE + {0xA2FA, 0x2169}, //6254 #ROMAN NUMERAL TEN + {0xA2FB, 0x216A}, //6255 #ROMAN NUMERAL ELEVEN + {0xA2FC, 0x216B}, //6256 #ROMAN NUMERAL TWELVE + {0xA3A1, 0xFF01}, //6257 #FULLWIDTH EXCLAMATION MARK + {0xA3A2, 0xFF02}, //6258 #FULLWIDTH QUOTATION MARK + {0xA3A3, 0xFF03}, //6259 #FULLWIDTH NUMBER SIGN + {0xA3A4, 0xFFE5}, //6260 #FULLWIDTH YEN SIGN + {0xA3A5, 0xFF05}, //6261 #FULLWIDTH PERCENT SIGN + {0xA3A6, 0xFF06}, //6262 #FULLWIDTH AMPERSAND + {0xA3A7, 0xFF07}, //6263 #FULLWIDTH APOSTROPHE + {0xA3A8, 0xFF08}, //6264 #FULLWIDTH LEFT PARENTHESIS + {0xA3A9, 0xFF09}, //6265 #FULLWIDTH RIGHT PARENTHESIS + {0xA3AA, 0xFF0A}, //6266 #FULLWIDTH ASTERISK + {0xA3AB, 0xFF0B}, //6267 #FULLWIDTH PLUS SIGN + {0xA3AC, 0xFF0C}, //6268 #FULLWIDTH COMMA + {0xA3AD, 0xFF0D}, //6269 #FULLWIDTH HYPHEN-MINUS + {0xA3AE, 0xFF0E}, //6270 #FULLWIDTH FULL STOP + {0xA3AF, 0xFF0F}, //6271 #FULLWIDTH SOLIDUS + {0xA3B0, 0xFF10}, //6272 #FULLWIDTH DIGIT ZERO + {0xA3B1, 0xFF11}, //6273 #FULLWIDTH DIGIT ONE + {0xA3B2, 0xFF12}, //6274 #FULLWIDTH DIGIT TWO + {0xA3B3, 0xFF13}, //6275 #FULLWIDTH DIGIT THREE + {0xA3B4, 0xFF14}, //6276 #FULLWIDTH DIGIT FOUR + {0xA3B5, 0xFF15}, //6277 #FULLWIDTH DIGIT FIVE + {0xA3B6, 0xFF16}, //6278 #FULLWIDTH DIGIT SIX + {0xA3B7, 0xFF17}, //6279 #FULLWIDTH DIGIT SEVEN + {0xA3B8, 0xFF18}, //6280 #FULLWIDTH DIGIT EIGHT + {0xA3B9, 0xFF19}, //6281 #FULLWIDTH DIGIT NINE + {0xA3BA, 0xFF1A}, //6282 #FULLWIDTH COLON + {0xA3BB, 0xFF1B}, //6283 #FULLWIDTH SEMICOLON + {0xA3BC, 0xFF1C}, //6284 #FULLWIDTH LESS-THAN SIGN + {0xA3BD, 0xFF1D}, //6285 #FULLWIDTH EQUALS SIGN + {0xA3BE, 0xFF1E}, //6286 #FULLWIDTH GREATER-THAN SIGN + {0xA3BF, 0xFF1F}, //6287 #FULLWIDTH QUESTION MARK + {0xA3C0, 0xFF20}, //6288 #FULLWIDTH COMMERCIAL AT + {0xA3C1, 0xFF21}, //6289 #FULLWIDTH LATIN CAPITAL LETTER A + {0xA3C2, 0xFF22}, //6290 #FULLWIDTH LATIN CAPITAL LETTER B + {0xA3C3, 0xFF23}, //6291 #FULLWIDTH LATIN CAPITAL LETTER C + {0xA3C4, 0xFF24}, //6292 #FULLWIDTH LATIN CAPITAL LETTER D + {0xA3C5, 0xFF25}, //6293 #FULLWIDTH LATIN CAPITAL LETTER E + {0xA3C6, 0xFF26}, //6294 #FULLWIDTH LATIN CAPITAL LETTER F + {0xA3C7, 0xFF27}, //6295 #FULLWIDTH LATIN CAPITAL LETTER G + {0xA3C8, 0xFF28}, //6296 #FULLWIDTH LATIN CAPITAL LETTER H + {0xA3C9, 0xFF29}, //6297 #FULLWIDTH LATIN CAPITAL LETTER I + {0xA3CA, 0xFF2A}, //6298 #FULLWIDTH LATIN CAPITAL LETTER J + {0xA3CB, 0xFF2B}, //6299 #FULLWIDTH LATIN CAPITAL LETTER K + {0xA3CC, 0xFF2C}, //6300 #FULLWIDTH LATIN CAPITAL LETTER L + {0xA3CD, 0xFF2D}, //6301 #FULLWIDTH LATIN CAPITAL LETTER M + {0xA3CE, 0xFF2E}, //6302 #FULLWIDTH LATIN CAPITAL LETTER N + {0xA3CF, 0xFF2F}, //6303 #FULLWIDTH LATIN CAPITAL LETTER O + {0xA3D0, 0xFF30}, //6304 #FULLWIDTH LATIN CAPITAL LETTER P + {0xA3D1, 0xFF31}, //6305 #FULLWIDTH LATIN CAPITAL LETTER Q + {0xA3D2, 0xFF32}, //6306 #FULLWIDTH LATIN CAPITAL LETTER R + {0xA3D3, 0xFF33}, //6307 #FULLWIDTH LATIN CAPITAL LETTER S + {0xA3D4, 0xFF34}, //6308 #FULLWIDTH LATIN CAPITAL LETTER T + {0xA3D5, 0xFF35}, //6309 #FULLWIDTH LATIN CAPITAL LETTER U + {0xA3D6, 0xFF36}, //6310 #FULLWIDTH LATIN CAPITAL LETTER V + {0xA3D7, 0xFF37}, //6311 #FULLWIDTH LATIN CAPITAL LETTER W + {0xA3D8, 0xFF38}, //6312 #FULLWIDTH LATIN CAPITAL LETTER X + {0xA3D9, 0xFF39}, //6313 #FULLWIDTH LATIN CAPITAL LETTER Y + {0xA3DA, 0xFF3A}, //6314 #FULLWIDTH LATIN CAPITAL LETTER Z + {0xA3DB, 0xFF3B}, //6315 #FULLWIDTH LEFT SQUARE BRACKET + {0xA3DC, 0xFF3C}, //6316 #FULLWIDTH REVERSE SOLIDUS + {0xA3DD, 0xFF3D}, //6317 #FULLWIDTH RIGHT SQUARE BRACKET + {0xA3DE, 0xFF3E}, //6318 #FULLWIDTH CIRCUMFLEX ACCENT + {0xA3DF, 0xFF3F}, //6319 #FULLWIDTH LOW LINE + {0xA3E0, 0xFF40}, //6320 #FULLWIDTH GRAVE ACCENT + {0xA3E1, 0xFF41}, //6321 #FULLWIDTH LATIN SMALL LETTER A + {0xA3E2, 0xFF42}, //6322 #FULLWIDTH LATIN SMALL LETTER B + {0xA3E3, 0xFF43}, //6323 #FULLWIDTH LATIN SMALL LETTER C + {0xA3E4, 0xFF44}, //6324 #FULLWIDTH LATIN SMALL LETTER D + {0xA3E5, 0xFF45}, //6325 #FULLWIDTH LATIN SMALL LETTER E + {0xA3E6, 0xFF46}, //6326 #FULLWIDTH LATIN SMALL LETTER F + {0xA3E7, 0xFF47}, //6327 #FULLWIDTH LATIN SMALL LETTER G + {0xA3E8, 0xFF48}, //6328 #FULLWIDTH LATIN SMALL LETTER H + {0xA3E9, 0xFF49}, //6329 #FULLWIDTH LATIN SMALL LETTER I + {0xA3EA, 0xFF4A}, //6330 #FULLWIDTH LATIN SMALL LETTER J + {0xA3EB, 0xFF4B}, //6331 #FULLWIDTH LATIN SMALL LETTER K + {0xA3EC, 0xFF4C}, //6332 #FULLWIDTH LATIN SMALL LETTER L + {0xA3ED, 0xFF4D}, //6333 #FULLWIDTH LATIN SMALL LETTER M + {0xA3EE, 0xFF4E}, //6334 #FULLWIDTH LATIN SMALL LETTER N + {0xA3EF, 0xFF4F}, //6335 #FULLWIDTH LATIN SMALL LETTER O + {0xA3F0, 0xFF50}, //6336 #FULLWIDTH LATIN SMALL LETTER P + {0xA3F1, 0xFF51}, //6337 #FULLWIDTH LATIN SMALL LETTER Q + {0xA3F2, 0xFF52}, //6338 #FULLWIDTH LATIN SMALL LETTER R + {0xA3F3, 0xFF53}, //6339 #FULLWIDTH LATIN SMALL LETTER S + {0xA3F4, 0xFF54}, //6340 #FULLWIDTH LATIN SMALL LETTER T + {0xA3F5, 0xFF55}, //6341 #FULLWIDTH LATIN SMALL LETTER U + {0xA3F6, 0xFF56}, //6342 #FULLWIDTH LATIN SMALL LETTER V + {0xA3F7, 0xFF57}, //6343 #FULLWIDTH LATIN SMALL LETTER W + {0xA3F8, 0xFF58}, //6344 #FULLWIDTH LATIN SMALL LETTER X + {0xA3F9, 0xFF59}, //6345 #FULLWIDTH LATIN SMALL LETTER Y + {0xA3FA, 0xFF5A}, //6346 #FULLWIDTH LATIN SMALL LETTER Z + {0xA3FB, 0xFF5B}, //6347 #FULLWIDTH LEFT CURLY BRACKET + {0xA3FC, 0xFF5C}, //6348 #FULLWIDTH VERTICAL LINE + {0xA3FD, 0xFF5D}, //6349 #FULLWIDTH RIGHT CURLY BRACKET + {0xA3FE, 0xFFE3}, //6350 #FULLWIDTH MACRON + {0xA4A1, 0x3041}, //6351 #HIRAGANA LETTER SMALL A + {0xA4A2, 0x3042}, //6352 #HIRAGANA LETTER A + {0xA4A3, 0x3043}, //6353 #HIRAGANA LETTER SMALL I + {0xA4A4, 0x3044}, //6354 #HIRAGANA LETTER I + {0xA4A5, 0x3045}, //6355 #HIRAGANA LETTER SMALL U + {0xA4A6, 0x3046}, //6356 #HIRAGANA LETTER U + {0xA4A7, 0x3047}, //6357 #HIRAGANA LETTER SMALL E + {0xA4A8, 0x3048}, //6358 #HIRAGANA LETTER E + {0xA4A9, 0x3049}, //6359 #HIRAGANA LETTER SMALL O + {0xA4AA, 0x304A}, //6360 #HIRAGANA LETTER O + {0xA4AB, 0x304B}, //6361 #HIRAGANA LETTER KA + {0xA4AC, 0x304C}, //6362 #HIRAGANA LETTER GA + {0xA4AD, 0x304D}, //6363 #HIRAGANA LETTER KI + {0xA4AE, 0x304E}, //6364 #HIRAGANA LETTER GI + {0xA4AF, 0x304F}, //6365 #HIRAGANA LETTER KU + {0xA4B0, 0x3050}, //6366 #HIRAGANA LETTER GU + {0xA4B1, 0x3051}, //6367 #HIRAGANA LETTER KE + {0xA4B2, 0x3052}, //6368 #HIRAGANA LETTER GE + {0xA4B3, 0x3053}, //6369 #HIRAGANA LETTER KO + {0xA4B4, 0x3054}, //6370 #HIRAGANA LETTER GO + {0xA4B5, 0x3055}, //6371 #HIRAGANA LETTER SA + {0xA4B6, 0x3056}, //6372 #HIRAGANA LETTER ZA + {0xA4B7, 0x3057}, //6373 #HIRAGANA LETTER SI + {0xA4B8, 0x3058}, //6374 #HIRAGANA LETTER ZI + {0xA4B9, 0x3059}, //6375 #HIRAGANA LETTER SU + {0xA4BA, 0x305A}, //6376 #HIRAGANA LETTER ZU + {0xA4BB, 0x305B}, //6377 #HIRAGANA LETTER SE + {0xA4BC, 0x305C}, //6378 #HIRAGANA LETTER ZE + {0xA4BD, 0x305D}, //6379 #HIRAGANA LETTER SO + {0xA4BE, 0x305E}, //6380 #HIRAGANA LETTER ZO + {0xA4BF, 0x305F}, //6381 #HIRAGANA LETTER TA + {0xA4C0, 0x3060}, //6382 #HIRAGANA LETTER DA + {0xA4C1, 0x3061}, //6383 #HIRAGANA LETTER TI + {0xA4C2, 0x3062}, //6384 #HIRAGANA LETTER DI + {0xA4C3, 0x3063}, //6385 #HIRAGANA LETTER SMALL TU + {0xA4C4, 0x3064}, //6386 #HIRAGANA LETTER TU + {0xA4C5, 0x3065}, //6387 #HIRAGANA LETTER DU + {0xA4C6, 0x3066}, //6388 #HIRAGANA LETTER TE + {0xA4C7, 0x3067}, //6389 #HIRAGANA LETTER DE + {0xA4C8, 0x3068}, //6390 #HIRAGANA LETTER TO + {0xA4C9, 0x3069}, //6391 #HIRAGANA LETTER DO + {0xA4CA, 0x306A}, //6392 #HIRAGANA LETTER NA + {0xA4CB, 0x306B}, //6393 #HIRAGANA LETTER NI + {0xA4CC, 0x306C}, //6394 #HIRAGANA LETTER NU + {0xA4CD, 0x306D}, //6395 #HIRAGANA LETTER NE + {0xA4CE, 0x306E}, //6396 #HIRAGANA LETTER NO + {0xA4CF, 0x306F}, //6397 #HIRAGANA LETTER HA + {0xA4D0, 0x3070}, //6398 #HIRAGANA LETTER BA + {0xA4D1, 0x3071}, //6399 #HIRAGANA LETTER PA + {0xA4D2, 0x3072}, //6400 #HIRAGANA LETTER HI + {0xA4D3, 0x3073}, //6401 #HIRAGANA LETTER BI + {0xA4D4, 0x3074}, //6402 #HIRAGANA LETTER PI + {0xA4D5, 0x3075}, //6403 #HIRAGANA LETTER HU + {0xA4D6, 0x3076}, //6404 #HIRAGANA LETTER BU + {0xA4D7, 0x3077}, //6405 #HIRAGANA LETTER PU + {0xA4D8, 0x3078}, //6406 #HIRAGANA LETTER HE + {0xA4D9, 0x3079}, //6407 #HIRAGANA LETTER BE + {0xA4DA, 0x307A}, //6408 #HIRAGANA LETTER PE + {0xA4DB, 0x307B}, //6409 #HIRAGANA LETTER HO + {0xA4DC, 0x307C}, //6410 #HIRAGANA LETTER BO + {0xA4DD, 0x307D}, //6411 #HIRAGANA LETTER PO + {0xA4DE, 0x307E}, //6412 #HIRAGANA LETTER MA + {0xA4DF, 0x307F}, //6413 #HIRAGANA LETTER MI + {0xA4E0, 0x3080}, //6414 #HIRAGANA LETTER MU + {0xA4E1, 0x3081}, //6415 #HIRAGANA LETTER ME + {0xA4E2, 0x3082}, //6416 #HIRAGANA LETTER MO + {0xA4E3, 0x3083}, //6417 #HIRAGANA LETTER SMALL YA + {0xA4E4, 0x3084}, //6418 #HIRAGANA LETTER YA + {0xA4E5, 0x3085}, //6419 #HIRAGANA LETTER SMALL YU + {0xA4E6, 0x3086}, //6420 #HIRAGANA LETTER YU + {0xA4E7, 0x3087}, //6421 #HIRAGANA LETTER SMALL YO + {0xA4E8, 0x3088}, //6422 #HIRAGANA LETTER YO + {0xA4E9, 0x3089}, //6423 #HIRAGANA LETTER RA + {0xA4EA, 0x308A}, //6424 #HIRAGANA LETTER RI + {0xA4EB, 0x308B}, //6425 #HIRAGANA LETTER RU + {0xA4EC, 0x308C}, //6426 #HIRAGANA LETTER RE + {0xA4ED, 0x308D}, //6427 #HIRAGANA LETTER RO + {0xA4EE, 0x308E}, //6428 #HIRAGANA LETTER SMALL WA + {0xA4EF, 0x308F}, //6429 #HIRAGANA LETTER WA + {0xA4F0, 0x3090}, //6430 #HIRAGANA LETTER WI + {0xA4F1, 0x3091}, //6431 #HIRAGANA LETTER WE + {0xA4F2, 0x3092}, //6432 #HIRAGANA LETTER WO + {0xA4F3, 0x3093}, //6433 #HIRAGANA LETTER N + {0xA5A1, 0x30A1}, //6434 #KATAKANA LETTER SMALL A + {0xA5A2, 0x30A2}, //6435 #KATAKANA LETTER A + {0xA5A3, 0x30A3}, //6436 #KATAKANA LETTER SMALL I + {0xA5A4, 0x30A4}, //6437 #KATAKANA LETTER I + {0xA5A5, 0x30A5}, //6438 #KATAKANA LETTER SMALL U + {0xA5A6, 0x30A6}, //6439 #KATAKANA LETTER U + {0xA5A7, 0x30A7}, //6440 #KATAKANA LETTER SMALL E + {0xA5A8, 0x30A8}, //6441 #KATAKANA LETTER E + {0xA5A9, 0x30A9}, //6442 #KATAKANA LETTER SMALL O + {0xA5AA, 0x30AA}, //6443 #KATAKANA LETTER O + {0xA5AB, 0x30AB}, //6444 #KATAKANA LETTER KA + {0xA5AC, 0x30AC}, //6445 #KATAKANA LETTER GA + {0xA5AD, 0x30AD}, //6446 #KATAKANA LETTER KI + {0xA5AE, 0x30AE}, //6447 #KATAKANA LETTER GI + {0xA5AF, 0x30AF}, //6448 #KATAKANA LETTER KU + {0xA5B0, 0x30B0}, //6449 #KATAKANA LETTER GU + {0xA5B1, 0x30B1}, //6450 #KATAKANA LETTER KE + {0xA5B2, 0x30B2}, //6451 #KATAKANA LETTER GE + {0xA5B3, 0x30B3}, //6452 #KATAKANA LETTER KO + {0xA5B4, 0x30B4}, //6453 #KATAKANA LETTER GO + {0xA5B5, 0x30B5}, //6454 #KATAKANA LETTER SA + {0xA5B6, 0x30B6}, //6455 #KATAKANA LETTER ZA + {0xA5B7, 0x30B7}, //6456 #KATAKANA LETTER SI + {0xA5B8, 0x30B8}, //6457 #KATAKANA LETTER ZI + {0xA5B9, 0x30B9}, //6458 #KATAKANA LETTER SU + {0xA5BA, 0x30BA}, //6459 #KATAKANA LETTER ZU + {0xA5BB, 0x30BB}, //6460 #KATAKANA LETTER SE + {0xA5BC, 0x30BC}, //6461 #KATAKANA LETTER ZE + {0xA5BD, 0x30BD}, //6462 #KATAKANA LETTER SO + {0xA5BE, 0x30BE}, //6463 #KATAKANA LETTER ZO + {0xA5BF, 0x30BF}, //6464 #KATAKANA LETTER TA + {0xA5C0, 0x30C0}, //6465 #KATAKANA LETTER DA + {0xA5C1, 0x30C1}, //6466 #KATAKANA LETTER TI + {0xA5C2, 0x30C2}, //6467 #KATAKANA LETTER DI + {0xA5C3, 0x30C3}, //6468 #KATAKANA LETTER SMALL TU + {0xA5C4, 0x30C4}, //6469 #KATAKANA LETTER TU + {0xA5C5, 0x30C5}, //6470 #KATAKANA LETTER DU + {0xA5C6, 0x30C6}, //6471 #KATAKANA LETTER TE + {0xA5C7, 0x30C7}, //6472 #KATAKANA LETTER DE + {0xA5C8, 0x30C8}, //6473 #KATAKANA LETTER TO + {0xA5C9, 0x30C9}, //6474 #KATAKANA LETTER DO + {0xA5CA, 0x30CA}, //6475 #KATAKANA LETTER NA + {0xA5CB, 0x30CB}, //6476 #KATAKANA LETTER NI + {0xA5CC, 0x30CC}, //6477 #KATAKANA LETTER NU + {0xA5CD, 0x30CD}, //6478 #KATAKANA LETTER NE + {0xA5CE, 0x30CE}, //6479 #KATAKANA LETTER NO + {0xA5CF, 0x30CF}, //6480 #KATAKANA LETTER HA + {0xA5D0, 0x30D0}, //6481 #KATAKANA LETTER BA + {0xA5D1, 0x30D1}, //6482 #KATAKANA LETTER PA + {0xA5D2, 0x30D2}, //6483 #KATAKANA LETTER HI + {0xA5D3, 0x30D3}, //6484 #KATAKANA LETTER BI + {0xA5D4, 0x30D4}, //6485 #KATAKANA LETTER PI + {0xA5D5, 0x30D5}, //6486 #KATAKANA LETTER HU + {0xA5D6, 0x30D6}, //6487 #KATAKANA LETTER BU + {0xA5D7, 0x30D7}, //6488 #KATAKANA LETTER PU + {0xA5D8, 0x30D8}, //6489 #KATAKANA LETTER HE + {0xA5D9, 0x30D9}, //6490 #KATAKANA LETTER BE + {0xA5DA, 0x30DA}, //6491 #KATAKANA LETTER PE + {0xA5DB, 0x30DB}, //6492 #KATAKANA LETTER HO + {0xA5DC, 0x30DC}, //6493 #KATAKANA LETTER BO + {0xA5DD, 0x30DD}, //6494 #KATAKANA LETTER PO + {0xA5DE, 0x30DE}, //6495 #KATAKANA LETTER MA + {0xA5DF, 0x30DF}, //6496 #KATAKANA LETTER MI + {0xA5E0, 0x30E0}, //6497 #KATAKANA LETTER MU + {0xA5E1, 0x30E1}, //6498 #KATAKANA LETTER ME + {0xA5E2, 0x30E2}, //6499 #KATAKANA LETTER MO + {0xA5E3, 0x30E3}, //6500 #KATAKANA LETTER SMALL YA + {0xA5E4, 0x30E4}, //6501 #KATAKANA LETTER YA + {0xA5E5, 0x30E5}, //6502 #KATAKANA LETTER SMALL YU + {0xA5E6, 0x30E6}, //6503 #KATAKANA LETTER YU + {0xA5E7, 0x30E7}, //6504 #KATAKANA LETTER SMALL YO + {0xA5E8, 0x30E8}, //6505 #KATAKANA LETTER YO + {0xA5E9, 0x30E9}, //6506 #KATAKANA LETTER RA + {0xA5EA, 0x30EA}, //6507 #KATAKANA LETTER RI + {0xA5EB, 0x30EB}, //6508 #KATAKANA LETTER RU + {0xA5EC, 0x30EC}, //6509 #KATAKANA LETTER RE + {0xA5ED, 0x30ED}, //6510 #KATAKANA LETTER RO + {0xA5EE, 0x30EE}, //6511 #KATAKANA LETTER SMALL WA + {0xA5EF, 0x30EF}, //6512 #KATAKANA LETTER WA + {0xA5F0, 0x30F0}, //6513 #KATAKANA LETTER WI + {0xA5F1, 0x30F1}, //6514 #KATAKANA LETTER WE + {0xA5F2, 0x30F2}, //6515 #KATAKANA LETTER WO + {0xA5F3, 0x30F3}, //6516 #KATAKANA LETTER N + {0xA5F4, 0x30F4}, //6517 #KATAKANA LETTER VU + {0xA5F5, 0x30F5}, //6518 #KATAKANA LETTER SMALL KA + {0xA5F6, 0x30F6}, //6519 #KATAKANA LETTER SMALL KE + {0xA6A1, 0x0391}, //6520 #GREEK CAPITAL LETTER ALPHA + {0xA6A2, 0x0392}, //6521 #GREEK CAPITAL LETTER BETA + {0xA6A3, 0x0393}, //6522 #GREEK CAPITAL LETTER GAMMA + {0xA6A4, 0x0394}, //6523 #GREEK CAPITAL LETTER DELTA + {0xA6A5, 0x0395}, //6524 #GREEK CAPITAL LETTER EPSILON + {0xA6A6, 0x0396}, //6525 #GREEK CAPITAL LETTER ZETA + {0xA6A7, 0x0397}, //6526 #GREEK CAPITAL LETTER ETA + {0xA6A8, 0x0398}, //6527 #GREEK CAPITAL LETTER THETA + {0xA6A9, 0x0399}, //6528 #GREEK CAPITAL LETTER IOTA + {0xA6AA, 0x039A}, //6529 #GREEK CAPITAL LETTER KAPPA + {0xA6AB, 0x039B}, //6530 #GREEK CAPITAL LETTER LAMDA + {0xA6AC, 0x039C}, //6531 #GREEK CAPITAL LETTER MU + {0xA6AD, 0x039D}, //6532 #GREEK CAPITAL LETTER NU + {0xA6AE, 0x039E}, //6533 #GREEK CAPITAL LETTER XI + {0xA6AF, 0x039F}, //6534 #GREEK CAPITAL LETTER OMICRON + {0xA6B0, 0x03A0}, //6535 #GREEK CAPITAL LETTER PI + {0xA6B1, 0x03A1}, //6536 #GREEK CAPITAL LETTER RHO + {0xA6B2, 0x03A3}, //6537 #GREEK CAPITAL LETTER SIGMA + {0xA6B3, 0x03A4}, //6538 #GREEK CAPITAL LETTER TAU + {0xA6B4, 0x03A5}, //6539 #GREEK CAPITAL LETTER UPSILON + {0xA6B5, 0x03A6}, //6540 #GREEK CAPITAL LETTER PHI + {0xA6B6, 0x03A7}, //6541 #GREEK CAPITAL LETTER CHI + {0xA6B7, 0x03A8}, //6542 #GREEK CAPITAL LETTER PSI + {0xA6B8, 0x03A9}, //6543 #GREEK CAPITAL LETTER OMEGA + {0xA6C1, 0x03B1}, //6544 #GREEK SMALL LETTER ALPHA + {0xA6C2, 0x03B2}, //6545 #GREEK SMALL LETTER BETA + {0xA6C3, 0x03B3}, //6546 #GREEK SMALL LETTER GAMMA + {0xA6C4, 0x03B4}, //6547 #GREEK SMALL LETTER DELTA + {0xA6C5, 0x03B5}, //6548 #GREEK SMALL LETTER EPSILON + {0xA6C6, 0x03B6}, //6549 #GREEK SMALL LETTER ZETA + {0xA6C7, 0x03B7}, //6550 #GREEK SMALL LETTER ETA + {0xA6C8, 0x03B8}, //6551 #GREEK SMALL LETTER THETA + {0xA6C9, 0x03B9}, //6552 #GREEK SMALL LETTER IOTA + {0xA6CA, 0x03BA}, //6553 #GREEK SMALL LETTER KAPPA + {0xA6CB, 0x03BB}, //6554 #GREEK SMALL LETTER LAMDA + {0xA6CC, 0x03BC}, //6555 #GREEK SMALL LETTER MU + {0xA6CD, 0x03BD}, //6556 #GREEK SMALL LETTER NU + {0xA6CE, 0x03BE}, //6557 #GREEK SMALL LETTER XI + {0xA6CF, 0x03BF}, //6558 #GREEK SMALL LETTER OMICRON + {0xA6D0, 0x03C0}, //6559 #GREEK SMALL LETTER PI + {0xA6D1, 0x03C1}, //6560 #GREEK SMALL LETTER RHO + {0xA6D2, 0x03C3}, //6561 #GREEK SMALL LETTER SIGMA + {0xA6D3, 0x03C4}, //6562 #GREEK SMALL LETTER TAU + {0xA6D4, 0x03C5}, //6563 #GREEK SMALL LETTER UPSILON + {0xA6D5, 0x03C6}, //6564 #GREEK SMALL LETTER PHI + {0xA6D6, 0x03C7}, //6565 #GREEK SMALL LETTER CHI + {0xA6D7, 0x03C8}, //6566 #GREEK SMALL LETTER PSI + {0xA6D8, 0x03C9}, //6567 #GREEK SMALL LETTER OMEGA + {0xA6E0, 0xFE35}, //6568 #PRESENTATION FORM FOR VERTICAL LEFT PARENTHESIS + {0xA6E1, 0xFE36}, //6569 #PRESENTATION FORM FOR VERTICAL RIGHT PARENTHESIS + {0xA6E2, 0xFE39}, //6570 #PRESENTATION FORM FOR VERTICAL LEFT TORTOISE SHELL BRACKET + {0xA6E3, 0xFE3A}, //6571 #PRESENTATION FORM FOR VERTICAL RIGHT TORTOISE SHELL BRACKET + {0xA6E4, 0xFE3F}, //6572 #PRESENTATION FORM FOR VERTICAL LEFT ANGLE BRACKET + {0xA6E5, 0xFE40}, //6573 #PRESENTATION FORM FOR VERTICAL RIGHT ANGLE BRACKET + {0xA6E6, 0xFE3D}, //6574 #PRESENTATION FORM FOR VERTICAL LEFT DOUBLE ANGLE BRACKET + {0xA6E7, 0xFE3E}, //6575 #PRESENTATION FORM FOR VERTICAL RIGHT DOUBLE ANGLE BRACKET + {0xA6E8, 0xFE41}, //6576 #PRESENTATION FORM FOR VERTICAL LEFT CORNER BRACKET + {0xA6E9, 0xFE42}, //6577 #PRESENTATION FORM FOR VERTICAL RIGHT CORNER BRACKET + {0xA6EA, 0xFE43}, //6578 #PRESENTATION FORM FOR VERTICAL LEFT WHITE CORNER BRACKET + {0xA6EB, 0xFE44}, //6579 #PRESENTATION FORM FOR VERTICAL RIGHT WHITE CORNER BRACKET + {0xA6EE, 0xFE3B}, //6580 #PRESENTATION FORM FOR VERTICAL LEFT BLACK LENTICULAR BRACKET + {0xA6EF, 0xFE3C}, //6581 #PRESENTATION FORM FOR VERTICAL RIGHT BLACK LENTICULAR BRACKET + {0xA6F0, 0xFE37}, //6582 #PRESENTATION FORM FOR VERTICAL LEFT CURLY BRACKET + {0xA6F1, 0xFE38}, //6583 #PRESENTATION FORM FOR VERTICAL RIGHT CURLY BRACKET + {0xA6F2, 0xFE31}, //6584 #PRESENTATION FORM FOR VERTICAL EM DASH + {0xA6F4, 0xFE33}, //6585 #PRESENTATION FORM FOR VERTICAL LOW LINE + {0xA6F5, 0xFE34}, //6586 #PRESENTATION FORM FOR VERTICAL WAVY LOW LINE + {0xA7A1, 0x0410}, //6587 #CYRILLIC CAPITAL LETTER A + {0xA7A2, 0x0411}, //6588 #CYRILLIC CAPITAL LETTER BE + {0xA7A3, 0x0412}, //6589 #CYRILLIC CAPITAL LETTER VE + {0xA7A4, 0x0413}, //6590 #CYRILLIC CAPITAL LETTER GHE + {0xA7A5, 0x0414}, //6591 #CYRILLIC CAPITAL LETTER DE + {0xA7A6, 0x0415}, //6592 #CYRILLIC CAPITAL LETTER IE + {0xA7A7, 0x0401}, //6593 #CYRILLIC CAPITAL LETTER IO + {0xA7A8, 0x0416}, //6594 #CYRILLIC CAPITAL LETTER ZHE + {0xA7A9, 0x0417}, //6595 #CYRILLIC CAPITAL LETTER ZE + {0xA7AA, 0x0418}, //6596 #CYRILLIC CAPITAL LETTER I + {0xA7AB, 0x0419}, //6597 #CYRILLIC CAPITAL LETTER SHORT I + {0xA7AC, 0x041A}, //6598 #CYRILLIC CAPITAL LETTER KA + {0xA7AD, 0x041B}, //6599 #CYRILLIC CAPITAL LETTER EL + {0xA7AE, 0x041C}, //6600 #CYRILLIC CAPITAL LETTER EM + {0xA7AF, 0x041D}, //6601 #CYRILLIC CAPITAL LETTER EN + {0xA7B0, 0x041E}, //6602 #CYRILLIC CAPITAL LETTER O + {0xA7B1, 0x041F}, //6603 #CYRILLIC CAPITAL LETTER PE + {0xA7B2, 0x0420}, //6604 #CYRILLIC CAPITAL LETTER ER + {0xA7B3, 0x0421}, //6605 #CYRILLIC CAPITAL LETTER ES + {0xA7B4, 0x0422}, //6606 #CYRILLIC CAPITAL LETTER TE + {0xA7B5, 0x0423}, //6607 #CYRILLIC CAPITAL LETTER U + {0xA7B6, 0x0424}, //6608 #CYRILLIC CAPITAL LETTER EF + {0xA7B7, 0x0425}, //6609 #CYRILLIC CAPITAL LETTER HA + {0xA7B8, 0x0426}, //6610 #CYRILLIC CAPITAL LETTER TSE + {0xA7B9, 0x0427}, //6611 #CYRILLIC CAPITAL LETTER CHE + {0xA7BA, 0x0428}, //6612 #CYRILLIC CAPITAL LETTER SHA + {0xA7BB, 0x0429}, //6613 #CYRILLIC CAPITAL LETTER SHCHA + {0xA7BC, 0x042A}, //6614 #CYRILLIC CAPITAL LETTER HARD SIGN + {0xA7BD, 0x042B}, //6615 #CYRILLIC CAPITAL LETTER YERU + {0xA7BE, 0x042C}, //6616 #CYRILLIC CAPITAL LETTER SOFT SIGN + {0xA7BF, 0x042D}, //6617 #CYRILLIC CAPITAL LETTER E + {0xA7C0, 0x042E}, //6618 #CYRILLIC CAPITAL LETTER YU + {0xA7C1, 0x042F}, //6619 #CYRILLIC CAPITAL LETTER YA + {0xA7D1, 0x0430}, //6620 #CYRILLIC SMALL LETTER A + {0xA7D2, 0x0431}, //6621 #CYRILLIC SMALL LETTER BE + {0xA7D3, 0x0432}, //6622 #CYRILLIC SMALL LETTER VE + {0xA7D4, 0x0433}, //6623 #CYRILLIC SMALL LETTER GHE + {0xA7D5, 0x0434}, //6624 #CYRILLIC SMALL LETTER DE + {0xA7D6, 0x0435}, //6625 #CYRILLIC SMALL LETTER IE + {0xA7D7, 0x0451}, //6626 #CYRILLIC SMALL LETTER IO + {0xA7D8, 0x0436}, //6627 #CYRILLIC SMALL LETTER ZHE + {0xA7D9, 0x0437}, //6628 #CYRILLIC SMALL LETTER ZE + {0xA7DA, 0x0438}, //6629 #CYRILLIC SMALL LETTER I + {0xA7DB, 0x0439}, //6630 #CYRILLIC SMALL LETTER SHORT I + {0xA7DC, 0x043A}, //6631 #CYRILLIC SMALL LETTER KA + {0xA7DD, 0x043B}, //6632 #CYRILLIC SMALL LETTER EL + {0xA7DE, 0x043C}, //6633 #CYRILLIC SMALL LETTER EM + {0xA7DF, 0x043D}, //6634 #CYRILLIC SMALL LETTER EN + {0xA7E0, 0x043E}, //6635 #CYRILLIC SMALL LETTER O + {0xA7E1, 0x043F}, //6636 #CYRILLIC SMALL LETTER PE + {0xA7E2, 0x0440}, //6637 #CYRILLIC SMALL LETTER ER + {0xA7E3, 0x0441}, //6638 #CYRILLIC SMALL LETTER ES + {0xA7E4, 0x0442}, //6639 #CYRILLIC SMALL LETTER TE + {0xA7E5, 0x0443}, //6640 #CYRILLIC SMALL LETTER U + {0xA7E6, 0x0444}, //6641 #CYRILLIC SMALL LETTER EF + {0xA7E7, 0x0445}, //6642 #CYRILLIC SMALL LETTER HA + {0xA7E8, 0x0446}, //6643 #CYRILLIC SMALL LETTER TSE + {0xA7E9, 0x0447}, //6644 #CYRILLIC SMALL LETTER CHE + {0xA7EA, 0x0448}, //6645 #CYRILLIC SMALL LETTER SHA + {0xA7EB, 0x0449}, //6646 #CYRILLIC SMALL LETTER SHCHA + {0xA7EC, 0x044A}, //6647 #CYRILLIC SMALL LETTER HARD SIGN + {0xA7ED, 0x044B}, //6648 #CYRILLIC SMALL LETTER YERU + {0xA7EE, 0x044C}, //6649 #CYRILLIC SMALL LETTER SOFT SIGN + {0xA7EF, 0x044D}, //6650 #CYRILLIC SMALL LETTER E + {0xA7F0, 0x044E}, //6651 #CYRILLIC SMALL LETTER YU + {0xA7F1, 0x044F}, //6652 #CYRILLIC SMALL LETTER YA + {0xA840, 0x02CA}, //6653 #MODIFIER LETTER ACUTE ACCENT + {0xA841, 0x02CB}, //6654 #MODIFIER LETTER GRAVE ACCENT + {0xA842, 0x02D9}, //6655 #DOT ABOVE + {0xA843, 0x2013}, //6656 #EN DASH + {0xA844, 0x2015}, //6657 #HORIZONTAL BAR + {0xA845, 0x2025}, //6658 #TWO DOT LEADER + {0xA846, 0x2035}, //6659 #REVERSED PRIME + {0xA847, 0x2105}, //6660 #CARE OF + {0xA848, 0x2109}, //6661 #DEGREE FAHRENHEIT + {0xA849, 0x2196}, //6662 #NORTH WEST ARROW + {0xA84A, 0x2197}, //6663 #NORTH EAST ARROW + {0xA84B, 0x2198}, //6664 #SOUTH EAST ARROW + {0xA84C, 0x2199}, //6665 #SOUTH WEST ARROW + {0xA84D, 0x2215}, //6666 #DIVISION SLASH + {0xA84E, 0x221F}, //6667 #RIGHT ANGLE + {0xA84F, 0x2223}, //6668 #DIVIDES + {0xA850, 0x2252}, //6669 #APPROXIMATELY EQUAL TO OR THE IMAGE OF + {0xA851, 0x2266}, //6670 #LESS-THAN OVER EQUAL TO + {0xA852, 0x2267}, //6671 #GREATER-THAN OVER EQUAL TO + {0xA853, 0x22BF}, //6672 #RIGHT TRIANGLE + {0xA854, 0x2550}, //6673 #BOX DRAWINGS DOUBLE HORIZONTAL + {0xA855, 0x2551}, //6674 #BOX DRAWINGS DOUBLE VERTICAL + {0xA856, 0x2552}, //6675 #BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE + {0xA857, 0x2553}, //6676 #BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE + {0xA858, 0x2554}, //6677 #BOX DRAWINGS DOUBLE DOWN AND RIGHT + {0xA859, 0x2555}, //6678 #BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE + {0xA85A, 0x2556}, //6679 #BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE + {0xA85B, 0x2557}, //6680 #BOX DRAWINGS DOUBLE DOWN AND LEFT + {0xA85C, 0x2558}, //6681 #BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE + {0xA85D, 0x2559}, //6682 #BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE + {0xA85E, 0x255A}, //6683 #BOX DRAWINGS DOUBLE UP AND RIGHT + {0xA85F, 0x255B}, //6684 #BOX DRAWINGS UP SINGLE AND LEFT DOUBLE + {0xA860, 0x255C}, //6685 #BOX DRAWINGS UP DOUBLE AND LEFT SINGLE + {0xA861, 0x255D}, //6686 #BOX DRAWINGS DOUBLE UP AND LEFT + {0xA862, 0x255E}, //6687 #BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE + {0xA863, 0x255F}, //6688 #BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE + {0xA864, 0x2560}, //6689 #BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + {0xA865, 0x2561}, //6690 #BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE + {0xA866, 0x2562}, //6691 #BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE + {0xA867, 0x2563}, //6692 #BOX DRAWINGS DOUBLE VERTICAL AND LEFT + {0xA868, 0x2564}, //6693 #BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE + {0xA869, 0x2565}, //6694 #BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE + {0xA86A, 0x2566}, //6695 #BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + {0xA86B, 0x2567}, //6696 #BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE + {0xA86C, 0x2568}, //6697 #BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE + {0xA86D, 0x2569}, //6698 #BOX DRAWINGS DOUBLE UP AND HORIZONTAL + {0xA86E, 0x256A}, //6699 #BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE + {0xA86F, 0x256B}, //6700 #BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE + {0xA870, 0x256C}, //6701 #BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + {0xA871, 0x256D}, //6702 #BOX DRAWINGS LIGHT ARC DOWN AND RIGHT + {0xA872, 0x256E}, //6703 #BOX DRAWINGS LIGHT ARC DOWN AND LEFT + {0xA873, 0x256F}, //6704 #BOX DRAWINGS LIGHT ARC UP AND LEFT + {0xA874, 0x2570}, //6705 #BOX DRAWINGS LIGHT ARC UP AND RIGHT + {0xA875, 0x2571}, //6706 #BOX DRAWINGS LIGHT DIAGONAL UPPER RIGHT TO LOWER LEFT + {0xA876, 0x2572}, //6707 #BOX DRAWINGS LIGHT DIAGONAL UPPER LEFT TO LOWER RIGHT + {0xA877, 0x2573}, //6708 #BOX DRAWINGS LIGHT DIAGONAL CROSS + {0xA878, 0x2581}, //6709 #LOWER ONE EIGHTH BLOCK + {0xA879, 0x2582}, //6710 #LOWER ONE QUARTER BLOCK + {0xA87A, 0x2583}, //6711 #LOWER THREE EIGHTHS BLOCK + {0xA87B, 0x2584}, //6712 #LOWER HALF BLOCK + {0xA87C, 0x2585}, //6713 #LOWER FIVE EIGHTHS BLOCK + {0xA87D, 0x2586}, //6714 #LOWER THREE QUARTERS BLOCK + {0xA87E, 0x2587}, //6715 #LOWER SEVEN EIGHTHS BLOCK + {0xA880, 0x2588}, //6716 #FULL BLOCK + {0xA881, 0x2589}, //6717 #LEFT SEVEN EIGHTHS BLOCK + {0xA882, 0x258A}, //6718 #LEFT THREE QUARTERS BLOCK + {0xA883, 0x258B}, //6719 #LEFT FIVE EIGHTHS BLOCK + {0xA884, 0x258C}, //6720 #LEFT HALF BLOCK + {0xA885, 0x258D}, //6721 #LEFT THREE EIGHTHS BLOCK + {0xA886, 0x258E}, //6722 #LEFT ONE QUARTER BLOCK + {0xA887, 0x258F}, //6723 #LEFT ONE EIGHTH BLOCK + {0xA888, 0x2593}, //6724 #DARK SHADE + {0xA889, 0x2594}, //6725 #UPPER ONE EIGHTH BLOCK + {0xA88A, 0x2595}, //6726 #RIGHT ONE EIGHTH BLOCK + {0xA88B, 0x25BC}, //6727 #BLACK DOWN-POINTING TRIANGLE + {0xA88C, 0x25BD}, //6728 #WHITE DOWN-POINTING TRIANGLE + {0xA88D, 0x25E2}, //6729 #BLACK LOWER RIGHT TRIANGLE + {0xA88E, 0x25E3}, //6730 #BLACK LOWER LEFT TRIANGLE + {0xA88F, 0x25E4}, //6731 #BLACK UPPER LEFT TRIANGLE + {0xA890, 0x25E5}, //6732 #BLACK UPPER RIGHT TRIANGLE + {0xA891, 0x2609}, //6733 #SUN + {0xA892, 0x2295}, //6734 #CIRCLED PLUS + {0xA893, 0x3012}, //6735 #POSTAL MARK + {0xA894, 0x301D}, //6736 #REVERSED DOUBLE PRIME QUOTATION MARK + {0xA895, 0x301E}, //6737 #DOUBLE PRIME QUOTATION MARK + {0xA8A1, 0x0101}, //6738 #LATIN SMALL LETTER A WITH MACRON + {0xA8A2, 0x00E1}, //6739 #LATIN SMALL LETTER A WITH ACUTE + {0xA8A3, 0x01CE}, //6740 #LATIN SMALL LETTER A WITH CARON + {0xA8A4, 0x00E0}, //6741 #LATIN SMALL LETTER A WITH GRAVE + {0xA8A5, 0x0113}, //6742 #LATIN SMALL LETTER E WITH MACRON + {0xA8A6, 0x00E9}, //6743 #LATIN SMALL LETTER E WITH ACUTE + {0xA8A7, 0x011B}, //6744 #LATIN SMALL LETTER E WITH CARON + {0xA8A8, 0x00E8}, //6745 #LATIN SMALL LETTER E WITH GRAVE + {0xA8A9, 0x012B}, //6746 #LATIN SMALL LETTER I WITH MACRON + {0xA8AA, 0x00ED}, //6747 #LATIN SMALL LETTER I WITH ACUTE + {0xA8AB, 0x01D0}, //6748 #LATIN SMALL LETTER I WITH CARON + {0xA8AC, 0x00EC}, //6749 #LATIN SMALL LETTER I WITH GRAVE + {0xA8AD, 0x014D}, //6750 #LATIN SMALL LETTER O WITH MACRON + {0xA8AE, 0x00F3}, //6751 #LATIN SMALL LETTER O WITH ACUTE + {0xA8AF, 0x01D2}, //6752 #LATIN SMALL LETTER O WITH CARON + {0xA8B0, 0x00F2}, //6753 #LATIN SMALL LETTER O WITH GRAVE + {0xA8B1, 0x016B}, //6754 #LATIN SMALL LETTER U WITH MACRON + {0xA8B2, 0x00FA}, //6755 #LATIN SMALL LETTER U WITH ACUTE + {0xA8B3, 0x01D4}, //6756 #LATIN SMALL LETTER U WITH CARON + {0xA8B4, 0x00F9}, //6757 #LATIN SMALL LETTER U WITH GRAVE + {0xA8B5, 0x01D6}, //6758 #LATIN SMALL LETTER U WITH DIAERESIS AND MACRON + {0xA8B6, 0x01D8}, //6759 #LATIN SMALL LETTER U WITH DIAERESIS AND ACUTE + {0xA8B7, 0x01DA}, //6760 #LATIN SMALL LETTER U WITH DIAERESIS AND CARON + {0xA8B8, 0x01DC}, //6761 #LATIN SMALL LETTER U WITH DIAERESIS AND GRAVE + {0xA8B9, 0x00FC}, //6762 #LATIN SMALL LETTER U WITH DIAERESIS + {0xA8BA, 0x00EA}, //6763 #LATIN SMALL LETTER E WITH CIRCUMFLEX + {0xA8BB, 0x0251}, //6764 #LATIN SMALL LETTER ALPHA + {0xA8BD, 0x0144}, //6765 #LATIN SMALL LETTER N WITH ACUTE + {0xA8BE, 0x0148}, //6766 #LATIN SMALL LETTER N WITH CARON + {0xA8C0, 0x0261}, //6767 #LATIN SMALL LETTER SCRIPT G + {0xA8C5, 0x3105}, //6768 #BOPOMOFO LETTER B + {0xA8C6, 0x3106}, //6769 #BOPOMOFO LETTER P + {0xA8C7, 0x3107}, //6770 #BOPOMOFO LETTER M + {0xA8C8, 0x3108}, //6771 #BOPOMOFO LETTER F + {0xA8C9, 0x3109}, //6772 #BOPOMOFO LETTER D + {0xA8CA, 0x310A}, //6773 #BOPOMOFO LETTER T + {0xA8CB, 0x310B}, //6774 #BOPOMOFO LETTER N + {0xA8CC, 0x310C}, //6775 #BOPOMOFO LETTER L + {0xA8CD, 0x310D}, //6776 #BOPOMOFO LETTER G + {0xA8CE, 0x310E}, //6777 #BOPOMOFO LETTER K + {0xA8CF, 0x310F}, //6778 #BOPOMOFO LETTER H + {0xA8D0, 0x3110}, //6779 #BOPOMOFO LETTER J + {0xA8D1, 0x3111}, //6780 #BOPOMOFO LETTER Q + {0xA8D2, 0x3112}, //6781 #BOPOMOFO LETTER X + {0xA8D3, 0x3113}, //6782 #BOPOMOFO LETTER ZH + {0xA8D4, 0x3114}, //6783 #BOPOMOFO LETTER CH + {0xA8D5, 0x3115}, //6784 #BOPOMOFO LETTER SH + {0xA8D6, 0x3116}, //6785 #BOPOMOFO LETTER R + {0xA8D7, 0x3117}, //6786 #BOPOMOFO LETTER Z + {0xA8D8, 0x3118}, //6787 #BOPOMOFO LETTER C + {0xA8D9, 0x3119}, //6788 #BOPOMOFO LETTER S + {0xA8DA, 0x311A}, //6789 #BOPOMOFO LETTER A + {0xA8DB, 0x311B}, //6790 #BOPOMOFO LETTER O + {0xA8DC, 0x311C}, //6791 #BOPOMOFO LETTER E + {0xA8DD, 0x311D}, //6792 #BOPOMOFO LETTER EH + {0xA8DE, 0x311E}, //6793 #BOPOMOFO LETTER AI + {0xA8DF, 0x311F}, //6794 #BOPOMOFO LETTER EI + {0xA8E0, 0x3120}, //6795 #BOPOMOFO LETTER AU + {0xA8E1, 0x3121}, //6796 #BOPOMOFO LETTER OU + {0xA8E2, 0x3122}, //6797 #BOPOMOFO LETTER AN + {0xA8E3, 0x3123}, //6798 #BOPOMOFO LETTER EN + {0xA8E4, 0x3124}, //6799 #BOPOMOFO LETTER ANG + {0xA8E5, 0x3125}, //6800 #BOPOMOFO LETTER ENG + {0xA8E6, 0x3126}, //6801 #BOPOMOFO LETTER ER + {0xA8E7, 0x3127}, //6802 #BOPOMOFO LETTER I + {0xA8E8, 0x3128}, //6803 #BOPOMOFO LETTER U + {0xA8E9, 0x3129}, //6804 #BOPOMOFO LETTER IU + {0xA940, 0x3021}, //6805 #HANGZHOU NUMERAL ONE + {0xA941, 0x3022}, //6806 #HANGZHOU NUMERAL TWO + {0xA942, 0x3023}, //6807 #HANGZHOU NUMERAL THREE + {0xA943, 0x3024}, //6808 #HANGZHOU NUMERAL FOUR + {0xA944, 0x3025}, //6809 #HANGZHOU NUMERAL FIVE + {0xA945, 0x3026}, //6810 #HANGZHOU NUMERAL SIX + {0xA946, 0x3027}, //6811 #HANGZHOU NUMERAL SEVEN + {0xA947, 0x3028}, //6812 #HANGZHOU NUMERAL EIGHT + {0xA948, 0x3029}, //6813 #HANGZHOU NUMERAL NINE + {0xA949, 0x32A3}, //6814 #CIRCLED IDEOGRAPH CORRECT + {0xA94A, 0x338E}, //6815 #SQUARE MG + {0xA94B, 0x338F}, //6816 #SQUARE KG + {0xA94C, 0x339C}, //6817 #SQUARE MM + {0xA94D, 0x339D}, //6818 #SQUARE CM + {0xA94E, 0x339E}, //6819 #SQUARE KM + {0xA94F, 0x33A1}, //6820 #SQUARE M SQUARED + {0xA950, 0x33C4}, //6821 #SQUARE CC + {0xA951, 0x33CE}, //6822 #SQUARE KM CAPITAL + {0xA952, 0x33D1}, //6823 #SQUARE LN + {0xA953, 0x33D2}, //6824 #SQUARE LOG + {0xA954, 0x33D5}, //6825 #SQUARE MIL + {0xA955, 0xFE30}, //6826 #PRESENTATION FORM FOR VERTICAL TWO DOT LEADER + {0xA956, 0xFFE2}, //6827 #FULLWIDTH NOT SIGN + {0xA957, 0xFFE4}, //6828 #FULLWIDTH BROKEN BAR + {0xA959, 0x2121}, //6829 #TELEPHONE SIGN + {0xA95A, 0x3231}, //6830 #PARENTHESIZED IDEOGRAPH STOCK + {0xA95C, 0x2010}, //6831 #HYPHEN + {0xA960, 0x30FC}, //6832 #KATAKANA-HIRAGANA PROLONGED SOUND MARK + {0xA961, 0x309B}, //6833 #KATAKANA-HIRAGANA VOICED SOUND MARK + {0xA962, 0x309C}, //6834 #KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK + {0xA963, 0x30FD}, //6835 #KATAKANA ITERATION MARK + {0xA964, 0x30FE}, //6836 #KATAKANA VOICED ITERATION MARK + {0xA965, 0x3006}, //6837 #IDEOGRAPHIC CLOSING MARK + {0xA966, 0x309D}, //6838 #HIRAGANA ITERATION MARK + {0xA967, 0x309E}, //6839 #HIRAGANA VOICED ITERATION MARK + {0xA968, 0xFE49}, //6840 #DASHED OVERLINE + {0xA969, 0xFE4A}, //6841 #CENTRELINE OVERLINE + {0xA96A, 0xFE4B}, //6842 #WAVY OVERLINE + {0xA96B, 0xFE4C}, //6843 #DOUBLE WAVY OVERLINE + {0xA96C, 0xFE4D}, //6844 #DASHED LOW LINE + {0xA96D, 0xFE4E}, //6845 #CENTRELINE LOW LINE + {0xA96E, 0xFE4F}, //6846 #WAVY LOW LINE + {0xA96F, 0xFE50}, //6847 #SMALL COMMA + {0xA970, 0xFE51}, //6848 #SMALL IDEOGRAPHIC COMMA + {0xA971, 0xFE52}, //6849 #SMALL FULL STOP + {0xA972, 0xFE54}, //6850 #SMALL SEMICOLON + {0xA973, 0xFE55}, //6851 #SMALL COLON + {0xA974, 0xFE56}, //6852 #SMALL QUESTION MARK + {0xA975, 0xFE57}, //6853 #SMALL EXCLAMATION MARK + {0xA976, 0xFE59}, //6854 #SMALL LEFT PARENTHESIS + {0xA977, 0xFE5A}, //6855 #SMALL RIGHT PARENTHESIS + {0xA978, 0xFE5B}, //6856 #SMALL LEFT CURLY BRACKET + {0xA979, 0xFE5C}, //6857 #SMALL RIGHT CURLY BRACKET + {0xA97A, 0xFE5D}, //6858 #SMALL LEFT TORTOISE SHELL BRACKET + {0xA97B, 0xFE5E}, //6859 #SMALL RIGHT TORTOISE SHELL BRACKET + {0xA97C, 0xFE5F}, //6860 #SMALL NUMBER SIGN + {0xA97D, 0xFE60}, //6861 #SMALL AMPERSAND + {0xA97E, 0xFE61}, //6862 #SMALL ASTERISK + {0xA980, 0xFE62}, //6863 #SMALL PLUS SIGN + {0xA981, 0xFE63}, //6864 #SMALL HYPHEN-MINUS + {0xA982, 0xFE64}, //6865 #SMALL LESS-THAN SIGN + {0xA983, 0xFE65}, //6866 #SMALL GREATER-THAN SIGN + {0xA984, 0xFE66}, //6867 #SMALL EQUALS SIGN + {0xA985, 0xFE68}, //6868 #SMALL REVERSE SOLIDUS + {0xA986, 0xFE69}, //6869 #SMALL DOLLAR SIGN + {0xA987, 0xFE6A}, //6870 #SMALL PERCENT SIGN + {0xA988, 0xFE6B}, //6871 #SMALL COMMERCIAL AT + {0xA996, 0x3007}, //6872 #IDEOGRAPHIC NUMBER ZERO + {0xA9A4, 0x2500}, //6873 #BOX DRAWINGS LIGHT HORIZONTAL + {0xA9A5, 0x2501}, //6874 #BOX DRAWINGS HEAVY HORIZONTAL + {0xA9A6, 0x2502}, //6875 #BOX DRAWINGS LIGHT VERTICAL + {0xA9A7, 0x2503}, //6876 #BOX DRAWINGS HEAVY VERTICAL + {0xA9A8, 0x2504}, //6877 #BOX DRAWINGS LIGHT TRIPLE DASH HORIZONTAL + {0xA9A9, 0x2505}, //6878 #BOX DRAWINGS HEAVY TRIPLE DASH HORIZONTAL + {0xA9AA, 0x2506}, //6879 #BOX DRAWINGS LIGHT TRIPLE DASH VERTICAL + {0xA9AB, 0x2507}, //6880 #BOX DRAWINGS HEAVY TRIPLE DASH VERTICAL + {0xA9AC, 0x2508}, //6881 #BOX DRAWINGS LIGHT QUADRUPLE DASH HORIZONTAL + {0xA9AD, 0x2509}, //6882 #BOX DRAWINGS HEAVY QUADRUPLE DASH HORIZONTAL + {0xA9AE, 0x250A}, //6883 #BOX DRAWINGS LIGHT QUADRUPLE DASH VERTICAL + {0xA9AF, 0x250B}, //6884 #BOX DRAWINGS HEAVY QUADRUPLE DASH VERTICAL + {0xA9B0, 0x250C}, //6885 #BOX DRAWINGS LIGHT DOWN AND RIGHT + {0xA9B1, 0x250D}, //6886 #BOX DRAWINGS DOWN LIGHT AND RIGHT HEAVY + {0xA9B2, 0x250E}, //6887 #BOX DRAWINGS DOWN HEAVY AND RIGHT LIGHT + {0xA9B3, 0x250F}, //6888 #BOX DRAWINGS HEAVY DOWN AND RIGHT + {0xA9B4, 0x2510}, //6889 #BOX DRAWINGS LIGHT DOWN AND LEFT + {0xA9B5, 0x2511}, //6890 #BOX DRAWINGS DOWN LIGHT AND LEFT HEAVY + {0xA9B6, 0x2512}, //6891 #BOX DRAWINGS DOWN HEAVY AND LEFT LIGHT + {0xA9B7, 0x2513}, //6892 #BOX DRAWINGS HEAVY DOWN AND LEFT + {0xA9B8, 0x2514}, //6893 #BOX DRAWINGS LIGHT UP AND RIGHT + {0xA9B9, 0x2515}, //6894 #BOX DRAWINGS UP LIGHT AND RIGHT HEAVY + {0xA9BA, 0x2516}, //6895 #BOX DRAWINGS UP HEAVY AND RIGHT LIGHT + {0xA9BB, 0x2517}, //6896 #BOX DRAWINGS HEAVY UP AND RIGHT + {0xA9BC, 0x2518}, //6897 #BOX DRAWINGS LIGHT UP AND LEFT + {0xA9BD, 0x2519}, //6898 #BOX DRAWINGS UP LIGHT AND LEFT HEAVY + {0xA9BE, 0x251A}, //6899 #BOX DRAWINGS UP HEAVY AND LEFT LIGHT + {0xA9BF, 0x251B}, //6900 #BOX DRAWINGS HEAVY UP AND LEFT + {0xA9C0, 0x251C}, //6901 #BOX DRAWINGS LIGHT VERTICAL AND RIGHT + {0xA9C1, 0x251D}, //6902 #BOX DRAWINGS VERTICAL LIGHT AND RIGHT HEAVY + {0xA9C2, 0x251E}, //6903 #BOX DRAWINGS UP HEAVY AND RIGHT DOWN LIGHT + {0xA9C3, 0x251F}, //6904 #BOX DRAWINGS DOWN HEAVY AND RIGHT UP LIGHT + {0xA9C4, 0x2520}, //6905 #BOX DRAWINGS VERTICAL HEAVY AND RIGHT LIGHT + {0xA9C5, 0x2521}, //6906 #BOX DRAWINGS DOWN LIGHT AND RIGHT UP HEAVY + {0xA9C6, 0x2522}, //6907 #BOX DRAWINGS UP LIGHT AND RIGHT DOWN HEAVY + {0xA9C7, 0x2523}, //6908 #BOX DRAWINGS HEAVY VERTICAL AND RIGHT + {0xA9C8, 0x2524}, //6909 #BOX DRAWINGS LIGHT VERTICAL AND LEFT + {0xA9C9, 0x2525}, //6910 #BOX DRAWINGS VERTICAL LIGHT AND LEFT HEAVY + {0xA9CA, 0x2526}, //6911 #BOX DRAWINGS UP HEAVY AND LEFT DOWN LIGHT + {0xA9CB, 0x2527}, //6912 #BOX DRAWINGS DOWN HEAVY AND LEFT UP LIGHT + {0xA9CC, 0x2528}, //6913 #BOX DRAWINGS VERTICAL HEAVY AND LEFT LIGHT + {0xA9CD, 0x2529}, //6914 #BOX DRAWINGS DOWN LIGHT AND LEFT UP HEAVY + {0xA9CE, 0x252A}, //6915 #BOX DRAWINGS UP LIGHT AND LEFT DOWN HEAVY + {0xA9CF, 0x252B}, //6916 #BOX DRAWINGS HEAVY VERTICAL AND LEFT + {0xA9D0, 0x252C}, //6917 #BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + {0xA9D1, 0x252D}, //6918 #BOX DRAWINGS LEFT HEAVY AND RIGHT DOWN LIGHT + {0xA9D2, 0x252E}, //6919 #BOX DRAWINGS RIGHT HEAVY AND LEFT DOWN LIGHT + {0xA9D3, 0x252F}, //6920 #BOX DRAWINGS DOWN LIGHT AND HORIZONTAL HEAVY + {0xA9D4, 0x2530}, //6921 #BOX DRAWINGS DOWN HEAVY AND HORIZONTAL LIGHT + {0xA9D5, 0x2531}, //6922 #BOX DRAWINGS RIGHT LIGHT AND LEFT DOWN HEAVY + {0xA9D6, 0x2532}, //6923 #BOX DRAWINGS LEFT LIGHT AND RIGHT DOWN HEAVY + {0xA9D7, 0x2533}, //6924 #BOX DRAWINGS HEAVY DOWN AND HORIZONTAL + {0xA9D8, 0x2534}, //6925 #BOX DRAWINGS LIGHT UP AND HORIZONTAL + {0xA9D9, 0x2535}, //6926 #BOX DRAWINGS LEFT HEAVY AND RIGHT UP LIGHT + {0xA9DA, 0x2536}, //6927 #BOX DRAWINGS RIGHT HEAVY AND LEFT UP LIGHT + {0xA9DB, 0x2537}, //6928 #BOX DRAWINGS UP LIGHT AND HORIZONTAL HEAVY + {0xA9DC, 0x2538}, //6929 #BOX DRAWINGS UP HEAVY AND HORIZONTAL LIGHT + {0xA9DD, 0x2539}, //6930 #BOX DRAWINGS RIGHT LIGHT AND LEFT UP HEAVY + {0xA9DE, 0x253A}, //6931 #BOX DRAWINGS LEFT LIGHT AND RIGHT UP HEAVY + {0xA9DF, 0x253B}, //6932 #BOX DRAWINGS HEAVY UP AND HORIZONTAL + {0xA9E0, 0x253C}, //6933 #BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + {0xA9E1, 0x253D}, //6934 #BOX DRAWINGS LEFT HEAVY AND RIGHT VERTICAL LIGHT + {0xA9E2, 0x253E}, //6935 #BOX DRAWINGS RIGHT HEAVY AND LEFT VERTICAL LIGHT + {0xA9E3, 0x253F}, //6936 #BOX DRAWINGS VERTICAL LIGHT AND HORIZONTAL HEAVY + {0xA9E4, 0x2540}, //6937 #BOX DRAWINGS UP HEAVY AND DOWN HORIZONTAL LIGHT + {0xA9E5, 0x2541}, //6938 #BOX DRAWINGS DOWN HEAVY AND UP HORIZONTAL LIGHT + {0xA9E6, 0x2542}, //6939 #BOX DRAWINGS VERTICAL HEAVY AND HORIZONTAL LIGHT + {0xA9E7, 0x2543}, //6940 #BOX DRAWINGS LEFT UP HEAVY AND RIGHT DOWN LIGHT + {0xA9E8, 0x2544}, //6941 #BOX DRAWINGS RIGHT UP HEAVY AND LEFT DOWN LIGHT + {0xA9E9, 0x2545}, //6942 #BOX DRAWINGS LEFT DOWN HEAVY AND RIGHT UP LIGHT + {0xA9EA, 0x2546}, //6943 #BOX DRAWINGS RIGHT DOWN HEAVY AND LEFT UP LIGHT + {0xA9EB, 0x2547}, //6944 #BOX DRAWINGS DOWN LIGHT AND UP HORIZONTAL HEAVY + {0xA9EC, 0x2548}, //6945 #BOX DRAWINGS UP LIGHT AND DOWN HORIZONTAL HEAVY + {0xA9ED, 0x2549}, //6946 #BOX DRAWINGS RIGHT LIGHT AND LEFT VERTICAL HEAVY + {0xA9EE, 0x254A}, //6947 #BOX DRAWINGS LEFT LIGHT AND RIGHT VERTICAL HEAVY + {0xA9EF, 0x254B}, //6948 #BOX DRAWINGS HEAVY VERTICAL AND HORIZONTAL + {0xAA40, 0x72DC}, //6949 #CJK UNIFIED IDEOGRAPH + {0xAA41, 0x72DD}, //6950 #CJK UNIFIED IDEOGRAPH + {0xAA42, 0x72DF}, //6951 #CJK UNIFIED IDEOGRAPH + {0xAA43, 0x72E2}, //6952 #CJK UNIFIED IDEOGRAPH + {0xAA44, 0x72E3}, //6953 #CJK UNIFIED IDEOGRAPH + {0xAA45, 0x72E4}, //6954 #CJK UNIFIED IDEOGRAPH + {0xAA46, 0x72E5}, //6955 #CJK UNIFIED IDEOGRAPH + {0xAA47, 0x72E6}, //6956 #CJK UNIFIED IDEOGRAPH + {0xAA48, 0x72E7}, //6957 #CJK UNIFIED IDEOGRAPH + {0xAA49, 0x72EA}, //6958 #CJK UNIFIED IDEOGRAPH + {0xAA4A, 0x72EB}, //6959 #CJK UNIFIED IDEOGRAPH + {0xAA4B, 0x72F5}, //6960 #CJK UNIFIED IDEOGRAPH + {0xAA4C, 0x72F6}, //6961 #CJK UNIFIED IDEOGRAPH + {0xAA4D, 0x72F9}, //6962 #CJK UNIFIED IDEOGRAPH + {0xAA4E, 0x72FD}, //6963 #CJK UNIFIED IDEOGRAPH + {0xAA4F, 0x72FE}, //6964 #CJK UNIFIED IDEOGRAPH + {0xAA50, 0x72FF}, //6965 #CJK UNIFIED IDEOGRAPH + {0xAA51, 0x7300}, //6966 #CJK UNIFIED IDEOGRAPH + {0xAA52, 0x7302}, //6967 #CJK UNIFIED IDEOGRAPH + {0xAA53, 0x7304}, //6968 #CJK UNIFIED IDEOGRAPH + {0xAA54, 0x7305}, //6969 #CJK UNIFIED IDEOGRAPH + {0xAA55, 0x7306}, //6970 #CJK UNIFIED IDEOGRAPH + {0xAA56, 0x7307}, //6971 #CJK UNIFIED IDEOGRAPH + {0xAA57, 0x7308}, //6972 #CJK UNIFIED IDEOGRAPH + {0xAA58, 0x7309}, //6973 #CJK UNIFIED IDEOGRAPH + {0xAA59, 0x730B}, //6974 #CJK UNIFIED IDEOGRAPH + {0xAA5A, 0x730C}, //6975 #CJK UNIFIED IDEOGRAPH + {0xAA5B, 0x730D}, //6976 #CJK UNIFIED IDEOGRAPH + {0xAA5C, 0x730F}, //6977 #CJK UNIFIED IDEOGRAPH + {0xAA5D, 0x7310}, //6978 #CJK UNIFIED IDEOGRAPH + {0xAA5E, 0x7311}, //6979 #CJK UNIFIED IDEOGRAPH + {0xAA5F, 0x7312}, //6980 #CJK UNIFIED IDEOGRAPH + {0xAA60, 0x7314}, //6981 #CJK UNIFIED IDEOGRAPH + {0xAA61, 0x7318}, //6982 #CJK UNIFIED IDEOGRAPH + {0xAA62, 0x7319}, //6983 #CJK UNIFIED IDEOGRAPH + {0xAA63, 0x731A}, //6984 #CJK UNIFIED IDEOGRAPH + {0xAA64, 0x731F}, //6985 #CJK UNIFIED IDEOGRAPH + {0xAA65, 0x7320}, //6986 #CJK UNIFIED IDEOGRAPH + {0xAA66, 0x7323}, //6987 #CJK UNIFIED IDEOGRAPH + {0xAA67, 0x7324}, //6988 #CJK UNIFIED IDEOGRAPH + {0xAA68, 0x7326}, //6989 #CJK UNIFIED IDEOGRAPH + {0xAA69, 0x7327}, //6990 #CJK UNIFIED IDEOGRAPH + {0xAA6A, 0x7328}, //6991 #CJK UNIFIED IDEOGRAPH + {0xAA6B, 0x732D}, //6992 #CJK UNIFIED IDEOGRAPH + {0xAA6C, 0x732F}, //6993 #CJK UNIFIED IDEOGRAPH + {0xAA6D, 0x7330}, //6994 #CJK UNIFIED IDEOGRAPH + {0xAA6E, 0x7332}, //6995 #CJK UNIFIED IDEOGRAPH + {0xAA6F, 0x7333}, //6996 #CJK UNIFIED IDEOGRAPH + {0xAA70, 0x7335}, //6997 #CJK UNIFIED IDEOGRAPH + {0xAA71, 0x7336}, //6998 #CJK UNIFIED IDEOGRAPH + {0xAA72, 0x733A}, //6999 #CJK UNIFIED IDEOGRAPH + {0xAA73, 0x733B}, //7000 #CJK UNIFIED IDEOGRAPH + {0xAA74, 0x733C}, //7001 #CJK UNIFIED IDEOGRAPH + {0xAA75, 0x733D}, //7002 #CJK UNIFIED IDEOGRAPH + {0xAA76, 0x7340}, //7003 #CJK UNIFIED IDEOGRAPH + {0xAA77, 0x7341}, //7004 #CJK UNIFIED IDEOGRAPH + {0xAA78, 0x7342}, //7005 #CJK UNIFIED IDEOGRAPH + {0xAA79, 0x7343}, //7006 #CJK UNIFIED IDEOGRAPH + {0xAA7A, 0x7344}, //7007 #CJK UNIFIED IDEOGRAPH + {0xAA7B, 0x7345}, //7008 #CJK UNIFIED IDEOGRAPH + {0xAA7C, 0x7346}, //7009 #CJK UNIFIED IDEOGRAPH + {0xAA7D, 0x7347}, //7010 #CJK UNIFIED IDEOGRAPH + {0xAA7E, 0x7348}, //7011 #CJK UNIFIED IDEOGRAPH + {0xAA80, 0x7349}, //7012 #CJK UNIFIED IDEOGRAPH + {0xAA81, 0x734A}, //7013 #CJK UNIFIED IDEOGRAPH + {0xAA82, 0x734B}, //7014 #CJK UNIFIED IDEOGRAPH + {0xAA83, 0x734C}, //7015 #CJK UNIFIED IDEOGRAPH + {0xAA84, 0x734E}, //7016 #CJK UNIFIED IDEOGRAPH + {0xAA85, 0x734F}, //7017 #CJK UNIFIED IDEOGRAPH + {0xAA86, 0x7351}, //7018 #CJK UNIFIED IDEOGRAPH + {0xAA87, 0x7353}, //7019 #CJK UNIFIED IDEOGRAPH + {0xAA88, 0x7354}, //7020 #CJK UNIFIED IDEOGRAPH + {0xAA89, 0x7355}, //7021 #CJK UNIFIED IDEOGRAPH + {0xAA8A, 0x7356}, //7022 #CJK UNIFIED IDEOGRAPH + {0xAA8B, 0x7358}, //7023 #CJK UNIFIED IDEOGRAPH + {0xAA8C, 0x7359}, //7024 #CJK UNIFIED IDEOGRAPH + {0xAA8D, 0x735A}, //7025 #CJK UNIFIED IDEOGRAPH + {0xAA8E, 0x735B}, //7026 #CJK UNIFIED IDEOGRAPH + {0xAA8F, 0x735C}, //7027 #CJK UNIFIED IDEOGRAPH + {0xAA90, 0x735D}, //7028 #CJK UNIFIED IDEOGRAPH + {0xAA91, 0x735E}, //7029 #CJK UNIFIED IDEOGRAPH + {0xAA92, 0x735F}, //7030 #CJK UNIFIED IDEOGRAPH + {0xAA93, 0x7361}, //7031 #CJK UNIFIED IDEOGRAPH + {0xAA94, 0x7362}, //7032 #CJK UNIFIED IDEOGRAPH + {0xAA95, 0x7363}, //7033 #CJK UNIFIED IDEOGRAPH + {0xAA96, 0x7364}, //7034 #CJK UNIFIED IDEOGRAPH + {0xAA97, 0x7365}, //7035 #CJK UNIFIED IDEOGRAPH + {0xAA98, 0x7366}, //7036 #CJK UNIFIED IDEOGRAPH + {0xAA99, 0x7367}, //7037 #CJK UNIFIED IDEOGRAPH + {0xAA9A, 0x7368}, //7038 #CJK UNIFIED IDEOGRAPH + {0xAA9B, 0x7369}, //7039 #CJK UNIFIED IDEOGRAPH + {0xAA9C, 0x736A}, //7040 #CJK UNIFIED IDEOGRAPH + {0xAA9D, 0x736B}, //7041 #CJK UNIFIED IDEOGRAPH + {0xAA9E, 0x736E}, //7042 #CJK UNIFIED IDEOGRAPH + {0xAA9F, 0x7370}, //7043 #CJK UNIFIED IDEOGRAPH + {0xAAA0, 0x7371}, //7044 #CJK UNIFIED IDEOGRAPH + {0xAB40, 0x7372}, //7045 #CJK UNIFIED IDEOGRAPH + {0xAB41, 0x7373}, //7046 #CJK UNIFIED IDEOGRAPH + {0xAB42, 0x7374}, //7047 #CJK UNIFIED IDEOGRAPH + {0xAB43, 0x7375}, //7048 #CJK UNIFIED IDEOGRAPH + {0xAB44, 0x7376}, //7049 #CJK UNIFIED IDEOGRAPH + {0xAB45, 0x7377}, //7050 #CJK UNIFIED IDEOGRAPH + {0xAB46, 0x7378}, //7051 #CJK UNIFIED IDEOGRAPH + {0xAB47, 0x7379}, //7052 #CJK UNIFIED IDEOGRAPH + {0xAB48, 0x737A}, //7053 #CJK UNIFIED IDEOGRAPH + {0xAB49, 0x737B}, //7054 #CJK UNIFIED IDEOGRAPH + {0xAB4A, 0x737C}, //7055 #CJK UNIFIED IDEOGRAPH + {0xAB4B, 0x737D}, //7056 #CJK UNIFIED IDEOGRAPH + {0xAB4C, 0x737F}, //7057 #CJK UNIFIED IDEOGRAPH + {0xAB4D, 0x7380}, //7058 #CJK UNIFIED IDEOGRAPH + {0xAB4E, 0x7381}, //7059 #CJK UNIFIED IDEOGRAPH + {0xAB4F, 0x7382}, //7060 #CJK UNIFIED IDEOGRAPH + {0xAB50, 0x7383}, //7061 #CJK UNIFIED IDEOGRAPH + {0xAB51, 0x7385}, //7062 #CJK UNIFIED IDEOGRAPH + {0xAB52, 0x7386}, //7063 #CJK UNIFIED IDEOGRAPH + {0xAB53, 0x7388}, //7064 #CJK UNIFIED IDEOGRAPH + {0xAB54, 0x738A}, //7065 #CJK UNIFIED IDEOGRAPH + {0xAB55, 0x738C}, //7066 #CJK UNIFIED IDEOGRAPH + {0xAB56, 0x738D}, //7067 #CJK UNIFIED IDEOGRAPH + {0xAB57, 0x738F}, //7068 #CJK UNIFIED IDEOGRAPH + {0xAB58, 0x7390}, //7069 #CJK UNIFIED IDEOGRAPH + {0xAB59, 0x7392}, //7070 #CJK UNIFIED IDEOGRAPH + {0xAB5A, 0x7393}, //7071 #CJK UNIFIED IDEOGRAPH + {0xAB5B, 0x7394}, //7072 #CJK UNIFIED IDEOGRAPH + {0xAB5C, 0x7395}, //7073 #CJK UNIFIED IDEOGRAPH + {0xAB5D, 0x7397}, //7074 #CJK UNIFIED IDEOGRAPH + {0xAB5E, 0x7398}, //7075 #CJK UNIFIED IDEOGRAPH + {0xAB5F, 0x7399}, //7076 #CJK UNIFIED IDEOGRAPH + {0xAB60, 0x739A}, //7077 #CJK UNIFIED IDEOGRAPH + {0xAB61, 0x739C}, //7078 #CJK UNIFIED IDEOGRAPH + {0xAB62, 0x739D}, //7079 #CJK UNIFIED IDEOGRAPH + {0xAB63, 0x739E}, //7080 #CJK UNIFIED IDEOGRAPH + {0xAB64, 0x73A0}, //7081 #CJK UNIFIED IDEOGRAPH + {0xAB65, 0x73A1}, //7082 #CJK UNIFIED IDEOGRAPH + {0xAB66, 0x73A3}, //7083 #CJK UNIFIED IDEOGRAPH + {0xAB67, 0x73A4}, //7084 #CJK UNIFIED IDEOGRAPH + {0xAB68, 0x73A5}, //7085 #CJK UNIFIED IDEOGRAPH + {0xAB69, 0x73A6}, //7086 #CJK UNIFIED IDEOGRAPH + {0xAB6A, 0x73A7}, //7087 #CJK UNIFIED IDEOGRAPH + {0xAB6B, 0x73A8}, //7088 #CJK UNIFIED IDEOGRAPH + {0xAB6C, 0x73AA}, //7089 #CJK UNIFIED IDEOGRAPH + {0xAB6D, 0x73AC}, //7090 #CJK UNIFIED IDEOGRAPH + {0xAB6E, 0x73AD}, //7091 #CJK UNIFIED IDEOGRAPH + {0xAB6F, 0x73B1}, //7092 #CJK UNIFIED IDEOGRAPH + {0xAB70, 0x73B4}, //7093 #CJK UNIFIED IDEOGRAPH + {0xAB71, 0x73B5}, //7094 #CJK UNIFIED IDEOGRAPH + {0xAB72, 0x73B6}, //7095 #CJK UNIFIED IDEOGRAPH + {0xAB73, 0x73B8}, //7096 #CJK UNIFIED IDEOGRAPH + {0xAB74, 0x73B9}, //7097 #CJK UNIFIED IDEOGRAPH + {0xAB75, 0x73BC}, //7098 #CJK UNIFIED IDEOGRAPH + {0xAB76, 0x73BD}, //7099 #CJK UNIFIED IDEOGRAPH + {0xAB77, 0x73BE}, //7100 #CJK UNIFIED IDEOGRAPH + {0xAB78, 0x73BF}, //7101 #CJK UNIFIED IDEOGRAPH + {0xAB79, 0x73C1}, //7102 #CJK UNIFIED IDEOGRAPH + {0xAB7A, 0x73C3}, //7103 #CJK UNIFIED IDEOGRAPH + {0xAB7B, 0x73C4}, //7104 #CJK UNIFIED IDEOGRAPH + {0xAB7C, 0x73C5}, //7105 #CJK UNIFIED IDEOGRAPH + {0xAB7D, 0x73C6}, //7106 #CJK UNIFIED IDEOGRAPH + {0xAB7E, 0x73C7}, //7107 #CJK UNIFIED IDEOGRAPH + {0xAB80, 0x73CB}, //7108 #CJK UNIFIED IDEOGRAPH + {0xAB81, 0x73CC}, //7109 #CJK UNIFIED IDEOGRAPH + {0xAB82, 0x73CE}, //7110 #CJK UNIFIED IDEOGRAPH + {0xAB83, 0x73D2}, //7111 #CJK UNIFIED IDEOGRAPH + {0xAB84, 0x73D3}, //7112 #CJK UNIFIED IDEOGRAPH + {0xAB85, 0x73D4}, //7113 #CJK UNIFIED IDEOGRAPH + {0xAB86, 0x73D5}, //7114 #CJK UNIFIED IDEOGRAPH + {0xAB87, 0x73D6}, //7115 #CJK UNIFIED IDEOGRAPH + {0xAB88, 0x73D7}, //7116 #CJK UNIFIED IDEOGRAPH + {0xAB89, 0x73D8}, //7117 #CJK UNIFIED IDEOGRAPH + {0xAB8A, 0x73DA}, //7118 #CJK UNIFIED IDEOGRAPH + {0xAB8B, 0x73DB}, //7119 #CJK UNIFIED IDEOGRAPH + {0xAB8C, 0x73DC}, //7120 #CJK UNIFIED IDEOGRAPH + {0xAB8D, 0x73DD}, //7121 #CJK UNIFIED IDEOGRAPH + {0xAB8E, 0x73DF}, //7122 #CJK UNIFIED IDEOGRAPH + {0xAB8F, 0x73E1}, //7123 #CJK UNIFIED IDEOGRAPH + {0xAB90, 0x73E2}, //7124 #CJK UNIFIED IDEOGRAPH + {0xAB91, 0x73E3}, //7125 #CJK UNIFIED IDEOGRAPH + {0xAB92, 0x73E4}, //7126 #CJK UNIFIED IDEOGRAPH + {0xAB93, 0x73E6}, //7127 #CJK UNIFIED IDEOGRAPH + {0xAB94, 0x73E8}, //7128 #CJK UNIFIED IDEOGRAPH + {0xAB95, 0x73EA}, //7129 #CJK UNIFIED IDEOGRAPH + {0xAB96, 0x73EB}, //7130 #CJK UNIFIED IDEOGRAPH + {0xAB97, 0x73EC}, //7131 #CJK UNIFIED IDEOGRAPH + {0xAB98, 0x73EE}, //7132 #CJK UNIFIED IDEOGRAPH + {0xAB99, 0x73EF}, //7133 #CJK UNIFIED IDEOGRAPH + {0xAB9A, 0x73F0}, //7134 #CJK UNIFIED IDEOGRAPH + {0xAB9B, 0x73F1}, //7135 #CJK UNIFIED IDEOGRAPH + {0xAB9C, 0x73F3}, //7136 #CJK UNIFIED IDEOGRAPH + {0xAB9D, 0x73F4}, //7137 #CJK UNIFIED IDEOGRAPH + {0xAB9E, 0x73F5}, //7138 #CJK UNIFIED IDEOGRAPH + {0xAB9F, 0x73F6}, //7139 #CJK UNIFIED IDEOGRAPH + {0xABA0, 0x73F7}, //7140 #CJK UNIFIED IDEOGRAPH + {0xAC40, 0x73F8}, //7141 #CJK UNIFIED IDEOGRAPH + {0xAC41, 0x73F9}, //7142 #CJK UNIFIED IDEOGRAPH + {0xAC42, 0x73FA}, //7143 #CJK UNIFIED IDEOGRAPH + {0xAC43, 0x73FB}, //7144 #CJK UNIFIED IDEOGRAPH + {0xAC44, 0x73FC}, //7145 #CJK UNIFIED IDEOGRAPH + {0xAC45, 0x73FD}, //7146 #CJK UNIFIED IDEOGRAPH + {0xAC46, 0x73FE}, //7147 #CJK UNIFIED IDEOGRAPH + {0xAC47, 0x73FF}, //7148 #CJK UNIFIED IDEOGRAPH + {0xAC48, 0x7400}, //7149 #CJK UNIFIED IDEOGRAPH + {0xAC49, 0x7401}, //7150 #CJK UNIFIED IDEOGRAPH + {0xAC4A, 0x7402}, //7151 #CJK UNIFIED IDEOGRAPH + {0xAC4B, 0x7404}, //7152 #CJK UNIFIED IDEOGRAPH + {0xAC4C, 0x7407}, //7153 #CJK UNIFIED IDEOGRAPH + {0xAC4D, 0x7408}, //7154 #CJK UNIFIED IDEOGRAPH + {0xAC4E, 0x740B}, //7155 #CJK UNIFIED IDEOGRAPH + {0xAC4F, 0x740C}, //7156 #CJK UNIFIED IDEOGRAPH + {0xAC50, 0x740D}, //7157 #CJK UNIFIED IDEOGRAPH + {0xAC51, 0x740E}, //7158 #CJK UNIFIED IDEOGRAPH + {0xAC52, 0x7411}, //7159 #CJK UNIFIED IDEOGRAPH + {0xAC53, 0x7412}, //7160 #CJK UNIFIED IDEOGRAPH + {0xAC54, 0x7413}, //7161 #CJK UNIFIED IDEOGRAPH + {0xAC55, 0x7414}, //7162 #CJK UNIFIED IDEOGRAPH + {0xAC56, 0x7415}, //7163 #CJK UNIFIED IDEOGRAPH + {0xAC57, 0x7416}, //7164 #CJK UNIFIED IDEOGRAPH + {0xAC58, 0x7417}, //7165 #CJK UNIFIED IDEOGRAPH + {0xAC59, 0x7418}, //7166 #CJK UNIFIED IDEOGRAPH + {0xAC5A, 0x7419}, //7167 #CJK UNIFIED IDEOGRAPH + {0xAC5B, 0x741C}, //7168 #CJK UNIFIED IDEOGRAPH + {0xAC5C, 0x741D}, //7169 #CJK UNIFIED IDEOGRAPH + {0xAC5D, 0x741E}, //7170 #CJK UNIFIED IDEOGRAPH + {0xAC5E, 0x741F}, //7171 #CJK UNIFIED IDEOGRAPH + {0xAC5F, 0x7420}, //7172 #CJK UNIFIED IDEOGRAPH + {0xAC60, 0x7421}, //7173 #CJK UNIFIED IDEOGRAPH + {0xAC61, 0x7423}, //7174 #CJK UNIFIED IDEOGRAPH + {0xAC62, 0x7424}, //7175 #CJK UNIFIED IDEOGRAPH + {0xAC63, 0x7427}, //7176 #CJK UNIFIED IDEOGRAPH + {0xAC64, 0x7429}, //7177 #CJK UNIFIED IDEOGRAPH + {0xAC65, 0x742B}, //7178 #CJK UNIFIED IDEOGRAPH + {0xAC66, 0x742D}, //7179 #CJK UNIFIED IDEOGRAPH + {0xAC67, 0x742F}, //7180 #CJK UNIFIED IDEOGRAPH + {0xAC68, 0x7431}, //7181 #CJK UNIFIED IDEOGRAPH + {0xAC69, 0x7432}, //7182 #CJK UNIFIED IDEOGRAPH + {0xAC6A, 0x7437}, //7183 #CJK UNIFIED IDEOGRAPH + {0xAC6B, 0x7438}, //7184 #CJK UNIFIED IDEOGRAPH + {0xAC6C, 0x7439}, //7185 #CJK UNIFIED IDEOGRAPH + {0xAC6D, 0x743A}, //7186 #CJK UNIFIED IDEOGRAPH + {0xAC6E, 0x743B}, //7187 #CJK UNIFIED IDEOGRAPH + {0xAC6F, 0x743D}, //7188 #CJK UNIFIED IDEOGRAPH + {0xAC70, 0x743E}, //7189 #CJK UNIFIED IDEOGRAPH + {0xAC71, 0x743F}, //7190 #CJK UNIFIED IDEOGRAPH + {0xAC72, 0x7440}, //7191 #CJK UNIFIED IDEOGRAPH + {0xAC73, 0x7442}, //7192 #CJK UNIFIED IDEOGRAPH + {0xAC74, 0x7443}, //7193 #CJK UNIFIED IDEOGRAPH + {0xAC75, 0x7444}, //7194 #CJK UNIFIED IDEOGRAPH + {0xAC76, 0x7445}, //7195 #CJK UNIFIED IDEOGRAPH + {0xAC77, 0x7446}, //7196 #CJK UNIFIED IDEOGRAPH + {0xAC78, 0x7447}, //7197 #CJK UNIFIED IDEOGRAPH + {0xAC79, 0x7448}, //7198 #CJK UNIFIED IDEOGRAPH + {0xAC7A, 0x7449}, //7199 #CJK UNIFIED IDEOGRAPH + {0xAC7B, 0x744A}, //7200 #CJK UNIFIED IDEOGRAPH + {0xAC7C, 0x744B}, //7201 #CJK UNIFIED IDEOGRAPH + {0xAC7D, 0x744C}, //7202 #CJK UNIFIED IDEOGRAPH + {0xAC7E, 0x744D}, //7203 #CJK UNIFIED IDEOGRAPH + {0xAC80, 0x744E}, //7204 #CJK UNIFIED IDEOGRAPH + {0xAC81, 0x744F}, //7205 #CJK UNIFIED IDEOGRAPH + {0xAC82, 0x7450}, //7206 #CJK UNIFIED IDEOGRAPH + {0xAC83, 0x7451}, //7207 #CJK UNIFIED IDEOGRAPH + {0xAC84, 0x7452}, //7208 #CJK UNIFIED IDEOGRAPH + {0xAC85, 0x7453}, //7209 #CJK UNIFIED IDEOGRAPH + {0xAC86, 0x7454}, //7210 #CJK UNIFIED IDEOGRAPH + {0xAC87, 0x7456}, //7211 #CJK UNIFIED IDEOGRAPH + {0xAC88, 0x7458}, //7212 #CJK UNIFIED IDEOGRAPH + {0xAC89, 0x745D}, //7213 #CJK UNIFIED IDEOGRAPH + {0xAC8A, 0x7460}, //7214 #CJK UNIFIED IDEOGRAPH + {0xAC8B, 0x7461}, //7215 #CJK UNIFIED IDEOGRAPH + {0xAC8C, 0x7462}, //7216 #CJK UNIFIED IDEOGRAPH + {0xAC8D, 0x7463}, //7217 #CJK UNIFIED IDEOGRAPH + {0xAC8E, 0x7464}, //7218 #CJK UNIFIED IDEOGRAPH + {0xAC8F, 0x7465}, //7219 #CJK UNIFIED IDEOGRAPH + {0xAC90, 0x7466}, //7220 #CJK UNIFIED IDEOGRAPH + {0xAC91, 0x7467}, //7221 #CJK UNIFIED IDEOGRAPH + {0xAC92, 0x7468}, //7222 #CJK UNIFIED IDEOGRAPH + {0xAC93, 0x7469}, //7223 #CJK UNIFIED IDEOGRAPH + {0xAC94, 0x746A}, //7224 #CJK UNIFIED IDEOGRAPH + {0xAC95, 0x746B}, //7225 #CJK UNIFIED IDEOGRAPH + {0xAC96, 0x746C}, //7226 #CJK UNIFIED IDEOGRAPH + {0xAC97, 0x746E}, //7227 #CJK UNIFIED IDEOGRAPH + {0xAC98, 0x746F}, //7228 #CJK UNIFIED IDEOGRAPH + {0xAC99, 0x7471}, //7229 #CJK UNIFIED IDEOGRAPH + {0xAC9A, 0x7472}, //7230 #CJK UNIFIED IDEOGRAPH + {0xAC9B, 0x7473}, //7231 #CJK UNIFIED IDEOGRAPH + {0xAC9C, 0x7474}, //7232 #CJK UNIFIED IDEOGRAPH + {0xAC9D, 0x7475}, //7233 #CJK UNIFIED IDEOGRAPH + {0xAC9E, 0x7478}, //7234 #CJK UNIFIED IDEOGRAPH + {0xAC9F, 0x7479}, //7235 #CJK UNIFIED IDEOGRAPH + {0xACA0, 0x747A}, //7236 #CJK UNIFIED IDEOGRAPH + {0xAD40, 0x747B}, //7237 #CJK UNIFIED IDEOGRAPH + {0xAD41, 0x747C}, //7238 #CJK UNIFIED IDEOGRAPH + {0xAD42, 0x747D}, //7239 #CJK UNIFIED IDEOGRAPH + {0xAD43, 0x747F}, //7240 #CJK UNIFIED IDEOGRAPH + {0xAD44, 0x7482}, //7241 #CJK UNIFIED IDEOGRAPH + {0xAD45, 0x7484}, //7242 #CJK UNIFIED IDEOGRAPH + {0xAD46, 0x7485}, //7243 #CJK UNIFIED IDEOGRAPH + {0xAD47, 0x7486}, //7244 #CJK UNIFIED IDEOGRAPH + {0xAD48, 0x7488}, //7245 #CJK UNIFIED IDEOGRAPH + {0xAD49, 0x7489}, //7246 #CJK UNIFIED IDEOGRAPH + {0xAD4A, 0x748A}, //7247 #CJK UNIFIED IDEOGRAPH + {0xAD4B, 0x748C}, //7248 #CJK UNIFIED IDEOGRAPH + {0xAD4C, 0x748D}, //7249 #CJK UNIFIED IDEOGRAPH + {0xAD4D, 0x748F}, //7250 #CJK UNIFIED IDEOGRAPH + {0xAD4E, 0x7491}, //7251 #CJK UNIFIED IDEOGRAPH + {0xAD4F, 0x7492}, //7252 #CJK UNIFIED IDEOGRAPH + {0xAD50, 0x7493}, //7253 #CJK UNIFIED IDEOGRAPH + {0xAD51, 0x7494}, //7254 #CJK UNIFIED IDEOGRAPH + {0xAD52, 0x7495}, //7255 #CJK UNIFIED IDEOGRAPH + {0xAD53, 0x7496}, //7256 #CJK UNIFIED IDEOGRAPH + {0xAD54, 0x7497}, //7257 #CJK UNIFIED IDEOGRAPH + {0xAD55, 0x7498}, //7258 #CJK UNIFIED IDEOGRAPH + {0xAD56, 0x7499}, //7259 #CJK UNIFIED IDEOGRAPH + {0xAD57, 0x749A}, //7260 #CJK UNIFIED IDEOGRAPH + {0xAD58, 0x749B}, //7261 #CJK UNIFIED IDEOGRAPH + {0xAD59, 0x749D}, //7262 #CJK UNIFIED IDEOGRAPH + {0xAD5A, 0x749F}, //7263 #CJK UNIFIED IDEOGRAPH + {0xAD5B, 0x74A0}, //7264 #CJK UNIFIED IDEOGRAPH + {0xAD5C, 0x74A1}, //7265 #CJK UNIFIED IDEOGRAPH + {0xAD5D, 0x74A2}, //7266 #CJK UNIFIED IDEOGRAPH + {0xAD5E, 0x74A3}, //7267 #CJK UNIFIED IDEOGRAPH + {0xAD5F, 0x74A4}, //7268 #CJK UNIFIED IDEOGRAPH + {0xAD60, 0x74A5}, //7269 #CJK UNIFIED IDEOGRAPH + {0xAD61, 0x74A6}, //7270 #CJK UNIFIED IDEOGRAPH + {0xAD62, 0x74AA}, //7271 #CJK UNIFIED IDEOGRAPH + {0xAD63, 0x74AB}, //7272 #CJK UNIFIED IDEOGRAPH + {0xAD64, 0x74AC}, //7273 #CJK UNIFIED IDEOGRAPH + {0xAD65, 0x74AD}, //7274 #CJK UNIFIED IDEOGRAPH + {0xAD66, 0x74AE}, //7275 #CJK UNIFIED IDEOGRAPH + {0xAD67, 0x74AF}, //7276 #CJK UNIFIED IDEOGRAPH + {0xAD68, 0x74B0}, //7277 #CJK UNIFIED IDEOGRAPH + {0xAD69, 0x74B1}, //7278 #CJK UNIFIED IDEOGRAPH + {0xAD6A, 0x74B2}, //7279 #CJK UNIFIED IDEOGRAPH + {0xAD6B, 0x74B3}, //7280 #CJK UNIFIED IDEOGRAPH + {0xAD6C, 0x74B4}, //7281 #CJK UNIFIED IDEOGRAPH + {0xAD6D, 0x74B5}, //7282 #CJK UNIFIED IDEOGRAPH + {0xAD6E, 0x74B6}, //7283 #CJK UNIFIED IDEOGRAPH + {0xAD6F, 0x74B7}, //7284 #CJK UNIFIED IDEOGRAPH + {0xAD70, 0x74B8}, //7285 #CJK UNIFIED IDEOGRAPH + {0xAD71, 0x74B9}, //7286 #CJK UNIFIED IDEOGRAPH + {0xAD72, 0x74BB}, //7287 #CJK UNIFIED IDEOGRAPH + {0xAD73, 0x74BC}, //7288 #CJK UNIFIED IDEOGRAPH + {0xAD74, 0x74BD}, //7289 #CJK UNIFIED IDEOGRAPH + {0xAD75, 0x74BE}, //7290 #CJK UNIFIED IDEOGRAPH + {0xAD76, 0x74BF}, //7291 #CJK UNIFIED IDEOGRAPH + {0xAD77, 0x74C0}, //7292 #CJK UNIFIED IDEOGRAPH + {0xAD78, 0x74C1}, //7293 #CJK UNIFIED IDEOGRAPH + {0xAD79, 0x74C2}, //7294 #CJK UNIFIED IDEOGRAPH + {0xAD7A, 0x74C3}, //7295 #CJK UNIFIED IDEOGRAPH + {0xAD7B, 0x74C4}, //7296 #CJK UNIFIED IDEOGRAPH + {0xAD7C, 0x74C5}, //7297 #CJK UNIFIED IDEOGRAPH + {0xAD7D, 0x74C6}, //7298 #CJK UNIFIED IDEOGRAPH + {0xAD7E, 0x74C7}, //7299 #CJK UNIFIED IDEOGRAPH + {0xAD80, 0x74C8}, //7300 #CJK UNIFIED IDEOGRAPH + {0xAD81, 0x74C9}, //7301 #CJK UNIFIED IDEOGRAPH + {0xAD82, 0x74CA}, //7302 #CJK UNIFIED IDEOGRAPH + {0xAD83, 0x74CB}, //7303 #CJK UNIFIED IDEOGRAPH + {0xAD84, 0x74CC}, //7304 #CJK UNIFIED IDEOGRAPH + {0xAD85, 0x74CD}, //7305 #CJK UNIFIED IDEOGRAPH + {0xAD86, 0x74CE}, //7306 #CJK UNIFIED IDEOGRAPH + {0xAD87, 0x74CF}, //7307 #CJK UNIFIED IDEOGRAPH + {0xAD88, 0x74D0}, //7308 #CJK UNIFIED IDEOGRAPH + {0xAD89, 0x74D1}, //7309 #CJK UNIFIED IDEOGRAPH + {0xAD8A, 0x74D3}, //7310 #CJK UNIFIED IDEOGRAPH + {0xAD8B, 0x74D4}, //7311 #CJK UNIFIED IDEOGRAPH + {0xAD8C, 0x74D5}, //7312 #CJK UNIFIED IDEOGRAPH + {0xAD8D, 0x74D6}, //7313 #CJK UNIFIED IDEOGRAPH + {0xAD8E, 0x74D7}, //7314 #CJK UNIFIED IDEOGRAPH + {0xAD8F, 0x74D8}, //7315 #CJK UNIFIED IDEOGRAPH + {0xAD90, 0x74D9}, //7316 #CJK UNIFIED IDEOGRAPH + {0xAD91, 0x74DA}, //7317 #CJK UNIFIED IDEOGRAPH + {0xAD92, 0x74DB}, //7318 #CJK UNIFIED IDEOGRAPH + {0xAD93, 0x74DD}, //7319 #CJK UNIFIED IDEOGRAPH + {0xAD94, 0x74DF}, //7320 #CJK UNIFIED IDEOGRAPH + {0xAD95, 0x74E1}, //7321 #CJK UNIFIED IDEOGRAPH + {0xAD96, 0x74E5}, //7322 #CJK UNIFIED IDEOGRAPH + {0xAD97, 0x74E7}, //7323 #CJK UNIFIED IDEOGRAPH + {0xAD98, 0x74E8}, //7324 #CJK UNIFIED IDEOGRAPH + {0xAD99, 0x74E9}, //7325 #CJK UNIFIED IDEOGRAPH + {0xAD9A, 0x74EA}, //7326 #CJK UNIFIED IDEOGRAPH + {0xAD9B, 0x74EB}, //7327 #CJK UNIFIED IDEOGRAPH + {0xAD9C, 0x74EC}, //7328 #CJK UNIFIED IDEOGRAPH + {0xAD9D, 0x74ED}, //7329 #CJK UNIFIED IDEOGRAPH + {0xAD9E, 0x74F0}, //7330 #CJK UNIFIED IDEOGRAPH + {0xAD9F, 0x74F1}, //7331 #CJK UNIFIED IDEOGRAPH + {0xADA0, 0x74F2}, //7332 #CJK UNIFIED IDEOGRAPH + {0xAE40, 0x74F3}, //7333 #CJK UNIFIED IDEOGRAPH + {0xAE41, 0x74F5}, //7334 #CJK UNIFIED IDEOGRAPH + {0xAE42, 0x74F8}, //7335 #CJK UNIFIED IDEOGRAPH + {0xAE43, 0x74F9}, //7336 #CJK UNIFIED IDEOGRAPH + {0xAE44, 0x74FA}, //7337 #CJK UNIFIED IDEOGRAPH + {0xAE45, 0x74FB}, //7338 #CJK UNIFIED IDEOGRAPH + {0xAE46, 0x74FC}, //7339 #CJK UNIFIED IDEOGRAPH + {0xAE47, 0x74FD}, //7340 #CJK UNIFIED IDEOGRAPH + {0xAE48, 0x74FE}, //7341 #CJK UNIFIED IDEOGRAPH + {0xAE49, 0x7500}, //7342 #CJK UNIFIED IDEOGRAPH + {0xAE4A, 0x7501}, //7343 #CJK UNIFIED IDEOGRAPH + {0xAE4B, 0x7502}, //7344 #CJK UNIFIED IDEOGRAPH + {0xAE4C, 0x7503}, //7345 #CJK UNIFIED IDEOGRAPH + {0xAE4D, 0x7505}, //7346 #CJK UNIFIED IDEOGRAPH + {0xAE4E, 0x7506}, //7347 #CJK UNIFIED IDEOGRAPH + {0xAE4F, 0x7507}, //7348 #CJK UNIFIED IDEOGRAPH + {0xAE50, 0x7508}, //7349 #CJK UNIFIED IDEOGRAPH + {0xAE51, 0x7509}, //7350 #CJK UNIFIED IDEOGRAPH + {0xAE52, 0x750A}, //7351 #CJK UNIFIED IDEOGRAPH + {0xAE53, 0x750B}, //7352 #CJK UNIFIED IDEOGRAPH + {0xAE54, 0x750C}, //7353 #CJK UNIFIED IDEOGRAPH + {0xAE55, 0x750E}, //7354 #CJK UNIFIED IDEOGRAPH + {0xAE56, 0x7510}, //7355 #CJK UNIFIED IDEOGRAPH + {0xAE57, 0x7512}, //7356 #CJK UNIFIED IDEOGRAPH + {0xAE58, 0x7514}, //7357 #CJK UNIFIED IDEOGRAPH + {0xAE59, 0x7515}, //7358 #CJK UNIFIED IDEOGRAPH + {0xAE5A, 0x7516}, //7359 #CJK UNIFIED IDEOGRAPH + {0xAE5B, 0x7517}, //7360 #CJK UNIFIED IDEOGRAPH + {0xAE5C, 0x751B}, //7361 #CJK UNIFIED IDEOGRAPH + {0xAE5D, 0x751D}, //7362 #CJK UNIFIED IDEOGRAPH + {0xAE5E, 0x751E}, //7363 #CJK UNIFIED IDEOGRAPH + {0xAE5F, 0x7520}, //7364 #CJK UNIFIED IDEOGRAPH + {0xAE60, 0x7521}, //7365 #CJK UNIFIED IDEOGRAPH + {0xAE61, 0x7522}, //7366 #CJK UNIFIED IDEOGRAPH + {0xAE62, 0x7523}, //7367 #CJK UNIFIED IDEOGRAPH + {0xAE63, 0x7524}, //7368 #CJK UNIFIED IDEOGRAPH + {0xAE64, 0x7526}, //7369 #CJK UNIFIED IDEOGRAPH + {0xAE65, 0x7527}, //7370 #CJK UNIFIED IDEOGRAPH + {0xAE66, 0x752A}, //7371 #CJK UNIFIED IDEOGRAPH + {0xAE67, 0x752E}, //7372 #CJK UNIFIED IDEOGRAPH + {0xAE68, 0x7534}, //7373 #CJK UNIFIED IDEOGRAPH + {0xAE69, 0x7536}, //7374 #CJK UNIFIED IDEOGRAPH + {0xAE6A, 0x7539}, //7375 #CJK UNIFIED IDEOGRAPH + {0xAE6B, 0x753C}, //7376 #CJK UNIFIED IDEOGRAPH + {0xAE6C, 0x753D}, //7377 #CJK UNIFIED IDEOGRAPH + {0xAE6D, 0x753F}, //7378 #CJK UNIFIED IDEOGRAPH + {0xAE6E, 0x7541}, //7379 #CJK UNIFIED IDEOGRAPH + {0xAE6F, 0x7542}, //7380 #CJK UNIFIED IDEOGRAPH + {0xAE70, 0x7543}, //7381 #CJK UNIFIED IDEOGRAPH + {0xAE71, 0x7544}, //7382 #CJK UNIFIED IDEOGRAPH + {0xAE72, 0x7546}, //7383 #CJK UNIFIED IDEOGRAPH + {0xAE73, 0x7547}, //7384 #CJK UNIFIED IDEOGRAPH + {0xAE74, 0x7549}, //7385 #CJK UNIFIED IDEOGRAPH + {0xAE75, 0x754A}, //7386 #CJK UNIFIED IDEOGRAPH + {0xAE76, 0x754D}, //7387 #CJK UNIFIED IDEOGRAPH + {0xAE77, 0x7550}, //7388 #CJK UNIFIED IDEOGRAPH + {0xAE78, 0x7551}, //7389 #CJK UNIFIED IDEOGRAPH + {0xAE79, 0x7552}, //7390 #CJK UNIFIED IDEOGRAPH + {0xAE7A, 0x7553}, //7391 #CJK UNIFIED IDEOGRAPH + {0xAE7B, 0x7555}, //7392 #CJK UNIFIED IDEOGRAPH + {0xAE7C, 0x7556}, //7393 #CJK UNIFIED IDEOGRAPH + {0xAE7D, 0x7557}, //7394 #CJK UNIFIED IDEOGRAPH + {0xAE7E, 0x7558}, //7395 #CJK UNIFIED IDEOGRAPH + {0xAE80, 0x755D}, //7396 #CJK UNIFIED IDEOGRAPH + {0xAE81, 0x755E}, //7397 #CJK UNIFIED IDEOGRAPH + {0xAE82, 0x755F}, //7398 #CJK UNIFIED IDEOGRAPH + {0xAE83, 0x7560}, //7399 #CJK UNIFIED IDEOGRAPH + {0xAE84, 0x7561}, //7400 #CJK UNIFIED IDEOGRAPH + {0xAE85, 0x7562}, //7401 #CJK UNIFIED IDEOGRAPH + {0xAE86, 0x7563}, //7402 #CJK UNIFIED IDEOGRAPH + {0xAE87, 0x7564}, //7403 #CJK UNIFIED IDEOGRAPH + {0xAE88, 0x7567}, //7404 #CJK UNIFIED IDEOGRAPH + {0xAE89, 0x7568}, //7405 #CJK UNIFIED IDEOGRAPH + {0xAE8A, 0x7569}, //7406 #CJK UNIFIED IDEOGRAPH + {0xAE8B, 0x756B}, //7407 #CJK UNIFIED IDEOGRAPH + {0xAE8C, 0x756C}, //7408 #CJK UNIFIED IDEOGRAPH + {0xAE8D, 0x756D}, //7409 #CJK UNIFIED IDEOGRAPH + {0xAE8E, 0x756E}, //7410 #CJK UNIFIED IDEOGRAPH + {0xAE8F, 0x756F}, //7411 #CJK UNIFIED IDEOGRAPH + {0xAE90, 0x7570}, //7412 #CJK UNIFIED IDEOGRAPH + {0xAE91, 0x7571}, //7413 #CJK UNIFIED IDEOGRAPH + {0xAE92, 0x7573}, //7414 #CJK UNIFIED IDEOGRAPH + {0xAE93, 0x7575}, //7415 #CJK UNIFIED IDEOGRAPH + {0xAE94, 0x7576}, //7416 #CJK UNIFIED IDEOGRAPH + {0xAE95, 0x7577}, //7417 #CJK UNIFIED IDEOGRAPH + {0xAE96, 0x757A}, //7418 #CJK UNIFIED IDEOGRAPH + {0xAE97, 0x757B}, //7419 #CJK UNIFIED IDEOGRAPH + {0xAE98, 0x757C}, //7420 #CJK UNIFIED IDEOGRAPH + {0xAE99, 0x757D}, //7421 #CJK UNIFIED IDEOGRAPH + {0xAE9A, 0x757E}, //7422 #CJK UNIFIED IDEOGRAPH + {0xAE9B, 0x7580}, //7423 #CJK UNIFIED IDEOGRAPH + {0xAE9C, 0x7581}, //7424 #CJK UNIFIED IDEOGRAPH + {0xAE9D, 0x7582}, //7425 #CJK UNIFIED IDEOGRAPH + {0xAE9E, 0x7584}, //7426 #CJK UNIFIED IDEOGRAPH + {0xAE9F, 0x7585}, //7427 #CJK UNIFIED IDEOGRAPH + {0xAEA0, 0x7587}, //7428 #CJK UNIFIED IDEOGRAPH + {0xAF40, 0x7588}, //7429 #CJK UNIFIED IDEOGRAPH + {0xAF41, 0x7589}, //7430 #CJK UNIFIED IDEOGRAPH + {0xAF42, 0x758A}, //7431 #CJK UNIFIED IDEOGRAPH + {0xAF43, 0x758C}, //7432 #CJK UNIFIED IDEOGRAPH + {0xAF44, 0x758D}, //7433 #CJK UNIFIED IDEOGRAPH + {0xAF45, 0x758E}, //7434 #CJK UNIFIED IDEOGRAPH + {0xAF46, 0x7590}, //7435 #CJK UNIFIED IDEOGRAPH + {0xAF47, 0x7593}, //7436 #CJK UNIFIED IDEOGRAPH + {0xAF48, 0x7595}, //7437 #CJK UNIFIED IDEOGRAPH + {0xAF49, 0x7598}, //7438 #CJK UNIFIED IDEOGRAPH + {0xAF4A, 0x759B}, //7439 #CJK UNIFIED IDEOGRAPH + {0xAF4B, 0x759C}, //7440 #CJK UNIFIED IDEOGRAPH + {0xAF4C, 0x759E}, //7441 #CJK UNIFIED IDEOGRAPH + {0xAF4D, 0x75A2}, //7442 #CJK UNIFIED IDEOGRAPH + {0xAF4E, 0x75A6}, //7443 #CJK UNIFIED IDEOGRAPH + {0xAF4F, 0x75A7}, //7444 #CJK UNIFIED IDEOGRAPH + {0xAF50, 0x75A8}, //7445 #CJK UNIFIED IDEOGRAPH + {0xAF51, 0x75A9}, //7446 #CJK UNIFIED IDEOGRAPH + {0xAF52, 0x75AA}, //7447 #CJK UNIFIED IDEOGRAPH + {0xAF53, 0x75AD}, //7448 #CJK UNIFIED IDEOGRAPH + {0xAF54, 0x75B6}, //7449 #CJK UNIFIED IDEOGRAPH + {0xAF55, 0x75B7}, //7450 #CJK UNIFIED IDEOGRAPH + {0xAF56, 0x75BA}, //7451 #CJK UNIFIED IDEOGRAPH + {0xAF57, 0x75BB}, //7452 #CJK UNIFIED IDEOGRAPH + {0xAF58, 0x75BF}, //7453 #CJK UNIFIED IDEOGRAPH + {0xAF59, 0x75C0}, //7454 #CJK UNIFIED IDEOGRAPH + {0xAF5A, 0x75C1}, //7455 #CJK UNIFIED IDEOGRAPH + {0xAF5B, 0x75C6}, //7456 #CJK UNIFIED IDEOGRAPH + {0xAF5C, 0x75CB}, //7457 #CJK UNIFIED IDEOGRAPH + {0xAF5D, 0x75CC}, //7458 #CJK UNIFIED IDEOGRAPH + {0xAF5E, 0x75CE}, //7459 #CJK UNIFIED IDEOGRAPH + {0xAF5F, 0x75CF}, //7460 #CJK UNIFIED IDEOGRAPH + {0xAF60, 0x75D0}, //7461 #CJK UNIFIED IDEOGRAPH + {0xAF61, 0x75D1}, //7462 #CJK UNIFIED IDEOGRAPH + {0xAF62, 0x75D3}, //7463 #CJK UNIFIED IDEOGRAPH + {0xAF63, 0x75D7}, //7464 #CJK UNIFIED IDEOGRAPH + {0xAF64, 0x75D9}, //7465 #CJK UNIFIED IDEOGRAPH + {0xAF65, 0x75DA}, //7466 #CJK UNIFIED IDEOGRAPH + {0xAF66, 0x75DC}, //7467 #CJK UNIFIED IDEOGRAPH + {0xAF67, 0x75DD}, //7468 #CJK UNIFIED IDEOGRAPH + {0xAF68, 0x75DF}, //7469 #CJK UNIFIED IDEOGRAPH + {0xAF69, 0x75E0}, //7470 #CJK UNIFIED IDEOGRAPH + {0xAF6A, 0x75E1}, //7471 #CJK UNIFIED IDEOGRAPH + {0xAF6B, 0x75E5}, //7472 #CJK UNIFIED IDEOGRAPH + {0xAF6C, 0x75E9}, //7473 #CJK UNIFIED IDEOGRAPH + {0xAF6D, 0x75EC}, //7474 #CJK UNIFIED IDEOGRAPH + {0xAF6E, 0x75ED}, //7475 #CJK UNIFIED IDEOGRAPH + {0xAF6F, 0x75EE}, //7476 #CJK UNIFIED IDEOGRAPH + {0xAF70, 0x75EF}, //7477 #CJK UNIFIED IDEOGRAPH + {0xAF71, 0x75F2}, //7478 #CJK UNIFIED IDEOGRAPH + {0xAF72, 0x75F3}, //7479 #CJK UNIFIED IDEOGRAPH + {0xAF73, 0x75F5}, //7480 #CJK UNIFIED IDEOGRAPH + {0xAF74, 0x75F6}, //7481 #CJK UNIFIED IDEOGRAPH + {0xAF75, 0x75F7}, //7482 #CJK UNIFIED IDEOGRAPH + {0xAF76, 0x75F8}, //7483 #CJK UNIFIED IDEOGRAPH + {0xAF77, 0x75FA}, //7484 #CJK UNIFIED IDEOGRAPH + {0xAF78, 0x75FB}, //7485 #CJK UNIFIED IDEOGRAPH + {0xAF79, 0x75FD}, //7486 #CJK UNIFIED IDEOGRAPH + {0xAF7A, 0x75FE}, //7487 #CJK UNIFIED IDEOGRAPH + {0xAF7B, 0x7602}, //7488 #CJK UNIFIED IDEOGRAPH + {0xAF7C, 0x7604}, //7489 #CJK UNIFIED IDEOGRAPH + {0xAF7D, 0x7606}, //7490 #CJK UNIFIED IDEOGRAPH + {0xAF7E, 0x7607}, //7491 #CJK UNIFIED IDEOGRAPH + {0xAF80, 0x7608}, //7492 #CJK UNIFIED IDEOGRAPH + {0xAF81, 0x7609}, //7493 #CJK UNIFIED IDEOGRAPH + {0xAF82, 0x760B}, //7494 #CJK UNIFIED IDEOGRAPH + {0xAF83, 0x760D}, //7495 #CJK UNIFIED IDEOGRAPH + {0xAF84, 0x760E}, //7496 #CJK UNIFIED IDEOGRAPH + {0xAF85, 0x760F}, //7497 #CJK UNIFIED IDEOGRAPH + {0xAF86, 0x7611}, //7498 #CJK UNIFIED IDEOGRAPH + {0xAF87, 0x7612}, //7499 #CJK UNIFIED IDEOGRAPH + {0xAF88, 0x7613}, //7500 #CJK UNIFIED IDEOGRAPH + {0xAF89, 0x7614}, //7501 #CJK UNIFIED IDEOGRAPH + {0xAF8A, 0x7616}, //7502 #CJK UNIFIED IDEOGRAPH + {0xAF8B, 0x761A}, //7503 #CJK UNIFIED IDEOGRAPH + {0xAF8C, 0x761C}, //7504 #CJK UNIFIED IDEOGRAPH + {0xAF8D, 0x761D}, //7505 #CJK UNIFIED IDEOGRAPH + {0xAF8E, 0x761E}, //7506 #CJK UNIFIED IDEOGRAPH + {0xAF8F, 0x7621}, //7507 #CJK UNIFIED IDEOGRAPH + {0xAF90, 0x7623}, //7508 #CJK UNIFIED IDEOGRAPH + {0xAF91, 0x7627}, //7509 #CJK UNIFIED IDEOGRAPH + {0xAF92, 0x7628}, //7510 #CJK UNIFIED IDEOGRAPH + {0xAF93, 0x762C}, //7511 #CJK UNIFIED IDEOGRAPH + {0xAF94, 0x762E}, //7512 #CJK UNIFIED IDEOGRAPH + {0xAF95, 0x762F}, //7513 #CJK UNIFIED IDEOGRAPH + {0xAF96, 0x7631}, //7514 #CJK UNIFIED IDEOGRAPH + {0xAF97, 0x7632}, //7515 #CJK UNIFIED IDEOGRAPH + {0xAF98, 0x7636}, //7516 #CJK UNIFIED IDEOGRAPH + {0xAF99, 0x7637}, //7517 #CJK UNIFIED IDEOGRAPH + {0xAF9A, 0x7639}, //7518 #CJK UNIFIED IDEOGRAPH + {0xAF9B, 0x763A}, //7519 #CJK UNIFIED IDEOGRAPH + {0xAF9C, 0x763B}, //7520 #CJK UNIFIED IDEOGRAPH + {0xAF9D, 0x763D}, //7521 #CJK UNIFIED IDEOGRAPH + {0xAF9E, 0x7641}, //7522 #CJK UNIFIED IDEOGRAPH + {0xAF9F, 0x7642}, //7523 #CJK UNIFIED IDEOGRAPH + {0xAFA0, 0x7644}, //7524 #CJK UNIFIED IDEOGRAPH + {0xB040, 0x7645}, //7525 #CJK UNIFIED IDEOGRAPH + {0xB041, 0x7646}, //7526 #CJK UNIFIED IDEOGRAPH + {0xB042, 0x7647}, //7527 #CJK UNIFIED IDEOGRAPH + {0xB043, 0x7648}, //7528 #CJK UNIFIED IDEOGRAPH + {0xB044, 0x7649}, //7529 #CJK UNIFIED IDEOGRAPH + {0xB045, 0x764A}, //7530 #CJK UNIFIED IDEOGRAPH + {0xB046, 0x764B}, //7531 #CJK UNIFIED IDEOGRAPH + {0xB047, 0x764E}, //7532 #CJK UNIFIED IDEOGRAPH + {0xB048, 0x764F}, //7533 #CJK UNIFIED IDEOGRAPH + {0xB049, 0x7650}, //7534 #CJK UNIFIED IDEOGRAPH + {0xB04A, 0x7651}, //7535 #CJK UNIFIED IDEOGRAPH + {0xB04B, 0x7652}, //7536 #CJK UNIFIED IDEOGRAPH + {0xB04C, 0x7653}, //7537 #CJK UNIFIED IDEOGRAPH + {0xB04D, 0x7655}, //7538 #CJK UNIFIED IDEOGRAPH + {0xB04E, 0x7657}, //7539 #CJK UNIFIED IDEOGRAPH + {0xB04F, 0x7658}, //7540 #CJK UNIFIED IDEOGRAPH + {0xB050, 0x7659}, //7541 #CJK UNIFIED IDEOGRAPH + {0xB051, 0x765A}, //7542 #CJK UNIFIED IDEOGRAPH + {0xB052, 0x765B}, //7543 #CJK UNIFIED IDEOGRAPH + {0xB053, 0x765D}, //7544 #CJK UNIFIED IDEOGRAPH + {0xB054, 0x765F}, //7545 #CJK UNIFIED IDEOGRAPH + {0xB055, 0x7660}, //7546 #CJK UNIFIED IDEOGRAPH + {0xB056, 0x7661}, //7547 #CJK UNIFIED IDEOGRAPH + {0xB057, 0x7662}, //7548 #CJK UNIFIED IDEOGRAPH + {0xB058, 0x7664}, //7549 #CJK UNIFIED IDEOGRAPH + {0xB059, 0x7665}, //7550 #CJK UNIFIED IDEOGRAPH + {0xB05A, 0x7666}, //7551 #CJK UNIFIED IDEOGRAPH + {0xB05B, 0x7667}, //7552 #CJK UNIFIED IDEOGRAPH + {0xB05C, 0x7668}, //7553 #CJK UNIFIED IDEOGRAPH + {0xB05D, 0x7669}, //7554 #CJK UNIFIED IDEOGRAPH + {0xB05E, 0x766A}, //7555 #CJK UNIFIED IDEOGRAPH + {0xB05F, 0x766C}, //7556 #CJK UNIFIED IDEOGRAPH + {0xB060, 0x766D}, //7557 #CJK UNIFIED IDEOGRAPH + {0xB061, 0x766E}, //7558 #CJK UNIFIED IDEOGRAPH + {0xB062, 0x7670}, //7559 #CJK UNIFIED IDEOGRAPH + {0xB063, 0x7671}, //7560 #CJK UNIFIED IDEOGRAPH + {0xB064, 0x7672}, //7561 #CJK UNIFIED IDEOGRAPH + {0xB065, 0x7673}, //7562 #CJK UNIFIED IDEOGRAPH + {0xB066, 0x7674}, //7563 #CJK UNIFIED IDEOGRAPH + {0xB067, 0x7675}, //7564 #CJK UNIFIED IDEOGRAPH + {0xB068, 0x7676}, //7565 #CJK UNIFIED IDEOGRAPH + {0xB069, 0x7677}, //7566 #CJK UNIFIED IDEOGRAPH + {0xB06A, 0x7679}, //7567 #CJK UNIFIED IDEOGRAPH + {0xB06B, 0x767A}, //7568 #CJK UNIFIED IDEOGRAPH + {0xB06C, 0x767C}, //7569 #CJK UNIFIED IDEOGRAPH + {0xB06D, 0x767F}, //7570 #CJK UNIFIED IDEOGRAPH + {0xB06E, 0x7680}, //7571 #CJK UNIFIED IDEOGRAPH + {0xB06F, 0x7681}, //7572 #CJK UNIFIED IDEOGRAPH + {0xB070, 0x7683}, //7573 #CJK UNIFIED IDEOGRAPH + {0xB071, 0x7685}, //7574 #CJK UNIFIED IDEOGRAPH + {0xB072, 0x7689}, //7575 #CJK UNIFIED IDEOGRAPH + {0xB073, 0x768A}, //7576 #CJK UNIFIED IDEOGRAPH + {0xB074, 0x768C}, //7577 #CJK UNIFIED IDEOGRAPH + {0xB075, 0x768D}, //7578 #CJK UNIFIED IDEOGRAPH + {0xB076, 0x768F}, //7579 #CJK UNIFIED IDEOGRAPH + {0xB077, 0x7690}, //7580 #CJK UNIFIED IDEOGRAPH + {0xB078, 0x7692}, //7581 #CJK UNIFIED IDEOGRAPH + {0xB079, 0x7694}, //7582 #CJK UNIFIED IDEOGRAPH + {0xB07A, 0x7695}, //7583 #CJK UNIFIED IDEOGRAPH + {0xB07B, 0x7697}, //7584 #CJK UNIFIED IDEOGRAPH + {0xB07C, 0x7698}, //7585 #CJK UNIFIED IDEOGRAPH + {0xB07D, 0x769A}, //7586 #CJK UNIFIED IDEOGRAPH + {0xB07E, 0x769B}, //7587 #CJK UNIFIED IDEOGRAPH + {0xB080, 0x769C}, //7588 #CJK UNIFIED IDEOGRAPH + {0xB081, 0x769D}, //7589 #CJK UNIFIED IDEOGRAPH + {0xB082, 0x769E}, //7590 #CJK UNIFIED IDEOGRAPH + {0xB083, 0x769F}, //7591 #CJK UNIFIED IDEOGRAPH + {0xB084, 0x76A0}, //7592 #CJK UNIFIED IDEOGRAPH + {0xB085, 0x76A1}, //7593 #CJK UNIFIED IDEOGRAPH + {0xB086, 0x76A2}, //7594 #CJK UNIFIED IDEOGRAPH + {0xB087, 0x76A3}, //7595 #CJK UNIFIED IDEOGRAPH + {0xB088, 0x76A5}, //7596 #CJK UNIFIED IDEOGRAPH + {0xB089, 0x76A6}, //7597 #CJK UNIFIED IDEOGRAPH + {0xB08A, 0x76A7}, //7598 #CJK UNIFIED IDEOGRAPH + {0xB08B, 0x76A8}, //7599 #CJK UNIFIED IDEOGRAPH + {0xB08C, 0x76A9}, //7600 #CJK UNIFIED IDEOGRAPH + {0xB08D, 0x76AA}, //7601 #CJK UNIFIED IDEOGRAPH + {0xB08E, 0x76AB}, //7602 #CJK UNIFIED IDEOGRAPH + {0xB08F, 0x76AC}, //7603 #CJK UNIFIED IDEOGRAPH + {0xB090, 0x76AD}, //7604 #CJK UNIFIED IDEOGRAPH + {0xB091, 0x76AF}, //7605 #CJK UNIFIED IDEOGRAPH + {0xB092, 0x76B0}, //7606 #CJK UNIFIED IDEOGRAPH + {0xB093, 0x76B3}, //7607 #CJK UNIFIED IDEOGRAPH + {0xB094, 0x76B5}, //7608 #CJK UNIFIED IDEOGRAPH + {0xB095, 0x76B6}, //7609 #CJK UNIFIED IDEOGRAPH + {0xB096, 0x76B7}, //7610 #CJK UNIFIED IDEOGRAPH + {0xB097, 0x76B8}, //7611 #CJK UNIFIED IDEOGRAPH + {0xB098, 0x76B9}, //7612 #CJK UNIFIED IDEOGRAPH + {0xB099, 0x76BA}, //7613 #CJK UNIFIED IDEOGRAPH + {0xB09A, 0x76BB}, //7614 #CJK UNIFIED IDEOGRAPH + {0xB09B, 0x76BC}, //7615 #CJK UNIFIED IDEOGRAPH + {0xB09C, 0x76BD}, //7616 #CJK UNIFIED IDEOGRAPH + {0xB09D, 0x76BE}, //7617 #CJK UNIFIED IDEOGRAPH + {0xB09E, 0x76C0}, //7618 #CJK UNIFIED IDEOGRAPH + {0xB09F, 0x76C1}, //7619 #CJK UNIFIED IDEOGRAPH + {0xB0A0, 0x76C3}, //7620 #CJK UNIFIED IDEOGRAPH + {0xB0A1, 0x554A}, //7621 #CJK UNIFIED IDEOGRAPH + {0xB0A2, 0x963F}, //7622 #CJK UNIFIED IDEOGRAPH + {0xB0A3, 0x57C3}, //7623 #CJK UNIFIED IDEOGRAPH + {0xB0A4, 0x6328}, //7624 #CJK UNIFIED IDEOGRAPH + {0xB0A5, 0x54CE}, //7625 #CJK UNIFIED IDEOGRAPH + {0xB0A6, 0x5509}, //7626 #CJK UNIFIED IDEOGRAPH + {0xB0A7, 0x54C0}, //7627 #CJK UNIFIED IDEOGRAPH + {0xB0A8, 0x7691}, //7628 #CJK UNIFIED IDEOGRAPH + {0xB0A9, 0x764C}, //7629 #CJK UNIFIED IDEOGRAPH + {0xB0AA, 0x853C}, //7630 #CJK UNIFIED IDEOGRAPH + {0xB0AB, 0x77EE}, //7631 #CJK UNIFIED IDEOGRAPH + {0xB0AC, 0x827E}, //7632 #CJK UNIFIED IDEOGRAPH + {0xB0AD, 0x788D}, //7633 #CJK UNIFIED IDEOGRAPH + {0xB0AE, 0x7231}, //7634 #CJK UNIFIED IDEOGRAPH + {0xB0AF, 0x9698}, //7635 #CJK UNIFIED IDEOGRAPH + {0xB0B0, 0x978D}, //7636 #CJK UNIFIED IDEOGRAPH + {0xB0B1, 0x6C28}, //7637 #CJK UNIFIED IDEOGRAPH + {0xB0B2, 0x5B89}, //7638 #CJK UNIFIED IDEOGRAPH + {0xB0B3, 0x4FFA}, //7639 #CJK UNIFIED IDEOGRAPH + {0xB0B4, 0x6309}, //7640 #CJK UNIFIED IDEOGRAPH + {0xB0B5, 0x6697}, //7641 #CJK UNIFIED IDEOGRAPH + {0xB0B6, 0x5CB8}, //7642 #CJK UNIFIED IDEOGRAPH + {0xB0B7, 0x80FA}, //7643 #CJK UNIFIED IDEOGRAPH + {0xB0B8, 0x6848}, //7644 #CJK UNIFIED IDEOGRAPH + {0xB0B9, 0x80AE}, //7645 #CJK UNIFIED IDEOGRAPH + {0xB0BA, 0x6602}, //7646 #CJK UNIFIED IDEOGRAPH + {0xB0BB, 0x76CE}, //7647 #CJK UNIFIED IDEOGRAPH + {0xB0BC, 0x51F9}, //7648 #CJK UNIFIED IDEOGRAPH + {0xB0BD, 0x6556}, //7649 #CJK UNIFIED IDEOGRAPH + {0xB0BE, 0x71AC}, //7650 #CJK UNIFIED IDEOGRAPH + {0xB0BF, 0x7FF1}, //7651 #CJK UNIFIED IDEOGRAPH + {0xB0C0, 0x8884}, //7652 #CJK UNIFIED IDEOGRAPH + {0xB0C1, 0x50B2}, //7653 #CJK UNIFIED IDEOGRAPH + {0xB0C2, 0x5965}, //7654 #CJK UNIFIED IDEOGRAPH + {0xB0C3, 0x61CA}, //7655 #CJK UNIFIED IDEOGRAPH + {0xB0C4, 0x6FB3}, //7656 #CJK UNIFIED IDEOGRAPH + {0xB0C5, 0x82AD}, //7657 #CJK UNIFIED IDEOGRAPH + {0xB0C6, 0x634C}, //7658 #CJK UNIFIED IDEOGRAPH + {0xB0C7, 0x6252}, //7659 #CJK UNIFIED IDEOGRAPH + {0xB0C8, 0x53ED}, //7660 #CJK UNIFIED IDEOGRAPH + {0xB0C9, 0x5427}, //7661 #CJK UNIFIED IDEOGRAPH + {0xB0CA, 0x7B06}, //7662 #CJK UNIFIED IDEOGRAPH + {0xB0CB, 0x516B}, //7663 #CJK UNIFIED IDEOGRAPH + {0xB0CC, 0x75A4}, //7664 #CJK UNIFIED IDEOGRAPH + {0xB0CD, 0x5DF4}, //7665 #CJK UNIFIED IDEOGRAPH + {0xB0CE, 0x62D4}, //7666 #CJK UNIFIED IDEOGRAPH + {0xB0CF, 0x8DCB}, //7667 #CJK UNIFIED IDEOGRAPH + {0xB0D0, 0x9776}, //7668 #CJK UNIFIED IDEOGRAPH + {0xB0D1, 0x628A}, //7669 #CJK UNIFIED IDEOGRAPH + {0xB0D2, 0x8019}, //7670 #CJK UNIFIED IDEOGRAPH + {0xB0D3, 0x575D}, //7671 #CJK UNIFIED IDEOGRAPH + {0xB0D4, 0x9738}, //7672 #CJK UNIFIED IDEOGRAPH + {0xB0D5, 0x7F62}, //7673 #CJK UNIFIED IDEOGRAPH + {0xB0D6, 0x7238}, //7674 #CJK UNIFIED IDEOGRAPH + {0xB0D7, 0x767D}, //7675 #CJK UNIFIED IDEOGRAPH + {0xB0D8, 0x67CF}, //7676 #CJK UNIFIED IDEOGRAPH + {0xB0D9, 0x767E}, //7677 #CJK UNIFIED IDEOGRAPH + {0xB0DA, 0x6446}, //7678 #CJK UNIFIED IDEOGRAPH + {0xB0DB, 0x4F70}, //7679 #CJK UNIFIED IDEOGRAPH + {0xB0DC, 0x8D25}, //7680 #CJK UNIFIED IDEOGRAPH + {0xB0DD, 0x62DC}, //7681 #CJK UNIFIED IDEOGRAPH + {0xB0DE, 0x7A17}, //7682 #CJK UNIFIED IDEOGRAPH + {0xB0DF, 0x6591}, //7683 #CJK UNIFIED IDEOGRAPH + {0xB0E0, 0x73ED}, //7684 #CJK UNIFIED IDEOGRAPH + {0xB0E1, 0x642C}, //7685 #CJK UNIFIED IDEOGRAPH + {0xB0E2, 0x6273}, //7686 #CJK UNIFIED IDEOGRAPH + {0xB0E3, 0x822C}, //7687 #CJK UNIFIED IDEOGRAPH + {0xB0E4, 0x9881}, //7688 #CJK UNIFIED IDEOGRAPH + {0xB0E5, 0x677F}, //7689 #CJK UNIFIED IDEOGRAPH + {0xB0E6, 0x7248}, //7690 #CJK UNIFIED IDEOGRAPH + {0xB0E7, 0x626E}, //7691 #CJK UNIFIED IDEOGRAPH + {0xB0E8, 0x62CC}, //7692 #CJK UNIFIED IDEOGRAPH + {0xB0E9, 0x4F34}, //7693 #CJK UNIFIED IDEOGRAPH + {0xB0EA, 0x74E3}, //7694 #CJK UNIFIED IDEOGRAPH + {0xB0EB, 0x534A}, //7695 #CJK UNIFIED IDEOGRAPH + {0xB0EC, 0x529E}, //7696 #CJK UNIFIED IDEOGRAPH + {0xB0ED, 0x7ECA}, //7697 #CJK UNIFIED IDEOGRAPH + {0xB0EE, 0x90A6}, //7698 #CJK UNIFIED IDEOGRAPH + {0xB0EF, 0x5E2E}, //7699 #CJK UNIFIED IDEOGRAPH + {0xB0F0, 0x6886}, //7700 #CJK UNIFIED IDEOGRAPH + {0xB0F1, 0x699C}, //7701 #CJK UNIFIED IDEOGRAPH + {0xB0F2, 0x8180}, //7702 #CJK UNIFIED IDEOGRAPH + {0xB0F3, 0x7ED1}, //7703 #CJK UNIFIED IDEOGRAPH + {0xB0F4, 0x68D2}, //7704 #CJK UNIFIED IDEOGRAPH + {0xB0F5, 0x78C5}, //7705 #CJK UNIFIED IDEOGRAPH + {0xB0F6, 0x868C}, //7706 #CJK UNIFIED IDEOGRAPH + {0xB0F7, 0x9551}, //7707 #CJK UNIFIED IDEOGRAPH + {0xB0F8, 0x508D}, //7708 #CJK UNIFIED IDEOGRAPH + {0xB0F9, 0x8C24}, //7709 #CJK UNIFIED IDEOGRAPH + {0xB0FA, 0x82DE}, //7710 #CJK UNIFIED IDEOGRAPH + {0xB0FB, 0x80DE}, //7711 #CJK UNIFIED IDEOGRAPH + {0xB0FC, 0x5305}, //7712 #CJK UNIFIED IDEOGRAPH + {0xB0FD, 0x8912}, //7713 #CJK UNIFIED IDEOGRAPH + {0xB0FE, 0x5265}, //7714 #CJK UNIFIED IDEOGRAPH + {0xB140, 0x76C4}, //7715 #CJK UNIFIED IDEOGRAPH + {0xB141, 0x76C7}, //7716 #CJK UNIFIED IDEOGRAPH + {0xB142, 0x76C9}, //7717 #CJK UNIFIED IDEOGRAPH + {0xB143, 0x76CB}, //7718 #CJK UNIFIED IDEOGRAPH + {0xB144, 0x76CC}, //7719 #CJK UNIFIED IDEOGRAPH + {0xB145, 0x76D3}, //7720 #CJK UNIFIED IDEOGRAPH + {0xB146, 0x76D5}, //7721 #CJK UNIFIED IDEOGRAPH + {0xB147, 0x76D9}, //7722 #CJK UNIFIED IDEOGRAPH + {0xB148, 0x76DA}, //7723 #CJK UNIFIED IDEOGRAPH + {0xB149, 0x76DC}, //7724 #CJK UNIFIED IDEOGRAPH + {0xB14A, 0x76DD}, //7725 #CJK UNIFIED IDEOGRAPH + {0xB14B, 0x76DE}, //7726 #CJK UNIFIED IDEOGRAPH + {0xB14C, 0x76E0}, //7727 #CJK UNIFIED IDEOGRAPH + {0xB14D, 0x76E1}, //7728 #CJK UNIFIED IDEOGRAPH + {0xB14E, 0x76E2}, //7729 #CJK UNIFIED IDEOGRAPH + {0xB14F, 0x76E3}, //7730 #CJK UNIFIED IDEOGRAPH + {0xB150, 0x76E4}, //7731 #CJK UNIFIED IDEOGRAPH + {0xB151, 0x76E6}, //7732 #CJK UNIFIED IDEOGRAPH + {0xB152, 0x76E7}, //7733 #CJK UNIFIED IDEOGRAPH + {0xB153, 0x76E8}, //7734 #CJK UNIFIED IDEOGRAPH + {0xB154, 0x76E9}, //7735 #CJK UNIFIED IDEOGRAPH + {0xB155, 0x76EA}, //7736 #CJK UNIFIED IDEOGRAPH + {0xB156, 0x76EB}, //7737 #CJK UNIFIED IDEOGRAPH + {0xB157, 0x76EC}, //7738 #CJK UNIFIED IDEOGRAPH + {0xB158, 0x76ED}, //7739 #CJK UNIFIED IDEOGRAPH + {0xB159, 0x76F0}, //7740 #CJK UNIFIED IDEOGRAPH + {0xB15A, 0x76F3}, //7741 #CJK UNIFIED IDEOGRAPH + {0xB15B, 0x76F5}, //7742 #CJK UNIFIED IDEOGRAPH + {0xB15C, 0x76F6}, //7743 #CJK UNIFIED IDEOGRAPH + {0xB15D, 0x76F7}, //7744 #CJK UNIFIED IDEOGRAPH + {0xB15E, 0x76FA}, //7745 #CJK UNIFIED IDEOGRAPH + {0xB15F, 0x76FB}, //7746 #CJK UNIFIED IDEOGRAPH + {0xB160, 0x76FD}, //7747 #CJK UNIFIED IDEOGRAPH + {0xB161, 0x76FF}, //7748 #CJK UNIFIED IDEOGRAPH + {0xB162, 0x7700}, //7749 #CJK UNIFIED IDEOGRAPH + {0xB163, 0x7702}, //7750 #CJK UNIFIED IDEOGRAPH + {0xB164, 0x7703}, //7751 #CJK UNIFIED IDEOGRAPH + {0xB165, 0x7705}, //7752 #CJK UNIFIED IDEOGRAPH + {0xB166, 0x7706}, //7753 #CJK UNIFIED IDEOGRAPH + {0xB167, 0x770A}, //7754 #CJK UNIFIED IDEOGRAPH + {0xB168, 0x770C}, //7755 #CJK UNIFIED IDEOGRAPH + {0xB169, 0x770E}, //7756 #CJK UNIFIED IDEOGRAPH + {0xB16A, 0x770F}, //7757 #CJK UNIFIED IDEOGRAPH + {0xB16B, 0x7710}, //7758 #CJK UNIFIED IDEOGRAPH + {0xB16C, 0x7711}, //7759 #CJK UNIFIED IDEOGRAPH + {0xB16D, 0x7712}, //7760 #CJK UNIFIED IDEOGRAPH + {0xB16E, 0x7713}, //7761 #CJK UNIFIED IDEOGRAPH + {0xB16F, 0x7714}, //7762 #CJK UNIFIED IDEOGRAPH + {0xB170, 0x7715}, //7763 #CJK UNIFIED IDEOGRAPH + {0xB171, 0x7716}, //7764 #CJK UNIFIED IDEOGRAPH + {0xB172, 0x7717}, //7765 #CJK UNIFIED IDEOGRAPH + {0xB173, 0x7718}, //7766 #CJK UNIFIED IDEOGRAPH + {0xB174, 0x771B}, //7767 #CJK UNIFIED IDEOGRAPH + {0xB175, 0x771C}, //7768 #CJK UNIFIED IDEOGRAPH + {0xB176, 0x771D}, //7769 #CJK UNIFIED IDEOGRAPH + {0xB177, 0x771E}, //7770 #CJK UNIFIED IDEOGRAPH + {0xB178, 0x7721}, //7771 #CJK UNIFIED IDEOGRAPH + {0xB179, 0x7723}, //7772 #CJK UNIFIED IDEOGRAPH + {0xB17A, 0x7724}, //7773 #CJK UNIFIED IDEOGRAPH + {0xB17B, 0x7725}, //7774 #CJK UNIFIED IDEOGRAPH + {0xB17C, 0x7727}, //7775 #CJK UNIFIED IDEOGRAPH + {0xB17D, 0x772A}, //7776 #CJK UNIFIED IDEOGRAPH + {0xB17E, 0x772B}, //7777 #CJK UNIFIED IDEOGRAPH + {0xB180, 0x772C}, //7778 #CJK UNIFIED IDEOGRAPH + {0xB181, 0x772E}, //7779 #CJK UNIFIED IDEOGRAPH + {0xB182, 0x7730}, //7780 #CJK UNIFIED IDEOGRAPH + {0xB183, 0x7731}, //7781 #CJK UNIFIED IDEOGRAPH + {0xB184, 0x7732}, //7782 #CJK UNIFIED IDEOGRAPH + {0xB185, 0x7733}, //7783 #CJK UNIFIED IDEOGRAPH + {0xB186, 0x7734}, //7784 #CJK UNIFIED IDEOGRAPH + {0xB187, 0x7739}, //7785 #CJK UNIFIED IDEOGRAPH + {0xB188, 0x773B}, //7786 #CJK UNIFIED IDEOGRAPH + {0xB189, 0x773D}, //7787 #CJK UNIFIED IDEOGRAPH + {0xB18A, 0x773E}, //7788 #CJK UNIFIED IDEOGRAPH + {0xB18B, 0x773F}, //7789 #CJK UNIFIED IDEOGRAPH + {0xB18C, 0x7742}, //7790 #CJK UNIFIED IDEOGRAPH + {0xB18D, 0x7744}, //7791 #CJK UNIFIED IDEOGRAPH + {0xB18E, 0x7745}, //7792 #CJK UNIFIED IDEOGRAPH + {0xB18F, 0x7746}, //7793 #CJK UNIFIED IDEOGRAPH + {0xB190, 0x7748}, //7794 #CJK UNIFIED IDEOGRAPH + {0xB191, 0x7749}, //7795 #CJK UNIFIED IDEOGRAPH + {0xB192, 0x774A}, //7796 #CJK UNIFIED IDEOGRAPH + {0xB193, 0x774B}, //7797 #CJK UNIFIED IDEOGRAPH + {0xB194, 0x774C}, //7798 #CJK UNIFIED IDEOGRAPH + {0xB195, 0x774D}, //7799 #CJK UNIFIED IDEOGRAPH + {0xB196, 0x774E}, //7800 #CJK UNIFIED IDEOGRAPH + {0xB197, 0x774F}, //7801 #CJK UNIFIED IDEOGRAPH + {0xB198, 0x7752}, //7802 #CJK UNIFIED IDEOGRAPH + {0xB199, 0x7753}, //7803 #CJK UNIFIED IDEOGRAPH + {0xB19A, 0x7754}, //7804 #CJK UNIFIED IDEOGRAPH + {0xB19B, 0x7755}, //7805 #CJK UNIFIED IDEOGRAPH + {0xB19C, 0x7756}, //7806 #CJK UNIFIED IDEOGRAPH + {0xB19D, 0x7757}, //7807 #CJK UNIFIED IDEOGRAPH + {0xB19E, 0x7758}, //7808 #CJK UNIFIED IDEOGRAPH + {0xB19F, 0x7759}, //7809 #CJK UNIFIED IDEOGRAPH + {0xB1A0, 0x775C}, //7810 #CJK UNIFIED IDEOGRAPH + {0xB1A1, 0x8584}, //7811 #CJK UNIFIED IDEOGRAPH + {0xB1A2, 0x96F9}, //7812 #CJK UNIFIED IDEOGRAPH + {0xB1A3, 0x4FDD}, //7813 #CJK UNIFIED IDEOGRAPH + {0xB1A4, 0x5821}, //7814 #CJK UNIFIED IDEOGRAPH + {0xB1A5, 0x9971}, //7815 #CJK UNIFIED IDEOGRAPH + {0xB1A6, 0x5B9D}, //7816 #CJK UNIFIED IDEOGRAPH + {0xB1A7, 0x62B1}, //7817 #CJK UNIFIED IDEOGRAPH + {0xB1A8, 0x62A5}, //7818 #CJK UNIFIED IDEOGRAPH + {0xB1A9, 0x66B4}, //7819 #CJK UNIFIED IDEOGRAPH + {0xB1AA, 0x8C79}, //7820 #CJK UNIFIED IDEOGRAPH + {0xB1AB, 0x9C8D}, //7821 #CJK UNIFIED IDEOGRAPH + {0xB1AC, 0x7206}, //7822 #CJK UNIFIED IDEOGRAPH + {0xB1AD, 0x676F}, //7823 #CJK UNIFIED IDEOGRAPH + {0xB1AE, 0x7891}, //7824 #CJK UNIFIED IDEOGRAPH + {0xB1AF, 0x60B2}, //7825 #CJK UNIFIED IDEOGRAPH + {0xB1B0, 0x5351}, //7826 #CJK UNIFIED IDEOGRAPH + {0xB1B1, 0x5317}, //7827 #CJK UNIFIED IDEOGRAPH + {0xB1B2, 0x8F88}, //7828 #CJK UNIFIED IDEOGRAPH + {0xB1B3, 0x80CC}, //7829 #CJK UNIFIED IDEOGRAPH + {0xB1B4, 0x8D1D}, //7830 #CJK UNIFIED IDEOGRAPH + {0xB1B5, 0x94A1}, //7831 #CJK UNIFIED IDEOGRAPH + {0xB1B6, 0x500D}, //7832 #CJK UNIFIED IDEOGRAPH + {0xB1B7, 0x72C8}, //7833 #CJK UNIFIED IDEOGRAPH + {0xB1B8, 0x5907}, //7834 #CJK UNIFIED IDEOGRAPH + {0xB1B9, 0x60EB}, //7835 #CJK UNIFIED IDEOGRAPH + {0xB1BA, 0x7119}, //7836 #CJK UNIFIED IDEOGRAPH + {0xB1BB, 0x88AB}, //7837 #CJK UNIFIED IDEOGRAPH + {0xB1BC, 0x5954}, //7838 #CJK UNIFIED IDEOGRAPH + {0xB1BD, 0x82EF}, //7839 #CJK UNIFIED IDEOGRAPH + {0xB1BE, 0x672C}, //7840 #CJK UNIFIED IDEOGRAPH + {0xB1BF, 0x7B28}, //7841 #CJK UNIFIED IDEOGRAPH + {0xB1C0, 0x5D29}, //7842 #CJK UNIFIED IDEOGRAPH + {0xB1C1, 0x7EF7}, //7843 #CJK UNIFIED IDEOGRAPH + {0xB1C2, 0x752D}, //7844 #CJK UNIFIED IDEOGRAPH + {0xB1C3, 0x6CF5}, //7845 #CJK UNIFIED IDEOGRAPH + {0xB1C4, 0x8E66}, //7846 #CJK UNIFIED IDEOGRAPH + {0xB1C5, 0x8FF8}, //7847 #CJK UNIFIED IDEOGRAPH + {0xB1C6, 0x903C}, //7848 #CJK UNIFIED IDEOGRAPH + {0xB1C7, 0x9F3B}, //7849 #CJK UNIFIED IDEOGRAPH + {0xB1C8, 0x6BD4}, //7850 #CJK UNIFIED IDEOGRAPH + {0xB1C9, 0x9119}, //7851 #CJK UNIFIED IDEOGRAPH + {0xB1CA, 0x7B14}, //7852 #CJK UNIFIED IDEOGRAPH + {0xB1CB, 0x5F7C}, //7853 #CJK UNIFIED IDEOGRAPH + {0xB1CC, 0x78A7}, //7854 #CJK UNIFIED IDEOGRAPH + {0xB1CD, 0x84D6}, //7855 #CJK UNIFIED IDEOGRAPH + {0xB1CE, 0x853D}, //7856 #CJK UNIFIED IDEOGRAPH + {0xB1CF, 0x6BD5}, //7857 #CJK UNIFIED IDEOGRAPH + {0xB1D0, 0x6BD9}, //7858 #CJK UNIFIED IDEOGRAPH + {0xB1D1, 0x6BD6}, //7859 #CJK UNIFIED IDEOGRAPH + {0xB1D2, 0x5E01}, //7860 #CJK UNIFIED IDEOGRAPH + {0xB1D3, 0x5E87}, //7861 #CJK UNIFIED IDEOGRAPH + {0xB1D4, 0x75F9}, //7862 #CJK UNIFIED IDEOGRAPH + {0xB1D5, 0x95ED}, //7863 #CJK UNIFIED IDEOGRAPH + {0xB1D6, 0x655D}, //7864 #CJK UNIFIED IDEOGRAPH + {0xB1D7, 0x5F0A}, //7865 #CJK UNIFIED IDEOGRAPH + {0xB1D8, 0x5FC5}, //7866 #CJK UNIFIED IDEOGRAPH + {0xB1D9, 0x8F9F}, //7867 #CJK UNIFIED IDEOGRAPH + {0xB1DA, 0x58C1}, //7868 #CJK UNIFIED IDEOGRAPH + {0xB1DB, 0x81C2}, //7869 #CJK UNIFIED IDEOGRAPH + {0xB1DC, 0x907F}, //7870 #CJK UNIFIED IDEOGRAPH + {0xB1DD, 0x965B}, //7871 #CJK UNIFIED IDEOGRAPH + {0xB1DE, 0x97AD}, //7872 #CJK UNIFIED IDEOGRAPH + {0xB1DF, 0x8FB9}, //7873 #CJK UNIFIED IDEOGRAPH + {0xB1E0, 0x7F16}, //7874 #CJK UNIFIED IDEOGRAPH + {0xB1E1, 0x8D2C}, //7875 #CJK UNIFIED IDEOGRAPH + {0xB1E2, 0x6241}, //7876 #CJK UNIFIED IDEOGRAPH + {0xB1E3, 0x4FBF}, //7877 #CJK UNIFIED IDEOGRAPH + {0xB1E4, 0x53D8}, //7878 #CJK UNIFIED IDEOGRAPH + {0xB1E5, 0x535E}, //7879 #CJK UNIFIED IDEOGRAPH + {0xB1E6, 0x8FA8}, //7880 #CJK UNIFIED IDEOGRAPH + {0xB1E7, 0x8FA9}, //7881 #CJK UNIFIED IDEOGRAPH + {0xB1E8, 0x8FAB}, //7882 #CJK UNIFIED IDEOGRAPH + {0xB1E9, 0x904D}, //7883 #CJK UNIFIED IDEOGRAPH + {0xB1EA, 0x6807}, //7884 #CJK UNIFIED IDEOGRAPH + {0xB1EB, 0x5F6A}, //7885 #CJK UNIFIED IDEOGRAPH + {0xB1EC, 0x8198}, //7886 #CJK UNIFIED IDEOGRAPH + {0xB1ED, 0x8868}, //7887 #CJK UNIFIED IDEOGRAPH + {0xB1EE, 0x9CD6}, //7888 #CJK UNIFIED IDEOGRAPH + {0xB1EF, 0x618B}, //7889 #CJK UNIFIED IDEOGRAPH + {0xB1F0, 0x522B}, //7890 #CJK UNIFIED IDEOGRAPH + {0xB1F1, 0x762A}, //7891 #CJK UNIFIED IDEOGRAPH + {0xB1F2, 0x5F6C}, //7892 #CJK UNIFIED IDEOGRAPH + {0xB1F3, 0x658C}, //7893 #CJK UNIFIED IDEOGRAPH + {0xB1F4, 0x6FD2}, //7894 #CJK UNIFIED IDEOGRAPH + {0xB1F5, 0x6EE8}, //7895 #CJK UNIFIED IDEOGRAPH + {0xB1F6, 0x5BBE}, //7896 #CJK UNIFIED IDEOGRAPH + {0xB1F7, 0x6448}, //7897 #CJK UNIFIED IDEOGRAPH + {0xB1F8, 0x5175}, //7898 #CJK UNIFIED IDEOGRAPH + {0xB1F9, 0x51B0}, //7899 #CJK UNIFIED IDEOGRAPH + {0xB1FA, 0x67C4}, //7900 #CJK UNIFIED IDEOGRAPH + {0xB1FB, 0x4E19}, //7901 #CJK UNIFIED IDEOGRAPH + {0xB1FC, 0x79C9}, //7902 #CJK UNIFIED IDEOGRAPH + {0xB1FD, 0x997C}, //7903 #CJK UNIFIED IDEOGRAPH + {0xB1FE, 0x70B3}, //7904 #CJK UNIFIED IDEOGRAPH + {0xB240, 0x775D}, //7905 #CJK UNIFIED IDEOGRAPH + {0xB241, 0x775E}, //7906 #CJK UNIFIED IDEOGRAPH + {0xB242, 0x775F}, //7907 #CJK UNIFIED IDEOGRAPH + {0xB243, 0x7760}, //7908 #CJK UNIFIED IDEOGRAPH + {0xB244, 0x7764}, //7909 #CJK UNIFIED IDEOGRAPH + {0xB245, 0x7767}, //7910 #CJK UNIFIED IDEOGRAPH + {0xB246, 0x7769}, //7911 #CJK UNIFIED IDEOGRAPH + {0xB247, 0x776A}, //7912 #CJK UNIFIED IDEOGRAPH + {0xB248, 0x776D}, //7913 #CJK UNIFIED IDEOGRAPH + {0xB249, 0x776E}, //7914 #CJK UNIFIED IDEOGRAPH + {0xB24A, 0x776F}, //7915 #CJK UNIFIED IDEOGRAPH + {0xB24B, 0x7770}, //7916 #CJK UNIFIED IDEOGRAPH + {0xB24C, 0x7771}, //7917 #CJK UNIFIED IDEOGRAPH + {0xB24D, 0x7772}, //7918 #CJK UNIFIED IDEOGRAPH + {0xB24E, 0x7773}, //7919 #CJK UNIFIED IDEOGRAPH + {0xB24F, 0x7774}, //7920 #CJK UNIFIED IDEOGRAPH + {0xB250, 0x7775}, //7921 #CJK UNIFIED IDEOGRAPH + {0xB251, 0x7776}, //7922 #CJK UNIFIED IDEOGRAPH + {0xB252, 0x7777}, //7923 #CJK UNIFIED IDEOGRAPH + {0xB253, 0x7778}, //7924 #CJK UNIFIED IDEOGRAPH + {0xB254, 0x777A}, //7925 #CJK UNIFIED IDEOGRAPH + {0xB255, 0x777B}, //7926 #CJK UNIFIED IDEOGRAPH + {0xB256, 0x777C}, //7927 #CJK UNIFIED IDEOGRAPH + {0xB257, 0x7781}, //7928 #CJK UNIFIED IDEOGRAPH + {0xB258, 0x7782}, //7929 #CJK UNIFIED IDEOGRAPH + {0xB259, 0x7783}, //7930 #CJK UNIFIED IDEOGRAPH + {0xB25A, 0x7786}, //7931 #CJK UNIFIED IDEOGRAPH + {0xB25B, 0x7787}, //7932 #CJK UNIFIED IDEOGRAPH + {0xB25C, 0x7788}, //7933 #CJK UNIFIED IDEOGRAPH + {0xB25D, 0x7789}, //7934 #CJK UNIFIED IDEOGRAPH + {0xB25E, 0x778A}, //7935 #CJK UNIFIED IDEOGRAPH + {0xB25F, 0x778B}, //7936 #CJK UNIFIED IDEOGRAPH + {0xB260, 0x778F}, //7937 #CJK UNIFIED IDEOGRAPH + {0xB261, 0x7790}, //7938 #CJK UNIFIED IDEOGRAPH + {0xB262, 0x7793}, //7939 #CJK UNIFIED IDEOGRAPH + {0xB263, 0x7794}, //7940 #CJK UNIFIED IDEOGRAPH + {0xB264, 0x7795}, //7941 #CJK UNIFIED IDEOGRAPH + {0xB265, 0x7796}, //7942 #CJK UNIFIED IDEOGRAPH + {0xB266, 0x7797}, //7943 #CJK UNIFIED IDEOGRAPH + {0xB267, 0x7798}, //7944 #CJK UNIFIED IDEOGRAPH + {0xB268, 0x7799}, //7945 #CJK UNIFIED IDEOGRAPH + {0xB269, 0x779A}, //7946 #CJK UNIFIED IDEOGRAPH + {0xB26A, 0x779B}, //7947 #CJK UNIFIED IDEOGRAPH + {0xB26B, 0x779C}, //7948 #CJK UNIFIED IDEOGRAPH + {0xB26C, 0x779D}, //7949 #CJK UNIFIED IDEOGRAPH + {0xB26D, 0x779E}, //7950 #CJK UNIFIED IDEOGRAPH + {0xB26E, 0x77A1}, //7951 #CJK UNIFIED IDEOGRAPH + {0xB26F, 0x77A3}, //7952 #CJK UNIFIED IDEOGRAPH + {0xB270, 0x77A4}, //7953 #CJK UNIFIED IDEOGRAPH + {0xB271, 0x77A6}, //7954 #CJK UNIFIED IDEOGRAPH + {0xB272, 0x77A8}, //7955 #CJK UNIFIED IDEOGRAPH + {0xB273, 0x77AB}, //7956 #CJK UNIFIED IDEOGRAPH + {0xB274, 0x77AD}, //7957 #CJK UNIFIED IDEOGRAPH + {0xB275, 0x77AE}, //7958 #CJK UNIFIED IDEOGRAPH + {0xB276, 0x77AF}, //7959 #CJK UNIFIED IDEOGRAPH + {0xB277, 0x77B1}, //7960 #CJK UNIFIED IDEOGRAPH + {0xB278, 0x77B2}, //7961 #CJK UNIFIED IDEOGRAPH + {0xB279, 0x77B4}, //7962 #CJK UNIFIED IDEOGRAPH + {0xB27A, 0x77B6}, //7963 #CJK UNIFIED IDEOGRAPH + {0xB27B, 0x77B7}, //7964 #CJK UNIFIED IDEOGRAPH + {0xB27C, 0x77B8}, //7965 #CJK UNIFIED IDEOGRAPH + {0xB27D, 0x77B9}, //7966 #CJK UNIFIED IDEOGRAPH + {0xB27E, 0x77BA}, //7967 #CJK UNIFIED IDEOGRAPH + {0xB280, 0x77BC}, //7968 #CJK UNIFIED IDEOGRAPH + {0xB281, 0x77BE}, //7969 #CJK UNIFIED IDEOGRAPH + {0xB282, 0x77C0}, //7970 #CJK UNIFIED IDEOGRAPH + {0xB283, 0x77C1}, //7971 #CJK UNIFIED IDEOGRAPH + {0xB284, 0x77C2}, //7972 #CJK UNIFIED IDEOGRAPH + {0xB285, 0x77C3}, //7973 #CJK UNIFIED IDEOGRAPH + {0xB286, 0x77C4}, //7974 #CJK UNIFIED IDEOGRAPH + {0xB287, 0x77C5}, //7975 #CJK UNIFIED IDEOGRAPH + {0xB288, 0x77C6}, //7976 #CJK UNIFIED IDEOGRAPH + {0xB289, 0x77C7}, //7977 #CJK UNIFIED IDEOGRAPH + {0xB28A, 0x77C8}, //7978 #CJK UNIFIED IDEOGRAPH + {0xB28B, 0x77C9}, //7979 #CJK UNIFIED IDEOGRAPH + {0xB28C, 0x77CA}, //7980 #CJK UNIFIED IDEOGRAPH + {0xB28D, 0x77CB}, //7981 #CJK UNIFIED IDEOGRAPH + {0xB28E, 0x77CC}, //7982 #CJK UNIFIED IDEOGRAPH + {0xB28F, 0x77CE}, //7983 #CJK UNIFIED IDEOGRAPH + {0xB290, 0x77CF}, //7984 #CJK UNIFIED IDEOGRAPH + {0xB291, 0x77D0}, //7985 #CJK UNIFIED IDEOGRAPH + {0xB292, 0x77D1}, //7986 #CJK UNIFIED IDEOGRAPH + {0xB293, 0x77D2}, //7987 #CJK UNIFIED IDEOGRAPH + {0xB294, 0x77D3}, //7988 #CJK UNIFIED IDEOGRAPH + {0xB295, 0x77D4}, //7989 #CJK UNIFIED IDEOGRAPH + {0xB296, 0x77D5}, //7990 #CJK UNIFIED IDEOGRAPH + {0xB297, 0x77D6}, //7991 #CJK UNIFIED IDEOGRAPH + {0xB298, 0x77D8}, //7992 #CJK UNIFIED IDEOGRAPH + {0xB299, 0x77D9}, //7993 #CJK UNIFIED IDEOGRAPH + {0xB29A, 0x77DA}, //7994 #CJK UNIFIED IDEOGRAPH + {0xB29B, 0x77DD}, //7995 #CJK UNIFIED IDEOGRAPH + {0xB29C, 0x77DE}, //7996 #CJK UNIFIED IDEOGRAPH + {0xB29D, 0x77DF}, //7997 #CJK UNIFIED IDEOGRAPH + {0xB29E, 0x77E0}, //7998 #CJK UNIFIED IDEOGRAPH + {0xB29F, 0x77E1}, //7999 #CJK UNIFIED IDEOGRAPH + {0xB2A0, 0x77E4}, //8000 #CJK UNIFIED IDEOGRAPH + {0xB2A1, 0x75C5}, //8001 #CJK UNIFIED IDEOGRAPH + {0xB2A2, 0x5E76}, //8002 #CJK UNIFIED IDEOGRAPH + {0xB2A3, 0x73BB}, //8003 #CJK UNIFIED IDEOGRAPH + {0xB2A4, 0x83E0}, //8004 #CJK UNIFIED IDEOGRAPH + {0xB2A5, 0x64AD}, //8005 #CJK UNIFIED IDEOGRAPH + {0xB2A6, 0x62E8}, //8006 #CJK UNIFIED IDEOGRAPH + {0xB2A7, 0x94B5}, //8007 #CJK UNIFIED IDEOGRAPH + {0xB2A8, 0x6CE2}, //8008 #CJK UNIFIED IDEOGRAPH + {0xB2A9, 0x535A}, //8009 #CJK UNIFIED IDEOGRAPH + {0xB2AA, 0x52C3}, //8010 #CJK UNIFIED IDEOGRAPH + {0xB2AB, 0x640F}, //8011 #CJK UNIFIED IDEOGRAPH + {0xB2AC, 0x94C2}, //8012 #CJK UNIFIED IDEOGRAPH + {0xB2AD, 0x7B94}, //8013 #CJK UNIFIED IDEOGRAPH + {0xB2AE, 0x4F2F}, //8014 #CJK UNIFIED IDEOGRAPH + {0xB2AF, 0x5E1B}, //8015 #CJK UNIFIED IDEOGRAPH + {0xB2B0, 0x8236}, //8016 #CJK UNIFIED IDEOGRAPH + {0xB2B1, 0x8116}, //8017 #CJK UNIFIED IDEOGRAPH + {0xB2B2, 0x818A}, //8018 #CJK UNIFIED IDEOGRAPH + {0xB2B3, 0x6E24}, //8019 #CJK UNIFIED IDEOGRAPH + {0xB2B4, 0x6CCA}, //8020 #CJK UNIFIED IDEOGRAPH + {0xB2B5, 0x9A73}, //8021 #CJK UNIFIED IDEOGRAPH + {0xB2B6, 0x6355}, //8022 #CJK UNIFIED IDEOGRAPH + {0xB2B7, 0x535C}, //8023 #CJK UNIFIED IDEOGRAPH + {0xB2B8, 0x54FA}, //8024 #CJK UNIFIED IDEOGRAPH + {0xB2B9, 0x8865}, //8025 #CJK UNIFIED IDEOGRAPH + {0xB2BA, 0x57E0}, //8026 #CJK UNIFIED IDEOGRAPH + {0xB2BB, 0x4E0D}, //8027 #CJK UNIFIED IDEOGRAPH + {0xB2BC, 0x5E03}, //8028 #CJK UNIFIED IDEOGRAPH + {0xB2BD, 0x6B65}, //8029 #CJK UNIFIED IDEOGRAPH + {0xB2BE, 0x7C3F}, //8030 #CJK UNIFIED IDEOGRAPH + {0xB2BF, 0x90E8}, //8031 #CJK UNIFIED IDEOGRAPH + {0xB2C0, 0x6016}, //8032 #CJK UNIFIED IDEOGRAPH + {0xB2C1, 0x64E6}, //8033 #CJK UNIFIED IDEOGRAPH + {0xB2C2, 0x731C}, //8034 #CJK UNIFIED IDEOGRAPH + {0xB2C3, 0x88C1}, //8035 #CJK UNIFIED IDEOGRAPH + {0xB2C4, 0x6750}, //8036 #CJK UNIFIED IDEOGRAPH + {0xB2C5, 0x624D}, //8037 #CJK UNIFIED IDEOGRAPH + {0xB2C6, 0x8D22}, //8038 #CJK UNIFIED IDEOGRAPH + {0xB2C7, 0x776C}, //8039 #CJK UNIFIED IDEOGRAPH + {0xB2C8, 0x8E29}, //8040 #CJK UNIFIED IDEOGRAPH + {0xB2C9, 0x91C7}, //8041 #CJK UNIFIED IDEOGRAPH + {0xB2CA, 0x5F69}, //8042 #CJK UNIFIED IDEOGRAPH + {0xB2CB, 0x83DC}, //8043 #CJK UNIFIED IDEOGRAPH + {0xB2CC, 0x8521}, //8044 #CJK UNIFIED IDEOGRAPH + {0xB2CD, 0x9910}, //8045 #CJK UNIFIED IDEOGRAPH + {0xB2CE, 0x53C2}, //8046 #CJK UNIFIED IDEOGRAPH + {0xB2CF, 0x8695}, //8047 #CJK UNIFIED IDEOGRAPH + {0xB2D0, 0x6B8B}, //8048 #CJK UNIFIED IDEOGRAPH + {0xB2D1, 0x60ED}, //8049 #CJK UNIFIED IDEOGRAPH + {0xB2D2, 0x60E8}, //8050 #CJK UNIFIED IDEOGRAPH + {0xB2D3, 0x707F}, //8051 #CJK UNIFIED IDEOGRAPH + {0xB2D4, 0x82CD}, //8052 #CJK UNIFIED IDEOGRAPH + {0xB2D5, 0x8231}, //8053 #CJK UNIFIED IDEOGRAPH + {0xB2D6, 0x4ED3}, //8054 #CJK UNIFIED IDEOGRAPH + {0xB2D7, 0x6CA7}, //8055 #CJK UNIFIED IDEOGRAPH + {0xB2D8, 0x85CF}, //8056 #CJK UNIFIED IDEOGRAPH + {0xB2D9, 0x64CD}, //8057 #CJK UNIFIED IDEOGRAPH + {0xB2DA, 0x7CD9}, //8058 #CJK UNIFIED IDEOGRAPH + {0xB2DB, 0x69FD}, //8059 #CJK UNIFIED IDEOGRAPH + {0xB2DC, 0x66F9}, //8060 #CJK UNIFIED IDEOGRAPH + {0xB2DD, 0x8349}, //8061 #CJK UNIFIED IDEOGRAPH + {0xB2DE, 0x5395}, //8062 #CJK UNIFIED IDEOGRAPH + {0xB2DF, 0x7B56}, //8063 #CJK UNIFIED IDEOGRAPH + {0xB2E0, 0x4FA7}, //8064 #CJK UNIFIED IDEOGRAPH + {0xB2E1, 0x518C}, //8065 #CJK UNIFIED IDEOGRAPH + {0xB2E2, 0x6D4B}, //8066 #CJK UNIFIED IDEOGRAPH + {0xB2E3, 0x5C42}, //8067 #CJK UNIFIED IDEOGRAPH + {0xB2E4, 0x8E6D}, //8068 #CJK UNIFIED IDEOGRAPH + {0xB2E5, 0x63D2}, //8069 #CJK UNIFIED IDEOGRAPH + {0xB2E6, 0x53C9}, //8070 #CJK UNIFIED IDEOGRAPH + {0xB2E7, 0x832C}, //8071 #CJK UNIFIED IDEOGRAPH + {0xB2E8, 0x8336}, //8072 #CJK UNIFIED IDEOGRAPH + {0xB2E9, 0x67E5}, //8073 #CJK UNIFIED IDEOGRAPH + {0xB2EA, 0x78B4}, //8074 #CJK UNIFIED IDEOGRAPH + {0xB2EB, 0x643D}, //8075 #CJK UNIFIED IDEOGRAPH + {0xB2EC, 0x5BDF}, //8076 #CJK UNIFIED IDEOGRAPH + {0xB2ED, 0x5C94}, //8077 #CJK UNIFIED IDEOGRAPH + {0xB2EE, 0x5DEE}, //8078 #CJK UNIFIED IDEOGRAPH + {0xB2EF, 0x8BE7}, //8079 #CJK UNIFIED IDEOGRAPH + {0xB2F0, 0x62C6}, //8080 #CJK UNIFIED IDEOGRAPH + {0xB2F1, 0x67F4}, //8081 #CJK UNIFIED IDEOGRAPH + {0xB2F2, 0x8C7A}, //8082 #CJK UNIFIED IDEOGRAPH + {0xB2F3, 0x6400}, //8083 #CJK UNIFIED IDEOGRAPH + {0xB2F4, 0x63BA}, //8084 #CJK UNIFIED IDEOGRAPH + {0xB2F5, 0x8749}, //8085 #CJK UNIFIED IDEOGRAPH + {0xB2F6, 0x998B}, //8086 #CJK UNIFIED IDEOGRAPH + {0xB2F7, 0x8C17}, //8087 #CJK UNIFIED IDEOGRAPH + {0xB2F8, 0x7F20}, //8088 #CJK UNIFIED IDEOGRAPH + {0xB2F9, 0x94F2}, //8089 #CJK UNIFIED IDEOGRAPH + {0xB2FA, 0x4EA7}, //8090 #CJK UNIFIED IDEOGRAPH + {0xB2FB, 0x9610}, //8091 #CJK UNIFIED IDEOGRAPH + {0xB2FC, 0x98A4}, //8092 #CJK UNIFIED IDEOGRAPH + {0xB2FD, 0x660C}, //8093 #CJK UNIFIED IDEOGRAPH + {0xB2FE, 0x7316}, //8094 #CJK UNIFIED IDEOGRAPH + {0xB340, 0x77E6}, //8095 #CJK UNIFIED IDEOGRAPH + {0xB341, 0x77E8}, //8096 #CJK UNIFIED IDEOGRAPH + {0xB342, 0x77EA}, //8097 #CJK UNIFIED IDEOGRAPH + {0xB343, 0x77EF}, //8098 #CJK UNIFIED IDEOGRAPH + {0xB344, 0x77F0}, //8099 #CJK UNIFIED IDEOGRAPH + {0xB345, 0x77F1}, //8100 #CJK UNIFIED IDEOGRAPH + {0xB346, 0x77F2}, //8101 #CJK UNIFIED IDEOGRAPH + {0xB347, 0x77F4}, //8102 #CJK UNIFIED IDEOGRAPH + {0xB348, 0x77F5}, //8103 #CJK UNIFIED IDEOGRAPH + {0xB349, 0x77F7}, //8104 #CJK UNIFIED IDEOGRAPH + {0xB34A, 0x77F9}, //8105 #CJK UNIFIED IDEOGRAPH + {0xB34B, 0x77FA}, //8106 #CJK UNIFIED IDEOGRAPH + {0xB34C, 0x77FB}, //8107 #CJK UNIFIED IDEOGRAPH + {0xB34D, 0x77FC}, //8108 #CJK UNIFIED IDEOGRAPH + {0xB34E, 0x7803}, //8109 #CJK UNIFIED IDEOGRAPH + {0xB34F, 0x7804}, //8110 #CJK UNIFIED IDEOGRAPH + {0xB350, 0x7805}, //8111 #CJK UNIFIED IDEOGRAPH + {0xB351, 0x7806}, //8112 #CJK UNIFIED IDEOGRAPH + {0xB352, 0x7807}, //8113 #CJK UNIFIED IDEOGRAPH + {0xB353, 0x7808}, //8114 #CJK UNIFIED IDEOGRAPH + {0xB354, 0x780A}, //8115 #CJK UNIFIED IDEOGRAPH + {0xB355, 0x780B}, //8116 #CJK UNIFIED IDEOGRAPH + {0xB356, 0x780E}, //8117 #CJK UNIFIED IDEOGRAPH + {0xB357, 0x780F}, //8118 #CJK UNIFIED IDEOGRAPH + {0xB358, 0x7810}, //8119 #CJK UNIFIED IDEOGRAPH + {0xB359, 0x7813}, //8120 #CJK UNIFIED IDEOGRAPH + {0xB35A, 0x7815}, //8121 #CJK UNIFIED IDEOGRAPH + {0xB35B, 0x7819}, //8122 #CJK UNIFIED IDEOGRAPH + {0xB35C, 0x781B}, //8123 #CJK UNIFIED IDEOGRAPH + {0xB35D, 0x781E}, //8124 #CJK UNIFIED IDEOGRAPH + {0xB35E, 0x7820}, //8125 #CJK UNIFIED IDEOGRAPH + {0xB35F, 0x7821}, //8126 #CJK UNIFIED IDEOGRAPH + {0xB360, 0x7822}, //8127 #CJK UNIFIED IDEOGRAPH + {0xB361, 0x7824}, //8128 #CJK UNIFIED IDEOGRAPH + {0xB362, 0x7828}, //8129 #CJK UNIFIED IDEOGRAPH + {0xB363, 0x782A}, //8130 #CJK UNIFIED IDEOGRAPH + {0xB364, 0x782B}, //8131 #CJK UNIFIED IDEOGRAPH + {0xB365, 0x782E}, //8132 #CJK UNIFIED IDEOGRAPH + {0xB366, 0x782F}, //8133 #CJK UNIFIED IDEOGRAPH + {0xB367, 0x7831}, //8134 #CJK UNIFIED IDEOGRAPH + {0xB368, 0x7832}, //8135 #CJK UNIFIED IDEOGRAPH + {0xB369, 0x7833}, //8136 #CJK UNIFIED IDEOGRAPH + {0xB36A, 0x7835}, //8137 #CJK UNIFIED IDEOGRAPH + {0xB36B, 0x7836}, //8138 #CJK UNIFIED IDEOGRAPH + {0xB36C, 0x783D}, //8139 #CJK UNIFIED IDEOGRAPH + {0xB36D, 0x783F}, //8140 #CJK UNIFIED IDEOGRAPH + {0xB36E, 0x7841}, //8141 #CJK UNIFIED IDEOGRAPH + {0xB36F, 0x7842}, //8142 #CJK UNIFIED IDEOGRAPH + {0xB370, 0x7843}, //8143 #CJK UNIFIED IDEOGRAPH + {0xB371, 0x7844}, //8144 #CJK UNIFIED IDEOGRAPH + {0xB372, 0x7846}, //8145 #CJK UNIFIED IDEOGRAPH + {0xB373, 0x7848}, //8146 #CJK UNIFIED IDEOGRAPH + {0xB374, 0x7849}, //8147 #CJK UNIFIED IDEOGRAPH + {0xB375, 0x784A}, //8148 #CJK UNIFIED IDEOGRAPH + {0xB376, 0x784B}, //8149 #CJK UNIFIED IDEOGRAPH + {0xB377, 0x784D}, //8150 #CJK UNIFIED IDEOGRAPH + {0xB378, 0x784F}, //8151 #CJK UNIFIED IDEOGRAPH + {0xB379, 0x7851}, //8152 #CJK UNIFIED IDEOGRAPH + {0xB37A, 0x7853}, //8153 #CJK UNIFIED IDEOGRAPH + {0xB37B, 0x7854}, //8154 #CJK UNIFIED IDEOGRAPH + {0xB37C, 0x7858}, //8155 #CJK UNIFIED IDEOGRAPH + {0xB37D, 0x7859}, //8156 #CJK UNIFIED IDEOGRAPH + {0xB37E, 0x785A}, //8157 #CJK UNIFIED IDEOGRAPH + {0xB380, 0x785B}, //8158 #CJK UNIFIED IDEOGRAPH + {0xB381, 0x785C}, //8159 #CJK UNIFIED IDEOGRAPH + {0xB382, 0x785E}, //8160 #CJK UNIFIED IDEOGRAPH + {0xB383, 0x785F}, //8161 #CJK UNIFIED IDEOGRAPH + {0xB384, 0x7860}, //8162 #CJK UNIFIED IDEOGRAPH + {0xB385, 0x7861}, //8163 #CJK UNIFIED IDEOGRAPH + {0xB386, 0x7862}, //8164 #CJK UNIFIED IDEOGRAPH + {0xB387, 0x7863}, //8165 #CJK UNIFIED IDEOGRAPH + {0xB388, 0x7864}, //8166 #CJK UNIFIED IDEOGRAPH + {0xB389, 0x7865}, //8167 #CJK UNIFIED IDEOGRAPH + {0xB38A, 0x7866}, //8168 #CJK UNIFIED IDEOGRAPH + {0xB38B, 0x7867}, //8169 #CJK UNIFIED IDEOGRAPH + {0xB38C, 0x7868}, //8170 #CJK UNIFIED IDEOGRAPH + {0xB38D, 0x7869}, //8171 #CJK UNIFIED IDEOGRAPH + {0xB38E, 0x786F}, //8172 #CJK UNIFIED IDEOGRAPH + {0xB38F, 0x7870}, //8173 #CJK UNIFIED IDEOGRAPH + {0xB390, 0x7871}, //8174 #CJK UNIFIED IDEOGRAPH + {0xB391, 0x7872}, //8175 #CJK UNIFIED IDEOGRAPH + {0xB392, 0x7873}, //8176 #CJK UNIFIED IDEOGRAPH + {0xB393, 0x7874}, //8177 #CJK UNIFIED IDEOGRAPH + {0xB394, 0x7875}, //8178 #CJK UNIFIED IDEOGRAPH + {0xB395, 0x7876}, //8179 #CJK UNIFIED IDEOGRAPH + {0xB396, 0x7878}, //8180 #CJK UNIFIED IDEOGRAPH + {0xB397, 0x7879}, //8181 #CJK UNIFIED IDEOGRAPH + {0xB398, 0x787A}, //8182 #CJK UNIFIED IDEOGRAPH + {0xB399, 0x787B}, //8183 #CJK UNIFIED IDEOGRAPH + {0xB39A, 0x787D}, //8184 #CJK UNIFIED IDEOGRAPH + {0xB39B, 0x787E}, //8185 #CJK UNIFIED IDEOGRAPH + {0xB39C, 0x787F}, //8186 #CJK UNIFIED IDEOGRAPH + {0xB39D, 0x7880}, //8187 #CJK UNIFIED IDEOGRAPH + {0xB39E, 0x7881}, //8188 #CJK UNIFIED IDEOGRAPH + {0xB39F, 0x7882}, //8189 #CJK UNIFIED IDEOGRAPH + {0xB3A0, 0x7883}, //8190 #CJK UNIFIED IDEOGRAPH + {0xB3A1, 0x573A}, //8191 #CJK UNIFIED IDEOGRAPH + {0xB3A2, 0x5C1D}, //8192 #CJK UNIFIED IDEOGRAPH + {0xB3A3, 0x5E38}, //8193 #CJK UNIFIED IDEOGRAPH + {0xB3A4, 0x957F}, //8194 #CJK UNIFIED IDEOGRAPH + {0xB3A5, 0x507F}, //8195 #CJK UNIFIED IDEOGRAPH + {0xB3A6, 0x80A0}, //8196 #CJK UNIFIED IDEOGRAPH + {0xB3A7, 0x5382}, //8197 #CJK UNIFIED IDEOGRAPH + {0xB3A8, 0x655E}, //8198 #CJK UNIFIED IDEOGRAPH + {0xB3A9, 0x7545}, //8199 #CJK UNIFIED IDEOGRAPH + {0xB3AA, 0x5531}, //8200 #CJK UNIFIED IDEOGRAPH + {0xB3AB, 0x5021}, //8201 #CJK UNIFIED IDEOGRAPH + {0xB3AC, 0x8D85}, //8202 #CJK UNIFIED IDEOGRAPH + {0xB3AD, 0x6284}, //8203 #CJK UNIFIED IDEOGRAPH + {0xB3AE, 0x949E}, //8204 #CJK UNIFIED IDEOGRAPH + {0xB3AF, 0x671D}, //8205 #CJK UNIFIED IDEOGRAPH + {0xB3B0, 0x5632}, //8206 #CJK UNIFIED IDEOGRAPH + {0xB3B1, 0x6F6E}, //8207 #CJK UNIFIED IDEOGRAPH + {0xB3B2, 0x5DE2}, //8208 #CJK UNIFIED IDEOGRAPH + {0xB3B3, 0x5435}, //8209 #CJK UNIFIED IDEOGRAPH + {0xB3B4, 0x7092}, //8210 #CJK UNIFIED IDEOGRAPH + {0xB3B5, 0x8F66}, //8211 #CJK UNIFIED IDEOGRAPH + {0xB3B6, 0x626F}, //8212 #CJK UNIFIED IDEOGRAPH + {0xB3B7, 0x64A4}, //8213 #CJK UNIFIED IDEOGRAPH + {0xB3B8, 0x63A3}, //8214 #CJK UNIFIED IDEOGRAPH + {0xB3B9, 0x5F7B}, //8215 #CJK UNIFIED IDEOGRAPH + {0xB3BA, 0x6F88}, //8216 #CJK UNIFIED IDEOGRAPH + {0xB3BB, 0x90F4}, //8217 #CJK UNIFIED IDEOGRAPH + {0xB3BC, 0x81E3}, //8218 #CJK UNIFIED IDEOGRAPH + {0xB3BD, 0x8FB0}, //8219 #CJK UNIFIED IDEOGRAPH + {0xB3BE, 0x5C18}, //8220 #CJK UNIFIED IDEOGRAPH + {0xB3BF, 0x6668}, //8221 #CJK UNIFIED IDEOGRAPH + {0xB3C0, 0x5FF1}, //8222 #CJK UNIFIED IDEOGRAPH + {0xB3C1, 0x6C89}, //8223 #CJK UNIFIED IDEOGRAPH + {0xB3C2, 0x9648}, //8224 #CJK UNIFIED IDEOGRAPH + {0xB3C3, 0x8D81}, //8225 #CJK UNIFIED IDEOGRAPH + {0xB3C4, 0x886C}, //8226 #CJK UNIFIED IDEOGRAPH + {0xB3C5, 0x6491}, //8227 #CJK UNIFIED IDEOGRAPH + {0xB3C6, 0x79F0}, //8228 #CJK UNIFIED IDEOGRAPH + {0xB3C7, 0x57CE}, //8229 #CJK UNIFIED IDEOGRAPH + {0xB3C8, 0x6A59}, //8230 #CJK UNIFIED IDEOGRAPH + {0xB3C9, 0x6210}, //8231 #CJK UNIFIED IDEOGRAPH + {0xB3CA, 0x5448}, //8232 #CJK UNIFIED IDEOGRAPH + {0xB3CB, 0x4E58}, //8233 #CJK UNIFIED IDEOGRAPH + {0xB3CC, 0x7A0B}, //8234 #CJK UNIFIED IDEOGRAPH + {0xB3CD, 0x60E9}, //8235 #CJK UNIFIED IDEOGRAPH + {0xB3CE, 0x6F84}, //8236 #CJK UNIFIED IDEOGRAPH + {0xB3CF, 0x8BDA}, //8237 #CJK UNIFIED IDEOGRAPH + {0xB3D0, 0x627F}, //8238 #CJK UNIFIED IDEOGRAPH + {0xB3D1, 0x901E}, //8239 #CJK UNIFIED IDEOGRAPH + {0xB3D2, 0x9A8B}, //8240 #CJK UNIFIED IDEOGRAPH + {0xB3D3, 0x79E4}, //8241 #CJK UNIFIED IDEOGRAPH + {0xB3D4, 0x5403}, //8242 #CJK UNIFIED IDEOGRAPH + {0xB3D5, 0x75F4}, //8243 #CJK UNIFIED IDEOGRAPH + {0xB3D6, 0x6301}, //8244 #CJK UNIFIED IDEOGRAPH + {0xB3D7, 0x5319}, //8245 #CJK UNIFIED IDEOGRAPH + {0xB3D8, 0x6C60}, //8246 #CJK UNIFIED IDEOGRAPH + {0xB3D9, 0x8FDF}, //8247 #CJK UNIFIED IDEOGRAPH + {0xB3DA, 0x5F1B}, //8248 #CJK UNIFIED IDEOGRAPH + {0xB3DB, 0x9A70}, //8249 #CJK UNIFIED IDEOGRAPH + {0xB3DC, 0x803B}, //8250 #CJK UNIFIED IDEOGRAPH + {0xB3DD, 0x9F7F}, //8251 #CJK UNIFIED IDEOGRAPH + {0xB3DE, 0x4F88}, //8252 #CJK UNIFIED IDEOGRAPH + {0xB3DF, 0x5C3A}, //8253 #CJK UNIFIED IDEOGRAPH + {0xB3E0, 0x8D64}, //8254 #CJK UNIFIED IDEOGRAPH + {0xB3E1, 0x7FC5}, //8255 #CJK UNIFIED IDEOGRAPH + {0xB3E2, 0x65A5}, //8256 #CJK UNIFIED IDEOGRAPH + {0xB3E3, 0x70BD}, //8257 #CJK UNIFIED IDEOGRAPH + {0xB3E4, 0x5145}, //8258 #CJK UNIFIED IDEOGRAPH + {0xB3E5, 0x51B2}, //8259 #CJK UNIFIED IDEOGRAPH + {0xB3E6, 0x866B}, //8260 #CJK UNIFIED IDEOGRAPH + {0xB3E7, 0x5D07}, //8261 #CJK UNIFIED IDEOGRAPH + {0xB3E8, 0x5BA0}, //8262 #CJK UNIFIED IDEOGRAPH + {0xB3E9, 0x62BD}, //8263 #CJK UNIFIED IDEOGRAPH + {0xB3EA, 0x916C}, //8264 #CJK UNIFIED IDEOGRAPH + {0xB3EB, 0x7574}, //8265 #CJK UNIFIED IDEOGRAPH + {0xB3EC, 0x8E0C}, //8266 #CJK UNIFIED IDEOGRAPH + {0xB3ED, 0x7A20}, //8267 #CJK UNIFIED IDEOGRAPH + {0xB3EE, 0x6101}, //8268 #CJK UNIFIED IDEOGRAPH + {0xB3EF, 0x7B79}, //8269 #CJK UNIFIED IDEOGRAPH + {0xB3F0, 0x4EC7}, //8270 #CJK UNIFIED IDEOGRAPH + {0xB3F1, 0x7EF8}, //8271 #CJK UNIFIED IDEOGRAPH + {0xB3F2, 0x7785}, //8272 #CJK UNIFIED IDEOGRAPH + {0xB3F3, 0x4E11}, //8273 #CJK UNIFIED IDEOGRAPH + {0xB3F4, 0x81ED}, //8274 #CJK UNIFIED IDEOGRAPH + {0xB3F5, 0x521D}, //8275 #CJK UNIFIED IDEOGRAPH + {0xB3F6, 0x51FA}, //8276 #CJK UNIFIED IDEOGRAPH + {0xB3F7, 0x6A71}, //8277 #CJK UNIFIED IDEOGRAPH + {0xB3F8, 0x53A8}, //8278 #CJK UNIFIED IDEOGRAPH + {0xB3F9, 0x8E87}, //8279 #CJK UNIFIED IDEOGRAPH + {0xB3FA, 0x9504}, //8280 #CJK UNIFIED IDEOGRAPH + {0xB3FB, 0x96CF}, //8281 #CJK UNIFIED IDEOGRAPH + {0xB3FC, 0x6EC1}, //8282 #CJK UNIFIED IDEOGRAPH + {0xB3FD, 0x9664}, //8283 #CJK UNIFIED IDEOGRAPH + {0xB3FE, 0x695A}, //8284 #CJK UNIFIED IDEOGRAPH + {0xB440, 0x7884}, //8285 #CJK UNIFIED IDEOGRAPH + {0xB441, 0x7885}, //8286 #CJK UNIFIED IDEOGRAPH + {0xB442, 0x7886}, //8287 #CJK UNIFIED IDEOGRAPH + {0xB443, 0x7888}, //8288 #CJK UNIFIED IDEOGRAPH + {0xB444, 0x788A}, //8289 #CJK UNIFIED IDEOGRAPH + {0xB445, 0x788B}, //8290 #CJK UNIFIED IDEOGRAPH + {0xB446, 0x788F}, //8291 #CJK UNIFIED IDEOGRAPH + {0xB447, 0x7890}, //8292 #CJK UNIFIED IDEOGRAPH + {0xB448, 0x7892}, //8293 #CJK UNIFIED IDEOGRAPH + {0xB449, 0x7894}, //8294 #CJK UNIFIED IDEOGRAPH + {0xB44A, 0x7895}, //8295 #CJK UNIFIED IDEOGRAPH + {0xB44B, 0x7896}, //8296 #CJK UNIFIED IDEOGRAPH + {0xB44C, 0x7899}, //8297 #CJK UNIFIED IDEOGRAPH + {0xB44D, 0x789D}, //8298 #CJK UNIFIED IDEOGRAPH + {0xB44E, 0x789E}, //8299 #CJK UNIFIED IDEOGRAPH + {0xB44F, 0x78A0}, //8300 #CJK UNIFIED IDEOGRAPH + {0xB450, 0x78A2}, //8301 #CJK UNIFIED IDEOGRAPH + {0xB451, 0x78A4}, //8302 #CJK UNIFIED IDEOGRAPH + {0xB452, 0x78A6}, //8303 #CJK UNIFIED IDEOGRAPH + {0xB453, 0x78A8}, //8304 #CJK UNIFIED IDEOGRAPH + {0xB454, 0x78A9}, //8305 #CJK UNIFIED IDEOGRAPH + {0xB455, 0x78AA}, //8306 #CJK UNIFIED IDEOGRAPH + {0xB456, 0x78AB}, //8307 #CJK UNIFIED IDEOGRAPH + {0xB457, 0x78AC}, //8308 #CJK UNIFIED IDEOGRAPH + {0xB458, 0x78AD}, //8309 #CJK UNIFIED IDEOGRAPH + {0xB459, 0x78AE}, //8310 #CJK UNIFIED IDEOGRAPH + {0xB45A, 0x78AF}, //8311 #CJK UNIFIED IDEOGRAPH + {0xB45B, 0x78B5}, //8312 #CJK UNIFIED IDEOGRAPH + {0xB45C, 0x78B6}, //8313 #CJK UNIFIED IDEOGRAPH + {0xB45D, 0x78B7}, //8314 #CJK UNIFIED IDEOGRAPH + {0xB45E, 0x78B8}, //8315 #CJK UNIFIED IDEOGRAPH + {0xB45F, 0x78BA}, //8316 #CJK UNIFIED IDEOGRAPH + {0xB460, 0x78BB}, //8317 #CJK UNIFIED IDEOGRAPH + {0xB461, 0x78BC}, //8318 #CJK UNIFIED IDEOGRAPH + {0xB462, 0x78BD}, //8319 #CJK UNIFIED IDEOGRAPH + {0xB463, 0x78BF}, //8320 #CJK UNIFIED IDEOGRAPH + {0xB464, 0x78C0}, //8321 #CJK UNIFIED IDEOGRAPH + {0xB465, 0x78C2}, //8322 #CJK UNIFIED IDEOGRAPH + {0xB466, 0x78C3}, //8323 #CJK UNIFIED IDEOGRAPH + {0xB467, 0x78C4}, //8324 #CJK UNIFIED IDEOGRAPH + {0xB468, 0x78C6}, //8325 #CJK UNIFIED IDEOGRAPH + {0xB469, 0x78C7}, //8326 #CJK UNIFIED IDEOGRAPH + {0xB46A, 0x78C8}, //8327 #CJK UNIFIED IDEOGRAPH + {0xB46B, 0x78CC}, //8328 #CJK UNIFIED IDEOGRAPH + {0xB46C, 0x78CD}, //8329 #CJK UNIFIED IDEOGRAPH + {0xB46D, 0x78CE}, //8330 #CJK UNIFIED IDEOGRAPH + {0xB46E, 0x78CF}, //8331 #CJK UNIFIED IDEOGRAPH + {0xB46F, 0x78D1}, //8332 #CJK UNIFIED IDEOGRAPH + {0xB470, 0x78D2}, //8333 #CJK UNIFIED IDEOGRAPH + {0xB471, 0x78D3}, //8334 #CJK UNIFIED IDEOGRAPH + {0xB472, 0x78D6}, //8335 #CJK UNIFIED IDEOGRAPH + {0xB473, 0x78D7}, //8336 #CJK UNIFIED IDEOGRAPH + {0xB474, 0x78D8}, //8337 #CJK UNIFIED IDEOGRAPH + {0xB475, 0x78DA}, //8338 #CJK UNIFIED IDEOGRAPH + {0xB476, 0x78DB}, //8339 #CJK UNIFIED IDEOGRAPH + {0xB477, 0x78DC}, //8340 #CJK UNIFIED IDEOGRAPH + {0xB478, 0x78DD}, //8341 #CJK UNIFIED IDEOGRAPH + {0xB479, 0x78DE}, //8342 #CJK UNIFIED IDEOGRAPH + {0xB47A, 0x78DF}, //8343 #CJK UNIFIED IDEOGRAPH + {0xB47B, 0x78E0}, //8344 #CJK UNIFIED IDEOGRAPH + {0xB47C, 0x78E1}, //8345 #CJK UNIFIED IDEOGRAPH + {0xB47D, 0x78E2}, //8346 #CJK UNIFIED IDEOGRAPH + {0xB47E, 0x78E3}, //8347 #CJK UNIFIED IDEOGRAPH + {0xB480, 0x78E4}, //8348 #CJK UNIFIED IDEOGRAPH + {0xB481, 0x78E5}, //8349 #CJK UNIFIED IDEOGRAPH + {0xB482, 0x78E6}, //8350 #CJK UNIFIED IDEOGRAPH + {0xB483, 0x78E7}, //8351 #CJK UNIFIED IDEOGRAPH + {0xB484, 0x78E9}, //8352 #CJK UNIFIED IDEOGRAPH + {0xB485, 0x78EA}, //8353 #CJK UNIFIED IDEOGRAPH + {0xB486, 0x78EB}, //8354 #CJK UNIFIED IDEOGRAPH + {0xB487, 0x78ED}, //8355 #CJK UNIFIED IDEOGRAPH + {0xB488, 0x78EE}, //8356 #CJK UNIFIED IDEOGRAPH + {0xB489, 0x78EF}, //8357 #CJK UNIFIED IDEOGRAPH + {0xB48A, 0x78F0}, //8358 #CJK UNIFIED IDEOGRAPH + {0xB48B, 0x78F1}, //8359 #CJK UNIFIED IDEOGRAPH + {0xB48C, 0x78F3}, //8360 #CJK UNIFIED IDEOGRAPH + {0xB48D, 0x78F5}, //8361 #CJK UNIFIED IDEOGRAPH + {0xB48E, 0x78F6}, //8362 #CJK UNIFIED IDEOGRAPH + {0xB48F, 0x78F8}, //8363 #CJK UNIFIED IDEOGRAPH + {0xB490, 0x78F9}, //8364 #CJK UNIFIED IDEOGRAPH + {0xB491, 0x78FB}, //8365 #CJK UNIFIED IDEOGRAPH + {0xB492, 0x78FC}, //8366 #CJK UNIFIED IDEOGRAPH + {0xB493, 0x78FD}, //8367 #CJK UNIFIED IDEOGRAPH + {0xB494, 0x78FE}, //8368 #CJK UNIFIED IDEOGRAPH + {0xB495, 0x78FF}, //8369 #CJK UNIFIED IDEOGRAPH + {0xB496, 0x7900}, //8370 #CJK UNIFIED IDEOGRAPH + {0xB497, 0x7902}, //8371 #CJK UNIFIED IDEOGRAPH + {0xB498, 0x7903}, //8372 #CJK UNIFIED IDEOGRAPH + {0xB499, 0x7904}, //8373 #CJK UNIFIED IDEOGRAPH + {0xB49A, 0x7906}, //8374 #CJK UNIFIED IDEOGRAPH + {0xB49B, 0x7907}, //8375 #CJK UNIFIED IDEOGRAPH + {0xB49C, 0x7908}, //8376 #CJK UNIFIED IDEOGRAPH + {0xB49D, 0x7909}, //8377 #CJK UNIFIED IDEOGRAPH + {0xB49E, 0x790A}, //8378 #CJK UNIFIED IDEOGRAPH + {0xB49F, 0x790B}, //8379 #CJK UNIFIED IDEOGRAPH + {0xB4A0, 0x790C}, //8380 #CJK UNIFIED IDEOGRAPH + {0xB4A1, 0x7840}, //8381 #CJK UNIFIED IDEOGRAPH + {0xB4A2, 0x50A8}, //8382 #CJK UNIFIED IDEOGRAPH + {0xB4A3, 0x77D7}, //8383 #CJK UNIFIED IDEOGRAPH + {0xB4A4, 0x6410}, //8384 #CJK UNIFIED IDEOGRAPH + {0xB4A5, 0x89E6}, //8385 #CJK UNIFIED IDEOGRAPH + {0xB4A6, 0x5904}, //8386 #CJK UNIFIED IDEOGRAPH + {0xB4A7, 0x63E3}, //8387 #CJK UNIFIED IDEOGRAPH + {0xB4A8, 0x5DDD}, //8388 #CJK UNIFIED IDEOGRAPH + {0xB4A9, 0x7A7F}, //8389 #CJK UNIFIED IDEOGRAPH + {0xB4AA, 0x693D}, //8390 #CJK UNIFIED IDEOGRAPH + {0xB4AB, 0x4F20}, //8391 #CJK UNIFIED IDEOGRAPH + {0xB4AC, 0x8239}, //8392 #CJK UNIFIED IDEOGRAPH + {0xB4AD, 0x5598}, //8393 #CJK UNIFIED IDEOGRAPH + {0xB4AE, 0x4E32}, //8394 #CJK UNIFIED IDEOGRAPH + {0xB4AF, 0x75AE}, //8395 #CJK UNIFIED IDEOGRAPH + {0xB4B0, 0x7A97}, //8396 #CJK UNIFIED IDEOGRAPH + {0xB4B1, 0x5E62}, //8397 #CJK UNIFIED IDEOGRAPH + {0xB4B2, 0x5E8A}, //8398 #CJK UNIFIED IDEOGRAPH + {0xB4B3, 0x95EF}, //8399 #CJK UNIFIED IDEOGRAPH + {0xB4B4, 0x521B}, //8400 #CJK UNIFIED IDEOGRAPH + {0xB4B5, 0x5439}, //8401 #CJK UNIFIED IDEOGRAPH + {0xB4B6, 0x708A}, //8402 #CJK UNIFIED IDEOGRAPH + {0xB4B7, 0x6376}, //8403 #CJK UNIFIED IDEOGRAPH + {0xB4B8, 0x9524}, //8404 #CJK UNIFIED IDEOGRAPH + {0xB4B9, 0x5782}, //8405 #CJK UNIFIED IDEOGRAPH + {0xB4BA, 0x6625}, //8406 #CJK UNIFIED IDEOGRAPH + {0xB4BB, 0x693F}, //8407 #CJK UNIFIED IDEOGRAPH + {0xB4BC, 0x9187}, //8408 #CJK UNIFIED IDEOGRAPH + {0xB4BD, 0x5507}, //8409 #CJK UNIFIED IDEOGRAPH + {0xB4BE, 0x6DF3}, //8410 #CJK UNIFIED IDEOGRAPH + {0xB4BF, 0x7EAF}, //8411 #CJK UNIFIED IDEOGRAPH + {0xB4C0, 0x8822}, //8412 #CJK UNIFIED IDEOGRAPH + {0xB4C1, 0x6233}, //8413 #CJK UNIFIED IDEOGRAPH + {0xB4C2, 0x7EF0}, //8414 #CJK UNIFIED IDEOGRAPH + {0xB4C3, 0x75B5}, //8415 #CJK UNIFIED IDEOGRAPH + {0xB4C4, 0x8328}, //8416 #CJK UNIFIED IDEOGRAPH + {0xB4C5, 0x78C1}, //8417 #CJK UNIFIED IDEOGRAPH + {0xB4C6, 0x96CC}, //8418 #CJK UNIFIED IDEOGRAPH + {0xB4C7, 0x8F9E}, //8419 #CJK UNIFIED IDEOGRAPH + {0xB4C8, 0x6148}, //8420 #CJK UNIFIED IDEOGRAPH + {0xB4C9, 0x74F7}, //8421 #CJK UNIFIED IDEOGRAPH + {0xB4CA, 0x8BCD}, //8422 #CJK UNIFIED IDEOGRAPH + {0xB4CB, 0x6B64}, //8423 #CJK UNIFIED IDEOGRAPH + {0xB4CC, 0x523A}, //8424 #CJK UNIFIED IDEOGRAPH + {0xB4CD, 0x8D50}, //8425 #CJK UNIFIED IDEOGRAPH + {0xB4CE, 0x6B21}, //8426 #CJK UNIFIED IDEOGRAPH + {0xB4CF, 0x806A}, //8427 #CJK UNIFIED IDEOGRAPH + {0xB4D0, 0x8471}, //8428 #CJK UNIFIED IDEOGRAPH + {0xB4D1, 0x56F1}, //8429 #CJK UNIFIED IDEOGRAPH + {0xB4D2, 0x5306}, //8430 #CJK UNIFIED IDEOGRAPH + {0xB4D3, 0x4ECE}, //8431 #CJK UNIFIED IDEOGRAPH + {0xB4D4, 0x4E1B}, //8432 #CJK UNIFIED IDEOGRAPH + {0xB4D5, 0x51D1}, //8433 #CJK UNIFIED IDEOGRAPH + {0xB4D6, 0x7C97}, //8434 #CJK UNIFIED IDEOGRAPH + {0xB4D7, 0x918B}, //8435 #CJK UNIFIED IDEOGRAPH + {0xB4D8, 0x7C07}, //8436 #CJK UNIFIED IDEOGRAPH + {0xB4D9, 0x4FC3}, //8437 #CJK UNIFIED IDEOGRAPH + {0xB4DA, 0x8E7F}, //8438 #CJK UNIFIED IDEOGRAPH + {0xB4DB, 0x7BE1}, //8439 #CJK UNIFIED IDEOGRAPH + {0xB4DC, 0x7A9C}, //8440 #CJK UNIFIED IDEOGRAPH + {0xB4DD, 0x6467}, //8441 #CJK UNIFIED IDEOGRAPH + {0xB4DE, 0x5D14}, //8442 #CJK UNIFIED IDEOGRAPH + {0xB4DF, 0x50AC}, //8443 #CJK UNIFIED IDEOGRAPH + {0xB4E0, 0x8106}, //8444 #CJK UNIFIED IDEOGRAPH + {0xB4E1, 0x7601}, //8445 #CJK UNIFIED IDEOGRAPH + {0xB4E2, 0x7CB9}, //8446 #CJK UNIFIED IDEOGRAPH + {0xB4E3, 0x6DEC}, //8447 #CJK UNIFIED IDEOGRAPH + {0xB4E4, 0x7FE0}, //8448 #CJK UNIFIED IDEOGRAPH + {0xB4E5, 0x6751}, //8449 #CJK UNIFIED IDEOGRAPH + {0xB4E6, 0x5B58}, //8450 #CJK UNIFIED IDEOGRAPH + {0xB4E7, 0x5BF8}, //8451 #CJK UNIFIED IDEOGRAPH + {0xB4E8, 0x78CB}, //8452 #CJK UNIFIED IDEOGRAPH + {0xB4E9, 0x64AE}, //8453 #CJK UNIFIED IDEOGRAPH + {0xB4EA, 0x6413}, //8454 #CJK UNIFIED IDEOGRAPH + {0xB4EB, 0x63AA}, //8455 #CJK UNIFIED IDEOGRAPH + {0xB4EC, 0x632B}, //8456 #CJK UNIFIED IDEOGRAPH + {0xB4ED, 0x9519}, //8457 #CJK UNIFIED IDEOGRAPH + {0xB4EE, 0x642D}, //8458 #CJK UNIFIED IDEOGRAPH + {0xB4EF, 0x8FBE}, //8459 #CJK UNIFIED IDEOGRAPH + {0xB4F0, 0x7B54}, //8460 #CJK UNIFIED IDEOGRAPH + {0xB4F1, 0x7629}, //8461 #CJK UNIFIED IDEOGRAPH + {0xB4F2, 0x6253}, //8462 #CJK UNIFIED IDEOGRAPH + {0xB4F3, 0x5927}, //8463 #CJK UNIFIED IDEOGRAPH + {0xB4F4, 0x5446}, //8464 #CJK UNIFIED IDEOGRAPH + {0xB4F5, 0x6B79}, //8465 #CJK UNIFIED IDEOGRAPH + {0xB4F6, 0x50A3}, //8466 #CJK UNIFIED IDEOGRAPH + {0xB4F7, 0x6234}, //8467 #CJK UNIFIED IDEOGRAPH + {0xB4F8, 0x5E26}, //8468 #CJK UNIFIED IDEOGRAPH + {0xB4F9, 0x6B86}, //8469 #CJK UNIFIED IDEOGRAPH + {0xB4FA, 0x4EE3}, //8470 #CJK UNIFIED IDEOGRAPH + {0xB4FB, 0x8D37}, //8471 #CJK UNIFIED IDEOGRAPH + {0xB4FC, 0x888B}, //8472 #CJK UNIFIED IDEOGRAPH + {0xB4FD, 0x5F85}, //8473 #CJK UNIFIED IDEOGRAPH + {0xB4FE, 0x902E}, //8474 #CJK UNIFIED IDEOGRAPH + {0xB540, 0x790D}, //8475 #CJK UNIFIED IDEOGRAPH + {0xB541, 0x790E}, //8476 #CJK UNIFIED IDEOGRAPH + {0xB542, 0x790F}, //8477 #CJK UNIFIED IDEOGRAPH + {0xB543, 0x7910}, //8478 #CJK UNIFIED IDEOGRAPH + {0xB544, 0x7911}, //8479 #CJK UNIFIED IDEOGRAPH + {0xB545, 0x7912}, //8480 #CJK UNIFIED IDEOGRAPH + {0xB546, 0x7914}, //8481 #CJK UNIFIED IDEOGRAPH + {0xB547, 0x7915}, //8482 #CJK UNIFIED IDEOGRAPH + {0xB548, 0x7916}, //8483 #CJK UNIFIED IDEOGRAPH + {0xB549, 0x7917}, //8484 #CJK UNIFIED IDEOGRAPH + {0xB54A, 0x7918}, //8485 #CJK UNIFIED IDEOGRAPH + {0xB54B, 0x7919}, //8486 #CJK UNIFIED IDEOGRAPH + {0xB54C, 0x791A}, //8487 #CJK UNIFIED IDEOGRAPH + {0xB54D, 0x791B}, //8488 #CJK UNIFIED IDEOGRAPH + {0xB54E, 0x791C}, //8489 #CJK UNIFIED IDEOGRAPH + {0xB54F, 0x791D}, //8490 #CJK UNIFIED IDEOGRAPH + {0xB550, 0x791F}, //8491 #CJK UNIFIED IDEOGRAPH + {0xB551, 0x7920}, //8492 #CJK UNIFIED IDEOGRAPH + {0xB552, 0x7921}, //8493 #CJK UNIFIED IDEOGRAPH + {0xB553, 0x7922}, //8494 #CJK UNIFIED IDEOGRAPH + {0xB554, 0x7923}, //8495 #CJK UNIFIED IDEOGRAPH + {0xB555, 0x7925}, //8496 #CJK UNIFIED IDEOGRAPH + {0xB556, 0x7926}, //8497 #CJK UNIFIED IDEOGRAPH + {0xB557, 0x7927}, //8498 #CJK UNIFIED IDEOGRAPH + {0xB558, 0x7928}, //8499 #CJK UNIFIED IDEOGRAPH + {0xB559, 0x7929}, //8500 #CJK UNIFIED IDEOGRAPH + {0xB55A, 0x792A}, //8501 #CJK UNIFIED IDEOGRAPH + {0xB55B, 0x792B}, //8502 #CJK UNIFIED IDEOGRAPH + {0xB55C, 0x792C}, //8503 #CJK UNIFIED IDEOGRAPH + {0xB55D, 0x792D}, //8504 #CJK UNIFIED IDEOGRAPH + {0xB55E, 0x792E}, //8505 #CJK UNIFIED IDEOGRAPH + {0xB55F, 0x792F}, //8506 #CJK UNIFIED IDEOGRAPH + {0xB560, 0x7930}, //8507 #CJK UNIFIED IDEOGRAPH + {0xB561, 0x7931}, //8508 #CJK UNIFIED IDEOGRAPH + {0xB562, 0x7932}, //8509 #CJK UNIFIED IDEOGRAPH + {0xB563, 0x7933}, //8510 #CJK UNIFIED IDEOGRAPH + {0xB564, 0x7935}, //8511 #CJK UNIFIED IDEOGRAPH + {0xB565, 0x7936}, //8512 #CJK UNIFIED IDEOGRAPH + {0xB566, 0x7937}, //8513 #CJK UNIFIED IDEOGRAPH + {0xB567, 0x7938}, //8514 #CJK UNIFIED IDEOGRAPH + {0xB568, 0x7939}, //8515 #CJK UNIFIED IDEOGRAPH + {0xB569, 0x793D}, //8516 #CJK UNIFIED IDEOGRAPH + {0xB56A, 0x793F}, //8517 #CJK UNIFIED IDEOGRAPH + {0xB56B, 0x7942}, //8518 #CJK UNIFIED IDEOGRAPH + {0xB56C, 0x7943}, //8519 #CJK UNIFIED IDEOGRAPH + {0xB56D, 0x7944}, //8520 #CJK UNIFIED IDEOGRAPH + {0xB56E, 0x7945}, //8521 #CJK UNIFIED IDEOGRAPH + {0xB56F, 0x7947}, //8522 #CJK UNIFIED IDEOGRAPH + {0xB570, 0x794A}, //8523 #CJK UNIFIED IDEOGRAPH + {0xB571, 0x794B}, //8524 #CJK UNIFIED IDEOGRAPH + {0xB572, 0x794C}, //8525 #CJK UNIFIED IDEOGRAPH + {0xB573, 0x794D}, //8526 #CJK UNIFIED IDEOGRAPH + {0xB574, 0x794E}, //8527 #CJK UNIFIED IDEOGRAPH + {0xB575, 0x794F}, //8528 #CJK UNIFIED IDEOGRAPH + {0xB576, 0x7950}, //8529 #CJK UNIFIED IDEOGRAPH + {0xB577, 0x7951}, //8530 #CJK UNIFIED IDEOGRAPH + {0xB578, 0x7952}, //8531 #CJK UNIFIED IDEOGRAPH + {0xB579, 0x7954}, //8532 #CJK UNIFIED IDEOGRAPH + {0xB57A, 0x7955}, //8533 #CJK UNIFIED IDEOGRAPH + {0xB57B, 0x7958}, //8534 #CJK UNIFIED IDEOGRAPH + {0xB57C, 0x7959}, //8535 #CJK UNIFIED IDEOGRAPH + {0xB57D, 0x7961}, //8536 #CJK UNIFIED IDEOGRAPH + {0xB57E, 0x7963}, //8537 #CJK UNIFIED IDEOGRAPH + {0xB580, 0x7964}, //8538 #CJK UNIFIED IDEOGRAPH + {0xB581, 0x7966}, //8539 #CJK UNIFIED IDEOGRAPH + {0xB582, 0x7969}, //8540 #CJK UNIFIED IDEOGRAPH + {0xB583, 0x796A}, //8541 #CJK UNIFIED IDEOGRAPH + {0xB584, 0x796B}, //8542 #CJK UNIFIED IDEOGRAPH + {0xB585, 0x796C}, //8543 #CJK UNIFIED IDEOGRAPH + {0xB586, 0x796E}, //8544 #CJK UNIFIED IDEOGRAPH + {0xB587, 0x7970}, //8545 #CJK UNIFIED IDEOGRAPH + {0xB588, 0x7971}, //8546 #CJK UNIFIED IDEOGRAPH + {0xB589, 0x7972}, //8547 #CJK UNIFIED IDEOGRAPH + {0xB58A, 0x7973}, //8548 #CJK UNIFIED IDEOGRAPH + {0xB58B, 0x7974}, //8549 #CJK UNIFIED IDEOGRAPH + {0xB58C, 0x7975}, //8550 #CJK UNIFIED IDEOGRAPH + {0xB58D, 0x7976}, //8551 #CJK UNIFIED IDEOGRAPH + {0xB58E, 0x7979}, //8552 #CJK UNIFIED IDEOGRAPH + {0xB58F, 0x797B}, //8553 #CJK UNIFIED IDEOGRAPH + {0xB590, 0x797C}, //8554 #CJK UNIFIED IDEOGRAPH + {0xB591, 0x797D}, //8555 #CJK UNIFIED IDEOGRAPH + {0xB592, 0x797E}, //8556 #CJK UNIFIED IDEOGRAPH + {0xB593, 0x797F}, //8557 #CJK UNIFIED IDEOGRAPH + {0xB594, 0x7982}, //8558 #CJK UNIFIED IDEOGRAPH + {0xB595, 0x7983}, //8559 #CJK UNIFIED IDEOGRAPH + {0xB596, 0x7986}, //8560 #CJK UNIFIED IDEOGRAPH + {0xB597, 0x7987}, //8561 #CJK UNIFIED IDEOGRAPH + {0xB598, 0x7988}, //8562 #CJK UNIFIED IDEOGRAPH + {0xB599, 0x7989}, //8563 #CJK UNIFIED IDEOGRAPH + {0xB59A, 0x798B}, //8564 #CJK UNIFIED IDEOGRAPH + {0xB59B, 0x798C}, //8565 #CJK UNIFIED IDEOGRAPH + {0xB59C, 0x798D}, //8566 #CJK UNIFIED IDEOGRAPH + {0xB59D, 0x798E}, //8567 #CJK UNIFIED IDEOGRAPH + {0xB59E, 0x7990}, //8568 #CJK UNIFIED IDEOGRAPH + {0xB59F, 0x7991}, //8569 #CJK UNIFIED IDEOGRAPH + {0xB5A0, 0x7992}, //8570 #CJK UNIFIED IDEOGRAPH + {0xB5A1, 0x6020}, //8571 #CJK UNIFIED IDEOGRAPH + {0xB5A2, 0x803D}, //8572 #CJK UNIFIED IDEOGRAPH + {0xB5A3, 0x62C5}, //8573 #CJK UNIFIED IDEOGRAPH + {0xB5A4, 0x4E39}, //8574 #CJK UNIFIED IDEOGRAPH + {0xB5A5, 0x5355}, //8575 #CJK UNIFIED IDEOGRAPH + {0xB5A6, 0x90F8}, //8576 #CJK UNIFIED IDEOGRAPH + {0xB5A7, 0x63B8}, //8577 #CJK UNIFIED IDEOGRAPH + {0xB5A8, 0x80C6}, //8578 #CJK UNIFIED IDEOGRAPH + {0xB5A9, 0x65E6}, //8579 #CJK UNIFIED IDEOGRAPH + {0xB5AA, 0x6C2E}, //8580 #CJK UNIFIED IDEOGRAPH + {0xB5AB, 0x4F46}, //8581 #CJK UNIFIED IDEOGRAPH + {0xB5AC, 0x60EE}, //8582 #CJK UNIFIED IDEOGRAPH + {0xB5AD, 0x6DE1}, //8583 #CJK UNIFIED IDEOGRAPH + {0xB5AE, 0x8BDE}, //8584 #CJK UNIFIED IDEOGRAPH + {0xB5AF, 0x5F39}, //8585 #CJK UNIFIED IDEOGRAPH + {0xB5B0, 0x86CB}, //8586 #CJK UNIFIED IDEOGRAPH + {0xB5B1, 0x5F53}, //8587 #CJK UNIFIED IDEOGRAPH + {0xB5B2, 0x6321}, //8588 #CJK UNIFIED IDEOGRAPH + {0xB5B3, 0x515A}, //8589 #CJK UNIFIED IDEOGRAPH + {0xB5B4, 0x8361}, //8590 #CJK UNIFIED IDEOGRAPH + {0xB5B5, 0x6863}, //8591 #CJK UNIFIED IDEOGRAPH + {0xB5B6, 0x5200}, //8592 #CJK UNIFIED IDEOGRAPH + {0xB5B7, 0x6363}, //8593 #CJK UNIFIED IDEOGRAPH + {0xB5B8, 0x8E48}, //8594 #CJK UNIFIED IDEOGRAPH + {0xB5B9, 0x5012}, //8595 #CJK UNIFIED IDEOGRAPH + {0xB5BA, 0x5C9B}, //8596 #CJK UNIFIED IDEOGRAPH + {0xB5BB, 0x7977}, //8597 #CJK UNIFIED IDEOGRAPH + {0xB5BC, 0x5BFC}, //8598 #CJK UNIFIED IDEOGRAPH + {0xB5BD, 0x5230}, //8599 #CJK UNIFIED IDEOGRAPH + {0xB5BE, 0x7A3B}, //8600 #CJK UNIFIED IDEOGRAPH + {0xB5BF, 0x60BC}, //8601 #CJK UNIFIED IDEOGRAPH + {0xB5C0, 0x9053}, //8602 #CJK UNIFIED IDEOGRAPH + {0xB5C1, 0x76D7}, //8603 #CJK UNIFIED IDEOGRAPH + {0xB5C2, 0x5FB7}, //8604 #CJK UNIFIED IDEOGRAPH + {0xB5C3, 0x5F97}, //8605 #CJK UNIFIED IDEOGRAPH + {0xB5C4, 0x7684}, //8606 #CJK UNIFIED IDEOGRAPH + {0xB5C5, 0x8E6C}, //8607 #CJK UNIFIED IDEOGRAPH + {0xB5C6, 0x706F}, //8608 #CJK UNIFIED IDEOGRAPH + {0xB5C7, 0x767B}, //8609 #CJK UNIFIED IDEOGRAPH + {0xB5C8, 0x7B49}, //8610 #CJK UNIFIED IDEOGRAPH + {0xB5C9, 0x77AA}, //8611 #CJK UNIFIED IDEOGRAPH + {0xB5CA, 0x51F3}, //8612 #CJK UNIFIED IDEOGRAPH + {0xB5CB, 0x9093}, //8613 #CJK UNIFIED IDEOGRAPH + {0xB5CC, 0x5824}, //8614 #CJK UNIFIED IDEOGRAPH + {0xB5CD, 0x4F4E}, //8615 #CJK UNIFIED IDEOGRAPH + {0xB5CE, 0x6EF4}, //8616 #CJK UNIFIED IDEOGRAPH + {0xB5CF, 0x8FEA}, //8617 #CJK UNIFIED IDEOGRAPH + {0xB5D0, 0x654C}, //8618 #CJK UNIFIED IDEOGRAPH + {0xB5D1, 0x7B1B}, //8619 #CJK UNIFIED IDEOGRAPH + {0xB5D2, 0x72C4}, //8620 #CJK UNIFIED IDEOGRAPH + {0xB5D3, 0x6DA4}, //8621 #CJK UNIFIED IDEOGRAPH + {0xB5D4, 0x7FDF}, //8622 #CJK UNIFIED IDEOGRAPH + {0xB5D5, 0x5AE1}, //8623 #CJK UNIFIED IDEOGRAPH + {0xB5D6, 0x62B5}, //8624 #CJK UNIFIED IDEOGRAPH + {0xB5D7, 0x5E95}, //8625 #CJK UNIFIED IDEOGRAPH + {0xB5D8, 0x5730}, //8626 #CJK UNIFIED IDEOGRAPH + {0xB5D9, 0x8482}, //8627 #CJK UNIFIED IDEOGRAPH + {0xB5DA, 0x7B2C}, //8628 #CJK UNIFIED IDEOGRAPH + {0xB5DB, 0x5E1D}, //8629 #CJK UNIFIED IDEOGRAPH + {0xB5DC, 0x5F1F}, //8630 #CJK UNIFIED IDEOGRAPH + {0xB5DD, 0x9012}, //8631 #CJK UNIFIED IDEOGRAPH + {0xB5DE, 0x7F14}, //8632 #CJK UNIFIED IDEOGRAPH + {0xB5DF, 0x98A0}, //8633 #CJK UNIFIED IDEOGRAPH + {0xB5E0, 0x6382}, //8634 #CJK UNIFIED IDEOGRAPH + {0xB5E1, 0x6EC7}, //8635 #CJK UNIFIED IDEOGRAPH + {0xB5E2, 0x7898}, //8636 #CJK UNIFIED IDEOGRAPH + {0xB5E3, 0x70B9}, //8637 #CJK UNIFIED IDEOGRAPH + {0xB5E4, 0x5178}, //8638 #CJK UNIFIED IDEOGRAPH + {0xB5E5, 0x975B}, //8639 #CJK UNIFIED IDEOGRAPH + {0xB5E6, 0x57AB}, //8640 #CJK UNIFIED IDEOGRAPH + {0xB5E7, 0x7535}, //8641 #CJK UNIFIED IDEOGRAPH + {0xB5E8, 0x4F43}, //8642 #CJK UNIFIED IDEOGRAPH + {0xB5E9, 0x7538}, //8643 #CJK UNIFIED IDEOGRAPH + {0xB5EA, 0x5E97}, //8644 #CJK UNIFIED IDEOGRAPH + {0xB5EB, 0x60E6}, //8645 #CJK UNIFIED IDEOGRAPH + {0xB5EC, 0x5960}, //8646 #CJK UNIFIED IDEOGRAPH + {0xB5ED, 0x6DC0}, //8647 #CJK UNIFIED IDEOGRAPH + {0xB5EE, 0x6BBF}, //8648 #CJK UNIFIED IDEOGRAPH + {0xB5EF, 0x7889}, //8649 #CJK UNIFIED IDEOGRAPH + {0xB5F0, 0x53FC}, //8650 #CJK UNIFIED IDEOGRAPH + {0xB5F1, 0x96D5}, //8651 #CJK UNIFIED IDEOGRAPH + {0xB5F2, 0x51CB}, //8652 #CJK UNIFIED IDEOGRAPH + {0xB5F3, 0x5201}, //8653 #CJK UNIFIED IDEOGRAPH + {0xB5F4, 0x6389}, //8654 #CJK UNIFIED IDEOGRAPH + {0xB5F5, 0x540A}, //8655 #CJK UNIFIED IDEOGRAPH + {0xB5F6, 0x9493}, //8656 #CJK UNIFIED IDEOGRAPH + {0xB5F7, 0x8C03}, //8657 #CJK UNIFIED IDEOGRAPH + {0xB5F8, 0x8DCC}, //8658 #CJK UNIFIED IDEOGRAPH + {0xB5F9, 0x7239}, //8659 #CJK UNIFIED IDEOGRAPH + {0xB5FA, 0x789F}, //8660 #CJK UNIFIED IDEOGRAPH + {0xB5FB, 0x8776}, //8661 #CJK UNIFIED IDEOGRAPH + {0xB5FC, 0x8FED}, //8662 #CJK UNIFIED IDEOGRAPH + {0xB5FD, 0x8C0D}, //8663 #CJK UNIFIED IDEOGRAPH + {0xB5FE, 0x53E0}, //8664 #CJK UNIFIED IDEOGRAPH + {0xB640, 0x7993}, //8665 #CJK UNIFIED IDEOGRAPH + {0xB641, 0x7994}, //8666 #CJK UNIFIED IDEOGRAPH + {0xB642, 0x7995}, //8667 #CJK UNIFIED IDEOGRAPH + {0xB643, 0x7996}, //8668 #CJK UNIFIED IDEOGRAPH + {0xB644, 0x7997}, //8669 #CJK UNIFIED IDEOGRAPH + {0xB645, 0x7998}, //8670 #CJK UNIFIED IDEOGRAPH + {0xB646, 0x7999}, //8671 #CJK UNIFIED IDEOGRAPH + {0xB647, 0x799B}, //8672 #CJK UNIFIED IDEOGRAPH + {0xB648, 0x799C}, //8673 #CJK UNIFIED IDEOGRAPH + {0xB649, 0x799D}, //8674 #CJK UNIFIED IDEOGRAPH + {0xB64A, 0x799E}, //8675 #CJK UNIFIED IDEOGRAPH + {0xB64B, 0x799F}, //8676 #CJK UNIFIED IDEOGRAPH + {0xB64C, 0x79A0}, //8677 #CJK UNIFIED IDEOGRAPH + {0xB64D, 0x79A1}, //8678 #CJK UNIFIED IDEOGRAPH + {0xB64E, 0x79A2}, //8679 #CJK UNIFIED IDEOGRAPH + {0xB64F, 0x79A3}, //8680 #CJK UNIFIED IDEOGRAPH + {0xB650, 0x79A4}, //8681 #CJK UNIFIED IDEOGRAPH + {0xB651, 0x79A5}, //8682 #CJK UNIFIED IDEOGRAPH + {0xB652, 0x79A6}, //8683 #CJK UNIFIED IDEOGRAPH + {0xB653, 0x79A8}, //8684 #CJK UNIFIED IDEOGRAPH + {0xB654, 0x79A9}, //8685 #CJK UNIFIED IDEOGRAPH + {0xB655, 0x79AA}, //8686 #CJK UNIFIED IDEOGRAPH + {0xB656, 0x79AB}, //8687 #CJK UNIFIED IDEOGRAPH + {0xB657, 0x79AC}, //8688 #CJK UNIFIED IDEOGRAPH + {0xB658, 0x79AD}, //8689 #CJK UNIFIED IDEOGRAPH + {0xB659, 0x79AE}, //8690 #CJK UNIFIED IDEOGRAPH + {0xB65A, 0x79AF}, //8691 #CJK UNIFIED IDEOGRAPH + {0xB65B, 0x79B0}, //8692 #CJK UNIFIED IDEOGRAPH + {0xB65C, 0x79B1}, //8693 #CJK UNIFIED IDEOGRAPH + {0xB65D, 0x79B2}, //8694 #CJK UNIFIED IDEOGRAPH + {0xB65E, 0x79B4}, //8695 #CJK UNIFIED IDEOGRAPH + {0xB65F, 0x79B5}, //8696 #CJK UNIFIED IDEOGRAPH + {0xB660, 0x79B6}, //8697 #CJK UNIFIED IDEOGRAPH + {0xB661, 0x79B7}, //8698 #CJK UNIFIED IDEOGRAPH + {0xB662, 0x79B8}, //8699 #CJK UNIFIED IDEOGRAPH + {0xB663, 0x79BC}, //8700 #CJK UNIFIED IDEOGRAPH + {0xB664, 0x79BF}, //8701 #CJK UNIFIED IDEOGRAPH + {0xB665, 0x79C2}, //8702 #CJK UNIFIED IDEOGRAPH + {0xB666, 0x79C4}, //8703 #CJK UNIFIED IDEOGRAPH + {0xB667, 0x79C5}, //8704 #CJK UNIFIED IDEOGRAPH + {0xB668, 0x79C7}, //8705 #CJK UNIFIED IDEOGRAPH + {0xB669, 0x79C8}, //8706 #CJK UNIFIED IDEOGRAPH + {0xB66A, 0x79CA}, //8707 #CJK UNIFIED IDEOGRAPH + {0xB66B, 0x79CC}, //8708 #CJK UNIFIED IDEOGRAPH + {0xB66C, 0x79CE}, //8709 #CJK UNIFIED IDEOGRAPH + {0xB66D, 0x79CF}, //8710 #CJK UNIFIED IDEOGRAPH + {0xB66E, 0x79D0}, //8711 #CJK UNIFIED IDEOGRAPH + {0xB66F, 0x79D3}, //8712 #CJK UNIFIED IDEOGRAPH + {0xB670, 0x79D4}, //8713 #CJK UNIFIED IDEOGRAPH + {0xB671, 0x79D6}, //8714 #CJK UNIFIED IDEOGRAPH + {0xB672, 0x79D7}, //8715 #CJK UNIFIED IDEOGRAPH + {0xB673, 0x79D9}, //8716 #CJK UNIFIED IDEOGRAPH + {0xB674, 0x79DA}, //8717 #CJK UNIFIED IDEOGRAPH + {0xB675, 0x79DB}, //8718 #CJK UNIFIED IDEOGRAPH + {0xB676, 0x79DC}, //8719 #CJK UNIFIED IDEOGRAPH + {0xB677, 0x79DD}, //8720 #CJK UNIFIED IDEOGRAPH + {0xB678, 0x79DE}, //8721 #CJK UNIFIED IDEOGRAPH + {0xB679, 0x79E0}, //8722 #CJK UNIFIED IDEOGRAPH + {0xB67A, 0x79E1}, //8723 #CJK UNIFIED IDEOGRAPH + {0xB67B, 0x79E2}, //8724 #CJK UNIFIED IDEOGRAPH + {0xB67C, 0x79E5}, //8725 #CJK UNIFIED IDEOGRAPH + {0xB67D, 0x79E8}, //8726 #CJK UNIFIED IDEOGRAPH + {0xB67E, 0x79EA}, //8727 #CJK UNIFIED IDEOGRAPH + {0xB680, 0x79EC}, //8728 #CJK UNIFIED IDEOGRAPH + {0xB681, 0x79EE}, //8729 #CJK UNIFIED IDEOGRAPH + {0xB682, 0x79F1}, //8730 #CJK UNIFIED IDEOGRAPH + {0xB683, 0x79F2}, //8731 #CJK UNIFIED IDEOGRAPH + {0xB684, 0x79F3}, //8732 #CJK UNIFIED IDEOGRAPH + {0xB685, 0x79F4}, //8733 #CJK UNIFIED IDEOGRAPH + {0xB686, 0x79F5}, //8734 #CJK UNIFIED IDEOGRAPH + {0xB687, 0x79F6}, //8735 #CJK UNIFIED IDEOGRAPH + {0xB688, 0x79F7}, //8736 #CJK UNIFIED IDEOGRAPH + {0xB689, 0x79F9}, //8737 #CJK UNIFIED IDEOGRAPH + {0xB68A, 0x79FA}, //8738 #CJK UNIFIED IDEOGRAPH + {0xB68B, 0x79FC}, //8739 #CJK UNIFIED IDEOGRAPH + {0xB68C, 0x79FE}, //8740 #CJK UNIFIED IDEOGRAPH + {0xB68D, 0x79FF}, //8741 #CJK UNIFIED IDEOGRAPH + {0xB68E, 0x7A01}, //8742 #CJK UNIFIED IDEOGRAPH + {0xB68F, 0x7A04}, //8743 #CJK UNIFIED IDEOGRAPH + {0xB690, 0x7A05}, //8744 #CJK UNIFIED IDEOGRAPH + {0xB691, 0x7A07}, //8745 #CJK UNIFIED IDEOGRAPH + {0xB692, 0x7A08}, //8746 #CJK UNIFIED IDEOGRAPH + {0xB693, 0x7A09}, //8747 #CJK UNIFIED IDEOGRAPH + {0xB694, 0x7A0A}, //8748 #CJK UNIFIED IDEOGRAPH + {0xB695, 0x7A0C}, //8749 #CJK UNIFIED IDEOGRAPH + {0xB696, 0x7A0F}, //8750 #CJK UNIFIED IDEOGRAPH + {0xB697, 0x7A10}, //8751 #CJK UNIFIED IDEOGRAPH + {0xB698, 0x7A11}, //8752 #CJK UNIFIED IDEOGRAPH + {0xB699, 0x7A12}, //8753 #CJK UNIFIED IDEOGRAPH + {0xB69A, 0x7A13}, //8754 #CJK UNIFIED IDEOGRAPH + {0xB69B, 0x7A15}, //8755 #CJK UNIFIED IDEOGRAPH + {0xB69C, 0x7A16}, //8756 #CJK UNIFIED IDEOGRAPH + {0xB69D, 0x7A18}, //8757 #CJK UNIFIED IDEOGRAPH + {0xB69E, 0x7A19}, //8758 #CJK UNIFIED IDEOGRAPH + {0xB69F, 0x7A1B}, //8759 #CJK UNIFIED IDEOGRAPH + {0xB6A0, 0x7A1C}, //8760 #CJK UNIFIED IDEOGRAPH + {0xB6A1, 0x4E01}, //8761 #CJK UNIFIED IDEOGRAPH + {0xB6A2, 0x76EF}, //8762 #CJK UNIFIED IDEOGRAPH + {0xB6A3, 0x53EE}, //8763 #CJK UNIFIED IDEOGRAPH + {0xB6A4, 0x9489}, //8764 #CJK UNIFIED IDEOGRAPH + {0xB6A5, 0x9876}, //8765 #CJK UNIFIED IDEOGRAPH + {0xB6A6, 0x9F0E}, //8766 #CJK UNIFIED IDEOGRAPH + {0xB6A7, 0x952D}, //8767 #CJK UNIFIED IDEOGRAPH + {0xB6A8, 0x5B9A}, //8768 #CJK UNIFIED IDEOGRAPH + {0xB6A9, 0x8BA2}, //8769 #CJK UNIFIED IDEOGRAPH + {0xB6AA, 0x4E22}, //8770 #CJK UNIFIED IDEOGRAPH + {0xB6AB, 0x4E1C}, //8771 #CJK UNIFIED IDEOGRAPH + {0xB6AC, 0x51AC}, //8772 #CJK UNIFIED IDEOGRAPH + {0xB6AD, 0x8463}, //8773 #CJK UNIFIED IDEOGRAPH + {0xB6AE, 0x61C2}, //8774 #CJK UNIFIED IDEOGRAPH + {0xB6AF, 0x52A8}, //8775 #CJK UNIFIED IDEOGRAPH + {0xB6B0, 0x680B}, //8776 #CJK UNIFIED IDEOGRAPH + {0xB6B1, 0x4F97}, //8777 #CJK UNIFIED IDEOGRAPH + {0xB6B2, 0x606B}, //8778 #CJK UNIFIED IDEOGRAPH + {0xB6B3, 0x51BB}, //8779 #CJK UNIFIED IDEOGRAPH + {0xB6B4, 0x6D1E}, //8780 #CJK UNIFIED IDEOGRAPH + {0xB6B5, 0x515C}, //8781 #CJK UNIFIED IDEOGRAPH + {0xB6B6, 0x6296}, //8782 #CJK UNIFIED IDEOGRAPH + {0xB6B7, 0x6597}, //8783 #CJK UNIFIED IDEOGRAPH + {0xB6B8, 0x9661}, //8784 #CJK UNIFIED IDEOGRAPH + {0xB6B9, 0x8C46}, //8785 #CJK UNIFIED IDEOGRAPH + {0xB6BA, 0x9017}, //8786 #CJK UNIFIED IDEOGRAPH + {0xB6BB, 0x75D8}, //8787 #CJK UNIFIED IDEOGRAPH + {0xB6BC, 0x90FD}, //8788 #CJK UNIFIED IDEOGRAPH + {0xB6BD, 0x7763}, //8789 #CJK UNIFIED IDEOGRAPH + {0xB6BE, 0x6BD2}, //8790 #CJK UNIFIED IDEOGRAPH + {0xB6BF, 0x728A}, //8791 #CJK UNIFIED IDEOGRAPH + {0xB6C0, 0x72EC}, //8792 #CJK UNIFIED IDEOGRAPH + {0xB6C1, 0x8BFB}, //8793 #CJK UNIFIED IDEOGRAPH + {0xB6C2, 0x5835}, //8794 #CJK UNIFIED IDEOGRAPH + {0xB6C3, 0x7779}, //8795 #CJK UNIFIED IDEOGRAPH + {0xB6C4, 0x8D4C}, //8796 #CJK UNIFIED IDEOGRAPH + {0xB6C5, 0x675C}, //8797 #CJK UNIFIED IDEOGRAPH + {0xB6C6, 0x9540}, //8798 #CJK UNIFIED IDEOGRAPH + {0xB6C7, 0x809A}, //8799 #CJK UNIFIED IDEOGRAPH + {0xB6C8, 0x5EA6}, //8800 #CJK UNIFIED IDEOGRAPH + {0xB6C9, 0x6E21}, //8801 #CJK UNIFIED IDEOGRAPH + {0xB6CA, 0x5992}, //8802 #CJK UNIFIED IDEOGRAPH + {0xB6CB, 0x7AEF}, //8803 #CJK UNIFIED IDEOGRAPH + {0xB6CC, 0x77ED}, //8804 #CJK UNIFIED IDEOGRAPH + {0xB6CD, 0x953B}, //8805 #CJK UNIFIED IDEOGRAPH + {0xB6CE, 0x6BB5}, //8806 #CJK UNIFIED IDEOGRAPH + {0xB6CF, 0x65AD}, //8807 #CJK UNIFIED IDEOGRAPH + {0xB6D0, 0x7F0E}, //8808 #CJK UNIFIED IDEOGRAPH + {0xB6D1, 0x5806}, //8809 #CJK UNIFIED IDEOGRAPH + {0xB6D2, 0x5151}, //8810 #CJK UNIFIED IDEOGRAPH + {0xB6D3, 0x961F}, //8811 #CJK UNIFIED IDEOGRAPH + {0xB6D4, 0x5BF9}, //8812 #CJK UNIFIED IDEOGRAPH + {0xB6D5, 0x58A9}, //8813 #CJK UNIFIED IDEOGRAPH + {0xB6D6, 0x5428}, //8814 #CJK UNIFIED IDEOGRAPH + {0xB6D7, 0x8E72}, //8815 #CJK UNIFIED IDEOGRAPH + {0xB6D8, 0x6566}, //8816 #CJK UNIFIED IDEOGRAPH + {0xB6D9, 0x987F}, //8817 #CJK UNIFIED IDEOGRAPH + {0xB6DA, 0x56E4}, //8818 #CJK UNIFIED IDEOGRAPH + {0xB6DB, 0x949D}, //8819 #CJK UNIFIED IDEOGRAPH + {0xB6DC, 0x76FE}, //8820 #CJK UNIFIED IDEOGRAPH + {0xB6DD, 0x9041}, //8821 #CJK UNIFIED IDEOGRAPH + {0xB6DE, 0x6387}, //8822 #CJK UNIFIED IDEOGRAPH + {0xB6DF, 0x54C6}, //8823 #CJK UNIFIED IDEOGRAPH + {0xB6E0, 0x591A}, //8824 #CJK UNIFIED IDEOGRAPH + {0xB6E1, 0x593A}, //8825 #CJK UNIFIED IDEOGRAPH + {0xB6E2, 0x579B}, //8826 #CJK UNIFIED IDEOGRAPH + {0xB6E3, 0x8EB2}, //8827 #CJK UNIFIED IDEOGRAPH + {0xB6E4, 0x6735}, //8828 #CJK UNIFIED IDEOGRAPH + {0xB6E5, 0x8DFA}, //8829 #CJK UNIFIED IDEOGRAPH + {0xB6E6, 0x8235}, //8830 #CJK UNIFIED IDEOGRAPH + {0xB6E7, 0x5241}, //8831 #CJK UNIFIED IDEOGRAPH + {0xB6E8, 0x60F0}, //8832 #CJK UNIFIED IDEOGRAPH + {0xB6E9, 0x5815}, //8833 #CJK UNIFIED IDEOGRAPH + {0xB6EA, 0x86FE}, //8834 #CJK UNIFIED IDEOGRAPH + {0xB6EB, 0x5CE8}, //8835 #CJK UNIFIED IDEOGRAPH + {0xB6EC, 0x9E45}, //8836 #CJK UNIFIED IDEOGRAPH + {0xB6ED, 0x4FC4}, //8837 #CJK UNIFIED IDEOGRAPH + {0xB6EE, 0x989D}, //8838 #CJK UNIFIED IDEOGRAPH + {0xB6EF, 0x8BB9}, //8839 #CJK UNIFIED IDEOGRAPH + {0xB6F0, 0x5A25}, //8840 #CJK UNIFIED IDEOGRAPH + {0xB6F1, 0x6076}, //8841 #CJK UNIFIED IDEOGRAPH + {0xB6F2, 0x5384}, //8842 #CJK UNIFIED IDEOGRAPH + {0xB6F3, 0x627C}, //8843 #CJK UNIFIED IDEOGRAPH + {0xB6F4, 0x904F}, //8844 #CJK UNIFIED IDEOGRAPH + {0xB6F5, 0x9102}, //8845 #CJK UNIFIED IDEOGRAPH + {0xB6F6, 0x997F}, //8846 #CJK UNIFIED IDEOGRAPH + {0xB6F7, 0x6069}, //8847 #CJK UNIFIED IDEOGRAPH + {0xB6F8, 0x800C}, //8848 #CJK UNIFIED IDEOGRAPH + {0xB6F9, 0x513F}, //8849 #CJK UNIFIED IDEOGRAPH + {0xB6FA, 0x8033}, //8850 #CJK UNIFIED IDEOGRAPH + {0xB6FB, 0x5C14}, //8851 #CJK UNIFIED IDEOGRAPH + {0xB6FC, 0x9975}, //8852 #CJK UNIFIED IDEOGRAPH + {0xB6FD, 0x6D31}, //8853 #CJK UNIFIED IDEOGRAPH + {0xB6FE, 0x4E8C}, //8854 #CJK UNIFIED IDEOGRAPH + {0xB740, 0x7A1D}, //8855 #CJK UNIFIED IDEOGRAPH + {0xB741, 0x7A1F}, //8856 #CJK UNIFIED IDEOGRAPH + {0xB742, 0x7A21}, //8857 #CJK UNIFIED IDEOGRAPH + {0xB743, 0x7A22}, //8858 #CJK UNIFIED IDEOGRAPH + {0xB744, 0x7A24}, //8859 #CJK UNIFIED IDEOGRAPH + {0xB745, 0x7A25}, //8860 #CJK UNIFIED IDEOGRAPH + {0xB746, 0x7A26}, //8861 #CJK UNIFIED IDEOGRAPH + {0xB747, 0x7A27}, //8862 #CJK UNIFIED IDEOGRAPH + {0xB748, 0x7A28}, //8863 #CJK UNIFIED IDEOGRAPH + {0xB749, 0x7A29}, //8864 #CJK UNIFIED IDEOGRAPH + {0xB74A, 0x7A2A}, //8865 #CJK UNIFIED IDEOGRAPH + {0xB74B, 0x7A2B}, //8866 #CJK UNIFIED IDEOGRAPH + {0xB74C, 0x7A2C}, //8867 #CJK UNIFIED IDEOGRAPH + {0xB74D, 0x7A2D}, //8868 #CJK UNIFIED IDEOGRAPH + {0xB74E, 0x7A2E}, //8869 #CJK UNIFIED IDEOGRAPH + {0xB74F, 0x7A2F}, //8870 #CJK UNIFIED IDEOGRAPH + {0xB750, 0x7A30}, //8871 #CJK UNIFIED IDEOGRAPH + {0xB751, 0x7A31}, //8872 #CJK UNIFIED IDEOGRAPH + {0xB752, 0x7A32}, //8873 #CJK UNIFIED IDEOGRAPH + {0xB753, 0x7A34}, //8874 #CJK UNIFIED IDEOGRAPH + {0xB754, 0x7A35}, //8875 #CJK UNIFIED IDEOGRAPH + {0xB755, 0x7A36}, //8876 #CJK UNIFIED IDEOGRAPH + {0xB756, 0x7A38}, //8877 #CJK UNIFIED IDEOGRAPH + {0xB757, 0x7A3A}, //8878 #CJK UNIFIED IDEOGRAPH + {0xB758, 0x7A3E}, //8879 #CJK UNIFIED IDEOGRAPH + {0xB759, 0x7A40}, //8880 #CJK UNIFIED IDEOGRAPH + {0xB75A, 0x7A41}, //8881 #CJK UNIFIED IDEOGRAPH + {0xB75B, 0x7A42}, //8882 #CJK UNIFIED IDEOGRAPH + {0xB75C, 0x7A43}, //8883 #CJK UNIFIED IDEOGRAPH + {0xB75D, 0x7A44}, //8884 #CJK UNIFIED IDEOGRAPH + {0xB75E, 0x7A45}, //8885 #CJK UNIFIED IDEOGRAPH + {0xB75F, 0x7A47}, //8886 #CJK UNIFIED IDEOGRAPH + {0xB760, 0x7A48}, //8887 #CJK UNIFIED IDEOGRAPH + {0xB761, 0x7A49}, //8888 #CJK UNIFIED IDEOGRAPH + {0xB762, 0x7A4A}, //8889 #CJK UNIFIED IDEOGRAPH + {0xB763, 0x7A4B}, //8890 #CJK UNIFIED IDEOGRAPH + {0xB764, 0x7A4C}, //8891 #CJK UNIFIED IDEOGRAPH + {0xB765, 0x7A4D}, //8892 #CJK UNIFIED IDEOGRAPH + {0xB766, 0x7A4E}, //8893 #CJK UNIFIED IDEOGRAPH + {0xB767, 0x7A4F}, //8894 #CJK UNIFIED IDEOGRAPH + {0xB768, 0x7A50}, //8895 #CJK UNIFIED IDEOGRAPH + {0xB769, 0x7A52}, //8896 #CJK UNIFIED IDEOGRAPH + {0xB76A, 0x7A53}, //8897 #CJK UNIFIED IDEOGRAPH + {0xB76B, 0x7A54}, //8898 #CJK UNIFIED IDEOGRAPH + {0xB76C, 0x7A55}, //8899 #CJK UNIFIED IDEOGRAPH + {0xB76D, 0x7A56}, //8900 #CJK UNIFIED IDEOGRAPH + {0xB76E, 0x7A58}, //8901 #CJK UNIFIED IDEOGRAPH + {0xB76F, 0x7A59}, //8902 #CJK UNIFIED IDEOGRAPH + {0xB770, 0x7A5A}, //8903 #CJK UNIFIED IDEOGRAPH + {0xB771, 0x7A5B}, //8904 #CJK UNIFIED IDEOGRAPH + {0xB772, 0x7A5C}, //8905 #CJK UNIFIED IDEOGRAPH + {0xB773, 0x7A5D}, //8906 #CJK UNIFIED IDEOGRAPH + {0xB774, 0x7A5E}, //8907 #CJK UNIFIED IDEOGRAPH + {0xB775, 0x7A5F}, //8908 #CJK UNIFIED IDEOGRAPH + {0xB776, 0x7A60}, //8909 #CJK UNIFIED IDEOGRAPH + {0xB777, 0x7A61}, //8910 #CJK UNIFIED IDEOGRAPH + {0xB778, 0x7A62}, //8911 #CJK UNIFIED IDEOGRAPH + {0xB779, 0x7A63}, //8912 #CJK UNIFIED IDEOGRAPH + {0xB77A, 0x7A64}, //8913 #CJK UNIFIED IDEOGRAPH + {0xB77B, 0x7A65}, //8914 #CJK UNIFIED IDEOGRAPH + {0xB77C, 0x7A66}, //8915 #CJK UNIFIED IDEOGRAPH + {0xB77D, 0x7A67}, //8916 #CJK UNIFIED IDEOGRAPH + {0xB77E, 0x7A68}, //8917 #CJK UNIFIED IDEOGRAPH + {0xB780, 0x7A69}, //8918 #CJK UNIFIED IDEOGRAPH + {0xB781, 0x7A6A}, //8919 #CJK UNIFIED IDEOGRAPH + {0xB782, 0x7A6B}, //8920 #CJK UNIFIED IDEOGRAPH + {0xB783, 0x7A6C}, //8921 #CJK UNIFIED IDEOGRAPH + {0xB784, 0x7A6D}, //8922 #CJK UNIFIED IDEOGRAPH + {0xB785, 0x7A6E}, //8923 #CJK UNIFIED IDEOGRAPH + {0xB786, 0x7A6F}, //8924 #CJK UNIFIED IDEOGRAPH + {0xB787, 0x7A71}, //8925 #CJK UNIFIED IDEOGRAPH + {0xB788, 0x7A72}, //8926 #CJK UNIFIED IDEOGRAPH + {0xB789, 0x7A73}, //8927 #CJK UNIFIED IDEOGRAPH + {0xB78A, 0x7A75}, //8928 #CJK UNIFIED IDEOGRAPH + {0xB78B, 0x7A7B}, //8929 #CJK UNIFIED IDEOGRAPH + {0xB78C, 0x7A7C}, //8930 #CJK UNIFIED IDEOGRAPH + {0xB78D, 0x7A7D}, //8931 #CJK UNIFIED IDEOGRAPH + {0xB78E, 0x7A7E}, //8932 #CJK UNIFIED IDEOGRAPH + {0xB78F, 0x7A82}, //8933 #CJK UNIFIED IDEOGRAPH + {0xB790, 0x7A85}, //8934 #CJK UNIFIED IDEOGRAPH + {0xB791, 0x7A87}, //8935 #CJK UNIFIED IDEOGRAPH + {0xB792, 0x7A89}, //8936 #CJK UNIFIED IDEOGRAPH + {0xB793, 0x7A8A}, //8937 #CJK UNIFIED IDEOGRAPH + {0xB794, 0x7A8B}, //8938 #CJK UNIFIED IDEOGRAPH + {0xB795, 0x7A8C}, //8939 #CJK UNIFIED IDEOGRAPH + {0xB796, 0x7A8E}, //8940 #CJK UNIFIED IDEOGRAPH + {0xB797, 0x7A8F}, //8941 #CJK UNIFIED IDEOGRAPH + {0xB798, 0x7A90}, //8942 #CJK UNIFIED IDEOGRAPH + {0xB799, 0x7A93}, //8943 #CJK UNIFIED IDEOGRAPH + {0xB79A, 0x7A94}, //8944 #CJK UNIFIED IDEOGRAPH + {0xB79B, 0x7A99}, //8945 #CJK UNIFIED IDEOGRAPH + {0xB79C, 0x7A9A}, //8946 #CJK UNIFIED IDEOGRAPH + {0xB79D, 0x7A9B}, //8947 #CJK UNIFIED IDEOGRAPH + {0xB79E, 0x7A9E}, //8948 #CJK UNIFIED IDEOGRAPH + {0xB79F, 0x7AA1}, //8949 #CJK UNIFIED IDEOGRAPH + {0xB7A0, 0x7AA2}, //8950 #CJK UNIFIED IDEOGRAPH + {0xB7A1, 0x8D30}, //8951 #CJK UNIFIED IDEOGRAPH + {0xB7A2, 0x53D1}, //8952 #CJK UNIFIED IDEOGRAPH + {0xB7A3, 0x7F5A}, //8953 #CJK UNIFIED IDEOGRAPH + {0xB7A4, 0x7B4F}, //8954 #CJK UNIFIED IDEOGRAPH + {0xB7A5, 0x4F10}, //8955 #CJK UNIFIED IDEOGRAPH + {0xB7A6, 0x4E4F}, //8956 #CJK UNIFIED IDEOGRAPH + {0xB7A7, 0x9600}, //8957 #CJK UNIFIED IDEOGRAPH + {0xB7A8, 0x6CD5}, //8958 #CJK UNIFIED IDEOGRAPH + {0xB7A9, 0x73D0}, //8959 #CJK UNIFIED IDEOGRAPH + {0xB7AA, 0x85E9}, //8960 #CJK UNIFIED IDEOGRAPH + {0xB7AB, 0x5E06}, //8961 #CJK UNIFIED IDEOGRAPH + {0xB7AC, 0x756A}, //8962 #CJK UNIFIED IDEOGRAPH + {0xB7AD, 0x7FFB}, //8963 #CJK UNIFIED IDEOGRAPH + {0xB7AE, 0x6A0A}, //8964 #CJK UNIFIED IDEOGRAPH + {0xB7AF, 0x77FE}, //8965 #CJK UNIFIED IDEOGRAPH + {0xB7B0, 0x9492}, //8966 #CJK UNIFIED IDEOGRAPH + {0xB7B1, 0x7E41}, //8967 #CJK UNIFIED IDEOGRAPH + {0xB7B2, 0x51E1}, //8968 #CJK UNIFIED IDEOGRAPH + {0xB7B3, 0x70E6}, //8969 #CJK UNIFIED IDEOGRAPH + {0xB7B4, 0x53CD}, //8970 #CJK UNIFIED IDEOGRAPH + {0xB7B5, 0x8FD4}, //8971 #CJK UNIFIED IDEOGRAPH + {0xB7B6, 0x8303}, //8972 #CJK UNIFIED IDEOGRAPH + {0xB7B7, 0x8D29}, //8973 #CJK UNIFIED IDEOGRAPH + {0xB7B8, 0x72AF}, //8974 #CJK UNIFIED IDEOGRAPH + {0xB7B9, 0x996D}, //8975 #CJK UNIFIED IDEOGRAPH + {0xB7BA, 0x6CDB}, //8976 #CJK UNIFIED IDEOGRAPH + {0xB7BB, 0x574A}, //8977 #CJK UNIFIED IDEOGRAPH + {0xB7BC, 0x82B3}, //8978 #CJK UNIFIED IDEOGRAPH + {0xB7BD, 0x65B9}, //8979 #CJK UNIFIED IDEOGRAPH + {0xB7BE, 0x80AA}, //8980 #CJK UNIFIED IDEOGRAPH + {0xB7BF, 0x623F}, //8981 #CJK UNIFIED IDEOGRAPH + {0xB7C0, 0x9632}, //8982 #CJK UNIFIED IDEOGRAPH + {0xB7C1, 0x59A8}, //8983 #CJK UNIFIED IDEOGRAPH + {0xB7C2, 0x4EFF}, //8984 #CJK UNIFIED IDEOGRAPH + {0xB7C3, 0x8BBF}, //8985 #CJK UNIFIED IDEOGRAPH + {0xB7C4, 0x7EBA}, //8986 #CJK UNIFIED IDEOGRAPH + {0xB7C5, 0x653E}, //8987 #CJK UNIFIED IDEOGRAPH + {0xB7C6, 0x83F2}, //8988 #CJK UNIFIED IDEOGRAPH + {0xB7C7, 0x975E}, //8989 #CJK UNIFIED IDEOGRAPH + {0xB7C8, 0x5561}, //8990 #CJK UNIFIED IDEOGRAPH + {0xB7C9, 0x98DE}, //8991 #CJK UNIFIED IDEOGRAPH + {0xB7CA, 0x80A5}, //8992 #CJK UNIFIED IDEOGRAPH + {0xB7CB, 0x532A}, //8993 #CJK UNIFIED IDEOGRAPH + {0xB7CC, 0x8BFD}, //8994 #CJK UNIFIED IDEOGRAPH + {0xB7CD, 0x5420}, //8995 #CJK UNIFIED IDEOGRAPH + {0xB7CE, 0x80BA}, //8996 #CJK UNIFIED IDEOGRAPH + {0xB7CF, 0x5E9F}, //8997 #CJK UNIFIED IDEOGRAPH + {0xB7D0, 0x6CB8}, //8998 #CJK UNIFIED IDEOGRAPH + {0xB7D1, 0x8D39}, //8999 #CJK UNIFIED IDEOGRAPH + {0xB7D2, 0x82AC}, //9000 #CJK UNIFIED IDEOGRAPH + {0xB7D3, 0x915A}, //9001 #CJK UNIFIED IDEOGRAPH + {0xB7D4, 0x5429}, //9002 #CJK UNIFIED IDEOGRAPH + {0xB7D5, 0x6C1B}, //9003 #CJK UNIFIED IDEOGRAPH + {0xB7D6, 0x5206}, //9004 #CJK UNIFIED IDEOGRAPH + {0xB7D7, 0x7EB7}, //9005 #CJK UNIFIED IDEOGRAPH + {0xB7D8, 0x575F}, //9006 #CJK UNIFIED IDEOGRAPH + {0xB7D9, 0x711A}, //9007 #CJK UNIFIED IDEOGRAPH + {0xB7DA, 0x6C7E}, //9008 #CJK UNIFIED IDEOGRAPH + {0xB7DB, 0x7C89}, //9009 #CJK UNIFIED IDEOGRAPH + {0xB7DC, 0x594B}, //9010 #CJK UNIFIED IDEOGRAPH + {0xB7DD, 0x4EFD}, //9011 #CJK UNIFIED IDEOGRAPH + {0xB7DE, 0x5FFF}, //9012 #CJK UNIFIED IDEOGRAPH + {0xB7DF, 0x6124}, //9013 #CJK UNIFIED IDEOGRAPH + {0xB7E0, 0x7CAA}, //9014 #CJK UNIFIED IDEOGRAPH + {0xB7E1, 0x4E30}, //9015 #CJK UNIFIED IDEOGRAPH + {0xB7E2, 0x5C01}, //9016 #CJK UNIFIED IDEOGRAPH + {0xB7E3, 0x67AB}, //9017 #CJK UNIFIED IDEOGRAPH + {0xB7E4, 0x8702}, //9018 #CJK UNIFIED IDEOGRAPH + {0xB7E5, 0x5CF0}, //9019 #CJK UNIFIED IDEOGRAPH + {0xB7E6, 0x950B}, //9020 #CJK UNIFIED IDEOGRAPH + {0xB7E7, 0x98CE}, //9021 #CJK UNIFIED IDEOGRAPH + {0xB7E8, 0x75AF}, //9022 #CJK UNIFIED IDEOGRAPH + {0xB7E9, 0x70FD}, //9023 #CJK UNIFIED IDEOGRAPH + {0xB7EA, 0x9022}, //9024 #CJK UNIFIED IDEOGRAPH + {0xB7EB, 0x51AF}, //9025 #CJK UNIFIED IDEOGRAPH + {0xB7EC, 0x7F1D}, //9026 #CJK UNIFIED IDEOGRAPH + {0xB7ED, 0x8BBD}, //9027 #CJK UNIFIED IDEOGRAPH + {0xB7EE, 0x5949}, //9028 #CJK UNIFIED IDEOGRAPH + {0xB7EF, 0x51E4}, //9029 #CJK UNIFIED IDEOGRAPH + {0xB7F0, 0x4F5B}, //9030 #CJK UNIFIED IDEOGRAPH + {0xB7F1, 0x5426}, //9031 #CJK UNIFIED IDEOGRAPH + {0xB7F2, 0x592B}, //9032 #CJK UNIFIED IDEOGRAPH + {0xB7F3, 0x6577}, //9033 #CJK UNIFIED IDEOGRAPH + {0xB7F4, 0x80A4}, //9034 #CJK UNIFIED IDEOGRAPH + {0xB7F5, 0x5B75}, //9035 #CJK UNIFIED IDEOGRAPH + {0xB7F6, 0x6276}, //9036 #CJK UNIFIED IDEOGRAPH + {0xB7F7, 0x62C2}, //9037 #CJK UNIFIED IDEOGRAPH + {0xB7F8, 0x8F90}, //9038 #CJK UNIFIED IDEOGRAPH + {0xB7F9, 0x5E45}, //9039 #CJK UNIFIED IDEOGRAPH + {0xB7FA, 0x6C1F}, //9040 #CJK UNIFIED IDEOGRAPH + {0xB7FB, 0x7B26}, //9041 #CJK UNIFIED IDEOGRAPH + {0xB7FC, 0x4F0F}, //9042 #CJK UNIFIED IDEOGRAPH + {0xB7FD, 0x4FD8}, //9043 #CJK UNIFIED IDEOGRAPH + {0xB7FE, 0x670D}, //9044 #CJK UNIFIED IDEOGRAPH + {0xB840, 0x7AA3}, //9045 #CJK UNIFIED IDEOGRAPH + {0xB841, 0x7AA4}, //9046 #CJK UNIFIED IDEOGRAPH + {0xB842, 0x7AA7}, //9047 #CJK UNIFIED IDEOGRAPH + {0xB843, 0x7AA9}, //9048 #CJK UNIFIED IDEOGRAPH + {0xB844, 0x7AAA}, //9049 #CJK UNIFIED IDEOGRAPH + {0xB845, 0x7AAB}, //9050 #CJK UNIFIED IDEOGRAPH + {0xB846, 0x7AAE}, //9051 #CJK UNIFIED IDEOGRAPH + {0xB847, 0x7AAF}, //9052 #CJK UNIFIED IDEOGRAPH + {0xB848, 0x7AB0}, //9053 #CJK UNIFIED IDEOGRAPH + {0xB849, 0x7AB1}, //9054 #CJK UNIFIED IDEOGRAPH + {0xB84A, 0x7AB2}, //9055 #CJK UNIFIED IDEOGRAPH + {0xB84B, 0x7AB4}, //9056 #CJK UNIFIED IDEOGRAPH + {0xB84C, 0x7AB5}, //9057 #CJK UNIFIED IDEOGRAPH + {0xB84D, 0x7AB6}, //9058 #CJK UNIFIED IDEOGRAPH + {0xB84E, 0x7AB7}, //9059 #CJK UNIFIED IDEOGRAPH + {0xB84F, 0x7AB8}, //9060 #CJK UNIFIED IDEOGRAPH + {0xB850, 0x7AB9}, //9061 #CJK UNIFIED IDEOGRAPH + {0xB851, 0x7ABA}, //9062 #CJK UNIFIED IDEOGRAPH + {0xB852, 0x7ABB}, //9063 #CJK UNIFIED IDEOGRAPH + {0xB853, 0x7ABC}, //9064 #CJK UNIFIED IDEOGRAPH + {0xB854, 0x7ABD}, //9065 #CJK UNIFIED IDEOGRAPH + {0xB855, 0x7ABE}, //9066 #CJK UNIFIED IDEOGRAPH + {0xB856, 0x7AC0}, //9067 #CJK UNIFIED IDEOGRAPH + {0xB857, 0x7AC1}, //9068 #CJK UNIFIED IDEOGRAPH + {0xB858, 0x7AC2}, //9069 #CJK UNIFIED IDEOGRAPH + {0xB859, 0x7AC3}, //9070 #CJK UNIFIED IDEOGRAPH + {0xB85A, 0x7AC4}, //9071 #CJK UNIFIED IDEOGRAPH + {0xB85B, 0x7AC5}, //9072 #CJK UNIFIED IDEOGRAPH + {0xB85C, 0x7AC6}, //9073 #CJK UNIFIED IDEOGRAPH + {0xB85D, 0x7AC7}, //9074 #CJK UNIFIED IDEOGRAPH + {0xB85E, 0x7AC8}, //9075 #CJK UNIFIED IDEOGRAPH + {0xB85F, 0x7AC9}, //9076 #CJK UNIFIED IDEOGRAPH + {0xB860, 0x7ACA}, //9077 #CJK UNIFIED IDEOGRAPH + {0xB861, 0x7ACC}, //9078 #CJK UNIFIED IDEOGRAPH + {0xB862, 0x7ACD}, //9079 #CJK UNIFIED IDEOGRAPH + {0xB863, 0x7ACE}, //9080 #CJK UNIFIED IDEOGRAPH + {0xB864, 0x7ACF}, //9081 #CJK UNIFIED IDEOGRAPH + {0xB865, 0x7AD0}, //9082 #CJK UNIFIED IDEOGRAPH + {0xB866, 0x7AD1}, //9083 #CJK UNIFIED IDEOGRAPH + {0xB867, 0x7AD2}, //9084 #CJK UNIFIED IDEOGRAPH + {0xB868, 0x7AD3}, //9085 #CJK UNIFIED IDEOGRAPH + {0xB869, 0x7AD4}, //9086 #CJK UNIFIED IDEOGRAPH + {0xB86A, 0x7AD5}, //9087 #CJK UNIFIED IDEOGRAPH + {0xB86B, 0x7AD7}, //9088 #CJK UNIFIED IDEOGRAPH + {0xB86C, 0x7AD8}, //9089 #CJK UNIFIED IDEOGRAPH + {0xB86D, 0x7ADA}, //9090 #CJK UNIFIED IDEOGRAPH + {0xB86E, 0x7ADB}, //9091 #CJK UNIFIED IDEOGRAPH + {0xB86F, 0x7ADC}, //9092 #CJK UNIFIED IDEOGRAPH + {0xB870, 0x7ADD}, //9093 #CJK UNIFIED IDEOGRAPH + {0xB871, 0x7AE1}, //9094 #CJK UNIFIED IDEOGRAPH + {0xB872, 0x7AE2}, //9095 #CJK UNIFIED IDEOGRAPH + {0xB873, 0x7AE4}, //9096 #CJK UNIFIED IDEOGRAPH + {0xB874, 0x7AE7}, //9097 #CJK UNIFIED IDEOGRAPH + {0xB875, 0x7AE8}, //9098 #CJK UNIFIED IDEOGRAPH + {0xB876, 0x7AE9}, //9099 #CJK UNIFIED IDEOGRAPH + {0xB877, 0x7AEA}, //9100 #CJK UNIFIED IDEOGRAPH + {0xB878, 0x7AEB}, //9101 #CJK UNIFIED IDEOGRAPH + {0xB879, 0x7AEC}, //9102 #CJK UNIFIED IDEOGRAPH + {0xB87A, 0x7AEE}, //9103 #CJK UNIFIED IDEOGRAPH + {0xB87B, 0x7AF0}, //9104 #CJK UNIFIED IDEOGRAPH + {0xB87C, 0x7AF1}, //9105 #CJK UNIFIED IDEOGRAPH + {0xB87D, 0x7AF2}, //9106 #CJK UNIFIED IDEOGRAPH + {0xB87E, 0x7AF3}, //9107 #CJK UNIFIED IDEOGRAPH + {0xB880, 0x7AF4}, //9108 #CJK UNIFIED IDEOGRAPH + {0xB881, 0x7AF5}, //9109 #CJK UNIFIED IDEOGRAPH + {0xB882, 0x7AF6}, //9110 #CJK UNIFIED IDEOGRAPH + {0xB883, 0x7AF7}, //9111 #CJK UNIFIED IDEOGRAPH + {0xB884, 0x7AF8}, //9112 #CJK UNIFIED IDEOGRAPH + {0xB885, 0x7AFB}, //9113 #CJK UNIFIED IDEOGRAPH + {0xB886, 0x7AFC}, //9114 #CJK UNIFIED IDEOGRAPH + {0xB887, 0x7AFE}, //9115 #CJK UNIFIED IDEOGRAPH + {0xB888, 0x7B00}, //9116 #CJK UNIFIED IDEOGRAPH + {0xB889, 0x7B01}, //9117 #CJK UNIFIED IDEOGRAPH + {0xB88A, 0x7B02}, //9118 #CJK UNIFIED IDEOGRAPH + {0xB88B, 0x7B05}, //9119 #CJK UNIFIED IDEOGRAPH + {0xB88C, 0x7B07}, //9120 #CJK UNIFIED IDEOGRAPH + {0xB88D, 0x7B09}, //9121 #CJK UNIFIED IDEOGRAPH + {0xB88E, 0x7B0C}, //9122 #CJK UNIFIED IDEOGRAPH + {0xB88F, 0x7B0D}, //9123 #CJK UNIFIED IDEOGRAPH + {0xB890, 0x7B0E}, //9124 #CJK UNIFIED IDEOGRAPH + {0xB891, 0x7B10}, //9125 #CJK UNIFIED IDEOGRAPH + {0xB892, 0x7B12}, //9126 #CJK UNIFIED IDEOGRAPH + {0xB893, 0x7B13}, //9127 #CJK UNIFIED IDEOGRAPH + {0xB894, 0x7B16}, //9128 #CJK UNIFIED IDEOGRAPH + {0xB895, 0x7B17}, //9129 #CJK UNIFIED IDEOGRAPH + {0xB896, 0x7B18}, //9130 #CJK UNIFIED IDEOGRAPH + {0xB897, 0x7B1A}, //9131 #CJK UNIFIED IDEOGRAPH + {0xB898, 0x7B1C}, //9132 #CJK UNIFIED IDEOGRAPH + {0xB899, 0x7B1D}, //9133 #CJK UNIFIED IDEOGRAPH + {0xB89A, 0x7B1F}, //9134 #CJK UNIFIED IDEOGRAPH + {0xB89B, 0x7B21}, //9135 #CJK UNIFIED IDEOGRAPH + {0xB89C, 0x7B22}, //9136 #CJK UNIFIED IDEOGRAPH + {0xB89D, 0x7B23}, //9137 #CJK UNIFIED IDEOGRAPH + {0xB89E, 0x7B27}, //9138 #CJK UNIFIED IDEOGRAPH + {0xB89F, 0x7B29}, //9139 #CJK UNIFIED IDEOGRAPH + {0xB8A0, 0x7B2D}, //9140 #CJK UNIFIED IDEOGRAPH + {0xB8A1, 0x6D6E}, //9141 #CJK UNIFIED IDEOGRAPH + {0xB8A2, 0x6DAA}, //9142 #CJK UNIFIED IDEOGRAPH + {0xB8A3, 0x798F}, //9143 #CJK UNIFIED IDEOGRAPH + {0xB8A4, 0x88B1}, //9144 #CJK UNIFIED IDEOGRAPH + {0xB8A5, 0x5F17}, //9145 #CJK UNIFIED IDEOGRAPH + {0xB8A6, 0x752B}, //9146 #CJK UNIFIED IDEOGRAPH + {0xB8A7, 0x629A}, //9147 #CJK UNIFIED IDEOGRAPH + {0xB8A8, 0x8F85}, //9148 #CJK UNIFIED IDEOGRAPH + {0xB8A9, 0x4FEF}, //9149 #CJK UNIFIED IDEOGRAPH + {0xB8AA, 0x91DC}, //9150 #CJK UNIFIED IDEOGRAPH + {0xB8AB, 0x65A7}, //9151 #CJK UNIFIED IDEOGRAPH + {0xB8AC, 0x812F}, //9152 #CJK UNIFIED IDEOGRAPH + {0xB8AD, 0x8151}, //9153 #CJK UNIFIED IDEOGRAPH + {0xB8AE, 0x5E9C}, //9154 #CJK UNIFIED IDEOGRAPH + {0xB8AF, 0x8150}, //9155 #CJK UNIFIED IDEOGRAPH + {0xB8B0, 0x8D74}, //9156 #CJK UNIFIED IDEOGRAPH + {0xB8B1, 0x526F}, //9157 #CJK UNIFIED IDEOGRAPH + {0xB8B2, 0x8986}, //9158 #CJK UNIFIED IDEOGRAPH + {0xB8B3, 0x8D4B}, //9159 #CJK UNIFIED IDEOGRAPH + {0xB8B4, 0x590D}, //9160 #CJK UNIFIED IDEOGRAPH + {0xB8B5, 0x5085}, //9161 #CJK UNIFIED IDEOGRAPH + {0xB8B6, 0x4ED8}, //9162 #CJK UNIFIED IDEOGRAPH + {0xB8B7, 0x961C}, //9163 #CJK UNIFIED IDEOGRAPH + {0xB8B8, 0x7236}, //9164 #CJK UNIFIED IDEOGRAPH + {0xB8B9, 0x8179}, //9165 #CJK UNIFIED IDEOGRAPH + {0xB8BA, 0x8D1F}, //9166 #CJK UNIFIED IDEOGRAPH + {0xB8BB, 0x5BCC}, //9167 #CJK UNIFIED IDEOGRAPH + {0xB8BC, 0x8BA3}, //9168 #CJK UNIFIED IDEOGRAPH + {0xB8BD, 0x9644}, //9169 #CJK UNIFIED IDEOGRAPH + {0xB8BE, 0x5987}, //9170 #CJK UNIFIED IDEOGRAPH + {0xB8BF, 0x7F1A}, //9171 #CJK UNIFIED IDEOGRAPH + {0xB8C0, 0x5490}, //9172 #CJK UNIFIED IDEOGRAPH + {0xB8C1, 0x5676}, //9173 #CJK UNIFIED IDEOGRAPH + {0xB8C2, 0x560E}, //9174 #CJK UNIFIED IDEOGRAPH + {0xB8C3, 0x8BE5}, //9175 #CJK UNIFIED IDEOGRAPH + {0xB8C4, 0x6539}, //9176 #CJK UNIFIED IDEOGRAPH + {0xB8C5, 0x6982}, //9177 #CJK UNIFIED IDEOGRAPH + {0xB8C6, 0x9499}, //9178 #CJK UNIFIED IDEOGRAPH + {0xB8C7, 0x76D6}, //9179 #CJK UNIFIED IDEOGRAPH + {0xB8C8, 0x6E89}, //9180 #CJK UNIFIED IDEOGRAPH + {0xB8C9, 0x5E72}, //9181 #CJK UNIFIED IDEOGRAPH + {0xB8CA, 0x7518}, //9182 #CJK UNIFIED IDEOGRAPH + {0xB8CB, 0x6746}, //9183 #CJK UNIFIED IDEOGRAPH + {0xB8CC, 0x67D1}, //9184 #CJK UNIFIED IDEOGRAPH + {0xB8CD, 0x7AFF}, //9185 #CJK UNIFIED IDEOGRAPH + {0xB8CE, 0x809D}, //9186 #CJK UNIFIED IDEOGRAPH + {0xB8CF, 0x8D76}, //9187 #CJK UNIFIED IDEOGRAPH + {0xB8D0, 0x611F}, //9188 #CJK UNIFIED IDEOGRAPH + {0xB8D1, 0x79C6}, //9189 #CJK UNIFIED IDEOGRAPH + {0xB8D2, 0x6562}, //9190 #CJK UNIFIED IDEOGRAPH + {0xB8D3, 0x8D63}, //9191 #CJK UNIFIED IDEOGRAPH + {0xB8D4, 0x5188}, //9192 #CJK UNIFIED IDEOGRAPH + {0xB8D5, 0x521A}, //9193 #CJK UNIFIED IDEOGRAPH + {0xB8D6, 0x94A2}, //9194 #CJK UNIFIED IDEOGRAPH + {0xB8D7, 0x7F38}, //9195 #CJK UNIFIED IDEOGRAPH + {0xB8D8, 0x809B}, //9196 #CJK UNIFIED IDEOGRAPH + {0xB8D9, 0x7EB2}, //9197 #CJK UNIFIED IDEOGRAPH + {0xB8DA, 0x5C97}, //9198 #CJK UNIFIED IDEOGRAPH + {0xB8DB, 0x6E2F}, //9199 #CJK UNIFIED IDEOGRAPH + {0xB8DC, 0x6760}, //9200 #CJK UNIFIED IDEOGRAPH + {0xB8DD, 0x7BD9}, //9201 #CJK UNIFIED IDEOGRAPH + {0xB8DE, 0x768B}, //9202 #CJK UNIFIED IDEOGRAPH + {0xB8DF, 0x9AD8}, //9203 #CJK UNIFIED IDEOGRAPH + {0xB8E0, 0x818F}, //9204 #CJK UNIFIED IDEOGRAPH + {0xB8E1, 0x7F94}, //9205 #CJK UNIFIED IDEOGRAPH + {0xB8E2, 0x7CD5}, //9206 #CJK UNIFIED IDEOGRAPH + {0xB8E3, 0x641E}, //9207 #CJK UNIFIED IDEOGRAPH + {0xB8E4, 0x9550}, //9208 #CJK UNIFIED IDEOGRAPH + {0xB8E5, 0x7A3F}, //9209 #CJK UNIFIED IDEOGRAPH + {0xB8E6, 0x544A}, //9210 #CJK UNIFIED IDEOGRAPH + {0xB8E7, 0x54E5}, //9211 #CJK UNIFIED IDEOGRAPH + {0xB8E8, 0x6B4C}, //9212 #CJK UNIFIED IDEOGRAPH + {0xB8E9, 0x6401}, //9213 #CJK UNIFIED IDEOGRAPH + {0xB8EA, 0x6208}, //9214 #CJK UNIFIED IDEOGRAPH + {0xB8EB, 0x9E3D}, //9215 #CJK UNIFIED IDEOGRAPH + {0xB8EC, 0x80F3}, //9216 #CJK UNIFIED IDEOGRAPH + {0xB8ED, 0x7599}, //9217 #CJK UNIFIED IDEOGRAPH + {0xB8EE, 0x5272}, //9218 #CJK UNIFIED IDEOGRAPH + {0xB8EF, 0x9769}, //9219 #CJK UNIFIED IDEOGRAPH + {0xB8F0, 0x845B}, //9220 #CJK UNIFIED IDEOGRAPH + {0xB8F1, 0x683C}, //9221 #CJK UNIFIED IDEOGRAPH + {0xB8F2, 0x86E4}, //9222 #CJK UNIFIED IDEOGRAPH + {0xB8F3, 0x9601}, //9223 #CJK UNIFIED IDEOGRAPH + {0xB8F4, 0x9694}, //9224 #CJK UNIFIED IDEOGRAPH + {0xB8F5, 0x94EC}, //9225 #CJK UNIFIED IDEOGRAPH + {0xB8F6, 0x4E2A}, //9226 #CJK UNIFIED IDEOGRAPH + {0xB8F7, 0x5404}, //9227 #CJK UNIFIED IDEOGRAPH + {0xB8F8, 0x7ED9}, //9228 #CJK UNIFIED IDEOGRAPH + {0xB8F9, 0x6839}, //9229 #CJK UNIFIED IDEOGRAPH + {0xB8FA, 0x8DDF}, //9230 #CJK UNIFIED IDEOGRAPH + {0xB8FB, 0x8015}, //9231 #CJK UNIFIED IDEOGRAPH + {0xB8FC, 0x66F4}, //9232 #CJK UNIFIED IDEOGRAPH + {0xB8FD, 0x5E9A}, //9233 #CJK UNIFIED IDEOGRAPH + {0xB8FE, 0x7FB9}, //9234 #CJK UNIFIED IDEOGRAPH + {0xB940, 0x7B2F}, //9235 #CJK UNIFIED IDEOGRAPH + {0xB941, 0x7B30}, //9236 #CJK UNIFIED IDEOGRAPH + {0xB942, 0x7B32}, //9237 #CJK UNIFIED IDEOGRAPH + {0xB943, 0x7B34}, //9238 #CJK UNIFIED IDEOGRAPH + {0xB944, 0x7B35}, //9239 #CJK UNIFIED IDEOGRAPH + {0xB945, 0x7B36}, //9240 #CJK UNIFIED IDEOGRAPH + {0xB946, 0x7B37}, //9241 #CJK UNIFIED IDEOGRAPH + {0xB947, 0x7B39}, //9242 #CJK UNIFIED IDEOGRAPH + {0xB948, 0x7B3B}, //9243 #CJK UNIFIED IDEOGRAPH + {0xB949, 0x7B3D}, //9244 #CJK UNIFIED IDEOGRAPH + {0xB94A, 0x7B3F}, //9245 #CJK UNIFIED IDEOGRAPH + {0xB94B, 0x7B40}, //9246 #CJK UNIFIED IDEOGRAPH + {0xB94C, 0x7B41}, //9247 #CJK UNIFIED IDEOGRAPH + {0xB94D, 0x7B42}, //9248 #CJK UNIFIED IDEOGRAPH + {0xB94E, 0x7B43}, //9249 #CJK UNIFIED IDEOGRAPH + {0xB94F, 0x7B44}, //9250 #CJK UNIFIED IDEOGRAPH + {0xB950, 0x7B46}, //9251 #CJK UNIFIED IDEOGRAPH + {0xB951, 0x7B48}, //9252 #CJK UNIFIED IDEOGRAPH + {0xB952, 0x7B4A}, //9253 #CJK UNIFIED IDEOGRAPH + {0xB953, 0x7B4D}, //9254 #CJK UNIFIED IDEOGRAPH + {0xB954, 0x7B4E}, //9255 #CJK UNIFIED IDEOGRAPH + {0xB955, 0x7B53}, //9256 #CJK UNIFIED IDEOGRAPH + {0xB956, 0x7B55}, //9257 #CJK UNIFIED IDEOGRAPH + {0xB957, 0x7B57}, //9258 #CJK UNIFIED IDEOGRAPH + {0xB958, 0x7B59}, //9259 #CJK UNIFIED IDEOGRAPH + {0xB959, 0x7B5C}, //9260 #CJK UNIFIED IDEOGRAPH + {0xB95A, 0x7B5E}, //9261 #CJK UNIFIED IDEOGRAPH + {0xB95B, 0x7B5F}, //9262 #CJK UNIFIED IDEOGRAPH + {0xB95C, 0x7B61}, //9263 #CJK UNIFIED IDEOGRAPH + {0xB95D, 0x7B63}, //9264 #CJK UNIFIED IDEOGRAPH + {0xB95E, 0x7B64}, //9265 #CJK UNIFIED IDEOGRAPH + {0xB95F, 0x7B65}, //9266 #CJK UNIFIED IDEOGRAPH + {0xB960, 0x7B66}, //9267 #CJK UNIFIED IDEOGRAPH + {0xB961, 0x7B67}, //9268 #CJK UNIFIED IDEOGRAPH + {0xB962, 0x7B68}, //9269 #CJK UNIFIED IDEOGRAPH + {0xB963, 0x7B69}, //9270 #CJK UNIFIED IDEOGRAPH + {0xB964, 0x7B6A}, //9271 #CJK UNIFIED IDEOGRAPH + {0xB965, 0x7B6B}, //9272 #CJK UNIFIED IDEOGRAPH + {0xB966, 0x7B6C}, //9273 #CJK UNIFIED IDEOGRAPH + {0xB967, 0x7B6D}, //9274 #CJK UNIFIED IDEOGRAPH + {0xB968, 0x7B6F}, //9275 #CJK UNIFIED IDEOGRAPH + {0xB969, 0x7B70}, //9276 #CJK UNIFIED IDEOGRAPH + {0xB96A, 0x7B73}, //9277 #CJK UNIFIED IDEOGRAPH + {0xB96B, 0x7B74}, //9278 #CJK UNIFIED IDEOGRAPH + {0xB96C, 0x7B76}, //9279 #CJK UNIFIED IDEOGRAPH + {0xB96D, 0x7B78}, //9280 #CJK UNIFIED IDEOGRAPH + {0xB96E, 0x7B7A}, //9281 #CJK UNIFIED IDEOGRAPH + {0xB96F, 0x7B7C}, //9282 #CJK UNIFIED IDEOGRAPH + {0xB970, 0x7B7D}, //9283 #CJK UNIFIED IDEOGRAPH + {0xB971, 0x7B7F}, //9284 #CJK UNIFIED IDEOGRAPH + {0xB972, 0x7B81}, //9285 #CJK UNIFIED IDEOGRAPH + {0xB973, 0x7B82}, //9286 #CJK UNIFIED IDEOGRAPH + {0xB974, 0x7B83}, //9287 #CJK UNIFIED IDEOGRAPH + {0xB975, 0x7B84}, //9288 #CJK UNIFIED IDEOGRAPH + {0xB976, 0x7B86}, //9289 #CJK UNIFIED IDEOGRAPH + {0xB977, 0x7B87}, //9290 #CJK UNIFIED IDEOGRAPH + {0xB978, 0x7B88}, //9291 #CJK UNIFIED IDEOGRAPH + {0xB979, 0x7B89}, //9292 #CJK UNIFIED IDEOGRAPH + {0xB97A, 0x7B8A}, //9293 #CJK UNIFIED IDEOGRAPH + {0xB97B, 0x7B8B}, //9294 #CJK UNIFIED IDEOGRAPH + {0xB97C, 0x7B8C}, //9295 #CJK UNIFIED IDEOGRAPH + {0xB97D, 0x7B8E}, //9296 #CJK UNIFIED IDEOGRAPH + {0xB97E, 0x7B8F}, //9297 #CJK UNIFIED IDEOGRAPH + {0xB980, 0x7B91}, //9298 #CJK UNIFIED IDEOGRAPH + {0xB981, 0x7B92}, //9299 #CJK UNIFIED IDEOGRAPH + {0xB982, 0x7B93}, //9300 #CJK UNIFIED IDEOGRAPH + {0xB983, 0x7B96}, //9301 #CJK UNIFIED IDEOGRAPH + {0xB984, 0x7B98}, //9302 #CJK UNIFIED IDEOGRAPH + {0xB985, 0x7B99}, //9303 #CJK UNIFIED IDEOGRAPH + {0xB986, 0x7B9A}, //9304 #CJK UNIFIED IDEOGRAPH + {0xB987, 0x7B9B}, //9305 #CJK UNIFIED IDEOGRAPH + {0xB988, 0x7B9E}, //9306 #CJK UNIFIED IDEOGRAPH + {0xB989, 0x7B9F}, //9307 #CJK UNIFIED IDEOGRAPH + {0xB98A, 0x7BA0}, //9308 #CJK UNIFIED IDEOGRAPH + {0xB98B, 0x7BA3}, //9309 #CJK UNIFIED IDEOGRAPH + {0xB98C, 0x7BA4}, //9310 #CJK UNIFIED IDEOGRAPH + {0xB98D, 0x7BA5}, //9311 #CJK UNIFIED IDEOGRAPH + {0xB98E, 0x7BAE}, //9312 #CJK UNIFIED IDEOGRAPH + {0xB98F, 0x7BAF}, //9313 #CJK UNIFIED IDEOGRAPH + {0xB990, 0x7BB0}, //9314 #CJK UNIFIED IDEOGRAPH + {0xB991, 0x7BB2}, //9315 #CJK UNIFIED IDEOGRAPH + {0xB992, 0x7BB3}, //9316 #CJK UNIFIED IDEOGRAPH + {0xB993, 0x7BB5}, //9317 #CJK UNIFIED IDEOGRAPH + {0xB994, 0x7BB6}, //9318 #CJK UNIFIED IDEOGRAPH + {0xB995, 0x7BB7}, //9319 #CJK UNIFIED IDEOGRAPH + {0xB996, 0x7BB9}, //9320 #CJK UNIFIED IDEOGRAPH + {0xB997, 0x7BBA}, //9321 #CJK UNIFIED IDEOGRAPH + {0xB998, 0x7BBB}, //9322 #CJK UNIFIED IDEOGRAPH + {0xB999, 0x7BBC}, //9323 #CJK UNIFIED IDEOGRAPH + {0xB99A, 0x7BBD}, //9324 #CJK UNIFIED IDEOGRAPH + {0xB99B, 0x7BBE}, //9325 #CJK UNIFIED IDEOGRAPH + {0xB99C, 0x7BBF}, //9326 #CJK UNIFIED IDEOGRAPH + {0xB99D, 0x7BC0}, //9327 #CJK UNIFIED IDEOGRAPH + {0xB99E, 0x7BC2}, //9328 #CJK UNIFIED IDEOGRAPH + {0xB99F, 0x7BC3}, //9329 #CJK UNIFIED IDEOGRAPH + {0xB9A0, 0x7BC4}, //9330 #CJK UNIFIED IDEOGRAPH + {0xB9A1, 0x57C2}, //9331 #CJK UNIFIED IDEOGRAPH + {0xB9A2, 0x803F}, //9332 #CJK UNIFIED IDEOGRAPH + {0xB9A3, 0x6897}, //9333 #CJK UNIFIED IDEOGRAPH + {0xB9A4, 0x5DE5}, //9334 #CJK UNIFIED IDEOGRAPH + {0xB9A5, 0x653B}, //9335 #CJK UNIFIED IDEOGRAPH + {0xB9A6, 0x529F}, //9336 #CJK UNIFIED IDEOGRAPH + {0xB9A7, 0x606D}, //9337 #CJK UNIFIED IDEOGRAPH + {0xB9A8, 0x9F9A}, //9338 #CJK UNIFIED IDEOGRAPH + {0xB9A9, 0x4F9B}, //9339 #CJK UNIFIED IDEOGRAPH + {0xB9AA, 0x8EAC}, //9340 #CJK UNIFIED IDEOGRAPH + {0xB9AB, 0x516C}, //9341 #CJK UNIFIED IDEOGRAPH + {0xB9AC, 0x5BAB}, //9342 #CJK UNIFIED IDEOGRAPH + {0xB9AD, 0x5F13}, //9343 #CJK UNIFIED IDEOGRAPH + {0xB9AE, 0x5DE9}, //9344 #CJK UNIFIED IDEOGRAPH + {0xB9AF, 0x6C5E}, //9345 #CJK UNIFIED IDEOGRAPH + {0xB9B0, 0x62F1}, //9346 #CJK UNIFIED IDEOGRAPH + {0xB9B1, 0x8D21}, //9347 #CJK UNIFIED IDEOGRAPH + {0xB9B2, 0x5171}, //9348 #CJK UNIFIED IDEOGRAPH + {0xB9B3, 0x94A9}, //9349 #CJK UNIFIED IDEOGRAPH + {0xB9B4, 0x52FE}, //9350 #CJK UNIFIED IDEOGRAPH + {0xB9B5, 0x6C9F}, //9351 #CJK UNIFIED IDEOGRAPH + {0xB9B6, 0x82DF}, //9352 #CJK UNIFIED IDEOGRAPH + {0xB9B7, 0x72D7}, //9353 #CJK UNIFIED IDEOGRAPH + {0xB9B8, 0x57A2}, //9354 #CJK UNIFIED IDEOGRAPH + {0xB9B9, 0x6784}, //9355 #CJK UNIFIED IDEOGRAPH + {0xB9BA, 0x8D2D}, //9356 #CJK UNIFIED IDEOGRAPH + {0xB9BB, 0x591F}, //9357 #CJK UNIFIED IDEOGRAPH + {0xB9BC, 0x8F9C}, //9358 #CJK UNIFIED IDEOGRAPH + {0xB9BD, 0x83C7}, //9359 #CJK UNIFIED IDEOGRAPH + {0xB9BE, 0x5495}, //9360 #CJK UNIFIED IDEOGRAPH + {0xB9BF, 0x7B8D}, //9361 #CJK UNIFIED IDEOGRAPH + {0xB9C0, 0x4F30}, //9362 #CJK UNIFIED IDEOGRAPH + {0xB9C1, 0x6CBD}, //9363 #CJK UNIFIED IDEOGRAPH + {0xB9C2, 0x5B64}, //9364 #CJK UNIFIED IDEOGRAPH + {0xB9C3, 0x59D1}, //9365 #CJK UNIFIED IDEOGRAPH + {0xB9C4, 0x9F13}, //9366 #CJK UNIFIED IDEOGRAPH + {0xB9C5, 0x53E4}, //9367 #CJK UNIFIED IDEOGRAPH + {0xB9C6, 0x86CA}, //9368 #CJK UNIFIED IDEOGRAPH + {0xB9C7, 0x9AA8}, //9369 #CJK UNIFIED IDEOGRAPH + {0xB9C8, 0x8C37}, //9370 #CJK UNIFIED IDEOGRAPH + {0xB9C9, 0x80A1}, //9371 #CJK UNIFIED IDEOGRAPH + {0xB9CA, 0x6545}, //9372 #CJK UNIFIED IDEOGRAPH + {0xB9CB, 0x987E}, //9373 #CJK UNIFIED IDEOGRAPH + {0xB9CC, 0x56FA}, //9374 #CJK UNIFIED IDEOGRAPH + {0xB9CD, 0x96C7}, //9375 #CJK UNIFIED IDEOGRAPH + {0xB9CE, 0x522E}, //9376 #CJK UNIFIED IDEOGRAPH + {0xB9CF, 0x74DC}, //9377 #CJK UNIFIED IDEOGRAPH + {0xB9D0, 0x5250}, //9378 #CJK UNIFIED IDEOGRAPH + {0xB9D1, 0x5BE1}, //9379 #CJK UNIFIED IDEOGRAPH + {0xB9D2, 0x6302}, //9380 #CJK UNIFIED IDEOGRAPH + {0xB9D3, 0x8902}, //9381 #CJK UNIFIED IDEOGRAPH + {0xB9D4, 0x4E56}, //9382 #CJK UNIFIED IDEOGRAPH + {0xB9D5, 0x62D0}, //9383 #CJK UNIFIED IDEOGRAPH + {0xB9D6, 0x602A}, //9384 #CJK UNIFIED IDEOGRAPH + {0xB9D7, 0x68FA}, //9385 #CJK UNIFIED IDEOGRAPH + {0xB9D8, 0x5173}, //9386 #CJK UNIFIED IDEOGRAPH + {0xB9D9, 0x5B98}, //9387 #CJK UNIFIED IDEOGRAPH + {0xB9DA, 0x51A0}, //9388 #CJK UNIFIED IDEOGRAPH + {0xB9DB, 0x89C2}, //9389 #CJK UNIFIED IDEOGRAPH + {0xB9DC, 0x7BA1}, //9390 #CJK UNIFIED IDEOGRAPH + {0xB9DD, 0x9986}, //9391 #CJK UNIFIED IDEOGRAPH + {0xB9DE, 0x7F50}, //9392 #CJK UNIFIED IDEOGRAPH + {0xB9DF, 0x60EF}, //9393 #CJK UNIFIED IDEOGRAPH + {0xB9E0, 0x704C}, //9394 #CJK UNIFIED IDEOGRAPH + {0xB9E1, 0x8D2F}, //9395 #CJK UNIFIED IDEOGRAPH + {0xB9E2, 0x5149}, //9396 #CJK UNIFIED IDEOGRAPH + {0xB9E3, 0x5E7F}, //9397 #CJK UNIFIED IDEOGRAPH + {0xB9E4, 0x901B}, //9398 #CJK UNIFIED IDEOGRAPH + {0xB9E5, 0x7470}, //9399 #CJK UNIFIED IDEOGRAPH + {0xB9E6, 0x89C4}, //9400 #CJK UNIFIED IDEOGRAPH + {0xB9E7, 0x572D}, //9401 #CJK UNIFIED IDEOGRAPH + {0xB9E8, 0x7845}, //9402 #CJK UNIFIED IDEOGRAPH + {0xB9E9, 0x5F52}, //9403 #CJK UNIFIED IDEOGRAPH + {0xB9EA, 0x9F9F}, //9404 #CJK UNIFIED IDEOGRAPH + {0xB9EB, 0x95FA}, //9405 #CJK UNIFIED IDEOGRAPH + {0xB9EC, 0x8F68}, //9406 #CJK UNIFIED IDEOGRAPH + {0xB9ED, 0x9B3C}, //9407 #CJK UNIFIED IDEOGRAPH + {0xB9EE, 0x8BE1}, //9408 #CJK UNIFIED IDEOGRAPH + {0xB9EF, 0x7678}, //9409 #CJK UNIFIED IDEOGRAPH + {0xB9F0, 0x6842}, //9410 #CJK UNIFIED IDEOGRAPH + {0xB9F1, 0x67DC}, //9411 #CJK UNIFIED IDEOGRAPH + {0xB9F2, 0x8DEA}, //9412 #CJK UNIFIED IDEOGRAPH + {0xB9F3, 0x8D35}, //9413 #CJK UNIFIED IDEOGRAPH + {0xB9F4, 0x523D}, //9414 #CJK UNIFIED IDEOGRAPH + {0xB9F5, 0x8F8A}, //9415 #CJK UNIFIED IDEOGRAPH + {0xB9F6, 0x6EDA}, //9416 #CJK UNIFIED IDEOGRAPH + {0xB9F7, 0x68CD}, //9417 #CJK UNIFIED IDEOGRAPH + {0xB9F8, 0x9505}, //9418 #CJK UNIFIED IDEOGRAPH + {0xB9F9, 0x90ED}, //9419 #CJK UNIFIED IDEOGRAPH + {0xB9FA, 0x56FD}, //9420 #CJK UNIFIED IDEOGRAPH + {0xB9FB, 0x679C}, //9421 #CJK UNIFIED IDEOGRAPH + {0xB9FC, 0x88F9}, //9422 #CJK UNIFIED IDEOGRAPH + {0xB9FD, 0x8FC7}, //9423 #CJK UNIFIED IDEOGRAPH + {0xB9FE, 0x54C8}, //9424 #CJK UNIFIED IDEOGRAPH + {0xBA40, 0x7BC5}, //9425 #CJK UNIFIED IDEOGRAPH + {0xBA41, 0x7BC8}, //9426 #CJK UNIFIED IDEOGRAPH + {0xBA42, 0x7BC9}, //9427 #CJK UNIFIED IDEOGRAPH + {0xBA43, 0x7BCA}, //9428 #CJK UNIFIED IDEOGRAPH + {0xBA44, 0x7BCB}, //9429 #CJK UNIFIED IDEOGRAPH + {0xBA45, 0x7BCD}, //9430 #CJK UNIFIED IDEOGRAPH + {0xBA46, 0x7BCE}, //9431 #CJK UNIFIED IDEOGRAPH + {0xBA47, 0x7BCF}, //9432 #CJK UNIFIED IDEOGRAPH + {0xBA48, 0x7BD0}, //9433 #CJK UNIFIED IDEOGRAPH + {0xBA49, 0x7BD2}, //9434 #CJK UNIFIED IDEOGRAPH + {0xBA4A, 0x7BD4}, //9435 #CJK UNIFIED IDEOGRAPH + {0xBA4B, 0x7BD5}, //9436 #CJK UNIFIED IDEOGRAPH + {0xBA4C, 0x7BD6}, //9437 #CJK UNIFIED IDEOGRAPH + {0xBA4D, 0x7BD7}, //9438 #CJK UNIFIED IDEOGRAPH + {0xBA4E, 0x7BD8}, //9439 #CJK UNIFIED IDEOGRAPH + {0xBA4F, 0x7BDB}, //9440 #CJK UNIFIED IDEOGRAPH + {0xBA50, 0x7BDC}, //9441 #CJK UNIFIED IDEOGRAPH + {0xBA51, 0x7BDE}, //9442 #CJK UNIFIED IDEOGRAPH + {0xBA52, 0x7BDF}, //9443 #CJK UNIFIED IDEOGRAPH + {0xBA53, 0x7BE0}, //9444 #CJK UNIFIED IDEOGRAPH + {0xBA54, 0x7BE2}, //9445 #CJK UNIFIED IDEOGRAPH + {0xBA55, 0x7BE3}, //9446 #CJK UNIFIED IDEOGRAPH + {0xBA56, 0x7BE4}, //9447 #CJK UNIFIED IDEOGRAPH + {0xBA57, 0x7BE7}, //9448 #CJK UNIFIED IDEOGRAPH + {0xBA58, 0x7BE8}, //9449 #CJK UNIFIED IDEOGRAPH + {0xBA59, 0x7BE9}, //9450 #CJK UNIFIED IDEOGRAPH + {0xBA5A, 0x7BEB}, //9451 #CJK UNIFIED IDEOGRAPH + {0xBA5B, 0x7BEC}, //9452 #CJK UNIFIED IDEOGRAPH + {0xBA5C, 0x7BED}, //9453 #CJK UNIFIED IDEOGRAPH + {0xBA5D, 0x7BEF}, //9454 #CJK UNIFIED IDEOGRAPH + {0xBA5E, 0x7BF0}, //9455 #CJK UNIFIED IDEOGRAPH + {0xBA5F, 0x7BF2}, //9456 #CJK UNIFIED IDEOGRAPH + {0xBA60, 0x7BF3}, //9457 #CJK UNIFIED IDEOGRAPH + {0xBA61, 0x7BF4}, //9458 #CJK UNIFIED IDEOGRAPH + {0xBA62, 0x7BF5}, //9459 #CJK UNIFIED IDEOGRAPH + {0xBA63, 0x7BF6}, //9460 #CJK UNIFIED IDEOGRAPH + {0xBA64, 0x7BF8}, //9461 #CJK UNIFIED IDEOGRAPH + {0xBA65, 0x7BF9}, //9462 #CJK UNIFIED IDEOGRAPH + {0xBA66, 0x7BFA}, //9463 #CJK UNIFIED IDEOGRAPH + {0xBA67, 0x7BFB}, //9464 #CJK UNIFIED IDEOGRAPH + {0xBA68, 0x7BFD}, //9465 #CJK UNIFIED IDEOGRAPH + {0xBA69, 0x7BFF}, //9466 #CJK UNIFIED IDEOGRAPH + {0xBA6A, 0x7C00}, //9467 #CJK UNIFIED IDEOGRAPH + {0xBA6B, 0x7C01}, //9468 #CJK UNIFIED IDEOGRAPH + {0xBA6C, 0x7C02}, //9469 #CJK UNIFIED IDEOGRAPH + {0xBA6D, 0x7C03}, //9470 #CJK UNIFIED IDEOGRAPH + {0xBA6E, 0x7C04}, //9471 #CJK UNIFIED IDEOGRAPH + {0xBA6F, 0x7C05}, //9472 #CJK UNIFIED IDEOGRAPH + {0xBA70, 0x7C06}, //9473 #CJK UNIFIED IDEOGRAPH + {0xBA71, 0x7C08}, //9474 #CJK UNIFIED IDEOGRAPH + {0xBA72, 0x7C09}, //9475 #CJK UNIFIED IDEOGRAPH + {0xBA73, 0x7C0A}, //9476 #CJK UNIFIED IDEOGRAPH + {0xBA74, 0x7C0D}, //9477 #CJK UNIFIED IDEOGRAPH + {0xBA75, 0x7C0E}, //9478 #CJK UNIFIED IDEOGRAPH + {0xBA76, 0x7C10}, //9479 #CJK UNIFIED IDEOGRAPH + {0xBA77, 0x7C11}, //9480 #CJK UNIFIED IDEOGRAPH + {0xBA78, 0x7C12}, //9481 #CJK UNIFIED IDEOGRAPH + {0xBA79, 0x7C13}, //9482 #CJK UNIFIED IDEOGRAPH + {0xBA7A, 0x7C14}, //9483 #CJK UNIFIED IDEOGRAPH + {0xBA7B, 0x7C15}, //9484 #CJK UNIFIED IDEOGRAPH + {0xBA7C, 0x7C17}, //9485 #CJK UNIFIED IDEOGRAPH + {0xBA7D, 0x7C18}, //9486 #CJK UNIFIED IDEOGRAPH + {0xBA7E, 0x7C19}, //9487 #CJK UNIFIED IDEOGRAPH + {0xBA80, 0x7C1A}, //9488 #CJK UNIFIED IDEOGRAPH + {0xBA81, 0x7C1B}, //9489 #CJK UNIFIED IDEOGRAPH + {0xBA82, 0x7C1C}, //9490 #CJK UNIFIED IDEOGRAPH + {0xBA83, 0x7C1D}, //9491 #CJK UNIFIED IDEOGRAPH + {0xBA84, 0x7C1E}, //9492 #CJK UNIFIED IDEOGRAPH + {0xBA85, 0x7C20}, //9493 #CJK UNIFIED IDEOGRAPH + {0xBA86, 0x7C21}, //9494 #CJK UNIFIED IDEOGRAPH + {0xBA87, 0x7C22}, //9495 #CJK UNIFIED IDEOGRAPH + {0xBA88, 0x7C23}, //9496 #CJK UNIFIED IDEOGRAPH + {0xBA89, 0x7C24}, //9497 #CJK UNIFIED IDEOGRAPH + {0xBA8A, 0x7C25}, //9498 #CJK UNIFIED IDEOGRAPH + {0xBA8B, 0x7C28}, //9499 #CJK UNIFIED IDEOGRAPH + {0xBA8C, 0x7C29}, //9500 #CJK UNIFIED IDEOGRAPH + {0xBA8D, 0x7C2B}, //9501 #CJK UNIFIED IDEOGRAPH + {0xBA8E, 0x7C2C}, //9502 #CJK UNIFIED IDEOGRAPH + {0xBA8F, 0x7C2D}, //9503 #CJK UNIFIED IDEOGRAPH + {0xBA90, 0x7C2E}, //9504 #CJK UNIFIED IDEOGRAPH + {0xBA91, 0x7C2F}, //9505 #CJK UNIFIED IDEOGRAPH + {0xBA92, 0x7C30}, //9506 #CJK UNIFIED IDEOGRAPH + {0xBA93, 0x7C31}, //9507 #CJK UNIFIED IDEOGRAPH + {0xBA94, 0x7C32}, //9508 #CJK UNIFIED IDEOGRAPH + {0xBA95, 0x7C33}, //9509 #CJK UNIFIED IDEOGRAPH + {0xBA96, 0x7C34}, //9510 #CJK UNIFIED IDEOGRAPH + {0xBA97, 0x7C35}, //9511 #CJK UNIFIED IDEOGRAPH + {0xBA98, 0x7C36}, //9512 #CJK UNIFIED IDEOGRAPH + {0xBA99, 0x7C37}, //9513 #CJK UNIFIED IDEOGRAPH + {0xBA9A, 0x7C39}, //9514 #CJK UNIFIED IDEOGRAPH + {0xBA9B, 0x7C3A}, //9515 #CJK UNIFIED IDEOGRAPH + {0xBA9C, 0x7C3B}, //9516 #CJK UNIFIED IDEOGRAPH + {0xBA9D, 0x7C3C}, //9517 #CJK UNIFIED IDEOGRAPH + {0xBA9E, 0x7C3D}, //9518 #CJK UNIFIED IDEOGRAPH + {0xBA9F, 0x7C3E}, //9519 #CJK UNIFIED IDEOGRAPH + {0xBAA0, 0x7C42}, //9520 #CJK UNIFIED IDEOGRAPH + {0xBAA1, 0x9AB8}, //9521 #CJK UNIFIED IDEOGRAPH + {0xBAA2, 0x5B69}, //9522 #CJK UNIFIED IDEOGRAPH + {0xBAA3, 0x6D77}, //9523 #CJK UNIFIED IDEOGRAPH + {0xBAA4, 0x6C26}, //9524 #CJK UNIFIED IDEOGRAPH + {0xBAA5, 0x4EA5}, //9525 #CJK UNIFIED IDEOGRAPH + {0xBAA6, 0x5BB3}, //9526 #CJK UNIFIED IDEOGRAPH + {0xBAA7, 0x9A87}, //9527 #CJK UNIFIED IDEOGRAPH + {0xBAA8, 0x9163}, //9528 #CJK UNIFIED IDEOGRAPH + {0xBAA9, 0x61A8}, //9529 #CJK UNIFIED IDEOGRAPH + {0xBAAA, 0x90AF}, //9530 #CJK UNIFIED IDEOGRAPH + {0xBAAB, 0x97E9}, //9531 #CJK UNIFIED IDEOGRAPH + {0xBAAC, 0x542B}, //9532 #CJK UNIFIED IDEOGRAPH + {0xBAAD, 0x6DB5}, //9533 #CJK UNIFIED IDEOGRAPH + {0xBAAE, 0x5BD2}, //9534 #CJK UNIFIED IDEOGRAPH + {0xBAAF, 0x51FD}, //9535 #CJK UNIFIED IDEOGRAPH + {0xBAB0, 0x558A}, //9536 #CJK UNIFIED IDEOGRAPH + {0xBAB1, 0x7F55}, //9537 #CJK UNIFIED IDEOGRAPH + {0xBAB2, 0x7FF0}, //9538 #CJK UNIFIED IDEOGRAPH + {0xBAB3, 0x64BC}, //9539 #CJK UNIFIED IDEOGRAPH + {0xBAB4, 0x634D}, //9540 #CJK UNIFIED IDEOGRAPH + {0xBAB5, 0x65F1}, //9541 #CJK UNIFIED IDEOGRAPH + {0xBAB6, 0x61BE}, //9542 #CJK UNIFIED IDEOGRAPH + {0xBAB7, 0x608D}, //9543 #CJK UNIFIED IDEOGRAPH + {0xBAB8, 0x710A}, //9544 #CJK UNIFIED IDEOGRAPH + {0xBAB9, 0x6C57}, //9545 #CJK UNIFIED IDEOGRAPH + {0xBABA, 0x6C49}, //9546 #CJK UNIFIED IDEOGRAPH + {0xBABB, 0x592F}, //9547 #CJK UNIFIED IDEOGRAPH + {0xBABC, 0x676D}, //9548 #CJK UNIFIED IDEOGRAPH + {0xBABD, 0x822A}, //9549 #CJK UNIFIED IDEOGRAPH + {0xBABE, 0x58D5}, //9550 #CJK UNIFIED IDEOGRAPH + {0xBABF, 0x568E}, //9551 #CJK UNIFIED IDEOGRAPH + {0xBAC0, 0x8C6A}, //9552 #CJK UNIFIED IDEOGRAPH + {0xBAC1, 0x6BEB}, //9553 #CJK UNIFIED IDEOGRAPH + {0xBAC2, 0x90DD}, //9554 #CJK UNIFIED IDEOGRAPH + {0xBAC3, 0x597D}, //9555 #CJK UNIFIED IDEOGRAPH + {0xBAC4, 0x8017}, //9556 #CJK UNIFIED IDEOGRAPH + {0xBAC5, 0x53F7}, //9557 #CJK UNIFIED IDEOGRAPH + {0xBAC6, 0x6D69}, //9558 #CJK UNIFIED IDEOGRAPH + {0xBAC7, 0x5475}, //9559 #CJK UNIFIED IDEOGRAPH + {0xBAC8, 0x559D}, //9560 #CJK UNIFIED IDEOGRAPH + {0xBAC9, 0x8377}, //9561 #CJK UNIFIED IDEOGRAPH + {0xBACA, 0x83CF}, //9562 #CJK UNIFIED IDEOGRAPH + {0xBACB, 0x6838}, //9563 #CJK UNIFIED IDEOGRAPH + {0xBACC, 0x79BE}, //9564 #CJK UNIFIED IDEOGRAPH + {0xBACD, 0x548C}, //9565 #CJK UNIFIED IDEOGRAPH + {0xBACE, 0x4F55}, //9566 #CJK UNIFIED IDEOGRAPH + {0xBACF, 0x5408}, //9567 #CJK UNIFIED IDEOGRAPH + {0xBAD0, 0x76D2}, //9568 #CJK UNIFIED IDEOGRAPH + {0xBAD1, 0x8C89}, //9569 #CJK UNIFIED IDEOGRAPH + {0xBAD2, 0x9602}, //9570 #CJK UNIFIED IDEOGRAPH + {0xBAD3, 0x6CB3}, //9571 #CJK UNIFIED IDEOGRAPH + {0xBAD4, 0x6DB8}, //9572 #CJK UNIFIED IDEOGRAPH + {0xBAD5, 0x8D6B}, //9573 #CJK UNIFIED IDEOGRAPH + {0xBAD6, 0x8910}, //9574 #CJK UNIFIED IDEOGRAPH + {0xBAD7, 0x9E64}, //9575 #CJK UNIFIED IDEOGRAPH + {0xBAD8, 0x8D3A}, //9576 #CJK UNIFIED IDEOGRAPH + {0xBAD9, 0x563F}, //9577 #CJK UNIFIED IDEOGRAPH + {0xBADA, 0x9ED1}, //9578 #CJK UNIFIED IDEOGRAPH + {0xBADB, 0x75D5}, //9579 #CJK UNIFIED IDEOGRAPH + {0xBADC, 0x5F88}, //9580 #CJK UNIFIED IDEOGRAPH + {0xBADD, 0x72E0}, //9581 #CJK UNIFIED IDEOGRAPH + {0xBADE, 0x6068}, //9582 #CJK UNIFIED IDEOGRAPH + {0xBADF, 0x54FC}, //9583 #CJK UNIFIED IDEOGRAPH + {0xBAE0, 0x4EA8}, //9584 #CJK UNIFIED IDEOGRAPH + {0xBAE1, 0x6A2A}, //9585 #CJK UNIFIED IDEOGRAPH + {0xBAE2, 0x8861}, //9586 #CJK UNIFIED IDEOGRAPH + {0xBAE3, 0x6052}, //9587 #CJK UNIFIED IDEOGRAPH + {0xBAE4, 0x8F70}, //9588 #CJK UNIFIED IDEOGRAPH + {0xBAE5, 0x54C4}, //9589 #CJK UNIFIED IDEOGRAPH + {0xBAE6, 0x70D8}, //9590 #CJK UNIFIED IDEOGRAPH + {0xBAE7, 0x8679}, //9591 #CJK UNIFIED IDEOGRAPH + {0xBAE8, 0x9E3F}, //9592 #CJK UNIFIED IDEOGRAPH + {0xBAE9, 0x6D2A}, //9593 #CJK UNIFIED IDEOGRAPH + {0xBAEA, 0x5B8F}, //9594 #CJK UNIFIED IDEOGRAPH + {0xBAEB, 0x5F18}, //9595 #CJK UNIFIED IDEOGRAPH + {0xBAEC, 0x7EA2}, //9596 #CJK UNIFIED IDEOGRAPH + {0xBAED, 0x5589}, //9597 #CJK UNIFIED IDEOGRAPH + {0xBAEE, 0x4FAF}, //9598 #CJK UNIFIED IDEOGRAPH + {0xBAEF, 0x7334}, //9599 #CJK UNIFIED IDEOGRAPH + {0xBAF0, 0x543C}, //9600 #CJK UNIFIED IDEOGRAPH + {0xBAF1, 0x539A}, //9601 #CJK UNIFIED IDEOGRAPH + {0xBAF2, 0x5019}, //9602 #CJK UNIFIED IDEOGRAPH + {0xBAF3, 0x540E}, //9603 #CJK UNIFIED IDEOGRAPH + {0xBAF4, 0x547C}, //9604 #CJK UNIFIED IDEOGRAPH + {0xBAF5, 0x4E4E}, //9605 #CJK UNIFIED IDEOGRAPH + {0xBAF6, 0x5FFD}, //9606 #CJK UNIFIED IDEOGRAPH + {0xBAF7, 0x745A}, //9607 #CJK UNIFIED IDEOGRAPH + {0xBAF8, 0x58F6}, //9608 #CJK UNIFIED IDEOGRAPH + {0xBAF9, 0x846B}, //9609 #CJK UNIFIED IDEOGRAPH + {0xBAFA, 0x80E1}, //9610 #CJK UNIFIED IDEOGRAPH + {0xBAFB, 0x8774}, //9611 #CJK UNIFIED IDEOGRAPH + {0xBAFC, 0x72D0}, //9612 #CJK UNIFIED IDEOGRAPH + {0xBAFD, 0x7CCA}, //9613 #CJK UNIFIED IDEOGRAPH + {0xBAFE, 0x6E56}, //9614 #CJK UNIFIED IDEOGRAPH + {0xBB40, 0x7C43}, //9615 #CJK UNIFIED IDEOGRAPH + {0xBB41, 0x7C44}, //9616 #CJK UNIFIED IDEOGRAPH + {0xBB42, 0x7C45}, //9617 #CJK UNIFIED IDEOGRAPH + {0xBB43, 0x7C46}, //9618 #CJK UNIFIED IDEOGRAPH + {0xBB44, 0x7C47}, //9619 #CJK UNIFIED IDEOGRAPH + {0xBB45, 0x7C48}, //9620 #CJK UNIFIED IDEOGRAPH + {0xBB46, 0x7C49}, //9621 #CJK UNIFIED IDEOGRAPH + {0xBB47, 0x7C4A}, //9622 #CJK UNIFIED IDEOGRAPH + {0xBB48, 0x7C4B}, //9623 #CJK UNIFIED IDEOGRAPH + {0xBB49, 0x7C4C}, //9624 #CJK UNIFIED IDEOGRAPH + {0xBB4A, 0x7C4E}, //9625 #CJK UNIFIED IDEOGRAPH + {0xBB4B, 0x7C4F}, //9626 #CJK UNIFIED IDEOGRAPH + {0xBB4C, 0x7C50}, //9627 #CJK UNIFIED IDEOGRAPH + {0xBB4D, 0x7C51}, //9628 #CJK UNIFIED IDEOGRAPH + {0xBB4E, 0x7C52}, //9629 #CJK UNIFIED IDEOGRAPH + {0xBB4F, 0x7C53}, //9630 #CJK UNIFIED IDEOGRAPH + {0xBB50, 0x7C54}, //9631 #CJK UNIFIED IDEOGRAPH + {0xBB51, 0x7C55}, //9632 #CJK UNIFIED IDEOGRAPH + {0xBB52, 0x7C56}, //9633 #CJK UNIFIED IDEOGRAPH + {0xBB53, 0x7C57}, //9634 #CJK UNIFIED IDEOGRAPH + {0xBB54, 0x7C58}, //9635 #CJK UNIFIED IDEOGRAPH + {0xBB55, 0x7C59}, //9636 #CJK UNIFIED IDEOGRAPH + {0xBB56, 0x7C5A}, //9637 #CJK UNIFIED IDEOGRAPH + {0xBB57, 0x7C5B}, //9638 #CJK UNIFIED IDEOGRAPH + {0xBB58, 0x7C5C}, //9639 #CJK UNIFIED IDEOGRAPH + {0xBB59, 0x7C5D}, //9640 #CJK UNIFIED IDEOGRAPH + {0xBB5A, 0x7C5E}, //9641 #CJK UNIFIED IDEOGRAPH + {0xBB5B, 0x7C5F}, //9642 #CJK UNIFIED IDEOGRAPH + {0xBB5C, 0x7C60}, //9643 #CJK UNIFIED IDEOGRAPH + {0xBB5D, 0x7C61}, //9644 #CJK UNIFIED IDEOGRAPH + {0xBB5E, 0x7C62}, //9645 #CJK UNIFIED IDEOGRAPH + {0xBB5F, 0x7C63}, //9646 #CJK UNIFIED IDEOGRAPH + {0xBB60, 0x7C64}, //9647 #CJK UNIFIED IDEOGRAPH + {0xBB61, 0x7C65}, //9648 #CJK UNIFIED IDEOGRAPH + {0xBB62, 0x7C66}, //9649 #CJK UNIFIED IDEOGRAPH + {0xBB63, 0x7C67}, //9650 #CJK UNIFIED IDEOGRAPH + {0xBB64, 0x7C68}, //9651 #CJK UNIFIED IDEOGRAPH + {0xBB65, 0x7C69}, //9652 #CJK UNIFIED IDEOGRAPH + {0xBB66, 0x7C6A}, //9653 #CJK UNIFIED IDEOGRAPH + {0xBB67, 0x7C6B}, //9654 #CJK UNIFIED IDEOGRAPH + {0xBB68, 0x7C6C}, //9655 #CJK UNIFIED IDEOGRAPH + {0xBB69, 0x7C6D}, //9656 #CJK UNIFIED IDEOGRAPH + {0xBB6A, 0x7C6E}, //9657 #CJK UNIFIED IDEOGRAPH + {0xBB6B, 0x7C6F}, //9658 #CJK UNIFIED IDEOGRAPH + {0xBB6C, 0x7C70}, //9659 #CJK UNIFIED IDEOGRAPH + {0xBB6D, 0x7C71}, //9660 #CJK UNIFIED IDEOGRAPH + {0xBB6E, 0x7C72}, //9661 #CJK UNIFIED IDEOGRAPH + {0xBB6F, 0x7C75}, //9662 #CJK UNIFIED IDEOGRAPH + {0xBB70, 0x7C76}, //9663 #CJK UNIFIED IDEOGRAPH + {0xBB71, 0x7C77}, //9664 #CJK UNIFIED IDEOGRAPH + {0xBB72, 0x7C78}, //9665 #CJK UNIFIED IDEOGRAPH + {0xBB73, 0x7C79}, //9666 #CJK UNIFIED IDEOGRAPH + {0xBB74, 0x7C7A}, //9667 #CJK UNIFIED IDEOGRAPH + {0xBB75, 0x7C7E}, //9668 #CJK UNIFIED IDEOGRAPH + {0xBB76, 0x7C7F}, //9669 #CJK UNIFIED IDEOGRAPH + {0xBB77, 0x7C80}, //9670 #CJK UNIFIED IDEOGRAPH + {0xBB78, 0x7C81}, //9671 #CJK UNIFIED IDEOGRAPH + {0xBB79, 0x7C82}, //9672 #CJK UNIFIED IDEOGRAPH + {0xBB7A, 0x7C83}, //9673 #CJK UNIFIED IDEOGRAPH + {0xBB7B, 0x7C84}, //9674 #CJK UNIFIED IDEOGRAPH + {0xBB7C, 0x7C85}, //9675 #CJK UNIFIED IDEOGRAPH + {0xBB7D, 0x7C86}, //9676 #CJK UNIFIED IDEOGRAPH + {0xBB7E, 0x7C87}, //9677 #CJK UNIFIED IDEOGRAPH + {0xBB80, 0x7C88}, //9678 #CJK UNIFIED IDEOGRAPH + {0xBB81, 0x7C8A}, //9679 #CJK UNIFIED IDEOGRAPH + {0xBB82, 0x7C8B}, //9680 #CJK UNIFIED IDEOGRAPH + {0xBB83, 0x7C8C}, //9681 #CJK UNIFIED IDEOGRAPH + {0xBB84, 0x7C8D}, //9682 #CJK UNIFIED IDEOGRAPH + {0xBB85, 0x7C8E}, //9683 #CJK UNIFIED IDEOGRAPH + {0xBB86, 0x7C8F}, //9684 #CJK UNIFIED IDEOGRAPH + {0xBB87, 0x7C90}, //9685 #CJK UNIFIED IDEOGRAPH + {0xBB88, 0x7C93}, //9686 #CJK UNIFIED IDEOGRAPH + {0xBB89, 0x7C94}, //9687 #CJK UNIFIED IDEOGRAPH + {0xBB8A, 0x7C96}, //9688 #CJK UNIFIED IDEOGRAPH + {0xBB8B, 0x7C99}, //9689 #CJK UNIFIED IDEOGRAPH + {0xBB8C, 0x7C9A}, //9690 #CJK UNIFIED IDEOGRAPH + {0xBB8D, 0x7C9B}, //9691 #CJK UNIFIED IDEOGRAPH + {0xBB8E, 0x7CA0}, //9692 #CJK UNIFIED IDEOGRAPH + {0xBB8F, 0x7CA1}, //9693 #CJK UNIFIED IDEOGRAPH + {0xBB90, 0x7CA3}, //9694 #CJK UNIFIED IDEOGRAPH + {0xBB91, 0x7CA6}, //9695 #CJK UNIFIED IDEOGRAPH + {0xBB92, 0x7CA7}, //9696 #CJK UNIFIED IDEOGRAPH + {0xBB93, 0x7CA8}, //9697 #CJK UNIFIED IDEOGRAPH + {0xBB94, 0x7CA9}, //9698 #CJK UNIFIED IDEOGRAPH + {0xBB95, 0x7CAB}, //9699 #CJK UNIFIED IDEOGRAPH + {0xBB96, 0x7CAC}, //9700 #CJK UNIFIED IDEOGRAPH + {0xBB97, 0x7CAD}, //9701 #CJK UNIFIED IDEOGRAPH + {0xBB98, 0x7CAF}, //9702 #CJK UNIFIED IDEOGRAPH + {0xBB99, 0x7CB0}, //9703 #CJK UNIFIED IDEOGRAPH + {0xBB9A, 0x7CB4}, //9704 #CJK UNIFIED IDEOGRAPH + {0xBB9B, 0x7CB5}, //9705 #CJK UNIFIED IDEOGRAPH + {0xBB9C, 0x7CB6}, //9706 #CJK UNIFIED IDEOGRAPH + {0xBB9D, 0x7CB7}, //9707 #CJK UNIFIED IDEOGRAPH + {0xBB9E, 0x7CB8}, //9708 #CJK UNIFIED IDEOGRAPH + {0xBB9F, 0x7CBA}, //9709 #CJK UNIFIED IDEOGRAPH + {0xBBA0, 0x7CBB}, //9710 #CJK UNIFIED IDEOGRAPH + {0xBBA1, 0x5F27}, //9711 #CJK UNIFIED IDEOGRAPH + {0xBBA2, 0x864E}, //9712 #CJK UNIFIED IDEOGRAPH + {0xBBA3, 0x552C}, //9713 #CJK UNIFIED IDEOGRAPH + {0xBBA4, 0x62A4}, //9714 #CJK UNIFIED IDEOGRAPH + {0xBBA5, 0x4E92}, //9715 #CJK UNIFIED IDEOGRAPH + {0xBBA6, 0x6CAA}, //9716 #CJK UNIFIED IDEOGRAPH + {0xBBA7, 0x6237}, //9717 #CJK UNIFIED IDEOGRAPH + {0xBBA8, 0x82B1}, //9718 #CJK UNIFIED IDEOGRAPH + {0xBBA9, 0x54D7}, //9719 #CJK UNIFIED IDEOGRAPH + {0xBBAA, 0x534E}, //9720 #CJK UNIFIED IDEOGRAPH + {0xBBAB, 0x733E}, //9721 #CJK UNIFIED IDEOGRAPH + {0xBBAC, 0x6ED1}, //9722 #CJK UNIFIED IDEOGRAPH + {0xBBAD, 0x753B}, //9723 #CJK UNIFIED IDEOGRAPH + {0xBBAE, 0x5212}, //9724 #CJK UNIFIED IDEOGRAPH + {0xBBAF, 0x5316}, //9725 #CJK UNIFIED IDEOGRAPH + {0xBBB0, 0x8BDD}, //9726 #CJK UNIFIED IDEOGRAPH + {0xBBB1, 0x69D0}, //9727 #CJK UNIFIED IDEOGRAPH + {0xBBB2, 0x5F8A}, //9728 #CJK UNIFIED IDEOGRAPH + {0xBBB3, 0x6000}, //9729 #CJK UNIFIED IDEOGRAPH + {0xBBB4, 0x6DEE}, //9730 #CJK UNIFIED IDEOGRAPH + {0xBBB5, 0x574F}, //9731 #CJK UNIFIED IDEOGRAPH + {0xBBB6, 0x6B22}, //9732 #CJK UNIFIED IDEOGRAPH + {0xBBB7, 0x73AF}, //9733 #CJK UNIFIED IDEOGRAPH + {0xBBB8, 0x6853}, //9734 #CJK UNIFIED IDEOGRAPH + {0xBBB9, 0x8FD8}, //9735 #CJK UNIFIED IDEOGRAPH + {0xBBBA, 0x7F13}, //9736 #CJK UNIFIED IDEOGRAPH + {0xBBBB, 0x6362}, //9737 #CJK UNIFIED IDEOGRAPH + {0xBBBC, 0x60A3}, //9738 #CJK UNIFIED IDEOGRAPH + {0xBBBD, 0x5524}, //9739 #CJK UNIFIED IDEOGRAPH + {0xBBBE, 0x75EA}, //9740 #CJK UNIFIED IDEOGRAPH + {0xBBBF, 0x8C62}, //9741 #CJK UNIFIED IDEOGRAPH + {0xBBC0, 0x7115}, //9742 #CJK UNIFIED IDEOGRAPH + {0xBBC1, 0x6DA3}, //9743 #CJK UNIFIED IDEOGRAPH + {0xBBC2, 0x5BA6}, //9744 #CJK UNIFIED IDEOGRAPH + {0xBBC3, 0x5E7B}, //9745 #CJK UNIFIED IDEOGRAPH + {0xBBC4, 0x8352}, //9746 #CJK UNIFIED IDEOGRAPH + {0xBBC5, 0x614C}, //9747 #CJK UNIFIED IDEOGRAPH + {0xBBC6, 0x9EC4}, //9748 #CJK UNIFIED IDEOGRAPH + {0xBBC7, 0x78FA}, //9749 #CJK UNIFIED IDEOGRAPH + {0xBBC8, 0x8757}, //9750 #CJK UNIFIED IDEOGRAPH + {0xBBC9, 0x7C27}, //9751 #CJK UNIFIED IDEOGRAPH + {0xBBCA, 0x7687}, //9752 #CJK UNIFIED IDEOGRAPH + {0xBBCB, 0x51F0}, //9753 #CJK UNIFIED IDEOGRAPH + {0xBBCC, 0x60F6}, //9754 #CJK UNIFIED IDEOGRAPH + {0xBBCD, 0x714C}, //9755 #CJK UNIFIED IDEOGRAPH + {0xBBCE, 0x6643}, //9756 #CJK UNIFIED IDEOGRAPH + {0xBBCF, 0x5E4C}, //9757 #CJK UNIFIED IDEOGRAPH + {0xBBD0, 0x604D}, //9758 #CJK UNIFIED IDEOGRAPH + {0xBBD1, 0x8C0E}, //9759 #CJK UNIFIED IDEOGRAPH + {0xBBD2, 0x7070}, //9760 #CJK UNIFIED IDEOGRAPH + {0xBBD3, 0x6325}, //9761 #CJK UNIFIED IDEOGRAPH + {0xBBD4, 0x8F89}, //9762 #CJK UNIFIED IDEOGRAPH + {0xBBD5, 0x5FBD}, //9763 #CJK UNIFIED IDEOGRAPH + {0xBBD6, 0x6062}, //9764 #CJK UNIFIED IDEOGRAPH + {0xBBD7, 0x86D4}, //9765 #CJK UNIFIED IDEOGRAPH + {0xBBD8, 0x56DE}, //9766 #CJK UNIFIED IDEOGRAPH + {0xBBD9, 0x6BC1}, //9767 #CJK UNIFIED IDEOGRAPH + {0xBBDA, 0x6094}, //9768 #CJK UNIFIED IDEOGRAPH + {0xBBDB, 0x6167}, //9769 #CJK UNIFIED IDEOGRAPH + {0xBBDC, 0x5349}, //9770 #CJK UNIFIED IDEOGRAPH + {0xBBDD, 0x60E0}, //9771 #CJK UNIFIED IDEOGRAPH + {0xBBDE, 0x6666}, //9772 #CJK UNIFIED IDEOGRAPH + {0xBBDF, 0x8D3F}, //9773 #CJK UNIFIED IDEOGRAPH + {0xBBE0, 0x79FD}, //9774 #CJK UNIFIED IDEOGRAPH + {0xBBE1, 0x4F1A}, //9775 #CJK UNIFIED IDEOGRAPH + {0xBBE2, 0x70E9}, //9776 #CJK UNIFIED IDEOGRAPH + {0xBBE3, 0x6C47}, //9777 #CJK UNIFIED IDEOGRAPH + {0xBBE4, 0x8BB3}, //9778 #CJK UNIFIED IDEOGRAPH + {0xBBE5, 0x8BF2}, //9779 #CJK UNIFIED IDEOGRAPH + {0xBBE6, 0x7ED8}, //9780 #CJK UNIFIED IDEOGRAPH + {0xBBE7, 0x8364}, //9781 #CJK UNIFIED IDEOGRAPH + {0xBBE8, 0x660F}, //9782 #CJK UNIFIED IDEOGRAPH + {0xBBE9, 0x5A5A}, //9783 #CJK UNIFIED IDEOGRAPH + {0xBBEA, 0x9B42}, //9784 #CJK UNIFIED IDEOGRAPH + {0xBBEB, 0x6D51}, //9785 #CJK UNIFIED IDEOGRAPH + {0xBBEC, 0x6DF7}, //9786 #CJK UNIFIED IDEOGRAPH + {0xBBED, 0x8C41}, //9787 #CJK UNIFIED IDEOGRAPH + {0xBBEE, 0x6D3B}, //9788 #CJK UNIFIED IDEOGRAPH + {0xBBEF, 0x4F19}, //9789 #CJK UNIFIED IDEOGRAPH + {0xBBF0, 0x706B}, //9790 #CJK UNIFIED IDEOGRAPH + {0xBBF1, 0x83B7}, //9791 #CJK UNIFIED IDEOGRAPH + {0xBBF2, 0x6216}, //9792 #CJK UNIFIED IDEOGRAPH + {0xBBF3, 0x60D1}, //9793 #CJK UNIFIED IDEOGRAPH + {0xBBF4, 0x970D}, //9794 #CJK UNIFIED IDEOGRAPH + {0xBBF5, 0x8D27}, //9795 #CJK UNIFIED IDEOGRAPH + {0xBBF6, 0x7978}, //9796 #CJK UNIFIED IDEOGRAPH + {0xBBF7, 0x51FB}, //9797 #CJK UNIFIED IDEOGRAPH + {0xBBF8, 0x573E}, //9798 #CJK UNIFIED IDEOGRAPH + {0xBBF9, 0x57FA}, //9799 #CJK UNIFIED IDEOGRAPH + {0xBBFA, 0x673A}, //9800 #CJK UNIFIED IDEOGRAPH + {0xBBFB, 0x7578}, //9801 #CJK UNIFIED IDEOGRAPH + {0xBBFC, 0x7A3D}, //9802 #CJK UNIFIED IDEOGRAPH + {0xBBFD, 0x79EF}, //9803 #CJK UNIFIED IDEOGRAPH + {0xBBFE, 0x7B95}, //9804 #CJK UNIFIED IDEOGRAPH + {0xBC40, 0x7CBF}, //9805 #CJK UNIFIED IDEOGRAPH + {0xBC41, 0x7CC0}, //9806 #CJK UNIFIED IDEOGRAPH + {0xBC42, 0x7CC2}, //9807 #CJK UNIFIED IDEOGRAPH + {0xBC43, 0x7CC3}, //9808 #CJK UNIFIED IDEOGRAPH + {0xBC44, 0x7CC4}, //9809 #CJK UNIFIED IDEOGRAPH + {0xBC45, 0x7CC6}, //9810 #CJK UNIFIED IDEOGRAPH + {0xBC46, 0x7CC9}, //9811 #CJK UNIFIED IDEOGRAPH + {0xBC47, 0x7CCB}, //9812 #CJK UNIFIED IDEOGRAPH + {0xBC48, 0x7CCE}, //9813 #CJK UNIFIED IDEOGRAPH + {0xBC49, 0x7CCF}, //9814 #CJK UNIFIED IDEOGRAPH + {0xBC4A, 0x7CD0}, //9815 #CJK UNIFIED IDEOGRAPH + {0xBC4B, 0x7CD1}, //9816 #CJK UNIFIED IDEOGRAPH + {0xBC4C, 0x7CD2}, //9817 #CJK UNIFIED IDEOGRAPH + {0xBC4D, 0x7CD3}, //9818 #CJK UNIFIED IDEOGRAPH + {0xBC4E, 0x7CD4}, //9819 #CJK UNIFIED IDEOGRAPH + {0xBC4F, 0x7CD8}, //9820 #CJK UNIFIED IDEOGRAPH + {0xBC50, 0x7CDA}, //9821 #CJK UNIFIED IDEOGRAPH + {0xBC51, 0x7CDB}, //9822 #CJK UNIFIED IDEOGRAPH + {0xBC52, 0x7CDD}, //9823 #CJK UNIFIED IDEOGRAPH + {0xBC53, 0x7CDE}, //9824 #CJK UNIFIED IDEOGRAPH + {0xBC54, 0x7CE1}, //9825 #CJK UNIFIED IDEOGRAPH + {0xBC55, 0x7CE2}, //9826 #CJK UNIFIED IDEOGRAPH + {0xBC56, 0x7CE3}, //9827 #CJK UNIFIED IDEOGRAPH + {0xBC57, 0x7CE4}, //9828 #CJK UNIFIED IDEOGRAPH + {0xBC58, 0x7CE5}, //9829 #CJK UNIFIED IDEOGRAPH + {0xBC59, 0x7CE6}, //9830 #CJK UNIFIED IDEOGRAPH + {0xBC5A, 0x7CE7}, //9831 #CJK UNIFIED IDEOGRAPH + {0xBC5B, 0x7CE9}, //9832 #CJK UNIFIED IDEOGRAPH + {0xBC5C, 0x7CEA}, //9833 #CJK UNIFIED IDEOGRAPH + {0xBC5D, 0x7CEB}, //9834 #CJK UNIFIED IDEOGRAPH + {0xBC5E, 0x7CEC}, //9835 #CJK UNIFIED IDEOGRAPH + {0xBC5F, 0x7CED}, //9836 #CJK UNIFIED IDEOGRAPH + {0xBC60, 0x7CEE}, //9837 #CJK UNIFIED IDEOGRAPH + {0xBC61, 0x7CF0}, //9838 #CJK UNIFIED IDEOGRAPH + {0xBC62, 0x7CF1}, //9839 #CJK UNIFIED IDEOGRAPH + {0xBC63, 0x7CF2}, //9840 #CJK UNIFIED IDEOGRAPH + {0xBC64, 0x7CF3}, //9841 #CJK UNIFIED IDEOGRAPH + {0xBC65, 0x7CF4}, //9842 #CJK UNIFIED IDEOGRAPH + {0xBC66, 0x7CF5}, //9843 #CJK UNIFIED IDEOGRAPH + {0xBC67, 0x7CF6}, //9844 #CJK UNIFIED IDEOGRAPH + {0xBC68, 0x7CF7}, //9845 #CJK UNIFIED IDEOGRAPH + {0xBC69, 0x7CF9}, //9846 #CJK UNIFIED IDEOGRAPH + {0xBC6A, 0x7CFA}, //9847 #CJK UNIFIED IDEOGRAPH + {0xBC6B, 0x7CFC}, //9848 #CJK UNIFIED IDEOGRAPH + {0xBC6C, 0x7CFD}, //9849 #CJK UNIFIED IDEOGRAPH + {0xBC6D, 0x7CFE}, //9850 #CJK UNIFIED IDEOGRAPH + {0xBC6E, 0x7CFF}, //9851 #CJK UNIFIED IDEOGRAPH + {0xBC6F, 0x7D00}, //9852 #CJK UNIFIED IDEOGRAPH + {0xBC70, 0x7D01}, //9853 #CJK UNIFIED IDEOGRAPH + {0xBC71, 0x7D02}, //9854 #CJK UNIFIED IDEOGRAPH + {0xBC72, 0x7D03}, //9855 #CJK UNIFIED IDEOGRAPH + {0xBC73, 0x7D04}, //9856 #CJK UNIFIED IDEOGRAPH + {0xBC74, 0x7D05}, //9857 #CJK UNIFIED IDEOGRAPH + {0xBC75, 0x7D06}, //9858 #CJK UNIFIED IDEOGRAPH + {0xBC76, 0x7D07}, //9859 #CJK UNIFIED IDEOGRAPH + {0xBC77, 0x7D08}, //9860 #CJK UNIFIED IDEOGRAPH + {0xBC78, 0x7D09}, //9861 #CJK UNIFIED IDEOGRAPH + {0xBC79, 0x7D0B}, //9862 #CJK UNIFIED IDEOGRAPH + {0xBC7A, 0x7D0C}, //9863 #CJK UNIFIED IDEOGRAPH + {0xBC7B, 0x7D0D}, //9864 #CJK UNIFIED IDEOGRAPH + {0xBC7C, 0x7D0E}, //9865 #CJK UNIFIED IDEOGRAPH + {0xBC7D, 0x7D0F}, //9866 #CJK UNIFIED IDEOGRAPH + {0xBC7E, 0x7D10}, //9867 #CJK UNIFIED IDEOGRAPH + {0xBC80, 0x7D11}, //9868 #CJK UNIFIED IDEOGRAPH + {0xBC81, 0x7D12}, //9869 #CJK UNIFIED IDEOGRAPH + {0xBC82, 0x7D13}, //9870 #CJK UNIFIED IDEOGRAPH + {0xBC83, 0x7D14}, //9871 #CJK UNIFIED IDEOGRAPH + {0xBC84, 0x7D15}, //9872 #CJK UNIFIED IDEOGRAPH + {0xBC85, 0x7D16}, //9873 #CJK UNIFIED IDEOGRAPH + {0xBC86, 0x7D17}, //9874 #CJK UNIFIED IDEOGRAPH + {0xBC87, 0x7D18}, //9875 #CJK UNIFIED IDEOGRAPH + {0xBC88, 0x7D19}, //9876 #CJK UNIFIED IDEOGRAPH + {0xBC89, 0x7D1A}, //9877 #CJK UNIFIED IDEOGRAPH + {0xBC8A, 0x7D1B}, //9878 #CJK UNIFIED IDEOGRAPH + {0xBC8B, 0x7D1C}, //9879 #CJK UNIFIED IDEOGRAPH + {0xBC8C, 0x7D1D}, //9880 #CJK UNIFIED IDEOGRAPH + {0xBC8D, 0x7D1E}, //9881 #CJK UNIFIED IDEOGRAPH + {0xBC8E, 0x7D1F}, //9882 #CJK UNIFIED IDEOGRAPH + {0xBC8F, 0x7D21}, //9883 #CJK UNIFIED IDEOGRAPH + {0xBC90, 0x7D23}, //9884 #CJK UNIFIED IDEOGRAPH + {0xBC91, 0x7D24}, //9885 #CJK UNIFIED IDEOGRAPH + {0xBC92, 0x7D25}, //9886 #CJK UNIFIED IDEOGRAPH + {0xBC93, 0x7D26}, //9887 #CJK UNIFIED IDEOGRAPH + {0xBC94, 0x7D28}, //9888 #CJK UNIFIED IDEOGRAPH + {0xBC95, 0x7D29}, //9889 #CJK UNIFIED IDEOGRAPH + {0xBC96, 0x7D2A}, //9890 #CJK UNIFIED IDEOGRAPH + {0xBC97, 0x7D2C}, //9891 #CJK UNIFIED IDEOGRAPH + {0xBC98, 0x7D2D}, //9892 #CJK UNIFIED IDEOGRAPH + {0xBC99, 0x7D2E}, //9893 #CJK UNIFIED IDEOGRAPH + {0xBC9A, 0x7D30}, //9894 #CJK UNIFIED IDEOGRAPH + {0xBC9B, 0x7D31}, //9895 #CJK UNIFIED IDEOGRAPH + {0xBC9C, 0x7D32}, //9896 #CJK UNIFIED IDEOGRAPH + {0xBC9D, 0x7D33}, //9897 #CJK UNIFIED IDEOGRAPH + {0xBC9E, 0x7D34}, //9898 #CJK UNIFIED IDEOGRAPH + {0xBC9F, 0x7D35}, //9899 #CJK UNIFIED IDEOGRAPH + {0xBCA0, 0x7D36}, //9900 #CJK UNIFIED IDEOGRAPH + {0xBCA1, 0x808C}, //9901 #CJK UNIFIED IDEOGRAPH + {0xBCA2, 0x9965}, //9902 #CJK UNIFIED IDEOGRAPH + {0xBCA3, 0x8FF9}, //9903 #CJK UNIFIED IDEOGRAPH + {0xBCA4, 0x6FC0}, //9904 #CJK UNIFIED IDEOGRAPH + {0xBCA5, 0x8BA5}, //9905 #CJK UNIFIED IDEOGRAPH + {0xBCA6, 0x9E21}, //9906 #CJK UNIFIED IDEOGRAPH + {0xBCA7, 0x59EC}, //9907 #CJK UNIFIED IDEOGRAPH + {0xBCA8, 0x7EE9}, //9908 #CJK UNIFIED IDEOGRAPH + {0xBCA9, 0x7F09}, //9909 #CJK UNIFIED IDEOGRAPH + {0xBCAA, 0x5409}, //9910 #CJK UNIFIED IDEOGRAPH + {0xBCAB, 0x6781}, //9911 #CJK UNIFIED IDEOGRAPH + {0xBCAC, 0x68D8}, //9912 #CJK UNIFIED IDEOGRAPH + {0xBCAD, 0x8F91}, //9913 #CJK UNIFIED IDEOGRAPH + {0xBCAE, 0x7C4D}, //9914 #CJK UNIFIED IDEOGRAPH + {0xBCAF, 0x96C6}, //9915 #CJK UNIFIED IDEOGRAPH + {0xBCB0, 0x53CA}, //9916 #CJK UNIFIED IDEOGRAPH + {0xBCB1, 0x6025}, //9917 #CJK UNIFIED IDEOGRAPH + {0xBCB2, 0x75BE}, //9918 #CJK UNIFIED IDEOGRAPH + {0xBCB3, 0x6C72}, //9919 #CJK UNIFIED IDEOGRAPH + {0xBCB4, 0x5373}, //9920 #CJK UNIFIED IDEOGRAPH + {0xBCB5, 0x5AC9}, //9921 #CJK UNIFIED IDEOGRAPH + {0xBCB6, 0x7EA7}, //9922 #CJK UNIFIED IDEOGRAPH + {0xBCB7, 0x6324}, //9923 #CJK UNIFIED IDEOGRAPH + {0xBCB8, 0x51E0}, //9924 #CJK UNIFIED IDEOGRAPH + {0xBCB9, 0x810A}, //9925 #CJK UNIFIED IDEOGRAPH + {0xBCBA, 0x5DF1}, //9926 #CJK UNIFIED IDEOGRAPH + {0xBCBB, 0x84DF}, //9927 #CJK UNIFIED IDEOGRAPH + {0xBCBC, 0x6280}, //9928 #CJK UNIFIED IDEOGRAPH + {0xBCBD, 0x5180}, //9929 #CJK UNIFIED IDEOGRAPH + {0xBCBE, 0x5B63}, //9930 #CJK UNIFIED IDEOGRAPH + {0xBCBF, 0x4F0E}, //9931 #CJK UNIFIED IDEOGRAPH + {0xBCC0, 0x796D}, //9932 #CJK UNIFIED IDEOGRAPH + {0xBCC1, 0x5242}, //9933 #CJK UNIFIED IDEOGRAPH + {0xBCC2, 0x60B8}, //9934 #CJK UNIFIED IDEOGRAPH + {0xBCC3, 0x6D4E}, //9935 #CJK UNIFIED IDEOGRAPH + {0xBCC4, 0x5BC4}, //9936 #CJK UNIFIED IDEOGRAPH + {0xBCC5, 0x5BC2}, //9937 #CJK UNIFIED IDEOGRAPH + {0xBCC6, 0x8BA1}, //9938 #CJK UNIFIED IDEOGRAPH + {0xBCC7, 0x8BB0}, //9939 #CJK UNIFIED IDEOGRAPH + {0xBCC8, 0x65E2}, //9940 #CJK UNIFIED IDEOGRAPH + {0xBCC9, 0x5FCC}, //9941 #CJK UNIFIED IDEOGRAPH + {0xBCCA, 0x9645}, //9942 #CJK UNIFIED IDEOGRAPH + {0xBCCB, 0x5993}, //9943 #CJK UNIFIED IDEOGRAPH + {0xBCCC, 0x7EE7}, //9944 #CJK UNIFIED IDEOGRAPH + {0xBCCD, 0x7EAA}, //9945 #CJK UNIFIED IDEOGRAPH + {0xBCCE, 0x5609}, //9946 #CJK UNIFIED IDEOGRAPH + {0xBCCF, 0x67B7}, //9947 #CJK UNIFIED IDEOGRAPH + {0xBCD0, 0x5939}, //9948 #CJK UNIFIED IDEOGRAPH + {0xBCD1, 0x4F73}, //9949 #CJK UNIFIED IDEOGRAPH + {0xBCD2, 0x5BB6}, //9950 #CJK UNIFIED IDEOGRAPH + {0xBCD3, 0x52A0}, //9951 #CJK UNIFIED IDEOGRAPH + {0xBCD4, 0x835A}, //9952 #CJK UNIFIED IDEOGRAPH + {0xBCD5, 0x988A}, //9953 #CJK UNIFIED IDEOGRAPH + {0xBCD6, 0x8D3E}, //9954 #CJK UNIFIED IDEOGRAPH + {0xBCD7, 0x7532}, //9955 #CJK UNIFIED IDEOGRAPH + {0xBCD8, 0x94BE}, //9956 #CJK UNIFIED IDEOGRAPH + {0xBCD9, 0x5047}, //9957 #CJK UNIFIED IDEOGRAPH + {0xBCDA, 0x7A3C}, //9958 #CJK UNIFIED IDEOGRAPH + {0xBCDB, 0x4EF7}, //9959 #CJK UNIFIED IDEOGRAPH + {0xBCDC, 0x67B6}, //9960 #CJK UNIFIED IDEOGRAPH + {0xBCDD, 0x9A7E}, //9961 #CJK UNIFIED IDEOGRAPH + {0xBCDE, 0x5AC1}, //9962 #CJK UNIFIED IDEOGRAPH + {0xBCDF, 0x6B7C}, //9963 #CJK UNIFIED IDEOGRAPH + {0xBCE0, 0x76D1}, //9964 #CJK UNIFIED IDEOGRAPH + {0xBCE1, 0x575A}, //9965 #CJK UNIFIED IDEOGRAPH + {0xBCE2, 0x5C16}, //9966 #CJK UNIFIED IDEOGRAPH + {0xBCE3, 0x7B3A}, //9967 #CJK UNIFIED IDEOGRAPH + {0xBCE4, 0x95F4}, //9968 #CJK UNIFIED IDEOGRAPH + {0xBCE5, 0x714E}, //9969 #CJK UNIFIED IDEOGRAPH + {0xBCE6, 0x517C}, //9970 #CJK UNIFIED IDEOGRAPH + {0xBCE7, 0x80A9}, //9971 #CJK UNIFIED IDEOGRAPH + {0xBCE8, 0x8270}, //9972 #CJK UNIFIED IDEOGRAPH + {0xBCE9, 0x5978}, //9973 #CJK UNIFIED IDEOGRAPH + {0xBCEA, 0x7F04}, //9974 #CJK UNIFIED IDEOGRAPH + {0xBCEB, 0x8327}, //9975 #CJK UNIFIED IDEOGRAPH + {0xBCEC, 0x68C0}, //9976 #CJK UNIFIED IDEOGRAPH + {0xBCED, 0x67EC}, //9977 #CJK UNIFIED IDEOGRAPH + {0xBCEE, 0x78B1}, //9978 #CJK UNIFIED IDEOGRAPH + {0xBCEF, 0x7877}, //9979 #CJK UNIFIED IDEOGRAPH + {0xBCF0, 0x62E3}, //9980 #CJK UNIFIED IDEOGRAPH + {0xBCF1, 0x6361}, //9981 #CJK UNIFIED IDEOGRAPH + {0xBCF2, 0x7B80}, //9982 #CJK UNIFIED IDEOGRAPH + {0xBCF3, 0x4FED}, //9983 #CJK UNIFIED IDEOGRAPH + {0xBCF4, 0x526A}, //9984 #CJK UNIFIED IDEOGRAPH + {0xBCF5, 0x51CF}, //9985 #CJK UNIFIED IDEOGRAPH + {0xBCF6, 0x8350}, //9986 #CJK UNIFIED IDEOGRAPH + {0xBCF7, 0x69DB}, //9987 #CJK UNIFIED IDEOGRAPH + {0xBCF8, 0x9274}, //9988 #CJK UNIFIED IDEOGRAPH + {0xBCF9, 0x8DF5}, //9989 #CJK UNIFIED IDEOGRAPH + {0xBCFA, 0x8D31}, //9990 #CJK UNIFIED IDEOGRAPH + {0xBCFB, 0x89C1}, //9991 #CJK UNIFIED IDEOGRAPH + {0xBCFC, 0x952E}, //9992 #CJK UNIFIED IDEOGRAPH + {0xBCFD, 0x7BAD}, //9993 #CJK UNIFIED IDEOGRAPH + {0xBCFE, 0x4EF6}, //9994 #CJK UNIFIED IDEOGRAPH + {0xBD40, 0x7D37}, //9995 #CJK UNIFIED IDEOGRAPH + {0xBD41, 0x7D38}, //9996 #CJK UNIFIED IDEOGRAPH + {0xBD42, 0x7D39}, //9997 #CJK UNIFIED IDEOGRAPH + {0xBD43, 0x7D3A}, //9998 #CJK UNIFIED IDEOGRAPH + {0xBD44, 0x7D3B}, //9999 #CJK UNIFIED IDEOGRAPH + {0xBD45, 0x7D3C}, //10000 #CJK UNIFIED IDEOGRAPH + {0xBD46, 0x7D3D}, //10001 #CJK UNIFIED IDEOGRAPH + {0xBD47, 0x7D3E}, //10002 #CJK UNIFIED IDEOGRAPH + {0xBD48, 0x7D3F}, //10003 #CJK UNIFIED IDEOGRAPH + {0xBD49, 0x7D40}, //10004 #CJK UNIFIED IDEOGRAPH + {0xBD4A, 0x7D41}, //10005 #CJK UNIFIED IDEOGRAPH + {0xBD4B, 0x7D42}, //10006 #CJK UNIFIED IDEOGRAPH + {0xBD4C, 0x7D43}, //10007 #CJK UNIFIED IDEOGRAPH + {0xBD4D, 0x7D44}, //10008 #CJK UNIFIED IDEOGRAPH + {0xBD4E, 0x7D45}, //10009 #CJK UNIFIED IDEOGRAPH + {0xBD4F, 0x7D46}, //10010 #CJK UNIFIED IDEOGRAPH + {0xBD50, 0x7D47}, //10011 #CJK UNIFIED IDEOGRAPH + {0xBD51, 0x7D48}, //10012 #CJK UNIFIED IDEOGRAPH + {0xBD52, 0x7D49}, //10013 #CJK UNIFIED IDEOGRAPH + {0xBD53, 0x7D4A}, //10014 #CJK UNIFIED IDEOGRAPH + {0xBD54, 0x7D4B}, //10015 #CJK UNIFIED IDEOGRAPH + {0xBD55, 0x7D4C}, //10016 #CJK UNIFIED IDEOGRAPH + {0xBD56, 0x7D4D}, //10017 #CJK UNIFIED IDEOGRAPH + {0xBD57, 0x7D4E}, //10018 #CJK UNIFIED IDEOGRAPH + {0xBD58, 0x7D4F}, //10019 #CJK UNIFIED IDEOGRAPH + {0xBD59, 0x7D50}, //10020 #CJK UNIFIED IDEOGRAPH + {0xBD5A, 0x7D51}, //10021 #CJK UNIFIED IDEOGRAPH + {0xBD5B, 0x7D52}, //10022 #CJK UNIFIED IDEOGRAPH + {0xBD5C, 0x7D53}, //10023 #CJK UNIFIED IDEOGRAPH + {0xBD5D, 0x7D54}, //10024 #CJK UNIFIED IDEOGRAPH + {0xBD5E, 0x7D55}, //10025 #CJK UNIFIED IDEOGRAPH + {0xBD5F, 0x7D56}, //10026 #CJK UNIFIED IDEOGRAPH + {0xBD60, 0x7D57}, //10027 #CJK UNIFIED IDEOGRAPH + {0xBD61, 0x7D58}, //10028 #CJK UNIFIED IDEOGRAPH + {0xBD62, 0x7D59}, //10029 #CJK UNIFIED IDEOGRAPH + {0xBD63, 0x7D5A}, //10030 #CJK UNIFIED IDEOGRAPH + {0xBD64, 0x7D5B}, //10031 #CJK UNIFIED IDEOGRAPH + {0xBD65, 0x7D5C}, //10032 #CJK UNIFIED IDEOGRAPH + {0xBD66, 0x7D5D}, //10033 #CJK UNIFIED IDEOGRAPH + {0xBD67, 0x7D5E}, //10034 #CJK UNIFIED IDEOGRAPH + {0xBD68, 0x7D5F}, //10035 #CJK UNIFIED IDEOGRAPH + {0xBD69, 0x7D60}, //10036 #CJK UNIFIED IDEOGRAPH + {0xBD6A, 0x7D61}, //10037 #CJK UNIFIED IDEOGRAPH + {0xBD6B, 0x7D62}, //10038 #CJK UNIFIED IDEOGRAPH + {0xBD6C, 0x7D63}, //10039 #CJK UNIFIED IDEOGRAPH + {0xBD6D, 0x7D64}, //10040 #CJK UNIFIED IDEOGRAPH + {0xBD6E, 0x7D65}, //10041 #CJK UNIFIED IDEOGRAPH + {0xBD6F, 0x7D66}, //10042 #CJK UNIFIED IDEOGRAPH + {0xBD70, 0x7D67}, //10043 #CJK UNIFIED IDEOGRAPH + {0xBD71, 0x7D68}, //10044 #CJK UNIFIED IDEOGRAPH + {0xBD72, 0x7D69}, //10045 #CJK UNIFIED IDEOGRAPH + {0xBD73, 0x7D6A}, //10046 #CJK UNIFIED IDEOGRAPH + {0xBD74, 0x7D6B}, //10047 #CJK UNIFIED IDEOGRAPH + {0xBD75, 0x7D6C}, //10048 #CJK UNIFIED IDEOGRAPH + {0xBD76, 0x7D6D}, //10049 #CJK UNIFIED IDEOGRAPH + {0xBD77, 0x7D6F}, //10050 #CJK UNIFIED IDEOGRAPH + {0xBD78, 0x7D70}, //10051 #CJK UNIFIED IDEOGRAPH + {0xBD79, 0x7D71}, //10052 #CJK UNIFIED IDEOGRAPH + {0xBD7A, 0x7D72}, //10053 #CJK UNIFIED IDEOGRAPH + {0xBD7B, 0x7D73}, //10054 #CJK UNIFIED IDEOGRAPH + {0xBD7C, 0x7D74}, //10055 #CJK UNIFIED IDEOGRAPH + {0xBD7D, 0x7D75}, //10056 #CJK UNIFIED IDEOGRAPH + {0xBD7E, 0x7D76}, //10057 #CJK UNIFIED IDEOGRAPH + {0xBD80, 0x7D78}, //10058 #CJK UNIFIED IDEOGRAPH + {0xBD81, 0x7D79}, //10059 #CJK UNIFIED IDEOGRAPH + {0xBD82, 0x7D7A}, //10060 #CJK UNIFIED IDEOGRAPH + {0xBD83, 0x7D7B}, //10061 #CJK UNIFIED IDEOGRAPH + {0xBD84, 0x7D7C}, //10062 #CJK UNIFIED IDEOGRAPH + {0xBD85, 0x7D7D}, //10063 #CJK UNIFIED IDEOGRAPH + {0xBD86, 0x7D7E}, //10064 #CJK UNIFIED IDEOGRAPH + {0xBD87, 0x7D7F}, //10065 #CJK UNIFIED IDEOGRAPH + {0xBD88, 0x7D80}, //10066 #CJK UNIFIED IDEOGRAPH + {0xBD89, 0x7D81}, //10067 #CJK UNIFIED IDEOGRAPH + {0xBD8A, 0x7D82}, //10068 #CJK UNIFIED IDEOGRAPH + {0xBD8B, 0x7D83}, //10069 #CJK UNIFIED IDEOGRAPH + {0xBD8C, 0x7D84}, //10070 #CJK UNIFIED IDEOGRAPH + {0xBD8D, 0x7D85}, //10071 #CJK UNIFIED IDEOGRAPH + {0xBD8E, 0x7D86}, //10072 #CJK UNIFIED IDEOGRAPH + {0xBD8F, 0x7D87}, //10073 #CJK UNIFIED IDEOGRAPH + {0xBD90, 0x7D88}, //10074 #CJK UNIFIED IDEOGRAPH + {0xBD91, 0x7D89}, //10075 #CJK UNIFIED IDEOGRAPH + {0xBD92, 0x7D8A}, //10076 #CJK UNIFIED IDEOGRAPH + {0xBD93, 0x7D8B}, //10077 #CJK UNIFIED IDEOGRAPH + {0xBD94, 0x7D8C}, //10078 #CJK UNIFIED IDEOGRAPH + {0xBD95, 0x7D8D}, //10079 #CJK UNIFIED IDEOGRAPH + {0xBD96, 0x7D8E}, //10080 #CJK UNIFIED IDEOGRAPH + {0xBD97, 0x7D8F}, //10081 #CJK UNIFIED IDEOGRAPH + {0xBD98, 0x7D90}, //10082 #CJK UNIFIED IDEOGRAPH + {0xBD99, 0x7D91}, //10083 #CJK UNIFIED IDEOGRAPH + {0xBD9A, 0x7D92}, //10084 #CJK UNIFIED IDEOGRAPH + {0xBD9B, 0x7D93}, //10085 #CJK UNIFIED IDEOGRAPH + {0xBD9C, 0x7D94}, //10086 #CJK UNIFIED IDEOGRAPH + {0xBD9D, 0x7D95}, //10087 #CJK UNIFIED IDEOGRAPH + {0xBD9E, 0x7D96}, //10088 #CJK UNIFIED IDEOGRAPH + {0xBD9F, 0x7D97}, //10089 #CJK UNIFIED IDEOGRAPH + {0xBDA0, 0x7D98}, //10090 #CJK UNIFIED IDEOGRAPH + {0xBDA1, 0x5065}, //10091 #CJK UNIFIED IDEOGRAPH + {0xBDA2, 0x8230}, //10092 #CJK UNIFIED IDEOGRAPH + {0xBDA3, 0x5251}, //10093 #CJK UNIFIED IDEOGRAPH + {0xBDA4, 0x996F}, //10094 #CJK UNIFIED IDEOGRAPH + {0xBDA5, 0x6E10}, //10095 #CJK UNIFIED IDEOGRAPH + {0xBDA6, 0x6E85}, //10096 #CJK UNIFIED IDEOGRAPH + {0xBDA7, 0x6DA7}, //10097 #CJK UNIFIED IDEOGRAPH + {0xBDA8, 0x5EFA}, //10098 #CJK UNIFIED IDEOGRAPH + {0xBDA9, 0x50F5}, //10099 #CJK UNIFIED IDEOGRAPH + {0xBDAA, 0x59DC}, //10100 #CJK UNIFIED IDEOGRAPH + {0xBDAB, 0x5C06}, //10101 #CJK UNIFIED IDEOGRAPH + {0xBDAC, 0x6D46}, //10102 #CJK UNIFIED IDEOGRAPH + {0xBDAD, 0x6C5F}, //10103 #CJK UNIFIED IDEOGRAPH + {0xBDAE, 0x7586}, //10104 #CJK UNIFIED IDEOGRAPH + {0xBDAF, 0x848B}, //10105 #CJK UNIFIED IDEOGRAPH + {0xBDB0, 0x6868}, //10106 #CJK UNIFIED IDEOGRAPH + {0xBDB1, 0x5956}, //10107 #CJK UNIFIED IDEOGRAPH + {0xBDB2, 0x8BB2}, //10108 #CJK UNIFIED IDEOGRAPH + {0xBDB3, 0x5320}, //10109 #CJK UNIFIED IDEOGRAPH + {0xBDB4, 0x9171}, //10110 #CJK UNIFIED IDEOGRAPH + {0xBDB5, 0x964D}, //10111 #CJK UNIFIED IDEOGRAPH + {0xBDB6, 0x8549}, //10112 #CJK UNIFIED IDEOGRAPH + {0xBDB7, 0x6912}, //10113 #CJK UNIFIED IDEOGRAPH + {0xBDB8, 0x7901}, //10114 #CJK UNIFIED IDEOGRAPH + {0xBDB9, 0x7126}, //10115 #CJK UNIFIED IDEOGRAPH + {0xBDBA, 0x80F6}, //10116 #CJK UNIFIED IDEOGRAPH + {0xBDBB, 0x4EA4}, //10117 #CJK UNIFIED IDEOGRAPH + {0xBDBC, 0x90CA}, //10118 #CJK UNIFIED IDEOGRAPH + {0xBDBD, 0x6D47}, //10119 #CJK UNIFIED IDEOGRAPH + {0xBDBE, 0x9A84}, //10120 #CJK UNIFIED IDEOGRAPH + {0xBDBF, 0x5A07}, //10121 #CJK UNIFIED IDEOGRAPH + {0xBDC0, 0x56BC}, //10122 #CJK UNIFIED IDEOGRAPH + {0xBDC1, 0x6405}, //10123 #CJK UNIFIED IDEOGRAPH + {0xBDC2, 0x94F0}, //10124 #CJK UNIFIED IDEOGRAPH + {0xBDC3, 0x77EB}, //10125 #CJK UNIFIED IDEOGRAPH + {0xBDC4, 0x4FA5}, //10126 #CJK UNIFIED IDEOGRAPH + {0xBDC5, 0x811A}, //10127 #CJK UNIFIED IDEOGRAPH + {0xBDC6, 0x72E1}, //10128 #CJK UNIFIED IDEOGRAPH + {0xBDC7, 0x89D2}, //10129 #CJK UNIFIED IDEOGRAPH + {0xBDC8, 0x997A}, //10130 #CJK UNIFIED IDEOGRAPH + {0xBDC9, 0x7F34}, //10131 #CJK UNIFIED IDEOGRAPH + {0xBDCA, 0x7EDE}, //10132 #CJK UNIFIED IDEOGRAPH + {0xBDCB, 0x527F}, //10133 #CJK UNIFIED IDEOGRAPH + {0xBDCC, 0x6559}, //10134 #CJK UNIFIED IDEOGRAPH + {0xBDCD, 0x9175}, //10135 #CJK UNIFIED IDEOGRAPH + {0xBDCE, 0x8F7F}, //10136 #CJK UNIFIED IDEOGRAPH + {0xBDCF, 0x8F83}, //10137 #CJK UNIFIED IDEOGRAPH + {0xBDD0, 0x53EB}, //10138 #CJK UNIFIED IDEOGRAPH + {0xBDD1, 0x7A96}, //10139 #CJK UNIFIED IDEOGRAPH + {0xBDD2, 0x63ED}, //10140 #CJK UNIFIED IDEOGRAPH + {0xBDD3, 0x63A5}, //10141 #CJK UNIFIED IDEOGRAPH + {0xBDD4, 0x7686}, //10142 #CJK UNIFIED IDEOGRAPH + {0xBDD5, 0x79F8}, //10143 #CJK UNIFIED IDEOGRAPH + {0xBDD6, 0x8857}, //10144 #CJK UNIFIED IDEOGRAPH + {0xBDD7, 0x9636}, //10145 #CJK UNIFIED IDEOGRAPH + {0xBDD8, 0x622A}, //10146 #CJK UNIFIED IDEOGRAPH + {0xBDD9, 0x52AB}, //10147 #CJK UNIFIED IDEOGRAPH + {0xBDDA, 0x8282}, //10148 #CJK UNIFIED IDEOGRAPH + {0xBDDB, 0x6854}, //10149 #CJK UNIFIED IDEOGRAPH + {0xBDDC, 0x6770}, //10150 #CJK UNIFIED IDEOGRAPH + {0xBDDD, 0x6377}, //10151 #CJK UNIFIED IDEOGRAPH + {0xBDDE, 0x776B}, //10152 #CJK UNIFIED IDEOGRAPH + {0xBDDF, 0x7AED}, //10153 #CJK UNIFIED IDEOGRAPH + {0xBDE0, 0x6D01}, //10154 #CJK UNIFIED IDEOGRAPH + {0xBDE1, 0x7ED3}, //10155 #CJK UNIFIED IDEOGRAPH + {0xBDE2, 0x89E3}, //10156 #CJK UNIFIED IDEOGRAPH + {0xBDE3, 0x59D0}, //10157 #CJK UNIFIED IDEOGRAPH + {0xBDE4, 0x6212}, //10158 #CJK UNIFIED IDEOGRAPH + {0xBDE5, 0x85C9}, //10159 #CJK UNIFIED IDEOGRAPH + {0xBDE6, 0x82A5}, //10160 #CJK UNIFIED IDEOGRAPH + {0xBDE7, 0x754C}, //10161 #CJK UNIFIED IDEOGRAPH + {0xBDE8, 0x501F}, //10162 #CJK UNIFIED IDEOGRAPH + {0xBDE9, 0x4ECB}, //10163 #CJK UNIFIED IDEOGRAPH + {0xBDEA, 0x75A5}, //10164 #CJK UNIFIED IDEOGRAPH + {0xBDEB, 0x8BEB}, //10165 #CJK UNIFIED IDEOGRAPH + {0xBDEC, 0x5C4A}, //10166 #CJK UNIFIED IDEOGRAPH + {0xBDED, 0x5DFE}, //10167 #CJK UNIFIED IDEOGRAPH + {0xBDEE, 0x7B4B}, //10168 #CJK UNIFIED IDEOGRAPH + {0xBDEF, 0x65A4}, //10169 #CJK UNIFIED IDEOGRAPH + {0xBDF0, 0x91D1}, //10170 #CJK UNIFIED IDEOGRAPH + {0xBDF1, 0x4ECA}, //10171 #CJK UNIFIED IDEOGRAPH + {0xBDF2, 0x6D25}, //10172 #CJK UNIFIED IDEOGRAPH + {0xBDF3, 0x895F}, //10173 #CJK UNIFIED IDEOGRAPH + {0xBDF4, 0x7D27}, //10174 #CJK UNIFIED IDEOGRAPH + {0xBDF5, 0x9526}, //10175 #CJK UNIFIED IDEOGRAPH + {0xBDF6, 0x4EC5}, //10176 #CJK UNIFIED IDEOGRAPH + {0xBDF7, 0x8C28}, //10177 #CJK UNIFIED IDEOGRAPH + {0xBDF8, 0x8FDB}, //10178 #CJK UNIFIED IDEOGRAPH + {0xBDF9, 0x9773}, //10179 #CJK UNIFIED IDEOGRAPH + {0xBDFA, 0x664B}, //10180 #CJK UNIFIED IDEOGRAPH + {0xBDFB, 0x7981}, //10181 #CJK UNIFIED IDEOGRAPH + {0xBDFC, 0x8FD1}, //10182 #CJK UNIFIED IDEOGRAPH + {0xBDFD, 0x70EC}, //10183 #CJK UNIFIED IDEOGRAPH + {0xBDFE, 0x6D78}, //10184 #CJK UNIFIED IDEOGRAPH + {0xBE40, 0x7D99}, //10185 #CJK UNIFIED IDEOGRAPH + {0xBE41, 0x7D9A}, //10186 #CJK UNIFIED IDEOGRAPH + {0xBE42, 0x7D9B}, //10187 #CJK UNIFIED IDEOGRAPH + {0xBE43, 0x7D9C}, //10188 #CJK UNIFIED IDEOGRAPH + {0xBE44, 0x7D9D}, //10189 #CJK UNIFIED IDEOGRAPH + {0xBE45, 0x7D9E}, //10190 #CJK UNIFIED IDEOGRAPH + {0xBE46, 0x7D9F}, //10191 #CJK UNIFIED IDEOGRAPH + {0xBE47, 0x7DA0}, //10192 #CJK UNIFIED IDEOGRAPH + {0xBE48, 0x7DA1}, //10193 #CJK UNIFIED IDEOGRAPH + {0xBE49, 0x7DA2}, //10194 #CJK UNIFIED IDEOGRAPH + {0xBE4A, 0x7DA3}, //10195 #CJK UNIFIED IDEOGRAPH + {0xBE4B, 0x7DA4}, //10196 #CJK UNIFIED IDEOGRAPH + {0xBE4C, 0x7DA5}, //10197 #CJK UNIFIED IDEOGRAPH + {0xBE4D, 0x7DA7}, //10198 #CJK UNIFIED IDEOGRAPH + {0xBE4E, 0x7DA8}, //10199 #CJK UNIFIED IDEOGRAPH + {0xBE4F, 0x7DA9}, //10200 #CJK UNIFIED IDEOGRAPH + {0xBE50, 0x7DAA}, //10201 #CJK UNIFIED IDEOGRAPH + {0xBE51, 0x7DAB}, //10202 #CJK UNIFIED IDEOGRAPH + {0xBE52, 0x7DAC}, //10203 #CJK UNIFIED IDEOGRAPH + {0xBE53, 0x7DAD}, //10204 #CJK UNIFIED IDEOGRAPH + {0xBE54, 0x7DAF}, //10205 #CJK UNIFIED IDEOGRAPH + {0xBE55, 0x7DB0}, //10206 #CJK UNIFIED IDEOGRAPH + {0xBE56, 0x7DB1}, //10207 #CJK UNIFIED IDEOGRAPH + {0xBE57, 0x7DB2}, //10208 #CJK UNIFIED IDEOGRAPH + {0xBE58, 0x7DB3}, //10209 #CJK UNIFIED IDEOGRAPH + {0xBE59, 0x7DB4}, //10210 #CJK UNIFIED IDEOGRAPH + {0xBE5A, 0x7DB5}, //10211 #CJK UNIFIED IDEOGRAPH + {0xBE5B, 0x7DB6}, //10212 #CJK UNIFIED IDEOGRAPH + {0xBE5C, 0x7DB7}, //10213 #CJK UNIFIED IDEOGRAPH + {0xBE5D, 0x7DB8}, //10214 #CJK UNIFIED IDEOGRAPH + {0xBE5E, 0x7DB9}, //10215 #CJK UNIFIED IDEOGRAPH + {0xBE5F, 0x7DBA}, //10216 #CJK UNIFIED IDEOGRAPH + {0xBE60, 0x7DBB}, //10217 #CJK UNIFIED IDEOGRAPH + {0xBE61, 0x7DBC}, //10218 #CJK UNIFIED IDEOGRAPH + {0xBE62, 0x7DBD}, //10219 #CJK UNIFIED IDEOGRAPH + {0xBE63, 0x7DBE}, //10220 #CJK UNIFIED IDEOGRAPH + {0xBE64, 0x7DBF}, //10221 #CJK UNIFIED IDEOGRAPH + {0xBE65, 0x7DC0}, //10222 #CJK UNIFIED IDEOGRAPH + {0xBE66, 0x7DC1}, //10223 #CJK UNIFIED IDEOGRAPH + {0xBE67, 0x7DC2}, //10224 #CJK UNIFIED IDEOGRAPH + {0xBE68, 0x7DC3}, //10225 #CJK UNIFIED IDEOGRAPH + {0xBE69, 0x7DC4}, //10226 #CJK UNIFIED IDEOGRAPH + {0xBE6A, 0x7DC5}, //10227 #CJK UNIFIED IDEOGRAPH + {0xBE6B, 0x7DC6}, //10228 #CJK UNIFIED IDEOGRAPH + {0xBE6C, 0x7DC7}, //10229 #CJK UNIFIED IDEOGRAPH + {0xBE6D, 0x7DC8}, //10230 #CJK UNIFIED IDEOGRAPH + {0xBE6E, 0x7DC9}, //10231 #CJK UNIFIED IDEOGRAPH + {0xBE6F, 0x7DCA}, //10232 #CJK UNIFIED IDEOGRAPH + {0xBE70, 0x7DCB}, //10233 #CJK UNIFIED IDEOGRAPH + {0xBE71, 0x7DCC}, //10234 #CJK UNIFIED IDEOGRAPH + {0xBE72, 0x7DCD}, //10235 #CJK UNIFIED IDEOGRAPH + {0xBE73, 0x7DCE}, //10236 #CJK UNIFIED IDEOGRAPH + {0xBE74, 0x7DCF}, //10237 #CJK UNIFIED IDEOGRAPH + {0xBE75, 0x7DD0}, //10238 #CJK UNIFIED IDEOGRAPH + {0xBE76, 0x7DD1}, //10239 #CJK UNIFIED IDEOGRAPH + {0xBE77, 0x7DD2}, //10240 #CJK UNIFIED IDEOGRAPH + {0xBE78, 0x7DD3}, //10241 #CJK UNIFIED IDEOGRAPH + {0xBE79, 0x7DD4}, //10242 #CJK UNIFIED IDEOGRAPH + {0xBE7A, 0x7DD5}, //10243 #CJK UNIFIED IDEOGRAPH + {0xBE7B, 0x7DD6}, //10244 #CJK UNIFIED IDEOGRAPH + {0xBE7C, 0x7DD7}, //10245 #CJK UNIFIED IDEOGRAPH + {0xBE7D, 0x7DD8}, //10246 #CJK UNIFIED IDEOGRAPH + {0xBE7E, 0x7DD9}, //10247 #CJK UNIFIED IDEOGRAPH + {0xBE80, 0x7DDA}, //10248 #CJK UNIFIED IDEOGRAPH + {0xBE81, 0x7DDB}, //10249 #CJK UNIFIED IDEOGRAPH + {0xBE82, 0x7DDC}, //10250 #CJK UNIFIED IDEOGRAPH + {0xBE83, 0x7DDD}, //10251 #CJK UNIFIED IDEOGRAPH + {0xBE84, 0x7DDE}, //10252 #CJK UNIFIED IDEOGRAPH + {0xBE85, 0x7DDF}, //10253 #CJK UNIFIED IDEOGRAPH + {0xBE86, 0x7DE0}, //10254 #CJK UNIFIED IDEOGRAPH + {0xBE87, 0x7DE1}, //10255 #CJK UNIFIED IDEOGRAPH + {0xBE88, 0x7DE2}, //10256 #CJK UNIFIED IDEOGRAPH + {0xBE89, 0x7DE3}, //10257 #CJK UNIFIED IDEOGRAPH + {0xBE8A, 0x7DE4}, //10258 #CJK UNIFIED IDEOGRAPH + {0xBE8B, 0x7DE5}, //10259 #CJK UNIFIED IDEOGRAPH + {0xBE8C, 0x7DE6}, //10260 #CJK UNIFIED IDEOGRAPH + {0xBE8D, 0x7DE7}, //10261 #CJK UNIFIED IDEOGRAPH + {0xBE8E, 0x7DE8}, //10262 #CJK UNIFIED IDEOGRAPH + {0xBE8F, 0x7DE9}, //10263 #CJK UNIFIED IDEOGRAPH + {0xBE90, 0x7DEA}, //10264 #CJK UNIFIED IDEOGRAPH + {0xBE91, 0x7DEB}, //10265 #CJK UNIFIED IDEOGRAPH + {0xBE92, 0x7DEC}, //10266 #CJK UNIFIED IDEOGRAPH + {0xBE93, 0x7DED}, //10267 #CJK UNIFIED IDEOGRAPH + {0xBE94, 0x7DEE}, //10268 #CJK UNIFIED IDEOGRAPH + {0xBE95, 0x7DEF}, //10269 #CJK UNIFIED IDEOGRAPH + {0xBE96, 0x7DF0}, //10270 #CJK UNIFIED IDEOGRAPH + {0xBE97, 0x7DF1}, //10271 #CJK UNIFIED IDEOGRAPH + {0xBE98, 0x7DF2}, //10272 #CJK UNIFIED IDEOGRAPH + {0xBE99, 0x7DF3}, //10273 #CJK UNIFIED IDEOGRAPH + {0xBE9A, 0x7DF4}, //10274 #CJK UNIFIED IDEOGRAPH + {0xBE9B, 0x7DF5}, //10275 #CJK UNIFIED IDEOGRAPH + {0xBE9C, 0x7DF6}, //10276 #CJK UNIFIED IDEOGRAPH + {0xBE9D, 0x7DF7}, //10277 #CJK UNIFIED IDEOGRAPH + {0xBE9E, 0x7DF8}, //10278 #CJK UNIFIED IDEOGRAPH + {0xBE9F, 0x7DF9}, //10279 #CJK UNIFIED IDEOGRAPH + {0xBEA0, 0x7DFA}, //10280 #CJK UNIFIED IDEOGRAPH + {0xBEA1, 0x5C3D}, //10281 #CJK UNIFIED IDEOGRAPH + {0xBEA2, 0x52B2}, //10282 #CJK UNIFIED IDEOGRAPH + {0xBEA3, 0x8346}, //10283 #CJK UNIFIED IDEOGRAPH + {0xBEA4, 0x5162}, //10284 #CJK UNIFIED IDEOGRAPH + {0xBEA5, 0x830E}, //10285 #CJK UNIFIED IDEOGRAPH + {0xBEA6, 0x775B}, //10286 #CJK UNIFIED IDEOGRAPH + {0xBEA7, 0x6676}, //10287 #CJK UNIFIED IDEOGRAPH + {0xBEA8, 0x9CB8}, //10288 #CJK UNIFIED IDEOGRAPH + {0xBEA9, 0x4EAC}, //10289 #CJK UNIFIED IDEOGRAPH + {0xBEAA, 0x60CA}, //10290 #CJK UNIFIED IDEOGRAPH + {0xBEAB, 0x7CBE}, //10291 #CJK UNIFIED IDEOGRAPH + {0xBEAC, 0x7CB3}, //10292 #CJK UNIFIED IDEOGRAPH + {0xBEAD, 0x7ECF}, //10293 #CJK UNIFIED IDEOGRAPH + {0xBEAE, 0x4E95}, //10294 #CJK UNIFIED IDEOGRAPH + {0xBEAF, 0x8B66}, //10295 #CJK UNIFIED IDEOGRAPH + {0xBEB0, 0x666F}, //10296 #CJK UNIFIED IDEOGRAPH + {0xBEB1, 0x9888}, //10297 #CJK UNIFIED IDEOGRAPH + {0xBEB2, 0x9759}, //10298 #CJK UNIFIED IDEOGRAPH + {0xBEB3, 0x5883}, //10299 #CJK UNIFIED IDEOGRAPH + {0xBEB4, 0x656C}, //10300 #CJK UNIFIED IDEOGRAPH + {0xBEB5, 0x955C}, //10301 #CJK UNIFIED IDEOGRAPH + {0xBEB6, 0x5F84}, //10302 #CJK UNIFIED IDEOGRAPH + {0xBEB7, 0x75C9}, //10303 #CJK UNIFIED IDEOGRAPH + {0xBEB8, 0x9756}, //10304 #CJK UNIFIED IDEOGRAPH + {0xBEB9, 0x7ADF}, //10305 #CJK UNIFIED IDEOGRAPH + {0xBEBA, 0x7ADE}, //10306 #CJK UNIFIED IDEOGRAPH + {0xBEBB, 0x51C0}, //10307 #CJK UNIFIED IDEOGRAPH + {0xBEBC, 0x70AF}, //10308 #CJK UNIFIED IDEOGRAPH + {0xBEBD, 0x7A98}, //10309 #CJK UNIFIED IDEOGRAPH + {0xBEBE, 0x63EA}, //10310 #CJK UNIFIED IDEOGRAPH + {0xBEBF, 0x7A76}, //10311 #CJK UNIFIED IDEOGRAPH + {0xBEC0, 0x7EA0}, //10312 #CJK UNIFIED IDEOGRAPH + {0xBEC1, 0x7396}, //10313 #CJK UNIFIED IDEOGRAPH + {0xBEC2, 0x97ED}, //10314 #CJK UNIFIED IDEOGRAPH + {0xBEC3, 0x4E45}, //10315 #CJK UNIFIED IDEOGRAPH + {0xBEC4, 0x7078}, //10316 #CJK UNIFIED IDEOGRAPH + {0xBEC5, 0x4E5D}, //10317 #CJK UNIFIED IDEOGRAPH + {0xBEC6, 0x9152}, //10318 #CJK UNIFIED IDEOGRAPH + {0xBEC7, 0x53A9}, //10319 #CJK UNIFIED IDEOGRAPH + {0xBEC8, 0x6551}, //10320 #CJK UNIFIED IDEOGRAPH + {0xBEC9, 0x65E7}, //10321 #CJK UNIFIED IDEOGRAPH + {0xBECA, 0x81FC}, //10322 #CJK UNIFIED IDEOGRAPH + {0xBECB, 0x8205}, //10323 #CJK UNIFIED IDEOGRAPH + {0xBECC, 0x548E}, //10324 #CJK UNIFIED IDEOGRAPH + {0xBECD, 0x5C31}, //10325 #CJK UNIFIED IDEOGRAPH + {0xBECE, 0x759A}, //10326 #CJK UNIFIED IDEOGRAPH + {0xBECF, 0x97A0}, //10327 #CJK UNIFIED IDEOGRAPH + {0xBED0, 0x62D8}, //10328 #CJK UNIFIED IDEOGRAPH + {0xBED1, 0x72D9}, //10329 #CJK UNIFIED IDEOGRAPH + {0xBED2, 0x75BD}, //10330 #CJK UNIFIED IDEOGRAPH + {0xBED3, 0x5C45}, //10331 #CJK UNIFIED IDEOGRAPH + {0xBED4, 0x9A79}, //10332 #CJK UNIFIED IDEOGRAPH + {0xBED5, 0x83CA}, //10333 #CJK UNIFIED IDEOGRAPH + {0xBED6, 0x5C40}, //10334 #CJK UNIFIED IDEOGRAPH + {0xBED7, 0x5480}, //10335 #CJK UNIFIED IDEOGRAPH + {0xBED8, 0x77E9}, //10336 #CJK UNIFIED IDEOGRAPH + {0xBED9, 0x4E3E}, //10337 #CJK UNIFIED IDEOGRAPH + {0xBEDA, 0x6CAE}, //10338 #CJK UNIFIED IDEOGRAPH + {0xBEDB, 0x805A}, //10339 #CJK UNIFIED IDEOGRAPH + {0xBEDC, 0x62D2}, //10340 #CJK UNIFIED IDEOGRAPH + {0xBEDD, 0x636E}, //10341 #CJK UNIFIED IDEOGRAPH + {0xBEDE, 0x5DE8}, //10342 #CJK UNIFIED IDEOGRAPH + {0xBEDF, 0x5177}, //10343 #CJK UNIFIED IDEOGRAPH + {0xBEE0, 0x8DDD}, //10344 #CJK UNIFIED IDEOGRAPH + {0xBEE1, 0x8E1E}, //10345 #CJK UNIFIED IDEOGRAPH + {0xBEE2, 0x952F}, //10346 #CJK UNIFIED IDEOGRAPH + {0xBEE3, 0x4FF1}, //10347 #CJK UNIFIED IDEOGRAPH + {0xBEE4, 0x53E5}, //10348 #CJK UNIFIED IDEOGRAPH + {0xBEE5, 0x60E7}, //10349 #CJK UNIFIED IDEOGRAPH + {0xBEE6, 0x70AC}, //10350 #CJK UNIFIED IDEOGRAPH + {0xBEE7, 0x5267}, //10351 #CJK UNIFIED IDEOGRAPH + {0xBEE8, 0x6350}, //10352 #CJK UNIFIED IDEOGRAPH + {0xBEE9, 0x9E43}, //10353 #CJK UNIFIED IDEOGRAPH + {0xBEEA, 0x5A1F}, //10354 #CJK UNIFIED IDEOGRAPH + {0xBEEB, 0x5026}, //10355 #CJK UNIFIED IDEOGRAPH + {0xBEEC, 0x7737}, //10356 #CJK UNIFIED IDEOGRAPH + {0xBEED, 0x5377}, //10357 #CJK UNIFIED IDEOGRAPH + {0xBEEE, 0x7EE2}, //10358 #CJK UNIFIED IDEOGRAPH + {0xBEEF, 0x6485}, //10359 #CJK UNIFIED IDEOGRAPH + {0xBEF0, 0x652B}, //10360 #CJK UNIFIED IDEOGRAPH + {0xBEF1, 0x6289}, //10361 #CJK UNIFIED IDEOGRAPH + {0xBEF2, 0x6398}, //10362 #CJK UNIFIED IDEOGRAPH + {0xBEF3, 0x5014}, //10363 #CJK UNIFIED IDEOGRAPH + {0xBEF4, 0x7235}, //10364 #CJK UNIFIED IDEOGRAPH + {0xBEF5, 0x89C9}, //10365 #CJK UNIFIED IDEOGRAPH + {0xBEF6, 0x51B3}, //10366 #CJK UNIFIED IDEOGRAPH + {0xBEF7, 0x8BC0}, //10367 #CJK UNIFIED IDEOGRAPH + {0xBEF8, 0x7EDD}, //10368 #CJK UNIFIED IDEOGRAPH + {0xBEF9, 0x5747}, //10369 #CJK UNIFIED IDEOGRAPH + {0xBEFA, 0x83CC}, //10370 #CJK UNIFIED IDEOGRAPH + {0xBEFB, 0x94A7}, //10371 #CJK UNIFIED IDEOGRAPH + {0xBEFC, 0x519B}, //10372 #CJK UNIFIED IDEOGRAPH + {0xBEFD, 0x541B}, //10373 #CJK UNIFIED IDEOGRAPH + {0xBEFE, 0x5CFB}, //10374 #CJK UNIFIED IDEOGRAPH + {0xBF40, 0x7DFB}, //10375 #CJK UNIFIED IDEOGRAPH + {0xBF41, 0x7DFC}, //10376 #CJK UNIFIED IDEOGRAPH + {0xBF42, 0x7DFD}, //10377 #CJK UNIFIED IDEOGRAPH + {0xBF43, 0x7DFE}, //10378 #CJK UNIFIED IDEOGRAPH + {0xBF44, 0x7DFF}, //10379 #CJK UNIFIED IDEOGRAPH + {0xBF45, 0x7E00}, //10380 #CJK UNIFIED IDEOGRAPH + {0xBF46, 0x7E01}, //10381 #CJK UNIFIED IDEOGRAPH + {0xBF47, 0x7E02}, //10382 #CJK UNIFIED IDEOGRAPH + {0xBF48, 0x7E03}, //10383 #CJK UNIFIED IDEOGRAPH + {0xBF49, 0x7E04}, //10384 #CJK UNIFIED IDEOGRAPH + {0xBF4A, 0x7E05}, //10385 #CJK UNIFIED IDEOGRAPH + {0xBF4B, 0x7E06}, //10386 #CJK UNIFIED IDEOGRAPH + {0xBF4C, 0x7E07}, //10387 #CJK UNIFIED IDEOGRAPH + {0xBF4D, 0x7E08}, //10388 #CJK UNIFIED IDEOGRAPH + {0xBF4E, 0x7E09}, //10389 #CJK UNIFIED IDEOGRAPH + {0xBF4F, 0x7E0A}, //10390 #CJK UNIFIED IDEOGRAPH + {0xBF50, 0x7E0B}, //10391 #CJK UNIFIED IDEOGRAPH + {0xBF51, 0x7E0C}, //10392 #CJK UNIFIED IDEOGRAPH + {0xBF52, 0x7E0D}, //10393 #CJK UNIFIED IDEOGRAPH + {0xBF53, 0x7E0E}, //10394 #CJK UNIFIED IDEOGRAPH + {0xBF54, 0x7E0F}, //10395 #CJK UNIFIED IDEOGRAPH + {0xBF55, 0x7E10}, //10396 #CJK UNIFIED IDEOGRAPH + {0xBF56, 0x7E11}, //10397 #CJK UNIFIED IDEOGRAPH + {0xBF57, 0x7E12}, //10398 #CJK UNIFIED IDEOGRAPH + {0xBF58, 0x7E13}, //10399 #CJK UNIFIED IDEOGRAPH + {0xBF59, 0x7E14}, //10400 #CJK UNIFIED IDEOGRAPH + {0xBF5A, 0x7E15}, //10401 #CJK UNIFIED IDEOGRAPH + {0xBF5B, 0x7E16}, //10402 #CJK UNIFIED IDEOGRAPH + {0xBF5C, 0x7E17}, //10403 #CJK UNIFIED IDEOGRAPH + {0xBF5D, 0x7E18}, //10404 #CJK UNIFIED IDEOGRAPH + {0xBF5E, 0x7E19}, //10405 #CJK UNIFIED IDEOGRAPH + {0xBF5F, 0x7E1A}, //10406 #CJK UNIFIED IDEOGRAPH + {0xBF60, 0x7E1B}, //10407 #CJK UNIFIED IDEOGRAPH + {0xBF61, 0x7E1C}, //10408 #CJK UNIFIED IDEOGRAPH + {0xBF62, 0x7E1D}, //10409 #CJK UNIFIED IDEOGRAPH + {0xBF63, 0x7E1E}, //10410 #CJK UNIFIED IDEOGRAPH + {0xBF64, 0x7E1F}, //10411 #CJK UNIFIED IDEOGRAPH + {0xBF65, 0x7E20}, //10412 #CJK UNIFIED IDEOGRAPH + {0xBF66, 0x7E21}, //10413 #CJK UNIFIED IDEOGRAPH + {0xBF67, 0x7E22}, //10414 #CJK UNIFIED IDEOGRAPH + {0xBF68, 0x7E23}, //10415 #CJK UNIFIED IDEOGRAPH + {0xBF69, 0x7E24}, //10416 #CJK UNIFIED IDEOGRAPH + {0xBF6A, 0x7E25}, //10417 #CJK UNIFIED IDEOGRAPH + {0xBF6B, 0x7E26}, //10418 #CJK UNIFIED IDEOGRAPH + {0xBF6C, 0x7E27}, //10419 #CJK UNIFIED IDEOGRAPH + {0xBF6D, 0x7E28}, //10420 #CJK UNIFIED IDEOGRAPH + {0xBF6E, 0x7E29}, //10421 #CJK UNIFIED IDEOGRAPH + {0xBF6F, 0x7E2A}, //10422 #CJK UNIFIED IDEOGRAPH + {0xBF70, 0x7E2B}, //10423 #CJK UNIFIED IDEOGRAPH + {0xBF71, 0x7E2C}, //10424 #CJK UNIFIED IDEOGRAPH + {0xBF72, 0x7E2D}, //10425 #CJK UNIFIED IDEOGRAPH + {0xBF73, 0x7E2E}, //10426 #CJK UNIFIED IDEOGRAPH + {0xBF74, 0x7E2F}, //10427 #CJK UNIFIED IDEOGRAPH + {0xBF75, 0x7E30}, //10428 #CJK UNIFIED IDEOGRAPH + {0xBF76, 0x7E31}, //10429 #CJK UNIFIED IDEOGRAPH + {0xBF77, 0x7E32}, //10430 #CJK UNIFIED IDEOGRAPH + {0xBF78, 0x7E33}, //10431 #CJK UNIFIED IDEOGRAPH + {0xBF79, 0x7E34}, //10432 #CJK UNIFIED IDEOGRAPH + {0xBF7A, 0x7E35}, //10433 #CJK UNIFIED IDEOGRAPH + {0xBF7B, 0x7E36}, //10434 #CJK UNIFIED IDEOGRAPH + {0xBF7C, 0x7E37}, //10435 #CJK UNIFIED IDEOGRAPH + {0xBF7D, 0x7E38}, //10436 #CJK UNIFIED IDEOGRAPH + {0xBF7E, 0x7E39}, //10437 #CJK UNIFIED IDEOGRAPH + {0xBF80, 0x7E3A}, //10438 #CJK UNIFIED IDEOGRAPH + {0xBF81, 0x7E3C}, //10439 #CJK UNIFIED IDEOGRAPH + {0xBF82, 0x7E3D}, //10440 #CJK UNIFIED IDEOGRAPH + {0xBF83, 0x7E3E}, //10441 #CJK UNIFIED IDEOGRAPH + {0xBF84, 0x7E3F}, //10442 #CJK UNIFIED IDEOGRAPH + {0xBF85, 0x7E40}, //10443 #CJK UNIFIED IDEOGRAPH + {0xBF86, 0x7E42}, //10444 #CJK UNIFIED IDEOGRAPH + {0xBF87, 0x7E43}, //10445 #CJK UNIFIED IDEOGRAPH + {0xBF88, 0x7E44}, //10446 #CJK UNIFIED IDEOGRAPH + {0xBF89, 0x7E45}, //10447 #CJK UNIFIED IDEOGRAPH + {0xBF8A, 0x7E46}, //10448 #CJK UNIFIED IDEOGRAPH + {0xBF8B, 0x7E48}, //10449 #CJK UNIFIED IDEOGRAPH + {0xBF8C, 0x7E49}, //10450 #CJK UNIFIED IDEOGRAPH + {0xBF8D, 0x7E4A}, //10451 #CJK UNIFIED IDEOGRAPH + {0xBF8E, 0x7E4B}, //10452 #CJK UNIFIED IDEOGRAPH + {0xBF8F, 0x7E4C}, //10453 #CJK UNIFIED IDEOGRAPH + {0xBF90, 0x7E4D}, //10454 #CJK UNIFIED IDEOGRAPH + {0xBF91, 0x7E4E}, //10455 #CJK UNIFIED IDEOGRAPH + {0xBF92, 0x7E4F}, //10456 #CJK UNIFIED IDEOGRAPH + {0xBF93, 0x7E50}, //10457 #CJK UNIFIED IDEOGRAPH + {0xBF94, 0x7E51}, //10458 #CJK UNIFIED IDEOGRAPH + {0xBF95, 0x7E52}, //10459 #CJK UNIFIED IDEOGRAPH + {0xBF96, 0x7E53}, //10460 #CJK UNIFIED IDEOGRAPH + {0xBF97, 0x7E54}, //10461 #CJK UNIFIED IDEOGRAPH + {0xBF98, 0x7E55}, //10462 #CJK UNIFIED IDEOGRAPH + {0xBF99, 0x7E56}, //10463 #CJK UNIFIED IDEOGRAPH + {0xBF9A, 0x7E57}, //10464 #CJK UNIFIED IDEOGRAPH + {0xBF9B, 0x7E58}, //10465 #CJK UNIFIED IDEOGRAPH + {0xBF9C, 0x7E59}, //10466 #CJK UNIFIED IDEOGRAPH + {0xBF9D, 0x7E5A}, //10467 #CJK UNIFIED IDEOGRAPH + {0xBF9E, 0x7E5B}, //10468 #CJK UNIFIED IDEOGRAPH + {0xBF9F, 0x7E5C}, //10469 #CJK UNIFIED IDEOGRAPH + {0xBFA0, 0x7E5D}, //10470 #CJK UNIFIED IDEOGRAPH + {0xBFA1, 0x4FCA}, //10471 #CJK UNIFIED IDEOGRAPH + {0xBFA2, 0x7AE3}, //10472 #CJK UNIFIED IDEOGRAPH + {0xBFA3, 0x6D5A}, //10473 #CJK UNIFIED IDEOGRAPH + {0xBFA4, 0x90E1}, //10474 #CJK UNIFIED IDEOGRAPH + {0xBFA5, 0x9A8F}, //10475 #CJK UNIFIED IDEOGRAPH + {0xBFA6, 0x5580}, //10476 #CJK UNIFIED IDEOGRAPH + {0xBFA7, 0x5496}, //10477 #CJK UNIFIED IDEOGRAPH + {0xBFA8, 0x5361}, //10478 #CJK UNIFIED IDEOGRAPH + {0xBFA9, 0x54AF}, //10479 #CJK UNIFIED IDEOGRAPH + {0xBFAA, 0x5F00}, //10480 #CJK UNIFIED IDEOGRAPH + {0xBFAB, 0x63E9}, //10481 #CJK UNIFIED IDEOGRAPH + {0xBFAC, 0x6977}, //10482 #CJK UNIFIED IDEOGRAPH + {0xBFAD, 0x51EF}, //10483 #CJK UNIFIED IDEOGRAPH + {0xBFAE, 0x6168}, //10484 #CJK UNIFIED IDEOGRAPH + {0xBFAF, 0x520A}, //10485 #CJK UNIFIED IDEOGRAPH + {0xBFB0, 0x582A}, //10486 #CJK UNIFIED IDEOGRAPH + {0xBFB1, 0x52D8}, //10487 #CJK UNIFIED IDEOGRAPH + {0xBFB2, 0x574E}, //10488 #CJK UNIFIED IDEOGRAPH + {0xBFB3, 0x780D}, //10489 #CJK UNIFIED IDEOGRAPH + {0xBFB4, 0x770B}, //10490 #CJK UNIFIED IDEOGRAPH + {0xBFB5, 0x5EB7}, //10491 #CJK UNIFIED IDEOGRAPH + {0xBFB6, 0x6177}, //10492 #CJK UNIFIED IDEOGRAPH + {0xBFB7, 0x7CE0}, //10493 #CJK UNIFIED IDEOGRAPH + {0xBFB8, 0x625B}, //10494 #CJK UNIFIED IDEOGRAPH + {0xBFB9, 0x6297}, //10495 #CJK UNIFIED IDEOGRAPH + {0xBFBA, 0x4EA2}, //10496 #CJK UNIFIED IDEOGRAPH + {0xBFBB, 0x7095}, //10497 #CJK UNIFIED IDEOGRAPH + {0xBFBC, 0x8003}, //10498 #CJK UNIFIED IDEOGRAPH + {0xBFBD, 0x62F7}, //10499 #CJK UNIFIED IDEOGRAPH + {0xBFBE, 0x70E4}, //10500 #CJK UNIFIED IDEOGRAPH + {0xBFBF, 0x9760}, //10501 #CJK UNIFIED IDEOGRAPH + {0xBFC0, 0x5777}, //10502 #CJK UNIFIED IDEOGRAPH + {0xBFC1, 0x82DB}, //10503 #CJK UNIFIED IDEOGRAPH + {0xBFC2, 0x67EF}, //10504 #CJK UNIFIED IDEOGRAPH + {0xBFC3, 0x68F5}, //10505 #CJK UNIFIED IDEOGRAPH + {0xBFC4, 0x78D5}, //10506 #CJK UNIFIED IDEOGRAPH + {0xBFC5, 0x9897}, //10507 #CJK UNIFIED IDEOGRAPH + {0xBFC6, 0x79D1}, //10508 #CJK UNIFIED IDEOGRAPH + {0xBFC7, 0x58F3}, //10509 #CJK UNIFIED IDEOGRAPH + {0xBFC8, 0x54B3}, //10510 #CJK UNIFIED IDEOGRAPH + {0xBFC9, 0x53EF}, //10511 #CJK UNIFIED IDEOGRAPH + {0xBFCA, 0x6E34}, //10512 #CJK UNIFIED IDEOGRAPH + {0xBFCB, 0x514B}, //10513 #CJK UNIFIED IDEOGRAPH + {0xBFCC, 0x523B}, //10514 #CJK UNIFIED IDEOGRAPH + {0xBFCD, 0x5BA2}, //10515 #CJK UNIFIED IDEOGRAPH + {0xBFCE, 0x8BFE}, //10516 #CJK UNIFIED IDEOGRAPH + {0xBFCF, 0x80AF}, //10517 #CJK UNIFIED IDEOGRAPH + {0xBFD0, 0x5543}, //10518 #CJK UNIFIED IDEOGRAPH + {0xBFD1, 0x57A6}, //10519 #CJK UNIFIED IDEOGRAPH + {0xBFD2, 0x6073}, //10520 #CJK UNIFIED IDEOGRAPH + {0xBFD3, 0x5751}, //10521 #CJK UNIFIED IDEOGRAPH + {0xBFD4, 0x542D}, //10522 #CJK UNIFIED IDEOGRAPH + {0xBFD5, 0x7A7A}, //10523 #CJK UNIFIED IDEOGRAPH + {0xBFD6, 0x6050}, //10524 #CJK UNIFIED IDEOGRAPH + {0xBFD7, 0x5B54}, //10525 #CJK UNIFIED IDEOGRAPH + {0xBFD8, 0x63A7}, //10526 #CJK UNIFIED IDEOGRAPH + {0xBFD9, 0x62A0}, //10527 #CJK UNIFIED IDEOGRAPH + {0xBFDA, 0x53E3}, //10528 #CJK UNIFIED IDEOGRAPH + {0xBFDB, 0x6263}, //10529 #CJK UNIFIED IDEOGRAPH + {0xBFDC, 0x5BC7}, //10530 #CJK UNIFIED IDEOGRAPH + {0xBFDD, 0x67AF}, //10531 #CJK UNIFIED IDEOGRAPH + {0xBFDE, 0x54ED}, //10532 #CJK UNIFIED IDEOGRAPH + {0xBFDF, 0x7A9F}, //10533 #CJK UNIFIED IDEOGRAPH + {0xBFE0, 0x82E6}, //10534 #CJK UNIFIED IDEOGRAPH + {0xBFE1, 0x9177}, //10535 #CJK UNIFIED IDEOGRAPH + {0xBFE2, 0x5E93}, //10536 #CJK UNIFIED IDEOGRAPH + {0xBFE3, 0x88E4}, //10537 #CJK UNIFIED IDEOGRAPH + {0xBFE4, 0x5938}, //10538 #CJK UNIFIED IDEOGRAPH + {0xBFE5, 0x57AE}, //10539 #CJK UNIFIED IDEOGRAPH + {0xBFE6, 0x630E}, //10540 #CJK UNIFIED IDEOGRAPH + {0xBFE7, 0x8DE8}, //10541 #CJK UNIFIED IDEOGRAPH + {0xBFE8, 0x80EF}, //10542 #CJK UNIFIED IDEOGRAPH + {0xBFE9, 0x5757}, //10543 #CJK UNIFIED IDEOGRAPH + {0xBFEA, 0x7B77}, //10544 #CJK UNIFIED IDEOGRAPH + {0xBFEB, 0x4FA9}, //10545 #CJK UNIFIED IDEOGRAPH + {0xBFEC, 0x5FEB}, //10546 #CJK UNIFIED IDEOGRAPH + {0xBFED, 0x5BBD}, //10547 #CJK UNIFIED IDEOGRAPH + {0xBFEE, 0x6B3E}, //10548 #CJK UNIFIED IDEOGRAPH + {0xBFEF, 0x5321}, //10549 #CJK UNIFIED IDEOGRAPH + {0xBFF0, 0x7B50}, //10550 #CJK UNIFIED IDEOGRAPH + {0xBFF1, 0x72C2}, //10551 #CJK UNIFIED IDEOGRAPH + {0xBFF2, 0x6846}, //10552 #CJK UNIFIED IDEOGRAPH + {0xBFF3, 0x77FF}, //10553 #CJK UNIFIED IDEOGRAPH + {0xBFF4, 0x7736}, //10554 #CJK UNIFIED IDEOGRAPH + {0xBFF5, 0x65F7}, //10555 #CJK UNIFIED IDEOGRAPH + {0xBFF6, 0x51B5}, //10556 #CJK UNIFIED IDEOGRAPH + {0xBFF7, 0x4E8F}, //10557 #CJK UNIFIED IDEOGRAPH + {0xBFF8, 0x76D4}, //10558 #CJK UNIFIED IDEOGRAPH + {0xBFF9, 0x5CBF}, //10559 #CJK UNIFIED IDEOGRAPH + {0xBFFA, 0x7AA5}, //10560 #CJK UNIFIED IDEOGRAPH + {0xBFFB, 0x8475}, //10561 #CJK UNIFIED IDEOGRAPH + {0xBFFC, 0x594E}, //10562 #CJK UNIFIED IDEOGRAPH + {0xBFFD, 0x9B41}, //10563 #CJK UNIFIED IDEOGRAPH + {0xBFFE, 0x5080}, //10564 #CJK UNIFIED IDEOGRAPH + {0xC040, 0x7E5E}, //10565 #CJK UNIFIED IDEOGRAPH + {0xC041, 0x7E5F}, //10566 #CJK UNIFIED IDEOGRAPH + {0xC042, 0x7E60}, //10567 #CJK UNIFIED IDEOGRAPH + {0xC043, 0x7E61}, //10568 #CJK UNIFIED IDEOGRAPH + {0xC044, 0x7E62}, //10569 #CJK UNIFIED IDEOGRAPH + {0xC045, 0x7E63}, //10570 #CJK UNIFIED IDEOGRAPH + {0xC046, 0x7E64}, //10571 #CJK UNIFIED IDEOGRAPH + {0xC047, 0x7E65}, //10572 #CJK UNIFIED IDEOGRAPH + {0xC048, 0x7E66}, //10573 #CJK UNIFIED IDEOGRAPH + {0xC049, 0x7E67}, //10574 #CJK UNIFIED IDEOGRAPH + {0xC04A, 0x7E68}, //10575 #CJK UNIFIED IDEOGRAPH + {0xC04B, 0x7E69}, //10576 #CJK UNIFIED IDEOGRAPH + {0xC04C, 0x7E6A}, //10577 #CJK UNIFIED IDEOGRAPH + {0xC04D, 0x7E6B}, //10578 #CJK UNIFIED IDEOGRAPH + {0xC04E, 0x7E6C}, //10579 #CJK UNIFIED IDEOGRAPH + {0xC04F, 0x7E6D}, //10580 #CJK UNIFIED IDEOGRAPH + {0xC050, 0x7E6E}, //10581 #CJK UNIFIED IDEOGRAPH + {0xC051, 0x7E6F}, //10582 #CJK UNIFIED IDEOGRAPH + {0xC052, 0x7E70}, //10583 #CJK UNIFIED IDEOGRAPH + {0xC053, 0x7E71}, //10584 #CJK UNIFIED IDEOGRAPH + {0xC054, 0x7E72}, //10585 #CJK UNIFIED IDEOGRAPH + {0xC055, 0x7E73}, //10586 #CJK UNIFIED IDEOGRAPH + {0xC056, 0x7E74}, //10587 #CJK UNIFIED IDEOGRAPH + {0xC057, 0x7E75}, //10588 #CJK UNIFIED IDEOGRAPH + {0xC058, 0x7E76}, //10589 #CJK UNIFIED IDEOGRAPH + {0xC059, 0x7E77}, //10590 #CJK UNIFIED IDEOGRAPH + {0xC05A, 0x7E78}, //10591 #CJK UNIFIED IDEOGRAPH + {0xC05B, 0x7E79}, //10592 #CJK UNIFIED IDEOGRAPH + {0xC05C, 0x7E7A}, //10593 #CJK UNIFIED IDEOGRAPH + {0xC05D, 0x7E7B}, //10594 #CJK UNIFIED IDEOGRAPH + {0xC05E, 0x7E7C}, //10595 #CJK UNIFIED IDEOGRAPH + {0xC05F, 0x7E7D}, //10596 #CJK UNIFIED IDEOGRAPH + {0xC060, 0x7E7E}, //10597 #CJK UNIFIED IDEOGRAPH + {0xC061, 0x7E7F}, //10598 #CJK UNIFIED IDEOGRAPH + {0xC062, 0x7E80}, //10599 #CJK UNIFIED IDEOGRAPH + {0xC063, 0x7E81}, //10600 #CJK UNIFIED IDEOGRAPH + {0xC064, 0x7E83}, //10601 #CJK UNIFIED IDEOGRAPH + {0xC065, 0x7E84}, //10602 #CJK UNIFIED IDEOGRAPH + {0xC066, 0x7E85}, //10603 #CJK UNIFIED IDEOGRAPH + {0xC067, 0x7E86}, //10604 #CJK UNIFIED IDEOGRAPH + {0xC068, 0x7E87}, //10605 #CJK UNIFIED IDEOGRAPH + {0xC069, 0x7E88}, //10606 #CJK UNIFIED IDEOGRAPH + {0xC06A, 0x7E89}, //10607 #CJK UNIFIED IDEOGRAPH + {0xC06B, 0x7E8A}, //10608 #CJK UNIFIED IDEOGRAPH + {0xC06C, 0x7E8B}, //10609 #CJK UNIFIED IDEOGRAPH + {0xC06D, 0x7E8C}, //10610 #CJK UNIFIED IDEOGRAPH + {0xC06E, 0x7E8D}, //10611 #CJK UNIFIED IDEOGRAPH + {0xC06F, 0x7E8E}, //10612 #CJK UNIFIED IDEOGRAPH + {0xC070, 0x7E8F}, //10613 #CJK UNIFIED IDEOGRAPH + {0xC071, 0x7E90}, //10614 #CJK UNIFIED IDEOGRAPH + {0xC072, 0x7E91}, //10615 #CJK UNIFIED IDEOGRAPH + {0xC073, 0x7E92}, //10616 #CJK UNIFIED IDEOGRAPH + {0xC074, 0x7E93}, //10617 #CJK UNIFIED IDEOGRAPH + {0xC075, 0x7E94}, //10618 #CJK UNIFIED IDEOGRAPH + {0xC076, 0x7E95}, //10619 #CJK UNIFIED IDEOGRAPH + {0xC077, 0x7E96}, //10620 #CJK UNIFIED IDEOGRAPH + {0xC078, 0x7E97}, //10621 #CJK UNIFIED IDEOGRAPH + {0xC079, 0x7E98}, //10622 #CJK UNIFIED IDEOGRAPH + {0xC07A, 0x7E99}, //10623 #CJK UNIFIED IDEOGRAPH + {0xC07B, 0x7E9A}, //10624 #CJK UNIFIED IDEOGRAPH + {0xC07C, 0x7E9C}, //10625 #CJK UNIFIED IDEOGRAPH + {0xC07D, 0x7E9D}, //10626 #CJK UNIFIED IDEOGRAPH + {0xC07E, 0x7E9E}, //10627 #CJK UNIFIED IDEOGRAPH + {0xC080, 0x7EAE}, //10628 #CJK UNIFIED IDEOGRAPH + {0xC081, 0x7EB4}, //10629 #CJK UNIFIED IDEOGRAPH + {0xC082, 0x7EBB}, //10630 #CJK UNIFIED IDEOGRAPH + {0xC083, 0x7EBC}, //10631 #CJK UNIFIED IDEOGRAPH + {0xC084, 0x7ED6}, //10632 #CJK UNIFIED IDEOGRAPH + {0xC085, 0x7EE4}, //10633 #CJK UNIFIED IDEOGRAPH + {0xC086, 0x7EEC}, //10634 #CJK UNIFIED IDEOGRAPH + {0xC087, 0x7EF9}, //10635 #CJK UNIFIED IDEOGRAPH + {0xC088, 0x7F0A}, //10636 #CJK UNIFIED IDEOGRAPH + {0xC089, 0x7F10}, //10637 #CJK UNIFIED IDEOGRAPH + {0xC08A, 0x7F1E}, //10638 #CJK UNIFIED IDEOGRAPH + {0xC08B, 0x7F37}, //10639 #CJK UNIFIED IDEOGRAPH + {0xC08C, 0x7F39}, //10640 #CJK UNIFIED IDEOGRAPH + {0xC08D, 0x7F3B}, //10641 #CJK UNIFIED IDEOGRAPH + {0xC08E, 0x7F3C}, //10642 #CJK UNIFIED IDEOGRAPH + {0xC08F, 0x7F3D}, //10643 #CJK UNIFIED IDEOGRAPH + {0xC090, 0x7F3E}, //10644 #CJK UNIFIED IDEOGRAPH + {0xC091, 0x7F3F}, //10645 #CJK UNIFIED IDEOGRAPH + {0xC092, 0x7F40}, //10646 #CJK UNIFIED IDEOGRAPH + {0xC093, 0x7F41}, //10647 #CJK UNIFIED IDEOGRAPH + {0xC094, 0x7F43}, //10648 #CJK UNIFIED IDEOGRAPH + {0xC095, 0x7F46}, //10649 #CJK UNIFIED IDEOGRAPH + {0xC096, 0x7F47}, //10650 #CJK UNIFIED IDEOGRAPH + {0xC097, 0x7F48}, //10651 #CJK UNIFIED IDEOGRAPH + {0xC098, 0x7F49}, //10652 #CJK UNIFIED IDEOGRAPH + {0xC099, 0x7F4A}, //10653 #CJK UNIFIED IDEOGRAPH + {0xC09A, 0x7F4B}, //10654 #CJK UNIFIED IDEOGRAPH + {0xC09B, 0x7F4C}, //10655 #CJK UNIFIED IDEOGRAPH + {0xC09C, 0x7F4D}, //10656 #CJK UNIFIED IDEOGRAPH + {0xC09D, 0x7F4E}, //10657 #CJK UNIFIED IDEOGRAPH + {0xC09E, 0x7F4F}, //10658 #CJK UNIFIED IDEOGRAPH + {0xC09F, 0x7F52}, //10659 #CJK UNIFIED IDEOGRAPH + {0xC0A0, 0x7F53}, //10660 #CJK UNIFIED IDEOGRAPH + {0xC0A1, 0x9988}, //10661 #CJK UNIFIED IDEOGRAPH + {0xC0A2, 0x6127}, //10662 #CJK UNIFIED IDEOGRAPH + {0xC0A3, 0x6E83}, //10663 #CJK UNIFIED IDEOGRAPH + {0xC0A4, 0x5764}, //10664 #CJK UNIFIED IDEOGRAPH + {0xC0A5, 0x6606}, //10665 #CJK UNIFIED IDEOGRAPH + {0xC0A6, 0x6346}, //10666 #CJK UNIFIED IDEOGRAPH + {0xC0A7, 0x56F0}, //10667 #CJK UNIFIED IDEOGRAPH + {0xC0A8, 0x62EC}, //10668 #CJK UNIFIED IDEOGRAPH + {0xC0A9, 0x6269}, //10669 #CJK UNIFIED IDEOGRAPH + {0xC0AA, 0x5ED3}, //10670 #CJK UNIFIED IDEOGRAPH + {0xC0AB, 0x9614}, //10671 #CJK UNIFIED IDEOGRAPH + {0xC0AC, 0x5783}, //10672 #CJK UNIFIED IDEOGRAPH + {0xC0AD, 0x62C9}, //10673 #CJK UNIFIED IDEOGRAPH + {0xC0AE, 0x5587}, //10674 #CJK UNIFIED IDEOGRAPH + {0xC0AF, 0x8721}, //10675 #CJK UNIFIED IDEOGRAPH + {0xC0B0, 0x814A}, //10676 #CJK UNIFIED IDEOGRAPH + {0xC0B1, 0x8FA3}, //10677 #CJK UNIFIED IDEOGRAPH + {0xC0B2, 0x5566}, //10678 #CJK UNIFIED IDEOGRAPH + {0xC0B3, 0x83B1}, //10679 #CJK UNIFIED IDEOGRAPH + {0xC0B4, 0x6765}, //10680 #CJK UNIFIED IDEOGRAPH + {0xC0B5, 0x8D56}, //10681 #CJK UNIFIED IDEOGRAPH + {0xC0B6, 0x84DD}, //10682 #CJK UNIFIED IDEOGRAPH + {0xC0B7, 0x5A6A}, //10683 #CJK UNIFIED IDEOGRAPH + {0xC0B8, 0x680F}, //10684 #CJK UNIFIED IDEOGRAPH + {0xC0B9, 0x62E6}, //10685 #CJK UNIFIED IDEOGRAPH + {0xC0BA, 0x7BEE}, //10686 #CJK UNIFIED IDEOGRAPH + {0xC0BB, 0x9611}, //10687 #CJK UNIFIED IDEOGRAPH + {0xC0BC, 0x5170}, //10688 #CJK UNIFIED IDEOGRAPH + {0xC0BD, 0x6F9C}, //10689 #CJK UNIFIED IDEOGRAPH + {0xC0BE, 0x8C30}, //10690 #CJK UNIFIED IDEOGRAPH + {0xC0BF, 0x63FD}, //10691 #CJK UNIFIED IDEOGRAPH + {0xC0C0, 0x89C8}, //10692 #CJK UNIFIED IDEOGRAPH + {0xC0C1, 0x61D2}, //10693 #CJK UNIFIED IDEOGRAPH + {0xC0C2, 0x7F06}, //10694 #CJK UNIFIED IDEOGRAPH + {0xC0C3, 0x70C2}, //10695 #CJK UNIFIED IDEOGRAPH + {0xC0C4, 0x6EE5}, //10696 #CJK UNIFIED IDEOGRAPH + {0xC0C5, 0x7405}, //10697 #CJK UNIFIED IDEOGRAPH + {0xC0C6, 0x6994}, //10698 #CJK UNIFIED IDEOGRAPH + {0xC0C7, 0x72FC}, //10699 #CJK UNIFIED IDEOGRAPH + {0xC0C8, 0x5ECA}, //10700 #CJK UNIFIED IDEOGRAPH + {0xC0C9, 0x90CE}, //10701 #CJK UNIFIED IDEOGRAPH + {0xC0CA, 0x6717}, //10702 #CJK UNIFIED IDEOGRAPH + {0xC0CB, 0x6D6A}, //10703 #CJK UNIFIED IDEOGRAPH + {0xC0CC, 0x635E}, //10704 #CJK UNIFIED IDEOGRAPH + {0xC0CD, 0x52B3}, //10705 #CJK UNIFIED IDEOGRAPH + {0xC0CE, 0x7262}, //10706 #CJK UNIFIED IDEOGRAPH + {0xC0CF, 0x8001}, //10707 #CJK UNIFIED IDEOGRAPH + {0xC0D0, 0x4F6C}, //10708 #CJK UNIFIED IDEOGRAPH + {0xC0D1, 0x59E5}, //10709 #CJK UNIFIED IDEOGRAPH + {0xC0D2, 0x916A}, //10710 #CJK UNIFIED IDEOGRAPH + {0xC0D3, 0x70D9}, //10711 #CJK UNIFIED IDEOGRAPH + {0xC0D4, 0x6D9D}, //10712 #CJK UNIFIED IDEOGRAPH + {0xC0D5, 0x52D2}, //10713 #CJK UNIFIED IDEOGRAPH + {0xC0D6, 0x4E50}, //10714 #CJK UNIFIED IDEOGRAPH + {0xC0D7, 0x96F7}, //10715 #CJK UNIFIED IDEOGRAPH + {0xC0D8, 0x956D}, //10716 #CJK UNIFIED IDEOGRAPH + {0xC0D9, 0x857E}, //10717 #CJK UNIFIED IDEOGRAPH + {0xC0DA, 0x78CA}, //10718 #CJK UNIFIED IDEOGRAPH + {0xC0DB, 0x7D2F}, //10719 #CJK UNIFIED IDEOGRAPH + {0xC0DC, 0x5121}, //10720 #CJK UNIFIED IDEOGRAPH + {0xC0DD, 0x5792}, //10721 #CJK UNIFIED IDEOGRAPH + {0xC0DE, 0x64C2}, //10722 #CJK UNIFIED IDEOGRAPH + {0xC0DF, 0x808B}, //10723 #CJK UNIFIED IDEOGRAPH + {0xC0E0, 0x7C7B}, //10724 #CJK UNIFIED IDEOGRAPH + {0xC0E1, 0x6CEA}, //10725 #CJK UNIFIED IDEOGRAPH + {0xC0E2, 0x68F1}, //10726 #CJK UNIFIED IDEOGRAPH + {0xC0E3, 0x695E}, //10727 #CJK UNIFIED IDEOGRAPH + {0xC0E4, 0x51B7}, //10728 #CJK UNIFIED IDEOGRAPH + {0xC0E5, 0x5398}, //10729 #CJK UNIFIED IDEOGRAPH + {0xC0E6, 0x68A8}, //10730 #CJK UNIFIED IDEOGRAPH + {0xC0E7, 0x7281}, //10731 #CJK UNIFIED IDEOGRAPH + {0xC0E8, 0x9ECE}, //10732 #CJK UNIFIED IDEOGRAPH + {0xC0E9, 0x7BF1}, //10733 #CJK UNIFIED IDEOGRAPH + {0xC0EA, 0x72F8}, //10734 #CJK UNIFIED IDEOGRAPH + {0xC0EB, 0x79BB}, //10735 #CJK UNIFIED IDEOGRAPH + {0xC0EC, 0x6F13}, //10736 #CJK UNIFIED IDEOGRAPH + {0xC0ED, 0x7406}, //10737 #CJK UNIFIED IDEOGRAPH + {0xC0EE, 0x674E}, //10738 #CJK UNIFIED IDEOGRAPH + {0xC0EF, 0x91CC}, //10739 #CJK UNIFIED IDEOGRAPH + {0xC0F0, 0x9CA4}, //10740 #CJK UNIFIED IDEOGRAPH + {0xC0F1, 0x793C}, //10741 #CJK UNIFIED IDEOGRAPH + {0xC0F2, 0x8389}, //10742 #CJK UNIFIED IDEOGRAPH + {0xC0F3, 0x8354}, //10743 #CJK UNIFIED IDEOGRAPH + {0xC0F4, 0x540F}, //10744 #CJK UNIFIED IDEOGRAPH + {0xC0F5, 0x6817}, //10745 #CJK UNIFIED IDEOGRAPH + {0xC0F6, 0x4E3D}, //10746 #CJK UNIFIED IDEOGRAPH + {0xC0F7, 0x5389}, //10747 #CJK UNIFIED IDEOGRAPH + {0xC0F8, 0x52B1}, //10748 #CJK UNIFIED IDEOGRAPH + {0xC0F9, 0x783E}, //10749 #CJK UNIFIED IDEOGRAPH + {0xC0FA, 0x5386}, //10750 #CJK UNIFIED IDEOGRAPH + {0xC0FB, 0x5229}, //10751 #CJK UNIFIED IDEOGRAPH + {0xC0FC, 0x5088}, //10752 #CJK UNIFIED IDEOGRAPH + {0xC0FD, 0x4F8B}, //10753 #CJK UNIFIED IDEOGRAPH + {0xC0FE, 0x4FD0}, //10754 #CJK UNIFIED IDEOGRAPH + {0xC140, 0x7F56}, //10755 #CJK UNIFIED IDEOGRAPH + {0xC141, 0x7F59}, //10756 #CJK UNIFIED IDEOGRAPH + {0xC142, 0x7F5B}, //10757 #CJK UNIFIED IDEOGRAPH + {0xC143, 0x7F5C}, //10758 #CJK UNIFIED IDEOGRAPH + {0xC144, 0x7F5D}, //10759 #CJK UNIFIED IDEOGRAPH + {0xC145, 0x7F5E}, //10760 #CJK UNIFIED IDEOGRAPH + {0xC146, 0x7F60}, //10761 #CJK UNIFIED IDEOGRAPH + {0xC147, 0x7F63}, //10762 #CJK UNIFIED IDEOGRAPH + {0xC148, 0x7F64}, //10763 #CJK UNIFIED IDEOGRAPH + {0xC149, 0x7F65}, //10764 #CJK UNIFIED IDEOGRAPH + {0xC14A, 0x7F66}, //10765 #CJK UNIFIED IDEOGRAPH + {0xC14B, 0x7F67}, //10766 #CJK UNIFIED IDEOGRAPH + {0xC14C, 0x7F6B}, //10767 #CJK UNIFIED IDEOGRAPH + {0xC14D, 0x7F6C}, //10768 #CJK UNIFIED IDEOGRAPH + {0xC14E, 0x7F6D}, //10769 #CJK UNIFIED IDEOGRAPH + {0xC14F, 0x7F6F}, //10770 #CJK UNIFIED IDEOGRAPH + {0xC150, 0x7F70}, //10771 #CJK UNIFIED IDEOGRAPH + {0xC151, 0x7F73}, //10772 #CJK UNIFIED IDEOGRAPH + {0xC152, 0x7F75}, //10773 #CJK UNIFIED IDEOGRAPH + {0xC153, 0x7F76}, //10774 #CJK UNIFIED IDEOGRAPH + {0xC154, 0x7F77}, //10775 #CJK UNIFIED IDEOGRAPH + {0xC155, 0x7F78}, //10776 #CJK UNIFIED IDEOGRAPH + {0xC156, 0x7F7A}, //10777 #CJK UNIFIED IDEOGRAPH + {0xC157, 0x7F7B}, //10778 #CJK UNIFIED IDEOGRAPH + {0xC158, 0x7F7C}, //10779 #CJK UNIFIED IDEOGRAPH + {0xC159, 0x7F7D}, //10780 #CJK UNIFIED IDEOGRAPH + {0xC15A, 0x7F7F}, //10781 #CJK UNIFIED IDEOGRAPH + {0xC15B, 0x7F80}, //10782 #CJK UNIFIED IDEOGRAPH + {0xC15C, 0x7F82}, //10783 #CJK UNIFIED IDEOGRAPH + {0xC15D, 0x7F83}, //10784 #CJK UNIFIED IDEOGRAPH + {0xC15E, 0x7F84}, //10785 #CJK UNIFIED IDEOGRAPH + {0xC15F, 0x7F85}, //10786 #CJK UNIFIED IDEOGRAPH + {0xC160, 0x7F86}, //10787 #CJK UNIFIED IDEOGRAPH + {0xC161, 0x7F87}, //10788 #CJK UNIFIED IDEOGRAPH + {0xC162, 0x7F88}, //10789 #CJK UNIFIED IDEOGRAPH + {0xC163, 0x7F89}, //10790 #CJK UNIFIED IDEOGRAPH + {0xC164, 0x7F8B}, //10791 #CJK UNIFIED IDEOGRAPH + {0xC165, 0x7F8D}, //10792 #CJK UNIFIED IDEOGRAPH + {0xC166, 0x7F8F}, //10793 #CJK UNIFIED IDEOGRAPH + {0xC167, 0x7F90}, //10794 #CJK UNIFIED IDEOGRAPH + {0xC168, 0x7F91}, //10795 #CJK UNIFIED IDEOGRAPH + {0xC169, 0x7F92}, //10796 #CJK UNIFIED IDEOGRAPH + {0xC16A, 0x7F93}, //10797 #CJK UNIFIED IDEOGRAPH + {0xC16B, 0x7F95}, //10798 #CJK UNIFIED IDEOGRAPH + {0xC16C, 0x7F96}, //10799 #CJK UNIFIED IDEOGRAPH + {0xC16D, 0x7F97}, //10800 #CJK UNIFIED IDEOGRAPH + {0xC16E, 0x7F98}, //10801 #CJK UNIFIED IDEOGRAPH + {0xC16F, 0x7F99}, //10802 #CJK UNIFIED IDEOGRAPH + {0xC170, 0x7F9B}, //10803 #CJK UNIFIED IDEOGRAPH + {0xC171, 0x7F9C}, //10804 #CJK UNIFIED IDEOGRAPH + {0xC172, 0x7FA0}, //10805 #CJK UNIFIED IDEOGRAPH + {0xC173, 0x7FA2}, //10806 #CJK UNIFIED IDEOGRAPH + {0xC174, 0x7FA3}, //10807 #CJK UNIFIED IDEOGRAPH + {0xC175, 0x7FA5}, //10808 #CJK UNIFIED IDEOGRAPH + {0xC176, 0x7FA6}, //10809 #CJK UNIFIED IDEOGRAPH + {0xC177, 0x7FA8}, //10810 #CJK UNIFIED IDEOGRAPH + {0xC178, 0x7FA9}, //10811 #CJK UNIFIED IDEOGRAPH + {0xC179, 0x7FAA}, //10812 #CJK UNIFIED IDEOGRAPH + {0xC17A, 0x7FAB}, //10813 #CJK UNIFIED IDEOGRAPH + {0xC17B, 0x7FAC}, //10814 #CJK UNIFIED IDEOGRAPH + {0xC17C, 0x7FAD}, //10815 #CJK UNIFIED IDEOGRAPH + {0xC17D, 0x7FAE}, //10816 #CJK UNIFIED IDEOGRAPH + {0xC17E, 0x7FB1}, //10817 #CJK UNIFIED IDEOGRAPH + {0xC180, 0x7FB3}, //10818 #CJK UNIFIED IDEOGRAPH + {0xC181, 0x7FB4}, //10819 #CJK UNIFIED IDEOGRAPH + {0xC182, 0x7FB5}, //10820 #CJK UNIFIED IDEOGRAPH + {0xC183, 0x7FB6}, //10821 #CJK UNIFIED IDEOGRAPH + {0xC184, 0x7FB7}, //10822 #CJK UNIFIED IDEOGRAPH + {0xC185, 0x7FBA}, //10823 #CJK UNIFIED IDEOGRAPH + {0xC186, 0x7FBB}, //10824 #CJK UNIFIED IDEOGRAPH + {0xC187, 0x7FBE}, //10825 #CJK UNIFIED IDEOGRAPH + {0xC188, 0x7FC0}, //10826 #CJK UNIFIED IDEOGRAPH + {0xC189, 0x7FC2}, //10827 #CJK UNIFIED IDEOGRAPH + {0xC18A, 0x7FC3}, //10828 #CJK UNIFIED IDEOGRAPH + {0xC18B, 0x7FC4}, //10829 #CJK UNIFIED IDEOGRAPH + {0xC18C, 0x7FC6}, //10830 #CJK UNIFIED IDEOGRAPH + {0xC18D, 0x7FC7}, //10831 #CJK UNIFIED IDEOGRAPH + {0xC18E, 0x7FC8}, //10832 #CJK UNIFIED IDEOGRAPH + {0xC18F, 0x7FC9}, //10833 #CJK UNIFIED IDEOGRAPH + {0xC190, 0x7FCB}, //10834 #CJK UNIFIED IDEOGRAPH + {0xC191, 0x7FCD}, //10835 #CJK UNIFIED IDEOGRAPH + {0xC192, 0x7FCF}, //10836 #CJK UNIFIED IDEOGRAPH + {0xC193, 0x7FD0}, //10837 #CJK UNIFIED IDEOGRAPH + {0xC194, 0x7FD1}, //10838 #CJK UNIFIED IDEOGRAPH + {0xC195, 0x7FD2}, //10839 #CJK UNIFIED IDEOGRAPH + {0xC196, 0x7FD3}, //10840 #CJK UNIFIED IDEOGRAPH + {0xC197, 0x7FD6}, //10841 #CJK UNIFIED IDEOGRAPH + {0xC198, 0x7FD7}, //10842 #CJK UNIFIED IDEOGRAPH + {0xC199, 0x7FD9}, //10843 #CJK UNIFIED IDEOGRAPH + {0xC19A, 0x7FDA}, //10844 #CJK UNIFIED IDEOGRAPH + {0xC19B, 0x7FDB}, //10845 #CJK UNIFIED IDEOGRAPH + {0xC19C, 0x7FDC}, //10846 #CJK UNIFIED IDEOGRAPH + {0xC19D, 0x7FDD}, //10847 #CJK UNIFIED IDEOGRAPH + {0xC19E, 0x7FDE}, //10848 #CJK UNIFIED IDEOGRAPH + {0xC19F, 0x7FE2}, //10849 #CJK UNIFIED IDEOGRAPH + {0xC1A0, 0x7FE3}, //10850 #CJK UNIFIED IDEOGRAPH + {0xC1A1, 0x75E2}, //10851 #CJK UNIFIED IDEOGRAPH + {0xC1A2, 0x7ACB}, //10852 #CJK UNIFIED IDEOGRAPH + {0xC1A3, 0x7C92}, //10853 #CJK UNIFIED IDEOGRAPH + {0xC1A4, 0x6CA5}, //10854 #CJK UNIFIED IDEOGRAPH + {0xC1A5, 0x96B6}, //10855 #CJK UNIFIED IDEOGRAPH + {0xC1A6, 0x529B}, //10856 #CJK UNIFIED IDEOGRAPH + {0xC1A7, 0x7483}, //10857 #CJK UNIFIED IDEOGRAPH + {0xC1A8, 0x54E9}, //10858 #CJK UNIFIED IDEOGRAPH + {0xC1A9, 0x4FE9}, //10859 #CJK UNIFIED IDEOGRAPH + {0xC1AA, 0x8054}, //10860 #CJK UNIFIED IDEOGRAPH + {0xC1AB, 0x83B2}, //10861 #CJK UNIFIED IDEOGRAPH + {0xC1AC, 0x8FDE}, //10862 #CJK UNIFIED IDEOGRAPH + {0xC1AD, 0x9570}, //10863 #CJK UNIFIED IDEOGRAPH + {0xC1AE, 0x5EC9}, //10864 #CJK UNIFIED IDEOGRAPH + {0xC1AF, 0x601C}, //10865 #CJK UNIFIED IDEOGRAPH + {0xC1B0, 0x6D9F}, //10866 #CJK UNIFIED IDEOGRAPH + {0xC1B1, 0x5E18}, //10867 #CJK UNIFIED IDEOGRAPH + {0xC1B2, 0x655B}, //10868 #CJK UNIFIED IDEOGRAPH + {0xC1B3, 0x8138}, //10869 #CJK UNIFIED IDEOGRAPH + {0xC1B4, 0x94FE}, //10870 #CJK UNIFIED IDEOGRAPH + {0xC1B5, 0x604B}, //10871 #CJK UNIFIED IDEOGRAPH + {0xC1B6, 0x70BC}, //10872 #CJK UNIFIED IDEOGRAPH + {0xC1B7, 0x7EC3}, //10873 #CJK UNIFIED IDEOGRAPH + {0xC1B8, 0x7CAE}, //10874 #CJK UNIFIED IDEOGRAPH + {0xC1B9, 0x51C9}, //10875 #CJK UNIFIED IDEOGRAPH + {0xC1BA, 0x6881}, //10876 #CJK UNIFIED IDEOGRAPH + {0xC1BB, 0x7CB1}, //10877 #CJK UNIFIED IDEOGRAPH + {0xC1BC, 0x826F}, //10878 #CJK UNIFIED IDEOGRAPH + {0xC1BD, 0x4E24}, //10879 #CJK UNIFIED IDEOGRAPH + {0xC1BE, 0x8F86}, //10880 #CJK UNIFIED IDEOGRAPH + {0xC1BF, 0x91CF}, //10881 #CJK UNIFIED IDEOGRAPH + {0xC1C0, 0x667E}, //10882 #CJK UNIFIED IDEOGRAPH + {0xC1C1, 0x4EAE}, //10883 #CJK UNIFIED IDEOGRAPH + {0xC1C2, 0x8C05}, //10884 #CJK UNIFIED IDEOGRAPH + {0xC1C3, 0x64A9}, //10885 #CJK UNIFIED IDEOGRAPH + {0xC1C4, 0x804A}, //10886 #CJK UNIFIED IDEOGRAPH + {0xC1C5, 0x50DA}, //10887 #CJK UNIFIED IDEOGRAPH + {0xC1C6, 0x7597}, //10888 #CJK UNIFIED IDEOGRAPH + {0xC1C7, 0x71CE}, //10889 #CJK UNIFIED IDEOGRAPH + {0xC1C8, 0x5BE5}, //10890 #CJK UNIFIED IDEOGRAPH + {0xC1C9, 0x8FBD}, //10891 #CJK UNIFIED IDEOGRAPH + {0xC1CA, 0x6F66}, //10892 #CJK UNIFIED IDEOGRAPH + {0xC1CB, 0x4E86}, //10893 #CJK UNIFIED IDEOGRAPH + {0xC1CC, 0x6482}, //10894 #CJK UNIFIED IDEOGRAPH + {0xC1CD, 0x9563}, //10895 #CJK UNIFIED IDEOGRAPH + {0xC1CE, 0x5ED6}, //10896 #CJK UNIFIED IDEOGRAPH + {0xC1CF, 0x6599}, //10897 #CJK UNIFIED IDEOGRAPH + {0xC1D0, 0x5217}, //10898 #CJK UNIFIED IDEOGRAPH + {0xC1D1, 0x88C2}, //10899 #CJK UNIFIED IDEOGRAPH + {0xC1D2, 0x70C8}, //10900 #CJK UNIFIED IDEOGRAPH + {0xC1D3, 0x52A3}, //10901 #CJK UNIFIED IDEOGRAPH + {0xC1D4, 0x730E}, //10902 #CJK UNIFIED IDEOGRAPH + {0xC1D5, 0x7433}, //10903 #CJK UNIFIED IDEOGRAPH + {0xC1D6, 0x6797}, //10904 #CJK UNIFIED IDEOGRAPH + {0xC1D7, 0x78F7}, //10905 #CJK UNIFIED IDEOGRAPH + {0xC1D8, 0x9716}, //10906 #CJK UNIFIED IDEOGRAPH + {0xC1D9, 0x4E34}, //10907 #CJK UNIFIED IDEOGRAPH + {0xC1DA, 0x90BB}, //10908 #CJK UNIFIED IDEOGRAPH + {0xC1DB, 0x9CDE}, //10909 #CJK UNIFIED IDEOGRAPH + {0xC1DC, 0x6DCB}, //10910 #CJK UNIFIED IDEOGRAPH + {0xC1DD, 0x51DB}, //10911 #CJK UNIFIED IDEOGRAPH + {0xC1DE, 0x8D41}, //10912 #CJK UNIFIED IDEOGRAPH + {0xC1DF, 0x541D}, //10913 #CJK UNIFIED IDEOGRAPH + {0xC1E0, 0x62CE}, //10914 #CJK UNIFIED IDEOGRAPH + {0xC1E1, 0x73B2}, //10915 #CJK UNIFIED IDEOGRAPH + {0xC1E2, 0x83F1}, //10916 #CJK UNIFIED IDEOGRAPH + {0xC1E3, 0x96F6}, //10917 #CJK UNIFIED IDEOGRAPH + {0xC1E4, 0x9F84}, //10918 #CJK UNIFIED IDEOGRAPH + {0xC1E5, 0x94C3}, //10919 #CJK UNIFIED IDEOGRAPH + {0xC1E6, 0x4F36}, //10920 #CJK UNIFIED IDEOGRAPH + {0xC1E7, 0x7F9A}, //10921 #CJK UNIFIED IDEOGRAPH + {0xC1E8, 0x51CC}, //10922 #CJK UNIFIED IDEOGRAPH + {0xC1E9, 0x7075}, //10923 #CJK UNIFIED IDEOGRAPH + {0xC1EA, 0x9675}, //10924 #CJK UNIFIED IDEOGRAPH + {0xC1EB, 0x5CAD}, //10925 #CJK UNIFIED IDEOGRAPH + {0xC1EC, 0x9886}, //10926 #CJK UNIFIED IDEOGRAPH + {0xC1ED, 0x53E6}, //10927 #CJK UNIFIED IDEOGRAPH + {0xC1EE, 0x4EE4}, //10928 #CJK UNIFIED IDEOGRAPH + {0xC1EF, 0x6E9C}, //10929 #CJK UNIFIED IDEOGRAPH + {0xC1F0, 0x7409}, //10930 #CJK UNIFIED IDEOGRAPH + {0xC1F1, 0x69B4}, //10931 #CJK UNIFIED IDEOGRAPH + {0xC1F2, 0x786B}, //10932 #CJK UNIFIED IDEOGRAPH + {0xC1F3, 0x998F}, //10933 #CJK UNIFIED IDEOGRAPH + {0xC1F4, 0x7559}, //10934 #CJK UNIFIED IDEOGRAPH + {0xC1F5, 0x5218}, //10935 #CJK UNIFIED IDEOGRAPH + {0xC1F6, 0x7624}, //10936 #CJK UNIFIED IDEOGRAPH + {0xC1F7, 0x6D41}, //10937 #CJK UNIFIED IDEOGRAPH + {0xC1F8, 0x67F3}, //10938 #CJK UNIFIED IDEOGRAPH + {0xC1F9, 0x516D}, //10939 #CJK UNIFIED IDEOGRAPH + {0xC1FA, 0x9F99}, //10940 #CJK UNIFIED IDEOGRAPH + {0xC1FB, 0x804B}, //10941 #CJK UNIFIED IDEOGRAPH + {0xC1FC, 0x5499}, //10942 #CJK UNIFIED IDEOGRAPH + {0xC1FD, 0x7B3C}, //10943 #CJK UNIFIED IDEOGRAPH + {0xC1FE, 0x7ABF}, //10944 #CJK UNIFIED IDEOGRAPH + {0xC240, 0x7FE4}, //10945 #CJK UNIFIED IDEOGRAPH + {0xC241, 0x7FE7}, //10946 #CJK UNIFIED IDEOGRAPH + {0xC242, 0x7FE8}, //10947 #CJK UNIFIED IDEOGRAPH + {0xC243, 0x7FEA}, //10948 #CJK UNIFIED IDEOGRAPH + {0xC244, 0x7FEB}, //10949 #CJK UNIFIED IDEOGRAPH + {0xC245, 0x7FEC}, //10950 #CJK UNIFIED IDEOGRAPH + {0xC246, 0x7FED}, //10951 #CJK UNIFIED IDEOGRAPH + {0xC247, 0x7FEF}, //10952 #CJK UNIFIED IDEOGRAPH + {0xC248, 0x7FF2}, //10953 #CJK UNIFIED IDEOGRAPH + {0xC249, 0x7FF4}, //10954 #CJK UNIFIED IDEOGRAPH + {0xC24A, 0x7FF5}, //10955 #CJK UNIFIED IDEOGRAPH + {0xC24B, 0x7FF6}, //10956 #CJK UNIFIED IDEOGRAPH + {0xC24C, 0x7FF7}, //10957 #CJK UNIFIED IDEOGRAPH + {0xC24D, 0x7FF8}, //10958 #CJK UNIFIED IDEOGRAPH + {0xC24E, 0x7FF9}, //10959 #CJK UNIFIED IDEOGRAPH + {0xC24F, 0x7FFA}, //10960 #CJK UNIFIED IDEOGRAPH + {0xC250, 0x7FFD}, //10961 #CJK UNIFIED IDEOGRAPH + {0xC251, 0x7FFE}, //10962 #CJK UNIFIED IDEOGRAPH + {0xC252, 0x7FFF}, //10963 #CJK UNIFIED IDEOGRAPH + {0xC253, 0x8002}, //10964 #CJK UNIFIED IDEOGRAPH + {0xC254, 0x8007}, //10965 #CJK UNIFIED IDEOGRAPH + {0xC255, 0x8008}, //10966 #CJK UNIFIED IDEOGRAPH + {0xC256, 0x8009}, //10967 #CJK UNIFIED IDEOGRAPH + {0xC257, 0x800A}, //10968 #CJK UNIFIED IDEOGRAPH + {0xC258, 0x800E}, //10969 #CJK UNIFIED IDEOGRAPH + {0xC259, 0x800F}, //10970 #CJK UNIFIED IDEOGRAPH + {0xC25A, 0x8011}, //10971 #CJK UNIFIED IDEOGRAPH + {0xC25B, 0x8013}, //10972 #CJK UNIFIED IDEOGRAPH + {0xC25C, 0x801A}, //10973 #CJK UNIFIED IDEOGRAPH + {0xC25D, 0x801B}, //10974 #CJK UNIFIED IDEOGRAPH + {0xC25E, 0x801D}, //10975 #CJK UNIFIED IDEOGRAPH + {0xC25F, 0x801E}, //10976 #CJK UNIFIED IDEOGRAPH + {0xC260, 0x801F}, //10977 #CJK UNIFIED IDEOGRAPH + {0xC261, 0x8021}, //10978 #CJK UNIFIED IDEOGRAPH + {0xC262, 0x8023}, //10979 #CJK UNIFIED IDEOGRAPH + {0xC263, 0x8024}, //10980 #CJK UNIFIED IDEOGRAPH + {0xC264, 0x802B}, //10981 #CJK UNIFIED IDEOGRAPH + {0xC265, 0x802C}, //10982 #CJK UNIFIED IDEOGRAPH + {0xC266, 0x802D}, //10983 #CJK UNIFIED IDEOGRAPH + {0xC267, 0x802E}, //10984 #CJK UNIFIED IDEOGRAPH + {0xC268, 0x802F}, //10985 #CJK UNIFIED IDEOGRAPH + {0xC269, 0x8030}, //10986 #CJK UNIFIED IDEOGRAPH + {0xC26A, 0x8032}, //10987 #CJK UNIFIED IDEOGRAPH + {0xC26B, 0x8034}, //10988 #CJK UNIFIED IDEOGRAPH + {0xC26C, 0x8039}, //10989 #CJK UNIFIED IDEOGRAPH + {0xC26D, 0x803A}, //10990 #CJK UNIFIED IDEOGRAPH + {0xC26E, 0x803C}, //10991 #CJK UNIFIED IDEOGRAPH + {0xC26F, 0x803E}, //10992 #CJK UNIFIED IDEOGRAPH + {0xC270, 0x8040}, //10993 #CJK UNIFIED IDEOGRAPH + {0xC271, 0x8041}, //10994 #CJK UNIFIED IDEOGRAPH + {0xC272, 0x8044}, //10995 #CJK UNIFIED IDEOGRAPH + {0xC273, 0x8045}, //10996 #CJK UNIFIED IDEOGRAPH + {0xC274, 0x8047}, //10997 #CJK UNIFIED IDEOGRAPH + {0xC275, 0x8048}, //10998 #CJK UNIFIED IDEOGRAPH + {0xC276, 0x8049}, //10999 #CJK UNIFIED IDEOGRAPH + {0xC277, 0x804E}, //11000 #CJK UNIFIED IDEOGRAPH + {0xC278, 0x804F}, //11001 #CJK UNIFIED IDEOGRAPH + {0xC279, 0x8050}, //11002 #CJK UNIFIED IDEOGRAPH + {0xC27A, 0x8051}, //11003 #CJK UNIFIED IDEOGRAPH + {0xC27B, 0x8053}, //11004 #CJK UNIFIED IDEOGRAPH + {0xC27C, 0x8055}, //11005 #CJK UNIFIED IDEOGRAPH + {0xC27D, 0x8056}, //11006 #CJK UNIFIED IDEOGRAPH + {0xC27E, 0x8057}, //11007 #CJK UNIFIED IDEOGRAPH + {0xC280, 0x8059}, //11008 #CJK UNIFIED IDEOGRAPH + {0xC281, 0x805B}, //11009 #CJK UNIFIED IDEOGRAPH + {0xC282, 0x805C}, //11010 #CJK UNIFIED IDEOGRAPH + {0xC283, 0x805D}, //11011 #CJK UNIFIED IDEOGRAPH + {0xC284, 0x805E}, //11012 #CJK UNIFIED IDEOGRAPH + {0xC285, 0x805F}, //11013 #CJK UNIFIED IDEOGRAPH + {0xC286, 0x8060}, //11014 #CJK UNIFIED IDEOGRAPH + {0xC287, 0x8061}, //11015 #CJK UNIFIED IDEOGRAPH + {0xC288, 0x8062}, //11016 #CJK UNIFIED IDEOGRAPH + {0xC289, 0x8063}, //11017 #CJK UNIFIED IDEOGRAPH + {0xC28A, 0x8064}, //11018 #CJK UNIFIED IDEOGRAPH + {0xC28B, 0x8065}, //11019 #CJK UNIFIED IDEOGRAPH + {0xC28C, 0x8066}, //11020 #CJK UNIFIED IDEOGRAPH + {0xC28D, 0x8067}, //11021 #CJK UNIFIED IDEOGRAPH + {0xC28E, 0x8068}, //11022 #CJK UNIFIED IDEOGRAPH + {0xC28F, 0x806B}, //11023 #CJK UNIFIED IDEOGRAPH + {0xC290, 0x806C}, //11024 #CJK UNIFIED IDEOGRAPH + {0xC291, 0x806D}, //11025 #CJK UNIFIED IDEOGRAPH + {0xC292, 0x806E}, //11026 #CJK UNIFIED IDEOGRAPH + {0xC293, 0x806F}, //11027 #CJK UNIFIED IDEOGRAPH + {0xC294, 0x8070}, //11028 #CJK UNIFIED IDEOGRAPH + {0xC295, 0x8072}, //11029 #CJK UNIFIED IDEOGRAPH + {0xC296, 0x8073}, //11030 #CJK UNIFIED IDEOGRAPH + {0xC297, 0x8074}, //11031 #CJK UNIFIED IDEOGRAPH + {0xC298, 0x8075}, //11032 #CJK UNIFIED IDEOGRAPH + {0xC299, 0x8076}, //11033 #CJK UNIFIED IDEOGRAPH + {0xC29A, 0x8077}, //11034 #CJK UNIFIED IDEOGRAPH + {0xC29B, 0x8078}, //11035 #CJK UNIFIED IDEOGRAPH + {0xC29C, 0x8079}, //11036 #CJK UNIFIED IDEOGRAPH + {0xC29D, 0x807A}, //11037 #CJK UNIFIED IDEOGRAPH + {0xC29E, 0x807B}, //11038 #CJK UNIFIED IDEOGRAPH + {0xC29F, 0x807C}, //11039 #CJK UNIFIED IDEOGRAPH + {0xC2A0, 0x807D}, //11040 #CJK UNIFIED IDEOGRAPH + {0xC2A1, 0x9686}, //11041 #CJK UNIFIED IDEOGRAPH + {0xC2A2, 0x5784}, //11042 #CJK UNIFIED IDEOGRAPH + {0xC2A3, 0x62E2}, //11043 #CJK UNIFIED IDEOGRAPH + {0xC2A4, 0x9647}, //11044 #CJK UNIFIED IDEOGRAPH + {0xC2A5, 0x697C}, //11045 #CJK UNIFIED IDEOGRAPH + {0xC2A6, 0x5A04}, //11046 #CJK UNIFIED IDEOGRAPH + {0xC2A7, 0x6402}, //11047 #CJK UNIFIED IDEOGRAPH + {0xC2A8, 0x7BD3}, //11048 #CJK UNIFIED IDEOGRAPH + {0xC2A9, 0x6F0F}, //11049 #CJK UNIFIED IDEOGRAPH + {0xC2AA, 0x964B}, //11050 #CJK UNIFIED IDEOGRAPH + {0xC2AB, 0x82A6}, //11051 #CJK UNIFIED IDEOGRAPH + {0xC2AC, 0x5362}, //11052 #CJK UNIFIED IDEOGRAPH + {0xC2AD, 0x9885}, //11053 #CJK UNIFIED IDEOGRAPH + {0xC2AE, 0x5E90}, //11054 #CJK UNIFIED IDEOGRAPH + {0xC2AF, 0x7089}, //11055 #CJK UNIFIED IDEOGRAPH + {0xC2B0, 0x63B3}, //11056 #CJK UNIFIED IDEOGRAPH + {0xC2B1, 0x5364}, //11057 #CJK UNIFIED IDEOGRAPH + {0xC2B2, 0x864F}, //11058 #CJK UNIFIED IDEOGRAPH + {0xC2B3, 0x9C81}, //11059 #CJK UNIFIED IDEOGRAPH + {0xC2B4, 0x9E93}, //11060 #CJK UNIFIED IDEOGRAPH + {0xC2B5, 0x788C}, //11061 #CJK UNIFIED IDEOGRAPH + {0xC2B6, 0x9732}, //11062 #CJK UNIFIED IDEOGRAPH + {0xC2B7, 0x8DEF}, //11063 #CJK UNIFIED IDEOGRAPH + {0xC2B8, 0x8D42}, //11064 #CJK UNIFIED IDEOGRAPH + {0xC2B9, 0x9E7F}, //11065 #CJK UNIFIED IDEOGRAPH + {0xC2BA, 0x6F5E}, //11066 #CJK UNIFIED IDEOGRAPH + {0xC2BB, 0x7984}, //11067 #CJK UNIFIED IDEOGRAPH + {0xC2BC, 0x5F55}, //11068 #CJK UNIFIED IDEOGRAPH + {0xC2BD, 0x9646}, //11069 #CJK UNIFIED IDEOGRAPH + {0xC2BE, 0x622E}, //11070 #CJK UNIFIED IDEOGRAPH + {0xC2BF, 0x9A74}, //11071 #CJK UNIFIED IDEOGRAPH + {0xC2C0, 0x5415}, //11072 #CJK UNIFIED IDEOGRAPH + {0xC2C1, 0x94DD}, //11073 #CJK UNIFIED IDEOGRAPH + {0xC2C2, 0x4FA3}, //11074 #CJK UNIFIED IDEOGRAPH + {0xC2C3, 0x65C5}, //11075 #CJK UNIFIED IDEOGRAPH + {0xC2C4, 0x5C65}, //11076 #CJK UNIFIED IDEOGRAPH + {0xC2C5, 0x5C61}, //11077 #CJK UNIFIED IDEOGRAPH + {0xC2C6, 0x7F15}, //11078 #CJK UNIFIED IDEOGRAPH + {0xC2C7, 0x8651}, //11079 #CJK UNIFIED IDEOGRAPH + {0xC2C8, 0x6C2F}, //11080 #CJK UNIFIED IDEOGRAPH + {0xC2C9, 0x5F8B}, //11081 #CJK UNIFIED IDEOGRAPH + {0xC2CA, 0x7387}, //11082 #CJK UNIFIED IDEOGRAPH + {0xC2CB, 0x6EE4}, //11083 #CJK UNIFIED IDEOGRAPH + {0xC2CC, 0x7EFF}, //11084 #CJK UNIFIED IDEOGRAPH + {0xC2CD, 0x5CE6}, //11085 #CJK UNIFIED IDEOGRAPH + {0xC2CE, 0x631B}, //11086 #CJK UNIFIED IDEOGRAPH + {0xC2CF, 0x5B6A}, //11087 #CJK UNIFIED IDEOGRAPH + {0xC2D0, 0x6EE6}, //11088 #CJK UNIFIED IDEOGRAPH + {0xC2D1, 0x5375}, //11089 #CJK UNIFIED IDEOGRAPH + {0xC2D2, 0x4E71}, //11090 #CJK UNIFIED IDEOGRAPH + {0xC2D3, 0x63A0}, //11091 #CJK UNIFIED IDEOGRAPH + {0xC2D4, 0x7565}, //11092 #CJK UNIFIED IDEOGRAPH + {0xC2D5, 0x62A1}, //11093 #CJK UNIFIED IDEOGRAPH + {0xC2D6, 0x8F6E}, //11094 #CJK UNIFIED IDEOGRAPH + {0xC2D7, 0x4F26}, //11095 #CJK UNIFIED IDEOGRAPH + {0xC2D8, 0x4ED1}, //11096 #CJK UNIFIED IDEOGRAPH + {0xC2D9, 0x6CA6}, //11097 #CJK UNIFIED IDEOGRAPH + {0xC2DA, 0x7EB6}, //11098 #CJK UNIFIED IDEOGRAPH + {0xC2DB, 0x8BBA}, //11099 #CJK UNIFIED IDEOGRAPH + {0xC2DC, 0x841D}, //11100 #CJK UNIFIED IDEOGRAPH + {0xC2DD, 0x87BA}, //11101 #CJK UNIFIED IDEOGRAPH + {0xC2DE, 0x7F57}, //11102 #CJK UNIFIED IDEOGRAPH + {0xC2DF, 0x903B}, //11103 #CJK UNIFIED IDEOGRAPH + {0xC2E0, 0x9523}, //11104 #CJK UNIFIED IDEOGRAPH + {0xC2E1, 0x7BA9}, //11105 #CJK UNIFIED IDEOGRAPH + {0xC2E2, 0x9AA1}, //11106 #CJK UNIFIED IDEOGRAPH + {0xC2E3, 0x88F8}, //11107 #CJK UNIFIED IDEOGRAPH + {0xC2E4, 0x843D}, //11108 #CJK UNIFIED IDEOGRAPH + {0xC2E5, 0x6D1B}, //11109 #CJK UNIFIED IDEOGRAPH + {0xC2E6, 0x9A86}, //11110 #CJK UNIFIED IDEOGRAPH + {0xC2E7, 0x7EDC}, //11111 #CJK UNIFIED IDEOGRAPH + {0xC2E8, 0x5988}, //11112 #CJK UNIFIED IDEOGRAPH + {0xC2E9, 0x9EBB}, //11113 #CJK UNIFIED IDEOGRAPH + {0xC2EA, 0x739B}, //11114 #CJK UNIFIED IDEOGRAPH + {0xC2EB, 0x7801}, //11115 #CJK UNIFIED IDEOGRAPH + {0xC2EC, 0x8682}, //11116 #CJK UNIFIED IDEOGRAPH + {0xC2ED, 0x9A6C}, //11117 #CJK UNIFIED IDEOGRAPH + {0xC2EE, 0x9A82}, //11118 #CJK UNIFIED IDEOGRAPH + {0xC2EF, 0x561B}, //11119 #CJK UNIFIED IDEOGRAPH + {0xC2F0, 0x5417}, //11120 #CJK UNIFIED IDEOGRAPH + {0xC2F1, 0x57CB}, //11121 #CJK UNIFIED IDEOGRAPH + {0xC2F2, 0x4E70}, //11122 #CJK UNIFIED IDEOGRAPH + {0xC2F3, 0x9EA6}, //11123 #CJK UNIFIED IDEOGRAPH + {0xC2F4, 0x5356}, //11124 #CJK UNIFIED IDEOGRAPH + {0xC2F5, 0x8FC8}, //11125 #CJK UNIFIED IDEOGRAPH + {0xC2F6, 0x8109}, //11126 #CJK UNIFIED IDEOGRAPH + {0xC2F7, 0x7792}, //11127 #CJK UNIFIED IDEOGRAPH + {0xC2F8, 0x9992}, //11128 #CJK UNIFIED IDEOGRAPH + {0xC2F9, 0x86EE}, //11129 #CJK UNIFIED IDEOGRAPH + {0xC2FA, 0x6EE1}, //11130 #CJK UNIFIED IDEOGRAPH + {0xC2FB, 0x8513}, //11131 #CJK UNIFIED IDEOGRAPH + {0xC2FC, 0x66FC}, //11132 #CJK UNIFIED IDEOGRAPH + {0xC2FD, 0x6162}, //11133 #CJK UNIFIED IDEOGRAPH + {0xC2FE, 0x6F2B}, //11134 #CJK UNIFIED IDEOGRAPH + {0xC340, 0x807E}, //11135 #CJK UNIFIED IDEOGRAPH + {0xC341, 0x8081}, //11136 #CJK UNIFIED IDEOGRAPH + {0xC342, 0x8082}, //11137 #CJK UNIFIED IDEOGRAPH + {0xC343, 0x8085}, //11138 #CJK UNIFIED IDEOGRAPH + {0xC344, 0x8088}, //11139 #CJK UNIFIED IDEOGRAPH + {0xC345, 0x808A}, //11140 #CJK UNIFIED IDEOGRAPH + {0xC346, 0x808D}, //11141 #CJK UNIFIED IDEOGRAPH + {0xC347, 0x808E}, //11142 #CJK UNIFIED IDEOGRAPH + {0xC348, 0x808F}, //11143 #CJK UNIFIED IDEOGRAPH + {0xC349, 0x8090}, //11144 #CJK UNIFIED IDEOGRAPH + {0xC34A, 0x8091}, //11145 #CJK UNIFIED IDEOGRAPH + {0xC34B, 0x8092}, //11146 #CJK UNIFIED IDEOGRAPH + {0xC34C, 0x8094}, //11147 #CJK UNIFIED IDEOGRAPH + {0xC34D, 0x8095}, //11148 #CJK UNIFIED IDEOGRAPH + {0xC34E, 0x8097}, //11149 #CJK UNIFIED IDEOGRAPH + {0xC34F, 0x8099}, //11150 #CJK UNIFIED IDEOGRAPH + {0xC350, 0x809E}, //11151 #CJK UNIFIED IDEOGRAPH + {0xC351, 0x80A3}, //11152 #CJK UNIFIED IDEOGRAPH + {0xC352, 0x80A6}, //11153 #CJK UNIFIED IDEOGRAPH + {0xC353, 0x80A7}, //11154 #CJK UNIFIED IDEOGRAPH + {0xC354, 0x80A8}, //11155 #CJK UNIFIED IDEOGRAPH + {0xC355, 0x80AC}, //11156 #CJK UNIFIED IDEOGRAPH + {0xC356, 0x80B0}, //11157 #CJK UNIFIED IDEOGRAPH + {0xC357, 0x80B3}, //11158 #CJK UNIFIED IDEOGRAPH + {0xC358, 0x80B5}, //11159 #CJK UNIFIED IDEOGRAPH + {0xC359, 0x80B6}, //11160 #CJK UNIFIED IDEOGRAPH + {0xC35A, 0x80B8}, //11161 #CJK UNIFIED IDEOGRAPH + {0xC35B, 0x80B9}, //11162 #CJK UNIFIED IDEOGRAPH + {0xC35C, 0x80BB}, //11163 #CJK UNIFIED IDEOGRAPH + {0xC35D, 0x80C5}, //11164 #CJK UNIFIED IDEOGRAPH + {0xC35E, 0x80C7}, //11165 #CJK UNIFIED IDEOGRAPH + {0xC35F, 0x80C8}, //11166 #CJK UNIFIED IDEOGRAPH + {0xC360, 0x80C9}, //11167 #CJK UNIFIED IDEOGRAPH + {0xC361, 0x80CA}, //11168 #CJK UNIFIED IDEOGRAPH + {0xC362, 0x80CB}, //11169 #CJK UNIFIED IDEOGRAPH + {0xC363, 0x80CF}, //11170 #CJK UNIFIED IDEOGRAPH + {0xC364, 0x80D0}, //11171 #CJK UNIFIED IDEOGRAPH + {0xC365, 0x80D1}, //11172 #CJK UNIFIED IDEOGRAPH + {0xC366, 0x80D2}, //11173 #CJK UNIFIED IDEOGRAPH + {0xC367, 0x80D3}, //11174 #CJK UNIFIED IDEOGRAPH + {0xC368, 0x80D4}, //11175 #CJK UNIFIED IDEOGRAPH + {0xC369, 0x80D5}, //11176 #CJK UNIFIED IDEOGRAPH + {0xC36A, 0x80D8}, //11177 #CJK UNIFIED IDEOGRAPH + {0xC36B, 0x80DF}, //11178 #CJK UNIFIED IDEOGRAPH + {0xC36C, 0x80E0}, //11179 #CJK UNIFIED IDEOGRAPH + {0xC36D, 0x80E2}, //11180 #CJK UNIFIED IDEOGRAPH + {0xC36E, 0x80E3}, //11181 #CJK UNIFIED IDEOGRAPH + {0xC36F, 0x80E6}, //11182 #CJK UNIFIED IDEOGRAPH + {0xC370, 0x80EE}, //11183 #CJK UNIFIED IDEOGRAPH + {0xC371, 0x80F5}, //11184 #CJK UNIFIED IDEOGRAPH + {0xC372, 0x80F7}, //11185 #CJK UNIFIED IDEOGRAPH + {0xC373, 0x80F9}, //11186 #CJK UNIFIED IDEOGRAPH + {0xC374, 0x80FB}, //11187 #CJK UNIFIED IDEOGRAPH + {0xC375, 0x80FE}, //11188 #CJK UNIFIED IDEOGRAPH + {0xC376, 0x80FF}, //11189 #CJK UNIFIED IDEOGRAPH + {0xC377, 0x8100}, //11190 #CJK UNIFIED IDEOGRAPH + {0xC378, 0x8101}, //11191 #CJK UNIFIED IDEOGRAPH + {0xC379, 0x8103}, //11192 #CJK UNIFIED IDEOGRAPH + {0xC37A, 0x8104}, //11193 #CJK UNIFIED IDEOGRAPH + {0xC37B, 0x8105}, //11194 #CJK UNIFIED IDEOGRAPH + {0xC37C, 0x8107}, //11195 #CJK UNIFIED IDEOGRAPH + {0xC37D, 0x8108}, //11196 #CJK UNIFIED IDEOGRAPH + {0xC37E, 0x810B}, //11197 #CJK UNIFIED IDEOGRAPH + {0xC380, 0x810C}, //11198 #CJK UNIFIED IDEOGRAPH + {0xC381, 0x8115}, //11199 #CJK UNIFIED IDEOGRAPH + {0xC382, 0x8117}, //11200 #CJK UNIFIED IDEOGRAPH + {0xC383, 0x8119}, //11201 #CJK UNIFIED IDEOGRAPH + {0xC384, 0x811B}, //11202 #CJK UNIFIED IDEOGRAPH + {0xC385, 0x811C}, //11203 #CJK UNIFIED IDEOGRAPH + {0xC386, 0x811D}, //11204 #CJK UNIFIED IDEOGRAPH + {0xC387, 0x811F}, //11205 #CJK UNIFIED IDEOGRAPH + {0xC388, 0x8120}, //11206 #CJK UNIFIED IDEOGRAPH + {0xC389, 0x8121}, //11207 #CJK UNIFIED IDEOGRAPH + {0xC38A, 0x8122}, //11208 #CJK UNIFIED IDEOGRAPH + {0xC38B, 0x8123}, //11209 #CJK UNIFIED IDEOGRAPH + {0xC38C, 0x8124}, //11210 #CJK UNIFIED IDEOGRAPH + {0xC38D, 0x8125}, //11211 #CJK UNIFIED IDEOGRAPH + {0xC38E, 0x8126}, //11212 #CJK UNIFIED IDEOGRAPH + {0xC38F, 0x8127}, //11213 #CJK UNIFIED IDEOGRAPH + {0xC390, 0x8128}, //11214 #CJK UNIFIED IDEOGRAPH + {0xC391, 0x8129}, //11215 #CJK UNIFIED IDEOGRAPH + {0xC392, 0x812A}, //11216 #CJK UNIFIED IDEOGRAPH + {0xC393, 0x812B}, //11217 #CJK UNIFIED IDEOGRAPH + {0xC394, 0x812D}, //11218 #CJK UNIFIED IDEOGRAPH + {0xC395, 0x812E}, //11219 #CJK UNIFIED IDEOGRAPH + {0xC396, 0x8130}, //11220 #CJK UNIFIED IDEOGRAPH + {0xC397, 0x8133}, //11221 #CJK UNIFIED IDEOGRAPH + {0xC398, 0x8134}, //11222 #CJK UNIFIED IDEOGRAPH + {0xC399, 0x8135}, //11223 #CJK UNIFIED IDEOGRAPH + {0xC39A, 0x8137}, //11224 #CJK UNIFIED IDEOGRAPH + {0xC39B, 0x8139}, //11225 #CJK UNIFIED IDEOGRAPH + {0xC39C, 0x813A}, //11226 #CJK UNIFIED IDEOGRAPH + {0xC39D, 0x813B}, //11227 #CJK UNIFIED IDEOGRAPH + {0xC39E, 0x813C}, //11228 #CJK UNIFIED IDEOGRAPH + {0xC39F, 0x813D}, //11229 #CJK UNIFIED IDEOGRAPH + {0xC3A0, 0x813F}, //11230 #CJK UNIFIED IDEOGRAPH + {0xC3A1, 0x8C29}, //11231 #CJK UNIFIED IDEOGRAPH + {0xC3A2, 0x8292}, //11232 #CJK UNIFIED IDEOGRAPH + {0xC3A3, 0x832B}, //11233 #CJK UNIFIED IDEOGRAPH + {0xC3A4, 0x76F2}, //11234 #CJK UNIFIED IDEOGRAPH + {0xC3A5, 0x6C13}, //11235 #CJK UNIFIED IDEOGRAPH + {0xC3A6, 0x5FD9}, //11236 #CJK UNIFIED IDEOGRAPH + {0xC3A7, 0x83BD}, //11237 #CJK UNIFIED IDEOGRAPH + {0xC3A8, 0x732B}, //11238 #CJK UNIFIED IDEOGRAPH + {0xC3A9, 0x8305}, //11239 #CJK UNIFIED IDEOGRAPH + {0xC3AA, 0x951A}, //11240 #CJK UNIFIED IDEOGRAPH + {0xC3AB, 0x6BDB}, //11241 #CJK UNIFIED IDEOGRAPH + {0xC3AC, 0x77DB}, //11242 #CJK UNIFIED IDEOGRAPH + {0xC3AD, 0x94C6}, //11243 #CJK UNIFIED IDEOGRAPH + {0xC3AE, 0x536F}, //11244 #CJK UNIFIED IDEOGRAPH + {0xC3AF, 0x8302}, //11245 #CJK UNIFIED IDEOGRAPH + {0xC3B0, 0x5192}, //11246 #CJK UNIFIED IDEOGRAPH + {0xC3B1, 0x5E3D}, //11247 #CJK UNIFIED IDEOGRAPH + {0xC3B2, 0x8C8C}, //11248 #CJK UNIFIED IDEOGRAPH + {0xC3B3, 0x8D38}, //11249 #CJK UNIFIED IDEOGRAPH + {0xC3B4, 0x4E48}, //11250 #CJK UNIFIED IDEOGRAPH + {0xC3B5, 0x73AB}, //11251 #CJK UNIFIED IDEOGRAPH + {0xC3B6, 0x679A}, //11252 #CJK UNIFIED IDEOGRAPH + {0xC3B7, 0x6885}, //11253 #CJK UNIFIED IDEOGRAPH + {0xC3B8, 0x9176}, //11254 #CJK UNIFIED IDEOGRAPH + {0xC3B9, 0x9709}, //11255 #CJK UNIFIED IDEOGRAPH + {0xC3BA, 0x7164}, //11256 #CJK UNIFIED IDEOGRAPH + {0xC3BB, 0x6CA1}, //11257 #CJK UNIFIED IDEOGRAPH + {0xC3BC, 0x7709}, //11258 #CJK UNIFIED IDEOGRAPH + {0xC3BD, 0x5A92}, //11259 #CJK UNIFIED IDEOGRAPH + {0xC3BE, 0x9541}, //11260 #CJK UNIFIED IDEOGRAPH + {0xC3BF, 0x6BCF}, //11261 #CJK UNIFIED IDEOGRAPH + {0xC3C0, 0x7F8E}, //11262 #CJK UNIFIED IDEOGRAPH + {0xC3C1, 0x6627}, //11263 #CJK UNIFIED IDEOGRAPH + {0xC3C2, 0x5BD0}, //11264 #CJK UNIFIED IDEOGRAPH + {0xC3C3, 0x59B9}, //11265 #CJK UNIFIED IDEOGRAPH + {0xC3C4, 0x5A9A}, //11266 #CJK UNIFIED IDEOGRAPH + {0xC3C5, 0x95E8}, //11267 #CJK UNIFIED IDEOGRAPH + {0xC3C6, 0x95F7}, //11268 #CJK UNIFIED IDEOGRAPH + {0xC3C7, 0x4EEC}, //11269 #CJK UNIFIED IDEOGRAPH + {0xC3C8, 0x840C}, //11270 #CJK UNIFIED IDEOGRAPH + {0xC3C9, 0x8499}, //11271 #CJK UNIFIED IDEOGRAPH + {0xC3CA, 0x6AAC}, //11272 #CJK UNIFIED IDEOGRAPH + {0xC3CB, 0x76DF}, //11273 #CJK UNIFIED IDEOGRAPH + {0xC3CC, 0x9530}, //11274 #CJK UNIFIED IDEOGRAPH + {0xC3CD, 0x731B}, //11275 #CJK UNIFIED IDEOGRAPH + {0xC3CE, 0x68A6}, //11276 #CJK UNIFIED IDEOGRAPH + {0xC3CF, 0x5B5F}, //11277 #CJK UNIFIED IDEOGRAPH + {0xC3D0, 0x772F}, //11278 #CJK UNIFIED IDEOGRAPH + {0xC3D1, 0x919A}, //11279 #CJK UNIFIED IDEOGRAPH + {0xC3D2, 0x9761}, //11280 #CJK UNIFIED IDEOGRAPH + {0xC3D3, 0x7CDC}, //11281 #CJK UNIFIED IDEOGRAPH + {0xC3D4, 0x8FF7}, //11282 #CJK UNIFIED IDEOGRAPH + {0xC3D5, 0x8C1C}, //11283 #CJK UNIFIED IDEOGRAPH + {0xC3D6, 0x5F25}, //11284 #CJK UNIFIED IDEOGRAPH + {0xC3D7, 0x7C73}, //11285 #CJK UNIFIED IDEOGRAPH + {0xC3D8, 0x79D8}, //11286 #CJK UNIFIED IDEOGRAPH + {0xC3D9, 0x89C5}, //11287 #CJK UNIFIED IDEOGRAPH + {0xC3DA, 0x6CCC}, //11288 #CJK UNIFIED IDEOGRAPH + {0xC3DB, 0x871C}, //11289 #CJK UNIFIED IDEOGRAPH + {0xC3DC, 0x5BC6}, //11290 #CJK UNIFIED IDEOGRAPH + {0xC3DD, 0x5E42}, //11291 #CJK UNIFIED IDEOGRAPH + {0xC3DE, 0x68C9}, //11292 #CJK UNIFIED IDEOGRAPH + {0xC3DF, 0x7720}, //11293 #CJK UNIFIED IDEOGRAPH + {0xC3E0, 0x7EF5}, //11294 #CJK UNIFIED IDEOGRAPH + {0xC3E1, 0x5195}, //11295 #CJK UNIFIED IDEOGRAPH + {0xC3E2, 0x514D}, //11296 #CJK UNIFIED IDEOGRAPH + {0xC3E3, 0x52C9}, //11297 #CJK UNIFIED IDEOGRAPH + {0xC3E4, 0x5A29}, //11298 #CJK UNIFIED IDEOGRAPH + {0xC3E5, 0x7F05}, //11299 #CJK UNIFIED IDEOGRAPH + {0xC3E6, 0x9762}, //11300 #CJK UNIFIED IDEOGRAPH + {0xC3E7, 0x82D7}, //11301 #CJK UNIFIED IDEOGRAPH + {0xC3E8, 0x63CF}, //11302 #CJK UNIFIED IDEOGRAPH + {0xC3E9, 0x7784}, //11303 #CJK UNIFIED IDEOGRAPH + {0xC3EA, 0x85D0}, //11304 #CJK UNIFIED IDEOGRAPH + {0xC3EB, 0x79D2}, //11305 #CJK UNIFIED IDEOGRAPH + {0xC3EC, 0x6E3A}, //11306 #CJK UNIFIED IDEOGRAPH + {0xC3ED, 0x5E99}, //11307 #CJK UNIFIED IDEOGRAPH + {0xC3EE, 0x5999}, //11308 #CJK UNIFIED IDEOGRAPH + {0xC3EF, 0x8511}, //11309 #CJK UNIFIED IDEOGRAPH + {0xC3F0, 0x706D}, //11310 #CJK UNIFIED IDEOGRAPH + {0xC3F1, 0x6C11}, //11311 #CJK UNIFIED IDEOGRAPH + {0xC3F2, 0x62BF}, //11312 #CJK UNIFIED IDEOGRAPH + {0xC3F3, 0x76BF}, //11313 #CJK UNIFIED IDEOGRAPH + {0xC3F4, 0x654F}, //11314 #CJK UNIFIED IDEOGRAPH + {0xC3F5, 0x60AF}, //11315 #CJK UNIFIED IDEOGRAPH + {0xC3F6, 0x95FD}, //11316 #CJK UNIFIED IDEOGRAPH + {0xC3F7, 0x660E}, //11317 #CJK UNIFIED IDEOGRAPH + {0xC3F8, 0x879F}, //11318 #CJK UNIFIED IDEOGRAPH + {0xC3F9, 0x9E23}, //11319 #CJK UNIFIED IDEOGRAPH + {0xC3FA, 0x94ED}, //11320 #CJK UNIFIED IDEOGRAPH + {0xC3FB, 0x540D}, //11321 #CJK UNIFIED IDEOGRAPH + {0xC3FC, 0x547D}, //11322 #CJK UNIFIED IDEOGRAPH + {0xC3FD, 0x8C2C}, //11323 #CJK UNIFIED IDEOGRAPH + {0xC3FE, 0x6478}, //11324 #CJK UNIFIED IDEOGRAPH + {0xC440, 0x8140}, //11325 #CJK UNIFIED IDEOGRAPH + {0xC441, 0x8141}, //11326 #CJK UNIFIED IDEOGRAPH + {0xC442, 0x8142}, //11327 #CJK UNIFIED IDEOGRAPH + {0xC443, 0x8143}, //11328 #CJK UNIFIED IDEOGRAPH + {0xC444, 0x8144}, //11329 #CJK UNIFIED IDEOGRAPH + {0xC445, 0x8145}, //11330 #CJK UNIFIED IDEOGRAPH + {0xC446, 0x8147}, //11331 #CJK UNIFIED IDEOGRAPH + {0xC447, 0x8149}, //11332 #CJK UNIFIED IDEOGRAPH + {0xC448, 0x814D}, //11333 #CJK UNIFIED IDEOGRAPH + {0xC449, 0x814E}, //11334 #CJK UNIFIED IDEOGRAPH + {0xC44A, 0x814F}, //11335 #CJK UNIFIED IDEOGRAPH + {0xC44B, 0x8152}, //11336 #CJK UNIFIED IDEOGRAPH + {0xC44C, 0x8156}, //11337 #CJK UNIFIED IDEOGRAPH + {0xC44D, 0x8157}, //11338 #CJK UNIFIED IDEOGRAPH + {0xC44E, 0x8158}, //11339 #CJK UNIFIED IDEOGRAPH + {0xC44F, 0x815B}, //11340 #CJK UNIFIED IDEOGRAPH + {0xC450, 0x815C}, //11341 #CJK UNIFIED IDEOGRAPH + {0xC451, 0x815D}, //11342 #CJK UNIFIED IDEOGRAPH + {0xC452, 0x815E}, //11343 #CJK UNIFIED IDEOGRAPH + {0xC453, 0x815F}, //11344 #CJK UNIFIED IDEOGRAPH + {0xC454, 0x8161}, //11345 #CJK UNIFIED IDEOGRAPH + {0xC455, 0x8162}, //11346 #CJK UNIFIED IDEOGRAPH + {0xC456, 0x8163}, //11347 #CJK UNIFIED IDEOGRAPH + {0xC457, 0x8164}, //11348 #CJK UNIFIED IDEOGRAPH + {0xC458, 0x8166}, //11349 #CJK UNIFIED IDEOGRAPH + {0xC459, 0x8168}, //11350 #CJK UNIFIED IDEOGRAPH + {0xC45A, 0x816A}, //11351 #CJK UNIFIED IDEOGRAPH + {0xC45B, 0x816B}, //11352 #CJK UNIFIED IDEOGRAPH + {0xC45C, 0x816C}, //11353 #CJK UNIFIED IDEOGRAPH + {0xC45D, 0x816F}, //11354 #CJK UNIFIED IDEOGRAPH + {0xC45E, 0x8172}, //11355 #CJK UNIFIED IDEOGRAPH + {0xC45F, 0x8173}, //11356 #CJK UNIFIED IDEOGRAPH + {0xC460, 0x8175}, //11357 #CJK UNIFIED IDEOGRAPH + {0xC461, 0x8176}, //11358 #CJK UNIFIED IDEOGRAPH + {0xC462, 0x8177}, //11359 #CJK UNIFIED IDEOGRAPH + {0xC463, 0x8178}, //11360 #CJK UNIFIED IDEOGRAPH + {0xC464, 0x8181}, //11361 #CJK UNIFIED IDEOGRAPH + {0xC465, 0x8183}, //11362 #CJK UNIFIED IDEOGRAPH + {0xC466, 0x8184}, //11363 #CJK UNIFIED IDEOGRAPH + {0xC467, 0x8185}, //11364 #CJK UNIFIED IDEOGRAPH + {0xC468, 0x8186}, //11365 #CJK UNIFIED IDEOGRAPH + {0xC469, 0x8187}, //11366 #CJK UNIFIED IDEOGRAPH + {0xC46A, 0x8189}, //11367 #CJK UNIFIED IDEOGRAPH + {0xC46B, 0x818B}, //11368 #CJK UNIFIED IDEOGRAPH + {0xC46C, 0x818C}, //11369 #CJK UNIFIED IDEOGRAPH + {0xC46D, 0x818D}, //11370 #CJK UNIFIED IDEOGRAPH + {0xC46E, 0x818E}, //11371 #CJK UNIFIED IDEOGRAPH + {0xC46F, 0x8190}, //11372 #CJK UNIFIED IDEOGRAPH + {0xC470, 0x8192}, //11373 #CJK UNIFIED IDEOGRAPH + {0xC471, 0x8193}, //11374 #CJK UNIFIED IDEOGRAPH + {0xC472, 0x8194}, //11375 #CJK UNIFIED IDEOGRAPH + {0xC473, 0x8195}, //11376 #CJK UNIFIED IDEOGRAPH + {0xC474, 0x8196}, //11377 #CJK UNIFIED IDEOGRAPH + {0xC475, 0x8197}, //11378 #CJK UNIFIED IDEOGRAPH + {0xC476, 0x8199}, //11379 #CJK UNIFIED IDEOGRAPH + {0xC477, 0x819A}, //11380 #CJK UNIFIED IDEOGRAPH + {0xC478, 0x819E}, //11381 #CJK UNIFIED IDEOGRAPH + {0xC479, 0x819F}, //11382 #CJK UNIFIED IDEOGRAPH + {0xC47A, 0x81A0}, //11383 #CJK UNIFIED IDEOGRAPH + {0xC47B, 0x81A1}, //11384 #CJK UNIFIED IDEOGRAPH + {0xC47C, 0x81A2}, //11385 #CJK UNIFIED IDEOGRAPH + {0xC47D, 0x81A4}, //11386 #CJK UNIFIED IDEOGRAPH + {0xC47E, 0x81A5}, //11387 #CJK UNIFIED IDEOGRAPH + {0xC480, 0x81A7}, //11388 #CJK UNIFIED IDEOGRAPH + {0xC481, 0x81A9}, //11389 #CJK UNIFIED IDEOGRAPH + {0xC482, 0x81AB}, //11390 #CJK UNIFIED IDEOGRAPH + {0xC483, 0x81AC}, //11391 #CJK UNIFIED IDEOGRAPH + {0xC484, 0x81AD}, //11392 #CJK UNIFIED IDEOGRAPH + {0xC485, 0x81AE}, //11393 #CJK UNIFIED IDEOGRAPH + {0xC486, 0x81AF}, //11394 #CJK UNIFIED IDEOGRAPH + {0xC487, 0x81B0}, //11395 #CJK UNIFIED IDEOGRAPH + {0xC488, 0x81B1}, //11396 #CJK UNIFIED IDEOGRAPH + {0xC489, 0x81B2}, //11397 #CJK UNIFIED IDEOGRAPH + {0xC48A, 0x81B4}, //11398 #CJK UNIFIED IDEOGRAPH + {0xC48B, 0x81B5}, //11399 #CJK UNIFIED IDEOGRAPH + {0xC48C, 0x81B6}, //11400 #CJK UNIFIED IDEOGRAPH + {0xC48D, 0x81B7}, //11401 #CJK UNIFIED IDEOGRAPH + {0xC48E, 0x81B8}, //11402 #CJK UNIFIED IDEOGRAPH + {0xC48F, 0x81B9}, //11403 #CJK UNIFIED IDEOGRAPH + {0xC490, 0x81BC}, //11404 #CJK UNIFIED IDEOGRAPH + {0xC491, 0x81BD}, //11405 #CJK UNIFIED IDEOGRAPH + {0xC492, 0x81BE}, //11406 #CJK UNIFIED IDEOGRAPH + {0xC493, 0x81BF}, //11407 #CJK UNIFIED IDEOGRAPH + {0xC494, 0x81C4}, //11408 #CJK UNIFIED IDEOGRAPH + {0xC495, 0x81C5}, //11409 #CJK UNIFIED IDEOGRAPH + {0xC496, 0x81C7}, //11410 #CJK UNIFIED IDEOGRAPH + {0xC497, 0x81C8}, //11411 #CJK UNIFIED IDEOGRAPH + {0xC498, 0x81C9}, //11412 #CJK UNIFIED IDEOGRAPH + {0xC499, 0x81CB}, //11413 #CJK UNIFIED IDEOGRAPH + {0xC49A, 0x81CD}, //11414 #CJK UNIFIED IDEOGRAPH + {0xC49B, 0x81CE}, //11415 #CJK UNIFIED IDEOGRAPH + {0xC49C, 0x81CF}, //11416 #CJK UNIFIED IDEOGRAPH + {0xC49D, 0x81D0}, //11417 #CJK UNIFIED IDEOGRAPH + {0xC49E, 0x81D1}, //11418 #CJK UNIFIED IDEOGRAPH + {0xC49F, 0x81D2}, //11419 #CJK UNIFIED IDEOGRAPH + {0xC4A0, 0x81D3}, //11420 #CJK UNIFIED IDEOGRAPH + {0xC4A1, 0x6479}, //11421 #CJK UNIFIED IDEOGRAPH + {0xC4A2, 0x8611}, //11422 #CJK UNIFIED IDEOGRAPH + {0xC4A3, 0x6A21}, //11423 #CJK UNIFIED IDEOGRAPH + {0xC4A4, 0x819C}, //11424 #CJK UNIFIED IDEOGRAPH + {0xC4A5, 0x78E8}, //11425 #CJK UNIFIED IDEOGRAPH + {0xC4A6, 0x6469}, //11426 #CJK UNIFIED IDEOGRAPH + {0xC4A7, 0x9B54}, //11427 #CJK UNIFIED IDEOGRAPH + {0xC4A8, 0x62B9}, //11428 #CJK UNIFIED IDEOGRAPH + {0xC4A9, 0x672B}, //11429 #CJK UNIFIED IDEOGRAPH + {0xC4AA, 0x83AB}, //11430 #CJK UNIFIED IDEOGRAPH + {0xC4AB, 0x58A8}, //11431 #CJK UNIFIED IDEOGRAPH + {0xC4AC, 0x9ED8}, //11432 #CJK UNIFIED IDEOGRAPH + {0xC4AD, 0x6CAB}, //11433 #CJK UNIFIED IDEOGRAPH + {0xC4AE, 0x6F20}, //11434 #CJK UNIFIED IDEOGRAPH + {0xC4AF, 0x5BDE}, //11435 #CJK UNIFIED IDEOGRAPH + {0xC4B0, 0x964C}, //11436 #CJK UNIFIED IDEOGRAPH + {0xC4B1, 0x8C0B}, //11437 #CJK UNIFIED IDEOGRAPH + {0xC4B2, 0x725F}, //11438 #CJK UNIFIED IDEOGRAPH + {0xC4B3, 0x67D0}, //11439 #CJK UNIFIED IDEOGRAPH + {0xC4B4, 0x62C7}, //11440 #CJK UNIFIED IDEOGRAPH + {0xC4B5, 0x7261}, //11441 #CJK UNIFIED IDEOGRAPH + {0xC4B6, 0x4EA9}, //11442 #CJK UNIFIED IDEOGRAPH + {0xC4B7, 0x59C6}, //11443 #CJK UNIFIED IDEOGRAPH + {0xC4B8, 0x6BCD}, //11444 #CJK UNIFIED IDEOGRAPH + {0xC4B9, 0x5893}, //11445 #CJK UNIFIED IDEOGRAPH + {0xC4BA, 0x66AE}, //11446 #CJK UNIFIED IDEOGRAPH + {0xC4BB, 0x5E55}, //11447 #CJK UNIFIED IDEOGRAPH + {0xC4BC, 0x52DF}, //11448 #CJK UNIFIED IDEOGRAPH + {0xC4BD, 0x6155}, //11449 #CJK UNIFIED IDEOGRAPH + {0xC4BE, 0x6728}, //11450 #CJK UNIFIED IDEOGRAPH + {0xC4BF, 0x76EE}, //11451 #CJK UNIFIED IDEOGRAPH + {0xC4C0, 0x7766}, //11452 #CJK UNIFIED IDEOGRAPH + {0xC4C1, 0x7267}, //11453 #CJK UNIFIED IDEOGRAPH + {0xC4C2, 0x7A46}, //11454 #CJK UNIFIED IDEOGRAPH + {0xC4C3, 0x62FF}, //11455 #CJK UNIFIED IDEOGRAPH + {0xC4C4, 0x54EA}, //11456 #CJK UNIFIED IDEOGRAPH + {0xC4C5, 0x5450}, //11457 #CJK UNIFIED IDEOGRAPH + {0xC4C6, 0x94A0}, //11458 #CJK UNIFIED IDEOGRAPH + {0xC4C7, 0x90A3}, //11459 #CJK UNIFIED IDEOGRAPH + {0xC4C8, 0x5A1C}, //11460 #CJK UNIFIED IDEOGRAPH + {0xC4C9, 0x7EB3}, //11461 #CJK UNIFIED IDEOGRAPH + {0xC4CA, 0x6C16}, //11462 #CJK UNIFIED IDEOGRAPH + {0xC4CB, 0x4E43}, //11463 #CJK UNIFIED IDEOGRAPH + {0xC4CC, 0x5976}, //11464 #CJK UNIFIED IDEOGRAPH + {0xC4CD, 0x8010}, //11465 #CJK UNIFIED IDEOGRAPH + {0xC4CE, 0x5948}, //11466 #CJK UNIFIED IDEOGRAPH + {0xC4CF, 0x5357}, //11467 #CJK UNIFIED IDEOGRAPH + {0xC4D0, 0x7537}, //11468 #CJK UNIFIED IDEOGRAPH + {0xC4D1, 0x96BE}, //11469 #CJK UNIFIED IDEOGRAPH + {0xC4D2, 0x56CA}, //11470 #CJK UNIFIED IDEOGRAPH + {0xC4D3, 0x6320}, //11471 #CJK UNIFIED IDEOGRAPH + {0xC4D4, 0x8111}, //11472 #CJK UNIFIED IDEOGRAPH + {0xC4D5, 0x607C}, //11473 #CJK UNIFIED IDEOGRAPH + {0xC4D6, 0x95F9}, //11474 #CJK UNIFIED IDEOGRAPH + {0xC4D7, 0x6DD6}, //11475 #CJK UNIFIED IDEOGRAPH + {0xC4D8, 0x5462}, //11476 #CJK UNIFIED IDEOGRAPH + {0xC4D9, 0x9981}, //11477 #CJK UNIFIED IDEOGRAPH + {0xC4DA, 0x5185}, //11478 #CJK UNIFIED IDEOGRAPH + {0xC4DB, 0x5AE9}, //11479 #CJK UNIFIED IDEOGRAPH + {0xC4DC, 0x80FD}, //11480 #CJK UNIFIED IDEOGRAPH + {0xC4DD, 0x59AE}, //11481 #CJK UNIFIED IDEOGRAPH + {0xC4DE, 0x9713}, //11482 #CJK UNIFIED IDEOGRAPH + {0xC4DF, 0x502A}, //11483 #CJK UNIFIED IDEOGRAPH + {0xC4E0, 0x6CE5}, //11484 #CJK UNIFIED IDEOGRAPH + {0xC4E1, 0x5C3C}, //11485 #CJK UNIFIED IDEOGRAPH + {0xC4E2, 0x62DF}, //11486 #CJK UNIFIED IDEOGRAPH + {0xC4E3, 0x4F60}, //11487 #CJK UNIFIED IDEOGRAPH + {0xC4E4, 0x533F}, //11488 #CJK UNIFIED IDEOGRAPH + {0xC4E5, 0x817B}, //11489 #CJK UNIFIED IDEOGRAPH + {0xC4E6, 0x9006}, //11490 #CJK UNIFIED IDEOGRAPH + {0xC4E7, 0x6EBA}, //11491 #CJK UNIFIED IDEOGRAPH + {0xC4E8, 0x852B}, //11492 #CJK UNIFIED IDEOGRAPH + {0xC4E9, 0x62C8}, //11493 #CJK UNIFIED IDEOGRAPH + {0xC4EA, 0x5E74}, //11494 #CJK UNIFIED IDEOGRAPH + {0xC4EB, 0x78BE}, //11495 #CJK UNIFIED IDEOGRAPH + {0xC4EC, 0x64B5}, //11496 #CJK UNIFIED IDEOGRAPH + {0xC4ED, 0x637B}, //11497 #CJK UNIFIED IDEOGRAPH + {0xC4EE, 0x5FF5}, //11498 #CJK UNIFIED IDEOGRAPH + {0xC4EF, 0x5A18}, //11499 #CJK UNIFIED IDEOGRAPH + {0xC4F0, 0x917F}, //11500 #CJK UNIFIED IDEOGRAPH + {0xC4F1, 0x9E1F}, //11501 #CJK UNIFIED IDEOGRAPH + {0xC4F2, 0x5C3F}, //11502 #CJK UNIFIED IDEOGRAPH + {0xC4F3, 0x634F}, //11503 #CJK UNIFIED IDEOGRAPH + {0xC4F4, 0x8042}, //11504 #CJK UNIFIED IDEOGRAPH + {0xC4F5, 0x5B7D}, //11505 #CJK UNIFIED IDEOGRAPH + {0xC4F6, 0x556E}, //11506 #CJK UNIFIED IDEOGRAPH + {0xC4F7, 0x954A}, //11507 #CJK UNIFIED IDEOGRAPH + {0xC4F8, 0x954D}, //11508 #CJK UNIFIED IDEOGRAPH + {0xC4F9, 0x6D85}, //11509 #CJK UNIFIED IDEOGRAPH + {0xC4FA, 0x60A8}, //11510 #CJK UNIFIED IDEOGRAPH + {0xC4FB, 0x67E0}, //11511 #CJK UNIFIED IDEOGRAPH + {0xC4FC, 0x72DE}, //11512 #CJK UNIFIED IDEOGRAPH + {0xC4FD, 0x51DD}, //11513 #CJK UNIFIED IDEOGRAPH + {0xC4FE, 0x5B81}, //11514 #CJK UNIFIED IDEOGRAPH + {0xC540, 0x81D4}, //11515 #CJK UNIFIED IDEOGRAPH + {0xC541, 0x81D5}, //11516 #CJK UNIFIED IDEOGRAPH + {0xC542, 0x81D6}, //11517 #CJK UNIFIED IDEOGRAPH + {0xC543, 0x81D7}, //11518 #CJK UNIFIED IDEOGRAPH + {0xC544, 0x81D8}, //11519 #CJK UNIFIED IDEOGRAPH + {0xC545, 0x81D9}, //11520 #CJK UNIFIED IDEOGRAPH + {0xC546, 0x81DA}, //11521 #CJK UNIFIED IDEOGRAPH + {0xC547, 0x81DB}, //11522 #CJK UNIFIED IDEOGRAPH + {0xC548, 0x81DC}, //11523 #CJK UNIFIED IDEOGRAPH + {0xC549, 0x81DD}, //11524 #CJK UNIFIED IDEOGRAPH + {0xC54A, 0x81DE}, //11525 #CJK UNIFIED IDEOGRAPH + {0xC54B, 0x81DF}, //11526 #CJK UNIFIED IDEOGRAPH + {0xC54C, 0x81E0}, //11527 #CJK UNIFIED IDEOGRAPH + {0xC54D, 0x81E1}, //11528 #CJK UNIFIED IDEOGRAPH + {0xC54E, 0x81E2}, //11529 #CJK UNIFIED IDEOGRAPH + {0xC54F, 0x81E4}, //11530 #CJK UNIFIED IDEOGRAPH + {0xC550, 0x81E5}, //11531 #CJK UNIFIED IDEOGRAPH + {0xC551, 0x81E6}, //11532 #CJK UNIFIED IDEOGRAPH + {0xC552, 0x81E8}, //11533 #CJK UNIFIED IDEOGRAPH + {0xC553, 0x81E9}, //11534 #CJK UNIFIED IDEOGRAPH + {0xC554, 0x81EB}, //11535 #CJK UNIFIED IDEOGRAPH + {0xC555, 0x81EE}, //11536 #CJK UNIFIED IDEOGRAPH + {0xC556, 0x81EF}, //11537 #CJK UNIFIED IDEOGRAPH + {0xC557, 0x81F0}, //11538 #CJK UNIFIED IDEOGRAPH + {0xC558, 0x81F1}, //11539 #CJK UNIFIED IDEOGRAPH + {0xC559, 0x81F2}, //11540 #CJK UNIFIED IDEOGRAPH + {0xC55A, 0x81F5}, //11541 #CJK UNIFIED IDEOGRAPH + {0xC55B, 0x81F6}, //11542 #CJK UNIFIED IDEOGRAPH + {0xC55C, 0x81F7}, //11543 #CJK UNIFIED IDEOGRAPH + {0xC55D, 0x81F8}, //11544 #CJK UNIFIED IDEOGRAPH + {0xC55E, 0x81F9}, //11545 #CJK UNIFIED IDEOGRAPH + {0xC55F, 0x81FA}, //11546 #CJK UNIFIED IDEOGRAPH + {0xC560, 0x81FD}, //11547 #CJK UNIFIED IDEOGRAPH + {0xC561, 0x81FF}, //11548 #CJK UNIFIED IDEOGRAPH + {0xC562, 0x8203}, //11549 #CJK UNIFIED IDEOGRAPH + {0xC563, 0x8207}, //11550 #CJK UNIFIED IDEOGRAPH + {0xC564, 0x8208}, //11551 #CJK UNIFIED IDEOGRAPH + {0xC565, 0x8209}, //11552 #CJK UNIFIED IDEOGRAPH + {0xC566, 0x820A}, //11553 #CJK UNIFIED IDEOGRAPH + {0xC567, 0x820B}, //11554 #CJK UNIFIED IDEOGRAPH + {0xC568, 0x820E}, //11555 #CJK UNIFIED IDEOGRAPH + {0xC569, 0x820F}, //11556 #CJK UNIFIED IDEOGRAPH + {0xC56A, 0x8211}, //11557 #CJK UNIFIED IDEOGRAPH + {0xC56B, 0x8213}, //11558 #CJK UNIFIED IDEOGRAPH + {0xC56C, 0x8215}, //11559 #CJK UNIFIED IDEOGRAPH + {0xC56D, 0x8216}, //11560 #CJK UNIFIED IDEOGRAPH + {0xC56E, 0x8217}, //11561 #CJK UNIFIED IDEOGRAPH + {0xC56F, 0x8218}, //11562 #CJK UNIFIED IDEOGRAPH + {0xC570, 0x8219}, //11563 #CJK UNIFIED IDEOGRAPH + {0xC571, 0x821A}, //11564 #CJK UNIFIED IDEOGRAPH + {0xC572, 0x821D}, //11565 #CJK UNIFIED IDEOGRAPH + {0xC573, 0x8220}, //11566 #CJK UNIFIED IDEOGRAPH + {0xC574, 0x8224}, //11567 #CJK UNIFIED IDEOGRAPH + {0xC575, 0x8225}, //11568 #CJK UNIFIED IDEOGRAPH + {0xC576, 0x8226}, //11569 #CJK UNIFIED IDEOGRAPH + {0xC577, 0x8227}, //11570 #CJK UNIFIED IDEOGRAPH + {0xC578, 0x8229}, //11571 #CJK UNIFIED IDEOGRAPH + {0xC579, 0x822E}, //11572 #CJK UNIFIED IDEOGRAPH + {0xC57A, 0x8232}, //11573 #CJK UNIFIED IDEOGRAPH + {0xC57B, 0x823A}, //11574 #CJK UNIFIED IDEOGRAPH + {0xC57C, 0x823C}, //11575 #CJK UNIFIED IDEOGRAPH + {0xC57D, 0x823D}, //11576 #CJK UNIFIED IDEOGRAPH + {0xC57E, 0x823F}, //11577 #CJK UNIFIED IDEOGRAPH + {0xC580, 0x8240}, //11578 #CJK UNIFIED IDEOGRAPH + {0xC581, 0x8241}, //11579 #CJK UNIFIED IDEOGRAPH + {0xC582, 0x8242}, //11580 #CJK UNIFIED IDEOGRAPH + {0xC583, 0x8243}, //11581 #CJK UNIFIED IDEOGRAPH + {0xC584, 0x8245}, //11582 #CJK UNIFIED IDEOGRAPH + {0xC585, 0x8246}, //11583 #CJK UNIFIED IDEOGRAPH + {0xC586, 0x8248}, //11584 #CJK UNIFIED IDEOGRAPH + {0xC587, 0x824A}, //11585 #CJK UNIFIED IDEOGRAPH + {0xC588, 0x824C}, //11586 #CJK UNIFIED IDEOGRAPH + {0xC589, 0x824D}, //11587 #CJK UNIFIED IDEOGRAPH + {0xC58A, 0x824E}, //11588 #CJK UNIFIED IDEOGRAPH + {0xC58B, 0x8250}, //11589 #CJK UNIFIED IDEOGRAPH + {0xC58C, 0x8251}, //11590 #CJK UNIFIED IDEOGRAPH + {0xC58D, 0x8252}, //11591 #CJK UNIFIED IDEOGRAPH + {0xC58E, 0x8253}, //11592 #CJK UNIFIED IDEOGRAPH + {0xC58F, 0x8254}, //11593 #CJK UNIFIED IDEOGRAPH + {0xC590, 0x8255}, //11594 #CJK UNIFIED IDEOGRAPH + {0xC591, 0x8256}, //11595 #CJK UNIFIED IDEOGRAPH + {0xC592, 0x8257}, //11596 #CJK UNIFIED IDEOGRAPH + {0xC593, 0x8259}, //11597 #CJK UNIFIED IDEOGRAPH + {0xC594, 0x825B}, //11598 #CJK UNIFIED IDEOGRAPH + {0xC595, 0x825C}, //11599 #CJK UNIFIED IDEOGRAPH + {0xC596, 0x825D}, //11600 #CJK UNIFIED IDEOGRAPH + {0xC597, 0x825E}, //11601 #CJK UNIFIED IDEOGRAPH + {0xC598, 0x8260}, //11602 #CJK UNIFIED IDEOGRAPH + {0xC599, 0x8261}, //11603 #CJK UNIFIED IDEOGRAPH + {0xC59A, 0x8262}, //11604 #CJK UNIFIED IDEOGRAPH + {0xC59B, 0x8263}, //11605 #CJK UNIFIED IDEOGRAPH + {0xC59C, 0x8264}, //11606 #CJK UNIFIED IDEOGRAPH + {0xC59D, 0x8265}, //11607 #CJK UNIFIED IDEOGRAPH + {0xC59E, 0x8266}, //11608 #CJK UNIFIED IDEOGRAPH + {0xC59F, 0x8267}, //11609 #CJK UNIFIED IDEOGRAPH + {0xC5A0, 0x8269}, //11610 #CJK UNIFIED IDEOGRAPH + {0xC5A1, 0x62E7}, //11611 #CJK UNIFIED IDEOGRAPH + {0xC5A2, 0x6CDE}, //11612 #CJK UNIFIED IDEOGRAPH + {0xC5A3, 0x725B}, //11613 #CJK UNIFIED IDEOGRAPH + {0xC5A4, 0x626D}, //11614 #CJK UNIFIED IDEOGRAPH + {0xC5A5, 0x94AE}, //11615 #CJK UNIFIED IDEOGRAPH + {0xC5A6, 0x7EBD}, //11616 #CJK UNIFIED IDEOGRAPH + {0xC5A7, 0x8113}, //11617 #CJK UNIFIED IDEOGRAPH + {0xC5A8, 0x6D53}, //11618 #CJK UNIFIED IDEOGRAPH + {0xC5A9, 0x519C}, //11619 #CJK UNIFIED IDEOGRAPH + {0xC5AA, 0x5F04}, //11620 #CJK UNIFIED IDEOGRAPH + {0xC5AB, 0x5974}, //11621 #CJK UNIFIED IDEOGRAPH + {0xC5AC, 0x52AA}, //11622 #CJK UNIFIED IDEOGRAPH + {0xC5AD, 0x6012}, //11623 #CJK UNIFIED IDEOGRAPH + {0xC5AE, 0x5973}, //11624 #CJK UNIFIED IDEOGRAPH + {0xC5AF, 0x6696}, //11625 #CJK UNIFIED IDEOGRAPH + {0xC5B0, 0x8650}, //11626 #CJK UNIFIED IDEOGRAPH + {0xC5B1, 0x759F}, //11627 #CJK UNIFIED IDEOGRAPH + {0xC5B2, 0x632A}, //11628 #CJK UNIFIED IDEOGRAPH + {0xC5B3, 0x61E6}, //11629 #CJK UNIFIED IDEOGRAPH + {0xC5B4, 0x7CEF}, //11630 #CJK UNIFIED IDEOGRAPH + {0xC5B5, 0x8BFA}, //11631 #CJK UNIFIED IDEOGRAPH + {0xC5B6, 0x54E6}, //11632 #CJK UNIFIED IDEOGRAPH + {0xC5B7, 0x6B27}, //11633 #CJK UNIFIED IDEOGRAPH + {0xC5B8, 0x9E25}, //11634 #CJK UNIFIED IDEOGRAPH + {0xC5B9, 0x6BB4}, //11635 #CJK UNIFIED IDEOGRAPH + {0xC5BA, 0x85D5}, //11636 #CJK UNIFIED IDEOGRAPH + {0xC5BB, 0x5455}, //11637 #CJK UNIFIED IDEOGRAPH + {0xC5BC, 0x5076}, //11638 #CJK UNIFIED IDEOGRAPH + {0xC5BD, 0x6CA4}, //11639 #CJK UNIFIED IDEOGRAPH + {0xC5BE, 0x556A}, //11640 #CJK UNIFIED IDEOGRAPH + {0xC5BF, 0x8DB4}, //11641 #CJK UNIFIED IDEOGRAPH + {0xC5C0, 0x722C}, //11642 #CJK UNIFIED IDEOGRAPH + {0xC5C1, 0x5E15}, //11643 #CJK UNIFIED IDEOGRAPH + {0xC5C2, 0x6015}, //11644 #CJK UNIFIED IDEOGRAPH + {0xC5C3, 0x7436}, //11645 #CJK UNIFIED IDEOGRAPH + {0xC5C4, 0x62CD}, //11646 #CJK UNIFIED IDEOGRAPH + {0xC5C5, 0x6392}, //11647 #CJK UNIFIED IDEOGRAPH + {0xC5C6, 0x724C}, //11648 #CJK UNIFIED IDEOGRAPH + {0xC5C7, 0x5F98}, //11649 #CJK UNIFIED IDEOGRAPH + {0xC5C8, 0x6E43}, //11650 #CJK UNIFIED IDEOGRAPH + {0xC5C9, 0x6D3E}, //11651 #CJK UNIFIED IDEOGRAPH + {0xC5CA, 0x6500}, //11652 #CJK UNIFIED IDEOGRAPH + {0xC5CB, 0x6F58}, //11653 #CJK UNIFIED IDEOGRAPH + {0xC5CC, 0x76D8}, //11654 #CJK UNIFIED IDEOGRAPH + {0xC5CD, 0x78D0}, //11655 #CJK UNIFIED IDEOGRAPH + {0xC5CE, 0x76FC}, //11656 #CJK UNIFIED IDEOGRAPH + {0xC5CF, 0x7554}, //11657 #CJK UNIFIED IDEOGRAPH + {0xC5D0, 0x5224}, //11658 #CJK UNIFIED IDEOGRAPH + {0xC5D1, 0x53DB}, //11659 #CJK UNIFIED IDEOGRAPH + {0xC5D2, 0x4E53}, //11660 #CJK UNIFIED IDEOGRAPH + {0xC5D3, 0x5E9E}, //11661 #CJK UNIFIED IDEOGRAPH + {0xC5D4, 0x65C1}, //11662 #CJK UNIFIED IDEOGRAPH + {0xC5D5, 0x802A}, //11663 #CJK UNIFIED IDEOGRAPH + {0xC5D6, 0x80D6}, //11664 #CJK UNIFIED IDEOGRAPH + {0xC5D7, 0x629B}, //11665 #CJK UNIFIED IDEOGRAPH + {0xC5D8, 0x5486}, //11666 #CJK UNIFIED IDEOGRAPH + {0xC5D9, 0x5228}, //11667 #CJK UNIFIED IDEOGRAPH + {0xC5DA, 0x70AE}, //11668 #CJK UNIFIED IDEOGRAPH + {0xC5DB, 0x888D}, //11669 #CJK UNIFIED IDEOGRAPH + {0xC5DC, 0x8DD1}, //11670 #CJK UNIFIED IDEOGRAPH + {0xC5DD, 0x6CE1}, //11671 #CJK UNIFIED IDEOGRAPH + {0xC5DE, 0x5478}, //11672 #CJK UNIFIED IDEOGRAPH + {0xC5DF, 0x80DA}, //11673 #CJK UNIFIED IDEOGRAPH + {0xC5E0, 0x57F9}, //11674 #CJK UNIFIED IDEOGRAPH + {0xC5E1, 0x88F4}, //11675 #CJK UNIFIED IDEOGRAPH + {0xC5E2, 0x8D54}, //11676 #CJK UNIFIED IDEOGRAPH + {0xC5E3, 0x966A}, //11677 #CJK UNIFIED IDEOGRAPH + {0xC5E4, 0x914D}, //11678 #CJK UNIFIED IDEOGRAPH + {0xC5E5, 0x4F69}, //11679 #CJK UNIFIED IDEOGRAPH + {0xC5E6, 0x6C9B}, //11680 #CJK UNIFIED IDEOGRAPH + {0xC5E7, 0x55B7}, //11681 #CJK UNIFIED IDEOGRAPH + {0xC5E8, 0x76C6}, //11682 #CJK UNIFIED IDEOGRAPH + {0xC5E9, 0x7830}, //11683 #CJK UNIFIED IDEOGRAPH + {0xC5EA, 0x62A8}, //11684 #CJK UNIFIED IDEOGRAPH + {0xC5EB, 0x70F9}, //11685 #CJK UNIFIED IDEOGRAPH + {0xC5EC, 0x6F8E}, //11686 #CJK UNIFIED IDEOGRAPH + {0xC5ED, 0x5F6D}, //11687 #CJK UNIFIED IDEOGRAPH + {0xC5EE, 0x84EC}, //11688 #CJK UNIFIED IDEOGRAPH + {0xC5EF, 0x68DA}, //11689 #CJK UNIFIED IDEOGRAPH + {0xC5F0, 0x787C}, //11690 #CJK UNIFIED IDEOGRAPH + {0xC5F1, 0x7BF7}, //11691 #CJK UNIFIED IDEOGRAPH + {0xC5F2, 0x81A8}, //11692 #CJK UNIFIED IDEOGRAPH + {0xC5F3, 0x670B}, //11693 #CJK UNIFIED IDEOGRAPH + {0xC5F4, 0x9E4F}, //11694 #CJK UNIFIED IDEOGRAPH + {0xC5F5, 0x6367}, //11695 #CJK UNIFIED IDEOGRAPH + {0xC5F6, 0x78B0}, //11696 #CJK UNIFIED IDEOGRAPH + {0xC5F7, 0x576F}, //11697 #CJK UNIFIED IDEOGRAPH + {0xC5F8, 0x7812}, //11698 #CJK UNIFIED IDEOGRAPH + {0xC5F9, 0x9739}, //11699 #CJK UNIFIED IDEOGRAPH + {0xC5FA, 0x6279}, //11700 #CJK UNIFIED IDEOGRAPH + {0xC5FB, 0x62AB}, //11701 #CJK UNIFIED IDEOGRAPH + {0xC5FC, 0x5288}, //11702 #CJK UNIFIED IDEOGRAPH + {0xC5FD, 0x7435}, //11703 #CJK UNIFIED IDEOGRAPH + {0xC5FE, 0x6BD7}, //11704 #CJK UNIFIED IDEOGRAPH + {0xC640, 0x826A}, //11705 #CJK UNIFIED IDEOGRAPH + {0xC641, 0x826B}, //11706 #CJK UNIFIED IDEOGRAPH + {0xC642, 0x826C}, //11707 #CJK UNIFIED IDEOGRAPH + {0xC643, 0x826D}, //11708 #CJK UNIFIED IDEOGRAPH + {0xC644, 0x8271}, //11709 #CJK UNIFIED IDEOGRAPH + {0xC645, 0x8275}, //11710 #CJK UNIFIED IDEOGRAPH + {0xC646, 0x8276}, //11711 #CJK UNIFIED IDEOGRAPH + {0xC647, 0x8277}, //11712 #CJK UNIFIED IDEOGRAPH + {0xC648, 0x8278}, //11713 #CJK UNIFIED IDEOGRAPH + {0xC649, 0x827B}, //11714 #CJK UNIFIED IDEOGRAPH + {0xC64A, 0x827C}, //11715 #CJK UNIFIED IDEOGRAPH + {0xC64B, 0x8280}, //11716 #CJK UNIFIED IDEOGRAPH + {0xC64C, 0x8281}, //11717 #CJK UNIFIED IDEOGRAPH + {0xC64D, 0x8283}, //11718 #CJK UNIFIED IDEOGRAPH + {0xC64E, 0x8285}, //11719 #CJK UNIFIED IDEOGRAPH + {0xC64F, 0x8286}, //11720 #CJK UNIFIED IDEOGRAPH + {0xC650, 0x8287}, //11721 #CJK UNIFIED IDEOGRAPH + {0xC651, 0x8289}, //11722 #CJK UNIFIED IDEOGRAPH + {0xC652, 0x828C}, //11723 #CJK UNIFIED IDEOGRAPH + {0xC653, 0x8290}, //11724 #CJK UNIFIED IDEOGRAPH + {0xC654, 0x8293}, //11725 #CJK UNIFIED IDEOGRAPH + {0xC655, 0x8294}, //11726 #CJK UNIFIED IDEOGRAPH + {0xC656, 0x8295}, //11727 #CJK UNIFIED IDEOGRAPH + {0xC657, 0x8296}, //11728 #CJK UNIFIED IDEOGRAPH + {0xC658, 0x829A}, //11729 #CJK UNIFIED IDEOGRAPH + {0xC659, 0x829B}, //11730 #CJK UNIFIED IDEOGRAPH + {0xC65A, 0x829E}, //11731 #CJK UNIFIED IDEOGRAPH + {0xC65B, 0x82A0}, //11732 #CJK UNIFIED IDEOGRAPH + {0xC65C, 0x82A2}, //11733 #CJK UNIFIED IDEOGRAPH + {0xC65D, 0x82A3}, //11734 #CJK UNIFIED IDEOGRAPH + {0xC65E, 0x82A7}, //11735 #CJK UNIFIED IDEOGRAPH + {0xC65F, 0x82B2}, //11736 #CJK UNIFIED IDEOGRAPH + {0xC660, 0x82B5}, //11737 #CJK UNIFIED IDEOGRAPH + {0xC661, 0x82B6}, //11738 #CJK UNIFIED IDEOGRAPH + {0xC662, 0x82BA}, //11739 #CJK UNIFIED IDEOGRAPH + {0xC663, 0x82BB}, //11740 #CJK UNIFIED IDEOGRAPH + {0xC664, 0x82BC}, //11741 #CJK UNIFIED IDEOGRAPH + {0xC665, 0x82BF}, //11742 #CJK UNIFIED IDEOGRAPH + {0xC666, 0x82C0}, //11743 #CJK UNIFIED IDEOGRAPH + {0xC667, 0x82C2}, //11744 #CJK UNIFIED IDEOGRAPH + {0xC668, 0x82C3}, //11745 #CJK UNIFIED IDEOGRAPH + {0xC669, 0x82C5}, //11746 #CJK UNIFIED IDEOGRAPH + {0xC66A, 0x82C6}, //11747 #CJK UNIFIED IDEOGRAPH + {0xC66B, 0x82C9}, //11748 #CJK UNIFIED IDEOGRAPH + {0xC66C, 0x82D0}, //11749 #CJK UNIFIED IDEOGRAPH + {0xC66D, 0x82D6}, //11750 #CJK UNIFIED IDEOGRAPH + {0xC66E, 0x82D9}, //11751 #CJK UNIFIED IDEOGRAPH + {0xC66F, 0x82DA}, //11752 #CJK UNIFIED IDEOGRAPH + {0xC670, 0x82DD}, //11753 #CJK UNIFIED IDEOGRAPH + {0xC671, 0x82E2}, //11754 #CJK UNIFIED IDEOGRAPH + {0xC672, 0x82E7}, //11755 #CJK UNIFIED IDEOGRAPH + {0xC673, 0x82E8}, //11756 #CJK UNIFIED IDEOGRAPH + {0xC674, 0x82E9}, //11757 #CJK UNIFIED IDEOGRAPH + {0xC675, 0x82EA}, //11758 #CJK UNIFIED IDEOGRAPH + {0xC676, 0x82EC}, //11759 #CJK UNIFIED IDEOGRAPH + {0xC677, 0x82ED}, //11760 #CJK UNIFIED IDEOGRAPH + {0xC678, 0x82EE}, //11761 #CJK UNIFIED IDEOGRAPH + {0xC679, 0x82F0}, //11762 #CJK UNIFIED IDEOGRAPH + {0xC67A, 0x82F2}, //11763 #CJK UNIFIED IDEOGRAPH + {0xC67B, 0x82F3}, //11764 #CJK UNIFIED IDEOGRAPH + {0xC67C, 0x82F5}, //11765 #CJK UNIFIED IDEOGRAPH + {0xC67D, 0x82F6}, //11766 #CJK UNIFIED IDEOGRAPH + {0xC67E, 0x82F8}, //11767 #CJK UNIFIED IDEOGRAPH + {0xC680, 0x82FA}, //11768 #CJK UNIFIED IDEOGRAPH + {0xC681, 0x82FC}, //11769 #CJK UNIFIED IDEOGRAPH + {0xC682, 0x82FD}, //11770 #CJK UNIFIED IDEOGRAPH + {0xC683, 0x82FE}, //11771 #CJK UNIFIED IDEOGRAPH + {0xC684, 0x82FF}, //11772 #CJK UNIFIED IDEOGRAPH + {0xC685, 0x8300}, //11773 #CJK UNIFIED IDEOGRAPH + {0xC686, 0x830A}, //11774 #CJK UNIFIED IDEOGRAPH + {0xC687, 0x830B}, //11775 #CJK UNIFIED IDEOGRAPH + {0xC688, 0x830D}, //11776 #CJK UNIFIED IDEOGRAPH + {0xC689, 0x8310}, //11777 #CJK UNIFIED IDEOGRAPH + {0xC68A, 0x8312}, //11778 #CJK UNIFIED IDEOGRAPH + {0xC68B, 0x8313}, //11779 #CJK UNIFIED IDEOGRAPH + {0xC68C, 0x8316}, //11780 #CJK UNIFIED IDEOGRAPH + {0xC68D, 0x8318}, //11781 #CJK UNIFIED IDEOGRAPH + {0xC68E, 0x8319}, //11782 #CJK UNIFIED IDEOGRAPH + {0xC68F, 0x831D}, //11783 #CJK UNIFIED IDEOGRAPH + {0xC690, 0x831E}, //11784 #CJK UNIFIED IDEOGRAPH + {0xC691, 0x831F}, //11785 #CJK UNIFIED IDEOGRAPH + {0xC692, 0x8320}, //11786 #CJK UNIFIED IDEOGRAPH + {0xC693, 0x8321}, //11787 #CJK UNIFIED IDEOGRAPH + {0xC694, 0x8322}, //11788 #CJK UNIFIED IDEOGRAPH + {0xC695, 0x8323}, //11789 #CJK UNIFIED IDEOGRAPH + {0xC696, 0x8324}, //11790 #CJK UNIFIED IDEOGRAPH + {0xC697, 0x8325}, //11791 #CJK UNIFIED IDEOGRAPH + {0xC698, 0x8326}, //11792 #CJK UNIFIED IDEOGRAPH + {0xC699, 0x8329}, //11793 #CJK UNIFIED IDEOGRAPH + {0xC69A, 0x832A}, //11794 #CJK UNIFIED IDEOGRAPH + {0xC69B, 0x832E}, //11795 #CJK UNIFIED IDEOGRAPH + {0xC69C, 0x8330}, //11796 #CJK UNIFIED IDEOGRAPH + {0xC69D, 0x8332}, //11797 #CJK UNIFIED IDEOGRAPH + {0xC69E, 0x8337}, //11798 #CJK UNIFIED IDEOGRAPH + {0xC69F, 0x833B}, //11799 #CJK UNIFIED IDEOGRAPH + {0xC6A0, 0x833D}, //11800 #CJK UNIFIED IDEOGRAPH + {0xC6A1, 0x5564}, //11801 #CJK UNIFIED IDEOGRAPH + {0xC6A2, 0x813E}, //11802 #CJK UNIFIED IDEOGRAPH + {0xC6A3, 0x75B2}, //11803 #CJK UNIFIED IDEOGRAPH + {0xC6A4, 0x76AE}, //11804 #CJK UNIFIED IDEOGRAPH + {0xC6A5, 0x5339}, //11805 #CJK UNIFIED IDEOGRAPH + {0xC6A6, 0x75DE}, //11806 #CJK UNIFIED IDEOGRAPH + {0xC6A7, 0x50FB}, //11807 #CJK UNIFIED IDEOGRAPH + {0xC6A8, 0x5C41}, //11808 #CJK UNIFIED IDEOGRAPH + {0xC6A9, 0x8B6C}, //11809 #CJK UNIFIED IDEOGRAPH + {0xC6AA, 0x7BC7}, //11810 #CJK UNIFIED IDEOGRAPH + {0xC6AB, 0x504F}, //11811 #CJK UNIFIED IDEOGRAPH + {0xC6AC, 0x7247}, //11812 #CJK UNIFIED IDEOGRAPH + {0xC6AD, 0x9A97}, //11813 #CJK UNIFIED IDEOGRAPH + {0xC6AE, 0x98D8}, //11814 #CJK UNIFIED IDEOGRAPH + {0xC6AF, 0x6F02}, //11815 #CJK UNIFIED IDEOGRAPH + {0xC6B0, 0x74E2}, //11816 #CJK UNIFIED IDEOGRAPH + {0xC6B1, 0x7968}, //11817 #CJK UNIFIED IDEOGRAPH + {0xC6B2, 0x6487}, //11818 #CJK UNIFIED IDEOGRAPH + {0xC6B3, 0x77A5}, //11819 #CJK UNIFIED IDEOGRAPH + {0xC6B4, 0x62FC}, //11820 #CJK UNIFIED IDEOGRAPH + {0xC6B5, 0x9891}, //11821 #CJK UNIFIED IDEOGRAPH + {0xC6B6, 0x8D2B}, //11822 #CJK UNIFIED IDEOGRAPH + {0xC6B7, 0x54C1}, //11823 #CJK UNIFIED IDEOGRAPH + {0xC6B8, 0x8058}, //11824 #CJK UNIFIED IDEOGRAPH + {0xC6B9, 0x4E52}, //11825 #CJK UNIFIED IDEOGRAPH + {0xC6BA, 0x576A}, //11826 #CJK UNIFIED IDEOGRAPH + {0xC6BB, 0x82F9}, //11827 #CJK UNIFIED IDEOGRAPH + {0xC6BC, 0x840D}, //11828 #CJK UNIFIED IDEOGRAPH + {0xC6BD, 0x5E73}, //11829 #CJK UNIFIED IDEOGRAPH + {0xC6BE, 0x51ED}, //11830 #CJK UNIFIED IDEOGRAPH + {0xC6BF, 0x74F6}, //11831 #CJK UNIFIED IDEOGRAPH + {0xC6C0, 0x8BC4}, //11832 #CJK UNIFIED IDEOGRAPH + {0xC6C1, 0x5C4F}, //11833 #CJK UNIFIED IDEOGRAPH + {0xC6C2, 0x5761}, //11834 #CJK UNIFIED IDEOGRAPH + {0xC6C3, 0x6CFC}, //11835 #CJK UNIFIED IDEOGRAPH + {0xC6C4, 0x9887}, //11836 #CJK UNIFIED IDEOGRAPH + {0xC6C5, 0x5A46}, //11837 #CJK UNIFIED IDEOGRAPH + {0xC6C6, 0x7834}, //11838 #CJK UNIFIED IDEOGRAPH + {0xC6C7, 0x9B44}, //11839 #CJK UNIFIED IDEOGRAPH + {0xC6C8, 0x8FEB}, //11840 #CJK UNIFIED IDEOGRAPH + {0xC6C9, 0x7C95}, //11841 #CJK UNIFIED IDEOGRAPH + {0xC6CA, 0x5256}, //11842 #CJK UNIFIED IDEOGRAPH + {0xC6CB, 0x6251}, //11843 #CJK UNIFIED IDEOGRAPH + {0xC6CC, 0x94FA}, //11844 #CJK UNIFIED IDEOGRAPH + {0xC6CD, 0x4EC6}, //11845 #CJK UNIFIED IDEOGRAPH + {0xC6CE, 0x8386}, //11846 #CJK UNIFIED IDEOGRAPH + {0xC6CF, 0x8461}, //11847 #CJK UNIFIED IDEOGRAPH + {0xC6D0, 0x83E9}, //11848 #CJK UNIFIED IDEOGRAPH + {0xC6D1, 0x84B2}, //11849 #CJK UNIFIED IDEOGRAPH + {0xC6D2, 0x57D4}, //11850 #CJK UNIFIED IDEOGRAPH + {0xC6D3, 0x6734}, //11851 #CJK UNIFIED IDEOGRAPH + {0xC6D4, 0x5703}, //11852 #CJK UNIFIED IDEOGRAPH + {0xC6D5, 0x666E}, //11853 #CJK UNIFIED IDEOGRAPH + {0xC6D6, 0x6D66}, //11854 #CJK UNIFIED IDEOGRAPH + {0xC6D7, 0x8C31}, //11855 #CJK UNIFIED IDEOGRAPH + {0xC6D8, 0x66DD}, //11856 #CJK UNIFIED IDEOGRAPH + {0xC6D9, 0x7011}, //11857 #CJK UNIFIED IDEOGRAPH + {0xC6DA, 0x671F}, //11858 #CJK UNIFIED IDEOGRAPH + {0xC6DB, 0x6B3A}, //11859 #CJK UNIFIED IDEOGRAPH + {0xC6DC, 0x6816}, //11860 #CJK UNIFIED IDEOGRAPH + {0xC6DD, 0x621A}, //11861 #CJK UNIFIED IDEOGRAPH + {0xC6DE, 0x59BB}, //11862 #CJK UNIFIED IDEOGRAPH + {0xC6DF, 0x4E03}, //11863 #CJK UNIFIED IDEOGRAPH + {0xC6E0, 0x51C4}, //11864 #CJK UNIFIED IDEOGRAPH + {0xC6E1, 0x6F06}, //11865 #CJK UNIFIED IDEOGRAPH + {0xC6E2, 0x67D2}, //11866 #CJK UNIFIED IDEOGRAPH + {0xC6E3, 0x6C8F}, //11867 #CJK UNIFIED IDEOGRAPH + {0xC6E4, 0x5176}, //11868 #CJK UNIFIED IDEOGRAPH + {0xC6E5, 0x68CB}, //11869 #CJK UNIFIED IDEOGRAPH + {0xC6E6, 0x5947}, //11870 #CJK UNIFIED IDEOGRAPH + {0xC6E7, 0x6B67}, //11871 #CJK UNIFIED IDEOGRAPH + {0xC6E8, 0x7566}, //11872 #CJK UNIFIED IDEOGRAPH + {0xC6E9, 0x5D0E}, //11873 #CJK UNIFIED IDEOGRAPH + {0xC6EA, 0x8110}, //11874 #CJK UNIFIED IDEOGRAPH + {0xC6EB, 0x9F50}, //11875 #CJK UNIFIED IDEOGRAPH + {0xC6EC, 0x65D7}, //11876 #CJK UNIFIED IDEOGRAPH + {0xC6ED, 0x7948}, //11877 #CJK UNIFIED IDEOGRAPH + {0xC6EE, 0x7941}, //11878 #CJK UNIFIED IDEOGRAPH + {0xC6EF, 0x9A91}, //11879 #CJK UNIFIED IDEOGRAPH + {0xC6F0, 0x8D77}, //11880 #CJK UNIFIED IDEOGRAPH + {0xC6F1, 0x5C82}, //11881 #CJK UNIFIED IDEOGRAPH + {0xC6F2, 0x4E5E}, //11882 #CJK UNIFIED IDEOGRAPH + {0xC6F3, 0x4F01}, //11883 #CJK UNIFIED IDEOGRAPH + {0xC6F4, 0x542F}, //11884 #CJK UNIFIED IDEOGRAPH + {0xC6F5, 0x5951}, //11885 #CJK UNIFIED IDEOGRAPH + {0xC6F6, 0x780C}, //11886 #CJK UNIFIED IDEOGRAPH + {0xC6F7, 0x5668}, //11887 #CJK UNIFIED IDEOGRAPH + {0xC6F8, 0x6C14}, //11888 #CJK UNIFIED IDEOGRAPH + {0xC6F9, 0x8FC4}, //11889 #CJK UNIFIED IDEOGRAPH + {0xC6FA, 0x5F03}, //11890 #CJK UNIFIED IDEOGRAPH + {0xC6FB, 0x6C7D}, //11891 #CJK UNIFIED IDEOGRAPH + {0xC6FC, 0x6CE3}, //11892 #CJK UNIFIED IDEOGRAPH + {0xC6FD, 0x8BAB}, //11893 #CJK UNIFIED IDEOGRAPH + {0xC6FE, 0x6390}, //11894 #CJK UNIFIED IDEOGRAPH + {0xC740, 0x833E}, //11895 #CJK UNIFIED IDEOGRAPH + {0xC741, 0x833F}, //11896 #CJK UNIFIED IDEOGRAPH + {0xC742, 0x8341}, //11897 #CJK UNIFIED IDEOGRAPH + {0xC743, 0x8342}, //11898 #CJK UNIFIED IDEOGRAPH + {0xC744, 0x8344}, //11899 #CJK UNIFIED IDEOGRAPH + {0xC745, 0x8345}, //11900 #CJK UNIFIED IDEOGRAPH + {0xC746, 0x8348}, //11901 #CJK UNIFIED IDEOGRAPH + {0xC747, 0x834A}, //11902 #CJK UNIFIED IDEOGRAPH + {0xC748, 0x834B}, //11903 #CJK UNIFIED IDEOGRAPH + {0xC749, 0x834C}, //11904 #CJK UNIFIED IDEOGRAPH + {0xC74A, 0x834D}, //11905 #CJK UNIFIED IDEOGRAPH + {0xC74B, 0x834E}, //11906 #CJK UNIFIED IDEOGRAPH + {0xC74C, 0x8353}, //11907 #CJK UNIFIED IDEOGRAPH + {0xC74D, 0x8355}, //11908 #CJK UNIFIED IDEOGRAPH + {0xC74E, 0x8356}, //11909 #CJK UNIFIED IDEOGRAPH + {0xC74F, 0x8357}, //11910 #CJK UNIFIED IDEOGRAPH + {0xC750, 0x8358}, //11911 #CJK UNIFIED IDEOGRAPH + {0xC751, 0x8359}, //11912 #CJK UNIFIED IDEOGRAPH + {0xC752, 0x835D}, //11913 #CJK UNIFIED IDEOGRAPH + {0xC753, 0x8362}, //11914 #CJK UNIFIED IDEOGRAPH + {0xC754, 0x8370}, //11915 #CJK UNIFIED IDEOGRAPH + {0xC755, 0x8371}, //11916 #CJK UNIFIED IDEOGRAPH + {0xC756, 0x8372}, //11917 #CJK UNIFIED IDEOGRAPH + {0xC757, 0x8373}, //11918 #CJK UNIFIED IDEOGRAPH + {0xC758, 0x8374}, //11919 #CJK UNIFIED IDEOGRAPH + {0xC759, 0x8375}, //11920 #CJK UNIFIED IDEOGRAPH + {0xC75A, 0x8376}, //11921 #CJK UNIFIED IDEOGRAPH + {0xC75B, 0x8379}, //11922 #CJK UNIFIED IDEOGRAPH + {0xC75C, 0x837A}, //11923 #CJK UNIFIED IDEOGRAPH + {0xC75D, 0x837E}, //11924 #CJK UNIFIED IDEOGRAPH + {0xC75E, 0x837F}, //11925 #CJK UNIFIED IDEOGRAPH + {0xC75F, 0x8380}, //11926 #CJK UNIFIED IDEOGRAPH + {0xC760, 0x8381}, //11927 #CJK UNIFIED IDEOGRAPH + {0xC761, 0x8382}, //11928 #CJK UNIFIED IDEOGRAPH + {0xC762, 0x8383}, //11929 #CJK UNIFIED IDEOGRAPH + {0xC763, 0x8384}, //11930 #CJK UNIFIED IDEOGRAPH + {0xC764, 0x8387}, //11931 #CJK UNIFIED IDEOGRAPH + {0xC765, 0x8388}, //11932 #CJK UNIFIED IDEOGRAPH + {0xC766, 0x838A}, //11933 #CJK UNIFIED IDEOGRAPH + {0xC767, 0x838B}, //11934 #CJK UNIFIED IDEOGRAPH + {0xC768, 0x838C}, //11935 #CJK UNIFIED IDEOGRAPH + {0xC769, 0x838D}, //11936 #CJK UNIFIED IDEOGRAPH + {0xC76A, 0x838F}, //11937 #CJK UNIFIED IDEOGRAPH + {0xC76B, 0x8390}, //11938 #CJK UNIFIED IDEOGRAPH + {0xC76C, 0x8391}, //11939 #CJK UNIFIED IDEOGRAPH + {0xC76D, 0x8394}, //11940 #CJK UNIFIED IDEOGRAPH + {0xC76E, 0x8395}, //11941 #CJK UNIFIED IDEOGRAPH + {0xC76F, 0x8396}, //11942 #CJK UNIFIED IDEOGRAPH + {0xC770, 0x8397}, //11943 #CJK UNIFIED IDEOGRAPH + {0xC771, 0x8399}, //11944 #CJK UNIFIED IDEOGRAPH + {0xC772, 0x839A}, //11945 #CJK UNIFIED IDEOGRAPH + {0xC773, 0x839D}, //11946 #CJK UNIFIED IDEOGRAPH + {0xC774, 0x839F}, //11947 #CJK UNIFIED IDEOGRAPH + {0xC775, 0x83A1}, //11948 #CJK UNIFIED IDEOGRAPH + {0xC776, 0x83A2}, //11949 #CJK UNIFIED IDEOGRAPH + {0xC777, 0x83A3}, //11950 #CJK UNIFIED IDEOGRAPH + {0xC778, 0x83A4}, //11951 #CJK UNIFIED IDEOGRAPH + {0xC779, 0x83A5}, //11952 #CJK UNIFIED IDEOGRAPH + {0xC77A, 0x83A6}, //11953 #CJK UNIFIED IDEOGRAPH + {0xC77B, 0x83A7}, //11954 #CJK UNIFIED IDEOGRAPH + {0xC77C, 0x83AC}, //11955 #CJK UNIFIED IDEOGRAPH + {0xC77D, 0x83AD}, //11956 #CJK UNIFIED IDEOGRAPH + {0xC77E, 0x83AE}, //11957 #CJK UNIFIED IDEOGRAPH + {0xC780, 0x83AF}, //11958 #CJK UNIFIED IDEOGRAPH + {0xC781, 0x83B5}, //11959 #CJK UNIFIED IDEOGRAPH + {0xC782, 0x83BB}, //11960 #CJK UNIFIED IDEOGRAPH + {0xC783, 0x83BE}, //11961 #CJK UNIFIED IDEOGRAPH + {0xC784, 0x83BF}, //11962 #CJK UNIFIED IDEOGRAPH + {0xC785, 0x83C2}, //11963 #CJK UNIFIED IDEOGRAPH + {0xC786, 0x83C3}, //11964 #CJK UNIFIED IDEOGRAPH + {0xC787, 0x83C4}, //11965 #CJK UNIFIED IDEOGRAPH + {0xC788, 0x83C6}, //11966 #CJK UNIFIED IDEOGRAPH + {0xC789, 0x83C8}, //11967 #CJK UNIFIED IDEOGRAPH + {0xC78A, 0x83C9}, //11968 #CJK UNIFIED IDEOGRAPH + {0xC78B, 0x83CB}, //11969 #CJK UNIFIED IDEOGRAPH + {0xC78C, 0x83CD}, //11970 #CJK UNIFIED IDEOGRAPH + {0xC78D, 0x83CE}, //11971 #CJK UNIFIED IDEOGRAPH + {0xC78E, 0x83D0}, //11972 #CJK UNIFIED IDEOGRAPH + {0xC78F, 0x83D1}, //11973 #CJK UNIFIED IDEOGRAPH + {0xC790, 0x83D2}, //11974 #CJK UNIFIED IDEOGRAPH + {0xC791, 0x83D3}, //11975 #CJK UNIFIED IDEOGRAPH + {0xC792, 0x83D5}, //11976 #CJK UNIFIED IDEOGRAPH + {0xC793, 0x83D7}, //11977 #CJK UNIFIED IDEOGRAPH + {0xC794, 0x83D9}, //11978 #CJK UNIFIED IDEOGRAPH + {0xC795, 0x83DA}, //11979 #CJK UNIFIED IDEOGRAPH + {0xC796, 0x83DB}, //11980 #CJK UNIFIED IDEOGRAPH + {0xC797, 0x83DE}, //11981 #CJK UNIFIED IDEOGRAPH + {0xC798, 0x83E2}, //11982 #CJK UNIFIED IDEOGRAPH + {0xC799, 0x83E3}, //11983 #CJK UNIFIED IDEOGRAPH + {0xC79A, 0x83E4}, //11984 #CJK UNIFIED IDEOGRAPH + {0xC79B, 0x83E6}, //11985 #CJK UNIFIED IDEOGRAPH + {0xC79C, 0x83E7}, //11986 #CJK UNIFIED IDEOGRAPH + {0xC79D, 0x83E8}, //11987 #CJK UNIFIED IDEOGRAPH + {0xC79E, 0x83EB}, //11988 #CJK UNIFIED IDEOGRAPH + {0xC79F, 0x83EC}, //11989 #CJK UNIFIED IDEOGRAPH + {0xC7A0, 0x83ED}, //11990 #CJK UNIFIED IDEOGRAPH + {0xC7A1, 0x6070}, //11991 #CJK UNIFIED IDEOGRAPH + {0xC7A2, 0x6D3D}, //11992 #CJK UNIFIED IDEOGRAPH + {0xC7A3, 0x7275}, //11993 #CJK UNIFIED IDEOGRAPH + {0xC7A4, 0x6266}, //11994 #CJK UNIFIED IDEOGRAPH + {0xC7A5, 0x948E}, //11995 #CJK UNIFIED IDEOGRAPH + {0xC7A6, 0x94C5}, //11996 #CJK UNIFIED IDEOGRAPH + {0xC7A7, 0x5343}, //11997 #CJK UNIFIED IDEOGRAPH + {0xC7A8, 0x8FC1}, //11998 #CJK UNIFIED IDEOGRAPH + {0xC7A9, 0x7B7E}, //11999 #CJK UNIFIED IDEOGRAPH + {0xC7AA, 0x4EDF}, //12000 #CJK UNIFIED IDEOGRAPH + {0xC7AB, 0x8C26}, //12001 #CJK UNIFIED IDEOGRAPH + {0xC7AC, 0x4E7E}, //12002 #CJK UNIFIED IDEOGRAPH + {0xC7AD, 0x9ED4}, //12003 #CJK UNIFIED IDEOGRAPH + {0xC7AE, 0x94B1}, //12004 #CJK UNIFIED IDEOGRAPH + {0xC7AF, 0x94B3}, //12005 #CJK UNIFIED IDEOGRAPH + {0xC7B0, 0x524D}, //12006 #CJK UNIFIED IDEOGRAPH + {0xC7B1, 0x6F5C}, //12007 #CJK UNIFIED IDEOGRAPH + {0xC7B2, 0x9063}, //12008 #CJK UNIFIED IDEOGRAPH + {0xC7B3, 0x6D45}, //12009 #CJK UNIFIED IDEOGRAPH + {0xC7B4, 0x8C34}, //12010 #CJK UNIFIED IDEOGRAPH + {0xC7B5, 0x5811}, //12011 #CJK UNIFIED IDEOGRAPH + {0xC7B6, 0x5D4C}, //12012 #CJK UNIFIED IDEOGRAPH + {0xC7B7, 0x6B20}, //12013 #CJK UNIFIED IDEOGRAPH + {0xC7B8, 0x6B49}, //12014 #CJK UNIFIED IDEOGRAPH + {0xC7B9, 0x67AA}, //12015 #CJK UNIFIED IDEOGRAPH + {0xC7BA, 0x545B}, //12016 #CJK UNIFIED IDEOGRAPH + {0xC7BB, 0x8154}, //12017 #CJK UNIFIED IDEOGRAPH + {0xC7BC, 0x7F8C}, //12018 #CJK UNIFIED IDEOGRAPH + {0xC7BD, 0x5899}, //12019 #CJK UNIFIED IDEOGRAPH + {0xC7BE, 0x8537}, //12020 #CJK UNIFIED IDEOGRAPH + {0xC7BF, 0x5F3A}, //12021 #CJK UNIFIED IDEOGRAPH + {0xC7C0, 0x62A2}, //12022 #CJK UNIFIED IDEOGRAPH + {0xC7C1, 0x6A47}, //12023 #CJK UNIFIED IDEOGRAPH + {0xC7C2, 0x9539}, //12024 #CJK UNIFIED IDEOGRAPH + {0xC7C3, 0x6572}, //12025 #CJK UNIFIED IDEOGRAPH + {0xC7C4, 0x6084}, //12026 #CJK UNIFIED IDEOGRAPH + {0xC7C5, 0x6865}, //12027 #CJK UNIFIED IDEOGRAPH + {0xC7C6, 0x77A7}, //12028 #CJK UNIFIED IDEOGRAPH + {0xC7C7, 0x4E54}, //12029 #CJK UNIFIED IDEOGRAPH + {0xC7C8, 0x4FA8}, //12030 #CJK UNIFIED IDEOGRAPH + {0xC7C9, 0x5DE7}, //12031 #CJK UNIFIED IDEOGRAPH + {0xC7CA, 0x9798}, //12032 #CJK UNIFIED IDEOGRAPH + {0xC7CB, 0x64AC}, //12033 #CJK UNIFIED IDEOGRAPH + {0xC7CC, 0x7FD8}, //12034 #CJK UNIFIED IDEOGRAPH + {0xC7CD, 0x5CED}, //12035 #CJK UNIFIED IDEOGRAPH + {0xC7CE, 0x4FCF}, //12036 #CJK UNIFIED IDEOGRAPH + {0xC7CF, 0x7A8D}, //12037 #CJK UNIFIED IDEOGRAPH + {0xC7D0, 0x5207}, //12038 #CJK UNIFIED IDEOGRAPH + {0xC7D1, 0x8304}, //12039 #CJK UNIFIED IDEOGRAPH + {0xC7D2, 0x4E14}, //12040 #CJK UNIFIED IDEOGRAPH + {0xC7D3, 0x602F}, //12041 #CJK UNIFIED IDEOGRAPH + {0xC7D4, 0x7A83}, //12042 #CJK UNIFIED IDEOGRAPH + {0xC7D5, 0x94A6}, //12043 #CJK UNIFIED IDEOGRAPH + {0xC7D6, 0x4FB5}, //12044 #CJK UNIFIED IDEOGRAPH + {0xC7D7, 0x4EB2}, //12045 #CJK UNIFIED IDEOGRAPH + {0xC7D8, 0x79E6}, //12046 #CJK UNIFIED IDEOGRAPH + {0xC7D9, 0x7434}, //12047 #CJK UNIFIED IDEOGRAPH + {0xC7DA, 0x52E4}, //12048 #CJK UNIFIED IDEOGRAPH + {0xC7DB, 0x82B9}, //12049 #CJK UNIFIED IDEOGRAPH + {0xC7DC, 0x64D2}, //12050 #CJK UNIFIED IDEOGRAPH + {0xC7DD, 0x79BD}, //12051 #CJK UNIFIED IDEOGRAPH + {0xC7DE, 0x5BDD}, //12052 #CJK UNIFIED IDEOGRAPH + {0xC7DF, 0x6C81}, //12053 #CJK UNIFIED IDEOGRAPH + {0xC7E0, 0x9752}, //12054 #CJK UNIFIED IDEOGRAPH + {0xC7E1, 0x8F7B}, //12055 #CJK UNIFIED IDEOGRAPH + {0xC7E2, 0x6C22}, //12056 #CJK UNIFIED IDEOGRAPH + {0xC7E3, 0x503E}, //12057 #CJK UNIFIED IDEOGRAPH + {0xC7E4, 0x537F}, //12058 #CJK UNIFIED IDEOGRAPH + {0xC7E5, 0x6E05}, //12059 #CJK UNIFIED IDEOGRAPH + {0xC7E6, 0x64CE}, //12060 #CJK UNIFIED IDEOGRAPH + {0xC7E7, 0x6674}, //12061 #CJK UNIFIED IDEOGRAPH + {0xC7E8, 0x6C30}, //12062 #CJK UNIFIED IDEOGRAPH + {0xC7E9, 0x60C5}, //12063 #CJK UNIFIED IDEOGRAPH + {0xC7EA, 0x9877}, //12064 #CJK UNIFIED IDEOGRAPH + {0xC7EB, 0x8BF7}, //12065 #CJK UNIFIED IDEOGRAPH + {0xC7EC, 0x5E86}, //12066 #CJK UNIFIED IDEOGRAPH + {0xC7ED, 0x743C}, //12067 #CJK UNIFIED IDEOGRAPH + {0xC7EE, 0x7A77}, //12068 #CJK UNIFIED IDEOGRAPH + {0xC7EF, 0x79CB}, //12069 #CJK UNIFIED IDEOGRAPH + {0xC7F0, 0x4E18}, //12070 #CJK UNIFIED IDEOGRAPH + {0xC7F1, 0x90B1}, //12071 #CJK UNIFIED IDEOGRAPH + {0xC7F2, 0x7403}, //12072 #CJK UNIFIED IDEOGRAPH + {0xC7F3, 0x6C42}, //12073 #CJK UNIFIED IDEOGRAPH + {0xC7F4, 0x56DA}, //12074 #CJK UNIFIED IDEOGRAPH + {0xC7F5, 0x914B}, //12075 #CJK UNIFIED IDEOGRAPH + {0xC7F6, 0x6CC5}, //12076 #CJK UNIFIED IDEOGRAPH + {0xC7F7, 0x8D8B}, //12077 #CJK UNIFIED IDEOGRAPH + {0xC7F8, 0x533A}, //12078 #CJK UNIFIED IDEOGRAPH + {0xC7F9, 0x86C6}, //12079 #CJK UNIFIED IDEOGRAPH + {0xC7FA, 0x66F2}, //12080 #CJK UNIFIED IDEOGRAPH + {0xC7FB, 0x8EAF}, //12081 #CJK UNIFIED IDEOGRAPH + {0xC7FC, 0x5C48}, //12082 #CJK UNIFIED IDEOGRAPH + {0xC7FD, 0x9A71}, //12083 #CJK UNIFIED IDEOGRAPH + {0xC7FE, 0x6E20}, //12084 #CJK UNIFIED IDEOGRAPH + {0xC840, 0x83EE}, //12085 #CJK UNIFIED IDEOGRAPH + {0xC841, 0x83EF}, //12086 #CJK UNIFIED IDEOGRAPH + {0xC842, 0x83F3}, //12087 #CJK UNIFIED IDEOGRAPH + {0xC843, 0x83F4}, //12088 #CJK UNIFIED IDEOGRAPH + {0xC844, 0x83F5}, //12089 #CJK UNIFIED IDEOGRAPH + {0xC845, 0x83F6}, //12090 #CJK UNIFIED IDEOGRAPH + {0xC846, 0x83F7}, //12091 #CJK UNIFIED IDEOGRAPH + {0xC847, 0x83FA}, //12092 #CJK UNIFIED IDEOGRAPH + {0xC848, 0x83FB}, //12093 #CJK UNIFIED IDEOGRAPH + {0xC849, 0x83FC}, //12094 #CJK UNIFIED IDEOGRAPH + {0xC84A, 0x83FE}, //12095 #CJK UNIFIED IDEOGRAPH + {0xC84B, 0x83FF}, //12096 #CJK UNIFIED IDEOGRAPH + {0xC84C, 0x8400}, //12097 #CJK UNIFIED IDEOGRAPH + {0xC84D, 0x8402}, //12098 #CJK UNIFIED IDEOGRAPH + {0xC84E, 0x8405}, //12099 #CJK UNIFIED IDEOGRAPH + {0xC84F, 0x8407}, //12100 #CJK UNIFIED IDEOGRAPH + {0xC850, 0x8408}, //12101 #CJK UNIFIED IDEOGRAPH + {0xC851, 0x8409}, //12102 #CJK UNIFIED IDEOGRAPH + {0xC852, 0x840A}, //12103 #CJK UNIFIED IDEOGRAPH + {0xC853, 0x8410}, //12104 #CJK UNIFIED IDEOGRAPH + {0xC854, 0x8412}, //12105 #CJK UNIFIED IDEOGRAPH + {0xC855, 0x8413}, //12106 #CJK UNIFIED IDEOGRAPH + {0xC856, 0x8414}, //12107 #CJK UNIFIED IDEOGRAPH + {0xC857, 0x8415}, //12108 #CJK UNIFIED IDEOGRAPH + {0xC858, 0x8416}, //12109 #CJK UNIFIED IDEOGRAPH + {0xC859, 0x8417}, //12110 #CJK UNIFIED IDEOGRAPH + {0xC85A, 0x8419}, //12111 #CJK UNIFIED IDEOGRAPH + {0xC85B, 0x841A}, //12112 #CJK UNIFIED IDEOGRAPH + {0xC85C, 0x841B}, //12113 #CJK UNIFIED IDEOGRAPH + {0xC85D, 0x841E}, //12114 #CJK UNIFIED IDEOGRAPH + {0xC85E, 0x841F}, //12115 #CJK UNIFIED IDEOGRAPH + {0xC85F, 0x8420}, //12116 #CJK UNIFIED IDEOGRAPH + {0xC860, 0x8421}, //12117 #CJK UNIFIED IDEOGRAPH + {0xC861, 0x8422}, //12118 #CJK UNIFIED IDEOGRAPH + {0xC862, 0x8423}, //12119 #CJK UNIFIED IDEOGRAPH + {0xC863, 0x8429}, //12120 #CJK UNIFIED IDEOGRAPH + {0xC864, 0x842A}, //12121 #CJK UNIFIED IDEOGRAPH + {0xC865, 0x842B}, //12122 #CJK UNIFIED IDEOGRAPH + {0xC866, 0x842C}, //12123 #CJK UNIFIED IDEOGRAPH + {0xC867, 0x842D}, //12124 #CJK UNIFIED IDEOGRAPH + {0xC868, 0x842E}, //12125 #CJK UNIFIED IDEOGRAPH + {0xC869, 0x842F}, //12126 #CJK UNIFIED IDEOGRAPH + {0xC86A, 0x8430}, //12127 #CJK UNIFIED IDEOGRAPH + {0xC86B, 0x8432}, //12128 #CJK UNIFIED IDEOGRAPH + {0xC86C, 0x8433}, //12129 #CJK UNIFIED IDEOGRAPH + {0xC86D, 0x8434}, //12130 #CJK UNIFIED IDEOGRAPH + {0xC86E, 0x8435}, //12131 #CJK UNIFIED IDEOGRAPH + {0xC86F, 0x8436}, //12132 #CJK UNIFIED IDEOGRAPH + {0xC870, 0x8437}, //12133 #CJK UNIFIED IDEOGRAPH + {0xC871, 0x8439}, //12134 #CJK UNIFIED IDEOGRAPH + {0xC872, 0x843A}, //12135 #CJK UNIFIED IDEOGRAPH + {0xC873, 0x843B}, //12136 #CJK UNIFIED IDEOGRAPH + {0xC874, 0x843E}, //12137 #CJK UNIFIED IDEOGRAPH + {0xC875, 0x843F}, //12138 #CJK UNIFIED IDEOGRAPH + {0xC876, 0x8440}, //12139 #CJK UNIFIED IDEOGRAPH + {0xC877, 0x8441}, //12140 #CJK UNIFIED IDEOGRAPH + {0xC878, 0x8442}, //12141 #CJK UNIFIED IDEOGRAPH + {0xC879, 0x8443}, //12142 #CJK UNIFIED IDEOGRAPH + {0xC87A, 0x8444}, //12143 #CJK UNIFIED IDEOGRAPH + {0xC87B, 0x8445}, //12144 #CJK UNIFIED IDEOGRAPH + {0xC87C, 0x8447}, //12145 #CJK UNIFIED IDEOGRAPH + {0xC87D, 0x8448}, //12146 #CJK UNIFIED IDEOGRAPH + {0xC87E, 0x8449}, //12147 #CJK UNIFIED IDEOGRAPH + {0xC880, 0x844A}, //12148 #CJK UNIFIED IDEOGRAPH + {0xC881, 0x844B}, //12149 #CJK UNIFIED IDEOGRAPH + {0xC882, 0x844C}, //12150 #CJK UNIFIED IDEOGRAPH + {0xC883, 0x844D}, //12151 #CJK UNIFIED IDEOGRAPH + {0xC884, 0x844E}, //12152 #CJK UNIFIED IDEOGRAPH + {0xC885, 0x844F}, //12153 #CJK UNIFIED IDEOGRAPH + {0xC886, 0x8450}, //12154 #CJK UNIFIED IDEOGRAPH + {0xC887, 0x8452}, //12155 #CJK UNIFIED IDEOGRAPH + {0xC888, 0x8453}, //12156 #CJK UNIFIED IDEOGRAPH + {0xC889, 0x8454}, //12157 #CJK UNIFIED IDEOGRAPH + {0xC88A, 0x8455}, //12158 #CJK UNIFIED IDEOGRAPH + {0xC88B, 0x8456}, //12159 #CJK UNIFIED IDEOGRAPH + {0xC88C, 0x8458}, //12160 #CJK UNIFIED IDEOGRAPH + {0xC88D, 0x845D}, //12161 #CJK UNIFIED IDEOGRAPH + {0xC88E, 0x845E}, //12162 #CJK UNIFIED IDEOGRAPH + {0xC88F, 0x845F}, //12163 #CJK UNIFIED IDEOGRAPH + {0xC890, 0x8460}, //12164 #CJK UNIFIED IDEOGRAPH + {0xC891, 0x8462}, //12165 #CJK UNIFIED IDEOGRAPH + {0xC892, 0x8464}, //12166 #CJK UNIFIED IDEOGRAPH + {0xC893, 0x8465}, //12167 #CJK UNIFIED IDEOGRAPH + {0xC894, 0x8466}, //12168 #CJK UNIFIED IDEOGRAPH + {0xC895, 0x8467}, //12169 #CJK UNIFIED IDEOGRAPH + {0xC896, 0x8468}, //12170 #CJK UNIFIED IDEOGRAPH + {0xC897, 0x846A}, //12171 #CJK UNIFIED IDEOGRAPH + {0xC898, 0x846E}, //12172 #CJK UNIFIED IDEOGRAPH + {0xC899, 0x846F}, //12173 #CJK UNIFIED IDEOGRAPH + {0xC89A, 0x8470}, //12174 #CJK UNIFIED IDEOGRAPH + {0xC89B, 0x8472}, //12175 #CJK UNIFIED IDEOGRAPH + {0xC89C, 0x8474}, //12176 #CJK UNIFIED IDEOGRAPH + {0xC89D, 0x8477}, //12177 #CJK UNIFIED IDEOGRAPH + {0xC89E, 0x8479}, //12178 #CJK UNIFIED IDEOGRAPH + {0xC89F, 0x847B}, //12179 #CJK UNIFIED IDEOGRAPH + {0xC8A0, 0x847C}, //12180 #CJK UNIFIED IDEOGRAPH + {0xC8A1, 0x53D6}, //12181 #CJK UNIFIED IDEOGRAPH + {0xC8A2, 0x5A36}, //12182 #CJK UNIFIED IDEOGRAPH + {0xC8A3, 0x9F8B}, //12183 #CJK UNIFIED IDEOGRAPH + {0xC8A4, 0x8DA3}, //12184 #CJK UNIFIED IDEOGRAPH + {0xC8A5, 0x53BB}, //12185 #CJK UNIFIED IDEOGRAPH + {0xC8A6, 0x5708}, //12186 #CJK UNIFIED IDEOGRAPH + {0xC8A7, 0x98A7}, //12187 #CJK UNIFIED IDEOGRAPH + {0xC8A8, 0x6743}, //12188 #CJK UNIFIED IDEOGRAPH + {0xC8A9, 0x919B}, //12189 #CJK UNIFIED IDEOGRAPH + {0xC8AA, 0x6CC9}, //12190 #CJK UNIFIED IDEOGRAPH + {0xC8AB, 0x5168}, //12191 #CJK UNIFIED IDEOGRAPH + {0xC8AC, 0x75CA}, //12192 #CJK UNIFIED IDEOGRAPH + {0xC8AD, 0x62F3}, //12193 #CJK UNIFIED IDEOGRAPH + {0xC8AE, 0x72AC}, //12194 #CJK UNIFIED IDEOGRAPH + {0xC8AF, 0x5238}, //12195 #CJK UNIFIED IDEOGRAPH + {0xC8B0, 0x529D}, //12196 #CJK UNIFIED IDEOGRAPH + {0xC8B1, 0x7F3A}, //12197 #CJK UNIFIED IDEOGRAPH + {0xC8B2, 0x7094}, //12198 #CJK UNIFIED IDEOGRAPH + {0xC8B3, 0x7638}, //12199 #CJK UNIFIED IDEOGRAPH + {0xC8B4, 0x5374}, //12200 #CJK UNIFIED IDEOGRAPH + {0xC8B5, 0x9E4A}, //12201 #CJK UNIFIED IDEOGRAPH + {0xC8B6, 0x69B7}, //12202 #CJK UNIFIED IDEOGRAPH + {0xC8B7, 0x786E}, //12203 #CJK UNIFIED IDEOGRAPH + {0xC8B8, 0x96C0}, //12204 #CJK UNIFIED IDEOGRAPH + {0xC8B9, 0x88D9}, //12205 #CJK UNIFIED IDEOGRAPH + {0xC8BA, 0x7FA4}, //12206 #CJK UNIFIED IDEOGRAPH + {0xC8BB, 0x7136}, //12207 #CJK UNIFIED IDEOGRAPH + {0xC8BC, 0x71C3}, //12208 #CJK UNIFIED IDEOGRAPH + {0xC8BD, 0x5189}, //12209 #CJK UNIFIED IDEOGRAPH + {0xC8BE, 0x67D3}, //12210 #CJK UNIFIED IDEOGRAPH + {0xC8BF, 0x74E4}, //12211 #CJK UNIFIED IDEOGRAPH + {0xC8C0, 0x58E4}, //12212 #CJK UNIFIED IDEOGRAPH + {0xC8C1, 0x6518}, //12213 #CJK UNIFIED IDEOGRAPH + {0xC8C2, 0x56B7}, //12214 #CJK UNIFIED IDEOGRAPH + {0xC8C3, 0x8BA9}, //12215 #CJK UNIFIED IDEOGRAPH + {0xC8C4, 0x9976}, //12216 #CJK UNIFIED IDEOGRAPH + {0xC8C5, 0x6270}, //12217 #CJK UNIFIED IDEOGRAPH + {0xC8C6, 0x7ED5}, //12218 #CJK UNIFIED IDEOGRAPH + {0xC8C7, 0x60F9}, //12219 #CJK UNIFIED IDEOGRAPH + {0xC8C8, 0x70ED}, //12220 #CJK UNIFIED IDEOGRAPH + {0xC8C9, 0x58EC}, //12221 #CJK UNIFIED IDEOGRAPH + {0xC8CA, 0x4EC1}, //12222 #CJK UNIFIED IDEOGRAPH + {0xC8CB, 0x4EBA}, //12223 #CJK UNIFIED IDEOGRAPH + {0xC8CC, 0x5FCD}, //12224 #CJK UNIFIED IDEOGRAPH + {0xC8CD, 0x97E7}, //12225 #CJK UNIFIED IDEOGRAPH + {0xC8CE, 0x4EFB}, //12226 #CJK UNIFIED IDEOGRAPH + {0xC8CF, 0x8BA4}, //12227 #CJK UNIFIED IDEOGRAPH + {0xC8D0, 0x5203}, //12228 #CJK UNIFIED IDEOGRAPH + {0xC8D1, 0x598A}, //12229 #CJK UNIFIED IDEOGRAPH + {0xC8D2, 0x7EAB}, //12230 #CJK UNIFIED IDEOGRAPH + {0xC8D3, 0x6254}, //12231 #CJK UNIFIED IDEOGRAPH + {0xC8D4, 0x4ECD}, //12232 #CJK UNIFIED IDEOGRAPH + {0xC8D5, 0x65E5}, //12233 #CJK UNIFIED IDEOGRAPH + {0xC8D6, 0x620E}, //12234 #CJK UNIFIED IDEOGRAPH + {0xC8D7, 0x8338}, //12235 #CJK UNIFIED IDEOGRAPH + {0xC8D8, 0x84C9}, //12236 #CJK UNIFIED IDEOGRAPH + {0xC8D9, 0x8363}, //12237 #CJK UNIFIED IDEOGRAPH + {0xC8DA, 0x878D}, //12238 #CJK UNIFIED IDEOGRAPH + {0xC8DB, 0x7194}, //12239 #CJK UNIFIED IDEOGRAPH + {0xC8DC, 0x6EB6}, //12240 #CJK UNIFIED IDEOGRAPH + {0xC8DD, 0x5BB9}, //12241 #CJK UNIFIED IDEOGRAPH + {0xC8DE, 0x7ED2}, //12242 #CJK UNIFIED IDEOGRAPH + {0xC8DF, 0x5197}, //12243 #CJK UNIFIED IDEOGRAPH + {0xC8E0, 0x63C9}, //12244 #CJK UNIFIED IDEOGRAPH + {0xC8E1, 0x67D4}, //12245 #CJK UNIFIED IDEOGRAPH + {0xC8E2, 0x8089}, //12246 #CJK UNIFIED IDEOGRAPH + {0xC8E3, 0x8339}, //12247 #CJK UNIFIED IDEOGRAPH + {0xC8E4, 0x8815}, //12248 #CJK UNIFIED IDEOGRAPH + {0xC8E5, 0x5112}, //12249 #CJK UNIFIED IDEOGRAPH + {0xC8E6, 0x5B7A}, //12250 #CJK UNIFIED IDEOGRAPH + {0xC8E7, 0x5982}, //12251 #CJK UNIFIED IDEOGRAPH + {0xC8E8, 0x8FB1}, //12252 #CJK UNIFIED IDEOGRAPH + {0xC8E9, 0x4E73}, //12253 #CJK UNIFIED IDEOGRAPH + {0xC8EA, 0x6C5D}, //12254 #CJK UNIFIED IDEOGRAPH + {0xC8EB, 0x5165}, //12255 #CJK UNIFIED IDEOGRAPH + {0xC8EC, 0x8925}, //12256 #CJK UNIFIED IDEOGRAPH + {0xC8ED, 0x8F6F}, //12257 #CJK UNIFIED IDEOGRAPH + {0xC8EE, 0x962E}, //12258 #CJK UNIFIED IDEOGRAPH + {0xC8EF, 0x854A}, //12259 #CJK UNIFIED IDEOGRAPH + {0xC8F0, 0x745E}, //12260 #CJK UNIFIED IDEOGRAPH + {0xC8F1, 0x9510}, //12261 #CJK UNIFIED IDEOGRAPH + {0xC8F2, 0x95F0}, //12262 #CJK UNIFIED IDEOGRAPH + {0xC8F3, 0x6DA6}, //12263 #CJK UNIFIED IDEOGRAPH + {0xC8F4, 0x82E5}, //12264 #CJK UNIFIED IDEOGRAPH + {0xC8F5, 0x5F31}, //12265 #CJK UNIFIED IDEOGRAPH + {0xC8F6, 0x6492}, //12266 #CJK UNIFIED IDEOGRAPH + {0xC8F7, 0x6D12}, //12267 #CJK UNIFIED IDEOGRAPH + {0xC8F8, 0x8428}, //12268 #CJK UNIFIED IDEOGRAPH + {0xC8F9, 0x816E}, //12269 #CJK UNIFIED IDEOGRAPH + {0xC8FA, 0x9CC3}, //12270 #CJK UNIFIED IDEOGRAPH + {0xC8FB, 0x585E}, //12271 #CJK UNIFIED IDEOGRAPH + {0xC8FC, 0x8D5B}, //12272 #CJK UNIFIED IDEOGRAPH + {0xC8FD, 0x4E09}, //12273 #CJK UNIFIED IDEOGRAPH + {0xC8FE, 0x53C1}, //12274 #CJK UNIFIED IDEOGRAPH + {0xC940, 0x847D}, //12275 #CJK UNIFIED IDEOGRAPH + {0xC941, 0x847E}, //12276 #CJK UNIFIED IDEOGRAPH + {0xC942, 0x847F}, //12277 #CJK UNIFIED IDEOGRAPH + {0xC943, 0x8480}, //12278 #CJK UNIFIED IDEOGRAPH + {0xC944, 0x8481}, //12279 #CJK UNIFIED IDEOGRAPH + {0xC945, 0x8483}, //12280 #CJK UNIFIED IDEOGRAPH + {0xC946, 0x8484}, //12281 #CJK UNIFIED IDEOGRAPH + {0xC947, 0x8485}, //12282 #CJK UNIFIED IDEOGRAPH + {0xC948, 0x8486}, //12283 #CJK UNIFIED IDEOGRAPH + {0xC949, 0x848A}, //12284 #CJK UNIFIED IDEOGRAPH + {0xC94A, 0x848D}, //12285 #CJK UNIFIED IDEOGRAPH + {0xC94B, 0x848F}, //12286 #CJK UNIFIED IDEOGRAPH + {0xC94C, 0x8490}, //12287 #CJK UNIFIED IDEOGRAPH + {0xC94D, 0x8491}, //12288 #CJK UNIFIED IDEOGRAPH + {0xC94E, 0x8492}, //12289 #CJK UNIFIED IDEOGRAPH + {0xC94F, 0x8493}, //12290 #CJK UNIFIED IDEOGRAPH + {0xC950, 0x8494}, //12291 #CJK UNIFIED IDEOGRAPH + {0xC951, 0x8495}, //12292 #CJK UNIFIED IDEOGRAPH + {0xC952, 0x8496}, //12293 #CJK UNIFIED IDEOGRAPH + {0xC953, 0x8498}, //12294 #CJK UNIFIED IDEOGRAPH + {0xC954, 0x849A}, //12295 #CJK UNIFIED IDEOGRAPH + {0xC955, 0x849B}, //12296 #CJK UNIFIED IDEOGRAPH + {0xC956, 0x849D}, //12297 #CJK UNIFIED IDEOGRAPH + {0xC957, 0x849E}, //12298 #CJK UNIFIED IDEOGRAPH + {0xC958, 0x849F}, //12299 #CJK UNIFIED IDEOGRAPH + {0xC959, 0x84A0}, //12300 #CJK UNIFIED IDEOGRAPH + {0xC95A, 0x84A2}, //12301 #CJK UNIFIED IDEOGRAPH + {0xC95B, 0x84A3}, //12302 #CJK UNIFIED IDEOGRAPH + {0xC95C, 0x84A4}, //12303 #CJK UNIFIED IDEOGRAPH + {0xC95D, 0x84A5}, //12304 #CJK UNIFIED IDEOGRAPH + {0xC95E, 0x84A6}, //12305 #CJK UNIFIED IDEOGRAPH + {0xC95F, 0x84A7}, //12306 #CJK UNIFIED IDEOGRAPH + {0xC960, 0x84A8}, //12307 #CJK UNIFIED IDEOGRAPH + {0xC961, 0x84A9}, //12308 #CJK UNIFIED IDEOGRAPH + {0xC962, 0x84AA}, //12309 #CJK UNIFIED IDEOGRAPH + {0xC963, 0x84AB}, //12310 #CJK UNIFIED IDEOGRAPH + {0xC964, 0x84AC}, //12311 #CJK UNIFIED IDEOGRAPH + {0xC965, 0x84AD}, //12312 #CJK UNIFIED IDEOGRAPH + {0xC966, 0x84AE}, //12313 #CJK UNIFIED IDEOGRAPH + {0xC967, 0x84B0}, //12314 #CJK UNIFIED IDEOGRAPH + {0xC968, 0x84B1}, //12315 #CJK UNIFIED IDEOGRAPH + {0xC969, 0x84B3}, //12316 #CJK UNIFIED IDEOGRAPH + {0xC96A, 0x84B5}, //12317 #CJK UNIFIED IDEOGRAPH + {0xC96B, 0x84B6}, //12318 #CJK UNIFIED IDEOGRAPH + {0xC96C, 0x84B7}, //12319 #CJK UNIFIED IDEOGRAPH + {0xC96D, 0x84BB}, //12320 #CJK UNIFIED IDEOGRAPH + {0xC96E, 0x84BC}, //12321 #CJK UNIFIED IDEOGRAPH + {0xC96F, 0x84BE}, //12322 #CJK UNIFIED IDEOGRAPH + {0xC970, 0x84C0}, //12323 #CJK UNIFIED IDEOGRAPH + {0xC971, 0x84C2}, //12324 #CJK UNIFIED IDEOGRAPH + {0xC972, 0x84C3}, //12325 #CJK UNIFIED IDEOGRAPH + {0xC973, 0x84C5}, //12326 #CJK UNIFIED IDEOGRAPH + {0xC974, 0x84C6}, //12327 #CJK UNIFIED IDEOGRAPH + {0xC975, 0x84C7}, //12328 #CJK UNIFIED IDEOGRAPH + {0xC976, 0x84C8}, //12329 #CJK UNIFIED IDEOGRAPH + {0xC977, 0x84CB}, //12330 #CJK UNIFIED IDEOGRAPH + {0xC978, 0x84CC}, //12331 #CJK UNIFIED IDEOGRAPH + {0xC979, 0x84CE}, //12332 #CJK UNIFIED IDEOGRAPH + {0xC97A, 0x84CF}, //12333 #CJK UNIFIED IDEOGRAPH + {0xC97B, 0x84D2}, //12334 #CJK UNIFIED IDEOGRAPH + {0xC97C, 0x84D4}, //12335 #CJK UNIFIED IDEOGRAPH + {0xC97D, 0x84D5}, //12336 #CJK UNIFIED IDEOGRAPH + {0xC97E, 0x84D7}, //12337 #CJK UNIFIED IDEOGRAPH + {0xC980, 0x84D8}, //12338 #CJK UNIFIED IDEOGRAPH + {0xC981, 0x84D9}, //12339 #CJK UNIFIED IDEOGRAPH + {0xC982, 0x84DA}, //12340 #CJK UNIFIED IDEOGRAPH + {0xC983, 0x84DB}, //12341 #CJK UNIFIED IDEOGRAPH + {0xC984, 0x84DC}, //12342 #CJK UNIFIED IDEOGRAPH + {0xC985, 0x84DE}, //12343 #CJK UNIFIED IDEOGRAPH + {0xC986, 0x84E1}, //12344 #CJK UNIFIED IDEOGRAPH + {0xC987, 0x84E2}, //12345 #CJK UNIFIED IDEOGRAPH + {0xC988, 0x84E4}, //12346 #CJK UNIFIED IDEOGRAPH + {0xC989, 0x84E7}, //12347 #CJK UNIFIED IDEOGRAPH + {0xC98A, 0x84E8}, //12348 #CJK UNIFIED IDEOGRAPH + {0xC98B, 0x84E9}, //12349 #CJK UNIFIED IDEOGRAPH + {0xC98C, 0x84EA}, //12350 #CJK UNIFIED IDEOGRAPH + {0xC98D, 0x84EB}, //12351 #CJK UNIFIED IDEOGRAPH + {0xC98E, 0x84ED}, //12352 #CJK UNIFIED IDEOGRAPH + {0xC98F, 0x84EE}, //12353 #CJK UNIFIED IDEOGRAPH + {0xC990, 0x84EF}, //12354 #CJK UNIFIED IDEOGRAPH + {0xC991, 0x84F1}, //12355 #CJK UNIFIED IDEOGRAPH + {0xC992, 0x84F2}, //12356 #CJK UNIFIED IDEOGRAPH + {0xC993, 0x84F3}, //12357 #CJK UNIFIED IDEOGRAPH + {0xC994, 0x84F4}, //12358 #CJK UNIFIED IDEOGRAPH + {0xC995, 0x84F5}, //12359 #CJK UNIFIED IDEOGRAPH + {0xC996, 0x84F6}, //12360 #CJK UNIFIED IDEOGRAPH + {0xC997, 0x84F7}, //12361 #CJK UNIFIED IDEOGRAPH + {0xC998, 0x84F8}, //12362 #CJK UNIFIED IDEOGRAPH + {0xC999, 0x84F9}, //12363 #CJK UNIFIED IDEOGRAPH + {0xC99A, 0x84FA}, //12364 #CJK UNIFIED IDEOGRAPH + {0xC99B, 0x84FB}, //12365 #CJK UNIFIED IDEOGRAPH + {0xC99C, 0x84FD}, //12366 #CJK UNIFIED IDEOGRAPH + {0xC99D, 0x84FE}, //12367 #CJK UNIFIED IDEOGRAPH + {0xC99E, 0x8500}, //12368 #CJK UNIFIED IDEOGRAPH + {0xC99F, 0x8501}, //12369 #CJK UNIFIED IDEOGRAPH + {0xC9A0, 0x8502}, //12370 #CJK UNIFIED IDEOGRAPH + {0xC9A1, 0x4F1E}, //12371 #CJK UNIFIED IDEOGRAPH + {0xC9A2, 0x6563}, //12372 #CJK UNIFIED IDEOGRAPH + {0xC9A3, 0x6851}, //12373 #CJK UNIFIED IDEOGRAPH + {0xC9A4, 0x55D3}, //12374 #CJK UNIFIED IDEOGRAPH + {0xC9A5, 0x4E27}, //12375 #CJK UNIFIED IDEOGRAPH + {0xC9A6, 0x6414}, //12376 #CJK UNIFIED IDEOGRAPH + {0xC9A7, 0x9A9A}, //12377 #CJK UNIFIED IDEOGRAPH + {0xC9A8, 0x626B}, //12378 #CJK UNIFIED IDEOGRAPH + {0xC9A9, 0x5AC2}, //12379 #CJK UNIFIED IDEOGRAPH + {0xC9AA, 0x745F}, //12380 #CJK UNIFIED IDEOGRAPH + {0xC9AB, 0x8272}, //12381 #CJK UNIFIED IDEOGRAPH + {0xC9AC, 0x6DA9}, //12382 #CJK UNIFIED IDEOGRAPH + {0xC9AD, 0x68EE}, //12383 #CJK UNIFIED IDEOGRAPH + {0xC9AE, 0x50E7}, //12384 #CJK UNIFIED IDEOGRAPH + {0xC9AF, 0x838E}, //12385 #CJK UNIFIED IDEOGRAPH + {0xC9B0, 0x7802}, //12386 #CJK UNIFIED IDEOGRAPH + {0xC9B1, 0x6740}, //12387 #CJK UNIFIED IDEOGRAPH + {0xC9B2, 0x5239}, //12388 #CJK UNIFIED IDEOGRAPH + {0xC9B3, 0x6C99}, //12389 #CJK UNIFIED IDEOGRAPH + {0xC9B4, 0x7EB1}, //12390 #CJK UNIFIED IDEOGRAPH + {0xC9B5, 0x50BB}, //12391 #CJK UNIFIED IDEOGRAPH + {0xC9B6, 0x5565}, //12392 #CJK UNIFIED IDEOGRAPH + {0xC9B7, 0x715E}, //12393 #CJK UNIFIED IDEOGRAPH + {0xC9B8, 0x7B5B}, //12394 #CJK UNIFIED IDEOGRAPH + {0xC9B9, 0x6652}, //12395 #CJK UNIFIED IDEOGRAPH + {0xC9BA, 0x73CA}, //12396 #CJK UNIFIED IDEOGRAPH + {0xC9BB, 0x82EB}, //12397 #CJK UNIFIED IDEOGRAPH + {0xC9BC, 0x6749}, //12398 #CJK UNIFIED IDEOGRAPH + {0xC9BD, 0x5C71}, //12399 #CJK UNIFIED IDEOGRAPH + {0xC9BE, 0x5220}, //12400 #CJK UNIFIED IDEOGRAPH + {0xC9BF, 0x717D}, //12401 #CJK UNIFIED IDEOGRAPH + {0xC9C0, 0x886B}, //12402 #CJK UNIFIED IDEOGRAPH + {0xC9C1, 0x95EA}, //12403 #CJK UNIFIED IDEOGRAPH + {0xC9C2, 0x9655}, //12404 #CJK UNIFIED IDEOGRAPH + {0xC9C3, 0x64C5}, //12405 #CJK UNIFIED IDEOGRAPH + {0xC9C4, 0x8D61}, //12406 #CJK UNIFIED IDEOGRAPH + {0xC9C5, 0x81B3}, //12407 #CJK UNIFIED IDEOGRAPH + {0xC9C6, 0x5584}, //12408 #CJK UNIFIED IDEOGRAPH + {0xC9C7, 0x6C55}, //12409 #CJK UNIFIED IDEOGRAPH + {0xC9C8, 0x6247}, //12410 #CJK UNIFIED IDEOGRAPH + {0xC9C9, 0x7F2E}, //12411 #CJK UNIFIED IDEOGRAPH + {0xC9CA, 0x5892}, //12412 #CJK UNIFIED IDEOGRAPH + {0xC9CB, 0x4F24}, //12413 #CJK UNIFIED IDEOGRAPH + {0xC9CC, 0x5546}, //12414 #CJK UNIFIED IDEOGRAPH + {0xC9CD, 0x8D4F}, //12415 #CJK UNIFIED IDEOGRAPH + {0xC9CE, 0x664C}, //12416 #CJK UNIFIED IDEOGRAPH + {0xC9CF, 0x4E0A}, //12417 #CJK UNIFIED IDEOGRAPH + {0xC9D0, 0x5C1A}, //12418 #CJK UNIFIED IDEOGRAPH + {0xC9D1, 0x88F3}, //12419 #CJK UNIFIED IDEOGRAPH + {0xC9D2, 0x68A2}, //12420 #CJK UNIFIED IDEOGRAPH + {0xC9D3, 0x634E}, //12421 #CJK UNIFIED IDEOGRAPH + {0xC9D4, 0x7A0D}, //12422 #CJK UNIFIED IDEOGRAPH + {0xC9D5, 0x70E7}, //12423 #CJK UNIFIED IDEOGRAPH + {0xC9D6, 0x828D}, //12424 #CJK UNIFIED IDEOGRAPH + {0xC9D7, 0x52FA}, //12425 #CJK UNIFIED IDEOGRAPH + {0xC9D8, 0x97F6}, //12426 #CJK UNIFIED IDEOGRAPH + {0xC9D9, 0x5C11}, //12427 #CJK UNIFIED IDEOGRAPH + {0xC9DA, 0x54E8}, //12428 #CJK UNIFIED IDEOGRAPH + {0xC9DB, 0x90B5}, //12429 #CJK UNIFIED IDEOGRAPH + {0xC9DC, 0x7ECD}, //12430 #CJK UNIFIED IDEOGRAPH + {0xC9DD, 0x5962}, //12431 #CJK UNIFIED IDEOGRAPH + {0xC9DE, 0x8D4A}, //12432 #CJK UNIFIED IDEOGRAPH + {0xC9DF, 0x86C7}, //12433 #CJK UNIFIED IDEOGRAPH + {0xC9E0, 0x820C}, //12434 #CJK UNIFIED IDEOGRAPH + {0xC9E1, 0x820D}, //12435 #CJK UNIFIED IDEOGRAPH + {0xC9E2, 0x8D66}, //12436 #CJK UNIFIED IDEOGRAPH + {0xC9E3, 0x6444}, //12437 #CJK UNIFIED IDEOGRAPH + {0xC9E4, 0x5C04}, //12438 #CJK UNIFIED IDEOGRAPH + {0xC9E5, 0x6151}, //12439 #CJK UNIFIED IDEOGRAPH + {0xC9E6, 0x6D89}, //12440 #CJK UNIFIED IDEOGRAPH + {0xC9E7, 0x793E}, //12441 #CJK UNIFIED IDEOGRAPH + {0xC9E8, 0x8BBE}, //12442 #CJK UNIFIED IDEOGRAPH + {0xC9E9, 0x7837}, //12443 #CJK UNIFIED IDEOGRAPH + {0xC9EA, 0x7533}, //12444 #CJK UNIFIED IDEOGRAPH + {0xC9EB, 0x547B}, //12445 #CJK UNIFIED IDEOGRAPH + {0xC9EC, 0x4F38}, //12446 #CJK UNIFIED IDEOGRAPH + {0xC9ED, 0x8EAB}, //12447 #CJK UNIFIED IDEOGRAPH + {0xC9EE, 0x6DF1}, //12448 #CJK UNIFIED IDEOGRAPH + {0xC9EF, 0x5A20}, //12449 #CJK UNIFIED IDEOGRAPH + {0xC9F0, 0x7EC5}, //12450 #CJK UNIFIED IDEOGRAPH + {0xC9F1, 0x795E}, //12451 #CJK UNIFIED IDEOGRAPH + {0xC9F2, 0x6C88}, //12452 #CJK UNIFIED IDEOGRAPH + {0xC9F3, 0x5BA1}, //12453 #CJK UNIFIED IDEOGRAPH + {0xC9F4, 0x5A76}, //12454 #CJK UNIFIED IDEOGRAPH + {0xC9F5, 0x751A}, //12455 #CJK UNIFIED IDEOGRAPH + {0xC9F6, 0x80BE}, //12456 #CJK UNIFIED IDEOGRAPH + {0xC9F7, 0x614E}, //12457 #CJK UNIFIED IDEOGRAPH + {0xC9F8, 0x6E17}, //12458 #CJK UNIFIED IDEOGRAPH + {0xC9F9, 0x58F0}, //12459 #CJK UNIFIED IDEOGRAPH + {0xC9FA, 0x751F}, //12460 #CJK UNIFIED IDEOGRAPH + {0xC9FB, 0x7525}, //12461 #CJK UNIFIED IDEOGRAPH + {0xC9FC, 0x7272}, //12462 #CJK UNIFIED IDEOGRAPH + {0xC9FD, 0x5347}, //12463 #CJK UNIFIED IDEOGRAPH + {0xC9FE, 0x7EF3}, //12464 #CJK UNIFIED IDEOGRAPH + {0xCA40, 0x8503}, //12465 #CJK UNIFIED IDEOGRAPH + {0xCA41, 0x8504}, //12466 #CJK UNIFIED IDEOGRAPH + {0xCA42, 0x8505}, //12467 #CJK UNIFIED IDEOGRAPH + {0xCA43, 0x8506}, //12468 #CJK UNIFIED IDEOGRAPH + {0xCA44, 0x8507}, //12469 #CJK UNIFIED IDEOGRAPH + {0xCA45, 0x8508}, //12470 #CJK UNIFIED IDEOGRAPH + {0xCA46, 0x8509}, //12471 #CJK UNIFIED IDEOGRAPH + {0xCA47, 0x850A}, //12472 #CJK UNIFIED IDEOGRAPH + {0xCA48, 0x850B}, //12473 #CJK UNIFIED IDEOGRAPH + {0xCA49, 0x850D}, //12474 #CJK UNIFIED IDEOGRAPH + {0xCA4A, 0x850E}, //12475 #CJK UNIFIED IDEOGRAPH + {0xCA4B, 0x850F}, //12476 #CJK UNIFIED IDEOGRAPH + {0xCA4C, 0x8510}, //12477 #CJK UNIFIED IDEOGRAPH + {0xCA4D, 0x8512}, //12478 #CJK UNIFIED IDEOGRAPH + {0xCA4E, 0x8514}, //12479 #CJK UNIFIED IDEOGRAPH + {0xCA4F, 0x8515}, //12480 #CJK UNIFIED IDEOGRAPH + {0xCA50, 0x8516}, //12481 #CJK UNIFIED IDEOGRAPH + {0xCA51, 0x8518}, //12482 #CJK UNIFIED IDEOGRAPH + {0xCA52, 0x8519}, //12483 #CJK UNIFIED IDEOGRAPH + {0xCA53, 0x851B}, //12484 #CJK UNIFIED IDEOGRAPH + {0xCA54, 0x851C}, //12485 #CJK UNIFIED IDEOGRAPH + {0xCA55, 0x851D}, //12486 #CJK UNIFIED IDEOGRAPH + {0xCA56, 0x851E}, //12487 #CJK UNIFIED IDEOGRAPH + {0xCA57, 0x8520}, //12488 #CJK UNIFIED IDEOGRAPH + {0xCA58, 0x8522}, //12489 #CJK UNIFIED IDEOGRAPH + {0xCA59, 0x8523}, //12490 #CJK UNIFIED IDEOGRAPH + {0xCA5A, 0x8524}, //12491 #CJK UNIFIED IDEOGRAPH + {0xCA5B, 0x8525}, //12492 #CJK UNIFIED IDEOGRAPH + {0xCA5C, 0x8526}, //12493 #CJK UNIFIED IDEOGRAPH + {0xCA5D, 0x8527}, //12494 #CJK UNIFIED IDEOGRAPH + {0xCA5E, 0x8528}, //12495 #CJK UNIFIED IDEOGRAPH + {0xCA5F, 0x8529}, //12496 #CJK UNIFIED IDEOGRAPH + {0xCA60, 0x852A}, //12497 #CJK UNIFIED IDEOGRAPH + {0xCA61, 0x852D}, //12498 #CJK UNIFIED IDEOGRAPH + {0xCA62, 0x852E}, //12499 #CJK UNIFIED IDEOGRAPH + {0xCA63, 0x852F}, //12500 #CJK UNIFIED IDEOGRAPH + {0xCA64, 0x8530}, //12501 #CJK UNIFIED IDEOGRAPH + {0xCA65, 0x8531}, //12502 #CJK UNIFIED IDEOGRAPH + {0xCA66, 0x8532}, //12503 #CJK UNIFIED IDEOGRAPH + {0xCA67, 0x8533}, //12504 #CJK UNIFIED IDEOGRAPH + {0xCA68, 0x8534}, //12505 #CJK UNIFIED IDEOGRAPH + {0xCA69, 0x8535}, //12506 #CJK UNIFIED IDEOGRAPH + {0xCA6A, 0x8536}, //12507 #CJK UNIFIED IDEOGRAPH + {0xCA6B, 0x853E}, //12508 #CJK UNIFIED IDEOGRAPH + {0xCA6C, 0x853F}, //12509 #CJK UNIFIED IDEOGRAPH + {0xCA6D, 0x8540}, //12510 #CJK UNIFIED IDEOGRAPH + {0xCA6E, 0x8541}, //12511 #CJK UNIFIED IDEOGRAPH + {0xCA6F, 0x8542}, //12512 #CJK UNIFIED IDEOGRAPH + {0xCA70, 0x8544}, //12513 #CJK UNIFIED IDEOGRAPH + {0xCA71, 0x8545}, //12514 #CJK UNIFIED IDEOGRAPH + {0xCA72, 0x8546}, //12515 #CJK UNIFIED IDEOGRAPH + {0xCA73, 0x8547}, //12516 #CJK UNIFIED IDEOGRAPH + {0xCA74, 0x854B}, //12517 #CJK UNIFIED IDEOGRAPH + {0xCA75, 0x854C}, //12518 #CJK UNIFIED IDEOGRAPH + {0xCA76, 0x854D}, //12519 #CJK UNIFIED IDEOGRAPH + {0xCA77, 0x854E}, //12520 #CJK UNIFIED IDEOGRAPH + {0xCA78, 0x854F}, //12521 #CJK UNIFIED IDEOGRAPH + {0xCA79, 0x8550}, //12522 #CJK UNIFIED IDEOGRAPH + {0xCA7A, 0x8551}, //12523 #CJK UNIFIED IDEOGRAPH + {0xCA7B, 0x8552}, //12524 #CJK UNIFIED IDEOGRAPH + {0xCA7C, 0x8553}, //12525 #CJK UNIFIED IDEOGRAPH + {0xCA7D, 0x8554}, //12526 #CJK UNIFIED IDEOGRAPH + {0xCA7E, 0x8555}, //12527 #CJK UNIFIED IDEOGRAPH + {0xCA80, 0x8557}, //12528 #CJK UNIFIED IDEOGRAPH + {0xCA81, 0x8558}, //12529 #CJK UNIFIED IDEOGRAPH + {0xCA82, 0x855A}, //12530 #CJK UNIFIED IDEOGRAPH + {0xCA83, 0x855B}, //12531 #CJK UNIFIED IDEOGRAPH + {0xCA84, 0x855C}, //12532 #CJK UNIFIED IDEOGRAPH + {0xCA85, 0x855D}, //12533 #CJK UNIFIED IDEOGRAPH + {0xCA86, 0x855F}, //12534 #CJK UNIFIED IDEOGRAPH + {0xCA87, 0x8560}, //12535 #CJK UNIFIED IDEOGRAPH + {0xCA88, 0x8561}, //12536 #CJK UNIFIED IDEOGRAPH + {0xCA89, 0x8562}, //12537 #CJK UNIFIED IDEOGRAPH + {0xCA8A, 0x8563}, //12538 #CJK UNIFIED IDEOGRAPH + {0xCA8B, 0x8565}, //12539 #CJK UNIFIED IDEOGRAPH + {0xCA8C, 0x8566}, //12540 #CJK UNIFIED IDEOGRAPH + {0xCA8D, 0x8567}, //12541 #CJK UNIFIED IDEOGRAPH + {0xCA8E, 0x8569}, //12542 #CJK UNIFIED IDEOGRAPH + {0xCA8F, 0x856A}, //12543 #CJK UNIFIED IDEOGRAPH + {0xCA90, 0x856B}, //12544 #CJK UNIFIED IDEOGRAPH + {0xCA91, 0x856C}, //12545 #CJK UNIFIED IDEOGRAPH + {0xCA92, 0x856D}, //12546 #CJK UNIFIED IDEOGRAPH + {0xCA93, 0x856E}, //12547 #CJK UNIFIED IDEOGRAPH + {0xCA94, 0x856F}, //12548 #CJK UNIFIED IDEOGRAPH + {0xCA95, 0x8570}, //12549 #CJK UNIFIED IDEOGRAPH + {0xCA96, 0x8571}, //12550 #CJK UNIFIED IDEOGRAPH + {0xCA97, 0x8573}, //12551 #CJK UNIFIED IDEOGRAPH + {0xCA98, 0x8575}, //12552 #CJK UNIFIED IDEOGRAPH + {0xCA99, 0x8576}, //12553 #CJK UNIFIED IDEOGRAPH + {0xCA9A, 0x8577}, //12554 #CJK UNIFIED IDEOGRAPH + {0xCA9B, 0x8578}, //12555 #CJK UNIFIED IDEOGRAPH + {0xCA9C, 0x857C}, //12556 #CJK UNIFIED IDEOGRAPH + {0xCA9D, 0x857D}, //12557 #CJK UNIFIED IDEOGRAPH + {0xCA9E, 0x857F}, //12558 #CJK UNIFIED IDEOGRAPH + {0xCA9F, 0x8580}, //12559 #CJK UNIFIED IDEOGRAPH + {0xCAA0, 0x8581}, //12560 #CJK UNIFIED IDEOGRAPH + {0xCAA1, 0x7701}, //12561 #CJK UNIFIED IDEOGRAPH + {0xCAA2, 0x76DB}, //12562 #CJK UNIFIED IDEOGRAPH + {0xCAA3, 0x5269}, //12563 #CJK UNIFIED IDEOGRAPH + {0xCAA4, 0x80DC}, //12564 #CJK UNIFIED IDEOGRAPH + {0xCAA5, 0x5723}, //12565 #CJK UNIFIED IDEOGRAPH + {0xCAA6, 0x5E08}, //12566 #CJK UNIFIED IDEOGRAPH + {0xCAA7, 0x5931}, //12567 #CJK UNIFIED IDEOGRAPH + {0xCAA8, 0x72EE}, //12568 #CJK UNIFIED IDEOGRAPH + {0xCAA9, 0x65BD}, //12569 #CJK UNIFIED IDEOGRAPH + {0xCAAA, 0x6E7F}, //12570 #CJK UNIFIED IDEOGRAPH + {0xCAAB, 0x8BD7}, //12571 #CJK UNIFIED IDEOGRAPH + {0xCAAC, 0x5C38}, //12572 #CJK UNIFIED IDEOGRAPH + {0xCAAD, 0x8671}, //12573 #CJK UNIFIED IDEOGRAPH + {0xCAAE, 0x5341}, //12574 #CJK UNIFIED IDEOGRAPH + {0xCAAF, 0x77F3}, //12575 #CJK UNIFIED IDEOGRAPH + {0xCAB0, 0x62FE}, //12576 #CJK UNIFIED IDEOGRAPH + {0xCAB1, 0x65F6}, //12577 #CJK UNIFIED IDEOGRAPH + {0xCAB2, 0x4EC0}, //12578 #CJK UNIFIED IDEOGRAPH + {0xCAB3, 0x98DF}, //12579 #CJK UNIFIED IDEOGRAPH + {0xCAB4, 0x8680}, //12580 #CJK UNIFIED IDEOGRAPH + {0xCAB5, 0x5B9E}, //12581 #CJK UNIFIED IDEOGRAPH + {0xCAB6, 0x8BC6}, //12582 #CJK UNIFIED IDEOGRAPH + {0xCAB7, 0x53F2}, //12583 #CJK UNIFIED IDEOGRAPH + {0xCAB8, 0x77E2}, //12584 #CJK UNIFIED IDEOGRAPH + {0xCAB9, 0x4F7F}, //12585 #CJK UNIFIED IDEOGRAPH + {0xCABA, 0x5C4E}, //12586 #CJK UNIFIED IDEOGRAPH + {0xCABB, 0x9A76}, //12587 #CJK UNIFIED IDEOGRAPH + {0xCABC, 0x59CB}, //12588 #CJK UNIFIED IDEOGRAPH + {0xCABD, 0x5F0F}, //12589 #CJK UNIFIED IDEOGRAPH + {0xCABE, 0x793A}, //12590 #CJK UNIFIED IDEOGRAPH + {0xCABF, 0x58EB}, //12591 #CJK UNIFIED IDEOGRAPH + {0xCAC0, 0x4E16}, //12592 #CJK UNIFIED IDEOGRAPH + {0xCAC1, 0x67FF}, //12593 #CJK UNIFIED IDEOGRAPH + {0xCAC2, 0x4E8B}, //12594 #CJK UNIFIED IDEOGRAPH + {0xCAC3, 0x62ED}, //12595 #CJK UNIFIED IDEOGRAPH + {0xCAC4, 0x8A93}, //12596 #CJK UNIFIED IDEOGRAPH + {0xCAC5, 0x901D}, //12597 #CJK UNIFIED IDEOGRAPH + {0xCAC6, 0x52BF}, //12598 #CJK UNIFIED IDEOGRAPH + {0xCAC7, 0x662F}, //12599 #CJK UNIFIED IDEOGRAPH + {0xCAC8, 0x55DC}, //12600 #CJK UNIFIED IDEOGRAPH + {0xCAC9, 0x566C}, //12601 #CJK UNIFIED IDEOGRAPH + {0xCACA, 0x9002}, //12602 #CJK UNIFIED IDEOGRAPH + {0xCACB, 0x4ED5}, //12603 #CJK UNIFIED IDEOGRAPH + {0xCACC, 0x4F8D}, //12604 #CJK UNIFIED IDEOGRAPH + {0xCACD, 0x91CA}, //12605 #CJK UNIFIED IDEOGRAPH + {0xCACE, 0x9970}, //12606 #CJK UNIFIED IDEOGRAPH + {0xCACF, 0x6C0F}, //12607 #CJK UNIFIED IDEOGRAPH + {0xCAD0, 0x5E02}, //12608 #CJK UNIFIED IDEOGRAPH + {0xCAD1, 0x6043}, //12609 #CJK UNIFIED IDEOGRAPH + {0xCAD2, 0x5BA4}, //12610 #CJK UNIFIED IDEOGRAPH + {0xCAD3, 0x89C6}, //12611 #CJK UNIFIED IDEOGRAPH + {0xCAD4, 0x8BD5}, //12612 #CJK UNIFIED IDEOGRAPH + {0xCAD5, 0x6536}, //12613 #CJK UNIFIED IDEOGRAPH + {0xCAD6, 0x624B}, //12614 #CJK UNIFIED IDEOGRAPH + {0xCAD7, 0x9996}, //12615 #CJK UNIFIED IDEOGRAPH + {0xCAD8, 0x5B88}, //12616 #CJK UNIFIED IDEOGRAPH + {0xCAD9, 0x5BFF}, //12617 #CJK UNIFIED IDEOGRAPH + {0xCADA, 0x6388}, //12618 #CJK UNIFIED IDEOGRAPH + {0xCADB, 0x552E}, //12619 #CJK UNIFIED IDEOGRAPH + {0xCADC, 0x53D7}, //12620 #CJK UNIFIED IDEOGRAPH + {0xCADD, 0x7626}, //12621 #CJK UNIFIED IDEOGRAPH + {0xCADE, 0x517D}, //12622 #CJK UNIFIED IDEOGRAPH + {0xCADF, 0x852C}, //12623 #CJK UNIFIED IDEOGRAPH + {0xCAE0, 0x67A2}, //12624 #CJK UNIFIED IDEOGRAPH + {0xCAE1, 0x68B3}, //12625 #CJK UNIFIED IDEOGRAPH + {0xCAE2, 0x6B8A}, //12626 #CJK UNIFIED IDEOGRAPH + {0xCAE3, 0x6292}, //12627 #CJK UNIFIED IDEOGRAPH + {0xCAE4, 0x8F93}, //12628 #CJK UNIFIED IDEOGRAPH + {0xCAE5, 0x53D4}, //12629 #CJK UNIFIED IDEOGRAPH + {0xCAE6, 0x8212}, //12630 #CJK UNIFIED IDEOGRAPH + {0xCAE7, 0x6DD1}, //12631 #CJK UNIFIED IDEOGRAPH + {0xCAE8, 0x758F}, //12632 #CJK UNIFIED IDEOGRAPH + {0xCAE9, 0x4E66}, //12633 #CJK UNIFIED IDEOGRAPH + {0xCAEA, 0x8D4E}, //12634 #CJK UNIFIED IDEOGRAPH + {0xCAEB, 0x5B70}, //12635 #CJK UNIFIED IDEOGRAPH + {0xCAEC, 0x719F}, //12636 #CJK UNIFIED IDEOGRAPH + {0xCAED, 0x85AF}, //12637 #CJK UNIFIED IDEOGRAPH + {0xCAEE, 0x6691}, //12638 #CJK UNIFIED IDEOGRAPH + {0xCAEF, 0x66D9}, //12639 #CJK UNIFIED IDEOGRAPH + {0xCAF0, 0x7F72}, //12640 #CJK UNIFIED IDEOGRAPH + {0xCAF1, 0x8700}, //12641 #CJK UNIFIED IDEOGRAPH + {0xCAF2, 0x9ECD}, //12642 #CJK UNIFIED IDEOGRAPH + {0xCAF3, 0x9F20}, //12643 #CJK UNIFIED IDEOGRAPH + {0xCAF4, 0x5C5E}, //12644 #CJK UNIFIED IDEOGRAPH + {0xCAF5, 0x672F}, //12645 #CJK UNIFIED IDEOGRAPH + {0xCAF6, 0x8FF0}, //12646 #CJK UNIFIED IDEOGRAPH + {0xCAF7, 0x6811}, //12647 #CJK UNIFIED IDEOGRAPH + {0xCAF8, 0x675F}, //12648 #CJK UNIFIED IDEOGRAPH + {0xCAF9, 0x620D}, //12649 #CJK UNIFIED IDEOGRAPH + {0xCAFA, 0x7AD6}, //12650 #CJK UNIFIED IDEOGRAPH + {0xCAFB, 0x5885}, //12651 #CJK UNIFIED IDEOGRAPH + {0xCAFC, 0x5EB6}, //12652 #CJK UNIFIED IDEOGRAPH + {0xCAFD, 0x6570}, //12653 #CJK UNIFIED IDEOGRAPH + {0xCAFE, 0x6F31}, //12654 #CJK UNIFIED IDEOGRAPH + {0xCB40, 0x8582}, //12655 #CJK UNIFIED IDEOGRAPH + {0xCB41, 0x8583}, //12656 #CJK UNIFIED IDEOGRAPH + {0xCB42, 0x8586}, //12657 #CJK UNIFIED IDEOGRAPH + {0xCB43, 0x8588}, //12658 #CJK UNIFIED IDEOGRAPH + {0xCB44, 0x8589}, //12659 #CJK UNIFIED IDEOGRAPH + {0xCB45, 0x858A}, //12660 #CJK UNIFIED IDEOGRAPH + {0xCB46, 0x858B}, //12661 #CJK UNIFIED IDEOGRAPH + {0xCB47, 0x858C}, //12662 #CJK UNIFIED IDEOGRAPH + {0xCB48, 0x858D}, //12663 #CJK UNIFIED IDEOGRAPH + {0xCB49, 0x858E}, //12664 #CJK UNIFIED IDEOGRAPH + {0xCB4A, 0x8590}, //12665 #CJK UNIFIED IDEOGRAPH + {0xCB4B, 0x8591}, //12666 #CJK UNIFIED IDEOGRAPH + {0xCB4C, 0x8592}, //12667 #CJK UNIFIED IDEOGRAPH + {0xCB4D, 0x8593}, //12668 #CJK UNIFIED IDEOGRAPH + {0xCB4E, 0x8594}, //12669 #CJK UNIFIED IDEOGRAPH + {0xCB4F, 0x8595}, //12670 #CJK UNIFIED IDEOGRAPH + {0xCB50, 0x8596}, //12671 #CJK UNIFIED IDEOGRAPH + {0xCB51, 0x8597}, //12672 #CJK UNIFIED IDEOGRAPH + {0xCB52, 0x8598}, //12673 #CJK UNIFIED IDEOGRAPH + {0xCB53, 0x8599}, //12674 #CJK UNIFIED IDEOGRAPH + {0xCB54, 0x859A}, //12675 #CJK UNIFIED IDEOGRAPH + {0xCB55, 0x859D}, //12676 #CJK UNIFIED IDEOGRAPH + {0xCB56, 0x859E}, //12677 #CJK UNIFIED IDEOGRAPH + {0xCB57, 0x859F}, //12678 #CJK UNIFIED IDEOGRAPH + {0xCB58, 0x85A0}, //12679 #CJK UNIFIED IDEOGRAPH + {0xCB59, 0x85A1}, //12680 #CJK UNIFIED IDEOGRAPH + {0xCB5A, 0x85A2}, //12681 #CJK UNIFIED IDEOGRAPH + {0xCB5B, 0x85A3}, //12682 #CJK UNIFIED IDEOGRAPH + {0xCB5C, 0x85A5}, //12683 #CJK UNIFIED IDEOGRAPH + {0xCB5D, 0x85A6}, //12684 #CJK UNIFIED IDEOGRAPH + {0xCB5E, 0x85A7}, //12685 #CJK UNIFIED IDEOGRAPH + {0xCB5F, 0x85A9}, //12686 #CJK UNIFIED IDEOGRAPH + {0xCB60, 0x85AB}, //12687 #CJK UNIFIED IDEOGRAPH + {0xCB61, 0x85AC}, //12688 #CJK UNIFIED IDEOGRAPH + {0xCB62, 0x85AD}, //12689 #CJK UNIFIED IDEOGRAPH + {0xCB63, 0x85B1}, //12690 #CJK UNIFIED IDEOGRAPH + {0xCB64, 0x85B2}, //12691 #CJK UNIFIED IDEOGRAPH + {0xCB65, 0x85B3}, //12692 #CJK UNIFIED IDEOGRAPH + {0xCB66, 0x85B4}, //12693 #CJK UNIFIED IDEOGRAPH + {0xCB67, 0x85B5}, //12694 #CJK UNIFIED IDEOGRAPH + {0xCB68, 0x85B6}, //12695 #CJK UNIFIED IDEOGRAPH + {0xCB69, 0x85B8}, //12696 #CJK UNIFIED IDEOGRAPH + {0xCB6A, 0x85BA}, //12697 #CJK UNIFIED IDEOGRAPH + {0xCB6B, 0x85BB}, //12698 #CJK UNIFIED IDEOGRAPH + {0xCB6C, 0x85BC}, //12699 #CJK UNIFIED IDEOGRAPH + {0xCB6D, 0x85BD}, //12700 #CJK UNIFIED IDEOGRAPH + {0xCB6E, 0x85BE}, //12701 #CJK UNIFIED IDEOGRAPH + {0xCB6F, 0x85BF}, //12702 #CJK UNIFIED IDEOGRAPH + {0xCB70, 0x85C0}, //12703 #CJK UNIFIED IDEOGRAPH + {0xCB71, 0x85C2}, //12704 #CJK UNIFIED IDEOGRAPH + {0xCB72, 0x85C3}, //12705 #CJK UNIFIED IDEOGRAPH + {0xCB73, 0x85C4}, //12706 #CJK UNIFIED IDEOGRAPH + {0xCB74, 0x85C5}, //12707 #CJK UNIFIED IDEOGRAPH + {0xCB75, 0x85C6}, //12708 #CJK UNIFIED IDEOGRAPH + {0xCB76, 0x85C7}, //12709 #CJK UNIFIED IDEOGRAPH + {0xCB77, 0x85C8}, //12710 #CJK UNIFIED IDEOGRAPH + {0xCB78, 0x85CA}, //12711 #CJK UNIFIED IDEOGRAPH + {0xCB79, 0x85CB}, //12712 #CJK UNIFIED IDEOGRAPH + {0xCB7A, 0x85CC}, //12713 #CJK UNIFIED IDEOGRAPH + {0xCB7B, 0x85CD}, //12714 #CJK UNIFIED IDEOGRAPH + {0xCB7C, 0x85CE}, //12715 #CJK UNIFIED IDEOGRAPH + {0xCB7D, 0x85D1}, //12716 #CJK UNIFIED IDEOGRAPH + {0xCB7E, 0x85D2}, //12717 #CJK UNIFIED IDEOGRAPH + {0xCB80, 0x85D4}, //12718 #CJK UNIFIED IDEOGRAPH + {0xCB81, 0x85D6}, //12719 #CJK UNIFIED IDEOGRAPH + {0xCB82, 0x85D7}, //12720 #CJK UNIFIED IDEOGRAPH + {0xCB83, 0x85D8}, //12721 #CJK UNIFIED IDEOGRAPH + {0xCB84, 0x85D9}, //12722 #CJK UNIFIED IDEOGRAPH + {0xCB85, 0x85DA}, //12723 #CJK UNIFIED IDEOGRAPH + {0xCB86, 0x85DB}, //12724 #CJK UNIFIED IDEOGRAPH + {0xCB87, 0x85DD}, //12725 #CJK UNIFIED IDEOGRAPH + {0xCB88, 0x85DE}, //12726 #CJK UNIFIED IDEOGRAPH + {0xCB89, 0x85DF}, //12727 #CJK UNIFIED IDEOGRAPH + {0xCB8A, 0x85E0}, //12728 #CJK UNIFIED IDEOGRAPH + {0xCB8B, 0x85E1}, //12729 #CJK UNIFIED IDEOGRAPH + {0xCB8C, 0x85E2}, //12730 #CJK UNIFIED IDEOGRAPH + {0xCB8D, 0x85E3}, //12731 #CJK UNIFIED IDEOGRAPH + {0xCB8E, 0x85E5}, //12732 #CJK UNIFIED IDEOGRAPH + {0xCB8F, 0x85E6}, //12733 #CJK UNIFIED IDEOGRAPH + {0xCB90, 0x85E7}, //12734 #CJK UNIFIED IDEOGRAPH + {0xCB91, 0x85E8}, //12735 #CJK UNIFIED IDEOGRAPH + {0xCB92, 0x85EA}, //12736 #CJK UNIFIED IDEOGRAPH + {0xCB93, 0x85EB}, //12737 #CJK UNIFIED IDEOGRAPH + {0xCB94, 0x85EC}, //12738 #CJK UNIFIED IDEOGRAPH + {0xCB95, 0x85ED}, //12739 #CJK UNIFIED IDEOGRAPH + {0xCB96, 0x85EE}, //12740 #CJK UNIFIED IDEOGRAPH + {0xCB97, 0x85EF}, //12741 #CJK UNIFIED IDEOGRAPH + {0xCB98, 0x85F0}, //12742 #CJK UNIFIED IDEOGRAPH + {0xCB99, 0x85F1}, //12743 #CJK UNIFIED IDEOGRAPH + {0xCB9A, 0x85F2}, //12744 #CJK UNIFIED IDEOGRAPH + {0xCB9B, 0x85F3}, //12745 #CJK UNIFIED IDEOGRAPH + {0xCB9C, 0x85F4}, //12746 #CJK UNIFIED IDEOGRAPH + {0xCB9D, 0x85F5}, //12747 #CJK UNIFIED IDEOGRAPH + {0xCB9E, 0x85F6}, //12748 #CJK UNIFIED IDEOGRAPH + {0xCB9F, 0x85F7}, //12749 #CJK UNIFIED IDEOGRAPH + {0xCBA0, 0x85F8}, //12750 #CJK UNIFIED IDEOGRAPH + {0xCBA1, 0x6055}, //12751 #CJK UNIFIED IDEOGRAPH + {0xCBA2, 0x5237}, //12752 #CJK UNIFIED IDEOGRAPH + {0xCBA3, 0x800D}, //12753 #CJK UNIFIED IDEOGRAPH + {0xCBA4, 0x6454}, //12754 #CJK UNIFIED IDEOGRAPH + {0xCBA5, 0x8870}, //12755 #CJK UNIFIED IDEOGRAPH + {0xCBA6, 0x7529}, //12756 #CJK UNIFIED IDEOGRAPH + {0xCBA7, 0x5E05}, //12757 #CJK UNIFIED IDEOGRAPH + {0xCBA8, 0x6813}, //12758 #CJK UNIFIED IDEOGRAPH + {0xCBA9, 0x62F4}, //12759 #CJK UNIFIED IDEOGRAPH + {0xCBAA, 0x971C}, //12760 #CJK UNIFIED IDEOGRAPH + {0xCBAB, 0x53CC}, //12761 #CJK UNIFIED IDEOGRAPH + {0xCBAC, 0x723D}, //12762 #CJK UNIFIED IDEOGRAPH + {0xCBAD, 0x8C01}, //12763 #CJK UNIFIED IDEOGRAPH + {0xCBAE, 0x6C34}, //12764 #CJK UNIFIED IDEOGRAPH + {0xCBAF, 0x7761}, //12765 #CJK UNIFIED IDEOGRAPH + {0xCBB0, 0x7A0E}, //12766 #CJK UNIFIED IDEOGRAPH + {0xCBB1, 0x542E}, //12767 #CJK UNIFIED IDEOGRAPH + {0xCBB2, 0x77AC}, //12768 #CJK UNIFIED IDEOGRAPH + {0xCBB3, 0x987A}, //12769 #CJK UNIFIED IDEOGRAPH + {0xCBB4, 0x821C}, //12770 #CJK UNIFIED IDEOGRAPH + {0xCBB5, 0x8BF4}, //12771 #CJK UNIFIED IDEOGRAPH + {0xCBB6, 0x7855}, //12772 #CJK UNIFIED IDEOGRAPH + {0xCBB7, 0x6714}, //12773 #CJK UNIFIED IDEOGRAPH + {0xCBB8, 0x70C1}, //12774 #CJK UNIFIED IDEOGRAPH + {0xCBB9, 0x65AF}, //12775 #CJK UNIFIED IDEOGRAPH + {0xCBBA, 0x6495}, //12776 #CJK UNIFIED IDEOGRAPH + {0xCBBB, 0x5636}, //12777 #CJK UNIFIED IDEOGRAPH + {0xCBBC, 0x601D}, //12778 #CJK UNIFIED IDEOGRAPH + {0xCBBD, 0x79C1}, //12779 #CJK UNIFIED IDEOGRAPH + {0xCBBE, 0x53F8}, //12780 #CJK UNIFIED IDEOGRAPH + {0xCBBF, 0x4E1D}, //12781 #CJK UNIFIED IDEOGRAPH + {0xCBC0, 0x6B7B}, //12782 #CJK UNIFIED IDEOGRAPH + {0xCBC1, 0x8086}, //12783 #CJK UNIFIED IDEOGRAPH + {0xCBC2, 0x5BFA}, //12784 #CJK UNIFIED IDEOGRAPH + {0xCBC3, 0x55E3}, //12785 #CJK UNIFIED IDEOGRAPH + {0xCBC4, 0x56DB}, //12786 #CJK UNIFIED IDEOGRAPH + {0xCBC5, 0x4F3A}, //12787 #CJK UNIFIED IDEOGRAPH + {0xCBC6, 0x4F3C}, //12788 #CJK UNIFIED IDEOGRAPH + {0xCBC7, 0x9972}, //12789 #CJK UNIFIED IDEOGRAPH + {0xCBC8, 0x5DF3}, //12790 #CJK UNIFIED IDEOGRAPH + {0xCBC9, 0x677E}, //12791 #CJK UNIFIED IDEOGRAPH + {0xCBCA, 0x8038}, //12792 #CJK UNIFIED IDEOGRAPH + {0xCBCB, 0x6002}, //12793 #CJK UNIFIED IDEOGRAPH + {0xCBCC, 0x9882}, //12794 #CJK UNIFIED IDEOGRAPH + {0xCBCD, 0x9001}, //12795 #CJK UNIFIED IDEOGRAPH + {0xCBCE, 0x5B8B}, //12796 #CJK UNIFIED IDEOGRAPH + {0xCBCF, 0x8BBC}, //12797 #CJK UNIFIED IDEOGRAPH + {0xCBD0, 0x8BF5}, //12798 #CJK UNIFIED IDEOGRAPH + {0xCBD1, 0x641C}, //12799 #CJK UNIFIED IDEOGRAPH + {0xCBD2, 0x8258}, //12800 #CJK UNIFIED IDEOGRAPH + {0xCBD3, 0x64DE}, //12801 #CJK UNIFIED IDEOGRAPH + {0xCBD4, 0x55FD}, //12802 #CJK UNIFIED IDEOGRAPH + {0xCBD5, 0x82CF}, //12803 #CJK UNIFIED IDEOGRAPH + {0xCBD6, 0x9165}, //12804 #CJK UNIFIED IDEOGRAPH + {0xCBD7, 0x4FD7}, //12805 #CJK UNIFIED IDEOGRAPH + {0xCBD8, 0x7D20}, //12806 #CJK UNIFIED IDEOGRAPH + {0xCBD9, 0x901F}, //12807 #CJK UNIFIED IDEOGRAPH + {0xCBDA, 0x7C9F}, //12808 #CJK UNIFIED IDEOGRAPH + {0xCBDB, 0x50F3}, //12809 #CJK UNIFIED IDEOGRAPH + {0xCBDC, 0x5851}, //12810 #CJK UNIFIED IDEOGRAPH + {0xCBDD, 0x6EAF}, //12811 #CJK UNIFIED IDEOGRAPH + {0xCBDE, 0x5BBF}, //12812 #CJK UNIFIED IDEOGRAPH + {0xCBDF, 0x8BC9}, //12813 #CJK UNIFIED IDEOGRAPH + {0xCBE0, 0x8083}, //12814 #CJK UNIFIED IDEOGRAPH + {0xCBE1, 0x9178}, //12815 #CJK UNIFIED IDEOGRAPH + {0xCBE2, 0x849C}, //12816 #CJK UNIFIED IDEOGRAPH + {0xCBE3, 0x7B97}, //12817 #CJK UNIFIED IDEOGRAPH + {0xCBE4, 0x867D}, //12818 #CJK UNIFIED IDEOGRAPH + {0xCBE5, 0x968B}, //12819 #CJK UNIFIED IDEOGRAPH + {0xCBE6, 0x968F}, //12820 #CJK UNIFIED IDEOGRAPH + {0xCBE7, 0x7EE5}, //12821 #CJK UNIFIED IDEOGRAPH + {0xCBE8, 0x9AD3}, //12822 #CJK UNIFIED IDEOGRAPH + {0xCBE9, 0x788E}, //12823 #CJK UNIFIED IDEOGRAPH + {0xCBEA, 0x5C81}, //12824 #CJK UNIFIED IDEOGRAPH + {0xCBEB, 0x7A57}, //12825 #CJK UNIFIED IDEOGRAPH + {0xCBEC, 0x9042}, //12826 #CJK UNIFIED IDEOGRAPH + {0xCBED, 0x96A7}, //12827 #CJK UNIFIED IDEOGRAPH + {0xCBEE, 0x795F}, //12828 #CJK UNIFIED IDEOGRAPH + {0xCBEF, 0x5B59}, //12829 #CJK UNIFIED IDEOGRAPH + {0xCBF0, 0x635F}, //12830 #CJK UNIFIED IDEOGRAPH + {0xCBF1, 0x7B0B}, //12831 #CJK UNIFIED IDEOGRAPH + {0xCBF2, 0x84D1}, //12832 #CJK UNIFIED IDEOGRAPH + {0xCBF3, 0x68AD}, //12833 #CJK UNIFIED IDEOGRAPH + {0xCBF4, 0x5506}, //12834 #CJK UNIFIED IDEOGRAPH + {0xCBF5, 0x7F29}, //12835 #CJK UNIFIED IDEOGRAPH + {0xCBF6, 0x7410}, //12836 #CJK UNIFIED IDEOGRAPH + {0xCBF7, 0x7D22}, //12837 #CJK UNIFIED IDEOGRAPH + {0xCBF8, 0x9501}, //12838 #CJK UNIFIED IDEOGRAPH + {0xCBF9, 0x6240}, //12839 #CJK UNIFIED IDEOGRAPH + {0xCBFA, 0x584C}, //12840 #CJK UNIFIED IDEOGRAPH + {0xCBFB, 0x4ED6}, //12841 #CJK UNIFIED IDEOGRAPH + {0xCBFC, 0x5B83}, //12842 #CJK UNIFIED IDEOGRAPH + {0xCBFD, 0x5979}, //12843 #CJK UNIFIED IDEOGRAPH + {0xCBFE, 0x5854}, //12844 #CJK UNIFIED IDEOGRAPH + {0xCC40, 0x85F9}, //12845 #CJK UNIFIED IDEOGRAPH + {0xCC41, 0x85FA}, //12846 #CJK UNIFIED IDEOGRAPH + {0xCC42, 0x85FC}, //12847 #CJK UNIFIED IDEOGRAPH + {0xCC43, 0x85FD}, //12848 #CJK UNIFIED IDEOGRAPH + {0xCC44, 0x85FE}, //12849 #CJK UNIFIED IDEOGRAPH + {0xCC45, 0x8600}, //12850 #CJK UNIFIED IDEOGRAPH + {0xCC46, 0x8601}, //12851 #CJK UNIFIED IDEOGRAPH + {0xCC47, 0x8602}, //12852 #CJK UNIFIED IDEOGRAPH + {0xCC48, 0x8603}, //12853 #CJK UNIFIED IDEOGRAPH + {0xCC49, 0x8604}, //12854 #CJK UNIFIED IDEOGRAPH + {0xCC4A, 0x8606}, //12855 #CJK UNIFIED IDEOGRAPH + {0xCC4B, 0x8607}, //12856 #CJK UNIFIED IDEOGRAPH + {0xCC4C, 0x8608}, //12857 #CJK UNIFIED IDEOGRAPH + {0xCC4D, 0x8609}, //12858 #CJK UNIFIED IDEOGRAPH + {0xCC4E, 0x860A}, //12859 #CJK UNIFIED IDEOGRAPH + {0xCC4F, 0x860B}, //12860 #CJK UNIFIED IDEOGRAPH + {0xCC50, 0x860C}, //12861 #CJK UNIFIED IDEOGRAPH + {0xCC51, 0x860D}, //12862 #CJK UNIFIED IDEOGRAPH + {0xCC52, 0x860E}, //12863 #CJK UNIFIED IDEOGRAPH + {0xCC53, 0x860F}, //12864 #CJK UNIFIED IDEOGRAPH + {0xCC54, 0x8610}, //12865 #CJK UNIFIED IDEOGRAPH + {0xCC55, 0x8612}, //12866 #CJK UNIFIED IDEOGRAPH + {0xCC56, 0x8613}, //12867 #CJK UNIFIED IDEOGRAPH + {0xCC57, 0x8614}, //12868 #CJK UNIFIED IDEOGRAPH + {0xCC58, 0x8615}, //12869 #CJK UNIFIED IDEOGRAPH + {0xCC59, 0x8617}, //12870 #CJK UNIFIED IDEOGRAPH + {0xCC5A, 0x8618}, //12871 #CJK UNIFIED IDEOGRAPH + {0xCC5B, 0x8619}, //12872 #CJK UNIFIED IDEOGRAPH + {0xCC5C, 0x861A}, //12873 #CJK UNIFIED IDEOGRAPH + {0xCC5D, 0x861B}, //12874 #CJK UNIFIED IDEOGRAPH + {0xCC5E, 0x861C}, //12875 #CJK UNIFIED IDEOGRAPH + {0xCC5F, 0x861D}, //12876 #CJK UNIFIED IDEOGRAPH + {0xCC60, 0x861E}, //12877 #CJK UNIFIED IDEOGRAPH + {0xCC61, 0x861F}, //12878 #CJK UNIFIED IDEOGRAPH + {0xCC62, 0x8620}, //12879 #CJK UNIFIED IDEOGRAPH + {0xCC63, 0x8621}, //12880 #CJK UNIFIED IDEOGRAPH + {0xCC64, 0x8622}, //12881 #CJK UNIFIED IDEOGRAPH + {0xCC65, 0x8623}, //12882 #CJK UNIFIED IDEOGRAPH + {0xCC66, 0x8624}, //12883 #CJK UNIFIED IDEOGRAPH + {0xCC67, 0x8625}, //12884 #CJK UNIFIED IDEOGRAPH + {0xCC68, 0x8626}, //12885 #CJK UNIFIED IDEOGRAPH + {0xCC69, 0x8628}, //12886 #CJK UNIFIED IDEOGRAPH + {0xCC6A, 0x862A}, //12887 #CJK UNIFIED IDEOGRAPH + {0xCC6B, 0x862B}, //12888 #CJK UNIFIED IDEOGRAPH + {0xCC6C, 0x862C}, //12889 #CJK UNIFIED IDEOGRAPH + {0xCC6D, 0x862D}, //12890 #CJK UNIFIED IDEOGRAPH + {0xCC6E, 0x862E}, //12891 #CJK UNIFIED IDEOGRAPH + {0xCC6F, 0x862F}, //12892 #CJK UNIFIED IDEOGRAPH + {0xCC70, 0x8630}, //12893 #CJK UNIFIED IDEOGRAPH + {0xCC71, 0x8631}, //12894 #CJK UNIFIED IDEOGRAPH + {0xCC72, 0x8632}, //12895 #CJK UNIFIED IDEOGRAPH + {0xCC73, 0x8633}, //12896 #CJK UNIFIED IDEOGRAPH + {0xCC74, 0x8634}, //12897 #CJK UNIFIED IDEOGRAPH + {0xCC75, 0x8635}, //12898 #CJK UNIFIED IDEOGRAPH + {0xCC76, 0x8636}, //12899 #CJK UNIFIED IDEOGRAPH + {0xCC77, 0x8637}, //12900 #CJK UNIFIED IDEOGRAPH + {0xCC78, 0x8639}, //12901 #CJK UNIFIED IDEOGRAPH + {0xCC79, 0x863A}, //12902 #CJK UNIFIED IDEOGRAPH + {0xCC7A, 0x863B}, //12903 #CJK UNIFIED IDEOGRAPH + {0xCC7B, 0x863D}, //12904 #CJK UNIFIED IDEOGRAPH + {0xCC7C, 0x863E}, //12905 #CJK UNIFIED IDEOGRAPH + {0xCC7D, 0x863F}, //12906 #CJK UNIFIED IDEOGRAPH + {0xCC7E, 0x8640}, //12907 #CJK UNIFIED IDEOGRAPH + {0xCC80, 0x8641}, //12908 #CJK UNIFIED IDEOGRAPH + {0xCC81, 0x8642}, //12909 #CJK UNIFIED IDEOGRAPH + {0xCC82, 0x8643}, //12910 #CJK UNIFIED IDEOGRAPH + {0xCC83, 0x8644}, //12911 #CJK UNIFIED IDEOGRAPH + {0xCC84, 0x8645}, //12912 #CJK UNIFIED IDEOGRAPH + {0xCC85, 0x8646}, //12913 #CJK UNIFIED IDEOGRAPH + {0xCC86, 0x8647}, //12914 #CJK UNIFIED IDEOGRAPH + {0xCC87, 0x8648}, //12915 #CJK UNIFIED IDEOGRAPH + {0xCC88, 0x8649}, //12916 #CJK UNIFIED IDEOGRAPH + {0xCC89, 0x864A}, //12917 #CJK UNIFIED IDEOGRAPH + {0xCC8A, 0x864B}, //12918 #CJK UNIFIED IDEOGRAPH + {0xCC8B, 0x864C}, //12919 #CJK UNIFIED IDEOGRAPH + {0xCC8C, 0x8652}, //12920 #CJK UNIFIED IDEOGRAPH + {0xCC8D, 0x8653}, //12921 #CJK UNIFIED IDEOGRAPH + {0xCC8E, 0x8655}, //12922 #CJK UNIFIED IDEOGRAPH + {0xCC8F, 0x8656}, //12923 #CJK UNIFIED IDEOGRAPH + {0xCC90, 0x8657}, //12924 #CJK UNIFIED IDEOGRAPH + {0xCC91, 0x8658}, //12925 #CJK UNIFIED IDEOGRAPH + {0xCC92, 0x8659}, //12926 #CJK UNIFIED IDEOGRAPH + {0xCC93, 0x865B}, //12927 #CJK UNIFIED IDEOGRAPH + {0xCC94, 0x865C}, //12928 #CJK UNIFIED IDEOGRAPH + {0xCC95, 0x865D}, //12929 #CJK UNIFIED IDEOGRAPH + {0xCC96, 0x865F}, //12930 #CJK UNIFIED IDEOGRAPH + {0xCC97, 0x8660}, //12931 #CJK UNIFIED IDEOGRAPH + {0xCC98, 0x8661}, //12932 #CJK UNIFIED IDEOGRAPH + {0xCC99, 0x8663}, //12933 #CJK UNIFIED IDEOGRAPH + {0xCC9A, 0x8664}, //12934 #CJK UNIFIED IDEOGRAPH + {0xCC9B, 0x8665}, //12935 #CJK UNIFIED IDEOGRAPH + {0xCC9C, 0x8666}, //12936 #CJK UNIFIED IDEOGRAPH + {0xCC9D, 0x8667}, //12937 #CJK UNIFIED IDEOGRAPH + {0xCC9E, 0x8668}, //12938 #CJK UNIFIED IDEOGRAPH + {0xCC9F, 0x8669}, //12939 #CJK UNIFIED IDEOGRAPH + {0xCCA0, 0x866A}, //12940 #CJK UNIFIED IDEOGRAPH + {0xCCA1, 0x736D}, //12941 #CJK UNIFIED IDEOGRAPH + {0xCCA2, 0x631E}, //12942 #CJK UNIFIED IDEOGRAPH + {0xCCA3, 0x8E4B}, //12943 #CJK UNIFIED IDEOGRAPH + {0xCCA4, 0x8E0F}, //12944 #CJK UNIFIED IDEOGRAPH + {0xCCA5, 0x80CE}, //12945 #CJK UNIFIED IDEOGRAPH + {0xCCA6, 0x82D4}, //12946 #CJK UNIFIED IDEOGRAPH + {0xCCA7, 0x62AC}, //12947 #CJK UNIFIED IDEOGRAPH + {0xCCA8, 0x53F0}, //12948 #CJK UNIFIED IDEOGRAPH + {0xCCA9, 0x6CF0}, //12949 #CJK UNIFIED IDEOGRAPH + {0xCCAA, 0x915E}, //12950 #CJK UNIFIED IDEOGRAPH + {0xCCAB, 0x592A}, //12951 #CJK UNIFIED IDEOGRAPH + {0xCCAC, 0x6001}, //12952 #CJK UNIFIED IDEOGRAPH + {0xCCAD, 0x6C70}, //12953 #CJK UNIFIED IDEOGRAPH + {0xCCAE, 0x574D}, //12954 #CJK UNIFIED IDEOGRAPH + {0xCCAF, 0x644A}, //12955 #CJK UNIFIED IDEOGRAPH + {0xCCB0, 0x8D2A}, //12956 #CJK UNIFIED IDEOGRAPH + {0xCCB1, 0x762B}, //12957 #CJK UNIFIED IDEOGRAPH + {0xCCB2, 0x6EE9}, //12958 #CJK UNIFIED IDEOGRAPH + {0xCCB3, 0x575B}, //12959 #CJK UNIFIED IDEOGRAPH + {0xCCB4, 0x6A80}, //12960 #CJK UNIFIED IDEOGRAPH + {0xCCB5, 0x75F0}, //12961 #CJK UNIFIED IDEOGRAPH + {0xCCB6, 0x6F6D}, //12962 #CJK UNIFIED IDEOGRAPH + {0xCCB7, 0x8C2D}, //12963 #CJK UNIFIED IDEOGRAPH + {0xCCB8, 0x8C08}, //12964 #CJK UNIFIED IDEOGRAPH + {0xCCB9, 0x5766}, //12965 #CJK UNIFIED IDEOGRAPH + {0xCCBA, 0x6BEF}, //12966 #CJK UNIFIED IDEOGRAPH + {0xCCBB, 0x8892}, //12967 #CJK UNIFIED IDEOGRAPH + {0xCCBC, 0x78B3}, //12968 #CJK UNIFIED IDEOGRAPH + {0xCCBD, 0x63A2}, //12969 #CJK UNIFIED IDEOGRAPH + {0xCCBE, 0x53F9}, //12970 #CJK UNIFIED IDEOGRAPH + {0xCCBF, 0x70AD}, //12971 #CJK UNIFIED IDEOGRAPH + {0xCCC0, 0x6C64}, //12972 #CJK UNIFIED IDEOGRAPH + {0xCCC1, 0x5858}, //12973 #CJK UNIFIED IDEOGRAPH + {0xCCC2, 0x642A}, //12974 #CJK UNIFIED IDEOGRAPH + {0xCCC3, 0x5802}, //12975 #CJK UNIFIED IDEOGRAPH + {0xCCC4, 0x68E0}, //12976 #CJK UNIFIED IDEOGRAPH + {0xCCC5, 0x819B}, //12977 #CJK UNIFIED IDEOGRAPH + {0xCCC6, 0x5510}, //12978 #CJK UNIFIED IDEOGRAPH + {0xCCC7, 0x7CD6}, //12979 #CJK UNIFIED IDEOGRAPH + {0xCCC8, 0x5018}, //12980 #CJK UNIFIED IDEOGRAPH + {0xCCC9, 0x8EBA}, //12981 #CJK UNIFIED IDEOGRAPH + {0xCCCA, 0x6DCC}, //12982 #CJK UNIFIED IDEOGRAPH + {0xCCCB, 0x8D9F}, //12983 #CJK UNIFIED IDEOGRAPH + {0xCCCC, 0x70EB}, //12984 #CJK UNIFIED IDEOGRAPH + {0xCCCD, 0x638F}, //12985 #CJK UNIFIED IDEOGRAPH + {0xCCCE, 0x6D9B}, //12986 #CJK UNIFIED IDEOGRAPH + {0xCCCF, 0x6ED4}, //12987 #CJK UNIFIED IDEOGRAPH + {0xCCD0, 0x7EE6}, //12988 #CJK UNIFIED IDEOGRAPH + {0xCCD1, 0x8404}, //12989 #CJK UNIFIED IDEOGRAPH + {0xCCD2, 0x6843}, //12990 #CJK UNIFIED IDEOGRAPH + {0xCCD3, 0x9003}, //12991 #CJK UNIFIED IDEOGRAPH + {0xCCD4, 0x6DD8}, //12992 #CJK UNIFIED IDEOGRAPH + {0xCCD5, 0x9676}, //12993 #CJK UNIFIED IDEOGRAPH + {0xCCD6, 0x8BA8}, //12994 #CJK UNIFIED IDEOGRAPH + {0xCCD7, 0x5957}, //12995 #CJK UNIFIED IDEOGRAPH + {0xCCD8, 0x7279}, //12996 #CJK UNIFIED IDEOGRAPH + {0xCCD9, 0x85E4}, //12997 #CJK UNIFIED IDEOGRAPH + {0xCCDA, 0x817E}, //12998 #CJK UNIFIED IDEOGRAPH + {0xCCDB, 0x75BC}, //12999 #CJK UNIFIED IDEOGRAPH + {0xCCDC, 0x8A8A}, //13000 #CJK UNIFIED IDEOGRAPH + {0xCCDD, 0x68AF}, //13001 #CJK UNIFIED IDEOGRAPH + {0xCCDE, 0x5254}, //13002 #CJK UNIFIED IDEOGRAPH + {0xCCDF, 0x8E22}, //13003 #CJK UNIFIED IDEOGRAPH + {0xCCE0, 0x9511}, //13004 #CJK UNIFIED IDEOGRAPH + {0xCCE1, 0x63D0}, //13005 #CJK UNIFIED IDEOGRAPH + {0xCCE2, 0x9898}, //13006 #CJK UNIFIED IDEOGRAPH + {0xCCE3, 0x8E44}, //13007 #CJK UNIFIED IDEOGRAPH + {0xCCE4, 0x557C}, //13008 #CJK UNIFIED IDEOGRAPH + {0xCCE5, 0x4F53}, //13009 #CJK UNIFIED IDEOGRAPH + {0xCCE6, 0x66FF}, //13010 #CJK UNIFIED IDEOGRAPH + {0xCCE7, 0x568F}, //13011 #CJK UNIFIED IDEOGRAPH + {0xCCE8, 0x60D5}, //13012 #CJK UNIFIED IDEOGRAPH + {0xCCE9, 0x6D95}, //13013 #CJK UNIFIED IDEOGRAPH + {0xCCEA, 0x5243}, //13014 #CJK UNIFIED IDEOGRAPH + {0xCCEB, 0x5C49}, //13015 #CJK UNIFIED IDEOGRAPH + {0xCCEC, 0x5929}, //13016 #CJK UNIFIED IDEOGRAPH + {0xCCED, 0x6DFB}, //13017 #CJK UNIFIED IDEOGRAPH + {0xCCEE, 0x586B}, //13018 #CJK UNIFIED IDEOGRAPH + {0xCCEF, 0x7530}, //13019 #CJK UNIFIED IDEOGRAPH + {0xCCF0, 0x751C}, //13020 #CJK UNIFIED IDEOGRAPH + {0xCCF1, 0x606C}, //13021 #CJK UNIFIED IDEOGRAPH + {0xCCF2, 0x8214}, //13022 #CJK UNIFIED IDEOGRAPH + {0xCCF3, 0x8146}, //13023 #CJK UNIFIED IDEOGRAPH + {0xCCF4, 0x6311}, //13024 #CJK UNIFIED IDEOGRAPH + {0xCCF5, 0x6761}, //13025 #CJK UNIFIED IDEOGRAPH + {0xCCF6, 0x8FE2}, //13026 #CJK UNIFIED IDEOGRAPH + {0xCCF7, 0x773A}, //13027 #CJK UNIFIED IDEOGRAPH + {0xCCF8, 0x8DF3}, //13028 #CJK UNIFIED IDEOGRAPH + {0xCCF9, 0x8D34}, //13029 #CJK UNIFIED IDEOGRAPH + {0xCCFA, 0x94C1}, //13030 #CJK UNIFIED IDEOGRAPH + {0xCCFB, 0x5E16}, //13031 #CJK UNIFIED IDEOGRAPH + {0xCCFC, 0x5385}, //13032 #CJK UNIFIED IDEOGRAPH + {0xCCFD, 0x542C}, //13033 #CJK UNIFIED IDEOGRAPH + {0xCCFE, 0x70C3}, //13034 #CJK UNIFIED IDEOGRAPH + {0xCD40, 0x866D}, //13035 #CJK UNIFIED IDEOGRAPH + {0xCD41, 0x866F}, //13036 #CJK UNIFIED IDEOGRAPH + {0xCD42, 0x8670}, //13037 #CJK UNIFIED IDEOGRAPH + {0xCD43, 0x8672}, //13038 #CJK UNIFIED IDEOGRAPH + {0xCD44, 0x8673}, //13039 #CJK UNIFIED IDEOGRAPH + {0xCD45, 0x8674}, //13040 #CJK UNIFIED IDEOGRAPH + {0xCD46, 0x8675}, //13041 #CJK UNIFIED IDEOGRAPH + {0xCD47, 0x8676}, //13042 #CJK UNIFIED IDEOGRAPH + {0xCD48, 0x8677}, //13043 #CJK UNIFIED IDEOGRAPH + {0xCD49, 0x8678}, //13044 #CJK UNIFIED IDEOGRAPH + {0xCD4A, 0x8683}, //13045 #CJK UNIFIED IDEOGRAPH + {0xCD4B, 0x8684}, //13046 #CJK UNIFIED IDEOGRAPH + {0xCD4C, 0x8685}, //13047 #CJK UNIFIED IDEOGRAPH + {0xCD4D, 0x8686}, //13048 #CJK UNIFIED IDEOGRAPH + {0xCD4E, 0x8687}, //13049 #CJK UNIFIED IDEOGRAPH + {0xCD4F, 0x8688}, //13050 #CJK UNIFIED IDEOGRAPH + {0xCD50, 0x8689}, //13051 #CJK UNIFIED IDEOGRAPH + {0xCD51, 0x868E}, //13052 #CJK UNIFIED IDEOGRAPH + {0xCD52, 0x868F}, //13053 #CJK UNIFIED IDEOGRAPH + {0xCD53, 0x8690}, //13054 #CJK UNIFIED IDEOGRAPH + {0xCD54, 0x8691}, //13055 #CJK UNIFIED IDEOGRAPH + {0xCD55, 0x8692}, //13056 #CJK UNIFIED IDEOGRAPH + {0xCD56, 0x8694}, //13057 #CJK UNIFIED IDEOGRAPH + {0xCD57, 0x8696}, //13058 #CJK UNIFIED IDEOGRAPH + {0xCD58, 0x8697}, //13059 #CJK UNIFIED IDEOGRAPH + {0xCD59, 0x8698}, //13060 #CJK UNIFIED IDEOGRAPH + {0xCD5A, 0x8699}, //13061 #CJK UNIFIED IDEOGRAPH + {0xCD5B, 0x869A}, //13062 #CJK UNIFIED IDEOGRAPH + {0xCD5C, 0x869B}, //13063 #CJK UNIFIED IDEOGRAPH + {0xCD5D, 0x869E}, //13064 #CJK UNIFIED IDEOGRAPH + {0xCD5E, 0x869F}, //13065 #CJK UNIFIED IDEOGRAPH + {0xCD5F, 0x86A0}, //13066 #CJK UNIFIED IDEOGRAPH + {0xCD60, 0x86A1}, //13067 #CJK UNIFIED IDEOGRAPH + {0xCD61, 0x86A2}, //13068 #CJK UNIFIED IDEOGRAPH + {0xCD62, 0x86A5}, //13069 #CJK UNIFIED IDEOGRAPH + {0xCD63, 0x86A6}, //13070 #CJK UNIFIED IDEOGRAPH + {0xCD64, 0x86AB}, //13071 #CJK UNIFIED IDEOGRAPH + {0xCD65, 0x86AD}, //13072 #CJK UNIFIED IDEOGRAPH + {0xCD66, 0x86AE}, //13073 #CJK UNIFIED IDEOGRAPH + {0xCD67, 0x86B2}, //13074 #CJK UNIFIED IDEOGRAPH + {0xCD68, 0x86B3}, //13075 #CJK UNIFIED IDEOGRAPH + {0xCD69, 0x86B7}, //13076 #CJK UNIFIED IDEOGRAPH + {0xCD6A, 0x86B8}, //13077 #CJK UNIFIED IDEOGRAPH + {0xCD6B, 0x86B9}, //13078 #CJK UNIFIED IDEOGRAPH + {0xCD6C, 0x86BB}, //13079 #CJK UNIFIED IDEOGRAPH + {0xCD6D, 0x86BC}, //13080 #CJK UNIFIED IDEOGRAPH + {0xCD6E, 0x86BD}, //13081 #CJK UNIFIED IDEOGRAPH + {0xCD6F, 0x86BE}, //13082 #CJK UNIFIED IDEOGRAPH + {0xCD70, 0x86BF}, //13083 #CJK UNIFIED IDEOGRAPH + {0xCD71, 0x86C1}, //13084 #CJK UNIFIED IDEOGRAPH + {0xCD72, 0x86C2}, //13085 #CJK UNIFIED IDEOGRAPH + {0xCD73, 0x86C3}, //13086 #CJK UNIFIED IDEOGRAPH + {0xCD74, 0x86C5}, //13087 #CJK UNIFIED IDEOGRAPH + {0xCD75, 0x86C8}, //13088 #CJK UNIFIED IDEOGRAPH + {0xCD76, 0x86CC}, //13089 #CJK UNIFIED IDEOGRAPH + {0xCD77, 0x86CD}, //13090 #CJK UNIFIED IDEOGRAPH + {0xCD78, 0x86D2}, //13091 #CJK UNIFIED IDEOGRAPH + {0xCD79, 0x86D3}, //13092 #CJK UNIFIED IDEOGRAPH + {0xCD7A, 0x86D5}, //13093 #CJK UNIFIED IDEOGRAPH + {0xCD7B, 0x86D6}, //13094 #CJK UNIFIED IDEOGRAPH + {0xCD7C, 0x86D7}, //13095 #CJK UNIFIED IDEOGRAPH + {0xCD7D, 0x86DA}, //13096 #CJK UNIFIED IDEOGRAPH + {0xCD7E, 0x86DC}, //13097 #CJK UNIFIED IDEOGRAPH + {0xCD80, 0x86DD}, //13098 #CJK UNIFIED IDEOGRAPH + {0xCD81, 0x86E0}, //13099 #CJK UNIFIED IDEOGRAPH + {0xCD82, 0x86E1}, //13100 #CJK UNIFIED IDEOGRAPH + {0xCD83, 0x86E2}, //13101 #CJK UNIFIED IDEOGRAPH + {0xCD84, 0x86E3}, //13102 #CJK UNIFIED IDEOGRAPH + {0xCD85, 0x86E5}, //13103 #CJK UNIFIED IDEOGRAPH + {0xCD86, 0x86E6}, //13104 #CJK UNIFIED IDEOGRAPH + {0xCD87, 0x86E7}, //13105 #CJK UNIFIED IDEOGRAPH + {0xCD88, 0x86E8}, //13106 #CJK UNIFIED IDEOGRAPH + {0xCD89, 0x86EA}, //13107 #CJK UNIFIED IDEOGRAPH + {0xCD8A, 0x86EB}, //13108 #CJK UNIFIED IDEOGRAPH + {0xCD8B, 0x86EC}, //13109 #CJK UNIFIED IDEOGRAPH + {0xCD8C, 0x86EF}, //13110 #CJK UNIFIED IDEOGRAPH + {0xCD8D, 0x86F5}, //13111 #CJK UNIFIED IDEOGRAPH + {0xCD8E, 0x86F6}, //13112 #CJK UNIFIED IDEOGRAPH + {0xCD8F, 0x86F7}, //13113 #CJK UNIFIED IDEOGRAPH + {0xCD90, 0x86FA}, //13114 #CJK UNIFIED IDEOGRAPH + {0xCD91, 0x86FB}, //13115 #CJK UNIFIED IDEOGRAPH + {0xCD92, 0x86FC}, //13116 #CJK UNIFIED IDEOGRAPH + {0xCD93, 0x86FD}, //13117 #CJK UNIFIED IDEOGRAPH + {0xCD94, 0x86FF}, //13118 #CJK UNIFIED IDEOGRAPH + {0xCD95, 0x8701}, //13119 #CJK UNIFIED IDEOGRAPH + {0xCD96, 0x8704}, //13120 #CJK UNIFIED IDEOGRAPH + {0xCD97, 0x8705}, //13121 #CJK UNIFIED IDEOGRAPH + {0xCD98, 0x8706}, //13122 #CJK UNIFIED IDEOGRAPH + {0xCD99, 0x870B}, //13123 #CJK UNIFIED IDEOGRAPH + {0xCD9A, 0x870C}, //13124 #CJK UNIFIED IDEOGRAPH + {0xCD9B, 0x870E}, //13125 #CJK UNIFIED IDEOGRAPH + {0xCD9C, 0x870F}, //13126 #CJK UNIFIED IDEOGRAPH + {0xCD9D, 0x8710}, //13127 #CJK UNIFIED IDEOGRAPH + {0xCD9E, 0x8711}, //13128 #CJK UNIFIED IDEOGRAPH + {0xCD9F, 0x8714}, //13129 #CJK UNIFIED IDEOGRAPH + {0xCDA0, 0x8716}, //13130 #CJK UNIFIED IDEOGRAPH + {0xCDA1, 0x6C40}, //13131 #CJK UNIFIED IDEOGRAPH + {0xCDA2, 0x5EF7}, //13132 #CJK UNIFIED IDEOGRAPH + {0xCDA3, 0x505C}, //13133 #CJK UNIFIED IDEOGRAPH + {0xCDA4, 0x4EAD}, //13134 #CJK UNIFIED IDEOGRAPH + {0xCDA5, 0x5EAD}, //13135 #CJK UNIFIED IDEOGRAPH + {0xCDA6, 0x633A}, //13136 #CJK UNIFIED IDEOGRAPH + {0xCDA7, 0x8247}, //13137 #CJK UNIFIED IDEOGRAPH + {0xCDA8, 0x901A}, //13138 #CJK UNIFIED IDEOGRAPH + {0xCDA9, 0x6850}, //13139 #CJK UNIFIED IDEOGRAPH + {0xCDAA, 0x916E}, //13140 #CJK UNIFIED IDEOGRAPH + {0xCDAB, 0x77B3}, //13141 #CJK UNIFIED IDEOGRAPH + {0xCDAC, 0x540C}, //13142 #CJK UNIFIED IDEOGRAPH + {0xCDAD, 0x94DC}, //13143 #CJK UNIFIED IDEOGRAPH + {0xCDAE, 0x5F64}, //13144 #CJK UNIFIED IDEOGRAPH + {0xCDAF, 0x7AE5}, //13145 #CJK UNIFIED IDEOGRAPH + {0xCDB0, 0x6876}, //13146 #CJK UNIFIED IDEOGRAPH + {0xCDB1, 0x6345}, //13147 #CJK UNIFIED IDEOGRAPH + {0xCDB2, 0x7B52}, //13148 #CJK UNIFIED IDEOGRAPH + {0xCDB3, 0x7EDF}, //13149 #CJK UNIFIED IDEOGRAPH + {0xCDB4, 0x75DB}, //13150 #CJK UNIFIED IDEOGRAPH + {0xCDB5, 0x5077}, //13151 #CJK UNIFIED IDEOGRAPH + {0xCDB6, 0x6295}, //13152 #CJK UNIFIED IDEOGRAPH + {0xCDB7, 0x5934}, //13153 #CJK UNIFIED IDEOGRAPH + {0xCDB8, 0x900F}, //13154 #CJK UNIFIED IDEOGRAPH + {0xCDB9, 0x51F8}, //13155 #CJK UNIFIED IDEOGRAPH + {0xCDBA, 0x79C3}, //13156 #CJK UNIFIED IDEOGRAPH + {0xCDBB, 0x7A81}, //13157 #CJK UNIFIED IDEOGRAPH + {0xCDBC, 0x56FE}, //13158 #CJK UNIFIED IDEOGRAPH + {0xCDBD, 0x5F92}, //13159 #CJK UNIFIED IDEOGRAPH + {0xCDBE, 0x9014}, //13160 #CJK UNIFIED IDEOGRAPH + {0xCDBF, 0x6D82}, //13161 #CJK UNIFIED IDEOGRAPH + {0xCDC0, 0x5C60}, //13162 #CJK UNIFIED IDEOGRAPH + {0xCDC1, 0x571F}, //13163 #CJK UNIFIED IDEOGRAPH + {0xCDC2, 0x5410}, //13164 #CJK UNIFIED IDEOGRAPH + {0xCDC3, 0x5154}, //13165 #CJK UNIFIED IDEOGRAPH + {0xCDC4, 0x6E4D}, //13166 #CJK UNIFIED IDEOGRAPH + {0xCDC5, 0x56E2}, //13167 #CJK UNIFIED IDEOGRAPH + {0xCDC6, 0x63A8}, //13168 #CJK UNIFIED IDEOGRAPH + {0xCDC7, 0x9893}, //13169 #CJK UNIFIED IDEOGRAPH + {0xCDC8, 0x817F}, //13170 #CJK UNIFIED IDEOGRAPH + {0xCDC9, 0x8715}, //13171 #CJK UNIFIED IDEOGRAPH + {0xCDCA, 0x892A}, //13172 #CJK UNIFIED IDEOGRAPH + {0xCDCB, 0x9000}, //13173 #CJK UNIFIED IDEOGRAPH + {0xCDCC, 0x541E}, //13174 #CJK UNIFIED IDEOGRAPH + {0xCDCD, 0x5C6F}, //13175 #CJK UNIFIED IDEOGRAPH + {0xCDCE, 0x81C0}, //13176 #CJK UNIFIED IDEOGRAPH + {0xCDCF, 0x62D6}, //13177 #CJK UNIFIED IDEOGRAPH + {0xCDD0, 0x6258}, //13178 #CJK UNIFIED IDEOGRAPH + {0xCDD1, 0x8131}, //13179 #CJK UNIFIED IDEOGRAPH + {0xCDD2, 0x9E35}, //13180 #CJK UNIFIED IDEOGRAPH + {0xCDD3, 0x9640}, //13181 #CJK UNIFIED IDEOGRAPH + {0xCDD4, 0x9A6E}, //13182 #CJK UNIFIED IDEOGRAPH + {0xCDD5, 0x9A7C}, //13183 #CJK UNIFIED IDEOGRAPH + {0xCDD6, 0x692D}, //13184 #CJK UNIFIED IDEOGRAPH + {0xCDD7, 0x59A5}, //13185 #CJK UNIFIED IDEOGRAPH + {0xCDD8, 0x62D3}, //13186 #CJK UNIFIED IDEOGRAPH + {0xCDD9, 0x553E}, //13187 #CJK UNIFIED IDEOGRAPH + {0xCDDA, 0x6316}, //13188 #CJK UNIFIED IDEOGRAPH + {0xCDDB, 0x54C7}, //13189 #CJK UNIFIED IDEOGRAPH + {0xCDDC, 0x86D9}, //13190 #CJK UNIFIED IDEOGRAPH + {0xCDDD, 0x6D3C}, //13191 #CJK UNIFIED IDEOGRAPH + {0xCDDE, 0x5A03}, //13192 #CJK UNIFIED IDEOGRAPH + {0xCDDF, 0x74E6}, //13193 #CJK UNIFIED IDEOGRAPH + {0xCDE0, 0x889C}, //13194 #CJK UNIFIED IDEOGRAPH + {0xCDE1, 0x6B6A}, //13195 #CJK UNIFIED IDEOGRAPH + {0xCDE2, 0x5916}, //13196 #CJK UNIFIED IDEOGRAPH + {0xCDE3, 0x8C4C}, //13197 #CJK UNIFIED IDEOGRAPH + {0xCDE4, 0x5F2F}, //13198 #CJK UNIFIED IDEOGRAPH + {0xCDE5, 0x6E7E}, //13199 #CJK UNIFIED IDEOGRAPH + {0xCDE6, 0x73A9}, //13200 #CJK UNIFIED IDEOGRAPH + {0xCDE7, 0x987D}, //13201 #CJK UNIFIED IDEOGRAPH + {0xCDE8, 0x4E38}, //13202 #CJK UNIFIED IDEOGRAPH + {0xCDE9, 0x70F7}, //13203 #CJK UNIFIED IDEOGRAPH + {0xCDEA, 0x5B8C}, //13204 #CJK UNIFIED IDEOGRAPH + {0xCDEB, 0x7897}, //13205 #CJK UNIFIED IDEOGRAPH + {0xCDEC, 0x633D}, //13206 #CJK UNIFIED IDEOGRAPH + {0xCDED, 0x665A}, //13207 #CJK UNIFIED IDEOGRAPH + {0xCDEE, 0x7696}, //13208 #CJK UNIFIED IDEOGRAPH + {0xCDEF, 0x60CB}, //13209 #CJK UNIFIED IDEOGRAPH + {0xCDF0, 0x5B9B}, //13210 #CJK UNIFIED IDEOGRAPH + {0xCDF1, 0x5A49}, //13211 #CJK UNIFIED IDEOGRAPH + {0xCDF2, 0x4E07}, //13212 #CJK UNIFIED IDEOGRAPH + {0xCDF3, 0x8155}, //13213 #CJK UNIFIED IDEOGRAPH + {0xCDF4, 0x6C6A}, //13214 #CJK UNIFIED IDEOGRAPH + {0xCDF5, 0x738B}, //13215 #CJK UNIFIED IDEOGRAPH + {0xCDF6, 0x4EA1}, //13216 #CJK UNIFIED IDEOGRAPH + {0xCDF7, 0x6789}, //13217 #CJK UNIFIED IDEOGRAPH + {0xCDF8, 0x7F51}, //13218 #CJK UNIFIED IDEOGRAPH + {0xCDF9, 0x5F80}, //13219 #CJK UNIFIED IDEOGRAPH + {0xCDFA, 0x65FA}, //13220 #CJK UNIFIED IDEOGRAPH + {0xCDFB, 0x671B}, //13221 #CJK UNIFIED IDEOGRAPH + {0xCDFC, 0x5FD8}, //13222 #CJK UNIFIED IDEOGRAPH + {0xCDFD, 0x5984}, //13223 #CJK UNIFIED IDEOGRAPH + {0xCDFE, 0x5A01}, //13224 #CJK UNIFIED IDEOGRAPH + {0xCE40, 0x8719}, //13225 #CJK UNIFIED IDEOGRAPH + {0xCE41, 0x871B}, //13226 #CJK UNIFIED IDEOGRAPH + {0xCE42, 0x871D}, //13227 #CJK UNIFIED IDEOGRAPH + {0xCE43, 0x871F}, //13228 #CJK UNIFIED IDEOGRAPH + {0xCE44, 0x8720}, //13229 #CJK UNIFIED IDEOGRAPH + {0xCE45, 0x8724}, //13230 #CJK UNIFIED IDEOGRAPH + {0xCE46, 0x8726}, //13231 #CJK UNIFIED IDEOGRAPH + {0xCE47, 0x8727}, //13232 #CJK UNIFIED IDEOGRAPH + {0xCE48, 0x8728}, //13233 #CJK UNIFIED IDEOGRAPH + {0xCE49, 0x872A}, //13234 #CJK UNIFIED IDEOGRAPH + {0xCE4A, 0x872B}, //13235 #CJK UNIFIED IDEOGRAPH + {0xCE4B, 0x872C}, //13236 #CJK UNIFIED IDEOGRAPH + {0xCE4C, 0x872D}, //13237 #CJK UNIFIED IDEOGRAPH + {0xCE4D, 0x872F}, //13238 #CJK UNIFIED IDEOGRAPH + {0xCE4E, 0x8730}, //13239 #CJK UNIFIED IDEOGRAPH + {0xCE4F, 0x8732}, //13240 #CJK UNIFIED IDEOGRAPH + {0xCE50, 0x8733}, //13241 #CJK UNIFIED IDEOGRAPH + {0xCE51, 0x8735}, //13242 #CJK UNIFIED IDEOGRAPH + {0xCE52, 0x8736}, //13243 #CJK UNIFIED IDEOGRAPH + {0xCE53, 0x8738}, //13244 #CJK UNIFIED IDEOGRAPH + {0xCE54, 0x8739}, //13245 #CJK UNIFIED IDEOGRAPH + {0xCE55, 0x873A}, //13246 #CJK UNIFIED IDEOGRAPH + {0xCE56, 0x873C}, //13247 #CJK UNIFIED IDEOGRAPH + {0xCE57, 0x873D}, //13248 #CJK UNIFIED IDEOGRAPH + {0xCE58, 0x8740}, //13249 #CJK UNIFIED IDEOGRAPH + {0xCE59, 0x8741}, //13250 #CJK UNIFIED IDEOGRAPH + {0xCE5A, 0x8742}, //13251 #CJK UNIFIED IDEOGRAPH + {0xCE5B, 0x8743}, //13252 #CJK UNIFIED IDEOGRAPH + {0xCE5C, 0x8744}, //13253 #CJK UNIFIED IDEOGRAPH + {0xCE5D, 0x8745}, //13254 #CJK UNIFIED IDEOGRAPH + {0xCE5E, 0x8746}, //13255 #CJK UNIFIED IDEOGRAPH + {0xCE5F, 0x874A}, //13256 #CJK UNIFIED IDEOGRAPH + {0xCE60, 0x874B}, //13257 #CJK UNIFIED IDEOGRAPH + {0xCE61, 0x874D}, //13258 #CJK UNIFIED IDEOGRAPH + {0xCE62, 0x874F}, //13259 #CJK UNIFIED IDEOGRAPH + {0xCE63, 0x8750}, //13260 #CJK UNIFIED IDEOGRAPH + {0xCE64, 0x8751}, //13261 #CJK UNIFIED IDEOGRAPH + {0xCE65, 0x8752}, //13262 #CJK UNIFIED IDEOGRAPH + {0xCE66, 0x8754}, //13263 #CJK UNIFIED IDEOGRAPH + {0xCE67, 0x8755}, //13264 #CJK UNIFIED IDEOGRAPH + {0xCE68, 0x8756}, //13265 #CJK UNIFIED IDEOGRAPH + {0xCE69, 0x8758}, //13266 #CJK UNIFIED IDEOGRAPH + {0xCE6A, 0x875A}, //13267 #CJK UNIFIED IDEOGRAPH + {0xCE6B, 0x875B}, //13268 #CJK UNIFIED IDEOGRAPH + {0xCE6C, 0x875C}, //13269 #CJK UNIFIED IDEOGRAPH + {0xCE6D, 0x875D}, //13270 #CJK UNIFIED IDEOGRAPH + {0xCE6E, 0x875E}, //13271 #CJK UNIFIED IDEOGRAPH + {0xCE6F, 0x875F}, //13272 #CJK UNIFIED IDEOGRAPH + {0xCE70, 0x8761}, //13273 #CJK UNIFIED IDEOGRAPH + {0xCE71, 0x8762}, //13274 #CJK UNIFIED IDEOGRAPH + {0xCE72, 0x8766}, //13275 #CJK UNIFIED IDEOGRAPH + {0xCE73, 0x8767}, //13276 #CJK UNIFIED IDEOGRAPH + {0xCE74, 0x8768}, //13277 #CJK UNIFIED IDEOGRAPH + {0xCE75, 0x8769}, //13278 #CJK UNIFIED IDEOGRAPH + {0xCE76, 0x876A}, //13279 #CJK UNIFIED IDEOGRAPH + {0xCE77, 0x876B}, //13280 #CJK UNIFIED IDEOGRAPH + {0xCE78, 0x876C}, //13281 #CJK UNIFIED IDEOGRAPH + {0xCE79, 0x876D}, //13282 #CJK UNIFIED IDEOGRAPH + {0xCE7A, 0x876F}, //13283 #CJK UNIFIED IDEOGRAPH + {0xCE7B, 0x8771}, //13284 #CJK UNIFIED IDEOGRAPH + {0xCE7C, 0x8772}, //13285 #CJK UNIFIED IDEOGRAPH + {0xCE7D, 0x8773}, //13286 #CJK UNIFIED IDEOGRAPH + {0xCE7E, 0x8775}, //13287 #CJK UNIFIED IDEOGRAPH + {0xCE80, 0x8777}, //13288 #CJK UNIFIED IDEOGRAPH + {0xCE81, 0x8778}, //13289 #CJK UNIFIED IDEOGRAPH + {0xCE82, 0x8779}, //13290 #CJK UNIFIED IDEOGRAPH + {0xCE83, 0x877A}, //13291 #CJK UNIFIED IDEOGRAPH + {0xCE84, 0x877F}, //13292 #CJK UNIFIED IDEOGRAPH + {0xCE85, 0x8780}, //13293 #CJK UNIFIED IDEOGRAPH + {0xCE86, 0x8781}, //13294 #CJK UNIFIED IDEOGRAPH + {0xCE87, 0x8784}, //13295 #CJK UNIFIED IDEOGRAPH + {0xCE88, 0x8786}, //13296 #CJK UNIFIED IDEOGRAPH + {0xCE89, 0x8787}, //13297 #CJK UNIFIED IDEOGRAPH + {0xCE8A, 0x8789}, //13298 #CJK UNIFIED IDEOGRAPH + {0xCE8B, 0x878A}, //13299 #CJK UNIFIED IDEOGRAPH + {0xCE8C, 0x878C}, //13300 #CJK UNIFIED IDEOGRAPH + {0xCE8D, 0x878E}, //13301 #CJK UNIFIED IDEOGRAPH + {0xCE8E, 0x878F}, //13302 #CJK UNIFIED IDEOGRAPH + {0xCE8F, 0x8790}, //13303 #CJK UNIFIED IDEOGRAPH + {0xCE90, 0x8791}, //13304 #CJK UNIFIED IDEOGRAPH + {0xCE91, 0x8792}, //13305 #CJK UNIFIED IDEOGRAPH + {0xCE92, 0x8794}, //13306 #CJK UNIFIED IDEOGRAPH + {0xCE93, 0x8795}, //13307 #CJK UNIFIED IDEOGRAPH + {0xCE94, 0x8796}, //13308 #CJK UNIFIED IDEOGRAPH + {0xCE95, 0x8798}, //13309 #CJK UNIFIED IDEOGRAPH + {0xCE96, 0x8799}, //13310 #CJK UNIFIED IDEOGRAPH + {0xCE97, 0x879A}, //13311 #CJK UNIFIED IDEOGRAPH + {0xCE98, 0x879B}, //13312 #CJK UNIFIED IDEOGRAPH + {0xCE99, 0x879C}, //13313 #CJK UNIFIED IDEOGRAPH + {0xCE9A, 0x879D}, //13314 #CJK UNIFIED IDEOGRAPH + {0xCE9B, 0x879E}, //13315 #CJK UNIFIED IDEOGRAPH + {0xCE9C, 0x87A0}, //13316 #CJK UNIFIED IDEOGRAPH + {0xCE9D, 0x87A1}, //13317 #CJK UNIFIED IDEOGRAPH + {0xCE9E, 0x87A2}, //13318 #CJK UNIFIED IDEOGRAPH + {0xCE9F, 0x87A3}, //13319 #CJK UNIFIED IDEOGRAPH + {0xCEA0, 0x87A4}, //13320 #CJK UNIFIED IDEOGRAPH + {0xCEA1, 0x5DCD}, //13321 #CJK UNIFIED IDEOGRAPH + {0xCEA2, 0x5FAE}, //13322 #CJK UNIFIED IDEOGRAPH + {0xCEA3, 0x5371}, //13323 #CJK UNIFIED IDEOGRAPH + {0xCEA4, 0x97E6}, //13324 #CJK UNIFIED IDEOGRAPH + {0xCEA5, 0x8FDD}, //13325 #CJK UNIFIED IDEOGRAPH + {0xCEA6, 0x6845}, //13326 #CJK UNIFIED IDEOGRAPH + {0xCEA7, 0x56F4}, //13327 #CJK UNIFIED IDEOGRAPH + {0xCEA8, 0x552F}, //13328 #CJK UNIFIED IDEOGRAPH + {0xCEA9, 0x60DF}, //13329 #CJK UNIFIED IDEOGRAPH + {0xCEAA, 0x4E3A}, //13330 #CJK UNIFIED IDEOGRAPH + {0xCEAB, 0x6F4D}, //13331 #CJK UNIFIED IDEOGRAPH + {0xCEAC, 0x7EF4}, //13332 #CJK UNIFIED IDEOGRAPH + {0xCEAD, 0x82C7}, //13333 #CJK UNIFIED IDEOGRAPH + {0xCEAE, 0x840E}, //13334 #CJK UNIFIED IDEOGRAPH + {0xCEAF, 0x59D4}, //13335 #CJK UNIFIED IDEOGRAPH + {0xCEB0, 0x4F1F}, //13336 #CJK UNIFIED IDEOGRAPH + {0xCEB1, 0x4F2A}, //13337 #CJK UNIFIED IDEOGRAPH + {0xCEB2, 0x5C3E}, //13338 #CJK UNIFIED IDEOGRAPH + {0xCEB3, 0x7EAC}, //13339 #CJK UNIFIED IDEOGRAPH + {0xCEB4, 0x672A}, //13340 #CJK UNIFIED IDEOGRAPH + {0xCEB5, 0x851A}, //13341 #CJK UNIFIED IDEOGRAPH + {0xCEB6, 0x5473}, //13342 #CJK UNIFIED IDEOGRAPH + {0xCEB7, 0x754F}, //13343 #CJK UNIFIED IDEOGRAPH + {0xCEB8, 0x80C3}, //13344 #CJK UNIFIED IDEOGRAPH + {0xCEB9, 0x5582}, //13345 #CJK UNIFIED IDEOGRAPH + {0xCEBA, 0x9B4F}, //13346 #CJK UNIFIED IDEOGRAPH + {0xCEBB, 0x4F4D}, //13347 #CJK UNIFIED IDEOGRAPH + {0xCEBC, 0x6E2D}, //13348 #CJK UNIFIED IDEOGRAPH + {0xCEBD, 0x8C13}, //13349 #CJK UNIFIED IDEOGRAPH + {0xCEBE, 0x5C09}, //13350 #CJK UNIFIED IDEOGRAPH + {0xCEBF, 0x6170}, //13351 #CJK UNIFIED IDEOGRAPH + {0xCEC0, 0x536B}, //13352 #CJK UNIFIED IDEOGRAPH + {0xCEC1, 0x761F}, //13353 #CJK UNIFIED IDEOGRAPH + {0xCEC2, 0x6E29}, //13354 #CJK UNIFIED IDEOGRAPH + {0xCEC3, 0x868A}, //13355 #CJK UNIFIED IDEOGRAPH + {0xCEC4, 0x6587}, //13356 #CJK UNIFIED IDEOGRAPH + {0xCEC5, 0x95FB}, //13357 #CJK UNIFIED IDEOGRAPH + {0xCEC6, 0x7EB9}, //13358 #CJK UNIFIED IDEOGRAPH + {0xCEC7, 0x543B}, //13359 #CJK UNIFIED IDEOGRAPH + {0xCEC8, 0x7A33}, //13360 #CJK UNIFIED IDEOGRAPH + {0xCEC9, 0x7D0A}, //13361 #CJK UNIFIED IDEOGRAPH + {0xCECA, 0x95EE}, //13362 #CJK UNIFIED IDEOGRAPH + {0xCECB, 0x55E1}, //13363 #CJK UNIFIED IDEOGRAPH + {0xCECC, 0x7FC1}, //13364 #CJK UNIFIED IDEOGRAPH + {0xCECD, 0x74EE}, //13365 #CJK UNIFIED IDEOGRAPH + {0xCECE, 0x631D}, //13366 #CJK UNIFIED IDEOGRAPH + {0xCECF, 0x8717}, //13367 #CJK UNIFIED IDEOGRAPH + {0xCED0, 0x6DA1}, //13368 #CJK UNIFIED IDEOGRAPH + {0xCED1, 0x7A9D}, //13369 #CJK UNIFIED IDEOGRAPH + {0xCED2, 0x6211}, //13370 #CJK UNIFIED IDEOGRAPH + {0xCED3, 0x65A1}, //13371 #CJK UNIFIED IDEOGRAPH + {0xCED4, 0x5367}, //13372 #CJK UNIFIED IDEOGRAPH + {0xCED5, 0x63E1}, //13373 #CJK UNIFIED IDEOGRAPH + {0xCED6, 0x6C83}, //13374 #CJK UNIFIED IDEOGRAPH + {0xCED7, 0x5DEB}, //13375 #CJK UNIFIED IDEOGRAPH + {0xCED8, 0x545C}, //13376 #CJK UNIFIED IDEOGRAPH + {0xCED9, 0x94A8}, //13377 #CJK UNIFIED IDEOGRAPH + {0xCEDA, 0x4E4C}, //13378 #CJK UNIFIED IDEOGRAPH + {0xCEDB, 0x6C61}, //13379 #CJK UNIFIED IDEOGRAPH + {0xCEDC, 0x8BEC}, //13380 #CJK UNIFIED IDEOGRAPH + {0xCEDD, 0x5C4B}, //13381 #CJK UNIFIED IDEOGRAPH + {0xCEDE, 0x65E0}, //13382 #CJK UNIFIED IDEOGRAPH + {0xCEDF, 0x829C}, //13383 #CJK UNIFIED IDEOGRAPH + {0xCEE0, 0x68A7}, //13384 #CJK UNIFIED IDEOGRAPH + {0xCEE1, 0x543E}, //13385 #CJK UNIFIED IDEOGRAPH + {0xCEE2, 0x5434}, //13386 #CJK UNIFIED IDEOGRAPH + {0xCEE3, 0x6BCB}, //13387 #CJK UNIFIED IDEOGRAPH + {0xCEE4, 0x6B66}, //13388 #CJK UNIFIED IDEOGRAPH + {0xCEE5, 0x4E94}, //13389 #CJK UNIFIED IDEOGRAPH + {0xCEE6, 0x6342}, //13390 #CJK UNIFIED IDEOGRAPH + {0xCEE7, 0x5348}, //13391 #CJK UNIFIED IDEOGRAPH + {0xCEE8, 0x821E}, //13392 #CJK UNIFIED IDEOGRAPH + {0xCEE9, 0x4F0D}, //13393 #CJK UNIFIED IDEOGRAPH + {0xCEEA, 0x4FAE}, //13394 #CJK UNIFIED IDEOGRAPH + {0xCEEB, 0x575E}, //13395 #CJK UNIFIED IDEOGRAPH + {0xCEEC, 0x620A}, //13396 #CJK UNIFIED IDEOGRAPH + {0xCEED, 0x96FE}, //13397 #CJK UNIFIED IDEOGRAPH + {0xCEEE, 0x6664}, //13398 #CJK UNIFIED IDEOGRAPH + {0xCEEF, 0x7269}, //13399 #CJK UNIFIED IDEOGRAPH + {0xCEF0, 0x52FF}, //13400 #CJK UNIFIED IDEOGRAPH + {0xCEF1, 0x52A1}, //13401 #CJK UNIFIED IDEOGRAPH + {0xCEF2, 0x609F}, //13402 #CJK UNIFIED IDEOGRAPH + {0xCEF3, 0x8BEF}, //13403 #CJK UNIFIED IDEOGRAPH + {0xCEF4, 0x6614}, //13404 #CJK UNIFIED IDEOGRAPH + {0xCEF5, 0x7199}, //13405 #CJK UNIFIED IDEOGRAPH + {0xCEF6, 0x6790}, //13406 #CJK UNIFIED IDEOGRAPH + {0xCEF7, 0x897F}, //13407 #CJK UNIFIED IDEOGRAPH + {0xCEF8, 0x7852}, //13408 #CJK UNIFIED IDEOGRAPH + {0xCEF9, 0x77FD}, //13409 #CJK UNIFIED IDEOGRAPH + {0xCEFA, 0x6670}, //13410 #CJK UNIFIED IDEOGRAPH + {0xCEFB, 0x563B}, //13411 #CJK UNIFIED IDEOGRAPH + {0xCEFC, 0x5438}, //13412 #CJK UNIFIED IDEOGRAPH + {0xCEFD, 0x9521}, //13413 #CJK UNIFIED IDEOGRAPH + {0xCEFE, 0x727A}, //13414 #CJK UNIFIED IDEOGRAPH + {0xCF40, 0x87A5}, //13415 #CJK UNIFIED IDEOGRAPH + {0xCF41, 0x87A6}, //13416 #CJK UNIFIED IDEOGRAPH + {0xCF42, 0x87A7}, //13417 #CJK UNIFIED IDEOGRAPH + {0xCF43, 0x87A9}, //13418 #CJK UNIFIED IDEOGRAPH + {0xCF44, 0x87AA}, //13419 #CJK UNIFIED IDEOGRAPH + {0xCF45, 0x87AE}, //13420 #CJK UNIFIED IDEOGRAPH + {0xCF46, 0x87B0}, //13421 #CJK UNIFIED IDEOGRAPH + {0xCF47, 0x87B1}, //13422 #CJK UNIFIED IDEOGRAPH + {0xCF48, 0x87B2}, //13423 #CJK UNIFIED IDEOGRAPH + {0xCF49, 0x87B4}, //13424 #CJK UNIFIED IDEOGRAPH + {0xCF4A, 0x87B6}, //13425 #CJK UNIFIED IDEOGRAPH + {0xCF4B, 0x87B7}, //13426 #CJK UNIFIED IDEOGRAPH + {0xCF4C, 0x87B8}, //13427 #CJK UNIFIED IDEOGRAPH + {0xCF4D, 0x87B9}, //13428 #CJK UNIFIED IDEOGRAPH + {0xCF4E, 0x87BB}, //13429 #CJK UNIFIED IDEOGRAPH + {0xCF4F, 0x87BC}, //13430 #CJK UNIFIED IDEOGRAPH + {0xCF50, 0x87BE}, //13431 #CJK UNIFIED IDEOGRAPH + {0xCF51, 0x87BF}, //13432 #CJK UNIFIED IDEOGRAPH + {0xCF52, 0x87C1}, //13433 #CJK UNIFIED IDEOGRAPH + {0xCF53, 0x87C2}, //13434 #CJK UNIFIED IDEOGRAPH + {0xCF54, 0x87C3}, //13435 #CJK UNIFIED IDEOGRAPH + {0xCF55, 0x87C4}, //13436 #CJK UNIFIED IDEOGRAPH + {0xCF56, 0x87C5}, //13437 #CJK UNIFIED IDEOGRAPH + {0xCF57, 0x87C7}, //13438 #CJK UNIFIED IDEOGRAPH + {0xCF58, 0x87C8}, //13439 #CJK UNIFIED IDEOGRAPH + {0xCF59, 0x87C9}, //13440 #CJK UNIFIED IDEOGRAPH + {0xCF5A, 0x87CC}, //13441 #CJK UNIFIED IDEOGRAPH + {0xCF5B, 0x87CD}, //13442 #CJK UNIFIED IDEOGRAPH + {0xCF5C, 0x87CE}, //13443 #CJK UNIFIED IDEOGRAPH + {0xCF5D, 0x87CF}, //13444 #CJK UNIFIED IDEOGRAPH + {0xCF5E, 0x87D0}, //13445 #CJK UNIFIED IDEOGRAPH + {0xCF5F, 0x87D4}, //13446 #CJK UNIFIED IDEOGRAPH + {0xCF60, 0x87D5}, //13447 #CJK UNIFIED IDEOGRAPH + {0xCF61, 0x87D6}, //13448 #CJK UNIFIED IDEOGRAPH + {0xCF62, 0x87D7}, //13449 #CJK UNIFIED IDEOGRAPH + {0xCF63, 0x87D8}, //13450 #CJK UNIFIED IDEOGRAPH + {0xCF64, 0x87D9}, //13451 #CJK UNIFIED IDEOGRAPH + {0xCF65, 0x87DA}, //13452 #CJK UNIFIED IDEOGRAPH + {0xCF66, 0x87DC}, //13453 #CJK UNIFIED IDEOGRAPH + {0xCF67, 0x87DD}, //13454 #CJK UNIFIED IDEOGRAPH + {0xCF68, 0x87DE}, //13455 #CJK UNIFIED IDEOGRAPH + {0xCF69, 0x87DF}, //13456 #CJK UNIFIED IDEOGRAPH + {0xCF6A, 0x87E1}, //13457 #CJK UNIFIED IDEOGRAPH + {0xCF6B, 0x87E2}, //13458 #CJK UNIFIED IDEOGRAPH + {0xCF6C, 0x87E3}, //13459 #CJK UNIFIED IDEOGRAPH + {0xCF6D, 0x87E4}, //13460 #CJK UNIFIED IDEOGRAPH + {0xCF6E, 0x87E6}, //13461 #CJK UNIFIED IDEOGRAPH + {0xCF6F, 0x87E7}, //13462 #CJK UNIFIED IDEOGRAPH + {0xCF70, 0x87E8}, //13463 #CJK UNIFIED IDEOGRAPH + {0xCF71, 0x87E9}, //13464 #CJK UNIFIED IDEOGRAPH + {0xCF72, 0x87EB}, //13465 #CJK UNIFIED IDEOGRAPH + {0xCF73, 0x87EC}, //13466 #CJK UNIFIED IDEOGRAPH + {0xCF74, 0x87ED}, //13467 #CJK UNIFIED IDEOGRAPH + {0xCF75, 0x87EF}, //13468 #CJK UNIFIED IDEOGRAPH + {0xCF76, 0x87F0}, //13469 #CJK UNIFIED IDEOGRAPH + {0xCF77, 0x87F1}, //13470 #CJK UNIFIED IDEOGRAPH + {0xCF78, 0x87F2}, //13471 #CJK UNIFIED IDEOGRAPH + {0xCF79, 0x87F3}, //13472 #CJK UNIFIED IDEOGRAPH + {0xCF7A, 0x87F4}, //13473 #CJK UNIFIED IDEOGRAPH + {0xCF7B, 0x87F5}, //13474 #CJK UNIFIED IDEOGRAPH + {0xCF7C, 0x87F6}, //13475 #CJK UNIFIED IDEOGRAPH + {0xCF7D, 0x87F7}, //13476 #CJK UNIFIED IDEOGRAPH + {0xCF7E, 0x87F8}, //13477 #CJK UNIFIED IDEOGRAPH + {0xCF80, 0x87FA}, //13478 #CJK UNIFIED IDEOGRAPH + {0xCF81, 0x87FB}, //13479 #CJK UNIFIED IDEOGRAPH + {0xCF82, 0x87FC}, //13480 #CJK UNIFIED IDEOGRAPH + {0xCF83, 0x87FD}, //13481 #CJK UNIFIED IDEOGRAPH + {0xCF84, 0x87FF}, //13482 #CJK UNIFIED IDEOGRAPH + {0xCF85, 0x8800}, //13483 #CJK UNIFIED IDEOGRAPH + {0xCF86, 0x8801}, //13484 #CJK UNIFIED IDEOGRAPH + {0xCF87, 0x8802}, //13485 #CJK UNIFIED IDEOGRAPH + {0xCF88, 0x8804}, //13486 #CJK UNIFIED IDEOGRAPH + {0xCF89, 0x8805}, //13487 #CJK UNIFIED IDEOGRAPH + {0xCF8A, 0x8806}, //13488 #CJK UNIFIED IDEOGRAPH + {0xCF8B, 0x8807}, //13489 #CJK UNIFIED IDEOGRAPH + {0xCF8C, 0x8808}, //13490 #CJK UNIFIED IDEOGRAPH + {0xCF8D, 0x8809}, //13491 #CJK UNIFIED IDEOGRAPH + {0xCF8E, 0x880B}, //13492 #CJK UNIFIED IDEOGRAPH + {0xCF8F, 0x880C}, //13493 #CJK UNIFIED IDEOGRAPH + {0xCF90, 0x880D}, //13494 #CJK UNIFIED IDEOGRAPH + {0xCF91, 0x880E}, //13495 #CJK UNIFIED IDEOGRAPH + {0xCF92, 0x880F}, //13496 #CJK UNIFIED IDEOGRAPH + {0xCF93, 0x8810}, //13497 #CJK UNIFIED IDEOGRAPH + {0xCF94, 0x8811}, //13498 #CJK UNIFIED IDEOGRAPH + {0xCF95, 0x8812}, //13499 #CJK UNIFIED IDEOGRAPH + {0xCF96, 0x8814}, //13500 #CJK UNIFIED IDEOGRAPH + {0xCF97, 0x8817}, //13501 #CJK UNIFIED IDEOGRAPH + {0xCF98, 0x8818}, //13502 #CJK UNIFIED IDEOGRAPH + {0xCF99, 0x8819}, //13503 #CJK UNIFIED IDEOGRAPH + {0xCF9A, 0x881A}, //13504 #CJK UNIFIED IDEOGRAPH + {0xCF9B, 0x881C}, //13505 #CJK UNIFIED IDEOGRAPH + {0xCF9C, 0x881D}, //13506 #CJK UNIFIED IDEOGRAPH + {0xCF9D, 0x881E}, //13507 #CJK UNIFIED IDEOGRAPH + {0xCF9E, 0x881F}, //13508 #CJK UNIFIED IDEOGRAPH + {0xCF9F, 0x8820}, //13509 #CJK UNIFIED IDEOGRAPH + {0xCFA0, 0x8823}, //13510 #CJK UNIFIED IDEOGRAPH + {0xCFA1, 0x7A00}, //13511 #CJK UNIFIED IDEOGRAPH + {0xCFA2, 0x606F}, //13512 #CJK UNIFIED IDEOGRAPH + {0xCFA3, 0x5E0C}, //13513 #CJK UNIFIED IDEOGRAPH + {0xCFA4, 0x6089}, //13514 #CJK UNIFIED IDEOGRAPH + {0xCFA5, 0x819D}, //13515 #CJK UNIFIED IDEOGRAPH + {0xCFA6, 0x5915}, //13516 #CJK UNIFIED IDEOGRAPH + {0xCFA7, 0x60DC}, //13517 #CJK UNIFIED IDEOGRAPH + {0xCFA8, 0x7184}, //13518 #CJK UNIFIED IDEOGRAPH + {0xCFA9, 0x70EF}, //13519 #CJK UNIFIED IDEOGRAPH + {0xCFAA, 0x6EAA}, //13520 #CJK UNIFIED IDEOGRAPH + {0xCFAB, 0x6C50}, //13521 #CJK UNIFIED IDEOGRAPH + {0xCFAC, 0x7280}, //13522 #CJK UNIFIED IDEOGRAPH + {0xCFAD, 0x6A84}, //13523 #CJK UNIFIED IDEOGRAPH + {0xCFAE, 0x88AD}, //13524 #CJK UNIFIED IDEOGRAPH + {0xCFAF, 0x5E2D}, //13525 #CJK UNIFIED IDEOGRAPH + {0xCFB0, 0x4E60}, //13526 #CJK UNIFIED IDEOGRAPH + {0xCFB1, 0x5AB3}, //13527 #CJK UNIFIED IDEOGRAPH + {0xCFB2, 0x559C}, //13528 #CJK UNIFIED IDEOGRAPH + {0xCFB3, 0x94E3}, //13529 #CJK UNIFIED IDEOGRAPH + {0xCFB4, 0x6D17}, //13530 #CJK UNIFIED IDEOGRAPH + {0xCFB5, 0x7CFB}, //13531 #CJK UNIFIED IDEOGRAPH + {0xCFB6, 0x9699}, //13532 #CJK UNIFIED IDEOGRAPH + {0xCFB7, 0x620F}, //13533 #CJK UNIFIED IDEOGRAPH + {0xCFB8, 0x7EC6}, //13534 #CJK UNIFIED IDEOGRAPH + {0xCFB9, 0x778E}, //13535 #CJK UNIFIED IDEOGRAPH + {0xCFBA, 0x867E}, //13536 #CJK UNIFIED IDEOGRAPH + {0xCFBB, 0x5323}, //13537 #CJK UNIFIED IDEOGRAPH + {0xCFBC, 0x971E}, //13538 #CJK UNIFIED IDEOGRAPH + {0xCFBD, 0x8F96}, //13539 #CJK UNIFIED IDEOGRAPH + {0xCFBE, 0x6687}, //13540 #CJK UNIFIED IDEOGRAPH + {0xCFBF, 0x5CE1}, //13541 #CJK UNIFIED IDEOGRAPH + {0xCFC0, 0x4FA0}, //13542 #CJK UNIFIED IDEOGRAPH + {0xCFC1, 0x72ED}, //13543 #CJK UNIFIED IDEOGRAPH + {0xCFC2, 0x4E0B}, //13544 #CJK UNIFIED IDEOGRAPH + {0xCFC3, 0x53A6}, //13545 #CJK UNIFIED IDEOGRAPH + {0xCFC4, 0x590F}, //13546 #CJK UNIFIED IDEOGRAPH + {0xCFC5, 0x5413}, //13547 #CJK UNIFIED IDEOGRAPH + {0xCFC6, 0x6380}, //13548 #CJK UNIFIED IDEOGRAPH + {0xCFC7, 0x9528}, //13549 #CJK UNIFIED IDEOGRAPH + {0xCFC8, 0x5148}, //13550 #CJK UNIFIED IDEOGRAPH + {0xCFC9, 0x4ED9}, //13551 #CJK UNIFIED IDEOGRAPH + {0xCFCA, 0x9C9C}, //13552 #CJK UNIFIED IDEOGRAPH + {0xCFCB, 0x7EA4}, //13553 #CJK UNIFIED IDEOGRAPH + {0xCFCC, 0x54B8}, //13554 #CJK UNIFIED IDEOGRAPH + {0xCFCD, 0x8D24}, //13555 #CJK UNIFIED IDEOGRAPH + {0xCFCE, 0x8854}, //13556 #CJK UNIFIED IDEOGRAPH + {0xCFCF, 0x8237}, //13557 #CJK UNIFIED IDEOGRAPH + {0xCFD0, 0x95F2}, //13558 #CJK UNIFIED IDEOGRAPH + {0xCFD1, 0x6D8E}, //13559 #CJK UNIFIED IDEOGRAPH + {0xCFD2, 0x5F26}, //13560 #CJK UNIFIED IDEOGRAPH + {0xCFD3, 0x5ACC}, //13561 #CJK UNIFIED IDEOGRAPH + {0xCFD4, 0x663E}, //13562 #CJK UNIFIED IDEOGRAPH + {0xCFD5, 0x9669}, //13563 #CJK UNIFIED IDEOGRAPH + {0xCFD6, 0x73B0}, //13564 #CJK UNIFIED IDEOGRAPH + {0xCFD7, 0x732E}, //13565 #CJK UNIFIED IDEOGRAPH + {0xCFD8, 0x53BF}, //13566 #CJK UNIFIED IDEOGRAPH + {0xCFD9, 0x817A}, //13567 #CJK UNIFIED IDEOGRAPH + {0xCFDA, 0x9985}, //13568 #CJK UNIFIED IDEOGRAPH + {0xCFDB, 0x7FA1}, //13569 #CJK UNIFIED IDEOGRAPH + {0xCFDC, 0x5BAA}, //13570 #CJK UNIFIED IDEOGRAPH + {0xCFDD, 0x9677}, //13571 #CJK UNIFIED IDEOGRAPH + {0xCFDE, 0x9650}, //13572 #CJK UNIFIED IDEOGRAPH + {0xCFDF, 0x7EBF}, //13573 #CJK UNIFIED IDEOGRAPH + {0xCFE0, 0x76F8}, //13574 #CJK UNIFIED IDEOGRAPH + {0xCFE1, 0x53A2}, //13575 #CJK UNIFIED IDEOGRAPH + {0xCFE2, 0x9576}, //13576 #CJK UNIFIED IDEOGRAPH + {0xCFE3, 0x9999}, //13577 #CJK UNIFIED IDEOGRAPH + {0xCFE4, 0x7BB1}, //13578 #CJK UNIFIED IDEOGRAPH + {0xCFE5, 0x8944}, //13579 #CJK UNIFIED IDEOGRAPH + {0xCFE6, 0x6E58}, //13580 #CJK UNIFIED IDEOGRAPH + {0xCFE7, 0x4E61}, //13581 #CJK UNIFIED IDEOGRAPH + {0xCFE8, 0x7FD4}, //13582 #CJK UNIFIED IDEOGRAPH + {0xCFE9, 0x7965}, //13583 #CJK UNIFIED IDEOGRAPH + {0xCFEA, 0x8BE6}, //13584 #CJK UNIFIED IDEOGRAPH + {0xCFEB, 0x60F3}, //13585 #CJK UNIFIED IDEOGRAPH + {0xCFEC, 0x54CD}, //13586 #CJK UNIFIED IDEOGRAPH + {0xCFED, 0x4EAB}, //13587 #CJK UNIFIED IDEOGRAPH + {0xCFEE, 0x9879}, //13588 #CJK UNIFIED IDEOGRAPH + {0xCFEF, 0x5DF7}, //13589 #CJK UNIFIED IDEOGRAPH + {0xCFF0, 0x6A61}, //13590 #CJK UNIFIED IDEOGRAPH + {0xCFF1, 0x50CF}, //13591 #CJK UNIFIED IDEOGRAPH + {0xCFF2, 0x5411}, //13592 #CJK UNIFIED IDEOGRAPH + {0xCFF3, 0x8C61}, //13593 #CJK UNIFIED IDEOGRAPH + {0xCFF4, 0x8427}, //13594 #CJK UNIFIED IDEOGRAPH + {0xCFF5, 0x785D}, //13595 #CJK UNIFIED IDEOGRAPH + {0xCFF6, 0x9704}, //13596 #CJK UNIFIED IDEOGRAPH + {0xCFF7, 0x524A}, //13597 #CJK UNIFIED IDEOGRAPH + {0xCFF8, 0x54EE}, //13598 #CJK UNIFIED IDEOGRAPH + {0xCFF9, 0x56A3}, //13599 #CJK UNIFIED IDEOGRAPH + {0xCFFA, 0x9500}, //13600 #CJK UNIFIED IDEOGRAPH + {0xCFFB, 0x6D88}, //13601 #CJK UNIFIED IDEOGRAPH + {0xCFFC, 0x5BB5}, //13602 #CJK UNIFIED IDEOGRAPH + {0xCFFD, 0x6DC6}, //13603 #CJK UNIFIED IDEOGRAPH + {0xCFFE, 0x6653}, //13604 #CJK UNIFIED IDEOGRAPH + {0xD040, 0x8824}, //13605 #CJK UNIFIED IDEOGRAPH + {0xD041, 0x8825}, //13606 #CJK UNIFIED IDEOGRAPH + {0xD042, 0x8826}, //13607 #CJK UNIFIED IDEOGRAPH + {0xD043, 0x8827}, //13608 #CJK UNIFIED IDEOGRAPH + {0xD044, 0x8828}, //13609 #CJK UNIFIED IDEOGRAPH + {0xD045, 0x8829}, //13610 #CJK UNIFIED IDEOGRAPH + {0xD046, 0x882A}, //13611 #CJK UNIFIED IDEOGRAPH + {0xD047, 0x882B}, //13612 #CJK UNIFIED IDEOGRAPH + {0xD048, 0x882C}, //13613 #CJK UNIFIED IDEOGRAPH + {0xD049, 0x882D}, //13614 #CJK UNIFIED IDEOGRAPH + {0xD04A, 0x882E}, //13615 #CJK UNIFIED IDEOGRAPH + {0xD04B, 0x882F}, //13616 #CJK UNIFIED IDEOGRAPH + {0xD04C, 0x8830}, //13617 #CJK UNIFIED IDEOGRAPH + {0xD04D, 0x8831}, //13618 #CJK UNIFIED IDEOGRAPH + {0xD04E, 0x8833}, //13619 #CJK UNIFIED IDEOGRAPH + {0xD04F, 0x8834}, //13620 #CJK UNIFIED IDEOGRAPH + {0xD050, 0x8835}, //13621 #CJK UNIFIED IDEOGRAPH + {0xD051, 0x8836}, //13622 #CJK UNIFIED IDEOGRAPH + {0xD052, 0x8837}, //13623 #CJK UNIFIED IDEOGRAPH + {0xD053, 0x8838}, //13624 #CJK UNIFIED IDEOGRAPH + {0xD054, 0x883A}, //13625 #CJK UNIFIED IDEOGRAPH + {0xD055, 0x883B}, //13626 #CJK UNIFIED IDEOGRAPH + {0xD056, 0x883D}, //13627 #CJK UNIFIED IDEOGRAPH + {0xD057, 0x883E}, //13628 #CJK UNIFIED IDEOGRAPH + {0xD058, 0x883F}, //13629 #CJK UNIFIED IDEOGRAPH + {0xD059, 0x8841}, //13630 #CJK UNIFIED IDEOGRAPH + {0xD05A, 0x8842}, //13631 #CJK UNIFIED IDEOGRAPH + {0xD05B, 0x8843}, //13632 #CJK UNIFIED IDEOGRAPH + {0xD05C, 0x8846}, //13633 #CJK UNIFIED IDEOGRAPH + {0xD05D, 0x8847}, //13634 #CJK UNIFIED IDEOGRAPH + {0xD05E, 0x8848}, //13635 #CJK UNIFIED IDEOGRAPH + {0xD05F, 0x8849}, //13636 #CJK UNIFIED IDEOGRAPH + {0xD060, 0x884A}, //13637 #CJK UNIFIED IDEOGRAPH + {0xD061, 0x884B}, //13638 #CJK UNIFIED IDEOGRAPH + {0xD062, 0x884E}, //13639 #CJK UNIFIED IDEOGRAPH + {0xD063, 0x884F}, //13640 #CJK UNIFIED IDEOGRAPH + {0xD064, 0x8850}, //13641 #CJK UNIFIED IDEOGRAPH + {0xD065, 0x8851}, //13642 #CJK UNIFIED IDEOGRAPH + {0xD066, 0x8852}, //13643 #CJK UNIFIED IDEOGRAPH + {0xD067, 0x8853}, //13644 #CJK UNIFIED IDEOGRAPH + {0xD068, 0x8855}, //13645 #CJK UNIFIED IDEOGRAPH + {0xD069, 0x8856}, //13646 #CJK UNIFIED IDEOGRAPH + {0xD06A, 0x8858}, //13647 #CJK UNIFIED IDEOGRAPH + {0xD06B, 0x885A}, //13648 #CJK UNIFIED IDEOGRAPH + {0xD06C, 0x885B}, //13649 #CJK UNIFIED IDEOGRAPH + {0xD06D, 0x885C}, //13650 #CJK UNIFIED IDEOGRAPH + {0xD06E, 0x885D}, //13651 #CJK UNIFIED IDEOGRAPH + {0xD06F, 0x885E}, //13652 #CJK UNIFIED IDEOGRAPH + {0xD070, 0x885F}, //13653 #CJK UNIFIED IDEOGRAPH + {0xD071, 0x8860}, //13654 #CJK UNIFIED IDEOGRAPH + {0xD072, 0x8866}, //13655 #CJK UNIFIED IDEOGRAPH + {0xD073, 0x8867}, //13656 #CJK UNIFIED IDEOGRAPH + {0xD074, 0x886A}, //13657 #CJK UNIFIED IDEOGRAPH + {0xD075, 0x886D}, //13658 #CJK UNIFIED IDEOGRAPH + {0xD076, 0x886F}, //13659 #CJK UNIFIED IDEOGRAPH + {0xD077, 0x8871}, //13660 #CJK UNIFIED IDEOGRAPH + {0xD078, 0x8873}, //13661 #CJK UNIFIED IDEOGRAPH + {0xD079, 0x8874}, //13662 #CJK UNIFIED IDEOGRAPH + {0xD07A, 0x8875}, //13663 #CJK UNIFIED IDEOGRAPH + {0xD07B, 0x8876}, //13664 #CJK UNIFIED IDEOGRAPH + {0xD07C, 0x8878}, //13665 #CJK UNIFIED IDEOGRAPH + {0xD07D, 0x8879}, //13666 #CJK UNIFIED IDEOGRAPH + {0xD07E, 0x887A}, //13667 #CJK UNIFIED IDEOGRAPH + {0xD080, 0x887B}, //13668 #CJK UNIFIED IDEOGRAPH + {0xD081, 0x887C}, //13669 #CJK UNIFIED IDEOGRAPH + {0xD082, 0x8880}, //13670 #CJK UNIFIED IDEOGRAPH + {0xD083, 0x8883}, //13671 #CJK UNIFIED IDEOGRAPH + {0xD084, 0x8886}, //13672 #CJK UNIFIED IDEOGRAPH + {0xD085, 0x8887}, //13673 #CJK UNIFIED IDEOGRAPH + {0xD086, 0x8889}, //13674 #CJK UNIFIED IDEOGRAPH + {0xD087, 0x888A}, //13675 #CJK UNIFIED IDEOGRAPH + {0xD088, 0x888C}, //13676 #CJK UNIFIED IDEOGRAPH + {0xD089, 0x888E}, //13677 #CJK UNIFIED IDEOGRAPH + {0xD08A, 0x888F}, //13678 #CJK UNIFIED IDEOGRAPH + {0xD08B, 0x8890}, //13679 #CJK UNIFIED IDEOGRAPH + {0xD08C, 0x8891}, //13680 #CJK UNIFIED IDEOGRAPH + {0xD08D, 0x8893}, //13681 #CJK UNIFIED IDEOGRAPH + {0xD08E, 0x8894}, //13682 #CJK UNIFIED IDEOGRAPH + {0xD08F, 0x8895}, //13683 #CJK UNIFIED IDEOGRAPH + {0xD090, 0x8897}, //13684 #CJK UNIFIED IDEOGRAPH + {0xD091, 0x8898}, //13685 #CJK UNIFIED IDEOGRAPH + {0xD092, 0x8899}, //13686 #CJK UNIFIED IDEOGRAPH + {0xD093, 0x889A}, //13687 #CJK UNIFIED IDEOGRAPH + {0xD094, 0x889B}, //13688 #CJK UNIFIED IDEOGRAPH + {0xD095, 0x889D}, //13689 #CJK UNIFIED IDEOGRAPH + {0xD096, 0x889E}, //13690 #CJK UNIFIED IDEOGRAPH + {0xD097, 0x889F}, //13691 #CJK UNIFIED IDEOGRAPH + {0xD098, 0x88A0}, //13692 #CJK UNIFIED IDEOGRAPH + {0xD099, 0x88A1}, //13693 #CJK UNIFIED IDEOGRAPH + {0xD09A, 0x88A3}, //13694 #CJK UNIFIED IDEOGRAPH + {0xD09B, 0x88A5}, //13695 #CJK UNIFIED IDEOGRAPH + {0xD09C, 0x88A6}, //13696 #CJK UNIFIED IDEOGRAPH + {0xD09D, 0x88A7}, //13697 #CJK UNIFIED IDEOGRAPH + {0xD09E, 0x88A8}, //13698 #CJK UNIFIED IDEOGRAPH + {0xD09F, 0x88A9}, //13699 #CJK UNIFIED IDEOGRAPH + {0xD0A0, 0x88AA}, //13700 #CJK UNIFIED IDEOGRAPH + {0xD0A1, 0x5C0F}, //13701 #CJK UNIFIED IDEOGRAPH + {0xD0A2, 0x5B5D}, //13702 #CJK UNIFIED IDEOGRAPH + {0xD0A3, 0x6821}, //13703 #CJK UNIFIED IDEOGRAPH + {0xD0A4, 0x8096}, //13704 #CJK UNIFIED IDEOGRAPH + {0xD0A5, 0x5578}, //13705 #CJK UNIFIED IDEOGRAPH + {0xD0A6, 0x7B11}, //13706 #CJK UNIFIED IDEOGRAPH + {0xD0A7, 0x6548}, //13707 #CJK UNIFIED IDEOGRAPH + {0xD0A8, 0x6954}, //13708 #CJK UNIFIED IDEOGRAPH + {0xD0A9, 0x4E9B}, //13709 #CJK UNIFIED IDEOGRAPH + {0xD0AA, 0x6B47}, //13710 #CJK UNIFIED IDEOGRAPH + {0xD0AB, 0x874E}, //13711 #CJK UNIFIED IDEOGRAPH + {0xD0AC, 0x978B}, //13712 #CJK UNIFIED IDEOGRAPH + {0xD0AD, 0x534F}, //13713 #CJK UNIFIED IDEOGRAPH + {0xD0AE, 0x631F}, //13714 #CJK UNIFIED IDEOGRAPH + {0xD0AF, 0x643A}, //13715 #CJK UNIFIED IDEOGRAPH + {0xD0B0, 0x90AA}, //13716 #CJK UNIFIED IDEOGRAPH + {0xD0B1, 0x659C}, //13717 #CJK UNIFIED IDEOGRAPH + {0xD0B2, 0x80C1}, //13718 #CJK UNIFIED IDEOGRAPH + {0xD0B3, 0x8C10}, //13719 #CJK UNIFIED IDEOGRAPH + {0xD0B4, 0x5199}, //13720 #CJK UNIFIED IDEOGRAPH + {0xD0B5, 0x68B0}, //13721 #CJK UNIFIED IDEOGRAPH + {0xD0B6, 0x5378}, //13722 #CJK UNIFIED IDEOGRAPH + {0xD0B7, 0x87F9}, //13723 #CJK UNIFIED IDEOGRAPH + {0xD0B8, 0x61C8}, //13724 #CJK UNIFIED IDEOGRAPH + {0xD0B9, 0x6CC4}, //13725 #CJK UNIFIED IDEOGRAPH + {0xD0BA, 0x6CFB}, //13726 #CJK UNIFIED IDEOGRAPH + {0xD0BB, 0x8C22}, //13727 #CJK UNIFIED IDEOGRAPH + {0xD0BC, 0x5C51}, //13728 #CJK UNIFIED IDEOGRAPH + {0xD0BD, 0x85AA}, //13729 #CJK UNIFIED IDEOGRAPH + {0xD0BE, 0x82AF}, //13730 #CJK UNIFIED IDEOGRAPH + {0xD0BF, 0x950C}, //13731 #CJK UNIFIED IDEOGRAPH + {0xD0C0, 0x6B23}, //13732 #CJK UNIFIED IDEOGRAPH + {0xD0C1, 0x8F9B}, //13733 #CJK UNIFIED IDEOGRAPH + {0xD0C2, 0x65B0}, //13734 #CJK UNIFIED IDEOGRAPH + {0xD0C3, 0x5FFB}, //13735 #CJK UNIFIED IDEOGRAPH + {0xD0C4, 0x5FC3}, //13736 #CJK UNIFIED IDEOGRAPH + {0xD0C5, 0x4FE1}, //13737 #CJK UNIFIED IDEOGRAPH + {0xD0C6, 0x8845}, //13738 #CJK UNIFIED IDEOGRAPH + {0xD0C7, 0x661F}, //13739 #CJK UNIFIED IDEOGRAPH + {0xD0C8, 0x8165}, //13740 #CJK UNIFIED IDEOGRAPH + {0xD0C9, 0x7329}, //13741 #CJK UNIFIED IDEOGRAPH + {0xD0CA, 0x60FA}, //13742 #CJK UNIFIED IDEOGRAPH + {0xD0CB, 0x5174}, //13743 #CJK UNIFIED IDEOGRAPH + {0xD0CC, 0x5211}, //13744 #CJK UNIFIED IDEOGRAPH + {0xD0CD, 0x578B}, //13745 #CJK UNIFIED IDEOGRAPH + {0xD0CE, 0x5F62}, //13746 #CJK UNIFIED IDEOGRAPH + {0xD0CF, 0x90A2}, //13747 #CJK UNIFIED IDEOGRAPH + {0xD0D0, 0x884C}, //13748 #CJK UNIFIED IDEOGRAPH + {0xD0D1, 0x9192}, //13749 #CJK UNIFIED IDEOGRAPH + {0xD0D2, 0x5E78}, //13750 #CJK UNIFIED IDEOGRAPH + {0xD0D3, 0x674F}, //13751 #CJK UNIFIED IDEOGRAPH + {0xD0D4, 0x6027}, //13752 #CJK UNIFIED IDEOGRAPH + {0xD0D5, 0x59D3}, //13753 #CJK UNIFIED IDEOGRAPH + {0xD0D6, 0x5144}, //13754 #CJK UNIFIED IDEOGRAPH + {0xD0D7, 0x51F6}, //13755 #CJK UNIFIED IDEOGRAPH + {0xD0D8, 0x80F8}, //13756 #CJK UNIFIED IDEOGRAPH + {0xD0D9, 0x5308}, //13757 #CJK UNIFIED IDEOGRAPH + {0xD0DA, 0x6C79}, //13758 #CJK UNIFIED IDEOGRAPH + {0xD0DB, 0x96C4}, //13759 #CJK UNIFIED IDEOGRAPH + {0xD0DC, 0x718A}, //13760 #CJK UNIFIED IDEOGRAPH + {0xD0DD, 0x4F11}, //13761 #CJK UNIFIED IDEOGRAPH + {0xD0DE, 0x4FEE}, //13762 #CJK UNIFIED IDEOGRAPH + {0xD0DF, 0x7F9E}, //13763 #CJK UNIFIED IDEOGRAPH + {0xD0E0, 0x673D}, //13764 #CJK UNIFIED IDEOGRAPH + {0xD0E1, 0x55C5}, //13765 #CJK UNIFIED IDEOGRAPH + {0xD0E2, 0x9508}, //13766 #CJK UNIFIED IDEOGRAPH + {0xD0E3, 0x79C0}, //13767 #CJK UNIFIED IDEOGRAPH + {0xD0E4, 0x8896}, //13768 #CJK UNIFIED IDEOGRAPH + {0xD0E5, 0x7EE3}, //13769 #CJK UNIFIED IDEOGRAPH + {0xD0E6, 0x589F}, //13770 #CJK UNIFIED IDEOGRAPH + {0xD0E7, 0x620C}, //13771 #CJK UNIFIED IDEOGRAPH + {0xD0E8, 0x9700}, //13772 #CJK UNIFIED IDEOGRAPH + {0xD0E9, 0x865A}, //13773 #CJK UNIFIED IDEOGRAPH + {0xD0EA, 0x5618}, //13774 #CJK UNIFIED IDEOGRAPH + {0xD0EB, 0x987B}, //13775 #CJK UNIFIED IDEOGRAPH + {0xD0EC, 0x5F90}, //13776 #CJK UNIFIED IDEOGRAPH + {0xD0ED, 0x8BB8}, //13777 #CJK UNIFIED IDEOGRAPH + {0xD0EE, 0x84C4}, //13778 #CJK UNIFIED IDEOGRAPH + {0xD0EF, 0x9157}, //13779 #CJK UNIFIED IDEOGRAPH + {0xD0F0, 0x53D9}, //13780 #CJK UNIFIED IDEOGRAPH + {0xD0F1, 0x65ED}, //13781 #CJK UNIFIED IDEOGRAPH + {0xD0F2, 0x5E8F}, //13782 #CJK UNIFIED IDEOGRAPH + {0xD0F3, 0x755C}, //13783 #CJK UNIFIED IDEOGRAPH + {0xD0F4, 0x6064}, //13784 #CJK UNIFIED IDEOGRAPH + {0xD0F5, 0x7D6E}, //13785 #CJK UNIFIED IDEOGRAPH + {0xD0F6, 0x5A7F}, //13786 #CJK UNIFIED IDEOGRAPH + {0xD0F7, 0x7EEA}, //13787 #CJK UNIFIED IDEOGRAPH + {0xD0F8, 0x7EED}, //13788 #CJK UNIFIED IDEOGRAPH + {0xD0F9, 0x8F69}, //13789 #CJK UNIFIED IDEOGRAPH + {0xD0FA, 0x55A7}, //13790 #CJK UNIFIED IDEOGRAPH + {0xD0FB, 0x5BA3}, //13791 #CJK UNIFIED IDEOGRAPH + {0xD0FC, 0x60AC}, //13792 #CJK UNIFIED IDEOGRAPH + {0xD0FD, 0x65CB}, //13793 #CJK UNIFIED IDEOGRAPH + {0xD0FE, 0x7384}, //13794 #CJK UNIFIED IDEOGRAPH + {0xD140, 0x88AC}, //13795 #CJK UNIFIED IDEOGRAPH + {0xD141, 0x88AE}, //13796 #CJK UNIFIED IDEOGRAPH + {0xD142, 0x88AF}, //13797 #CJK UNIFIED IDEOGRAPH + {0xD143, 0x88B0}, //13798 #CJK UNIFIED IDEOGRAPH + {0xD144, 0x88B2}, //13799 #CJK UNIFIED IDEOGRAPH + {0xD145, 0x88B3}, //13800 #CJK UNIFIED IDEOGRAPH + {0xD146, 0x88B4}, //13801 #CJK UNIFIED IDEOGRAPH + {0xD147, 0x88B5}, //13802 #CJK UNIFIED IDEOGRAPH + {0xD148, 0x88B6}, //13803 #CJK UNIFIED IDEOGRAPH + {0xD149, 0x88B8}, //13804 #CJK UNIFIED IDEOGRAPH + {0xD14A, 0x88B9}, //13805 #CJK UNIFIED IDEOGRAPH + {0xD14B, 0x88BA}, //13806 #CJK UNIFIED IDEOGRAPH + {0xD14C, 0x88BB}, //13807 #CJK UNIFIED IDEOGRAPH + {0xD14D, 0x88BD}, //13808 #CJK UNIFIED IDEOGRAPH + {0xD14E, 0x88BE}, //13809 #CJK UNIFIED IDEOGRAPH + {0xD14F, 0x88BF}, //13810 #CJK UNIFIED IDEOGRAPH + {0xD150, 0x88C0}, //13811 #CJK UNIFIED IDEOGRAPH + {0xD151, 0x88C3}, //13812 #CJK UNIFIED IDEOGRAPH + {0xD152, 0x88C4}, //13813 #CJK UNIFIED IDEOGRAPH + {0xD153, 0x88C7}, //13814 #CJK UNIFIED IDEOGRAPH + {0xD154, 0x88C8}, //13815 #CJK UNIFIED IDEOGRAPH + {0xD155, 0x88CA}, //13816 #CJK UNIFIED IDEOGRAPH + {0xD156, 0x88CB}, //13817 #CJK UNIFIED IDEOGRAPH + {0xD157, 0x88CC}, //13818 #CJK UNIFIED IDEOGRAPH + {0xD158, 0x88CD}, //13819 #CJK UNIFIED IDEOGRAPH + {0xD159, 0x88CF}, //13820 #CJK UNIFIED IDEOGRAPH + {0xD15A, 0x88D0}, //13821 #CJK UNIFIED IDEOGRAPH + {0xD15B, 0x88D1}, //13822 #CJK UNIFIED IDEOGRAPH + {0xD15C, 0x88D3}, //13823 #CJK UNIFIED IDEOGRAPH + {0xD15D, 0x88D6}, //13824 #CJK UNIFIED IDEOGRAPH + {0xD15E, 0x88D7}, //13825 #CJK UNIFIED IDEOGRAPH + {0xD15F, 0x88DA}, //13826 #CJK UNIFIED IDEOGRAPH + {0xD160, 0x88DB}, //13827 #CJK UNIFIED IDEOGRAPH + {0xD161, 0x88DC}, //13828 #CJK UNIFIED IDEOGRAPH + {0xD162, 0x88DD}, //13829 #CJK UNIFIED IDEOGRAPH + {0xD163, 0x88DE}, //13830 #CJK UNIFIED IDEOGRAPH + {0xD164, 0x88E0}, //13831 #CJK UNIFIED IDEOGRAPH + {0xD165, 0x88E1}, //13832 #CJK UNIFIED IDEOGRAPH + {0xD166, 0x88E6}, //13833 #CJK UNIFIED IDEOGRAPH + {0xD167, 0x88E7}, //13834 #CJK UNIFIED IDEOGRAPH + {0xD168, 0x88E9}, //13835 #CJK UNIFIED IDEOGRAPH + {0xD169, 0x88EA}, //13836 #CJK UNIFIED IDEOGRAPH + {0xD16A, 0x88EB}, //13837 #CJK UNIFIED IDEOGRAPH + {0xD16B, 0x88EC}, //13838 #CJK UNIFIED IDEOGRAPH + {0xD16C, 0x88ED}, //13839 #CJK UNIFIED IDEOGRAPH + {0xD16D, 0x88EE}, //13840 #CJK UNIFIED IDEOGRAPH + {0xD16E, 0x88EF}, //13841 #CJK UNIFIED IDEOGRAPH + {0xD16F, 0x88F2}, //13842 #CJK UNIFIED IDEOGRAPH + {0xD170, 0x88F5}, //13843 #CJK UNIFIED IDEOGRAPH + {0xD171, 0x88F6}, //13844 #CJK UNIFIED IDEOGRAPH + {0xD172, 0x88F7}, //13845 #CJK UNIFIED IDEOGRAPH + {0xD173, 0x88FA}, //13846 #CJK UNIFIED IDEOGRAPH + {0xD174, 0x88FB}, //13847 #CJK UNIFIED IDEOGRAPH + {0xD175, 0x88FD}, //13848 #CJK UNIFIED IDEOGRAPH + {0xD176, 0x88FF}, //13849 #CJK UNIFIED IDEOGRAPH + {0xD177, 0x8900}, //13850 #CJK UNIFIED IDEOGRAPH + {0xD178, 0x8901}, //13851 #CJK UNIFIED IDEOGRAPH + {0xD179, 0x8903}, //13852 #CJK UNIFIED IDEOGRAPH + {0xD17A, 0x8904}, //13853 #CJK UNIFIED IDEOGRAPH + {0xD17B, 0x8905}, //13854 #CJK UNIFIED IDEOGRAPH + {0xD17C, 0x8906}, //13855 #CJK UNIFIED IDEOGRAPH + {0xD17D, 0x8907}, //13856 #CJK UNIFIED IDEOGRAPH + {0xD17E, 0x8908}, //13857 #CJK UNIFIED IDEOGRAPH + {0xD180, 0x8909}, //13858 #CJK UNIFIED IDEOGRAPH + {0xD181, 0x890B}, //13859 #CJK UNIFIED IDEOGRAPH + {0xD182, 0x890C}, //13860 #CJK UNIFIED IDEOGRAPH + {0xD183, 0x890D}, //13861 #CJK UNIFIED IDEOGRAPH + {0xD184, 0x890E}, //13862 #CJK UNIFIED IDEOGRAPH + {0xD185, 0x890F}, //13863 #CJK UNIFIED IDEOGRAPH + {0xD186, 0x8911}, //13864 #CJK UNIFIED IDEOGRAPH + {0xD187, 0x8914}, //13865 #CJK UNIFIED IDEOGRAPH + {0xD188, 0x8915}, //13866 #CJK UNIFIED IDEOGRAPH + {0xD189, 0x8916}, //13867 #CJK UNIFIED IDEOGRAPH + {0xD18A, 0x8917}, //13868 #CJK UNIFIED IDEOGRAPH + {0xD18B, 0x8918}, //13869 #CJK UNIFIED IDEOGRAPH + {0xD18C, 0x891C}, //13870 #CJK UNIFIED IDEOGRAPH + {0xD18D, 0x891D}, //13871 #CJK UNIFIED IDEOGRAPH + {0xD18E, 0x891E}, //13872 #CJK UNIFIED IDEOGRAPH + {0xD18F, 0x891F}, //13873 #CJK UNIFIED IDEOGRAPH + {0xD190, 0x8920}, //13874 #CJK UNIFIED IDEOGRAPH + {0xD191, 0x8922}, //13875 #CJK UNIFIED IDEOGRAPH + {0xD192, 0x8923}, //13876 #CJK UNIFIED IDEOGRAPH + {0xD193, 0x8924}, //13877 #CJK UNIFIED IDEOGRAPH + {0xD194, 0x8926}, //13878 #CJK UNIFIED IDEOGRAPH + {0xD195, 0x8927}, //13879 #CJK UNIFIED IDEOGRAPH + {0xD196, 0x8928}, //13880 #CJK UNIFIED IDEOGRAPH + {0xD197, 0x8929}, //13881 #CJK UNIFIED IDEOGRAPH + {0xD198, 0x892C}, //13882 #CJK UNIFIED IDEOGRAPH + {0xD199, 0x892D}, //13883 #CJK UNIFIED IDEOGRAPH + {0xD19A, 0x892E}, //13884 #CJK UNIFIED IDEOGRAPH + {0xD19B, 0x892F}, //13885 #CJK UNIFIED IDEOGRAPH + {0xD19C, 0x8931}, //13886 #CJK UNIFIED IDEOGRAPH + {0xD19D, 0x8932}, //13887 #CJK UNIFIED IDEOGRAPH + {0xD19E, 0x8933}, //13888 #CJK UNIFIED IDEOGRAPH + {0xD19F, 0x8935}, //13889 #CJK UNIFIED IDEOGRAPH + {0xD1A0, 0x8937}, //13890 #CJK UNIFIED IDEOGRAPH + {0xD1A1, 0x9009}, //13891 #CJK UNIFIED IDEOGRAPH + {0xD1A2, 0x7663}, //13892 #CJK UNIFIED IDEOGRAPH + {0xD1A3, 0x7729}, //13893 #CJK UNIFIED IDEOGRAPH + {0xD1A4, 0x7EDA}, //13894 #CJK UNIFIED IDEOGRAPH + {0xD1A5, 0x9774}, //13895 #CJK UNIFIED IDEOGRAPH + {0xD1A6, 0x859B}, //13896 #CJK UNIFIED IDEOGRAPH + {0xD1A7, 0x5B66}, //13897 #CJK UNIFIED IDEOGRAPH + {0xD1A8, 0x7A74}, //13898 #CJK UNIFIED IDEOGRAPH + {0xD1A9, 0x96EA}, //13899 #CJK UNIFIED IDEOGRAPH + {0xD1AA, 0x8840}, //13900 #CJK UNIFIED IDEOGRAPH + {0xD1AB, 0x52CB}, //13901 #CJK UNIFIED IDEOGRAPH + {0xD1AC, 0x718F}, //13902 #CJK UNIFIED IDEOGRAPH + {0xD1AD, 0x5FAA}, //13903 #CJK UNIFIED IDEOGRAPH + {0xD1AE, 0x65EC}, //13904 #CJK UNIFIED IDEOGRAPH + {0xD1AF, 0x8BE2}, //13905 #CJK UNIFIED IDEOGRAPH + {0xD1B0, 0x5BFB}, //13906 #CJK UNIFIED IDEOGRAPH + {0xD1B1, 0x9A6F}, //13907 #CJK UNIFIED IDEOGRAPH + {0xD1B2, 0x5DE1}, //13908 #CJK UNIFIED IDEOGRAPH + {0xD1B3, 0x6B89}, //13909 #CJK UNIFIED IDEOGRAPH + {0xD1B4, 0x6C5B}, //13910 #CJK UNIFIED IDEOGRAPH + {0xD1B5, 0x8BAD}, //13911 #CJK UNIFIED IDEOGRAPH + {0xD1B6, 0x8BAF}, //13912 #CJK UNIFIED IDEOGRAPH + {0xD1B7, 0x900A}, //13913 #CJK UNIFIED IDEOGRAPH + {0xD1B8, 0x8FC5}, //13914 #CJK UNIFIED IDEOGRAPH + {0xD1B9, 0x538B}, //13915 #CJK UNIFIED IDEOGRAPH + {0xD1BA, 0x62BC}, //13916 #CJK UNIFIED IDEOGRAPH + {0xD1BB, 0x9E26}, //13917 #CJK UNIFIED IDEOGRAPH + {0xD1BC, 0x9E2D}, //13918 #CJK UNIFIED IDEOGRAPH + {0xD1BD, 0x5440}, //13919 #CJK UNIFIED IDEOGRAPH + {0xD1BE, 0x4E2B}, //13920 #CJK UNIFIED IDEOGRAPH + {0xD1BF, 0x82BD}, //13921 #CJK UNIFIED IDEOGRAPH + {0xD1C0, 0x7259}, //13922 #CJK UNIFIED IDEOGRAPH + {0xD1C1, 0x869C}, //13923 #CJK UNIFIED IDEOGRAPH + {0xD1C2, 0x5D16}, //13924 #CJK UNIFIED IDEOGRAPH + {0xD1C3, 0x8859}, //13925 #CJK UNIFIED IDEOGRAPH + {0xD1C4, 0x6DAF}, //13926 #CJK UNIFIED IDEOGRAPH + {0xD1C5, 0x96C5}, //13927 #CJK UNIFIED IDEOGRAPH + {0xD1C6, 0x54D1}, //13928 #CJK UNIFIED IDEOGRAPH + {0xD1C7, 0x4E9A}, //13929 #CJK UNIFIED IDEOGRAPH + {0xD1C8, 0x8BB6}, //13930 #CJK UNIFIED IDEOGRAPH + {0xD1C9, 0x7109}, //13931 #CJK UNIFIED IDEOGRAPH + {0xD1CA, 0x54BD}, //13932 #CJK UNIFIED IDEOGRAPH + {0xD1CB, 0x9609}, //13933 #CJK UNIFIED IDEOGRAPH + {0xD1CC, 0x70DF}, //13934 #CJK UNIFIED IDEOGRAPH + {0xD1CD, 0x6DF9}, //13935 #CJK UNIFIED IDEOGRAPH + {0xD1CE, 0x76D0}, //13936 #CJK UNIFIED IDEOGRAPH + {0xD1CF, 0x4E25}, //13937 #CJK UNIFIED IDEOGRAPH + {0xD1D0, 0x7814}, //13938 #CJK UNIFIED IDEOGRAPH + {0xD1D1, 0x8712}, //13939 #CJK UNIFIED IDEOGRAPH + {0xD1D2, 0x5CA9}, //13940 #CJK UNIFIED IDEOGRAPH + {0xD1D3, 0x5EF6}, //13941 #CJK UNIFIED IDEOGRAPH + {0xD1D4, 0x8A00}, //13942 #CJK UNIFIED IDEOGRAPH + {0xD1D5, 0x989C}, //13943 #CJK UNIFIED IDEOGRAPH + {0xD1D6, 0x960E}, //13944 #CJK UNIFIED IDEOGRAPH + {0xD1D7, 0x708E}, //13945 #CJK UNIFIED IDEOGRAPH + {0xD1D8, 0x6CBF}, //13946 #CJK UNIFIED IDEOGRAPH + {0xD1D9, 0x5944}, //13947 #CJK UNIFIED IDEOGRAPH + {0xD1DA, 0x63A9}, //13948 #CJK UNIFIED IDEOGRAPH + {0xD1DB, 0x773C}, //13949 #CJK UNIFIED IDEOGRAPH + {0xD1DC, 0x884D}, //13950 #CJK UNIFIED IDEOGRAPH + {0xD1DD, 0x6F14}, //13951 #CJK UNIFIED IDEOGRAPH + {0xD1DE, 0x8273}, //13952 #CJK UNIFIED IDEOGRAPH + {0xD1DF, 0x5830}, //13953 #CJK UNIFIED IDEOGRAPH + {0xD1E0, 0x71D5}, //13954 #CJK UNIFIED IDEOGRAPH + {0xD1E1, 0x538C}, //13955 #CJK UNIFIED IDEOGRAPH + {0xD1E2, 0x781A}, //13956 #CJK UNIFIED IDEOGRAPH + {0xD1E3, 0x96C1}, //13957 #CJK UNIFIED IDEOGRAPH + {0xD1E4, 0x5501}, //13958 #CJK UNIFIED IDEOGRAPH + {0xD1E5, 0x5F66}, //13959 #CJK UNIFIED IDEOGRAPH + {0xD1E6, 0x7130}, //13960 #CJK UNIFIED IDEOGRAPH + {0xD1E7, 0x5BB4}, //13961 #CJK UNIFIED IDEOGRAPH + {0xD1E8, 0x8C1A}, //13962 #CJK UNIFIED IDEOGRAPH + {0xD1E9, 0x9A8C}, //13963 #CJK UNIFIED IDEOGRAPH + {0xD1EA, 0x6B83}, //13964 #CJK UNIFIED IDEOGRAPH + {0xD1EB, 0x592E}, //13965 #CJK UNIFIED IDEOGRAPH + {0xD1EC, 0x9E2F}, //13966 #CJK UNIFIED IDEOGRAPH + {0xD1ED, 0x79E7}, //13967 #CJK UNIFIED IDEOGRAPH + {0xD1EE, 0x6768}, //13968 #CJK UNIFIED IDEOGRAPH + {0xD1EF, 0x626C}, //13969 #CJK UNIFIED IDEOGRAPH + {0xD1F0, 0x4F6F}, //13970 #CJK UNIFIED IDEOGRAPH + {0xD1F1, 0x75A1}, //13971 #CJK UNIFIED IDEOGRAPH + {0xD1F2, 0x7F8A}, //13972 #CJK UNIFIED IDEOGRAPH + {0xD1F3, 0x6D0B}, //13973 #CJK UNIFIED IDEOGRAPH + {0xD1F4, 0x9633}, //13974 #CJK UNIFIED IDEOGRAPH + {0xD1F5, 0x6C27}, //13975 #CJK UNIFIED IDEOGRAPH + {0xD1F6, 0x4EF0}, //13976 #CJK UNIFIED IDEOGRAPH + {0xD1F7, 0x75D2}, //13977 #CJK UNIFIED IDEOGRAPH + {0xD1F8, 0x517B}, //13978 #CJK UNIFIED IDEOGRAPH + {0xD1F9, 0x6837}, //13979 #CJK UNIFIED IDEOGRAPH + {0xD1FA, 0x6F3E}, //13980 #CJK UNIFIED IDEOGRAPH + {0xD1FB, 0x9080}, //13981 #CJK UNIFIED IDEOGRAPH + {0xD1FC, 0x8170}, //13982 #CJK UNIFIED IDEOGRAPH + {0xD1FD, 0x5996}, //13983 #CJK UNIFIED IDEOGRAPH + {0xD1FE, 0x7476}, //13984 #CJK UNIFIED IDEOGRAPH + {0xD240, 0x8938}, //13985 #CJK UNIFIED IDEOGRAPH + {0xD241, 0x8939}, //13986 #CJK UNIFIED IDEOGRAPH + {0xD242, 0x893A}, //13987 #CJK UNIFIED IDEOGRAPH + {0xD243, 0x893B}, //13988 #CJK UNIFIED IDEOGRAPH + {0xD244, 0x893C}, //13989 #CJK UNIFIED IDEOGRAPH + {0xD245, 0x893D}, //13990 #CJK UNIFIED IDEOGRAPH + {0xD246, 0x893E}, //13991 #CJK UNIFIED IDEOGRAPH + {0xD247, 0x893F}, //13992 #CJK UNIFIED IDEOGRAPH + {0xD248, 0x8940}, //13993 #CJK UNIFIED IDEOGRAPH + {0xD249, 0x8942}, //13994 #CJK UNIFIED IDEOGRAPH + {0xD24A, 0x8943}, //13995 #CJK UNIFIED IDEOGRAPH + {0xD24B, 0x8945}, //13996 #CJK UNIFIED IDEOGRAPH + {0xD24C, 0x8946}, //13997 #CJK UNIFIED IDEOGRAPH + {0xD24D, 0x8947}, //13998 #CJK UNIFIED IDEOGRAPH + {0xD24E, 0x8948}, //13999 #CJK UNIFIED IDEOGRAPH + {0xD24F, 0x8949}, //14000 #CJK UNIFIED IDEOGRAPH + {0xD250, 0x894A}, //14001 #CJK UNIFIED IDEOGRAPH + {0xD251, 0x894B}, //14002 #CJK UNIFIED IDEOGRAPH + {0xD252, 0x894C}, //14003 #CJK UNIFIED IDEOGRAPH + {0xD253, 0x894D}, //14004 #CJK UNIFIED IDEOGRAPH + {0xD254, 0x894E}, //14005 #CJK UNIFIED IDEOGRAPH + {0xD255, 0x894F}, //14006 #CJK UNIFIED IDEOGRAPH + {0xD256, 0x8950}, //14007 #CJK UNIFIED IDEOGRAPH + {0xD257, 0x8951}, //14008 #CJK UNIFIED IDEOGRAPH + {0xD258, 0x8952}, //14009 #CJK UNIFIED IDEOGRAPH + {0xD259, 0x8953}, //14010 #CJK UNIFIED IDEOGRAPH + {0xD25A, 0x8954}, //14011 #CJK UNIFIED IDEOGRAPH + {0xD25B, 0x8955}, //14012 #CJK UNIFIED IDEOGRAPH + {0xD25C, 0x8956}, //14013 #CJK UNIFIED IDEOGRAPH + {0xD25D, 0x8957}, //14014 #CJK UNIFIED IDEOGRAPH + {0xD25E, 0x8958}, //14015 #CJK UNIFIED IDEOGRAPH + {0xD25F, 0x8959}, //14016 #CJK UNIFIED IDEOGRAPH + {0xD260, 0x895A}, //14017 #CJK UNIFIED IDEOGRAPH + {0xD261, 0x895B}, //14018 #CJK UNIFIED IDEOGRAPH + {0xD262, 0x895C}, //14019 #CJK UNIFIED IDEOGRAPH + {0xD263, 0x895D}, //14020 #CJK UNIFIED IDEOGRAPH + {0xD264, 0x8960}, //14021 #CJK UNIFIED IDEOGRAPH + {0xD265, 0x8961}, //14022 #CJK UNIFIED IDEOGRAPH + {0xD266, 0x8962}, //14023 #CJK UNIFIED IDEOGRAPH + {0xD267, 0x8963}, //14024 #CJK UNIFIED IDEOGRAPH + {0xD268, 0x8964}, //14025 #CJK UNIFIED IDEOGRAPH + {0xD269, 0x8965}, //14026 #CJK UNIFIED IDEOGRAPH + {0xD26A, 0x8967}, //14027 #CJK UNIFIED IDEOGRAPH + {0xD26B, 0x8968}, //14028 #CJK UNIFIED IDEOGRAPH + {0xD26C, 0x8969}, //14029 #CJK UNIFIED IDEOGRAPH + {0xD26D, 0x896A}, //14030 #CJK UNIFIED IDEOGRAPH + {0xD26E, 0x896B}, //14031 #CJK UNIFIED IDEOGRAPH + {0xD26F, 0x896C}, //14032 #CJK UNIFIED IDEOGRAPH + {0xD270, 0x896D}, //14033 #CJK UNIFIED IDEOGRAPH + {0xD271, 0x896E}, //14034 #CJK UNIFIED IDEOGRAPH + {0xD272, 0x896F}, //14035 #CJK UNIFIED IDEOGRAPH + {0xD273, 0x8970}, //14036 #CJK UNIFIED IDEOGRAPH + {0xD274, 0x8971}, //14037 #CJK UNIFIED IDEOGRAPH + {0xD275, 0x8972}, //14038 #CJK UNIFIED IDEOGRAPH + {0xD276, 0x8973}, //14039 #CJK UNIFIED IDEOGRAPH + {0xD277, 0x8974}, //14040 #CJK UNIFIED IDEOGRAPH + {0xD278, 0x8975}, //14041 #CJK UNIFIED IDEOGRAPH + {0xD279, 0x8976}, //14042 #CJK UNIFIED IDEOGRAPH + {0xD27A, 0x8977}, //14043 #CJK UNIFIED IDEOGRAPH + {0xD27B, 0x8978}, //14044 #CJK UNIFIED IDEOGRAPH + {0xD27C, 0x8979}, //14045 #CJK UNIFIED IDEOGRAPH + {0xD27D, 0x897A}, //14046 #CJK UNIFIED IDEOGRAPH + {0xD27E, 0x897C}, //14047 #CJK UNIFIED IDEOGRAPH + {0xD280, 0x897D}, //14048 #CJK UNIFIED IDEOGRAPH + {0xD281, 0x897E}, //14049 #CJK UNIFIED IDEOGRAPH + {0xD282, 0x8980}, //14050 #CJK UNIFIED IDEOGRAPH + {0xD283, 0x8982}, //14051 #CJK UNIFIED IDEOGRAPH + {0xD284, 0x8984}, //14052 #CJK UNIFIED IDEOGRAPH + {0xD285, 0x8985}, //14053 #CJK UNIFIED IDEOGRAPH + {0xD286, 0x8987}, //14054 #CJK UNIFIED IDEOGRAPH + {0xD287, 0x8988}, //14055 #CJK UNIFIED IDEOGRAPH + {0xD288, 0x8989}, //14056 #CJK UNIFIED IDEOGRAPH + {0xD289, 0x898A}, //14057 #CJK UNIFIED IDEOGRAPH + {0xD28A, 0x898B}, //14058 #CJK UNIFIED IDEOGRAPH + {0xD28B, 0x898C}, //14059 #CJK UNIFIED IDEOGRAPH + {0xD28C, 0x898D}, //14060 #CJK UNIFIED IDEOGRAPH + {0xD28D, 0x898E}, //14061 #CJK UNIFIED IDEOGRAPH + {0xD28E, 0x898F}, //14062 #CJK UNIFIED IDEOGRAPH + {0xD28F, 0x8990}, //14063 #CJK UNIFIED IDEOGRAPH + {0xD290, 0x8991}, //14064 #CJK UNIFIED IDEOGRAPH + {0xD291, 0x8992}, //14065 #CJK UNIFIED IDEOGRAPH + {0xD292, 0x8993}, //14066 #CJK UNIFIED IDEOGRAPH + {0xD293, 0x8994}, //14067 #CJK UNIFIED IDEOGRAPH + {0xD294, 0x8995}, //14068 #CJK UNIFIED IDEOGRAPH + {0xD295, 0x8996}, //14069 #CJK UNIFIED IDEOGRAPH + {0xD296, 0x8997}, //14070 #CJK UNIFIED IDEOGRAPH + {0xD297, 0x8998}, //14071 #CJK UNIFIED IDEOGRAPH + {0xD298, 0x8999}, //14072 #CJK UNIFIED IDEOGRAPH + {0xD299, 0x899A}, //14073 #CJK UNIFIED IDEOGRAPH + {0xD29A, 0x899B}, //14074 #CJK UNIFIED IDEOGRAPH + {0xD29B, 0x899C}, //14075 #CJK UNIFIED IDEOGRAPH + {0xD29C, 0x899D}, //14076 #CJK UNIFIED IDEOGRAPH + {0xD29D, 0x899E}, //14077 #CJK UNIFIED IDEOGRAPH + {0xD29E, 0x899F}, //14078 #CJK UNIFIED IDEOGRAPH + {0xD29F, 0x89A0}, //14079 #CJK UNIFIED IDEOGRAPH + {0xD2A0, 0x89A1}, //14080 #CJK UNIFIED IDEOGRAPH + {0xD2A1, 0x6447}, //14081 #CJK UNIFIED IDEOGRAPH + {0xD2A2, 0x5C27}, //14082 #CJK UNIFIED IDEOGRAPH + {0xD2A3, 0x9065}, //14083 #CJK UNIFIED IDEOGRAPH + {0xD2A4, 0x7A91}, //14084 #CJK UNIFIED IDEOGRAPH + {0xD2A5, 0x8C23}, //14085 #CJK UNIFIED IDEOGRAPH + {0xD2A6, 0x59DA}, //14086 #CJK UNIFIED IDEOGRAPH + {0xD2A7, 0x54AC}, //14087 #CJK UNIFIED IDEOGRAPH + {0xD2A8, 0x8200}, //14088 #CJK UNIFIED IDEOGRAPH + {0xD2A9, 0x836F}, //14089 #CJK UNIFIED IDEOGRAPH + {0xD2AA, 0x8981}, //14090 #CJK UNIFIED IDEOGRAPH + {0xD2AB, 0x8000}, //14091 #CJK UNIFIED IDEOGRAPH + {0xD2AC, 0x6930}, //14092 #CJK UNIFIED IDEOGRAPH + {0xD2AD, 0x564E}, //14093 #CJK UNIFIED IDEOGRAPH + {0xD2AE, 0x8036}, //14094 #CJK UNIFIED IDEOGRAPH + {0xD2AF, 0x7237}, //14095 #CJK UNIFIED IDEOGRAPH + {0xD2B0, 0x91CE}, //14096 #CJK UNIFIED IDEOGRAPH + {0xD2B1, 0x51B6}, //14097 #CJK UNIFIED IDEOGRAPH + {0xD2B2, 0x4E5F}, //14098 #CJK UNIFIED IDEOGRAPH + {0xD2B3, 0x9875}, //14099 #CJK UNIFIED IDEOGRAPH + {0xD2B4, 0x6396}, //14100 #CJK UNIFIED IDEOGRAPH + {0xD2B5, 0x4E1A}, //14101 #CJK UNIFIED IDEOGRAPH + {0xD2B6, 0x53F6}, //14102 #CJK UNIFIED IDEOGRAPH + {0xD2B7, 0x66F3}, //14103 #CJK UNIFIED IDEOGRAPH + {0xD2B8, 0x814B}, //14104 #CJK UNIFIED IDEOGRAPH + {0xD2B9, 0x591C}, //14105 #CJK UNIFIED IDEOGRAPH + {0xD2BA, 0x6DB2}, //14106 #CJK UNIFIED IDEOGRAPH + {0xD2BB, 0x4E00}, //14107 #CJK UNIFIED IDEOGRAPH + {0xD2BC, 0x58F9}, //14108 #CJK UNIFIED IDEOGRAPH + {0xD2BD, 0x533B}, //14109 #CJK UNIFIED IDEOGRAPH + {0xD2BE, 0x63D6}, //14110 #CJK UNIFIED IDEOGRAPH + {0xD2BF, 0x94F1}, //14111 #CJK UNIFIED IDEOGRAPH + {0xD2C0, 0x4F9D}, //14112 #CJK UNIFIED IDEOGRAPH + {0xD2C1, 0x4F0A}, //14113 #CJK UNIFIED IDEOGRAPH + {0xD2C2, 0x8863}, //14114 #CJK UNIFIED IDEOGRAPH + {0xD2C3, 0x9890}, //14115 #CJK UNIFIED IDEOGRAPH + {0xD2C4, 0x5937}, //14116 #CJK UNIFIED IDEOGRAPH + {0xD2C5, 0x9057}, //14117 #CJK UNIFIED IDEOGRAPH + {0xD2C6, 0x79FB}, //14118 #CJK UNIFIED IDEOGRAPH + {0xD2C7, 0x4EEA}, //14119 #CJK UNIFIED IDEOGRAPH + {0xD2C8, 0x80F0}, //14120 #CJK UNIFIED IDEOGRAPH + {0xD2C9, 0x7591}, //14121 #CJK UNIFIED IDEOGRAPH + {0xD2CA, 0x6C82}, //14122 #CJK UNIFIED IDEOGRAPH + {0xD2CB, 0x5B9C}, //14123 #CJK UNIFIED IDEOGRAPH + {0xD2CC, 0x59E8}, //14124 #CJK UNIFIED IDEOGRAPH + {0xD2CD, 0x5F5D}, //14125 #CJK UNIFIED IDEOGRAPH + {0xD2CE, 0x6905}, //14126 #CJK UNIFIED IDEOGRAPH + {0xD2CF, 0x8681}, //14127 #CJK UNIFIED IDEOGRAPH + {0xD2D0, 0x501A}, //14128 #CJK UNIFIED IDEOGRAPH + {0xD2D1, 0x5DF2}, //14129 #CJK UNIFIED IDEOGRAPH + {0xD2D2, 0x4E59}, //14130 #CJK UNIFIED IDEOGRAPH + {0xD2D3, 0x77E3}, //14131 #CJK UNIFIED IDEOGRAPH + {0xD2D4, 0x4EE5}, //14132 #CJK UNIFIED IDEOGRAPH + {0xD2D5, 0x827A}, //14133 #CJK UNIFIED IDEOGRAPH + {0xD2D6, 0x6291}, //14134 #CJK UNIFIED IDEOGRAPH + {0xD2D7, 0x6613}, //14135 #CJK UNIFIED IDEOGRAPH + {0xD2D8, 0x9091}, //14136 #CJK UNIFIED IDEOGRAPH + {0xD2D9, 0x5C79}, //14137 #CJK UNIFIED IDEOGRAPH + {0xD2DA, 0x4EBF}, //14138 #CJK UNIFIED IDEOGRAPH + {0xD2DB, 0x5F79}, //14139 #CJK UNIFIED IDEOGRAPH + {0xD2DC, 0x81C6}, //14140 #CJK UNIFIED IDEOGRAPH + {0xD2DD, 0x9038}, //14141 #CJK UNIFIED IDEOGRAPH + {0xD2DE, 0x8084}, //14142 #CJK UNIFIED IDEOGRAPH + {0xD2DF, 0x75AB}, //14143 #CJK UNIFIED IDEOGRAPH + {0xD2E0, 0x4EA6}, //14144 #CJK UNIFIED IDEOGRAPH + {0xD2E1, 0x88D4}, //14145 #CJK UNIFIED IDEOGRAPH + {0xD2E2, 0x610F}, //14146 #CJK UNIFIED IDEOGRAPH + {0xD2E3, 0x6BC5}, //14147 #CJK UNIFIED IDEOGRAPH + {0xD2E4, 0x5FC6}, //14148 #CJK UNIFIED IDEOGRAPH + {0xD2E5, 0x4E49}, //14149 #CJK UNIFIED IDEOGRAPH + {0xD2E6, 0x76CA}, //14150 #CJK UNIFIED IDEOGRAPH + {0xD2E7, 0x6EA2}, //14151 #CJK UNIFIED IDEOGRAPH + {0xD2E8, 0x8BE3}, //14152 #CJK UNIFIED IDEOGRAPH + {0xD2E9, 0x8BAE}, //14153 #CJK UNIFIED IDEOGRAPH + {0xD2EA, 0x8C0A}, //14154 #CJK UNIFIED IDEOGRAPH + {0xD2EB, 0x8BD1}, //14155 #CJK UNIFIED IDEOGRAPH + {0xD2EC, 0x5F02}, //14156 #CJK UNIFIED IDEOGRAPH + {0xD2ED, 0x7FFC}, //14157 #CJK UNIFIED IDEOGRAPH + {0xD2EE, 0x7FCC}, //14158 #CJK UNIFIED IDEOGRAPH + {0xD2EF, 0x7ECE}, //14159 #CJK UNIFIED IDEOGRAPH + {0xD2F0, 0x8335}, //14160 #CJK UNIFIED IDEOGRAPH + {0xD2F1, 0x836B}, //14161 #CJK UNIFIED IDEOGRAPH + {0xD2F2, 0x56E0}, //14162 #CJK UNIFIED IDEOGRAPH + {0xD2F3, 0x6BB7}, //14163 #CJK UNIFIED IDEOGRAPH + {0xD2F4, 0x97F3}, //14164 #CJK UNIFIED IDEOGRAPH + {0xD2F5, 0x9634}, //14165 #CJK UNIFIED IDEOGRAPH + {0xD2F6, 0x59FB}, //14166 #CJK UNIFIED IDEOGRAPH + {0xD2F7, 0x541F}, //14167 #CJK UNIFIED IDEOGRAPH + {0xD2F8, 0x94F6}, //14168 #CJK UNIFIED IDEOGRAPH + {0xD2F9, 0x6DEB}, //14169 #CJK UNIFIED IDEOGRAPH + {0xD2FA, 0x5BC5}, //14170 #CJK UNIFIED IDEOGRAPH + {0xD2FB, 0x996E}, //14171 #CJK UNIFIED IDEOGRAPH + {0xD2FC, 0x5C39}, //14172 #CJK UNIFIED IDEOGRAPH + {0xD2FD, 0x5F15}, //14173 #CJK UNIFIED IDEOGRAPH + {0xD2FE, 0x9690}, //14174 #CJK UNIFIED IDEOGRAPH + {0xD340, 0x89A2}, //14175 #CJK UNIFIED IDEOGRAPH + {0xD341, 0x89A3}, //14176 #CJK UNIFIED IDEOGRAPH + {0xD342, 0x89A4}, //14177 #CJK UNIFIED IDEOGRAPH + {0xD343, 0x89A5}, //14178 #CJK UNIFIED IDEOGRAPH + {0xD344, 0x89A6}, //14179 #CJK UNIFIED IDEOGRAPH + {0xD345, 0x89A7}, //14180 #CJK UNIFIED IDEOGRAPH + {0xD346, 0x89A8}, //14181 #CJK UNIFIED IDEOGRAPH + {0xD347, 0x89A9}, //14182 #CJK UNIFIED IDEOGRAPH + {0xD348, 0x89AA}, //14183 #CJK UNIFIED IDEOGRAPH + {0xD349, 0x89AB}, //14184 #CJK UNIFIED IDEOGRAPH + {0xD34A, 0x89AC}, //14185 #CJK UNIFIED IDEOGRAPH + {0xD34B, 0x89AD}, //14186 #CJK UNIFIED IDEOGRAPH + {0xD34C, 0x89AE}, //14187 #CJK UNIFIED IDEOGRAPH + {0xD34D, 0x89AF}, //14188 #CJK UNIFIED IDEOGRAPH + {0xD34E, 0x89B0}, //14189 #CJK UNIFIED IDEOGRAPH + {0xD34F, 0x89B1}, //14190 #CJK UNIFIED IDEOGRAPH + {0xD350, 0x89B2}, //14191 #CJK UNIFIED IDEOGRAPH + {0xD351, 0x89B3}, //14192 #CJK UNIFIED IDEOGRAPH + {0xD352, 0x89B4}, //14193 #CJK UNIFIED IDEOGRAPH + {0xD353, 0x89B5}, //14194 #CJK UNIFIED IDEOGRAPH + {0xD354, 0x89B6}, //14195 #CJK UNIFIED IDEOGRAPH + {0xD355, 0x89B7}, //14196 #CJK UNIFIED IDEOGRAPH + {0xD356, 0x89B8}, //14197 #CJK UNIFIED IDEOGRAPH + {0xD357, 0x89B9}, //14198 #CJK UNIFIED IDEOGRAPH + {0xD358, 0x89BA}, //14199 #CJK UNIFIED IDEOGRAPH + {0xD359, 0x89BB}, //14200 #CJK UNIFIED IDEOGRAPH + {0xD35A, 0x89BC}, //14201 #CJK UNIFIED IDEOGRAPH + {0xD35B, 0x89BD}, //14202 #CJK UNIFIED IDEOGRAPH + {0xD35C, 0x89BE}, //14203 #CJK UNIFIED IDEOGRAPH + {0xD35D, 0x89BF}, //14204 #CJK UNIFIED IDEOGRAPH + {0xD35E, 0x89C0}, //14205 #CJK UNIFIED IDEOGRAPH + {0xD35F, 0x89C3}, //14206 #CJK UNIFIED IDEOGRAPH + {0xD360, 0x89CD}, //14207 #CJK UNIFIED IDEOGRAPH + {0xD361, 0x89D3}, //14208 #CJK UNIFIED IDEOGRAPH + {0xD362, 0x89D4}, //14209 #CJK UNIFIED IDEOGRAPH + {0xD363, 0x89D5}, //14210 #CJK UNIFIED IDEOGRAPH + {0xD364, 0x89D7}, //14211 #CJK UNIFIED IDEOGRAPH + {0xD365, 0x89D8}, //14212 #CJK UNIFIED IDEOGRAPH + {0xD366, 0x89D9}, //14213 #CJK UNIFIED IDEOGRAPH + {0xD367, 0x89DB}, //14214 #CJK UNIFIED IDEOGRAPH + {0xD368, 0x89DD}, //14215 #CJK UNIFIED IDEOGRAPH + {0xD369, 0x89DF}, //14216 #CJK UNIFIED IDEOGRAPH + {0xD36A, 0x89E0}, //14217 #CJK UNIFIED IDEOGRAPH + {0xD36B, 0x89E1}, //14218 #CJK UNIFIED IDEOGRAPH + {0xD36C, 0x89E2}, //14219 #CJK UNIFIED IDEOGRAPH + {0xD36D, 0x89E4}, //14220 #CJK UNIFIED IDEOGRAPH + {0xD36E, 0x89E7}, //14221 #CJK UNIFIED IDEOGRAPH + {0xD36F, 0x89E8}, //14222 #CJK UNIFIED IDEOGRAPH + {0xD370, 0x89E9}, //14223 #CJK UNIFIED IDEOGRAPH + {0xD371, 0x89EA}, //14224 #CJK UNIFIED IDEOGRAPH + {0xD372, 0x89EC}, //14225 #CJK UNIFIED IDEOGRAPH + {0xD373, 0x89ED}, //14226 #CJK UNIFIED IDEOGRAPH + {0xD374, 0x89EE}, //14227 #CJK UNIFIED IDEOGRAPH + {0xD375, 0x89F0}, //14228 #CJK UNIFIED IDEOGRAPH + {0xD376, 0x89F1}, //14229 #CJK UNIFIED IDEOGRAPH + {0xD377, 0x89F2}, //14230 #CJK UNIFIED IDEOGRAPH + {0xD378, 0x89F4}, //14231 #CJK UNIFIED IDEOGRAPH + {0xD379, 0x89F5}, //14232 #CJK UNIFIED IDEOGRAPH + {0xD37A, 0x89F6}, //14233 #CJK UNIFIED IDEOGRAPH + {0xD37B, 0x89F7}, //14234 #CJK UNIFIED IDEOGRAPH + {0xD37C, 0x89F8}, //14235 #CJK UNIFIED IDEOGRAPH + {0xD37D, 0x89F9}, //14236 #CJK UNIFIED IDEOGRAPH + {0xD37E, 0x89FA}, //14237 #CJK UNIFIED IDEOGRAPH + {0xD380, 0x89FB}, //14238 #CJK UNIFIED IDEOGRAPH + {0xD381, 0x89FC}, //14239 #CJK UNIFIED IDEOGRAPH + {0xD382, 0x89FD}, //14240 #CJK UNIFIED IDEOGRAPH + {0xD383, 0x89FE}, //14241 #CJK UNIFIED IDEOGRAPH + {0xD384, 0x89FF}, //14242 #CJK UNIFIED IDEOGRAPH + {0xD385, 0x8A01}, //14243 #CJK UNIFIED IDEOGRAPH + {0xD386, 0x8A02}, //14244 #CJK UNIFIED IDEOGRAPH + {0xD387, 0x8A03}, //14245 #CJK UNIFIED IDEOGRAPH + {0xD388, 0x8A04}, //14246 #CJK UNIFIED IDEOGRAPH + {0xD389, 0x8A05}, //14247 #CJK UNIFIED IDEOGRAPH + {0xD38A, 0x8A06}, //14248 #CJK UNIFIED IDEOGRAPH + {0xD38B, 0x8A08}, //14249 #CJK UNIFIED IDEOGRAPH + {0xD38C, 0x8A09}, //14250 #CJK UNIFIED IDEOGRAPH + {0xD38D, 0x8A0A}, //14251 #CJK UNIFIED IDEOGRAPH + {0xD38E, 0x8A0B}, //14252 #CJK UNIFIED IDEOGRAPH + {0xD38F, 0x8A0C}, //14253 #CJK UNIFIED IDEOGRAPH + {0xD390, 0x8A0D}, //14254 #CJK UNIFIED IDEOGRAPH + {0xD391, 0x8A0E}, //14255 #CJK UNIFIED IDEOGRAPH + {0xD392, 0x8A0F}, //14256 #CJK UNIFIED IDEOGRAPH + {0xD393, 0x8A10}, //14257 #CJK UNIFIED IDEOGRAPH + {0xD394, 0x8A11}, //14258 #CJK UNIFIED IDEOGRAPH + {0xD395, 0x8A12}, //14259 #CJK UNIFIED IDEOGRAPH + {0xD396, 0x8A13}, //14260 #CJK UNIFIED IDEOGRAPH + {0xD397, 0x8A14}, //14261 #CJK UNIFIED IDEOGRAPH + {0xD398, 0x8A15}, //14262 #CJK UNIFIED IDEOGRAPH + {0xD399, 0x8A16}, //14263 #CJK UNIFIED IDEOGRAPH + {0xD39A, 0x8A17}, //14264 #CJK UNIFIED IDEOGRAPH + {0xD39B, 0x8A18}, //14265 #CJK UNIFIED IDEOGRAPH + {0xD39C, 0x8A19}, //14266 #CJK UNIFIED IDEOGRAPH + {0xD39D, 0x8A1A}, //14267 #CJK UNIFIED IDEOGRAPH + {0xD39E, 0x8A1B}, //14268 #CJK UNIFIED IDEOGRAPH + {0xD39F, 0x8A1C}, //14269 #CJK UNIFIED IDEOGRAPH + {0xD3A0, 0x8A1D}, //14270 #CJK UNIFIED IDEOGRAPH + {0xD3A1, 0x5370}, //14271 #CJK UNIFIED IDEOGRAPH + {0xD3A2, 0x82F1}, //14272 #CJK UNIFIED IDEOGRAPH + {0xD3A3, 0x6A31}, //14273 #CJK UNIFIED IDEOGRAPH + {0xD3A4, 0x5A74}, //14274 #CJK UNIFIED IDEOGRAPH + {0xD3A5, 0x9E70}, //14275 #CJK UNIFIED IDEOGRAPH + {0xD3A6, 0x5E94}, //14276 #CJK UNIFIED IDEOGRAPH + {0xD3A7, 0x7F28}, //14277 #CJK UNIFIED IDEOGRAPH + {0xD3A8, 0x83B9}, //14278 #CJK UNIFIED IDEOGRAPH + {0xD3A9, 0x8424}, //14279 #CJK UNIFIED IDEOGRAPH + {0xD3AA, 0x8425}, //14280 #CJK UNIFIED IDEOGRAPH + {0xD3AB, 0x8367}, //14281 #CJK UNIFIED IDEOGRAPH + {0xD3AC, 0x8747}, //14282 #CJK UNIFIED IDEOGRAPH + {0xD3AD, 0x8FCE}, //14283 #CJK UNIFIED IDEOGRAPH + {0xD3AE, 0x8D62}, //14284 #CJK UNIFIED IDEOGRAPH + {0xD3AF, 0x76C8}, //14285 #CJK UNIFIED IDEOGRAPH + {0xD3B0, 0x5F71}, //14286 #CJK UNIFIED IDEOGRAPH + {0xD3B1, 0x9896}, //14287 #CJK UNIFIED IDEOGRAPH + {0xD3B2, 0x786C}, //14288 #CJK UNIFIED IDEOGRAPH + {0xD3B3, 0x6620}, //14289 #CJK UNIFIED IDEOGRAPH + {0xD3B4, 0x54DF}, //14290 #CJK UNIFIED IDEOGRAPH + {0xD3B5, 0x62E5}, //14291 #CJK UNIFIED IDEOGRAPH + {0xD3B6, 0x4F63}, //14292 #CJK UNIFIED IDEOGRAPH + {0xD3B7, 0x81C3}, //14293 #CJK UNIFIED IDEOGRAPH + {0xD3B8, 0x75C8}, //14294 #CJK UNIFIED IDEOGRAPH + {0xD3B9, 0x5EB8}, //14295 #CJK UNIFIED IDEOGRAPH + {0xD3BA, 0x96CD}, //14296 #CJK UNIFIED IDEOGRAPH + {0xD3BB, 0x8E0A}, //14297 #CJK UNIFIED IDEOGRAPH + {0xD3BC, 0x86F9}, //14298 #CJK UNIFIED IDEOGRAPH + {0xD3BD, 0x548F}, //14299 #CJK UNIFIED IDEOGRAPH + {0xD3BE, 0x6CF3}, //14300 #CJK UNIFIED IDEOGRAPH + {0xD3BF, 0x6D8C}, //14301 #CJK UNIFIED IDEOGRAPH + {0xD3C0, 0x6C38}, //14302 #CJK UNIFIED IDEOGRAPH + {0xD3C1, 0x607F}, //14303 #CJK UNIFIED IDEOGRAPH + {0xD3C2, 0x52C7}, //14304 #CJK UNIFIED IDEOGRAPH + {0xD3C3, 0x7528}, //14305 #CJK UNIFIED IDEOGRAPH + {0xD3C4, 0x5E7D}, //14306 #CJK UNIFIED IDEOGRAPH + {0xD3C5, 0x4F18}, //14307 #CJK UNIFIED IDEOGRAPH + {0xD3C6, 0x60A0}, //14308 #CJK UNIFIED IDEOGRAPH + {0xD3C7, 0x5FE7}, //14309 #CJK UNIFIED IDEOGRAPH + {0xD3C8, 0x5C24}, //14310 #CJK UNIFIED IDEOGRAPH + {0xD3C9, 0x7531}, //14311 #CJK UNIFIED IDEOGRAPH + {0xD3CA, 0x90AE}, //14312 #CJK UNIFIED IDEOGRAPH + {0xD3CB, 0x94C0}, //14313 #CJK UNIFIED IDEOGRAPH + {0xD3CC, 0x72B9}, //14314 #CJK UNIFIED IDEOGRAPH + {0xD3CD, 0x6CB9}, //14315 #CJK UNIFIED IDEOGRAPH + {0xD3CE, 0x6E38}, //14316 #CJK UNIFIED IDEOGRAPH + {0xD3CF, 0x9149}, //14317 #CJK UNIFIED IDEOGRAPH + {0xD3D0, 0x6709}, //14318 #CJK UNIFIED IDEOGRAPH + {0xD3D1, 0x53CB}, //14319 #CJK UNIFIED IDEOGRAPH + {0xD3D2, 0x53F3}, //14320 #CJK UNIFIED IDEOGRAPH + {0xD3D3, 0x4F51}, //14321 #CJK UNIFIED IDEOGRAPH + {0xD3D4, 0x91C9}, //14322 #CJK UNIFIED IDEOGRAPH + {0xD3D5, 0x8BF1}, //14323 #CJK UNIFIED IDEOGRAPH + {0xD3D6, 0x53C8}, //14324 #CJK UNIFIED IDEOGRAPH + {0xD3D7, 0x5E7C}, //14325 #CJK UNIFIED IDEOGRAPH + {0xD3D8, 0x8FC2}, //14326 #CJK UNIFIED IDEOGRAPH + {0xD3D9, 0x6DE4}, //14327 #CJK UNIFIED IDEOGRAPH + {0xD3DA, 0x4E8E}, //14328 #CJK UNIFIED IDEOGRAPH + {0xD3DB, 0x76C2}, //14329 #CJK UNIFIED IDEOGRAPH + {0xD3DC, 0x6986}, //14330 #CJK UNIFIED IDEOGRAPH + {0xD3DD, 0x865E}, //14331 #CJK UNIFIED IDEOGRAPH + {0xD3DE, 0x611A}, //14332 #CJK UNIFIED IDEOGRAPH + {0xD3DF, 0x8206}, //14333 #CJK UNIFIED IDEOGRAPH + {0xD3E0, 0x4F59}, //14334 #CJK UNIFIED IDEOGRAPH + {0xD3E1, 0x4FDE}, //14335 #CJK UNIFIED IDEOGRAPH + {0xD3E2, 0x903E}, //14336 #CJK UNIFIED IDEOGRAPH + {0xD3E3, 0x9C7C}, //14337 #CJK UNIFIED IDEOGRAPH + {0xD3E4, 0x6109}, //14338 #CJK UNIFIED IDEOGRAPH + {0xD3E5, 0x6E1D}, //14339 #CJK UNIFIED IDEOGRAPH + {0xD3E6, 0x6E14}, //14340 #CJK UNIFIED IDEOGRAPH + {0xD3E7, 0x9685}, //14341 #CJK UNIFIED IDEOGRAPH + {0xD3E8, 0x4E88}, //14342 #CJK UNIFIED IDEOGRAPH + {0xD3E9, 0x5A31}, //14343 #CJK UNIFIED IDEOGRAPH + {0xD3EA, 0x96E8}, //14344 #CJK UNIFIED IDEOGRAPH + {0xD3EB, 0x4E0E}, //14345 #CJK UNIFIED IDEOGRAPH + {0xD3EC, 0x5C7F}, //14346 #CJK UNIFIED IDEOGRAPH + {0xD3ED, 0x79B9}, //14347 #CJK UNIFIED IDEOGRAPH + {0xD3EE, 0x5B87}, //14348 #CJK UNIFIED IDEOGRAPH + {0xD3EF, 0x8BED}, //14349 #CJK UNIFIED IDEOGRAPH + {0xD3F0, 0x7FBD}, //14350 #CJK UNIFIED IDEOGRAPH + {0xD3F1, 0x7389}, //14351 #CJK UNIFIED IDEOGRAPH + {0xD3F2, 0x57DF}, //14352 #CJK UNIFIED IDEOGRAPH + {0xD3F3, 0x828B}, //14353 #CJK UNIFIED IDEOGRAPH + {0xD3F4, 0x90C1}, //14354 #CJK UNIFIED IDEOGRAPH + {0xD3F5, 0x5401}, //14355 #CJK UNIFIED IDEOGRAPH + {0xD3F6, 0x9047}, //14356 #CJK UNIFIED IDEOGRAPH + {0xD3F7, 0x55BB}, //14357 #CJK UNIFIED IDEOGRAPH + {0xD3F8, 0x5CEA}, //14358 #CJK UNIFIED IDEOGRAPH + {0xD3F9, 0x5FA1}, //14359 #CJK UNIFIED IDEOGRAPH + {0xD3FA, 0x6108}, //14360 #CJK UNIFIED IDEOGRAPH + {0xD3FB, 0x6B32}, //14361 #CJK UNIFIED IDEOGRAPH + {0xD3FC, 0x72F1}, //14362 #CJK UNIFIED IDEOGRAPH + {0xD3FD, 0x80B2}, //14363 #CJK UNIFIED IDEOGRAPH + {0xD3FE, 0x8A89}, //14364 #CJK UNIFIED IDEOGRAPH + {0xD440, 0x8A1E}, //14365 #CJK UNIFIED IDEOGRAPH + {0xD441, 0x8A1F}, //14366 #CJK UNIFIED IDEOGRAPH + {0xD442, 0x8A20}, //14367 #CJK UNIFIED IDEOGRAPH + {0xD443, 0x8A21}, //14368 #CJK UNIFIED IDEOGRAPH + {0xD444, 0x8A22}, //14369 #CJK UNIFIED IDEOGRAPH + {0xD445, 0x8A23}, //14370 #CJK UNIFIED IDEOGRAPH + {0xD446, 0x8A24}, //14371 #CJK UNIFIED IDEOGRAPH + {0xD447, 0x8A25}, //14372 #CJK UNIFIED IDEOGRAPH + {0xD448, 0x8A26}, //14373 #CJK UNIFIED IDEOGRAPH + {0xD449, 0x8A27}, //14374 #CJK UNIFIED IDEOGRAPH + {0xD44A, 0x8A28}, //14375 #CJK UNIFIED IDEOGRAPH + {0xD44B, 0x8A29}, //14376 #CJK UNIFIED IDEOGRAPH + {0xD44C, 0x8A2A}, //14377 #CJK UNIFIED IDEOGRAPH + {0xD44D, 0x8A2B}, //14378 #CJK UNIFIED IDEOGRAPH + {0xD44E, 0x8A2C}, //14379 #CJK UNIFIED IDEOGRAPH + {0xD44F, 0x8A2D}, //14380 #CJK UNIFIED IDEOGRAPH + {0xD450, 0x8A2E}, //14381 #CJK UNIFIED IDEOGRAPH + {0xD451, 0x8A2F}, //14382 #CJK UNIFIED IDEOGRAPH + {0xD452, 0x8A30}, //14383 #CJK UNIFIED IDEOGRAPH + {0xD453, 0x8A31}, //14384 #CJK UNIFIED IDEOGRAPH + {0xD454, 0x8A32}, //14385 #CJK UNIFIED IDEOGRAPH + {0xD455, 0x8A33}, //14386 #CJK UNIFIED IDEOGRAPH + {0xD456, 0x8A34}, //14387 #CJK UNIFIED IDEOGRAPH + {0xD457, 0x8A35}, //14388 #CJK UNIFIED IDEOGRAPH + {0xD458, 0x8A36}, //14389 #CJK UNIFIED IDEOGRAPH + {0xD459, 0x8A37}, //14390 #CJK UNIFIED IDEOGRAPH + {0xD45A, 0x8A38}, //14391 #CJK UNIFIED IDEOGRAPH + {0xD45B, 0x8A39}, //14392 #CJK UNIFIED IDEOGRAPH + {0xD45C, 0x8A3A}, //14393 #CJK UNIFIED IDEOGRAPH + {0xD45D, 0x8A3B}, //14394 #CJK UNIFIED IDEOGRAPH + {0xD45E, 0x8A3C}, //14395 #CJK UNIFIED IDEOGRAPH + {0xD45F, 0x8A3D}, //14396 #CJK UNIFIED IDEOGRAPH + {0xD460, 0x8A3F}, //14397 #CJK UNIFIED IDEOGRAPH + {0xD461, 0x8A40}, //14398 #CJK UNIFIED IDEOGRAPH + {0xD462, 0x8A41}, //14399 #CJK UNIFIED IDEOGRAPH + {0xD463, 0x8A42}, //14400 #CJK UNIFIED IDEOGRAPH + {0xD464, 0x8A43}, //14401 #CJK UNIFIED IDEOGRAPH + {0xD465, 0x8A44}, //14402 #CJK UNIFIED IDEOGRAPH + {0xD466, 0x8A45}, //14403 #CJK UNIFIED IDEOGRAPH + {0xD467, 0x8A46}, //14404 #CJK UNIFIED IDEOGRAPH + {0xD468, 0x8A47}, //14405 #CJK UNIFIED IDEOGRAPH + {0xD469, 0x8A49}, //14406 #CJK UNIFIED IDEOGRAPH + {0xD46A, 0x8A4A}, //14407 #CJK UNIFIED IDEOGRAPH + {0xD46B, 0x8A4B}, //14408 #CJK UNIFIED IDEOGRAPH + {0xD46C, 0x8A4C}, //14409 #CJK UNIFIED IDEOGRAPH + {0xD46D, 0x8A4D}, //14410 #CJK UNIFIED IDEOGRAPH + {0xD46E, 0x8A4E}, //14411 #CJK UNIFIED IDEOGRAPH + {0xD46F, 0x8A4F}, //14412 #CJK UNIFIED IDEOGRAPH + {0xD470, 0x8A50}, //14413 #CJK UNIFIED IDEOGRAPH + {0xD471, 0x8A51}, //14414 #CJK UNIFIED IDEOGRAPH + {0xD472, 0x8A52}, //14415 #CJK UNIFIED IDEOGRAPH + {0xD473, 0x8A53}, //14416 #CJK UNIFIED IDEOGRAPH + {0xD474, 0x8A54}, //14417 #CJK UNIFIED IDEOGRAPH + {0xD475, 0x8A55}, //14418 #CJK UNIFIED IDEOGRAPH + {0xD476, 0x8A56}, //14419 #CJK UNIFIED IDEOGRAPH + {0xD477, 0x8A57}, //14420 #CJK UNIFIED IDEOGRAPH + {0xD478, 0x8A58}, //14421 #CJK UNIFIED IDEOGRAPH + {0xD479, 0x8A59}, //14422 #CJK UNIFIED IDEOGRAPH + {0xD47A, 0x8A5A}, //14423 #CJK UNIFIED IDEOGRAPH + {0xD47B, 0x8A5B}, //14424 #CJK UNIFIED IDEOGRAPH + {0xD47C, 0x8A5C}, //14425 #CJK UNIFIED IDEOGRAPH + {0xD47D, 0x8A5D}, //14426 #CJK UNIFIED IDEOGRAPH + {0xD47E, 0x8A5E}, //14427 #CJK UNIFIED IDEOGRAPH + {0xD480, 0x8A5F}, //14428 #CJK UNIFIED IDEOGRAPH + {0xD481, 0x8A60}, //14429 #CJK UNIFIED IDEOGRAPH + {0xD482, 0x8A61}, //14430 #CJK UNIFIED IDEOGRAPH + {0xD483, 0x8A62}, //14431 #CJK UNIFIED IDEOGRAPH + {0xD484, 0x8A63}, //14432 #CJK UNIFIED IDEOGRAPH + {0xD485, 0x8A64}, //14433 #CJK UNIFIED IDEOGRAPH + {0xD486, 0x8A65}, //14434 #CJK UNIFIED IDEOGRAPH + {0xD487, 0x8A66}, //14435 #CJK UNIFIED IDEOGRAPH + {0xD488, 0x8A67}, //14436 #CJK UNIFIED IDEOGRAPH + {0xD489, 0x8A68}, //14437 #CJK UNIFIED IDEOGRAPH + {0xD48A, 0x8A69}, //14438 #CJK UNIFIED IDEOGRAPH + {0xD48B, 0x8A6A}, //14439 #CJK UNIFIED IDEOGRAPH + {0xD48C, 0x8A6B}, //14440 #CJK UNIFIED IDEOGRAPH + {0xD48D, 0x8A6C}, //14441 #CJK UNIFIED IDEOGRAPH + {0xD48E, 0x8A6D}, //14442 #CJK UNIFIED IDEOGRAPH + {0xD48F, 0x8A6E}, //14443 #CJK UNIFIED IDEOGRAPH + {0xD490, 0x8A6F}, //14444 #CJK UNIFIED IDEOGRAPH + {0xD491, 0x8A70}, //14445 #CJK UNIFIED IDEOGRAPH + {0xD492, 0x8A71}, //14446 #CJK UNIFIED IDEOGRAPH + {0xD493, 0x8A72}, //14447 #CJK UNIFIED IDEOGRAPH + {0xD494, 0x8A73}, //14448 #CJK UNIFIED IDEOGRAPH + {0xD495, 0x8A74}, //14449 #CJK UNIFIED IDEOGRAPH + {0xD496, 0x8A75}, //14450 #CJK UNIFIED IDEOGRAPH + {0xD497, 0x8A76}, //14451 #CJK UNIFIED IDEOGRAPH + {0xD498, 0x8A77}, //14452 #CJK UNIFIED IDEOGRAPH + {0xD499, 0x8A78}, //14453 #CJK UNIFIED IDEOGRAPH + {0xD49A, 0x8A7A}, //14454 #CJK UNIFIED IDEOGRAPH + {0xD49B, 0x8A7B}, //14455 #CJK UNIFIED IDEOGRAPH + {0xD49C, 0x8A7C}, //14456 #CJK UNIFIED IDEOGRAPH + {0xD49D, 0x8A7D}, //14457 #CJK UNIFIED IDEOGRAPH + {0xD49E, 0x8A7E}, //14458 #CJK UNIFIED IDEOGRAPH + {0xD49F, 0x8A7F}, //14459 #CJK UNIFIED IDEOGRAPH + {0xD4A0, 0x8A80}, //14460 #CJK UNIFIED IDEOGRAPH + {0xD4A1, 0x6D74}, //14461 #CJK UNIFIED IDEOGRAPH + {0xD4A2, 0x5BD3}, //14462 #CJK UNIFIED IDEOGRAPH + {0xD4A3, 0x88D5}, //14463 #CJK UNIFIED IDEOGRAPH + {0xD4A4, 0x9884}, //14464 #CJK UNIFIED IDEOGRAPH + {0xD4A5, 0x8C6B}, //14465 #CJK UNIFIED IDEOGRAPH + {0xD4A6, 0x9A6D}, //14466 #CJK UNIFIED IDEOGRAPH + {0xD4A7, 0x9E33}, //14467 #CJK UNIFIED IDEOGRAPH + {0xD4A8, 0x6E0A}, //14468 #CJK UNIFIED IDEOGRAPH + {0xD4A9, 0x51A4}, //14469 #CJK UNIFIED IDEOGRAPH + {0xD4AA, 0x5143}, //14470 #CJK UNIFIED IDEOGRAPH + {0xD4AB, 0x57A3}, //14471 #CJK UNIFIED IDEOGRAPH + {0xD4AC, 0x8881}, //14472 #CJK UNIFIED IDEOGRAPH + {0xD4AD, 0x539F}, //14473 #CJK UNIFIED IDEOGRAPH + {0xD4AE, 0x63F4}, //14474 #CJK UNIFIED IDEOGRAPH + {0xD4AF, 0x8F95}, //14475 #CJK UNIFIED IDEOGRAPH + {0xD4B0, 0x56ED}, //14476 #CJK UNIFIED IDEOGRAPH + {0xD4B1, 0x5458}, //14477 #CJK UNIFIED IDEOGRAPH + {0xD4B2, 0x5706}, //14478 #CJK UNIFIED IDEOGRAPH + {0xD4B3, 0x733F}, //14479 #CJK UNIFIED IDEOGRAPH + {0xD4B4, 0x6E90}, //14480 #CJK UNIFIED IDEOGRAPH + {0xD4B5, 0x7F18}, //14481 #CJK UNIFIED IDEOGRAPH + {0xD4B6, 0x8FDC}, //14482 #CJK UNIFIED IDEOGRAPH + {0xD4B7, 0x82D1}, //14483 #CJK UNIFIED IDEOGRAPH + {0xD4B8, 0x613F}, //14484 #CJK UNIFIED IDEOGRAPH + {0xD4B9, 0x6028}, //14485 #CJK UNIFIED IDEOGRAPH + {0xD4BA, 0x9662}, //14486 #CJK UNIFIED IDEOGRAPH + {0xD4BB, 0x66F0}, //14487 #CJK UNIFIED IDEOGRAPH + {0xD4BC, 0x7EA6}, //14488 #CJK UNIFIED IDEOGRAPH + {0xD4BD, 0x8D8A}, //14489 #CJK UNIFIED IDEOGRAPH + {0xD4BE, 0x8DC3}, //14490 #CJK UNIFIED IDEOGRAPH + {0xD4BF, 0x94A5}, //14491 #CJK UNIFIED IDEOGRAPH + {0xD4C0, 0x5CB3}, //14492 #CJK UNIFIED IDEOGRAPH + {0xD4C1, 0x7CA4}, //14493 #CJK UNIFIED IDEOGRAPH + {0xD4C2, 0x6708}, //14494 #CJK UNIFIED IDEOGRAPH + {0xD4C3, 0x60A6}, //14495 #CJK UNIFIED IDEOGRAPH + {0xD4C4, 0x9605}, //14496 #CJK UNIFIED IDEOGRAPH + {0xD4C5, 0x8018}, //14497 #CJK UNIFIED IDEOGRAPH + {0xD4C6, 0x4E91}, //14498 #CJK UNIFIED IDEOGRAPH + {0xD4C7, 0x90E7}, //14499 #CJK UNIFIED IDEOGRAPH + {0xD4C8, 0x5300}, //14500 #CJK UNIFIED IDEOGRAPH + {0xD4C9, 0x9668}, //14501 #CJK UNIFIED IDEOGRAPH + {0xD4CA, 0x5141}, //14502 #CJK UNIFIED IDEOGRAPH + {0xD4CB, 0x8FD0}, //14503 #CJK UNIFIED IDEOGRAPH + {0xD4CC, 0x8574}, //14504 #CJK UNIFIED IDEOGRAPH + {0xD4CD, 0x915D}, //14505 #CJK UNIFIED IDEOGRAPH + {0xD4CE, 0x6655}, //14506 #CJK UNIFIED IDEOGRAPH + {0xD4CF, 0x97F5}, //14507 #CJK UNIFIED IDEOGRAPH + {0xD4D0, 0x5B55}, //14508 #CJK UNIFIED IDEOGRAPH + {0xD4D1, 0x531D}, //14509 #CJK UNIFIED IDEOGRAPH + {0xD4D2, 0x7838}, //14510 #CJK UNIFIED IDEOGRAPH + {0xD4D3, 0x6742}, //14511 #CJK UNIFIED IDEOGRAPH + {0xD4D4, 0x683D}, //14512 #CJK UNIFIED IDEOGRAPH + {0xD4D5, 0x54C9}, //14513 #CJK UNIFIED IDEOGRAPH + {0xD4D6, 0x707E}, //14514 #CJK UNIFIED IDEOGRAPH + {0xD4D7, 0x5BB0}, //14515 #CJK UNIFIED IDEOGRAPH + {0xD4D8, 0x8F7D}, //14516 #CJK UNIFIED IDEOGRAPH + {0xD4D9, 0x518D}, //14517 #CJK UNIFIED IDEOGRAPH + {0xD4DA, 0x5728}, //14518 #CJK UNIFIED IDEOGRAPH + {0xD4DB, 0x54B1}, //14519 #CJK UNIFIED IDEOGRAPH + {0xD4DC, 0x6512}, //14520 #CJK UNIFIED IDEOGRAPH + {0xD4DD, 0x6682}, //14521 #CJK UNIFIED IDEOGRAPH + {0xD4DE, 0x8D5E}, //14522 #CJK UNIFIED IDEOGRAPH + {0xD4DF, 0x8D43}, //14523 #CJK UNIFIED IDEOGRAPH + {0xD4E0, 0x810F}, //14524 #CJK UNIFIED IDEOGRAPH + {0xD4E1, 0x846C}, //14525 #CJK UNIFIED IDEOGRAPH + {0xD4E2, 0x906D}, //14526 #CJK UNIFIED IDEOGRAPH + {0xD4E3, 0x7CDF}, //14527 #CJK UNIFIED IDEOGRAPH + {0xD4E4, 0x51FF}, //14528 #CJK UNIFIED IDEOGRAPH + {0xD4E5, 0x85FB}, //14529 #CJK UNIFIED IDEOGRAPH + {0xD4E6, 0x67A3}, //14530 #CJK UNIFIED IDEOGRAPH + {0xD4E7, 0x65E9}, //14531 #CJK UNIFIED IDEOGRAPH + {0xD4E8, 0x6FA1}, //14532 #CJK UNIFIED IDEOGRAPH + {0xD4E9, 0x86A4}, //14533 #CJK UNIFIED IDEOGRAPH + {0xD4EA, 0x8E81}, //14534 #CJK UNIFIED IDEOGRAPH + {0xD4EB, 0x566A}, //14535 #CJK UNIFIED IDEOGRAPH + {0xD4EC, 0x9020}, //14536 #CJK UNIFIED IDEOGRAPH + {0xD4ED, 0x7682}, //14537 #CJK UNIFIED IDEOGRAPH + {0xD4EE, 0x7076}, //14538 #CJK UNIFIED IDEOGRAPH + {0xD4EF, 0x71E5}, //14539 #CJK UNIFIED IDEOGRAPH + {0xD4F0, 0x8D23}, //14540 #CJK UNIFIED IDEOGRAPH + {0xD4F1, 0x62E9}, //14541 #CJK UNIFIED IDEOGRAPH + {0xD4F2, 0x5219}, //14542 #CJK UNIFIED IDEOGRAPH + {0xD4F3, 0x6CFD}, //14543 #CJK UNIFIED IDEOGRAPH + {0xD4F4, 0x8D3C}, //14544 #CJK UNIFIED IDEOGRAPH + {0xD4F5, 0x600E}, //14545 #CJK UNIFIED IDEOGRAPH + {0xD4F6, 0x589E}, //14546 #CJK UNIFIED IDEOGRAPH + {0xD4F7, 0x618E}, //14547 #CJK UNIFIED IDEOGRAPH + {0xD4F8, 0x66FE}, //14548 #CJK UNIFIED IDEOGRAPH + {0xD4F9, 0x8D60}, //14549 #CJK UNIFIED IDEOGRAPH + {0xD4FA, 0x624E}, //14550 #CJK UNIFIED IDEOGRAPH + {0xD4FB, 0x55B3}, //14551 #CJK UNIFIED IDEOGRAPH + {0xD4FC, 0x6E23}, //14552 #CJK UNIFIED IDEOGRAPH + {0xD4FD, 0x672D}, //14553 #CJK UNIFIED IDEOGRAPH + {0xD4FE, 0x8F67}, //14554 #CJK UNIFIED IDEOGRAPH + {0xD540, 0x8A81}, //14555 #CJK UNIFIED IDEOGRAPH + {0xD541, 0x8A82}, //14556 #CJK UNIFIED IDEOGRAPH + {0xD542, 0x8A83}, //14557 #CJK UNIFIED IDEOGRAPH + {0xD543, 0x8A84}, //14558 #CJK UNIFIED IDEOGRAPH + {0xD544, 0x8A85}, //14559 #CJK UNIFIED IDEOGRAPH + {0xD545, 0x8A86}, //14560 #CJK UNIFIED IDEOGRAPH + {0xD546, 0x8A87}, //14561 #CJK UNIFIED IDEOGRAPH + {0xD547, 0x8A88}, //14562 #CJK UNIFIED IDEOGRAPH + {0xD548, 0x8A8B}, //14563 #CJK UNIFIED IDEOGRAPH + {0xD549, 0x8A8C}, //14564 #CJK UNIFIED IDEOGRAPH + {0xD54A, 0x8A8D}, //14565 #CJK UNIFIED IDEOGRAPH + {0xD54B, 0x8A8E}, //14566 #CJK UNIFIED IDEOGRAPH + {0xD54C, 0x8A8F}, //14567 #CJK UNIFIED IDEOGRAPH + {0xD54D, 0x8A90}, //14568 #CJK UNIFIED IDEOGRAPH + {0xD54E, 0x8A91}, //14569 #CJK UNIFIED IDEOGRAPH + {0xD54F, 0x8A92}, //14570 #CJK UNIFIED IDEOGRAPH + {0xD550, 0x8A94}, //14571 #CJK UNIFIED IDEOGRAPH + {0xD551, 0x8A95}, //14572 #CJK UNIFIED IDEOGRAPH + {0xD552, 0x8A96}, //14573 #CJK UNIFIED IDEOGRAPH + {0xD553, 0x8A97}, //14574 #CJK UNIFIED IDEOGRAPH + {0xD554, 0x8A98}, //14575 #CJK UNIFIED IDEOGRAPH + {0xD555, 0x8A99}, //14576 #CJK UNIFIED IDEOGRAPH + {0xD556, 0x8A9A}, //14577 #CJK UNIFIED IDEOGRAPH + {0xD557, 0x8A9B}, //14578 #CJK UNIFIED IDEOGRAPH + {0xD558, 0x8A9C}, //14579 #CJK UNIFIED IDEOGRAPH + {0xD559, 0x8A9D}, //14580 #CJK UNIFIED IDEOGRAPH + {0xD55A, 0x8A9E}, //14581 #CJK UNIFIED IDEOGRAPH + {0xD55B, 0x8A9F}, //14582 #CJK UNIFIED IDEOGRAPH + {0xD55C, 0x8AA0}, //14583 #CJK UNIFIED IDEOGRAPH + {0xD55D, 0x8AA1}, //14584 #CJK UNIFIED IDEOGRAPH + {0xD55E, 0x8AA2}, //14585 #CJK UNIFIED IDEOGRAPH + {0xD55F, 0x8AA3}, //14586 #CJK UNIFIED IDEOGRAPH + {0xD560, 0x8AA4}, //14587 #CJK UNIFIED IDEOGRAPH + {0xD561, 0x8AA5}, //14588 #CJK UNIFIED IDEOGRAPH + {0xD562, 0x8AA6}, //14589 #CJK UNIFIED IDEOGRAPH + {0xD563, 0x8AA7}, //14590 #CJK UNIFIED IDEOGRAPH + {0xD564, 0x8AA8}, //14591 #CJK UNIFIED IDEOGRAPH + {0xD565, 0x8AA9}, //14592 #CJK UNIFIED IDEOGRAPH + {0xD566, 0x8AAA}, //14593 #CJK UNIFIED IDEOGRAPH + {0xD567, 0x8AAB}, //14594 #CJK UNIFIED IDEOGRAPH + {0xD568, 0x8AAC}, //14595 #CJK UNIFIED IDEOGRAPH + {0xD569, 0x8AAD}, //14596 #CJK UNIFIED IDEOGRAPH + {0xD56A, 0x8AAE}, //14597 #CJK UNIFIED IDEOGRAPH + {0xD56B, 0x8AAF}, //14598 #CJK UNIFIED IDEOGRAPH + {0xD56C, 0x8AB0}, //14599 #CJK UNIFIED IDEOGRAPH + {0xD56D, 0x8AB1}, //14600 #CJK UNIFIED IDEOGRAPH + {0xD56E, 0x8AB2}, //14601 #CJK UNIFIED IDEOGRAPH + {0xD56F, 0x8AB3}, //14602 #CJK UNIFIED IDEOGRAPH + {0xD570, 0x8AB4}, //14603 #CJK UNIFIED IDEOGRAPH + {0xD571, 0x8AB5}, //14604 #CJK UNIFIED IDEOGRAPH + {0xD572, 0x8AB6}, //14605 #CJK UNIFIED IDEOGRAPH + {0xD573, 0x8AB7}, //14606 #CJK UNIFIED IDEOGRAPH + {0xD574, 0x8AB8}, //14607 #CJK UNIFIED IDEOGRAPH + {0xD575, 0x8AB9}, //14608 #CJK UNIFIED IDEOGRAPH + {0xD576, 0x8ABA}, //14609 #CJK UNIFIED IDEOGRAPH + {0xD577, 0x8ABB}, //14610 #CJK UNIFIED IDEOGRAPH + {0xD578, 0x8ABC}, //14611 #CJK UNIFIED IDEOGRAPH + {0xD579, 0x8ABD}, //14612 #CJK UNIFIED IDEOGRAPH + {0xD57A, 0x8ABE}, //14613 #CJK UNIFIED IDEOGRAPH + {0xD57B, 0x8ABF}, //14614 #CJK UNIFIED IDEOGRAPH + {0xD57C, 0x8AC0}, //14615 #CJK UNIFIED IDEOGRAPH + {0xD57D, 0x8AC1}, //14616 #CJK UNIFIED IDEOGRAPH + {0xD57E, 0x8AC2}, //14617 #CJK UNIFIED IDEOGRAPH + {0xD580, 0x8AC3}, //14618 #CJK UNIFIED IDEOGRAPH + {0xD581, 0x8AC4}, //14619 #CJK UNIFIED IDEOGRAPH + {0xD582, 0x8AC5}, //14620 #CJK UNIFIED IDEOGRAPH + {0xD583, 0x8AC6}, //14621 #CJK UNIFIED IDEOGRAPH + {0xD584, 0x8AC7}, //14622 #CJK UNIFIED IDEOGRAPH + {0xD585, 0x8AC8}, //14623 #CJK UNIFIED IDEOGRAPH + {0xD586, 0x8AC9}, //14624 #CJK UNIFIED IDEOGRAPH + {0xD587, 0x8ACA}, //14625 #CJK UNIFIED IDEOGRAPH + {0xD588, 0x8ACB}, //14626 #CJK UNIFIED IDEOGRAPH + {0xD589, 0x8ACC}, //14627 #CJK UNIFIED IDEOGRAPH + {0xD58A, 0x8ACD}, //14628 #CJK UNIFIED IDEOGRAPH + {0xD58B, 0x8ACE}, //14629 #CJK UNIFIED IDEOGRAPH + {0xD58C, 0x8ACF}, //14630 #CJK UNIFIED IDEOGRAPH + {0xD58D, 0x8AD0}, //14631 #CJK UNIFIED IDEOGRAPH + {0xD58E, 0x8AD1}, //14632 #CJK UNIFIED IDEOGRAPH + {0xD58F, 0x8AD2}, //14633 #CJK UNIFIED IDEOGRAPH + {0xD590, 0x8AD3}, //14634 #CJK UNIFIED IDEOGRAPH + {0xD591, 0x8AD4}, //14635 #CJK UNIFIED IDEOGRAPH + {0xD592, 0x8AD5}, //14636 #CJK UNIFIED IDEOGRAPH + {0xD593, 0x8AD6}, //14637 #CJK UNIFIED IDEOGRAPH + {0xD594, 0x8AD7}, //14638 #CJK UNIFIED IDEOGRAPH + {0xD595, 0x8AD8}, //14639 #CJK UNIFIED IDEOGRAPH + {0xD596, 0x8AD9}, //14640 #CJK UNIFIED IDEOGRAPH + {0xD597, 0x8ADA}, //14641 #CJK UNIFIED IDEOGRAPH + {0xD598, 0x8ADB}, //14642 #CJK UNIFIED IDEOGRAPH + {0xD599, 0x8ADC}, //14643 #CJK UNIFIED IDEOGRAPH + {0xD59A, 0x8ADD}, //14644 #CJK UNIFIED IDEOGRAPH + {0xD59B, 0x8ADE}, //14645 #CJK UNIFIED IDEOGRAPH + {0xD59C, 0x8ADF}, //14646 #CJK UNIFIED IDEOGRAPH + {0xD59D, 0x8AE0}, //14647 #CJK UNIFIED IDEOGRAPH + {0xD59E, 0x8AE1}, //14648 #CJK UNIFIED IDEOGRAPH + {0xD59F, 0x8AE2}, //14649 #CJK UNIFIED IDEOGRAPH + {0xD5A0, 0x8AE3}, //14650 #CJK UNIFIED IDEOGRAPH + {0xD5A1, 0x94E1}, //14651 #CJK UNIFIED IDEOGRAPH + {0xD5A2, 0x95F8}, //14652 #CJK UNIFIED IDEOGRAPH + {0xD5A3, 0x7728}, //14653 #CJK UNIFIED IDEOGRAPH + {0xD5A4, 0x6805}, //14654 #CJK UNIFIED IDEOGRAPH + {0xD5A5, 0x69A8}, //14655 #CJK UNIFIED IDEOGRAPH + {0xD5A6, 0x548B}, //14656 #CJK UNIFIED IDEOGRAPH + {0xD5A7, 0x4E4D}, //14657 #CJK UNIFIED IDEOGRAPH + {0xD5A8, 0x70B8}, //14658 #CJK UNIFIED IDEOGRAPH + {0xD5A9, 0x8BC8}, //14659 #CJK UNIFIED IDEOGRAPH + {0xD5AA, 0x6458}, //14660 #CJK UNIFIED IDEOGRAPH + {0xD5AB, 0x658B}, //14661 #CJK UNIFIED IDEOGRAPH + {0xD5AC, 0x5B85}, //14662 #CJK UNIFIED IDEOGRAPH + {0xD5AD, 0x7A84}, //14663 #CJK UNIFIED IDEOGRAPH + {0xD5AE, 0x503A}, //14664 #CJK UNIFIED IDEOGRAPH + {0xD5AF, 0x5BE8}, //14665 #CJK UNIFIED IDEOGRAPH + {0xD5B0, 0x77BB}, //14666 #CJK UNIFIED IDEOGRAPH + {0xD5B1, 0x6BE1}, //14667 #CJK UNIFIED IDEOGRAPH + {0xD5B2, 0x8A79}, //14668 #CJK UNIFIED IDEOGRAPH + {0xD5B3, 0x7C98}, //14669 #CJK UNIFIED IDEOGRAPH + {0xD5B4, 0x6CBE}, //14670 #CJK UNIFIED IDEOGRAPH + {0xD5B5, 0x76CF}, //14671 #CJK UNIFIED IDEOGRAPH + {0xD5B6, 0x65A9}, //14672 #CJK UNIFIED IDEOGRAPH + {0xD5B7, 0x8F97}, //14673 #CJK UNIFIED IDEOGRAPH + {0xD5B8, 0x5D2D}, //14674 #CJK UNIFIED IDEOGRAPH + {0xD5B9, 0x5C55}, //14675 #CJK UNIFIED IDEOGRAPH + {0xD5BA, 0x8638}, //14676 #CJK UNIFIED IDEOGRAPH + {0xD5BB, 0x6808}, //14677 #CJK UNIFIED IDEOGRAPH + {0xD5BC, 0x5360}, //14678 #CJK UNIFIED IDEOGRAPH + {0xD5BD, 0x6218}, //14679 #CJK UNIFIED IDEOGRAPH + {0xD5BE, 0x7AD9}, //14680 #CJK UNIFIED IDEOGRAPH + {0xD5BF, 0x6E5B}, //14681 #CJK UNIFIED IDEOGRAPH + {0xD5C0, 0x7EFD}, //14682 #CJK UNIFIED IDEOGRAPH + {0xD5C1, 0x6A1F}, //14683 #CJK UNIFIED IDEOGRAPH + {0xD5C2, 0x7AE0}, //14684 #CJK UNIFIED IDEOGRAPH + {0xD5C3, 0x5F70}, //14685 #CJK UNIFIED IDEOGRAPH + {0xD5C4, 0x6F33}, //14686 #CJK UNIFIED IDEOGRAPH + {0xD5C5, 0x5F20}, //14687 #CJK UNIFIED IDEOGRAPH + {0xD5C6, 0x638C}, //14688 #CJK UNIFIED IDEOGRAPH + {0xD5C7, 0x6DA8}, //14689 #CJK UNIFIED IDEOGRAPH + {0xD5C8, 0x6756}, //14690 #CJK UNIFIED IDEOGRAPH + {0xD5C9, 0x4E08}, //14691 #CJK UNIFIED IDEOGRAPH + {0xD5CA, 0x5E10}, //14692 #CJK UNIFIED IDEOGRAPH + {0xD5CB, 0x8D26}, //14693 #CJK UNIFIED IDEOGRAPH + {0xD5CC, 0x4ED7}, //14694 #CJK UNIFIED IDEOGRAPH + {0xD5CD, 0x80C0}, //14695 #CJK UNIFIED IDEOGRAPH + {0xD5CE, 0x7634}, //14696 #CJK UNIFIED IDEOGRAPH + {0xD5CF, 0x969C}, //14697 #CJK UNIFIED IDEOGRAPH + {0xD5D0, 0x62DB}, //14698 #CJK UNIFIED IDEOGRAPH + {0xD5D1, 0x662D}, //14699 #CJK UNIFIED IDEOGRAPH + {0xD5D2, 0x627E}, //14700 #CJK UNIFIED IDEOGRAPH + {0xD5D3, 0x6CBC}, //14701 #CJK UNIFIED IDEOGRAPH + {0xD5D4, 0x8D75}, //14702 #CJK UNIFIED IDEOGRAPH + {0xD5D5, 0x7167}, //14703 #CJK UNIFIED IDEOGRAPH + {0xD5D6, 0x7F69}, //14704 #CJK UNIFIED IDEOGRAPH + {0xD5D7, 0x5146}, //14705 #CJK UNIFIED IDEOGRAPH + {0xD5D8, 0x8087}, //14706 #CJK UNIFIED IDEOGRAPH + {0xD5D9, 0x53EC}, //14707 #CJK UNIFIED IDEOGRAPH + {0xD5DA, 0x906E}, //14708 #CJK UNIFIED IDEOGRAPH + {0xD5DB, 0x6298}, //14709 #CJK UNIFIED IDEOGRAPH + {0xD5DC, 0x54F2}, //14710 #CJK UNIFIED IDEOGRAPH + {0xD5DD, 0x86F0}, //14711 #CJK UNIFIED IDEOGRAPH + {0xD5DE, 0x8F99}, //14712 #CJK UNIFIED IDEOGRAPH + {0xD5DF, 0x8005}, //14713 #CJK UNIFIED IDEOGRAPH + {0xD5E0, 0x9517}, //14714 #CJK UNIFIED IDEOGRAPH + {0xD5E1, 0x8517}, //14715 #CJK UNIFIED IDEOGRAPH + {0xD5E2, 0x8FD9}, //14716 #CJK UNIFIED IDEOGRAPH + {0xD5E3, 0x6D59}, //14717 #CJK UNIFIED IDEOGRAPH + {0xD5E4, 0x73CD}, //14718 #CJK UNIFIED IDEOGRAPH + {0xD5E5, 0x659F}, //14719 #CJK UNIFIED IDEOGRAPH + {0xD5E6, 0x771F}, //14720 #CJK UNIFIED IDEOGRAPH + {0xD5E7, 0x7504}, //14721 #CJK UNIFIED IDEOGRAPH + {0xD5E8, 0x7827}, //14722 #CJK UNIFIED IDEOGRAPH + {0xD5E9, 0x81FB}, //14723 #CJK UNIFIED IDEOGRAPH + {0xD5EA, 0x8D1E}, //14724 #CJK UNIFIED IDEOGRAPH + {0xD5EB, 0x9488}, //14725 #CJK UNIFIED IDEOGRAPH + {0xD5EC, 0x4FA6}, //14726 #CJK UNIFIED IDEOGRAPH + {0xD5ED, 0x6795}, //14727 #CJK UNIFIED IDEOGRAPH + {0xD5EE, 0x75B9}, //14728 #CJK UNIFIED IDEOGRAPH + {0xD5EF, 0x8BCA}, //14729 #CJK UNIFIED IDEOGRAPH + {0xD5F0, 0x9707}, //14730 #CJK UNIFIED IDEOGRAPH + {0xD5F1, 0x632F}, //14731 #CJK UNIFIED IDEOGRAPH + {0xD5F2, 0x9547}, //14732 #CJK UNIFIED IDEOGRAPH + {0xD5F3, 0x9635}, //14733 #CJK UNIFIED IDEOGRAPH + {0xD5F4, 0x84B8}, //14734 #CJK UNIFIED IDEOGRAPH + {0xD5F5, 0x6323}, //14735 #CJK UNIFIED IDEOGRAPH + {0xD5F6, 0x7741}, //14736 #CJK UNIFIED IDEOGRAPH + {0xD5F7, 0x5F81}, //14737 #CJK UNIFIED IDEOGRAPH + {0xD5F8, 0x72F0}, //14738 #CJK UNIFIED IDEOGRAPH + {0xD5F9, 0x4E89}, //14739 #CJK UNIFIED IDEOGRAPH + {0xD5FA, 0x6014}, //14740 #CJK UNIFIED IDEOGRAPH + {0xD5FB, 0x6574}, //14741 #CJK UNIFIED IDEOGRAPH + {0xD5FC, 0x62EF}, //14742 #CJK UNIFIED IDEOGRAPH + {0xD5FD, 0x6B63}, //14743 #CJK UNIFIED IDEOGRAPH + {0xD5FE, 0x653F}, //14744 #CJK UNIFIED IDEOGRAPH + {0xD640, 0x8AE4}, //14745 #CJK UNIFIED IDEOGRAPH + {0xD641, 0x8AE5}, //14746 #CJK UNIFIED IDEOGRAPH + {0xD642, 0x8AE6}, //14747 #CJK UNIFIED IDEOGRAPH + {0xD643, 0x8AE7}, //14748 #CJK UNIFIED IDEOGRAPH + {0xD644, 0x8AE8}, //14749 #CJK UNIFIED IDEOGRAPH + {0xD645, 0x8AE9}, //14750 #CJK UNIFIED IDEOGRAPH + {0xD646, 0x8AEA}, //14751 #CJK UNIFIED IDEOGRAPH + {0xD647, 0x8AEB}, //14752 #CJK UNIFIED IDEOGRAPH + {0xD648, 0x8AEC}, //14753 #CJK UNIFIED IDEOGRAPH + {0xD649, 0x8AED}, //14754 #CJK UNIFIED IDEOGRAPH + {0xD64A, 0x8AEE}, //14755 #CJK UNIFIED IDEOGRAPH + {0xD64B, 0x8AEF}, //14756 #CJK UNIFIED IDEOGRAPH + {0xD64C, 0x8AF0}, //14757 #CJK UNIFIED IDEOGRAPH + {0xD64D, 0x8AF1}, //14758 #CJK UNIFIED IDEOGRAPH + {0xD64E, 0x8AF2}, //14759 #CJK UNIFIED IDEOGRAPH + {0xD64F, 0x8AF3}, //14760 #CJK UNIFIED IDEOGRAPH + {0xD650, 0x8AF4}, //14761 #CJK UNIFIED IDEOGRAPH + {0xD651, 0x8AF5}, //14762 #CJK UNIFIED IDEOGRAPH + {0xD652, 0x8AF6}, //14763 #CJK UNIFIED IDEOGRAPH + {0xD653, 0x8AF7}, //14764 #CJK UNIFIED IDEOGRAPH + {0xD654, 0x8AF8}, //14765 #CJK UNIFIED IDEOGRAPH + {0xD655, 0x8AF9}, //14766 #CJK UNIFIED IDEOGRAPH + {0xD656, 0x8AFA}, //14767 #CJK UNIFIED IDEOGRAPH + {0xD657, 0x8AFB}, //14768 #CJK UNIFIED IDEOGRAPH + {0xD658, 0x8AFC}, //14769 #CJK UNIFIED IDEOGRAPH + {0xD659, 0x8AFD}, //14770 #CJK UNIFIED IDEOGRAPH + {0xD65A, 0x8AFE}, //14771 #CJK UNIFIED IDEOGRAPH + {0xD65B, 0x8AFF}, //14772 #CJK UNIFIED IDEOGRAPH + {0xD65C, 0x8B00}, //14773 #CJK UNIFIED IDEOGRAPH + {0xD65D, 0x8B01}, //14774 #CJK UNIFIED IDEOGRAPH + {0xD65E, 0x8B02}, //14775 #CJK UNIFIED IDEOGRAPH + {0xD65F, 0x8B03}, //14776 #CJK UNIFIED IDEOGRAPH + {0xD660, 0x8B04}, //14777 #CJK UNIFIED IDEOGRAPH + {0xD661, 0x8B05}, //14778 #CJK UNIFIED IDEOGRAPH + {0xD662, 0x8B06}, //14779 #CJK UNIFIED IDEOGRAPH + {0xD663, 0x8B08}, //14780 #CJK UNIFIED IDEOGRAPH + {0xD664, 0x8B09}, //14781 #CJK UNIFIED IDEOGRAPH + {0xD665, 0x8B0A}, //14782 #CJK UNIFIED IDEOGRAPH + {0xD666, 0x8B0B}, //14783 #CJK UNIFIED IDEOGRAPH + {0xD667, 0x8B0C}, //14784 #CJK UNIFIED IDEOGRAPH + {0xD668, 0x8B0D}, //14785 #CJK UNIFIED IDEOGRAPH + {0xD669, 0x8B0E}, //14786 #CJK UNIFIED IDEOGRAPH + {0xD66A, 0x8B0F}, //14787 #CJK UNIFIED IDEOGRAPH + {0xD66B, 0x8B10}, //14788 #CJK UNIFIED IDEOGRAPH + {0xD66C, 0x8B11}, //14789 #CJK UNIFIED IDEOGRAPH + {0xD66D, 0x8B12}, //14790 #CJK UNIFIED IDEOGRAPH + {0xD66E, 0x8B13}, //14791 #CJK UNIFIED IDEOGRAPH + {0xD66F, 0x8B14}, //14792 #CJK UNIFIED IDEOGRAPH + {0xD670, 0x8B15}, //14793 #CJK UNIFIED IDEOGRAPH + {0xD671, 0x8B16}, //14794 #CJK UNIFIED IDEOGRAPH + {0xD672, 0x8B17}, //14795 #CJK UNIFIED IDEOGRAPH + {0xD673, 0x8B18}, //14796 #CJK UNIFIED IDEOGRAPH + {0xD674, 0x8B19}, //14797 #CJK UNIFIED IDEOGRAPH + {0xD675, 0x8B1A}, //14798 #CJK UNIFIED IDEOGRAPH + {0xD676, 0x8B1B}, //14799 #CJK UNIFIED IDEOGRAPH + {0xD677, 0x8B1C}, //14800 #CJK UNIFIED IDEOGRAPH + {0xD678, 0x8B1D}, //14801 #CJK UNIFIED IDEOGRAPH + {0xD679, 0x8B1E}, //14802 #CJK UNIFIED IDEOGRAPH + {0xD67A, 0x8B1F}, //14803 #CJK UNIFIED IDEOGRAPH + {0xD67B, 0x8B20}, //14804 #CJK UNIFIED IDEOGRAPH + {0xD67C, 0x8B21}, //14805 #CJK UNIFIED IDEOGRAPH + {0xD67D, 0x8B22}, //14806 #CJK UNIFIED IDEOGRAPH + {0xD67E, 0x8B23}, //14807 #CJK UNIFIED IDEOGRAPH + {0xD680, 0x8B24}, //14808 #CJK UNIFIED IDEOGRAPH + {0xD681, 0x8B25}, //14809 #CJK UNIFIED IDEOGRAPH + {0xD682, 0x8B27}, //14810 #CJK UNIFIED IDEOGRAPH + {0xD683, 0x8B28}, //14811 #CJK UNIFIED IDEOGRAPH + {0xD684, 0x8B29}, //14812 #CJK UNIFIED IDEOGRAPH + {0xD685, 0x8B2A}, //14813 #CJK UNIFIED IDEOGRAPH + {0xD686, 0x8B2B}, //14814 #CJK UNIFIED IDEOGRAPH + {0xD687, 0x8B2C}, //14815 #CJK UNIFIED IDEOGRAPH + {0xD688, 0x8B2D}, //14816 #CJK UNIFIED IDEOGRAPH + {0xD689, 0x8B2E}, //14817 #CJK UNIFIED IDEOGRAPH + {0xD68A, 0x8B2F}, //14818 #CJK UNIFIED IDEOGRAPH + {0xD68B, 0x8B30}, //14819 #CJK UNIFIED IDEOGRAPH + {0xD68C, 0x8B31}, //14820 #CJK UNIFIED IDEOGRAPH + {0xD68D, 0x8B32}, //14821 #CJK UNIFIED IDEOGRAPH + {0xD68E, 0x8B33}, //14822 #CJK UNIFIED IDEOGRAPH + {0xD68F, 0x8B34}, //14823 #CJK UNIFIED IDEOGRAPH + {0xD690, 0x8B35}, //14824 #CJK UNIFIED IDEOGRAPH + {0xD691, 0x8B36}, //14825 #CJK UNIFIED IDEOGRAPH + {0xD692, 0x8B37}, //14826 #CJK UNIFIED IDEOGRAPH + {0xD693, 0x8B38}, //14827 #CJK UNIFIED IDEOGRAPH + {0xD694, 0x8B39}, //14828 #CJK UNIFIED IDEOGRAPH + {0xD695, 0x8B3A}, //14829 #CJK UNIFIED IDEOGRAPH + {0xD696, 0x8B3B}, //14830 #CJK UNIFIED IDEOGRAPH + {0xD697, 0x8B3C}, //14831 #CJK UNIFIED IDEOGRAPH + {0xD698, 0x8B3D}, //14832 #CJK UNIFIED IDEOGRAPH + {0xD699, 0x8B3E}, //14833 #CJK UNIFIED IDEOGRAPH + {0xD69A, 0x8B3F}, //14834 #CJK UNIFIED IDEOGRAPH + {0xD69B, 0x8B40}, //14835 #CJK UNIFIED IDEOGRAPH + {0xD69C, 0x8B41}, //14836 #CJK UNIFIED IDEOGRAPH + {0xD69D, 0x8B42}, //14837 #CJK UNIFIED IDEOGRAPH + {0xD69E, 0x8B43}, //14838 #CJK UNIFIED IDEOGRAPH + {0xD69F, 0x8B44}, //14839 #CJK UNIFIED IDEOGRAPH + {0xD6A0, 0x8B45}, //14840 #CJK UNIFIED IDEOGRAPH + {0xD6A1, 0x5E27}, //14841 #CJK UNIFIED IDEOGRAPH + {0xD6A2, 0x75C7}, //14842 #CJK UNIFIED IDEOGRAPH + {0xD6A3, 0x90D1}, //14843 #CJK UNIFIED IDEOGRAPH + {0xD6A4, 0x8BC1}, //14844 #CJK UNIFIED IDEOGRAPH + {0xD6A5, 0x829D}, //14845 #CJK UNIFIED IDEOGRAPH + {0xD6A6, 0x679D}, //14846 #CJK UNIFIED IDEOGRAPH + {0xD6A7, 0x652F}, //14847 #CJK UNIFIED IDEOGRAPH + {0xD6A8, 0x5431}, //14848 #CJK UNIFIED IDEOGRAPH + {0xD6A9, 0x8718}, //14849 #CJK UNIFIED IDEOGRAPH + {0xD6AA, 0x77E5}, //14850 #CJK UNIFIED IDEOGRAPH + {0xD6AB, 0x80A2}, //14851 #CJK UNIFIED IDEOGRAPH + {0xD6AC, 0x8102}, //14852 #CJK UNIFIED IDEOGRAPH + {0xD6AD, 0x6C41}, //14853 #CJK UNIFIED IDEOGRAPH + {0xD6AE, 0x4E4B}, //14854 #CJK UNIFIED IDEOGRAPH + {0xD6AF, 0x7EC7}, //14855 #CJK UNIFIED IDEOGRAPH + {0xD6B0, 0x804C}, //14856 #CJK UNIFIED IDEOGRAPH + {0xD6B1, 0x76F4}, //14857 #CJK UNIFIED IDEOGRAPH + {0xD6B2, 0x690D}, //14858 #CJK UNIFIED IDEOGRAPH + {0xD6B3, 0x6B96}, //14859 #CJK UNIFIED IDEOGRAPH + {0xD6B4, 0x6267}, //14860 #CJK UNIFIED IDEOGRAPH + {0xD6B5, 0x503C}, //14861 #CJK UNIFIED IDEOGRAPH + {0xD6B6, 0x4F84}, //14862 #CJK UNIFIED IDEOGRAPH + {0xD6B7, 0x5740}, //14863 #CJK UNIFIED IDEOGRAPH + {0xD6B8, 0x6307}, //14864 #CJK UNIFIED IDEOGRAPH + {0xD6B9, 0x6B62}, //14865 #CJK UNIFIED IDEOGRAPH + {0xD6BA, 0x8DBE}, //14866 #CJK UNIFIED IDEOGRAPH + {0xD6BB, 0x53EA}, //14867 #CJK UNIFIED IDEOGRAPH + {0xD6BC, 0x65E8}, //14868 #CJK UNIFIED IDEOGRAPH + {0xD6BD, 0x7EB8}, //14869 #CJK UNIFIED IDEOGRAPH + {0xD6BE, 0x5FD7}, //14870 #CJK UNIFIED IDEOGRAPH + {0xD6BF, 0x631A}, //14871 #CJK UNIFIED IDEOGRAPH + {0xD6C0, 0x63B7}, //14872 #CJK UNIFIED IDEOGRAPH + {0xD6C1, 0x81F3}, //14873 #CJK UNIFIED IDEOGRAPH + {0xD6C2, 0x81F4}, //14874 #CJK UNIFIED IDEOGRAPH + {0xD6C3, 0x7F6E}, //14875 #CJK UNIFIED IDEOGRAPH + {0xD6C4, 0x5E1C}, //14876 #CJK UNIFIED IDEOGRAPH + {0xD6C5, 0x5CD9}, //14877 #CJK UNIFIED IDEOGRAPH + {0xD6C6, 0x5236}, //14878 #CJK UNIFIED IDEOGRAPH + {0xD6C7, 0x667A}, //14879 #CJK UNIFIED IDEOGRAPH + {0xD6C8, 0x79E9}, //14880 #CJK UNIFIED IDEOGRAPH + {0xD6C9, 0x7A1A}, //14881 #CJK UNIFIED IDEOGRAPH + {0xD6CA, 0x8D28}, //14882 #CJK UNIFIED IDEOGRAPH + {0xD6CB, 0x7099}, //14883 #CJK UNIFIED IDEOGRAPH + {0xD6CC, 0x75D4}, //14884 #CJK UNIFIED IDEOGRAPH + {0xD6CD, 0x6EDE}, //14885 #CJK UNIFIED IDEOGRAPH + {0xD6CE, 0x6CBB}, //14886 #CJK UNIFIED IDEOGRAPH + {0xD6CF, 0x7A92}, //14887 #CJK UNIFIED IDEOGRAPH + {0xD6D0, 0x4E2D}, //14888 #CJK UNIFIED IDEOGRAPH + {0xD6D1, 0x76C5}, //14889 #CJK UNIFIED IDEOGRAPH + {0xD6D2, 0x5FE0}, //14890 #CJK UNIFIED IDEOGRAPH + {0xD6D3, 0x949F}, //14891 #CJK UNIFIED IDEOGRAPH + {0xD6D4, 0x8877}, //14892 #CJK UNIFIED IDEOGRAPH + {0xD6D5, 0x7EC8}, //14893 #CJK UNIFIED IDEOGRAPH + {0xD6D6, 0x79CD}, //14894 #CJK UNIFIED IDEOGRAPH + {0xD6D7, 0x80BF}, //14895 #CJK UNIFIED IDEOGRAPH + {0xD6D8, 0x91CD}, //14896 #CJK UNIFIED IDEOGRAPH + {0xD6D9, 0x4EF2}, //14897 #CJK UNIFIED IDEOGRAPH + {0xD6DA, 0x4F17}, //14898 #CJK UNIFIED IDEOGRAPH + {0xD6DB, 0x821F}, //14899 #CJK UNIFIED IDEOGRAPH + {0xD6DC, 0x5468}, //14900 #CJK UNIFIED IDEOGRAPH + {0xD6DD, 0x5DDE}, //14901 #CJK UNIFIED IDEOGRAPH + {0xD6DE, 0x6D32}, //14902 #CJK UNIFIED IDEOGRAPH + {0xD6DF, 0x8BCC}, //14903 #CJK UNIFIED IDEOGRAPH + {0xD6E0, 0x7CA5}, //14904 #CJK UNIFIED IDEOGRAPH + {0xD6E1, 0x8F74}, //14905 #CJK UNIFIED IDEOGRAPH + {0xD6E2, 0x8098}, //14906 #CJK UNIFIED IDEOGRAPH + {0xD6E3, 0x5E1A}, //14907 #CJK UNIFIED IDEOGRAPH + {0xD6E4, 0x5492}, //14908 #CJK UNIFIED IDEOGRAPH + {0xD6E5, 0x76B1}, //14909 #CJK UNIFIED IDEOGRAPH + {0xD6E6, 0x5B99}, //14910 #CJK UNIFIED IDEOGRAPH + {0xD6E7, 0x663C}, //14911 #CJK UNIFIED IDEOGRAPH + {0xD6E8, 0x9AA4}, //14912 #CJK UNIFIED IDEOGRAPH + {0xD6E9, 0x73E0}, //14913 #CJK UNIFIED IDEOGRAPH + {0xD6EA, 0x682A}, //14914 #CJK UNIFIED IDEOGRAPH + {0xD6EB, 0x86DB}, //14915 #CJK UNIFIED IDEOGRAPH + {0xD6EC, 0x6731}, //14916 #CJK UNIFIED IDEOGRAPH + {0xD6ED, 0x732A}, //14917 #CJK UNIFIED IDEOGRAPH + {0xD6EE, 0x8BF8}, //14918 #CJK UNIFIED IDEOGRAPH + {0xD6EF, 0x8BDB}, //14919 #CJK UNIFIED IDEOGRAPH + {0xD6F0, 0x9010}, //14920 #CJK UNIFIED IDEOGRAPH + {0xD6F1, 0x7AF9}, //14921 #CJK UNIFIED IDEOGRAPH + {0xD6F2, 0x70DB}, //14922 #CJK UNIFIED IDEOGRAPH + {0xD6F3, 0x716E}, //14923 #CJK UNIFIED IDEOGRAPH + {0xD6F4, 0x62C4}, //14924 #CJK UNIFIED IDEOGRAPH + {0xD6F5, 0x77A9}, //14925 #CJK UNIFIED IDEOGRAPH + {0xD6F6, 0x5631}, //14926 #CJK UNIFIED IDEOGRAPH + {0xD6F7, 0x4E3B}, //14927 #CJK UNIFIED IDEOGRAPH + {0xD6F8, 0x8457}, //14928 #CJK UNIFIED IDEOGRAPH + {0xD6F9, 0x67F1}, //14929 #CJK UNIFIED IDEOGRAPH + {0xD6FA, 0x52A9}, //14930 #CJK UNIFIED IDEOGRAPH + {0xD6FB, 0x86C0}, //14931 #CJK UNIFIED IDEOGRAPH + {0xD6FC, 0x8D2E}, //14932 #CJK UNIFIED IDEOGRAPH + {0xD6FD, 0x94F8}, //14933 #CJK UNIFIED IDEOGRAPH + {0xD6FE, 0x7B51}, //14934 #CJK UNIFIED IDEOGRAPH + {0xD740, 0x8B46}, //14935 #CJK UNIFIED IDEOGRAPH + {0xD741, 0x8B47}, //14936 #CJK UNIFIED IDEOGRAPH + {0xD742, 0x8B48}, //14937 #CJK UNIFIED IDEOGRAPH + {0xD743, 0x8B49}, //14938 #CJK UNIFIED IDEOGRAPH + {0xD744, 0x8B4A}, //14939 #CJK UNIFIED IDEOGRAPH + {0xD745, 0x8B4B}, //14940 #CJK UNIFIED IDEOGRAPH + {0xD746, 0x8B4C}, //14941 #CJK UNIFIED IDEOGRAPH + {0xD747, 0x8B4D}, //14942 #CJK UNIFIED IDEOGRAPH + {0xD748, 0x8B4E}, //14943 #CJK UNIFIED IDEOGRAPH + {0xD749, 0x8B4F}, //14944 #CJK UNIFIED IDEOGRAPH + {0xD74A, 0x8B50}, //14945 #CJK UNIFIED IDEOGRAPH + {0xD74B, 0x8B51}, //14946 #CJK UNIFIED IDEOGRAPH + {0xD74C, 0x8B52}, //14947 #CJK UNIFIED IDEOGRAPH + {0xD74D, 0x8B53}, //14948 #CJK UNIFIED IDEOGRAPH + {0xD74E, 0x8B54}, //14949 #CJK UNIFIED IDEOGRAPH + {0xD74F, 0x8B55}, //14950 #CJK UNIFIED IDEOGRAPH + {0xD750, 0x8B56}, //14951 #CJK UNIFIED IDEOGRAPH + {0xD751, 0x8B57}, //14952 #CJK UNIFIED IDEOGRAPH + {0xD752, 0x8B58}, //14953 #CJK UNIFIED IDEOGRAPH + {0xD753, 0x8B59}, //14954 #CJK UNIFIED IDEOGRAPH + {0xD754, 0x8B5A}, //14955 #CJK UNIFIED IDEOGRAPH + {0xD755, 0x8B5B}, //14956 #CJK UNIFIED IDEOGRAPH + {0xD756, 0x8B5C}, //14957 #CJK UNIFIED IDEOGRAPH + {0xD757, 0x8B5D}, //14958 #CJK UNIFIED IDEOGRAPH + {0xD758, 0x8B5E}, //14959 #CJK UNIFIED IDEOGRAPH + {0xD759, 0x8B5F}, //14960 #CJK UNIFIED IDEOGRAPH + {0xD75A, 0x8B60}, //14961 #CJK UNIFIED IDEOGRAPH + {0xD75B, 0x8B61}, //14962 #CJK UNIFIED IDEOGRAPH + {0xD75C, 0x8B62}, //14963 #CJK UNIFIED IDEOGRAPH + {0xD75D, 0x8B63}, //14964 #CJK UNIFIED IDEOGRAPH + {0xD75E, 0x8B64}, //14965 #CJK UNIFIED IDEOGRAPH + {0xD75F, 0x8B65}, //14966 #CJK UNIFIED IDEOGRAPH + {0xD760, 0x8B67}, //14967 #CJK UNIFIED IDEOGRAPH + {0xD761, 0x8B68}, //14968 #CJK UNIFIED IDEOGRAPH + {0xD762, 0x8B69}, //14969 #CJK UNIFIED IDEOGRAPH + {0xD763, 0x8B6A}, //14970 #CJK UNIFIED IDEOGRAPH + {0xD764, 0x8B6B}, //14971 #CJK UNIFIED IDEOGRAPH + {0xD765, 0x8B6D}, //14972 #CJK UNIFIED IDEOGRAPH + {0xD766, 0x8B6E}, //14973 #CJK UNIFIED IDEOGRAPH + {0xD767, 0x8B6F}, //14974 #CJK UNIFIED IDEOGRAPH + {0xD768, 0x8B70}, //14975 #CJK UNIFIED IDEOGRAPH + {0xD769, 0x8B71}, //14976 #CJK UNIFIED IDEOGRAPH + {0xD76A, 0x8B72}, //14977 #CJK UNIFIED IDEOGRAPH + {0xD76B, 0x8B73}, //14978 #CJK UNIFIED IDEOGRAPH + {0xD76C, 0x8B74}, //14979 #CJK UNIFIED IDEOGRAPH + {0xD76D, 0x8B75}, //14980 #CJK UNIFIED IDEOGRAPH + {0xD76E, 0x8B76}, //14981 #CJK UNIFIED IDEOGRAPH + {0xD76F, 0x8B77}, //14982 #CJK UNIFIED IDEOGRAPH + {0xD770, 0x8B78}, //14983 #CJK UNIFIED IDEOGRAPH + {0xD771, 0x8B79}, //14984 #CJK UNIFIED IDEOGRAPH + {0xD772, 0x8B7A}, //14985 #CJK UNIFIED IDEOGRAPH + {0xD773, 0x8B7B}, //14986 #CJK UNIFIED IDEOGRAPH + {0xD774, 0x8B7C}, //14987 #CJK UNIFIED IDEOGRAPH + {0xD775, 0x8B7D}, //14988 #CJK UNIFIED IDEOGRAPH + {0xD776, 0x8B7E}, //14989 #CJK UNIFIED IDEOGRAPH + {0xD777, 0x8B7F}, //14990 #CJK UNIFIED IDEOGRAPH + {0xD778, 0x8B80}, //14991 #CJK UNIFIED IDEOGRAPH + {0xD779, 0x8B81}, //14992 #CJK UNIFIED IDEOGRAPH + {0xD77A, 0x8B82}, //14993 #CJK UNIFIED IDEOGRAPH + {0xD77B, 0x8B83}, //14994 #CJK UNIFIED IDEOGRAPH + {0xD77C, 0x8B84}, //14995 #CJK UNIFIED IDEOGRAPH + {0xD77D, 0x8B85}, //14996 #CJK UNIFIED IDEOGRAPH + {0xD77E, 0x8B86}, //14997 #CJK UNIFIED IDEOGRAPH + {0xD780, 0x8B87}, //14998 #CJK UNIFIED IDEOGRAPH + {0xD781, 0x8B88}, //14999 #CJK UNIFIED IDEOGRAPH + {0xD782, 0x8B89}, //15000 #CJK UNIFIED IDEOGRAPH + {0xD783, 0x8B8A}, //15001 #CJK UNIFIED IDEOGRAPH + {0xD784, 0x8B8B}, //15002 #CJK UNIFIED IDEOGRAPH + {0xD785, 0x8B8C}, //15003 #CJK UNIFIED IDEOGRAPH + {0xD786, 0x8B8D}, //15004 #CJK UNIFIED IDEOGRAPH + {0xD787, 0x8B8E}, //15005 #CJK UNIFIED IDEOGRAPH + {0xD788, 0x8B8F}, //15006 #CJK UNIFIED IDEOGRAPH + {0xD789, 0x8B90}, //15007 #CJK UNIFIED IDEOGRAPH + {0xD78A, 0x8B91}, //15008 #CJK UNIFIED IDEOGRAPH + {0xD78B, 0x8B92}, //15009 #CJK UNIFIED IDEOGRAPH + {0xD78C, 0x8B93}, //15010 #CJK UNIFIED IDEOGRAPH + {0xD78D, 0x8B94}, //15011 #CJK UNIFIED IDEOGRAPH + {0xD78E, 0x8B95}, //15012 #CJK UNIFIED IDEOGRAPH + {0xD78F, 0x8B96}, //15013 #CJK UNIFIED IDEOGRAPH + {0xD790, 0x8B97}, //15014 #CJK UNIFIED IDEOGRAPH + {0xD791, 0x8B98}, //15015 #CJK UNIFIED IDEOGRAPH + {0xD792, 0x8B99}, //15016 #CJK UNIFIED IDEOGRAPH + {0xD793, 0x8B9A}, //15017 #CJK UNIFIED IDEOGRAPH + {0xD794, 0x8B9B}, //15018 #CJK UNIFIED IDEOGRAPH + {0xD795, 0x8B9C}, //15019 #CJK UNIFIED IDEOGRAPH + {0xD796, 0x8B9D}, //15020 #CJK UNIFIED IDEOGRAPH + {0xD797, 0x8B9E}, //15021 #CJK UNIFIED IDEOGRAPH + {0xD798, 0x8B9F}, //15022 #CJK UNIFIED IDEOGRAPH + {0xD799, 0x8BAC}, //15023 #CJK UNIFIED IDEOGRAPH + {0xD79A, 0x8BB1}, //15024 #CJK UNIFIED IDEOGRAPH + {0xD79B, 0x8BBB}, //15025 #CJK UNIFIED IDEOGRAPH + {0xD79C, 0x8BC7}, //15026 #CJK UNIFIED IDEOGRAPH + {0xD79D, 0x8BD0}, //15027 #CJK UNIFIED IDEOGRAPH + {0xD79E, 0x8BEA}, //15028 #CJK UNIFIED IDEOGRAPH + {0xD79F, 0x8C09}, //15029 #CJK UNIFIED IDEOGRAPH + {0xD7A0, 0x8C1E}, //15030 #CJK UNIFIED IDEOGRAPH + {0xD7A1, 0x4F4F}, //15031 #CJK UNIFIED IDEOGRAPH + {0xD7A2, 0x6CE8}, //15032 #CJK UNIFIED IDEOGRAPH + {0xD7A3, 0x795D}, //15033 #CJK UNIFIED IDEOGRAPH + {0xD7A4, 0x9A7B}, //15034 #CJK UNIFIED IDEOGRAPH + {0xD7A5, 0x6293}, //15035 #CJK UNIFIED IDEOGRAPH + {0xD7A6, 0x722A}, //15036 #CJK UNIFIED IDEOGRAPH + {0xD7A7, 0x62FD}, //15037 #CJK UNIFIED IDEOGRAPH + {0xD7A8, 0x4E13}, //15038 #CJK UNIFIED IDEOGRAPH + {0xD7A9, 0x7816}, //15039 #CJK UNIFIED IDEOGRAPH + {0xD7AA, 0x8F6C}, //15040 #CJK UNIFIED IDEOGRAPH + {0xD7AB, 0x64B0}, //15041 #CJK UNIFIED IDEOGRAPH + {0xD7AC, 0x8D5A}, //15042 #CJK UNIFIED IDEOGRAPH + {0xD7AD, 0x7BC6}, //15043 #CJK UNIFIED IDEOGRAPH + {0xD7AE, 0x6869}, //15044 #CJK UNIFIED IDEOGRAPH + {0xD7AF, 0x5E84}, //15045 #CJK UNIFIED IDEOGRAPH + {0xD7B0, 0x88C5}, //15046 #CJK UNIFIED IDEOGRAPH + {0xD7B1, 0x5986}, //15047 #CJK UNIFIED IDEOGRAPH + {0xD7B2, 0x649E}, //15048 #CJK UNIFIED IDEOGRAPH + {0xD7B3, 0x58EE}, //15049 #CJK UNIFIED IDEOGRAPH + {0xD7B4, 0x72B6}, //15050 #CJK UNIFIED IDEOGRAPH + {0xD7B5, 0x690E}, //15051 #CJK UNIFIED IDEOGRAPH + {0xD7B6, 0x9525}, //15052 #CJK UNIFIED IDEOGRAPH + {0xD7B7, 0x8FFD}, //15053 #CJK UNIFIED IDEOGRAPH + {0xD7B8, 0x8D58}, //15054 #CJK UNIFIED IDEOGRAPH + {0xD7B9, 0x5760}, //15055 #CJK UNIFIED IDEOGRAPH + {0xD7BA, 0x7F00}, //15056 #CJK UNIFIED IDEOGRAPH + {0xD7BB, 0x8C06}, //15057 #CJK UNIFIED IDEOGRAPH + {0xD7BC, 0x51C6}, //15058 #CJK UNIFIED IDEOGRAPH + {0xD7BD, 0x6349}, //15059 #CJK UNIFIED IDEOGRAPH + {0xD7BE, 0x62D9}, //15060 #CJK UNIFIED IDEOGRAPH + {0xD7BF, 0x5353}, //15061 #CJK UNIFIED IDEOGRAPH + {0xD7C0, 0x684C}, //15062 #CJK UNIFIED IDEOGRAPH + {0xD7C1, 0x7422}, //15063 #CJK UNIFIED IDEOGRAPH + {0xD7C2, 0x8301}, //15064 #CJK UNIFIED IDEOGRAPH + {0xD7C3, 0x914C}, //15065 #CJK UNIFIED IDEOGRAPH + {0xD7C4, 0x5544}, //15066 #CJK UNIFIED IDEOGRAPH + {0xD7C5, 0x7740}, //15067 #CJK UNIFIED IDEOGRAPH + {0xD7C6, 0x707C}, //15068 #CJK UNIFIED IDEOGRAPH + {0xD7C7, 0x6D4A}, //15069 #CJK UNIFIED IDEOGRAPH + {0xD7C8, 0x5179}, //15070 #CJK UNIFIED IDEOGRAPH + {0xD7C9, 0x54A8}, //15071 #CJK UNIFIED IDEOGRAPH + {0xD7CA, 0x8D44}, //15072 #CJK UNIFIED IDEOGRAPH + {0xD7CB, 0x59FF}, //15073 #CJK UNIFIED IDEOGRAPH + {0xD7CC, 0x6ECB}, //15074 #CJK UNIFIED IDEOGRAPH + {0xD7CD, 0x6DC4}, //15075 #CJK UNIFIED IDEOGRAPH + {0xD7CE, 0x5B5C}, //15076 #CJK UNIFIED IDEOGRAPH + {0xD7CF, 0x7D2B}, //15077 #CJK UNIFIED IDEOGRAPH + {0xD7D0, 0x4ED4}, //15078 #CJK UNIFIED IDEOGRAPH + {0xD7D1, 0x7C7D}, //15079 #CJK UNIFIED IDEOGRAPH + {0xD7D2, 0x6ED3}, //15080 #CJK UNIFIED IDEOGRAPH + {0xD7D3, 0x5B50}, //15081 #CJK UNIFIED IDEOGRAPH + {0xD7D4, 0x81EA}, //15082 #CJK UNIFIED IDEOGRAPH + {0xD7D5, 0x6E0D}, //15083 #CJK UNIFIED IDEOGRAPH + {0xD7D6, 0x5B57}, //15084 #CJK UNIFIED IDEOGRAPH + {0xD7D7, 0x9B03}, //15085 #CJK UNIFIED IDEOGRAPH + {0xD7D8, 0x68D5}, //15086 #CJK UNIFIED IDEOGRAPH + {0xD7D9, 0x8E2A}, //15087 #CJK UNIFIED IDEOGRAPH + {0xD7DA, 0x5B97}, //15088 #CJK UNIFIED IDEOGRAPH + {0xD7DB, 0x7EFC}, //15089 #CJK UNIFIED IDEOGRAPH + {0xD7DC, 0x603B}, //15090 #CJK UNIFIED IDEOGRAPH + {0xD7DD, 0x7EB5}, //15091 #CJK UNIFIED IDEOGRAPH + {0xD7DE, 0x90B9}, //15092 #CJK UNIFIED IDEOGRAPH + {0xD7DF, 0x8D70}, //15093 #CJK UNIFIED IDEOGRAPH + {0xD7E0, 0x594F}, //15094 #CJK UNIFIED IDEOGRAPH + {0xD7E1, 0x63CD}, //15095 #CJK UNIFIED IDEOGRAPH + {0xD7E2, 0x79DF}, //15096 #CJK UNIFIED IDEOGRAPH + {0xD7E3, 0x8DB3}, //15097 #CJK UNIFIED IDEOGRAPH + {0xD7E4, 0x5352}, //15098 #CJK UNIFIED IDEOGRAPH + {0xD7E5, 0x65CF}, //15099 #CJK UNIFIED IDEOGRAPH + {0xD7E6, 0x7956}, //15100 #CJK UNIFIED IDEOGRAPH + {0xD7E7, 0x8BC5}, //15101 #CJK UNIFIED IDEOGRAPH + {0xD7E8, 0x963B}, //15102 #CJK UNIFIED IDEOGRAPH + {0xD7E9, 0x7EC4}, //15103 #CJK UNIFIED IDEOGRAPH + {0xD7EA, 0x94BB}, //15104 #CJK UNIFIED IDEOGRAPH + {0xD7EB, 0x7E82}, //15105 #CJK UNIFIED IDEOGRAPH + {0xD7EC, 0x5634}, //15106 #CJK UNIFIED IDEOGRAPH + {0xD7ED, 0x9189}, //15107 #CJK UNIFIED IDEOGRAPH + {0xD7EE, 0x6700}, //15108 #CJK UNIFIED IDEOGRAPH + {0xD7EF, 0x7F6A}, //15109 #CJK UNIFIED IDEOGRAPH + {0xD7F0, 0x5C0A}, //15110 #CJK UNIFIED IDEOGRAPH + {0xD7F1, 0x9075}, //15111 #CJK UNIFIED IDEOGRAPH + {0xD7F2, 0x6628}, //15112 #CJK UNIFIED IDEOGRAPH + {0xD7F3, 0x5DE6}, //15113 #CJK UNIFIED IDEOGRAPH + {0xD7F4, 0x4F50}, //15114 #CJK UNIFIED IDEOGRAPH + {0xD7F5, 0x67DE}, //15115 #CJK UNIFIED IDEOGRAPH + {0xD7F6, 0x505A}, //15116 #CJK UNIFIED IDEOGRAPH + {0xD7F7, 0x4F5C}, //15117 #CJK UNIFIED IDEOGRAPH + {0xD7F8, 0x5750}, //15118 #CJK UNIFIED IDEOGRAPH + {0xD7F9, 0x5EA7}, //15119 #CJK UNIFIED IDEOGRAPH + {0xD840, 0x8C38}, //15120 #CJK UNIFIED IDEOGRAPH + {0xD841, 0x8C39}, //15121 #CJK UNIFIED IDEOGRAPH + {0xD842, 0x8C3A}, //15122 #CJK UNIFIED IDEOGRAPH + {0xD843, 0x8C3B}, //15123 #CJK UNIFIED IDEOGRAPH + {0xD844, 0x8C3C}, //15124 #CJK UNIFIED IDEOGRAPH + {0xD845, 0x8C3D}, //15125 #CJK UNIFIED IDEOGRAPH + {0xD846, 0x8C3E}, //15126 #CJK UNIFIED IDEOGRAPH + {0xD847, 0x8C3F}, //15127 #CJK UNIFIED IDEOGRAPH + {0xD848, 0x8C40}, //15128 #CJK UNIFIED IDEOGRAPH + {0xD849, 0x8C42}, //15129 #CJK UNIFIED IDEOGRAPH + {0xD84A, 0x8C43}, //15130 #CJK UNIFIED IDEOGRAPH + {0xD84B, 0x8C44}, //15131 #CJK UNIFIED IDEOGRAPH + {0xD84C, 0x8C45}, //15132 #CJK UNIFIED IDEOGRAPH + {0xD84D, 0x8C48}, //15133 #CJK UNIFIED IDEOGRAPH + {0xD84E, 0x8C4A}, //15134 #CJK UNIFIED IDEOGRAPH + {0xD84F, 0x8C4B}, //15135 #CJK UNIFIED IDEOGRAPH + {0xD850, 0x8C4D}, //15136 #CJK UNIFIED IDEOGRAPH + {0xD851, 0x8C4E}, //15137 #CJK UNIFIED IDEOGRAPH + {0xD852, 0x8C4F}, //15138 #CJK UNIFIED IDEOGRAPH + {0xD853, 0x8C50}, //15139 #CJK UNIFIED IDEOGRAPH + {0xD854, 0x8C51}, //15140 #CJK UNIFIED IDEOGRAPH + {0xD855, 0x8C52}, //15141 #CJK UNIFIED IDEOGRAPH + {0xD856, 0x8C53}, //15142 #CJK UNIFIED IDEOGRAPH + {0xD857, 0x8C54}, //15143 #CJK UNIFIED IDEOGRAPH + {0xD858, 0x8C56}, //15144 #CJK UNIFIED IDEOGRAPH + {0xD859, 0x8C57}, //15145 #CJK UNIFIED IDEOGRAPH + {0xD85A, 0x8C58}, //15146 #CJK UNIFIED IDEOGRAPH + {0xD85B, 0x8C59}, //15147 #CJK UNIFIED IDEOGRAPH + {0xD85C, 0x8C5B}, //15148 #CJK UNIFIED IDEOGRAPH + {0xD85D, 0x8C5C}, //15149 #CJK UNIFIED IDEOGRAPH + {0xD85E, 0x8C5D}, //15150 #CJK UNIFIED IDEOGRAPH + {0xD85F, 0x8C5E}, //15151 #CJK UNIFIED IDEOGRAPH + {0xD860, 0x8C5F}, //15152 #CJK UNIFIED IDEOGRAPH + {0xD861, 0x8C60}, //15153 #CJK UNIFIED IDEOGRAPH + {0xD862, 0x8C63}, //15154 #CJK UNIFIED IDEOGRAPH + {0xD863, 0x8C64}, //15155 #CJK UNIFIED IDEOGRAPH + {0xD864, 0x8C65}, //15156 #CJK UNIFIED IDEOGRAPH + {0xD865, 0x8C66}, //15157 #CJK UNIFIED IDEOGRAPH + {0xD866, 0x8C67}, //15158 #CJK UNIFIED IDEOGRAPH + {0xD867, 0x8C68}, //15159 #CJK UNIFIED IDEOGRAPH + {0xD868, 0x8C69}, //15160 #CJK UNIFIED IDEOGRAPH + {0xD869, 0x8C6C}, //15161 #CJK UNIFIED IDEOGRAPH + {0xD86A, 0x8C6D}, //15162 #CJK UNIFIED IDEOGRAPH + {0xD86B, 0x8C6E}, //15163 #CJK UNIFIED IDEOGRAPH + {0xD86C, 0x8C6F}, //15164 #CJK UNIFIED IDEOGRAPH + {0xD86D, 0x8C70}, //15165 #CJK UNIFIED IDEOGRAPH + {0xD86E, 0x8C71}, //15166 #CJK UNIFIED IDEOGRAPH + {0xD86F, 0x8C72}, //15167 #CJK UNIFIED IDEOGRAPH + {0xD870, 0x8C74}, //15168 #CJK UNIFIED IDEOGRAPH + {0xD871, 0x8C75}, //15169 #CJK UNIFIED IDEOGRAPH + {0xD872, 0x8C76}, //15170 #CJK UNIFIED IDEOGRAPH + {0xD873, 0x8C77}, //15171 #CJK UNIFIED IDEOGRAPH + {0xD874, 0x8C7B}, //15172 #CJK UNIFIED IDEOGRAPH + {0xD875, 0x8C7C}, //15173 #CJK UNIFIED IDEOGRAPH + {0xD876, 0x8C7D}, //15174 #CJK UNIFIED IDEOGRAPH + {0xD877, 0x8C7E}, //15175 #CJK UNIFIED IDEOGRAPH + {0xD878, 0x8C7F}, //15176 #CJK UNIFIED IDEOGRAPH + {0xD879, 0x8C80}, //15177 #CJK UNIFIED IDEOGRAPH + {0xD87A, 0x8C81}, //15178 #CJK UNIFIED IDEOGRAPH + {0xD87B, 0x8C83}, //15179 #CJK UNIFIED IDEOGRAPH + {0xD87C, 0x8C84}, //15180 #CJK UNIFIED IDEOGRAPH + {0xD87D, 0x8C86}, //15181 #CJK UNIFIED IDEOGRAPH + {0xD87E, 0x8C87}, //15182 #CJK UNIFIED IDEOGRAPH + {0xD880, 0x8C88}, //15183 #CJK UNIFIED IDEOGRAPH + {0xD881, 0x8C8B}, //15184 #CJK UNIFIED IDEOGRAPH + {0xD882, 0x8C8D}, //15185 #CJK UNIFIED IDEOGRAPH + {0xD883, 0x8C8E}, //15186 #CJK UNIFIED IDEOGRAPH + {0xD884, 0x8C8F}, //15187 #CJK UNIFIED IDEOGRAPH + {0xD885, 0x8C90}, //15188 #CJK UNIFIED IDEOGRAPH + {0xD886, 0x8C91}, //15189 #CJK UNIFIED IDEOGRAPH + {0xD887, 0x8C92}, //15190 #CJK UNIFIED IDEOGRAPH + {0xD888, 0x8C93}, //15191 #CJK UNIFIED IDEOGRAPH + {0xD889, 0x8C95}, //15192 #CJK UNIFIED IDEOGRAPH + {0xD88A, 0x8C96}, //15193 #CJK UNIFIED IDEOGRAPH + {0xD88B, 0x8C97}, //15194 #CJK UNIFIED IDEOGRAPH + {0xD88C, 0x8C99}, //15195 #CJK UNIFIED IDEOGRAPH + {0xD88D, 0x8C9A}, //15196 #CJK UNIFIED IDEOGRAPH + {0xD88E, 0x8C9B}, //15197 #CJK UNIFIED IDEOGRAPH + {0xD88F, 0x8C9C}, //15198 #CJK UNIFIED IDEOGRAPH + {0xD890, 0x8C9D}, //15199 #CJK UNIFIED IDEOGRAPH + {0xD891, 0x8C9E}, //15200 #CJK UNIFIED IDEOGRAPH + {0xD892, 0x8C9F}, //15201 #CJK UNIFIED IDEOGRAPH + {0xD893, 0x8CA0}, //15202 #CJK UNIFIED IDEOGRAPH + {0xD894, 0x8CA1}, //15203 #CJK UNIFIED IDEOGRAPH + {0xD895, 0x8CA2}, //15204 #CJK UNIFIED IDEOGRAPH + {0xD896, 0x8CA3}, //15205 #CJK UNIFIED IDEOGRAPH + {0xD897, 0x8CA4}, //15206 #CJK UNIFIED IDEOGRAPH + {0xD898, 0x8CA5}, //15207 #CJK UNIFIED IDEOGRAPH + {0xD899, 0x8CA6}, //15208 #CJK UNIFIED IDEOGRAPH + {0xD89A, 0x8CA7}, //15209 #CJK UNIFIED IDEOGRAPH + {0xD89B, 0x8CA8}, //15210 #CJK UNIFIED IDEOGRAPH + {0xD89C, 0x8CA9}, //15211 #CJK UNIFIED IDEOGRAPH + {0xD89D, 0x8CAA}, //15212 #CJK UNIFIED IDEOGRAPH + {0xD89E, 0x8CAB}, //15213 #CJK UNIFIED IDEOGRAPH + {0xD89F, 0x8CAC}, //15214 #CJK UNIFIED IDEOGRAPH + {0xD8A0, 0x8CAD}, //15215 #CJK UNIFIED IDEOGRAPH + {0xD8A1, 0x4E8D}, //15216 #CJK UNIFIED IDEOGRAPH + {0xD8A2, 0x4E0C}, //15217 #CJK UNIFIED IDEOGRAPH + {0xD8A3, 0x5140}, //15218 #CJK UNIFIED IDEOGRAPH + {0xD8A4, 0x4E10}, //15219 #CJK UNIFIED IDEOGRAPH + {0xD8A5, 0x5EFF}, //15220 #CJK UNIFIED IDEOGRAPH + {0xD8A6, 0x5345}, //15221 #CJK UNIFIED IDEOGRAPH + {0xD8A7, 0x4E15}, //15222 #CJK UNIFIED IDEOGRAPH + {0xD8A8, 0x4E98}, //15223 #CJK UNIFIED IDEOGRAPH + {0xD8A9, 0x4E1E}, //15224 #CJK UNIFIED IDEOGRAPH + {0xD8AA, 0x9B32}, //15225 #CJK UNIFIED IDEOGRAPH + {0xD8AB, 0x5B6C}, //15226 #CJK UNIFIED IDEOGRAPH + {0xD8AC, 0x5669}, //15227 #CJK UNIFIED IDEOGRAPH + {0xD8AD, 0x4E28}, //15228 #CJK UNIFIED IDEOGRAPH + {0xD8AE, 0x79BA}, //15229 #CJK UNIFIED IDEOGRAPH + {0xD8AF, 0x4E3F}, //15230 #CJK UNIFIED IDEOGRAPH + {0xD8B0, 0x5315}, //15231 #CJK UNIFIED IDEOGRAPH + {0xD8B1, 0x4E47}, //15232 #CJK UNIFIED IDEOGRAPH + {0xD8B2, 0x592D}, //15233 #CJK UNIFIED IDEOGRAPH + {0xD8B3, 0x723B}, //15234 #CJK UNIFIED IDEOGRAPH + {0xD8B4, 0x536E}, //15235 #CJK UNIFIED IDEOGRAPH + {0xD8B5, 0x6C10}, //15236 #CJK UNIFIED IDEOGRAPH + {0xD8B6, 0x56DF}, //15237 #CJK UNIFIED IDEOGRAPH + {0xD8B7, 0x80E4}, //15238 #CJK UNIFIED IDEOGRAPH + {0xD8B8, 0x9997}, //15239 #CJK UNIFIED IDEOGRAPH + {0xD8B9, 0x6BD3}, //15240 #CJK UNIFIED IDEOGRAPH + {0xD8BA, 0x777E}, //15241 #CJK UNIFIED IDEOGRAPH + {0xD8BB, 0x9F17}, //15242 #CJK UNIFIED IDEOGRAPH + {0xD8BC, 0x4E36}, //15243 #CJK UNIFIED IDEOGRAPH + {0xD8BD, 0x4E9F}, //15244 #CJK UNIFIED IDEOGRAPH + {0xD8BE, 0x9F10}, //15245 #CJK UNIFIED IDEOGRAPH + {0xD8BF, 0x4E5C}, //15246 #CJK UNIFIED IDEOGRAPH + {0xD8C0, 0x4E69}, //15247 #CJK UNIFIED IDEOGRAPH + {0xD8C1, 0x4E93}, //15248 #CJK UNIFIED IDEOGRAPH + {0xD8C2, 0x8288}, //15249 #CJK UNIFIED IDEOGRAPH + {0xD8C3, 0x5B5B}, //15250 #CJK UNIFIED IDEOGRAPH + {0xD8C4, 0x556C}, //15251 #CJK UNIFIED IDEOGRAPH + {0xD8C5, 0x560F}, //15252 #CJK UNIFIED IDEOGRAPH + {0xD8C6, 0x4EC4}, //15253 #CJK UNIFIED IDEOGRAPH + {0xD8C7, 0x538D}, //15254 #CJK UNIFIED IDEOGRAPH + {0xD8C8, 0x539D}, //15255 #CJK UNIFIED IDEOGRAPH + {0xD8C9, 0x53A3}, //15256 #CJK UNIFIED IDEOGRAPH + {0xD8CA, 0x53A5}, //15257 #CJK UNIFIED IDEOGRAPH + {0xD8CB, 0x53AE}, //15258 #CJK UNIFIED IDEOGRAPH + {0xD8CC, 0x9765}, //15259 #CJK UNIFIED IDEOGRAPH + {0xD8CD, 0x8D5D}, //15260 #CJK UNIFIED IDEOGRAPH + {0xD8CE, 0x531A}, //15261 #CJK UNIFIED IDEOGRAPH + {0xD8CF, 0x53F5}, //15262 #CJK UNIFIED IDEOGRAPH + {0xD8D0, 0x5326}, //15263 #CJK UNIFIED IDEOGRAPH + {0xD8D1, 0x532E}, //15264 #CJK UNIFIED IDEOGRAPH + {0xD8D2, 0x533E}, //15265 #CJK UNIFIED IDEOGRAPH + {0xD8D3, 0x8D5C}, //15266 #CJK UNIFIED IDEOGRAPH + {0xD8D4, 0x5366}, //15267 #CJK UNIFIED IDEOGRAPH + {0xD8D5, 0x5363}, //15268 #CJK UNIFIED IDEOGRAPH + {0xD8D6, 0x5202}, //15269 #CJK UNIFIED IDEOGRAPH + {0xD8D7, 0x5208}, //15270 #CJK UNIFIED IDEOGRAPH + {0xD8D8, 0x520E}, //15271 #CJK UNIFIED IDEOGRAPH + {0xD8D9, 0x522D}, //15272 #CJK UNIFIED IDEOGRAPH + {0xD8DA, 0x5233}, //15273 #CJK UNIFIED IDEOGRAPH + {0xD8DB, 0x523F}, //15274 #CJK UNIFIED IDEOGRAPH + {0xD8DC, 0x5240}, //15275 #CJK UNIFIED IDEOGRAPH + {0xD8DD, 0x524C}, //15276 #CJK UNIFIED IDEOGRAPH + {0xD8DE, 0x525E}, //15277 #CJK UNIFIED IDEOGRAPH + {0xD8DF, 0x5261}, //15278 #CJK UNIFIED IDEOGRAPH + {0xD8E0, 0x525C}, //15279 #CJK UNIFIED IDEOGRAPH + {0xD8E1, 0x84AF}, //15280 #CJK UNIFIED IDEOGRAPH + {0xD8E2, 0x527D}, //15281 #CJK UNIFIED IDEOGRAPH + {0xD8E3, 0x5282}, //15282 #CJK UNIFIED IDEOGRAPH + {0xD8E4, 0x5281}, //15283 #CJK UNIFIED IDEOGRAPH + {0xD8E5, 0x5290}, //15284 #CJK UNIFIED IDEOGRAPH + {0xD8E6, 0x5293}, //15285 #CJK UNIFIED IDEOGRAPH + {0xD8E7, 0x5182}, //15286 #CJK UNIFIED IDEOGRAPH + {0xD8E8, 0x7F54}, //15287 #CJK UNIFIED IDEOGRAPH + {0xD8E9, 0x4EBB}, //15288 #CJK UNIFIED IDEOGRAPH + {0xD8EA, 0x4EC3}, //15289 #CJK UNIFIED IDEOGRAPH + {0xD8EB, 0x4EC9}, //15290 #CJK UNIFIED IDEOGRAPH + {0xD8EC, 0x4EC2}, //15291 #CJK UNIFIED IDEOGRAPH + {0xD8ED, 0x4EE8}, //15292 #CJK UNIFIED IDEOGRAPH + {0xD8EE, 0x4EE1}, //15293 #CJK UNIFIED IDEOGRAPH + {0xD8EF, 0x4EEB}, //15294 #CJK UNIFIED IDEOGRAPH + {0xD8F0, 0x4EDE}, //15295 #CJK UNIFIED IDEOGRAPH + {0xD8F1, 0x4F1B}, //15296 #CJK UNIFIED IDEOGRAPH + {0xD8F2, 0x4EF3}, //15297 #CJK UNIFIED IDEOGRAPH + {0xD8F3, 0x4F22}, //15298 #CJK UNIFIED IDEOGRAPH + {0xD8F4, 0x4F64}, //15299 #CJK UNIFIED IDEOGRAPH + {0xD8F5, 0x4EF5}, //15300 #CJK UNIFIED IDEOGRAPH + {0xD8F6, 0x4F25}, //15301 #CJK UNIFIED IDEOGRAPH + {0xD8F7, 0x4F27}, //15302 #CJK UNIFIED IDEOGRAPH + {0xD8F8, 0x4F09}, //15303 #CJK UNIFIED IDEOGRAPH + {0xD8F9, 0x4F2B}, //15304 #CJK UNIFIED IDEOGRAPH + {0xD8FA, 0x4F5E}, //15305 #CJK UNIFIED IDEOGRAPH + {0xD8FB, 0x4F67}, //15306 #CJK UNIFIED IDEOGRAPH + {0xD8FC, 0x6538}, //15307 #CJK UNIFIED IDEOGRAPH + {0xD8FD, 0x4F5A}, //15308 #CJK UNIFIED IDEOGRAPH + {0xD8FE, 0x4F5D}, //15309 #CJK UNIFIED IDEOGRAPH + {0xD940, 0x8CAE}, //15310 #CJK UNIFIED IDEOGRAPH + {0xD941, 0x8CAF}, //15311 #CJK UNIFIED IDEOGRAPH + {0xD942, 0x8CB0}, //15312 #CJK UNIFIED IDEOGRAPH + {0xD943, 0x8CB1}, //15313 #CJK UNIFIED IDEOGRAPH + {0xD944, 0x8CB2}, //15314 #CJK UNIFIED IDEOGRAPH + {0xD945, 0x8CB3}, //15315 #CJK UNIFIED IDEOGRAPH + {0xD946, 0x8CB4}, //15316 #CJK UNIFIED IDEOGRAPH + {0xD947, 0x8CB5}, //15317 #CJK UNIFIED IDEOGRAPH + {0xD948, 0x8CB6}, //15318 #CJK UNIFIED IDEOGRAPH + {0xD949, 0x8CB7}, //15319 #CJK UNIFIED IDEOGRAPH + {0xD94A, 0x8CB8}, //15320 #CJK UNIFIED IDEOGRAPH + {0xD94B, 0x8CB9}, //15321 #CJK UNIFIED IDEOGRAPH + {0xD94C, 0x8CBA}, //15322 #CJK UNIFIED IDEOGRAPH + {0xD94D, 0x8CBB}, //15323 #CJK UNIFIED IDEOGRAPH + {0xD94E, 0x8CBC}, //15324 #CJK UNIFIED IDEOGRAPH + {0xD94F, 0x8CBD}, //15325 #CJK UNIFIED IDEOGRAPH + {0xD950, 0x8CBE}, //15326 #CJK UNIFIED IDEOGRAPH + {0xD951, 0x8CBF}, //15327 #CJK UNIFIED IDEOGRAPH + {0xD952, 0x8CC0}, //15328 #CJK UNIFIED IDEOGRAPH + {0xD953, 0x8CC1}, //15329 #CJK UNIFIED IDEOGRAPH + {0xD954, 0x8CC2}, //15330 #CJK UNIFIED IDEOGRAPH + {0xD955, 0x8CC3}, //15331 #CJK UNIFIED IDEOGRAPH + {0xD956, 0x8CC4}, //15332 #CJK UNIFIED IDEOGRAPH + {0xD957, 0x8CC5}, //15333 #CJK UNIFIED IDEOGRAPH + {0xD958, 0x8CC6}, //15334 #CJK UNIFIED IDEOGRAPH + {0xD959, 0x8CC7}, //15335 #CJK UNIFIED IDEOGRAPH + {0xD95A, 0x8CC8}, //15336 #CJK UNIFIED IDEOGRAPH + {0xD95B, 0x8CC9}, //15337 #CJK UNIFIED IDEOGRAPH + {0xD95C, 0x8CCA}, //15338 #CJK UNIFIED IDEOGRAPH + {0xD95D, 0x8CCB}, //15339 #CJK UNIFIED IDEOGRAPH + {0xD95E, 0x8CCC}, //15340 #CJK UNIFIED IDEOGRAPH + {0xD95F, 0x8CCD}, //15341 #CJK UNIFIED IDEOGRAPH + {0xD960, 0x8CCE}, //15342 #CJK UNIFIED IDEOGRAPH + {0xD961, 0x8CCF}, //15343 #CJK UNIFIED IDEOGRAPH + {0xD962, 0x8CD0}, //15344 #CJK UNIFIED IDEOGRAPH + {0xD963, 0x8CD1}, //15345 #CJK UNIFIED IDEOGRAPH + {0xD964, 0x8CD2}, //15346 #CJK UNIFIED IDEOGRAPH + {0xD965, 0x8CD3}, //15347 #CJK UNIFIED IDEOGRAPH + {0xD966, 0x8CD4}, //15348 #CJK UNIFIED IDEOGRAPH + {0xD967, 0x8CD5}, //15349 #CJK UNIFIED IDEOGRAPH + {0xD968, 0x8CD6}, //15350 #CJK UNIFIED IDEOGRAPH + {0xD969, 0x8CD7}, //15351 #CJK UNIFIED IDEOGRAPH + {0xD96A, 0x8CD8}, //15352 #CJK UNIFIED IDEOGRAPH + {0xD96B, 0x8CD9}, //15353 #CJK UNIFIED IDEOGRAPH + {0xD96C, 0x8CDA}, //15354 #CJK UNIFIED IDEOGRAPH + {0xD96D, 0x8CDB}, //15355 #CJK UNIFIED IDEOGRAPH + {0xD96E, 0x8CDC}, //15356 #CJK UNIFIED IDEOGRAPH + {0xD96F, 0x8CDD}, //15357 #CJK UNIFIED IDEOGRAPH + {0xD970, 0x8CDE}, //15358 #CJK UNIFIED IDEOGRAPH + {0xD971, 0x8CDF}, //15359 #CJK UNIFIED IDEOGRAPH + {0xD972, 0x8CE0}, //15360 #CJK UNIFIED IDEOGRAPH + {0xD973, 0x8CE1}, //15361 #CJK UNIFIED IDEOGRAPH + {0xD974, 0x8CE2}, //15362 #CJK UNIFIED IDEOGRAPH + {0xD975, 0x8CE3}, //15363 #CJK UNIFIED IDEOGRAPH + {0xD976, 0x8CE4}, //15364 #CJK UNIFIED IDEOGRAPH + {0xD977, 0x8CE5}, //15365 #CJK UNIFIED IDEOGRAPH + {0xD978, 0x8CE6}, //15366 #CJK UNIFIED IDEOGRAPH + {0xD979, 0x8CE7}, //15367 #CJK UNIFIED IDEOGRAPH + {0xD97A, 0x8CE8}, //15368 #CJK UNIFIED IDEOGRAPH + {0xD97B, 0x8CE9}, //15369 #CJK UNIFIED IDEOGRAPH + {0xD97C, 0x8CEA}, //15370 #CJK UNIFIED IDEOGRAPH + {0xD97D, 0x8CEB}, //15371 #CJK UNIFIED IDEOGRAPH + {0xD97E, 0x8CEC}, //15372 #CJK UNIFIED IDEOGRAPH + {0xD980, 0x8CED}, //15373 #CJK UNIFIED IDEOGRAPH + {0xD981, 0x8CEE}, //15374 #CJK UNIFIED IDEOGRAPH + {0xD982, 0x8CEF}, //15375 #CJK UNIFIED IDEOGRAPH + {0xD983, 0x8CF0}, //15376 #CJK UNIFIED IDEOGRAPH + {0xD984, 0x8CF1}, //15377 #CJK UNIFIED IDEOGRAPH + {0xD985, 0x8CF2}, //15378 #CJK UNIFIED IDEOGRAPH + {0xD986, 0x8CF3}, //15379 #CJK UNIFIED IDEOGRAPH + {0xD987, 0x8CF4}, //15380 #CJK UNIFIED IDEOGRAPH + {0xD988, 0x8CF5}, //15381 #CJK UNIFIED IDEOGRAPH + {0xD989, 0x8CF6}, //15382 #CJK UNIFIED IDEOGRAPH + {0xD98A, 0x8CF7}, //15383 #CJK UNIFIED IDEOGRAPH + {0xD98B, 0x8CF8}, //15384 #CJK UNIFIED IDEOGRAPH + {0xD98C, 0x8CF9}, //15385 #CJK UNIFIED IDEOGRAPH + {0xD98D, 0x8CFA}, //15386 #CJK UNIFIED IDEOGRAPH + {0xD98E, 0x8CFB}, //15387 #CJK UNIFIED IDEOGRAPH + {0xD98F, 0x8CFC}, //15388 #CJK UNIFIED IDEOGRAPH + {0xD990, 0x8CFD}, //15389 #CJK UNIFIED IDEOGRAPH + {0xD991, 0x8CFE}, //15390 #CJK UNIFIED IDEOGRAPH + {0xD992, 0x8CFF}, //15391 #CJK UNIFIED IDEOGRAPH + {0xD993, 0x8D00}, //15392 #CJK UNIFIED IDEOGRAPH + {0xD994, 0x8D01}, //15393 #CJK UNIFIED IDEOGRAPH + {0xD995, 0x8D02}, //15394 #CJK UNIFIED IDEOGRAPH + {0xD996, 0x8D03}, //15395 #CJK UNIFIED IDEOGRAPH + {0xD997, 0x8D04}, //15396 #CJK UNIFIED IDEOGRAPH + {0xD998, 0x8D05}, //15397 #CJK UNIFIED IDEOGRAPH + {0xD999, 0x8D06}, //15398 #CJK UNIFIED IDEOGRAPH + {0xD99A, 0x8D07}, //15399 #CJK UNIFIED IDEOGRAPH + {0xD99B, 0x8D08}, //15400 #CJK UNIFIED IDEOGRAPH + {0xD99C, 0x8D09}, //15401 #CJK UNIFIED IDEOGRAPH + {0xD99D, 0x8D0A}, //15402 #CJK UNIFIED IDEOGRAPH + {0xD99E, 0x8D0B}, //15403 #CJK UNIFIED IDEOGRAPH + {0xD99F, 0x8D0C}, //15404 #CJK UNIFIED IDEOGRAPH + {0xD9A0, 0x8D0D}, //15405 #CJK UNIFIED IDEOGRAPH + {0xD9A1, 0x4F5F}, //15406 #CJK UNIFIED IDEOGRAPH + {0xD9A2, 0x4F57}, //15407 #CJK UNIFIED IDEOGRAPH + {0xD9A3, 0x4F32}, //15408 #CJK UNIFIED IDEOGRAPH + {0xD9A4, 0x4F3D}, //15409 #CJK UNIFIED IDEOGRAPH + {0xD9A5, 0x4F76}, //15410 #CJK UNIFIED IDEOGRAPH + {0xD9A6, 0x4F74}, //15411 #CJK UNIFIED IDEOGRAPH + {0xD9A7, 0x4F91}, //15412 #CJK UNIFIED IDEOGRAPH + {0xD9A8, 0x4F89}, //15413 #CJK UNIFIED IDEOGRAPH + {0xD9A9, 0x4F83}, //15414 #CJK UNIFIED IDEOGRAPH + {0xD9AA, 0x4F8F}, //15415 #CJK UNIFIED IDEOGRAPH + {0xD9AB, 0x4F7E}, //15416 #CJK UNIFIED IDEOGRAPH + {0xD9AC, 0x4F7B}, //15417 #CJK UNIFIED IDEOGRAPH + {0xD9AD, 0x4FAA}, //15418 #CJK UNIFIED IDEOGRAPH + {0xD9AE, 0x4F7C}, //15419 #CJK UNIFIED IDEOGRAPH + {0xD9AF, 0x4FAC}, //15420 #CJK UNIFIED IDEOGRAPH + {0xD9B0, 0x4F94}, //15421 #CJK UNIFIED IDEOGRAPH + {0xD9B1, 0x4FE6}, //15422 #CJK UNIFIED IDEOGRAPH + {0xD9B2, 0x4FE8}, //15423 #CJK UNIFIED IDEOGRAPH + {0xD9B3, 0x4FEA}, //15424 #CJK UNIFIED IDEOGRAPH + {0xD9B4, 0x4FC5}, //15425 #CJK UNIFIED IDEOGRAPH + {0xD9B5, 0x4FDA}, //15426 #CJK UNIFIED IDEOGRAPH + {0xD9B6, 0x4FE3}, //15427 #CJK UNIFIED IDEOGRAPH + {0xD9B7, 0x4FDC}, //15428 #CJK UNIFIED IDEOGRAPH + {0xD9B8, 0x4FD1}, //15429 #CJK UNIFIED IDEOGRAPH + {0xD9B9, 0x4FDF}, //15430 #CJK UNIFIED IDEOGRAPH + {0xD9BA, 0x4FF8}, //15431 #CJK UNIFIED IDEOGRAPH + {0xD9BB, 0x5029}, //15432 #CJK UNIFIED IDEOGRAPH + {0xD9BC, 0x504C}, //15433 #CJK UNIFIED IDEOGRAPH + {0xD9BD, 0x4FF3}, //15434 #CJK UNIFIED IDEOGRAPH + {0xD9BE, 0x502C}, //15435 #CJK UNIFIED IDEOGRAPH + {0xD9BF, 0x500F}, //15436 #CJK UNIFIED IDEOGRAPH + {0xD9C0, 0x502E}, //15437 #CJK UNIFIED IDEOGRAPH + {0xD9C1, 0x502D}, //15438 #CJK UNIFIED IDEOGRAPH + {0xD9C2, 0x4FFE}, //15439 #CJK UNIFIED IDEOGRAPH + {0xD9C3, 0x501C}, //15440 #CJK UNIFIED IDEOGRAPH + {0xD9C4, 0x500C}, //15441 #CJK UNIFIED IDEOGRAPH + {0xD9C5, 0x5025}, //15442 #CJK UNIFIED IDEOGRAPH + {0xD9C6, 0x5028}, //15443 #CJK UNIFIED IDEOGRAPH + {0xD9C7, 0x507E}, //15444 #CJK UNIFIED IDEOGRAPH + {0xD9C8, 0x5043}, //15445 #CJK UNIFIED IDEOGRAPH + {0xD9C9, 0x5055}, //15446 #CJK UNIFIED IDEOGRAPH + {0xD9CA, 0x5048}, //15447 #CJK UNIFIED IDEOGRAPH + {0xD9CB, 0x504E}, //15448 #CJK UNIFIED IDEOGRAPH + {0xD9CC, 0x506C}, //15449 #CJK UNIFIED IDEOGRAPH + {0xD9CD, 0x507B}, //15450 #CJK UNIFIED IDEOGRAPH + {0xD9CE, 0x50A5}, //15451 #CJK UNIFIED IDEOGRAPH + {0xD9CF, 0x50A7}, //15452 #CJK UNIFIED IDEOGRAPH + {0xD9D0, 0x50A9}, //15453 #CJK UNIFIED IDEOGRAPH + {0xD9D1, 0x50BA}, //15454 #CJK UNIFIED IDEOGRAPH + {0xD9D2, 0x50D6}, //15455 #CJK UNIFIED IDEOGRAPH + {0xD9D3, 0x5106}, //15456 #CJK UNIFIED IDEOGRAPH + {0xD9D4, 0x50ED}, //15457 #CJK UNIFIED IDEOGRAPH + {0xD9D5, 0x50EC}, //15458 #CJK UNIFIED IDEOGRAPH + {0xD9D6, 0x50E6}, //15459 #CJK UNIFIED IDEOGRAPH + {0xD9D7, 0x50EE}, //15460 #CJK UNIFIED IDEOGRAPH + {0xD9D8, 0x5107}, //15461 #CJK UNIFIED IDEOGRAPH + {0xD9D9, 0x510B}, //15462 #CJK UNIFIED IDEOGRAPH + {0xD9DA, 0x4EDD}, //15463 #CJK UNIFIED IDEOGRAPH + {0xD9DB, 0x6C3D}, //15464 #CJK UNIFIED IDEOGRAPH + {0xD9DC, 0x4F58}, //15465 #CJK UNIFIED IDEOGRAPH + {0xD9DD, 0x4F65}, //15466 #CJK UNIFIED IDEOGRAPH + {0xD9DE, 0x4FCE}, //15467 #CJK UNIFIED IDEOGRAPH + {0xD9DF, 0x9FA0}, //15468 #CJK UNIFIED IDEOGRAPH + {0xD9E0, 0x6C46}, //15469 #CJK UNIFIED IDEOGRAPH + {0xD9E1, 0x7C74}, //15470 #CJK UNIFIED IDEOGRAPH + {0xD9E2, 0x516E}, //15471 #CJK UNIFIED IDEOGRAPH + {0xD9E3, 0x5DFD}, //15472 #CJK UNIFIED IDEOGRAPH + {0xD9E4, 0x9EC9}, //15473 #CJK UNIFIED IDEOGRAPH + {0xD9E5, 0x9998}, //15474 #CJK UNIFIED IDEOGRAPH + {0xD9E6, 0x5181}, //15475 #CJK UNIFIED IDEOGRAPH + {0xD9E7, 0x5914}, //15476 #CJK UNIFIED IDEOGRAPH + {0xD9E8, 0x52F9}, //15477 #CJK UNIFIED IDEOGRAPH + {0xD9E9, 0x530D}, //15478 #CJK UNIFIED IDEOGRAPH + {0xD9EA, 0x8A07}, //15479 #CJK UNIFIED IDEOGRAPH + {0xD9EB, 0x5310}, //15480 #CJK UNIFIED IDEOGRAPH + {0xD9EC, 0x51EB}, //15481 #CJK UNIFIED IDEOGRAPH + {0xD9ED, 0x5919}, //15482 #CJK UNIFIED IDEOGRAPH + {0xD9EE, 0x5155}, //15483 #CJK UNIFIED IDEOGRAPH + {0xD9EF, 0x4EA0}, //15484 #CJK UNIFIED IDEOGRAPH + {0xD9F0, 0x5156}, //15485 #CJK UNIFIED IDEOGRAPH + {0xD9F1, 0x4EB3}, //15486 #CJK UNIFIED IDEOGRAPH + {0xD9F2, 0x886E}, //15487 #CJK UNIFIED IDEOGRAPH + {0xD9F3, 0x88A4}, //15488 #CJK UNIFIED IDEOGRAPH + {0xD9F4, 0x4EB5}, //15489 #CJK UNIFIED IDEOGRAPH + {0xD9F5, 0x8114}, //15490 #CJK UNIFIED IDEOGRAPH + {0xD9F6, 0x88D2}, //15491 #CJK UNIFIED IDEOGRAPH + {0xD9F7, 0x7980}, //15492 #CJK UNIFIED IDEOGRAPH + {0xD9F8, 0x5B34}, //15493 #CJK UNIFIED IDEOGRAPH + {0xD9F9, 0x8803}, //15494 #CJK UNIFIED IDEOGRAPH + {0xD9FA, 0x7FB8}, //15495 #CJK UNIFIED IDEOGRAPH + {0xD9FB, 0x51AB}, //15496 #CJK UNIFIED IDEOGRAPH + {0xD9FC, 0x51B1}, //15497 #CJK UNIFIED IDEOGRAPH + {0xD9FD, 0x51BD}, //15498 #CJK UNIFIED IDEOGRAPH + {0xD9FE, 0x51BC}, //15499 #CJK UNIFIED IDEOGRAPH + {0xDA40, 0x8D0E}, //15500 #CJK UNIFIED IDEOGRAPH + {0xDA41, 0x8D0F}, //15501 #CJK UNIFIED IDEOGRAPH + {0xDA42, 0x8D10}, //15502 #CJK UNIFIED IDEOGRAPH + {0xDA43, 0x8D11}, //15503 #CJK UNIFIED IDEOGRAPH + {0xDA44, 0x8D12}, //15504 #CJK UNIFIED IDEOGRAPH + {0xDA45, 0x8D13}, //15505 #CJK UNIFIED IDEOGRAPH + {0xDA46, 0x8D14}, //15506 #CJK UNIFIED IDEOGRAPH + {0xDA47, 0x8D15}, //15507 #CJK UNIFIED IDEOGRAPH + {0xDA48, 0x8D16}, //15508 #CJK UNIFIED IDEOGRAPH + {0xDA49, 0x8D17}, //15509 #CJK UNIFIED IDEOGRAPH + {0xDA4A, 0x8D18}, //15510 #CJK UNIFIED IDEOGRAPH + {0xDA4B, 0x8D19}, //15511 #CJK UNIFIED IDEOGRAPH + {0xDA4C, 0x8D1A}, //15512 #CJK UNIFIED IDEOGRAPH + {0xDA4D, 0x8D1B}, //15513 #CJK UNIFIED IDEOGRAPH + {0xDA4E, 0x8D1C}, //15514 #CJK UNIFIED IDEOGRAPH + {0xDA4F, 0x8D20}, //15515 #CJK UNIFIED IDEOGRAPH + {0xDA50, 0x8D51}, //15516 #CJK UNIFIED IDEOGRAPH + {0xDA51, 0x8D52}, //15517 #CJK UNIFIED IDEOGRAPH + {0xDA52, 0x8D57}, //15518 #CJK UNIFIED IDEOGRAPH + {0xDA53, 0x8D5F}, //15519 #CJK UNIFIED IDEOGRAPH + {0xDA54, 0x8D65}, //15520 #CJK UNIFIED IDEOGRAPH + {0xDA55, 0x8D68}, //15521 #CJK UNIFIED IDEOGRAPH + {0xDA56, 0x8D69}, //15522 #CJK UNIFIED IDEOGRAPH + {0xDA57, 0x8D6A}, //15523 #CJK UNIFIED IDEOGRAPH + {0xDA58, 0x8D6C}, //15524 #CJK UNIFIED IDEOGRAPH + {0xDA59, 0x8D6E}, //15525 #CJK UNIFIED IDEOGRAPH + {0xDA5A, 0x8D6F}, //15526 #CJK UNIFIED IDEOGRAPH + {0xDA5B, 0x8D71}, //15527 #CJK UNIFIED IDEOGRAPH + {0xDA5C, 0x8D72}, //15528 #CJK UNIFIED IDEOGRAPH + {0xDA5D, 0x8D78}, //15529 #CJK UNIFIED IDEOGRAPH + {0xDA5E, 0x8D79}, //15530 #CJK UNIFIED IDEOGRAPH + {0xDA5F, 0x8D7A}, //15531 #CJK UNIFIED IDEOGRAPH + {0xDA60, 0x8D7B}, //15532 #CJK UNIFIED IDEOGRAPH + {0xDA61, 0x8D7C}, //15533 #CJK UNIFIED IDEOGRAPH + {0xDA62, 0x8D7D}, //15534 #CJK UNIFIED IDEOGRAPH + {0xDA63, 0x8D7E}, //15535 #CJK UNIFIED IDEOGRAPH + {0xDA64, 0x8D7F}, //15536 #CJK UNIFIED IDEOGRAPH + {0xDA65, 0x8D80}, //15537 #CJK UNIFIED IDEOGRAPH + {0xDA66, 0x8D82}, //15538 #CJK UNIFIED IDEOGRAPH + {0xDA67, 0x8D83}, //15539 #CJK UNIFIED IDEOGRAPH + {0xDA68, 0x8D86}, //15540 #CJK UNIFIED IDEOGRAPH + {0xDA69, 0x8D87}, //15541 #CJK UNIFIED IDEOGRAPH + {0xDA6A, 0x8D88}, //15542 #CJK UNIFIED IDEOGRAPH + {0xDA6B, 0x8D89}, //15543 #CJK UNIFIED IDEOGRAPH + {0xDA6C, 0x8D8C}, //15544 #CJK UNIFIED IDEOGRAPH + {0xDA6D, 0x8D8D}, //15545 #CJK UNIFIED IDEOGRAPH + {0xDA6E, 0x8D8E}, //15546 #CJK UNIFIED IDEOGRAPH + {0xDA6F, 0x8D8F}, //15547 #CJK UNIFIED IDEOGRAPH + {0xDA70, 0x8D90}, //15548 #CJK UNIFIED IDEOGRAPH + {0xDA71, 0x8D92}, //15549 #CJK UNIFIED IDEOGRAPH + {0xDA72, 0x8D93}, //15550 #CJK UNIFIED IDEOGRAPH + {0xDA73, 0x8D95}, //15551 #CJK UNIFIED IDEOGRAPH + {0xDA74, 0x8D96}, //15552 #CJK UNIFIED IDEOGRAPH + {0xDA75, 0x8D97}, //15553 #CJK UNIFIED IDEOGRAPH + {0xDA76, 0x8D98}, //15554 #CJK UNIFIED IDEOGRAPH + {0xDA77, 0x8D99}, //15555 #CJK UNIFIED IDEOGRAPH + {0xDA78, 0x8D9A}, //15556 #CJK UNIFIED IDEOGRAPH + {0xDA79, 0x8D9B}, //15557 #CJK UNIFIED IDEOGRAPH + {0xDA7A, 0x8D9C}, //15558 #CJK UNIFIED IDEOGRAPH + {0xDA7B, 0x8D9D}, //15559 #CJK UNIFIED IDEOGRAPH + {0xDA7C, 0x8D9E}, //15560 #CJK UNIFIED IDEOGRAPH + {0xDA7D, 0x8DA0}, //15561 #CJK UNIFIED IDEOGRAPH + {0xDA7E, 0x8DA1}, //15562 #CJK UNIFIED IDEOGRAPH + {0xDA80, 0x8DA2}, //15563 #CJK UNIFIED IDEOGRAPH + {0xDA81, 0x8DA4}, //15564 #CJK UNIFIED IDEOGRAPH + {0xDA82, 0x8DA5}, //15565 #CJK UNIFIED IDEOGRAPH + {0xDA83, 0x8DA6}, //15566 #CJK UNIFIED IDEOGRAPH + {0xDA84, 0x8DA7}, //15567 #CJK UNIFIED IDEOGRAPH + {0xDA85, 0x8DA8}, //15568 #CJK UNIFIED IDEOGRAPH + {0xDA86, 0x8DA9}, //15569 #CJK UNIFIED IDEOGRAPH + {0xDA87, 0x8DAA}, //15570 #CJK UNIFIED IDEOGRAPH + {0xDA88, 0x8DAB}, //15571 #CJK UNIFIED IDEOGRAPH + {0xDA89, 0x8DAC}, //15572 #CJK UNIFIED IDEOGRAPH + {0xDA8A, 0x8DAD}, //15573 #CJK UNIFIED IDEOGRAPH + {0xDA8B, 0x8DAE}, //15574 #CJK UNIFIED IDEOGRAPH + {0xDA8C, 0x8DAF}, //15575 #CJK UNIFIED IDEOGRAPH + {0xDA8D, 0x8DB0}, //15576 #CJK UNIFIED IDEOGRAPH + {0xDA8E, 0x8DB2}, //15577 #CJK UNIFIED IDEOGRAPH + {0xDA8F, 0x8DB6}, //15578 #CJK UNIFIED IDEOGRAPH + {0xDA90, 0x8DB7}, //15579 #CJK UNIFIED IDEOGRAPH + {0xDA91, 0x8DB9}, //15580 #CJK UNIFIED IDEOGRAPH + {0xDA92, 0x8DBB}, //15581 #CJK UNIFIED IDEOGRAPH + {0xDA93, 0x8DBD}, //15582 #CJK UNIFIED IDEOGRAPH + {0xDA94, 0x8DC0}, //15583 #CJK UNIFIED IDEOGRAPH + {0xDA95, 0x8DC1}, //15584 #CJK UNIFIED IDEOGRAPH + {0xDA96, 0x8DC2}, //15585 #CJK UNIFIED IDEOGRAPH + {0xDA97, 0x8DC5}, //15586 #CJK UNIFIED IDEOGRAPH + {0xDA98, 0x8DC7}, //15587 #CJK UNIFIED IDEOGRAPH + {0xDA99, 0x8DC8}, //15588 #CJK UNIFIED IDEOGRAPH + {0xDA9A, 0x8DC9}, //15589 #CJK UNIFIED IDEOGRAPH + {0xDA9B, 0x8DCA}, //15590 #CJK UNIFIED IDEOGRAPH + {0xDA9C, 0x8DCD}, //15591 #CJK UNIFIED IDEOGRAPH + {0xDA9D, 0x8DD0}, //15592 #CJK UNIFIED IDEOGRAPH + {0xDA9E, 0x8DD2}, //15593 #CJK UNIFIED IDEOGRAPH + {0xDA9F, 0x8DD3}, //15594 #CJK UNIFIED IDEOGRAPH + {0xDAA0, 0x8DD4}, //15595 #CJK UNIFIED IDEOGRAPH + {0xDAA1, 0x51C7}, //15596 #CJK UNIFIED IDEOGRAPH + {0xDAA2, 0x5196}, //15597 #CJK UNIFIED IDEOGRAPH + {0xDAA3, 0x51A2}, //15598 #CJK UNIFIED IDEOGRAPH + {0xDAA4, 0x51A5}, //15599 #CJK UNIFIED IDEOGRAPH + {0xDAA5, 0x8BA0}, //15600 #CJK UNIFIED IDEOGRAPH + {0xDAA6, 0x8BA6}, //15601 #CJK UNIFIED IDEOGRAPH + {0xDAA7, 0x8BA7}, //15602 #CJK UNIFIED IDEOGRAPH + {0xDAA8, 0x8BAA}, //15603 #CJK UNIFIED IDEOGRAPH + {0xDAA9, 0x8BB4}, //15604 #CJK UNIFIED IDEOGRAPH + {0xDAAA, 0x8BB5}, //15605 #CJK UNIFIED IDEOGRAPH + {0xDAAB, 0x8BB7}, //15606 #CJK UNIFIED IDEOGRAPH + {0xDAAC, 0x8BC2}, //15607 #CJK UNIFIED IDEOGRAPH + {0xDAAD, 0x8BC3}, //15608 #CJK UNIFIED IDEOGRAPH + {0xDAAE, 0x8BCB}, //15609 #CJK UNIFIED IDEOGRAPH + {0xDAAF, 0x8BCF}, //15610 #CJK UNIFIED IDEOGRAPH + {0xDAB0, 0x8BCE}, //15611 #CJK UNIFIED IDEOGRAPH + {0xDAB1, 0x8BD2}, //15612 #CJK UNIFIED IDEOGRAPH + {0xDAB2, 0x8BD3}, //15613 #CJK UNIFIED IDEOGRAPH + {0xDAB3, 0x8BD4}, //15614 #CJK UNIFIED IDEOGRAPH + {0xDAB4, 0x8BD6}, //15615 #CJK UNIFIED IDEOGRAPH + {0xDAB5, 0x8BD8}, //15616 #CJK UNIFIED IDEOGRAPH + {0xDAB6, 0x8BD9}, //15617 #CJK UNIFIED IDEOGRAPH + {0xDAB7, 0x8BDC}, //15618 #CJK UNIFIED IDEOGRAPH + {0xDAB8, 0x8BDF}, //15619 #CJK UNIFIED IDEOGRAPH + {0xDAB9, 0x8BE0}, //15620 #CJK UNIFIED IDEOGRAPH + {0xDABA, 0x8BE4}, //15621 #CJK UNIFIED IDEOGRAPH + {0xDABB, 0x8BE8}, //15622 #CJK UNIFIED IDEOGRAPH + {0xDABC, 0x8BE9}, //15623 #CJK UNIFIED IDEOGRAPH + {0xDABD, 0x8BEE}, //15624 #CJK UNIFIED IDEOGRAPH + {0xDABE, 0x8BF0}, //15625 #CJK UNIFIED IDEOGRAPH + {0xDABF, 0x8BF3}, //15626 #CJK UNIFIED IDEOGRAPH + {0xDAC0, 0x8BF6}, //15627 #CJK UNIFIED IDEOGRAPH + {0xDAC1, 0x8BF9}, //15628 #CJK UNIFIED IDEOGRAPH + {0xDAC2, 0x8BFC}, //15629 #CJK UNIFIED IDEOGRAPH + {0xDAC3, 0x8BFF}, //15630 #CJK UNIFIED IDEOGRAPH + {0xDAC4, 0x8C00}, //15631 #CJK UNIFIED IDEOGRAPH + {0xDAC5, 0x8C02}, //15632 #CJK UNIFIED IDEOGRAPH + {0xDAC6, 0x8C04}, //15633 #CJK UNIFIED IDEOGRAPH + {0xDAC7, 0x8C07}, //15634 #CJK UNIFIED IDEOGRAPH + {0xDAC8, 0x8C0C}, //15635 #CJK UNIFIED IDEOGRAPH + {0xDAC9, 0x8C0F}, //15636 #CJK UNIFIED IDEOGRAPH + {0xDACA, 0x8C11}, //15637 #CJK UNIFIED IDEOGRAPH + {0xDACB, 0x8C12}, //15638 #CJK UNIFIED IDEOGRAPH + {0xDACC, 0x8C14}, //15639 #CJK UNIFIED IDEOGRAPH + {0xDACD, 0x8C15}, //15640 #CJK UNIFIED IDEOGRAPH + {0xDACE, 0x8C16}, //15641 #CJK UNIFIED IDEOGRAPH + {0xDACF, 0x8C19}, //15642 #CJK UNIFIED IDEOGRAPH + {0xDAD0, 0x8C1B}, //15643 #CJK UNIFIED IDEOGRAPH + {0xDAD1, 0x8C18}, //15644 #CJK UNIFIED IDEOGRAPH + {0xDAD2, 0x8C1D}, //15645 #CJK UNIFIED IDEOGRAPH + {0xDAD3, 0x8C1F}, //15646 #CJK UNIFIED IDEOGRAPH + {0xDAD4, 0x8C20}, //15647 #CJK UNIFIED IDEOGRAPH + {0xDAD5, 0x8C21}, //15648 #CJK UNIFIED IDEOGRAPH + {0xDAD6, 0x8C25}, //15649 #CJK UNIFIED IDEOGRAPH + {0xDAD7, 0x8C27}, //15650 #CJK UNIFIED IDEOGRAPH + {0xDAD8, 0x8C2A}, //15651 #CJK UNIFIED IDEOGRAPH + {0xDAD9, 0x8C2B}, //15652 #CJK UNIFIED IDEOGRAPH + {0xDADA, 0x8C2E}, //15653 #CJK UNIFIED IDEOGRAPH + {0xDADB, 0x8C2F}, //15654 #CJK UNIFIED IDEOGRAPH + {0xDADC, 0x8C32}, //15655 #CJK UNIFIED IDEOGRAPH + {0xDADD, 0x8C33}, //15656 #CJK UNIFIED IDEOGRAPH + {0xDADE, 0x8C35}, //15657 #CJK UNIFIED IDEOGRAPH + {0xDADF, 0x8C36}, //15658 #CJK UNIFIED IDEOGRAPH + {0xDAE0, 0x5369}, //15659 #CJK UNIFIED IDEOGRAPH + {0xDAE1, 0x537A}, //15660 #CJK UNIFIED IDEOGRAPH + {0xDAE2, 0x961D}, //15661 #CJK UNIFIED IDEOGRAPH + {0xDAE3, 0x9622}, //15662 #CJK UNIFIED IDEOGRAPH + {0xDAE4, 0x9621}, //15663 #CJK UNIFIED IDEOGRAPH + {0xDAE5, 0x9631}, //15664 #CJK UNIFIED IDEOGRAPH + {0xDAE6, 0x962A}, //15665 #CJK UNIFIED IDEOGRAPH + {0xDAE7, 0x963D}, //15666 #CJK UNIFIED IDEOGRAPH + {0xDAE8, 0x963C}, //15667 #CJK UNIFIED IDEOGRAPH + {0xDAE9, 0x9642}, //15668 #CJK UNIFIED IDEOGRAPH + {0xDAEA, 0x9649}, //15669 #CJK UNIFIED IDEOGRAPH + {0xDAEB, 0x9654}, //15670 #CJK UNIFIED IDEOGRAPH + {0xDAEC, 0x965F}, //15671 #CJK UNIFIED IDEOGRAPH + {0xDAED, 0x9667}, //15672 #CJK UNIFIED IDEOGRAPH + {0xDAEE, 0x966C}, //15673 #CJK UNIFIED IDEOGRAPH + {0xDAEF, 0x9672}, //15674 #CJK UNIFIED IDEOGRAPH + {0xDAF0, 0x9674}, //15675 #CJK UNIFIED IDEOGRAPH + {0xDAF1, 0x9688}, //15676 #CJK UNIFIED IDEOGRAPH + {0xDAF2, 0x968D}, //15677 #CJK UNIFIED IDEOGRAPH + {0xDAF3, 0x9697}, //15678 #CJK UNIFIED IDEOGRAPH + {0xDAF4, 0x96B0}, //15679 #CJK UNIFIED IDEOGRAPH + {0xDAF5, 0x9097}, //15680 #CJK UNIFIED IDEOGRAPH + {0xDAF6, 0x909B}, //15681 #CJK UNIFIED IDEOGRAPH + {0xDAF7, 0x909D}, //15682 #CJK UNIFIED IDEOGRAPH + {0xDAF8, 0x9099}, //15683 #CJK UNIFIED IDEOGRAPH + {0xDAF9, 0x90AC}, //15684 #CJK UNIFIED IDEOGRAPH + {0xDAFA, 0x90A1}, //15685 #CJK UNIFIED IDEOGRAPH + {0xDAFB, 0x90B4}, //15686 #CJK UNIFIED IDEOGRAPH + {0xDAFC, 0x90B3}, //15687 #CJK UNIFIED IDEOGRAPH + {0xDAFD, 0x90B6}, //15688 #CJK UNIFIED IDEOGRAPH + {0xDAFE, 0x90BA}, //15689 #CJK UNIFIED IDEOGRAPH + {0xDB40, 0x8DD5}, //15690 #CJK UNIFIED IDEOGRAPH + {0xDB41, 0x8DD8}, //15691 #CJK UNIFIED IDEOGRAPH + {0xDB42, 0x8DD9}, //15692 #CJK UNIFIED IDEOGRAPH + {0xDB43, 0x8DDC}, //15693 #CJK UNIFIED IDEOGRAPH + {0xDB44, 0x8DE0}, //15694 #CJK UNIFIED IDEOGRAPH + {0xDB45, 0x8DE1}, //15695 #CJK UNIFIED IDEOGRAPH + {0xDB46, 0x8DE2}, //15696 #CJK UNIFIED IDEOGRAPH + {0xDB47, 0x8DE5}, //15697 #CJK UNIFIED IDEOGRAPH + {0xDB48, 0x8DE6}, //15698 #CJK UNIFIED IDEOGRAPH + {0xDB49, 0x8DE7}, //15699 #CJK UNIFIED IDEOGRAPH + {0xDB4A, 0x8DE9}, //15700 #CJK UNIFIED IDEOGRAPH + {0xDB4B, 0x8DED}, //15701 #CJK UNIFIED IDEOGRAPH + {0xDB4C, 0x8DEE}, //15702 #CJK UNIFIED IDEOGRAPH + {0xDB4D, 0x8DF0}, //15703 #CJK UNIFIED IDEOGRAPH + {0xDB4E, 0x8DF1}, //15704 #CJK UNIFIED IDEOGRAPH + {0xDB4F, 0x8DF2}, //15705 #CJK UNIFIED IDEOGRAPH + {0xDB50, 0x8DF4}, //15706 #CJK UNIFIED IDEOGRAPH + {0xDB51, 0x8DF6}, //15707 #CJK UNIFIED IDEOGRAPH + {0xDB52, 0x8DFC}, //15708 #CJK UNIFIED IDEOGRAPH + {0xDB53, 0x8DFE}, //15709 #CJK UNIFIED IDEOGRAPH + {0xDB54, 0x8DFF}, //15710 #CJK UNIFIED IDEOGRAPH + {0xDB55, 0x8E00}, //15711 #CJK UNIFIED IDEOGRAPH + {0xDB56, 0x8E01}, //15712 #CJK UNIFIED IDEOGRAPH + {0xDB57, 0x8E02}, //15713 #CJK UNIFIED IDEOGRAPH + {0xDB58, 0x8E03}, //15714 #CJK UNIFIED IDEOGRAPH + {0xDB59, 0x8E04}, //15715 #CJK UNIFIED IDEOGRAPH + {0xDB5A, 0x8E06}, //15716 #CJK UNIFIED IDEOGRAPH + {0xDB5B, 0x8E07}, //15717 #CJK UNIFIED IDEOGRAPH + {0xDB5C, 0x8E08}, //15718 #CJK UNIFIED IDEOGRAPH + {0xDB5D, 0x8E0B}, //15719 #CJK UNIFIED IDEOGRAPH + {0xDB5E, 0x8E0D}, //15720 #CJK UNIFIED IDEOGRAPH + {0xDB5F, 0x8E0E}, //15721 #CJK UNIFIED IDEOGRAPH + {0xDB60, 0x8E10}, //15722 #CJK UNIFIED IDEOGRAPH + {0xDB61, 0x8E11}, //15723 #CJK UNIFIED IDEOGRAPH + {0xDB62, 0x8E12}, //15724 #CJK UNIFIED IDEOGRAPH + {0xDB63, 0x8E13}, //15725 #CJK UNIFIED IDEOGRAPH + {0xDB64, 0x8E15}, //15726 #CJK UNIFIED IDEOGRAPH + {0xDB65, 0x8E16}, //15727 #CJK UNIFIED IDEOGRAPH + {0xDB66, 0x8E17}, //15728 #CJK UNIFIED IDEOGRAPH + {0xDB67, 0x8E18}, //15729 #CJK UNIFIED IDEOGRAPH + {0xDB68, 0x8E19}, //15730 #CJK UNIFIED IDEOGRAPH + {0xDB69, 0x8E1A}, //15731 #CJK UNIFIED IDEOGRAPH + {0xDB6A, 0x8E1B}, //15732 #CJK UNIFIED IDEOGRAPH + {0xDB6B, 0x8E1C}, //15733 #CJK UNIFIED IDEOGRAPH + {0xDB6C, 0x8E20}, //15734 #CJK UNIFIED IDEOGRAPH + {0xDB6D, 0x8E21}, //15735 #CJK UNIFIED IDEOGRAPH + {0xDB6E, 0x8E24}, //15736 #CJK UNIFIED IDEOGRAPH + {0xDB6F, 0x8E25}, //15737 #CJK UNIFIED IDEOGRAPH + {0xDB70, 0x8E26}, //15738 #CJK UNIFIED IDEOGRAPH + {0xDB71, 0x8E27}, //15739 #CJK UNIFIED IDEOGRAPH + {0xDB72, 0x8E28}, //15740 #CJK UNIFIED IDEOGRAPH + {0xDB73, 0x8E2B}, //15741 #CJK UNIFIED IDEOGRAPH + {0xDB74, 0x8E2D}, //15742 #CJK UNIFIED IDEOGRAPH + {0xDB75, 0x8E30}, //15743 #CJK UNIFIED IDEOGRAPH + {0xDB76, 0x8E32}, //15744 #CJK UNIFIED IDEOGRAPH + {0xDB77, 0x8E33}, //15745 #CJK UNIFIED IDEOGRAPH + {0xDB78, 0x8E34}, //15746 #CJK UNIFIED IDEOGRAPH + {0xDB79, 0x8E36}, //15747 #CJK UNIFIED IDEOGRAPH + {0xDB7A, 0x8E37}, //15748 #CJK UNIFIED IDEOGRAPH + {0xDB7B, 0x8E38}, //15749 #CJK UNIFIED IDEOGRAPH + {0xDB7C, 0x8E3B}, //15750 #CJK UNIFIED IDEOGRAPH + {0xDB7D, 0x8E3C}, //15751 #CJK UNIFIED IDEOGRAPH + {0xDB7E, 0x8E3E}, //15752 #CJK UNIFIED IDEOGRAPH + {0xDB80, 0x8E3F}, //15753 #CJK UNIFIED IDEOGRAPH + {0xDB81, 0x8E43}, //15754 #CJK UNIFIED IDEOGRAPH + {0xDB82, 0x8E45}, //15755 #CJK UNIFIED IDEOGRAPH + {0xDB83, 0x8E46}, //15756 #CJK UNIFIED IDEOGRAPH + {0xDB84, 0x8E4C}, //15757 #CJK UNIFIED IDEOGRAPH + {0xDB85, 0x8E4D}, //15758 #CJK UNIFIED IDEOGRAPH + {0xDB86, 0x8E4E}, //15759 #CJK UNIFIED IDEOGRAPH + {0xDB87, 0x8E4F}, //15760 #CJK UNIFIED IDEOGRAPH + {0xDB88, 0x8E50}, //15761 #CJK UNIFIED IDEOGRAPH + {0xDB89, 0x8E53}, //15762 #CJK UNIFIED IDEOGRAPH + {0xDB8A, 0x8E54}, //15763 #CJK UNIFIED IDEOGRAPH + {0xDB8B, 0x8E55}, //15764 #CJK UNIFIED IDEOGRAPH + {0xDB8C, 0x8E56}, //15765 #CJK UNIFIED IDEOGRAPH + {0xDB8D, 0x8E57}, //15766 #CJK UNIFIED IDEOGRAPH + {0xDB8E, 0x8E58}, //15767 #CJK UNIFIED IDEOGRAPH + {0xDB8F, 0x8E5A}, //15768 #CJK UNIFIED IDEOGRAPH + {0xDB90, 0x8E5B}, //15769 #CJK UNIFIED IDEOGRAPH + {0xDB91, 0x8E5C}, //15770 #CJK UNIFIED IDEOGRAPH + {0xDB92, 0x8E5D}, //15771 #CJK UNIFIED IDEOGRAPH + {0xDB93, 0x8E5E}, //15772 #CJK UNIFIED IDEOGRAPH + {0xDB94, 0x8E5F}, //15773 #CJK UNIFIED IDEOGRAPH + {0xDB95, 0x8E60}, //15774 #CJK UNIFIED IDEOGRAPH + {0xDB96, 0x8E61}, //15775 #CJK UNIFIED IDEOGRAPH + {0xDB97, 0x8E62}, //15776 #CJK UNIFIED IDEOGRAPH + {0xDB98, 0x8E63}, //15777 #CJK UNIFIED IDEOGRAPH + {0xDB99, 0x8E64}, //15778 #CJK UNIFIED IDEOGRAPH + {0xDB9A, 0x8E65}, //15779 #CJK UNIFIED IDEOGRAPH + {0xDB9B, 0x8E67}, //15780 #CJK UNIFIED IDEOGRAPH + {0xDB9C, 0x8E68}, //15781 #CJK UNIFIED IDEOGRAPH + {0xDB9D, 0x8E6A}, //15782 #CJK UNIFIED IDEOGRAPH + {0xDB9E, 0x8E6B}, //15783 #CJK UNIFIED IDEOGRAPH + {0xDB9F, 0x8E6E}, //15784 #CJK UNIFIED IDEOGRAPH + {0xDBA0, 0x8E71}, //15785 #CJK UNIFIED IDEOGRAPH + {0xDBA1, 0x90B8}, //15786 #CJK UNIFIED IDEOGRAPH + {0xDBA2, 0x90B0}, //15787 #CJK UNIFIED IDEOGRAPH + {0xDBA3, 0x90CF}, //15788 #CJK UNIFIED IDEOGRAPH + {0xDBA4, 0x90C5}, //15789 #CJK UNIFIED IDEOGRAPH + {0xDBA5, 0x90BE}, //15790 #CJK UNIFIED IDEOGRAPH + {0xDBA6, 0x90D0}, //15791 #CJK UNIFIED IDEOGRAPH + {0xDBA7, 0x90C4}, //15792 #CJK UNIFIED IDEOGRAPH + {0xDBA8, 0x90C7}, //15793 #CJK UNIFIED IDEOGRAPH + {0xDBA9, 0x90D3}, //15794 #CJK UNIFIED IDEOGRAPH + {0xDBAA, 0x90E6}, //15795 #CJK UNIFIED IDEOGRAPH + {0xDBAB, 0x90E2}, //15796 #CJK UNIFIED IDEOGRAPH + {0xDBAC, 0x90DC}, //15797 #CJK UNIFIED IDEOGRAPH + {0xDBAD, 0x90D7}, //15798 #CJK UNIFIED IDEOGRAPH + {0xDBAE, 0x90DB}, //15799 #CJK UNIFIED IDEOGRAPH + {0xDBAF, 0x90EB}, //15800 #CJK UNIFIED IDEOGRAPH + {0xDBB0, 0x90EF}, //15801 #CJK UNIFIED IDEOGRAPH + {0xDBB1, 0x90FE}, //15802 #CJK UNIFIED IDEOGRAPH + {0xDBB2, 0x9104}, //15803 #CJK UNIFIED IDEOGRAPH + {0xDBB3, 0x9122}, //15804 #CJK UNIFIED IDEOGRAPH + {0xDBB4, 0x911E}, //15805 #CJK UNIFIED IDEOGRAPH + {0xDBB5, 0x9123}, //15806 #CJK UNIFIED IDEOGRAPH + {0xDBB6, 0x9131}, //15807 #CJK UNIFIED IDEOGRAPH + {0xDBB7, 0x912F}, //15808 #CJK UNIFIED IDEOGRAPH + {0xDBB8, 0x9139}, //15809 #CJK UNIFIED IDEOGRAPH + {0xDBB9, 0x9143}, //15810 #CJK UNIFIED IDEOGRAPH + {0xDBBA, 0x9146}, //15811 #CJK UNIFIED IDEOGRAPH + {0xDBBB, 0x520D}, //15812 #CJK UNIFIED IDEOGRAPH + {0xDBBC, 0x5942}, //15813 #CJK UNIFIED IDEOGRAPH + {0xDBBD, 0x52A2}, //15814 #CJK UNIFIED IDEOGRAPH + {0xDBBE, 0x52AC}, //15815 #CJK UNIFIED IDEOGRAPH + {0xDBBF, 0x52AD}, //15816 #CJK UNIFIED IDEOGRAPH + {0xDBC0, 0x52BE}, //15817 #CJK UNIFIED IDEOGRAPH + {0xDBC1, 0x54FF}, //15818 #CJK UNIFIED IDEOGRAPH + {0xDBC2, 0x52D0}, //15819 #CJK UNIFIED IDEOGRAPH + {0xDBC3, 0x52D6}, //15820 #CJK UNIFIED IDEOGRAPH + {0xDBC4, 0x52F0}, //15821 #CJK UNIFIED IDEOGRAPH + {0xDBC5, 0x53DF}, //15822 #CJK UNIFIED IDEOGRAPH + {0xDBC6, 0x71EE}, //15823 #CJK UNIFIED IDEOGRAPH + {0xDBC7, 0x77CD}, //15824 #CJK UNIFIED IDEOGRAPH + {0xDBC8, 0x5EF4}, //15825 #CJK UNIFIED IDEOGRAPH + {0xDBC9, 0x51F5}, //15826 #CJK UNIFIED IDEOGRAPH + {0xDBCA, 0x51FC}, //15827 #CJK UNIFIED IDEOGRAPH + {0xDBCB, 0x9B2F}, //15828 #CJK UNIFIED IDEOGRAPH + {0xDBCC, 0x53B6}, //15829 #CJK UNIFIED IDEOGRAPH + {0xDBCD, 0x5F01}, //15830 #CJK UNIFIED IDEOGRAPH + {0xDBCE, 0x755A}, //15831 #CJK UNIFIED IDEOGRAPH + {0xDBCF, 0x5DEF}, //15832 #CJK UNIFIED IDEOGRAPH + {0xDBD0, 0x574C}, //15833 #CJK UNIFIED IDEOGRAPH + {0xDBD1, 0x57A9}, //15834 #CJK UNIFIED IDEOGRAPH + {0xDBD2, 0x57A1}, //15835 #CJK UNIFIED IDEOGRAPH + {0xDBD3, 0x587E}, //15836 #CJK UNIFIED IDEOGRAPH + {0xDBD4, 0x58BC}, //15837 #CJK UNIFIED IDEOGRAPH + {0xDBD5, 0x58C5}, //15838 #CJK UNIFIED IDEOGRAPH + {0xDBD6, 0x58D1}, //15839 #CJK UNIFIED IDEOGRAPH + {0xDBD7, 0x5729}, //15840 #CJK UNIFIED IDEOGRAPH + {0xDBD8, 0x572C}, //15841 #CJK UNIFIED IDEOGRAPH + {0xDBD9, 0x572A}, //15842 #CJK UNIFIED IDEOGRAPH + {0xDBDA, 0x5733}, //15843 #CJK UNIFIED IDEOGRAPH + {0xDBDB, 0x5739}, //15844 #CJK UNIFIED IDEOGRAPH + {0xDBDC, 0x572E}, //15845 #CJK UNIFIED IDEOGRAPH + {0xDBDD, 0x572F}, //15846 #CJK UNIFIED IDEOGRAPH + {0xDBDE, 0x575C}, //15847 #CJK UNIFIED IDEOGRAPH + {0xDBDF, 0x573B}, //15848 #CJK UNIFIED IDEOGRAPH + {0xDBE0, 0x5742}, //15849 #CJK UNIFIED IDEOGRAPH + {0xDBE1, 0x5769}, //15850 #CJK UNIFIED IDEOGRAPH + {0xDBE2, 0x5785}, //15851 #CJK UNIFIED IDEOGRAPH + {0xDBE3, 0x576B}, //15852 #CJK UNIFIED IDEOGRAPH + {0xDBE4, 0x5786}, //15853 #CJK UNIFIED IDEOGRAPH + {0xDBE5, 0x577C}, //15854 #CJK UNIFIED IDEOGRAPH + {0xDBE6, 0x577B}, //15855 #CJK UNIFIED IDEOGRAPH + {0xDBE7, 0x5768}, //15856 #CJK UNIFIED IDEOGRAPH + {0xDBE8, 0x576D}, //15857 #CJK UNIFIED IDEOGRAPH + {0xDBE9, 0x5776}, //15858 #CJK UNIFIED IDEOGRAPH + {0xDBEA, 0x5773}, //15859 #CJK UNIFIED IDEOGRAPH + {0xDBEB, 0x57AD}, //15860 #CJK UNIFIED IDEOGRAPH + {0xDBEC, 0x57A4}, //15861 #CJK UNIFIED IDEOGRAPH + {0xDBED, 0x578C}, //15862 #CJK UNIFIED IDEOGRAPH + {0xDBEE, 0x57B2}, //15863 #CJK UNIFIED IDEOGRAPH + {0xDBEF, 0x57CF}, //15864 #CJK UNIFIED IDEOGRAPH + {0xDBF0, 0x57A7}, //15865 #CJK UNIFIED IDEOGRAPH + {0xDBF1, 0x57B4}, //15866 #CJK UNIFIED IDEOGRAPH + {0xDBF2, 0x5793}, //15867 #CJK UNIFIED IDEOGRAPH + {0xDBF3, 0x57A0}, //15868 #CJK UNIFIED IDEOGRAPH + {0xDBF4, 0x57D5}, //15869 #CJK UNIFIED IDEOGRAPH + {0xDBF5, 0x57D8}, //15870 #CJK UNIFIED IDEOGRAPH + {0xDBF6, 0x57DA}, //15871 #CJK UNIFIED IDEOGRAPH + {0xDBF7, 0x57D9}, //15872 #CJK UNIFIED IDEOGRAPH + {0xDBF8, 0x57D2}, //15873 #CJK UNIFIED IDEOGRAPH + {0xDBF9, 0x57B8}, //15874 #CJK UNIFIED IDEOGRAPH + {0xDBFA, 0x57F4}, //15875 #CJK UNIFIED IDEOGRAPH + {0xDBFB, 0x57EF}, //15876 #CJK UNIFIED IDEOGRAPH + {0xDBFC, 0x57F8}, //15877 #CJK UNIFIED IDEOGRAPH + {0xDBFD, 0x57E4}, //15878 #CJK UNIFIED IDEOGRAPH + {0xDBFE, 0x57DD}, //15879 #CJK UNIFIED IDEOGRAPH + {0xDC40, 0x8E73}, //15880 #CJK UNIFIED IDEOGRAPH + {0xDC41, 0x8E75}, //15881 #CJK UNIFIED IDEOGRAPH + {0xDC42, 0x8E77}, //15882 #CJK UNIFIED IDEOGRAPH + {0xDC43, 0x8E78}, //15883 #CJK UNIFIED IDEOGRAPH + {0xDC44, 0x8E79}, //15884 #CJK UNIFIED IDEOGRAPH + {0xDC45, 0x8E7A}, //15885 #CJK UNIFIED IDEOGRAPH + {0xDC46, 0x8E7B}, //15886 #CJK UNIFIED IDEOGRAPH + {0xDC47, 0x8E7D}, //15887 #CJK UNIFIED IDEOGRAPH + {0xDC48, 0x8E7E}, //15888 #CJK UNIFIED IDEOGRAPH + {0xDC49, 0x8E80}, //15889 #CJK UNIFIED IDEOGRAPH + {0xDC4A, 0x8E82}, //15890 #CJK UNIFIED IDEOGRAPH + {0xDC4B, 0x8E83}, //15891 #CJK UNIFIED IDEOGRAPH + {0xDC4C, 0x8E84}, //15892 #CJK UNIFIED IDEOGRAPH + {0xDC4D, 0x8E86}, //15893 #CJK UNIFIED IDEOGRAPH + {0xDC4E, 0x8E88}, //15894 #CJK UNIFIED IDEOGRAPH + {0xDC4F, 0x8E89}, //15895 #CJK UNIFIED IDEOGRAPH + {0xDC50, 0x8E8A}, //15896 #CJK UNIFIED IDEOGRAPH + {0xDC51, 0x8E8B}, //15897 #CJK UNIFIED IDEOGRAPH + {0xDC52, 0x8E8C}, //15898 #CJK UNIFIED IDEOGRAPH + {0xDC53, 0x8E8D}, //15899 #CJK UNIFIED IDEOGRAPH + {0xDC54, 0x8E8E}, //15900 #CJK UNIFIED IDEOGRAPH + {0xDC55, 0x8E91}, //15901 #CJK UNIFIED IDEOGRAPH + {0xDC56, 0x8E92}, //15902 #CJK UNIFIED IDEOGRAPH + {0xDC57, 0x8E93}, //15903 #CJK UNIFIED IDEOGRAPH + {0xDC58, 0x8E95}, //15904 #CJK UNIFIED IDEOGRAPH + {0xDC59, 0x8E96}, //15905 #CJK UNIFIED IDEOGRAPH + {0xDC5A, 0x8E97}, //15906 #CJK UNIFIED IDEOGRAPH + {0xDC5B, 0x8E98}, //15907 #CJK UNIFIED IDEOGRAPH + {0xDC5C, 0x8E99}, //15908 #CJK UNIFIED IDEOGRAPH + {0xDC5D, 0x8E9A}, //15909 #CJK UNIFIED IDEOGRAPH + {0xDC5E, 0x8E9B}, //15910 #CJK UNIFIED IDEOGRAPH + {0xDC5F, 0x8E9D}, //15911 #CJK UNIFIED IDEOGRAPH + {0xDC60, 0x8E9F}, //15912 #CJK UNIFIED IDEOGRAPH + {0xDC61, 0x8EA0}, //15913 #CJK UNIFIED IDEOGRAPH + {0xDC62, 0x8EA1}, //15914 #CJK UNIFIED IDEOGRAPH + {0xDC63, 0x8EA2}, //15915 #CJK UNIFIED IDEOGRAPH + {0xDC64, 0x8EA3}, //15916 #CJK UNIFIED IDEOGRAPH + {0xDC65, 0x8EA4}, //15917 #CJK UNIFIED IDEOGRAPH + {0xDC66, 0x8EA5}, //15918 #CJK UNIFIED IDEOGRAPH + {0xDC67, 0x8EA6}, //15919 #CJK UNIFIED IDEOGRAPH + {0xDC68, 0x8EA7}, //15920 #CJK UNIFIED IDEOGRAPH + {0xDC69, 0x8EA8}, //15921 #CJK UNIFIED IDEOGRAPH + {0xDC6A, 0x8EA9}, //15922 #CJK UNIFIED IDEOGRAPH + {0xDC6B, 0x8EAA}, //15923 #CJK UNIFIED IDEOGRAPH + {0xDC6C, 0x8EAD}, //15924 #CJK UNIFIED IDEOGRAPH + {0xDC6D, 0x8EAE}, //15925 #CJK UNIFIED IDEOGRAPH + {0xDC6E, 0x8EB0}, //15926 #CJK UNIFIED IDEOGRAPH + {0xDC6F, 0x8EB1}, //15927 #CJK UNIFIED IDEOGRAPH + {0xDC70, 0x8EB3}, //15928 #CJK UNIFIED IDEOGRAPH + {0xDC71, 0x8EB4}, //15929 #CJK UNIFIED IDEOGRAPH + {0xDC72, 0x8EB5}, //15930 #CJK UNIFIED IDEOGRAPH + {0xDC73, 0x8EB6}, //15931 #CJK UNIFIED IDEOGRAPH + {0xDC74, 0x8EB7}, //15932 #CJK UNIFIED IDEOGRAPH + {0xDC75, 0x8EB8}, //15933 #CJK UNIFIED IDEOGRAPH + {0xDC76, 0x8EB9}, //15934 #CJK UNIFIED IDEOGRAPH + {0xDC77, 0x8EBB}, //15935 #CJK UNIFIED IDEOGRAPH + {0xDC78, 0x8EBC}, //15936 #CJK UNIFIED IDEOGRAPH + {0xDC79, 0x8EBD}, //15937 #CJK UNIFIED IDEOGRAPH + {0xDC7A, 0x8EBE}, //15938 #CJK UNIFIED IDEOGRAPH + {0xDC7B, 0x8EBF}, //15939 #CJK UNIFIED IDEOGRAPH + {0xDC7C, 0x8EC0}, //15940 #CJK UNIFIED IDEOGRAPH + {0xDC7D, 0x8EC1}, //15941 #CJK UNIFIED IDEOGRAPH + {0xDC7E, 0x8EC2}, //15942 #CJK UNIFIED IDEOGRAPH + {0xDC80, 0x8EC3}, //15943 #CJK UNIFIED IDEOGRAPH + {0xDC81, 0x8EC4}, //15944 #CJK UNIFIED IDEOGRAPH + {0xDC82, 0x8EC5}, //15945 #CJK UNIFIED IDEOGRAPH + {0xDC83, 0x8EC6}, //15946 #CJK UNIFIED IDEOGRAPH + {0xDC84, 0x8EC7}, //15947 #CJK UNIFIED IDEOGRAPH + {0xDC85, 0x8EC8}, //15948 #CJK UNIFIED IDEOGRAPH + {0xDC86, 0x8EC9}, //15949 #CJK UNIFIED IDEOGRAPH + {0xDC87, 0x8ECA}, //15950 #CJK UNIFIED IDEOGRAPH + {0xDC88, 0x8ECB}, //15951 #CJK UNIFIED IDEOGRAPH + {0xDC89, 0x8ECC}, //15952 #CJK UNIFIED IDEOGRAPH + {0xDC8A, 0x8ECD}, //15953 #CJK UNIFIED IDEOGRAPH + {0xDC8B, 0x8ECF}, //15954 #CJK UNIFIED IDEOGRAPH + {0xDC8C, 0x8ED0}, //15955 #CJK UNIFIED IDEOGRAPH + {0xDC8D, 0x8ED1}, //15956 #CJK UNIFIED IDEOGRAPH + {0xDC8E, 0x8ED2}, //15957 #CJK UNIFIED IDEOGRAPH + {0xDC8F, 0x8ED3}, //15958 #CJK UNIFIED IDEOGRAPH + {0xDC90, 0x8ED4}, //15959 #CJK UNIFIED IDEOGRAPH + {0xDC91, 0x8ED5}, //15960 #CJK UNIFIED IDEOGRAPH + {0xDC92, 0x8ED6}, //15961 #CJK UNIFIED IDEOGRAPH + {0xDC93, 0x8ED7}, //15962 #CJK UNIFIED IDEOGRAPH + {0xDC94, 0x8ED8}, //15963 #CJK UNIFIED IDEOGRAPH + {0xDC95, 0x8ED9}, //15964 #CJK UNIFIED IDEOGRAPH + {0xDC96, 0x8EDA}, //15965 #CJK UNIFIED IDEOGRAPH + {0xDC97, 0x8EDB}, //15966 #CJK UNIFIED IDEOGRAPH + {0xDC98, 0x8EDC}, //15967 #CJK UNIFIED IDEOGRAPH + {0xDC99, 0x8EDD}, //15968 #CJK UNIFIED IDEOGRAPH + {0xDC9A, 0x8EDE}, //15969 #CJK UNIFIED IDEOGRAPH + {0xDC9B, 0x8EDF}, //15970 #CJK UNIFIED IDEOGRAPH + {0xDC9C, 0x8EE0}, //15971 #CJK UNIFIED IDEOGRAPH + {0xDC9D, 0x8EE1}, //15972 #CJK UNIFIED IDEOGRAPH + {0xDC9E, 0x8EE2}, //15973 #CJK UNIFIED IDEOGRAPH + {0xDC9F, 0x8EE3}, //15974 #CJK UNIFIED IDEOGRAPH + {0xDCA0, 0x8EE4}, //15975 #CJK UNIFIED IDEOGRAPH + {0xDCA1, 0x580B}, //15976 #CJK UNIFIED IDEOGRAPH + {0xDCA2, 0x580D}, //15977 #CJK UNIFIED IDEOGRAPH + {0xDCA3, 0x57FD}, //15978 #CJK UNIFIED IDEOGRAPH + {0xDCA4, 0x57ED}, //15979 #CJK UNIFIED IDEOGRAPH + {0xDCA5, 0x5800}, //15980 #CJK UNIFIED IDEOGRAPH + {0xDCA6, 0x581E}, //15981 #CJK UNIFIED IDEOGRAPH + {0xDCA7, 0x5819}, //15982 #CJK UNIFIED IDEOGRAPH + {0xDCA8, 0x5844}, //15983 #CJK UNIFIED IDEOGRAPH + {0xDCA9, 0x5820}, //15984 #CJK UNIFIED IDEOGRAPH + {0xDCAA, 0x5865}, //15985 #CJK UNIFIED IDEOGRAPH + {0xDCAB, 0x586C}, //15986 #CJK UNIFIED IDEOGRAPH + {0xDCAC, 0x5881}, //15987 #CJK UNIFIED IDEOGRAPH + {0xDCAD, 0x5889}, //15988 #CJK UNIFIED IDEOGRAPH + {0xDCAE, 0x589A}, //15989 #CJK UNIFIED IDEOGRAPH + {0xDCAF, 0x5880}, //15990 #CJK UNIFIED IDEOGRAPH + {0xDCB0, 0x99A8}, //15991 #CJK UNIFIED IDEOGRAPH + {0xDCB1, 0x9F19}, //15992 #CJK UNIFIED IDEOGRAPH + {0xDCB2, 0x61FF}, //15993 #CJK UNIFIED IDEOGRAPH + {0xDCB3, 0x8279}, //15994 #CJK UNIFIED IDEOGRAPH + {0xDCB4, 0x827D}, //15995 #CJK UNIFIED IDEOGRAPH + {0xDCB5, 0x827F}, //15996 #CJK UNIFIED IDEOGRAPH + {0xDCB6, 0x828F}, //15997 #CJK UNIFIED IDEOGRAPH + {0xDCB7, 0x828A}, //15998 #CJK UNIFIED IDEOGRAPH + {0xDCB8, 0x82A8}, //15999 #CJK UNIFIED IDEOGRAPH + {0xDCB9, 0x8284}, //16000 #CJK UNIFIED IDEOGRAPH + {0xDCBA, 0x828E}, //16001 #CJK UNIFIED IDEOGRAPH + {0xDCBB, 0x8291}, //16002 #CJK UNIFIED IDEOGRAPH + {0xDCBC, 0x8297}, //16003 #CJK UNIFIED IDEOGRAPH + {0xDCBD, 0x8299}, //16004 #CJK UNIFIED IDEOGRAPH + {0xDCBE, 0x82AB}, //16005 #CJK UNIFIED IDEOGRAPH + {0xDCBF, 0x82B8}, //16006 #CJK UNIFIED IDEOGRAPH + {0xDCC0, 0x82BE}, //16007 #CJK UNIFIED IDEOGRAPH + {0xDCC1, 0x82B0}, //16008 #CJK UNIFIED IDEOGRAPH + {0xDCC2, 0x82C8}, //16009 #CJK UNIFIED IDEOGRAPH + {0xDCC3, 0x82CA}, //16010 #CJK UNIFIED IDEOGRAPH + {0xDCC4, 0x82E3}, //16011 #CJK UNIFIED IDEOGRAPH + {0xDCC5, 0x8298}, //16012 #CJK UNIFIED IDEOGRAPH + {0xDCC6, 0x82B7}, //16013 #CJK UNIFIED IDEOGRAPH + {0xDCC7, 0x82AE}, //16014 #CJK UNIFIED IDEOGRAPH + {0xDCC8, 0x82CB}, //16015 #CJK UNIFIED IDEOGRAPH + {0xDCC9, 0x82CC}, //16016 #CJK UNIFIED IDEOGRAPH + {0xDCCA, 0x82C1}, //16017 #CJK UNIFIED IDEOGRAPH + {0xDCCB, 0x82A9}, //16018 #CJK UNIFIED IDEOGRAPH + {0xDCCC, 0x82B4}, //16019 #CJK UNIFIED IDEOGRAPH + {0xDCCD, 0x82A1}, //16020 #CJK UNIFIED IDEOGRAPH + {0xDCCE, 0x82AA}, //16021 #CJK UNIFIED IDEOGRAPH + {0xDCCF, 0x829F}, //16022 #CJK UNIFIED IDEOGRAPH + {0xDCD0, 0x82C4}, //16023 #CJK UNIFIED IDEOGRAPH + {0xDCD1, 0x82CE}, //16024 #CJK UNIFIED IDEOGRAPH + {0xDCD2, 0x82A4}, //16025 #CJK UNIFIED IDEOGRAPH + {0xDCD3, 0x82E1}, //16026 #CJK UNIFIED IDEOGRAPH + {0xDCD4, 0x8309}, //16027 #CJK UNIFIED IDEOGRAPH + {0xDCD5, 0x82F7}, //16028 #CJK UNIFIED IDEOGRAPH + {0xDCD6, 0x82E4}, //16029 #CJK UNIFIED IDEOGRAPH + {0xDCD7, 0x830F}, //16030 #CJK UNIFIED IDEOGRAPH + {0xDCD8, 0x8307}, //16031 #CJK UNIFIED IDEOGRAPH + {0xDCD9, 0x82DC}, //16032 #CJK UNIFIED IDEOGRAPH + {0xDCDA, 0x82F4}, //16033 #CJK UNIFIED IDEOGRAPH + {0xDCDB, 0x82D2}, //16034 #CJK UNIFIED IDEOGRAPH + {0xDCDC, 0x82D8}, //16035 #CJK UNIFIED IDEOGRAPH + {0xDCDD, 0x830C}, //16036 #CJK UNIFIED IDEOGRAPH + {0xDCDE, 0x82FB}, //16037 #CJK UNIFIED IDEOGRAPH + {0xDCDF, 0x82D3}, //16038 #CJK UNIFIED IDEOGRAPH + {0xDCE0, 0x8311}, //16039 #CJK UNIFIED IDEOGRAPH + {0xDCE1, 0x831A}, //16040 #CJK UNIFIED IDEOGRAPH + {0xDCE2, 0x8306}, //16041 #CJK UNIFIED IDEOGRAPH + {0xDCE3, 0x8314}, //16042 #CJK UNIFIED IDEOGRAPH + {0xDCE4, 0x8315}, //16043 #CJK UNIFIED IDEOGRAPH + {0xDCE5, 0x82E0}, //16044 #CJK UNIFIED IDEOGRAPH + {0xDCE6, 0x82D5}, //16045 #CJK UNIFIED IDEOGRAPH + {0xDCE7, 0x831C}, //16046 #CJK UNIFIED IDEOGRAPH + {0xDCE8, 0x8351}, //16047 #CJK UNIFIED IDEOGRAPH + {0xDCE9, 0x835B}, //16048 #CJK UNIFIED IDEOGRAPH + {0xDCEA, 0x835C}, //16049 #CJK UNIFIED IDEOGRAPH + {0xDCEB, 0x8308}, //16050 #CJK UNIFIED IDEOGRAPH + {0xDCEC, 0x8392}, //16051 #CJK UNIFIED IDEOGRAPH + {0xDCED, 0x833C}, //16052 #CJK UNIFIED IDEOGRAPH + {0xDCEE, 0x8334}, //16053 #CJK UNIFIED IDEOGRAPH + {0xDCEF, 0x8331}, //16054 #CJK UNIFIED IDEOGRAPH + {0xDCF0, 0x839B}, //16055 #CJK UNIFIED IDEOGRAPH + {0xDCF1, 0x835E}, //16056 #CJK UNIFIED IDEOGRAPH + {0xDCF2, 0x832F}, //16057 #CJK UNIFIED IDEOGRAPH + {0xDCF3, 0x834F}, //16058 #CJK UNIFIED IDEOGRAPH + {0xDCF4, 0x8347}, //16059 #CJK UNIFIED IDEOGRAPH + {0xDCF5, 0x8343}, //16060 #CJK UNIFIED IDEOGRAPH + {0xDCF6, 0x835F}, //16061 #CJK UNIFIED IDEOGRAPH + {0xDCF7, 0x8340}, //16062 #CJK UNIFIED IDEOGRAPH + {0xDCF8, 0x8317}, //16063 #CJK UNIFIED IDEOGRAPH + {0xDCF9, 0x8360}, //16064 #CJK UNIFIED IDEOGRAPH + {0xDCFA, 0x832D}, //16065 #CJK UNIFIED IDEOGRAPH + {0xDCFB, 0x833A}, //16066 #CJK UNIFIED IDEOGRAPH + {0xDCFC, 0x8333}, //16067 #CJK UNIFIED IDEOGRAPH + {0xDCFD, 0x8366}, //16068 #CJK UNIFIED IDEOGRAPH + {0xDCFE, 0x8365}, //16069 #CJK UNIFIED IDEOGRAPH + {0xDD40, 0x8EE5}, //16070 #CJK UNIFIED IDEOGRAPH + {0xDD41, 0x8EE6}, //16071 #CJK UNIFIED IDEOGRAPH + {0xDD42, 0x8EE7}, //16072 #CJK UNIFIED IDEOGRAPH + {0xDD43, 0x8EE8}, //16073 #CJK UNIFIED IDEOGRAPH + {0xDD44, 0x8EE9}, //16074 #CJK UNIFIED IDEOGRAPH + {0xDD45, 0x8EEA}, //16075 #CJK UNIFIED IDEOGRAPH + {0xDD46, 0x8EEB}, //16076 #CJK UNIFIED IDEOGRAPH + {0xDD47, 0x8EEC}, //16077 #CJK UNIFIED IDEOGRAPH + {0xDD48, 0x8EED}, //16078 #CJK UNIFIED IDEOGRAPH + {0xDD49, 0x8EEE}, //16079 #CJK UNIFIED IDEOGRAPH + {0xDD4A, 0x8EEF}, //16080 #CJK UNIFIED IDEOGRAPH + {0xDD4B, 0x8EF0}, //16081 #CJK UNIFIED IDEOGRAPH + {0xDD4C, 0x8EF1}, //16082 #CJK UNIFIED IDEOGRAPH + {0xDD4D, 0x8EF2}, //16083 #CJK UNIFIED IDEOGRAPH + {0xDD4E, 0x8EF3}, //16084 #CJK UNIFIED IDEOGRAPH + {0xDD4F, 0x8EF4}, //16085 #CJK UNIFIED IDEOGRAPH + {0xDD50, 0x8EF5}, //16086 #CJK UNIFIED IDEOGRAPH + {0xDD51, 0x8EF6}, //16087 #CJK UNIFIED IDEOGRAPH + {0xDD52, 0x8EF7}, //16088 #CJK UNIFIED IDEOGRAPH + {0xDD53, 0x8EF8}, //16089 #CJK UNIFIED IDEOGRAPH + {0xDD54, 0x8EF9}, //16090 #CJK UNIFIED IDEOGRAPH + {0xDD55, 0x8EFA}, //16091 #CJK UNIFIED IDEOGRAPH + {0xDD56, 0x8EFB}, //16092 #CJK UNIFIED IDEOGRAPH + {0xDD57, 0x8EFC}, //16093 #CJK UNIFIED IDEOGRAPH + {0xDD58, 0x8EFD}, //16094 #CJK UNIFIED IDEOGRAPH + {0xDD59, 0x8EFE}, //16095 #CJK UNIFIED IDEOGRAPH + {0xDD5A, 0x8EFF}, //16096 #CJK UNIFIED IDEOGRAPH + {0xDD5B, 0x8F00}, //16097 #CJK UNIFIED IDEOGRAPH + {0xDD5C, 0x8F01}, //16098 #CJK UNIFIED IDEOGRAPH + {0xDD5D, 0x8F02}, //16099 #CJK UNIFIED IDEOGRAPH + {0xDD5E, 0x8F03}, //16100 #CJK UNIFIED IDEOGRAPH + {0xDD5F, 0x8F04}, //16101 #CJK UNIFIED IDEOGRAPH + {0xDD60, 0x8F05}, //16102 #CJK UNIFIED IDEOGRAPH + {0xDD61, 0x8F06}, //16103 #CJK UNIFIED IDEOGRAPH + {0xDD62, 0x8F07}, //16104 #CJK UNIFIED IDEOGRAPH + {0xDD63, 0x8F08}, //16105 #CJK UNIFIED IDEOGRAPH + {0xDD64, 0x8F09}, //16106 #CJK UNIFIED IDEOGRAPH + {0xDD65, 0x8F0A}, //16107 #CJK UNIFIED IDEOGRAPH + {0xDD66, 0x8F0B}, //16108 #CJK UNIFIED IDEOGRAPH + {0xDD67, 0x8F0C}, //16109 #CJK UNIFIED IDEOGRAPH + {0xDD68, 0x8F0D}, //16110 #CJK UNIFIED IDEOGRAPH + {0xDD69, 0x8F0E}, //16111 #CJK UNIFIED IDEOGRAPH + {0xDD6A, 0x8F0F}, //16112 #CJK UNIFIED IDEOGRAPH + {0xDD6B, 0x8F10}, //16113 #CJK UNIFIED IDEOGRAPH + {0xDD6C, 0x8F11}, //16114 #CJK UNIFIED IDEOGRAPH + {0xDD6D, 0x8F12}, //16115 #CJK UNIFIED IDEOGRAPH + {0xDD6E, 0x8F13}, //16116 #CJK UNIFIED IDEOGRAPH + {0xDD6F, 0x8F14}, //16117 #CJK UNIFIED IDEOGRAPH + {0xDD70, 0x8F15}, //16118 #CJK UNIFIED IDEOGRAPH + {0xDD71, 0x8F16}, //16119 #CJK UNIFIED IDEOGRAPH + {0xDD72, 0x8F17}, //16120 #CJK UNIFIED IDEOGRAPH + {0xDD73, 0x8F18}, //16121 #CJK UNIFIED IDEOGRAPH + {0xDD74, 0x8F19}, //16122 #CJK UNIFIED IDEOGRAPH + {0xDD75, 0x8F1A}, //16123 #CJK UNIFIED IDEOGRAPH + {0xDD76, 0x8F1B}, //16124 #CJK UNIFIED IDEOGRAPH + {0xDD77, 0x8F1C}, //16125 #CJK UNIFIED IDEOGRAPH + {0xDD78, 0x8F1D}, //16126 #CJK UNIFIED IDEOGRAPH + {0xDD79, 0x8F1E}, //16127 #CJK UNIFIED IDEOGRAPH + {0xDD7A, 0x8F1F}, //16128 #CJK UNIFIED IDEOGRAPH + {0xDD7B, 0x8F20}, //16129 #CJK UNIFIED IDEOGRAPH + {0xDD7C, 0x8F21}, //16130 #CJK UNIFIED IDEOGRAPH + {0xDD7D, 0x8F22}, //16131 #CJK UNIFIED IDEOGRAPH + {0xDD7E, 0x8F23}, //16132 #CJK UNIFIED IDEOGRAPH + {0xDD80, 0x8F24}, //16133 #CJK UNIFIED IDEOGRAPH + {0xDD81, 0x8F25}, //16134 #CJK UNIFIED IDEOGRAPH + {0xDD82, 0x8F26}, //16135 #CJK UNIFIED IDEOGRAPH + {0xDD83, 0x8F27}, //16136 #CJK UNIFIED IDEOGRAPH + {0xDD84, 0x8F28}, //16137 #CJK UNIFIED IDEOGRAPH + {0xDD85, 0x8F29}, //16138 #CJK UNIFIED IDEOGRAPH + {0xDD86, 0x8F2A}, //16139 #CJK UNIFIED IDEOGRAPH + {0xDD87, 0x8F2B}, //16140 #CJK UNIFIED IDEOGRAPH + {0xDD88, 0x8F2C}, //16141 #CJK UNIFIED IDEOGRAPH + {0xDD89, 0x8F2D}, //16142 #CJK UNIFIED IDEOGRAPH + {0xDD8A, 0x8F2E}, //16143 #CJK UNIFIED IDEOGRAPH + {0xDD8B, 0x8F2F}, //16144 #CJK UNIFIED IDEOGRAPH + {0xDD8C, 0x8F30}, //16145 #CJK UNIFIED IDEOGRAPH + {0xDD8D, 0x8F31}, //16146 #CJK UNIFIED IDEOGRAPH + {0xDD8E, 0x8F32}, //16147 #CJK UNIFIED IDEOGRAPH + {0xDD8F, 0x8F33}, //16148 #CJK UNIFIED IDEOGRAPH + {0xDD90, 0x8F34}, //16149 #CJK UNIFIED IDEOGRAPH + {0xDD91, 0x8F35}, //16150 #CJK UNIFIED IDEOGRAPH + {0xDD92, 0x8F36}, //16151 #CJK UNIFIED IDEOGRAPH + {0xDD93, 0x8F37}, //16152 #CJK UNIFIED IDEOGRAPH + {0xDD94, 0x8F38}, //16153 #CJK UNIFIED IDEOGRAPH + {0xDD95, 0x8F39}, //16154 #CJK UNIFIED IDEOGRAPH + {0xDD96, 0x8F3A}, //16155 #CJK UNIFIED IDEOGRAPH + {0xDD97, 0x8F3B}, //16156 #CJK UNIFIED IDEOGRAPH + {0xDD98, 0x8F3C}, //16157 #CJK UNIFIED IDEOGRAPH + {0xDD99, 0x8F3D}, //16158 #CJK UNIFIED IDEOGRAPH + {0xDD9A, 0x8F3E}, //16159 #CJK UNIFIED IDEOGRAPH + {0xDD9B, 0x8F3F}, //16160 #CJK UNIFIED IDEOGRAPH + {0xDD9C, 0x8F40}, //16161 #CJK UNIFIED IDEOGRAPH + {0xDD9D, 0x8F41}, //16162 #CJK UNIFIED IDEOGRAPH + {0xDD9E, 0x8F42}, //16163 #CJK UNIFIED IDEOGRAPH + {0xDD9F, 0x8F43}, //16164 #CJK UNIFIED IDEOGRAPH + {0xDDA0, 0x8F44}, //16165 #CJK UNIFIED IDEOGRAPH + {0xDDA1, 0x8368}, //16166 #CJK UNIFIED IDEOGRAPH + {0xDDA2, 0x831B}, //16167 #CJK UNIFIED IDEOGRAPH + {0xDDA3, 0x8369}, //16168 #CJK UNIFIED IDEOGRAPH + {0xDDA4, 0x836C}, //16169 #CJK UNIFIED IDEOGRAPH + {0xDDA5, 0x836A}, //16170 #CJK UNIFIED IDEOGRAPH + {0xDDA6, 0x836D}, //16171 #CJK UNIFIED IDEOGRAPH + {0xDDA7, 0x836E}, //16172 #CJK UNIFIED IDEOGRAPH + {0xDDA8, 0x83B0}, //16173 #CJK UNIFIED IDEOGRAPH + {0xDDA9, 0x8378}, //16174 #CJK UNIFIED IDEOGRAPH + {0xDDAA, 0x83B3}, //16175 #CJK UNIFIED IDEOGRAPH + {0xDDAB, 0x83B4}, //16176 #CJK UNIFIED IDEOGRAPH + {0xDDAC, 0x83A0}, //16177 #CJK UNIFIED IDEOGRAPH + {0xDDAD, 0x83AA}, //16178 #CJK UNIFIED IDEOGRAPH + {0xDDAE, 0x8393}, //16179 #CJK UNIFIED IDEOGRAPH + {0xDDAF, 0x839C}, //16180 #CJK UNIFIED IDEOGRAPH + {0xDDB0, 0x8385}, //16181 #CJK UNIFIED IDEOGRAPH + {0xDDB1, 0x837C}, //16182 #CJK UNIFIED IDEOGRAPH + {0xDDB2, 0x83B6}, //16183 #CJK UNIFIED IDEOGRAPH + {0xDDB3, 0x83A9}, //16184 #CJK UNIFIED IDEOGRAPH + {0xDDB4, 0x837D}, //16185 #CJK UNIFIED IDEOGRAPH + {0xDDB5, 0x83B8}, //16186 #CJK UNIFIED IDEOGRAPH + {0xDDB6, 0x837B}, //16187 #CJK UNIFIED IDEOGRAPH + {0xDDB7, 0x8398}, //16188 #CJK UNIFIED IDEOGRAPH + {0xDDB8, 0x839E}, //16189 #CJK UNIFIED IDEOGRAPH + {0xDDB9, 0x83A8}, //16190 #CJK UNIFIED IDEOGRAPH + {0xDDBA, 0x83BA}, //16191 #CJK UNIFIED IDEOGRAPH + {0xDDBB, 0x83BC}, //16192 #CJK UNIFIED IDEOGRAPH + {0xDDBC, 0x83C1}, //16193 #CJK UNIFIED IDEOGRAPH + {0xDDBD, 0x8401}, //16194 #CJK UNIFIED IDEOGRAPH + {0xDDBE, 0x83E5}, //16195 #CJK UNIFIED IDEOGRAPH + {0xDDBF, 0x83D8}, //16196 #CJK UNIFIED IDEOGRAPH + {0xDDC0, 0x5807}, //16197 #CJK UNIFIED IDEOGRAPH + {0xDDC1, 0x8418}, //16198 #CJK UNIFIED IDEOGRAPH + {0xDDC2, 0x840B}, //16199 #CJK UNIFIED IDEOGRAPH + {0xDDC3, 0x83DD}, //16200 #CJK UNIFIED IDEOGRAPH + {0xDDC4, 0x83FD}, //16201 #CJK UNIFIED IDEOGRAPH + {0xDDC5, 0x83D6}, //16202 #CJK UNIFIED IDEOGRAPH + {0xDDC6, 0x841C}, //16203 #CJK UNIFIED IDEOGRAPH + {0xDDC7, 0x8438}, //16204 #CJK UNIFIED IDEOGRAPH + {0xDDC8, 0x8411}, //16205 #CJK UNIFIED IDEOGRAPH + {0xDDC9, 0x8406}, //16206 #CJK UNIFIED IDEOGRAPH + {0xDDCA, 0x83D4}, //16207 #CJK UNIFIED IDEOGRAPH + {0xDDCB, 0x83DF}, //16208 #CJK UNIFIED IDEOGRAPH + {0xDDCC, 0x840F}, //16209 #CJK UNIFIED IDEOGRAPH + {0xDDCD, 0x8403}, //16210 #CJK UNIFIED IDEOGRAPH + {0xDDCE, 0x83F8}, //16211 #CJK UNIFIED IDEOGRAPH + {0xDDCF, 0x83F9}, //16212 #CJK UNIFIED IDEOGRAPH + {0xDDD0, 0x83EA}, //16213 #CJK UNIFIED IDEOGRAPH + {0xDDD1, 0x83C5}, //16214 #CJK UNIFIED IDEOGRAPH + {0xDDD2, 0x83C0}, //16215 #CJK UNIFIED IDEOGRAPH + {0xDDD3, 0x8426}, //16216 #CJK UNIFIED IDEOGRAPH + {0xDDD4, 0x83F0}, //16217 #CJK UNIFIED IDEOGRAPH + {0xDDD5, 0x83E1}, //16218 #CJK UNIFIED IDEOGRAPH + {0xDDD6, 0x845C}, //16219 #CJK UNIFIED IDEOGRAPH + {0xDDD7, 0x8451}, //16220 #CJK UNIFIED IDEOGRAPH + {0xDDD8, 0x845A}, //16221 #CJK UNIFIED IDEOGRAPH + {0xDDD9, 0x8459}, //16222 #CJK UNIFIED IDEOGRAPH + {0xDDDA, 0x8473}, //16223 #CJK UNIFIED IDEOGRAPH + {0xDDDB, 0x8487}, //16224 #CJK UNIFIED IDEOGRAPH + {0xDDDC, 0x8488}, //16225 #CJK UNIFIED IDEOGRAPH + {0xDDDD, 0x847A}, //16226 #CJK UNIFIED IDEOGRAPH + {0xDDDE, 0x8489}, //16227 #CJK UNIFIED IDEOGRAPH + {0xDDDF, 0x8478}, //16228 #CJK UNIFIED IDEOGRAPH + {0xDDE0, 0x843C}, //16229 #CJK UNIFIED IDEOGRAPH + {0xDDE1, 0x8446}, //16230 #CJK UNIFIED IDEOGRAPH + {0xDDE2, 0x8469}, //16231 #CJK UNIFIED IDEOGRAPH + {0xDDE3, 0x8476}, //16232 #CJK UNIFIED IDEOGRAPH + {0xDDE4, 0x848C}, //16233 #CJK UNIFIED IDEOGRAPH + {0xDDE5, 0x848E}, //16234 #CJK UNIFIED IDEOGRAPH + {0xDDE6, 0x8431}, //16235 #CJK UNIFIED IDEOGRAPH + {0xDDE7, 0x846D}, //16236 #CJK UNIFIED IDEOGRAPH + {0xDDE8, 0x84C1}, //16237 #CJK UNIFIED IDEOGRAPH + {0xDDE9, 0x84CD}, //16238 #CJK UNIFIED IDEOGRAPH + {0xDDEA, 0x84D0}, //16239 #CJK UNIFIED IDEOGRAPH + {0xDDEB, 0x84E6}, //16240 #CJK UNIFIED IDEOGRAPH + {0xDDEC, 0x84BD}, //16241 #CJK UNIFIED IDEOGRAPH + {0xDDED, 0x84D3}, //16242 #CJK UNIFIED IDEOGRAPH + {0xDDEE, 0x84CA}, //16243 #CJK UNIFIED IDEOGRAPH + {0xDDEF, 0x84BF}, //16244 #CJK UNIFIED IDEOGRAPH + {0xDDF0, 0x84BA}, //16245 #CJK UNIFIED IDEOGRAPH + {0xDDF1, 0x84E0}, //16246 #CJK UNIFIED IDEOGRAPH + {0xDDF2, 0x84A1}, //16247 #CJK UNIFIED IDEOGRAPH + {0xDDF3, 0x84B9}, //16248 #CJK UNIFIED IDEOGRAPH + {0xDDF4, 0x84B4}, //16249 #CJK UNIFIED IDEOGRAPH + {0xDDF5, 0x8497}, //16250 #CJK UNIFIED IDEOGRAPH + {0xDDF6, 0x84E5}, //16251 #CJK UNIFIED IDEOGRAPH + {0xDDF7, 0x84E3}, //16252 #CJK UNIFIED IDEOGRAPH + {0xDDF8, 0x850C}, //16253 #CJK UNIFIED IDEOGRAPH + {0xDDF9, 0x750D}, //16254 #CJK UNIFIED IDEOGRAPH + {0xDDFA, 0x8538}, //16255 #CJK UNIFIED IDEOGRAPH + {0xDDFB, 0x84F0}, //16256 #CJK UNIFIED IDEOGRAPH + {0xDDFC, 0x8539}, //16257 #CJK UNIFIED IDEOGRAPH + {0xDDFD, 0x851F}, //16258 #CJK UNIFIED IDEOGRAPH + {0xDDFE, 0x853A}, //16259 #CJK UNIFIED IDEOGRAPH + {0xDE40, 0x8F45}, //16260 #CJK UNIFIED IDEOGRAPH + {0xDE41, 0x8F46}, //16261 #CJK UNIFIED IDEOGRAPH + {0xDE42, 0x8F47}, //16262 #CJK UNIFIED IDEOGRAPH + {0xDE43, 0x8F48}, //16263 #CJK UNIFIED IDEOGRAPH + {0xDE44, 0x8F49}, //16264 #CJK UNIFIED IDEOGRAPH + {0xDE45, 0x8F4A}, //16265 #CJK UNIFIED IDEOGRAPH + {0xDE46, 0x8F4B}, //16266 #CJK UNIFIED IDEOGRAPH + {0xDE47, 0x8F4C}, //16267 #CJK UNIFIED IDEOGRAPH + {0xDE48, 0x8F4D}, //16268 #CJK UNIFIED IDEOGRAPH + {0xDE49, 0x8F4E}, //16269 #CJK UNIFIED IDEOGRAPH + {0xDE4A, 0x8F4F}, //16270 #CJK UNIFIED IDEOGRAPH + {0xDE4B, 0x8F50}, //16271 #CJK UNIFIED IDEOGRAPH + {0xDE4C, 0x8F51}, //16272 #CJK UNIFIED IDEOGRAPH + {0xDE4D, 0x8F52}, //16273 #CJK UNIFIED IDEOGRAPH + {0xDE4E, 0x8F53}, //16274 #CJK UNIFIED IDEOGRAPH + {0xDE4F, 0x8F54}, //16275 #CJK UNIFIED IDEOGRAPH + {0xDE50, 0x8F55}, //16276 #CJK UNIFIED IDEOGRAPH + {0xDE51, 0x8F56}, //16277 #CJK UNIFIED IDEOGRAPH + {0xDE52, 0x8F57}, //16278 #CJK UNIFIED IDEOGRAPH + {0xDE53, 0x8F58}, //16279 #CJK UNIFIED IDEOGRAPH + {0xDE54, 0x8F59}, //16280 #CJK UNIFIED IDEOGRAPH + {0xDE55, 0x8F5A}, //16281 #CJK UNIFIED IDEOGRAPH + {0xDE56, 0x8F5B}, //16282 #CJK UNIFIED IDEOGRAPH + {0xDE57, 0x8F5C}, //16283 #CJK UNIFIED IDEOGRAPH + {0xDE58, 0x8F5D}, //16284 #CJK UNIFIED IDEOGRAPH + {0xDE59, 0x8F5E}, //16285 #CJK UNIFIED IDEOGRAPH + {0xDE5A, 0x8F5F}, //16286 #CJK UNIFIED IDEOGRAPH + {0xDE5B, 0x8F60}, //16287 #CJK UNIFIED IDEOGRAPH + {0xDE5C, 0x8F61}, //16288 #CJK UNIFIED IDEOGRAPH + {0xDE5D, 0x8F62}, //16289 #CJK UNIFIED IDEOGRAPH + {0xDE5E, 0x8F63}, //16290 #CJK UNIFIED IDEOGRAPH + {0xDE5F, 0x8F64}, //16291 #CJK UNIFIED IDEOGRAPH + {0xDE60, 0x8F65}, //16292 #CJK UNIFIED IDEOGRAPH + {0xDE61, 0x8F6A}, //16293 #CJK UNIFIED IDEOGRAPH + {0xDE62, 0x8F80}, //16294 #CJK UNIFIED IDEOGRAPH + {0xDE63, 0x8F8C}, //16295 #CJK UNIFIED IDEOGRAPH + {0xDE64, 0x8F92}, //16296 #CJK UNIFIED IDEOGRAPH + {0xDE65, 0x8F9D}, //16297 #CJK UNIFIED IDEOGRAPH + {0xDE66, 0x8FA0}, //16298 #CJK UNIFIED IDEOGRAPH + {0xDE67, 0x8FA1}, //16299 #CJK UNIFIED IDEOGRAPH + {0xDE68, 0x8FA2}, //16300 #CJK UNIFIED IDEOGRAPH + {0xDE69, 0x8FA4}, //16301 #CJK UNIFIED IDEOGRAPH + {0xDE6A, 0x8FA5}, //16302 #CJK UNIFIED IDEOGRAPH + {0xDE6B, 0x8FA6}, //16303 #CJK UNIFIED IDEOGRAPH + {0xDE6C, 0x8FA7}, //16304 #CJK UNIFIED IDEOGRAPH + {0xDE6D, 0x8FAA}, //16305 #CJK UNIFIED IDEOGRAPH + {0xDE6E, 0x8FAC}, //16306 #CJK UNIFIED IDEOGRAPH + {0xDE6F, 0x8FAD}, //16307 #CJK UNIFIED IDEOGRAPH + {0xDE70, 0x8FAE}, //16308 #CJK UNIFIED IDEOGRAPH + {0xDE71, 0x8FAF}, //16309 #CJK UNIFIED IDEOGRAPH + {0xDE72, 0x8FB2}, //16310 #CJK UNIFIED IDEOGRAPH + {0xDE73, 0x8FB3}, //16311 #CJK UNIFIED IDEOGRAPH + {0xDE74, 0x8FB4}, //16312 #CJK UNIFIED IDEOGRAPH + {0xDE75, 0x8FB5}, //16313 #CJK UNIFIED IDEOGRAPH + {0xDE76, 0x8FB7}, //16314 #CJK UNIFIED IDEOGRAPH + {0xDE77, 0x8FB8}, //16315 #CJK UNIFIED IDEOGRAPH + {0xDE78, 0x8FBA}, //16316 #CJK UNIFIED IDEOGRAPH + {0xDE79, 0x8FBB}, //16317 #CJK UNIFIED IDEOGRAPH + {0xDE7A, 0x8FBC}, //16318 #CJK UNIFIED IDEOGRAPH + {0xDE7B, 0x8FBF}, //16319 #CJK UNIFIED IDEOGRAPH + {0xDE7C, 0x8FC0}, //16320 #CJK UNIFIED IDEOGRAPH + {0xDE7D, 0x8FC3}, //16321 #CJK UNIFIED IDEOGRAPH + {0xDE7E, 0x8FC6}, //16322 #CJK UNIFIED IDEOGRAPH + {0xDE80, 0x8FC9}, //16323 #CJK UNIFIED IDEOGRAPH + {0xDE81, 0x8FCA}, //16324 #CJK UNIFIED IDEOGRAPH + {0xDE82, 0x8FCB}, //16325 #CJK UNIFIED IDEOGRAPH + {0xDE83, 0x8FCC}, //16326 #CJK UNIFIED IDEOGRAPH + {0xDE84, 0x8FCD}, //16327 #CJK UNIFIED IDEOGRAPH + {0xDE85, 0x8FCF}, //16328 #CJK UNIFIED IDEOGRAPH + {0xDE86, 0x8FD2}, //16329 #CJK UNIFIED IDEOGRAPH + {0xDE87, 0x8FD6}, //16330 #CJK UNIFIED IDEOGRAPH + {0xDE88, 0x8FD7}, //16331 #CJK UNIFIED IDEOGRAPH + {0xDE89, 0x8FDA}, //16332 #CJK UNIFIED IDEOGRAPH + {0xDE8A, 0x8FE0}, //16333 #CJK UNIFIED IDEOGRAPH + {0xDE8B, 0x8FE1}, //16334 #CJK UNIFIED IDEOGRAPH + {0xDE8C, 0x8FE3}, //16335 #CJK UNIFIED IDEOGRAPH + {0xDE8D, 0x8FE7}, //16336 #CJK UNIFIED IDEOGRAPH + {0xDE8E, 0x8FEC}, //16337 #CJK UNIFIED IDEOGRAPH + {0xDE8F, 0x8FEF}, //16338 #CJK UNIFIED IDEOGRAPH + {0xDE90, 0x8FF1}, //16339 #CJK UNIFIED IDEOGRAPH + {0xDE91, 0x8FF2}, //16340 #CJK UNIFIED IDEOGRAPH + {0xDE92, 0x8FF4}, //16341 #CJK UNIFIED IDEOGRAPH + {0xDE93, 0x8FF5}, //16342 #CJK UNIFIED IDEOGRAPH + {0xDE94, 0x8FF6}, //16343 #CJK UNIFIED IDEOGRAPH + {0xDE95, 0x8FFA}, //16344 #CJK UNIFIED IDEOGRAPH + {0xDE96, 0x8FFB}, //16345 #CJK UNIFIED IDEOGRAPH + {0xDE97, 0x8FFC}, //16346 #CJK UNIFIED IDEOGRAPH + {0xDE98, 0x8FFE}, //16347 #CJK UNIFIED IDEOGRAPH + {0xDE99, 0x8FFF}, //16348 #CJK UNIFIED IDEOGRAPH + {0xDE9A, 0x9007}, //16349 #CJK UNIFIED IDEOGRAPH + {0xDE9B, 0x9008}, //16350 #CJK UNIFIED IDEOGRAPH + {0xDE9C, 0x900C}, //16351 #CJK UNIFIED IDEOGRAPH + {0xDE9D, 0x900E}, //16352 #CJK UNIFIED IDEOGRAPH + {0xDE9E, 0x9013}, //16353 #CJK UNIFIED IDEOGRAPH + {0xDE9F, 0x9015}, //16354 #CJK UNIFIED IDEOGRAPH + {0xDEA0, 0x9018}, //16355 #CJK UNIFIED IDEOGRAPH + {0xDEA1, 0x8556}, //16356 #CJK UNIFIED IDEOGRAPH + {0xDEA2, 0x853B}, //16357 #CJK UNIFIED IDEOGRAPH + {0xDEA3, 0x84FF}, //16358 #CJK UNIFIED IDEOGRAPH + {0xDEA4, 0x84FC}, //16359 #CJK UNIFIED IDEOGRAPH + {0xDEA5, 0x8559}, //16360 #CJK UNIFIED IDEOGRAPH + {0xDEA6, 0x8548}, //16361 #CJK UNIFIED IDEOGRAPH + {0xDEA7, 0x8568}, //16362 #CJK UNIFIED IDEOGRAPH + {0xDEA8, 0x8564}, //16363 #CJK UNIFIED IDEOGRAPH + {0xDEA9, 0x855E}, //16364 #CJK UNIFIED IDEOGRAPH + {0xDEAA, 0x857A}, //16365 #CJK UNIFIED IDEOGRAPH + {0xDEAB, 0x77A2}, //16366 #CJK UNIFIED IDEOGRAPH + {0xDEAC, 0x8543}, //16367 #CJK UNIFIED IDEOGRAPH + {0xDEAD, 0x8572}, //16368 #CJK UNIFIED IDEOGRAPH + {0xDEAE, 0x857B}, //16369 #CJK UNIFIED IDEOGRAPH + {0xDEAF, 0x85A4}, //16370 #CJK UNIFIED IDEOGRAPH + {0xDEB0, 0x85A8}, //16371 #CJK UNIFIED IDEOGRAPH + {0xDEB1, 0x8587}, //16372 #CJK UNIFIED IDEOGRAPH + {0xDEB2, 0x858F}, //16373 #CJK UNIFIED IDEOGRAPH + {0xDEB3, 0x8579}, //16374 #CJK UNIFIED IDEOGRAPH + {0xDEB4, 0x85AE}, //16375 #CJK UNIFIED IDEOGRAPH + {0xDEB5, 0x859C}, //16376 #CJK UNIFIED IDEOGRAPH + {0xDEB6, 0x8585}, //16377 #CJK UNIFIED IDEOGRAPH + {0xDEB7, 0x85B9}, //16378 #CJK UNIFIED IDEOGRAPH + {0xDEB8, 0x85B7}, //16379 #CJK UNIFIED IDEOGRAPH + {0xDEB9, 0x85B0}, //16380 #CJK UNIFIED IDEOGRAPH + {0xDEBA, 0x85D3}, //16381 #CJK UNIFIED IDEOGRAPH + {0xDEBB, 0x85C1}, //16382 #CJK UNIFIED IDEOGRAPH + {0xDEBC, 0x85DC}, //16383 #CJK UNIFIED IDEOGRAPH + {0xDEBD, 0x85FF}, //16384 #CJK UNIFIED IDEOGRAPH + {0xDEBE, 0x8627}, //16385 #CJK UNIFIED IDEOGRAPH + {0xDEBF, 0x8605}, //16386 #CJK UNIFIED IDEOGRAPH + {0xDEC0, 0x8629}, //16387 #CJK UNIFIED IDEOGRAPH + {0xDEC1, 0x8616}, //16388 #CJK UNIFIED IDEOGRAPH + {0xDEC2, 0x863C}, //16389 #CJK UNIFIED IDEOGRAPH + {0xDEC3, 0x5EFE}, //16390 #CJK UNIFIED IDEOGRAPH + {0xDEC4, 0x5F08}, //16391 #CJK UNIFIED IDEOGRAPH + {0xDEC5, 0x593C}, //16392 #CJK UNIFIED IDEOGRAPH + {0xDEC6, 0x5941}, //16393 #CJK UNIFIED IDEOGRAPH + {0xDEC7, 0x8037}, //16394 #CJK UNIFIED IDEOGRAPH + {0xDEC8, 0x5955}, //16395 #CJK UNIFIED IDEOGRAPH + {0xDEC9, 0x595A}, //16396 #CJK UNIFIED IDEOGRAPH + {0xDECA, 0x5958}, //16397 #CJK UNIFIED IDEOGRAPH + {0xDECB, 0x530F}, //16398 #CJK UNIFIED IDEOGRAPH + {0xDECC, 0x5C22}, //16399 #CJK UNIFIED IDEOGRAPH + {0xDECD, 0x5C25}, //16400 #CJK UNIFIED IDEOGRAPH + {0xDECE, 0x5C2C}, //16401 #CJK UNIFIED IDEOGRAPH + {0xDECF, 0x5C34}, //16402 #CJK UNIFIED IDEOGRAPH + {0xDED0, 0x624C}, //16403 #CJK UNIFIED IDEOGRAPH + {0xDED1, 0x626A}, //16404 #CJK UNIFIED IDEOGRAPH + {0xDED2, 0x629F}, //16405 #CJK UNIFIED IDEOGRAPH + {0xDED3, 0x62BB}, //16406 #CJK UNIFIED IDEOGRAPH + {0xDED4, 0x62CA}, //16407 #CJK UNIFIED IDEOGRAPH + {0xDED5, 0x62DA}, //16408 #CJK UNIFIED IDEOGRAPH + {0xDED6, 0x62D7}, //16409 #CJK UNIFIED IDEOGRAPH + {0xDED7, 0x62EE}, //16410 #CJK UNIFIED IDEOGRAPH + {0xDED8, 0x6322}, //16411 #CJK UNIFIED IDEOGRAPH + {0xDED9, 0x62F6}, //16412 #CJK UNIFIED IDEOGRAPH + {0xDEDA, 0x6339}, //16413 #CJK UNIFIED IDEOGRAPH + {0xDEDB, 0x634B}, //16414 #CJK UNIFIED IDEOGRAPH + {0xDEDC, 0x6343}, //16415 #CJK UNIFIED IDEOGRAPH + {0xDEDD, 0x63AD}, //16416 #CJK UNIFIED IDEOGRAPH + {0xDEDE, 0x63F6}, //16417 #CJK UNIFIED IDEOGRAPH + {0xDEDF, 0x6371}, //16418 #CJK UNIFIED IDEOGRAPH + {0xDEE0, 0x637A}, //16419 #CJK UNIFIED IDEOGRAPH + {0xDEE1, 0x638E}, //16420 #CJK UNIFIED IDEOGRAPH + {0xDEE2, 0x63B4}, //16421 #CJK UNIFIED IDEOGRAPH + {0xDEE3, 0x636D}, //16422 #CJK UNIFIED IDEOGRAPH + {0xDEE4, 0x63AC}, //16423 #CJK UNIFIED IDEOGRAPH + {0xDEE5, 0x638A}, //16424 #CJK UNIFIED IDEOGRAPH + {0xDEE6, 0x6369}, //16425 #CJK UNIFIED IDEOGRAPH + {0xDEE7, 0x63AE}, //16426 #CJK UNIFIED IDEOGRAPH + {0xDEE8, 0x63BC}, //16427 #CJK UNIFIED IDEOGRAPH + {0xDEE9, 0x63F2}, //16428 #CJK UNIFIED IDEOGRAPH + {0xDEEA, 0x63F8}, //16429 #CJK UNIFIED IDEOGRAPH + {0xDEEB, 0x63E0}, //16430 #CJK UNIFIED IDEOGRAPH + {0xDEEC, 0x63FF}, //16431 #CJK UNIFIED IDEOGRAPH + {0xDEED, 0x63C4}, //16432 #CJK UNIFIED IDEOGRAPH + {0xDEEE, 0x63DE}, //16433 #CJK UNIFIED IDEOGRAPH + {0xDEEF, 0x63CE}, //16434 #CJK UNIFIED IDEOGRAPH + {0xDEF0, 0x6452}, //16435 #CJK UNIFIED IDEOGRAPH + {0xDEF1, 0x63C6}, //16436 #CJK UNIFIED IDEOGRAPH + {0xDEF2, 0x63BE}, //16437 #CJK UNIFIED IDEOGRAPH + {0xDEF3, 0x6445}, //16438 #CJK UNIFIED IDEOGRAPH + {0xDEF4, 0x6441}, //16439 #CJK UNIFIED IDEOGRAPH + {0xDEF5, 0x640B}, //16440 #CJK UNIFIED IDEOGRAPH + {0xDEF6, 0x641B}, //16441 #CJK UNIFIED IDEOGRAPH + {0xDEF7, 0x6420}, //16442 #CJK UNIFIED IDEOGRAPH + {0xDEF8, 0x640C}, //16443 #CJK UNIFIED IDEOGRAPH + {0xDEF9, 0x6426}, //16444 #CJK UNIFIED IDEOGRAPH + {0xDEFA, 0x6421}, //16445 #CJK UNIFIED IDEOGRAPH + {0xDEFB, 0x645E}, //16446 #CJK UNIFIED IDEOGRAPH + {0xDEFC, 0x6484}, //16447 #CJK UNIFIED IDEOGRAPH + {0xDEFD, 0x646D}, //16448 #CJK UNIFIED IDEOGRAPH + {0xDEFE, 0x6496}, //16449 #CJK UNIFIED IDEOGRAPH + {0xDF40, 0x9019}, //16450 #CJK UNIFIED IDEOGRAPH + {0xDF41, 0x901C}, //16451 #CJK UNIFIED IDEOGRAPH + {0xDF42, 0x9023}, //16452 #CJK UNIFIED IDEOGRAPH + {0xDF43, 0x9024}, //16453 #CJK UNIFIED IDEOGRAPH + {0xDF44, 0x9025}, //16454 #CJK UNIFIED IDEOGRAPH + {0xDF45, 0x9027}, //16455 #CJK UNIFIED IDEOGRAPH + {0xDF46, 0x9028}, //16456 #CJK UNIFIED IDEOGRAPH + {0xDF47, 0x9029}, //16457 #CJK UNIFIED IDEOGRAPH + {0xDF48, 0x902A}, //16458 #CJK UNIFIED IDEOGRAPH + {0xDF49, 0x902B}, //16459 #CJK UNIFIED IDEOGRAPH + {0xDF4A, 0x902C}, //16460 #CJK UNIFIED IDEOGRAPH + {0xDF4B, 0x9030}, //16461 #CJK UNIFIED IDEOGRAPH + {0xDF4C, 0x9031}, //16462 #CJK UNIFIED IDEOGRAPH + {0xDF4D, 0x9032}, //16463 #CJK UNIFIED IDEOGRAPH + {0xDF4E, 0x9033}, //16464 #CJK UNIFIED IDEOGRAPH + {0xDF4F, 0x9034}, //16465 #CJK UNIFIED IDEOGRAPH + {0xDF50, 0x9037}, //16466 #CJK UNIFIED IDEOGRAPH + {0xDF51, 0x9039}, //16467 #CJK UNIFIED IDEOGRAPH + {0xDF52, 0x903A}, //16468 #CJK UNIFIED IDEOGRAPH + {0xDF53, 0x903D}, //16469 #CJK UNIFIED IDEOGRAPH + {0xDF54, 0x903F}, //16470 #CJK UNIFIED IDEOGRAPH + {0xDF55, 0x9040}, //16471 #CJK UNIFIED IDEOGRAPH + {0xDF56, 0x9043}, //16472 #CJK UNIFIED IDEOGRAPH + {0xDF57, 0x9045}, //16473 #CJK UNIFIED IDEOGRAPH + {0xDF58, 0x9046}, //16474 #CJK UNIFIED IDEOGRAPH + {0xDF59, 0x9048}, //16475 #CJK UNIFIED IDEOGRAPH + {0xDF5A, 0x9049}, //16476 #CJK UNIFIED IDEOGRAPH + {0xDF5B, 0x904A}, //16477 #CJK UNIFIED IDEOGRAPH + {0xDF5C, 0x904B}, //16478 #CJK UNIFIED IDEOGRAPH + {0xDF5D, 0x904C}, //16479 #CJK UNIFIED IDEOGRAPH + {0xDF5E, 0x904E}, //16480 #CJK UNIFIED IDEOGRAPH + {0xDF5F, 0x9054}, //16481 #CJK UNIFIED IDEOGRAPH + {0xDF60, 0x9055}, //16482 #CJK UNIFIED IDEOGRAPH + {0xDF61, 0x9056}, //16483 #CJK UNIFIED IDEOGRAPH + {0xDF62, 0x9059}, //16484 #CJK UNIFIED IDEOGRAPH + {0xDF63, 0x905A}, //16485 #CJK UNIFIED IDEOGRAPH + {0xDF64, 0x905C}, //16486 #CJK UNIFIED IDEOGRAPH + {0xDF65, 0x905D}, //16487 #CJK UNIFIED IDEOGRAPH + {0xDF66, 0x905E}, //16488 #CJK UNIFIED IDEOGRAPH + {0xDF67, 0x905F}, //16489 #CJK UNIFIED IDEOGRAPH + {0xDF68, 0x9060}, //16490 #CJK UNIFIED IDEOGRAPH + {0xDF69, 0x9061}, //16491 #CJK UNIFIED IDEOGRAPH + {0xDF6A, 0x9064}, //16492 #CJK UNIFIED IDEOGRAPH + {0xDF6B, 0x9066}, //16493 #CJK UNIFIED IDEOGRAPH + {0xDF6C, 0x9067}, //16494 #CJK UNIFIED IDEOGRAPH + {0xDF6D, 0x9069}, //16495 #CJK UNIFIED IDEOGRAPH + {0xDF6E, 0x906A}, //16496 #CJK UNIFIED IDEOGRAPH + {0xDF6F, 0x906B}, //16497 #CJK UNIFIED IDEOGRAPH + {0xDF70, 0x906C}, //16498 #CJK UNIFIED IDEOGRAPH + {0xDF71, 0x906F}, //16499 #CJK UNIFIED IDEOGRAPH + {0xDF72, 0x9070}, //16500 #CJK UNIFIED IDEOGRAPH + {0xDF73, 0x9071}, //16501 #CJK UNIFIED IDEOGRAPH + {0xDF74, 0x9072}, //16502 #CJK UNIFIED IDEOGRAPH + {0xDF75, 0x9073}, //16503 #CJK UNIFIED IDEOGRAPH + {0xDF76, 0x9076}, //16504 #CJK UNIFIED IDEOGRAPH + {0xDF77, 0x9077}, //16505 #CJK UNIFIED IDEOGRAPH + {0xDF78, 0x9078}, //16506 #CJK UNIFIED IDEOGRAPH + {0xDF79, 0x9079}, //16507 #CJK UNIFIED IDEOGRAPH + {0xDF7A, 0x907A}, //16508 #CJK UNIFIED IDEOGRAPH + {0xDF7B, 0x907B}, //16509 #CJK UNIFIED IDEOGRAPH + {0xDF7C, 0x907C}, //16510 #CJK UNIFIED IDEOGRAPH + {0xDF7D, 0x907E}, //16511 #CJK UNIFIED IDEOGRAPH + {0xDF7E, 0x9081}, //16512 #CJK UNIFIED IDEOGRAPH + {0xDF80, 0x9084}, //16513 #CJK UNIFIED IDEOGRAPH + {0xDF81, 0x9085}, //16514 #CJK UNIFIED IDEOGRAPH + {0xDF82, 0x9086}, //16515 #CJK UNIFIED IDEOGRAPH + {0xDF83, 0x9087}, //16516 #CJK UNIFIED IDEOGRAPH + {0xDF84, 0x9089}, //16517 #CJK UNIFIED IDEOGRAPH + {0xDF85, 0x908A}, //16518 #CJK UNIFIED IDEOGRAPH + {0xDF86, 0x908C}, //16519 #CJK UNIFIED IDEOGRAPH + {0xDF87, 0x908D}, //16520 #CJK UNIFIED IDEOGRAPH + {0xDF88, 0x908E}, //16521 #CJK UNIFIED IDEOGRAPH + {0xDF89, 0x908F}, //16522 #CJK UNIFIED IDEOGRAPH + {0xDF8A, 0x9090}, //16523 #CJK UNIFIED IDEOGRAPH + {0xDF8B, 0x9092}, //16524 #CJK UNIFIED IDEOGRAPH + {0xDF8C, 0x9094}, //16525 #CJK UNIFIED IDEOGRAPH + {0xDF8D, 0x9096}, //16526 #CJK UNIFIED IDEOGRAPH + {0xDF8E, 0x9098}, //16527 #CJK UNIFIED IDEOGRAPH + {0xDF8F, 0x909A}, //16528 #CJK UNIFIED IDEOGRAPH + {0xDF90, 0x909C}, //16529 #CJK UNIFIED IDEOGRAPH + {0xDF91, 0x909E}, //16530 #CJK UNIFIED IDEOGRAPH + {0xDF92, 0x909F}, //16531 #CJK UNIFIED IDEOGRAPH + {0xDF93, 0x90A0}, //16532 #CJK UNIFIED IDEOGRAPH + {0xDF94, 0x90A4}, //16533 #CJK UNIFIED IDEOGRAPH + {0xDF95, 0x90A5}, //16534 #CJK UNIFIED IDEOGRAPH + {0xDF96, 0x90A7}, //16535 #CJK UNIFIED IDEOGRAPH + {0xDF97, 0x90A8}, //16536 #CJK UNIFIED IDEOGRAPH + {0xDF98, 0x90A9}, //16537 #CJK UNIFIED IDEOGRAPH + {0xDF99, 0x90AB}, //16538 #CJK UNIFIED IDEOGRAPH + {0xDF9A, 0x90AD}, //16539 #CJK UNIFIED IDEOGRAPH + {0xDF9B, 0x90B2}, //16540 #CJK UNIFIED IDEOGRAPH + {0xDF9C, 0x90B7}, //16541 #CJK UNIFIED IDEOGRAPH + {0xDF9D, 0x90BC}, //16542 #CJK UNIFIED IDEOGRAPH + {0xDF9E, 0x90BD}, //16543 #CJK UNIFIED IDEOGRAPH + {0xDF9F, 0x90BF}, //16544 #CJK UNIFIED IDEOGRAPH + {0xDFA0, 0x90C0}, //16545 #CJK UNIFIED IDEOGRAPH + {0xDFA1, 0x647A}, //16546 #CJK UNIFIED IDEOGRAPH + {0xDFA2, 0x64B7}, //16547 #CJK UNIFIED IDEOGRAPH + {0xDFA3, 0x64B8}, //16548 #CJK UNIFIED IDEOGRAPH + {0xDFA4, 0x6499}, //16549 #CJK UNIFIED IDEOGRAPH + {0xDFA5, 0x64BA}, //16550 #CJK UNIFIED IDEOGRAPH + {0xDFA6, 0x64C0}, //16551 #CJK UNIFIED IDEOGRAPH + {0xDFA7, 0x64D0}, //16552 #CJK UNIFIED IDEOGRAPH + {0xDFA8, 0x64D7}, //16553 #CJK UNIFIED IDEOGRAPH + {0xDFA9, 0x64E4}, //16554 #CJK UNIFIED IDEOGRAPH + {0xDFAA, 0x64E2}, //16555 #CJK UNIFIED IDEOGRAPH + {0xDFAB, 0x6509}, //16556 #CJK UNIFIED IDEOGRAPH + {0xDFAC, 0x6525}, //16557 #CJK UNIFIED IDEOGRAPH + {0xDFAD, 0x652E}, //16558 #CJK UNIFIED IDEOGRAPH + {0xDFAE, 0x5F0B}, //16559 #CJK UNIFIED IDEOGRAPH + {0xDFAF, 0x5FD2}, //16560 #CJK UNIFIED IDEOGRAPH + {0xDFB0, 0x7519}, //16561 #CJK UNIFIED IDEOGRAPH + {0xDFB1, 0x5F11}, //16562 #CJK UNIFIED IDEOGRAPH + {0xDFB2, 0x535F}, //16563 #CJK UNIFIED IDEOGRAPH + {0xDFB3, 0x53F1}, //16564 #CJK UNIFIED IDEOGRAPH + {0xDFB4, 0x53FD}, //16565 #CJK UNIFIED IDEOGRAPH + {0xDFB5, 0x53E9}, //16566 #CJK UNIFIED IDEOGRAPH + {0xDFB6, 0x53E8}, //16567 #CJK UNIFIED IDEOGRAPH + {0xDFB7, 0x53FB}, //16568 #CJK UNIFIED IDEOGRAPH + {0xDFB8, 0x5412}, //16569 #CJK UNIFIED IDEOGRAPH + {0xDFB9, 0x5416}, //16570 #CJK UNIFIED IDEOGRAPH + {0xDFBA, 0x5406}, //16571 #CJK UNIFIED IDEOGRAPH + {0xDFBB, 0x544B}, //16572 #CJK UNIFIED IDEOGRAPH + {0xDFBC, 0x5452}, //16573 #CJK UNIFIED IDEOGRAPH + {0xDFBD, 0x5453}, //16574 #CJK UNIFIED IDEOGRAPH + {0xDFBE, 0x5454}, //16575 #CJK UNIFIED IDEOGRAPH + {0xDFBF, 0x5456}, //16576 #CJK UNIFIED IDEOGRAPH + {0xDFC0, 0x5443}, //16577 #CJK UNIFIED IDEOGRAPH + {0xDFC1, 0x5421}, //16578 #CJK UNIFIED IDEOGRAPH + {0xDFC2, 0x5457}, //16579 #CJK UNIFIED IDEOGRAPH + {0xDFC3, 0x5459}, //16580 #CJK UNIFIED IDEOGRAPH + {0xDFC4, 0x5423}, //16581 #CJK UNIFIED IDEOGRAPH + {0xDFC5, 0x5432}, //16582 #CJK UNIFIED IDEOGRAPH + {0xDFC6, 0x5482}, //16583 #CJK UNIFIED IDEOGRAPH + {0xDFC7, 0x5494}, //16584 #CJK UNIFIED IDEOGRAPH + {0xDFC8, 0x5477}, //16585 #CJK UNIFIED IDEOGRAPH + {0xDFC9, 0x5471}, //16586 #CJK UNIFIED IDEOGRAPH + {0xDFCA, 0x5464}, //16587 #CJK UNIFIED IDEOGRAPH + {0xDFCB, 0x549A}, //16588 #CJK UNIFIED IDEOGRAPH + {0xDFCC, 0x549B}, //16589 #CJK UNIFIED IDEOGRAPH + {0xDFCD, 0x5484}, //16590 #CJK UNIFIED IDEOGRAPH + {0xDFCE, 0x5476}, //16591 #CJK UNIFIED IDEOGRAPH + {0xDFCF, 0x5466}, //16592 #CJK UNIFIED IDEOGRAPH + {0xDFD0, 0x549D}, //16593 #CJK UNIFIED IDEOGRAPH + {0xDFD1, 0x54D0}, //16594 #CJK UNIFIED IDEOGRAPH + {0xDFD2, 0x54AD}, //16595 #CJK UNIFIED IDEOGRAPH + {0xDFD3, 0x54C2}, //16596 #CJK UNIFIED IDEOGRAPH + {0xDFD4, 0x54B4}, //16597 #CJK UNIFIED IDEOGRAPH + {0xDFD5, 0x54D2}, //16598 #CJK UNIFIED IDEOGRAPH + {0xDFD6, 0x54A7}, //16599 #CJK UNIFIED IDEOGRAPH + {0xDFD7, 0x54A6}, //16600 #CJK UNIFIED IDEOGRAPH + {0xDFD8, 0x54D3}, //16601 #CJK UNIFIED IDEOGRAPH + {0xDFD9, 0x54D4}, //16602 #CJK UNIFIED IDEOGRAPH + {0xDFDA, 0x5472}, //16603 #CJK UNIFIED IDEOGRAPH + {0xDFDB, 0x54A3}, //16604 #CJK UNIFIED IDEOGRAPH + {0xDFDC, 0x54D5}, //16605 #CJK UNIFIED IDEOGRAPH + {0xDFDD, 0x54BB}, //16606 #CJK UNIFIED IDEOGRAPH + {0xDFDE, 0x54BF}, //16607 #CJK UNIFIED IDEOGRAPH + {0xDFDF, 0x54CC}, //16608 #CJK UNIFIED IDEOGRAPH + {0xDFE0, 0x54D9}, //16609 #CJK UNIFIED IDEOGRAPH + {0xDFE1, 0x54DA}, //16610 #CJK UNIFIED IDEOGRAPH + {0xDFE2, 0x54DC}, //16611 #CJK UNIFIED IDEOGRAPH + {0xDFE3, 0x54A9}, //16612 #CJK UNIFIED IDEOGRAPH + {0xDFE4, 0x54AA}, //16613 #CJK UNIFIED IDEOGRAPH + {0xDFE5, 0x54A4}, //16614 #CJK UNIFIED IDEOGRAPH + {0xDFE6, 0x54DD}, //16615 #CJK UNIFIED IDEOGRAPH + {0xDFE7, 0x54CF}, //16616 #CJK UNIFIED IDEOGRAPH + {0xDFE8, 0x54DE}, //16617 #CJK UNIFIED IDEOGRAPH + {0xDFE9, 0x551B}, //16618 #CJK UNIFIED IDEOGRAPH + {0xDFEA, 0x54E7}, //16619 #CJK UNIFIED IDEOGRAPH + {0xDFEB, 0x5520}, //16620 #CJK UNIFIED IDEOGRAPH + {0xDFEC, 0x54FD}, //16621 #CJK UNIFIED IDEOGRAPH + {0xDFED, 0x5514}, //16622 #CJK UNIFIED IDEOGRAPH + {0xDFEE, 0x54F3}, //16623 #CJK UNIFIED IDEOGRAPH + {0xDFEF, 0x5522}, //16624 #CJK UNIFIED IDEOGRAPH + {0xDFF0, 0x5523}, //16625 #CJK UNIFIED IDEOGRAPH + {0xDFF1, 0x550F}, //16626 #CJK UNIFIED IDEOGRAPH + {0xDFF2, 0x5511}, //16627 #CJK UNIFIED IDEOGRAPH + {0xDFF3, 0x5527}, //16628 #CJK UNIFIED IDEOGRAPH + {0xDFF4, 0x552A}, //16629 #CJK UNIFIED IDEOGRAPH + {0xDFF5, 0x5567}, //16630 #CJK UNIFIED IDEOGRAPH + {0xDFF6, 0x558F}, //16631 #CJK UNIFIED IDEOGRAPH + {0xDFF7, 0x55B5}, //16632 #CJK UNIFIED IDEOGRAPH + {0xDFF8, 0x5549}, //16633 #CJK UNIFIED IDEOGRAPH + {0xDFF9, 0x556D}, //16634 #CJK UNIFIED IDEOGRAPH + {0xDFFA, 0x5541}, //16635 #CJK UNIFIED IDEOGRAPH + {0xDFFB, 0x5555}, //16636 #CJK UNIFIED IDEOGRAPH + {0xDFFC, 0x553F}, //16637 #CJK UNIFIED IDEOGRAPH + {0xDFFD, 0x5550}, //16638 #CJK UNIFIED IDEOGRAPH + {0xDFFE, 0x553C}, //16639 #CJK UNIFIED IDEOGRAPH + {0xE040, 0x90C2}, //16640 #CJK UNIFIED IDEOGRAPH + {0xE041, 0x90C3}, //16641 #CJK UNIFIED IDEOGRAPH + {0xE042, 0x90C6}, //16642 #CJK UNIFIED IDEOGRAPH + {0xE043, 0x90C8}, //16643 #CJK UNIFIED IDEOGRAPH + {0xE044, 0x90C9}, //16644 #CJK UNIFIED IDEOGRAPH + {0xE045, 0x90CB}, //16645 #CJK UNIFIED IDEOGRAPH + {0xE046, 0x90CC}, //16646 #CJK UNIFIED IDEOGRAPH + {0xE047, 0x90CD}, //16647 #CJK UNIFIED IDEOGRAPH + {0xE048, 0x90D2}, //16648 #CJK UNIFIED IDEOGRAPH + {0xE049, 0x90D4}, //16649 #CJK UNIFIED IDEOGRAPH + {0xE04A, 0x90D5}, //16650 #CJK UNIFIED IDEOGRAPH + {0xE04B, 0x90D6}, //16651 #CJK UNIFIED IDEOGRAPH + {0xE04C, 0x90D8}, //16652 #CJK UNIFIED IDEOGRAPH + {0xE04D, 0x90D9}, //16653 #CJK UNIFIED IDEOGRAPH + {0xE04E, 0x90DA}, //16654 #CJK UNIFIED IDEOGRAPH + {0xE04F, 0x90DE}, //16655 #CJK UNIFIED IDEOGRAPH + {0xE050, 0x90DF}, //16656 #CJK UNIFIED IDEOGRAPH + {0xE051, 0x90E0}, //16657 #CJK UNIFIED IDEOGRAPH + {0xE052, 0x90E3}, //16658 #CJK UNIFIED IDEOGRAPH + {0xE053, 0x90E4}, //16659 #CJK UNIFIED IDEOGRAPH + {0xE054, 0x90E5}, //16660 #CJK UNIFIED IDEOGRAPH + {0xE055, 0x90E9}, //16661 #CJK UNIFIED IDEOGRAPH + {0xE056, 0x90EA}, //16662 #CJK UNIFIED IDEOGRAPH + {0xE057, 0x90EC}, //16663 #CJK UNIFIED IDEOGRAPH + {0xE058, 0x90EE}, //16664 #CJK UNIFIED IDEOGRAPH + {0xE059, 0x90F0}, //16665 #CJK UNIFIED IDEOGRAPH + {0xE05A, 0x90F1}, //16666 #CJK UNIFIED IDEOGRAPH + {0xE05B, 0x90F2}, //16667 #CJK UNIFIED IDEOGRAPH + {0xE05C, 0x90F3}, //16668 #CJK UNIFIED IDEOGRAPH + {0xE05D, 0x90F5}, //16669 #CJK UNIFIED IDEOGRAPH + {0xE05E, 0x90F6}, //16670 #CJK UNIFIED IDEOGRAPH + {0xE05F, 0x90F7}, //16671 #CJK UNIFIED IDEOGRAPH + {0xE060, 0x90F9}, //16672 #CJK UNIFIED IDEOGRAPH + {0xE061, 0x90FA}, //16673 #CJK UNIFIED IDEOGRAPH + {0xE062, 0x90FB}, //16674 #CJK UNIFIED IDEOGRAPH + {0xE063, 0x90FC}, //16675 #CJK UNIFIED IDEOGRAPH + {0xE064, 0x90FF}, //16676 #CJK UNIFIED IDEOGRAPH + {0xE065, 0x9100}, //16677 #CJK UNIFIED IDEOGRAPH + {0xE066, 0x9101}, //16678 #CJK UNIFIED IDEOGRAPH + {0xE067, 0x9103}, //16679 #CJK UNIFIED IDEOGRAPH + {0xE068, 0x9105}, //16680 #CJK UNIFIED IDEOGRAPH + {0xE069, 0x9106}, //16681 #CJK UNIFIED IDEOGRAPH + {0xE06A, 0x9107}, //16682 #CJK UNIFIED IDEOGRAPH + {0xE06B, 0x9108}, //16683 #CJK UNIFIED IDEOGRAPH + {0xE06C, 0x9109}, //16684 #CJK UNIFIED IDEOGRAPH + {0xE06D, 0x910A}, //16685 #CJK UNIFIED IDEOGRAPH + {0xE06E, 0x910B}, //16686 #CJK UNIFIED IDEOGRAPH + {0xE06F, 0x910C}, //16687 #CJK UNIFIED IDEOGRAPH + {0xE070, 0x910D}, //16688 #CJK UNIFIED IDEOGRAPH + {0xE071, 0x910E}, //16689 #CJK UNIFIED IDEOGRAPH + {0xE072, 0x910F}, //16690 #CJK UNIFIED IDEOGRAPH + {0xE073, 0x9110}, //16691 #CJK UNIFIED IDEOGRAPH + {0xE074, 0x9111}, //16692 #CJK UNIFIED IDEOGRAPH + {0xE075, 0x9112}, //16693 #CJK UNIFIED IDEOGRAPH + {0xE076, 0x9113}, //16694 #CJK UNIFIED IDEOGRAPH + {0xE077, 0x9114}, //16695 #CJK UNIFIED IDEOGRAPH + {0xE078, 0x9115}, //16696 #CJK UNIFIED IDEOGRAPH + {0xE079, 0x9116}, //16697 #CJK UNIFIED IDEOGRAPH + {0xE07A, 0x9117}, //16698 #CJK UNIFIED IDEOGRAPH + {0xE07B, 0x9118}, //16699 #CJK UNIFIED IDEOGRAPH + {0xE07C, 0x911A}, //16700 #CJK UNIFIED IDEOGRAPH + {0xE07D, 0x911B}, //16701 #CJK UNIFIED IDEOGRAPH + {0xE07E, 0x911C}, //16702 #CJK UNIFIED IDEOGRAPH + {0xE080, 0x911D}, //16703 #CJK UNIFIED IDEOGRAPH + {0xE081, 0x911F}, //16704 #CJK UNIFIED IDEOGRAPH + {0xE082, 0x9120}, //16705 #CJK UNIFIED IDEOGRAPH + {0xE083, 0x9121}, //16706 #CJK UNIFIED IDEOGRAPH + {0xE084, 0x9124}, //16707 #CJK UNIFIED IDEOGRAPH + {0xE085, 0x9125}, //16708 #CJK UNIFIED IDEOGRAPH + {0xE086, 0x9126}, //16709 #CJK UNIFIED IDEOGRAPH + {0xE087, 0x9127}, //16710 #CJK UNIFIED IDEOGRAPH + {0xE088, 0x9128}, //16711 #CJK UNIFIED IDEOGRAPH + {0xE089, 0x9129}, //16712 #CJK UNIFIED IDEOGRAPH + {0xE08A, 0x912A}, //16713 #CJK UNIFIED IDEOGRAPH + {0xE08B, 0x912B}, //16714 #CJK UNIFIED IDEOGRAPH + {0xE08C, 0x912C}, //16715 #CJK UNIFIED IDEOGRAPH + {0xE08D, 0x912D}, //16716 #CJK UNIFIED IDEOGRAPH + {0xE08E, 0x912E}, //16717 #CJK UNIFIED IDEOGRAPH + {0xE08F, 0x9130}, //16718 #CJK UNIFIED IDEOGRAPH + {0xE090, 0x9132}, //16719 #CJK UNIFIED IDEOGRAPH + {0xE091, 0x9133}, //16720 #CJK UNIFIED IDEOGRAPH + {0xE092, 0x9134}, //16721 #CJK UNIFIED IDEOGRAPH + {0xE093, 0x9135}, //16722 #CJK UNIFIED IDEOGRAPH + {0xE094, 0x9136}, //16723 #CJK UNIFIED IDEOGRAPH + {0xE095, 0x9137}, //16724 #CJK UNIFIED IDEOGRAPH + {0xE096, 0x9138}, //16725 #CJK UNIFIED IDEOGRAPH + {0xE097, 0x913A}, //16726 #CJK UNIFIED IDEOGRAPH + {0xE098, 0x913B}, //16727 #CJK UNIFIED IDEOGRAPH + {0xE099, 0x913C}, //16728 #CJK UNIFIED IDEOGRAPH + {0xE09A, 0x913D}, //16729 #CJK UNIFIED IDEOGRAPH + {0xE09B, 0x913E}, //16730 #CJK UNIFIED IDEOGRAPH + {0xE09C, 0x913F}, //16731 #CJK UNIFIED IDEOGRAPH + {0xE09D, 0x9140}, //16732 #CJK UNIFIED IDEOGRAPH + {0xE09E, 0x9141}, //16733 #CJK UNIFIED IDEOGRAPH + {0xE09F, 0x9142}, //16734 #CJK UNIFIED IDEOGRAPH + {0xE0A0, 0x9144}, //16735 #CJK UNIFIED IDEOGRAPH + {0xE0A1, 0x5537}, //16736 #CJK UNIFIED IDEOGRAPH + {0xE0A2, 0x5556}, //16737 #CJK UNIFIED IDEOGRAPH + {0xE0A3, 0x5575}, //16738 #CJK UNIFIED IDEOGRAPH + {0xE0A4, 0x5576}, //16739 #CJK UNIFIED IDEOGRAPH + {0xE0A5, 0x5577}, //16740 #CJK UNIFIED IDEOGRAPH + {0xE0A6, 0x5533}, //16741 #CJK UNIFIED IDEOGRAPH + {0xE0A7, 0x5530}, //16742 #CJK UNIFIED IDEOGRAPH + {0xE0A8, 0x555C}, //16743 #CJK UNIFIED IDEOGRAPH + {0xE0A9, 0x558B}, //16744 #CJK UNIFIED IDEOGRAPH + {0xE0AA, 0x55D2}, //16745 #CJK UNIFIED IDEOGRAPH + {0xE0AB, 0x5583}, //16746 #CJK UNIFIED IDEOGRAPH + {0xE0AC, 0x55B1}, //16747 #CJK UNIFIED IDEOGRAPH + {0xE0AD, 0x55B9}, //16748 #CJK UNIFIED IDEOGRAPH + {0xE0AE, 0x5588}, //16749 #CJK UNIFIED IDEOGRAPH + {0xE0AF, 0x5581}, //16750 #CJK UNIFIED IDEOGRAPH + {0xE0B0, 0x559F}, //16751 #CJK UNIFIED IDEOGRAPH + {0xE0B1, 0x557E}, //16752 #CJK UNIFIED IDEOGRAPH + {0xE0B2, 0x55D6}, //16753 #CJK UNIFIED IDEOGRAPH + {0xE0B3, 0x5591}, //16754 #CJK UNIFIED IDEOGRAPH + {0xE0B4, 0x557B}, //16755 #CJK UNIFIED IDEOGRAPH + {0xE0B5, 0x55DF}, //16756 #CJK UNIFIED IDEOGRAPH + {0xE0B6, 0x55BD}, //16757 #CJK UNIFIED IDEOGRAPH + {0xE0B7, 0x55BE}, //16758 #CJK UNIFIED IDEOGRAPH + {0xE0B8, 0x5594}, //16759 #CJK UNIFIED IDEOGRAPH + {0xE0B9, 0x5599}, //16760 #CJK UNIFIED IDEOGRAPH + {0xE0BA, 0x55EA}, //16761 #CJK UNIFIED IDEOGRAPH + {0xE0BB, 0x55F7}, //16762 #CJK UNIFIED IDEOGRAPH + {0xE0BC, 0x55C9}, //16763 #CJK UNIFIED IDEOGRAPH + {0xE0BD, 0x561F}, //16764 #CJK UNIFIED IDEOGRAPH + {0xE0BE, 0x55D1}, //16765 #CJK UNIFIED IDEOGRAPH + {0xE0BF, 0x55EB}, //16766 #CJK UNIFIED IDEOGRAPH + {0xE0C0, 0x55EC}, //16767 #CJK UNIFIED IDEOGRAPH + {0xE0C1, 0x55D4}, //16768 #CJK UNIFIED IDEOGRAPH + {0xE0C2, 0x55E6}, //16769 #CJK UNIFIED IDEOGRAPH + {0xE0C3, 0x55DD}, //16770 #CJK UNIFIED IDEOGRAPH + {0xE0C4, 0x55C4}, //16771 #CJK UNIFIED IDEOGRAPH + {0xE0C5, 0x55EF}, //16772 #CJK UNIFIED IDEOGRAPH + {0xE0C6, 0x55E5}, //16773 #CJK UNIFIED IDEOGRAPH + {0xE0C7, 0x55F2}, //16774 #CJK UNIFIED IDEOGRAPH + {0xE0C8, 0x55F3}, //16775 #CJK UNIFIED IDEOGRAPH + {0xE0C9, 0x55CC}, //16776 #CJK UNIFIED IDEOGRAPH + {0xE0CA, 0x55CD}, //16777 #CJK UNIFIED IDEOGRAPH + {0xE0CB, 0x55E8}, //16778 #CJK UNIFIED IDEOGRAPH + {0xE0CC, 0x55F5}, //16779 #CJK UNIFIED IDEOGRAPH + {0xE0CD, 0x55E4}, //16780 #CJK UNIFIED IDEOGRAPH + {0xE0CE, 0x8F94}, //16781 #CJK UNIFIED IDEOGRAPH + {0xE0CF, 0x561E}, //16782 #CJK UNIFIED IDEOGRAPH + {0xE0D0, 0x5608}, //16783 #CJK UNIFIED IDEOGRAPH + {0xE0D1, 0x560C}, //16784 #CJK UNIFIED IDEOGRAPH + {0xE0D2, 0x5601}, //16785 #CJK UNIFIED IDEOGRAPH + {0xE0D3, 0x5624}, //16786 #CJK UNIFIED IDEOGRAPH + {0xE0D4, 0x5623}, //16787 #CJK UNIFIED IDEOGRAPH + {0xE0D5, 0x55FE}, //16788 #CJK UNIFIED IDEOGRAPH + {0xE0D6, 0x5600}, //16789 #CJK UNIFIED IDEOGRAPH + {0xE0D7, 0x5627}, //16790 #CJK UNIFIED IDEOGRAPH + {0xE0D8, 0x562D}, //16791 #CJK UNIFIED IDEOGRAPH + {0xE0D9, 0x5658}, //16792 #CJK UNIFIED IDEOGRAPH + {0xE0DA, 0x5639}, //16793 #CJK UNIFIED IDEOGRAPH + {0xE0DB, 0x5657}, //16794 #CJK UNIFIED IDEOGRAPH + {0xE0DC, 0x562C}, //16795 #CJK UNIFIED IDEOGRAPH + {0xE0DD, 0x564D}, //16796 #CJK UNIFIED IDEOGRAPH + {0xE0DE, 0x5662}, //16797 #CJK UNIFIED IDEOGRAPH + {0xE0DF, 0x5659}, //16798 #CJK UNIFIED IDEOGRAPH + {0xE0E0, 0x565C}, //16799 #CJK UNIFIED IDEOGRAPH + {0xE0E1, 0x564C}, //16800 #CJK UNIFIED IDEOGRAPH + {0xE0E2, 0x5654}, //16801 #CJK UNIFIED IDEOGRAPH + {0xE0E3, 0x5686}, //16802 #CJK UNIFIED IDEOGRAPH + {0xE0E4, 0x5664}, //16803 #CJK UNIFIED IDEOGRAPH + {0xE0E5, 0x5671}, //16804 #CJK UNIFIED IDEOGRAPH + {0xE0E6, 0x566B}, //16805 #CJK UNIFIED IDEOGRAPH + {0xE0E7, 0x567B}, //16806 #CJK UNIFIED IDEOGRAPH + {0xE0E8, 0x567C}, //16807 #CJK UNIFIED IDEOGRAPH + {0xE0E9, 0x5685}, //16808 #CJK UNIFIED IDEOGRAPH + {0xE0EA, 0x5693}, //16809 #CJK UNIFIED IDEOGRAPH + {0xE0EB, 0x56AF}, //16810 #CJK UNIFIED IDEOGRAPH + {0xE0EC, 0x56D4}, //16811 #CJK UNIFIED IDEOGRAPH + {0xE0ED, 0x56D7}, //16812 #CJK UNIFIED IDEOGRAPH + {0xE0EE, 0x56DD}, //16813 #CJK UNIFIED IDEOGRAPH + {0xE0EF, 0x56E1}, //16814 #CJK UNIFIED IDEOGRAPH + {0xE0F0, 0x56F5}, //16815 #CJK UNIFIED IDEOGRAPH + {0xE0F1, 0x56EB}, //16816 #CJK UNIFIED IDEOGRAPH + {0xE0F2, 0x56F9}, //16817 #CJK UNIFIED IDEOGRAPH + {0xE0F3, 0x56FF}, //16818 #CJK UNIFIED IDEOGRAPH + {0xE0F4, 0x5704}, //16819 #CJK UNIFIED IDEOGRAPH + {0xE0F5, 0x570A}, //16820 #CJK UNIFIED IDEOGRAPH + {0xE0F6, 0x5709}, //16821 #CJK UNIFIED IDEOGRAPH + {0xE0F7, 0x571C}, //16822 #CJK UNIFIED IDEOGRAPH + {0xE0F8, 0x5E0F}, //16823 #CJK UNIFIED IDEOGRAPH + {0xE0F9, 0x5E19}, //16824 #CJK UNIFIED IDEOGRAPH + {0xE0FA, 0x5E14}, //16825 #CJK UNIFIED IDEOGRAPH + {0xE0FB, 0x5E11}, //16826 #CJK UNIFIED IDEOGRAPH + {0xE0FC, 0x5E31}, //16827 #CJK UNIFIED IDEOGRAPH + {0xE0FD, 0x5E3B}, //16828 #CJK UNIFIED IDEOGRAPH + {0xE0FE, 0x5E3C}, //16829 #CJK UNIFIED IDEOGRAPH + {0xE140, 0x9145}, //16830 #CJK UNIFIED IDEOGRAPH + {0xE141, 0x9147}, //16831 #CJK UNIFIED IDEOGRAPH + {0xE142, 0x9148}, //16832 #CJK UNIFIED IDEOGRAPH + {0xE143, 0x9151}, //16833 #CJK UNIFIED IDEOGRAPH + {0xE144, 0x9153}, //16834 #CJK UNIFIED IDEOGRAPH + {0xE145, 0x9154}, //16835 #CJK UNIFIED IDEOGRAPH + {0xE146, 0x9155}, //16836 #CJK UNIFIED IDEOGRAPH + {0xE147, 0x9156}, //16837 #CJK UNIFIED IDEOGRAPH + {0xE148, 0x9158}, //16838 #CJK UNIFIED IDEOGRAPH + {0xE149, 0x9159}, //16839 #CJK UNIFIED IDEOGRAPH + {0xE14A, 0x915B}, //16840 #CJK UNIFIED IDEOGRAPH + {0xE14B, 0x915C}, //16841 #CJK UNIFIED IDEOGRAPH + {0xE14C, 0x915F}, //16842 #CJK UNIFIED IDEOGRAPH + {0xE14D, 0x9160}, //16843 #CJK UNIFIED IDEOGRAPH + {0xE14E, 0x9166}, //16844 #CJK UNIFIED IDEOGRAPH + {0xE14F, 0x9167}, //16845 #CJK UNIFIED IDEOGRAPH + {0xE150, 0x9168}, //16846 #CJK UNIFIED IDEOGRAPH + {0xE151, 0x916B}, //16847 #CJK UNIFIED IDEOGRAPH + {0xE152, 0x916D}, //16848 #CJK UNIFIED IDEOGRAPH + {0xE153, 0x9173}, //16849 #CJK UNIFIED IDEOGRAPH + {0xE154, 0x917A}, //16850 #CJK UNIFIED IDEOGRAPH + {0xE155, 0x917B}, //16851 #CJK UNIFIED IDEOGRAPH + {0xE156, 0x917C}, //16852 #CJK UNIFIED IDEOGRAPH + {0xE157, 0x9180}, //16853 #CJK UNIFIED IDEOGRAPH + {0xE158, 0x9181}, //16854 #CJK UNIFIED IDEOGRAPH + {0xE159, 0x9182}, //16855 #CJK UNIFIED IDEOGRAPH + {0xE15A, 0x9183}, //16856 #CJK UNIFIED IDEOGRAPH + {0xE15B, 0x9184}, //16857 #CJK UNIFIED IDEOGRAPH + {0xE15C, 0x9186}, //16858 #CJK UNIFIED IDEOGRAPH + {0xE15D, 0x9188}, //16859 #CJK UNIFIED IDEOGRAPH + {0xE15E, 0x918A}, //16860 #CJK UNIFIED IDEOGRAPH + {0xE15F, 0x918E}, //16861 #CJK UNIFIED IDEOGRAPH + {0xE160, 0x918F}, //16862 #CJK UNIFIED IDEOGRAPH + {0xE161, 0x9193}, //16863 #CJK UNIFIED IDEOGRAPH + {0xE162, 0x9194}, //16864 #CJK UNIFIED IDEOGRAPH + {0xE163, 0x9195}, //16865 #CJK UNIFIED IDEOGRAPH + {0xE164, 0x9196}, //16866 #CJK UNIFIED IDEOGRAPH + {0xE165, 0x9197}, //16867 #CJK UNIFIED IDEOGRAPH + {0xE166, 0x9198}, //16868 #CJK UNIFIED IDEOGRAPH + {0xE167, 0x9199}, //16869 #CJK UNIFIED IDEOGRAPH + {0xE168, 0x919C}, //16870 #CJK UNIFIED IDEOGRAPH + {0xE169, 0x919D}, //16871 #CJK UNIFIED IDEOGRAPH + {0xE16A, 0x919E}, //16872 #CJK UNIFIED IDEOGRAPH + {0xE16B, 0x919F}, //16873 #CJK UNIFIED IDEOGRAPH + {0xE16C, 0x91A0}, //16874 #CJK UNIFIED IDEOGRAPH + {0xE16D, 0x91A1}, //16875 #CJK UNIFIED IDEOGRAPH + {0xE16E, 0x91A4}, //16876 #CJK UNIFIED IDEOGRAPH + {0xE16F, 0x91A5}, //16877 #CJK UNIFIED IDEOGRAPH + {0xE170, 0x91A6}, //16878 #CJK UNIFIED IDEOGRAPH + {0xE171, 0x91A7}, //16879 #CJK UNIFIED IDEOGRAPH + {0xE172, 0x91A8}, //16880 #CJK UNIFIED IDEOGRAPH + {0xE173, 0x91A9}, //16881 #CJK UNIFIED IDEOGRAPH + {0xE174, 0x91AB}, //16882 #CJK UNIFIED IDEOGRAPH + {0xE175, 0x91AC}, //16883 #CJK UNIFIED IDEOGRAPH + {0xE176, 0x91B0}, //16884 #CJK UNIFIED IDEOGRAPH + {0xE177, 0x91B1}, //16885 #CJK UNIFIED IDEOGRAPH + {0xE178, 0x91B2}, //16886 #CJK UNIFIED IDEOGRAPH + {0xE179, 0x91B3}, //16887 #CJK UNIFIED IDEOGRAPH + {0xE17A, 0x91B6}, //16888 #CJK UNIFIED IDEOGRAPH + {0xE17B, 0x91B7}, //16889 #CJK UNIFIED IDEOGRAPH + {0xE17C, 0x91B8}, //16890 #CJK UNIFIED IDEOGRAPH + {0xE17D, 0x91B9}, //16891 #CJK UNIFIED IDEOGRAPH + {0xE17E, 0x91BB}, //16892 #CJK UNIFIED IDEOGRAPH + {0xE180, 0x91BC}, //16893 #CJK UNIFIED IDEOGRAPH + {0xE181, 0x91BD}, //16894 #CJK UNIFIED IDEOGRAPH + {0xE182, 0x91BE}, //16895 #CJK UNIFIED IDEOGRAPH + {0xE183, 0x91BF}, //16896 #CJK UNIFIED IDEOGRAPH + {0xE184, 0x91C0}, //16897 #CJK UNIFIED IDEOGRAPH + {0xE185, 0x91C1}, //16898 #CJK UNIFIED IDEOGRAPH + {0xE186, 0x91C2}, //16899 #CJK UNIFIED IDEOGRAPH + {0xE187, 0x91C3}, //16900 #CJK UNIFIED IDEOGRAPH + {0xE188, 0x91C4}, //16901 #CJK UNIFIED IDEOGRAPH + {0xE189, 0x91C5}, //16902 #CJK UNIFIED IDEOGRAPH + {0xE18A, 0x91C6}, //16903 #CJK UNIFIED IDEOGRAPH + {0xE18B, 0x91C8}, //16904 #CJK UNIFIED IDEOGRAPH + {0xE18C, 0x91CB}, //16905 #CJK UNIFIED IDEOGRAPH + {0xE18D, 0x91D0}, //16906 #CJK UNIFIED IDEOGRAPH + {0xE18E, 0x91D2}, //16907 #CJK UNIFIED IDEOGRAPH + {0xE18F, 0x91D3}, //16908 #CJK UNIFIED IDEOGRAPH + {0xE190, 0x91D4}, //16909 #CJK UNIFIED IDEOGRAPH + {0xE191, 0x91D5}, //16910 #CJK UNIFIED IDEOGRAPH + {0xE192, 0x91D6}, //16911 #CJK UNIFIED IDEOGRAPH + {0xE193, 0x91D7}, //16912 #CJK UNIFIED IDEOGRAPH + {0xE194, 0x91D8}, //16913 #CJK UNIFIED IDEOGRAPH + {0xE195, 0x91D9}, //16914 #CJK UNIFIED IDEOGRAPH + {0xE196, 0x91DA}, //16915 #CJK UNIFIED IDEOGRAPH + {0xE197, 0x91DB}, //16916 #CJK UNIFIED IDEOGRAPH + {0xE198, 0x91DD}, //16917 #CJK UNIFIED IDEOGRAPH + {0xE199, 0x91DE}, //16918 #CJK UNIFIED IDEOGRAPH + {0xE19A, 0x91DF}, //16919 #CJK UNIFIED IDEOGRAPH + {0xE19B, 0x91E0}, //16920 #CJK UNIFIED IDEOGRAPH + {0xE19C, 0x91E1}, //16921 #CJK UNIFIED IDEOGRAPH + {0xE19D, 0x91E2}, //16922 #CJK UNIFIED IDEOGRAPH + {0xE19E, 0x91E3}, //16923 #CJK UNIFIED IDEOGRAPH + {0xE19F, 0x91E4}, //16924 #CJK UNIFIED IDEOGRAPH + {0xE1A0, 0x91E5}, //16925 #CJK UNIFIED IDEOGRAPH + {0xE1A1, 0x5E37}, //16926 #CJK UNIFIED IDEOGRAPH + {0xE1A2, 0x5E44}, //16927 #CJK UNIFIED IDEOGRAPH + {0xE1A3, 0x5E54}, //16928 #CJK UNIFIED IDEOGRAPH + {0xE1A4, 0x5E5B}, //16929 #CJK UNIFIED IDEOGRAPH + {0xE1A5, 0x5E5E}, //16930 #CJK UNIFIED IDEOGRAPH + {0xE1A6, 0x5E61}, //16931 #CJK UNIFIED IDEOGRAPH + {0xE1A7, 0x5C8C}, //16932 #CJK UNIFIED IDEOGRAPH + {0xE1A8, 0x5C7A}, //16933 #CJK UNIFIED IDEOGRAPH + {0xE1A9, 0x5C8D}, //16934 #CJK UNIFIED IDEOGRAPH + {0xE1AA, 0x5C90}, //16935 #CJK UNIFIED IDEOGRAPH + {0xE1AB, 0x5C96}, //16936 #CJK UNIFIED IDEOGRAPH + {0xE1AC, 0x5C88}, //16937 #CJK UNIFIED IDEOGRAPH + {0xE1AD, 0x5C98}, //16938 #CJK UNIFIED IDEOGRAPH + {0xE1AE, 0x5C99}, //16939 #CJK UNIFIED IDEOGRAPH + {0xE1AF, 0x5C91}, //16940 #CJK UNIFIED IDEOGRAPH + {0xE1B0, 0x5C9A}, //16941 #CJK UNIFIED IDEOGRAPH + {0xE1B1, 0x5C9C}, //16942 #CJK UNIFIED IDEOGRAPH + {0xE1B2, 0x5CB5}, //16943 #CJK UNIFIED IDEOGRAPH + {0xE1B3, 0x5CA2}, //16944 #CJK UNIFIED IDEOGRAPH + {0xE1B4, 0x5CBD}, //16945 #CJK UNIFIED IDEOGRAPH + {0xE1B5, 0x5CAC}, //16946 #CJK UNIFIED IDEOGRAPH + {0xE1B6, 0x5CAB}, //16947 #CJK UNIFIED IDEOGRAPH + {0xE1B7, 0x5CB1}, //16948 #CJK UNIFIED IDEOGRAPH + {0xE1B8, 0x5CA3}, //16949 #CJK UNIFIED IDEOGRAPH + {0xE1B9, 0x5CC1}, //16950 #CJK UNIFIED IDEOGRAPH + {0xE1BA, 0x5CB7}, //16951 #CJK UNIFIED IDEOGRAPH + {0xE1BB, 0x5CC4}, //16952 #CJK UNIFIED IDEOGRAPH + {0xE1BC, 0x5CD2}, //16953 #CJK UNIFIED IDEOGRAPH + {0xE1BD, 0x5CE4}, //16954 #CJK UNIFIED IDEOGRAPH + {0xE1BE, 0x5CCB}, //16955 #CJK UNIFIED IDEOGRAPH + {0xE1BF, 0x5CE5}, //16956 #CJK UNIFIED IDEOGRAPH + {0xE1C0, 0x5D02}, //16957 #CJK UNIFIED IDEOGRAPH + {0xE1C1, 0x5D03}, //16958 #CJK UNIFIED IDEOGRAPH + {0xE1C2, 0x5D27}, //16959 #CJK UNIFIED IDEOGRAPH + {0xE1C3, 0x5D26}, //16960 #CJK UNIFIED IDEOGRAPH + {0xE1C4, 0x5D2E}, //16961 #CJK UNIFIED IDEOGRAPH + {0xE1C5, 0x5D24}, //16962 #CJK UNIFIED IDEOGRAPH + {0xE1C6, 0x5D1E}, //16963 #CJK UNIFIED IDEOGRAPH + {0xE1C7, 0x5D06}, //16964 #CJK UNIFIED IDEOGRAPH + {0xE1C8, 0x5D1B}, //16965 #CJK UNIFIED IDEOGRAPH + {0xE1C9, 0x5D58}, //16966 #CJK UNIFIED IDEOGRAPH + {0xE1CA, 0x5D3E}, //16967 #CJK UNIFIED IDEOGRAPH + {0xE1CB, 0x5D34}, //16968 #CJK UNIFIED IDEOGRAPH + {0xE1CC, 0x5D3D}, //16969 #CJK UNIFIED IDEOGRAPH + {0xE1CD, 0x5D6C}, //16970 #CJK UNIFIED IDEOGRAPH + {0xE1CE, 0x5D5B}, //16971 #CJK UNIFIED IDEOGRAPH + {0xE1CF, 0x5D6F}, //16972 #CJK UNIFIED IDEOGRAPH + {0xE1D0, 0x5D5D}, //16973 #CJK UNIFIED IDEOGRAPH + {0xE1D1, 0x5D6B}, //16974 #CJK UNIFIED IDEOGRAPH + {0xE1D2, 0x5D4B}, //16975 #CJK UNIFIED IDEOGRAPH + {0xE1D3, 0x5D4A}, //16976 #CJK UNIFIED IDEOGRAPH + {0xE1D4, 0x5D69}, //16977 #CJK UNIFIED IDEOGRAPH + {0xE1D5, 0x5D74}, //16978 #CJK UNIFIED IDEOGRAPH + {0xE1D6, 0x5D82}, //16979 #CJK UNIFIED IDEOGRAPH + {0xE1D7, 0x5D99}, //16980 #CJK UNIFIED IDEOGRAPH + {0xE1D8, 0x5D9D}, //16981 #CJK UNIFIED IDEOGRAPH + {0xE1D9, 0x8C73}, //16982 #CJK UNIFIED IDEOGRAPH + {0xE1DA, 0x5DB7}, //16983 #CJK UNIFIED IDEOGRAPH + {0xE1DB, 0x5DC5}, //16984 #CJK UNIFIED IDEOGRAPH + {0xE1DC, 0x5F73}, //16985 #CJK UNIFIED IDEOGRAPH + {0xE1DD, 0x5F77}, //16986 #CJK UNIFIED IDEOGRAPH + {0xE1DE, 0x5F82}, //16987 #CJK UNIFIED IDEOGRAPH + {0xE1DF, 0x5F87}, //16988 #CJK UNIFIED IDEOGRAPH + {0xE1E0, 0x5F89}, //16989 #CJK UNIFIED IDEOGRAPH + {0xE1E1, 0x5F8C}, //16990 #CJK UNIFIED IDEOGRAPH + {0xE1E2, 0x5F95}, //16991 #CJK UNIFIED IDEOGRAPH + {0xE1E3, 0x5F99}, //16992 #CJK UNIFIED IDEOGRAPH + {0xE1E4, 0x5F9C}, //16993 #CJK UNIFIED IDEOGRAPH + {0xE1E5, 0x5FA8}, //16994 #CJK UNIFIED IDEOGRAPH + {0xE1E6, 0x5FAD}, //16995 #CJK UNIFIED IDEOGRAPH + {0xE1E7, 0x5FB5}, //16996 #CJK UNIFIED IDEOGRAPH + {0xE1E8, 0x5FBC}, //16997 #CJK UNIFIED IDEOGRAPH + {0xE1E9, 0x8862}, //16998 #CJK UNIFIED IDEOGRAPH + {0xE1EA, 0x5F61}, //16999 #CJK UNIFIED IDEOGRAPH + {0xE1EB, 0x72AD}, //17000 #CJK UNIFIED IDEOGRAPH + {0xE1EC, 0x72B0}, //17001 #CJK UNIFIED IDEOGRAPH + {0xE1ED, 0x72B4}, //17002 #CJK UNIFIED IDEOGRAPH + {0xE1EE, 0x72B7}, //17003 #CJK UNIFIED IDEOGRAPH + {0xE1EF, 0x72B8}, //17004 #CJK UNIFIED IDEOGRAPH + {0xE1F0, 0x72C3}, //17005 #CJK UNIFIED IDEOGRAPH + {0xE1F1, 0x72C1}, //17006 #CJK UNIFIED IDEOGRAPH + {0xE1F2, 0x72CE}, //17007 #CJK UNIFIED IDEOGRAPH + {0xE1F3, 0x72CD}, //17008 #CJK UNIFIED IDEOGRAPH + {0xE1F4, 0x72D2}, //17009 #CJK UNIFIED IDEOGRAPH + {0xE1F5, 0x72E8}, //17010 #CJK UNIFIED IDEOGRAPH + {0xE1F6, 0x72EF}, //17011 #CJK UNIFIED IDEOGRAPH + {0xE1F7, 0x72E9}, //17012 #CJK UNIFIED IDEOGRAPH + {0xE1F8, 0x72F2}, //17013 #CJK UNIFIED IDEOGRAPH + {0xE1F9, 0x72F4}, //17014 #CJK UNIFIED IDEOGRAPH + {0xE1FA, 0x72F7}, //17015 #CJK UNIFIED IDEOGRAPH + {0xE1FB, 0x7301}, //17016 #CJK UNIFIED IDEOGRAPH + {0xE1FC, 0x72F3}, //17017 #CJK UNIFIED IDEOGRAPH + {0xE1FD, 0x7303}, //17018 #CJK UNIFIED IDEOGRAPH + {0xE1FE, 0x72FA}, //17019 #CJK UNIFIED IDEOGRAPH + {0xE240, 0x91E6}, //17020 #CJK UNIFIED IDEOGRAPH + {0xE241, 0x91E7}, //17021 #CJK UNIFIED IDEOGRAPH + {0xE242, 0x91E8}, //17022 #CJK UNIFIED IDEOGRAPH + {0xE243, 0x91E9}, //17023 #CJK UNIFIED IDEOGRAPH + {0xE244, 0x91EA}, //17024 #CJK UNIFIED IDEOGRAPH + {0xE245, 0x91EB}, //17025 #CJK UNIFIED IDEOGRAPH + {0xE246, 0x91EC}, //17026 #CJK UNIFIED IDEOGRAPH + {0xE247, 0x91ED}, //17027 #CJK UNIFIED IDEOGRAPH + {0xE248, 0x91EE}, //17028 #CJK UNIFIED IDEOGRAPH + {0xE249, 0x91EF}, //17029 #CJK UNIFIED IDEOGRAPH + {0xE24A, 0x91F0}, //17030 #CJK UNIFIED IDEOGRAPH + {0xE24B, 0x91F1}, //17031 #CJK UNIFIED IDEOGRAPH + {0xE24C, 0x91F2}, //17032 #CJK UNIFIED IDEOGRAPH + {0xE24D, 0x91F3}, //17033 #CJK UNIFIED IDEOGRAPH + {0xE24E, 0x91F4}, //17034 #CJK UNIFIED IDEOGRAPH + {0xE24F, 0x91F5}, //17035 #CJK UNIFIED IDEOGRAPH + {0xE250, 0x91F6}, //17036 #CJK UNIFIED IDEOGRAPH + {0xE251, 0x91F7}, //17037 #CJK UNIFIED IDEOGRAPH + {0xE252, 0x91F8}, //17038 #CJK UNIFIED IDEOGRAPH + {0xE253, 0x91F9}, //17039 #CJK UNIFIED IDEOGRAPH + {0xE254, 0x91FA}, //17040 #CJK UNIFIED IDEOGRAPH + {0xE255, 0x91FB}, //17041 #CJK UNIFIED IDEOGRAPH + {0xE256, 0x91FC}, //17042 #CJK UNIFIED IDEOGRAPH + {0xE257, 0x91FD}, //17043 #CJK UNIFIED IDEOGRAPH + {0xE258, 0x91FE}, //17044 #CJK UNIFIED IDEOGRAPH + {0xE259, 0x91FF}, //17045 #CJK UNIFIED IDEOGRAPH + {0xE25A, 0x9200}, //17046 #CJK UNIFIED IDEOGRAPH + {0xE25B, 0x9201}, //17047 #CJK UNIFIED IDEOGRAPH + {0xE25C, 0x9202}, //17048 #CJK UNIFIED IDEOGRAPH + {0xE25D, 0x9203}, //17049 #CJK UNIFIED IDEOGRAPH + {0xE25E, 0x9204}, //17050 #CJK UNIFIED IDEOGRAPH + {0xE25F, 0x9205}, //17051 #CJK UNIFIED IDEOGRAPH + {0xE260, 0x9206}, //17052 #CJK UNIFIED IDEOGRAPH + {0xE261, 0x9207}, //17053 #CJK UNIFIED IDEOGRAPH + {0xE262, 0x9208}, //17054 #CJK UNIFIED IDEOGRAPH + {0xE263, 0x9209}, //17055 #CJK UNIFIED IDEOGRAPH + {0xE264, 0x920A}, //17056 #CJK UNIFIED IDEOGRAPH + {0xE265, 0x920B}, //17057 #CJK UNIFIED IDEOGRAPH + {0xE266, 0x920C}, //17058 #CJK UNIFIED IDEOGRAPH + {0xE267, 0x920D}, //17059 #CJK UNIFIED IDEOGRAPH + {0xE268, 0x920E}, //17060 #CJK UNIFIED IDEOGRAPH + {0xE269, 0x920F}, //17061 #CJK UNIFIED IDEOGRAPH + {0xE26A, 0x9210}, //17062 #CJK UNIFIED IDEOGRAPH + {0xE26B, 0x9211}, //17063 #CJK UNIFIED IDEOGRAPH + {0xE26C, 0x9212}, //17064 #CJK UNIFIED IDEOGRAPH + {0xE26D, 0x9213}, //17065 #CJK UNIFIED IDEOGRAPH + {0xE26E, 0x9214}, //17066 #CJK UNIFIED IDEOGRAPH + {0xE26F, 0x9215}, //17067 #CJK UNIFIED IDEOGRAPH + {0xE270, 0x9216}, //17068 #CJK UNIFIED IDEOGRAPH + {0xE271, 0x9217}, //17069 #CJK UNIFIED IDEOGRAPH + {0xE272, 0x9218}, //17070 #CJK UNIFIED IDEOGRAPH + {0xE273, 0x9219}, //17071 #CJK UNIFIED IDEOGRAPH + {0xE274, 0x921A}, //17072 #CJK UNIFIED IDEOGRAPH + {0xE275, 0x921B}, //17073 #CJK UNIFIED IDEOGRAPH + {0xE276, 0x921C}, //17074 #CJK UNIFIED IDEOGRAPH + {0xE277, 0x921D}, //17075 #CJK UNIFIED IDEOGRAPH + {0xE278, 0x921E}, //17076 #CJK UNIFIED IDEOGRAPH + {0xE279, 0x921F}, //17077 #CJK UNIFIED IDEOGRAPH + {0xE27A, 0x9220}, //17078 #CJK UNIFIED IDEOGRAPH + {0xE27B, 0x9221}, //17079 #CJK UNIFIED IDEOGRAPH + {0xE27C, 0x9222}, //17080 #CJK UNIFIED IDEOGRAPH + {0xE27D, 0x9223}, //17081 #CJK UNIFIED IDEOGRAPH + {0xE27E, 0x9224}, //17082 #CJK UNIFIED IDEOGRAPH + {0xE280, 0x9225}, //17083 #CJK UNIFIED IDEOGRAPH + {0xE281, 0x9226}, //17084 #CJK UNIFIED IDEOGRAPH + {0xE282, 0x9227}, //17085 #CJK UNIFIED IDEOGRAPH + {0xE283, 0x9228}, //17086 #CJK UNIFIED IDEOGRAPH + {0xE284, 0x9229}, //17087 #CJK UNIFIED IDEOGRAPH + {0xE285, 0x922A}, //17088 #CJK UNIFIED IDEOGRAPH + {0xE286, 0x922B}, //17089 #CJK UNIFIED IDEOGRAPH + {0xE287, 0x922C}, //17090 #CJK UNIFIED IDEOGRAPH + {0xE288, 0x922D}, //17091 #CJK UNIFIED IDEOGRAPH + {0xE289, 0x922E}, //17092 #CJK UNIFIED IDEOGRAPH + {0xE28A, 0x922F}, //17093 #CJK UNIFIED IDEOGRAPH + {0xE28B, 0x9230}, //17094 #CJK UNIFIED IDEOGRAPH + {0xE28C, 0x9231}, //17095 #CJK UNIFIED IDEOGRAPH + {0xE28D, 0x9232}, //17096 #CJK UNIFIED IDEOGRAPH + {0xE28E, 0x9233}, //17097 #CJK UNIFIED IDEOGRAPH + {0xE28F, 0x9234}, //17098 #CJK UNIFIED IDEOGRAPH + {0xE290, 0x9235}, //17099 #CJK UNIFIED IDEOGRAPH + {0xE291, 0x9236}, //17100 #CJK UNIFIED IDEOGRAPH + {0xE292, 0x9237}, //17101 #CJK UNIFIED IDEOGRAPH + {0xE293, 0x9238}, //17102 #CJK UNIFIED IDEOGRAPH + {0xE294, 0x9239}, //17103 #CJK UNIFIED IDEOGRAPH + {0xE295, 0x923A}, //17104 #CJK UNIFIED IDEOGRAPH + {0xE296, 0x923B}, //17105 #CJK UNIFIED IDEOGRAPH + {0xE297, 0x923C}, //17106 #CJK UNIFIED IDEOGRAPH + {0xE298, 0x923D}, //17107 #CJK UNIFIED IDEOGRAPH + {0xE299, 0x923E}, //17108 #CJK UNIFIED IDEOGRAPH + {0xE29A, 0x923F}, //17109 #CJK UNIFIED IDEOGRAPH + {0xE29B, 0x9240}, //17110 #CJK UNIFIED IDEOGRAPH + {0xE29C, 0x9241}, //17111 #CJK UNIFIED IDEOGRAPH + {0xE29D, 0x9242}, //17112 #CJK UNIFIED IDEOGRAPH + {0xE29E, 0x9243}, //17113 #CJK UNIFIED IDEOGRAPH + {0xE29F, 0x9244}, //17114 #CJK UNIFIED IDEOGRAPH + {0xE2A0, 0x9245}, //17115 #CJK UNIFIED IDEOGRAPH + {0xE2A1, 0x72FB}, //17116 #CJK UNIFIED IDEOGRAPH + {0xE2A2, 0x7317}, //17117 #CJK UNIFIED IDEOGRAPH + {0xE2A3, 0x7313}, //17118 #CJK UNIFIED IDEOGRAPH + {0xE2A4, 0x7321}, //17119 #CJK UNIFIED IDEOGRAPH + {0xE2A5, 0x730A}, //17120 #CJK UNIFIED IDEOGRAPH + {0xE2A6, 0x731E}, //17121 #CJK UNIFIED IDEOGRAPH + {0xE2A7, 0x731D}, //17122 #CJK UNIFIED IDEOGRAPH + {0xE2A8, 0x7315}, //17123 #CJK UNIFIED IDEOGRAPH + {0xE2A9, 0x7322}, //17124 #CJK UNIFIED IDEOGRAPH + {0xE2AA, 0x7339}, //17125 #CJK UNIFIED IDEOGRAPH + {0xE2AB, 0x7325}, //17126 #CJK UNIFIED IDEOGRAPH + {0xE2AC, 0x732C}, //17127 #CJK UNIFIED IDEOGRAPH + {0xE2AD, 0x7338}, //17128 #CJK UNIFIED IDEOGRAPH + {0xE2AE, 0x7331}, //17129 #CJK UNIFIED IDEOGRAPH + {0xE2AF, 0x7350}, //17130 #CJK UNIFIED IDEOGRAPH + {0xE2B0, 0x734D}, //17131 #CJK UNIFIED IDEOGRAPH + {0xE2B1, 0x7357}, //17132 #CJK UNIFIED IDEOGRAPH + {0xE2B2, 0x7360}, //17133 #CJK UNIFIED IDEOGRAPH + {0xE2B3, 0x736C}, //17134 #CJK UNIFIED IDEOGRAPH + {0xE2B4, 0x736F}, //17135 #CJK UNIFIED IDEOGRAPH + {0xE2B5, 0x737E}, //17136 #CJK UNIFIED IDEOGRAPH + {0xE2B6, 0x821B}, //17137 #CJK UNIFIED IDEOGRAPH + {0xE2B7, 0x5925}, //17138 #CJK UNIFIED IDEOGRAPH + {0xE2B8, 0x98E7}, //17139 #CJK UNIFIED IDEOGRAPH + {0xE2B9, 0x5924}, //17140 #CJK UNIFIED IDEOGRAPH + {0xE2BA, 0x5902}, //17141 #CJK UNIFIED IDEOGRAPH + {0xE2BB, 0x9963}, //17142 #CJK UNIFIED IDEOGRAPH + {0xE2BC, 0x9967}, //17143 #CJK UNIFIED IDEOGRAPH + {0xE2BD, 0x9968}, //17144 #CJK UNIFIED IDEOGRAPH + {0xE2BE, 0x9969}, //17145 #CJK UNIFIED IDEOGRAPH + {0xE2BF, 0x996A}, //17146 #CJK UNIFIED IDEOGRAPH + {0xE2C0, 0x996B}, //17147 #CJK UNIFIED IDEOGRAPH + {0xE2C1, 0x996C}, //17148 #CJK UNIFIED IDEOGRAPH + {0xE2C2, 0x9974}, //17149 #CJK UNIFIED IDEOGRAPH + {0xE2C3, 0x9977}, //17150 #CJK UNIFIED IDEOGRAPH + {0xE2C4, 0x997D}, //17151 #CJK UNIFIED IDEOGRAPH + {0xE2C5, 0x9980}, //17152 #CJK UNIFIED IDEOGRAPH + {0xE2C6, 0x9984}, //17153 #CJK UNIFIED IDEOGRAPH + {0xE2C7, 0x9987}, //17154 #CJK UNIFIED IDEOGRAPH + {0xE2C8, 0x998A}, //17155 #CJK UNIFIED IDEOGRAPH + {0xE2C9, 0x998D}, //17156 #CJK UNIFIED IDEOGRAPH + {0xE2CA, 0x9990}, //17157 #CJK UNIFIED IDEOGRAPH + {0xE2CB, 0x9991}, //17158 #CJK UNIFIED IDEOGRAPH + {0xE2CC, 0x9993}, //17159 #CJK UNIFIED IDEOGRAPH + {0xE2CD, 0x9994}, //17160 #CJK UNIFIED IDEOGRAPH + {0xE2CE, 0x9995}, //17161 #CJK UNIFIED IDEOGRAPH + {0xE2CF, 0x5E80}, //17162 #CJK UNIFIED IDEOGRAPH + {0xE2D0, 0x5E91}, //17163 #CJK UNIFIED IDEOGRAPH + {0xE2D1, 0x5E8B}, //17164 #CJK UNIFIED IDEOGRAPH + {0xE2D2, 0x5E96}, //17165 #CJK UNIFIED IDEOGRAPH + {0xE2D3, 0x5EA5}, //17166 #CJK UNIFIED IDEOGRAPH + {0xE2D4, 0x5EA0}, //17167 #CJK UNIFIED IDEOGRAPH + {0xE2D5, 0x5EB9}, //17168 #CJK UNIFIED IDEOGRAPH + {0xE2D6, 0x5EB5}, //17169 #CJK UNIFIED IDEOGRAPH + {0xE2D7, 0x5EBE}, //17170 #CJK UNIFIED IDEOGRAPH + {0xE2D8, 0x5EB3}, //17171 #CJK UNIFIED IDEOGRAPH + {0xE2D9, 0x8D53}, //17172 #CJK UNIFIED IDEOGRAPH + {0xE2DA, 0x5ED2}, //17173 #CJK UNIFIED IDEOGRAPH + {0xE2DB, 0x5ED1}, //17174 #CJK UNIFIED IDEOGRAPH + {0xE2DC, 0x5EDB}, //17175 #CJK UNIFIED IDEOGRAPH + {0xE2DD, 0x5EE8}, //17176 #CJK UNIFIED IDEOGRAPH + {0xE2DE, 0x5EEA}, //17177 #CJK UNIFIED IDEOGRAPH + {0xE2DF, 0x81BA}, //17178 #CJK UNIFIED IDEOGRAPH + {0xE2E0, 0x5FC4}, //17179 #CJK UNIFIED IDEOGRAPH + {0xE2E1, 0x5FC9}, //17180 #CJK UNIFIED IDEOGRAPH + {0xE2E2, 0x5FD6}, //17181 #CJK UNIFIED IDEOGRAPH + {0xE2E3, 0x5FCF}, //17182 #CJK UNIFIED IDEOGRAPH + {0xE2E4, 0x6003}, //17183 #CJK UNIFIED IDEOGRAPH + {0xE2E5, 0x5FEE}, //17184 #CJK UNIFIED IDEOGRAPH + {0xE2E6, 0x6004}, //17185 #CJK UNIFIED IDEOGRAPH + {0xE2E7, 0x5FE1}, //17186 #CJK UNIFIED IDEOGRAPH + {0xE2E8, 0x5FE4}, //17187 #CJK UNIFIED IDEOGRAPH + {0xE2E9, 0x5FFE}, //17188 #CJK UNIFIED IDEOGRAPH + {0xE2EA, 0x6005}, //17189 #CJK UNIFIED IDEOGRAPH + {0xE2EB, 0x6006}, //17190 #CJK UNIFIED IDEOGRAPH + {0xE2EC, 0x5FEA}, //17191 #CJK UNIFIED IDEOGRAPH + {0xE2ED, 0x5FED}, //17192 #CJK UNIFIED IDEOGRAPH + {0xE2EE, 0x5FF8}, //17193 #CJK UNIFIED IDEOGRAPH + {0xE2EF, 0x6019}, //17194 #CJK UNIFIED IDEOGRAPH + {0xE2F0, 0x6035}, //17195 #CJK UNIFIED IDEOGRAPH + {0xE2F1, 0x6026}, //17196 #CJK UNIFIED IDEOGRAPH + {0xE2F2, 0x601B}, //17197 #CJK UNIFIED IDEOGRAPH + {0xE2F3, 0x600F}, //17198 #CJK UNIFIED IDEOGRAPH + {0xE2F4, 0x600D}, //17199 #CJK UNIFIED IDEOGRAPH + {0xE2F5, 0x6029}, //17200 #CJK UNIFIED IDEOGRAPH + {0xE2F6, 0x602B}, //17201 #CJK UNIFIED IDEOGRAPH + {0xE2F7, 0x600A}, //17202 #CJK UNIFIED IDEOGRAPH + {0xE2F8, 0x603F}, //17203 #CJK UNIFIED IDEOGRAPH + {0xE2F9, 0x6021}, //17204 #CJK UNIFIED IDEOGRAPH + {0xE2FA, 0x6078}, //17205 #CJK UNIFIED IDEOGRAPH + {0xE2FB, 0x6079}, //17206 #CJK UNIFIED IDEOGRAPH + {0xE2FC, 0x607B}, //17207 #CJK UNIFIED IDEOGRAPH + {0xE2FD, 0x607A}, //17208 #CJK UNIFIED IDEOGRAPH + {0xE2FE, 0x6042}, //17209 #CJK UNIFIED IDEOGRAPH + {0xE340, 0x9246}, //17210 #CJK UNIFIED IDEOGRAPH + {0xE341, 0x9247}, //17211 #CJK UNIFIED IDEOGRAPH + {0xE342, 0x9248}, //17212 #CJK UNIFIED IDEOGRAPH + {0xE343, 0x9249}, //17213 #CJK UNIFIED IDEOGRAPH + {0xE344, 0x924A}, //17214 #CJK UNIFIED IDEOGRAPH + {0xE345, 0x924B}, //17215 #CJK UNIFIED IDEOGRAPH + {0xE346, 0x924C}, //17216 #CJK UNIFIED IDEOGRAPH + {0xE347, 0x924D}, //17217 #CJK UNIFIED IDEOGRAPH + {0xE348, 0x924E}, //17218 #CJK UNIFIED IDEOGRAPH + {0xE349, 0x924F}, //17219 #CJK UNIFIED IDEOGRAPH + {0xE34A, 0x9250}, //17220 #CJK UNIFIED IDEOGRAPH + {0xE34B, 0x9251}, //17221 #CJK UNIFIED IDEOGRAPH + {0xE34C, 0x9252}, //17222 #CJK UNIFIED IDEOGRAPH + {0xE34D, 0x9253}, //17223 #CJK UNIFIED IDEOGRAPH + {0xE34E, 0x9254}, //17224 #CJK UNIFIED IDEOGRAPH + {0xE34F, 0x9255}, //17225 #CJK UNIFIED IDEOGRAPH + {0xE350, 0x9256}, //17226 #CJK UNIFIED IDEOGRAPH + {0xE351, 0x9257}, //17227 #CJK UNIFIED IDEOGRAPH + {0xE352, 0x9258}, //17228 #CJK UNIFIED IDEOGRAPH + {0xE353, 0x9259}, //17229 #CJK UNIFIED IDEOGRAPH + {0xE354, 0x925A}, //17230 #CJK UNIFIED IDEOGRAPH + {0xE355, 0x925B}, //17231 #CJK UNIFIED IDEOGRAPH + {0xE356, 0x925C}, //17232 #CJK UNIFIED IDEOGRAPH + {0xE357, 0x925D}, //17233 #CJK UNIFIED IDEOGRAPH + {0xE358, 0x925E}, //17234 #CJK UNIFIED IDEOGRAPH + {0xE359, 0x925F}, //17235 #CJK UNIFIED IDEOGRAPH + {0xE35A, 0x9260}, //17236 #CJK UNIFIED IDEOGRAPH + {0xE35B, 0x9261}, //17237 #CJK UNIFIED IDEOGRAPH + {0xE35C, 0x9262}, //17238 #CJK UNIFIED IDEOGRAPH + {0xE35D, 0x9263}, //17239 #CJK UNIFIED IDEOGRAPH + {0xE35E, 0x9264}, //17240 #CJK UNIFIED IDEOGRAPH + {0xE35F, 0x9265}, //17241 #CJK UNIFIED IDEOGRAPH + {0xE360, 0x9266}, //17242 #CJK UNIFIED IDEOGRAPH + {0xE361, 0x9267}, //17243 #CJK UNIFIED IDEOGRAPH + {0xE362, 0x9268}, //17244 #CJK UNIFIED IDEOGRAPH + {0xE363, 0x9269}, //17245 #CJK UNIFIED IDEOGRAPH + {0xE364, 0x926A}, //17246 #CJK UNIFIED IDEOGRAPH + {0xE365, 0x926B}, //17247 #CJK UNIFIED IDEOGRAPH + {0xE366, 0x926C}, //17248 #CJK UNIFIED IDEOGRAPH + {0xE367, 0x926D}, //17249 #CJK UNIFIED IDEOGRAPH + {0xE368, 0x926E}, //17250 #CJK UNIFIED IDEOGRAPH + {0xE369, 0x926F}, //17251 #CJK UNIFIED IDEOGRAPH + {0xE36A, 0x9270}, //17252 #CJK UNIFIED IDEOGRAPH + {0xE36B, 0x9271}, //17253 #CJK UNIFIED IDEOGRAPH + {0xE36C, 0x9272}, //17254 #CJK UNIFIED IDEOGRAPH + {0xE36D, 0x9273}, //17255 #CJK UNIFIED IDEOGRAPH + {0xE36E, 0x9275}, //17256 #CJK UNIFIED IDEOGRAPH + {0xE36F, 0x9276}, //17257 #CJK UNIFIED IDEOGRAPH + {0xE370, 0x9277}, //17258 #CJK UNIFIED IDEOGRAPH + {0xE371, 0x9278}, //17259 #CJK UNIFIED IDEOGRAPH + {0xE372, 0x9279}, //17260 #CJK UNIFIED IDEOGRAPH + {0xE373, 0x927A}, //17261 #CJK UNIFIED IDEOGRAPH + {0xE374, 0x927B}, //17262 #CJK UNIFIED IDEOGRAPH + {0xE375, 0x927C}, //17263 #CJK UNIFIED IDEOGRAPH + {0xE376, 0x927D}, //17264 #CJK UNIFIED IDEOGRAPH + {0xE377, 0x927E}, //17265 #CJK UNIFIED IDEOGRAPH + {0xE378, 0x927F}, //17266 #CJK UNIFIED IDEOGRAPH + {0xE379, 0x9280}, //17267 #CJK UNIFIED IDEOGRAPH + {0xE37A, 0x9281}, //17268 #CJK UNIFIED IDEOGRAPH + {0xE37B, 0x9282}, //17269 #CJK UNIFIED IDEOGRAPH + {0xE37C, 0x9283}, //17270 #CJK UNIFIED IDEOGRAPH + {0xE37D, 0x9284}, //17271 #CJK UNIFIED IDEOGRAPH + {0xE37E, 0x9285}, //17272 #CJK UNIFIED IDEOGRAPH + {0xE380, 0x9286}, //17273 #CJK UNIFIED IDEOGRAPH + {0xE381, 0x9287}, //17274 #CJK UNIFIED IDEOGRAPH + {0xE382, 0x9288}, //17275 #CJK UNIFIED IDEOGRAPH + {0xE383, 0x9289}, //17276 #CJK UNIFIED IDEOGRAPH + {0xE384, 0x928A}, //17277 #CJK UNIFIED IDEOGRAPH + {0xE385, 0x928B}, //17278 #CJK UNIFIED IDEOGRAPH + {0xE386, 0x928C}, //17279 #CJK UNIFIED IDEOGRAPH + {0xE387, 0x928D}, //17280 #CJK UNIFIED IDEOGRAPH + {0xE388, 0x928F}, //17281 #CJK UNIFIED IDEOGRAPH + {0xE389, 0x9290}, //17282 #CJK UNIFIED IDEOGRAPH + {0xE38A, 0x9291}, //17283 #CJK UNIFIED IDEOGRAPH + {0xE38B, 0x9292}, //17284 #CJK UNIFIED IDEOGRAPH + {0xE38C, 0x9293}, //17285 #CJK UNIFIED IDEOGRAPH + {0xE38D, 0x9294}, //17286 #CJK UNIFIED IDEOGRAPH + {0xE38E, 0x9295}, //17287 #CJK UNIFIED IDEOGRAPH + {0xE38F, 0x9296}, //17288 #CJK UNIFIED IDEOGRAPH + {0xE390, 0x9297}, //17289 #CJK UNIFIED IDEOGRAPH + {0xE391, 0x9298}, //17290 #CJK UNIFIED IDEOGRAPH + {0xE392, 0x9299}, //17291 #CJK UNIFIED IDEOGRAPH + {0xE393, 0x929A}, //17292 #CJK UNIFIED IDEOGRAPH + {0xE394, 0x929B}, //17293 #CJK UNIFIED IDEOGRAPH + {0xE395, 0x929C}, //17294 #CJK UNIFIED IDEOGRAPH + {0xE396, 0x929D}, //17295 #CJK UNIFIED IDEOGRAPH + {0xE397, 0x929E}, //17296 #CJK UNIFIED IDEOGRAPH + {0xE398, 0x929F}, //17297 #CJK UNIFIED IDEOGRAPH + {0xE399, 0x92A0}, //17298 #CJK UNIFIED IDEOGRAPH + {0xE39A, 0x92A1}, //17299 #CJK UNIFIED IDEOGRAPH + {0xE39B, 0x92A2}, //17300 #CJK UNIFIED IDEOGRAPH + {0xE39C, 0x92A3}, //17301 #CJK UNIFIED IDEOGRAPH + {0xE39D, 0x92A4}, //17302 #CJK UNIFIED IDEOGRAPH + {0xE39E, 0x92A5}, //17303 #CJK UNIFIED IDEOGRAPH + {0xE39F, 0x92A6}, //17304 #CJK UNIFIED IDEOGRAPH + {0xE3A0, 0x92A7}, //17305 #CJK UNIFIED IDEOGRAPH + {0xE3A1, 0x606A}, //17306 #CJK UNIFIED IDEOGRAPH + {0xE3A2, 0x607D}, //17307 #CJK UNIFIED IDEOGRAPH + {0xE3A3, 0x6096}, //17308 #CJK UNIFIED IDEOGRAPH + {0xE3A4, 0x609A}, //17309 #CJK UNIFIED IDEOGRAPH + {0xE3A5, 0x60AD}, //17310 #CJK UNIFIED IDEOGRAPH + {0xE3A6, 0x609D}, //17311 #CJK UNIFIED IDEOGRAPH + {0xE3A7, 0x6083}, //17312 #CJK UNIFIED IDEOGRAPH + {0xE3A8, 0x6092}, //17313 #CJK UNIFIED IDEOGRAPH + {0xE3A9, 0x608C}, //17314 #CJK UNIFIED IDEOGRAPH + {0xE3AA, 0x609B}, //17315 #CJK UNIFIED IDEOGRAPH + {0xE3AB, 0x60EC}, //17316 #CJK UNIFIED IDEOGRAPH + {0xE3AC, 0x60BB}, //17317 #CJK UNIFIED IDEOGRAPH + {0xE3AD, 0x60B1}, //17318 #CJK UNIFIED IDEOGRAPH + {0xE3AE, 0x60DD}, //17319 #CJK UNIFIED IDEOGRAPH + {0xE3AF, 0x60D8}, //17320 #CJK UNIFIED IDEOGRAPH + {0xE3B0, 0x60C6}, //17321 #CJK UNIFIED IDEOGRAPH + {0xE3B1, 0x60DA}, //17322 #CJK UNIFIED IDEOGRAPH + {0xE3B2, 0x60B4}, //17323 #CJK UNIFIED IDEOGRAPH + {0xE3B3, 0x6120}, //17324 #CJK UNIFIED IDEOGRAPH + {0xE3B4, 0x6126}, //17325 #CJK UNIFIED IDEOGRAPH + {0xE3B5, 0x6115}, //17326 #CJK UNIFIED IDEOGRAPH + {0xE3B6, 0x6123}, //17327 #CJK UNIFIED IDEOGRAPH + {0xE3B7, 0x60F4}, //17328 #CJK UNIFIED IDEOGRAPH + {0xE3B8, 0x6100}, //17329 #CJK UNIFIED IDEOGRAPH + {0xE3B9, 0x610E}, //17330 #CJK UNIFIED IDEOGRAPH + {0xE3BA, 0x612B}, //17331 #CJK UNIFIED IDEOGRAPH + {0xE3BB, 0x614A}, //17332 #CJK UNIFIED IDEOGRAPH + {0xE3BC, 0x6175}, //17333 #CJK UNIFIED IDEOGRAPH + {0xE3BD, 0x61AC}, //17334 #CJK UNIFIED IDEOGRAPH + {0xE3BE, 0x6194}, //17335 #CJK UNIFIED IDEOGRAPH + {0xE3BF, 0x61A7}, //17336 #CJK UNIFIED IDEOGRAPH + {0xE3C0, 0x61B7}, //17337 #CJK UNIFIED IDEOGRAPH + {0xE3C1, 0x61D4}, //17338 #CJK UNIFIED IDEOGRAPH + {0xE3C2, 0x61F5}, //17339 #CJK UNIFIED IDEOGRAPH + {0xE3C3, 0x5FDD}, //17340 #CJK UNIFIED IDEOGRAPH + {0xE3C4, 0x96B3}, //17341 #CJK UNIFIED IDEOGRAPH + {0xE3C5, 0x95E9}, //17342 #CJK UNIFIED IDEOGRAPH + {0xE3C6, 0x95EB}, //17343 #CJK UNIFIED IDEOGRAPH + {0xE3C7, 0x95F1}, //17344 #CJK UNIFIED IDEOGRAPH + {0xE3C8, 0x95F3}, //17345 #CJK UNIFIED IDEOGRAPH + {0xE3C9, 0x95F5}, //17346 #CJK UNIFIED IDEOGRAPH + {0xE3CA, 0x95F6}, //17347 #CJK UNIFIED IDEOGRAPH + {0xE3CB, 0x95FC}, //17348 #CJK UNIFIED IDEOGRAPH + {0xE3CC, 0x95FE}, //17349 #CJK UNIFIED IDEOGRAPH + {0xE3CD, 0x9603}, //17350 #CJK UNIFIED IDEOGRAPH + {0xE3CE, 0x9604}, //17351 #CJK UNIFIED IDEOGRAPH + {0xE3CF, 0x9606}, //17352 #CJK UNIFIED IDEOGRAPH + {0xE3D0, 0x9608}, //17353 #CJK UNIFIED IDEOGRAPH + {0xE3D1, 0x960A}, //17354 #CJK UNIFIED IDEOGRAPH + {0xE3D2, 0x960B}, //17355 #CJK UNIFIED IDEOGRAPH + {0xE3D3, 0x960C}, //17356 #CJK UNIFIED IDEOGRAPH + {0xE3D4, 0x960D}, //17357 #CJK UNIFIED IDEOGRAPH + {0xE3D5, 0x960F}, //17358 #CJK UNIFIED IDEOGRAPH + {0xE3D6, 0x9612}, //17359 #CJK UNIFIED IDEOGRAPH + {0xE3D7, 0x9615}, //17360 #CJK UNIFIED IDEOGRAPH + {0xE3D8, 0x9616}, //17361 #CJK UNIFIED IDEOGRAPH + {0xE3D9, 0x9617}, //17362 #CJK UNIFIED IDEOGRAPH + {0xE3DA, 0x9619}, //17363 #CJK UNIFIED IDEOGRAPH + {0xE3DB, 0x961A}, //17364 #CJK UNIFIED IDEOGRAPH + {0xE3DC, 0x4E2C}, //17365 #CJK UNIFIED IDEOGRAPH + {0xE3DD, 0x723F}, //17366 #CJK UNIFIED IDEOGRAPH + {0xE3DE, 0x6215}, //17367 #CJK UNIFIED IDEOGRAPH + {0xE3DF, 0x6C35}, //17368 #CJK UNIFIED IDEOGRAPH + {0xE3E0, 0x6C54}, //17369 #CJK UNIFIED IDEOGRAPH + {0xE3E1, 0x6C5C}, //17370 #CJK UNIFIED IDEOGRAPH + {0xE3E2, 0x6C4A}, //17371 #CJK UNIFIED IDEOGRAPH + {0xE3E3, 0x6CA3}, //17372 #CJK UNIFIED IDEOGRAPH + {0xE3E4, 0x6C85}, //17373 #CJK UNIFIED IDEOGRAPH + {0xE3E5, 0x6C90}, //17374 #CJK UNIFIED IDEOGRAPH + {0xE3E6, 0x6C94}, //17375 #CJK UNIFIED IDEOGRAPH + {0xE3E7, 0x6C8C}, //17376 #CJK UNIFIED IDEOGRAPH + {0xE3E8, 0x6C68}, //17377 #CJK UNIFIED IDEOGRAPH + {0xE3E9, 0x6C69}, //17378 #CJK UNIFIED IDEOGRAPH + {0xE3EA, 0x6C74}, //17379 #CJK UNIFIED IDEOGRAPH + {0xE3EB, 0x6C76}, //17380 #CJK UNIFIED IDEOGRAPH + {0xE3EC, 0x6C86}, //17381 #CJK UNIFIED IDEOGRAPH + {0xE3ED, 0x6CA9}, //17382 #CJK UNIFIED IDEOGRAPH + {0xE3EE, 0x6CD0}, //17383 #CJK UNIFIED IDEOGRAPH + {0xE3EF, 0x6CD4}, //17384 #CJK UNIFIED IDEOGRAPH + {0xE3F0, 0x6CAD}, //17385 #CJK UNIFIED IDEOGRAPH + {0xE3F1, 0x6CF7}, //17386 #CJK UNIFIED IDEOGRAPH + {0xE3F2, 0x6CF8}, //17387 #CJK UNIFIED IDEOGRAPH + {0xE3F3, 0x6CF1}, //17388 #CJK UNIFIED IDEOGRAPH + {0xE3F4, 0x6CD7}, //17389 #CJK UNIFIED IDEOGRAPH + {0xE3F5, 0x6CB2}, //17390 #CJK UNIFIED IDEOGRAPH + {0xE3F6, 0x6CE0}, //17391 #CJK UNIFIED IDEOGRAPH + {0xE3F7, 0x6CD6}, //17392 #CJK UNIFIED IDEOGRAPH + {0xE3F8, 0x6CFA}, //17393 #CJK UNIFIED IDEOGRAPH + {0xE3F9, 0x6CEB}, //17394 #CJK UNIFIED IDEOGRAPH + {0xE3FA, 0x6CEE}, //17395 #CJK UNIFIED IDEOGRAPH + {0xE3FB, 0x6CB1}, //17396 #CJK UNIFIED IDEOGRAPH + {0xE3FC, 0x6CD3}, //17397 #CJK UNIFIED IDEOGRAPH + {0xE3FD, 0x6CEF}, //17398 #CJK UNIFIED IDEOGRAPH + {0xE3FE, 0x6CFE}, //17399 #CJK UNIFIED IDEOGRAPH + {0xE440, 0x92A8}, //17400 #CJK UNIFIED IDEOGRAPH + {0xE441, 0x92A9}, //17401 #CJK UNIFIED IDEOGRAPH + {0xE442, 0x92AA}, //17402 #CJK UNIFIED IDEOGRAPH + {0xE443, 0x92AB}, //17403 #CJK UNIFIED IDEOGRAPH + {0xE444, 0x92AC}, //17404 #CJK UNIFIED IDEOGRAPH + {0xE445, 0x92AD}, //17405 #CJK UNIFIED IDEOGRAPH + {0xE446, 0x92AF}, //17406 #CJK UNIFIED IDEOGRAPH + {0xE447, 0x92B0}, //17407 #CJK UNIFIED IDEOGRAPH + {0xE448, 0x92B1}, //17408 #CJK UNIFIED IDEOGRAPH + {0xE449, 0x92B2}, //17409 #CJK UNIFIED IDEOGRAPH + {0xE44A, 0x92B3}, //17410 #CJK UNIFIED IDEOGRAPH + {0xE44B, 0x92B4}, //17411 #CJK UNIFIED IDEOGRAPH + {0xE44C, 0x92B5}, //17412 #CJK UNIFIED IDEOGRAPH + {0xE44D, 0x92B6}, //17413 #CJK UNIFIED IDEOGRAPH + {0xE44E, 0x92B7}, //17414 #CJK UNIFIED IDEOGRAPH + {0xE44F, 0x92B8}, //17415 #CJK UNIFIED IDEOGRAPH + {0xE450, 0x92B9}, //17416 #CJK UNIFIED IDEOGRAPH + {0xE451, 0x92BA}, //17417 #CJK UNIFIED IDEOGRAPH + {0xE452, 0x92BB}, //17418 #CJK UNIFIED IDEOGRAPH + {0xE453, 0x92BC}, //17419 #CJK UNIFIED IDEOGRAPH + {0xE454, 0x92BD}, //17420 #CJK UNIFIED IDEOGRAPH + {0xE455, 0x92BE}, //17421 #CJK UNIFIED IDEOGRAPH + {0xE456, 0x92BF}, //17422 #CJK UNIFIED IDEOGRAPH + {0xE457, 0x92C0}, //17423 #CJK UNIFIED IDEOGRAPH + {0xE458, 0x92C1}, //17424 #CJK UNIFIED IDEOGRAPH + {0xE459, 0x92C2}, //17425 #CJK UNIFIED IDEOGRAPH + {0xE45A, 0x92C3}, //17426 #CJK UNIFIED IDEOGRAPH + {0xE45B, 0x92C4}, //17427 #CJK UNIFIED IDEOGRAPH + {0xE45C, 0x92C5}, //17428 #CJK UNIFIED IDEOGRAPH + {0xE45D, 0x92C6}, //17429 #CJK UNIFIED IDEOGRAPH + {0xE45E, 0x92C7}, //17430 #CJK UNIFIED IDEOGRAPH + {0xE45F, 0x92C9}, //17431 #CJK UNIFIED IDEOGRAPH + {0xE460, 0x92CA}, //17432 #CJK UNIFIED IDEOGRAPH + {0xE461, 0x92CB}, //17433 #CJK UNIFIED IDEOGRAPH + {0xE462, 0x92CC}, //17434 #CJK UNIFIED IDEOGRAPH + {0xE463, 0x92CD}, //17435 #CJK UNIFIED IDEOGRAPH + {0xE464, 0x92CE}, //17436 #CJK UNIFIED IDEOGRAPH + {0xE465, 0x92CF}, //17437 #CJK UNIFIED IDEOGRAPH + {0xE466, 0x92D0}, //17438 #CJK UNIFIED IDEOGRAPH + {0xE467, 0x92D1}, //17439 #CJK UNIFIED IDEOGRAPH + {0xE468, 0x92D2}, //17440 #CJK UNIFIED IDEOGRAPH + {0xE469, 0x92D3}, //17441 #CJK UNIFIED IDEOGRAPH + {0xE46A, 0x92D4}, //17442 #CJK UNIFIED IDEOGRAPH + {0xE46B, 0x92D5}, //17443 #CJK UNIFIED IDEOGRAPH + {0xE46C, 0x92D6}, //17444 #CJK UNIFIED IDEOGRAPH + {0xE46D, 0x92D7}, //17445 #CJK UNIFIED IDEOGRAPH + {0xE46E, 0x92D8}, //17446 #CJK UNIFIED IDEOGRAPH + {0xE46F, 0x92D9}, //17447 #CJK UNIFIED IDEOGRAPH + {0xE470, 0x92DA}, //17448 #CJK UNIFIED IDEOGRAPH + {0xE471, 0x92DB}, //17449 #CJK UNIFIED IDEOGRAPH + {0xE472, 0x92DC}, //17450 #CJK UNIFIED IDEOGRAPH + {0xE473, 0x92DD}, //17451 #CJK UNIFIED IDEOGRAPH + {0xE474, 0x92DE}, //17452 #CJK UNIFIED IDEOGRAPH + {0xE475, 0x92DF}, //17453 #CJK UNIFIED IDEOGRAPH + {0xE476, 0x92E0}, //17454 #CJK UNIFIED IDEOGRAPH + {0xE477, 0x92E1}, //17455 #CJK UNIFIED IDEOGRAPH + {0xE478, 0x92E2}, //17456 #CJK UNIFIED IDEOGRAPH + {0xE479, 0x92E3}, //17457 #CJK UNIFIED IDEOGRAPH + {0xE47A, 0x92E4}, //17458 #CJK UNIFIED IDEOGRAPH + {0xE47B, 0x92E5}, //17459 #CJK UNIFIED IDEOGRAPH + {0xE47C, 0x92E6}, //17460 #CJK UNIFIED IDEOGRAPH + {0xE47D, 0x92E7}, //17461 #CJK UNIFIED IDEOGRAPH + {0xE47E, 0x92E8}, //17462 #CJK UNIFIED IDEOGRAPH + {0xE480, 0x92E9}, //17463 #CJK UNIFIED IDEOGRAPH + {0xE481, 0x92EA}, //17464 #CJK UNIFIED IDEOGRAPH + {0xE482, 0x92EB}, //17465 #CJK UNIFIED IDEOGRAPH + {0xE483, 0x92EC}, //17466 #CJK UNIFIED IDEOGRAPH + {0xE484, 0x92ED}, //17467 #CJK UNIFIED IDEOGRAPH + {0xE485, 0x92EE}, //17468 #CJK UNIFIED IDEOGRAPH + {0xE486, 0x92EF}, //17469 #CJK UNIFIED IDEOGRAPH + {0xE487, 0x92F0}, //17470 #CJK UNIFIED IDEOGRAPH + {0xE488, 0x92F1}, //17471 #CJK UNIFIED IDEOGRAPH + {0xE489, 0x92F2}, //17472 #CJK UNIFIED IDEOGRAPH + {0xE48A, 0x92F3}, //17473 #CJK UNIFIED IDEOGRAPH + {0xE48B, 0x92F4}, //17474 #CJK UNIFIED IDEOGRAPH + {0xE48C, 0x92F5}, //17475 #CJK UNIFIED IDEOGRAPH + {0xE48D, 0x92F6}, //17476 #CJK UNIFIED IDEOGRAPH + {0xE48E, 0x92F7}, //17477 #CJK UNIFIED IDEOGRAPH + {0xE48F, 0x92F8}, //17478 #CJK UNIFIED IDEOGRAPH + {0xE490, 0x92F9}, //17479 #CJK UNIFIED IDEOGRAPH + {0xE491, 0x92FA}, //17480 #CJK UNIFIED IDEOGRAPH + {0xE492, 0x92FB}, //17481 #CJK UNIFIED IDEOGRAPH + {0xE493, 0x92FC}, //17482 #CJK UNIFIED IDEOGRAPH + {0xE494, 0x92FD}, //17483 #CJK UNIFIED IDEOGRAPH + {0xE495, 0x92FE}, //17484 #CJK UNIFIED IDEOGRAPH + {0xE496, 0x92FF}, //17485 #CJK UNIFIED IDEOGRAPH + {0xE497, 0x9300}, //17486 #CJK UNIFIED IDEOGRAPH + {0xE498, 0x9301}, //17487 #CJK UNIFIED IDEOGRAPH + {0xE499, 0x9302}, //17488 #CJK UNIFIED IDEOGRAPH + {0xE49A, 0x9303}, //17489 #CJK UNIFIED IDEOGRAPH + {0xE49B, 0x9304}, //17490 #CJK UNIFIED IDEOGRAPH + {0xE49C, 0x9305}, //17491 #CJK UNIFIED IDEOGRAPH + {0xE49D, 0x9306}, //17492 #CJK UNIFIED IDEOGRAPH + {0xE49E, 0x9307}, //17493 #CJK UNIFIED IDEOGRAPH + {0xE49F, 0x9308}, //17494 #CJK UNIFIED IDEOGRAPH + {0xE4A0, 0x9309}, //17495 #CJK UNIFIED IDEOGRAPH + {0xE4A1, 0x6D39}, //17496 #CJK UNIFIED IDEOGRAPH + {0xE4A2, 0x6D27}, //17497 #CJK UNIFIED IDEOGRAPH + {0xE4A3, 0x6D0C}, //17498 #CJK UNIFIED IDEOGRAPH + {0xE4A4, 0x6D43}, //17499 #CJK UNIFIED IDEOGRAPH + {0xE4A5, 0x6D48}, //17500 #CJK UNIFIED IDEOGRAPH + {0xE4A6, 0x6D07}, //17501 #CJK UNIFIED IDEOGRAPH + {0xE4A7, 0x6D04}, //17502 #CJK UNIFIED IDEOGRAPH + {0xE4A8, 0x6D19}, //17503 #CJK UNIFIED IDEOGRAPH + {0xE4A9, 0x6D0E}, //17504 #CJK UNIFIED IDEOGRAPH + {0xE4AA, 0x6D2B}, //17505 #CJK UNIFIED IDEOGRAPH + {0xE4AB, 0x6D4D}, //17506 #CJK UNIFIED IDEOGRAPH + {0xE4AC, 0x6D2E}, //17507 #CJK UNIFIED IDEOGRAPH + {0xE4AD, 0x6D35}, //17508 #CJK UNIFIED IDEOGRAPH + {0xE4AE, 0x6D1A}, //17509 #CJK UNIFIED IDEOGRAPH + {0xE4AF, 0x6D4F}, //17510 #CJK UNIFIED IDEOGRAPH + {0xE4B0, 0x6D52}, //17511 #CJK UNIFIED IDEOGRAPH + {0xE4B1, 0x6D54}, //17512 #CJK UNIFIED IDEOGRAPH + {0xE4B2, 0x6D33}, //17513 #CJK UNIFIED IDEOGRAPH + {0xE4B3, 0x6D91}, //17514 #CJK UNIFIED IDEOGRAPH + {0xE4B4, 0x6D6F}, //17515 #CJK UNIFIED IDEOGRAPH + {0xE4B5, 0x6D9E}, //17516 #CJK UNIFIED IDEOGRAPH + {0xE4B6, 0x6DA0}, //17517 #CJK UNIFIED IDEOGRAPH + {0xE4B7, 0x6D5E}, //17518 #CJK UNIFIED IDEOGRAPH + {0xE4B8, 0x6D93}, //17519 #CJK UNIFIED IDEOGRAPH + {0xE4B9, 0x6D94}, //17520 #CJK UNIFIED IDEOGRAPH + {0xE4BA, 0x6D5C}, //17521 #CJK UNIFIED IDEOGRAPH + {0xE4BB, 0x6D60}, //17522 #CJK UNIFIED IDEOGRAPH + {0xE4BC, 0x6D7C}, //17523 #CJK UNIFIED IDEOGRAPH + {0xE4BD, 0x6D63}, //17524 #CJK UNIFIED IDEOGRAPH + {0xE4BE, 0x6E1A}, //17525 #CJK UNIFIED IDEOGRAPH + {0xE4BF, 0x6DC7}, //17526 #CJK UNIFIED IDEOGRAPH + {0xE4C0, 0x6DC5}, //17527 #CJK UNIFIED IDEOGRAPH + {0xE4C1, 0x6DDE}, //17528 #CJK UNIFIED IDEOGRAPH + {0xE4C2, 0x6E0E}, //17529 #CJK UNIFIED IDEOGRAPH + {0xE4C3, 0x6DBF}, //17530 #CJK UNIFIED IDEOGRAPH + {0xE4C4, 0x6DE0}, //17531 #CJK UNIFIED IDEOGRAPH + {0xE4C5, 0x6E11}, //17532 #CJK UNIFIED IDEOGRAPH + {0xE4C6, 0x6DE6}, //17533 #CJK UNIFIED IDEOGRAPH + {0xE4C7, 0x6DDD}, //17534 #CJK UNIFIED IDEOGRAPH + {0xE4C8, 0x6DD9}, //17535 #CJK UNIFIED IDEOGRAPH + {0xE4C9, 0x6E16}, //17536 #CJK UNIFIED IDEOGRAPH + {0xE4CA, 0x6DAB}, //17537 #CJK UNIFIED IDEOGRAPH + {0xE4CB, 0x6E0C}, //17538 #CJK UNIFIED IDEOGRAPH + {0xE4CC, 0x6DAE}, //17539 #CJK UNIFIED IDEOGRAPH + {0xE4CD, 0x6E2B}, //17540 #CJK UNIFIED IDEOGRAPH + {0xE4CE, 0x6E6E}, //17541 #CJK UNIFIED IDEOGRAPH + {0xE4CF, 0x6E4E}, //17542 #CJK UNIFIED IDEOGRAPH + {0xE4D0, 0x6E6B}, //17543 #CJK UNIFIED IDEOGRAPH + {0xE4D1, 0x6EB2}, //17544 #CJK UNIFIED IDEOGRAPH + {0xE4D2, 0x6E5F}, //17545 #CJK UNIFIED IDEOGRAPH + {0xE4D3, 0x6E86}, //17546 #CJK UNIFIED IDEOGRAPH + {0xE4D4, 0x6E53}, //17547 #CJK UNIFIED IDEOGRAPH + {0xE4D5, 0x6E54}, //17548 #CJK UNIFIED IDEOGRAPH + {0xE4D6, 0x6E32}, //17549 #CJK UNIFIED IDEOGRAPH + {0xE4D7, 0x6E25}, //17550 #CJK UNIFIED IDEOGRAPH + {0xE4D8, 0x6E44}, //17551 #CJK UNIFIED IDEOGRAPH + {0xE4D9, 0x6EDF}, //17552 #CJK UNIFIED IDEOGRAPH + {0xE4DA, 0x6EB1}, //17553 #CJK UNIFIED IDEOGRAPH + {0xE4DB, 0x6E98}, //17554 #CJK UNIFIED IDEOGRAPH + {0xE4DC, 0x6EE0}, //17555 #CJK UNIFIED IDEOGRAPH + {0xE4DD, 0x6F2D}, //17556 #CJK UNIFIED IDEOGRAPH + {0xE4DE, 0x6EE2}, //17557 #CJK UNIFIED IDEOGRAPH + {0xE4DF, 0x6EA5}, //17558 #CJK UNIFIED IDEOGRAPH + {0xE4E0, 0x6EA7}, //17559 #CJK UNIFIED IDEOGRAPH + {0xE4E1, 0x6EBD}, //17560 #CJK UNIFIED IDEOGRAPH + {0xE4E2, 0x6EBB}, //17561 #CJK UNIFIED IDEOGRAPH + {0xE4E3, 0x6EB7}, //17562 #CJK UNIFIED IDEOGRAPH + {0xE4E4, 0x6ED7}, //17563 #CJK UNIFIED IDEOGRAPH + {0xE4E5, 0x6EB4}, //17564 #CJK UNIFIED IDEOGRAPH + {0xE4E6, 0x6ECF}, //17565 #CJK UNIFIED IDEOGRAPH + {0xE4E7, 0x6E8F}, //17566 #CJK UNIFIED IDEOGRAPH + {0xE4E8, 0x6EC2}, //17567 #CJK UNIFIED IDEOGRAPH + {0xE4E9, 0x6E9F}, //17568 #CJK UNIFIED IDEOGRAPH + {0xE4EA, 0x6F62}, //17569 #CJK UNIFIED IDEOGRAPH + {0xE4EB, 0x6F46}, //17570 #CJK UNIFIED IDEOGRAPH + {0xE4EC, 0x6F47}, //17571 #CJK UNIFIED IDEOGRAPH + {0xE4ED, 0x6F24}, //17572 #CJK UNIFIED IDEOGRAPH + {0xE4EE, 0x6F15}, //17573 #CJK UNIFIED IDEOGRAPH + {0xE4EF, 0x6EF9}, //17574 #CJK UNIFIED IDEOGRAPH + {0xE4F0, 0x6F2F}, //17575 #CJK UNIFIED IDEOGRAPH + {0xE4F1, 0x6F36}, //17576 #CJK UNIFIED IDEOGRAPH + {0xE4F2, 0x6F4B}, //17577 #CJK UNIFIED IDEOGRAPH + {0xE4F3, 0x6F74}, //17578 #CJK UNIFIED IDEOGRAPH + {0xE4F4, 0x6F2A}, //17579 #CJK UNIFIED IDEOGRAPH + {0xE4F5, 0x6F09}, //17580 #CJK UNIFIED IDEOGRAPH + {0xE4F6, 0x6F29}, //17581 #CJK UNIFIED IDEOGRAPH + {0xE4F7, 0x6F89}, //17582 #CJK UNIFIED IDEOGRAPH + {0xE4F8, 0x6F8D}, //17583 #CJK UNIFIED IDEOGRAPH + {0xE4F9, 0x6F8C}, //17584 #CJK UNIFIED IDEOGRAPH + {0xE4FA, 0x6F78}, //17585 #CJK UNIFIED IDEOGRAPH + {0xE4FB, 0x6F72}, //17586 #CJK UNIFIED IDEOGRAPH + {0xE4FC, 0x6F7C}, //17587 #CJK UNIFIED IDEOGRAPH + {0xE4FD, 0x6F7A}, //17588 #CJK UNIFIED IDEOGRAPH + {0xE4FE, 0x6FD1}, //17589 #CJK UNIFIED IDEOGRAPH + {0xE540, 0x930A}, //17590 #CJK UNIFIED IDEOGRAPH + {0xE541, 0x930B}, //17591 #CJK UNIFIED IDEOGRAPH + {0xE542, 0x930C}, //17592 #CJK UNIFIED IDEOGRAPH + {0xE543, 0x930D}, //17593 #CJK UNIFIED IDEOGRAPH + {0xE544, 0x930E}, //17594 #CJK UNIFIED IDEOGRAPH + {0xE545, 0x930F}, //17595 #CJK UNIFIED IDEOGRAPH + {0xE546, 0x9310}, //17596 #CJK UNIFIED IDEOGRAPH + {0xE547, 0x9311}, //17597 #CJK UNIFIED IDEOGRAPH + {0xE548, 0x9312}, //17598 #CJK UNIFIED IDEOGRAPH + {0xE549, 0x9313}, //17599 #CJK UNIFIED IDEOGRAPH + {0xE54A, 0x9314}, //17600 #CJK UNIFIED IDEOGRAPH + {0xE54B, 0x9315}, //17601 #CJK UNIFIED IDEOGRAPH + {0xE54C, 0x9316}, //17602 #CJK UNIFIED IDEOGRAPH + {0xE54D, 0x9317}, //17603 #CJK UNIFIED IDEOGRAPH + {0xE54E, 0x9318}, //17604 #CJK UNIFIED IDEOGRAPH + {0xE54F, 0x9319}, //17605 #CJK UNIFIED IDEOGRAPH + {0xE550, 0x931A}, //17606 #CJK UNIFIED IDEOGRAPH + {0xE551, 0x931B}, //17607 #CJK UNIFIED IDEOGRAPH + {0xE552, 0x931C}, //17608 #CJK UNIFIED IDEOGRAPH + {0xE553, 0x931D}, //17609 #CJK UNIFIED IDEOGRAPH + {0xE554, 0x931E}, //17610 #CJK UNIFIED IDEOGRAPH + {0xE555, 0x931F}, //17611 #CJK UNIFIED IDEOGRAPH + {0xE556, 0x9320}, //17612 #CJK UNIFIED IDEOGRAPH + {0xE557, 0x9321}, //17613 #CJK UNIFIED IDEOGRAPH + {0xE558, 0x9322}, //17614 #CJK UNIFIED IDEOGRAPH + {0xE559, 0x9323}, //17615 #CJK UNIFIED IDEOGRAPH + {0xE55A, 0x9324}, //17616 #CJK UNIFIED IDEOGRAPH + {0xE55B, 0x9325}, //17617 #CJK UNIFIED IDEOGRAPH + {0xE55C, 0x9326}, //17618 #CJK UNIFIED IDEOGRAPH + {0xE55D, 0x9327}, //17619 #CJK UNIFIED IDEOGRAPH + {0xE55E, 0x9328}, //17620 #CJK UNIFIED IDEOGRAPH + {0xE55F, 0x9329}, //17621 #CJK UNIFIED IDEOGRAPH + {0xE560, 0x932A}, //17622 #CJK UNIFIED IDEOGRAPH + {0xE561, 0x932B}, //17623 #CJK UNIFIED IDEOGRAPH + {0xE562, 0x932C}, //17624 #CJK UNIFIED IDEOGRAPH + {0xE563, 0x932D}, //17625 #CJK UNIFIED IDEOGRAPH + {0xE564, 0x932E}, //17626 #CJK UNIFIED IDEOGRAPH + {0xE565, 0x932F}, //17627 #CJK UNIFIED IDEOGRAPH + {0xE566, 0x9330}, //17628 #CJK UNIFIED IDEOGRAPH + {0xE567, 0x9331}, //17629 #CJK UNIFIED IDEOGRAPH + {0xE568, 0x9332}, //17630 #CJK UNIFIED IDEOGRAPH + {0xE569, 0x9333}, //17631 #CJK UNIFIED IDEOGRAPH + {0xE56A, 0x9334}, //17632 #CJK UNIFIED IDEOGRAPH + {0xE56B, 0x9335}, //17633 #CJK UNIFIED IDEOGRAPH + {0xE56C, 0x9336}, //17634 #CJK UNIFIED IDEOGRAPH + {0xE56D, 0x9337}, //17635 #CJK UNIFIED IDEOGRAPH + {0xE56E, 0x9338}, //17636 #CJK UNIFIED IDEOGRAPH + {0xE56F, 0x9339}, //17637 #CJK UNIFIED IDEOGRAPH + {0xE570, 0x933A}, //17638 #CJK UNIFIED IDEOGRAPH + {0xE571, 0x933B}, //17639 #CJK UNIFIED IDEOGRAPH + {0xE572, 0x933C}, //17640 #CJK UNIFIED IDEOGRAPH + {0xE573, 0x933D}, //17641 #CJK UNIFIED IDEOGRAPH + {0xE574, 0x933F}, //17642 #CJK UNIFIED IDEOGRAPH + {0xE575, 0x9340}, //17643 #CJK UNIFIED IDEOGRAPH + {0xE576, 0x9341}, //17644 #CJK UNIFIED IDEOGRAPH + {0xE577, 0x9342}, //17645 #CJK UNIFIED IDEOGRAPH + {0xE578, 0x9343}, //17646 #CJK UNIFIED IDEOGRAPH + {0xE579, 0x9344}, //17647 #CJK UNIFIED IDEOGRAPH + {0xE57A, 0x9345}, //17648 #CJK UNIFIED IDEOGRAPH + {0xE57B, 0x9346}, //17649 #CJK UNIFIED IDEOGRAPH + {0xE57C, 0x9347}, //17650 #CJK UNIFIED IDEOGRAPH + {0xE57D, 0x9348}, //17651 #CJK UNIFIED IDEOGRAPH + {0xE57E, 0x9349}, //17652 #CJK UNIFIED IDEOGRAPH + {0xE580, 0x934A}, //17653 #CJK UNIFIED IDEOGRAPH + {0xE581, 0x934B}, //17654 #CJK UNIFIED IDEOGRAPH + {0xE582, 0x934C}, //17655 #CJK UNIFIED IDEOGRAPH + {0xE583, 0x934D}, //17656 #CJK UNIFIED IDEOGRAPH + {0xE584, 0x934E}, //17657 #CJK UNIFIED IDEOGRAPH + {0xE585, 0x934F}, //17658 #CJK UNIFIED IDEOGRAPH + {0xE586, 0x9350}, //17659 #CJK UNIFIED IDEOGRAPH + {0xE587, 0x9351}, //17660 #CJK UNIFIED IDEOGRAPH + {0xE588, 0x9352}, //17661 #CJK UNIFIED IDEOGRAPH + {0xE589, 0x9353}, //17662 #CJK UNIFIED IDEOGRAPH + {0xE58A, 0x9354}, //17663 #CJK UNIFIED IDEOGRAPH + {0xE58B, 0x9355}, //17664 #CJK UNIFIED IDEOGRAPH + {0xE58C, 0x9356}, //17665 #CJK UNIFIED IDEOGRAPH + {0xE58D, 0x9357}, //17666 #CJK UNIFIED IDEOGRAPH + {0xE58E, 0x9358}, //17667 #CJK UNIFIED IDEOGRAPH + {0xE58F, 0x9359}, //17668 #CJK UNIFIED IDEOGRAPH + {0xE590, 0x935A}, //17669 #CJK UNIFIED IDEOGRAPH + {0xE591, 0x935B}, //17670 #CJK UNIFIED IDEOGRAPH + {0xE592, 0x935C}, //17671 #CJK UNIFIED IDEOGRAPH + {0xE593, 0x935D}, //17672 #CJK UNIFIED IDEOGRAPH + {0xE594, 0x935E}, //17673 #CJK UNIFIED IDEOGRAPH + {0xE595, 0x935F}, //17674 #CJK UNIFIED IDEOGRAPH + {0xE596, 0x9360}, //17675 #CJK UNIFIED IDEOGRAPH + {0xE597, 0x9361}, //17676 #CJK UNIFIED IDEOGRAPH + {0xE598, 0x9362}, //17677 #CJK UNIFIED IDEOGRAPH + {0xE599, 0x9363}, //17678 #CJK UNIFIED IDEOGRAPH + {0xE59A, 0x9364}, //17679 #CJK UNIFIED IDEOGRAPH + {0xE59B, 0x9365}, //17680 #CJK UNIFIED IDEOGRAPH + {0xE59C, 0x9366}, //17681 #CJK UNIFIED IDEOGRAPH + {0xE59D, 0x9367}, //17682 #CJK UNIFIED IDEOGRAPH + {0xE59E, 0x9368}, //17683 #CJK UNIFIED IDEOGRAPH + {0xE59F, 0x9369}, //17684 #CJK UNIFIED IDEOGRAPH + {0xE5A0, 0x936B}, //17685 #CJK UNIFIED IDEOGRAPH + {0xE5A1, 0x6FC9}, //17686 #CJK UNIFIED IDEOGRAPH + {0xE5A2, 0x6FA7}, //17687 #CJK UNIFIED IDEOGRAPH + {0xE5A3, 0x6FB9}, //17688 #CJK UNIFIED IDEOGRAPH + {0xE5A4, 0x6FB6}, //17689 #CJK UNIFIED IDEOGRAPH + {0xE5A5, 0x6FC2}, //17690 #CJK UNIFIED IDEOGRAPH + {0xE5A6, 0x6FE1}, //17691 #CJK UNIFIED IDEOGRAPH + {0xE5A7, 0x6FEE}, //17692 #CJK UNIFIED IDEOGRAPH + {0xE5A8, 0x6FDE}, //17693 #CJK UNIFIED IDEOGRAPH + {0xE5A9, 0x6FE0}, //17694 #CJK UNIFIED IDEOGRAPH + {0xE5AA, 0x6FEF}, //17695 #CJK UNIFIED IDEOGRAPH + {0xE5AB, 0x701A}, //17696 #CJK UNIFIED IDEOGRAPH + {0xE5AC, 0x7023}, //17697 #CJK UNIFIED IDEOGRAPH + {0xE5AD, 0x701B}, //17698 #CJK UNIFIED IDEOGRAPH + {0xE5AE, 0x7039}, //17699 #CJK UNIFIED IDEOGRAPH + {0xE5AF, 0x7035}, //17700 #CJK UNIFIED IDEOGRAPH + {0xE5B0, 0x704F}, //17701 #CJK UNIFIED IDEOGRAPH + {0xE5B1, 0x705E}, //17702 #CJK UNIFIED IDEOGRAPH + {0xE5B2, 0x5B80}, //17703 #CJK UNIFIED IDEOGRAPH + {0xE5B3, 0x5B84}, //17704 #CJK UNIFIED IDEOGRAPH + {0xE5B4, 0x5B95}, //17705 #CJK UNIFIED IDEOGRAPH + {0xE5B5, 0x5B93}, //17706 #CJK UNIFIED IDEOGRAPH + {0xE5B6, 0x5BA5}, //17707 #CJK UNIFIED IDEOGRAPH + {0xE5B7, 0x5BB8}, //17708 #CJK UNIFIED IDEOGRAPH + {0xE5B8, 0x752F}, //17709 #CJK UNIFIED IDEOGRAPH + {0xE5B9, 0x9A9E}, //17710 #CJK UNIFIED IDEOGRAPH + {0xE5BA, 0x6434}, //17711 #CJK UNIFIED IDEOGRAPH + {0xE5BB, 0x5BE4}, //17712 #CJK UNIFIED IDEOGRAPH + {0xE5BC, 0x5BEE}, //17713 #CJK UNIFIED IDEOGRAPH + {0xE5BD, 0x8930}, //17714 #CJK UNIFIED IDEOGRAPH + {0xE5BE, 0x5BF0}, //17715 #CJK UNIFIED IDEOGRAPH + {0xE5BF, 0x8E47}, //17716 #CJK UNIFIED IDEOGRAPH + {0xE5C0, 0x8B07}, //17717 #CJK UNIFIED IDEOGRAPH + {0xE5C1, 0x8FB6}, //17718 #CJK UNIFIED IDEOGRAPH + {0xE5C2, 0x8FD3}, //17719 #CJK UNIFIED IDEOGRAPH + {0xE5C3, 0x8FD5}, //17720 #CJK UNIFIED IDEOGRAPH + {0xE5C4, 0x8FE5}, //17721 #CJK UNIFIED IDEOGRAPH + {0xE5C5, 0x8FEE}, //17722 #CJK UNIFIED IDEOGRAPH + {0xE5C6, 0x8FE4}, //17723 #CJK UNIFIED IDEOGRAPH + {0xE5C7, 0x8FE9}, //17724 #CJK UNIFIED IDEOGRAPH + {0xE5C8, 0x8FE6}, //17725 #CJK UNIFIED IDEOGRAPH + {0xE5C9, 0x8FF3}, //17726 #CJK UNIFIED IDEOGRAPH + {0xE5CA, 0x8FE8}, //17727 #CJK UNIFIED IDEOGRAPH + {0xE5CB, 0x9005}, //17728 #CJK UNIFIED IDEOGRAPH + {0xE5CC, 0x9004}, //17729 #CJK UNIFIED IDEOGRAPH + {0xE5CD, 0x900B}, //17730 #CJK UNIFIED IDEOGRAPH + {0xE5CE, 0x9026}, //17731 #CJK UNIFIED IDEOGRAPH + {0xE5CF, 0x9011}, //17732 #CJK UNIFIED IDEOGRAPH + {0xE5D0, 0x900D}, //17733 #CJK UNIFIED IDEOGRAPH + {0xE5D1, 0x9016}, //17734 #CJK UNIFIED IDEOGRAPH + {0xE5D2, 0x9021}, //17735 #CJK UNIFIED IDEOGRAPH + {0xE5D3, 0x9035}, //17736 #CJK UNIFIED IDEOGRAPH + {0xE5D4, 0x9036}, //17737 #CJK UNIFIED IDEOGRAPH + {0xE5D5, 0x902D}, //17738 #CJK UNIFIED IDEOGRAPH + {0xE5D6, 0x902F}, //17739 #CJK UNIFIED IDEOGRAPH + {0xE5D7, 0x9044}, //17740 #CJK UNIFIED IDEOGRAPH + {0xE5D8, 0x9051}, //17741 #CJK UNIFIED IDEOGRAPH + {0xE5D9, 0x9052}, //17742 #CJK UNIFIED IDEOGRAPH + {0xE5DA, 0x9050}, //17743 #CJK UNIFIED IDEOGRAPH + {0xE5DB, 0x9068}, //17744 #CJK UNIFIED IDEOGRAPH + {0xE5DC, 0x9058}, //17745 #CJK UNIFIED IDEOGRAPH + {0xE5DD, 0x9062}, //17746 #CJK UNIFIED IDEOGRAPH + {0xE5DE, 0x905B}, //17747 #CJK UNIFIED IDEOGRAPH + {0xE5DF, 0x66B9}, //17748 #CJK UNIFIED IDEOGRAPH + {0xE5E0, 0x9074}, //17749 #CJK UNIFIED IDEOGRAPH + {0xE5E1, 0x907D}, //17750 #CJK UNIFIED IDEOGRAPH + {0xE5E2, 0x9082}, //17751 #CJK UNIFIED IDEOGRAPH + {0xE5E3, 0x9088}, //17752 #CJK UNIFIED IDEOGRAPH + {0xE5E4, 0x9083}, //17753 #CJK UNIFIED IDEOGRAPH + {0xE5E5, 0x908B}, //17754 #CJK UNIFIED IDEOGRAPH + {0xE5E6, 0x5F50}, //17755 #CJK UNIFIED IDEOGRAPH + {0xE5E7, 0x5F57}, //17756 #CJK UNIFIED IDEOGRAPH + {0xE5E8, 0x5F56}, //17757 #CJK UNIFIED IDEOGRAPH + {0xE5E9, 0x5F58}, //17758 #CJK UNIFIED IDEOGRAPH + {0xE5EA, 0x5C3B}, //17759 #CJK UNIFIED IDEOGRAPH + {0xE5EB, 0x54AB}, //17760 #CJK UNIFIED IDEOGRAPH + {0xE5EC, 0x5C50}, //17761 #CJK UNIFIED IDEOGRAPH + {0xE5ED, 0x5C59}, //17762 #CJK UNIFIED IDEOGRAPH + {0xE5EE, 0x5B71}, //17763 #CJK UNIFIED IDEOGRAPH + {0xE5EF, 0x5C63}, //17764 #CJK UNIFIED IDEOGRAPH + {0xE5F0, 0x5C66}, //17765 #CJK UNIFIED IDEOGRAPH + {0xE5F1, 0x7FBC}, //17766 #CJK UNIFIED IDEOGRAPH + {0xE5F2, 0x5F2A}, //17767 #CJK UNIFIED IDEOGRAPH + {0xE5F3, 0x5F29}, //17768 #CJK UNIFIED IDEOGRAPH + {0xE5F4, 0x5F2D}, //17769 #CJK UNIFIED IDEOGRAPH + {0xE5F5, 0x8274}, //17770 #CJK UNIFIED IDEOGRAPH + {0xE5F6, 0x5F3C}, //17771 #CJK UNIFIED IDEOGRAPH + {0xE5F7, 0x9B3B}, //17772 #CJK UNIFIED IDEOGRAPH + {0xE5F8, 0x5C6E}, //17773 #CJK UNIFIED IDEOGRAPH + {0xE5F9, 0x5981}, //17774 #CJK UNIFIED IDEOGRAPH + {0xE5FA, 0x5983}, //17775 #CJK UNIFIED IDEOGRAPH + {0xE5FB, 0x598D}, //17776 #CJK UNIFIED IDEOGRAPH + {0xE5FC, 0x59A9}, //17777 #CJK UNIFIED IDEOGRAPH + {0xE5FD, 0x59AA}, //17778 #CJK UNIFIED IDEOGRAPH + {0xE5FE, 0x59A3}, //17779 #CJK UNIFIED IDEOGRAPH + {0xE640, 0x936C}, //17780 #CJK UNIFIED IDEOGRAPH + {0xE641, 0x936D}, //17781 #CJK UNIFIED IDEOGRAPH + {0xE642, 0x936E}, //17782 #CJK UNIFIED IDEOGRAPH + {0xE643, 0x936F}, //17783 #CJK UNIFIED IDEOGRAPH + {0xE644, 0x9370}, //17784 #CJK UNIFIED IDEOGRAPH + {0xE645, 0x9371}, //17785 #CJK UNIFIED IDEOGRAPH + {0xE646, 0x9372}, //17786 #CJK UNIFIED IDEOGRAPH + {0xE647, 0x9373}, //17787 #CJK UNIFIED IDEOGRAPH + {0xE648, 0x9374}, //17788 #CJK UNIFIED IDEOGRAPH + {0xE649, 0x9375}, //17789 #CJK UNIFIED IDEOGRAPH + {0xE64A, 0x9376}, //17790 #CJK UNIFIED IDEOGRAPH + {0xE64B, 0x9377}, //17791 #CJK UNIFIED IDEOGRAPH + {0xE64C, 0x9378}, //17792 #CJK UNIFIED IDEOGRAPH + {0xE64D, 0x9379}, //17793 #CJK UNIFIED IDEOGRAPH + {0xE64E, 0x937A}, //17794 #CJK UNIFIED IDEOGRAPH + {0xE64F, 0x937B}, //17795 #CJK UNIFIED IDEOGRAPH + {0xE650, 0x937C}, //17796 #CJK UNIFIED IDEOGRAPH + {0xE651, 0x937D}, //17797 #CJK UNIFIED IDEOGRAPH + {0xE652, 0x937E}, //17798 #CJK UNIFIED IDEOGRAPH + {0xE653, 0x937F}, //17799 #CJK UNIFIED IDEOGRAPH + {0xE654, 0x9380}, //17800 #CJK UNIFIED IDEOGRAPH + {0xE655, 0x9381}, //17801 #CJK UNIFIED IDEOGRAPH + {0xE656, 0x9382}, //17802 #CJK UNIFIED IDEOGRAPH + {0xE657, 0x9383}, //17803 #CJK UNIFIED IDEOGRAPH + {0xE658, 0x9384}, //17804 #CJK UNIFIED IDEOGRAPH + {0xE659, 0x9385}, //17805 #CJK UNIFIED IDEOGRAPH + {0xE65A, 0x9386}, //17806 #CJK UNIFIED IDEOGRAPH + {0xE65B, 0x9387}, //17807 #CJK UNIFIED IDEOGRAPH + {0xE65C, 0x9388}, //17808 #CJK UNIFIED IDEOGRAPH + {0xE65D, 0x9389}, //17809 #CJK UNIFIED IDEOGRAPH + {0xE65E, 0x938A}, //17810 #CJK UNIFIED IDEOGRAPH + {0xE65F, 0x938B}, //17811 #CJK UNIFIED IDEOGRAPH + {0xE660, 0x938C}, //17812 #CJK UNIFIED IDEOGRAPH + {0xE661, 0x938D}, //17813 #CJK UNIFIED IDEOGRAPH + {0xE662, 0x938E}, //17814 #CJK UNIFIED IDEOGRAPH + {0xE663, 0x9390}, //17815 #CJK UNIFIED IDEOGRAPH + {0xE664, 0x9391}, //17816 #CJK UNIFIED IDEOGRAPH + {0xE665, 0x9392}, //17817 #CJK UNIFIED IDEOGRAPH + {0xE666, 0x9393}, //17818 #CJK UNIFIED IDEOGRAPH + {0xE667, 0x9394}, //17819 #CJK UNIFIED IDEOGRAPH + {0xE668, 0x9395}, //17820 #CJK UNIFIED IDEOGRAPH + {0xE669, 0x9396}, //17821 #CJK UNIFIED IDEOGRAPH + {0xE66A, 0x9397}, //17822 #CJK UNIFIED IDEOGRAPH + {0xE66B, 0x9398}, //17823 #CJK UNIFIED IDEOGRAPH + {0xE66C, 0x9399}, //17824 #CJK UNIFIED IDEOGRAPH + {0xE66D, 0x939A}, //17825 #CJK UNIFIED IDEOGRAPH + {0xE66E, 0x939B}, //17826 #CJK UNIFIED IDEOGRAPH + {0xE66F, 0x939C}, //17827 #CJK UNIFIED IDEOGRAPH + {0xE670, 0x939D}, //17828 #CJK UNIFIED IDEOGRAPH + {0xE671, 0x939E}, //17829 #CJK UNIFIED IDEOGRAPH + {0xE672, 0x939F}, //17830 #CJK UNIFIED IDEOGRAPH + {0xE673, 0x93A0}, //17831 #CJK UNIFIED IDEOGRAPH + {0xE674, 0x93A1}, //17832 #CJK UNIFIED IDEOGRAPH + {0xE675, 0x93A2}, //17833 #CJK UNIFIED IDEOGRAPH + {0xE676, 0x93A3}, //17834 #CJK UNIFIED IDEOGRAPH + {0xE677, 0x93A4}, //17835 #CJK UNIFIED IDEOGRAPH + {0xE678, 0x93A5}, //17836 #CJK UNIFIED IDEOGRAPH + {0xE679, 0x93A6}, //17837 #CJK UNIFIED IDEOGRAPH + {0xE67A, 0x93A7}, //17838 #CJK UNIFIED IDEOGRAPH + {0xE67B, 0x93A8}, //17839 #CJK UNIFIED IDEOGRAPH + {0xE67C, 0x93A9}, //17840 #CJK UNIFIED IDEOGRAPH + {0xE67D, 0x93AA}, //17841 #CJK UNIFIED IDEOGRAPH + {0xE67E, 0x93AB}, //17842 #CJK UNIFIED IDEOGRAPH + {0xE680, 0x93AC}, //17843 #CJK UNIFIED IDEOGRAPH + {0xE681, 0x93AD}, //17844 #CJK UNIFIED IDEOGRAPH + {0xE682, 0x93AE}, //17845 #CJK UNIFIED IDEOGRAPH + {0xE683, 0x93AF}, //17846 #CJK UNIFIED IDEOGRAPH + {0xE684, 0x93B0}, //17847 #CJK UNIFIED IDEOGRAPH + {0xE685, 0x93B1}, //17848 #CJK UNIFIED IDEOGRAPH + {0xE686, 0x93B2}, //17849 #CJK UNIFIED IDEOGRAPH + {0xE687, 0x93B3}, //17850 #CJK UNIFIED IDEOGRAPH + {0xE688, 0x93B4}, //17851 #CJK UNIFIED IDEOGRAPH + {0xE689, 0x93B5}, //17852 #CJK UNIFIED IDEOGRAPH + {0xE68A, 0x93B6}, //17853 #CJK UNIFIED IDEOGRAPH + {0xE68B, 0x93B7}, //17854 #CJK UNIFIED IDEOGRAPH + {0xE68C, 0x93B8}, //17855 #CJK UNIFIED IDEOGRAPH + {0xE68D, 0x93B9}, //17856 #CJK UNIFIED IDEOGRAPH + {0xE68E, 0x93BA}, //17857 #CJK UNIFIED IDEOGRAPH + {0xE68F, 0x93BB}, //17858 #CJK UNIFIED IDEOGRAPH + {0xE690, 0x93BC}, //17859 #CJK UNIFIED IDEOGRAPH + {0xE691, 0x93BD}, //17860 #CJK UNIFIED IDEOGRAPH + {0xE692, 0x93BE}, //17861 #CJK UNIFIED IDEOGRAPH + {0xE693, 0x93BF}, //17862 #CJK UNIFIED IDEOGRAPH + {0xE694, 0x93C0}, //17863 #CJK UNIFIED IDEOGRAPH + {0xE695, 0x93C1}, //17864 #CJK UNIFIED IDEOGRAPH + {0xE696, 0x93C2}, //17865 #CJK UNIFIED IDEOGRAPH + {0xE697, 0x93C3}, //17866 #CJK UNIFIED IDEOGRAPH + {0xE698, 0x93C4}, //17867 #CJK UNIFIED IDEOGRAPH + {0xE699, 0x93C5}, //17868 #CJK UNIFIED IDEOGRAPH + {0xE69A, 0x93C6}, //17869 #CJK UNIFIED IDEOGRAPH + {0xE69B, 0x93C7}, //17870 #CJK UNIFIED IDEOGRAPH + {0xE69C, 0x93C8}, //17871 #CJK UNIFIED IDEOGRAPH + {0xE69D, 0x93C9}, //17872 #CJK UNIFIED IDEOGRAPH + {0xE69E, 0x93CB}, //17873 #CJK UNIFIED IDEOGRAPH + {0xE69F, 0x93CC}, //17874 #CJK UNIFIED IDEOGRAPH + {0xE6A0, 0x93CD}, //17875 #CJK UNIFIED IDEOGRAPH + {0xE6A1, 0x5997}, //17876 #CJK UNIFIED IDEOGRAPH + {0xE6A2, 0x59CA}, //17877 #CJK UNIFIED IDEOGRAPH + {0xE6A3, 0x59AB}, //17878 #CJK UNIFIED IDEOGRAPH + {0xE6A4, 0x599E}, //17879 #CJK UNIFIED IDEOGRAPH + {0xE6A5, 0x59A4}, //17880 #CJK UNIFIED IDEOGRAPH + {0xE6A6, 0x59D2}, //17881 #CJK UNIFIED IDEOGRAPH + {0xE6A7, 0x59B2}, //17882 #CJK UNIFIED IDEOGRAPH + {0xE6A8, 0x59AF}, //17883 #CJK UNIFIED IDEOGRAPH + {0xE6A9, 0x59D7}, //17884 #CJK UNIFIED IDEOGRAPH + {0xE6AA, 0x59BE}, //17885 #CJK UNIFIED IDEOGRAPH + {0xE6AB, 0x5A05}, //17886 #CJK UNIFIED IDEOGRAPH + {0xE6AC, 0x5A06}, //17887 #CJK UNIFIED IDEOGRAPH + {0xE6AD, 0x59DD}, //17888 #CJK UNIFIED IDEOGRAPH + {0xE6AE, 0x5A08}, //17889 #CJK UNIFIED IDEOGRAPH + {0xE6AF, 0x59E3}, //17890 #CJK UNIFIED IDEOGRAPH + {0xE6B0, 0x59D8}, //17891 #CJK UNIFIED IDEOGRAPH + {0xE6B1, 0x59F9}, //17892 #CJK UNIFIED IDEOGRAPH + {0xE6B2, 0x5A0C}, //17893 #CJK UNIFIED IDEOGRAPH + {0xE6B3, 0x5A09}, //17894 #CJK UNIFIED IDEOGRAPH + {0xE6B4, 0x5A32}, //17895 #CJK UNIFIED IDEOGRAPH + {0xE6B5, 0x5A34}, //17896 #CJK UNIFIED IDEOGRAPH + {0xE6B6, 0x5A11}, //17897 #CJK UNIFIED IDEOGRAPH + {0xE6B7, 0x5A23}, //17898 #CJK UNIFIED IDEOGRAPH + {0xE6B8, 0x5A13}, //17899 #CJK UNIFIED IDEOGRAPH + {0xE6B9, 0x5A40}, //17900 #CJK UNIFIED IDEOGRAPH + {0xE6BA, 0x5A67}, //17901 #CJK UNIFIED IDEOGRAPH + {0xE6BB, 0x5A4A}, //17902 #CJK UNIFIED IDEOGRAPH + {0xE6BC, 0x5A55}, //17903 #CJK UNIFIED IDEOGRAPH + {0xE6BD, 0x5A3C}, //17904 #CJK UNIFIED IDEOGRAPH + {0xE6BE, 0x5A62}, //17905 #CJK UNIFIED IDEOGRAPH + {0xE6BF, 0x5A75}, //17906 #CJK UNIFIED IDEOGRAPH + {0xE6C0, 0x80EC}, //17907 #CJK UNIFIED IDEOGRAPH + {0xE6C1, 0x5AAA}, //17908 #CJK UNIFIED IDEOGRAPH + {0xE6C2, 0x5A9B}, //17909 #CJK UNIFIED IDEOGRAPH + {0xE6C3, 0x5A77}, //17910 #CJK UNIFIED IDEOGRAPH + {0xE6C4, 0x5A7A}, //17911 #CJK UNIFIED IDEOGRAPH + {0xE6C5, 0x5ABE}, //17912 #CJK UNIFIED IDEOGRAPH + {0xE6C6, 0x5AEB}, //17913 #CJK UNIFIED IDEOGRAPH + {0xE6C7, 0x5AB2}, //17914 #CJK UNIFIED IDEOGRAPH + {0xE6C8, 0x5AD2}, //17915 #CJK UNIFIED IDEOGRAPH + {0xE6C9, 0x5AD4}, //17916 #CJK UNIFIED IDEOGRAPH + {0xE6CA, 0x5AB8}, //17917 #CJK UNIFIED IDEOGRAPH + {0xE6CB, 0x5AE0}, //17918 #CJK UNIFIED IDEOGRAPH + {0xE6CC, 0x5AE3}, //17919 #CJK UNIFIED IDEOGRAPH + {0xE6CD, 0x5AF1}, //17920 #CJK UNIFIED IDEOGRAPH + {0xE6CE, 0x5AD6}, //17921 #CJK UNIFIED IDEOGRAPH + {0xE6CF, 0x5AE6}, //17922 #CJK UNIFIED IDEOGRAPH + {0xE6D0, 0x5AD8}, //17923 #CJK UNIFIED IDEOGRAPH + {0xE6D1, 0x5ADC}, //17924 #CJK UNIFIED IDEOGRAPH + {0xE6D2, 0x5B09}, //17925 #CJK UNIFIED IDEOGRAPH + {0xE6D3, 0x5B17}, //17926 #CJK UNIFIED IDEOGRAPH + {0xE6D4, 0x5B16}, //17927 #CJK UNIFIED IDEOGRAPH + {0xE6D5, 0x5B32}, //17928 #CJK UNIFIED IDEOGRAPH + {0xE6D6, 0x5B37}, //17929 #CJK UNIFIED IDEOGRAPH + {0xE6D7, 0x5B40}, //17930 #CJK UNIFIED IDEOGRAPH + {0xE6D8, 0x5C15}, //17931 #CJK UNIFIED IDEOGRAPH + {0xE6D9, 0x5C1C}, //17932 #CJK UNIFIED IDEOGRAPH + {0xE6DA, 0x5B5A}, //17933 #CJK UNIFIED IDEOGRAPH + {0xE6DB, 0x5B65}, //17934 #CJK UNIFIED IDEOGRAPH + {0xE6DC, 0x5B73}, //17935 #CJK UNIFIED IDEOGRAPH + {0xE6DD, 0x5B51}, //17936 #CJK UNIFIED IDEOGRAPH + {0xE6DE, 0x5B53}, //17937 #CJK UNIFIED IDEOGRAPH + {0xE6DF, 0x5B62}, //17938 #CJK UNIFIED IDEOGRAPH + {0xE6E0, 0x9A75}, //17939 #CJK UNIFIED IDEOGRAPH + {0xE6E1, 0x9A77}, //17940 #CJK UNIFIED IDEOGRAPH + {0xE6E2, 0x9A78}, //17941 #CJK UNIFIED IDEOGRAPH + {0xE6E3, 0x9A7A}, //17942 #CJK UNIFIED IDEOGRAPH + {0xE6E4, 0x9A7F}, //17943 #CJK UNIFIED IDEOGRAPH + {0xE6E5, 0x9A7D}, //17944 #CJK UNIFIED IDEOGRAPH + {0xE6E6, 0x9A80}, //17945 #CJK UNIFIED IDEOGRAPH + {0xE6E7, 0x9A81}, //17946 #CJK UNIFIED IDEOGRAPH + {0xE6E8, 0x9A85}, //17947 #CJK UNIFIED IDEOGRAPH + {0xE6E9, 0x9A88}, //17948 #CJK UNIFIED IDEOGRAPH + {0xE6EA, 0x9A8A}, //17949 #CJK UNIFIED IDEOGRAPH + {0xE6EB, 0x9A90}, //17950 #CJK UNIFIED IDEOGRAPH + {0xE6EC, 0x9A92}, //17951 #CJK UNIFIED IDEOGRAPH + {0xE6ED, 0x9A93}, //17952 #CJK UNIFIED IDEOGRAPH + {0xE6EE, 0x9A96}, //17953 #CJK UNIFIED IDEOGRAPH + {0xE6EF, 0x9A98}, //17954 #CJK UNIFIED IDEOGRAPH + {0xE6F0, 0x9A9B}, //17955 #CJK UNIFIED IDEOGRAPH + {0xE6F1, 0x9A9C}, //17956 #CJK UNIFIED IDEOGRAPH + {0xE6F2, 0x9A9D}, //17957 #CJK UNIFIED IDEOGRAPH + {0xE6F3, 0x9A9F}, //17958 #CJK UNIFIED IDEOGRAPH + {0xE6F4, 0x9AA0}, //17959 #CJK UNIFIED IDEOGRAPH + {0xE6F5, 0x9AA2}, //17960 #CJK UNIFIED IDEOGRAPH + {0xE6F6, 0x9AA3}, //17961 #CJK UNIFIED IDEOGRAPH + {0xE6F7, 0x9AA5}, //17962 #CJK UNIFIED IDEOGRAPH + {0xE6F8, 0x9AA7}, //17963 #CJK UNIFIED IDEOGRAPH + {0xE6F9, 0x7E9F}, //17964 #CJK UNIFIED IDEOGRAPH + {0xE6FA, 0x7EA1}, //17965 #CJK UNIFIED IDEOGRAPH + {0xE6FB, 0x7EA3}, //17966 #CJK UNIFIED IDEOGRAPH + {0xE6FC, 0x7EA5}, //17967 #CJK UNIFIED IDEOGRAPH + {0xE6FD, 0x7EA8}, //17968 #CJK UNIFIED IDEOGRAPH + {0xE6FE, 0x7EA9}, //17969 #CJK UNIFIED IDEOGRAPH + {0xE740, 0x93CE}, //17970 #CJK UNIFIED IDEOGRAPH + {0xE741, 0x93CF}, //17971 #CJK UNIFIED IDEOGRAPH + {0xE742, 0x93D0}, //17972 #CJK UNIFIED IDEOGRAPH + {0xE743, 0x93D1}, //17973 #CJK UNIFIED IDEOGRAPH + {0xE744, 0x93D2}, //17974 #CJK UNIFIED IDEOGRAPH + {0xE745, 0x93D3}, //17975 #CJK UNIFIED IDEOGRAPH + {0xE746, 0x93D4}, //17976 #CJK UNIFIED IDEOGRAPH + {0xE747, 0x93D5}, //17977 #CJK UNIFIED IDEOGRAPH + {0xE748, 0x93D7}, //17978 #CJK UNIFIED IDEOGRAPH + {0xE749, 0x93D8}, //17979 #CJK UNIFIED IDEOGRAPH + {0xE74A, 0x93D9}, //17980 #CJK UNIFIED IDEOGRAPH + {0xE74B, 0x93DA}, //17981 #CJK UNIFIED IDEOGRAPH + {0xE74C, 0x93DB}, //17982 #CJK UNIFIED IDEOGRAPH + {0xE74D, 0x93DC}, //17983 #CJK UNIFIED IDEOGRAPH + {0xE74E, 0x93DD}, //17984 #CJK UNIFIED IDEOGRAPH + {0xE74F, 0x93DE}, //17985 #CJK UNIFIED IDEOGRAPH + {0xE750, 0x93DF}, //17986 #CJK UNIFIED IDEOGRAPH + {0xE751, 0x93E0}, //17987 #CJK UNIFIED IDEOGRAPH + {0xE752, 0x93E1}, //17988 #CJK UNIFIED IDEOGRAPH + {0xE753, 0x93E2}, //17989 #CJK UNIFIED IDEOGRAPH + {0xE754, 0x93E3}, //17990 #CJK UNIFIED IDEOGRAPH + {0xE755, 0x93E4}, //17991 #CJK UNIFIED IDEOGRAPH + {0xE756, 0x93E5}, //17992 #CJK UNIFIED IDEOGRAPH + {0xE757, 0x93E6}, //17993 #CJK UNIFIED IDEOGRAPH + {0xE758, 0x93E7}, //17994 #CJK UNIFIED IDEOGRAPH + {0xE759, 0x93E8}, //17995 #CJK UNIFIED IDEOGRAPH + {0xE75A, 0x93E9}, //17996 #CJK UNIFIED IDEOGRAPH + {0xE75B, 0x93EA}, //17997 #CJK UNIFIED IDEOGRAPH + {0xE75C, 0x93EB}, //17998 #CJK UNIFIED IDEOGRAPH + {0xE75D, 0x93EC}, //17999 #CJK UNIFIED IDEOGRAPH + {0xE75E, 0x93ED}, //18000 #CJK UNIFIED IDEOGRAPH + {0xE75F, 0x93EE}, //18001 #CJK UNIFIED IDEOGRAPH + {0xE760, 0x93EF}, //18002 #CJK UNIFIED IDEOGRAPH + {0xE761, 0x93F0}, //18003 #CJK UNIFIED IDEOGRAPH + {0xE762, 0x93F1}, //18004 #CJK UNIFIED IDEOGRAPH + {0xE763, 0x93F2}, //18005 #CJK UNIFIED IDEOGRAPH + {0xE764, 0x93F3}, //18006 #CJK UNIFIED IDEOGRAPH + {0xE765, 0x93F4}, //18007 #CJK UNIFIED IDEOGRAPH + {0xE766, 0x93F5}, //18008 #CJK UNIFIED IDEOGRAPH + {0xE767, 0x93F6}, //18009 #CJK UNIFIED IDEOGRAPH + {0xE768, 0x93F7}, //18010 #CJK UNIFIED IDEOGRAPH + {0xE769, 0x93F8}, //18011 #CJK UNIFIED IDEOGRAPH + {0xE76A, 0x93F9}, //18012 #CJK UNIFIED IDEOGRAPH + {0xE76B, 0x93FA}, //18013 #CJK UNIFIED IDEOGRAPH + {0xE76C, 0x93FB}, //18014 #CJK UNIFIED IDEOGRAPH + {0xE76D, 0x93FC}, //18015 #CJK UNIFIED IDEOGRAPH + {0xE76E, 0x93FD}, //18016 #CJK UNIFIED IDEOGRAPH + {0xE76F, 0x93FE}, //18017 #CJK UNIFIED IDEOGRAPH + {0xE770, 0x93FF}, //18018 #CJK UNIFIED IDEOGRAPH + {0xE771, 0x9400}, //18019 #CJK UNIFIED IDEOGRAPH + {0xE772, 0x9401}, //18020 #CJK UNIFIED IDEOGRAPH + {0xE773, 0x9402}, //18021 #CJK UNIFIED IDEOGRAPH + {0xE774, 0x9403}, //18022 #CJK UNIFIED IDEOGRAPH + {0xE775, 0x9404}, //18023 #CJK UNIFIED IDEOGRAPH + {0xE776, 0x9405}, //18024 #CJK UNIFIED IDEOGRAPH + {0xE777, 0x9406}, //18025 #CJK UNIFIED IDEOGRAPH + {0xE778, 0x9407}, //18026 #CJK UNIFIED IDEOGRAPH + {0xE779, 0x9408}, //18027 #CJK UNIFIED IDEOGRAPH + {0xE77A, 0x9409}, //18028 #CJK UNIFIED IDEOGRAPH + {0xE77B, 0x940A}, //18029 #CJK UNIFIED IDEOGRAPH + {0xE77C, 0x940B}, //18030 #CJK UNIFIED IDEOGRAPH + {0xE77D, 0x940C}, //18031 #CJK UNIFIED IDEOGRAPH + {0xE77E, 0x940D}, //18032 #CJK UNIFIED IDEOGRAPH + {0xE780, 0x940E}, //18033 #CJK UNIFIED IDEOGRAPH + {0xE781, 0x940F}, //18034 #CJK UNIFIED IDEOGRAPH + {0xE782, 0x9410}, //18035 #CJK UNIFIED IDEOGRAPH + {0xE783, 0x9411}, //18036 #CJK UNIFIED IDEOGRAPH + {0xE784, 0x9412}, //18037 #CJK UNIFIED IDEOGRAPH + {0xE785, 0x9413}, //18038 #CJK UNIFIED IDEOGRAPH + {0xE786, 0x9414}, //18039 #CJK UNIFIED IDEOGRAPH + {0xE787, 0x9415}, //18040 #CJK UNIFIED IDEOGRAPH + {0xE788, 0x9416}, //18041 #CJK UNIFIED IDEOGRAPH + {0xE789, 0x9417}, //18042 #CJK UNIFIED IDEOGRAPH + {0xE78A, 0x9418}, //18043 #CJK UNIFIED IDEOGRAPH + {0xE78B, 0x9419}, //18044 #CJK UNIFIED IDEOGRAPH + {0xE78C, 0x941A}, //18045 #CJK UNIFIED IDEOGRAPH + {0xE78D, 0x941B}, //18046 #CJK UNIFIED IDEOGRAPH + {0xE78E, 0x941C}, //18047 #CJK UNIFIED IDEOGRAPH + {0xE78F, 0x941D}, //18048 #CJK UNIFIED IDEOGRAPH + {0xE790, 0x941E}, //18049 #CJK UNIFIED IDEOGRAPH + {0xE791, 0x941F}, //18050 #CJK UNIFIED IDEOGRAPH + {0xE792, 0x9420}, //18051 #CJK UNIFIED IDEOGRAPH + {0xE793, 0x9421}, //18052 #CJK UNIFIED IDEOGRAPH + {0xE794, 0x9422}, //18053 #CJK UNIFIED IDEOGRAPH + {0xE795, 0x9423}, //18054 #CJK UNIFIED IDEOGRAPH + {0xE796, 0x9424}, //18055 #CJK UNIFIED IDEOGRAPH + {0xE797, 0x9425}, //18056 #CJK UNIFIED IDEOGRAPH + {0xE798, 0x9426}, //18057 #CJK UNIFIED IDEOGRAPH + {0xE799, 0x9427}, //18058 #CJK UNIFIED IDEOGRAPH + {0xE79A, 0x9428}, //18059 #CJK UNIFIED IDEOGRAPH + {0xE79B, 0x9429}, //18060 #CJK UNIFIED IDEOGRAPH + {0xE79C, 0x942A}, //18061 #CJK UNIFIED IDEOGRAPH + {0xE79D, 0x942B}, //18062 #CJK UNIFIED IDEOGRAPH + {0xE79E, 0x942C}, //18063 #CJK UNIFIED IDEOGRAPH + {0xE79F, 0x942D}, //18064 #CJK UNIFIED IDEOGRAPH + {0xE7A0, 0x942E}, //18065 #CJK UNIFIED IDEOGRAPH + {0xE7A1, 0x7EAD}, //18066 #CJK UNIFIED IDEOGRAPH + {0xE7A2, 0x7EB0}, //18067 #CJK UNIFIED IDEOGRAPH + {0xE7A3, 0x7EBE}, //18068 #CJK UNIFIED IDEOGRAPH + {0xE7A4, 0x7EC0}, //18069 #CJK UNIFIED IDEOGRAPH + {0xE7A5, 0x7EC1}, //18070 #CJK UNIFIED IDEOGRAPH + {0xE7A6, 0x7EC2}, //18071 #CJK UNIFIED IDEOGRAPH + {0xE7A7, 0x7EC9}, //18072 #CJK UNIFIED IDEOGRAPH + {0xE7A8, 0x7ECB}, //18073 #CJK UNIFIED IDEOGRAPH + {0xE7A9, 0x7ECC}, //18074 #CJK UNIFIED IDEOGRAPH + {0xE7AA, 0x7ED0}, //18075 #CJK UNIFIED IDEOGRAPH + {0xE7AB, 0x7ED4}, //18076 #CJK UNIFIED IDEOGRAPH + {0xE7AC, 0x7ED7}, //18077 #CJK UNIFIED IDEOGRAPH + {0xE7AD, 0x7EDB}, //18078 #CJK UNIFIED IDEOGRAPH + {0xE7AE, 0x7EE0}, //18079 #CJK UNIFIED IDEOGRAPH + {0xE7AF, 0x7EE1}, //18080 #CJK UNIFIED IDEOGRAPH + {0xE7B0, 0x7EE8}, //18081 #CJK UNIFIED IDEOGRAPH + {0xE7B1, 0x7EEB}, //18082 #CJK UNIFIED IDEOGRAPH + {0xE7B2, 0x7EEE}, //18083 #CJK UNIFIED IDEOGRAPH + {0xE7B3, 0x7EEF}, //18084 #CJK UNIFIED IDEOGRAPH + {0xE7B4, 0x7EF1}, //18085 #CJK UNIFIED IDEOGRAPH + {0xE7B5, 0x7EF2}, //18086 #CJK UNIFIED IDEOGRAPH + {0xE7B6, 0x7F0D}, //18087 #CJK UNIFIED IDEOGRAPH + {0xE7B7, 0x7EF6}, //18088 #CJK UNIFIED IDEOGRAPH + {0xE7B8, 0x7EFA}, //18089 #CJK UNIFIED IDEOGRAPH + {0xE7B9, 0x7EFB}, //18090 #CJK UNIFIED IDEOGRAPH + {0xE7BA, 0x7EFE}, //18091 #CJK UNIFIED IDEOGRAPH + {0xE7BB, 0x7F01}, //18092 #CJK UNIFIED IDEOGRAPH + {0xE7BC, 0x7F02}, //18093 #CJK UNIFIED IDEOGRAPH + {0xE7BD, 0x7F03}, //18094 #CJK UNIFIED IDEOGRAPH + {0xE7BE, 0x7F07}, //18095 #CJK UNIFIED IDEOGRAPH + {0xE7BF, 0x7F08}, //18096 #CJK UNIFIED IDEOGRAPH + {0xE7C0, 0x7F0B}, //18097 #CJK UNIFIED IDEOGRAPH + {0xE7C1, 0x7F0C}, //18098 #CJK UNIFIED IDEOGRAPH + {0xE7C2, 0x7F0F}, //18099 #CJK UNIFIED IDEOGRAPH + {0xE7C3, 0x7F11}, //18100 #CJK UNIFIED IDEOGRAPH + {0xE7C4, 0x7F12}, //18101 #CJK UNIFIED IDEOGRAPH + {0xE7C5, 0x7F17}, //18102 #CJK UNIFIED IDEOGRAPH + {0xE7C6, 0x7F19}, //18103 #CJK UNIFIED IDEOGRAPH + {0xE7C7, 0x7F1C}, //18104 #CJK UNIFIED IDEOGRAPH + {0xE7C8, 0x7F1B}, //18105 #CJK UNIFIED IDEOGRAPH + {0xE7C9, 0x7F1F}, //18106 #CJK UNIFIED IDEOGRAPH + {0xE7CA, 0x7F21}, //18107 #CJK UNIFIED IDEOGRAPH + {0xE7CB, 0x7F22}, //18108 #CJK UNIFIED IDEOGRAPH + {0xE7CC, 0x7F23}, //18109 #CJK UNIFIED IDEOGRAPH + {0xE7CD, 0x7F24}, //18110 #CJK UNIFIED IDEOGRAPH + {0xE7CE, 0x7F25}, //18111 #CJK UNIFIED IDEOGRAPH + {0xE7CF, 0x7F26}, //18112 #CJK UNIFIED IDEOGRAPH + {0xE7D0, 0x7F27}, //18113 #CJK UNIFIED IDEOGRAPH + {0xE7D1, 0x7F2A}, //18114 #CJK UNIFIED IDEOGRAPH + {0xE7D2, 0x7F2B}, //18115 #CJK UNIFIED IDEOGRAPH + {0xE7D3, 0x7F2C}, //18116 #CJK UNIFIED IDEOGRAPH + {0xE7D4, 0x7F2D}, //18117 #CJK UNIFIED IDEOGRAPH + {0xE7D5, 0x7F2F}, //18118 #CJK UNIFIED IDEOGRAPH + {0xE7D6, 0x7F30}, //18119 #CJK UNIFIED IDEOGRAPH + {0xE7D7, 0x7F31}, //18120 #CJK UNIFIED IDEOGRAPH + {0xE7D8, 0x7F32}, //18121 #CJK UNIFIED IDEOGRAPH + {0xE7D9, 0x7F33}, //18122 #CJK UNIFIED IDEOGRAPH + {0xE7DA, 0x7F35}, //18123 #CJK UNIFIED IDEOGRAPH + {0xE7DB, 0x5E7A}, //18124 #CJK UNIFIED IDEOGRAPH + {0xE7DC, 0x757F}, //18125 #CJK UNIFIED IDEOGRAPH + {0xE7DD, 0x5DDB}, //18126 #CJK UNIFIED IDEOGRAPH + {0xE7DE, 0x753E}, //18127 #CJK UNIFIED IDEOGRAPH + {0xE7DF, 0x9095}, //18128 #CJK UNIFIED IDEOGRAPH + {0xE7E0, 0x738E}, //18129 #CJK UNIFIED IDEOGRAPH + {0xE7E1, 0x7391}, //18130 #CJK UNIFIED IDEOGRAPH + {0xE7E2, 0x73AE}, //18131 #CJK UNIFIED IDEOGRAPH + {0xE7E3, 0x73A2}, //18132 #CJK UNIFIED IDEOGRAPH + {0xE7E4, 0x739F}, //18133 #CJK UNIFIED IDEOGRAPH + {0xE7E5, 0x73CF}, //18134 #CJK UNIFIED IDEOGRAPH + {0xE7E6, 0x73C2}, //18135 #CJK UNIFIED IDEOGRAPH + {0xE7E7, 0x73D1}, //18136 #CJK UNIFIED IDEOGRAPH + {0xE7E8, 0x73B7}, //18137 #CJK UNIFIED IDEOGRAPH + {0xE7E9, 0x73B3}, //18138 #CJK UNIFIED IDEOGRAPH + {0xE7EA, 0x73C0}, //18139 #CJK UNIFIED IDEOGRAPH + {0xE7EB, 0x73C9}, //18140 #CJK UNIFIED IDEOGRAPH + {0xE7EC, 0x73C8}, //18141 #CJK UNIFIED IDEOGRAPH + {0xE7ED, 0x73E5}, //18142 #CJK UNIFIED IDEOGRAPH + {0xE7EE, 0x73D9}, //18143 #CJK UNIFIED IDEOGRAPH + {0xE7EF, 0x987C}, //18144 #CJK UNIFIED IDEOGRAPH + {0xE7F0, 0x740A}, //18145 #CJK UNIFIED IDEOGRAPH + {0xE7F1, 0x73E9}, //18146 #CJK UNIFIED IDEOGRAPH + {0xE7F2, 0x73E7}, //18147 #CJK UNIFIED IDEOGRAPH + {0xE7F3, 0x73DE}, //18148 #CJK UNIFIED IDEOGRAPH + {0xE7F4, 0x73BA}, //18149 #CJK UNIFIED IDEOGRAPH + {0xE7F5, 0x73F2}, //18150 #CJK UNIFIED IDEOGRAPH + {0xE7F6, 0x740F}, //18151 #CJK UNIFIED IDEOGRAPH + {0xE7F7, 0x742A}, //18152 #CJK UNIFIED IDEOGRAPH + {0xE7F8, 0x745B}, //18153 #CJK UNIFIED IDEOGRAPH + {0xE7F9, 0x7426}, //18154 #CJK UNIFIED IDEOGRAPH + {0xE7FA, 0x7425}, //18155 #CJK UNIFIED IDEOGRAPH + {0xE7FB, 0x7428}, //18156 #CJK UNIFIED IDEOGRAPH + {0xE7FC, 0x7430}, //18157 #CJK UNIFIED IDEOGRAPH + {0xE7FD, 0x742E}, //18158 #CJK UNIFIED IDEOGRAPH + {0xE7FE, 0x742C}, //18159 #CJK UNIFIED IDEOGRAPH + {0xE840, 0x942F}, //18160 #CJK UNIFIED IDEOGRAPH + {0xE841, 0x9430}, //18161 #CJK UNIFIED IDEOGRAPH + {0xE842, 0x9431}, //18162 #CJK UNIFIED IDEOGRAPH + {0xE843, 0x9432}, //18163 #CJK UNIFIED IDEOGRAPH + {0xE844, 0x9433}, //18164 #CJK UNIFIED IDEOGRAPH + {0xE845, 0x9434}, //18165 #CJK UNIFIED IDEOGRAPH + {0xE846, 0x9435}, //18166 #CJK UNIFIED IDEOGRAPH + {0xE847, 0x9436}, //18167 #CJK UNIFIED IDEOGRAPH + {0xE848, 0x9437}, //18168 #CJK UNIFIED IDEOGRAPH + {0xE849, 0x9438}, //18169 #CJK UNIFIED IDEOGRAPH + {0xE84A, 0x9439}, //18170 #CJK UNIFIED IDEOGRAPH + {0xE84B, 0x943A}, //18171 #CJK UNIFIED IDEOGRAPH + {0xE84C, 0x943B}, //18172 #CJK UNIFIED IDEOGRAPH + {0xE84D, 0x943C}, //18173 #CJK UNIFIED IDEOGRAPH + {0xE84E, 0x943D}, //18174 #CJK UNIFIED IDEOGRAPH + {0xE84F, 0x943F}, //18175 #CJK UNIFIED IDEOGRAPH + {0xE850, 0x9440}, //18176 #CJK UNIFIED IDEOGRAPH + {0xE851, 0x9441}, //18177 #CJK UNIFIED IDEOGRAPH + {0xE852, 0x9442}, //18178 #CJK UNIFIED IDEOGRAPH + {0xE853, 0x9443}, //18179 #CJK UNIFIED IDEOGRAPH + {0xE854, 0x9444}, //18180 #CJK UNIFIED IDEOGRAPH + {0xE855, 0x9445}, //18181 #CJK UNIFIED IDEOGRAPH + {0xE856, 0x9446}, //18182 #CJK UNIFIED IDEOGRAPH + {0xE857, 0x9447}, //18183 #CJK UNIFIED IDEOGRAPH + {0xE858, 0x9448}, //18184 #CJK UNIFIED IDEOGRAPH + {0xE859, 0x9449}, //18185 #CJK UNIFIED IDEOGRAPH + {0xE85A, 0x944A}, //18186 #CJK UNIFIED IDEOGRAPH + {0xE85B, 0x944B}, //18187 #CJK UNIFIED IDEOGRAPH + {0xE85C, 0x944C}, //18188 #CJK UNIFIED IDEOGRAPH + {0xE85D, 0x944D}, //18189 #CJK UNIFIED IDEOGRAPH + {0xE85E, 0x944E}, //18190 #CJK UNIFIED IDEOGRAPH + {0xE85F, 0x944F}, //18191 #CJK UNIFIED IDEOGRAPH + {0xE860, 0x9450}, //18192 #CJK UNIFIED IDEOGRAPH + {0xE861, 0x9451}, //18193 #CJK UNIFIED IDEOGRAPH + {0xE862, 0x9452}, //18194 #CJK UNIFIED IDEOGRAPH + {0xE863, 0x9453}, //18195 #CJK UNIFIED IDEOGRAPH + {0xE864, 0x9454}, //18196 #CJK UNIFIED IDEOGRAPH + {0xE865, 0x9455}, //18197 #CJK UNIFIED IDEOGRAPH + {0xE866, 0x9456}, //18198 #CJK UNIFIED IDEOGRAPH + {0xE867, 0x9457}, //18199 #CJK UNIFIED IDEOGRAPH + {0xE868, 0x9458}, //18200 #CJK UNIFIED IDEOGRAPH + {0xE869, 0x9459}, //18201 #CJK UNIFIED IDEOGRAPH + {0xE86A, 0x945A}, //18202 #CJK UNIFIED IDEOGRAPH + {0xE86B, 0x945B}, //18203 #CJK UNIFIED IDEOGRAPH + {0xE86C, 0x945C}, //18204 #CJK UNIFIED IDEOGRAPH + {0xE86D, 0x945D}, //18205 #CJK UNIFIED IDEOGRAPH + {0xE86E, 0x945E}, //18206 #CJK UNIFIED IDEOGRAPH + {0xE86F, 0x945F}, //18207 #CJK UNIFIED IDEOGRAPH + {0xE870, 0x9460}, //18208 #CJK UNIFIED IDEOGRAPH + {0xE871, 0x9461}, //18209 #CJK UNIFIED IDEOGRAPH + {0xE872, 0x9462}, //18210 #CJK UNIFIED IDEOGRAPH + {0xE873, 0x9463}, //18211 #CJK UNIFIED IDEOGRAPH + {0xE874, 0x9464}, //18212 #CJK UNIFIED IDEOGRAPH + {0xE875, 0x9465}, //18213 #CJK UNIFIED IDEOGRAPH + {0xE876, 0x9466}, //18214 #CJK UNIFIED IDEOGRAPH + {0xE877, 0x9467}, //18215 #CJK UNIFIED IDEOGRAPH + {0xE878, 0x9468}, //18216 #CJK UNIFIED IDEOGRAPH + {0xE879, 0x9469}, //18217 #CJK UNIFIED IDEOGRAPH + {0xE87A, 0x946A}, //18218 #CJK UNIFIED IDEOGRAPH + {0xE87B, 0x946C}, //18219 #CJK UNIFIED IDEOGRAPH + {0xE87C, 0x946D}, //18220 #CJK UNIFIED IDEOGRAPH + {0xE87D, 0x946E}, //18221 #CJK UNIFIED IDEOGRAPH + {0xE87E, 0x946F}, //18222 #CJK UNIFIED IDEOGRAPH + {0xE880, 0x9470}, //18223 #CJK UNIFIED IDEOGRAPH + {0xE881, 0x9471}, //18224 #CJK UNIFIED IDEOGRAPH + {0xE882, 0x9472}, //18225 #CJK UNIFIED IDEOGRAPH + {0xE883, 0x9473}, //18226 #CJK UNIFIED IDEOGRAPH + {0xE884, 0x9474}, //18227 #CJK UNIFIED IDEOGRAPH + {0xE885, 0x9475}, //18228 #CJK UNIFIED IDEOGRAPH + {0xE886, 0x9476}, //18229 #CJK UNIFIED IDEOGRAPH + {0xE887, 0x9477}, //18230 #CJK UNIFIED IDEOGRAPH + {0xE888, 0x9478}, //18231 #CJK UNIFIED IDEOGRAPH + {0xE889, 0x9479}, //18232 #CJK UNIFIED IDEOGRAPH + {0xE88A, 0x947A}, //18233 #CJK UNIFIED IDEOGRAPH + {0xE88B, 0x947B}, //18234 #CJK UNIFIED IDEOGRAPH + {0xE88C, 0x947C}, //18235 #CJK UNIFIED IDEOGRAPH + {0xE88D, 0x947D}, //18236 #CJK UNIFIED IDEOGRAPH + {0xE88E, 0x947E}, //18237 #CJK UNIFIED IDEOGRAPH + {0xE88F, 0x947F}, //18238 #CJK UNIFIED IDEOGRAPH + {0xE890, 0x9480}, //18239 #CJK UNIFIED IDEOGRAPH + {0xE891, 0x9481}, //18240 #CJK UNIFIED IDEOGRAPH + {0xE892, 0x9482}, //18241 #CJK UNIFIED IDEOGRAPH + {0xE893, 0x9483}, //18242 #CJK UNIFIED IDEOGRAPH + {0xE894, 0x9484}, //18243 #CJK UNIFIED IDEOGRAPH + {0xE895, 0x9491}, //18244 #CJK UNIFIED IDEOGRAPH + {0xE896, 0x9496}, //18245 #CJK UNIFIED IDEOGRAPH + {0xE897, 0x9498}, //18246 #CJK UNIFIED IDEOGRAPH + {0xE898, 0x94C7}, //18247 #CJK UNIFIED IDEOGRAPH + {0xE899, 0x94CF}, //18248 #CJK UNIFIED IDEOGRAPH + {0xE89A, 0x94D3}, //18249 #CJK UNIFIED IDEOGRAPH + {0xE89B, 0x94D4}, //18250 #CJK UNIFIED IDEOGRAPH + {0xE89C, 0x94DA}, //18251 #CJK UNIFIED IDEOGRAPH + {0xE89D, 0x94E6}, //18252 #CJK UNIFIED IDEOGRAPH + {0xE89E, 0x94FB}, //18253 #CJK UNIFIED IDEOGRAPH + {0xE89F, 0x951C}, //18254 #CJK UNIFIED IDEOGRAPH + {0xE8A0, 0x9520}, //18255 #CJK UNIFIED IDEOGRAPH + {0xE8A1, 0x741B}, //18256 #CJK UNIFIED IDEOGRAPH + {0xE8A2, 0x741A}, //18257 #CJK UNIFIED IDEOGRAPH + {0xE8A3, 0x7441}, //18258 #CJK UNIFIED IDEOGRAPH + {0xE8A4, 0x745C}, //18259 #CJK UNIFIED IDEOGRAPH + {0xE8A5, 0x7457}, //18260 #CJK UNIFIED IDEOGRAPH + {0xE8A6, 0x7455}, //18261 #CJK UNIFIED IDEOGRAPH + {0xE8A7, 0x7459}, //18262 #CJK UNIFIED IDEOGRAPH + {0xE8A8, 0x7477}, //18263 #CJK UNIFIED IDEOGRAPH + {0xE8A9, 0x746D}, //18264 #CJK UNIFIED IDEOGRAPH + {0xE8AA, 0x747E}, //18265 #CJK UNIFIED IDEOGRAPH + {0xE8AB, 0x749C}, //18266 #CJK UNIFIED IDEOGRAPH + {0xE8AC, 0x748E}, //18267 #CJK UNIFIED IDEOGRAPH + {0xE8AD, 0x7480}, //18268 #CJK UNIFIED IDEOGRAPH + {0xE8AE, 0x7481}, //18269 #CJK UNIFIED IDEOGRAPH + {0xE8AF, 0x7487}, //18270 #CJK UNIFIED IDEOGRAPH + {0xE8B0, 0x748B}, //18271 #CJK UNIFIED IDEOGRAPH + {0xE8B1, 0x749E}, //18272 #CJK UNIFIED IDEOGRAPH + {0xE8B2, 0x74A8}, //18273 #CJK UNIFIED IDEOGRAPH + {0xE8B3, 0x74A9}, //18274 #CJK UNIFIED IDEOGRAPH + {0xE8B4, 0x7490}, //18275 #CJK UNIFIED IDEOGRAPH + {0xE8B5, 0x74A7}, //18276 #CJK UNIFIED IDEOGRAPH + {0xE8B6, 0x74D2}, //18277 #CJK UNIFIED IDEOGRAPH + {0xE8B7, 0x74BA}, //18278 #CJK UNIFIED IDEOGRAPH + {0xE8B8, 0x97EA}, //18279 #CJK UNIFIED IDEOGRAPH + {0xE8B9, 0x97EB}, //18280 #CJK UNIFIED IDEOGRAPH + {0xE8BA, 0x97EC}, //18281 #CJK UNIFIED IDEOGRAPH + {0xE8BB, 0x674C}, //18282 #CJK UNIFIED IDEOGRAPH + {0xE8BC, 0x6753}, //18283 #CJK UNIFIED IDEOGRAPH + {0xE8BD, 0x675E}, //18284 #CJK UNIFIED IDEOGRAPH + {0xE8BE, 0x6748}, //18285 #CJK UNIFIED IDEOGRAPH + {0xE8BF, 0x6769}, //18286 #CJK UNIFIED IDEOGRAPH + {0xE8C0, 0x67A5}, //18287 #CJK UNIFIED IDEOGRAPH + {0xE8C1, 0x6787}, //18288 #CJK UNIFIED IDEOGRAPH + {0xE8C2, 0x676A}, //18289 #CJK UNIFIED IDEOGRAPH + {0xE8C3, 0x6773}, //18290 #CJK UNIFIED IDEOGRAPH + {0xE8C4, 0x6798}, //18291 #CJK UNIFIED IDEOGRAPH + {0xE8C5, 0x67A7}, //18292 #CJK UNIFIED IDEOGRAPH + {0xE8C6, 0x6775}, //18293 #CJK UNIFIED IDEOGRAPH + {0xE8C7, 0x67A8}, //18294 #CJK UNIFIED IDEOGRAPH + {0xE8C8, 0x679E}, //18295 #CJK UNIFIED IDEOGRAPH + {0xE8C9, 0x67AD}, //18296 #CJK UNIFIED IDEOGRAPH + {0xE8CA, 0x678B}, //18297 #CJK UNIFIED IDEOGRAPH + {0xE8CB, 0x6777}, //18298 #CJK UNIFIED IDEOGRAPH + {0xE8CC, 0x677C}, //18299 #CJK UNIFIED IDEOGRAPH + {0xE8CD, 0x67F0}, //18300 #CJK UNIFIED IDEOGRAPH + {0xE8CE, 0x6809}, //18301 #CJK UNIFIED IDEOGRAPH + {0xE8CF, 0x67D8}, //18302 #CJK UNIFIED IDEOGRAPH + {0xE8D0, 0x680A}, //18303 #CJK UNIFIED IDEOGRAPH + {0xE8D1, 0x67E9}, //18304 #CJK UNIFIED IDEOGRAPH + {0xE8D2, 0x67B0}, //18305 #CJK UNIFIED IDEOGRAPH + {0xE8D3, 0x680C}, //18306 #CJK UNIFIED IDEOGRAPH + {0xE8D4, 0x67D9}, //18307 #CJK UNIFIED IDEOGRAPH + {0xE8D5, 0x67B5}, //18308 #CJK UNIFIED IDEOGRAPH + {0xE8D6, 0x67DA}, //18309 #CJK UNIFIED IDEOGRAPH + {0xE8D7, 0x67B3}, //18310 #CJK UNIFIED IDEOGRAPH + {0xE8D8, 0x67DD}, //18311 #CJK UNIFIED IDEOGRAPH + {0xE8D9, 0x6800}, //18312 #CJK UNIFIED IDEOGRAPH + {0xE8DA, 0x67C3}, //18313 #CJK UNIFIED IDEOGRAPH + {0xE8DB, 0x67B8}, //18314 #CJK UNIFIED IDEOGRAPH + {0xE8DC, 0x67E2}, //18315 #CJK UNIFIED IDEOGRAPH + {0xE8DD, 0x680E}, //18316 #CJK UNIFIED IDEOGRAPH + {0xE8DE, 0x67C1}, //18317 #CJK UNIFIED IDEOGRAPH + {0xE8DF, 0x67FD}, //18318 #CJK UNIFIED IDEOGRAPH + {0xE8E0, 0x6832}, //18319 #CJK UNIFIED IDEOGRAPH + {0xE8E1, 0x6833}, //18320 #CJK UNIFIED IDEOGRAPH + {0xE8E2, 0x6860}, //18321 #CJK UNIFIED IDEOGRAPH + {0xE8E3, 0x6861}, //18322 #CJK UNIFIED IDEOGRAPH + {0xE8E4, 0x684E}, //18323 #CJK UNIFIED IDEOGRAPH + {0xE8E5, 0x6862}, //18324 #CJK UNIFIED IDEOGRAPH + {0xE8E6, 0x6844}, //18325 #CJK UNIFIED IDEOGRAPH + {0xE8E7, 0x6864}, //18326 #CJK UNIFIED IDEOGRAPH + {0xE8E8, 0x6883}, //18327 #CJK UNIFIED IDEOGRAPH + {0xE8E9, 0x681D}, //18328 #CJK UNIFIED IDEOGRAPH + {0xE8EA, 0x6855}, //18329 #CJK UNIFIED IDEOGRAPH + {0xE8EB, 0x6866}, //18330 #CJK UNIFIED IDEOGRAPH + {0xE8EC, 0x6841}, //18331 #CJK UNIFIED IDEOGRAPH + {0xE8ED, 0x6867}, //18332 #CJK UNIFIED IDEOGRAPH + {0xE8EE, 0x6840}, //18333 #CJK UNIFIED IDEOGRAPH + {0xE8EF, 0x683E}, //18334 #CJK UNIFIED IDEOGRAPH + {0xE8F0, 0x684A}, //18335 #CJK UNIFIED IDEOGRAPH + {0xE8F1, 0x6849}, //18336 #CJK UNIFIED IDEOGRAPH + {0xE8F2, 0x6829}, //18337 #CJK UNIFIED IDEOGRAPH + {0xE8F3, 0x68B5}, //18338 #CJK UNIFIED IDEOGRAPH + {0xE8F4, 0x688F}, //18339 #CJK UNIFIED IDEOGRAPH + {0xE8F5, 0x6874}, //18340 #CJK UNIFIED IDEOGRAPH + {0xE8F6, 0x6877}, //18341 #CJK UNIFIED IDEOGRAPH + {0xE8F7, 0x6893}, //18342 #CJK UNIFIED IDEOGRAPH + {0xE8F8, 0x686B}, //18343 #CJK UNIFIED IDEOGRAPH + {0xE8F9, 0x68C2}, //18344 #CJK UNIFIED IDEOGRAPH + {0xE8FA, 0x696E}, //18345 #CJK UNIFIED IDEOGRAPH + {0xE8FB, 0x68FC}, //18346 #CJK UNIFIED IDEOGRAPH + {0xE8FC, 0x691F}, //18347 #CJK UNIFIED IDEOGRAPH + {0xE8FD, 0x6920}, //18348 #CJK UNIFIED IDEOGRAPH + {0xE8FE, 0x68F9}, //18349 #CJK UNIFIED IDEOGRAPH + {0xE940, 0x9527}, //18350 #CJK UNIFIED IDEOGRAPH + {0xE941, 0x9533}, //18351 #CJK UNIFIED IDEOGRAPH + {0xE942, 0x953D}, //18352 #CJK UNIFIED IDEOGRAPH + {0xE943, 0x9543}, //18353 #CJK UNIFIED IDEOGRAPH + {0xE944, 0x9548}, //18354 #CJK UNIFIED IDEOGRAPH + {0xE945, 0x954B}, //18355 #CJK UNIFIED IDEOGRAPH + {0xE946, 0x9555}, //18356 #CJK UNIFIED IDEOGRAPH + {0xE947, 0x955A}, //18357 #CJK UNIFIED IDEOGRAPH + {0xE948, 0x9560}, //18358 #CJK UNIFIED IDEOGRAPH + {0xE949, 0x956E}, //18359 #CJK UNIFIED IDEOGRAPH + {0xE94A, 0x9574}, //18360 #CJK UNIFIED IDEOGRAPH + {0xE94B, 0x9575}, //18361 #CJK UNIFIED IDEOGRAPH + {0xE94C, 0x9577}, //18362 #CJK UNIFIED IDEOGRAPH + {0xE94D, 0x9578}, //18363 #CJK UNIFIED IDEOGRAPH + {0xE94E, 0x9579}, //18364 #CJK UNIFIED IDEOGRAPH + {0xE94F, 0x957A}, //18365 #CJK UNIFIED IDEOGRAPH + {0xE950, 0x957B}, //18366 #CJK UNIFIED IDEOGRAPH + {0xE951, 0x957C}, //18367 #CJK UNIFIED IDEOGRAPH + {0xE952, 0x957D}, //18368 #CJK UNIFIED IDEOGRAPH + {0xE953, 0x957E}, //18369 #CJK UNIFIED IDEOGRAPH + {0xE954, 0x9580}, //18370 #CJK UNIFIED IDEOGRAPH + {0xE955, 0x9581}, //18371 #CJK UNIFIED IDEOGRAPH + {0xE956, 0x9582}, //18372 #CJK UNIFIED IDEOGRAPH + {0xE957, 0x9583}, //18373 #CJK UNIFIED IDEOGRAPH + {0xE958, 0x9584}, //18374 #CJK UNIFIED IDEOGRAPH + {0xE959, 0x9585}, //18375 #CJK UNIFIED IDEOGRAPH + {0xE95A, 0x9586}, //18376 #CJK UNIFIED IDEOGRAPH + {0xE95B, 0x9587}, //18377 #CJK UNIFIED IDEOGRAPH + {0xE95C, 0x9588}, //18378 #CJK UNIFIED IDEOGRAPH + {0xE95D, 0x9589}, //18379 #CJK UNIFIED IDEOGRAPH + {0xE95E, 0x958A}, //18380 #CJK UNIFIED IDEOGRAPH + {0xE95F, 0x958B}, //18381 #CJK UNIFIED IDEOGRAPH + {0xE960, 0x958C}, //18382 #CJK UNIFIED IDEOGRAPH + {0xE961, 0x958D}, //18383 #CJK UNIFIED IDEOGRAPH + {0xE962, 0x958E}, //18384 #CJK UNIFIED IDEOGRAPH + {0xE963, 0x958F}, //18385 #CJK UNIFIED IDEOGRAPH + {0xE964, 0x9590}, //18386 #CJK UNIFIED IDEOGRAPH + {0xE965, 0x9591}, //18387 #CJK UNIFIED IDEOGRAPH + {0xE966, 0x9592}, //18388 #CJK UNIFIED IDEOGRAPH + {0xE967, 0x9593}, //18389 #CJK UNIFIED IDEOGRAPH + {0xE968, 0x9594}, //18390 #CJK UNIFIED IDEOGRAPH + {0xE969, 0x9595}, //18391 #CJK UNIFIED IDEOGRAPH + {0xE96A, 0x9596}, //18392 #CJK UNIFIED IDEOGRAPH + {0xE96B, 0x9597}, //18393 #CJK UNIFIED IDEOGRAPH + {0xE96C, 0x9598}, //18394 #CJK UNIFIED IDEOGRAPH + {0xE96D, 0x9599}, //18395 #CJK UNIFIED IDEOGRAPH + {0xE96E, 0x959A}, //18396 #CJK UNIFIED IDEOGRAPH + {0xE96F, 0x959B}, //18397 #CJK UNIFIED IDEOGRAPH + {0xE970, 0x959C}, //18398 #CJK UNIFIED IDEOGRAPH + {0xE971, 0x959D}, //18399 #CJK UNIFIED IDEOGRAPH + {0xE972, 0x959E}, //18400 #CJK UNIFIED IDEOGRAPH + {0xE973, 0x959F}, //18401 #CJK UNIFIED IDEOGRAPH + {0xE974, 0x95A0}, //18402 #CJK UNIFIED IDEOGRAPH + {0xE975, 0x95A1}, //18403 #CJK UNIFIED IDEOGRAPH + {0xE976, 0x95A2}, //18404 #CJK UNIFIED IDEOGRAPH + {0xE977, 0x95A3}, //18405 #CJK UNIFIED IDEOGRAPH + {0xE978, 0x95A4}, //18406 #CJK UNIFIED IDEOGRAPH + {0xE979, 0x95A5}, //18407 #CJK UNIFIED IDEOGRAPH + {0xE97A, 0x95A6}, //18408 #CJK UNIFIED IDEOGRAPH + {0xE97B, 0x95A7}, //18409 #CJK UNIFIED IDEOGRAPH + {0xE97C, 0x95A8}, //18410 #CJK UNIFIED IDEOGRAPH + {0xE97D, 0x95A9}, //18411 #CJK UNIFIED IDEOGRAPH + {0xE97E, 0x95AA}, //18412 #CJK UNIFIED IDEOGRAPH + {0xE980, 0x95AB}, //18413 #CJK UNIFIED IDEOGRAPH + {0xE981, 0x95AC}, //18414 #CJK UNIFIED IDEOGRAPH + {0xE982, 0x95AD}, //18415 #CJK UNIFIED IDEOGRAPH + {0xE983, 0x95AE}, //18416 #CJK UNIFIED IDEOGRAPH + {0xE984, 0x95AF}, //18417 #CJK UNIFIED IDEOGRAPH + {0xE985, 0x95B0}, //18418 #CJK UNIFIED IDEOGRAPH + {0xE986, 0x95B1}, //18419 #CJK UNIFIED IDEOGRAPH + {0xE987, 0x95B2}, //18420 #CJK UNIFIED IDEOGRAPH + {0xE988, 0x95B3}, //18421 #CJK UNIFIED IDEOGRAPH + {0xE989, 0x95B4}, //18422 #CJK UNIFIED IDEOGRAPH + {0xE98A, 0x95B5}, //18423 #CJK UNIFIED IDEOGRAPH + {0xE98B, 0x95B6}, //18424 #CJK UNIFIED IDEOGRAPH + {0xE98C, 0x95B7}, //18425 #CJK UNIFIED IDEOGRAPH + {0xE98D, 0x95B8}, //18426 #CJK UNIFIED IDEOGRAPH + {0xE98E, 0x95B9}, //18427 #CJK UNIFIED IDEOGRAPH + {0xE98F, 0x95BA}, //18428 #CJK UNIFIED IDEOGRAPH + {0xE990, 0x95BB}, //18429 #CJK UNIFIED IDEOGRAPH + {0xE991, 0x95BC}, //18430 #CJK UNIFIED IDEOGRAPH + {0xE992, 0x95BD}, //18431 #CJK UNIFIED IDEOGRAPH + {0xE993, 0x95BE}, //18432 #CJK UNIFIED IDEOGRAPH + {0xE994, 0x95BF}, //18433 #CJK UNIFIED IDEOGRAPH + {0xE995, 0x95C0}, //18434 #CJK UNIFIED IDEOGRAPH + {0xE996, 0x95C1}, //18435 #CJK UNIFIED IDEOGRAPH + {0xE997, 0x95C2}, //18436 #CJK UNIFIED IDEOGRAPH + {0xE998, 0x95C3}, //18437 #CJK UNIFIED IDEOGRAPH + {0xE999, 0x95C4}, //18438 #CJK UNIFIED IDEOGRAPH + {0xE99A, 0x95C5}, //18439 #CJK UNIFIED IDEOGRAPH + {0xE99B, 0x95C6}, //18440 #CJK UNIFIED IDEOGRAPH + {0xE99C, 0x95C7}, //18441 #CJK UNIFIED IDEOGRAPH + {0xE99D, 0x95C8}, //18442 #CJK UNIFIED IDEOGRAPH + {0xE99E, 0x95C9}, //18443 #CJK UNIFIED IDEOGRAPH + {0xE99F, 0x95CA}, //18444 #CJK UNIFIED IDEOGRAPH + {0xE9A0, 0x95CB}, //18445 #CJK UNIFIED IDEOGRAPH + {0xE9A1, 0x6924}, //18446 #CJK UNIFIED IDEOGRAPH + {0xE9A2, 0x68F0}, //18447 #CJK UNIFIED IDEOGRAPH + {0xE9A3, 0x690B}, //18448 #CJK UNIFIED IDEOGRAPH + {0xE9A4, 0x6901}, //18449 #CJK UNIFIED IDEOGRAPH + {0xE9A5, 0x6957}, //18450 #CJK UNIFIED IDEOGRAPH + {0xE9A6, 0x68E3}, //18451 #CJK UNIFIED IDEOGRAPH + {0xE9A7, 0x6910}, //18452 #CJK UNIFIED IDEOGRAPH + {0xE9A8, 0x6971}, //18453 #CJK UNIFIED IDEOGRAPH + {0xE9A9, 0x6939}, //18454 #CJK UNIFIED IDEOGRAPH + {0xE9AA, 0x6960}, //18455 #CJK UNIFIED IDEOGRAPH + {0xE9AB, 0x6942}, //18456 #CJK UNIFIED IDEOGRAPH + {0xE9AC, 0x695D}, //18457 #CJK UNIFIED IDEOGRAPH + {0xE9AD, 0x6984}, //18458 #CJK UNIFIED IDEOGRAPH + {0xE9AE, 0x696B}, //18459 #CJK UNIFIED IDEOGRAPH + {0xE9AF, 0x6980}, //18460 #CJK UNIFIED IDEOGRAPH + {0xE9B0, 0x6998}, //18461 #CJK UNIFIED IDEOGRAPH + {0xE9B1, 0x6978}, //18462 #CJK UNIFIED IDEOGRAPH + {0xE9B2, 0x6934}, //18463 #CJK UNIFIED IDEOGRAPH + {0xE9B3, 0x69CC}, //18464 #CJK UNIFIED IDEOGRAPH + {0xE9B4, 0x6987}, //18465 #CJK UNIFIED IDEOGRAPH + {0xE9B5, 0x6988}, //18466 #CJK UNIFIED IDEOGRAPH + {0xE9B6, 0x69CE}, //18467 #CJK UNIFIED IDEOGRAPH + {0xE9B7, 0x6989}, //18468 #CJK UNIFIED IDEOGRAPH + {0xE9B8, 0x6966}, //18469 #CJK UNIFIED IDEOGRAPH + {0xE9B9, 0x6963}, //18470 #CJK UNIFIED IDEOGRAPH + {0xE9BA, 0x6979}, //18471 #CJK UNIFIED IDEOGRAPH + {0xE9BB, 0x699B}, //18472 #CJK UNIFIED IDEOGRAPH + {0xE9BC, 0x69A7}, //18473 #CJK UNIFIED IDEOGRAPH + {0xE9BD, 0x69BB}, //18474 #CJK UNIFIED IDEOGRAPH + {0xE9BE, 0x69AB}, //18475 #CJK UNIFIED IDEOGRAPH + {0xE9BF, 0x69AD}, //18476 #CJK UNIFIED IDEOGRAPH + {0xE9C0, 0x69D4}, //18477 #CJK UNIFIED IDEOGRAPH + {0xE9C1, 0x69B1}, //18478 #CJK UNIFIED IDEOGRAPH + {0xE9C2, 0x69C1}, //18479 #CJK UNIFIED IDEOGRAPH + {0xE9C3, 0x69CA}, //18480 #CJK UNIFIED IDEOGRAPH + {0xE9C4, 0x69DF}, //18481 #CJK UNIFIED IDEOGRAPH + {0xE9C5, 0x6995}, //18482 #CJK UNIFIED IDEOGRAPH + {0xE9C6, 0x69E0}, //18483 #CJK UNIFIED IDEOGRAPH + {0xE9C7, 0x698D}, //18484 #CJK UNIFIED IDEOGRAPH + {0xE9C8, 0x69FF}, //18485 #CJK UNIFIED IDEOGRAPH + {0xE9C9, 0x6A2F}, //18486 #CJK UNIFIED IDEOGRAPH + {0xE9CA, 0x69ED}, //18487 #CJK UNIFIED IDEOGRAPH + {0xE9CB, 0x6A17}, //18488 #CJK UNIFIED IDEOGRAPH + {0xE9CC, 0x6A18}, //18489 #CJK UNIFIED IDEOGRAPH + {0xE9CD, 0x6A65}, //18490 #CJK UNIFIED IDEOGRAPH + {0xE9CE, 0x69F2}, //18491 #CJK UNIFIED IDEOGRAPH + {0xE9CF, 0x6A44}, //18492 #CJK UNIFIED IDEOGRAPH + {0xE9D0, 0x6A3E}, //18493 #CJK UNIFIED IDEOGRAPH + {0xE9D1, 0x6AA0}, //18494 #CJK UNIFIED IDEOGRAPH + {0xE9D2, 0x6A50}, //18495 #CJK UNIFIED IDEOGRAPH + {0xE9D3, 0x6A5B}, //18496 #CJK UNIFIED IDEOGRAPH + {0xE9D4, 0x6A35}, //18497 #CJK UNIFIED IDEOGRAPH + {0xE9D5, 0x6A8E}, //18498 #CJK UNIFIED IDEOGRAPH + {0xE9D6, 0x6A79}, //18499 #CJK UNIFIED IDEOGRAPH + {0xE9D7, 0x6A3D}, //18500 #CJK UNIFIED IDEOGRAPH + {0xE9D8, 0x6A28}, //18501 #CJK UNIFIED IDEOGRAPH + {0xE9D9, 0x6A58}, //18502 #CJK UNIFIED IDEOGRAPH + {0xE9DA, 0x6A7C}, //18503 #CJK UNIFIED IDEOGRAPH + {0xE9DB, 0x6A91}, //18504 #CJK UNIFIED IDEOGRAPH + {0xE9DC, 0x6A90}, //18505 #CJK UNIFIED IDEOGRAPH + {0xE9DD, 0x6AA9}, //18506 #CJK UNIFIED IDEOGRAPH + {0xE9DE, 0x6A97}, //18507 #CJK UNIFIED IDEOGRAPH + {0xE9DF, 0x6AAB}, //18508 #CJK UNIFIED IDEOGRAPH + {0xE9E0, 0x7337}, //18509 #CJK UNIFIED IDEOGRAPH + {0xE9E1, 0x7352}, //18510 #CJK UNIFIED IDEOGRAPH + {0xE9E2, 0x6B81}, //18511 #CJK UNIFIED IDEOGRAPH + {0xE9E3, 0x6B82}, //18512 #CJK UNIFIED IDEOGRAPH + {0xE9E4, 0x6B87}, //18513 #CJK UNIFIED IDEOGRAPH + {0xE9E5, 0x6B84}, //18514 #CJK UNIFIED IDEOGRAPH + {0xE9E6, 0x6B92}, //18515 #CJK UNIFIED IDEOGRAPH + {0xE9E7, 0x6B93}, //18516 #CJK UNIFIED IDEOGRAPH + {0xE9E8, 0x6B8D}, //18517 #CJK UNIFIED IDEOGRAPH + {0xE9E9, 0x6B9A}, //18518 #CJK UNIFIED IDEOGRAPH + {0xE9EA, 0x6B9B}, //18519 #CJK UNIFIED IDEOGRAPH + {0xE9EB, 0x6BA1}, //18520 #CJK UNIFIED IDEOGRAPH + {0xE9EC, 0x6BAA}, //18521 #CJK UNIFIED IDEOGRAPH + {0xE9ED, 0x8F6B}, //18522 #CJK UNIFIED IDEOGRAPH + {0xE9EE, 0x8F6D}, //18523 #CJK UNIFIED IDEOGRAPH + {0xE9EF, 0x8F71}, //18524 #CJK UNIFIED IDEOGRAPH + {0xE9F0, 0x8F72}, //18525 #CJK UNIFIED IDEOGRAPH + {0xE9F1, 0x8F73}, //18526 #CJK UNIFIED IDEOGRAPH + {0xE9F2, 0x8F75}, //18527 #CJK UNIFIED IDEOGRAPH + {0xE9F3, 0x8F76}, //18528 #CJK UNIFIED IDEOGRAPH + {0xE9F4, 0x8F78}, //18529 #CJK UNIFIED IDEOGRAPH + {0xE9F5, 0x8F77}, //18530 #CJK UNIFIED IDEOGRAPH + {0xE9F6, 0x8F79}, //18531 #CJK UNIFIED IDEOGRAPH + {0xE9F7, 0x8F7A}, //18532 #CJK UNIFIED IDEOGRAPH + {0xE9F8, 0x8F7C}, //18533 #CJK UNIFIED IDEOGRAPH + {0xE9F9, 0x8F7E}, //18534 #CJK UNIFIED IDEOGRAPH + {0xE9FA, 0x8F81}, //18535 #CJK UNIFIED IDEOGRAPH + {0xE9FB, 0x8F82}, //18536 #CJK UNIFIED IDEOGRAPH + {0xE9FC, 0x8F84}, //18537 #CJK UNIFIED IDEOGRAPH + {0xE9FD, 0x8F87}, //18538 #CJK UNIFIED IDEOGRAPH + {0xE9FE, 0x8F8B}, //18539 #CJK UNIFIED IDEOGRAPH + {0xEA40, 0x95CC}, //18540 #CJK UNIFIED IDEOGRAPH + {0xEA41, 0x95CD}, //18541 #CJK UNIFIED IDEOGRAPH + {0xEA42, 0x95CE}, //18542 #CJK UNIFIED IDEOGRAPH + {0xEA43, 0x95CF}, //18543 #CJK UNIFIED IDEOGRAPH + {0xEA44, 0x95D0}, //18544 #CJK UNIFIED IDEOGRAPH + {0xEA45, 0x95D1}, //18545 #CJK UNIFIED IDEOGRAPH + {0xEA46, 0x95D2}, //18546 #CJK UNIFIED IDEOGRAPH + {0xEA47, 0x95D3}, //18547 #CJK UNIFIED IDEOGRAPH + {0xEA48, 0x95D4}, //18548 #CJK UNIFIED IDEOGRAPH + {0xEA49, 0x95D5}, //18549 #CJK UNIFIED IDEOGRAPH + {0xEA4A, 0x95D6}, //18550 #CJK UNIFIED IDEOGRAPH + {0xEA4B, 0x95D7}, //18551 #CJK UNIFIED IDEOGRAPH + {0xEA4C, 0x95D8}, //18552 #CJK UNIFIED IDEOGRAPH + {0xEA4D, 0x95D9}, //18553 #CJK UNIFIED IDEOGRAPH + {0xEA4E, 0x95DA}, //18554 #CJK UNIFIED IDEOGRAPH + {0xEA4F, 0x95DB}, //18555 #CJK UNIFIED IDEOGRAPH + {0xEA50, 0x95DC}, //18556 #CJK UNIFIED IDEOGRAPH + {0xEA51, 0x95DD}, //18557 #CJK UNIFIED IDEOGRAPH + {0xEA52, 0x95DE}, //18558 #CJK UNIFIED IDEOGRAPH + {0xEA53, 0x95DF}, //18559 #CJK UNIFIED IDEOGRAPH + {0xEA54, 0x95E0}, //18560 #CJK UNIFIED IDEOGRAPH + {0xEA55, 0x95E1}, //18561 #CJK UNIFIED IDEOGRAPH + {0xEA56, 0x95E2}, //18562 #CJK UNIFIED IDEOGRAPH + {0xEA57, 0x95E3}, //18563 #CJK UNIFIED IDEOGRAPH + {0xEA58, 0x95E4}, //18564 #CJK UNIFIED IDEOGRAPH + {0xEA59, 0x95E5}, //18565 #CJK UNIFIED IDEOGRAPH + {0xEA5A, 0x95E6}, //18566 #CJK UNIFIED IDEOGRAPH + {0xEA5B, 0x95E7}, //18567 #CJK UNIFIED IDEOGRAPH + {0xEA5C, 0x95EC}, //18568 #CJK UNIFIED IDEOGRAPH + {0xEA5D, 0x95FF}, //18569 #CJK UNIFIED IDEOGRAPH + {0xEA5E, 0x9607}, //18570 #CJK UNIFIED IDEOGRAPH + {0xEA5F, 0x9613}, //18571 #CJK UNIFIED IDEOGRAPH + {0xEA60, 0x9618}, //18572 #CJK UNIFIED IDEOGRAPH + {0xEA61, 0x961B}, //18573 #CJK UNIFIED IDEOGRAPH + {0xEA62, 0x961E}, //18574 #CJK UNIFIED IDEOGRAPH + {0xEA63, 0x9620}, //18575 #CJK UNIFIED IDEOGRAPH + {0xEA64, 0x9623}, //18576 #CJK UNIFIED IDEOGRAPH + {0xEA65, 0x9624}, //18577 #CJK UNIFIED IDEOGRAPH + {0xEA66, 0x9625}, //18578 #CJK UNIFIED IDEOGRAPH + {0xEA67, 0x9626}, //18579 #CJK UNIFIED IDEOGRAPH + {0xEA68, 0x9627}, //18580 #CJK UNIFIED IDEOGRAPH + {0xEA69, 0x9628}, //18581 #CJK UNIFIED IDEOGRAPH + {0xEA6A, 0x9629}, //18582 #CJK UNIFIED IDEOGRAPH + {0xEA6B, 0x962B}, //18583 #CJK UNIFIED IDEOGRAPH + {0xEA6C, 0x962C}, //18584 #CJK UNIFIED IDEOGRAPH + {0xEA6D, 0x962D}, //18585 #CJK UNIFIED IDEOGRAPH + {0xEA6E, 0x962F}, //18586 #CJK UNIFIED IDEOGRAPH + {0xEA6F, 0x9630}, //18587 #CJK UNIFIED IDEOGRAPH + {0xEA70, 0x9637}, //18588 #CJK UNIFIED IDEOGRAPH + {0xEA71, 0x9638}, //18589 #CJK UNIFIED IDEOGRAPH + {0xEA72, 0x9639}, //18590 #CJK UNIFIED IDEOGRAPH + {0xEA73, 0x963A}, //18591 #CJK UNIFIED IDEOGRAPH + {0xEA74, 0x963E}, //18592 #CJK UNIFIED IDEOGRAPH + {0xEA75, 0x9641}, //18593 #CJK UNIFIED IDEOGRAPH + {0xEA76, 0x9643}, //18594 #CJK UNIFIED IDEOGRAPH + {0xEA77, 0x964A}, //18595 #CJK UNIFIED IDEOGRAPH + {0xEA78, 0x964E}, //18596 #CJK UNIFIED IDEOGRAPH + {0xEA79, 0x964F}, //18597 #CJK UNIFIED IDEOGRAPH + {0xEA7A, 0x9651}, //18598 #CJK UNIFIED IDEOGRAPH + {0xEA7B, 0x9652}, //18599 #CJK UNIFIED IDEOGRAPH + {0xEA7C, 0x9653}, //18600 #CJK UNIFIED IDEOGRAPH + {0xEA7D, 0x9656}, //18601 #CJK UNIFIED IDEOGRAPH + {0xEA7E, 0x9657}, //18602 #CJK UNIFIED IDEOGRAPH + {0xEA80, 0x9658}, //18603 #CJK UNIFIED IDEOGRAPH + {0xEA81, 0x9659}, //18604 #CJK UNIFIED IDEOGRAPH + {0xEA82, 0x965A}, //18605 #CJK UNIFIED IDEOGRAPH + {0xEA83, 0x965C}, //18606 #CJK UNIFIED IDEOGRAPH + {0xEA84, 0x965D}, //18607 #CJK UNIFIED IDEOGRAPH + {0xEA85, 0x965E}, //18608 #CJK UNIFIED IDEOGRAPH + {0xEA86, 0x9660}, //18609 #CJK UNIFIED IDEOGRAPH + {0xEA87, 0x9663}, //18610 #CJK UNIFIED IDEOGRAPH + {0xEA88, 0x9665}, //18611 #CJK UNIFIED IDEOGRAPH + {0xEA89, 0x9666}, //18612 #CJK UNIFIED IDEOGRAPH + {0xEA8A, 0x966B}, //18613 #CJK UNIFIED IDEOGRAPH + {0xEA8B, 0x966D}, //18614 #CJK UNIFIED IDEOGRAPH + {0xEA8C, 0x966E}, //18615 #CJK UNIFIED IDEOGRAPH + {0xEA8D, 0x966F}, //18616 #CJK UNIFIED IDEOGRAPH + {0xEA8E, 0x9670}, //18617 #CJK UNIFIED IDEOGRAPH + {0xEA8F, 0x9671}, //18618 #CJK UNIFIED IDEOGRAPH + {0xEA90, 0x9673}, //18619 #CJK UNIFIED IDEOGRAPH + {0xEA91, 0x9678}, //18620 #CJK UNIFIED IDEOGRAPH + {0xEA92, 0x9679}, //18621 #CJK UNIFIED IDEOGRAPH + {0xEA93, 0x967A}, //18622 #CJK UNIFIED IDEOGRAPH + {0xEA94, 0x967B}, //18623 #CJK UNIFIED IDEOGRAPH + {0xEA95, 0x967C}, //18624 #CJK UNIFIED IDEOGRAPH + {0xEA96, 0x967D}, //18625 #CJK UNIFIED IDEOGRAPH + {0xEA97, 0x967E}, //18626 #CJK UNIFIED IDEOGRAPH + {0xEA98, 0x967F}, //18627 #CJK UNIFIED IDEOGRAPH + {0xEA99, 0x9680}, //18628 #CJK UNIFIED IDEOGRAPH + {0xEA9A, 0x9681}, //18629 #CJK UNIFIED IDEOGRAPH + {0xEA9B, 0x9682}, //18630 #CJK UNIFIED IDEOGRAPH + {0xEA9C, 0x9683}, //18631 #CJK UNIFIED IDEOGRAPH + {0xEA9D, 0x9684}, //18632 #CJK UNIFIED IDEOGRAPH + {0xEA9E, 0x9687}, //18633 #CJK UNIFIED IDEOGRAPH + {0xEA9F, 0x9689}, //18634 #CJK UNIFIED IDEOGRAPH + {0xEAA0, 0x968A}, //18635 #CJK UNIFIED IDEOGRAPH + {0xEAA1, 0x8F8D}, //18636 #CJK UNIFIED IDEOGRAPH + {0xEAA2, 0x8F8E}, //18637 #CJK UNIFIED IDEOGRAPH + {0xEAA3, 0x8F8F}, //18638 #CJK UNIFIED IDEOGRAPH + {0xEAA4, 0x8F98}, //18639 #CJK UNIFIED IDEOGRAPH + {0xEAA5, 0x8F9A}, //18640 #CJK UNIFIED IDEOGRAPH + {0xEAA6, 0x8ECE}, //18641 #CJK UNIFIED IDEOGRAPH + {0xEAA7, 0x620B}, //18642 #CJK UNIFIED IDEOGRAPH + {0xEAA8, 0x6217}, //18643 #CJK UNIFIED IDEOGRAPH + {0xEAA9, 0x621B}, //18644 #CJK UNIFIED IDEOGRAPH + {0xEAAA, 0x621F}, //18645 #CJK UNIFIED IDEOGRAPH + {0xEAAB, 0x6222}, //18646 #CJK UNIFIED IDEOGRAPH + {0xEAAC, 0x6221}, //18647 #CJK UNIFIED IDEOGRAPH + {0xEAAD, 0x6225}, //18648 #CJK UNIFIED IDEOGRAPH + {0xEAAE, 0x6224}, //18649 #CJK UNIFIED IDEOGRAPH + {0xEAAF, 0x622C}, //18650 #CJK UNIFIED IDEOGRAPH + {0xEAB0, 0x81E7}, //18651 #CJK UNIFIED IDEOGRAPH + {0xEAB1, 0x74EF}, //18652 #CJK UNIFIED IDEOGRAPH + {0xEAB2, 0x74F4}, //18653 #CJK UNIFIED IDEOGRAPH + {0xEAB3, 0x74FF}, //18654 #CJK UNIFIED IDEOGRAPH + {0xEAB4, 0x750F}, //18655 #CJK UNIFIED IDEOGRAPH + {0xEAB5, 0x7511}, //18656 #CJK UNIFIED IDEOGRAPH + {0xEAB6, 0x7513}, //18657 #CJK UNIFIED IDEOGRAPH + {0xEAB7, 0x6534}, //18658 #CJK UNIFIED IDEOGRAPH + {0xEAB8, 0x65EE}, //18659 #CJK UNIFIED IDEOGRAPH + {0xEAB9, 0x65EF}, //18660 #CJK UNIFIED IDEOGRAPH + {0xEABA, 0x65F0}, //18661 #CJK UNIFIED IDEOGRAPH + {0xEABB, 0x660A}, //18662 #CJK UNIFIED IDEOGRAPH + {0xEABC, 0x6619}, //18663 #CJK UNIFIED IDEOGRAPH + {0xEABD, 0x6772}, //18664 #CJK UNIFIED IDEOGRAPH + {0xEABE, 0x6603}, //18665 #CJK UNIFIED IDEOGRAPH + {0xEABF, 0x6615}, //18666 #CJK UNIFIED IDEOGRAPH + {0xEAC0, 0x6600}, //18667 #CJK UNIFIED IDEOGRAPH + {0xEAC1, 0x7085}, //18668 #CJK UNIFIED IDEOGRAPH + {0xEAC2, 0x66F7}, //18669 #CJK UNIFIED IDEOGRAPH + {0xEAC3, 0x661D}, //18670 #CJK UNIFIED IDEOGRAPH + {0xEAC4, 0x6634}, //18671 #CJK UNIFIED IDEOGRAPH + {0xEAC5, 0x6631}, //18672 #CJK UNIFIED IDEOGRAPH + {0xEAC6, 0x6636}, //18673 #CJK UNIFIED IDEOGRAPH + {0xEAC7, 0x6635}, //18674 #CJK UNIFIED IDEOGRAPH + {0xEAC8, 0x8006}, //18675 #CJK UNIFIED IDEOGRAPH + {0xEAC9, 0x665F}, //18676 #CJK UNIFIED IDEOGRAPH + {0xEACA, 0x6654}, //18677 #CJK UNIFIED IDEOGRAPH + {0xEACB, 0x6641}, //18678 #CJK UNIFIED IDEOGRAPH + {0xEACC, 0x664F}, //18679 #CJK UNIFIED IDEOGRAPH + {0xEACD, 0x6656}, //18680 #CJK UNIFIED IDEOGRAPH + {0xEACE, 0x6661}, //18681 #CJK UNIFIED IDEOGRAPH + {0xEACF, 0x6657}, //18682 #CJK UNIFIED IDEOGRAPH + {0xEAD0, 0x6677}, //18683 #CJK UNIFIED IDEOGRAPH + {0xEAD1, 0x6684}, //18684 #CJK UNIFIED IDEOGRAPH + {0xEAD2, 0x668C}, //18685 #CJK UNIFIED IDEOGRAPH + {0xEAD3, 0x66A7}, //18686 #CJK UNIFIED IDEOGRAPH + {0xEAD4, 0x669D}, //18687 #CJK UNIFIED IDEOGRAPH + {0xEAD5, 0x66BE}, //18688 #CJK UNIFIED IDEOGRAPH + {0xEAD6, 0x66DB}, //18689 #CJK UNIFIED IDEOGRAPH + {0xEAD7, 0x66DC}, //18690 #CJK UNIFIED IDEOGRAPH + {0xEAD8, 0x66E6}, //18691 #CJK UNIFIED IDEOGRAPH + {0xEAD9, 0x66E9}, //18692 #CJK UNIFIED IDEOGRAPH + {0xEADA, 0x8D32}, //18693 #CJK UNIFIED IDEOGRAPH + {0xEADB, 0x8D33}, //18694 #CJK UNIFIED IDEOGRAPH + {0xEADC, 0x8D36}, //18695 #CJK UNIFIED IDEOGRAPH + {0xEADD, 0x8D3B}, //18696 #CJK UNIFIED IDEOGRAPH + {0xEADE, 0x8D3D}, //18697 #CJK UNIFIED IDEOGRAPH + {0xEADF, 0x8D40}, //18698 #CJK UNIFIED IDEOGRAPH + {0xEAE0, 0x8D45}, //18699 #CJK UNIFIED IDEOGRAPH + {0xEAE1, 0x8D46}, //18700 #CJK UNIFIED IDEOGRAPH + {0xEAE2, 0x8D48}, //18701 #CJK UNIFIED IDEOGRAPH + {0xEAE3, 0x8D49}, //18702 #CJK UNIFIED IDEOGRAPH + {0xEAE4, 0x8D47}, //18703 #CJK UNIFIED IDEOGRAPH + {0xEAE5, 0x8D4D}, //18704 #CJK UNIFIED IDEOGRAPH + {0xEAE6, 0x8D55}, //18705 #CJK UNIFIED IDEOGRAPH + {0xEAE7, 0x8D59}, //18706 #CJK UNIFIED IDEOGRAPH + {0xEAE8, 0x89C7}, //18707 #CJK UNIFIED IDEOGRAPH + {0xEAE9, 0x89CA}, //18708 #CJK UNIFIED IDEOGRAPH + {0xEAEA, 0x89CB}, //18709 #CJK UNIFIED IDEOGRAPH + {0xEAEB, 0x89CC}, //18710 #CJK UNIFIED IDEOGRAPH + {0xEAEC, 0x89CE}, //18711 #CJK UNIFIED IDEOGRAPH + {0xEAED, 0x89CF}, //18712 #CJK UNIFIED IDEOGRAPH + {0xEAEE, 0x89D0}, //18713 #CJK UNIFIED IDEOGRAPH + {0xEAEF, 0x89D1}, //18714 #CJK UNIFIED IDEOGRAPH + {0xEAF0, 0x726E}, //18715 #CJK UNIFIED IDEOGRAPH + {0xEAF1, 0x729F}, //18716 #CJK UNIFIED IDEOGRAPH + {0xEAF2, 0x725D}, //18717 #CJK UNIFIED IDEOGRAPH + {0xEAF3, 0x7266}, //18718 #CJK UNIFIED IDEOGRAPH + {0xEAF4, 0x726F}, //18719 #CJK UNIFIED IDEOGRAPH + {0xEAF5, 0x727E}, //18720 #CJK UNIFIED IDEOGRAPH + {0xEAF6, 0x727F}, //18721 #CJK UNIFIED IDEOGRAPH + {0xEAF7, 0x7284}, //18722 #CJK UNIFIED IDEOGRAPH + {0xEAF8, 0x728B}, //18723 #CJK UNIFIED IDEOGRAPH + {0xEAF9, 0x728D}, //18724 #CJK UNIFIED IDEOGRAPH + {0xEAFA, 0x728F}, //18725 #CJK UNIFIED IDEOGRAPH + {0xEAFB, 0x7292}, //18726 #CJK UNIFIED IDEOGRAPH + {0xEAFC, 0x6308}, //18727 #CJK UNIFIED IDEOGRAPH + {0xEAFD, 0x6332}, //18728 #CJK UNIFIED IDEOGRAPH + {0xEAFE, 0x63B0}, //18729 #CJK UNIFIED IDEOGRAPH + {0xEB40, 0x968C}, //18730 #CJK UNIFIED IDEOGRAPH + {0xEB41, 0x968E}, //18731 #CJK UNIFIED IDEOGRAPH + {0xEB42, 0x9691}, //18732 #CJK UNIFIED IDEOGRAPH + {0xEB43, 0x9692}, //18733 #CJK UNIFIED IDEOGRAPH + {0xEB44, 0x9693}, //18734 #CJK UNIFIED IDEOGRAPH + {0xEB45, 0x9695}, //18735 #CJK UNIFIED IDEOGRAPH + {0xEB46, 0x9696}, //18736 #CJK UNIFIED IDEOGRAPH + {0xEB47, 0x969A}, //18737 #CJK UNIFIED IDEOGRAPH + {0xEB48, 0x969B}, //18738 #CJK UNIFIED IDEOGRAPH + {0xEB49, 0x969D}, //18739 #CJK UNIFIED IDEOGRAPH + {0xEB4A, 0x969E}, //18740 #CJK UNIFIED IDEOGRAPH + {0xEB4B, 0x969F}, //18741 #CJK UNIFIED IDEOGRAPH + {0xEB4C, 0x96A0}, //18742 #CJK UNIFIED IDEOGRAPH + {0xEB4D, 0x96A1}, //18743 #CJK UNIFIED IDEOGRAPH + {0xEB4E, 0x96A2}, //18744 #CJK UNIFIED IDEOGRAPH + {0xEB4F, 0x96A3}, //18745 #CJK UNIFIED IDEOGRAPH + {0xEB50, 0x96A4}, //18746 #CJK UNIFIED IDEOGRAPH + {0xEB51, 0x96A5}, //18747 #CJK UNIFIED IDEOGRAPH + {0xEB52, 0x96A6}, //18748 #CJK UNIFIED IDEOGRAPH + {0xEB53, 0x96A8}, //18749 #CJK UNIFIED IDEOGRAPH + {0xEB54, 0x96A9}, //18750 #CJK UNIFIED IDEOGRAPH + {0xEB55, 0x96AA}, //18751 #CJK UNIFIED IDEOGRAPH + {0xEB56, 0x96AB}, //18752 #CJK UNIFIED IDEOGRAPH + {0xEB57, 0x96AC}, //18753 #CJK UNIFIED IDEOGRAPH + {0xEB58, 0x96AD}, //18754 #CJK UNIFIED IDEOGRAPH + {0xEB59, 0x96AE}, //18755 #CJK UNIFIED IDEOGRAPH + {0xEB5A, 0x96AF}, //18756 #CJK UNIFIED IDEOGRAPH + {0xEB5B, 0x96B1}, //18757 #CJK UNIFIED IDEOGRAPH + {0xEB5C, 0x96B2}, //18758 #CJK UNIFIED IDEOGRAPH + {0xEB5D, 0x96B4}, //18759 #CJK UNIFIED IDEOGRAPH + {0xEB5E, 0x96B5}, //18760 #CJK UNIFIED IDEOGRAPH + {0xEB5F, 0x96B7}, //18761 #CJK UNIFIED IDEOGRAPH + {0xEB60, 0x96B8}, //18762 #CJK UNIFIED IDEOGRAPH + {0xEB61, 0x96BA}, //18763 #CJK UNIFIED IDEOGRAPH + {0xEB62, 0x96BB}, //18764 #CJK UNIFIED IDEOGRAPH + {0xEB63, 0x96BF}, //18765 #CJK UNIFIED IDEOGRAPH + {0xEB64, 0x96C2}, //18766 #CJK UNIFIED IDEOGRAPH + {0xEB65, 0x96C3}, //18767 #CJK UNIFIED IDEOGRAPH + {0xEB66, 0x96C8}, //18768 #CJK UNIFIED IDEOGRAPH + {0xEB67, 0x96CA}, //18769 #CJK UNIFIED IDEOGRAPH + {0xEB68, 0x96CB}, //18770 #CJK UNIFIED IDEOGRAPH + {0xEB69, 0x96D0}, //18771 #CJK UNIFIED IDEOGRAPH + {0xEB6A, 0x96D1}, //18772 #CJK UNIFIED IDEOGRAPH + {0xEB6B, 0x96D3}, //18773 #CJK UNIFIED IDEOGRAPH + {0xEB6C, 0x96D4}, //18774 #CJK UNIFIED IDEOGRAPH + {0xEB6D, 0x96D6}, //18775 #CJK UNIFIED IDEOGRAPH + {0xEB6E, 0x96D7}, //18776 #CJK UNIFIED IDEOGRAPH + {0xEB6F, 0x96D8}, //18777 #CJK UNIFIED IDEOGRAPH + {0xEB70, 0x96D9}, //18778 #CJK UNIFIED IDEOGRAPH + {0xEB71, 0x96DA}, //18779 #CJK UNIFIED IDEOGRAPH + {0xEB72, 0x96DB}, //18780 #CJK UNIFIED IDEOGRAPH + {0xEB73, 0x96DC}, //18781 #CJK UNIFIED IDEOGRAPH + {0xEB74, 0x96DD}, //18782 #CJK UNIFIED IDEOGRAPH + {0xEB75, 0x96DE}, //18783 #CJK UNIFIED IDEOGRAPH + {0xEB76, 0x96DF}, //18784 #CJK UNIFIED IDEOGRAPH + {0xEB77, 0x96E1}, //18785 #CJK UNIFIED IDEOGRAPH + {0xEB78, 0x96E2}, //18786 #CJK UNIFIED IDEOGRAPH + {0xEB79, 0x96E3}, //18787 #CJK UNIFIED IDEOGRAPH + {0xEB7A, 0x96E4}, //18788 #CJK UNIFIED IDEOGRAPH + {0xEB7B, 0x96E5}, //18789 #CJK UNIFIED IDEOGRAPH + {0xEB7C, 0x96E6}, //18790 #CJK UNIFIED IDEOGRAPH + {0xEB7D, 0x96E7}, //18791 #CJK UNIFIED IDEOGRAPH + {0xEB7E, 0x96EB}, //18792 #CJK UNIFIED IDEOGRAPH + {0xEB80, 0x96EC}, //18793 #CJK UNIFIED IDEOGRAPH + {0xEB81, 0x96ED}, //18794 #CJK UNIFIED IDEOGRAPH + {0xEB82, 0x96EE}, //18795 #CJK UNIFIED IDEOGRAPH + {0xEB83, 0x96F0}, //18796 #CJK UNIFIED IDEOGRAPH + {0xEB84, 0x96F1}, //18797 #CJK UNIFIED IDEOGRAPH + {0xEB85, 0x96F2}, //18798 #CJK UNIFIED IDEOGRAPH + {0xEB86, 0x96F4}, //18799 #CJK UNIFIED IDEOGRAPH + {0xEB87, 0x96F5}, //18800 #CJK UNIFIED IDEOGRAPH + {0xEB88, 0x96F8}, //18801 #CJK UNIFIED IDEOGRAPH + {0xEB89, 0x96FA}, //18802 #CJK UNIFIED IDEOGRAPH + {0xEB8A, 0x96FB}, //18803 #CJK UNIFIED IDEOGRAPH + {0xEB8B, 0x96FC}, //18804 #CJK UNIFIED IDEOGRAPH + {0xEB8C, 0x96FD}, //18805 #CJK UNIFIED IDEOGRAPH + {0xEB8D, 0x96FF}, //18806 #CJK UNIFIED IDEOGRAPH + {0xEB8E, 0x9702}, //18807 #CJK UNIFIED IDEOGRAPH + {0xEB8F, 0x9703}, //18808 #CJK UNIFIED IDEOGRAPH + {0xEB90, 0x9705}, //18809 #CJK UNIFIED IDEOGRAPH + {0xEB91, 0x970A}, //18810 #CJK UNIFIED IDEOGRAPH + {0xEB92, 0x970B}, //18811 #CJK UNIFIED IDEOGRAPH + {0xEB93, 0x970C}, //18812 #CJK UNIFIED IDEOGRAPH + {0xEB94, 0x9710}, //18813 #CJK UNIFIED IDEOGRAPH + {0xEB95, 0x9711}, //18814 #CJK UNIFIED IDEOGRAPH + {0xEB96, 0x9712}, //18815 #CJK UNIFIED IDEOGRAPH + {0xEB97, 0x9714}, //18816 #CJK UNIFIED IDEOGRAPH + {0xEB98, 0x9715}, //18817 #CJK UNIFIED IDEOGRAPH + {0xEB99, 0x9717}, //18818 #CJK UNIFIED IDEOGRAPH + {0xEB9A, 0x9718}, //18819 #CJK UNIFIED IDEOGRAPH + {0xEB9B, 0x9719}, //18820 #CJK UNIFIED IDEOGRAPH + {0xEB9C, 0x971A}, //18821 #CJK UNIFIED IDEOGRAPH + {0xEB9D, 0x971B}, //18822 #CJK UNIFIED IDEOGRAPH + {0xEB9E, 0x971D}, //18823 #CJK UNIFIED IDEOGRAPH + {0xEB9F, 0x971F}, //18824 #CJK UNIFIED IDEOGRAPH + {0xEBA0, 0x9720}, //18825 #CJK UNIFIED IDEOGRAPH + {0xEBA1, 0x643F}, //18826 #CJK UNIFIED IDEOGRAPH + {0xEBA2, 0x64D8}, //18827 #CJK UNIFIED IDEOGRAPH + {0xEBA3, 0x8004}, //18828 #CJK UNIFIED IDEOGRAPH + {0xEBA4, 0x6BEA}, //18829 #CJK UNIFIED IDEOGRAPH + {0xEBA5, 0x6BF3}, //18830 #CJK UNIFIED IDEOGRAPH + {0xEBA6, 0x6BFD}, //18831 #CJK UNIFIED IDEOGRAPH + {0xEBA7, 0x6BF5}, //18832 #CJK UNIFIED IDEOGRAPH + {0xEBA8, 0x6BF9}, //18833 #CJK UNIFIED IDEOGRAPH + {0xEBA9, 0x6C05}, //18834 #CJK UNIFIED IDEOGRAPH + {0xEBAA, 0x6C07}, //18835 #CJK UNIFIED IDEOGRAPH + {0xEBAB, 0x6C06}, //18836 #CJK UNIFIED IDEOGRAPH + {0xEBAC, 0x6C0D}, //18837 #CJK UNIFIED IDEOGRAPH + {0xEBAD, 0x6C15}, //18838 #CJK UNIFIED IDEOGRAPH + {0xEBAE, 0x6C18}, //18839 #CJK UNIFIED IDEOGRAPH + {0xEBAF, 0x6C19}, //18840 #CJK UNIFIED IDEOGRAPH + {0xEBB0, 0x6C1A}, //18841 #CJK UNIFIED IDEOGRAPH + {0xEBB1, 0x6C21}, //18842 #CJK UNIFIED IDEOGRAPH + {0xEBB2, 0x6C29}, //18843 #CJK UNIFIED IDEOGRAPH + {0xEBB3, 0x6C24}, //18844 #CJK UNIFIED IDEOGRAPH + {0xEBB4, 0x6C2A}, //18845 #CJK UNIFIED IDEOGRAPH + {0xEBB5, 0x6C32}, //18846 #CJK UNIFIED IDEOGRAPH + {0xEBB6, 0x6535}, //18847 #CJK UNIFIED IDEOGRAPH + {0xEBB7, 0x6555}, //18848 #CJK UNIFIED IDEOGRAPH + {0xEBB8, 0x656B}, //18849 #CJK UNIFIED IDEOGRAPH + {0xEBB9, 0x724D}, //18850 #CJK UNIFIED IDEOGRAPH + {0xEBBA, 0x7252}, //18851 #CJK UNIFIED IDEOGRAPH + {0xEBBB, 0x7256}, //18852 #CJK UNIFIED IDEOGRAPH + {0xEBBC, 0x7230}, //18853 #CJK UNIFIED IDEOGRAPH + {0xEBBD, 0x8662}, //18854 #CJK UNIFIED IDEOGRAPH + {0xEBBE, 0x5216}, //18855 #CJK UNIFIED IDEOGRAPH + {0xEBBF, 0x809F}, //18856 #CJK UNIFIED IDEOGRAPH + {0xEBC0, 0x809C}, //18857 #CJK UNIFIED IDEOGRAPH + {0xEBC1, 0x8093}, //18858 #CJK UNIFIED IDEOGRAPH + {0xEBC2, 0x80BC}, //18859 #CJK UNIFIED IDEOGRAPH + {0xEBC3, 0x670A}, //18860 #CJK UNIFIED IDEOGRAPH + {0xEBC4, 0x80BD}, //18861 #CJK UNIFIED IDEOGRAPH + {0xEBC5, 0x80B1}, //18862 #CJK UNIFIED IDEOGRAPH + {0xEBC6, 0x80AB}, //18863 #CJK UNIFIED IDEOGRAPH + {0xEBC7, 0x80AD}, //18864 #CJK UNIFIED IDEOGRAPH + {0xEBC8, 0x80B4}, //18865 #CJK UNIFIED IDEOGRAPH + {0xEBC9, 0x80B7}, //18866 #CJK UNIFIED IDEOGRAPH + {0xEBCA, 0x80E7}, //18867 #CJK UNIFIED IDEOGRAPH + {0xEBCB, 0x80E8}, //18868 #CJK UNIFIED IDEOGRAPH + {0xEBCC, 0x80E9}, //18869 #CJK UNIFIED IDEOGRAPH + {0xEBCD, 0x80EA}, //18870 #CJK UNIFIED IDEOGRAPH + {0xEBCE, 0x80DB}, //18871 #CJK UNIFIED IDEOGRAPH + {0xEBCF, 0x80C2}, //18872 #CJK UNIFIED IDEOGRAPH + {0xEBD0, 0x80C4}, //18873 #CJK UNIFIED IDEOGRAPH + {0xEBD1, 0x80D9}, //18874 #CJK UNIFIED IDEOGRAPH + {0xEBD2, 0x80CD}, //18875 #CJK UNIFIED IDEOGRAPH + {0xEBD3, 0x80D7}, //18876 #CJK UNIFIED IDEOGRAPH + {0xEBD4, 0x6710}, //18877 #CJK UNIFIED IDEOGRAPH + {0xEBD5, 0x80DD}, //18878 #CJK UNIFIED IDEOGRAPH + {0xEBD6, 0x80EB}, //18879 #CJK UNIFIED IDEOGRAPH + {0xEBD7, 0x80F1}, //18880 #CJK UNIFIED IDEOGRAPH + {0xEBD8, 0x80F4}, //18881 #CJK UNIFIED IDEOGRAPH + {0xEBD9, 0x80ED}, //18882 #CJK UNIFIED IDEOGRAPH + {0xEBDA, 0x810D}, //18883 #CJK UNIFIED IDEOGRAPH + {0xEBDB, 0x810E}, //18884 #CJK UNIFIED IDEOGRAPH + {0xEBDC, 0x80F2}, //18885 #CJK UNIFIED IDEOGRAPH + {0xEBDD, 0x80FC}, //18886 #CJK UNIFIED IDEOGRAPH + {0xEBDE, 0x6715}, //18887 #CJK UNIFIED IDEOGRAPH + {0xEBDF, 0x8112}, //18888 #CJK UNIFIED IDEOGRAPH + {0xEBE0, 0x8C5A}, //18889 #CJK UNIFIED IDEOGRAPH + {0xEBE1, 0x8136}, //18890 #CJK UNIFIED IDEOGRAPH + {0xEBE2, 0x811E}, //18891 #CJK UNIFIED IDEOGRAPH + {0xEBE3, 0x812C}, //18892 #CJK UNIFIED IDEOGRAPH + {0xEBE4, 0x8118}, //18893 #CJK UNIFIED IDEOGRAPH + {0xEBE5, 0x8132}, //18894 #CJK UNIFIED IDEOGRAPH + {0xEBE6, 0x8148}, //18895 #CJK UNIFIED IDEOGRAPH + {0xEBE7, 0x814C}, //18896 #CJK UNIFIED IDEOGRAPH + {0xEBE8, 0x8153}, //18897 #CJK UNIFIED IDEOGRAPH + {0xEBE9, 0x8174}, //18898 #CJK UNIFIED IDEOGRAPH + {0xEBEA, 0x8159}, //18899 #CJK UNIFIED IDEOGRAPH + {0xEBEB, 0x815A}, //18900 #CJK UNIFIED IDEOGRAPH + {0xEBEC, 0x8171}, //18901 #CJK UNIFIED IDEOGRAPH + {0xEBED, 0x8160}, //18902 #CJK UNIFIED IDEOGRAPH + {0xEBEE, 0x8169}, //18903 #CJK UNIFIED IDEOGRAPH + {0xEBEF, 0x817C}, //18904 #CJK UNIFIED IDEOGRAPH + {0xEBF0, 0x817D}, //18905 #CJK UNIFIED IDEOGRAPH + {0xEBF1, 0x816D}, //18906 #CJK UNIFIED IDEOGRAPH + {0xEBF2, 0x8167}, //18907 #CJK UNIFIED IDEOGRAPH + {0xEBF3, 0x584D}, //18908 #CJK UNIFIED IDEOGRAPH + {0xEBF4, 0x5AB5}, //18909 #CJK UNIFIED IDEOGRAPH + {0xEBF5, 0x8188}, //18910 #CJK UNIFIED IDEOGRAPH + {0xEBF6, 0x8182}, //18911 #CJK UNIFIED IDEOGRAPH + {0xEBF7, 0x8191}, //18912 #CJK UNIFIED IDEOGRAPH + {0xEBF8, 0x6ED5}, //18913 #CJK UNIFIED IDEOGRAPH + {0xEBF9, 0x81A3}, //18914 #CJK UNIFIED IDEOGRAPH + {0xEBFA, 0x81AA}, //18915 #CJK UNIFIED IDEOGRAPH + {0xEBFB, 0x81CC}, //18916 #CJK UNIFIED IDEOGRAPH + {0xEBFC, 0x6726}, //18917 #CJK UNIFIED IDEOGRAPH + {0xEBFD, 0x81CA}, //18918 #CJK UNIFIED IDEOGRAPH + {0xEBFE, 0x81BB}, //18919 #CJK UNIFIED IDEOGRAPH + {0xEC40, 0x9721}, //18920 #CJK UNIFIED IDEOGRAPH + {0xEC41, 0x9722}, //18921 #CJK UNIFIED IDEOGRAPH + {0xEC42, 0x9723}, //18922 #CJK UNIFIED IDEOGRAPH + {0xEC43, 0x9724}, //18923 #CJK UNIFIED IDEOGRAPH + {0xEC44, 0x9725}, //18924 #CJK UNIFIED IDEOGRAPH + {0xEC45, 0x9726}, //18925 #CJK UNIFIED IDEOGRAPH + {0xEC46, 0x9727}, //18926 #CJK UNIFIED IDEOGRAPH + {0xEC47, 0x9728}, //18927 #CJK UNIFIED IDEOGRAPH + {0xEC48, 0x9729}, //18928 #CJK UNIFIED IDEOGRAPH + {0xEC49, 0x972B}, //18929 #CJK UNIFIED IDEOGRAPH + {0xEC4A, 0x972C}, //18930 #CJK UNIFIED IDEOGRAPH + {0xEC4B, 0x972E}, //18931 #CJK UNIFIED IDEOGRAPH + {0xEC4C, 0x972F}, //18932 #CJK UNIFIED IDEOGRAPH + {0xEC4D, 0x9731}, //18933 #CJK UNIFIED IDEOGRAPH + {0xEC4E, 0x9733}, //18934 #CJK UNIFIED IDEOGRAPH + {0xEC4F, 0x9734}, //18935 #CJK UNIFIED IDEOGRAPH + {0xEC50, 0x9735}, //18936 #CJK UNIFIED IDEOGRAPH + {0xEC51, 0x9736}, //18937 #CJK UNIFIED IDEOGRAPH + {0xEC52, 0x9737}, //18938 #CJK UNIFIED IDEOGRAPH + {0xEC53, 0x973A}, //18939 #CJK UNIFIED IDEOGRAPH + {0xEC54, 0x973B}, //18940 #CJK UNIFIED IDEOGRAPH + {0xEC55, 0x973C}, //18941 #CJK UNIFIED IDEOGRAPH + {0xEC56, 0x973D}, //18942 #CJK UNIFIED IDEOGRAPH + {0xEC57, 0x973F}, //18943 #CJK UNIFIED IDEOGRAPH + {0xEC58, 0x9740}, //18944 #CJK UNIFIED IDEOGRAPH + {0xEC59, 0x9741}, //18945 #CJK UNIFIED IDEOGRAPH + {0xEC5A, 0x9742}, //18946 #CJK UNIFIED IDEOGRAPH + {0xEC5B, 0x9743}, //18947 #CJK UNIFIED IDEOGRAPH + {0xEC5C, 0x9744}, //18948 #CJK UNIFIED IDEOGRAPH + {0xEC5D, 0x9745}, //18949 #CJK UNIFIED IDEOGRAPH + {0xEC5E, 0x9746}, //18950 #CJK UNIFIED IDEOGRAPH + {0xEC5F, 0x9747}, //18951 #CJK UNIFIED IDEOGRAPH + {0xEC60, 0x9748}, //18952 #CJK UNIFIED IDEOGRAPH + {0xEC61, 0x9749}, //18953 #CJK UNIFIED IDEOGRAPH + {0xEC62, 0x974A}, //18954 #CJK UNIFIED IDEOGRAPH + {0xEC63, 0x974B}, //18955 #CJK UNIFIED IDEOGRAPH + {0xEC64, 0x974C}, //18956 #CJK UNIFIED IDEOGRAPH + {0xEC65, 0x974D}, //18957 #CJK UNIFIED IDEOGRAPH + {0xEC66, 0x974E}, //18958 #CJK UNIFIED IDEOGRAPH + {0xEC67, 0x974F}, //18959 #CJK UNIFIED IDEOGRAPH + {0xEC68, 0x9750}, //18960 #CJK UNIFIED IDEOGRAPH + {0xEC69, 0x9751}, //18961 #CJK UNIFIED IDEOGRAPH + {0xEC6A, 0x9754}, //18962 #CJK UNIFIED IDEOGRAPH + {0xEC6B, 0x9755}, //18963 #CJK UNIFIED IDEOGRAPH + {0xEC6C, 0x9757}, //18964 #CJK UNIFIED IDEOGRAPH + {0xEC6D, 0x9758}, //18965 #CJK UNIFIED IDEOGRAPH + {0xEC6E, 0x975A}, //18966 #CJK UNIFIED IDEOGRAPH + {0xEC6F, 0x975C}, //18967 #CJK UNIFIED IDEOGRAPH + {0xEC70, 0x975D}, //18968 #CJK UNIFIED IDEOGRAPH + {0xEC71, 0x975F}, //18969 #CJK UNIFIED IDEOGRAPH + {0xEC72, 0x9763}, //18970 #CJK UNIFIED IDEOGRAPH + {0xEC73, 0x9764}, //18971 #CJK UNIFIED IDEOGRAPH + {0xEC74, 0x9766}, //18972 #CJK UNIFIED IDEOGRAPH + {0xEC75, 0x9767}, //18973 #CJK UNIFIED IDEOGRAPH + {0xEC76, 0x9768}, //18974 #CJK UNIFIED IDEOGRAPH + {0xEC77, 0x976A}, //18975 #CJK UNIFIED IDEOGRAPH + {0xEC78, 0x976B}, //18976 #CJK UNIFIED IDEOGRAPH + {0xEC79, 0x976C}, //18977 #CJK UNIFIED IDEOGRAPH + {0xEC7A, 0x976D}, //18978 #CJK UNIFIED IDEOGRAPH + {0xEC7B, 0x976E}, //18979 #CJK UNIFIED IDEOGRAPH + {0xEC7C, 0x976F}, //18980 #CJK UNIFIED IDEOGRAPH + {0xEC7D, 0x9770}, //18981 #CJK UNIFIED IDEOGRAPH + {0xEC7E, 0x9771}, //18982 #CJK UNIFIED IDEOGRAPH + {0xEC80, 0x9772}, //18983 #CJK UNIFIED IDEOGRAPH + {0xEC81, 0x9775}, //18984 #CJK UNIFIED IDEOGRAPH + {0xEC82, 0x9777}, //18985 #CJK UNIFIED IDEOGRAPH + {0xEC83, 0x9778}, //18986 #CJK UNIFIED IDEOGRAPH + {0xEC84, 0x9779}, //18987 #CJK UNIFIED IDEOGRAPH + {0xEC85, 0x977A}, //18988 #CJK UNIFIED IDEOGRAPH + {0xEC86, 0x977B}, //18989 #CJK UNIFIED IDEOGRAPH + {0xEC87, 0x977D}, //18990 #CJK UNIFIED IDEOGRAPH + {0xEC88, 0x977E}, //18991 #CJK UNIFIED IDEOGRAPH + {0xEC89, 0x977F}, //18992 #CJK UNIFIED IDEOGRAPH + {0xEC8A, 0x9780}, //18993 #CJK UNIFIED IDEOGRAPH + {0xEC8B, 0x9781}, //18994 #CJK UNIFIED IDEOGRAPH + {0xEC8C, 0x9782}, //18995 #CJK UNIFIED IDEOGRAPH + {0xEC8D, 0x9783}, //18996 #CJK UNIFIED IDEOGRAPH + {0xEC8E, 0x9784}, //18997 #CJK UNIFIED IDEOGRAPH + {0xEC8F, 0x9786}, //18998 #CJK UNIFIED IDEOGRAPH + {0xEC90, 0x9787}, //18999 #CJK UNIFIED IDEOGRAPH + {0xEC91, 0x9788}, //19000 #CJK UNIFIED IDEOGRAPH + {0xEC92, 0x9789}, //19001 #CJK UNIFIED IDEOGRAPH + {0xEC93, 0x978A}, //19002 #CJK UNIFIED IDEOGRAPH + {0xEC94, 0x978C}, //19003 #CJK UNIFIED IDEOGRAPH + {0xEC95, 0x978E}, //19004 #CJK UNIFIED IDEOGRAPH + {0xEC96, 0x978F}, //19005 #CJK UNIFIED IDEOGRAPH + {0xEC97, 0x9790}, //19006 #CJK UNIFIED IDEOGRAPH + {0xEC98, 0x9793}, //19007 #CJK UNIFIED IDEOGRAPH + {0xEC99, 0x9795}, //19008 #CJK UNIFIED IDEOGRAPH + {0xEC9A, 0x9796}, //19009 #CJK UNIFIED IDEOGRAPH + {0xEC9B, 0x9797}, //19010 #CJK UNIFIED IDEOGRAPH + {0xEC9C, 0x9799}, //19011 #CJK UNIFIED IDEOGRAPH + {0xEC9D, 0x979A}, //19012 #CJK UNIFIED IDEOGRAPH + {0xEC9E, 0x979B}, //19013 #CJK UNIFIED IDEOGRAPH + {0xEC9F, 0x979C}, //19014 #CJK UNIFIED IDEOGRAPH + {0xECA0, 0x979D}, //19015 #CJK UNIFIED IDEOGRAPH + {0xECA1, 0x81C1}, //19016 #CJK UNIFIED IDEOGRAPH + {0xECA2, 0x81A6}, //19017 #CJK UNIFIED IDEOGRAPH + {0xECA3, 0x6B24}, //19018 #CJK UNIFIED IDEOGRAPH + {0xECA4, 0x6B37}, //19019 #CJK UNIFIED IDEOGRAPH + {0xECA5, 0x6B39}, //19020 #CJK UNIFIED IDEOGRAPH + {0xECA6, 0x6B43}, //19021 #CJK UNIFIED IDEOGRAPH + {0xECA7, 0x6B46}, //19022 #CJK UNIFIED IDEOGRAPH + {0xECA8, 0x6B59}, //19023 #CJK UNIFIED IDEOGRAPH + {0xECA9, 0x98D1}, //19024 #CJK UNIFIED IDEOGRAPH + {0xECAA, 0x98D2}, //19025 #CJK UNIFIED IDEOGRAPH + {0xECAB, 0x98D3}, //19026 #CJK UNIFIED IDEOGRAPH + {0xECAC, 0x98D5}, //19027 #CJK UNIFIED IDEOGRAPH + {0xECAD, 0x98D9}, //19028 #CJK UNIFIED IDEOGRAPH + {0xECAE, 0x98DA}, //19029 #CJK UNIFIED IDEOGRAPH + {0xECAF, 0x6BB3}, //19030 #CJK UNIFIED IDEOGRAPH + {0xECB0, 0x5F40}, //19031 #CJK UNIFIED IDEOGRAPH + {0xECB1, 0x6BC2}, //19032 #CJK UNIFIED IDEOGRAPH + {0xECB2, 0x89F3}, //19033 #CJK UNIFIED IDEOGRAPH + {0xECB3, 0x6590}, //19034 #CJK UNIFIED IDEOGRAPH + {0xECB4, 0x9F51}, //19035 #CJK UNIFIED IDEOGRAPH + {0xECB5, 0x6593}, //19036 #CJK UNIFIED IDEOGRAPH + {0xECB6, 0x65BC}, //19037 #CJK UNIFIED IDEOGRAPH + {0xECB7, 0x65C6}, //19038 #CJK UNIFIED IDEOGRAPH + {0xECB8, 0x65C4}, //19039 #CJK UNIFIED IDEOGRAPH + {0xECB9, 0x65C3}, //19040 #CJK UNIFIED IDEOGRAPH + {0xECBA, 0x65CC}, //19041 #CJK UNIFIED IDEOGRAPH + {0xECBB, 0x65CE}, //19042 #CJK UNIFIED IDEOGRAPH + {0xECBC, 0x65D2}, //19043 #CJK UNIFIED IDEOGRAPH + {0xECBD, 0x65D6}, //19044 #CJK UNIFIED IDEOGRAPH + {0xECBE, 0x7080}, //19045 #CJK UNIFIED IDEOGRAPH + {0xECBF, 0x709C}, //19046 #CJK UNIFIED IDEOGRAPH + {0xECC0, 0x7096}, //19047 #CJK UNIFIED IDEOGRAPH + {0xECC1, 0x709D}, //19048 #CJK UNIFIED IDEOGRAPH + {0xECC2, 0x70BB}, //19049 #CJK UNIFIED IDEOGRAPH + {0xECC3, 0x70C0}, //19050 #CJK UNIFIED IDEOGRAPH + {0xECC4, 0x70B7}, //19051 #CJK UNIFIED IDEOGRAPH + {0xECC5, 0x70AB}, //19052 #CJK UNIFIED IDEOGRAPH + {0xECC6, 0x70B1}, //19053 #CJK UNIFIED IDEOGRAPH + {0xECC7, 0x70E8}, //19054 #CJK UNIFIED IDEOGRAPH + {0xECC8, 0x70CA}, //19055 #CJK UNIFIED IDEOGRAPH + {0xECC9, 0x7110}, //19056 #CJK UNIFIED IDEOGRAPH + {0xECCA, 0x7113}, //19057 #CJK UNIFIED IDEOGRAPH + {0xECCB, 0x7116}, //19058 #CJK UNIFIED IDEOGRAPH + {0xECCC, 0x712F}, //19059 #CJK UNIFIED IDEOGRAPH + {0xECCD, 0x7131}, //19060 #CJK UNIFIED IDEOGRAPH + {0xECCE, 0x7173}, //19061 #CJK UNIFIED IDEOGRAPH + {0xECCF, 0x715C}, //19062 #CJK UNIFIED IDEOGRAPH + {0xECD0, 0x7168}, //19063 #CJK UNIFIED IDEOGRAPH + {0xECD1, 0x7145}, //19064 #CJK UNIFIED IDEOGRAPH + {0xECD2, 0x7172}, //19065 #CJK UNIFIED IDEOGRAPH + {0xECD3, 0x714A}, //19066 #CJK UNIFIED IDEOGRAPH + {0xECD4, 0x7178}, //19067 #CJK UNIFIED IDEOGRAPH + {0xECD5, 0x717A}, //19068 #CJK UNIFIED IDEOGRAPH + {0xECD6, 0x7198}, //19069 #CJK UNIFIED IDEOGRAPH + {0xECD7, 0x71B3}, //19070 #CJK UNIFIED IDEOGRAPH + {0xECD8, 0x71B5}, //19071 #CJK UNIFIED IDEOGRAPH + {0xECD9, 0x71A8}, //19072 #CJK UNIFIED IDEOGRAPH + {0xECDA, 0x71A0}, //19073 #CJK UNIFIED IDEOGRAPH + {0xECDB, 0x71E0}, //19074 #CJK UNIFIED IDEOGRAPH + {0xECDC, 0x71D4}, //19075 #CJK UNIFIED IDEOGRAPH + {0xECDD, 0x71E7}, //19076 #CJK UNIFIED IDEOGRAPH + {0xECDE, 0x71F9}, //19077 #CJK UNIFIED IDEOGRAPH + {0xECDF, 0x721D}, //19078 #CJK UNIFIED IDEOGRAPH + {0xECE0, 0x7228}, //19079 #CJK UNIFIED IDEOGRAPH + {0xECE1, 0x706C}, //19080 #CJK UNIFIED IDEOGRAPH + {0xECE2, 0x7118}, //19081 #CJK UNIFIED IDEOGRAPH + {0xECE3, 0x7166}, //19082 #CJK UNIFIED IDEOGRAPH + {0xECE4, 0x71B9}, //19083 #CJK UNIFIED IDEOGRAPH + {0xECE5, 0x623E}, //19084 #CJK UNIFIED IDEOGRAPH + {0xECE6, 0x623D}, //19085 #CJK UNIFIED IDEOGRAPH + {0xECE7, 0x6243}, //19086 #CJK UNIFIED IDEOGRAPH + {0xECE8, 0x6248}, //19087 #CJK UNIFIED IDEOGRAPH + {0xECE9, 0x6249}, //19088 #CJK UNIFIED IDEOGRAPH + {0xECEA, 0x793B}, //19089 #CJK UNIFIED IDEOGRAPH + {0xECEB, 0x7940}, //19090 #CJK UNIFIED IDEOGRAPH + {0xECEC, 0x7946}, //19091 #CJK UNIFIED IDEOGRAPH + {0xECED, 0x7949}, //19092 #CJK UNIFIED IDEOGRAPH + {0xECEE, 0x795B}, //19093 #CJK UNIFIED IDEOGRAPH + {0xECEF, 0x795C}, //19094 #CJK UNIFIED IDEOGRAPH + {0xECF0, 0x7953}, //19095 #CJK UNIFIED IDEOGRAPH + {0xECF1, 0x795A}, //19096 #CJK UNIFIED IDEOGRAPH + {0xECF2, 0x7962}, //19097 #CJK UNIFIED IDEOGRAPH + {0xECF3, 0x7957}, //19098 #CJK UNIFIED IDEOGRAPH + {0xECF4, 0x7960}, //19099 #CJK UNIFIED IDEOGRAPH + {0xECF5, 0x796F}, //19100 #CJK UNIFIED IDEOGRAPH + {0xECF6, 0x7967}, //19101 #CJK UNIFIED IDEOGRAPH + {0xECF7, 0x797A}, //19102 #CJK UNIFIED IDEOGRAPH + {0xECF8, 0x7985}, //19103 #CJK UNIFIED IDEOGRAPH + {0xECF9, 0x798A}, //19104 #CJK UNIFIED IDEOGRAPH + {0xECFA, 0x799A}, //19105 #CJK UNIFIED IDEOGRAPH + {0xECFB, 0x79A7}, //19106 #CJK UNIFIED IDEOGRAPH + {0xECFC, 0x79B3}, //19107 #CJK UNIFIED IDEOGRAPH + {0xECFD, 0x5FD1}, //19108 #CJK UNIFIED IDEOGRAPH + {0xECFE, 0x5FD0}, //19109 #CJK UNIFIED IDEOGRAPH + {0xED40, 0x979E}, //19110 #CJK UNIFIED IDEOGRAPH + {0xED41, 0x979F}, //19111 #CJK UNIFIED IDEOGRAPH + {0xED42, 0x97A1}, //19112 #CJK UNIFIED IDEOGRAPH + {0xED43, 0x97A2}, //19113 #CJK UNIFIED IDEOGRAPH + {0xED44, 0x97A4}, //19114 #CJK UNIFIED IDEOGRAPH + {0xED45, 0x97A5}, //19115 #CJK UNIFIED IDEOGRAPH + {0xED46, 0x97A6}, //19116 #CJK UNIFIED IDEOGRAPH + {0xED47, 0x97A7}, //19117 #CJK UNIFIED IDEOGRAPH + {0xED48, 0x97A8}, //19118 #CJK UNIFIED IDEOGRAPH + {0xED49, 0x97A9}, //19119 #CJK UNIFIED IDEOGRAPH + {0xED4A, 0x97AA}, //19120 #CJK UNIFIED IDEOGRAPH + {0xED4B, 0x97AC}, //19121 #CJK UNIFIED IDEOGRAPH + {0xED4C, 0x97AE}, //19122 #CJK UNIFIED IDEOGRAPH + {0xED4D, 0x97B0}, //19123 #CJK UNIFIED IDEOGRAPH + {0xED4E, 0x97B1}, //19124 #CJK UNIFIED IDEOGRAPH + {0xED4F, 0x97B3}, //19125 #CJK UNIFIED IDEOGRAPH + {0xED50, 0x97B5}, //19126 #CJK UNIFIED IDEOGRAPH + {0xED51, 0x97B6}, //19127 #CJK UNIFIED IDEOGRAPH + {0xED52, 0x97B7}, //19128 #CJK UNIFIED IDEOGRAPH + {0xED53, 0x97B8}, //19129 #CJK UNIFIED IDEOGRAPH + {0xED54, 0x97B9}, //19130 #CJK UNIFIED IDEOGRAPH + {0xED55, 0x97BA}, //19131 #CJK UNIFIED IDEOGRAPH + {0xED56, 0x97BB}, //19132 #CJK UNIFIED IDEOGRAPH + {0xED57, 0x97BC}, //19133 #CJK UNIFIED IDEOGRAPH + {0xED58, 0x97BD}, //19134 #CJK UNIFIED IDEOGRAPH + {0xED59, 0x97BE}, //19135 #CJK UNIFIED IDEOGRAPH + {0xED5A, 0x97BF}, //19136 #CJK UNIFIED IDEOGRAPH + {0xED5B, 0x97C0}, //19137 #CJK UNIFIED IDEOGRAPH + {0xED5C, 0x97C1}, //19138 #CJK UNIFIED IDEOGRAPH + {0xED5D, 0x97C2}, //19139 #CJK UNIFIED IDEOGRAPH + {0xED5E, 0x97C3}, //19140 #CJK UNIFIED IDEOGRAPH + {0xED5F, 0x97C4}, //19141 #CJK UNIFIED IDEOGRAPH + {0xED60, 0x97C5}, //19142 #CJK UNIFIED IDEOGRAPH + {0xED61, 0x97C6}, //19143 #CJK UNIFIED IDEOGRAPH + {0xED62, 0x97C7}, //19144 #CJK UNIFIED IDEOGRAPH + {0xED63, 0x97C8}, //19145 #CJK UNIFIED IDEOGRAPH + {0xED64, 0x97C9}, //19146 #CJK UNIFIED IDEOGRAPH + {0xED65, 0x97CA}, //19147 #CJK UNIFIED IDEOGRAPH + {0xED66, 0x97CB}, //19148 #CJK UNIFIED IDEOGRAPH + {0xED67, 0x97CC}, //19149 #CJK UNIFIED IDEOGRAPH + {0xED68, 0x97CD}, //19150 #CJK UNIFIED IDEOGRAPH + {0xED69, 0x97CE}, //19151 #CJK UNIFIED IDEOGRAPH + {0xED6A, 0x97CF}, //19152 #CJK UNIFIED IDEOGRAPH + {0xED6B, 0x97D0}, //19153 #CJK UNIFIED IDEOGRAPH + {0xED6C, 0x97D1}, //19154 #CJK UNIFIED IDEOGRAPH + {0xED6D, 0x97D2}, //19155 #CJK UNIFIED IDEOGRAPH + {0xED6E, 0x97D3}, //19156 #CJK UNIFIED IDEOGRAPH + {0xED6F, 0x97D4}, //19157 #CJK UNIFIED IDEOGRAPH + {0xED70, 0x97D5}, //19158 #CJK UNIFIED IDEOGRAPH + {0xED71, 0x97D6}, //19159 #CJK UNIFIED IDEOGRAPH + {0xED72, 0x97D7}, //19160 #CJK UNIFIED IDEOGRAPH + {0xED73, 0x97D8}, //19161 #CJK UNIFIED IDEOGRAPH + {0xED74, 0x97D9}, //19162 #CJK UNIFIED IDEOGRAPH + {0xED75, 0x97DA}, //19163 #CJK UNIFIED IDEOGRAPH + {0xED76, 0x97DB}, //19164 #CJK UNIFIED IDEOGRAPH + {0xED77, 0x97DC}, //19165 #CJK UNIFIED IDEOGRAPH + {0xED78, 0x97DD}, //19166 #CJK UNIFIED IDEOGRAPH + {0xED79, 0x97DE}, //19167 #CJK UNIFIED IDEOGRAPH + {0xED7A, 0x97DF}, //19168 #CJK UNIFIED IDEOGRAPH + {0xED7B, 0x97E0}, //19169 #CJK UNIFIED IDEOGRAPH + {0xED7C, 0x97E1}, //19170 #CJK UNIFIED IDEOGRAPH + {0xED7D, 0x97E2}, //19171 #CJK UNIFIED IDEOGRAPH + {0xED7E, 0x97E3}, //19172 #CJK UNIFIED IDEOGRAPH + {0xED80, 0x97E4}, //19173 #CJK UNIFIED IDEOGRAPH + {0xED81, 0x97E5}, //19174 #CJK UNIFIED IDEOGRAPH + {0xED82, 0x97E8}, //19175 #CJK UNIFIED IDEOGRAPH + {0xED83, 0x97EE}, //19176 #CJK UNIFIED IDEOGRAPH + {0xED84, 0x97EF}, //19177 #CJK UNIFIED IDEOGRAPH + {0xED85, 0x97F0}, //19178 #CJK UNIFIED IDEOGRAPH + {0xED86, 0x97F1}, //19179 #CJK UNIFIED IDEOGRAPH + {0xED87, 0x97F2}, //19180 #CJK UNIFIED IDEOGRAPH + {0xED88, 0x97F4}, //19181 #CJK UNIFIED IDEOGRAPH + {0xED89, 0x97F7}, //19182 #CJK UNIFIED IDEOGRAPH + {0xED8A, 0x97F8}, //19183 #CJK UNIFIED IDEOGRAPH + {0xED8B, 0x97F9}, //19184 #CJK UNIFIED IDEOGRAPH + {0xED8C, 0x97FA}, //19185 #CJK UNIFIED IDEOGRAPH + {0xED8D, 0x97FB}, //19186 #CJK UNIFIED IDEOGRAPH + {0xED8E, 0x97FC}, //19187 #CJK UNIFIED IDEOGRAPH + {0xED8F, 0x97FD}, //19188 #CJK UNIFIED IDEOGRAPH + {0xED90, 0x97FE}, //19189 #CJK UNIFIED IDEOGRAPH + {0xED91, 0x97FF}, //19190 #CJK UNIFIED IDEOGRAPH + {0xED92, 0x9800}, //19191 #CJK UNIFIED IDEOGRAPH + {0xED93, 0x9801}, //19192 #CJK UNIFIED IDEOGRAPH + {0xED94, 0x9802}, //19193 #CJK UNIFIED IDEOGRAPH + {0xED95, 0x9803}, //19194 #CJK UNIFIED IDEOGRAPH + {0xED96, 0x9804}, //19195 #CJK UNIFIED IDEOGRAPH + {0xED97, 0x9805}, //19196 #CJK UNIFIED IDEOGRAPH + {0xED98, 0x9806}, //19197 #CJK UNIFIED IDEOGRAPH + {0xED99, 0x9807}, //19198 #CJK UNIFIED IDEOGRAPH + {0xED9A, 0x9808}, //19199 #CJK UNIFIED IDEOGRAPH + {0xED9B, 0x9809}, //19200 #CJK UNIFIED IDEOGRAPH + {0xED9C, 0x980A}, //19201 #CJK UNIFIED IDEOGRAPH + {0xED9D, 0x980B}, //19202 #CJK UNIFIED IDEOGRAPH + {0xED9E, 0x980C}, //19203 #CJK UNIFIED IDEOGRAPH + {0xED9F, 0x980D}, //19204 #CJK UNIFIED IDEOGRAPH + {0xEDA0, 0x980E}, //19205 #CJK UNIFIED IDEOGRAPH + {0xEDA1, 0x603C}, //19206 #CJK UNIFIED IDEOGRAPH + {0xEDA2, 0x605D}, //19207 #CJK UNIFIED IDEOGRAPH + {0xEDA3, 0x605A}, //19208 #CJK UNIFIED IDEOGRAPH + {0xEDA4, 0x6067}, //19209 #CJK UNIFIED IDEOGRAPH + {0xEDA5, 0x6041}, //19210 #CJK UNIFIED IDEOGRAPH + {0xEDA6, 0x6059}, //19211 #CJK UNIFIED IDEOGRAPH + {0xEDA7, 0x6063}, //19212 #CJK UNIFIED IDEOGRAPH + {0xEDA8, 0x60AB}, //19213 #CJK UNIFIED IDEOGRAPH + {0xEDA9, 0x6106}, //19214 #CJK UNIFIED IDEOGRAPH + {0xEDAA, 0x610D}, //19215 #CJK UNIFIED IDEOGRAPH + {0xEDAB, 0x615D}, //19216 #CJK UNIFIED IDEOGRAPH + {0xEDAC, 0x61A9}, //19217 #CJK UNIFIED IDEOGRAPH + {0xEDAD, 0x619D}, //19218 #CJK UNIFIED IDEOGRAPH + {0xEDAE, 0x61CB}, //19219 #CJK UNIFIED IDEOGRAPH + {0xEDAF, 0x61D1}, //19220 #CJK UNIFIED IDEOGRAPH + {0xEDB0, 0x6206}, //19221 #CJK UNIFIED IDEOGRAPH + {0xEDB1, 0x8080}, //19222 #CJK UNIFIED IDEOGRAPH + {0xEDB2, 0x807F}, //19223 #CJK UNIFIED IDEOGRAPH + {0xEDB3, 0x6C93}, //19224 #CJK UNIFIED IDEOGRAPH + {0xEDB4, 0x6CF6}, //19225 #CJK UNIFIED IDEOGRAPH + {0xEDB5, 0x6DFC}, //19226 #CJK UNIFIED IDEOGRAPH + {0xEDB6, 0x77F6}, //19227 #CJK UNIFIED IDEOGRAPH + {0xEDB7, 0x77F8}, //19228 #CJK UNIFIED IDEOGRAPH + {0xEDB8, 0x7800}, //19229 #CJK UNIFIED IDEOGRAPH + {0xEDB9, 0x7809}, //19230 #CJK UNIFIED IDEOGRAPH + {0xEDBA, 0x7817}, //19231 #CJK UNIFIED IDEOGRAPH + {0xEDBB, 0x7818}, //19232 #CJK UNIFIED IDEOGRAPH + {0xEDBC, 0x7811}, //19233 #CJK UNIFIED IDEOGRAPH + {0xEDBD, 0x65AB}, //19234 #CJK UNIFIED IDEOGRAPH + {0xEDBE, 0x782D}, //19235 #CJK UNIFIED IDEOGRAPH + {0xEDBF, 0x781C}, //19236 #CJK UNIFIED IDEOGRAPH + {0xEDC0, 0x781D}, //19237 #CJK UNIFIED IDEOGRAPH + {0xEDC1, 0x7839}, //19238 #CJK UNIFIED IDEOGRAPH + {0xEDC2, 0x783A}, //19239 #CJK UNIFIED IDEOGRAPH + {0xEDC3, 0x783B}, //19240 #CJK UNIFIED IDEOGRAPH + {0xEDC4, 0x781F}, //19241 #CJK UNIFIED IDEOGRAPH + {0xEDC5, 0x783C}, //19242 #CJK UNIFIED IDEOGRAPH + {0xEDC6, 0x7825}, //19243 #CJK UNIFIED IDEOGRAPH + {0xEDC7, 0x782C}, //19244 #CJK UNIFIED IDEOGRAPH + {0xEDC8, 0x7823}, //19245 #CJK UNIFIED IDEOGRAPH + {0xEDC9, 0x7829}, //19246 #CJK UNIFIED IDEOGRAPH + {0xEDCA, 0x784E}, //19247 #CJK UNIFIED IDEOGRAPH + {0xEDCB, 0x786D}, //19248 #CJK UNIFIED IDEOGRAPH + {0xEDCC, 0x7856}, //19249 #CJK UNIFIED IDEOGRAPH + {0xEDCD, 0x7857}, //19250 #CJK UNIFIED IDEOGRAPH + {0xEDCE, 0x7826}, //19251 #CJK UNIFIED IDEOGRAPH + {0xEDCF, 0x7850}, //19252 #CJK UNIFIED IDEOGRAPH + {0xEDD0, 0x7847}, //19253 #CJK UNIFIED IDEOGRAPH + {0xEDD1, 0x784C}, //19254 #CJK UNIFIED IDEOGRAPH + {0xEDD2, 0x786A}, //19255 #CJK UNIFIED IDEOGRAPH + {0xEDD3, 0x789B}, //19256 #CJK UNIFIED IDEOGRAPH + {0xEDD4, 0x7893}, //19257 #CJK UNIFIED IDEOGRAPH + {0xEDD5, 0x789A}, //19258 #CJK UNIFIED IDEOGRAPH + {0xEDD6, 0x7887}, //19259 #CJK UNIFIED IDEOGRAPH + {0xEDD7, 0x789C}, //19260 #CJK UNIFIED IDEOGRAPH + {0xEDD8, 0x78A1}, //19261 #CJK UNIFIED IDEOGRAPH + {0xEDD9, 0x78A3}, //19262 #CJK UNIFIED IDEOGRAPH + {0xEDDA, 0x78B2}, //19263 #CJK UNIFIED IDEOGRAPH + {0xEDDB, 0x78B9}, //19264 #CJK UNIFIED IDEOGRAPH + {0xEDDC, 0x78A5}, //19265 #CJK UNIFIED IDEOGRAPH + {0xEDDD, 0x78D4}, //19266 #CJK UNIFIED IDEOGRAPH + {0xEDDE, 0x78D9}, //19267 #CJK UNIFIED IDEOGRAPH + {0xEDDF, 0x78C9}, //19268 #CJK UNIFIED IDEOGRAPH + {0xEDE0, 0x78EC}, //19269 #CJK UNIFIED IDEOGRAPH + {0xEDE1, 0x78F2}, //19270 #CJK UNIFIED IDEOGRAPH + {0xEDE2, 0x7905}, //19271 #CJK UNIFIED IDEOGRAPH + {0xEDE3, 0x78F4}, //19272 #CJK UNIFIED IDEOGRAPH + {0xEDE4, 0x7913}, //19273 #CJK UNIFIED IDEOGRAPH + {0xEDE5, 0x7924}, //19274 #CJK UNIFIED IDEOGRAPH + {0xEDE6, 0x791E}, //19275 #CJK UNIFIED IDEOGRAPH + {0xEDE7, 0x7934}, //19276 #CJK UNIFIED IDEOGRAPH + {0xEDE8, 0x9F9B}, //19277 #CJK UNIFIED IDEOGRAPH + {0xEDE9, 0x9EF9}, //19278 #CJK UNIFIED IDEOGRAPH + {0xEDEA, 0x9EFB}, //19279 #CJK UNIFIED IDEOGRAPH + {0xEDEB, 0x9EFC}, //19280 #CJK UNIFIED IDEOGRAPH + {0xEDEC, 0x76F1}, //19281 #CJK UNIFIED IDEOGRAPH + {0xEDED, 0x7704}, //19282 #CJK UNIFIED IDEOGRAPH + {0xEDEE, 0x770D}, //19283 #CJK UNIFIED IDEOGRAPH + {0xEDEF, 0x76F9}, //19284 #CJK UNIFIED IDEOGRAPH + {0xEDF0, 0x7707}, //19285 #CJK UNIFIED IDEOGRAPH + {0xEDF1, 0x7708}, //19286 #CJK UNIFIED IDEOGRAPH + {0xEDF2, 0x771A}, //19287 #CJK UNIFIED IDEOGRAPH + {0xEDF3, 0x7722}, //19288 #CJK UNIFIED IDEOGRAPH + {0xEDF4, 0x7719}, //19289 #CJK UNIFIED IDEOGRAPH + {0xEDF5, 0x772D}, //19290 #CJK UNIFIED IDEOGRAPH + {0xEDF6, 0x7726}, //19291 #CJK UNIFIED IDEOGRAPH + {0xEDF7, 0x7735}, //19292 #CJK UNIFIED IDEOGRAPH + {0xEDF8, 0x7738}, //19293 #CJK UNIFIED IDEOGRAPH + {0xEDF9, 0x7750}, //19294 #CJK UNIFIED IDEOGRAPH + {0xEDFA, 0x7751}, //19295 #CJK UNIFIED IDEOGRAPH + {0xEDFB, 0x7747}, //19296 #CJK UNIFIED IDEOGRAPH + {0xEDFC, 0x7743}, //19297 #CJK UNIFIED IDEOGRAPH + {0xEDFD, 0x775A}, //19298 #CJK UNIFIED IDEOGRAPH + {0xEDFE, 0x7768}, //19299 #CJK UNIFIED IDEOGRAPH + {0xEE40, 0x980F}, //19300 #CJK UNIFIED IDEOGRAPH + {0xEE41, 0x9810}, //19301 #CJK UNIFIED IDEOGRAPH + {0xEE42, 0x9811}, //19302 #CJK UNIFIED IDEOGRAPH + {0xEE43, 0x9812}, //19303 #CJK UNIFIED IDEOGRAPH + {0xEE44, 0x9813}, //19304 #CJK UNIFIED IDEOGRAPH + {0xEE45, 0x9814}, //19305 #CJK UNIFIED IDEOGRAPH + {0xEE46, 0x9815}, //19306 #CJK UNIFIED IDEOGRAPH + {0xEE47, 0x9816}, //19307 #CJK UNIFIED IDEOGRAPH + {0xEE48, 0x9817}, //19308 #CJK UNIFIED IDEOGRAPH + {0xEE49, 0x9818}, //19309 #CJK UNIFIED IDEOGRAPH + {0xEE4A, 0x9819}, //19310 #CJK UNIFIED IDEOGRAPH + {0xEE4B, 0x981A}, //19311 #CJK UNIFIED IDEOGRAPH + {0xEE4C, 0x981B}, //19312 #CJK UNIFIED IDEOGRAPH + {0xEE4D, 0x981C}, //19313 #CJK UNIFIED IDEOGRAPH + {0xEE4E, 0x981D}, //19314 #CJK UNIFIED IDEOGRAPH + {0xEE4F, 0x981E}, //19315 #CJK UNIFIED IDEOGRAPH + {0xEE50, 0x981F}, //19316 #CJK UNIFIED IDEOGRAPH + {0xEE51, 0x9820}, //19317 #CJK UNIFIED IDEOGRAPH + {0xEE52, 0x9821}, //19318 #CJK UNIFIED IDEOGRAPH + {0xEE53, 0x9822}, //19319 #CJK UNIFIED IDEOGRAPH + {0xEE54, 0x9823}, //19320 #CJK UNIFIED IDEOGRAPH + {0xEE55, 0x9824}, //19321 #CJK UNIFIED IDEOGRAPH + {0xEE56, 0x9825}, //19322 #CJK UNIFIED IDEOGRAPH + {0xEE57, 0x9826}, //19323 #CJK UNIFIED IDEOGRAPH + {0xEE58, 0x9827}, //19324 #CJK UNIFIED IDEOGRAPH + {0xEE59, 0x9828}, //19325 #CJK UNIFIED IDEOGRAPH + {0xEE5A, 0x9829}, //19326 #CJK UNIFIED IDEOGRAPH + {0xEE5B, 0x982A}, //19327 #CJK UNIFIED IDEOGRAPH + {0xEE5C, 0x982B}, //19328 #CJK UNIFIED IDEOGRAPH + {0xEE5D, 0x982C}, //19329 #CJK UNIFIED IDEOGRAPH + {0xEE5E, 0x982D}, //19330 #CJK UNIFIED IDEOGRAPH + {0xEE5F, 0x982E}, //19331 #CJK UNIFIED IDEOGRAPH + {0xEE60, 0x982F}, //19332 #CJK UNIFIED IDEOGRAPH + {0xEE61, 0x9830}, //19333 #CJK UNIFIED IDEOGRAPH + {0xEE62, 0x9831}, //19334 #CJK UNIFIED IDEOGRAPH + {0xEE63, 0x9832}, //19335 #CJK UNIFIED IDEOGRAPH + {0xEE64, 0x9833}, //19336 #CJK UNIFIED IDEOGRAPH + {0xEE65, 0x9834}, //19337 #CJK UNIFIED IDEOGRAPH + {0xEE66, 0x9835}, //19338 #CJK UNIFIED IDEOGRAPH + {0xEE67, 0x9836}, //19339 #CJK UNIFIED IDEOGRAPH + {0xEE68, 0x9837}, //19340 #CJK UNIFIED IDEOGRAPH + {0xEE69, 0x9838}, //19341 #CJK UNIFIED IDEOGRAPH + {0xEE6A, 0x9839}, //19342 #CJK UNIFIED IDEOGRAPH + {0xEE6B, 0x983A}, //19343 #CJK UNIFIED IDEOGRAPH + {0xEE6C, 0x983B}, //19344 #CJK UNIFIED IDEOGRAPH + {0xEE6D, 0x983C}, //19345 #CJK UNIFIED IDEOGRAPH + {0xEE6E, 0x983D}, //19346 #CJK UNIFIED IDEOGRAPH + {0xEE6F, 0x983E}, //19347 #CJK UNIFIED IDEOGRAPH + {0xEE70, 0x983F}, //19348 #CJK UNIFIED IDEOGRAPH + {0xEE71, 0x9840}, //19349 #CJK UNIFIED IDEOGRAPH + {0xEE72, 0x9841}, //19350 #CJK UNIFIED IDEOGRAPH + {0xEE73, 0x9842}, //19351 #CJK UNIFIED IDEOGRAPH + {0xEE74, 0x9843}, //19352 #CJK UNIFIED IDEOGRAPH + {0xEE75, 0x9844}, //19353 #CJK UNIFIED IDEOGRAPH + {0xEE76, 0x9845}, //19354 #CJK UNIFIED IDEOGRAPH + {0xEE77, 0x9846}, //19355 #CJK UNIFIED IDEOGRAPH + {0xEE78, 0x9847}, //19356 #CJK UNIFIED IDEOGRAPH + {0xEE79, 0x9848}, //19357 #CJK UNIFIED IDEOGRAPH + {0xEE7A, 0x9849}, //19358 #CJK UNIFIED IDEOGRAPH + {0xEE7B, 0x984A}, //19359 #CJK UNIFIED IDEOGRAPH + {0xEE7C, 0x984B}, //19360 #CJK UNIFIED IDEOGRAPH + {0xEE7D, 0x984C}, //19361 #CJK UNIFIED IDEOGRAPH + {0xEE7E, 0x984D}, //19362 #CJK UNIFIED IDEOGRAPH + {0xEE80, 0x984E}, //19363 #CJK UNIFIED IDEOGRAPH + {0xEE81, 0x984F}, //19364 #CJK UNIFIED IDEOGRAPH + {0xEE82, 0x9850}, //19365 #CJK UNIFIED IDEOGRAPH + {0xEE83, 0x9851}, //19366 #CJK UNIFIED IDEOGRAPH + {0xEE84, 0x9852}, //19367 #CJK UNIFIED IDEOGRAPH + {0xEE85, 0x9853}, //19368 #CJK UNIFIED IDEOGRAPH + {0xEE86, 0x9854}, //19369 #CJK UNIFIED IDEOGRAPH + {0xEE87, 0x9855}, //19370 #CJK UNIFIED IDEOGRAPH + {0xEE88, 0x9856}, //19371 #CJK UNIFIED IDEOGRAPH + {0xEE89, 0x9857}, //19372 #CJK UNIFIED IDEOGRAPH + {0xEE8A, 0x9858}, //19373 #CJK UNIFIED IDEOGRAPH + {0xEE8B, 0x9859}, //19374 #CJK UNIFIED IDEOGRAPH + {0xEE8C, 0x985A}, //19375 #CJK UNIFIED IDEOGRAPH + {0xEE8D, 0x985B}, //19376 #CJK UNIFIED IDEOGRAPH + {0xEE8E, 0x985C}, //19377 #CJK UNIFIED IDEOGRAPH + {0xEE8F, 0x985D}, //19378 #CJK UNIFIED IDEOGRAPH + {0xEE90, 0x985E}, //19379 #CJK UNIFIED IDEOGRAPH + {0xEE91, 0x985F}, //19380 #CJK UNIFIED IDEOGRAPH + {0xEE92, 0x9860}, //19381 #CJK UNIFIED IDEOGRAPH + {0xEE93, 0x9861}, //19382 #CJK UNIFIED IDEOGRAPH + {0xEE94, 0x9862}, //19383 #CJK UNIFIED IDEOGRAPH + {0xEE95, 0x9863}, //19384 #CJK UNIFIED IDEOGRAPH + {0xEE96, 0x9864}, //19385 #CJK UNIFIED IDEOGRAPH + {0xEE97, 0x9865}, //19386 #CJK UNIFIED IDEOGRAPH + {0xEE98, 0x9866}, //19387 #CJK UNIFIED IDEOGRAPH + {0xEE99, 0x9867}, //19388 #CJK UNIFIED IDEOGRAPH + {0xEE9A, 0x9868}, //19389 #CJK UNIFIED IDEOGRAPH + {0xEE9B, 0x9869}, //19390 #CJK UNIFIED IDEOGRAPH + {0xEE9C, 0x986A}, //19391 #CJK UNIFIED IDEOGRAPH + {0xEE9D, 0x986B}, //19392 #CJK UNIFIED IDEOGRAPH + {0xEE9E, 0x986C}, //19393 #CJK UNIFIED IDEOGRAPH + {0xEE9F, 0x986D}, //19394 #CJK UNIFIED IDEOGRAPH + {0xEEA0, 0x986E}, //19395 #CJK UNIFIED IDEOGRAPH + {0xEEA1, 0x7762}, //19396 #CJK UNIFIED IDEOGRAPH + {0xEEA2, 0x7765}, //19397 #CJK UNIFIED IDEOGRAPH + {0xEEA3, 0x777F}, //19398 #CJK UNIFIED IDEOGRAPH + {0xEEA4, 0x778D}, //19399 #CJK UNIFIED IDEOGRAPH + {0xEEA5, 0x777D}, //19400 #CJK UNIFIED IDEOGRAPH + {0xEEA6, 0x7780}, //19401 #CJK UNIFIED IDEOGRAPH + {0xEEA7, 0x778C}, //19402 #CJK UNIFIED IDEOGRAPH + {0xEEA8, 0x7791}, //19403 #CJK UNIFIED IDEOGRAPH + {0xEEA9, 0x779F}, //19404 #CJK UNIFIED IDEOGRAPH + {0xEEAA, 0x77A0}, //19405 #CJK UNIFIED IDEOGRAPH + {0xEEAB, 0x77B0}, //19406 #CJK UNIFIED IDEOGRAPH + {0xEEAC, 0x77B5}, //19407 #CJK UNIFIED IDEOGRAPH + {0xEEAD, 0x77BD}, //19408 #CJK UNIFIED IDEOGRAPH + {0xEEAE, 0x753A}, //19409 #CJK UNIFIED IDEOGRAPH + {0xEEAF, 0x7540}, //19410 #CJK UNIFIED IDEOGRAPH + {0xEEB0, 0x754E}, //19411 #CJK UNIFIED IDEOGRAPH + {0xEEB1, 0x754B}, //19412 #CJK UNIFIED IDEOGRAPH + {0xEEB2, 0x7548}, //19413 #CJK UNIFIED IDEOGRAPH + {0xEEB3, 0x755B}, //19414 #CJK UNIFIED IDEOGRAPH + {0xEEB4, 0x7572}, //19415 #CJK UNIFIED IDEOGRAPH + {0xEEB5, 0x7579}, //19416 #CJK UNIFIED IDEOGRAPH + {0xEEB6, 0x7583}, //19417 #CJK UNIFIED IDEOGRAPH + {0xEEB7, 0x7F58}, //19418 #CJK UNIFIED IDEOGRAPH + {0xEEB8, 0x7F61}, //19419 #CJK UNIFIED IDEOGRAPH + {0xEEB9, 0x7F5F}, //19420 #CJK UNIFIED IDEOGRAPH + {0xEEBA, 0x8A48}, //19421 #CJK UNIFIED IDEOGRAPH + {0xEEBB, 0x7F68}, //19422 #CJK UNIFIED IDEOGRAPH + {0xEEBC, 0x7F74}, //19423 #CJK UNIFIED IDEOGRAPH + {0xEEBD, 0x7F71}, //19424 #CJK UNIFIED IDEOGRAPH + {0xEEBE, 0x7F79}, //19425 #CJK UNIFIED IDEOGRAPH + {0xEEBF, 0x7F81}, //19426 #CJK UNIFIED IDEOGRAPH + {0xEEC0, 0x7F7E}, //19427 #CJK UNIFIED IDEOGRAPH + {0xEEC1, 0x76CD}, //19428 #CJK UNIFIED IDEOGRAPH + {0xEEC2, 0x76E5}, //19429 #CJK UNIFIED IDEOGRAPH + {0xEEC3, 0x8832}, //19430 #CJK UNIFIED IDEOGRAPH + {0xEEC4, 0x9485}, //19431 #CJK UNIFIED IDEOGRAPH + {0xEEC5, 0x9486}, //19432 #CJK UNIFIED IDEOGRAPH + {0xEEC6, 0x9487}, //19433 #CJK UNIFIED IDEOGRAPH + {0xEEC7, 0x948B}, //19434 #CJK UNIFIED IDEOGRAPH + {0xEEC8, 0x948A}, //19435 #CJK UNIFIED IDEOGRAPH + {0xEEC9, 0x948C}, //19436 #CJK UNIFIED IDEOGRAPH + {0xEECA, 0x948D}, //19437 #CJK UNIFIED IDEOGRAPH + {0xEECB, 0x948F}, //19438 #CJK UNIFIED IDEOGRAPH + {0xEECC, 0x9490}, //19439 #CJK UNIFIED IDEOGRAPH + {0xEECD, 0x9494}, //19440 #CJK UNIFIED IDEOGRAPH + {0xEECE, 0x9497}, //19441 #CJK UNIFIED IDEOGRAPH + {0xEECF, 0x9495}, //19442 #CJK UNIFIED IDEOGRAPH + {0xEED0, 0x949A}, //19443 #CJK UNIFIED IDEOGRAPH + {0xEED1, 0x949B}, //19444 #CJK UNIFIED IDEOGRAPH + {0xEED2, 0x949C}, //19445 #CJK UNIFIED IDEOGRAPH + {0xEED3, 0x94A3}, //19446 #CJK UNIFIED IDEOGRAPH + {0xEED4, 0x94A4}, //19447 #CJK UNIFIED IDEOGRAPH + {0xEED5, 0x94AB}, //19448 #CJK UNIFIED IDEOGRAPH + {0xEED6, 0x94AA}, //19449 #CJK UNIFIED IDEOGRAPH + {0xEED7, 0x94AD}, //19450 #CJK UNIFIED IDEOGRAPH + {0xEED8, 0x94AC}, //19451 #CJK UNIFIED IDEOGRAPH + {0xEED9, 0x94AF}, //19452 #CJK UNIFIED IDEOGRAPH + {0xEEDA, 0x94B0}, //19453 #CJK UNIFIED IDEOGRAPH + {0xEEDB, 0x94B2}, //19454 #CJK UNIFIED IDEOGRAPH + {0xEEDC, 0x94B4}, //19455 #CJK UNIFIED IDEOGRAPH + {0xEEDD, 0x94B6}, //19456 #CJK UNIFIED IDEOGRAPH + {0xEEDE, 0x94B7}, //19457 #CJK UNIFIED IDEOGRAPH + {0xEEDF, 0x94B8}, //19458 #CJK UNIFIED IDEOGRAPH + {0xEEE0, 0x94B9}, //19459 #CJK UNIFIED IDEOGRAPH + {0xEEE1, 0x94BA}, //19460 #CJK UNIFIED IDEOGRAPH + {0xEEE2, 0x94BC}, //19461 #CJK UNIFIED IDEOGRAPH + {0xEEE3, 0x94BD}, //19462 #CJK UNIFIED IDEOGRAPH + {0xEEE4, 0x94BF}, //19463 #CJK UNIFIED IDEOGRAPH + {0xEEE5, 0x94C4}, //19464 #CJK UNIFIED IDEOGRAPH + {0xEEE6, 0x94C8}, //19465 #CJK UNIFIED IDEOGRAPH + {0xEEE7, 0x94C9}, //19466 #CJK UNIFIED IDEOGRAPH + {0xEEE8, 0x94CA}, //19467 #CJK UNIFIED IDEOGRAPH + {0xEEE9, 0x94CB}, //19468 #CJK UNIFIED IDEOGRAPH + {0xEEEA, 0x94CC}, //19469 #CJK UNIFIED IDEOGRAPH + {0xEEEB, 0x94CD}, //19470 #CJK UNIFIED IDEOGRAPH + {0xEEEC, 0x94CE}, //19471 #CJK UNIFIED IDEOGRAPH + {0xEEED, 0x94D0}, //19472 #CJK UNIFIED IDEOGRAPH + {0xEEEE, 0x94D1}, //19473 #CJK UNIFIED IDEOGRAPH + {0xEEEF, 0x94D2}, //19474 #CJK UNIFIED IDEOGRAPH + {0xEEF0, 0x94D5}, //19475 #CJK UNIFIED IDEOGRAPH + {0xEEF1, 0x94D6}, //19476 #CJK UNIFIED IDEOGRAPH + {0xEEF2, 0x94D7}, //19477 #CJK UNIFIED IDEOGRAPH + {0xEEF3, 0x94D9}, //19478 #CJK UNIFIED IDEOGRAPH + {0xEEF4, 0x94D8}, //19479 #CJK UNIFIED IDEOGRAPH + {0xEEF5, 0x94DB}, //19480 #CJK UNIFIED IDEOGRAPH + {0xEEF6, 0x94DE}, //19481 #CJK UNIFIED IDEOGRAPH + {0xEEF7, 0x94DF}, //19482 #CJK UNIFIED IDEOGRAPH + {0xEEF8, 0x94E0}, //19483 #CJK UNIFIED IDEOGRAPH + {0xEEF9, 0x94E2}, //19484 #CJK UNIFIED IDEOGRAPH + {0xEEFA, 0x94E4}, //19485 #CJK UNIFIED IDEOGRAPH + {0xEEFB, 0x94E5}, //19486 #CJK UNIFIED IDEOGRAPH + {0xEEFC, 0x94E7}, //19487 #CJK UNIFIED IDEOGRAPH + {0xEEFD, 0x94E8}, //19488 #CJK UNIFIED IDEOGRAPH + {0xEEFE, 0x94EA}, //19489 #CJK UNIFIED IDEOGRAPH + {0xEF40, 0x986F}, //19490 #CJK UNIFIED IDEOGRAPH + {0xEF41, 0x9870}, //19491 #CJK UNIFIED IDEOGRAPH + {0xEF42, 0x9871}, //19492 #CJK UNIFIED IDEOGRAPH + {0xEF43, 0x9872}, //19493 #CJK UNIFIED IDEOGRAPH + {0xEF44, 0x9873}, //19494 #CJK UNIFIED IDEOGRAPH + {0xEF45, 0x9874}, //19495 #CJK UNIFIED IDEOGRAPH + {0xEF46, 0x988B}, //19496 #CJK UNIFIED IDEOGRAPH + {0xEF47, 0x988E}, //19497 #CJK UNIFIED IDEOGRAPH + {0xEF48, 0x9892}, //19498 #CJK UNIFIED IDEOGRAPH + {0xEF49, 0x9895}, //19499 #CJK UNIFIED IDEOGRAPH + {0xEF4A, 0x9899}, //19500 #CJK UNIFIED IDEOGRAPH + {0xEF4B, 0x98A3}, //19501 #CJK UNIFIED IDEOGRAPH + {0xEF4C, 0x98A8}, //19502 #CJK UNIFIED IDEOGRAPH + {0xEF4D, 0x98A9}, //19503 #CJK UNIFIED IDEOGRAPH + {0xEF4E, 0x98AA}, //19504 #CJK UNIFIED IDEOGRAPH + {0xEF4F, 0x98AB}, //19505 #CJK UNIFIED IDEOGRAPH + {0xEF50, 0x98AC}, //19506 #CJK UNIFIED IDEOGRAPH + {0xEF51, 0x98AD}, //19507 #CJK UNIFIED IDEOGRAPH + {0xEF52, 0x98AE}, //19508 #CJK UNIFIED IDEOGRAPH + {0xEF53, 0x98AF}, //19509 #CJK UNIFIED IDEOGRAPH + {0xEF54, 0x98B0}, //19510 #CJK UNIFIED IDEOGRAPH + {0xEF55, 0x98B1}, //19511 #CJK UNIFIED IDEOGRAPH + {0xEF56, 0x98B2}, //19512 #CJK UNIFIED IDEOGRAPH + {0xEF57, 0x98B3}, //19513 #CJK UNIFIED IDEOGRAPH + {0xEF58, 0x98B4}, //19514 #CJK UNIFIED IDEOGRAPH + {0xEF59, 0x98B5}, //19515 #CJK UNIFIED IDEOGRAPH + {0xEF5A, 0x98B6}, //19516 #CJK UNIFIED IDEOGRAPH + {0xEF5B, 0x98B7}, //19517 #CJK UNIFIED IDEOGRAPH + {0xEF5C, 0x98B8}, //19518 #CJK UNIFIED IDEOGRAPH + {0xEF5D, 0x98B9}, //19519 #CJK UNIFIED IDEOGRAPH + {0xEF5E, 0x98BA}, //19520 #CJK UNIFIED IDEOGRAPH + {0xEF5F, 0x98BB}, //19521 #CJK UNIFIED IDEOGRAPH + {0xEF60, 0x98BC}, //19522 #CJK UNIFIED IDEOGRAPH + {0xEF61, 0x98BD}, //19523 #CJK UNIFIED IDEOGRAPH + {0xEF62, 0x98BE}, //19524 #CJK UNIFIED IDEOGRAPH + {0xEF63, 0x98BF}, //19525 #CJK UNIFIED IDEOGRAPH + {0xEF64, 0x98C0}, //19526 #CJK UNIFIED IDEOGRAPH + {0xEF65, 0x98C1}, //19527 #CJK UNIFIED IDEOGRAPH + {0xEF66, 0x98C2}, //19528 #CJK UNIFIED IDEOGRAPH + {0xEF67, 0x98C3}, //19529 #CJK UNIFIED IDEOGRAPH + {0xEF68, 0x98C4}, //19530 #CJK UNIFIED IDEOGRAPH + {0xEF69, 0x98C5}, //19531 #CJK UNIFIED IDEOGRAPH + {0xEF6A, 0x98C6}, //19532 #CJK UNIFIED IDEOGRAPH + {0xEF6B, 0x98C7}, //19533 #CJK UNIFIED IDEOGRAPH + {0xEF6C, 0x98C8}, //19534 #CJK UNIFIED IDEOGRAPH + {0xEF6D, 0x98C9}, //19535 #CJK UNIFIED IDEOGRAPH + {0xEF6E, 0x98CA}, //19536 #CJK UNIFIED IDEOGRAPH + {0xEF6F, 0x98CB}, //19537 #CJK UNIFIED IDEOGRAPH + {0xEF70, 0x98CC}, //19538 #CJK UNIFIED IDEOGRAPH + {0xEF71, 0x98CD}, //19539 #CJK UNIFIED IDEOGRAPH + {0xEF72, 0x98CF}, //19540 #CJK UNIFIED IDEOGRAPH + {0xEF73, 0x98D0}, //19541 #CJK UNIFIED IDEOGRAPH + {0xEF74, 0x98D4}, //19542 #CJK UNIFIED IDEOGRAPH + {0xEF75, 0x98D6}, //19543 #CJK UNIFIED IDEOGRAPH + {0xEF76, 0x98D7}, //19544 #CJK UNIFIED IDEOGRAPH + {0xEF77, 0x98DB}, //19545 #CJK UNIFIED IDEOGRAPH + {0xEF78, 0x98DC}, //19546 #CJK UNIFIED IDEOGRAPH + {0xEF79, 0x98DD}, //19547 #CJK UNIFIED IDEOGRAPH + {0xEF7A, 0x98E0}, //19548 #CJK UNIFIED IDEOGRAPH + {0xEF7B, 0x98E1}, //19549 #CJK UNIFIED IDEOGRAPH + {0xEF7C, 0x98E2}, //19550 #CJK UNIFIED IDEOGRAPH + {0xEF7D, 0x98E3}, //19551 #CJK UNIFIED IDEOGRAPH + {0xEF7E, 0x98E4}, //19552 #CJK UNIFIED IDEOGRAPH + {0xEF80, 0x98E5}, //19553 #CJK UNIFIED IDEOGRAPH + {0xEF81, 0x98E6}, //19554 #CJK UNIFIED IDEOGRAPH + {0xEF82, 0x98E9}, //19555 #CJK UNIFIED IDEOGRAPH + {0xEF83, 0x98EA}, //19556 #CJK UNIFIED IDEOGRAPH + {0xEF84, 0x98EB}, //19557 #CJK UNIFIED IDEOGRAPH + {0xEF85, 0x98EC}, //19558 #CJK UNIFIED IDEOGRAPH + {0xEF86, 0x98ED}, //19559 #CJK UNIFIED IDEOGRAPH + {0xEF87, 0x98EE}, //19560 #CJK UNIFIED IDEOGRAPH + {0xEF88, 0x98EF}, //19561 #CJK UNIFIED IDEOGRAPH + {0xEF89, 0x98F0}, //19562 #CJK UNIFIED IDEOGRAPH + {0xEF8A, 0x98F1}, //19563 #CJK UNIFIED IDEOGRAPH + {0xEF8B, 0x98F2}, //19564 #CJK UNIFIED IDEOGRAPH + {0xEF8C, 0x98F3}, //19565 #CJK UNIFIED IDEOGRAPH + {0xEF8D, 0x98F4}, //19566 #CJK UNIFIED IDEOGRAPH + {0xEF8E, 0x98F5}, //19567 #CJK UNIFIED IDEOGRAPH + {0xEF8F, 0x98F6}, //19568 #CJK UNIFIED IDEOGRAPH + {0xEF90, 0x98F7}, //19569 #CJK UNIFIED IDEOGRAPH + {0xEF91, 0x98F8}, //19570 #CJK UNIFIED IDEOGRAPH + {0xEF92, 0x98F9}, //19571 #CJK UNIFIED IDEOGRAPH + {0xEF93, 0x98FA}, //19572 #CJK UNIFIED IDEOGRAPH + {0xEF94, 0x98FB}, //19573 #CJK UNIFIED IDEOGRAPH + {0xEF95, 0x98FC}, //19574 #CJK UNIFIED IDEOGRAPH + {0xEF96, 0x98FD}, //19575 #CJK UNIFIED IDEOGRAPH + {0xEF97, 0x98FE}, //19576 #CJK UNIFIED IDEOGRAPH + {0xEF98, 0x98FF}, //19577 #CJK UNIFIED IDEOGRAPH + {0xEF99, 0x9900}, //19578 #CJK UNIFIED IDEOGRAPH + {0xEF9A, 0x9901}, //19579 #CJK UNIFIED IDEOGRAPH + {0xEF9B, 0x9902}, //19580 #CJK UNIFIED IDEOGRAPH + {0xEF9C, 0x9903}, //19581 #CJK UNIFIED IDEOGRAPH + {0xEF9D, 0x9904}, //19582 #CJK UNIFIED IDEOGRAPH + {0xEF9E, 0x9905}, //19583 #CJK UNIFIED IDEOGRAPH + {0xEF9F, 0x9906}, //19584 #CJK UNIFIED IDEOGRAPH + {0xEFA0, 0x9907}, //19585 #CJK UNIFIED IDEOGRAPH + {0xEFA1, 0x94E9}, //19586 #CJK UNIFIED IDEOGRAPH + {0xEFA2, 0x94EB}, //19587 #CJK UNIFIED IDEOGRAPH + {0xEFA3, 0x94EE}, //19588 #CJK UNIFIED IDEOGRAPH + {0xEFA4, 0x94EF}, //19589 #CJK UNIFIED IDEOGRAPH + {0xEFA5, 0x94F3}, //19590 #CJK UNIFIED IDEOGRAPH + {0xEFA6, 0x94F4}, //19591 #CJK UNIFIED IDEOGRAPH + {0xEFA7, 0x94F5}, //19592 #CJK UNIFIED IDEOGRAPH + {0xEFA8, 0x94F7}, //19593 #CJK UNIFIED IDEOGRAPH + {0xEFA9, 0x94F9}, //19594 #CJK UNIFIED IDEOGRAPH + {0xEFAA, 0x94FC}, //19595 #CJK UNIFIED IDEOGRAPH + {0xEFAB, 0x94FD}, //19596 #CJK UNIFIED IDEOGRAPH + {0xEFAC, 0x94FF}, //19597 #CJK UNIFIED IDEOGRAPH + {0xEFAD, 0x9503}, //19598 #CJK UNIFIED IDEOGRAPH + {0xEFAE, 0x9502}, //19599 #CJK UNIFIED IDEOGRAPH + {0xEFAF, 0x9506}, //19600 #CJK UNIFIED IDEOGRAPH + {0xEFB0, 0x9507}, //19601 #CJK UNIFIED IDEOGRAPH + {0xEFB1, 0x9509}, //19602 #CJK UNIFIED IDEOGRAPH + {0xEFB2, 0x950A}, //19603 #CJK UNIFIED IDEOGRAPH + {0xEFB3, 0x950D}, //19604 #CJK UNIFIED IDEOGRAPH + {0xEFB4, 0x950E}, //19605 #CJK UNIFIED IDEOGRAPH + {0xEFB5, 0x950F}, //19606 #CJK UNIFIED IDEOGRAPH + {0xEFB6, 0x9512}, //19607 #CJK UNIFIED IDEOGRAPH + {0xEFB7, 0x9513}, //19608 #CJK UNIFIED IDEOGRAPH + {0xEFB8, 0x9514}, //19609 #CJK UNIFIED IDEOGRAPH + {0xEFB9, 0x9515}, //19610 #CJK UNIFIED IDEOGRAPH + {0xEFBA, 0x9516}, //19611 #CJK UNIFIED IDEOGRAPH + {0xEFBB, 0x9518}, //19612 #CJK UNIFIED IDEOGRAPH + {0xEFBC, 0x951B}, //19613 #CJK UNIFIED IDEOGRAPH + {0xEFBD, 0x951D}, //19614 #CJK UNIFIED IDEOGRAPH + {0xEFBE, 0x951E}, //19615 #CJK UNIFIED IDEOGRAPH + {0xEFBF, 0x951F}, //19616 #CJK UNIFIED IDEOGRAPH + {0xEFC0, 0x9522}, //19617 #CJK UNIFIED IDEOGRAPH + {0xEFC1, 0x952A}, //19618 #CJK UNIFIED IDEOGRAPH + {0xEFC2, 0x952B}, //19619 #CJK UNIFIED IDEOGRAPH + {0xEFC3, 0x9529}, //19620 #CJK UNIFIED IDEOGRAPH + {0xEFC4, 0x952C}, //19621 #CJK UNIFIED IDEOGRAPH + {0xEFC5, 0x9531}, //19622 #CJK UNIFIED IDEOGRAPH + {0xEFC6, 0x9532}, //19623 #CJK UNIFIED IDEOGRAPH + {0xEFC7, 0x9534}, //19624 #CJK UNIFIED IDEOGRAPH + {0xEFC8, 0x9536}, //19625 #CJK UNIFIED IDEOGRAPH + {0xEFC9, 0x9537}, //19626 #CJK UNIFIED IDEOGRAPH + {0xEFCA, 0x9538}, //19627 #CJK UNIFIED IDEOGRAPH + {0xEFCB, 0x953C}, //19628 #CJK UNIFIED IDEOGRAPH + {0xEFCC, 0x953E}, //19629 #CJK UNIFIED IDEOGRAPH + {0xEFCD, 0x953F}, //19630 #CJK UNIFIED IDEOGRAPH + {0xEFCE, 0x9542}, //19631 #CJK UNIFIED IDEOGRAPH + {0xEFCF, 0x9535}, //19632 #CJK UNIFIED IDEOGRAPH + {0xEFD0, 0x9544}, //19633 #CJK UNIFIED IDEOGRAPH + {0xEFD1, 0x9545}, //19634 #CJK UNIFIED IDEOGRAPH + {0xEFD2, 0x9546}, //19635 #CJK UNIFIED IDEOGRAPH + {0xEFD3, 0x9549}, //19636 #CJK UNIFIED IDEOGRAPH + {0xEFD4, 0x954C}, //19637 #CJK UNIFIED IDEOGRAPH + {0xEFD5, 0x954E}, //19638 #CJK UNIFIED IDEOGRAPH + {0xEFD6, 0x954F}, //19639 #CJK UNIFIED IDEOGRAPH + {0xEFD7, 0x9552}, //19640 #CJK UNIFIED IDEOGRAPH + {0xEFD8, 0x9553}, //19641 #CJK UNIFIED IDEOGRAPH + {0xEFD9, 0x9554}, //19642 #CJK UNIFIED IDEOGRAPH + {0xEFDA, 0x9556}, //19643 #CJK UNIFIED IDEOGRAPH + {0xEFDB, 0x9557}, //19644 #CJK UNIFIED IDEOGRAPH + {0xEFDC, 0x9558}, //19645 #CJK UNIFIED IDEOGRAPH + {0xEFDD, 0x9559}, //19646 #CJK UNIFIED IDEOGRAPH + {0xEFDE, 0x955B}, //19647 #CJK UNIFIED IDEOGRAPH + {0xEFDF, 0x955E}, //19648 #CJK UNIFIED IDEOGRAPH + {0xEFE0, 0x955F}, //19649 #CJK UNIFIED IDEOGRAPH + {0xEFE1, 0x955D}, //19650 #CJK UNIFIED IDEOGRAPH + {0xEFE2, 0x9561}, //19651 #CJK UNIFIED IDEOGRAPH + {0xEFE3, 0x9562}, //19652 #CJK UNIFIED IDEOGRAPH + {0xEFE4, 0x9564}, //19653 #CJK UNIFIED IDEOGRAPH + {0xEFE5, 0x9565}, //19654 #CJK UNIFIED IDEOGRAPH + {0xEFE6, 0x9566}, //19655 #CJK UNIFIED IDEOGRAPH + {0xEFE7, 0x9567}, //19656 #CJK UNIFIED IDEOGRAPH + {0xEFE8, 0x9568}, //19657 #CJK UNIFIED IDEOGRAPH + {0xEFE9, 0x9569}, //19658 #CJK UNIFIED IDEOGRAPH + {0xEFEA, 0x956A}, //19659 #CJK UNIFIED IDEOGRAPH + {0xEFEB, 0x956B}, //19660 #CJK UNIFIED IDEOGRAPH + {0xEFEC, 0x956C}, //19661 #CJK UNIFIED IDEOGRAPH + {0xEFED, 0x956F}, //19662 #CJK UNIFIED IDEOGRAPH + {0xEFEE, 0x9571}, //19663 #CJK UNIFIED IDEOGRAPH + {0xEFEF, 0x9572}, //19664 #CJK UNIFIED IDEOGRAPH + {0xEFF0, 0x9573}, //19665 #CJK UNIFIED IDEOGRAPH + {0xEFF1, 0x953A}, //19666 #CJK UNIFIED IDEOGRAPH + {0xEFF2, 0x77E7}, //19667 #CJK UNIFIED IDEOGRAPH + {0xEFF3, 0x77EC}, //19668 #CJK UNIFIED IDEOGRAPH + {0xEFF4, 0x96C9}, //19669 #CJK UNIFIED IDEOGRAPH + {0xEFF5, 0x79D5}, //19670 #CJK UNIFIED IDEOGRAPH + {0xEFF6, 0x79ED}, //19671 #CJK UNIFIED IDEOGRAPH + {0xEFF7, 0x79E3}, //19672 #CJK UNIFIED IDEOGRAPH + {0xEFF8, 0x79EB}, //19673 #CJK UNIFIED IDEOGRAPH + {0xEFF9, 0x7A06}, //19674 #CJK UNIFIED IDEOGRAPH + {0xEFFA, 0x5D47}, //19675 #CJK UNIFIED IDEOGRAPH + {0xEFFB, 0x7A03}, //19676 #CJK UNIFIED IDEOGRAPH + {0xEFFC, 0x7A02}, //19677 #CJK UNIFIED IDEOGRAPH + {0xEFFD, 0x7A1E}, //19678 #CJK UNIFIED IDEOGRAPH + {0xEFFE, 0x7A14}, //19679 #CJK UNIFIED IDEOGRAPH + {0xF040, 0x9908}, //19680 #CJK UNIFIED IDEOGRAPH + {0xF041, 0x9909}, //19681 #CJK UNIFIED IDEOGRAPH + {0xF042, 0x990A}, //19682 #CJK UNIFIED IDEOGRAPH + {0xF043, 0x990B}, //19683 #CJK UNIFIED IDEOGRAPH + {0xF044, 0x990C}, //19684 #CJK UNIFIED IDEOGRAPH + {0xF045, 0x990E}, //19685 #CJK UNIFIED IDEOGRAPH + {0xF046, 0x990F}, //19686 #CJK UNIFIED IDEOGRAPH + {0xF047, 0x9911}, //19687 #CJK UNIFIED IDEOGRAPH + {0xF048, 0x9912}, //19688 #CJK UNIFIED IDEOGRAPH + {0xF049, 0x9913}, //19689 #CJK UNIFIED IDEOGRAPH + {0xF04A, 0x9914}, //19690 #CJK UNIFIED IDEOGRAPH + {0xF04B, 0x9915}, //19691 #CJK UNIFIED IDEOGRAPH + {0xF04C, 0x9916}, //19692 #CJK UNIFIED IDEOGRAPH + {0xF04D, 0x9917}, //19693 #CJK UNIFIED IDEOGRAPH + {0xF04E, 0x9918}, //19694 #CJK UNIFIED IDEOGRAPH + {0xF04F, 0x9919}, //19695 #CJK UNIFIED IDEOGRAPH + {0xF050, 0x991A}, //19696 #CJK UNIFIED IDEOGRAPH + {0xF051, 0x991B}, //19697 #CJK UNIFIED IDEOGRAPH + {0xF052, 0x991C}, //19698 #CJK UNIFIED IDEOGRAPH + {0xF053, 0x991D}, //19699 #CJK UNIFIED IDEOGRAPH + {0xF054, 0x991E}, //19700 #CJK UNIFIED IDEOGRAPH + {0xF055, 0x991F}, //19701 #CJK UNIFIED IDEOGRAPH + {0xF056, 0x9920}, //19702 #CJK UNIFIED IDEOGRAPH + {0xF057, 0x9921}, //19703 #CJK UNIFIED IDEOGRAPH + {0xF058, 0x9922}, //19704 #CJK UNIFIED IDEOGRAPH + {0xF059, 0x9923}, //19705 #CJK UNIFIED IDEOGRAPH + {0xF05A, 0x9924}, //19706 #CJK UNIFIED IDEOGRAPH + {0xF05B, 0x9925}, //19707 #CJK UNIFIED IDEOGRAPH + {0xF05C, 0x9926}, //19708 #CJK UNIFIED IDEOGRAPH + {0xF05D, 0x9927}, //19709 #CJK UNIFIED IDEOGRAPH + {0xF05E, 0x9928}, //19710 #CJK UNIFIED IDEOGRAPH + {0xF05F, 0x9929}, //19711 #CJK UNIFIED IDEOGRAPH + {0xF060, 0x992A}, //19712 #CJK UNIFIED IDEOGRAPH + {0xF061, 0x992B}, //19713 #CJK UNIFIED IDEOGRAPH + {0xF062, 0x992C}, //19714 #CJK UNIFIED IDEOGRAPH + {0xF063, 0x992D}, //19715 #CJK UNIFIED IDEOGRAPH + {0xF064, 0x992F}, //19716 #CJK UNIFIED IDEOGRAPH + {0xF065, 0x9930}, //19717 #CJK UNIFIED IDEOGRAPH + {0xF066, 0x9931}, //19718 #CJK UNIFIED IDEOGRAPH + {0xF067, 0x9932}, //19719 #CJK UNIFIED IDEOGRAPH + {0xF068, 0x9933}, //19720 #CJK UNIFIED IDEOGRAPH + {0xF069, 0x9934}, //19721 #CJK UNIFIED IDEOGRAPH + {0xF06A, 0x9935}, //19722 #CJK UNIFIED IDEOGRAPH + {0xF06B, 0x9936}, //19723 #CJK UNIFIED IDEOGRAPH + {0xF06C, 0x9937}, //19724 #CJK UNIFIED IDEOGRAPH + {0xF06D, 0x9938}, //19725 #CJK UNIFIED IDEOGRAPH + {0xF06E, 0x9939}, //19726 #CJK UNIFIED IDEOGRAPH + {0xF06F, 0x993A}, //19727 #CJK UNIFIED IDEOGRAPH + {0xF070, 0x993B}, //19728 #CJK UNIFIED IDEOGRAPH + {0xF071, 0x993C}, //19729 #CJK UNIFIED IDEOGRAPH + {0xF072, 0x993D}, //19730 #CJK UNIFIED IDEOGRAPH + {0xF073, 0x993E}, //19731 #CJK UNIFIED IDEOGRAPH + {0xF074, 0x993F}, //19732 #CJK UNIFIED IDEOGRAPH + {0xF075, 0x9940}, //19733 #CJK UNIFIED IDEOGRAPH + {0xF076, 0x9941}, //19734 #CJK UNIFIED IDEOGRAPH + {0xF077, 0x9942}, //19735 #CJK UNIFIED IDEOGRAPH + {0xF078, 0x9943}, //19736 #CJK UNIFIED IDEOGRAPH + {0xF079, 0x9944}, //19737 #CJK UNIFIED IDEOGRAPH + {0xF07A, 0x9945}, //19738 #CJK UNIFIED IDEOGRAPH + {0xF07B, 0x9946}, //19739 #CJK UNIFIED IDEOGRAPH + {0xF07C, 0x9947}, //19740 #CJK UNIFIED IDEOGRAPH + {0xF07D, 0x9948}, //19741 #CJK UNIFIED IDEOGRAPH + {0xF07E, 0x9949}, //19742 #CJK UNIFIED IDEOGRAPH + {0xF080, 0x994A}, //19743 #CJK UNIFIED IDEOGRAPH + {0xF081, 0x994B}, //19744 #CJK UNIFIED IDEOGRAPH + {0xF082, 0x994C}, //19745 #CJK UNIFIED IDEOGRAPH + {0xF083, 0x994D}, //19746 #CJK UNIFIED IDEOGRAPH + {0xF084, 0x994E}, //19747 #CJK UNIFIED IDEOGRAPH + {0xF085, 0x994F}, //19748 #CJK UNIFIED IDEOGRAPH + {0xF086, 0x9950}, //19749 #CJK UNIFIED IDEOGRAPH + {0xF087, 0x9951}, //19750 #CJK UNIFIED IDEOGRAPH + {0xF088, 0x9952}, //19751 #CJK UNIFIED IDEOGRAPH + {0xF089, 0x9953}, //19752 #CJK UNIFIED IDEOGRAPH + {0xF08A, 0x9956}, //19753 #CJK UNIFIED IDEOGRAPH + {0xF08B, 0x9957}, //19754 #CJK UNIFIED IDEOGRAPH + {0xF08C, 0x9958}, //19755 #CJK UNIFIED IDEOGRAPH + {0xF08D, 0x9959}, //19756 #CJK UNIFIED IDEOGRAPH + {0xF08E, 0x995A}, //19757 #CJK UNIFIED IDEOGRAPH + {0xF08F, 0x995B}, //19758 #CJK UNIFIED IDEOGRAPH + {0xF090, 0x995C}, //19759 #CJK UNIFIED IDEOGRAPH + {0xF091, 0x995D}, //19760 #CJK UNIFIED IDEOGRAPH + {0xF092, 0x995E}, //19761 #CJK UNIFIED IDEOGRAPH + {0xF093, 0x995F}, //19762 #CJK UNIFIED IDEOGRAPH + {0xF094, 0x9960}, //19763 #CJK UNIFIED IDEOGRAPH + {0xF095, 0x9961}, //19764 #CJK UNIFIED IDEOGRAPH + {0xF096, 0x9962}, //19765 #CJK UNIFIED IDEOGRAPH + {0xF097, 0x9964}, //19766 #CJK UNIFIED IDEOGRAPH + {0xF098, 0x9966}, //19767 #CJK UNIFIED IDEOGRAPH + {0xF099, 0x9973}, //19768 #CJK UNIFIED IDEOGRAPH + {0xF09A, 0x9978}, //19769 #CJK UNIFIED IDEOGRAPH + {0xF09B, 0x9979}, //19770 #CJK UNIFIED IDEOGRAPH + {0xF09C, 0x997B}, //19771 #CJK UNIFIED IDEOGRAPH + {0xF09D, 0x997E}, //19772 #CJK UNIFIED IDEOGRAPH + {0xF09E, 0x9982}, //19773 #CJK UNIFIED IDEOGRAPH + {0xF09F, 0x9983}, //19774 #CJK UNIFIED IDEOGRAPH + {0xF0A0, 0x9989}, //19775 #CJK UNIFIED IDEOGRAPH + {0xF0A1, 0x7A39}, //19776 #CJK UNIFIED IDEOGRAPH + {0xF0A2, 0x7A37}, //19777 #CJK UNIFIED IDEOGRAPH + {0xF0A3, 0x7A51}, //19778 #CJK UNIFIED IDEOGRAPH + {0xF0A4, 0x9ECF}, //19779 #CJK UNIFIED IDEOGRAPH + {0xF0A5, 0x99A5}, //19780 #CJK UNIFIED IDEOGRAPH + {0xF0A6, 0x7A70}, //19781 #CJK UNIFIED IDEOGRAPH + {0xF0A7, 0x7688}, //19782 #CJK UNIFIED IDEOGRAPH + {0xF0A8, 0x768E}, //19783 #CJK UNIFIED IDEOGRAPH + {0xF0A9, 0x7693}, //19784 #CJK UNIFIED IDEOGRAPH + {0xF0AA, 0x7699}, //19785 #CJK UNIFIED IDEOGRAPH + {0xF0AB, 0x76A4}, //19786 #CJK UNIFIED IDEOGRAPH + {0xF0AC, 0x74DE}, //19787 #CJK UNIFIED IDEOGRAPH + {0xF0AD, 0x74E0}, //19788 #CJK UNIFIED IDEOGRAPH + {0xF0AE, 0x752C}, //19789 #CJK UNIFIED IDEOGRAPH + {0xF0AF, 0x9E20}, //19790 #CJK UNIFIED IDEOGRAPH + {0xF0B0, 0x9E22}, //19791 #CJK UNIFIED IDEOGRAPH + {0xF0B1, 0x9E28}, //19792 #CJK UNIFIED IDEOGRAPH + {0xF0B2, 0x9E29}, //19793 #CJK UNIFIED IDEOGRAPH + {0xF0B3, 0x9E2A}, //19794 #CJK UNIFIED IDEOGRAPH + {0xF0B4, 0x9E2B}, //19795 #CJK UNIFIED IDEOGRAPH + {0xF0B5, 0x9E2C}, //19796 #CJK UNIFIED IDEOGRAPH + {0xF0B6, 0x9E32}, //19797 #CJK UNIFIED IDEOGRAPH + {0xF0B7, 0x9E31}, //19798 #CJK UNIFIED IDEOGRAPH + {0xF0B8, 0x9E36}, //19799 #CJK UNIFIED IDEOGRAPH + {0xF0B9, 0x9E38}, //19800 #CJK UNIFIED IDEOGRAPH + {0xF0BA, 0x9E37}, //19801 #CJK UNIFIED IDEOGRAPH + {0xF0BB, 0x9E39}, //19802 #CJK UNIFIED IDEOGRAPH + {0xF0BC, 0x9E3A}, //19803 #CJK UNIFIED IDEOGRAPH + {0xF0BD, 0x9E3E}, //19804 #CJK UNIFIED IDEOGRAPH + {0xF0BE, 0x9E41}, //19805 #CJK UNIFIED IDEOGRAPH + {0xF0BF, 0x9E42}, //19806 #CJK UNIFIED IDEOGRAPH + {0xF0C0, 0x9E44}, //19807 #CJK UNIFIED IDEOGRAPH + {0xF0C1, 0x9E46}, //19808 #CJK UNIFIED IDEOGRAPH + {0xF0C2, 0x9E47}, //19809 #CJK UNIFIED IDEOGRAPH + {0xF0C3, 0x9E48}, //19810 #CJK UNIFIED IDEOGRAPH + {0xF0C4, 0x9E49}, //19811 #CJK UNIFIED IDEOGRAPH + {0xF0C5, 0x9E4B}, //19812 #CJK UNIFIED IDEOGRAPH + {0xF0C6, 0x9E4C}, //19813 #CJK UNIFIED IDEOGRAPH + {0xF0C7, 0x9E4E}, //19814 #CJK UNIFIED IDEOGRAPH + {0xF0C8, 0x9E51}, //19815 #CJK UNIFIED IDEOGRAPH + {0xF0C9, 0x9E55}, //19816 #CJK UNIFIED IDEOGRAPH + {0xF0CA, 0x9E57}, //19817 #CJK UNIFIED IDEOGRAPH + {0xF0CB, 0x9E5A}, //19818 #CJK UNIFIED IDEOGRAPH + {0xF0CC, 0x9E5B}, //19819 #CJK UNIFIED IDEOGRAPH + {0xF0CD, 0x9E5C}, //19820 #CJK UNIFIED IDEOGRAPH + {0xF0CE, 0x9E5E}, //19821 #CJK UNIFIED IDEOGRAPH + {0xF0CF, 0x9E63}, //19822 #CJK UNIFIED IDEOGRAPH + {0xF0D0, 0x9E66}, //19823 #CJK UNIFIED IDEOGRAPH + {0xF0D1, 0x9E67}, //19824 #CJK UNIFIED IDEOGRAPH + {0xF0D2, 0x9E68}, //19825 #CJK UNIFIED IDEOGRAPH + {0xF0D3, 0x9E69}, //19826 #CJK UNIFIED IDEOGRAPH + {0xF0D4, 0x9E6A}, //19827 #CJK UNIFIED IDEOGRAPH + {0xF0D5, 0x9E6B}, //19828 #CJK UNIFIED IDEOGRAPH + {0xF0D6, 0x9E6C}, //19829 #CJK UNIFIED IDEOGRAPH + {0xF0D7, 0x9E71}, //19830 #CJK UNIFIED IDEOGRAPH + {0xF0D8, 0x9E6D}, //19831 #CJK UNIFIED IDEOGRAPH + {0xF0D9, 0x9E73}, //19832 #CJK UNIFIED IDEOGRAPH + {0xF0DA, 0x7592}, //19833 #CJK UNIFIED IDEOGRAPH + {0xF0DB, 0x7594}, //19834 #CJK UNIFIED IDEOGRAPH + {0xF0DC, 0x7596}, //19835 #CJK UNIFIED IDEOGRAPH + {0xF0DD, 0x75A0}, //19836 #CJK UNIFIED IDEOGRAPH + {0xF0DE, 0x759D}, //19837 #CJK UNIFIED IDEOGRAPH + {0xF0DF, 0x75AC}, //19838 #CJK UNIFIED IDEOGRAPH + {0xF0E0, 0x75A3}, //19839 #CJK UNIFIED IDEOGRAPH + {0xF0E1, 0x75B3}, //19840 #CJK UNIFIED IDEOGRAPH + {0xF0E2, 0x75B4}, //19841 #CJK UNIFIED IDEOGRAPH + {0xF0E3, 0x75B8}, //19842 #CJK UNIFIED IDEOGRAPH + {0xF0E4, 0x75C4}, //19843 #CJK UNIFIED IDEOGRAPH + {0xF0E5, 0x75B1}, //19844 #CJK UNIFIED IDEOGRAPH + {0xF0E6, 0x75B0}, //19845 #CJK UNIFIED IDEOGRAPH + {0xF0E7, 0x75C3}, //19846 #CJK UNIFIED IDEOGRAPH + {0xF0E8, 0x75C2}, //19847 #CJK UNIFIED IDEOGRAPH + {0xF0E9, 0x75D6}, //19848 #CJK UNIFIED IDEOGRAPH + {0xF0EA, 0x75CD}, //19849 #CJK UNIFIED IDEOGRAPH + {0xF0EB, 0x75E3}, //19850 #CJK UNIFIED IDEOGRAPH + {0xF0EC, 0x75E8}, //19851 #CJK UNIFIED IDEOGRAPH + {0xF0ED, 0x75E6}, //19852 #CJK UNIFIED IDEOGRAPH + {0xF0EE, 0x75E4}, //19853 #CJK UNIFIED IDEOGRAPH + {0xF0EF, 0x75EB}, //19854 #CJK UNIFIED IDEOGRAPH + {0xF0F0, 0x75E7}, //19855 #CJK UNIFIED IDEOGRAPH + {0xF0F1, 0x7603}, //19856 #CJK UNIFIED IDEOGRAPH + {0xF0F2, 0x75F1}, //19857 #CJK UNIFIED IDEOGRAPH + {0xF0F3, 0x75FC}, //19858 #CJK UNIFIED IDEOGRAPH + {0xF0F4, 0x75FF}, //19859 #CJK UNIFIED IDEOGRAPH + {0xF0F5, 0x7610}, //19860 #CJK UNIFIED IDEOGRAPH + {0xF0F6, 0x7600}, //19861 #CJK UNIFIED IDEOGRAPH + {0xF0F7, 0x7605}, //19862 #CJK UNIFIED IDEOGRAPH + {0xF0F8, 0x760C}, //19863 #CJK UNIFIED IDEOGRAPH + {0xF0F9, 0x7617}, //19864 #CJK UNIFIED IDEOGRAPH + {0xF0FA, 0x760A}, //19865 #CJK UNIFIED IDEOGRAPH + {0xF0FB, 0x7625}, //19866 #CJK UNIFIED IDEOGRAPH + {0xF0FC, 0x7618}, //19867 #CJK UNIFIED IDEOGRAPH + {0xF0FD, 0x7615}, //19868 #CJK UNIFIED IDEOGRAPH + {0xF0FE, 0x7619}, //19869 #CJK UNIFIED IDEOGRAPH + {0xF140, 0x998C}, //19870 #CJK UNIFIED IDEOGRAPH + {0xF141, 0x998E}, //19871 #CJK UNIFIED IDEOGRAPH + {0xF142, 0x999A}, //19872 #CJK UNIFIED IDEOGRAPH + {0xF143, 0x999B}, //19873 #CJK UNIFIED IDEOGRAPH + {0xF144, 0x999C}, //19874 #CJK UNIFIED IDEOGRAPH + {0xF145, 0x999D}, //19875 #CJK UNIFIED IDEOGRAPH + {0xF146, 0x999E}, //19876 #CJK UNIFIED IDEOGRAPH + {0xF147, 0x999F}, //19877 #CJK UNIFIED IDEOGRAPH + {0xF148, 0x99A0}, //19878 #CJK UNIFIED IDEOGRAPH + {0xF149, 0x99A1}, //19879 #CJK UNIFIED IDEOGRAPH + {0xF14A, 0x99A2}, //19880 #CJK UNIFIED IDEOGRAPH + {0xF14B, 0x99A3}, //19881 #CJK UNIFIED IDEOGRAPH + {0xF14C, 0x99A4}, //19882 #CJK UNIFIED IDEOGRAPH + {0xF14D, 0x99A6}, //19883 #CJK UNIFIED IDEOGRAPH + {0xF14E, 0x99A7}, //19884 #CJK UNIFIED IDEOGRAPH + {0xF14F, 0x99A9}, //19885 #CJK UNIFIED IDEOGRAPH + {0xF150, 0x99AA}, //19886 #CJK UNIFIED IDEOGRAPH + {0xF151, 0x99AB}, //19887 #CJK UNIFIED IDEOGRAPH + {0xF152, 0x99AC}, //19888 #CJK UNIFIED IDEOGRAPH + {0xF153, 0x99AD}, //19889 #CJK UNIFIED IDEOGRAPH + {0xF154, 0x99AE}, //19890 #CJK UNIFIED IDEOGRAPH + {0xF155, 0x99AF}, //19891 #CJK UNIFIED IDEOGRAPH + {0xF156, 0x99B0}, //19892 #CJK UNIFIED IDEOGRAPH + {0xF157, 0x99B1}, //19893 #CJK UNIFIED IDEOGRAPH + {0xF158, 0x99B2}, //19894 #CJK UNIFIED IDEOGRAPH + {0xF159, 0x99B3}, //19895 #CJK UNIFIED IDEOGRAPH + {0xF15A, 0x99B4}, //19896 #CJK UNIFIED IDEOGRAPH + {0xF15B, 0x99B5}, //19897 #CJK UNIFIED IDEOGRAPH + {0xF15C, 0x99B6}, //19898 #CJK UNIFIED IDEOGRAPH + {0xF15D, 0x99B7}, //19899 #CJK UNIFIED IDEOGRAPH + {0xF15E, 0x99B8}, //19900 #CJK UNIFIED IDEOGRAPH + {0xF15F, 0x99B9}, //19901 #CJK UNIFIED IDEOGRAPH + {0xF160, 0x99BA}, //19902 #CJK UNIFIED IDEOGRAPH + {0xF161, 0x99BB}, //19903 #CJK UNIFIED IDEOGRAPH + {0xF162, 0x99BC}, //19904 #CJK UNIFIED IDEOGRAPH + {0xF163, 0x99BD}, //19905 #CJK UNIFIED IDEOGRAPH + {0xF164, 0x99BE}, //19906 #CJK UNIFIED IDEOGRAPH + {0xF165, 0x99BF}, //19907 #CJK UNIFIED IDEOGRAPH + {0xF166, 0x99C0}, //19908 #CJK UNIFIED IDEOGRAPH + {0xF167, 0x99C1}, //19909 #CJK UNIFIED IDEOGRAPH + {0xF168, 0x99C2}, //19910 #CJK UNIFIED IDEOGRAPH + {0xF169, 0x99C3}, //19911 #CJK UNIFIED IDEOGRAPH + {0xF16A, 0x99C4}, //19912 #CJK UNIFIED IDEOGRAPH + {0xF16B, 0x99C5}, //19913 #CJK UNIFIED IDEOGRAPH + {0xF16C, 0x99C6}, //19914 #CJK UNIFIED IDEOGRAPH + {0xF16D, 0x99C7}, //19915 #CJK UNIFIED IDEOGRAPH + {0xF16E, 0x99C8}, //19916 #CJK UNIFIED IDEOGRAPH + {0xF16F, 0x99C9}, //19917 #CJK UNIFIED IDEOGRAPH + {0xF170, 0x99CA}, //19918 #CJK UNIFIED IDEOGRAPH + {0xF171, 0x99CB}, //19919 #CJK UNIFIED IDEOGRAPH + {0xF172, 0x99CC}, //19920 #CJK UNIFIED IDEOGRAPH + {0xF173, 0x99CD}, //19921 #CJK UNIFIED IDEOGRAPH + {0xF174, 0x99CE}, //19922 #CJK UNIFIED IDEOGRAPH + {0xF175, 0x99CF}, //19923 #CJK UNIFIED IDEOGRAPH + {0xF176, 0x99D0}, //19924 #CJK UNIFIED IDEOGRAPH + {0xF177, 0x99D1}, //19925 #CJK UNIFIED IDEOGRAPH + {0xF178, 0x99D2}, //19926 #CJK UNIFIED IDEOGRAPH + {0xF179, 0x99D3}, //19927 #CJK UNIFIED IDEOGRAPH + {0xF17A, 0x99D4}, //19928 #CJK UNIFIED IDEOGRAPH + {0xF17B, 0x99D5}, //19929 #CJK UNIFIED IDEOGRAPH + {0xF17C, 0x99D6}, //19930 #CJK UNIFIED IDEOGRAPH + {0xF17D, 0x99D7}, //19931 #CJK UNIFIED IDEOGRAPH + {0xF17E, 0x99D8}, //19932 #CJK UNIFIED IDEOGRAPH + {0xF180, 0x99D9}, //19933 #CJK UNIFIED IDEOGRAPH + {0xF181, 0x99DA}, //19934 #CJK UNIFIED IDEOGRAPH + {0xF182, 0x99DB}, //19935 #CJK UNIFIED IDEOGRAPH + {0xF183, 0x99DC}, //19936 #CJK UNIFIED IDEOGRAPH + {0xF184, 0x99DD}, //19937 #CJK UNIFIED IDEOGRAPH + {0xF185, 0x99DE}, //19938 #CJK UNIFIED IDEOGRAPH + {0xF186, 0x99DF}, //19939 #CJK UNIFIED IDEOGRAPH + {0xF187, 0x99E0}, //19940 #CJK UNIFIED IDEOGRAPH + {0xF188, 0x99E1}, //19941 #CJK UNIFIED IDEOGRAPH + {0xF189, 0x99E2}, //19942 #CJK UNIFIED IDEOGRAPH + {0xF18A, 0x99E3}, //19943 #CJK UNIFIED IDEOGRAPH + {0xF18B, 0x99E4}, //19944 #CJK UNIFIED IDEOGRAPH + {0xF18C, 0x99E5}, //19945 #CJK UNIFIED IDEOGRAPH + {0xF18D, 0x99E6}, //19946 #CJK UNIFIED IDEOGRAPH + {0xF18E, 0x99E7}, //19947 #CJK UNIFIED IDEOGRAPH + {0xF18F, 0x99E8}, //19948 #CJK UNIFIED IDEOGRAPH + {0xF190, 0x99E9}, //19949 #CJK UNIFIED IDEOGRAPH + {0xF191, 0x99EA}, //19950 #CJK UNIFIED IDEOGRAPH + {0xF192, 0x99EB}, //19951 #CJK UNIFIED IDEOGRAPH + {0xF193, 0x99EC}, //19952 #CJK UNIFIED IDEOGRAPH + {0xF194, 0x99ED}, //19953 #CJK UNIFIED IDEOGRAPH + {0xF195, 0x99EE}, //19954 #CJK UNIFIED IDEOGRAPH + {0xF196, 0x99EF}, //19955 #CJK UNIFIED IDEOGRAPH + {0xF197, 0x99F0}, //19956 #CJK UNIFIED IDEOGRAPH + {0xF198, 0x99F1}, //19957 #CJK UNIFIED IDEOGRAPH + {0xF199, 0x99F2}, //19958 #CJK UNIFIED IDEOGRAPH + {0xF19A, 0x99F3}, //19959 #CJK UNIFIED IDEOGRAPH + {0xF19B, 0x99F4}, //19960 #CJK UNIFIED IDEOGRAPH + {0xF19C, 0x99F5}, //19961 #CJK UNIFIED IDEOGRAPH + {0xF19D, 0x99F6}, //19962 #CJK UNIFIED IDEOGRAPH + {0xF19E, 0x99F7}, //19963 #CJK UNIFIED IDEOGRAPH + {0xF19F, 0x99F8}, //19964 #CJK UNIFIED IDEOGRAPH + {0xF1A0, 0x99F9}, //19965 #CJK UNIFIED IDEOGRAPH + {0xF1A1, 0x761B}, //19966 #CJK UNIFIED IDEOGRAPH + {0xF1A2, 0x763C}, //19967 #CJK UNIFIED IDEOGRAPH + {0xF1A3, 0x7622}, //19968 #CJK UNIFIED IDEOGRAPH + {0xF1A4, 0x7620}, //19969 #CJK UNIFIED IDEOGRAPH + {0xF1A5, 0x7640}, //19970 #CJK UNIFIED IDEOGRAPH + {0xF1A6, 0x762D}, //19971 #CJK UNIFIED IDEOGRAPH + {0xF1A7, 0x7630}, //19972 #CJK UNIFIED IDEOGRAPH + {0xF1A8, 0x763F}, //19973 #CJK UNIFIED IDEOGRAPH + {0xF1A9, 0x7635}, //19974 #CJK UNIFIED IDEOGRAPH + {0xF1AA, 0x7643}, //19975 #CJK UNIFIED IDEOGRAPH + {0xF1AB, 0x763E}, //19976 #CJK UNIFIED IDEOGRAPH + {0xF1AC, 0x7633}, //19977 #CJK UNIFIED IDEOGRAPH + {0xF1AD, 0x764D}, //19978 #CJK UNIFIED IDEOGRAPH + {0xF1AE, 0x765E}, //19979 #CJK UNIFIED IDEOGRAPH + {0xF1AF, 0x7654}, //19980 #CJK UNIFIED IDEOGRAPH + {0xF1B0, 0x765C}, //19981 #CJK UNIFIED IDEOGRAPH + {0xF1B1, 0x7656}, //19982 #CJK UNIFIED IDEOGRAPH + {0xF1B2, 0x766B}, //19983 #CJK UNIFIED IDEOGRAPH + {0xF1B3, 0x766F}, //19984 #CJK UNIFIED IDEOGRAPH + {0xF1B4, 0x7FCA}, //19985 #CJK UNIFIED IDEOGRAPH + {0xF1B5, 0x7AE6}, //19986 #CJK UNIFIED IDEOGRAPH + {0xF1B6, 0x7A78}, //19987 #CJK UNIFIED IDEOGRAPH + {0xF1B7, 0x7A79}, //19988 #CJK UNIFIED IDEOGRAPH + {0xF1B8, 0x7A80}, //19989 #CJK UNIFIED IDEOGRAPH + {0xF1B9, 0x7A86}, //19990 #CJK UNIFIED IDEOGRAPH + {0xF1BA, 0x7A88}, //19991 #CJK UNIFIED IDEOGRAPH + {0xF1BB, 0x7A95}, //19992 #CJK UNIFIED IDEOGRAPH + {0xF1BC, 0x7AA6}, //19993 #CJK UNIFIED IDEOGRAPH + {0xF1BD, 0x7AA0}, //19994 #CJK UNIFIED IDEOGRAPH + {0xF1BE, 0x7AAC}, //19995 #CJK UNIFIED IDEOGRAPH + {0xF1BF, 0x7AA8}, //19996 #CJK UNIFIED IDEOGRAPH + {0xF1C0, 0x7AAD}, //19997 #CJK UNIFIED IDEOGRAPH + {0xF1C1, 0x7AB3}, //19998 #CJK UNIFIED IDEOGRAPH + {0xF1C2, 0x8864}, //19999 #CJK UNIFIED IDEOGRAPH + {0xF1C3, 0x8869}, //20000 #CJK UNIFIED IDEOGRAPH + {0xF1C4, 0x8872}, //20001 #CJK UNIFIED IDEOGRAPH + {0xF1C5, 0x887D}, //20002 #CJK UNIFIED IDEOGRAPH + {0xF1C6, 0x887F}, //20003 #CJK UNIFIED IDEOGRAPH + {0xF1C7, 0x8882}, //20004 #CJK UNIFIED IDEOGRAPH + {0xF1C8, 0x88A2}, //20005 #CJK UNIFIED IDEOGRAPH + {0xF1C9, 0x88C6}, //20006 #CJK UNIFIED IDEOGRAPH + {0xF1CA, 0x88B7}, //20007 #CJK UNIFIED IDEOGRAPH + {0xF1CB, 0x88BC}, //20008 #CJK UNIFIED IDEOGRAPH + {0xF1CC, 0x88C9}, //20009 #CJK UNIFIED IDEOGRAPH + {0xF1CD, 0x88E2}, //20010 #CJK UNIFIED IDEOGRAPH + {0xF1CE, 0x88CE}, //20011 #CJK UNIFIED IDEOGRAPH + {0xF1CF, 0x88E3}, //20012 #CJK UNIFIED IDEOGRAPH + {0xF1D0, 0x88E5}, //20013 #CJK UNIFIED IDEOGRAPH + {0xF1D1, 0x88F1}, //20014 #CJK UNIFIED IDEOGRAPH + {0xF1D2, 0x891A}, //20015 #CJK UNIFIED IDEOGRAPH + {0xF1D3, 0x88FC}, //20016 #CJK UNIFIED IDEOGRAPH + {0xF1D4, 0x88E8}, //20017 #CJK UNIFIED IDEOGRAPH + {0xF1D5, 0x88FE}, //20018 #CJK UNIFIED IDEOGRAPH + {0xF1D6, 0x88F0}, //20019 #CJK UNIFIED IDEOGRAPH + {0xF1D7, 0x8921}, //20020 #CJK UNIFIED IDEOGRAPH + {0xF1D8, 0x8919}, //20021 #CJK UNIFIED IDEOGRAPH + {0xF1D9, 0x8913}, //20022 #CJK UNIFIED IDEOGRAPH + {0xF1DA, 0x891B}, //20023 #CJK UNIFIED IDEOGRAPH + {0xF1DB, 0x890A}, //20024 #CJK UNIFIED IDEOGRAPH + {0xF1DC, 0x8934}, //20025 #CJK UNIFIED IDEOGRAPH + {0xF1DD, 0x892B}, //20026 #CJK UNIFIED IDEOGRAPH + {0xF1DE, 0x8936}, //20027 #CJK UNIFIED IDEOGRAPH + {0xF1DF, 0x8941}, //20028 #CJK UNIFIED IDEOGRAPH + {0xF1E0, 0x8966}, //20029 #CJK UNIFIED IDEOGRAPH + {0xF1E1, 0x897B}, //20030 #CJK UNIFIED IDEOGRAPH + {0xF1E2, 0x758B}, //20031 #CJK UNIFIED IDEOGRAPH + {0xF1E3, 0x80E5}, //20032 #CJK UNIFIED IDEOGRAPH + {0xF1E4, 0x76B2}, //20033 #CJK UNIFIED IDEOGRAPH + {0xF1E5, 0x76B4}, //20034 #CJK UNIFIED IDEOGRAPH + {0xF1E6, 0x77DC}, //20035 #CJK UNIFIED IDEOGRAPH + {0xF1E7, 0x8012}, //20036 #CJK UNIFIED IDEOGRAPH + {0xF1E8, 0x8014}, //20037 #CJK UNIFIED IDEOGRAPH + {0xF1E9, 0x8016}, //20038 #CJK UNIFIED IDEOGRAPH + {0xF1EA, 0x801C}, //20039 #CJK UNIFIED IDEOGRAPH + {0xF1EB, 0x8020}, //20040 #CJK UNIFIED IDEOGRAPH + {0xF1EC, 0x8022}, //20041 #CJK UNIFIED IDEOGRAPH + {0xF1ED, 0x8025}, //20042 #CJK UNIFIED IDEOGRAPH + {0xF1EE, 0x8026}, //20043 #CJK UNIFIED IDEOGRAPH + {0xF1EF, 0x8027}, //20044 #CJK UNIFIED IDEOGRAPH + {0xF1F0, 0x8029}, //20045 #CJK UNIFIED IDEOGRAPH + {0xF1F1, 0x8028}, //20046 #CJK UNIFIED IDEOGRAPH + {0xF1F2, 0x8031}, //20047 #CJK UNIFIED IDEOGRAPH + {0xF1F3, 0x800B}, //20048 #CJK UNIFIED IDEOGRAPH + {0xF1F4, 0x8035}, //20049 #CJK UNIFIED IDEOGRAPH + {0xF1F5, 0x8043}, //20050 #CJK UNIFIED IDEOGRAPH + {0xF1F6, 0x8046}, //20051 #CJK UNIFIED IDEOGRAPH + {0xF1F7, 0x804D}, //20052 #CJK UNIFIED IDEOGRAPH + {0xF1F8, 0x8052}, //20053 #CJK UNIFIED IDEOGRAPH + {0xF1F9, 0x8069}, //20054 #CJK UNIFIED IDEOGRAPH + {0xF1FA, 0x8071}, //20055 #CJK UNIFIED IDEOGRAPH + {0xF1FB, 0x8983}, //20056 #CJK UNIFIED IDEOGRAPH + {0xF1FC, 0x9878}, //20057 #CJK UNIFIED IDEOGRAPH + {0xF1FD, 0x9880}, //20058 #CJK UNIFIED IDEOGRAPH + {0xF1FE, 0x9883}, //20059 #CJK UNIFIED IDEOGRAPH + {0xF240, 0x99FA}, //20060 #CJK UNIFIED IDEOGRAPH + {0xF241, 0x99FB}, //20061 #CJK UNIFIED IDEOGRAPH + {0xF242, 0x99FC}, //20062 #CJK UNIFIED IDEOGRAPH + {0xF243, 0x99FD}, //20063 #CJK UNIFIED IDEOGRAPH + {0xF244, 0x99FE}, //20064 #CJK UNIFIED IDEOGRAPH + {0xF245, 0x99FF}, //20065 #CJK UNIFIED IDEOGRAPH + {0xF246, 0x9A00}, //20066 #CJK UNIFIED IDEOGRAPH + {0xF247, 0x9A01}, //20067 #CJK UNIFIED IDEOGRAPH + {0xF248, 0x9A02}, //20068 #CJK UNIFIED IDEOGRAPH + {0xF249, 0x9A03}, //20069 #CJK UNIFIED IDEOGRAPH + {0xF24A, 0x9A04}, //20070 #CJK UNIFIED IDEOGRAPH + {0xF24B, 0x9A05}, //20071 #CJK UNIFIED IDEOGRAPH + {0xF24C, 0x9A06}, //20072 #CJK UNIFIED IDEOGRAPH + {0xF24D, 0x9A07}, //20073 #CJK UNIFIED IDEOGRAPH + {0xF24E, 0x9A08}, //20074 #CJK UNIFIED IDEOGRAPH + {0xF24F, 0x9A09}, //20075 #CJK UNIFIED IDEOGRAPH + {0xF250, 0x9A0A}, //20076 #CJK UNIFIED IDEOGRAPH + {0xF251, 0x9A0B}, //20077 #CJK UNIFIED IDEOGRAPH + {0xF252, 0x9A0C}, //20078 #CJK UNIFIED IDEOGRAPH + {0xF253, 0x9A0D}, //20079 #CJK UNIFIED IDEOGRAPH + {0xF254, 0x9A0E}, //20080 #CJK UNIFIED IDEOGRAPH + {0xF255, 0x9A0F}, //20081 #CJK UNIFIED IDEOGRAPH + {0xF256, 0x9A10}, //20082 #CJK UNIFIED IDEOGRAPH + {0xF257, 0x9A11}, //20083 #CJK UNIFIED IDEOGRAPH + {0xF258, 0x9A12}, //20084 #CJK UNIFIED IDEOGRAPH + {0xF259, 0x9A13}, //20085 #CJK UNIFIED IDEOGRAPH + {0xF25A, 0x9A14}, //20086 #CJK UNIFIED IDEOGRAPH + {0xF25B, 0x9A15}, //20087 #CJK UNIFIED IDEOGRAPH + {0xF25C, 0x9A16}, //20088 #CJK UNIFIED IDEOGRAPH + {0xF25D, 0x9A17}, //20089 #CJK UNIFIED IDEOGRAPH + {0xF25E, 0x9A18}, //20090 #CJK UNIFIED IDEOGRAPH + {0xF25F, 0x9A19}, //20091 #CJK UNIFIED IDEOGRAPH + {0xF260, 0x9A1A}, //20092 #CJK UNIFIED IDEOGRAPH + {0xF261, 0x9A1B}, //20093 #CJK UNIFIED IDEOGRAPH + {0xF262, 0x9A1C}, //20094 #CJK UNIFIED IDEOGRAPH + {0xF263, 0x9A1D}, //20095 #CJK UNIFIED IDEOGRAPH + {0xF264, 0x9A1E}, //20096 #CJK UNIFIED IDEOGRAPH + {0xF265, 0x9A1F}, //20097 #CJK UNIFIED IDEOGRAPH + {0xF266, 0x9A20}, //20098 #CJK UNIFIED IDEOGRAPH + {0xF267, 0x9A21}, //20099 #CJK UNIFIED IDEOGRAPH + {0xF268, 0x9A22}, //20100 #CJK UNIFIED IDEOGRAPH + {0xF269, 0x9A23}, //20101 #CJK UNIFIED IDEOGRAPH + {0xF26A, 0x9A24}, //20102 #CJK UNIFIED IDEOGRAPH + {0xF26B, 0x9A25}, //20103 #CJK UNIFIED IDEOGRAPH + {0xF26C, 0x9A26}, //20104 #CJK UNIFIED IDEOGRAPH + {0xF26D, 0x9A27}, //20105 #CJK UNIFIED IDEOGRAPH + {0xF26E, 0x9A28}, //20106 #CJK UNIFIED IDEOGRAPH + {0xF26F, 0x9A29}, //20107 #CJK UNIFIED IDEOGRAPH + {0xF270, 0x9A2A}, //20108 #CJK UNIFIED IDEOGRAPH + {0xF271, 0x9A2B}, //20109 #CJK UNIFIED IDEOGRAPH + {0xF272, 0x9A2C}, //20110 #CJK UNIFIED IDEOGRAPH + {0xF273, 0x9A2D}, //20111 #CJK UNIFIED IDEOGRAPH + {0xF274, 0x9A2E}, //20112 #CJK UNIFIED IDEOGRAPH + {0xF275, 0x9A2F}, //20113 #CJK UNIFIED IDEOGRAPH + {0xF276, 0x9A30}, //20114 #CJK UNIFIED IDEOGRAPH + {0xF277, 0x9A31}, //20115 #CJK UNIFIED IDEOGRAPH + {0xF278, 0x9A32}, //20116 #CJK UNIFIED IDEOGRAPH + {0xF279, 0x9A33}, //20117 #CJK UNIFIED IDEOGRAPH + {0xF27A, 0x9A34}, //20118 #CJK UNIFIED IDEOGRAPH + {0xF27B, 0x9A35}, //20119 #CJK UNIFIED IDEOGRAPH + {0xF27C, 0x9A36}, //20120 #CJK UNIFIED IDEOGRAPH + {0xF27D, 0x9A37}, //20121 #CJK UNIFIED IDEOGRAPH + {0xF27E, 0x9A38}, //20122 #CJK UNIFIED IDEOGRAPH + {0xF280, 0x9A39}, //20123 #CJK UNIFIED IDEOGRAPH + {0xF281, 0x9A3A}, //20124 #CJK UNIFIED IDEOGRAPH + {0xF282, 0x9A3B}, //20125 #CJK UNIFIED IDEOGRAPH + {0xF283, 0x9A3C}, //20126 #CJK UNIFIED IDEOGRAPH + {0xF284, 0x9A3D}, //20127 #CJK UNIFIED IDEOGRAPH + {0xF285, 0x9A3E}, //20128 #CJK UNIFIED IDEOGRAPH + {0xF286, 0x9A3F}, //20129 #CJK UNIFIED IDEOGRAPH + {0xF287, 0x9A40}, //20130 #CJK UNIFIED IDEOGRAPH + {0xF288, 0x9A41}, //20131 #CJK UNIFIED IDEOGRAPH + {0xF289, 0x9A42}, //20132 #CJK UNIFIED IDEOGRAPH + {0xF28A, 0x9A43}, //20133 #CJK UNIFIED IDEOGRAPH + {0xF28B, 0x9A44}, //20134 #CJK UNIFIED IDEOGRAPH + {0xF28C, 0x9A45}, //20135 #CJK UNIFIED IDEOGRAPH + {0xF28D, 0x9A46}, //20136 #CJK UNIFIED IDEOGRAPH + {0xF28E, 0x9A47}, //20137 #CJK UNIFIED IDEOGRAPH + {0xF28F, 0x9A48}, //20138 #CJK UNIFIED IDEOGRAPH + {0xF290, 0x9A49}, //20139 #CJK UNIFIED IDEOGRAPH + {0xF291, 0x9A4A}, //20140 #CJK UNIFIED IDEOGRAPH + {0xF292, 0x9A4B}, //20141 #CJK UNIFIED IDEOGRAPH + {0xF293, 0x9A4C}, //20142 #CJK UNIFIED IDEOGRAPH + {0xF294, 0x9A4D}, //20143 #CJK UNIFIED IDEOGRAPH + {0xF295, 0x9A4E}, //20144 #CJK UNIFIED IDEOGRAPH + {0xF296, 0x9A4F}, //20145 #CJK UNIFIED IDEOGRAPH + {0xF297, 0x9A50}, //20146 #CJK UNIFIED IDEOGRAPH + {0xF298, 0x9A51}, //20147 #CJK UNIFIED IDEOGRAPH + {0xF299, 0x9A52}, //20148 #CJK UNIFIED IDEOGRAPH + {0xF29A, 0x9A53}, //20149 #CJK UNIFIED IDEOGRAPH + {0xF29B, 0x9A54}, //20150 #CJK UNIFIED IDEOGRAPH + {0xF29C, 0x9A55}, //20151 #CJK UNIFIED IDEOGRAPH + {0xF29D, 0x9A56}, //20152 #CJK UNIFIED IDEOGRAPH + {0xF29E, 0x9A57}, //20153 #CJK UNIFIED IDEOGRAPH + {0xF29F, 0x9A58}, //20154 #CJK UNIFIED IDEOGRAPH + {0xF2A0, 0x9A59}, //20155 #CJK UNIFIED IDEOGRAPH + {0xF2A1, 0x9889}, //20156 #CJK UNIFIED IDEOGRAPH + {0xF2A2, 0x988C}, //20157 #CJK UNIFIED IDEOGRAPH + {0xF2A3, 0x988D}, //20158 #CJK UNIFIED IDEOGRAPH + {0xF2A4, 0x988F}, //20159 #CJK UNIFIED IDEOGRAPH + {0xF2A5, 0x9894}, //20160 #CJK UNIFIED IDEOGRAPH + {0xF2A6, 0x989A}, //20161 #CJK UNIFIED IDEOGRAPH + {0xF2A7, 0x989B}, //20162 #CJK UNIFIED IDEOGRAPH + {0xF2A8, 0x989E}, //20163 #CJK UNIFIED IDEOGRAPH + {0xF2A9, 0x989F}, //20164 #CJK UNIFIED IDEOGRAPH + {0xF2AA, 0x98A1}, //20165 #CJK UNIFIED IDEOGRAPH + {0xF2AB, 0x98A2}, //20166 #CJK UNIFIED IDEOGRAPH + {0xF2AC, 0x98A5}, //20167 #CJK UNIFIED IDEOGRAPH + {0xF2AD, 0x98A6}, //20168 #CJK UNIFIED IDEOGRAPH + {0xF2AE, 0x864D}, //20169 #CJK UNIFIED IDEOGRAPH + {0xF2AF, 0x8654}, //20170 #CJK UNIFIED IDEOGRAPH + {0xF2B0, 0x866C}, //20171 #CJK UNIFIED IDEOGRAPH + {0xF2B1, 0x866E}, //20172 #CJK UNIFIED IDEOGRAPH + {0xF2B2, 0x867F}, //20173 #CJK UNIFIED IDEOGRAPH + {0xF2B3, 0x867A}, //20174 #CJK UNIFIED IDEOGRAPH + {0xF2B4, 0x867C}, //20175 #CJK UNIFIED IDEOGRAPH + {0xF2B5, 0x867B}, //20176 #CJK UNIFIED IDEOGRAPH + {0xF2B6, 0x86A8}, //20177 #CJK UNIFIED IDEOGRAPH + {0xF2B7, 0x868D}, //20178 #CJK UNIFIED IDEOGRAPH + {0xF2B8, 0x868B}, //20179 #CJK UNIFIED IDEOGRAPH + {0xF2B9, 0x86AC}, //20180 #CJK UNIFIED IDEOGRAPH + {0xF2BA, 0x869D}, //20181 #CJK UNIFIED IDEOGRAPH + {0xF2BB, 0x86A7}, //20182 #CJK UNIFIED IDEOGRAPH + {0xF2BC, 0x86A3}, //20183 #CJK UNIFIED IDEOGRAPH + {0xF2BD, 0x86AA}, //20184 #CJK UNIFIED IDEOGRAPH + {0xF2BE, 0x8693}, //20185 #CJK UNIFIED IDEOGRAPH + {0xF2BF, 0x86A9}, //20186 #CJK UNIFIED IDEOGRAPH + {0xF2C0, 0x86B6}, //20187 #CJK UNIFIED IDEOGRAPH + {0xF2C1, 0x86C4}, //20188 #CJK UNIFIED IDEOGRAPH + {0xF2C2, 0x86B5}, //20189 #CJK UNIFIED IDEOGRAPH + {0xF2C3, 0x86CE}, //20190 #CJK UNIFIED IDEOGRAPH + {0xF2C4, 0x86B0}, //20191 #CJK UNIFIED IDEOGRAPH + {0xF2C5, 0x86BA}, //20192 #CJK UNIFIED IDEOGRAPH + {0xF2C6, 0x86B1}, //20193 #CJK UNIFIED IDEOGRAPH + {0xF2C7, 0x86AF}, //20194 #CJK UNIFIED IDEOGRAPH + {0xF2C8, 0x86C9}, //20195 #CJK UNIFIED IDEOGRAPH + {0xF2C9, 0x86CF}, //20196 #CJK UNIFIED IDEOGRAPH + {0xF2CA, 0x86B4}, //20197 #CJK UNIFIED IDEOGRAPH + {0xF2CB, 0x86E9}, //20198 #CJK UNIFIED IDEOGRAPH + {0xF2CC, 0x86F1}, //20199 #CJK UNIFIED IDEOGRAPH + {0xF2CD, 0x86F2}, //20200 #CJK UNIFIED IDEOGRAPH + {0xF2CE, 0x86ED}, //20201 #CJK UNIFIED IDEOGRAPH + {0xF2CF, 0x86F3}, //20202 #CJK UNIFIED IDEOGRAPH + {0xF2D0, 0x86D0}, //20203 #CJK UNIFIED IDEOGRAPH + {0xF2D1, 0x8713}, //20204 #CJK UNIFIED IDEOGRAPH + {0xF2D2, 0x86DE}, //20205 #CJK UNIFIED IDEOGRAPH + {0xF2D3, 0x86F4}, //20206 #CJK UNIFIED IDEOGRAPH + {0xF2D4, 0x86DF}, //20207 #CJK UNIFIED IDEOGRAPH + {0xF2D5, 0x86D8}, //20208 #CJK UNIFIED IDEOGRAPH + {0xF2D6, 0x86D1}, //20209 #CJK UNIFIED IDEOGRAPH + {0xF2D7, 0x8703}, //20210 #CJK UNIFIED IDEOGRAPH + {0xF2D8, 0x8707}, //20211 #CJK UNIFIED IDEOGRAPH + {0xF2D9, 0x86F8}, //20212 #CJK UNIFIED IDEOGRAPH + {0xF2DA, 0x8708}, //20213 #CJK UNIFIED IDEOGRAPH + {0xF2DB, 0x870A}, //20214 #CJK UNIFIED IDEOGRAPH + {0xF2DC, 0x870D}, //20215 #CJK UNIFIED IDEOGRAPH + {0xF2DD, 0x8709}, //20216 #CJK UNIFIED IDEOGRAPH + {0xF2DE, 0x8723}, //20217 #CJK UNIFIED IDEOGRAPH + {0xF2DF, 0x873B}, //20218 #CJK UNIFIED IDEOGRAPH + {0xF2E0, 0x871E}, //20219 #CJK UNIFIED IDEOGRAPH + {0xF2E1, 0x8725}, //20220 #CJK UNIFIED IDEOGRAPH + {0xF2E2, 0x872E}, //20221 #CJK UNIFIED IDEOGRAPH + {0xF2E3, 0x871A}, //20222 #CJK UNIFIED IDEOGRAPH + {0xF2E4, 0x873E}, //20223 #CJK UNIFIED IDEOGRAPH + {0xF2E5, 0x8748}, //20224 #CJK UNIFIED IDEOGRAPH + {0xF2E6, 0x8734}, //20225 #CJK UNIFIED IDEOGRAPH + {0xF2E7, 0x8731}, //20226 #CJK UNIFIED IDEOGRAPH + {0xF2E8, 0x8729}, //20227 #CJK UNIFIED IDEOGRAPH + {0xF2E9, 0x8737}, //20228 #CJK UNIFIED IDEOGRAPH + {0xF2EA, 0x873F}, //20229 #CJK UNIFIED IDEOGRAPH + {0xF2EB, 0x8782}, //20230 #CJK UNIFIED IDEOGRAPH + {0xF2EC, 0x8722}, //20231 #CJK UNIFIED IDEOGRAPH + {0xF2ED, 0x877D}, //20232 #CJK UNIFIED IDEOGRAPH + {0xF2EE, 0x877E}, //20233 #CJK UNIFIED IDEOGRAPH + {0xF2EF, 0x877B}, //20234 #CJK UNIFIED IDEOGRAPH + {0xF2F0, 0x8760}, //20235 #CJK UNIFIED IDEOGRAPH + {0xF2F1, 0x8770}, //20236 #CJK UNIFIED IDEOGRAPH + {0xF2F2, 0x874C}, //20237 #CJK UNIFIED IDEOGRAPH + {0xF2F3, 0x876E}, //20238 #CJK UNIFIED IDEOGRAPH + {0xF2F4, 0x878B}, //20239 #CJK UNIFIED IDEOGRAPH + {0xF2F5, 0x8753}, //20240 #CJK UNIFIED IDEOGRAPH + {0xF2F6, 0x8763}, //20241 #CJK UNIFIED IDEOGRAPH + {0xF2F7, 0x877C}, //20242 #CJK UNIFIED IDEOGRAPH + {0xF2F8, 0x8764}, //20243 #CJK UNIFIED IDEOGRAPH + {0xF2F9, 0x8759}, //20244 #CJK UNIFIED IDEOGRAPH + {0xF2FA, 0x8765}, //20245 #CJK UNIFIED IDEOGRAPH + {0xF2FB, 0x8793}, //20246 #CJK UNIFIED IDEOGRAPH + {0xF2FC, 0x87AF}, //20247 #CJK UNIFIED IDEOGRAPH + {0xF2FD, 0x87A8}, //20248 #CJK UNIFIED IDEOGRAPH + {0xF2FE, 0x87D2}, //20249 #CJK UNIFIED IDEOGRAPH + {0xF340, 0x9A5A}, //20250 #CJK UNIFIED IDEOGRAPH + {0xF341, 0x9A5B}, //20251 #CJK UNIFIED IDEOGRAPH + {0xF342, 0x9A5C}, //20252 #CJK UNIFIED IDEOGRAPH + {0xF343, 0x9A5D}, //20253 #CJK UNIFIED IDEOGRAPH + {0xF344, 0x9A5E}, //20254 #CJK UNIFIED IDEOGRAPH + {0xF345, 0x9A5F}, //20255 #CJK UNIFIED IDEOGRAPH + {0xF346, 0x9A60}, //20256 #CJK UNIFIED IDEOGRAPH + {0xF347, 0x9A61}, //20257 #CJK UNIFIED IDEOGRAPH + {0xF348, 0x9A62}, //20258 #CJK UNIFIED IDEOGRAPH + {0xF349, 0x9A63}, //20259 #CJK UNIFIED IDEOGRAPH + {0xF34A, 0x9A64}, //20260 #CJK UNIFIED IDEOGRAPH + {0xF34B, 0x9A65}, //20261 #CJK UNIFIED IDEOGRAPH + {0xF34C, 0x9A66}, //20262 #CJK UNIFIED IDEOGRAPH + {0xF34D, 0x9A67}, //20263 #CJK UNIFIED IDEOGRAPH + {0xF34E, 0x9A68}, //20264 #CJK UNIFIED IDEOGRAPH + {0xF34F, 0x9A69}, //20265 #CJK UNIFIED IDEOGRAPH + {0xF350, 0x9A6A}, //20266 #CJK UNIFIED IDEOGRAPH + {0xF351, 0x9A6B}, //20267 #CJK UNIFIED IDEOGRAPH + {0xF352, 0x9A72}, //20268 #CJK UNIFIED IDEOGRAPH + {0xF353, 0x9A83}, //20269 #CJK UNIFIED IDEOGRAPH + {0xF354, 0x9A89}, //20270 #CJK UNIFIED IDEOGRAPH + {0xF355, 0x9A8D}, //20271 #CJK UNIFIED IDEOGRAPH + {0xF356, 0x9A8E}, //20272 #CJK UNIFIED IDEOGRAPH + {0xF357, 0x9A94}, //20273 #CJK UNIFIED IDEOGRAPH + {0xF358, 0x9A95}, //20274 #CJK UNIFIED IDEOGRAPH + {0xF359, 0x9A99}, //20275 #CJK UNIFIED IDEOGRAPH + {0xF35A, 0x9AA6}, //20276 #CJK UNIFIED IDEOGRAPH + {0xF35B, 0x9AA9}, //20277 #CJK UNIFIED IDEOGRAPH + {0xF35C, 0x9AAA}, //20278 #CJK UNIFIED IDEOGRAPH + {0xF35D, 0x9AAB}, //20279 #CJK UNIFIED IDEOGRAPH + {0xF35E, 0x9AAC}, //20280 #CJK UNIFIED IDEOGRAPH + {0xF35F, 0x9AAD}, //20281 #CJK UNIFIED IDEOGRAPH + {0xF360, 0x9AAE}, //20282 #CJK UNIFIED IDEOGRAPH + {0xF361, 0x9AAF}, //20283 #CJK UNIFIED IDEOGRAPH + {0xF362, 0x9AB2}, //20284 #CJK UNIFIED IDEOGRAPH + {0xF363, 0x9AB3}, //20285 #CJK UNIFIED IDEOGRAPH + {0xF364, 0x9AB4}, //20286 #CJK UNIFIED IDEOGRAPH + {0xF365, 0x9AB5}, //20287 #CJK UNIFIED IDEOGRAPH + {0xF366, 0x9AB9}, //20288 #CJK UNIFIED IDEOGRAPH + {0xF367, 0x9ABB}, //20289 #CJK UNIFIED IDEOGRAPH + {0xF368, 0x9ABD}, //20290 #CJK UNIFIED IDEOGRAPH + {0xF369, 0x9ABE}, //20291 #CJK UNIFIED IDEOGRAPH + {0xF36A, 0x9ABF}, //20292 #CJK UNIFIED IDEOGRAPH + {0xF36B, 0x9AC3}, //20293 #CJK UNIFIED IDEOGRAPH + {0xF36C, 0x9AC4}, //20294 #CJK UNIFIED IDEOGRAPH + {0xF36D, 0x9AC6}, //20295 #CJK UNIFIED IDEOGRAPH + {0xF36E, 0x9AC7}, //20296 #CJK UNIFIED IDEOGRAPH + {0xF36F, 0x9AC8}, //20297 #CJK UNIFIED IDEOGRAPH + {0xF370, 0x9AC9}, //20298 #CJK UNIFIED IDEOGRAPH + {0xF371, 0x9ACA}, //20299 #CJK UNIFIED IDEOGRAPH + {0xF372, 0x9ACD}, //20300 #CJK UNIFIED IDEOGRAPH + {0xF373, 0x9ACE}, //20301 #CJK UNIFIED IDEOGRAPH + {0xF374, 0x9ACF}, //20302 #CJK UNIFIED IDEOGRAPH + {0xF375, 0x9AD0}, //20303 #CJK UNIFIED IDEOGRAPH + {0xF376, 0x9AD2}, //20304 #CJK UNIFIED IDEOGRAPH + {0xF377, 0x9AD4}, //20305 #CJK UNIFIED IDEOGRAPH + {0xF378, 0x9AD5}, //20306 #CJK UNIFIED IDEOGRAPH + {0xF379, 0x9AD6}, //20307 #CJK UNIFIED IDEOGRAPH + {0xF37A, 0x9AD7}, //20308 #CJK UNIFIED IDEOGRAPH + {0xF37B, 0x9AD9}, //20309 #CJK UNIFIED IDEOGRAPH + {0xF37C, 0x9ADA}, //20310 #CJK UNIFIED IDEOGRAPH + {0xF37D, 0x9ADB}, //20311 #CJK UNIFIED IDEOGRAPH + {0xF37E, 0x9ADC}, //20312 #CJK UNIFIED IDEOGRAPH + {0xF380, 0x9ADD}, //20313 #CJK UNIFIED IDEOGRAPH + {0xF381, 0x9ADE}, //20314 #CJK UNIFIED IDEOGRAPH + {0xF382, 0x9AE0}, //20315 #CJK UNIFIED IDEOGRAPH + {0xF383, 0x9AE2}, //20316 #CJK UNIFIED IDEOGRAPH + {0xF384, 0x9AE3}, //20317 #CJK UNIFIED IDEOGRAPH + {0xF385, 0x9AE4}, //20318 #CJK UNIFIED IDEOGRAPH + {0xF386, 0x9AE5}, //20319 #CJK UNIFIED IDEOGRAPH + {0xF387, 0x9AE7}, //20320 #CJK UNIFIED IDEOGRAPH + {0xF388, 0x9AE8}, //20321 #CJK UNIFIED IDEOGRAPH + {0xF389, 0x9AE9}, //20322 #CJK UNIFIED IDEOGRAPH + {0xF38A, 0x9AEA}, //20323 #CJK UNIFIED IDEOGRAPH + {0xF38B, 0x9AEC}, //20324 #CJK UNIFIED IDEOGRAPH + {0xF38C, 0x9AEE}, //20325 #CJK UNIFIED IDEOGRAPH + {0xF38D, 0x9AF0}, //20326 #CJK UNIFIED IDEOGRAPH + {0xF38E, 0x9AF1}, //20327 #CJK UNIFIED IDEOGRAPH + {0xF38F, 0x9AF2}, //20328 #CJK UNIFIED IDEOGRAPH + {0xF390, 0x9AF3}, //20329 #CJK UNIFIED IDEOGRAPH + {0xF391, 0x9AF4}, //20330 #CJK UNIFIED IDEOGRAPH + {0xF392, 0x9AF5}, //20331 #CJK UNIFIED IDEOGRAPH + {0xF393, 0x9AF6}, //20332 #CJK UNIFIED IDEOGRAPH + {0xF394, 0x9AF7}, //20333 #CJK UNIFIED IDEOGRAPH + {0xF395, 0x9AF8}, //20334 #CJK UNIFIED IDEOGRAPH + {0xF396, 0x9AFA}, //20335 #CJK UNIFIED IDEOGRAPH + {0xF397, 0x9AFC}, //20336 #CJK UNIFIED IDEOGRAPH + {0xF398, 0x9AFD}, //20337 #CJK UNIFIED IDEOGRAPH + {0xF399, 0x9AFE}, //20338 #CJK UNIFIED IDEOGRAPH + {0xF39A, 0x9AFF}, //20339 #CJK UNIFIED IDEOGRAPH + {0xF39B, 0x9B00}, //20340 #CJK UNIFIED IDEOGRAPH + {0xF39C, 0x9B01}, //20341 #CJK UNIFIED IDEOGRAPH + {0xF39D, 0x9B02}, //20342 #CJK UNIFIED IDEOGRAPH + {0xF39E, 0x9B04}, //20343 #CJK UNIFIED IDEOGRAPH + {0xF39F, 0x9B05}, //20344 #CJK UNIFIED IDEOGRAPH + {0xF3A0, 0x9B06}, //20345 #CJK UNIFIED IDEOGRAPH + {0xF3A1, 0x87C6}, //20346 #CJK UNIFIED IDEOGRAPH + {0xF3A2, 0x8788}, //20347 #CJK UNIFIED IDEOGRAPH + {0xF3A3, 0x8785}, //20348 #CJK UNIFIED IDEOGRAPH + {0xF3A4, 0x87AD}, //20349 #CJK UNIFIED IDEOGRAPH + {0xF3A5, 0x8797}, //20350 #CJK UNIFIED IDEOGRAPH + {0xF3A6, 0x8783}, //20351 #CJK UNIFIED IDEOGRAPH + {0xF3A7, 0x87AB}, //20352 #CJK UNIFIED IDEOGRAPH + {0xF3A8, 0x87E5}, //20353 #CJK UNIFIED IDEOGRAPH + {0xF3A9, 0x87AC}, //20354 #CJK UNIFIED IDEOGRAPH + {0xF3AA, 0x87B5}, //20355 #CJK UNIFIED IDEOGRAPH + {0xF3AB, 0x87B3}, //20356 #CJK UNIFIED IDEOGRAPH + {0xF3AC, 0x87CB}, //20357 #CJK UNIFIED IDEOGRAPH + {0xF3AD, 0x87D3}, //20358 #CJK UNIFIED IDEOGRAPH + {0xF3AE, 0x87BD}, //20359 #CJK UNIFIED IDEOGRAPH + {0xF3AF, 0x87D1}, //20360 #CJK UNIFIED IDEOGRAPH + {0xF3B0, 0x87C0}, //20361 #CJK UNIFIED IDEOGRAPH + {0xF3B1, 0x87CA}, //20362 #CJK UNIFIED IDEOGRAPH + {0xF3B2, 0x87DB}, //20363 #CJK UNIFIED IDEOGRAPH + {0xF3B3, 0x87EA}, //20364 #CJK UNIFIED IDEOGRAPH + {0xF3B4, 0x87E0}, //20365 #CJK UNIFIED IDEOGRAPH + {0xF3B5, 0x87EE}, //20366 #CJK UNIFIED IDEOGRAPH + {0xF3B6, 0x8816}, //20367 #CJK UNIFIED IDEOGRAPH + {0xF3B7, 0x8813}, //20368 #CJK UNIFIED IDEOGRAPH + {0xF3B8, 0x87FE}, //20369 #CJK UNIFIED IDEOGRAPH + {0xF3B9, 0x880A}, //20370 #CJK UNIFIED IDEOGRAPH + {0xF3BA, 0x881B}, //20371 #CJK UNIFIED IDEOGRAPH + {0xF3BB, 0x8821}, //20372 #CJK UNIFIED IDEOGRAPH + {0xF3BC, 0x8839}, //20373 #CJK UNIFIED IDEOGRAPH + {0xF3BD, 0x883C}, //20374 #CJK UNIFIED IDEOGRAPH + {0xF3BE, 0x7F36}, //20375 #CJK UNIFIED IDEOGRAPH + {0xF3BF, 0x7F42}, //20376 #CJK UNIFIED IDEOGRAPH + {0xF3C0, 0x7F44}, //20377 #CJK UNIFIED IDEOGRAPH + {0xF3C1, 0x7F45}, //20378 #CJK UNIFIED IDEOGRAPH + {0xF3C2, 0x8210}, //20379 #CJK UNIFIED IDEOGRAPH + {0xF3C3, 0x7AFA}, //20380 #CJK UNIFIED IDEOGRAPH + {0xF3C4, 0x7AFD}, //20381 #CJK UNIFIED IDEOGRAPH + {0xF3C5, 0x7B08}, //20382 #CJK UNIFIED IDEOGRAPH + {0xF3C6, 0x7B03}, //20383 #CJK UNIFIED IDEOGRAPH + {0xF3C7, 0x7B04}, //20384 #CJK UNIFIED IDEOGRAPH + {0xF3C8, 0x7B15}, //20385 #CJK UNIFIED IDEOGRAPH + {0xF3C9, 0x7B0A}, //20386 #CJK UNIFIED IDEOGRAPH + {0xF3CA, 0x7B2B}, //20387 #CJK UNIFIED IDEOGRAPH + {0xF3CB, 0x7B0F}, //20388 #CJK UNIFIED IDEOGRAPH + {0xF3CC, 0x7B47}, //20389 #CJK UNIFIED IDEOGRAPH + {0xF3CD, 0x7B38}, //20390 #CJK UNIFIED IDEOGRAPH + {0xF3CE, 0x7B2A}, //20391 #CJK UNIFIED IDEOGRAPH + {0xF3CF, 0x7B19}, //20392 #CJK UNIFIED IDEOGRAPH + {0xF3D0, 0x7B2E}, //20393 #CJK UNIFIED IDEOGRAPH + {0xF3D1, 0x7B31}, //20394 #CJK UNIFIED IDEOGRAPH + {0xF3D2, 0x7B20}, //20395 #CJK UNIFIED IDEOGRAPH + {0xF3D3, 0x7B25}, //20396 #CJK UNIFIED IDEOGRAPH + {0xF3D4, 0x7B24}, //20397 #CJK UNIFIED IDEOGRAPH + {0xF3D5, 0x7B33}, //20398 #CJK UNIFIED IDEOGRAPH + {0xF3D6, 0x7B3E}, //20399 #CJK UNIFIED IDEOGRAPH + {0xF3D7, 0x7B1E}, //20400 #CJK UNIFIED IDEOGRAPH + {0xF3D8, 0x7B58}, //20401 #CJK UNIFIED IDEOGRAPH + {0xF3D9, 0x7B5A}, //20402 #CJK UNIFIED IDEOGRAPH + {0xF3DA, 0x7B45}, //20403 #CJK UNIFIED IDEOGRAPH + {0xF3DB, 0x7B75}, //20404 #CJK UNIFIED IDEOGRAPH + {0xF3DC, 0x7B4C}, //20405 #CJK UNIFIED IDEOGRAPH + {0xF3DD, 0x7B5D}, //20406 #CJK UNIFIED IDEOGRAPH + {0xF3DE, 0x7B60}, //20407 #CJK UNIFIED IDEOGRAPH + {0xF3DF, 0x7B6E}, //20408 #CJK UNIFIED IDEOGRAPH + {0xF3E0, 0x7B7B}, //20409 #CJK UNIFIED IDEOGRAPH + {0xF3E1, 0x7B62}, //20410 #CJK UNIFIED IDEOGRAPH + {0xF3E2, 0x7B72}, //20411 #CJK UNIFIED IDEOGRAPH + {0xF3E3, 0x7B71}, //20412 #CJK UNIFIED IDEOGRAPH + {0xF3E4, 0x7B90}, //20413 #CJK UNIFIED IDEOGRAPH + {0xF3E5, 0x7BA6}, //20414 #CJK UNIFIED IDEOGRAPH + {0xF3E6, 0x7BA7}, //20415 #CJK UNIFIED IDEOGRAPH + {0xF3E7, 0x7BB8}, //20416 #CJK UNIFIED IDEOGRAPH + {0xF3E8, 0x7BAC}, //20417 #CJK UNIFIED IDEOGRAPH + {0xF3E9, 0x7B9D}, //20418 #CJK UNIFIED IDEOGRAPH + {0xF3EA, 0x7BA8}, //20419 #CJK UNIFIED IDEOGRAPH + {0xF3EB, 0x7B85}, //20420 #CJK UNIFIED IDEOGRAPH + {0xF3EC, 0x7BAA}, //20421 #CJK UNIFIED IDEOGRAPH + {0xF3ED, 0x7B9C}, //20422 #CJK UNIFIED IDEOGRAPH + {0xF3EE, 0x7BA2}, //20423 #CJK UNIFIED IDEOGRAPH + {0xF3EF, 0x7BAB}, //20424 #CJK UNIFIED IDEOGRAPH + {0xF3F0, 0x7BB4}, //20425 #CJK UNIFIED IDEOGRAPH + {0xF3F1, 0x7BD1}, //20426 #CJK UNIFIED IDEOGRAPH + {0xF3F2, 0x7BC1}, //20427 #CJK UNIFIED IDEOGRAPH + {0xF3F3, 0x7BCC}, //20428 #CJK UNIFIED IDEOGRAPH + {0xF3F4, 0x7BDD}, //20429 #CJK UNIFIED IDEOGRAPH + {0xF3F5, 0x7BDA}, //20430 #CJK UNIFIED IDEOGRAPH + {0xF3F6, 0x7BE5}, //20431 #CJK UNIFIED IDEOGRAPH + {0xF3F7, 0x7BE6}, //20432 #CJK UNIFIED IDEOGRAPH + {0xF3F8, 0x7BEA}, //20433 #CJK UNIFIED IDEOGRAPH + {0xF3F9, 0x7C0C}, //20434 #CJK UNIFIED IDEOGRAPH + {0xF3FA, 0x7BFE}, //20435 #CJK UNIFIED IDEOGRAPH + {0xF3FB, 0x7BFC}, //20436 #CJK UNIFIED IDEOGRAPH + {0xF3FC, 0x7C0F}, //20437 #CJK UNIFIED IDEOGRAPH + {0xF3FD, 0x7C16}, //20438 #CJK UNIFIED IDEOGRAPH + {0xF3FE, 0x7C0B}, //20439 #CJK UNIFIED IDEOGRAPH + {0xF440, 0x9B07}, //20440 #CJK UNIFIED IDEOGRAPH + {0xF441, 0x9B09}, //20441 #CJK UNIFIED IDEOGRAPH + {0xF442, 0x9B0A}, //20442 #CJK UNIFIED IDEOGRAPH + {0xF443, 0x9B0B}, //20443 #CJK UNIFIED IDEOGRAPH + {0xF444, 0x9B0C}, //20444 #CJK UNIFIED IDEOGRAPH + {0xF445, 0x9B0D}, //20445 #CJK UNIFIED IDEOGRAPH + {0xF446, 0x9B0E}, //20446 #CJK UNIFIED IDEOGRAPH + {0xF447, 0x9B10}, //20447 #CJK UNIFIED IDEOGRAPH + {0xF448, 0x9B11}, //20448 #CJK UNIFIED IDEOGRAPH + {0xF449, 0x9B12}, //20449 #CJK UNIFIED IDEOGRAPH + {0xF44A, 0x9B14}, //20450 #CJK UNIFIED IDEOGRAPH + {0xF44B, 0x9B15}, //20451 #CJK UNIFIED IDEOGRAPH + {0xF44C, 0x9B16}, //20452 #CJK UNIFIED IDEOGRAPH + {0xF44D, 0x9B17}, //20453 #CJK UNIFIED IDEOGRAPH + {0xF44E, 0x9B18}, //20454 #CJK UNIFIED IDEOGRAPH + {0xF44F, 0x9B19}, //20455 #CJK UNIFIED IDEOGRAPH + {0xF450, 0x9B1A}, //20456 #CJK UNIFIED IDEOGRAPH + {0xF451, 0x9B1B}, //20457 #CJK UNIFIED IDEOGRAPH + {0xF452, 0x9B1C}, //20458 #CJK UNIFIED IDEOGRAPH + {0xF453, 0x9B1D}, //20459 #CJK UNIFIED IDEOGRAPH + {0xF454, 0x9B1E}, //20460 #CJK UNIFIED IDEOGRAPH + {0xF455, 0x9B20}, //20461 #CJK UNIFIED IDEOGRAPH + {0xF456, 0x9B21}, //20462 #CJK UNIFIED IDEOGRAPH + {0xF457, 0x9B22}, //20463 #CJK UNIFIED IDEOGRAPH + {0xF458, 0x9B24}, //20464 #CJK UNIFIED IDEOGRAPH + {0xF459, 0x9B25}, //20465 #CJK UNIFIED IDEOGRAPH + {0xF45A, 0x9B26}, //20466 #CJK UNIFIED IDEOGRAPH + {0xF45B, 0x9B27}, //20467 #CJK UNIFIED IDEOGRAPH + {0xF45C, 0x9B28}, //20468 #CJK UNIFIED IDEOGRAPH + {0xF45D, 0x9B29}, //20469 #CJK UNIFIED IDEOGRAPH + {0xF45E, 0x9B2A}, //20470 #CJK UNIFIED IDEOGRAPH + {0xF45F, 0x9B2B}, //20471 #CJK UNIFIED IDEOGRAPH + {0xF460, 0x9B2C}, //20472 #CJK UNIFIED IDEOGRAPH + {0xF461, 0x9B2D}, //20473 #CJK UNIFIED IDEOGRAPH + {0xF462, 0x9B2E}, //20474 #CJK UNIFIED IDEOGRAPH + {0xF463, 0x9B30}, //20475 #CJK UNIFIED IDEOGRAPH + {0xF464, 0x9B31}, //20476 #CJK UNIFIED IDEOGRAPH + {0xF465, 0x9B33}, //20477 #CJK UNIFIED IDEOGRAPH + {0xF466, 0x9B34}, //20478 #CJK UNIFIED IDEOGRAPH + {0xF467, 0x9B35}, //20479 #CJK UNIFIED IDEOGRAPH + {0xF468, 0x9B36}, //20480 #CJK UNIFIED IDEOGRAPH + {0xF469, 0x9B37}, //20481 #CJK UNIFIED IDEOGRAPH + {0xF46A, 0x9B38}, //20482 #CJK UNIFIED IDEOGRAPH + {0xF46B, 0x9B39}, //20483 #CJK UNIFIED IDEOGRAPH + {0xF46C, 0x9B3A}, //20484 #CJK UNIFIED IDEOGRAPH + {0xF46D, 0x9B3D}, //20485 #CJK UNIFIED IDEOGRAPH + {0xF46E, 0x9B3E}, //20486 #CJK UNIFIED IDEOGRAPH + {0xF46F, 0x9B3F}, //20487 #CJK UNIFIED IDEOGRAPH + {0xF470, 0x9B40}, //20488 #CJK UNIFIED IDEOGRAPH + {0xF471, 0x9B46}, //20489 #CJK UNIFIED IDEOGRAPH + {0xF472, 0x9B4A}, //20490 #CJK UNIFIED IDEOGRAPH + {0xF473, 0x9B4B}, //20491 #CJK UNIFIED IDEOGRAPH + {0xF474, 0x9B4C}, //20492 #CJK UNIFIED IDEOGRAPH + {0xF475, 0x9B4E}, //20493 #CJK UNIFIED IDEOGRAPH + {0xF476, 0x9B50}, //20494 #CJK UNIFIED IDEOGRAPH + {0xF477, 0x9B52}, //20495 #CJK UNIFIED IDEOGRAPH + {0xF478, 0x9B53}, //20496 #CJK UNIFIED IDEOGRAPH + {0xF479, 0x9B55}, //20497 #CJK UNIFIED IDEOGRAPH + {0xF47A, 0x9B56}, //20498 #CJK UNIFIED IDEOGRAPH + {0xF47B, 0x9B57}, //20499 #CJK UNIFIED IDEOGRAPH + {0xF47C, 0x9B58}, //20500 #CJK UNIFIED IDEOGRAPH + {0xF47D, 0x9B59}, //20501 #CJK UNIFIED IDEOGRAPH + {0xF47E, 0x9B5A}, //20502 #CJK UNIFIED IDEOGRAPH + {0xF480, 0x9B5B}, //20503 #CJK UNIFIED IDEOGRAPH + {0xF481, 0x9B5C}, //20504 #CJK UNIFIED IDEOGRAPH + {0xF482, 0x9B5D}, //20505 #CJK UNIFIED IDEOGRAPH + {0xF483, 0x9B5E}, //20506 #CJK UNIFIED IDEOGRAPH + {0xF484, 0x9B5F}, //20507 #CJK UNIFIED IDEOGRAPH + {0xF485, 0x9B60}, //20508 #CJK UNIFIED IDEOGRAPH + {0xF486, 0x9B61}, //20509 #CJK UNIFIED IDEOGRAPH + {0xF487, 0x9B62}, //20510 #CJK UNIFIED IDEOGRAPH + {0xF488, 0x9B63}, //20511 #CJK UNIFIED IDEOGRAPH + {0xF489, 0x9B64}, //20512 #CJK UNIFIED IDEOGRAPH + {0xF48A, 0x9B65}, //20513 #CJK UNIFIED IDEOGRAPH + {0xF48B, 0x9B66}, //20514 #CJK UNIFIED IDEOGRAPH + {0xF48C, 0x9B67}, //20515 #CJK UNIFIED IDEOGRAPH + {0xF48D, 0x9B68}, //20516 #CJK UNIFIED IDEOGRAPH + {0xF48E, 0x9B69}, //20517 #CJK UNIFIED IDEOGRAPH + {0xF48F, 0x9B6A}, //20518 #CJK UNIFIED IDEOGRAPH + {0xF490, 0x9B6B}, //20519 #CJK UNIFIED IDEOGRAPH + {0xF491, 0x9B6C}, //20520 #CJK UNIFIED IDEOGRAPH + {0xF492, 0x9B6D}, //20521 #CJK UNIFIED IDEOGRAPH + {0xF493, 0x9B6E}, //20522 #CJK UNIFIED IDEOGRAPH + {0xF494, 0x9B6F}, //20523 #CJK UNIFIED IDEOGRAPH + {0xF495, 0x9B70}, //20524 #CJK UNIFIED IDEOGRAPH + {0xF496, 0x9B71}, //20525 #CJK UNIFIED IDEOGRAPH + {0xF497, 0x9B72}, //20526 #CJK UNIFIED IDEOGRAPH + {0xF498, 0x9B73}, //20527 #CJK UNIFIED IDEOGRAPH + {0xF499, 0x9B74}, //20528 #CJK UNIFIED IDEOGRAPH + {0xF49A, 0x9B75}, //20529 #CJK UNIFIED IDEOGRAPH + {0xF49B, 0x9B76}, //20530 #CJK UNIFIED IDEOGRAPH + {0xF49C, 0x9B77}, //20531 #CJK UNIFIED IDEOGRAPH + {0xF49D, 0x9B78}, //20532 #CJK UNIFIED IDEOGRAPH + {0xF49E, 0x9B79}, //20533 #CJK UNIFIED IDEOGRAPH + {0xF49F, 0x9B7A}, //20534 #CJK UNIFIED IDEOGRAPH + {0xF4A0, 0x9B7B}, //20535 #CJK UNIFIED IDEOGRAPH + {0xF4A1, 0x7C1F}, //20536 #CJK UNIFIED IDEOGRAPH + {0xF4A2, 0x7C2A}, //20537 #CJK UNIFIED IDEOGRAPH + {0xF4A3, 0x7C26}, //20538 #CJK UNIFIED IDEOGRAPH + {0xF4A4, 0x7C38}, //20539 #CJK UNIFIED IDEOGRAPH + {0xF4A5, 0x7C41}, //20540 #CJK UNIFIED IDEOGRAPH + {0xF4A6, 0x7C40}, //20541 #CJK UNIFIED IDEOGRAPH + {0xF4A7, 0x81FE}, //20542 #CJK UNIFIED IDEOGRAPH + {0xF4A8, 0x8201}, //20543 #CJK UNIFIED IDEOGRAPH + {0xF4A9, 0x8202}, //20544 #CJK UNIFIED IDEOGRAPH + {0xF4AA, 0x8204}, //20545 #CJK UNIFIED IDEOGRAPH + {0xF4AB, 0x81EC}, //20546 #CJK UNIFIED IDEOGRAPH + {0xF4AC, 0x8844}, //20547 #CJK UNIFIED IDEOGRAPH + {0xF4AD, 0x8221}, //20548 #CJK UNIFIED IDEOGRAPH + {0xF4AE, 0x8222}, //20549 #CJK UNIFIED IDEOGRAPH + {0xF4AF, 0x8223}, //20550 #CJK UNIFIED IDEOGRAPH + {0xF4B0, 0x822D}, //20551 #CJK UNIFIED IDEOGRAPH + {0xF4B1, 0x822F}, //20552 #CJK UNIFIED IDEOGRAPH + {0xF4B2, 0x8228}, //20553 #CJK UNIFIED IDEOGRAPH + {0xF4B3, 0x822B}, //20554 #CJK UNIFIED IDEOGRAPH + {0xF4B4, 0x8238}, //20555 #CJK UNIFIED IDEOGRAPH + {0xF4B5, 0x823B}, //20556 #CJK UNIFIED IDEOGRAPH + {0xF4B6, 0x8233}, //20557 #CJK UNIFIED IDEOGRAPH + {0xF4B7, 0x8234}, //20558 #CJK UNIFIED IDEOGRAPH + {0xF4B8, 0x823E}, //20559 #CJK UNIFIED IDEOGRAPH + {0xF4B9, 0x8244}, //20560 #CJK UNIFIED IDEOGRAPH + {0xF4BA, 0x8249}, //20561 #CJK UNIFIED IDEOGRAPH + {0xF4BB, 0x824B}, //20562 #CJK UNIFIED IDEOGRAPH + {0xF4BC, 0x824F}, //20563 #CJK UNIFIED IDEOGRAPH + {0xF4BD, 0x825A}, //20564 #CJK UNIFIED IDEOGRAPH + {0xF4BE, 0x825F}, //20565 #CJK UNIFIED IDEOGRAPH + {0xF4BF, 0x8268}, //20566 #CJK UNIFIED IDEOGRAPH + {0xF4C0, 0x887E}, //20567 #CJK UNIFIED IDEOGRAPH + {0xF4C1, 0x8885}, //20568 #CJK UNIFIED IDEOGRAPH + {0xF4C2, 0x8888}, //20569 #CJK UNIFIED IDEOGRAPH + {0xF4C3, 0x88D8}, //20570 #CJK UNIFIED IDEOGRAPH + {0xF4C4, 0x88DF}, //20571 #CJK UNIFIED IDEOGRAPH + {0xF4C5, 0x895E}, //20572 #CJK UNIFIED IDEOGRAPH + {0xF4C6, 0x7F9D}, //20573 #CJK UNIFIED IDEOGRAPH + {0xF4C7, 0x7F9F}, //20574 #CJK UNIFIED IDEOGRAPH + {0xF4C8, 0x7FA7}, //20575 #CJK UNIFIED IDEOGRAPH + {0xF4C9, 0x7FAF}, //20576 #CJK UNIFIED IDEOGRAPH + {0xF4CA, 0x7FB0}, //20577 #CJK UNIFIED IDEOGRAPH + {0xF4CB, 0x7FB2}, //20578 #CJK UNIFIED IDEOGRAPH + {0xF4CC, 0x7C7C}, //20579 #CJK UNIFIED IDEOGRAPH + {0xF4CD, 0x6549}, //20580 #CJK UNIFIED IDEOGRAPH + {0xF4CE, 0x7C91}, //20581 #CJK UNIFIED IDEOGRAPH + {0xF4CF, 0x7C9D}, //20582 #CJK UNIFIED IDEOGRAPH + {0xF4D0, 0x7C9C}, //20583 #CJK UNIFIED IDEOGRAPH + {0xF4D1, 0x7C9E}, //20584 #CJK UNIFIED IDEOGRAPH + {0xF4D2, 0x7CA2}, //20585 #CJK UNIFIED IDEOGRAPH + {0xF4D3, 0x7CB2}, //20586 #CJK UNIFIED IDEOGRAPH + {0xF4D4, 0x7CBC}, //20587 #CJK UNIFIED IDEOGRAPH + {0xF4D5, 0x7CBD}, //20588 #CJK UNIFIED IDEOGRAPH + {0xF4D6, 0x7CC1}, //20589 #CJK UNIFIED IDEOGRAPH + {0xF4D7, 0x7CC7}, //20590 #CJK UNIFIED IDEOGRAPH + {0xF4D8, 0x7CCC}, //20591 #CJK UNIFIED IDEOGRAPH + {0xF4D9, 0x7CCD}, //20592 #CJK UNIFIED IDEOGRAPH + {0xF4DA, 0x7CC8}, //20593 #CJK UNIFIED IDEOGRAPH + {0xF4DB, 0x7CC5}, //20594 #CJK UNIFIED IDEOGRAPH + {0xF4DC, 0x7CD7}, //20595 #CJK UNIFIED IDEOGRAPH + {0xF4DD, 0x7CE8}, //20596 #CJK UNIFIED IDEOGRAPH + {0xF4DE, 0x826E}, //20597 #CJK UNIFIED IDEOGRAPH + {0xF4DF, 0x66A8}, //20598 #CJK UNIFIED IDEOGRAPH + {0xF4E0, 0x7FBF}, //20599 #CJK UNIFIED IDEOGRAPH + {0xF4E1, 0x7FCE}, //20600 #CJK UNIFIED IDEOGRAPH + {0xF4E2, 0x7FD5}, //20601 #CJK UNIFIED IDEOGRAPH + {0xF4E3, 0x7FE5}, //20602 #CJK UNIFIED IDEOGRAPH + {0xF4E4, 0x7FE1}, //20603 #CJK UNIFIED IDEOGRAPH + {0xF4E5, 0x7FE6}, //20604 #CJK UNIFIED IDEOGRAPH + {0xF4E6, 0x7FE9}, //20605 #CJK UNIFIED IDEOGRAPH + {0xF4E7, 0x7FEE}, //20606 #CJK UNIFIED IDEOGRAPH + {0xF4E8, 0x7FF3}, //20607 #CJK UNIFIED IDEOGRAPH + {0xF4E9, 0x7CF8}, //20608 #CJK UNIFIED IDEOGRAPH + {0xF4EA, 0x7D77}, //20609 #CJK UNIFIED IDEOGRAPH + {0xF4EB, 0x7DA6}, //20610 #CJK UNIFIED IDEOGRAPH + {0xF4EC, 0x7DAE}, //20611 #CJK UNIFIED IDEOGRAPH + {0xF4ED, 0x7E47}, //20612 #CJK UNIFIED IDEOGRAPH + {0xF4EE, 0x7E9B}, //20613 #CJK UNIFIED IDEOGRAPH + {0xF4EF, 0x9EB8}, //20614 #CJK UNIFIED IDEOGRAPH + {0xF4F0, 0x9EB4}, //20615 #CJK UNIFIED IDEOGRAPH + {0xF4F1, 0x8D73}, //20616 #CJK UNIFIED IDEOGRAPH + {0xF4F2, 0x8D84}, //20617 #CJK UNIFIED IDEOGRAPH + {0xF4F3, 0x8D94}, //20618 #CJK UNIFIED IDEOGRAPH + {0xF4F4, 0x8D91}, //20619 #CJK UNIFIED IDEOGRAPH + {0xF4F5, 0x8DB1}, //20620 #CJK UNIFIED IDEOGRAPH + {0xF4F6, 0x8D67}, //20621 #CJK UNIFIED IDEOGRAPH + {0xF4F7, 0x8D6D}, //20622 #CJK UNIFIED IDEOGRAPH + {0xF4F8, 0x8C47}, //20623 #CJK UNIFIED IDEOGRAPH + {0xF4F9, 0x8C49}, //20624 #CJK UNIFIED IDEOGRAPH + {0xF4FA, 0x914A}, //20625 #CJK UNIFIED IDEOGRAPH + {0xF4FB, 0x9150}, //20626 #CJK UNIFIED IDEOGRAPH + {0xF4FC, 0x914E}, //20627 #CJK UNIFIED IDEOGRAPH + {0xF4FD, 0x914F}, //20628 #CJK UNIFIED IDEOGRAPH + {0xF4FE, 0x9164}, //20629 #CJK UNIFIED IDEOGRAPH + {0xF540, 0x9B7C}, //20630 #CJK UNIFIED IDEOGRAPH + {0xF541, 0x9B7D}, //20631 #CJK UNIFIED IDEOGRAPH + {0xF542, 0x9B7E}, //20632 #CJK UNIFIED IDEOGRAPH + {0xF543, 0x9B7F}, //20633 #CJK UNIFIED IDEOGRAPH + {0xF544, 0x9B80}, //20634 #CJK UNIFIED IDEOGRAPH + {0xF545, 0x9B81}, //20635 #CJK UNIFIED IDEOGRAPH + {0xF546, 0x9B82}, //20636 #CJK UNIFIED IDEOGRAPH + {0xF547, 0x9B83}, //20637 #CJK UNIFIED IDEOGRAPH + {0xF548, 0x9B84}, //20638 #CJK UNIFIED IDEOGRAPH + {0xF549, 0x9B85}, //20639 #CJK UNIFIED IDEOGRAPH + {0xF54A, 0x9B86}, //20640 #CJK UNIFIED IDEOGRAPH + {0xF54B, 0x9B87}, //20641 #CJK UNIFIED IDEOGRAPH + {0xF54C, 0x9B88}, //20642 #CJK UNIFIED IDEOGRAPH + {0xF54D, 0x9B89}, //20643 #CJK UNIFIED IDEOGRAPH + {0xF54E, 0x9B8A}, //20644 #CJK UNIFIED IDEOGRAPH + {0xF54F, 0x9B8B}, //20645 #CJK UNIFIED IDEOGRAPH + {0xF550, 0x9B8C}, //20646 #CJK UNIFIED IDEOGRAPH + {0xF551, 0x9B8D}, //20647 #CJK UNIFIED IDEOGRAPH + {0xF552, 0x9B8E}, //20648 #CJK UNIFIED IDEOGRAPH + {0xF553, 0x9B8F}, //20649 #CJK UNIFIED IDEOGRAPH + {0xF554, 0x9B90}, //20650 #CJK UNIFIED IDEOGRAPH + {0xF555, 0x9B91}, //20651 #CJK UNIFIED IDEOGRAPH + {0xF556, 0x9B92}, //20652 #CJK UNIFIED IDEOGRAPH + {0xF557, 0x9B93}, //20653 #CJK UNIFIED IDEOGRAPH + {0xF558, 0x9B94}, //20654 #CJK UNIFIED IDEOGRAPH + {0xF559, 0x9B95}, //20655 #CJK UNIFIED IDEOGRAPH + {0xF55A, 0x9B96}, //20656 #CJK UNIFIED IDEOGRAPH + {0xF55B, 0x9B97}, //20657 #CJK UNIFIED IDEOGRAPH + {0xF55C, 0x9B98}, //20658 #CJK UNIFIED IDEOGRAPH + {0xF55D, 0x9B99}, //20659 #CJK UNIFIED IDEOGRAPH + {0xF55E, 0x9B9A}, //20660 #CJK UNIFIED IDEOGRAPH + {0xF55F, 0x9B9B}, //20661 #CJK UNIFIED IDEOGRAPH + {0xF560, 0x9B9C}, //20662 #CJK UNIFIED IDEOGRAPH + {0xF561, 0x9B9D}, //20663 #CJK UNIFIED IDEOGRAPH + {0xF562, 0x9B9E}, //20664 #CJK UNIFIED IDEOGRAPH + {0xF563, 0x9B9F}, //20665 #CJK UNIFIED IDEOGRAPH + {0xF564, 0x9BA0}, //20666 #CJK UNIFIED IDEOGRAPH + {0xF565, 0x9BA1}, //20667 #CJK UNIFIED IDEOGRAPH + {0xF566, 0x9BA2}, //20668 #CJK UNIFIED IDEOGRAPH + {0xF567, 0x9BA3}, //20669 #CJK UNIFIED IDEOGRAPH + {0xF568, 0x9BA4}, //20670 #CJK UNIFIED IDEOGRAPH + {0xF569, 0x9BA5}, //20671 #CJK UNIFIED IDEOGRAPH + {0xF56A, 0x9BA6}, //20672 #CJK UNIFIED IDEOGRAPH + {0xF56B, 0x9BA7}, //20673 #CJK UNIFIED IDEOGRAPH + {0xF56C, 0x9BA8}, //20674 #CJK UNIFIED IDEOGRAPH + {0xF56D, 0x9BA9}, //20675 #CJK UNIFIED IDEOGRAPH + {0xF56E, 0x9BAA}, //20676 #CJK UNIFIED IDEOGRAPH + {0xF56F, 0x9BAB}, //20677 #CJK UNIFIED IDEOGRAPH + {0xF570, 0x9BAC}, //20678 #CJK UNIFIED IDEOGRAPH + {0xF571, 0x9BAD}, //20679 #CJK UNIFIED IDEOGRAPH + {0xF572, 0x9BAE}, //20680 #CJK UNIFIED IDEOGRAPH + {0xF573, 0x9BAF}, //20681 #CJK UNIFIED IDEOGRAPH + {0xF574, 0x9BB0}, //20682 #CJK UNIFIED IDEOGRAPH + {0xF575, 0x9BB1}, //20683 #CJK UNIFIED IDEOGRAPH + {0xF576, 0x9BB2}, //20684 #CJK UNIFIED IDEOGRAPH + {0xF577, 0x9BB3}, //20685 #CJK UNIFIED IDEOGRAPH + {0xF578, 0x9BB4}, //20686 #CJK UNIFIED IDEOGRAPH + {0xF579, 0x9BB5}, //20687 #CJK UNIFIED IDEOGRAPH + {0xF57A, 0x9BB6}, //20688 #CJK UNIFIED IDEOGRAPH + {0xF57B, 0x9BB7}, //20689 #CJK UNIFIED IDEOGRAPH + {0xF57C, 0x9BB8}, //20690 #CJK UNIFIED IDEOGRAPH + {0xF57D, 0x9BB9}, //20691 #CJK UNIFIED IDEOGRAPH + {0xF57E, 0x9BBA}, //20692 #CJK UNIFIED IDEOGRAPH + {0xF580, 0x9BBB}, //20693 #CJK UNIFIED IDEOGRAPH + {0xF581, 0x9BBC}, //20694 #CJK UNIFIED IDEOGRAPH + {0xF582, 0x9BBD}, //20695 #CJK UNIFIED IDEOGRAPH + {0xF583, 0x9BBE}, //20696 #CJK UNIFIED IDEOGRAPH + {0xF584, 0x9BBF}, //20697 #CJK UNIFIED IDEOGRAPH + {0xF585, 0x9BC0}, //20698 #CJK UNIFIED IDEOGRAPH + {0xF586, 0x9BC1}, //20699 #CJK UNIFIED IDEOGRAPH + {0xF587, 0x9BC2}, //20700 #CJK UNIFIED IDEOGRAPH + {0xF588, 0x9BC3}, //20701 #CJK UNIFIED IDEOGRAPH + {0xF589, 0x9BC4}, //20702 #CJK UNIFIED IDEOGRAPH + {0xF58A, 0x9BC5}, //20703 #CJK UNIFIED IDEOGRAPH + {0xF58B, 0x9BC6}, //20704 #CJK UNIFIED IDEOGRAPH + {0xF58C, 0x9BC7}, //20705 #CJK UNIFIED IDEOGRAPH + {0xF58D, 0x9BC8}, //20706 #CJK UNIFIED IDEOGRAPH + {0xF58E, 0x9BC9}, //20707 #CJK UNIFIED IDEOGRAPH + {0xF58F, 0x9BCA}, //20708 #CJK UNIFIED IDEOGRAPH + {0xF590, 0x9BCB}, //20709 #CJK UNIFIED IDEOGRAPH + {0xF591, 0x9BCC}, //20710 #CJK UNIFIED IDEOGRAPH + {0xF592, 0x9BCD}, //20711 #CJK UNIFIED IDEOGRAPH + {0xF593, 0x9BCE}, //20712 #CJK UNIFIED IDEOGRAPH + {0xF594, 0x9BCF}, //20713 #CJK UNIFIED IDEOGRAPH + {0xF595, 0x9BD0}, //20714 #CJK UNIFIED IDEOGRAPH + {0xF596, 0x9BD1}, //20715 #CJK UNIFIED IDEOGRAPH + {0xF597, 0x9BD2}, //20716 #CJK UNIFIED IDEOGRAPH + {0xF598, 0x9BD3}, //20717 #CJK UNIFIED IDEOGRAPH + {0xF599, 0x9BD4}, //20718 #CJK UNIFIED IDEOGRAPH + {0xF59A, 0x9BD5}, //20719 #CJK UNIFIED IDEOGRAPH + {0xF59B, 0x9BD6}, //20720 #CJK UNIFIED IDEOGRAPH + {0xF59C, 0x9BD7}, //20721 #CJK UNIFIED IDEOGRAPH + {0xF59D, 0x9BD8}, //20722 #CJK UNIFIED IDEOGRAPH + {0xF59E, 0x9BD9}, //20723 #CJK UNIFIED IDEOGRAPH + {0xF59F, 0x9BDA}, //20724 #CJK UNIFIED IDEOGRAPH + {0xF5A0, 0x9BDB}, //20725 #CJK UNIFIED IDEOGRAPH + {0xF5A1, 0x9162}, //20726 #CJK UNIFIED IDEOGRAPH + {0xF5A2, 0x9161}, //20727 #CJK UNIFIED IDEOGRAPH + {0xF5A3, 0x9170}, //20728 #CJK UNIFIED IDEOGRAPH + {0xF5A4, 0x9169}, //20729 #CJK UNIFIED IDEOGRAPH + {0xF5A5, 0x916F}, //20730 #CJK UNIFIED IDEOGRAPH + {0xF5A6, 0x917D}, //20731 #CJK UNIFIED IDEOGRAPH + {0xF5A7, 0x917E}, //20732 #CJK UNIFIED IDEOGRAPH + {0xF5A8, 0x9172}, //20733 #CJK UNIFIED IDEOGRAPH + {0xF5A9, 0x9174}, //20734 #CJK UNIFIED IDEOGRAPH + {0xF5AA, 0x9179}, //20735 #CJK UNIFIED IDEOGRAPH + {0xF5AB, 0x918C}, //20736 #CJK UNIFIED IDEOGRAPH + {0xF5AC, 0x9185}, //20737 #CJK UNIFIED IDEOGRAPH + {0xF5AD, 0x9190}, //20738 #CJK UNIFIED IDEOGRAPH + {0xF5AE, 0x918D}, //20739 #CJK UNIFIED IDEOGRAPH + {0xF5AF, 0x9191}, //20740 #CJK UNIFIED IDEOGRAPH + {0xF5B0, 0x91A2}, //20741 #CJK UNIFIED IDEOGRAPH + {0xF5B1, 0x91A3}, //20742 #CJK UNIFIED IDEOGRAPH + {0xF5B2, 0x91AA}, //20743 #CJK UNIFIED IDEOGRAPH + {0xF5B3, 0x91AD}, //20744 #CJK UNIFIED IDEOGRAPH + {0xF5B4, 0x91AE}, //20745 #CJK UNIFIED IDEOGRAPH + {0xF5B5, 0x91AF}, //20746 #CJK UNIFIED IDEOGRAPH + {0xF5B6, 0x91B5}, //20747 #CJK UNIFIED IDEOGRAPH + {0xF5B7, 0x91B4}, //20748 #CJK UNIFIED IDEOGRAPH + {0xF5B8, 0x91BA}, //20749 #CJK UNIFIED IDEOGRAPH + {0xF5B9, 0x8C55}, //20750 #CJK UNIFIED IDEOGRAPH + {0xF5BA, 0x9E7E}, //20751 #CJK UNIFIED IDEOGRAPH + {0xF5BB, 0x8DB8}, //20752 #CJK UNIFIED IDEOGRAPH + {0xF5BC, 0x8DEB}, //20753 #CJK UNIFIED IDEOGRAPH + {0xF5BD, 0x8E05}, //20754 #CJK UNIFIED IDEOGRAPH + {0xF5BE, 0x8E59}, //20755 #CJK UNIFIED IDEOGRAPH + {0xF5BF, 0x8E69}, //20756 #CJK UNIFIED IDEOGRAPH + {0xF5C0, 0x8DB5}, //20757 #CJK UNIFIED IDEOGRAPH + {0xF5C1, 0x8DBF}, //20758 #CJK UNIFIED IDEOGRAPH + {0xF5C2, 0x8DBC}, //20759 #CJK UNIFIED IDEOGRAPH + {0xF5C3, 0x8DBA}, //20760 #CJK UNIFIED IDEOGRAPH + {0xF5C4, 0x8DC4}, //20761 #CJK UNIFIED IDEOGRAPH + {0xF5C5, 0x8DD6}, //20762 #CJK UNIFIED IDEOGRAPH + {0xF5C6, 0x8DD7}, //20763 #CJK UNIFIED IDEOGRAPH + {0xF5C7, 0x8DDA}, //20764 #CJK UNIFIED IDEOGRAPH + {0xF5C8, 0x8DDE}, //20765 #CJK UNIFIED IDEOGRAPH + {0xF5C9, 0x8DCE}, //20766 #CJK UNIFIED IDEOGRAPH + {0xF5CA, 0x8DCF}, //20767 #CJK UNIFIED IDEOGRAPH + {0xF5CB, 0x8DDB}, //20768 #CJK UNIFIED IDEOGRAPH + {0xF5CC, 0x8DC6}, //20769 #CJK UNIFIED IDEOGRAPH + {0xF5CD, 0x8DEC}, //20770 #CJK UNIFIED IDEOGRAPH + {0xF5CE, 0x8DF7}, //20771 #CJK UNIFIED IDEOGRAPH + {0xF5CF, 0x8DF8}, //20772 #CJK UNIFIED IDEOGRAPH + {0xF5D0, 0x8DE3}, //20773 #CJK UNIFIED IDEOGRAPH + {0xF5D1, 0x8DF9}, //20774 #CJK UNIFIED IDEOGRAPH + {0xF5D2, 0x8DFB}, //20775 #CJK UNIFIED IDEOGRAPH + {0xF5D3, 0x8DE4}, //20776 #CJK UNIFIED IDEOGRAPH + {0xF5D4, 0x8E09}, //20777 #CJK UNIFIED IDEOGRAPH + {0xF5D5, 0x8DFD}, //20778 #CJK UNIFIED IDEOGRAPH + {0xF5D6, 0x8E14}, //20779 #CJK UNIFIED IDEOGRAPH + {0xF5D7, 0x8E1D}, //20780 #CJK UNIFIED IDEOGRAPH + {0xF5D8, 0x8E1F}, //20781 #CJK UNIFIED IDEOGRAPH + {0xF5D9, 0x8E2C}, //20782 #CJK UNIFIED IDEOGRAPH + {0xF5DA, 0x8E2E}, //20783 #CJK UNIFIED IDEOGRAPH + {0xF5DB, 0x8E23}, //20784 #CJK UNIFIED IDEOGRAPH + {0xF5DC, 0x8E2F}, //20785 #CJK UNIFIED IDEOGRAPH + {0xF5DD, 0x8E3A}, //20786 #CJK UNIFIED IDEOGRAPH + {0xF5DE, 0x8E40}, //20787 #CJK UNIFIED IDEOGRAPH + {0xF5DF, 0x8E39}, //20788 #CJK UNIFIED IDEOGRAPH + {0xF5E0, 0x8E35}, //20789 #CJK UNIFIED IDEOGRAPH + {0xF5E1, 0x8E3D}, //20790 #CJK UNIFIED IDEOGRAPH + {0xF5E2, 0x8E31}, //20791 #CJK UNIFIED IDEOGRAPH + {0xF5E3, 0x8E49}, //20792 #CJK UNIFIED IDEOGRAPH + {0xF5E4, 0x8E41}, //20793 #CJK UNIFIED IDEOGRAPH + {0xF5E5, 0x8E42}, //20794 #CJK UNIFIED IDEOGRAPH + {0xF5E6, 0x8E51}, //20795 #CJK UNIFIED IDEOGRAPH + {0xF5E7, 0x8E52}, //20796 #CJK UNIFIED IDEOGRAPH + {0xF5E8, 0x8E4A}, //20797 #CJK UNIFIED IDEOGRAPH + {0xF5E9, 0x8E70}, //20798 #CJK UNIFIED IDEOGRAPH + {0xF5EA, 0x8E76}, //20799 #CJK UNIFIED IDEOGRAPH + {0xF5EB, 0x8E7C}, //20800 #CJK UNIFIED IDEOGRAPH + {0xF5EC, 0x8E6F}, //20801 #CJK UNIFIED IDEOGRAPH + {0xF5ED, 0x8E74}, //20802 #CJK UNIFIED IDEOGRAPH + {0xF5EE, 0x8E85}, //20803 #CJK UNIFIED IDEOGRAPH + {0xF5EF, 0x8E8F}, //20804 #CJK UNIFIED IDEOGRAPH + {0xF5F0, 0x8E94}, //20805 #CJK UNIFIED IDEOGRAPH + {0xF5F1, 0x8E90}, //20806 #CJK UNIFIED IDEOGRAPH + {0xF5F2, 0x8E9C}, //20807 #CJK UNIFIED IDEOGRAPH + {0xF5F3, 0x8E9E}, //20808 #CJK UNIFIED IDEOGRAPH + {0xF5F4, 0x8C78}, //20809 #CJK UNIFIED IDEOGRAPH + {0xF5F5, 0x8C82}, //20810 #CJK UNIFIED IDEOGRAPH + {0xF5F6, 0x8C8A}, //20811 #CJK UNIFIED IDEOGRAPH + {0xF5F7, 0x8C85}, //20812 #CJK UNIFIED IDEOGRAPH + {0xF5F8, 0x8C98}, //20813 #CJK UNIFIED IDEOGRAPH + {0xF5F9, 0x8C94}, //20814 #CJK UNIFIED IDEOGRAPH + {0xF5FA, 0x659B}, //20815 #CJK UNIFIED IDEOGRAPH + {0xF5FB, 0x89D6}, //20816 #CJK UNIFIED IDEOGRAPH + {0xF5FC, 0x89DE}, //20817 #CJK UNIFIED IDEOGRAPH + {0xF5FD, 0x89DA}, //20818 #CJK UNIFIED IDEOGRAPH + {0xF5FE, 0x89DC}, //20819 #CJK UNIFIED IDEOGRAPH + {0xF640, 0x9BDC}, //20820 #CJK UNIFIED IDEOGRAPH + {0xF641, 0x9BDD}, //20821 #CJK UNIFIED IDEOGRAPH + {0xF642, 0x9BDE}, //20822 #CJK UNIFIED IDEOGRAPH + {0xF643, 0x9BDF}, //20823 #CJK UNIFIED IDEOGRAPH + {0xF644, 0x9BE0}, //20824 #CJK UNIFIED IDEOGRAPH + {0xF645, 0x9BE1}, //20825 #CJK UNIFIED IDEOGRAPH + {0xF646, 0x9BE2}, //20826 #CJK UNIFIED IDEOGRAPH + {0xF647, 0x9BE3}, //20827 #CJK UNIFIED IDEOGRAPH + {0xF648, 0x9BE4}, //20828 #CJK UNIFIED IDEOGRAPH + {0xF649, 0x9BE5}, //20829 #CJK UNIFIED IDEOGRAPH + {0xF64A, 0x9BE6}, //20830 #CJK UNIFIED IDEOGRAPH + {0xF64B, 0x9BE7}, //20831 #CJK UNIFIED IDEOGRAPH + {0xF64C, 0x9BE8}, //20832 #CJK UNIFIED IDEOGRAPH + {0xF64D, 0x9BE9}, //20833 #CJK UNIFIED IDEOGRAPH + {0xF64E, 0x9BEA}, //20834 #CJK UNIFIED IDEOGRAPH + {0xF64F, 0x9BEB}, //20835 #CJK UNIFIED IDEOGRAPH + {0xF650, 0x9BEC}, //20836 #CJK UNIFIED IDEOGRAPH + {0xF651, 0x9BED}, //20837 #CJK UNIFIED IDEOGRAPH + {0xF652, 0x9BEE}, //20838 #CJK UNIFIED IDEOGRAPH + {0xF653, 0x9BEF}, //20839 #CJK UNIFIED IDEOGRAPH + {0xF654, 0x9BF0}, //20840 #CJK UNIFIED IDEOGRAPH + {0xF655, 0x9BF1}, //20841 #CJK UNIFIED IDEOGRAPH + {0xF656, 0x9BF2}, //20842 #CJK UNIFIED IDEOGRAPH + {0xF657, 0x9BF3}, //20843 #CJK UNIFIED IDEOGRAPH + {0xF658, 0x9BF4}, //20844 #CJK UNIFIED IDEOGRAPH + {0xF659, 0x9BF5}, //20845 #CJK UNIFIED IDEOGRAPH + {0xF65A, 0x9BF6}, //20846 #CJK UNIFIED IDEOGRAPH + {0xF65B, 0x9BF7}, //20847 #CJK UNIFIED IDEOGRAPH + {0xF65C, 0x9BF8}, //20848 #CJK UNIFIED IDEOGRAPH + {0xF65D, 0x9BF9}, //20849 #CJK UNIFIED IDEOGRAPH + {0xF65E, 0x9BFA}, //20850 #CJK UNIFIED IDEOGRAPH + {0xF65F, 0x9BFB}, //20851 #CJK UNIFIED IDEOGRAPH + {0xF660, 0x9BFC}, //20852 #CJK UNIFIED IDEOGRAPH + {0xF661, 0x9BFD}, //20853 #CJK UNIFIED IDEOGRAPH + {0xF662, 0x9BFE}, //20854 #CJK UNIFIED IDEOGRAPH + {0xF663, 0x9BFF}, //20855 #CJK UNIFIED IDEOGRAPH + {0xF664, 0x9C00}, //20856 #CJK UNIFIED IDEOGRAPH + {0xF665, 0x9C01}, //20857 #CJK UNIFIED IDEOGRAPH + {0xF666, 0x9C02}, //20858 #CJK UNIFIED IDEOGRAPH + {0xF667, 0x9C03}, //20859 #CJK UNIFIED IDEOGRAPH + {0xF668, 0x9C04}, //20860 #CJK UNIFIED IDEOGRAPH + {0xF669, 0x9C05}, //20861 #CJK UNIFIED IDEOGRAPH + {0xF66A, 0x9C06}, //20862 #CJK UNIFIED IDEOGRAPH + {0xF66B, 0x9C07}, //20863 #CJK UNIFIED IDEOGRAPH + {0xF66C, 0x9C08}, //20864 #CJK UNIFIED IDEOGRAPH + {0xF66D, 0x9C09}, //20865 #CJK UNIFIED IDEOGRAPH + {0xF66E, 0x9C0A}, //20866 #CJK UNIFIED IDEOGRAPH + {0xF66F, 0x9C0B}, //20867 #CJK UNIFIED IDEOGRAPH + {0xF670, 0x9C0C}, //20868 #CJK UNIFIED IDEOGRAPH + {0xF671, 0x9C0D}, //20869 #CJK UNIFIED IDEOGRAPH + {0xF672, 0x9C0E}, //20870 #CJK UNIFIED IDEOGRAPH + {0xF673, 0x9C0F}, //20871 #CJK UNIFIED IDEOGRAPH + {0xF674, 0x9C10}, //20872 #CJK UNIFIED IDEOGRAPH + {0xF675, 0x9C11}, //20873 #CJK UNIFIED IDEOGRAPH + {0xF676, 0x9C12}, //20874 #CJK UNIFIED IDEOGRAPH + {0xF677, 0x9C13}, //20875 #CJK UNIFIED IDEOGRAPH + {0xF678, 0x9C14}, //20876 #CJK UNIFIED IDEOGRAPH + {0xF679, 0x9C15}, //20877 #CJK UNIFIED IDEOGRAPH + {0xF67A, 0x9C16}, //20878 #CJK UNIFIED IDEOGRAPH + {0xF67B, 0x9C17}, //20879 #CJK UNIFIED IDEOGRAPH + {0xF67C, 0x9C18}, //20880 #CJK UNIFIED IDEOGRAPH + {0xF67D, 0x9C19}, //20881 #CJK UNIFIED IDEOGRAPH + {0xF67E, 0x9C1A}, //20882 #CJK UNIFIED IDEOGRAPH + {0xF680, 0x9C1B}, //20883 #CJK UNIFIED IDEOGRAPH + {0xF681, 0x9C1C}, //20884 #CJK UNIFIED IDEOGRAPH + {0xF682, 0x9C1D}, //20885 #CJK UNIFIED IDEOGRAPH + {0xF683, 0x9C1E}, //20886 #CJK UNIFIED IDEOGRAPH + {0xF684, 0x9C1F}, //20887 #CJK UNIFIED IDEOGRAPH + {0xF685, 0x9C20}, //20888 #CJK UNIFIED IDEOGRAPH + {0xF686, 0x9C21}, //20889 #CJK UNIFIED IDEOGRAPH + {0xF687, 0x9C22}, //20890 #CJK UNIFIED IDEOGRAPH + {0xF688, 0x9C23}, //20891 #CJK UNIFIED IDEOGRAPH + {0xF689, 0x9C24}, //20892 #CJK UNIFIED IDEOGRAPH + {0xF68A, 0x9C25}, //20893 #CJK UNIFIED IDEOGRAPH + {0xF68B, 0x9C26}, //20894 #CJK UNIFIED IDEOGRAPH + {0xF68C, 0x9C27}, //20895 #CJK UNIFIED IDEOGRAPH + {0xF68D, 0x9C28}, //20896 #CJK UNIFIED IDEOGRAPH + {0xF68E, 0x9C29}, //20897 #CJK UNIFIED IDEOGRAPH + {0xF68F, 0x9C2A}, //20898 #CJK UNIFIED IDEOGRAPH + {0xF690, 0x9C2B}, //20899 #CJK UNIFIED IDEOGRAPH + {0xF691, 0x9C2C}, //20900 #CJK UNIFIED IDEOGRAPH + {0xF692, 0x9C2D}, //20901 #CJK UNIFIED IDEOGRAPH + {0xF693, 0x9C2E}, //20902 #CJK UNIFIED IDEOGRAPH + {0xF694, 0x9C2F}, //20903 #CJK UNIFIED IDEOGRAPH + {0xF695, 0x9C30}, //20904 #CJK UNIFIED IDEOGRAPH + {0xF696, 0x9C31}, //20905 #CJK UNIFIED IDEOGRAPH + {0xF697, 0x9C32}, //20906 #CJK UNIFIED IDEOGRAPH + {0xF698, 0x9C33}, //20907 #CJK UNIFIED IDEOGRAPH + {0xF699, 0x9C34}, //20908 #CJK UNIFIED IDEOGRAPH + {0xF69A, 0x9C35}, //20909 #CJK UNIFIED IDEOGRAPH + {0xF69B, 0x9C36}, //20910 #CJK UNIFIED IDEOGRAPH + {0xF69C, 0x9C37}, //20911 #CJK UNIFIED IDEOGRAPH + {0xF69D, 0x9C38}, //20912 #CJK UNIFIED IDEOGRAPH + {0xF69E, 0x9C39}, //20913 #CJK UNIFIED IDEOGRAPH + {0xF69F, 0x9C3A}, //20914 #CJK UNIFIED IDEOGRAPH + {0xF6A0, 0x9C3B}, //20915 #CJK UNIFIED IDEOGRAPH + {0xF6A1, 0x89E5}, //20916 #CJK UNIFIED IDEOGRAPH + {0xF6A2, 0x89EB}, //20917 #CJK UNIFIED IDEOGRAPH + {0xF6A3, 0x89EF}, //20918 #CJK UNIFIED IDEOGRAPH + {0xF6A4, 0x8A3E}, //20919 #CJK UNIFIED IDEOGRAPH + {0xF6A5, 0x8B26}, //20920 #CJK UNIFIED IDEOGRAPH + {0xF6A6, 0x9753}, //20921 #CJK UNIFIED IDEOGRAPH + {0xF6A7, 0x96E9}, //20922 #CJK UNIFIED IDEOGRAPH + {0xF6A8, 0x96F3}, //20923 #CJK UNIFIED IDEOGRAPH + {0xF6A9, 0x96EF}, //20924 #CJK UNIFIED IDEOGRAPH + {0xF6AA, 0x9706}, //20925 #CJK UNIFIED IDEOGRAPH + {0xF6AB, 0x9701}, //20926 #CJK UNIFIED IDEOGRAPH + {0xF6AC, 0x9708}, //20927 #CJK UNIFIED IDEOGRAPH + {0xF6AD, 0x970F}, //20928 #CJK UNIFIED IDEOGRAPH + {0xF6AE, 0x970E}, //20929 #CJK UNIFIED IDEOGRAPH + {0xF6AF, 0x972A}, //20930 #CJK UNIFIED IDEOGRAPH + {0xF6B0, 0x972D}, //20931 #CJK UNIFIED IDEOGRAPH + {0xF6B1, 0x9730}, //20932 #CJK UNIFIED IDEOGRAPH + {0xF6B2, 0x973E}, //20933 #CJK UNIFIED IDEOGRAPH + {0xF6B3, 0x9F80}, //20934 #CJK UNIFIED IDEOGRAPH + {0xF6B4, 0x9F83}, //20935 #CJK UNIFIED IDEOGRAPH + {0xF6B5, 0x9F85}, //20936 #CJK UNIFIED IDEOGRAPH + {0xF6B6, 0x9F86}, //20937 #CJK UNIFIED IDEOGRAPH + {0xF6B7, 0x9F87}, //20938 #CJK UNIFIED IDEOGRAPH + {0xF6B8, 0x9F88}, //20939 #CJK UNIFIED IDEOGRAPH + {0xF6B9, 0x9F89}, //20940 #CJK UNIFIED IDEOGRAPH + {0xF6BA, 0x9F8A}, //20941 #CJK UNIFIED IDEOGRAPH + {0xF6BB, 0x9F8C}, //20942 #CJK UNIFIED IDEOGRAPH + {0xF6BC, 0x9EFE}, //20943 #CJK UNIFIED IDEOGRAPH + {0xF6BD, 0x9F0B}, //20944 #CJK UNIFIED IDEOGRAPH + {0xF6BE, 0x9F0D}, //20945 #CJK UNIFIED IDEOGRAPH + {0xF6BF, 0x96B9}, //20946 #CJK UNIFIED IDEOGRAPH + {0xF6C0, 0x96BC}, //20947 #CJK UNIFIED IDEOGRAPH + {0xF6C1, 0x96BD}, //20948 #CJK UNIFIED IDEOGRAPH + {0xF6C2, 0x96CE}, //20949 #CJK UNIFIED IDEOGRAPH + {0xF6C3, 0x96D2}, //20950 #CJK UNIFIED IDEOGRAPH + {0xF6C4, 0x77BF}, //20951 #CJK UNIFIED IDEOGRAPH + {0xF6C5, 0x96E0}, //20952 #CJK UNIFIED IDEOGRAPH + {0xF6C6, 0x928E}, //20953 #CJK UNIFIED IDEOGRAPH + {0xF6C7, 0x92AE}, //20954 #CJK UNIFIED IDEOGRAPH + {0xF6C8, 0x92C8}, //20955 #CJK UNIFIED IDEOGRAPH + {0xF6C9, 0x933E}, //20956 #CJK UNIFIED IDEOGRAPH + {0xF6CA, 0x936A}, //20957 #CJK UNIFIED IDEOGRAPH + {0xF6CB, 0x93CA}, //20958 #CJK UNIFIED IDEOGRAPH + {0xF6CC, 0x938F}, //20959 #CJK UNIFIED IDEOGRAPH + {0xF6CD, 0x943E}, //20960 #CJK UNIFIED IDEOGRAPH + {0xF6CE, 0x946B}, //20961 #CJK UNIFIED IDEOGRAPH + {0xF6CF, 0x9C7F}, //20962 #CJK UNIFIED IDEOGRAPH + {0xF6D0, 0x9C82}, //20963 #CJK UNIFIED IDEOGRAPH + {0xF6D1, 0x9C85}, //20964 #CJK UNIFIED IDEOGRAPH + {0xF6D2, 0x9C86}, //20965 #CJK UNIFIED IDEOGRAPH + {0xF6D3, 0x9C87}, //20966 #CJK UNIFIED IDEOGRAPH + {0xF6D4, 0x9C88}, //20967 #CJK UNIFIED IDEOGRAPH + {0xF6D5, 0x7A23}, //20968 #CJK UNIFIED IDEOGRAPH + {0xF6D6, 0x9C8B}, //20969 #CJK UNIFIED IDEOGRAPH + {0xF6D7, 0x9C8E}, //20970 #CJK UNIFIED IDEOGRAPH + {0xF6D8, 0x9C90}, //20971 #CJK UNIFIED IDEOGRAPH + {0xF6D9, 0x9C91}, //20972 #CJK UNIFIED IDEOGRAPH + {0xF6DA, 0x9C92}, //20973 #CJK UNIFIED IDEOGRAPH + {0xF6DB, 0x9C94}, //20974 #CJK UNIFIED IDEOGRAPH + {0xF6DC, 0x9C95}, //20975 #CJK UNIFIED IDEOGRAPH + {0xF6DD, 0x9C9A}, //20976 #CJK UNIFIED IDEOGRAPH + {0xF6DE, 0x9C9B}, //20977 #CJK UNIFIED IDEOGRAPH + {0xF6DF, 0x9C9E}, //20978 #CJK UNIFIED IDEOGRAPH + {0xF6E0, 0x9C9F}, //20979 #CJK UNIFIED IDEOGRAPH + {0xF6E1, 0x9CA0}, //20980 #CJK UNIFIED IDEOGRAPH + {0xF6E2, 0x9CA1}, //20981 #CJK UNIFIED IDEOGRAPH + {0xF6E3, 0x9CA2}, //20982 #CJK UNIFIED IDEOGRAPH + {0xF6E4, 0x9CA3}, //20983 #CJK UNIFIED IDEOGRAPH + {0xF6E5, 0x9CA5}, //20984 #CJK UNIFIED IDEOGRAPH + {0xF6E6, 0x9CA6}, //20985 #CJK UNIFIED IDEOGRAPH + {0xF6E7, 0x9CA7}, //20986 #CJK UNIFIED IDEOGRAPH + {0xF6E8, 0x9CA8}, //20987 #CJK UNIFIED IDEOGRAPH + {0xF6E9, 0x9CA9}, //20988 #CJK UNIFIED IDEOGRAPH + {0xF6EA, 0x9CAB}, //20989 #CJK UNIFIED IDEOGRAPH + {0xF6EB, 0x9CAD}, //20990 #CJK UNIFIED IDEOGRAPH + {0xF6EC, 0x9CAE}, //20991 #CJK UNIFIED IDEOGRAPH + {0xF6ED, 0x9CB0}, //20992 #CJK UNIFIED IDEOGRAPH + {0xF6EE, 0x9CB1}, //20993 #CJK UNIFIED IDEOGRAPH + {0xF6EF, 0x9CB2}, //20994 #CJK UNIFIED IDEOGRAPH + {0xF6F0, 0x9CB3}, //20995 #CJK UNIFIED IDEOGRAPH + {0xF6F1, 0x9CB4}, //20996 #CJK UNIFIED IDEOGRAPH + {0xF6F2, 0x9CB5}, //20997 #CJK UNIFIED IDEOGRAPH + {0xF6F3, 0x9CB6}, //20998 #CJK UNIFIED IDEOGRAPH + {0xF6F4, 0x9CB7}, //20999 #CJK UNIFIED IDEOGRAPH + {0xF6F5, 0x9CBA}, //21000 #CJK UNIFIED IDEOGRAPH + {0xF6F6, 0x9CBB}, //21001 #CJK UNIFIED IDEOGRAPH + {0xF6F7, 0x9CBC}, //21002 #CJK UNIFIED IDEOGRAPH + {0xF6F8, 0x9CBD}, //21003 #CJK UNIFIED IDEOGRAPH + {0xF6F9, 0x9CC4}, //21004 #CJK UNIFIED IDEOGRAPH + {0xF6FA, 0x9CC5}, //21005 #CJK UNIFIED IDEOGRAPH + {0xF6FB, 0x9CC6}, //21006 #CJK UNIFIED IDEOGRAPH + {0xF6FC, 0x9CC7}, //21007 #CJK UNIFIED IDEOGRAPH + {0xF6FD, 0x9CCA}, //21008 #CJK UNIFIED IDEOGRAPH + {0xF6FE, 0x9CCB}, //21009 #CJK UNIFIED IDEOGRAPH + {0xF740, 0x9C3C}, //21010 #CJK UNIFIED IDEOGRAPH + {0xF741, 0x9C3D}, //21011 #CJK UNIFIED IDEOGRAPH + {0xF742, 0x9C3E}, //21012 #CJK UNIFIED IDEOGRAPH + {0xF743, 0x9C3F}, //21013 #CJK UNIFIED IDEOGRAPH + {0xF744, 0x9C40}, //21014 #CJK UNIFIED IDEOGRAPH + {0xF745, 0x9C41}, //21015 #CJK UNIFIED IDEOGRAPH + {0xF746, 0x9C42}, //21016 #CJK UNIFIED IDEOGRAPH + {0xF747, 0x9C43}, //21017 #CJK UNIFIED IDEOGRAPH + {0xF748, 0x9C44}, //21018 #CJK UNIFIED IDEOGRAPH + {0xF749, 0x9C45}, //21019 #CJK UNIFIED IDEOGRAPH + {0xF74A, 0x9C46}, //21020 #CJK UNIFIED IDEOGRAPH + {0xF74B, 0x9C47}, //21021 #CJK UNIFIED IDEOGRAPH + {0xF74C, 0x9C48}, //21022 #CJK UNIFIED IDEOGRAPH + {0xF74D, 0x9C49}, //21023 #CJK UNIFIED IDEOGRAPH + {0xF74E, 0x9C4A}, //21024 #CJK UNIFIED IDEOGRAPH + {0xF74F, 0x9C4B}, //21025 #CJK UNIFIED IDEOGRAPH + {0xF750, 0x9C4C}, //21026 #CJK UNIFIED IDEOGRAPH + {0xF751, 0x9C4D}, //21027 #CJK UNIFIED IDEOGRAPH + {0xF752, 0x9C4E}, //21028 #CJK UNIFIED IDEOGRAPH + {0xF753, 0x9C4F}, //21029 #CJK UNIFIED IDEOGRAPH + {0xF754, 0x9C50}, //21030 #CJK UNIFIED IDEOGRAPH + {0xF755, 0x9C51}, //21031 #CJK UNIFIED IDEOGRAPH + {0xF756, 0x9C52}, //21032 #CJK UNIFIED IDEOGRAPH + {0xF757, 0x9C53}, //21033 #CJK UNIFIED IDEOGRAPH + {0xF758, 0x9C54}, //21034 #CJK UNIFIED IDEOGRAPH + {0xF759, 0x9C55}, //21035 #CJK UNIFIED IDEOGRAPH + {0xF75A, 0x9C56}, //21036 #CJK UNIFIED IDEOGRAPH + {0xF75B, 0x9C57}, //21037 #CJK UNIFIED IDEOGRAPH + {0xF75C, 0x9C58}, //21038 #CJK UNIFIED IDEOGRAPH + {0xF75D, 0x9C59}, //21039 #CJK UNIFIED IDEOGRAPH + {0xF75E, 0x9C5A}, //21040 #CJK UNIFIED IDEOGRAPH + {0xF75F, 0x9C5B}, //21041 #CJK UNIFIED IDEOGRAPH + {0xF760, 0x9C5C}, //21042 #CJK UNIFIED IDEOGRAPH + {0xF761, 0x9C5D}, //21043 #CJK UNIFIED IDEOGRAPH + {0xF762, 0x9C5E}, //21044 #CJK UNIFIED IDEOGRAPH + {0xF763, 0x9C5F}, //21045 #CJK UNIFIED IDEOGRAPH + {0xF764, 0x9C60}, //21046 #CJK UNIFIED IDEOGRAPH + {0xF765, 0x9C61}, //21047 #CJK UNIFIED IDEOGRAPH + {0xF766, 0x9C62}, //21048 #CJK UNIFIED IDEOGRAPH + {0xF767, 0x9C63}, //21049 #CJK UNIFIED IDEOGRAPH + {0xF768, 0x9C64}, //21050 #CJK UNIFIED IDEOGRAPH + {0xF769, 0x9C65}, //21051 #CJK UNIFIED IDEOGRAPH + {0xF76A, 0x9C66}, //21052 #CJK UNIFIED IDEOGRAPH + {0xF76B, 0x9C67}, //21053 #CJK UNIFIED IDEOGRAPH + {0xF76C, 0x9C68}, //21054 #CJK UNIFIED IDEOGRAPH + {0xF76D, 0x9C69}, //21055 #CJK UNIFIED IDEOGRAPH + {0xF76E, 0x9C6A}, //21056 #CJK UNIFIED IDEOGRAPH + {0xF76F, 0x9C6B}, //21057 #CJK UNIFIED IDEOGRAPH + {0xF770, 0x9C6C}, //21058 #CJK UNIFIED IDEOGRAPH + {0xF771, 0x9C6D}, //21059 #CJK UNIFIED IDEOGRAPH + {0xF772, 0x9C6E}, //21060 #CJK UNIFIED IDEOGRAPH + {0xF773, 0x9C6F}, //21061 #CJK UNIFIED IDEOGRAPH + {0xF774, 0x9C70}, //21062 #CJK UNIFIED IDEOGRAPH + {0xF775, 0x9C71}, //21063 #CJK UNIFIED IDEOGRAPH + {0xF776, 0x9C72}, //21064 #CJK UNIFIED IDEOGRAPH + {0xF777, 0x9C73}, //21065 #CJK UNIFIED IDEOGRAPH + {0xF778, 0x9C74}, //21066 #CJK UNIFIED IDEOGRAPH + {0xF779, 0x9C75}, //21067 #CJK UNIFIED IDEOGRAPH + {0xF77A, 0x9C76}, //21068 #CJK UNIFIED IDEOGRAPH + {0xF77B, 0x9C77}, //21069 #CJK UNIFIED IDEOGRAPH + {0xF77C, 0x9C78}, //21070 #CJK UNIFIED IDEOGRAPH + {0xF77D, 0x9C79}, //21071 #CJK UNIFIED IDEOGRAPH + {0xF77E, 0x9C7A}, //21072 #CJK UNIFIED IDEOGRAPH + {0xF780, 0x9C7B}, //21073 #CJK UNIFIED IDEOGRAPH + {0xF781, 0x9C7D}, //21074 #CJK UNIFIED IDEOGRAPH + {0xF782, 0x9C7E}, //21075 #CJK UNIFIED IDEOGRAPH + {0xF783, 0x9C80}, //21076 #CJK UNIFIED IDEOGRAPH + {0xF784, 0x9C83}, //21077 #CJK UNIFIED IDEOGRAPH + {0xF785, 0x9C84}, //21078 #CJK UNIFIED IDEOGRAPH + {0xF786, 0x9C89}, //21079 #CJK UNIFIED IDEOGRAPH + {0xF787, 0x9C8A}, //21080 #CJK UNIFIED IDEOGRAPH + {0xF788, 0x9C8C}, //21081 #CJK UNIFIED IDEOGRAPH + {0xF789, 0x9C8F}, //21082 #CJK UNIFIED IDEOGRAPH + {0xF78A, 0x9C93}, //21083 #CJK UNIFIED IDEOGRAPH + {0xF78B, 0x9C96}, //21084 #CJK UNIFIED IDEOGRAPH + {0xF78C, 0x9C97}, //21085 #CJK UNIFIED IDEOGRAPH + {0xF78D, 0x9C98}, //21086 #CJK UNIFIED IDEOGRAPH + {0xF78E, 0x9C99}, //21087 #CJK UNIFIED IDEOGRAPH + {0xF78F, 0x9C9D}, //21088 #CJK UNIFIED IDEOGRAPH + {0xF790, 0x9CAA}, //21089 #CJK UNIFIED IDEOGRAPH + {0xF791, 0x9CAC}, //21090 #CJK UNIFIED IDEOGRAPH + {0xF792, 0x9CAF}, //21091 #CJK UNIFIED IDEOGRAPH + {0xF793, 0x9CB9}, //21092 #CJK UNIFIED IDEOGRAPH + {0xF794, 0x9CBE}, //21093 #CJK UNIFIED IDEOGRAPH + {0xF795, 0x9CBF}, //21094 #CJK UNIFIED IDEOGRAPH + {0xF796, 0x9CC0}, //21095 #CJK UNIFIED IDEOGRAPH + {0xF797, 0x9CC1}, //21096 #CJK UNIFIED IDEOGRAPH + {0xF798, 0x9CC2}, //21097 #CJK UNIFIED IDEOGRAPH + {0xF799, 0x9CC8}, //21098 #CJK UNIFIED IDEOGRAPH + {0xF79A, 0x9CC9}, //21099 #CJK UNIFIED IDEOGRAPH + {0xF79B, 0x9CD1}, //21100 #CJK UNIFIED IDEOGRAPH + {0xF79C, 0x9CD2}, //21101 #CJK UNIFIED IDEOGRAPH + {0xF79D, 0x9CDA}, //21102 #CJK UNIFIED IDEOGRAPH + {0xF79E, 0x9CDB}, //21103 #CJK UNIFIED IDEOGRAPH + {0xF79F, 0x9CE0}, //21104 #CJK UNIFIED IDEOGRAPH + {0xF7A0, 0x9CE1}, //21105 #CJK UNIFIED IDEOGRAPH + {0xF7A1, 0x9CCC}, //21106 #CJK UNIFIED IDEOGRAPH + {0xF7A2, 0x9CCD}, //21107 #CJK UNIFIED IDEOGRAPH + {0xF7A3, 0x9CCE}, //21108 #CJK UNIFIED IDEOGRAPH + {0xF7A4, 0x9CCF}, //21109 #CJK UNIFIED IDEOGRAPH + {0xF7A5, 0x9CD0}, //21110 #CJK UNIFIED IDEOGRAPH + {0xF7A6, 0x9CD3}, //21111 #CJK UNIFIED IDEOGRAPH + {0xF7A7, 0x9CD4}, //21112 #CJK UNIFIED IDEOGRAPH + {0xF7A8, 0x9CD5}, //21113 #CJK UNIFIED IDEOGRAPH + {0xF7A9, 0x9CD7}, //21114 #CJK UNIFIED IDEOGRAPH + {0xF7AA, 0x9CD8}, //21115 #CJK UNIFIED IDEOGRAPH + {0xF7AB, 0x9CD9}, //21116 #CJK UNIFIED IDEOGRAPH + {0xF7AC, 0x9CDC}, //21117 #CJK UNIFIED IDEOGRAPH + {0xF7AD, 0x9CDD}, //21118 #CJK UNIFIED IDEOGRAPH + {0xF7AE, 0x9CDF}, //21119 #CJK UNIFIED IDEOGRAPH + {0xF7AF, 0x9CE2}, //21120 #CJK UNIFIED IDEOGRAPH + {0xF7B0, 0x977C}, //21121 #CJK UNIFIED IDEOGRAPH + {0xF7B1, 0x9785}, //21122 #CJK UNIFIED IDEOGRAPH + {0xF7B2, 0x9791}, //21123 #CJK UNIFIED IDEOGRAPH + {0xF7B3, 0x9792}, //21124 #CJK UNIFIED IDEOGRAPH + {0xF7B4, 0x9794}, //21125 #CJK UNIFIED IDEOGRAPH + {0xF7B5, 0x97AF}, //21126 #CJK UNIFIED IDEOGRAPH + {0xF7B6, 0x97AB}, //21127 #CJK UNIFIED IDEOGRAPH + {0xF7B7, 0x97A3}, //21128 #CJK UNIFIED IDEOGRAPH + {0xF7B8, 0x97B2}, //21129 #CJK UNIFIED IDEOGRAPH + {0xF7B9, 0x97B4}, //21130 #CJK UNIFIED IDEOGRAPH + {0xF7BA, 0x9AB1}, //21131 #CJK UNIFIED IDEOGRAPH + {0xF7BB, 0x9AB0}, //21132 #CJK UNIFIED IDEOGRAPH + {0xF7BC, 0x9AB7}, //21133 #CJK UNIFIED IDEOGRAPH + {0xF7BD, 0x9E58}, //21134 #CJK UNIFIED IDEOGRAPH + {0xF7BE, 0x9AB6}, //21135 #CJK UNIFIED IDEOGRAPH + {0xF7BF, 0x9ABA}, //21136 #CJK UNIFIED IDEOGRAPH + {0xF7C0, 0x9ABC}, //21137 #CJK UNIFIED IDEOGRAPH + {0xF7C1, 0x9AC1}, //21138 #CJK UNIFIED IDEOGRAPH + {0xF7C2, 0x9AC0}, //21139 #CJK UNIFIED IDEOGRAPH + {0xF7C3, 0x9AC5}, //21140 #CJK UNIFIED IDEOGRAPH + {0xF7C4, 0x9AC2}, //21141 #CJK UNIFIED IDEOGRAPH + {0xF7C5, 0x9ACB}, //21142 #CJK UNIFIED IDEOGRAPH + {0xF7C6, 0x9ACC}, //21143 #CJK UNIFIED IDEOGRAPH + {0xF7C7, 0x9AD1}, //21144 #CJK UNIFIED IDEOGRAPH + {0xF7C8, 0x9B45}, //21145 #CJK UNIFIED IDEOGRAPH + {0xF7C9, 0x9B43}, //21146 #CJK UNIFIED IDEOGRAPH + {0xF7CA, 0x9B47}, //21147 #CJK UNIFIED IDEOGRAPH + {0xF7CB, 0x9B49}, //21148 #CJK UNIFIED IDEOGRAPH + {0xF7CC, 0x9B48}, //21149 #CJK UNIFIED IDEOGRAPH + {0xF7CD, 0x9B4D}, //21150 #CJK UNIFIED IDEOGRAPH + {0xF7CE, 0x9B51}, //21151 #CJK UNIFIED IDEOGRAPH + {0xF7CF, 0x98E8}, //21152 #CJK UNIFIED IDEOGRAPH + {0xF7D0, 0x990D}, //21153 #CJK UNIFIED IDEOGRAPH + {0xF7D1, 0x992E}, //21154 #CJK UNIFIED IDEOGRAPH + {0xF7D2, 0x9955}, //21155 #CJK UNIFIED IDEOGRAPH + {0xF7D3, 0x9954}, //21156 #CJK UNIFIED IDEOGRAPH + {0xF7D4, 0x9ADF}, //21157 #CJK UNIFIED IDEOGRAPH + {0xF7D5, 0x9AE1}, //21158 #CJK UNIFIED IDEOGRAPH + {0xF7D6, 0x9AE6}, //21159 #CJK UNIFIED IDEOGRAPH + {0xF7D7, 0x9AEF}, //21160 #CJK UNIFIED IDEOGRAPH + {0xF7D8, 0x9AEB}, //21161 #CJK UNIFIED IDEOGRAPH + {0xF7D9, 0x9AFB}, //21162 #CJK UNIFIED IDEOGRAPH + {0xF7DA, 0x9AED}, //21163 #CJK UNIFIED IDEOGRAPH + {0xF7DB, 0x9AF9}, //21164 #CJK UNIFIED IDEOGRAPH + {0xF7DC, 0x9B08}, //21165 #CJK UNIFIED IDEOGRAPH + {0xF7DD, 0x9B0F}, //21166 #CJK UNIFIED IDEOGRAPH + {0xF7DE, 0x9B13}, //21167 #CJK UNIFIED IDEOGRAPH + {0xF7DF, 0x9B1F}, //21168 #CJK UNIFIED IDEOGRAPH + {0xF7E0, 0x9B23}, //21169 #CJK UNIFIED IDEOGRAPH + {0xF7E1, 0x9EBD}, //21170 #CJK UNIFIED IDEOGRAPH + {0xF7E2, 0x9EBE}, //21171 #CJK UNIFIED IDEOGRAPH + {0xF7E3, 0x7E3B}, //21172 #CJK UNIFIED IDEOGRAPH + {0xF7E4, 0x9E82}, //21173 #CJK UNIFIED IDEOGRAPH + {0xF7E5, 0x9E87}, //21174 #CJK UNIFIED IDEOGRAPH + {0xF7E6, 0x9E88}, //21175 #CJK UNIFIED IDEOGRAPH + {0xF7E7, 0x9E8B}, //21176 #CJK UNIFIED IDEOGRAPH + {0xF7E8, 0x9E92}, //21177 #CJK UNIFIED IDEOGRAPH + {0xF7E9, 0x93D6}, //21178 #CJK UNIFIED IDEOGRAPH + {0xF7EA, 0x9E9D}, //21179 #CJK UNIFIED IDEOGRAPH + {0xF7EB, 0x9E9F}, //21180 #CJK UNIFIED IDEOGRAPH + {0xF7EC, 0x9EDB}, //21181 #CJK UNIFIED IDEOGRAPH + {0xF7ED, 0x9EDC}, //21182 #CJK UNIFIED IDEOGRAPH + {0xF7EE, 0x9EDD}, //21183 #CJK UNIFIED IDEOGRAPH + {0xF7EF, 0x9EE0}, //21184 #CJK UNIFIED IDEOGRAPH + {0xF7F0, 0x9EDF}, //21185 #CJK UNIFIED IDEOGRAPH + {0xF7F1, 0x9EE2}, //21186 #CJK UNIFIED IDEOGRAPH + {0xF7F2, 0x9EE9}, //21187 #CJK UNIFIED IDEOGRAPH + {0xF7F3, 0x9EE7}, //21188 #CJK UNIFIED IDEOGRAPH + {0xF7F4, 0x9EE5}, //21189 #CJK UNIFIED IDEOGRAPH + {0xF7F5, 0x9EEA}, //21190 #CJK UNIFIED IDEOGRAPH + {0xF7F6, 0x9EEF}, //21191 #CJK UNIFIED IDEOGRAPH + {0xF7F7, 0x9F22}, //21192 #CJK UNIFIED IDEOGRAPH + {0xF7F8, 0x9F2C}, //21193 #CJK UNIFIED IDEOGRAPH + {0xF7F9, 0x9F2F}, //21194 #CJK UNIFIED IDEOGRAPH + {0xF7FA, 0x9F39}, //21195 #CJK UNIFIED IDEOGRAPH + {0xF7FB, 0x9F37}, //21196 #CJK UNIFIED IDEOGRAPH + {0xF7FC, 0x9F3D}, //21197 #CJK UNIFIED IDEOGRAPH + {0xF7FD, 0x9F3E}, //21198 #CJK UNIFIED IDEOGRAPH + {0xF7FE, 0x9F44}, //21199 #CJK UNIFIED IDEOGRAPH + {0xF840, 0x9CE3}, //21200 #CJK UNIFIED IDEOGRAPH + {0xF841, 0x9CE4}, //21201 #CJK UNIFIED IDEOGRAPH + {0xF842, 0x9CE5}, //21202 #CJK UNIFIED IDEOGRAPH + {0xF843, 0x9CE6}, //21203 #CJK UNIFIED IDEOGRAPH + {0xF844, 0x9CE7}, //21204 #CJK UNIFIED IDEOGRAPH + {0xF845, 0x9CE8}, //21205 #CJK UNIFIED IDEOGRAPH + {0xF846, 0x9CE9}, //21206 #CJK UNIFIED IDEOGRAPH + {0xF847, 0x9CEA}, //21207 #CJK UNIFIED IDEOGRAPH + {0xF848, 0x9CEB}, //21208 #CJK UNIFIED IDEOGRAPH + {0xF849, 0x9CEC}, //21209 #CJK UNIFIED IDEOGRAPH + {0xF84A, 0x9CED}, //21210 #CJK UNIFIED IDEOGRAPH + {0xF84B, 0x9CEE}, //21211 #CJK UNIFIED IDEOGRAPH + {0xF84C, 0x9CEF}, //21212 #CJK UNIFIED IDEOGRAPH + {0xF84D, 0x9CF0}, //21213 #CJK UNIFIED IDEOGRAPH + {0xF84E, 0x9CF1}, //21214 #CJK UNIFIED IDEOGRAPH + {0xF84F, 0x9CF2}, //21215 #CJK UNIFIED IDEOGRAPH + {0xF850, 0x9CF3}, //21216 #CJK UNIFIED IDEOGRAPH + {0xF851, 0x9CF4}, //21217 #CJK UNIFIED IDEOGRAPH + {0xF852, 0x9CF5}, //21218 #CJK UNIFIED IDEOGRAPH + {0xF853, 0x9CF6}, //21219 #CJK UNIFIED IDEOGRAPH + {0xF854, 0x9CF7}, //21220 #CJK UNIFIED IDEOGRAPH + {0xF855, 0x9CF8}, //21221 #CJK UNIFIED IDEOGRAPH + {0xF856, 0x9CF9}, //21222 #CJK UNIFIED IDEOGRAPH + {0xF857, 0x9CFA}, //21223 #CJK UNIFIED IDEOGRAPH + {0xF858, 0x9CFB}, //21224 #CJK UNIFIED IDEOGRAPH + {0xF859, 0x9CFC}, //21225 #CJK UNIFIED IDEOGRAPH + {0xF85A, 0x9CFD}, //21226 #CJK UNIFIED IDEOGRAPH + {0xF85B, 0x9CFE}, //21227 #CJK UNIFIED IDEOGRAPH + {0xF85C, 0x9CFF}, //21228 #CJK UNIFIED IDEOGRAPH + {0xF85D, 0x9D00}, //21229 #CJK UNIFIED IDEOGRAPH + {0xF85E, 0x9D01}, //21230 #CJK UNIFIED IDEOGRAPH + {0xF85F, 0x9D02}, //21231 #CJK UNIFIED IDEOGRAPH + {0xF860, 0x9D03}, //21232 #CJK UNIFIED IDEOGRAPH + {0xF861, 0x9D04}, //21233 #CJK UNIFIED IDEOGRAPH + {0xF862, 0x9D05}, //21234 #CJK UNIFIED IDEOGRAPH + {0xF863, 0x9D06}, //21235 #CJK UNIFIED IDEOGRAPH + {0xF864, 0x9D07}, //21236 #CJK UNIFIED IDEOGRAPH + {0xF865, 0x9D08}, //21237 #CJK UNIFIED IDEOGRAPH + {0xF866, 0x9D09}, //21238 #CJK UNIFIED IDEOGRAPH + {0xF867, 0x9D0A}, //21239 #CJK UNIFIED IDEOGRAPH + {0xF868, 0x9D0B}, //21240 #CJK UNIFIED IDEOGRAPH + {0xF869, 0x9D0C}, //21241 #CJK UNIFIED IDEOGRAPH + {0xF86A, 0x9D0D}, //21242 #CJK UNIFIED IDEOGRAPH + {0xF86B, 0x9D0E}, //21243 #CJK UNIFIED IDEOGRAPH + {0xF86C, 0x9D0F}, //21244 #CJK UNIFIED IDEOGRAPH + {0xF86D, 0x9D10}, //21245 #CJK UNIFIED IDEOGRAPH + {0xF86E, 0x9D11}, //21246 #CJK UNIFIED IDEOGRAPH + {0xF86F, 0x9D12}, //21247 #CJK UNIFIED IDEOGRAPH + {0xF870, 0x9D13}, //21248 #CJK UNIFIED IDEOGRAPH + {0xF871, 0x9D14}, //21249 #CJK UNIFIED IDEOGRAPH + {0xF872, 0x9D15}, //21250 #CJK UNIFIED IDEOGRAPH + {0xF873, 0x9D16}, //21251 #CJK UNIFIED IDEOGRAPH + {0xF874, 0x9D17}, //21252 #CJK UNIFIED IDEOGRAPH + {0xF875, 0x9D18}, //21253 #CJK UNIFIED IDEOGRAPH + {0xF876, 0x9D19}, //21254 #CJK UNIFIED IDEOGRAPH + {0xF877, 0x9D1A}, //21255 #CJK UNIFIED IDEOGRAPH + {0xF878, 0x9D1B}, //21256 #CJK UNIFIED IDEOGRAPH + {0xF879, 0x9D1C}, //21257 #CJK UNIFIED IDEOGRAPH + {0xF87A, 0x9D1D}, //21258 #CJK UNIFIED IDEOGRAPH + {0xF87B, 0x9D1E}, //21259 #CJK UNIFIED IDEOGRAPH + {0xF87C, 0x9D1F}, //21260 #CJK UNIFIED IDEOGRAPH + {0xF87D, 0x9D20}, //21261 #CJK UNIFIED IDEOGRAPH + {0xF87E, 0x9D21}, //21262 #CJK UNIFIED IDEOGRAPH + {0xF880, 0x9D22}, //21263 #CJK UNIFIED IDEOGRAPH + {0xF881, 0x9D23}, //21264 #CJK UNIFIED IDEOGRAPH + {0xF882, 0x9D24}, //21265 #CJK UNIFIED IDEOGRAPH + {0xF883, 0x9D25}, //21266 #CJK UNIFIED IDEOGRAPH + {0xF884, 0x9D26}, //21267 #CJK UNIFIED IDEOGRAPH + {0xF885, 0x9D27}, //21268 #CJK UNIFIED IDEOGRAPH + {0xF886, 0x9D28}, //21269 #CJK UNIFIED IDEOGRAPH + {0xF887, 0x9D29}, //21270 #CJK UNIFIED IDEOGRAPH + {0xF888, 0x9D2A}, //21271 #CJK UNIFIED IDEOGRAPH + {0xF889, 0x9D2B}, //21272 #CJK UNIFIED IDEOGRAPH + {0xF88A, 0x9D2C}, //21273 #CJK UNIFIED IDEOGRAPH + {0xF88B, 0x9D2D}, //21274 #CJK UNIFIED IDEOGRAPH + {0xF88C, 0x9D2E}, //21275 #CJK UNIFIED IDEOGRAPH + {0xF88D, 0x9D2F}, //21276 #CJK UNIFIED IDEOGRAPH + {0xF88E, 0x9D30}, //21277 #CJK UNIFIED IDEOGRAPH + {0xF88F, 0x9D31}, //21278 #CJK UNIFIED IDEOGRAPH + {0xF890, 0x9D32}, //21279 #CJK UNIFIED IDEOGRAPH + {0xF891, 0x9D33}, //21280 #CJK UNIFIED IDEOGRAPH + {0xF892, 0x9D34}, //21281 #CJK UNIFIED IDEOGRAPH + {0xF893, 0x9D35}, //21282 #CJK UNIFIED IDEOGRAPH + {0xF894, 0x9D36}, //21283 #CJK UNIFIED IDEOGRAPH + {0xF895, 0x9D37}, //21284 #CJK UNIFIED IDEOGRAPH + {0xF896, 0x9D38}, //21285 #CJK UNIFIED IDEOGRAPH + {0xF897, 0x9D39}, //21286 #CJK UNIFIED IDEOGRAPH + {0xF898, 0x9D3A}, //21287 #CJK UNIFIED IDEOGRAPH + {0xF899, 0x9D3B}, //21288 #CJK UNIFIED IDEOGRAPH + {0xF89A, 0x9D3C}, //21289 #CJK UNIFIED IDEOGRAPH + {0xF89B, 0x9D3D}, //21290 #CJK UNIFIED IDEOGRAPH + {0xF89C, 0x9D3E}, //21291 #CJK UNIFIED IDEOGRAPH + {0xF89D, 0x9D3F}, //21292 #CJK UNIFIED IDEOGRAPH + {0xF89E, 0x9D40}, //21293 #CJK UNIFIED IDEOGRAPH + {0xF89F, 0x9D41}, //21294 #CJK UNIFIED IDEOGRAPH + {0xF8A0, 0x9D42}, //21295 #CJK UNIFIED IDEOGRAPH + {0xF940, 0x9D43}, //21296 #CJK UNIFIED IDEOGRAPH + {0xF941, 0x9D44}, //21297 #CJK UNIFIED IDEOGRAPH + {0xF942, 0x9D45}, //21298 #CJK UNIFIED IDEOGRAPH + {0xF943, 0x9D46}, //21299 #CJK UNIFIED IDEOGRAPH + {0xF944, 0x9D47}, //21300 #CJK UNIFIED IDEOGRAPH + {0xF945, 0x9D48}, //21301 #CJK UNIFIED IDEOGRAPH + {0xF946, 0x9D49}, //21302 #CJK UNIFIED IDEOGRAPH + {0xF947, 0x9D4A}, //21303 #CJK UNIFIED IDEOGRAPH + {0xF948, 0x9D4B}, //21304 #CJK UNIFIED IDEOGRAPH + {0xF949, 0x9D4C}, //21305 #CJK UNIFIED IDEOGRAPH + {0xF94A, 0x9D4D}, //21306 #CJK UNIFIED IDEOGRAPH + {0xF94B, 0x9D4E}, //21307 #CJK UNIFIED IDEOGRAPH + {0xF94C, 0x9D4F}, //21308 #CJK UNIFIED IDEOGRAPH + {0xF94D, 0x9D50}, //21309 #CJK UNIFIED IDEOGRAPH + {0xF94E, 0x9D51}, //21310 #CJK UNIFIED IDEOGRAPH + {0xF94F, 0x9D52}, //21311 #CJK UNIFIED IDEOGRAPH + {0xF950, 0x9D53}, //21312 #CJK UNIFIED IDEOGRAPH + {0xF951, 0x9D54}, //21313 #CJK UNIFIED IDEOGRAPH + {0xF952, 0x9D55}, //21314 #CJK UNIFIED IDEOGRAPH + {0xF953, 0x9D56}, //21315 #CJK UNIFIED IDEOGRAPH + {0xF954, 0x9D57}, //21316 #CJK UNIFIED IDEOGRAPH + {0xF955, 0x9D58}, //21317 #CJK UNIFIED IDEOGRAPH + {0xF956, 0x9D59}, //21318 #CJK UNIFIED IDEOGRAPH + {0xF957, 0x9D5A}, //21319 #CJK UNIFIED IDEOGRAPH + {0xF958, 0x9D5B}, //21320 #CJK UNIFIED IDEOGRAPH + {0xF959, 0x9D5C}, //21321 #CJK UNIFIED IDEOGRAPH + {0xF95A, 0x9D5D}, //21322 #CJK UNIFIED IDEOGRAPH + {0xF95B, 0x9D5E}, //21323 #CJK UNIFIED IDEOGRAPH + {0xF95C, 0x9D5F}, //21324 #CJK UNIFIED IDEOGRAPH + {0xF95D, 0x9D60}, //21325 #CJK UNIFIED IDEOGRAPH + {0xF95E, 0x9D61}, //21326 #CJK UNIFIED IDEOGRAPH + {0xF95F, 0x9D62}, //21327 #CJK UNIFIED IDEOGRAPH + {0xF960, 0x9D63}, //21328 #CJK UNIFIED IDEOGRAPH + {0xF961, 0x9D64}, //21329 #CJK UNIFIED IDEOGRAPH + {0xF962, 0x9D65}, //21330 #CJK UNIFIED IDEOGRAPH + {0xF963, 0x9D66}, //21331 #CJK UNIFIED IDEOGRAPH + {0xF964, 0x9D67}, //21332 #CJK UNIFIED IDEOGRAPH + {0xF965, 0x9D68}, //21333 #CJK UNIFIED IDEOGRAPH + {0xF966, 0x9D69}, //21334 #CJK UNIFIED IDEOGRAPH + {0xF967, 0x9D6A}, //21335 #CJK UNIFIED IDEOGRAPH + {0xF968, 0x9D6B}, //21336 #CJK UNIFIED IDEOGRAPH + {0xF969, 0x9D6C}, //21337 #CJK UNIFIED IDEOGRAPH + {0xF96A, 0x9D6D}, //21338 #CJK UNIFIED IDEOGRAPH + {0xF96B, 0x9D6E}, //21339 #CJK UNIFIED IDEOGRAPH + {0xF96C, 0x9D6F}, //21340 #CJK UNIFIED IDEOGRAPH + {0xF96D, 0x9D70}, //21341 #CJK UNIFIED IDEOGRAPH + {0xF96E, 0x9D71}, //21342 #CJK UNIFIED IDEOGRAPH + {0xF96F, 0x9D72}, //21343 #CJK UNIFIED IDEOGRAPH + {0xF970, 0x9D73}, //21344 #CJK UNIFIED IDEOGRAPH + {0xF971, 0x9D74}, //21345 #CJK UNIFIED IDEOGRAPH + {0xF972, 0x9D75}, //21346 #CJK UNIFIED IDEOGRAPH + {0xF973, 0x9D76}, //21347 #CJK UNIFIED IDEOGRAPH + {0xF974, 0x9D77}, //21348 #CJK UNIFIED IDEOGRAPH + {0xF975, 0x9D78}, //21349 #CJK UNIFIED IDEOGRAPH + {0xF976, 0x9D79}, //21350 #CJK UNIFIED IDEOGRAPH + {0xF977, 0x9D7A}, //21351 #CJK UNIFIED IDEOGRAPH + {0xF978, 0x9D7B}, //21352 #CJK UNIFIED IDEOGRAPH + {0xF979, 0x9D7C}, //21353 #CJK UNIFIED IDEOGRAPH + {0xF97A, 0x9D7D}, //21354 #CJK UNIFIED IDEOGRAPH + {0xF97B, 0x9D7E}, //21355 #CJK UNIFIED IDEOGRAPH + {0xF97C, 0x9D7F}, //21356 #CJK UNIFIED IDEOGRAPH + {0xF97D, 0x9D80}, //21357 #CJK UNIFIED IDEOGRAPH + {0xF97E, 0x9D81}, //21358 #CJK UNIFIED IDEOGRAPH + {0xF980, 0x9D82}, //21359 #CJK UNIFIED IDEOGRAPH + {0xF981, 0x9D83}, //21360 #CJK UNIFIED IDEOGRAPH + {0xF982, 0x9D84}, //21361 #CJK UNIFIED IDEOGRAPH + {0xF983, 0x9D85}, //21362 #CJK UNIFIED IDEOGRAPH + {0xF984, 0x9D86}, //21363 #CJK UNIFIED IDEOGRAPH + {0xF985, 0x9D87}, //21364 #CJK UNIFIED IDEOGRAPH + {0xF986, 0x9D88}, //21365 #CJK UNIFIED IDEOGRAPH + {0xF987, 0x9D89}, //21366 #CJK UNIFIED IDEOGRAPH + {0xF988, 0x9D8A}, //21367 #CJK UNIFIED IDEOGRAPH + {0xF989, 0x9D8B}, //21368 #CJK UNIFIED IDEOGRAPH + {0xF98A, 0x9D8C}, //21369 #CJK UNIFIED IDEOGRAPH + {0xF98B, 0x9D8D}, //21370 #CJK UNIFIED IDEOGRAPH + {0xF98C, 0x9D8E}, //21371 #CJK UNIFIED IDEOGRAPH + {0xF98D, 0x9D8F}, //21372 #CJK UNIFIED IDEOGRAPH + {0xF98E, 0x9D90}, //21373 #CJK UNIFIED IDEOGRAPH + {0xF98F, 0x9D91}, //21374 #CJK UNIFIED IDEOGRAPH + {0xF990, 0x9D92}, //21375 #CJK UNIFIED IDEOGRAPH + {0xF991, 0x9D93}, //21376 #CJK UNIFIED IDEOGRAPH + {0xF992, 0x9D94}, //21377 #CJK UNIFIED IDEOGRAPH + {0xF993, 0x9D95}, //21378 #CJK UNIFIED IDEOGRAPH + {0xF994, 0x9D96}, //21379 #CJK UNIFIED IDEOGRAPH + {0xF995, 0x9D97}, //21380 #CJK UNIFIED IDEOGRAPH + {0xF996, 0x9D98}, //21381 #CJK UNIFIED IDEOGRAPH + {0xF997, 0x9D99}, //21382 #CJK UNIFIED IDEOGRAPH + {0xF998, 0x9D9A}, //21383 #CJK UNIFIED IDEOGRAPH + {0xF999, 0x9D9B}, //21384 #CJK UNIFIED IDEOGRAPH + {0xF99A, 0x9D9C}, //21385 #CJK UNIFIED IDEOGRAPH + {0xF99B, 0x9D9D}, //21386 #CJK UNIFIED IDEOGRAPH + {0xF99C, 0x9D9E}, //21387 #CJK UNIFIED IDEOGRAPH + {0xF99D, 0x9D9F}, //21388 #CJK UNIFIED IDEOGRAPH + {0xF99E, 0x9DA0}, //21389 #CJK UNIFIED IDEOGRAPH + {0xF99F, 0x9DA1}, //21390 #CJK UNIFIED IDEOGRAPH + {0xF9A0, 0x9DA2}, //21391 #CJK UNIFIED IDEOGRAPH + {0xFA40, 0x9DA3}, //21392 #CJK UNIFIED IDEOGRAPH + {0xFA41, 0x9DA4}, //21393 #CJK UNIFIED IDEOGRAPH + {0xFA42, 0x9DA5}, //21394 #CJK UNIFIED IDEOGRAPH + {0xFA43, 0x9DA6}, //21395 #CJK UNIFIED IDEOGRAPH + {0xFA44, 0x9DA7}, //21396 #CJK UNIFIED IDEOGRAPH + {0xFA45, 0x9DA8}, //21397 #CJK UNIFIED IDEOGRAPH + {0xFA46, 0x9DA9}, //21398 #CJK UNIFIED IDEOGRAPH + {0xFA47, 0x9DAA}, //21399 #CJK UNIFIED IDEOGRAPH + {0xFA48, 0x9DAB}, //21400 #CJK UNIFIED IDEOGRAPH + {0xFA49, 0x9DAC}, //21401 #CJK UNIFIED IDEOGRAPH + {0xFA4A, 0x9DAD}, //21402 #CJK UNIFIED IDEOGRAPH + {0xFA4B, 0x9DAE}, //21403 #CJK UNIFIED IDEOGRAPH + {0xFA4C, 0x9DAF}, //21404 #CJK UNIFIED IDEOGRAPH + {0xFA4D, 0x9DB0}, //21405 #CJK UNIFIED IDEOGRAPH + {0xFA4E, 0x9DB1}, //21406 #CJK UNIFIED IDEOGRAPH + {0xFA4F, 0x9DB2}, //21407 #CJK UNIFIED IDEOGRAPH + {0xFA50, 0x9DB3}, //21408 #CJK UNIFIED IDEOGRAPH + {0xFA51, 0x9DB4}, //21409 #CJK UNIFIED IDEOGRAPH + {0xFA52, 0x9DB5}, //21410 #CJK UNIFIED IDEOGRAPH + {0xFA53, 0x9DB6}, //21411 #CJK UNIFIED IDEOGRAPH + {0xFA54, 0x9DB7}, //21412 #CJK UNIFIED IDEOGRAPH + {0xFA55, 0x9DB8}, //21413 #CJK UNIFIED IDEOGRAPH + {0xFA56, 0x9DB9}, //21414 #CJK UNIFIED IDEOGRAPH + {0xFA57, 0x9DBA}, //21415 #CJK UNIFIED IDEOGRAPH + {0xFA58, 0x9DBB}, //21416 #CJK UNIFIED IDEOGRAPH + {0xFA59, 0x9DBC}, //21417 #CJK UNIFIED IDEOGRAPH + {0xFA5A, 0x9DBD}, //21418 #CJK UNIFIED IDEOGRAPH + {0xFA5B, 0x9DBE}, //21419 #CJK UNIFIED IDEOGRAPH + {0xFA5C, 0x9DBF}, //21420 #CJK UNIFIED IDEOGRAPH + {0xFA5D, 0x9DC0}, //21421 #CJK UNIFIED IDEOGRAPH + {0xFA5E, 0x9DC1}, //21422 #CJK UNIFIED IDEOGRAPH + {0xFA5F, 0x9DC2}, //21423 #CJK UNIFIED IDEOGRAPH + {0xFA60, 0x9DC3}, //21424 #CJK UNIFIED IDEOGRAPH + {0xFA61, 0x9DC4}, //21425 #CJK UNIFIED IDEOGRAPH + {0xFA62, 0x9DC5}, //21426 #CJK UNIFIED IDEOGRAPH + {0xFA63, 0x9DC6}, //21427 #CJK UNIFIED IDEOGRAPH + {0xFA64, 0x9DC7}, //21428 #CJK UNIFIED IDEOGRAPH + {0xFA65, 0x9DC8}, //21429 #CJK UNIFIED IDEOGRAPH + {0xFA66, 0x9DC9}, //21430 #CJK UNIFIED IDEOGRAPH + {0xFA67, 0x9DCA}, //21431 #CJK UNIFIED IDEOGRAPH + {0xFA68, 0x9DCB}, //21432 #CJK UNIFIED IDEOGRAPH + {0xFA69, 0x9DCC}, //21433 #CJK UNIFIED IDEOGRAPH + {0xFA6A, 0x9DCD}, //21434 #CJK UNIFIED IDEOGRAPH + {0xFA6B, 0x9DCE}, //21435 #CJK UNIFIED IDEOGRAPH + {0xFA6C, 0x9DCF}, //21436 #CJK UNIFIED IDEOGRAPH + {0xFA6D, 0x9DD0}, //21437 #CJK UNIFIED IDEOGRAPH + {0xFA6E, 0x9DD1}, //21438 #CJK UNIFIED IDEOGRAPH + {0xFA6F, 0x9DD2}, //21439 #CJK UNIFIED IDEOGRAPH + {0xFA70, 0x9DD3}, //21440 #CJK UNIFIED IDEOGRAPH + {0xFA71, 0x9DD4}, //21441 #CJK UNIFIED IDEOGRAPH + {0xFA72, 0x9DD5}, //21442 #CJK UNIFIED IDEOGRAPH + {0xFA73, 0x9DD6}, //21443 #CJK UNIFIED IDEOGRAPH + {0xFA74, 0x9DD7}, //21444 #CJK UNIFIED IDEOGRAPH + {0xFA75, 0x9DD8}, //21445 #CJK UNIFIED IDEOGRAPH + {0xFA76, 0x9DD9}, //21446 #CJK UNIFIED IDEOGRAPH + {0xFA77, 0x9DDA}, //21447 #CJK UNIFIED IDEOGRAPH + {0xFA78, 0x9DDB}, //21448 #CJK UNIFIED IDEOGRAPH + {0xFA79, 0x9DDC}, //21449 #CJK UNIFIED IDEOGRAPH + {0xFA7A, 0x9DDD}, //21450 #CJK UNIFIED IDEOGRAPH + {0xFA7B, 0x9DDE}, //21451 #CJK UNIFIED IDEOGRAPH + {0xFA7C, 0x9DDF}, //21452 #CJK UNIFIED IDEOGRAPH + {0xFA7D, 0x9DE0}, //21453 #CJK UNIFIED IDEOGRAPH + {0xFA7E, 0x9DE1}, //21454 #CJK UNIFIED IDEOGRAPH + {0xFA80, 0x9DE2}, //21455 #CJK UNIFIED IDEOGRAPH + {0xFA81, 0x9DE3}, //21456 #CJK UNIFIED IDEOGRAPH + {0xFA82, 0x9DE4}, //21457 #CJK UNIFIED IDEOGRAPH + {0xFA83, 0x9DE5}, //21458 #CJK UNIFIED IDEOGRAPH + {0xFA84, 0x9DE6}, //21459 #CJK UNIFIED IDEOGRAPH + {0xFA85, 0x9DE7}, //21460 #CJK UNIFIED IDEOGRAPH + {0xFA86, 0x9DE8}, //21461 #CJK UNIFIED IDEOGRAPH + {0xFA87, 0x9DE9}, //21462 #CJK UNIFIED IDEOGRAPH + {0xFA88, 0x9DEA}, //21463 #CJK UNIFIED IDEOGRAPH + {0xFA89, 0x9DEB}, //21464 #CJK UNIFIED IDEOGRAPH + {0xFA8A, 0x9DEC}, //21465 #CJK UNIFIED IDEOGRAPH + {0xFA8B, 0x9DED}, //21466 #CJK UNIFIED IDEOGRAPH + {0xFA8C, 0x9DEE}, //21467 #CJK UNIFIED IDEOGRAPH + {0xFA8D, 0x9DEF}, //21468 #CJK UNIFIED IDEOGRAPH + {0xFA8E, 0x9DF0}, //21469 #CJK UNIFIED IDEOGRAPH + {0xFA8F, 0x9DF1}, //21470 #CJK UNIFIED IDEOGRAPH + {0xFA90, 0x9DF2}, //21471 #CJK UNIFIED IDEOGRAPH + {0xFA91, 0x9DF3}, //21472 #CJK UNIFIED IDEOGRAPH + {0xFA92, 0x9DF4}, //21473 #CJK UNIFIED IDEOGRAPH + {0xFA93, 0x9DF5}, //21474 #CJK UNIFIED IDEOGRAPH + {0xFA94, 0x9DF6}, //21475 #CJK UNIFIED IDEOGRAPH + {0xFA95, 0x9DF7}, //21476 #CJK UNIFIED IDEOGRAPH + {0xFA96, 0x9DF8}, //21477 #CJK UNIFIED IDEOGRAPH + {0xFA97, 0x9DF9}, //21478 #CJK UNIFIED IDEOGRAPH + {0xFA98, 0x9DFA}, //21479 #CJK UNIFIED IDEOGRAPH + {0xFA99, 0x9DFB}, //21480 #CJK UNIFIED IDEOGRAPH + {0xFA9A, 0x9DFC}, //21481 #CJK UNIFIED IDEOGRAPH + {0xFA9B, 0x9DFD}, //21482 #CJK UNIFIED IDEOGRAPH + {0xFA9C, 0x9DFE}, //21483 #CJK UNIFIED IDEOGRAPH + {0xFA9D, 0x9DFF}, //21484 #CJK UNIFIED IDEOGRAPH + {0xFA9E, 0x9E00}, //21485 #CJK UNIFIED IDEOGRAPH + {0xFA9F, 0x9E01}, //21486 #CJK UNIFIED IDEOGRAPH + {0xFAA0, 0x9E02}, //21487 #CJK UNIFIED IDEOGRAPH + {0xFB40, 0x9E03}, //21488 #CJK UNIFIED IDEOGRAPH + {0xFB41, 0x9E04}, //21489 #CJK UNIFIED IDEOGRAPH + {0xFB42, 0x9E05}, //21490 #CJK UNIFIED IDEOGRAPH + {0xFB43, 0x9E06}, //21491 #CJK UNIFIED IDEOGRAPH + {0xFB44, 0x9E07}, //21492 #CJK UNIFIED IDEOGRAPH + {0xFB45, 0x9E08}, //21493 #CJK UNIFIED IDEOGRAPH + {0xFB46, 0x9E09}, //21494 #CJK UNIFIED IDEOGRAPH + {0xFB47, 0x9E0A}, //21495 #CJK UNIFIED IDEOGRAPH + {0xFB48, 0x9E0B}, //21496 #CJK UNIFIED IDEOGRAPH + {0xFB49, 0x9E0C}, //21497 #CJK UNIFIED IDEOGRAPH + {0xFB4A, 0x9E0D}, //21498 #CJK UNIFIED IDEOGRAPH + {0xFB4B, 0x9E0E}, //21499 #CJK UNIFIED IDEOGRAPH + {0xFB4C, 0x9E0F}, //21500 #CJK UNIFIED IDEOGRAPH + {0xFB4D, 0x9E10}, //21501 #CJK UNIFIED IDEOGRAPH + {0xFB4E, 0x9E11}, //21502 #CJK UNIFIED IDEOGRAPH + {0xFB4F, 0x9E12}, //21503 #CJK UNIFIED IDEOGRAPH + {0xFB50, 0x9E13}, //21504 #CJK UNIFIED IDEOGRAPH + {0xFB51, 0x9E14}, //21505 #CJK UNIFIED IDEOGRAPH + {0xFB52, 0x9E15}, //21506 #CJK UNIFIED IDEOGRAPH + {0xFB53, 0x9E16}, //21507 #CJK UNIFIED IDEOGRAPH + {0xFB54, 0x9E17}, //21508 #CJK UNIFIED IDEOGRAPH + {0xFB55, 0x9E18}, //21509 #CJK UNIFIED IDEOGRAPH + {0xFB56, 0x9E19}, //21510 #CJK UNIFIED IDEOGRAPH + {0xFB57, 0x9E1A}, //21511 #CJK UNIFIED IDEOGRAPH + {0xFB58, 0x9E1B}, //21512 #CJK UNIFIED IDEOGRAPH + {0xFB59, 0x9E1C}, //21513 #CJK UNIFIED IDEOGRAPH + {0xFB5A, 0x9E1D}, //21514 #CJK UNIFIED IDEOGRAPH + {0xFB5B, 0x9E1E}, //21515 #CJK UNIFIED IDEOGRAPH + {0xFB5C, 0x9E24}, //21516 #CJK UNIFIED IDEOGRAPH + {0xFB5D, 0x9E27}, //21517 #CJK UNIFIED IDEOGRAPH + {0xFB5E, 0x9E2E}, //21518 #CJK UNIFIED IDEOGRAPH + {0xFB5F, 0x9E30}, //21519 #CJK UNIFIED IDEOGRAPH + {0xFB60, 0x9E34}, //21520 #CJK UNIFIED IDEOGRAPH + {0xFB61, 0x9E3B}, //21521 #CJK UNIFIED IDEOGRAPH + {0xFB62, 0x9E3C}, //21522 #CJK UNIFIED IDEOGRAPH + {0xFB63, 0x9E40}, //21523 #CJK UNIFIED IDEOGRAPH + {0xFB64, 0x9E4D}, //21524 #CJK UNIFIED IDEOGRAPH + {0xFB65, 0x9E50}, //21525 #CJK UNIFIED IDEOGRAPH + {0xFB66, 0x9E52}, //21526 #CJK UNIFIED IDEOGRAPH + {0xFB67, 0x9E53}, //21527 #CJK UNIFIED IDEOGRAPH + {0xFB68, 0x9E54}, //21528 #CJK UNIFIED IDEOGRAPH + {0xFB69, 0x9E56}, //21529 #CJK UNIFIED IDEOGRAPH + {0xFB6A, 0x9E59}, //21530 #CJK UNIFIED IDEOGRAPH + {0xFB6B, 0x9E5D}, //21531 #CJK UNIFIED IDEOGRAPH + {0xFB6C, 0x9E5F}, //21532 #CJK UNIFIED IDEOGRAPH + {0xFB6D, 0x9E60}, //21533 #CJK UNIFIED IDEOGRAPH + {0xFB6E, 0x9E61}, //21534 #CJK UNIFIED IDEOGRAPH + {0xFB6F, 0x9E62}, //21535 #CJK UNIFIED IDEOGRAPH + {0xFB70, 0x9E65}, //21536 #CJK UNIFIED IDEOGRAPH + {0xFB71, 0x9E6E}, //21537 #CJK UNIFIED IDEOGRAPH + {0xFB72, 0x9E6F}, //21538 #CJK UNIFIED IDEOGRAPH + {0xFB73, 0x9E72}, //21539 #CJK UNIFIED IDEOGRAPH + {0xFB74, 0x9E74}, //21540 #CJK UNIFIED IDEOGRAPH + {0xFB75, 0x9E75}, //21541 #CJK UNIFIED IDEOGRAPH + {0xFB76, 0x9E76}, //21542 #CJK UNIFIED IDEOGRAPH + {0xFB77, 0x9E77}, //21543 #CJK UNIFIED IDEOGRAPH + {0xFB78, 0x9E78}, //21544 #CJK UNIFIED IDEOGRAPH + {0xFB79, 0x9E79}, //21545 #CJK UNIFIED IDEOGRAPH + {0xFB7A, 0x9E7A}, //21546 #CJK UNIFIED IDEOGRAPH + {0xFB7B, 0x9E7B}, //21547 #CJK UNIFIED IDEOGRAPH + {0xFB7C, 0x9E7C}, //21548 #CJK UNIFIED IDEOGRAPH + {0xFB7D, 0x9E7D}, //21549 #CJK UNIFIED IDEOGRAPH + {0xFB7E, 0x9E80}, //21550 #CJK UNIFIED IDEOGRAPH + {0xFB80, 0x9E81}, //21551 #CJK UNIFIED IDEOGRAPH + {0xFB81, 0x9E83}, //21552 #CJK UNIFIED IDEOGRAPH + {0xFB82, 0x9E84}, //21553 #CJK UNIFIED IDEOGRAPH + {0xFB83, 0x9E85}, //21554 #CJK UNIFIED IDEOGRAPH + {0xFB84, 0x9E86}, //21555 #CJK UNIFIED IDEOGRAPH + {0xFB85, 0x9E89}, //21556 #CJK UNIFIED IDEOGRAPH + {0xFB86, 0x9E8A}, //21557 #CJK UNIFIED IDEOGRAPH + {0xFB87, 0x9E8C}, //21558 #CJK UNIFIED IDEOGRAPH + {0xFB88, 0x9E8D}, //21559 #CJK UNIFIED IDEOGRAPH + {0xFB89, 0x9E8E}, //21560 #CJK UNIFIED IDEOGRAPH + {0xFB8A, 0x9E8F}, //21561 #CJK UNIFIED IDEOGRAPH + {0xFB8B, 0x9E90}, //21562 #CJK UNIFIED IDEOGRAPH + {0xFB8C, 0x9E91}, //21563 #CJK UNIFIED IDEOGRAPH + {0xFB8D, 0x9E94}, //21564 #CJK UNIFIED IDEOGRAPH + {0xFB8E, 0x9E95}, //21565 #CJK UNIFIED IDEOGRAPH + {0xFB8F, 0x9E96}, //21566 #CJK UNIFIED IDEOGRAPH + {0xFB90, 0x9E97}, //21567 #CJK UNIFIED IDEOGRAPH + {0xFB91, 0x9E98}, //21568 #CJK UNIFIED IDEOGRAPH + {0xFB92, 0x9E99}, //21569 #CJK UNIFIED IDEOGRAPH + {0xFB93, 0x9E9A}, //21570 #CJK UNIFIED IDEOGRAPH + {0xFB94, 0x9E9B}, //21571 #CJK UNIFIED IDEOGRAPH + {0xFB95, 0x9E9C}, //21572 #CJK UNIFIED IDEOGRAPH + {0xFB96, 0x9E9E}, //21573 #CJK UNIFIED IDEOGRAPH + {0xFB97, 0x9EA0}, //21574 #CJK UNIFIED IDEOGRAPH + {0xFB98, 0x9EA1}, //21575 #CJK UNIFIED IDEOGRAPH + {0xFB99, 0x9EA2}, //21576 #CJK UNIFIED IDEOGRAPH + {0xFB9A, 0x9EA3}, //21577 #CJK UNIFIED IDEOGRAPH + {0xFB9B, 0x9EA4}, //21578 #CJK UNIFIED IDEOGRAPH + {0xFB9C, 0x9EA5}, //21579 #CJK UNIFIED IDEOGRAPH + {0xFB9D, 0x9EA7}, //21580 #CJK UNIFIED IDEOGRAPH + {0xFB9E, 0x9EA8}, //21581 #CJK UNIFIED IDEOGRAPH + {0xFB9F, 0x9EA9}, //21582 #CJK UNIFIED IDEOGRAPH + {0xFBA0, 0x9EAA}, //21583 #CJK UNIFIED IDEOGRAPH + {0xFC40, 0x9EAB}, //21584 #CJK UNIFIED IDEOGRAPH + {0xFC41, 0x9EAC}, //21585 #CJK UNIFIED IDEOGRAPH + {0xFC42, 0x9EAD}, //21586 #CJK UNIFIED IDEOGRAPH + {0xFC43, 0x9EAE}, //21587 #CJK UNIFIED IDEOGRAPH + {0xFC44, 0x9EAF}, //21588 #CJK UNIFIED IDEOGRAPH + {0xFC45, 0x9EB0}, //21589 #CJK UNIFIED IDEOGRAPH + {0xFC46, 0x9EB1}, //21590 #CJK UNIFIED IDEOGRAPH + {0xFC47, 0x9EB2}, //21591 #CJK UNIFIED IDEOGRAPH + {0xFC48, 0x9EB3}, //21592 #CJK UNIFIED IDEOGRAPH + {0xFC49, 0x9EB5}, //21593 #CJK UNIFIED IDEOGRAPH + {0xFC4A, 0x9EB6}, //21594 #CJK UNIFIED IDEOGRAPH + {0xFC4B, 0x9EB7}, //21595 #CJK UNIFIED IDEOGRAPH + {0xFC4C, 0x9EB9}, //21596 #CJK UNIFIED IDEOGRAPH + {0xFC4D, 0x9EBA}, //21597 #CJK UNIFIED IDEOGRAPH + {0xFC4E, 0x9EBC}, //21598 #CJK UNIFIED IDEOGRAPH + {0xFC4F, 0x9EBF}, //21599 #CJK UNIFIED IDEOGRAPH + {0xFC50, 0x9EC0}, //21600 #CJK UNIFIED IDEOGRAPH + {0xFC51, 0x9EC1}, //21601 #CJK UNIFIED IDEOGRAPH + {0xFC52, 0x9EC2}, //21602 #CJK UNIFIED IDEOGRAPH + {0xFC53, 0x9EC3}, //21603 #CJK UNIFIED IDEOGRAPH + {0xFC54, 0x9EC5}, //21604 #CJK UNIFIED IDEOGRAPH + {0xFC55, 0x9EC6}, //21605 #CJK UNIFIED IDEOGRAPH + {0xFC56, 0x9EC7}, //21606 #CJK UNIFIED IDEOGRAPH + {0xFC57, 0x9EC8}, //21607 #CJK UNIFIED IDEOGRAPH + {0xFC58, 0x9ECA}, //21608 #CJK UNIFIED IDEOGRAPH + {0xFC59, 0x9ECB}, //21609 #CJK UNIFIED IDEOGRAPH + {0xFC5A, 0x9ECC}, //21610 #CJK UNIFIED IDEOGRAPH + {0xFC5B, 0x9ED0}, //21611 #CJK UNIFIED IDEOGRAPH + {0xFC5C, 0x9ED2}, //21612 #CJK UNIFIED IDEOGRAPH + {0xFC5D, 0x9ED3}, //21613 #CJK UNIFIED IDEOGRAPH + {0xFC5E, 0x9ED5}, //21614 #CJK UNIFIED IDEOGRAPH + {0xFC5F, 0x9ED6}, //21615 #CJK UNIFIED IDEOGRAPH + {0xFC60, 0x9ED7}, //21616 #CJK UNIFIED IDEOGRAPH + {0xFC61, 0x9ED9}, //21617 #CJK UNIFIED IDEOGRAPH + {0xFC62, 0x9EDA}, //21618 #CJK UNIFIED IDEOGRAPH + {0xFC63, 0x9EDE}, //21619 #CJK UNIFIED IDEOGRAPH + {0xFC64, 0x9EE1}, //21620 #CJK UNIFIED IDEOGRAPH + {0xFC65, 0x9EE3}, //21621 #CJK UNIFIED IDEOGRAPH + {0xFC66, 0x9EE4}, //21622 #CJK UNIFIED IDEOGRAPH + {0xFC67, 0x9EE6}, //21623 #CJK UNIFIED IDEOGRAPH + {0xFC68, 0x9EE8}, //21624 #CJK UNIFIED IDEOGRAPH + {0xFC69, 0x9EEB}, //21625 #CJK UNIFIED IDEOGRAPH + {0xFC6A, 0x9EEC}, //21626 #CJK UNIFIED IDEOGRAPH + {0xFC6B, 0x9EED}, //21627 #CJK UNIFIED IDEOGRAPH + {0xFC6C, 0x9EEE}, //21628 #CJK UNIFIED IDEOGRAPH + {0xFC6D, 0x9EF0}, //21629 #CJK UNIFIED IDEOGRAPH + {0xFC6E, 0x9EF1}, //21630 #CJK UNIFIED IDEOGRAPH + {0xFC6F, 0x9EF2}, //21631 #CJK UNIFIED IDEOGRAPH + {0xFC70, 0x9EF3}, //21632 #CJK UNIFIED IDEOGRAPH + {0xFC71, 0x9EF4}, //21633 #CJK UNIFIED IDEOGRAPH + {0xFC72, 0x9EF5}, //21634 #CJK UNIFIED IDEOGRAPH + {0xFC73, 0x9EF6}, //21635 #CJK UNIFIED IDEOGRAPH + {0xFC74, 0x9EF7}, //21636 #CJK UNIFIED IDEOGRAPH + {0xFC75, 0x9EF8}, //21637 #CJK UNIFIED IDEOGRAPH + {0xFC76, 0x9EFA}, //21638 #CJK UNIFIED IDEOGRAPH + {0xFC77, 0x9EFD}, //21639 #CJK UNIFIED IDEOGRAPH + {0xFC78, 0x9EFF}, //21640 #CJK UNIFIED IDEOGRAPH + {0xFC79, 0x9F00}, //21641 #CJK UNIFIED IDEOGRAPH + {0xFC7A, 0x9F01}, //21642 #CJK UNIFIED IDEOGRAPH + {0xFC7B, 0x9F02}, //21643 #CJK UNIFIED IDEOGRAPH + {0xFC7C, 0x9F03}, //21644 #CJK UNIFIED IDEOGRAPH + {0xFC7D, 0x9F04}, //21645 #CJK UNIFIED IDEOGRAPH + {0xFC7E, 0x9F05}, //21646 #CJK UNIFIED IDEOGRAPH + {0xFC80, 0x9F06}, //21647 #CJK UNIFIED IDEOGRAPH + {0xFC81, 0x9F07}, //21648 #CJK UNIFIED IDEOGRAPH + {0xFC82, 0x9F08}, //21649 #CJK UNIFIED IDEOGRAPH + {0xFC83, 0x9F09}, //21650 #CJK UNIFIED IDEOGRAPH + {0xFC84, 0x9F0A}, //21651 #CJK UNIFIED IDEOGRAPH + {0xFC85, 0x9F0C}, //21652 #CJK UNIFIED IDEOGRAPH + {0xFC86, 0x9F0F}, //21653 #CJK UNIFIED IDEOGRAPH + {0xFC87, 0x9F11}, //21654 #CJK UNIFIED IDEOGRAPH + {0xFC88, 0x9F12}, //21655 #CJK UNIFIED IDEOGRAPH + {0xFC89, 0x9F14}, //21656 #CJK UNIFIED IDEOGRAPH + {0xFC8A, 0x9F15}, //21657 #CJK UNIFIED IDEOGRAPH + {0xFC8B, 0x9F16}, //21658 #CJK UNIFIED IDEOGRAPH + {0xFC8C, 0x9F18}, //21659 #CJK UNIFIED IDEOGRAPH + {0xFC8D, 0x9F1A}, //21660 #CJK UNIFIED IDEOGRAPH + {0xFC8E, 0x9F1B}, //21661 #CJK UNIFIED IDEOGRAPH + {0xFC8F, 0x9F1C}, //21662 #CJK UNIFIED IDEOGRAPH + {0xFC90, 0x9F1D}, //21663 #CJK UNIFIED IDEOGRAPH + {0xFC91, 0x9F1E}, //21664 #CJK UNIFIED IDEOGRAPH + {0xFC92, 0x9F1F}, //21665 #CJK UNIFIED IDEOGRAPH + {0xFC93, 0x9F21}, //21666 #CJK UNIFIED IDEOGRAPH + {0xFC94, 0x9F23}, //21667 #CJK UNIFIED IDEOGRAPH + {0xFC95, 0x9F24}, //21668 #CJK UNIFIED IDEOGRAPH + {0xFC96, 0x9F25}, //21669 #CJK UNIFIED IDEOGRAPH + {0xFC97, 0x9F26}, //21670 #CJK UNIFIED IDEOGRAPH + {0xFC98, 0x9F27}, //21671 #CJK UNIFIED IDEOGRAPH + {0xFC99, 0x9F28}, //21672 #CJK UNIFIED IDEOGRAPH + {0xFC9A, 0x9F29}, //21673 #CJK UNIFIED IDEOGRAPH + {0xFC9B, 0x9F2A}, //21674 #CJK UNIFIED IDEOGRAPH + {0xFC9C, 0x9F2B}, //21675 #CJK UNIFIED IDEOGRAPH + {0xFC9D, 0x9F2D}, //21676 #CJK UNIFIED IDEOGRAPH + {0xFC9E, 0x9F2E}, //21677 #CJK UNIFIED IDEOGRAPH + {0xFC9F, 0x9F30}, //21678 #CJK UNIFIED IDEOGRAPH + {0xFCA0, 0x9F31}, //21679 #CJK UNIFIED IDEOGRAPH + {0xFD40, 0x9F32}, //21680 #CJK UNIFIED IDEOGRAPH + {0xFD41, 0x9F33}, //21681 #CJK UNIFIED IDEOGRAPH + {0xFD42, 0x9F34}, //21682 #CJK UNIFIED IDEOGRAPH + {0xFD43, 0x9F35}, //21683 #CJK UNIFIED IDEOGRAPH + {0xFD44, 0x9F36}, //21684 #CJK UNIFIED IDEOGRAPH + {0xFD45, 0x9F38}, //21685 #CJK UNIFIED IDEOGRAPH + {0xFD46, 0x9F3A}, //21686 #CJK UNIFIED IDEOGRAPH + {0xFD47, 0x9F3C}, //21687 #CJK UNIFIED IDEOGRAPH + {0xFD48, 0x9F3F}, //21688 #CJK UNIFIED IDEOGRAPH + {0xFD49, 0x9F40}, //21689 #CJK UNIFIED IDEOGRAPH + {0xFD4A, 0x9F41}, //21690 #CJK UNIFIED IDEOGRAPH + {0xFD4B, 0x9F42}, //21691 #CJK UNIFIED IDEOGRAPH + {0xFD4C, 0x9F43}, //21692 #CJK UNIFIED IDEOGRAPH + {0xFD4D, 0x9F45}, //21693 #CJK UNIFIED IDEOGRAPH + {0xFD4E, 0x9F46}, //21694 #CJK UNIFIED IDEOGRAPH + {0xFD4F, 0x9F47}, //21695 #CJK UNIFIED IDEOGRAPH + {0xFD50, 0x9F48}, //21696 #CJK UNIFIED IDEOGRAPH + {0xFD51, 0x9F49}, //21697 #CJK UNIFIED IDEOGRAPH + {0xFD52, 0x9F4A}, //21698 #CJK UNIFIED IDEOGRAPH + {0xFD53, 0x9F4B}, //21699 #CJK UNIFIED IDEOGRAPH + {0xFD54, 0x9F4C}, //21700 #CJK UNIFIED IDEOGRAPH + {0xFD55, 0x9F4D}, //21701 #CJK UNIFIED IDEOGRAPH + {0xFD56, 0x9F4E}, //21702 #CJK UNIFIED IDEOGRAPH + {0xFD57, 0x9F4F}, //21703 #CJK UNIFIED IDEOGRAPH + {0xFD58, 0x9F52}, //21704 #CJK UNIFIED IDEOGRAPH + {0xFD59, 0x9F53}, //21705 #CJK UNIFIED IDEOGRAPH + {0xFD5A, 0x9F54}, //21706 #CJK UNIFIED IDEOGRAPH + {0xFD5B, 0x9F55}, //21707 #CJK UNIFIED IDEOGRAPH + {0xFD5C, 0x9F56}, //21708 #CJK UNIFIED IDEOGRAPH + {0xFD5D, 0x9F57}, //21709 #CJK UNIFIED IDEOGRAPH + {0xFD5E, 0x9F58}, //21710 #CJK UNIFIED IDEOGRAPH + {0xFD5F, 0x9F59}, //21711 #CJK UNIFIED IDEOGRAPH + {0xFD60, 0x9F5A}, //21712 #CJK UNIFIED IDEOGRAPH + {0xFD61, 0x9F5B}, //21713 #CJK UNIFIED IDEOGRAPH + {0xFD62, 0x9F5C}, //21714 #CJK UNIFIED IDEOGRAPH + {0xFD63, 0x9F5D}, //21715 #CJK UNIFIED IDEOGRAPH + {0xFD64, 0x9F5E}, //21716 #CJK UNIFIED IDEOGRAPH + {0xFD65, 0x9F5F}, //21717 #CJK UNIFIED IDEOGRAPH + {0xFD66, 0x9F60}, //21718 #CJK UNIFIED IDEOGRAPH + {0xFD67, 0x9F61}, //21719 #CJK UNIFIED IDEOGRAPH + {0xFD68, 0x9F62}, //21720 #CJK UNIFIED IDEOGRAPH + {0xFD69, 0x9F63}, //21721 #CJK UNIFIED IDEOGRAPH + {0xFD6A, 0x9F64}, //21722 #CJK UNIFIED IDEOGRAPH + {0xFD6B, 0x9F65}, //21723 #CJK UNIFIED IDEOGRAPH + {0xFD6C, 0x9F66}, //21724 #CJK UNIFIED IDEOGRAPH + {0xFD6D, 0x9F67}, //21725 #CJK UNIFIED IDEOGRAPH + {0xFD6E, 0x9F68}, //21726 #CJK UNIFIED IDEOGRAPH + {0xFD6F, 0x9F69}, //21727 #CJK UNIFIED IDEOGRAPH + {0xFD70, 0x9F6A}, //21728 #CJK UNIFIED IDEOGRAPH + {0xFD71, 0x9F6B}, //21729 #CJK UNIFIED IDEOGRAPH + {0xFD72, 0x9F6C}, //21730 #CJK UNIFIED IDEOGRAPH + {0xFD73, 0x9F6D}, //21731 #CJK UNIFIED IDEOGRAPH + {0xFD74, 0x9F6E}, //21732 #CJK UNIFIED IDEOGRAPH + {0xFD75, 0x9F6F}, //21733 #CJK UNIFIED IDEOGRAPH + {0xFD76, 0x9F70}, //21734 #CJK UNIFIED IDEOGRAPH + {0xFD77, 0x9F71}, //21735 #CJK UNIFIED IDEOGRAPH + {0xFD78, 0x9F72}, //21736 #CJK UNIFIED IDEOGRAPH + {0xFD79, 0x9F73}, //21737 #CJK UNIFIED IDEOGRAPH + {0xFD7A, 0x9F74}, //21738 #CJK UNIFIED IDEOGRAPH + {0xFD7B, 0x9F75}, //21739 #CJK UNIFIED IDEOGRAPH + {0xFD7C, 0x9F76}, //21740 #CJK UNIFIED IDEOGRAPH + {0xFD7D, 0x9F77}, //21741 #CJK UNIFIED IDEOGRAPH + {0xFD7E, 0x9F78}, //21742 #CJK UNIFIED IDEOGRAPH + {0xFD80, 0x9F79}, //21743 #CJK UNIFIED IDEOGRAPH + {0xFD81, 0x9F7A}, //21744 #CJK UNIFIED IDEOGRAPH + {0xFD82, 0x9F7B}, //21745 #CJK UNIFIED IDEOGRAPH + {0xFD83, 0x9F7C}, //21746 #CJK UNIFIED IDEOGRAPH + {0xFD84, 0x9F7D}, //21747 #CJK UNIFIED IDEOGRAPH + {0xFD85, 0x9F7E}, //21748 #CJK UNIFIED IDEOGRAPH + {0xFD86, 0x9F81}, //21749 #CJK UNIFIED IDEOGRAPH + {0xFD87, 0x9F82}, //21750 #CJK UNIFIED IDEOGRAPH + {0xFD88, 0x9F8D}, //21751 #CJK UNIFIED IDEOGRAPH + {0xFD89, 0x9F8E}, //21752 #CJK UNIFIED IDEOGRAPH + {0xFD8A, 0x9F8F}, //21753 #CJK UNIFIED IDEOGRAPH + {0xFD8B, 0x9F90}, //21754 #CJK UNIFIED IDEOGRAPH + {0xFD8C, 0x9F91}, //21755 #CJK UNIFIED IDEOGRAPH + {0xFD8D, 0x9F92}, //21756 #CJK UNIFIED IDEOGRAPH + {0xFD8E, 0x9F93}, //21757 #CJK UNIFIED IDEOGRAPH + {0xFD8F, 0x9F94}, //21758 #CJK UNIFIED IDEOGRAPH + {0xFD90, 0x9F95}, //21759 #CJK UNIFIED IDEOGRAPH + {0xFD91, 0x9F96}, //21760 #CJK UNIFIED IDEOGRAPH + {0xFD92, 0x9F97}, //21761 #CJK UNIFIED IDEOGRAPH + {0xFD93, 0x9F98}, //21762 #CJK UNIFIED IDEOGRAPH + {0xFD94, 0x9F9C}, //21763 #CJK UNIFIED IDEOGRAPH + {0xFD95, 0x9F9D}, //21764 #CJK UNIFIED IDEOGRAPH + {0xFD96, 0x9F9E}, //21765 #CJK UNIFIED IDEOGRAPH + {0xFD97, 0x9FA1}, //21766 #CJK UNIFIED IDEOGRAPH + {0xFD98, 0x9FA2}, //21767 #CJK UNIFIED IDEOGRAPH + {0xFD99, 0x9FA3}, //21768 #CJK UNIFIED IDEOGRAPH + {0xFD9A, 0x9FA4}, //21769 #CJK UNIFIED IDEOGRAPH + {0xFD9B, 0x9FA5}, //21770 #CJK UNIFIED IDEOGRAPH + {0xFD9C, 0xF92C}, //21771 #CJK COMPATIBILITY IDEOGRAPH + {0xFD9D, 0xF979}, //21772 #CJK COMPATIBILITY IDEOGRAPH + {0xFD9E, 0xF995}, //21773 #CJK COMPATIBILITY IDEOGRAPH + {0xFD9F, 0xF9E7}, //21774 #CJK COMPATIBILITY IDEOGRAPH + {0xFDA0, 0xF9F1}, //21775 #CJK COMPATIBILITY IDEOGRAPH + {0xFE40, 0xFA0C}, //21776 #CJK COMPATIBILITY IDEOGRAPH + {0xFE41, 0xFA0D}, //21777 #CJK COMPATIBILITY IDEOGRAPH + {0xFE42, 0xFA0E}, //21778 #CJK COMPATIBILITY IDEOGRAPH + {0xFE43, 0xFA0F}, //21779 #CJK COMPATIBILITY IDEOGRAPH + {0xFE44, 0xFA11}, //21780 #CJK COMPATIBILITY IDEOGRAPH + {0xFE45, 0xFA13}, //21781 #CJK COMPATIBILITY IDEOGRAPH + {0xFE46, 0xFA14}, //21782 #CJK COMPATIBILITY IDEOGRAPH + {0xFE47, 0xFA18}, //21783 #CJK COMPATIBILITY IDEOGRAPH + {0xFE48, 0xFA1F}, //21784 #CJK COMPATIBILITY IDEOGRAPH + {0xFE49, 0xFA20}, //21785 #CJK COMPATIBILITY IDEOGRAPH + {0xFE4A, 0xFA21}, //21786 #CJK COMPATIBILITY IDEOGRAPH + {0xFE4B, 0xFA23}, //21787 #CJK COMPATIBILITY IDEOGRAPH + {0xFE4C, 0xFA24}, //21788 #CJK COMPATIBILITY IDEOGRAPH + {0xFE4D, 0xFA27}, //21789 #CJK COMPATIBILITY IDEOGRAPH + {0xFE4E, 0xFA28}, //21790 #CJK COMPATIBILITY IDEOGRAPH + {0xFE4F, 0xFA29} //21791 #CJK COMPATIBILITY IDEOGRAPH +}; + +#endif // DRW_CPTABLE936_H diff --git a/extlib/libdxfrw/intern/drw_cptable949.h b/extlib/libdxfrw/intern/drw_cptable949.h new file mode 100644 index 0000000..3276b60 --- /dev/null +++ b/extlib/libdxfrw/intern/drw_cptable949.h @@ -0,0 +1,17199 @@ +#ifndef DRW_CPTABLE949_H +#define DRW_CPTABLE949_H + +//Korean Extended Wansung + +//first entry in this table are 0x80 +#define CPOFFSET949 0x80 +#define CPLENGHT949 17048 +#define NOTFOUND949 0x003F + +//Table 949 one byte +static const int DRW_Table949[1] = { +}; + +//Table 949 lead byte +//pairs of start/end in DRW_DoubleTable949 +static const int DRW_LeadTable949[] = { + 0, //1#DBCS LEAD BYTE 0x81 + 178, //2#DBCS LEAD BYTE 0x82 + 356, //3#DBCS LEAD BYTE 0x83 + 564, //4#DBCS LEAD BYTE 0x84 + 712, //5#DBCS LEAD BYTE 0x85 + 890, //6#DBCS LEAD BYTE 0x86 + 1068, //7#DBCS LEAD BYTE 0x87 + 1246, //8#DBCS LEAD BYTE 0x88 + 1424, //9#DBCS LEAD BYTE 0x89 + 1602, //10#DBCS LEAD BYTE 0x8A + 1780, //11#DBCS LEAD BYTE 0x8B + 1958, //12#DBCS LEAD BYTE 0x8C + 2136, //13#DBCS LEAD BYTE 0x8D + 2314, //14#DBCS LEAD BYTE 0x8E + 2492, //15#DBCS LEAD BYTE 0x8F + 2670, //16#DBCS LEAD BYTE 0x90 + 2848, //17#DBCS LEAD BYTE 0x91 + 3026, //18#DBCS LEAD BYTE 0x92 + 3204, //19#DBCS LEAD BYTE 0x93 + 3382, //20#DBCS LEAD BYTE 0x94 + 3560, //21#DBCS LEAD BYTE 0x95 + 3738, //22#DBCS LEAD BYTE 0x96 + 3916, //23#DBCS LEAD BYTE 0x97 + 4094, //24#DBCS LEAD BYTE 0x98 + 4272, //25#DBCS LEAD BYTE 0x99 + 4450, //26#DBCS LEAD BYTE 0x9A + 4628, //27#DBCS LEAD BYTE 0x9B + 4806, //28#DBCS LEAD BYTE 0x9C + 4984, //29#DBCS LEAD BYTE 0x9D + 5162, //30#DBCS LEAD BYTE 0x9E + 5340, //31#DBCS LEAD BYTE 0x9F + 5518, //32#DBCS LEAD BYTE 0xA0 + 5696, //33#DBCS LEAD BYTE 0xA1 + 5874, //34#DBCS LEAD BYTE 0xA2 + 6029, //35#DBCS LEAD BYTE 0xA3 + 6207, //36#DBCS LEAD BYTE 0xA4 + 6385, //37#DBCS LEAD BYTE 0xA5 + 6537, //38#DBCS LEAD BYTE 0xA6 + 6689, //39#DBCS LEAD BYTE 0xA7 + 6852, //40#DBCS LEAD BYTE 0xA8 + 7027, //41#DBCS LEAD BYTE 0xA9 + 7205, //42#DBCS LEAD BYTE 0xAA + 7372, //43#DBCS LEAD BYTE 0xAB + 7542, //44#DBCS LEAD BYTE 0xAC + 7692, //45#DBCS LEAD BYTE 0xAD + 7776, //46#DBCS LEAD BYTE 0xAE + 7860, //47#DBCS LEAD BYTE 0xAF + 7944, //48#DBCS LEAD BYTE 0xB0 + 8122, //49#DBCS LEAD BYTE 0xB1 + 8300, //50#DBCS LEAD BYTE 0xB2 + 8478, //51#DBCS LEAD BYTE 0xB3 + 8656, //52#DBCS LEAD BYTE 0xB4 + 8834, //53#DBCS LEAD BYTE 0xB5 + 9012, //54#DBCS LEAD BYTE 0xB6 + 9190, //55#DBCS LEAD BYTE 0xB7 + 9368, //56#DBCS LEAD BYTE 0xB8 + 9546, //57#DBCS LEAD BYTE 0xB9 + 9724, //58#DBCS LEAD BYTE 0xBA + 9902, //59#DBCS LEAD BYTE 0xBB + 10080, //60#DBCS LEAD BYTE 0xBC + 10258, //61#DBCS LEAD BYTE 0xBD + 10436, //62#DBCS LEAD BYTE 0xBE + 10614, //63#DBCS LEAD BYTE 0xBF + 10792, //64#DBCS LEAD BYTE 0xC0 + 10970, //65#DBCS LEAD BYTE 0xC1 + 11148, //66#DBCS LEAD BYTE 0xC2 + 11326, //67#DBCS LEAD BYTE 0xC3 + 11504, //68#DBCS LEAD BYTE 0xC4 + 11682, //69#DBCS LEAD BYTE 0xC5 + 11860, //70#DBCS LEAD BYTE 0xC6 + 11972, //71#DBCS LEAD BYTE 0xC7 + 12066, //72#DBCS LEAD BYTE 0xC8 + 12160, //73#DBCS LEAD BYTE 0xC9, empty + 12160, //74#DBCS LEAD BYTE 0xCA + 12254, //75#DBCS LEAD BYTE 0xCB + 12348, //76#DBCS LEAD BYTE 0xCC + 12442, //77#DBCS LEAD BYTE 0xCD + 12536, //78#DBCS LEAD BYTE 0xCE + 12630, //79#DBCS LEAD BYTE 0xCF + 12724, //80#DBCS LEAD BYTE 0xD0 + 12818, //81#DBCS LEAD BYTE 0xD1 + 12912, //82#DBCS LEAD BYTE 0xD2 + 13006, //83#DBCS LEAD BYTE 0xD3 + 13100, //84#DBCS LEAD BYTE 0xD4 + 13194, //85#DBCS LEAD BYTE 0xD5 + 13288, //86#DBCS LEAD BYTE 0xD6 + 13382, //87#DBCS LEAD BYTE 0xD7 + 13476, //88#DBCS LEAD BYTE 0xD8 + 13570, //89#DBCS LEAD BYTE 0xD9 + 13664, //90#DBCS LEAD BYTE 0xDA + 13758, //91#DBCS LEAD BYTE 0xDB + 13852, //92#DBCS LEAD BYTE 0xDC + 13946, //93#DBCS LEAD BYTE 0xDD + 14040, //94#DBCS LEAD BYTE 0xDE + 14134, //95#DBCS LEAD BYTE 0xDF + 14228, //96#DBCS LEAD BYTE 0xE0 + 14322, //97#DBCS LEAD BYTE 0xE1 + 14416, //98#DBCS LEAD BYTE 0xE2 + 14510, //99#DBCS LEAD BYTE 0xE3 + 14604, //100#DBCS LEAD BYTE 0xE4 + 14698, //101#DBCS LEAD BYTE 0xE5 + 14792, //102#DBCS LEAD BYTE 0xE6 + 14886, //103#DBCS LEAD BYTE 0xE7 + 14980, //104#DBCS LEAD BYTE 0xE8 + 15074, //105#DBCS LEAD BYTE 0xE9 + 15168, //106#DBCS LEAD BYTE 0xEA + 15262, //107#DBCS LEAD BYTE 0xEB + 15356, //108#DBCS LEAD BYTE 0xEC + 15450, //109#DBCS LEAD BYTE 0xED + 15544, //110#DBCS LEAD BYTE 0xEE + 15638, //111#DBCS LEAD BYTE 0xEF + 15732, //112#DBCS LEAD BYTE 0xF0 + 15826, //113#DBCS LEAD BYTE 0xF1 + 15920, //114#DBCS LEAD BYTE 0xF2 + 16014, //115#DBCS LEAD BYTE 0xF3 + 16108, //116#DBCS LEAD BYTE 0xF4 + 16202, //117#DBCS LEAD BYTE 0xF5 + 16296, //118#DBCS LEAD BYTE 0xF6 + 16390, //119#DBCS LEAD BYTE 0xF7 + 16484, //120#DBCS LEAD BYTE 0xF8 + 16578, //121#DBCS LEAD BYTE 0xF9 + 16672, //122#DBCS LEAD BYTE 0xFA + 16766, //123#DBCS LEAD BYTE 0xFB + 16860, //124#DBCS LEAD BYTE 0xFC + 16954, //125#DBCS LEAD BYTE 0xFD + 17047, //126#DBCS LEAD BYTE 0xFE, empty + 17047, //127#UNDEFINED 0xFF, END OF TABLE +}; + +//Table 949 tail byte +static const int DRW_DoubleTable949[][2] = { + {0x8141, 0xAC02}, //1 #HANGUL SYLLABLE KIYEOK A SSANGKIYEOK + {0x8142, 0xAC03}, //2 #HANGUL SYLLABLE KIYEOK A KIYEOKSIOS + {0x8143, 0xAC05}, //3 #HANGUL SYLLABLE KIYEOK A NIEUNCIEUC + {0x8144, 0xAC06}, //4 #HANGUL SYLLABLE KIYEOK A NIEUNHIEUH + {0x8145, 0xAC0B}, //5 #HANGUL SYLLABLE KIYEOK A RIEULPIEUP + {0x8146, 0xAC0C}, //6 #HANGUL SYLLABLE KIYEOK A RIEULSIOS + {0x8147, 0xAC0D}, //7 #HANGUL SYLLABLE KIYEOK A RIEULTHIEUTH + {0x8148, 0xAC0E}, //8 #HANGUL SYLLABLE KIYEOK A RIEULPHIEUPH + {0x8149, 0xAC0F}, //9 #HANGUL SYLLABLE KIYEOK A RIEULHIEUH + {0x814A, 0xAC18}, //10 #HANGUL SYLLABLE KIYEOK A KHIEUKH + {0x814B, 0xAC1E}, //11 #HANGUL SYLLABLE KIYEOK AE SSANGKIYEOK + {0x814C, 0xAC1F}, //12 #HANGUL SYLLABLE KIYEOK AE KIYEOKSIOS + {0x814D, 0xAC21}, //13 #HANGUL SYLLABLE KIYEOK AE NIEUNCIEUC + {0x814E, 0xAC22}, //14 #HANGUL SYLLABLE KIYEOK AE NIEUNHIEUH + {0x814F, 0xAC23}, //15 #HANGUL SYLLABLE KIYEOK AE TIKEUT + {0x8150, 0xAC25}, //16 #HANGUL SYLLABLE KIYEOK AE RIEULKIYEOK + {0x8151, 0xAC26}, //17 #HANGUL SYLLABLE KIYEOK AE RIEULMIEUM + {0x8152, 0xAC27}, //18 #HANGUL SYLLABLE KIYEOK AE RIEULPIEUP + {0x8153, 0xAC28}, //19 #HANGUL SYLLABLE KIYEOK AE RIEULSIOS + {0x8154, 0xAC29}, //20 #HANGUL SYLLABLE KIYEOK AE RIEULTHIEUTH + {0x8155, 0xAC2A}, //21 #HANGUL SYLLABLE KIYEOK AE RIEULPHIEUPH + {0x8156, 0xAC2B}, //22 #HANGUL SYLLABLE KIYEOK AE RIEULHIEUH + {0x8157, 0xAC2E}, //23 #HANGUL SYLLABLE KIYEOK AE PIEUPSIOS + {0x8158, 0xAC32}, //24 #HANGUL SYLLABLE KIYEOK AE CIEUC + {0x8159, 0xAC33}, //25 #HANGUL SYLLABLE KIYEOK AE CHIEUCH + {0x815A, 0xAC34}, //26 #HANGUL SYLLABLE KIYEOK AE KHIEUKH + {0x8161, 0xAC35}, //27 #HANGUL SYLLABLE KIYEOK AE THIEUTH + {0x8162, 0xAC36}, //28 #HANGUL SYLLABLE KIYEOK AE PHIEUPH + {0x8163, 0xAC37}, //29 #HANGUL SYLLABLE KIYEOK AE HIEUH + {0x8164, 0xAC3A}, //30 #HANGUL SYLLABLE KIYEOK YA SSANGKIYEOK + {0x8165, 0xAC3B}, //31 #HANGUL SYLLABLE KIYEOK YA KIYEOKSIOS + {0x8166, 0xAC3D}, //32 #HANGUL SYLLABLE KIYEOK YA NIEUNCIEUC + {0x8167, 0xAC3E}, //33 #HANGUL SYLLABLE KIYEOK YA NIEUNHIEUH + {0x8168, 0xAC3F}, //34 #HANGUL SYLLABLE KIYEOK YA TIKEUT + {0x8169, 0xAC41}, //35 #HANGUL SYLLABLE KIYEOK YA RIEULKIYEOK + {0x816A, 0xAC42}, //36 #HANGUL SYLLABLE KIYEOK YA RIEULMIEUM + {0x816B, 0xAC43}, //37 #HANGUL SYLLABLE KIYEOK YA RIEULPIEUP + {0x816C, 0xAC44}, //38 #HANGUL SYLLABLE KIYEOK YA RIEULSIOS + {0x816D, 0xAC45}, //39 #HANGUL SYLLABLE KIYEOK YA RIEULTHIEUTH + {0x816E, 0xAC46}, //40 #HANGUL SYLLABLE KIYEOK YA RIEULPHIEUPH + {0x816F, 0xAC47}, //41 #HANGUL SYLLABLE KIYEOK YA RIEULHIEUH + {0x8170, 0xAC48}, //42 #HANGUL SYLLABLE KIYEOK YA MIEUM + {0x8171, 0xAC49}, //43 #HANGUL SYLLABLE KIYEOK YA PIEUP + {0x8172, 0xAC4A}, //44 #HANGUL SYLLABLE KIYEOK YA PIEUPSIOS + {0x8173, 0xAC4C}, //45 #HANGUL SYLLABLE KIYEOK YA SSANGSIOS + {0x8174, 0xAC4E}, //46 #HANGUL SYLLABLE KIYEOK YA CIEUC + {0x8175, 0xAC4F}, //47 #HANGUL SYLLABLE KIYEOK YA CHIEUCH + {0x8176, 0xAC50}, //48 #HANGUL SYLLABLE KIYEOK YA KHIEUKH + {0x8177, 0xAC51}, //49 #HANGUL SYLLABLE KIYEOK YA THIEUTH + {0x8178, 0xAC52}, //50 #HANGUL SYLLABLE KIYEOK YA PHIEUPH + {0x8179, 0xAC53}, //51 #HANGUL SYLLABLE KIYEOK YA HIEUH + {0x817A, 0xAC55}, //52 #HANGUL SYLLABLE KIYEOK YAE KIYEOK + {0x8181, 0xAC56}, //53 #HANGUL SYLLABLE KIYEOK YAE SSANGKIYEOK + {0x8182, 0xAC57}, //54 #HANGUL SYLLABLE KIYEOK YAE KIYEOKSIOS + {0x8183, 0xAC59}, //55 #HANGUL SYLLABLE KIYEOK YAE NIEUNCIEUC + {0x8184, 0xAC5A}, //56 #HANGUL SYLLABLE KIYEOK YAE NIEUNHIEUH + {0x8185, 0xAC5B}, //57 #HANGUL SYLLABLE KIYEOK YAE TIKEUT + {0x8186, 0xAC5D}, //58 #HANGUL SYLLABLE KIYEOK YAE RIEULKIYEOK + {0x8187, 0xAC5E}, //59 #HANGUL SYLLABLE KIYEOK YAE RIEULMIEUM + {0x8188, 0xAC5F}, //60 #HANGUL SYLLABLE KIYEOK YAE RIEULPIEUP + {0x8189, 0xAC60}, //61 #HANGUL SYLLABLE KIYEOK YAE RIEULSIOS + {0x818A, 0xAC61}, //62 #HANGUL SYLLABLE KIYEOK YAE RIEULTHIEUTH + {0x818B, 0xAC62}, //63 #HANGUL SYLLABLE KIYEOK YAE RIEULPHIEUPH + {0x818C, 0xAC63}, //64 #HANGUL SYLLABLE KIYEOK YAE RIEULHIEUH + {0x818D, 0xAC64}, //65 #HANGUL SYLLABLE KIYEOK YAE MIEUM + {0x818E, 0xAC65}, //66 #HANGUL SYLLABLE KIYEOK YAE PIEUP + {0x818F, 0xAC66}, //67 #HANGUL SYLLABLE KIYEOK YAE PIEUPSIOS + {0x8190, 0xAC67}, //68 #HANGUL SYLLABLE KIYEOK YAE SIOS + {0x8191, 0xAC68}, //69 #HANGUL SYLLABLE KIYEOK YAE SSANGSIOS + {0x8192, 0xAC69}, //70 #HANGUL SYLLABLE KIYEOK YAE IEUNG + {0x8193, 0xAC6A}, //71 #HANGUL SYLLABLE KIYEOK YAE CIEUC + {0x8194, 0xAC6B}, //72 #HANGUL SYLLABLE KIYEOK YAE CHIEUCH + {0x8195, 0xAC6C}, //73 #HANGUL SYLLABLE KIYEOK YAE KHIEUKH + {0x8196, 0xAC6D}, //74 #HANGUL SYLLABLE KIYEOK YAE THIEUTH + {0x8197, 0xAC6E}, //75 #HANGUL SYLLABLE KIYEOK YAE PHIEUPH + {0x8198, 0xAC6F}, //76 #HANGUL SYLLABLE KIYEOK YAE HIEUH + {0x8199, 0xAC72}, //77 #HANGUL SYLLABLE KIYEOK EO SSANGKIYEOK + {0x819A, 0xAC73}, //78 #HANGUL SYLLABLE KIYEOK EO KIYEOKSIOS + {0x819B, 0xAC75}, //79 #HANGUL SYLLABLE KIYEOK EO NIEUNCIEUC + {0x819C, 0xAC76}, //80 #HANGUL SYLLABLE KIYEOK EO NIEUNHIEUH + {0x819D, 0xAC79}, //81 #HANGUL SYLLABLE KIYEOK EO RIEULKIYEOK + {0x819E, 0xAC7B}, //82 #HANGUL SYLLABLE KIYEOK EO RIEULPIEUP + {0x819F, 0xAC7C}, //83 #HANGUL SYLLABLE KIYEOK EO RIEULSIOS + {0x81A0, 0xAC7D}, //84 #HANGUL SYLLABLE KIYEOK EO RIEULTHIEUTH + {0x81A1, 0xAC7E}, //85 #HANGUL SYLLABLE KIYEOK EO RIEULPHIEUPH + {0x81A2, 0xAC7F}, //86 #HANGUL SYLLABLE KIYEOK EO RIEULHIEUH + {0x81A3, 0xAC82}, //87 #HANGUL SYLLABLE KIYEOK EO PIEUPSIOS + {0x81A4, 0xAC87}, //88 #HANGUL SYLLABLE KIYEOK EO CHIEUCH + {0x81A5, 0xAC88}, //89 #HANGUL SYLLABLE KIYEOK EO KHIEUKH + {0x81A6, 0xAC8D}, //90 #HANGUL SYLLABLE KIYEOK E KIYEOK + {0x81A7, 0xAC8E}, //91 #HANGUL SYLLABLE KIYEOK E SSANGKIYEOK + {0x81A8, 0xAC8F}, //92 #HANGUL SYLLABLE KIYEOK E KIYEOKSIOS + {0x81A9, 0xAC91}, //93 #HANGUL SYLLABLE KIYEOK E NIEUNCIEUC + {0x81AA, 0xAC92}, //94 #HANGUL SYLLABLE KIYEOK E NIEUNHIEUH + {0x81AB, 0xAC93}, //95 #HANGUL SYLLABLE KIYEOK E TIKEUT + {0x81AC, 0xAC95}, //96 #HANGUL SYLLABLE KIYEOK E RIEULKIYEOK + {0x81AD, 0xAC96}, //97 #HANGUL SYLLABLE KIYEOK E RIEULMIEUM + {0x81AE, 0xAC97}, //98 #HANGUL SYLLABLE KIYEOK E RIEULPIEUP + {0x81AF, 0xAC98}, //99 #HANGUL SYLLABLE KIYEOK E RIEULSIOS + {0x81B0, 0xAC99}, //100 #HANGUL SYLLABLE KIYEOK E RIEULTHIEUTH + {0x81B1, 0xAC9A}, //101 #HANGUL SYLLABLE KIYEOK E RIEULPHIEUPH + {0x81B2, 0xAC9B}, //102 #HANGUL SYLLABLE KIYEOK E RIEULHIEUH + {0x81B3, 0xAC9E}, //103 #HANGUL SYLLABLE KIYEOK E PIEUPSIOS + {0x81B4, 0xACA2}, //104 #HANGUL SYLLABLE KIYEOK E CIEUC + {0x81B5, 0xACA3}, //105 #HANGUL SYLLABLE KIYEOK E CHIEUCH + {0x81B6, 0xACA4}, //106 #HANGUL SYLLABLE KIYEOK E KHIEUKH + {0x81B7, 0xACA5}, //107 #HANGUL SYLLABLE KIYEOK E THIEUTH + {0x81B8, 0xACA6}, //108 #HANGUL SYLLABLE KIYEOK E PHIEUPH + {0x81B9, 0xACA7}, //109 #HANGUL SYLLABLE KIYEOK E HIEUH + {0x81BA, 0xACAB}, //110 #HANGUL SYLLABLE KIYEOK YEO KIYEOKSIOS + {0x81BB, 0xACAD}, //111 #HANGUL SYLLABLE KIYEOK YEO NIEUNCIEUC + {0x81BC, 0xACAE}, //112 #HANGUL SYLLABLE KIYEOK YEO NIEUNHIEUH + {0x81BD, 0xACB1}, //113 #HANGUL SYLLABLE KIYEOK YEO RIEULKIYEOK + {0x81BE, 0xACB2}, //114 #HANGUL SYLLABLE KIYEOK YEO RIEULMIEUM + {0x81BF, 0xACB3}, //115 #HANGUL SYLLABLE KIYEOK YEO RIEULPIEUP + {0x81C0, 0xACB4}, //116 #HANGUL SYLLABLE KIYEOK YEO RIEULSIOS + {0x81C1, 0xACB5}, //117 #HANGUL SYLLABLE KIYEOK YEO RIEULTHIEUTH + {0x81C2, 0xACB6}, //118 #HANGUL SYLLABLE KIYEOK YEO RIEULPHIEUPH + {0x81C3, 0xACB7}, //119 #HANGUL SYLLABLE KIYEOK YEO RIEULHIEUH + {0x81C4, 0xACBA}, //120 #HANGUL SYLLABLE KIYEOK YEO PIEUPSIOS + {0x81C5, 0xACBE}, //121 #HANGUL SYLLABLE KIYEOK YEO CIEUC + {0x81C6, 0xACBF}, //122 #HANGUL SYLLABLE KIYEOK YEO CHIEUCH + {0x81C7, 0xACC0}, //123 #HANGUL SYLLABLE KIYEOK YEO KHIEUKH + {0x81C8, 0xACC2}, //124 #HANGUL SYLLABLE KIYEOK YEO PHIEUPH + {0x81C9, 0xACC3}, //125 #HANGUL SYLLABLE KIYEOK YEO HIEUH + {0x81CA, 0xACC5}, //126 #HANGUL SYLLABLE KIYEOK YE KIYEOK + {0x81CB, 0xACC6}, //127 #HANGUL SYLLABLE KIYEOK YE SSANGKIYEOK + {0x81CC, 0xACC7}, //128 #HANGUL SYLLABLE KIYEOK YE KIYEOKSIOS + {0x81CD, 0xACC9}, //129 #HANGUL SYLLABLE KIYEOK YE NIEUNCIEUC + {0x81CE, 0xACCA}, //130 #HANGUL SYLLABLE KIYEOK YE NIEUNHIEUH + {0x81CF, 0xACCB}, //131 #HANGUL SYLLABLE KIYEOK YE TIKEUT + {0x81D0, 0xACCD}, //132 #HANGUL SYLLABLE KIYEOK YE RIEULKIYEOK + {0x81D1, 0xACCE}, //133 #HANGUL SYLLABLE KIYEOK YE RIEULMIEUM + {0x81D2, 0xACCF}, //134 #HANGUL SYLLABLE KIYEOK YE RIEULPIEUP + {0x81D3, 0xACD0}, //135 #HANGUL SYLLABLE KIYEOK YE RIEULSIOS + {0x81D4, 0xACD1}, //136 #HANGUL SYLLABLE KIYEOK YE RIEULTHIEUTH + {0x81D5, 0xACD2}, //137 #HANGUL SYLLABLE KIYEOK YE RIEULPHIEUPH + {0x81D6, 0xACD3}, //138 #HANGUL SYLLABLE KIYEOK YE RIEULHIEUH + {0x81D7, 0xACD4}, //139 #HANGUL SYLLABLE KIYEOK YE MIEUM + {0x81D8, 0xACD6}, //140 #HANGUL SYLLABLE KIYEOK YE PIEUPSIOS + {0x81D9, 0xACD8}, //141 #HANGUL SYLLABLE KIYEOK YE SSANGSIOS + {0x81DA, 0xACD9}, //142 #HANGUL SYLLABLE KIYEOK YE IEUNG + {0x81DB, 0xACDA}, //143 #HANGUL SYLLABLE KIYEOK YE CIEUC + {0x81DC, 0xACDB}, //144 #HANGUL SYLLABLE KIYEOK YE CHIEUCH + {0x81DD, 0xACDC}, //145 #HANGUL SYLLABLE KIYEOK YE KHIEUKH + {0x81DE, 0xACDD}, //146 #HANGUL SYLLABLE KIYEOK YE THIEUTH + {0x81DF, 0xACDE}, //147 #HANGUL SYLLABLE KIYEOK YE PHIEUPH + {0x81E0, 0xACDF}, //148 #HANGUL SYLLABLE KIYEOK YE HIEUH + {0x81E1, 0xACE2}, //149 #HANGUL SYLLABLE KIYEOK O SSANGKIYEOK + {0x81E2, 0xACE3}, //150 #HANGUL SYLLABLE KIYEOK O KIYEOKSIOS + {0x81E3, 0xACE5}, //151 #HANGUL SYLLABLE KIYEOK O NIEUNCIEUC + {0x81E4, 0xACE6}, //152 #HANGUL SYLLABLE KIYEOK O NIEUNHIEUH + {0x81E5, 0xACE9}, //153 #HANGUL SYLLABLE KIYEOK O RIEULKIYEOK + {0x81E6, 0xACEB}, //154 #HANGUL SYLLABLE KIYEOK O RIEULPIEUP + {0x81E7, 0xACED}, //155 #HANGUL SYLLABLE KIYEOK O RIEULTHIEUTH + {0x81E8, 0xACEE}, //156 #HANGUL SYLLABLE KIYEOK O RIEULPHIEUPH + {0x81E9, 0xACF2}, //157 #HANGUL SYLLABLE KIYEOK O PIEUPSIOS + {0x81EA, 0xACF4}, //158 #HANGUL SYLLABLE KIYEOK O SSANGSIOS + {0x81EB, 0xACF7}, //159 #HANGUL SYLLABLE KIYEOK O CHIEUCH + {0x81EC, 0xACF8}, //160 #HANGUL SYLLABLE KIYEOK O KHIEUKH + {0x81ED, 0xACF9}, //161 #HANGUL SYLLABLE KIYEOK O THIEUTH + {0x81EE, 0xACFA}, //162 #HANGUL SYLLABLE KIYEOK O PHIEUPH + {0x81EF, 0xACFB}, //163 #HANGUL SYLLABLE KIYEOK O HIEUH + {0x81F0, 0xACFE}, //164 #HANGUL SYLLABLE KIYEOK WA SSANGKIYEOK + {0x81F1, 0xACFF}, //165 #HANGUL SYLLABLE KIYEOK WA KIYEOKSIOS + {0x81F2, 0xAD01}, //166 #HANGUL SYLLABLE KIYEOK WA NIEUNCIEUC + {0x81F3, 0xAD02}, //167 #HANGUL SYLLABLE KIYEOK WA NIEUNHIEUH + {0x81F4, 0xAD03}, //168 #HANGUL SYLLABLE KIYEOK WA TIKEUT + {0x81F5, 0xAD05}, //169 #HANGUL SYLLABLE KIYEOK WA RIEULKIYEOK + {0x81F6, 0xAD07}, //170 #HANGUL SYLLABLE KIYEOK WA RIEULPIEUP + {0x81F7, 0xAD08}, //171 #HANGUL SYLLABLE KIYEOK WA RIEULSIOS + {0x81F8, 0xAD09}, //172 #HANGUL SYLLABLE KIYEOK WA RIEULTHIEUTH + {0x81F9, 0xAD0A}, //173 #HANGUL SYLLABLE KIYEOK WA RIEULPHIEUPH + {0x81FA, 0xAD0B}, //174 #HANGUL SYLLABLE KIYEOK WA RIEULHIEUH + {0x81FB, 0xAD0E}, //175 #HANGUL SYLLABLE KIYEOK WA PIEUPSIOS + {0x81FC, 0xAD10}, //176 #HANGUL SYLLABLE KIYEOK WA SSANGSIOS + {0x81FD, 0xAD12}, //177 #HANGUL SYLLABLE KIYEOK WA CIEUC + {0x81FE, 0xAD13}, //178 #HANGUL SYLLABLE KIYEOK WA CHIEUCH + {0x8241, 0xAD14}, //179 #HANGUL SYLLABLE KIYEOK WA KHIEUKH + {0x8242, 0xAD15}, //180 #HANGUL SYLLABLE KIYEOK WA THIEUTH + {0x8243, 0xAD16}, //181 #HANGUL SYLLABLE KIYEOK WA PHIEUPH + {0x8244, 0xAD17}, //182 #HANGUL SYLLABLE KIYEOK WA HIEUH + {0x8245, 0xAD19}, //183 #HANGUL SYLLABLE KIYEOK WAE KIYEOK + {0x8246, 0xAD1A}, //184 #HANGUL SYLLABLE KIYEOK WAE SSANGKIYEOK + {0x8247, 0xAD1B}, //185 #HANGUL SYLLABLE KIYEOK WAE KIYEOKSIOS + {0x8248, 0xAD1D}, //186 #HANGUL SYLLABLE KIYEOK WAE NIEUNCIEUC + {0x8249, 0xAD1E}, //187 #HANGUL SYLLABLE KIYEOK WAE NIEUNHIEUH + {0x824A, 0xAD1F}, //188 #HANGUL SYLLABLE KIYEOK WAE TIKEUT + {0x824B, 0xAD21}, //189 #HANGUL SYLLABLE KIYEOK WAE RIEULKIYEOK + {0x824C, 0xAD22}, //190 #HANGUL SYLLABLE KIYEOK WAE RIEULMIEUM + {0x824D, 0xAD23}, //191 #HANGUL SYLLABLE KIYEOK WAE RIEULPIEUP + {0x824E, 0xAD24}, //192 #HANGUL SYLLABLE KIYEOK WAE RIEULSIOS + {0x824F, 0xAD25}, //193 #HANGUL SYLLABLE KIYEOK WAE RIEULTHIEUTH + {0x8250, 0xAD26}, //194 #HANGUL SYLLABLE KIYEOK WAE RIEULPHIEUPH + {0x8251, 0xAD27}, //195 #HANGUL SYLLABLE KIYEOK WAE RIEULHIEUH + {0x8252, 0xAD28}, //196 #HANGUL SYLLABLE KIYEOK WAE MIEUM + {0x8253, 0xAD2A}, //197 #HANGUL SYLLABLE KIYEOK WAE PIEUPSIOS + {0x8254, 0xAD2B}, //198 #HANGUL SYLLABLE KIYEOK WAE SIOS + {0x8255, 0xAD2E}, //199 #HANGUL SYLLABLE KIYEOK WAE CIEUC + {0x8256, 0xAD2F}, //200 #HANGUL SYLLABLE KIYEOK WAE CHIEUCH + {0x8257, 0xAD30}, //201 #HANGUL SYLLABLE KIYEOK WAE KHIEUKH + {0x8258, 0xAD31}, //202 #HANGUL SYLLABLE KIYEOK WAE THIEUTH + {0x8259, 0xAD32}, //203 #HANGUL SYLLABLE KIYEOK WAE PHIEUPH + {0x825A, 0xAD33}, //204 #HANGUL SYLLABLE KIYEOK WAE HIEUH + {0x8261, 0xAD36}, //205 #HANGUL SYLLABLE KIYEOK OE SSANGKIYEOK + {0x8262, 0xAD37}, //206 #HANGUL SYLLABLE KIYEOK OE KIYEOKSIOS + {0x8263, 0xAD39}, //207 #HANGUL SYLLABLE KIYEOK OE NIEUNCIEUC + {0x8264, 0xAD3A}, //208 #HANGUL SYLLABLE KIYEOK OE NIEUNHIEUH + {0x8265, 0xAD3B}, //209 #HANGUL SYLLABLE KIYEOK OE TIKEUT + {0x8266, 0xAD3D}, //210 #HANGUL SYLLABLE KIYEOK OE RIEULKIYEOK + {0x8267, 0xAD3E}, //211 #HANGUL SYLLABLE KIYEOK OE RIEULMIEUM + {0x8268, 0xAD3F}, //212 #HANGUL SYLLABLE KIYEOK OE RIEULPIEUP + {0x8269, 0xAD40}, //213 #HANGUL SYLLABLE KIYEOK OE RIEULSIOS + {0x826A, 0xAD41}, //214 #HANGUL SYLLABLE KIYEOK OE RIEULTHIEUTH + {0x826B, 0xAD42}, //215 #HANGUL SYLLABLE KIYEOK OE RIEULPHIEUPH + {0x826C, 0xAD43}, //216 #HANGUL SYLLABLE KIYEOK OE RIEULHIEUH + {0x826D, 0xAD46}, //217 #HANGUL SYLLABLE KIYEOK OE PIEUPSIOS + {0x826E, 0xAD48}, //218 #HANGUL SYLLABLE KIYEOK OE SSANGSIOS + {0x826F, 0xAD4A}, //219 #HANGUL SYLLABLE KIYEOK OE CIEUC + {0x8270, 0xAD4B}, //220 #HANGUL SYLLABLE KIYEOK OE CHIEUCH + {0x8271, 0xAD4C}, //221 #HANGUL SYLLABLE KIYEOK OE KHIEUKH + {0x8272, 0xAD4D}, //222 #HANGUL SYLLABLE KIYEOK OE THIEUTH + {0x8273, 0xAD4E}, //223 #HANGUL SYLLABLE KIYEOK OE PHIEUPH + {0x8274, 0xAD4F}, //224 #HANGUL SYLLABLE KIYEOK OE HIEUH + {0x8275, 0xAD51}, //225 #HANGUL SYLLABLE KIYEOK YO KIYEOK + {0x8276, 0xAD52}, //226 #HANGUL SYLLABLE KIYEOK YO SSANGKIYEOK + {0x8277, 0xAD53}, //227 #HANGUL SYLLABLE KIYEOK YO KIYEOKSIOS + {0x8278, 0xAD55}, //228 #HANGUL SYLLABLE KIYEOK YO NIEUNCIEUC + {0x8279, 0xAD56}, //229 #HANGUL SYLLABLE KIYEOK YO NIEUNHIEUH + {0x827A, 0xAD57}, //230 #HANGUL SYLLABLE KIYEOK YO TIKEUT + {0x8281, 0xAD59}, //231 #HANGUL SYLLABLE KIYEOK YO RIEULKIYEOK + {0x8282, 0xAD5A}, //232 #HANGUL SYLLABLE KIYEOK YO RIEULMIEUM + {0x8283, 0xAD5B}, //233 #HANGUL SYLLABLE KIYEOK YO RIEULPIEUP + {0x8284, 0xAD5C}, //234 #HANGUL SYLLABLE KIYEOK YO RIEULSIOS + {0x8285, 0xAD5D}, //235 #HANGUL SYLLABLE KIYEOK YO RIEULTHIEUTH + {0x8286, 0xAD5E}, //236 #HANGUL SYLLABLE KIYEOK YO RIEULPHIEUPH + {0x8287, 0xAD5F}, //237 #HANGUL SYLLABLE KIYEOK YO RIEULHIEUH + {0x8288, 0xAD60}, //238 #HANGUL SYLLABLE KIYEOK YO MIEUM + {0x8289, 0xAD62}, //239 #HANGUL SYLLABLE KIYEOK YO PIEUPSIOS + {0x828A, 0xAD64}, //240 #HANGUL SYLLABLE KIYEOK YO SSANGSIOS + {0x828B, 0xAD65}, //241 #HANGUL SYLLABLE KIYEOK YO IEUNG + {0x828C, 0xAD66}, //242 #HANGUL SYLLABLE KIYEOK YO CIEUC + {0x828D, 0xAD67}, //243 #HANGUL SYLLABLE KIYEOK YO CHIEUCH + {0x828E, 0xAD68}, //244 #HANGUL SYLLABLE KIYEOK YO KHIEUKH + {0x828F, 0xAD69}, //245 #HANGUL SYLLABLE KIYEOK YO THIEUTH + {0x8290, 0xAD6A}, //246 #HANGUL SYLLABLE KIYEOK YO PHIEUPH + {0x8291, 0xAD6B}, //247 #HANGUL SYLLABLE KIYEOK YO HIEUH + {0x8292, 0xAD6E}, //248 #HANGUL SYLLABLE KIYEOK U SSANGKIYEOK + {0x8293, 0xAD6F}, //249 #HANGUL SYLLABLE KIYEOK U KIYEOKSIOS + {0x8294, 0xAD71}, //250 #HANGUL SYLLABLE KIYEOK U NIEUNCIEUC + {0x8295, 0xAD72}, //251 #HANGUL SYLLABLE KIYEOK U NIEUNHIEUH + {0x8296, 0xAD77}, //252 #HANGUL SYLLABLE KIYEOK U RIEULPIEUP + {0x8297, 0xAD78}, //253 #HANGUL SYLLABLE KIYEOK U RIEULSIOS + {0x8298, 0xAD79}, //254 #HANGUL SYLLABLE KIYEOK U RIEULTHIEUTH + {0x8299, 0xAD7A}, //255 #HANGUL SYLLABLE KIYEOK U RIEULPHIEUPH + {0x829A, 0xAD7E}, //256 #HANGUL SYLLABLE KIYEOK U PIEUPSIOS + {0x829B, 0xAD80}, //257 #HANGUL SYLLABLE KIYEOK U SSANGSIOS + {0x829C, 0xAD83}, //258 #HANGUL SYLLABLE KIYEOK U CHIEUCH + {0x829D, 0xAD84}, //259 #HANGUL SYLLABLE KIYEOK U KHIEUKH + {0x829E, 0xAD85}, //260 #HANGUL SYLLABLE KIYEOK U THIEUTH + {0x829F, 0xAD86}, //261 #HANGUL SYLLABLE KIYEOK U PHIEUPH + {0x82A0, 0xAD87}, //262 #HANGUL SYLLABLE KIYEOK U HIEUH + {0x82A1, 0xAD8A}, //263 #HANGUL SYLLABLE KIYEOK WEO SSANGKIYEOK + {0x82A2, 0xAD8B}, //264 #HANGUL SYLLABLE KIYEOK WEO KIYEOKSIOS + {0x82A3, 0xAD8D}, //265 #HANGUL SYLLABLE KIYEOK WEO NIEUNCIEUC + {0x82A4, 0xAD8E}, //266 #HANGUL SYLLABLE KIYEOK WEO NIEUNHIEUH + {0x82A5, 0xAD8F}, //267 #HANGUL SYLLABLE KIYEOK WEO TIKEUT + {0x82A6, 0xAD91}, //268 #HANGUL SYLLABLE KIYEOK WEO RIEULKIYEOK + {0x82A7, 0xAD92}, //269 #HANGUL SYLLABLE KIYEOK WEO RIEULMIEUM + {0x82A8, 0xAD93}, //270 #HANGUL SYLLABLE KIYEOK WEO RIEULPIEUP + {0x82A9, 0xAD94}, //271 #HANGUL SYLLABLE KIYEOK WEO RIEULSIOS + {0x82AA, 0xAD95}, //272 #HANGUL SYLLABLE KIYEOK WEO RIEULTHIEUTH + {0x82AB, 0xAD96}, //273 #HANGUL SYLLABLE KIYEOK WEO RIEULPHIEUPH + {0x82AC, 0xAD97}, //274 #HANGUL SYLLABLE KIYEOK WEO RIEULHIEUH + {0x82AD, 0xAD98}, //275 #HANGUL SYLLABLE KIYEOK WEO MIEUM + {0x82AE, 0xAD99}, //276 #HANGUL SYLLABLE KIYEOK WEO PIEUP + {0x82AF, 0xAD9A}, //277 #HANGUL SYLLABLE KIYEOK WEO PIEUPSIOS + {0x82B0, 0xAD9B}, //278 #HANGUL SYLLABLE KIYEOK WEO SIOS + {0x82B1, 0xAD9E}, //279 #HANGUL SYLLABLE KIYEOK WEO CIEUC + {0x82B2, 0xAD9F}, //280 #HANGUL SYLLABLE KIYEOK WEO CHIEUCH + {0x82B3, 0xADA0}, //281 #HANGUL SYLLABLE KIYEOK WEO KHIEUKH + {0x82B4, 0xADA1}, //282 #HANGUL SYLLABLE KIYEOK WEO THIEUTH + {0x82B5, 0xADA2}, //283 #HANGUL SYLLABLE KIYEOK WEO PHIEUPH + {0x82B6, 0xADA3}, //284 #HANGUL SYLLABLE KIYEOK WEO HIEUH + {0x82B7, 0xADA5}, //285 #HANGUL SYLLABLE KIYEOK WE KIYEOK + {0x82B8, 0xADA6}, //286 #HANGUL SYLLABLE KIYEOK WE SSANGKIYEOK + {0x82B9, 0xADA7}, //287 #HANGUL SYLLABLE KIYEOK WE KIYEOKSIOS + {0x82BA, 0xADA8}, //288 #HANGUL SYLLABLE KIYEOK WE NIEUN + {0x82BB, 0xADA9}, //289 #HANGUL SYLLABLE KIYEOK WE NIEUNCIEUC + {0x82BC, 0xADAA}, //290 #HANGUL SYLLABLE KIYEOK WE NIEUNHIEUH + {0x82BD, 0xADAB}, //291 #HANGUL SYLLABLE KIYEOK WE TIKEUT + {0x82BE, 0xADAC}, //292 #HANGUL SYLLABLE KIYEOK WE RIEUL + {0x82BF, 0xADAD}, //293 #HANGUL SYLLABLE KIYEOK WE RIEULKIYEOK + {0x82C0, 0xADAE}, //294 #HANGUL SYLLABLE KIYEOK WE RIEULMIEUM + {0x82C1, 0xADAF}, //295 #HANGUL SYLLABLE KIYEOK WE RIEULPIEUP + {0x82C2, 0xADB0}, //296 #HANGUL SYLLABLE KIYEOK WE RIEULSIOS + {0x82C3, 0xADB1}, //297 #HANGUL SYLLABLE KIYEOK WE RIEULTHIEUTH + {0x82C4, 0xADB2}, //298 #HANGUL SYLLABLE KIYEOK WE RIEULPHIEUPH + {0x82C5, 0xADB3}, //299 #HANGUL SYLLABLE KIYEOK WE RIEULHIEUH + {0x82C6, 0xADB4}, //300 #HANGUL SYLLABLE KIYEOK WE MIEUM + {0x82C7, 0xADB5}, //301 #HANGUL SYLLABLE KIYEOK WE PIEUP + {0x82C8, 0xADB6}, //302 #HANGUL SYLLABLE KIYEOK WE PIEUPSIOS + {0x82C9, 0xADB8}, //303 #HANGUL SYLLABLE KIYEOK WE SSANGSIOS + {0x82CA, 0xADB9}, //304 #HANGUL SYLLABLE KIYEOK WE IEUNG + {0x82CB, 0xADBA}, //305 #HANGUL SYLLABLE KIYEOK WE CIEUC + {0x82CC, 0xADBB}, //306 #HANGUL SYLLABLE KIYEOK WE CHIEUCH + {0x82CD, 0xADBC}, //307 #HANGUL SYLLABLE KIYEOK WE KHIEUKH + {0x82CE, 0xADBD}, //308 #HANGUL SYLLABLE KIYEOK WE THIEUTH + {0x82CF, 0xADBE}, //309 #HANGUL SYLLABLE KIYEOK WE PHIEUPH + {0x82D0, 0xADBF}, //310 #HANGUL SYLLABLE KIYEOK WE HIEUH + {0x82D1, 0xADC2}, //311 #HANGUL SYLLABLE KIYEOK WI SSANGKIYEOK + {0x82D2, 0xADC3}, //312 #HANGUL SYLLABLE KIYEOK WI KIYEOKSIOS + {0x82D3, 0xADC5}, //313 #HANGUL SYLLABLE KIYEOK WI NIEUNCIEUC + {0x82D4, 0xADC6}, //314 #HANGUL SYLLABLE KIYEOK WI NIEUNHIEUH + {0x82D5, 0xADC7}, //315 #HANGUL SYLLABLE KIYEOK WI TIKEUT + {0x82D6, 0xADC9}, //316 #HANGUL SYLLABLE KIYEOK WI RIEULKIYEOK + {0x82D7, 0xADCA}, //317 #HANGUL SYLLABLE KIYEOK WI RIEULMIEUM + {0x82D8, 0xADCB}, //318 #HANGUL SYLLABLE KIYEOK WI RIEULPIEUP + {0x82D9, 0xADCC}, //319 #HANGUL SYLLABLE KIYEOK WI RIEULSIOS + {0x82DA, 0xADCD}, //320 #HANGUL SYLLABLE KIYEOK WI RIEULTHIEUTH + {0x82DB, 0xADCE}, //321 #HANGUL SYLLABLE KIYEOK WI RIEULPHIEUPH + {0x82DC, 0xADCF}, //322 #HANGUL SYLLABLE KIYEOK WI RIEULHIEUH + {0x82DD, 0xADD2}, //323 #HANGUL SYLLABLE KIYEOK WI PIEUPSIOS + {0x82DE, 0xADD4}, //324 #HANGUL SYLLABLE KIYEOK WI SSANGSIOS + {0x82DF, 0xADD5}, //325 #HANGUL SYLLABLE KIYEOK WI IEUNG + {0x82E0, 0xADD6}, //326 #HANGUL SYLLABLE KIYEOK WI CIEUC + {0x82E1, 0xADD7}, //327 #HANGUL SYLLABLE KIYEOK WI CHIEUCH + {0x82E2, 0xADD8}, //328 #HANGUL SYLLABLE KIYEOK WI KHIEUKH + {0x82E3, 0xADD9}, //329 #HANGUL SYLLABLE KIYEOK WI THIEUTH + {0x82E4, 0xADDA}, //330 #HANGUL SYLLABLE KIYEOK WI PHIEUPH + {0x82E5, 0xADDB}, //331 #HANGUL SYLLABLE KIYEOK WI HIEUH + {0x82E6, 0xADDD}, //332 #HANGUL SYLLABLE KIYEOK YU KIYEOK + {0x82E7, 0xADDE}, //333 #HANGUL SYLLABLE KIYEOK YU SSANGKIYEOK + {0x82E8, 0xADDF}, //334 #HANGUL SYLLABLE KIYEOK YU KIYEOKSIOS + {0x82E9, 0xADE1}, //335 #HANGUL SYLLABLE KIYEOK YU NIEUNCIEUC + {0x82EA, 0xADE2}, //336 #HANGUL SYLLABLE KIYEOK YU NIEUNHIEUH + {0x82EB, 0xADE3}, //337 #HANGUL SYLLABLE KIYEOK YU TIKEUT + {0x82EC, 0xADE5}, //338 #HANGUL SYLLABLE KIYEOK YU RIEULKIYEOK + {0x82ED, 0xADE6}, //339 #HANGUL SYLLABLE KIYEOK YU RIEULMIEUM + {0x82EE, 0xADE7}, //340 #HANGUL SYLLABLE KIYEOK YU RIEULPIEUP + {0x82EF, 0xADE8}, //341 #HANGUL SYLLABLE KIYEOK YU RIEULSIOS + {0x82F0, 0xADE9}, //342 #HANGUL SYLLABLE KIYEOK YU RIEULTHIEUTH + {0x82F1, 0xADEA}, //343 #HANGUL SYLLABLE KIYEOK YU RIEULPHIEUPH + {0x82F2, 0xADEB}, //344 #HANGUL SYLLABLE KIYEOK YU RIEULHIEUH + {0x82F3, 0xADEC}, //345 #HANGUL SYLLABLE KIYEOK YU MIEUM + {0x82F4, 0xADED}, //346 #HANGUL SYLLABLE KIYEOK YU PIEUP + {0x82F5, 0xADEE}, //347 #HANGUL SYLLABLE KIYEOK YU PIEUPSIOS + {0x82F6, 0xADEF}, //348 #HANGUL SYLLABLE KIYEOK YU SIOS + {0x82F7, 0xADF0}, //349 #HANGUL SYLLABLE KIYEOK YU SSANGSIOS + {0x82F8, 0xADF1}, //350 #HANGUL SYLLABLE KIYEOK YU IEUNG + {0x82F9, 0xADF2}, //351 #HANGUL SYLLABLE KIYEOK YU CIEUC + {0x82FA, 0xADF3}, //352 #HANGUL SYLLABLE KIYEOK YU CHIEUCH + {0x82FB, 0xADF4}, //353 #HANGUL SYLLABLE KIYEOK YU KHIEUKH + {0x82FC, 0xADF5}, //354 #HANGUL SYLLABLE KIYEOK YU THIEUTH + {0x82FD, 0xADF6}, //355 #HANGUL SYLLABLE KIYEOK YU PHIEUPH + {0x82FE, 0xADF7}, //356 #HANGUL SYLLABLE KIYEOK YU HIEUH + {0x8341, 0xADFA}, //357 #HANGUL SYLLABLE KIYEOK EU SSANGKIYEOK + {0x8342, 0xADFB}, //358 #HANGUL SYLLABLE KIYEOK EU KIYEOKSIOS + {0x8343, 0xADFD}, //359 #HANGUL SYLLABLE KIYEOK EU NIEUNCIEUC + {0x8344, 0xADFE}, //360 #HANGUL SYLLABLE KIYEOK EU NIEUNHIEUH + {0x8345, 0xAE02}, //361 #HANGUL SYLLABLE KIYEOK EU RIEULMIEUM + {0x8346, 0xAE03}, //362 #HANGUL SYLLABLE KIYEOK EU RIEULPIEUP + {0x8347, 0xAE04}, //363 #HANGUL SYLLABLE KIYEOK EU RIEULSIOS + {0x8348, 0xAE05}, //364 #HANGUL SYLLABLE KIYEOK EU RIEULTHIEUTH + {0x8349, 0xAE06}, //365 #HANGUL SYLLABLE KIYEOK EU RIEULPHIEUPH + {0x834A, 0xAE07}, //366 #HANGUL SYLLABLE KIYEOK EU RIEULHIEUH + {0x834B, 0xAE0A}, //367 #HANGUL SYLLABLE KIYEOK EU PIEUPSIOS + {0x834C, 0xAE0C}, //368 #HANGUL SYLLABLE KIYEOK EU SSANGSIOS + {0x834D, 0xAE0E}, //369 #HANGUL SYLLABLE KIYEOK EU CIEUC + {0x834E, 0xAE0F}, //370 #HANGUL SYLLABLE KIYEOK EU CHIEUCH + {0x834F, 0xAE10}, //371 #HANGUL SYLLABLE KIYEOK EU KHIEUKH + {0x8350, 0xAE11}, //372 #HANGUL SYLLABLE KIYEOK EU THIEUTH + {0x8351, 0xAE12}, //373 #HANGUL SYLLABLE KIYEOK EU PHIEUPH + {0x8352, 0xAE13}, //374 #HANGUL SYLLABLE KIYEOK EU HIEUH + {0x8353, 0xAE15}, //375 #HANGUL SYLLABLE KIYEOK YI KIYEOK + {0x8354, 0xAE16}, //376 #HANGUL SYLLABLE KIYEOK YI SSANGKIYEOK + {0x8355, 0xAE17}, //377 #HANGUL SYLLABLE KIYEOK YI KIYEOKSIOS + {0x8356, 0xAE18}, //378 #HANGUL SYLLABLE KIYEOK YI NIEUN + {0x8357, 0xAE19}, //379 #HANGUL SYLLABLE KIYEOK YI NIEUNCIEUC + {0x8358, 0xAE1A}, //380 #HANGUL SYLLABLE KIYEOK YI NIEUNHIEUH + {0x8359, 0xAE1B}, //381 #HANGUL SYLLABLE KIYEOK YI TIKEUT + {0x835A, 0xAE1C}, //382 #HANGUL SYLLABLE KIYEOK YI RIEUL + {0x8361, 0xAE1D}, //383 #HANGUL SYLLABLE KIYEOK YI RIEULKIYEOK + {0x8362, 0xAE1E}, //384 #HANGUL SYLLABLE KIYEOK YI RIEULMIEUM + {0x8363, 0xAE1F}, //385 #HANGUL SYLLABLE KIYEOK YI RIEULPIEUP + {0x8364, 0xAE20}, //386 #HANGUL SYLLABLE KIYEOK YI RIEULSIOS + {0x8365, 0xAE21}, //387 #HANGUL SYLLABLE KIYEOK YI RIEULTHIEUTH + {0x8366, 0xAE22}, //388 #HANGUL SYLLABLE KIYEOK YI RIEULPHIEUPH + {0x8367, 0xAE23}, //389 #HANGUL SYLLABLE KIYEOK YI RIEULHIEUH + {0x8368, 0xAE24}, //390 #HANGUL SYLLABLE KIYEOK YI MIEUM + {0x8369, 0xAE25}, //391 #HANGUL SYLLABLE KIYEOK YI PIEUP + {0x836A, 0xAE26}, //392 #HANGUL SYLLABLE KIYEOK YI PIEUPSIOS + {0x836B, 0xAE27}, //393 #HANGUL SYLLABLE KIYEOK YI SIOS + {0x836C, 0xAE28}, //394 #HANGUL SYLLABLE KIYEOK YI SSANGSIOS + {0x836D, 0xAE29}, //395 #HANGUL SYLLABLE KIYEOK YI IEUNG + {0x836E, 0xAE2A}, //396 #HANGUL SYLLABLE KIYEOK YI CIEUC + {0x836F, 0xAE2B}, //397 #HANGUL SYLLABLE KIYEOK YI CHIEUCH + {0x8370, 0xAE2C}, //398 #HANGUL SYLLABLE KIYEOK YI KHIEUKH + {0x8371, 0xAE2D}, //399 #HANGUL SYLLABLE KIYEOK YI THIEUTH + {0x8372, 0xAE2E}, //400 #HANGUL SYLLABLE KIYEOK YI PHIEUPH + {0x8373, 0xAE2F}, //401 #HANGUL SYLLABLE KIYEOK YI HIEUH + {0x8374, 0xAE32}, //402 #HANGUL SYLLABLE KIYEOK I SSANGKIYEOK + {0x8375, 0xAE33}, //403 #HANGUL SYLLABLE KIYEOK I KIYEOKSIOS + {0x8376, 0xAE35}, //404 #HANGUL SYLLABLE KIYEOK I NIEUNCIEUC + {0x8377, 0xAE36}, //405 #HANGUL SYLLABLE KIYEOK I NIEUNHIEUH + {0x8378, 0xAE39}, //406 #HANGUL SYLLABLE KIYEOK I RIEULKIYEOK + {0x8379, 0xAE3B}, //407 #HANGUL SYLLABLE KIYEOK I RIEULPIEUP + {0x837A, 0xAE3C}, //408 #HANGUL SYLLABLE KIYEOK I RIEULSIOS + {0x8381, 0xAE3D}, //409 #HANGUL SYLLABLE KIYEOK I RIEULTHIEUTH + {0x8382, 0xAE3E}, //410 #HANGUL SYLLABLE KIYEOK I RIEULPHIEUPH + {0x8383, 0xAE3F}, //411 #HANGUL SYLLABLE KIYEOK I RIEULHIEUH + {0x8384, 0xAE42}, //412 #HANGUL SYLLABLE KIYEOK I PIEUPSIOS + {0x8385, 0xAE44}, //413 #HANGUL SYLLABLE KIYEOK I SSANGSIOS + {0x8386, 0xAE47}, //414 #HANGUL SYLLABLE KIYEOK I CHIEUCH + {0x8387, 0xAE48}, //415 #HANGUL SYLLABLE KIYEOK I KHIEUKH + {0x8388, 0xAE49}, //416 #HANGUL SYLLABLE KIYEOK I THIEUTH + {0x8389, 0xAE4B}, //417 #HANGUL SYLLABLE KIYEOK I HIEUH + {0x838A, 0xAE4F}, //418 #HANGUL SYLLABLE SSANGKIYEOK A KIYEOKSIOS + {0x838B, 0xAE51}, //419 #HANGUL SYLLABLE SSANGKIYEOK A NIEUNCIEUC + {0x838C, 0xAE52}, //420 #HANGUL SYLLABLE SSANGKIYEOK A NIEUNHIEUH + {0x838D, 0xAE53}, //421 #HANGUL SYLLABLE SSANGKIYEOK A TIKEUT + {0x838E, 0xAE55}, //422 #HANGUL SYLLABLE SSANGKIYEOK A RIEULKIYEOK + {0x838F, 0xAE57}, //423 #HANGUL SYLLABLE SSANGKIYEOK A RIEULPIEUP + {0x8390, 0xAE58}, //424 #HANGUL SYLLABLE SSANGKIYEOK A RIEULSIOS + {0x8391, 0xAE59}, //425 #HANGUL SYLLABLE SSANGKIYEOK A RIEULTHIEUTH + {0x8392, 0xAE5A}, //426 #HANGUL SYLLABLE SSANGKIYEOK A RIEULPHIEUPH + {0x8393, 0xAE5B}, //427 #HANGUL SYLLABLE SSANGKIYEOK A RIEULHIEUH + {0x8394, 0xAE5E}, //428 #HANGUL SYLLABLE SSANGKIYEOK A PIEUPSIOS + {0x8395, 0xAE62}, //429 #HANGUL SYLLABLE SSANGKIYEOK A CIEUC + {0x8396, 0xAE63}, //430 #HANGUL SYLLABLE SSANGKIYEOK A CHIEUCH + {0x8397, 0xAE64}, //431 #HANGUL SYLLABLE SSANGKIYEOK A KHIEUKH + {0x8398, 0xAE66}, //432 #HANGUL SYLLABLE SSANGKIYEOK A PHIEUPH + {0x8399, 0xAE67}, //433 #HANGUL SYLLABLE SSANGKIYEOK A HIEUH + {0x839A, 0xAE6A}, //434 #HANGUL SYLLABLE SSANGKIYEOK AE SSANGKIYEOK + {0x839B, 0xAE6B}, //435 #HANGUL SYLLABLE SSANGKIYEOK AE KIYEOKSIOS + {0x839C, 0xAE6D}, //436 #HANGUL SYLLABLE SSANGKIYEOK AE NIEUNCIEUC + {0x839D, 0xAE6E}, //437 #HANGUL SYLLABLE SSANGKIYEOK AE NIEUNHIEUH + {0x839E, 0xAE6F}, //438 #HANGUL SYLLABLE SSANGKIYEOK AE TIKEUT + {0x839F, 0xAE71}, //439 #HANGUL SYLLABLE SSANGKIYEOK AE RIEULKIYEOK + {0x83A0, 0xAE72}, //440 #HANGUL SYLLABLE SSANGKIYEOK AE RIEULMIEUM + {0x83A1, 0xAE73}, //441 #HANGUL SYLLABLE SSANGKIYEOK AE RIEULPIEUP + {0x83A2, 0xAE74}, //442 #HANGUL SYLLABLE SSANGKIYEOK AE RIEULSIOS + {0x83A3, 0xAE75}, //443 #HANGUL SYLLABLE SSANGKIYEOK AE RIEULTHIEUTH + {0x83A4, 0xAE76}, //444 #HANGUL SYLLABLE SSANGKIYEOK AE RIEULPHIEUPH + {0x83A5, 0xAE77}, //445 #HANGUL SYLLABLE SSANGKIYEOK AE RIEULHIEUH + {0x83A6, 0xAE7A}, //446 #HANGUL SYLLABLE SSANGKIYEOK AE PIEUPSIOS + {0x83A7, 0xAE7E}, //447 #HANGUL SYLLABLE SSANGKIYEOK AE CIEUC + {0x83A8, 0xAE7F}, //448 #HANGUL SYLLABLE SSANGKIYEOK AE CHIEUCH + {0x83A9, 0xAE80}, //449 #HANGUL SYLLABLE SSANGKIYEOK AE KHIEUKH + {0x83AA, 0xAE81}, //450 #HANGUL SYLLABLE SSANGKIYEOK AE THIEUTH + {0x83AB, 0xAE82}, //451 #HANGUL SYLLABLE SSANGKIYEOK AE PHIEUPH + {0x83AC, 0xAE83}, //452 #HANGUL SYLLABLE SSANGKIYEOK AE HIEUH + {0x83AD, 0xAE86}, //453 #HANGUL SYLLABLE SSANGKIYEOK YA SSANGKIYEOK + {0x83AE, 0xAE87}, //454 #HANGUL SYLLABLE SSANGKIYEOK YA KIYEOKSIOS + {0x83AF, 0xAE88}, //455 #HANGUL SYLLABLE SSANGKIYEOK YA NIEUN + {0x83B0, 0xAE89}, //456 #HANGUL SYLLABLE SSANGKIYEOK YA NIEUNCIEUC + {0x83B1, 0xAE8A}, //457 #HANGUL SYLLABLE SSANGKIYEOK YA NIEUNHIEUH + {0x83B2, 0xAE8B}, //458 #HANGUL SYLLABLE SSANGKIYEOK YA TIKEUT + {0x83B3, 0xAE8D}, //459 #HANGUL SYLLABLE SSANGKIYEOK YA RIEULKIYEOK + {0x83B4, 0xAE8E}, //460 #HANGUL SYLLABLE SSANGKIYEOK YA RIEULMIEUM + {0x83B5, 0xAE8F}, //461 #HANGUL SYLLABLE SSANGKIYEOK YA RIEULPIEUP + {0x83B6, 0xAE90}, //462 #HANGUL SYLLABLE SSANGKIYEOK YA RIEULSIOS + {0x83B7, 0xAE91}, //463 #HANGUL SYLLABLE SSANGKIYEOK YA RIEULTHIEUTH + {0x83B8, 0xAE92}, //464 #HANGUL SYLLABLE SSANGKIYEOK YA RIEULPHIEUPH + {0x83B9, 0xAE93}, //465 #HANGUL SYLLABLE SSANGKIYEOK YA RIEULHIEUH + {0x83BA, 0xAE94}, //466 #HANGUL SYLLABLE SSANGKIYEOK YA MIEUM + {0x83BB, 0xAE95}, //467 #HANGUL SYLLABLE SSANGKIYEOK YA PIEUP + {0x83BC, 0xAE96}, //468 #HANGUL SYLLABLE SSANGKIYEOK YA PIEUPSIOS + {0x83BD, 0xAE97}, //469 #HANGUL SYLLABLE SSANGKIYEOK YA SIOS + {0x83BE, 0xAE98}, //470 #HANGUL SYLLABLE SSANGKIYEOK YA SSANGSIOS + {0x83BF, 0xAE99}, //471 #HANGUL SYLLABLE SSANGKIYEOK YA IEUNG + {0x83C0, 0xAE9A}, //472 #HANGUL SYLLABLE SSANGKIYEOK YA CIEUC + {0x83C1, 0xAE9B}, //473 #HANGUL SYLLABLE SSANGKIYEOK YA CHIEUCH + {0x83C2, 0xAE9C}, //474 #HANGUL SYLLABLE SSANGKIYEOK YA KHIEUKH + {0x83C3, 0xAE9D}, //475 #HANGUL SYLLABLE SSANGKIYEOK YA THIEUTH + {0x83C4, 0xAE9E}, //476 #HANGUL SYLLABLE SSANGKIYEOK YA PHIEUPH + {0x83C5, 0xAE9F}, //477 #HANGUL SYLLABLE SSANGKIYEOK YA HIEUH + {0x83C6, 0xAEA0}, //478 #HANGUL SYLLABLE SSANGKIYEOK YAE + {0x83C7, 0xAEA1}, //479 #HANGUL SYLLABLE SSANGKIYEOK YAE KIYEOK + {0x83C8, 0xAEA2}, //480 #HANGUL SYLLABLE SSANGKIYEOK YAE SSANGKIYEOK + {0x83C9, 0xAEA3}, //481 #HANGUL SYLLABLE SSANGKIYEOK YAE KIYEOKSIOS + {0x83CA, 0xAEA4}, //482 #HANGUL SYLLABLE SSANGKIYEOK YAE NIEUN + {0x83CB, 0xAEA5}, //483 #HANGUL SYLLABLE SSANGKIYEOK YAE NIEUNCIEUC + {0x83CC, 0xAEA6}, //484 #HANGUL SYLLABLE SSANGKIYEOK YAE NIEUNHIEUH + {0x83CD, 0xAEA7}, //485 #HANGUL SYLLABLE SSANGKIYEOK YAE TIKEUT + {0x83CE, 0xAEA8}, //486 #HANGUL SYLLABLE SSANGKIYEOK YAE RIEUL + {0x83CF, 0xAEA9}, //487 #HANGUL SYLLABLE SSANGKIYEOK YAE RIEULKIYEOK + {0x83D0, 0xAEAA}, //488 #HANGUL SYLLABLE SSANGKIYEOK YAE RIEULMIEUM + {0x83D1, 0xAEAB}, //489 #HANGUL SYLLABLE SSANGKIYEOK YAE RIEULPIEUP + {0x83D2, 0xAEAC}, //490 #HANGUL SYLLABLE SSANGKIYEOK YAE RIEULSIOS + {0x83D3, 0xAEAD}, //491 #HANGUL SYLLABLE SSANGKIYEOK YAE RIEULTHIEUTH + {0x83D4, 0xAEAE}, //492 #HANGUL SYLLABLE SSANGKIYEOK YAE RIEULPHIEUPH + {0x83D5, 0xAEAF}, //493 #HANGUL SYLLABLE SSANGKIYEOK YAE RIEULHIEUH + {0x83D6, 0xAEB0}, //494 #HANGUL SYLLABLE SSANGKIYEOK YAE MIEUM + {0x83D7, 0xAEB1}, //495 #HANGUL SYLLABLE SSANGKIYEOK YAE PIEUP + {0x83D8, 0xAEB2}, //496 #HANGUL SYLLABLE SSANGKIYEOK YAE PIEUPSIOS + {0x83D9, 0xAEB3}, //497 #HANGUL SYLLABLE SSANGKIYEOK YAE SIOS + {0x83DA, 0xAEB4}, //498 #HANGUL SYLLABLE SSANGKIYEOK YAE SSANGSIOS + {0x83DB, 0xAEB5}, //499 #HANGUL SYLLABLE SSANGKIYEOK YAE IEUNG + {0x83DC, 0xAEB6}, //500 #HANGUL SYLLABLE SSANGKIYEOK YAE CIEUC + {0x83DD, 0xAEB7}, //501 #HANGUL SYLLABLE SSANGKIYEOK YAE CHIEUCH + {0x83DE, 0xAEB8}, //502 #HANGUL SYLLABLE SSANGKIYEOK YAE KHIEUKH + {0x83DF, 0xAEB9}, //503 #HANGUL SYLLABLE SSANGKIYEOK YAE THIEUTH + {0x83E0, 0xAEBA}, //504 #HANGUL SYLLABLE SSANGKIYEOK YAE PHIEUPH + {0x83E1, 0xAEBB}, //505 #HANGUL SYLLABLE SSANGKIYEOK YAE HIEUH + {0x83E2, 0xAEBF}, //506 #HANGUL SYLLABLE SSANGKIYEOK EO KIYEOKSIOS + {0x83E3, 0xAEC1}, //507 #HANGUL SYLLABLE SSANGKIYEOK EO NIEUNCIEUC + {0x83E4, 0xAEC2}, //508 #HANGUL SYLLABLE SSANGKIYEOK EO NIEUNHIEUH + {0x83E5, 0xAEC3}, //509 #HANGUL SYLLABLE SSANGKIYEOK EO TIKEUT + {0x83E6, 0xAEC5}, //510 #HANGUL SYLLABLE SSANGKIYEOK EO RIEULKIYEOK + {0x83E7, 0xAEC6}, //511 #HANGUL SYLLABLE SSANGKIYEOK EO RIEULMIEUM + {0x83E8, 0xAEC7}, //512 #HANGUL SYLLABLE SSANGKIYEOK EO RIEULPIEUP + {0x83E9, 0xAEC8}, //513 #HANGUL SYLLABLE SSANGKIYEOK EO RIEULSIOS + {0x83EA, 0xAEC9}, //514 #HANGUL SYLLABLE SSANGKIYEOK EO RIEULTHIEUTH + {0x83EB, 0xAECA}, //515 #HANGUL SYLLABLE SSANGKIYEOK EO RIEULPHIEUPH + {0x83EC, 0xAECB}, //516 #HANGUL SYLLABLE SSANGKIYEOK EO RIEULHIEUH + {0x83ED, 0xAECE}, //517 #HANGUL SYLLABLE SSANGKIYEOK EO PIEUPSIOS + {0x83EE, 0xAED2}, //518 #HANGUL SYLLABLE SSANGKIYEOK EO CIEUC + {0x83EF, 0xAED3}, //519 #HANGUL SYLLABLE SSANGKIYEOK EO CHIEUCH + {0x83F0, 0xAED4}, //520 #HANGUL SYLLABLE SSANGKIYEOK EO KHIEUKH + {0x83F1, 0xAED5}, //521 #HANGUL SYLLABLE SSANGKIYEOK EO THIEUTH + {0x83F2, 0xAED6}, //522 #HANGUL SYLLABLE SSANGKIYEOK EO PHIEUPH + {0x83F3, 0xAED7}, //523 #HANGUL SYLLABLE SSANGKIYEOK EO HIEUH + {0x83F4, 0xAEDA}, //524 #HANGUL SYLLABLE SSANGKIYEOK E SSANGKIYEOK + {0x83F5, 0xAEDB}, //525 #HANGUL SYLLABLE SSANGKIYEOK E KIYEOKSIOS + {0x83F6, 0xAEDD}, //526 #HANGUL SYLLABLE SSANGKIYEOK E NIEUNCIEUC + {0x83F7, 0xAEDE}, //527 #HANGUL SYLLABLE SSANGKIYEOK E NIEUNHIEUH + {0x83F8, 0xAEDF}, //528 #HANGUL SYLLABLE SSANGKIYEOK E TIKEUT + {0x83F9, 0xAEE0}, //529 #HANGUL SYLLABLE SSANGKIYEOK E RIEUL + {0x83FA, 0xAEE1}, //530 #HANGUL SYLLABLE SSANGKIYEOK E RIEULKIYEOK + {0x83FB, 0xAEE2}, //531 #HANGUL SYLLABLE SSANGKIYEOK E RIEULMIEUM + {0x83FC, 0xAEE3}, //532 #HANGUL SYLLABLE SSANGKIYEOK E RIEULPIEUP + {0x83FD, 0xAEE4}, //533 #HANGUL SYLLABLE SSANGKIYEOK E RIEULSIOS + {0x83FE, 0xAEE5}, //534 #HANGUL SYLLABLE SSANGKIYEOK E RIEULTHIEUTH + {0x8441, 0xAEE6}, //535 #HANGUL SYLLABLE SSANGKIYEOK E RIEULPHIEUPH + {0x8442, 0xAEE7}, //536 #HANGUL SYLLABLE SSANGKIYEOK E RIEULHIEUH + {0x8443, 0xAEE9}, //537 #HANGUL SYLLABLE SSANGKIYEOK E PIEUP + {0x8444, 0xAEEA}, //538 #HANGUL SYLLABLE SSANGKIYEOK E PIEUPSIOS + {0x8445, 0xAEEC}, //539 #HANGUL SYLLABLE SSANGKIYEOK E SSANGSIOS + {0x8446, 0xAEEE}, //540 #HANGUL SYLLABLE SSANGKIYEOK E CIEUC + {0x8447, 0xAEEF}, //541 #HANGUL SYLLABLE SSANGKIYEOK E CHIEUCH + {0x8448, 0xAEF0}, //542 #HANGUL SYLLABLE SSANGKIYEOK E KHIEUKH + {0x8449, 0xAEF1}, //543 #HANGUL SYLLABLE SSANGKIYEOK E THIEUTH + {0x844A, 0xAEF2}, //544 #HANGUL SYLLABLE SSANGKIYEOK E PHIEUPH + {0x844B, 0xAEF3}, //545 #HANGUL SYLLABLE SSANGKIYEOK E HIEUH + {0x844C, 0xAEF5}, //546 #HANGUL SYLLABLE SSANGKIYEOK YEO KIYEOK + {0x844D, 0xAEF6}, //547 #HANGUL SYLLABLE SSANGKIYEOK YEO SSANGKIYEOK + {0x844E, 0xAEF7}, //548 #HANGUL SYLLABLE SSANGKIYEOK YEO KIYEOKSIOS + {0x844F, 0xAEF9}, //549 #HANGUL SYLLABLE SSANGKIYEOK YEO NIEUNCIEUC + {0x8450, 0xAEFA}, //550 #HANGUL SYLLABLE SSANGKIYEOK YEO NIEUNHIEUH + {0x8451, 0xAEFB}, //551 #HANGUL SYLLABLE SSANGKIYEOK YEO TIKEUT + {0x8452, 0xAEFD}, //552 #HANGUL SYLLABLE SSANGKIYEOK YEO RIEULKIYEOK + {0x8453, 0xAEFE}, //553 #HANGUL SYLLABLE SSANGKIYEOK YEO RIEULMIEUM + {0x8454, 0xAEFF}, //554 #HANGUL SYLLABLE SSANGKIYEOK YEO RIEULPIEUP + {0x8455, 0xAF00}, //555 #HANGUL SYLLABLE SSANGKIYEOK YEO RIEULSIOS + {0x8456, 0xAF01}, //556 #HANGUL SYLLABLE SSANGKIYEOK YEO RIEULTHIEUTH + {0x8457, 0xAF02}, //557 #HANGUL SYLLABLE SSANGKIYEOK YEO RIEULPHIEUPH + {0x8458, 0xAF03}, //558 #HANGUL SYLLABLE SSANGKIYEOK YEO RIEULHIEUH + {0x8459, 0xAF04}, //559 #HANGUL SYLLABLE SSANGKIYEOK YEO MIEUM + {0x845A, 0xAF05}, //560 #HANGUL SYLLABLE SSANGKIYEOK YEO PIEUP + {0x8461, 0xAF06}, //561 #HANGUL SYLLABLE SSANGKIYEOK YEO PIEUPSIOS + {0x8462, 0xAF09}, //562 #HANGUL SYLLABLE SSANGKIYEOK YEO IEUNG + {0x8463, 0xAF0A}, //563 #HANGUL SYLLABLE SSANGKIYEOK YEO CIEUC + {0x8464, 0xAF0B}, //564 #HANGUL SYLLABLE SSANGKIYEOK YEO CHIEUCH + {0x8465, 0xAF0C}, //565 #HANGUL SYLLABLE SSANGKIYEOK YEO KHIEUKH + {0x8466, 0xAF0E}, //566 #HANGUL SYLLABLE SSANGKIYEOK YEO PHIEUPH + {0x8467, 0xAF0F}, //567 #HANGUL SYLLABLE SSANGKIYEOK YEO HIEUH + {0x8468, 0xAF11}, //568 #HANGUL SYLLABLE SSANGKIYEOK YE KIYEOK + {0x8469, 0xAF12}, //569 #HANGUL SYLLABLE SSANGKIYEOK YE SSANGKIYEOK + {0x846A, 0xAF13}, //570 #HANGUL SYLLABLE SSANGKIYEOK YE KIYEOKSIOS + {0x846B, 0xAF14}, //571 #HANGUL SYLLABLE SSANGKIYEOK YE NIEUN + {0x846C, 0xAF15}, //572 #HANGUL SYLLABLE SSANGKIYEOK YE NIEUNCIEUC + {0x846D, 0xAF16}, //573 #HANGUL SYLLABLE SSANGKIYEOK YE NIEUNHIEUH + {0x846E, 0xAF17}, //574 #HANGUL SYLLABLE SSANGKIYEOK YE TIKEUT + {0x846F, 0xAF18}, //575 #HANGUL SYLLABLE SSANGKIYEOK YE RIEUL + {0x8470, 0xAF19}, //576 #HANGUL SYLLABLE SSANGKIYEOK YE RIEULKIYEOK + {0x8471, 0xAF1A}, //577 #HANGUL SYLLABLE SSANGKIYEOK YE RIEULMIEUM + {0x8472, 0xAF1B}, //578 #HANGUL SYLLABLE SSANGKIYEOK YE RIEULPIEUP + {0x8473, 0xAF1C}, //579 #HANGUL SYLLABLE SSANGKIYEOK YE RIEULSIOS + {0x8474, 0xAF1D}, //580 #HANGUL SYLLABLE SSANGKIYEOK YE RIEULTHIEUTH + {0x8475, 0xAF1E}, //581 #HANGUL SYLLABLE SSANGKIYEOK YE RIEULPHIEUPH + {0x8476, 0xAF1F}, //582 #HANGUL SYLLABLE SSANGKIYEOK YE RIEULHIEUH + {0x8477, 0xAF20}, //583 #HANGUL SYLLABLE SSANGKIYEOK YE MIEUM + {0x8478, 0xAF21}, //584 #HANGUL SYLLABLE SSANGKIYEOK YE PIEUP + {0x8479, 0xAF22}, //585 #HANGUL SYLLABLE SSANGKIYEOK YE PIEUPSIOS + {0x847A, 0xAF23}, //586 #HANGUL SYLLABLE SSANGKIYEOK YE SIOS + {0x8481, 0xAF24}, //587 #HANGUL SYLLABLE SSANGKIYEOK YE SSANGSIOS + {0x8482, 0xAF25}, //588 #HANGUL SYLLABLE SSANGKIYEOK YE IEUNG + {0x8483, 0xAF26}, //589 #HANGUL SYLLABLE SSANGKIYEOK YE CIEUC + {0x8484, 0xAF27}, //590 #HANGUL SYLLABLE SSANGKIYEOK YE CHIEUCH + {0x8485, 0xAF28}, //591 #HANGUL SYLLABLE SSANGKIYEOK YE KHIEUKH + {0x8486, 0xAF29}, //592 #HANGUL SYLLABLE SSANGKIYEOK YE THIEUTH + {0x8487, 0xAF2A}, //593 #HANGUL SYLLABLE SSANGKIYEOK YE PHIEUPH + {0x8488, 0xAF2B}, //594 #HANGUL SYLLABLE SSANGKIYEOK YE HIEUH + {0x8489, 0xAF2E}, //595 #HANGUL SYLLABLE SSANGKIYEOK O SSANGKIYEOK + {0x848A, 0xAF2F}, //596 #HANGUL SYLLABLE SSANGKIYEOK O KIYEOKSIOS + {0x848B, 0xAF31}, //597 #HANGUL SYLLABLE SSANGKIYEOK O NIEUNCIEUC + {0x848C, 0xAF33}, //598 #HANGUL SYLLABLE SSANGKIYEOK O TIKEUT + {0x848D, 0xAF35}, //599 #HANGUL SYLLABLE SSANGKIYEOK O RIEULKIYEOK + {0x848E, 0xAF36}, //600 #HANGUL SYLLABLE SSANGKIYEOK O RIEULMIEUM + {0x848F, 0xAF37}, //601 #HANGUL SYLLABLE SSANGKIYEOK O RIEULPIEUP + {0x8490, 0xAF38}, //602 #HANGUL SYLLABLE SSANGKIYEOK O RIEULSIOS + {0x8491, 0xAF39}, //603 #HANGUL SYLLABLE SSANGKIYEOK O RIEULTHIEUTH + {0x8492, 0xAF3A}, //604 #HANGUL SYLLABLE SSANGKIYEOK O RIEULPHIEUPH + {0x8493, 0xAF3B}, //605 #HANGUL SYLLABLE SSANGKIYEOK O RIEULHIEUH + {0x8494, 0xAF3E}, //606 #HANGUL SYLLABLE SSANGKIYEOK O PIEUPSIOS + {0x8495, 0xAF40}, //607 #HANGUL SYLLABLE SSANGKIYEOK O SSANGSIOS + {0x8496, 0xAF44}, //608 #HANGUL SYLLABLE SSANGKIYEOK O KHIEUKH + {0x8497, 0xAF45}, //609 #HANGUL SYLLABLE SSANGKIYEOK O THIEUTH + {0x8498, 0xAF46}, //610 #HANGUL SYLLABLE SSANGKIYEOK O PHIEUPH + {0x8499, 0xAF47}, //611 #HANGUL SYLLABLE SSANGKIYEOK O HIEUH + {0x849A, 0xAF4A}, //612 #HANGUL SYLLABLE SSANGKIYEOK WA SSANGKIYEOK + {0x849B, 0xAF4B}, //613 #HANGUL SYLLABLE SSANGKIYEOK WA KIYEOKSIOS + {0x849C, 0xAF4C}, //614 #HANGUL SYLLABLE SSANGKIYEOK WA NIEUN + {0x849D, 0xAF4D}, //615 #HANGUL SYLLABLE SSANGKIYEOK WA NIEUNCIEUC + {0x849E, 0xAF4E}, //616 #HANGUL SYLLABLE SSANGKIYEOK WA NIEUNHIEUH + {0x849F, 0xAF4F}, //617 #HANGUL SYLLABLE SSANGKIYEOK WA TIKEUT + {0x84A0, 0xAF51}, //618 #HANGUL SYLLABLE SSANGKIYEOK WA RIEULKIYEOK + {0x84A1, 0xAF52}, //619 #HANGUL SYLLABLE SSANGKIYEOK WA RIEULMIEUM + {0x84A2, 0xAF53}, //620 #HANGUL SYLLABLE SSANGKIYEOK WA RIEULPIEUP + {0x84A3, 0xAF54}, //621 #HANGUL SYLLABLE SSANGKIYEOK WA RIEULSIOS + {0x84A4, 0xAF55}, //622 #HANGUL SYLLABLE SSANGKIYEOK WA RIEULTHIEUTH + {0x84A5, 0xAF56}, //623 #HANGUL SYLLABLE SSANGKIYEOK WA RIEULPHIEUPH + {0x84A6, 0xAF57}, //624 #HANGUL SYLLABLE SSANGKIYEOK WA RIEULHIEUH + {0x84A7, 0xAF58}, //625 #HANGUL SYLLABLE SSANGKIYEOK WA MIEUM + {0x84A8, 0xAF59}, //626 #HANGUL SYLLABLE SSANGKIYEOK WA PIEUP + {0x84A9, 0xAF5A}, //627 #HANGUL SYLLABLE SSANGKIYEOK WA PIEUPSIOS + {0x84AA, 0xAF5B}, //628 #HANGUL SYLLABLE SSANGKIYEOK WA SIOS + {0x84AB, 0xAF5E}, //629 #HANGUL SYLLABLE SSANGKIYEOK WA CIEUC + {0x84AC, 0xAF5F}, //630 #HANGUL SYLLABLE SSANGKIYEOK WA CHIEUCH + {0x84AD, 0xAF60}, //631 #HANGUL SYLLABLE SSANGKIYEOK WA KHIEUKH + {0x84AE, 0xAF61}, //632 #HANGUL SYLLABLE SSANGKIYEOK WA THIEUTH + {0x84AF, 0xAF62}, //633 #HANGUL SYLLABLE SSANGKIYEOK WA PHIEUPH + {0x84B0, 0xAF63}, //634 #HANGUL SYLLABLE SSANGKIYEOK WA HIEUH + {0x84B1, 0xAF66}, //635 #HANGUL SYLLABLE SSANGKIYEOK WAE SSANGKIYEOK + {0x84B2, 0xAF67}, //636 #HANGUL SYLLABLE SSANGKIYEOK WAE KIYEOKSIOS + {0x84B3, 0xAF68}, //637 #HANGUL SYLLABLE SSANGKIYEOK WAE NIEUN + {0x84B4, 0xAF69}, //638 #HANGUL SYLLABLE SSANGKIYEOK WAE NIEUNCIEUC + {0x84B5, 0xAF6A}, //639 #HANGUL SYLLABLE SSANGKIYEOK WAE NIEUNHIEUH + {0x84B6, 0xAF6B}, //640 #HANGUL SYLLABLE SSANGKIYEOK WAE TIKEUT + {0x84B7, 0xAF6C}, //641 #HANGUL SYLLABLE SSANGKIYEOK WAE RIEUL + {0x84B8, 0xAF6D}, //642 #HANGUL SYLLABLE SSANGKIYEOK WAE RIEULKIYEOK + {0x84B9, 0xAF6E}, //643 #HANGUL SYLLABLE SSANGKIYEOK WAE RIEULMIEUM + {0x84BA, 0xAF6F}, //644 #HANGUL SYLLABLE SSANGKIYEOK WAE RIEULPIEUP + {0x84BB, 0xAF70}, //645 #HANGUL SYLLABLE SSANGKIYEOK WAE RIEULSIOS + {0x84BC, 0xAF71}, //646 #HANGUL SYLLABLE SSANGKIYEOK WAE RIEULTHIEUTH + {0x84BD, 0xAF72}, //647 #HANGUL SYLLABLE SSANGKIYEOK WAE RIEULPHIEUPH + {0x84BE, 0xAF73}, //648 #HANGUL SYLLABLE SSANGKIYEOK WAE RIEULHIEUH + {0x84BF, 0xAF74}, //649 #HANGUL SYLLABLE SSANGKIYEOK WAE MIEUM + {0x84C0, 0xAF75}, //650 #HANGUL SYLLABLE SSANGKIYEOK WAE PIEUP + {0x84C1, 0xAF76}, //651 #HANGUL SYLLABLE SSANGKIYEOK WAE PIEUPSIOS + {0x84C2, 0xAF77}, //652 #HANGUL SYLLABLE SSANGKIYEOK WAE SIOS + {0x84C3, 0xAF78}, //653 #HANGUL SYLLABLE SSANGKIYEOK WAE SSANGSIOS + {0x84C4, 0xAF7A}, //654 #HANGUL SYLLABLE SSANGKIYEOK WAE CIEUC + {0x84C5, 0xAF7B}, //655 #HANGUL SYLLABLE SSANGKIYEOK WAE CHIEUCH + {0x84C6, 0xAF7C}, //656 #HANGUL SYLLABLE SSANGKIYEOK WAE KHIEUKH + {0x84C7, 0xAF7D}, //657 #HANGUL SYLLABLE SSANGKIYEOK WAE THIEUTH + {0x84C8, 0xAF7E}, //658 #HANGUL SYLLABLE SSANGKIYEOK WAE PHIEUPH + {0x84C9, 0xAF7F}, //659 #HANGUL SYLLABLE SSANGKIYEOK WAE HIEUH + {0x84CA, 0xAF81}, //660 #HANGUL SYLLABLE SSANGKIYEOK OE KIYEOK + {0x84CB, 0xAF82}, //661 #HANGUL SYLLABLE SSANGKIYEOK OE SSANGKIYEOK + {0x84CC, 0xAF83}, //662 #HANGUL SYLLABLE SSANGKIYEOK OE KIYEOKSIOS + {0x84CD, 0xAF85}, //663 #HANGUL SYLLABLE SSANGKIYEOK OE NIEUNCIEUC + {0x84CE, 0xAF86}, //664 #HANGUL SYLLABLE SSANGKIYEOK OE NIEUNHIEUH + {0x84CF, 0xAF87}, //665 #HANGUL SYLLABLE SSANGKIYEOK OE TIKEUT + {0x84D0, 0xAF89}, //666 #HANGUL SYLLABLE SSANGKIYEOK OE RIEULKIYEOK + {0x84D1, 0xAF8A}, //667 #HANGUL SYLLABLE SSANGKIYEOK OE RIEULMIEUM + {0x84D2, 0xAF8B}, //668 #HANGUL SYLLABLE SSANGKIYEOK OE RIEULPIEUP + {0x84D3, 0xAF8C}, //669 #HANGUL SYLLABLE SSANGKIYEOK OE RIEULSIOS + {0x84D4, 0xAF8D}, //670 #HANGUL SYLLABLE SSANGKIYEOK OE RIEULTHIEUTH + {0x84D5, 0xAF8E}, //671 #HANGUL SYLLABLE SSANGKIYEOK OE RIEULPHIEUPH + {0x84D6, 0xAF8F}, //672 #HANGUL SYLLABLE SSANGKIYEOK OE RIEULHIEUH + {0x84D7, 0xAF92}, //673 #HANGUL SYLLABLE SSANGKIYEOK OE PIEUPSIOS + {0x84D8, 0xAF93}, //674 #HANGUL SYLLABLE SSANGKIYEOK OE SIOS + {0x84D9, 0xAF94}, //675 #HANGUL SYLLABLE SSANGKIYEOK OE SSANGSIOS + {0x84DA, 0xAF96}, //676 #HANGUL SYLLABLE SSANGKIYEOK OE CIEUC + {0x84DB, 0xAF97}, //677 #HANGUL SYLLABLE SSANGKIYEOK OE CHIEUCH + {0x84DC, 0xAF98}, //678 #HANGUL SYLLABLE SSANGKIYEOK OE KHIEUKH + {0x84DD, 0xAF99}, //679 #HANGUL SYLLABLE SSANGKIYEOK OE THIEUTH + {0x84DE, 0xAF9A}, //680 #HANGUL SYLLABLE SSANGKIYEOK OE PHIEUPH + {0x84DF, 0xAF9B}, //681 #HANGUL SYLLABLE SSANGKIYEOK OE HIEUH + {0x84E0, 0xAF9D}, //682 #HANGUL SYLLABLE SSANGKIYEOK YO KIYEOK + {0x84E1, 0xAF9E}, //683 #HANGUL SYLLABLE SSANGKIYEOK YO SSANGKIYEOK + {0x84E2, 0xAF9F}, //684 #HANGUL SYLLABLE SSANGKIYEOK YO KIYEOKSIOS + {0x84E3, 0xAFA0}, //685 #HANGUL SYLLABLE SSANGKIYEOK YO NIEUN + {0x84E4, 0xAFA1}, //686 #HANGUL SYLLABLE SSANGKIYEOK YO NIEUNCIEUC + {0x84E5, 0xAFA2}, //687 #HANGUL SYLLABLE SSANGKIYEOK YO NIEUNHIEUH + {0x84E6, 0xAFA3}, //688 #HANGUL SYLLABLE SSANGKIYEOK YO TIKEUT + {0x84E7, 0xAFA4}, //689 #HANGUL SYLLABLE SSANGKIYEOK YO RIEUL + {0x84E8, 0xAFA5}, //690 #HANGUL SYLLABLE SSANGKIYEOK YO RIEULKIYEOK + {0x84E9, 0xAFA6}, //691 #HANGUL SYLLABLE SSANGKIYEOK YO RIEULMIEUM + {0x84EA, 0xAFA7}, //692 #HANGUL SYLLABLE SSANGKIYEOK YO RIEULPIEUP + {0x84EB, 0xAFA8}, //693 #HANGUL SYLLABLE SSANGKIYEOK YO RIEULSIOS + {0x84EC, 0xAFA9}, //694 #HANGUL SYLLABLE SSANGKIYEOK YO RIEULTHIEUTH + {0x84ED, 0xAFAA}, //695 #HANGUL SYLLABLE SSANGKIYEOK YO RIEULPHIEUPH + {0x84EE, 0xAFAB}, //696 #HANGUL SYLLABLE SSANGKIYEOK YO RIEULHIEUH + {0x84EF, 0xAFAC}, //697 #HANGUL SYLLABLE SSANGKIYEOK YO MIEUM + {0x84F0, 0xAFAD}, //698 #HANGUL SYLLABLE SSANGKIYEOK YO PIEUP + {0x84F1, 0xAFAE}, //699 #HANGUL SYLLABLE SSANGKIYEOK YO PIEUPSIOS + {0x84F2, 0xAFAF}, //700 #HANGUL SYLLABLE SSANGKIYEOK YO SIOS + {0x84F3, 0xAFB0}, //701 #HANGUL SYLLABLE SSANGKIYEOK YO SSANGSIOS + {0x84F4, 0xAFB1}, //702 #HANGUL SYLLABLE SSANGKIYEOK YO IEUNG + {0x84F5, 0xAFB2}, //703 #HANGUL SYLLABLE SSANGKIYEOK YO CIEUC + {0x84F6, 0xAFB3}, //704 #HANGUL SYLLABLE SSANGKIYEOK YO CHIEUCH + {0x84F7, 0xAFB4}, //705 #HANGUL SYLLABLE SSANGKIYEOK YO KHIEUKH + {0x84F8, 0xAFB5}, //706 #HANGUL SYLLABLE SSANGKIYEOK YO THIEUTH + {0x84F9, 0xAFB6}, //707 #HANGUL SYLLABLE SSANGKIYEOK YO PHIEUPH + {0x84FA, 0xAFB7}, //708 #HANGUL SYLLABLE SSANGKIYEOK YO HIEUH + {0x84FB, 0xAFBA}, //709 #HANGUL SYLLABLE SSANGKIYEOK U SSANGKIYEOK + {0x84FC, 0xAFBB}, //710 #HANGUL SYLLABLE SSANGKIYEOK U KIYEOKSIOS + {0x84FD, 0xAFBD}, //711 #HANGUL SYLLABLE SSANGKIYEOK U NIEUNCIEUC + {0x84FE, 0xAFBE}, //712 #HANGUL SYLLABLE SSANGKIYEOK U NIEUNHIEUH + {0x8541, 0xAFBF}, //713 #HANGUL SYLLABLE SSANGKIYEOK U TIKEUT + {0x8542, 0xAFC1}, //714 #HANGUL SYLLABLE SSANGKIYEOK U RIEULKIYEOK + {0x8543, 0xAFC2}, //715 #HANGUL SYLLABLE SSANGKIYEOK U RIEULMIEUM + {0x8544, 0xAFC3}, //716 #HANGUL SYLLABLE SSANGKIYEOK U RIEULPIEUP + {0x8545, 0xAFC4}, //717 #HANGUL SYLLABLE SSANGKIYEOK U RIEULSIOS + {0x8546, 0xAFC5}, //718 #HANGUL SYLLABLE SSANGKIYEOK U RIEULTHIEUTH + {0x8547, 0xAFC6}, //719 #HANGUL SYLLABLE SSANGKIYEOK U RIEULPHIEUPH + {0x8548, 0xAFCA}, //720 #HANGUL SYLLABLE SSANGKIYEOK U PIEUPSIOS + {0x8549, 0xAFCC}, //721 #HANGUL SYLLABLE SSANGKIYEOK U SSANGSIOS + {0x854A, 0xAFCF}, //722 #HANGUL SYLLABLE SSANGKIYEOK U CHIEUCH + {0x854B, 0xAFD0}, //723 #HANGUL SYLLABLE SSANGKIYEOK U KHIEUKH + {0x854C, 0xAFD1}, //724 #HANGUL SYLLABLE SSANGKIYEOK U THIEUTH + {0x854D, 0xAFD2}, //725 #HANGUL SYLLABLE SSANGKIYEOK U PHIEUPH + {0x854E, 0xAFD3}, //726 #HANGUL SYLLABLE SSANGKIYEOK U HIEUH + {0x854F, 0xAFD5}, //727 #HANGUL SYLLABLE SSANGKIYEOK WEO KIYEOK + {0x8550, 0xAFD6}, //728 #HANGUL SYLLABLE SSANGKIYEOK WEO SSANGKIYEOK + {0x8551, 0xAFD7}, //729 #HANGUL SYLLABLE SSANGKIYEOK WEO KIYEOKSIOS + {0x8552, 0xAFD8}, //730 #HANGUL SYLLABLE SSANGKIYEOK WEO NIEUN + {0x8553, 0xAFD9}, //731 #HANGUL SYLLABLE SSANGKIYEOK WEO NIEUNCIEUC + {0x8554, 0xAFDA}, //732 #HANGUL SYLLABLE SSANGKIYEOK WEO NIEUNHIEUH + {0x8555, 0xAFDB}, //733 #HANGUL SYLLABLE SSANGKIYEOK WEO TIKEUT + {0x8556, 0xAFDD}, //734 #HANGUL SYLLABLE SSANGKIYEOK WEO RIEULKIYEOK + {0x8557, 0xAFDE}, //735 #HANGUL SYLLABLE SSANGKIYEOK WEO RIEULMIEUM + {0x8558, 0xAFDF}, //736 #HANGUL SYLLABLE SSANGKIYEOK WEO RIEULPIEUP + {0x8559, 0xAFE0}, //737 #HANGUL SYLLABLE SSANGKIYEOK WEO RIEULSIOS + {0x855A, 0xAFE1}, //738 #HANGUL SYLLABLE SSANGKIYEOK WEO RIEULTHIEUTH + {0x8561, 0xAFE2}, //739 #HANGUL SYLLABLE SSANGKIYEOK WEO RIEULPHIEUPH + {0x8562, 0xAFE3}, //740 #HANGUL SYLLABLE SSANGKIYEOK WEO RIEULHIEUH + {0x8563, 0xAFE4}, //741 #HANGUL SYLLABLE SSANGKIYEOK WEO MIEUM + {0x8564, 0xAFE5}, //742 #HANGUL SYLLABLE SSANGKIYEOK WEO PIEUP + {0x8565, 0xAFE6}, //743 #HANGUL SYLLABLE SSANGKIYEOK WEO PIEUPSIOS + {0x8566, 0xAFE7}, //744 #HANGUL SYLLABLE SSANGKIYEOK WEO SIOS + {0x8567, 0xAFEA}, //745 #HANGUL SYLLABLE SSANGKIYEOK WEO CIEUC + {0x8568, 0xAFEB}, //746 #HANGUL SYLLABLE SSANGKIYEOK WEO CHIEUCH + {0x8569, 0xAFEC}, //747 #HANGUL SYLLABLE SSANGKIYEOK WEO KHIEUKH + {0x856A, 0xAFED}, //748 #HANGUL SYLLABLE SSANGKIYEOK WEO THIEUTH + {0x856B, 0xAFEE}, //749 #HANGUL SYLLABLE SSANGKIYEOK WEO PHIEUPH + {0x856C, 0xAFEF}, //750 #HANGUL SYLLABLE SSANGKIYEOK WEO HIEUH + {0x856D, 0xAFF2}, //751 #HANGUL SYLLABLE SSANGKIYEOK WE SSANGKIYEOK + {0x856E, 0xAFF3}, //752 #HANGUL SYLLABLE SSANGKIYEOK WE KIYEOKSIOS + {0x856F, 0xAFF5}, //753 #HANGUL SYLLABLE SSANGKIYEOK WE NIEUNCIEUC + {0x8570, 0xAFF6}, //754 #HANGUL SYLLABLE SSANGKIYEOK WE NIEUNHIEUH + {0x8571, 0xAFF7}, //755 #HANGUL SYLLABLE SSANGKIYEOK WE TIKEUT + {0x8572, 0xAFF9}, //756 #HANGUL SYLLABLE SSANGKIYEOK WE RIEULKIYEOK + {0x8573, 0xAFFA}, //757 #HANGUL SYLLABLE SSANGKIYEOK WE RIEULMIEUM + {0x8574, 0xAFFB}, //758 #HANGUL SYLLABLE SSANGKIYEOK WE RIEULPIEUP + {0x8575, 0xAFFC}, //759 #HANGUL SYLLABLE SSANGKIYEOK WE RIEULSIOS + {0x8576, 0xAFFD}, //760 #HANGUL SYLLABLE SSANGKIYEOK WE RIEULTHIEUTH + {0x8577, 0xAFFE}, //761 #HANGUL SYLLABLE SSANGKIYEOK WE RIEULPHIEUPH + {0x8578, 0xAFFF}, //762 #HANGUL SYLLABLE SSANGKIYEOK WE RIEULHIEUH + {0x8579, 0xB002}, //763 #HANGUL SYLLABLE SSANGKIYEOK WE PIEUPSIOS + {0x857A, 0xB003}, //764 #HANGUL SYLLABLE SSANGKIYEOK WE SIOS + {0x8581, 0xB005}, //765 #HANGUL SYLLABLE SSANGKIYEOK WE IEUNG + {0x8582, 0xB006}, //766 #HANGUL SYLLABLE SSANGKIYEOK WE CIEUC + {0x8583, 0xB007}, //767 #HANGUL SYLLABLE SSANGKIYEOK WE CHIEUCH + {0x8584, 0xB008}, //768 #HANGUL SYLLABLE SSANGKIYEOK WE KHIEUKH + {0x8585, 0xB009}, //769 #HANGUL SYLLABLE SSANGKIYEOK WE THIEUTH + {0x8586, 0xB00A}, //770 #HANGUL SYLLABLE SSANGKIYEOK WE PHIEUPH + {0x8587, 0xB00B}, //771 #HANGUL SYLLABLE SSANGKIYEOK WE HIEUH + {0x8588, 0xB00D}, //772 #HANGUL SYLLABLE SSANGKIYEOK WI KIYEOK + {0x8589, 0xB00E}, //773 #HANGUL SYLLABLE SSANGKIYEOK WI SSANGKIYEOK + {0x858A, 0xB00F}, //774 #HANGUL SYLLABLE SSANGKIYEOK WI KIYEOKSIOS + {0x858B, 0xB011}, //775 #HANGUL SYLLABLE SSANGKIYEOK WI NIEUNCIEUC + {0x858C, 0xB012}, //776 #HANGUL SYLLABLE SSANGKIYEOK WI NIEUNHIEUH + {0x858D, 0xB013}, //777 #HANGUL SYLLABLE SSANGKIYEOK WI TIKEUT + {0x858E, 0xB015}, //778 #HANGUL SYLLABLE SSANGKIYEOK WI RIEULKIYEOK + {0x858F, 0xB016}, //779 #HANGUL SYLLABLE SSANGKIYEOK WI RIEULMIEUM + {0x8590, 0xB017}, //780 #HANGUL SYLLABLE SSANGKIYEOK WI RIEULPIEUP + {0x8591, 0xB018}, //781 #HANGUL SYLLABLE SSANGKIYEOK WI RIEULSIOS + {0x8592, 0xB019}, //782 #HANGUL SYLLABLE SSANGKIYEOK WI RIEULTHIEUTH + {0x8593, 0xB01A}, //783 #HANGUL SYLLABLE SSANGKIYEOK WI RIEULPHIEUPH + {0x8594, 0xB01B}, //784 #HANGUL SYLLABLE SSANGKIYEOK WI RIEULHIEUH + {0x8595, 0xB01E}, //785 #HANGUL SYLLABLE SSANGKIYEOK WI PIEUPSIOS + {0x8596, 0xB01F}, //786 #HANGUL SYLLABLE SSANGKIYEOK WI SIOS + {0x8597, 0xB020}, //787 #HANGUL SYLLABLE SSANGKIYEOK WI SSANGSIOS + {0x8598, 0xB021}, //788 #HANGUL SYLLABLE SSANGKIYEOK WI IEUNG + {0x8599, 0xB022}, //789 #HANGUL SYLLABLE SSANGKIYEOK WI CIEUC + {0x859A, 0xB023}, //790 #HANGUL SYLLABLE SSANGKIYEOK WI CHIEUCH + {0x859B, 0xB024}, //791 #HANGUL SYLLABLE SSANGKIYEOK WI KHIEUKH + {0x859C, 0xB025}, //792 #HANGUL SYLLABLE SSANGKIYEOK WI THIEUTH + {0x859D, 0xB026}, //793 #HANGUL SYLLABLE SSANGKIYEOK WI PHIEUPH + {0x859E, 0xB027}, //794 #HANGUL SYLLABLE SSANGKIYEOK WI HIEUH + {0x859F, 0xB029}, //795 #HANGUL SYLLABLE SSANGKIYEOK YU KIYEOK + {0x85A0, 0xB02A}, //796 #HANGUL SYLLABLE SSANGKIYEOK YU SSANGKIYEOK + {0x85A1, 0xB02B}, //797 #HANGUL SYLLABLE SSANGKIYEOK YU KIYEOKSIOS + {0x85A2, 0xB02C}, //798 #HANGUL SYLLABLE SSANGKIYEOK YU NIEUN + {0x85A3, 0xB02D}, //799 #HANGUL SYLLABLE SSANGKIYEOK YU NIEUNCIEUC + {0x85A4, 0xB02E}, //800 #HANGUL SYLLABLE SSANGKIYEOK YU NIEUNHIEUH + {0x85A5, 0xB02F}, //801 #HANGUL SYLLABLE SSANGKIYEOK YU TIKEUT + {0x85A6, 0xB030}, //802 #HANGUL SYLLABLE SSANGKIYEOK YU RIEUL + {0x85A7, 0xB031}, //803 #HANGUL SYLLABLE SSANGKIYEOK YU RIEULKIYEOK + {0x85A8, 0xB032}, //804 #HANGUL SYLLABLE SSANGKIYEOK YU RIEULMIEUM + {0x85A9, 0xB033}, //805 #HANGUL SYLLABLE SSANGKIYEOK YU RIEULPIEUP + {0x85AA, 0xB034}, //806 #HANGUL SYLLABLE SSANGKIYEOK YU RIEULSIOS + {0x85AB, 0xB035}, //807 #HANGUL SYLLABLE SSANGKIYEOK YU RIEULTHIEUTH + {0x85AC, 0xB036}, //808 #HANGUL SYLLABLE SSANGKIYEOK YU RIEULPHIEUPH + {0x85AD, 0xB037}, //809 #HANGUL SYLLABLE SSANGKIYEOK YU RIEULHIEUH + {0x85AE, 0xB038}, //810 #HANGUL SYLLABLE SSANGKIYEOK YU MIEUM + {0x85AF, 0xB039}, //811 #HANGUL SYLLABLE SSANGKIYEOK YU PIEUP + {0x85B0, 0xB03A}, //812 #HANGUL SYLLABLE SSANGKIYEOK YU PIEUPSIOS + {0x85B1, 0xB03B}, //813 #HANGUL SYLLABLE SSANGKIYEOK YU SIOS + {0x85B2, 0xB03C}, //814 #HANGUL SYLLABLE SSANGKIYEOK YU SSANGSIOS + {0x85B3, 0xB03D}, //815 #HANGUL SYLLABLE SSANGKIYEOK YU IEUNG + {0x85B4, 0xB03E}, //816 #HANGUL SYLLABLE SSANGKIYEOK YU CIEUC + {0x85B5, 0xB03F}, //817 #HANGUL SYLLABLE SSANGKIYEOK YU CHIEUCH + {0x85B6, 0xB040}, //818 #HANGUL SYLLABLE SSANGKIYEOK YU KHIEUKH + {0x85B7, 0xB041}, //819 #HANGUL SYLLABLE SSANGKIYEOK YU THIEUTH + {0x85B8, 0xB042}, //820 #HANGUL SYLLABLE SSANGKIYEOK YU PHIEUPH + {0x85B9, 0xB043}, //821 #HANGUL SYLLABLE SSANGKIYEOK YU HIEUH + {0x85BA, 0xB046}, //822 #HANGUL SYLLABLE SSANGKIYEOK EU SSANGKIYEOK + {0x85BB, 0xB047}, //823 #HANGUL SYLLABLE SSANGKIYEOK EU KIYEOKSIOS + {0x85BC, 0xB049}, //824 #HANGUL SYLLABLE SSANGKIYEOK EU NIEUNCIEUC + {0x85BD, 0xB04B}, //825 #HANGUL SYLLABLE SSANGKIYEOK EU TIKEUT + {0x85BE, 0xB04D}, //826 #HANGUL SYLLABLE SSANGKIYEOK EU RIEULKIYEOK + {0x85BF, 0xB04F}, //827 #HANGUL SYLLABLE SSANGKIYEOK EU RIEULPIEUP + {0x85C0, 0xB050}, //828 #HANGUL SYLLABLE SSANGKIYEOK EU RIEULSIOS + {0x85C1, 0xB051}, //829 #HANGUL SYLLABLE SSANGKIYEOK EU RIEULTHIEUTH + {0x85C2, 0xB052}, //830 #HANGUL SYLLABLE SSANGKIYEOK EU RIEULPHIEUPH + {0x85C3, 0xB056}, //831 #HANGUL SYLLABLE SSANGKIYEOK EU PIEUPSIOS + {0x85C4, 0xB058}, //832 #HANGUL SYLLABLE SSANGKIYEOK EU SSANGSIOS + {0x85C5, 0xB05A}, //833 #HANGUL SYLLABLE SSANGKIYEOK EU CIEUC + {0x85C6, 0xB05B}, //834 #HANGUL SYLLABLE SSANGKIYEOK EU CHIEUCH + {0x85C7, 0xB05C}, //835 #HANGUL SYLLABLE SSANGKIYEOK EU KHIEUKH + {0x85C8, 0xB05E}, //836 #HANGUL SYLLABLE SSANGKIYEOK EU PHIEUPH + {0x85C9, 0xB05F}, //837 #HANGUL SYLLABLE SSANGKIYEOK EU HIEUH + {0x85CA, 0xB060}, //838 #HANGUL SYLLABLE SSANGKIYEOK YI + {0x85CB, 0xB061}, //839 #HANGUL SYLLABLE SSANGKIYEOK YI KIYEOK + {0x85CC, 0xB062}, //840 #HANGUL SYLLABLE SSANGKIYEOK YI SSANGKIYEOK + {0x85CD, 0xB063}, //841 #HANGUL SYLLABLE SSANGKIYEOK YI KIYEOKSIOS + {0x85CE, 0xB064}, //842 #HANGUL SYLLABLE SSANGKIYEOK YI NIEUN + {0x85CF, 0xB065}, //843 #HANGUL SYLLABLE SSANGKIYEOK YI NIEUNCIEUC + {0x85D0, 0xB066}, //844 #HANGUL SYLLABLE SSANGKIYEOK YI NIEUNHIEUH + {0x85D1, 0xB067}, //845 #HANGUL SYLLABLE SSANGKIYEOK YI TIKEUT + {0x85D2, 0xB068}, //846 #HANGUL SYLLABLE SSANGKIYEOK YI RIEUL + {0x85D3, 0xB069}, //847 #HANGUL SYLLABLE SSANGKIYEOK YI RIEULKIYEOK + {0x85D4, 0xB06A}, //848 #HANGUL SYLLABLE SSANGKIYEOK YI RIEULMIEUM + {0x85D5, 0xB06B}, //849 #HANGUL SYLLABLE SSANGKIYEOK YI RIEULPIEUP + {0x85D6, 0xB06C}, //850 #HANGUL SYLLABLE SSANGKIYEOK YI RIEULSIOS + {0x85D7, 0xB06D}, //851 #HANGUL SYLLABLE SSANGKIYEOK YI RIEULTHIEUTH + {0x85D8, 0xB06E}, //852 #HANGUL SYLLABLE SSANGKIYEOK YI RIEULPHIEUPH + {0x85D9, 0xB06F}, //853 #HANGUL SYLLABLE SSANGKIYEOK YI RIEULHIEUH + {0x85DA, 0xB070}, //854 #HANGUL SYLLABLE SSANGKIYEOK YI MIEUM + {0x85DB, 0xB071}, //855 #HANGUL SYLLABLE SSANGKIYEOK YI PIEUP + {0x85DC, 0xB072}, //856 #HANGUL SYLLABLE SSANGKIYEOK YI PIEUPSIOS + {0x85DD, 0xB073}, //857 #HANGUL SYLLABLE SSANGKIYEOK YI SIOS + {0x85DE, 0xB074}, //858 #HANGUL SYLLABLE SSANGKIYEOK YI SSANGSIOS + {0x85DF, 0xB075}, //859 #HANGUL SYLLABLE SSANGKIYEOK YI IEUNG + {0x85E0, 0xB076}, //860 #HANGUL SYLLABLE SSANGKIYEOK YI CIEUC + {0x85E1, 0xB077}, //861 #HANGUL SYLLABLE SSANGKIYEOK YI CHIEUCH + {0x85E2, 0xB078}, //862 #HANGUL SYLLABLE SSANGKIYEOK YI KHIEUKH + {0x85E3, 0xB079}, //863 #HANGUL SYLLABLE SSANGKIYEOK YI THIEUTH + {0x85E4, 0xB07A}, //864 #HANGUL SYLLABLE SSANGKIYEOK YI PHIEUPH + {0x85E5, 0xB07B}, //865 #HANGUL SYLLABLE SSANGKIYEOK YI HIEUH + {0x85E6, 0xB07E}, //866 #HANGUL SYLLABLE SSANGKIYEOK I SSANGKIYEOK + {0x85E7, 0xB07F}, //867 #HANGUL SYLLABLE SSANGKIYEOK I KIYEOKSIOS + {0x85E8, 0xB081}, //868 #HANGUL SYLLABLE SSANGKIYEOK I NIEUNCIEUC + {0x85E9, 0xB082}, //869 #HANGUL SYLLABLE SSANGKIYEOK I NIEUNHIEUH + {0x85EA, 0xB083}, //870 #HANGUL SYLLABLE SSANGKIYEOK I TIKEUT + {0x85EB, 0xB085}, //871 #HANGUL SYLLABLE SSANGKIYEOK I RIEULKIYEOK + {0x85EC, 0xB086}, //872 #HANGUL SYLLABLE SSANGKIYEOK I RIEULMIEUM + {0x85ED, 0xB087}, //873 #HANGUL SYLLABLE SSANGKIYEOK I RIEULPIEUP + {0x85EE, 0xB088}, //874 #HANGUL SYLLABLE SSANGKIYEOK I RIEULSIOS + {0x85EF, 0xB089}, //875 #HANGUL SYLLABLE SSANGKIYEOK I RIEULTHIEUTH + {0x85F0, 0xB08A}, //876 #HANGUL SYLLABLE SSANGKIYEOK I RIEULPHIEUPH + {0x85F1, 0xB08B}, //877 #HANGUL SYLLABLE SSANGKIYEOK I RIEULHIEUH + {0x85F2, 0xB08E}, //878 #HANGUL SYLLABLE SSANGKIYEOK I PIEUPSIOS + {0x85F3, 0xB090}, //879 #HANGUL SYLLABLE SSANGKIYEOK I SSANGSIOS + {0x85F4, 0xB092}, //880 #HANGUL SYLLABLE SSANGKIYEOK I CIEUC + {0x85F5, 0xB093}, //881 #HANGUL SYLLABLE SSANGKIYEOK I CHIEUCH + {0x85F6, 0xB094}, //882 #HANGUL SYLLABLE SSANGKIYEOK I KHIEUKH + {0x85F7, 0xB095}, //883 #HANGUL SYLLABLE SSANGKIYEOK I THIEUTH + {0x85F8, 0xB096}, //884 #HANGUL SYLLABLE SSANGKIYEOK I PHIEUPH + {0x85F9, 0xB097}, //885 #HANGUL SYLLABLE SSANGKIYEOK I HIEUH + {0x85FA, 0xB09B}, //886 #HANGUL SYLLABLE NIEUN A KIYEOKSIOS + {0x85FB, 0xB09D}, //887 #HANGUL SYLLABLE NIEUN A NIEUNCIEUC + {0x85FC, 0xB09E}, //888 #HANGUL SYLLABLE NIEUN A NIEUNHIEUH + {0x85FD, 0xB0A3}, //889 #HANGUL SYLLABLE NIEUN A RIEULPIEUP + {0x85FE, 0xB0A4}, //890 #HANGUL SYLLABLE NIEUN A RIEULSIOS + {0x8641, 0xB0A5}, //891 #HANGUL SYLLABLE NIEUN A RIEULTHIEUTH + {0x8642, 0xB0A6}, //892 #HANGUL SYLLABLE NIEUN A RIEULPHIEUPH + {0x8643, 0xB0A7}, //893 #HANGUL SYLLABLE NIEUN A RIEULHIEUH + {0x8644, 0xB0AA}, //894 #HANGUL SYLLABLE NIEUN A PIEUPSIOS + {0x8645, 0xB0B0}, //895 #HANGUL SYLLABLE NIEUN A KHIEUKH + {0x8646, 0xB0B2}, //896 #HANGUL SYLLABLE NIEUN A PHIEUPH + {0x8647, 0xB0B6}, //897 #HANGUL SYLLABLE NIEUN AE SSANGKIYEOK + {0x8648, 0xB0B7}, //898 #HANGUL SYLLABLE NIEUN AE KIYEOKSIOS + {0x8649, 0xB0B9}, //899 #HANGUL SYLLABLE NIEUN AE NIEUNCIEUC + {0x864A, 0xB0BA}, //900 #HANGUL SYLLABLE NIEUN AE NIEUNHIEUH + {0x864B, 0xB0BB}, //901 #HANGUL SYLLABLE NIEUN AE TIKEUT + {0x864C, 0xB0BD}, //902 #HANGUL SYLLABLE NIEUN AE RIEULKIYEOK + {0x864D, 0xB0BE}, //903 #HANGUL SYLLABLE NIEUN AE RIEULMIEUM + {0x864E, 0xB0BF}, //904 #HANGUL SYLLABLE NIEUN AE RIEULPIEUP + {0x864F, 0xB0C0}, //905 #HANGUL SYLLABLE NIEUN AE RIEULSIOS + {0x8650, 0xB0C1}, //906 #HANGUL SYLLABLE NIEUN AE RIEULTHIEUTH + {0x8651, 0xB0C2}, //907 #HANGUL SYLLABLE NIEUN AE RIEULPHIEUPH + {0x8652, 0xB0C3}, //908 #HANGUL SYLLABLE NIEUN AE RIEULHIEUH + {0x8653, 0xB0C6}, //909 #HANGUL SYLLABLE NIEUN AE PIEUPSIOS + {0x8654, 0xB0CA}, //910 #HANGUL SYLLABLE NIEUN AE CIEUC + {0x8655, 0xB0CB}, //911 #HANGUL SYLLABLE NIEUN AE CHIEUCH + {0x8656, 0xB0CC}, //912 #HANGUL SYLLABLE NIEUN AE KHIEUKH + {0x8657, 0xB0CD}, //913 #HANGUL SYLLABLE NIEUN AE THIEUTH + {0x8658, 0xB0CE}, //914 #HANGUL SYLLABLE NIEUN AE PHIEUPH + {0x8659, 0xB0CF}, //915 #HANGUL SYLLABLE NIEUN AE HIEUH + {0x865A, 0xB0D2}, //916 #HANGUL SYLLABLE NIEUN YA SSANGKIYEOK + {0x8661, 0xB0D3}, //917 #HANGUL SYLLABLE NIEUN YA KIYEOKSIOS + {0x8662, 0xB0D5}, //918 #HANGUL SYLLABLE NIEUN YA NIEUNCIEUC + {0x8663, 0xB0D6}, //919 #HANGUL SYLLABLE NIEUN YA NIEUNHIEUH + {0x8664, 0xB0D7}, //920 #HANGUL SYLLABLE NIEUN YA TIKEUT + {0x8665, 0xB0D9}, //921 #HANGUL SYLLABLE NIEUN YA RIEULKIYEOK + {0x8666, 0xB0DA}, //922 #HANGUL SYLLABLE NIEUN YA RIEULMIEUM + {0x8667, 0xB0DB}, //923 #HANGUL SYLLABLE NIEUN YA RIEULPIEUP + {0x8668, 0xB0DC}, //924 #HANGUL SYLLABLE NIEUN YA RIEULSIOS + {0x8669, 0xB0DD}, //925 #HANGUL SYLLABLE NIEUN YA RIEULTHIEUTH + {0x866A, 0xB0DE}, //926 #HANGUL SYLLABLE NIEUN YA RIEULPHIEUPH + {0x866B, 0xB0DF}, //927 #HANGUL SYLLABLE NIEUN YA RIEULHIEUH + {0x866C, 0xB0E1}, //928 #HANGUL SYLLABLE NIEUN YA PIEUP + {0x866D, 0xB0E2}, //929 #HANGUL SYLLABLE NIEUN YA PIEUPSIOS + {0x866E, 0xB0E3}, //930 #HANGUL SYLLABLE NIEUN YA SIOS + {0x866F, 0xB0E4}, //931 #HANGUL SYLLABLE NIEUN YA SSANGSIOS + {0x8670, 0xB0E6}, //932 #HANGUL SYLLABLE NIEUN YA CIEUC + {0x8671, 0xB0E7}, //933 #HANGUL SYLLABLE NIEUN YA CHIEUCH + {0x8672, 0xB0E8}, //934 #HANGUL SYLLABLE NIEUN YA KHIEUKH + {0x8673, 0xB0E9}, //935 #HANGUL SYLLABLE NIEUN YA THIEUTH + {0x8674, 0xB0EA}, //936 #HANGUL SYLLABLE NIEUN YA PHIEUPH + {0x8675, 0xB0EB}, //937 #HANGUL SYLLABLE NIEUN YA HIEUH + {0x8676, 0xB0EC}, //938 #HANGUL SYLLABLE NIEUN YAE + {0x8677, 0xB0ED}, //939 #HANGUL SYLLABLE NIEUN YAE KIYEOK + {0x8678, 0xB0EE}, //940 #HANGUL SYLLABLE NIEUN YAE SSANGKIYEOK + {0x8679, 0xB0EF}, //941 #HANGUL SYLLABLE NIEUN YAE KIYEOKSIOS + {0x867A, 0xB0F0}, //942 #HANGUL SYLLABLE NIEUN YAE NIEUN + {0x8681, 0xB0F1}, //943 #HANGUL SYLLABLE NIEUN YAE NIEUNCIEUC + {0x8682, 0xB0F2}, //944 #HANGUL SYLLABLE NIEUN YAE NIEUNHIEUH + {0x8683, 0xB0F3}, //945 #HANGUL SYLLABLE NIEUN YAE TIKEUT + {0x8684, 0xB0F4}, //946 #HANGUL SYLLABLE NIEUN YAE RIEUL + {0x8685, 0xB0F5}, //947 #HANGUL SYLLABLE NIEUN YAE RIEULKIYEOK + {0x8686, 0xB0F6}, //948 #HANGUL SYLLABLE NIEUN YAE RIEULMIEUM + {0x8687, 0xB0F7}, //949 #HANGUL SYLLABLE NIEUN YAE RIEULPIEUP + {0x8688, 0xB0F8}, //950 #HANGUL SYLLABLE NIEUN YAE RIEULSIOS + {0x8689, 0xB0F9}, //951 #HANGUL SYLLABLE NIEUN YAE RIEULTHIEUTH + {0x868A, 0xB0FA}, //952 #HANGUL SYLLABLE NIEUN YAE RIEULPHIEUPH + {0x868B, 0xB0FB}, //953 #HANGUL SYLLABLE NIEUN YAE RIEULHIEUH + {0x868C, 0xB0FC}, //954 #HANGUL SYLLABLE NIEUN YAE MIEUM + {0x868D, 0xB0FD}, //955 #HANGUL SYLLABLE NIEUN YAE PIEUP + {0x868E, 0xB0FE}, //956 #HANGUL SYLLABLE NIEUN YAE PIEUPSIOS + {0x868F, 0xB0FF}, //957 #HANGUL SYLLABLE NIEUN YAE SIOS + {0x8690, 0xB100}, //958 #HANGUL SYLLABLE NIEUN YAE SSANGSIOS + {0x8691, 0xB101}, //959 #HANGUL SYLLABLE NIEUN YAE IEUNG + {0x8692, 0xB102}, //960 #HANGUL SYLLABLE NIEUN YAE CIEUC + {0x8693, 0xB103}, //961 #HANGUL SYLLABLE NIEUN YAE CHIEUCH + {0x8694, 0xB104}, //962 #HANGUL SYLLABLE NIEUN YAE KHIEUKH + {0x8695, 0xB105}, //963 #HANGUL SYLLABLE NIEUN YAE THIEUTH + {0x8696, 0xB106}, //964 #HANGUL SYLLABLE NIEUN YAE PHIEUPH + {0x8697, 0xB107}, //965 #HANGUL SYLLABLE NIEUN YAE HIEUH + {0x8698, 0xB10A}, //966 #HANGUL SYLLABLE NIEUN EO SSANGKIYEOK + {0x8699, 0xB10D}, //967 #HANGUL SYLLABLE NIEUN EO NIEUNCIEUC + {0x869A, 0xB10E}, //968 #HANGUL SYLLABLE NIEUN EO NIEUNHIEUH + {0x869B, 0xB10F}, //969 #HANGUL SYLLABLE NIEUN EO TIKEUT + {0x869C, 0xB111}, //970 #HANGUL SYLLABLE NIEUN EO RIEULKIYEOK + {0x869D, 0xB114}, //971 #HANGUL SYLLABLE NIEUN EO RIEULSIOS + {0x869E, 0xB115}, //972 #HANGUL SYLLABLE NIEUN EO RIEULTHIEUTH + {0x869F, 0xB116}, //973 #HANGUL SYLLABLE NIEUN EO RIEULPHIEUPH + {0x86A0, 0xB117}, //974 #HANGUL SYLLABLE NIEUN EO RIEULHIEUH + {0x86A1, 0xB11A}, //975 #HANGUL SYLLABLE NIEUN EO PIEUPSIOS + {0x86A2, 0xB11E}, //976 #HANGUL SYLLABLE NIEUN EO CIEUC + {0x86A3, 0xB11F}, //977 #HANGUL SYLLABLE NIEUN EO CHIEUCH + {0x86A4, 0xB120}, //978 #HANGUL SYLLABLE NIEUN EO KHIEUKH + {0x86A5, 0xB121}, //979 #HANGUL SYLLABLE NIEUN EO THIEUTH + {0x86A6, 0xB122}, //980 #HANGUL SYLLABLE NIEUN EO PHIEUPH + {0x86A7, 0xB126}, //981 #HANGUL SYLLABLE NIEUN E SSANGKIYEOK + {0x86A8, 0xB127}, //982 #HANGUL SYLLABLE NIEUN E KIYEOKSIOS + {0x86A9, 0xB129}, //983 #HANGUL SYLLABLE NIEUN E NIEUNCIEUC + {0x86AA, 0xB12A}, //984 #HANGUL SYLLABLE NIEUN E NIEUNHIEUH + {0x86AB, 0xB12B}, //985 #HANGUL SYLLABLE NIEUN E TIKEUT + {0x86AC, 0xB12D}, //986 #HANGUL SYLLABLE NIEUN E RIEULKIYEOK + {0x86AD, 0xB12E}, //987 #HANGUL SYLLABLE NIEUN E RIEULMIEUM + {0x86AE, 0xB12F}, //988 #HANGUL SYLLABLE NIEUN E RIEULPIEUP + {0x86AF, 0xB130}, //989 #HANGUL SYLLABLE NIEUN E RIEULSIOS + {0x86B0, 0xB131}, //990 #HANGUL SYLLABLE NIEUN E RIEULTHIEUTH + {0x86B1, 0xB132}, //991 #HANGUL SYLLABLE NIEUN E RIEULPHIEUPH + {0x86B2, 0xB133}, //992 #HANGUL SYLLABLE NIEUN E RIEULHIEUH + {0x86B3, 0xB136}, //993 #HANGUL SYLLABLE NIEUN E PIEUPSIOS + {0x86B4, 0xB13A}, //994 #HANGUL SYLLABLE NIEUN E CIEUC + {0x86B5, 0xB13B}, //995 #HANGUL SYLLABLE NIEUN E CHIEUCH + {0x86B6, 0xB13C}, //996 #HANGUL SYLLABLE NIEUN E KHIEUKH + {0x86B7, 0xB13D}, //997 #HANGUL SYLLABLE NIEUN E THIEUTH + {0x86B8, 0xB13E}, //998 #HANGUL SYLLABLE NIEUN E PHIEUPH + {0x86B9, 0xB13F}, //999 #HANGUL SYLLABLE NIEUN E HIEUH + {0x86BA, 0xB142}, //1000 #HANGUL SYLLABLE NIEUN YEO SSANGKIYEOK + {0x86BB, 0xB143}, //1001 #HANGUL SYLLABLE NIEUN YEO KIYEOKSIOS + {0x86BC, 0xB145}, //1002 #HANGUL SYLLABLE NIEUN YEO NIEUNCIEUC + {0x86BD, 0xB146}, //1003 #HANGUL SYLLABLE NIEUN YEO NIEUNHIEUH + {0x86BE, 0xB147}, //1004 #HANGUL SYLLABLE NIEUN YEO TIKEUT + {0x86BF, 0xB149}, //1005 #HANGUL SYLLABLE NIEUN YEO RIEULKIYEOK + {0x86C0, 0xB14A}, //1006 #HANGUL SYLLABLE NIEUN YEO RIEULMIEUM + {0x86C1, 0xB14B}, //1007 #HANGUL SYLLABLE NIEUN YEO RIEULPIEUP + {0x86C2, 0xB14C}, //1008 #HANGUL SYLLABLE NIEUN YEO RIEULSIOS + {0x86C3, 0xB14D}, //1009 #HANGUL SYLLABLE NIEUN YEO RIEULTHIEUTH + {0x86C4, 0xB14E}, //1010 #HANGUL SYLLABLE NIEUN YEO RIEULPHIEUPH + {0x86C5, 0xB14F}, //1011 #HANGUL SYLLABLE NIEUN YEO RIEULHIEUH + {0x86C6, 0xB152}, //1012 #HANGUL SYLLABLE NIEUN YEO PIEUPSIOS + {0x86C7, 0xB153}, //1013 #HANGUL SYLLABLE NIEUN YEO SIOS + {0x86C8, 0xB156}, //1014 #HANGUL SYLLABLE NIEUN YEO CIEUC + {0x86C9, 0xB157}, //1015 #HANGUL SYLLABLE NIEUN YEO CHIEUCH + {0x86CA, 0xB159}, //1016 #HANGUL SYLLABLE NIEUN YEO THIEUTH + {0x86CB, 0xB15A}, //1017 #HANGUL SYLLABLE NIEUN YEO PHIEUPH + {0x86CC, 0xB15B}, //1018 #HANGUL SYLLABLE NIEUN YEO HIEUH + {0x86CD, 0xB15D}, //1019 #HANGUL SYLLABLE NIEUN YE KIYEOK + {0x86CE, 0xB15E}, //1020 #HANGUL SYLLABLE NIEUN YE SSANGKIYEOK + {0x86CF, 0xB15F}, //1021 #HANGUL SYLLABLE NIEUN YE KIYEOKSIOS + {0x86D0, 0xB161}, //1022 #HANGUL SYLLABLE NIEUN YE NIEUNCIEUC + {0x86D1, 0xB162}, //1023 #HANGUL SYLLABLE NIEUN YE NIEUNHIEUH + {0x86D2, 0xB163}, //1024 #HANGUL SYLLABLE NIEUN YE TIKEUT + {0x86D3, 0xB164}, //1025 #HANGUL SYLLABLE NIEUN YE RIEUL + {0x86D4, 0xB165}, //1026 #HANGUL SYLLABLE NIEUN YE RIEULKIYEOK + {0x86D5, 0xB166}, //1027 #HANGUL SYLLABLE NIEUN YE RIEULMIEUM + {0x86D6, 0xB167}, //1028 #HANGUL SYLLABLE NIEUN YE RIEULPIEUP + {0x86D7, 0xB168}, //1029 #HANGUL SYLLABLE NIEUN YE RIEULSIOS + {0x86D8, 0xB169}, //1030 #HANGUL SYLLABLE NIEUN YE RIEULTHIEUTH + {0x86D9, 0xB16A}, //1031 #HANGUL SYLLABLE NIEUN YE RIEULPHIEUPH + {0x86DA, 0xB16B}, //1032 #HANGUL SYLLABLE NIEUN YE RIEULHIEUH + {0x86DB, 0xB16C}, //1033 #HANGUL SYLLABLE NIEUN YE MIEUM + {0x86DC, 0xB16D}, //1034 #HANGUL SYLLABLE NIEUN YE PIEUP + {0x86DD, 0xB16E}, //1035 #HANGUL SYLLABLE NIEUN YE PIEUPSIOS + {0x86DE, 0xB16F}, //1036 #HANGUL SYLLABLE NIEUN YE SIOS + {0x86DF, 0xB170}, //1037 #HANGUL SYLLABLE NIEUN YE SSANGSIOS + {0x86E0, 0xB171}, //1038 #HANGUL SYLLABLE NIEUN YE IEUNG + {0x86E1, 0xB172}, //1039 #HANGUL SYLLABLE NIEUN YE CIEUC + {0x86E2, 0xB173}, //1040 #HANGUL SYLLABLE NIEUN YE CHIEUCH + {0x86E3, 0xB174}, //1041 #HANGUL SYLLABLE NIEUN YE KHIEUKH + {0x86E4, 0xB175}, //1042 #HANGUL SYLLABLE NIEUN YE THIEUTH + {0x86E5, 0xB176}, //1043 #HANGUL SYLLABLE NIEUN YE PHIEUPH + {0x86E6, 0xB177}, //1044 #HANGUL SYLLABLE NIEUN YE HIEUH + {0x86E7, 0xB17A}, //1045 #HANGUL SYLLABLE NIEUN O SSANGKIYEOK + {0x86E8, 0xB17B}, //1046 #HANGUL SYLLABLE NIEUN O KIYEOKSIOS + {0x86E9, 0xB17D}, //1047 #HANGUL SYLLABLE NIEUN O NIEUNCIEUC + {0x86EA, 0xB17E}, //1048 #HANGUL SYLLABLE NIEUN O NIEUNHIEUH + {0x86EB, 0xB17F}, //1049 #HANGUL SYLLABLE NIEUN O TIKEUT + {0x86EC, 0xB181}, //1050 #HANGUL SYLLABLE NIEUN O RIEULKIYEOK + {0x86ED, 0xB183}, //1051 #HANGUL SYLLABLE NIEUN O RIEULPIEUP + {0x86EE, 0xB184}, //1052 #HANGUL SYLLABLE NIEUN O RIEULSIOS + {0x86EF, 0xB185}, //1053 #HANGUL SYLLABLE NIEUN O RIEULTHIEUTH + {0x86F0, 0xB186}, //1054 #HANGUL SYLLABLE NIEUN O RIEULPHIEUPH + {0x86F1, 0xB187}, //1055 #HANGUL SYLLABLE NIEUN O RIEULHIEUH + {0x86F2, 0xB18A}, //1056 #HANGUL SYLLABLE NIEUN O PIEUPSIOS + {0x86F3, 0xB18C}, //1057 #HANGUL SYLLABLE NIEUN O SSANGSIOS + {0x86F4, 0xB18E}, //1058 #HANGUL SYLLABLE NIEUN O CIEUC + {0x86F5, 0xB18F}, //1059 #HANGUL SYLLABLE NIEUN O CHIEUCH + {0x86F6, 0xB190}, //1060 #HANGUL SYLLABLE NIEUN O KHIEUKH + {0x86F7, 0xB191}, //1061 #HANGUL SYLLABLE NIEUN O THIEUTH + {0x86F8, 0xB195}, //1062 #HANGUL SYLLABLE NIEUN WA KIYEOK + {0x86F9, 0xB196}, //1063 #HANGUL SYLLABLE NIEUN WA SSANGKIYEOK + {0x86FA, 0xB197}, //1064 #HANGUL SYLLABLE NIEUN WA KIYEOKSIOS + {0x86FB, 0xB199}, //1065 #HANGUL SYLLABLE NIEUN WA NIEUNCIEUC + {0x86FC, 0xB19A}, //1066 #HANGUL SYLLABLE NIEUN WA NIEUNHIEUH + {0x86FD, 0xB19B}, //1067 #HANGUL SYLLABLE NIEUN WA TIKEUT + {0x86FE, 0xB19D}, //1068 #HANGUL SYLLABLE NIEUN WA RIEULKIYEOK + {0x8741, 0xB19E}, //1069 #HANGUL SYLLABLE NIEUN WA RIEULMIEUM + {0x8742, 0xB19F}, //1070 #HANGUL SYLLABLE NIEUN WA RIEULPIEUP + {0x8743, 0xB1A0}, //1071 #HANGUL SYLLABLE NIEUN WA RIEULSIOS + {0x8744, 0xB1A1}, //1072 #HANGUL SYLLABLE NIEUN WA RIEULTHIEUTH + {0x8745, 0xB1A2}, //1073 #HANGUL SYLLABLE NIEUN WA RIEULPHIEUPH + {0x8746, 0xB1A3}, //1074 #HANGUL SYLLABLE NIEUN WA RIEULHIEUH + {0x8747, 0xB1A4}, //1075 #HANGUL SYLLABLE NIEUN WA MIEUM + {0x8748, 0xB1A5}, //1076 #HANGUL SYLLABLE NIEUN WA PIEUP + {0x8749, 0xB1A6}, //1077 #HANGUL SYLLABLE NIEUN WA PIEUPSIOS + {0x874A, 0xB1A7}, //1078 #HANGUL SYLLABLE NIEUN WA SIOS + {0x874B, 0xB1A9}, //1079 #HANGUL SYLLABLE NIEUN WA IEUNG + {0x874C, 0xB1AA}, //1080 #HANGUL SYLLABLE NIEUN WA CIEUC + {0x874D, 0xB1AB}, //1081 #HANGUL SYLLABLE NIEUN WA CHIEUCH + {0x874E, 0xB1AC}, //1082 #HANGUL SYLLABLE NIEUN WA KHIEUKH + {0x874F, 0xB1AD}, //1083 #HANGUL SYLLABLE NIEUN WA THIEUTH + {0x8750, 0xB1AE}, //1084 #HANGUL SYLLABLE NIEUN WA PHIEUPH + {0x8751, 0xB1AF}, //1085 #HANGUL SYLLABLE NIEUN WA HIEUH + {0x8752, 0xB1B0}, //1086 #HANGUL SYLLABLE NIEUN WAE + {0x8753, 0xB1B1}, //1087 #HANGUL SYLLABLE NIEUN WAE KIYEOK + {0x8754, 0xB1B2}, //1088 #HANGUL SYLLABLE NIEUN WAE SSANGKIYEOK + {0x8755, 0xB1B3}, //1089 #HANGUL SYLLABLE NIEUN WAE KIYEOKSIOS + {0x8756, 0xB1B4}, //1090 #HANGUL SYLLABLE NIEUN WAE NIEUN + {0x8757, 0xB1B5}, //1091 #HANGUL SYLLABLE NIEUN WAE NIEUNCIEUC + {0x8758, 0xB1B6}, //1092 #HANGUL SYLLABLE NIEUN WAE NIEUNHIEUH + {0x8759, 0xB1B7}, //1093 #HANGUL SYLLABLE NIEUN WAE TIKEUT + {0x875A, 0xB1B8}, //1094 #HANGUL SYLLABLE NIEUN WAE RIEUL + {0x8761, 0xB1B9}, //1095 #HANGUL SYLLABLE NIEUN WAE RIEULKIYEOK + {0x8762, 0xB1BA}, //1096 #HANGUL SYLLABLE NIEUN WAE RIEULMIEUM + {0x8763, 0xB1BB}, //1097 #HANGUL SYLLABLE NIEUN WAE RIEULPIEUP + {0x8764, 0xB1BC}, //1098 #HANGUL SYLLABLE NIEUN WAE RIEULSIOS + {0x8765, 0xB1BD}, //1099 #HANGUL SYLLABLE NIEUN WAE RIEULTHIEUTH + {0x8766, 0xB1BE}, //1100 #HANGUL SYLLABLE NIEUN WAE RIEULPHIEUPH + {0x8767, 0xB1BF}, //1101 #HANGUL SYLLABLE NIEUN WAE RIEULHIEUH + {0x8768, 0xB1C0}, //1102 #HANGUL SYLLABLE NIEUN WAE MIEUM + {0x8769, 0xB1C1}, //1103 #HANGUL SYLLABLE NIEUN WAE PIEUP + {0x876A, 0xB1C2}, //1104 #HANGUL SYLLABLE NIEUN WAE PIEUPSIOS + {0x876B, 0xB1C3}, //1105 #HANGUL SYLLABLE NIEUN WAE SIOS + {0x876C, 0xB1C4}, //1106 #HANGUL SYLLABLE NIEUN WAE SSANGSIOS + {0x876D, 0xB1C5}, //1107 #HANGUL SYLLABLE NIEUN WAE IEUNG + {0x876E, 0xB1C6}, //1108 #HANGUL SYLLABLE NIEUN WAE CIEUC + {0x876F, 0xB1C7}, //1109 #HANGUL SYLLABLE NIEUN WAE CHIEUCH + {0x8770, 0xB1C8}, //1110 #HANGUL SYLLABLE NIEUN WAE KHIEUKH + {0x8771, 0xB1C9}, //1111 #HANGUL SYLLABLE NIEUN WAE THIEUTH + {0x8772, 0xB1CA}, //1112 #HANGUL SYLLABLE NIEUN WAE PHIEUPH + {0x8773, 0xB1CB}, //1113 #HANGUL SYLLABLE NIEUN WAE HIEUH + {0x8774, 0xB1CD}, //1114 #HANGUL SYLLABLE NIEUN OE KIYEOK + {0x8775, 0xB1CE}, //1115 #HANGUL SYLLABLE NIEUN OE SSANGKIYEOK + {0x8776, 0xB1CF}, //1116 #HANGUL SYLLABLE NIEUN OE KIYEOKSIOS + {0x8777, 0xB1D1}, //1117 #HANGUL SYLLABLE NIEUN OE NIEUNCIEUC + {0x8778, 0xB1D2}, //1118 #HANGUL SYLLABLE NIEUN OE NIEUNHIEUH + {0x8779, 0xB1D3}, //1119 #HANGUL SYLLABLE NIEUN OE TIKEUT + {0x877A, 0xB1D5}, //1120 #HANGUL SYLLABLE NIEUN OE RIEULKIYEOK + {0x8781, 0xB1D6}, //1121 #HANGUL SYLLABLE NIEUN OE RIEULMIEUM + {0x8782, 0xB1D7}, //1122 #HANGUL SYLLABLE NIEUN OE RIEULPIEUP + {0x8783, 0xB1D8}, //1123 #HANGUL SYLLABLE NIEUN OE RIEULSIOS + {0x8784, 0xB1D9}, //1124 #HANGUL SYLLABLE NIEUN OE RIEULTHIEUTH + {0x8785, 0xB1DA}, //1125 #HANGUL SYLLABLE NIEUN OE RIEULPHIEUPH + {0x8786, 0xB1DB}, //1126 #HANGUL SYLLABLE NIEUN OE RIEULHIEUH + {0x8787, 0xB1DE}, //1127 #HANGUL SYLLABLE NIEUN OE PIEUPSIOS + {0x8788, 0xB1E0}, //1128 #HANGUL SYLLABLE NIEUN OE SSANGSIOS + {0x8789, 0xB1E1}, //1129 #HANGUL SYLLABLE NIEUN OE IEUNG + {0x878A, 0xB1E2}, //1130 #HANGUL SYLLABLE NIEUN OE CIEUC + {0x878B, 0xB1E3}, //1131 #HANGUL SYLLABLE NIEUN OE CHIEUCH + {0x878C, 0xB1E4}, //1132 #HANGUL SYLLABLE NIEUN OE KHIEUKH + {0x878D, 0xB1E5}, //1133 #HANGUL SYLLABLE NIEUN OE THIEUTH + {0x878E, 0xB1E6}, //1134 #HANGUL SYLLABLE NIEUN OE PHIEUPH + {0x878F, 0xB1E7}, //1135 #HANGUL SYLLABLE NIEUN OE HIEUH + {0x8790, 0xB1EA}, //1136 #HANGUL SYLLABLE NIEUN YO SSANGKIYEOK + {0x8791, 0xB1EB}, //1137 #HANGUL SYLLABLE NIEUN YO KIYEOKSIOS + {0x8792, 0xB1ED}, //1138 #HANGUL SYLLABLE NIEUN YO NIEUNCIEUC + {0x8793, 0xB1EE}, //1139 #HANGUL SYLLABLE NIEUN YO NIEUNHIEUH + {0x8794, 0xB1EF}, //1140 #HANGUL SYLLABLE NIEUN YO TIKEUT + {0x8795, 0xB1F1}, //1141 #HANGUL SYLLABLE NIEUN YO RIEULKIYEOK + {0x8796, 0xB1F2}, //1142 #HANGUL SYLLABLE NIEUN YO RIEULMIEUM + {0x8797, 0xB1F3}, //1143 #HANGUL SYLLABLE NIEUN YO RIEULPIEUP + {0x8798, 0xB1F4}, //1144 #HANGUL SYLLABLE NIEUN YO RIEULSIOS + {0x8799, 0xB1F5}, //1145 #HANGUL SYLLABLE NIEUN YO RIEULTHIEUTH + {0x879A, 0xB1F6}, //1146 #HANGUL SYLLABLE NIEUN YO RIEULPHIEUPH + {0x879B, 0xB1F7}, //1147 #HANGUL SYLLABLE NIEUN YO RIEULHIEUH + {0x879C, 0xB1F8}, //1148 #HANGUL SYLLABLE NIEUN YO MIEUM + {0x879D, 0xB1FA}, //1149 #HANGUL SYLLABLE NIEUN YO PIEUPSIOS + {0x879E, 0xB1FC}, //1150 #HANGUL SYLLABLE NIEUN YO SSANGSIOS + {0x879F, 0xB1FE}, //1151 #HANGUL SYLLABLE NIEUN YO CIEUC + {0x87A0, 0xB1FF}, //1152 #HANGUL SYLLABLE NIEUN YO CHIEUCH + {0x87A1, 0xB200}, //1153 #HANGUL SYLLABLE NIEUN YO KHIEUKH + {0x87A2, 0xB201}, //1154 #HANGUL SYLLABLE NIEUN YO THIEUTH + {0x87A3, 0xB202}, //1155 #HANGUL SYLLABLE NIEUN YO PHIEUPH + {0x87A4, 0xB203}, //1156 #HANGUL SYLLABLE NIEUN YO HIEUH + {0x87A5, 0xB206}, //1157 #HANGUL SYLLABLE NIEUN U SSANGKIYEOK + {0x87A6, 0xB207}, //1158 #HANGUL SYLLABLE NIEUN U KIYEOKSIOS + {0x87A7, 0xB209}, //1159 #HANGUL SYLLABLE NIEUN U NIEUNCIEUC + {0x87A8, 0xB20A}, //1160 #HANGUL SYLLABLE NIEUN U NIEUNHIEUH + {0x87A9, 0xB20D}, //1161 #HANGUL SYLLABLE NIEUN U RIEULKIYEOK + {0x87AA, 0xB20E}, //1162 #HANGUL SYLLABLE NIEUN U RIEULMIEUM + {0x87AB, 0xB20F}, //1163 #HANGUL SYLLABLE NIEUN U RIEULPIEUP + {0x87AC, 0xB210}, //1164 #HANGUL SYLLABLE NIEUN U RIEULSIOS + {0x87AD, 0xB211}, //1165 #HANGUL SYLLABLE NIEUN U RIEULTHIEUTH + {0x87AE, 0xB212}, //1166 #HANGUL SYLLABLE NIEUN U RIEULPHIEUPH + {0x87AF, 0xB213}, //1167 #HANGUL SYLLABLE NIEUN U RIEULHIEUH + {0x87B0, 0xB216}, //1168 #HANGUL SYLLABLE NIEUN U PIEUPSIOS + {0x87B1, 0xB218}, //1169 #HANGUL SYLLABLE NIEUN U SSANGSIOS + {0x87B2, 0xB21A}, //1170 #HANGUL SYLLABLE NIEUN U CIEUC + {0x87B3, 0xB21B}, //1171 #HANGUL SYLLABLE NIEUN U CHIEUCH + {0x87B4, 0xB21C}, //1172 #HANGUL SYLLABLE NIEUN U KHIEUKH + {0x87B5, 0xB21D}, //1173 #HANGUL SYLLABLE NIEUN U THIEUTH + {0x87B6, 0xB21E}, //1174 #HANGUL SYLLABLE NIEUN U PHIEUPH + {0x87B7, 0xB21F}, //1175 #HANGUL SYLLABLE NIEUN U HIEUH + {0x87B8, 0xB221}, //1176 #HANGUL SYLLABLE NIEUN WEO KIYEOK + {0x87B9, 0xB222}, //1177 #HANGUL SYLLABLE NIEUN WEO SSANGKIYEOK + {0x87BA, 0xB223}, //1178 #HANGUL SYLLABLE NIEUN WEO KIYEOKSIOS + {0x87BB, 0xB224}, //1179 #HANGUL SYLLABLE NIEUN WEO NIEUN + {0x87BC, 0xB225}, //1180 #HANGUL SYLLABLE NIEUN WEO NIEUNCIEUC + {0x87BD, 0xB226}, //1181 #HANGUL SYLLABLE NIEUN WEO NIEUNHIEUH + {0x87BE, 0xB227}, //1182 #HANGUL SYLLABLE NIEUN WEO TIKEUT + {0x87BF, 0xB228}, //1183 #HANGUL SYLLABLE NIEUN WEO RIEUL + {0x87C0, 0xB229}, //1184 #HANGUL SYLLABLE NIEUN WEO RIEULKIYEOK + {0x87C1, 0xB22A}, //1185 #HANGUL SYLLABLE NIEUN WEO RIEULMIEUM + {0x87C2, 0xB22B}, //1186 #HANGUL SYLLABLE NIEUN WEO RIEULPIEUP + {0x87C3, 0xB22C}, //1187 #HANGUL SYLLABLE NIEUN WEO RIEULSIOS + {0x87C4, 0xB22D}, //1188 #HANGUL SYLLABLE NIEUN WEO RIEULTHIEUTH + {0x87C5, 0xB22E}, //1189 #HANGUL SYLLABLE NIEUN WEO RIEULPHIEUPH + {0x87C6, 0xB22F}, //1190 #HANGUL SYLLABLE NIEUN WEO RIEULHIEUH + {0x87C7, 0xB230}, //1191 #HANGUL SYLLABLE NIEUN WEO MIEUM + {0x87C8, 0xB231}, //1192 #HANGUL SYLLABLE NIEUN WEO PIEUP + {0x87C9, 0xB232}, //1193 #HANGUL SYLLABLE NIEUN WEO PIEUPSIOS + {0x87CA, 0xB233}, //1194 #HANGUL SYLLABLE NIEUN WEO SIOS + {0x87CB, 0xB235}, //1195 #HANGUL SYLLABLE NIEUN WEO IEUNG + {0x87CC, 0xB236}, //1196 #HANGUL SYLLABLE NIEUN WEO CIEUC + {0x87CD, 0xB237}, //1197 #HANGUL SYLLABLE NIEUN WEO CHIEUCH + {0x87CE, 0xB238}, //1198 #HANGUL SYLLABLE NIEUN WEO KHIEUKH + {0x87CF, 0xB239}, //1199 #HANGUL SYLLABLE NIEUN WEO THIEUTH + {0x87D0, 0xB23A}, //1200 #HANGUL SYLLABLE NIEUN WEO PHIEUPH + {0x87D1, 0xB23B}, //1201 #HANGUL SYLLABLE NIEUN WEO HIEUH + {0x87D2, 0xB23D}, //1202 #HANGUL SYLLABLE NIEUN WE KIYEOK + {0x87D3, 0xB23E}, //1203 #HANGUL SYLLABLE NIEUN WE SSANGKIYEOK + {0x87D4, 0xB23F}, //1204 #HANGUL SYLLABLE NIEUN WE KIYEOKSIOS + {0x87D5, 0xB240}, //1205 #HANGUL SYLLABLE NIEUN WE NIEUN + {0x87D6, 0xB241}, //1206 #HANGUL SYLLABLE NIEUN WE NIEUNCIEUC + {0x87D7, 0xB242}, //1207 #HANGUL SYLLABLE NIEUN WE NIEUNHIEUH + {0x87D8, 0xB243}, //1208 #HANGUL SYLLABLE NIEUN WE TIKEUT + {0x87D9, 0xB244}, //1209 #HANGUL SYLLABLE NIEUN WE RIEUL + {0x87DA, 0xB245}, //1210 #HANGUL SYLLABLE NIEUN WE RIEULKIYEOK + {0x87DB, 0xB246}, //1211 #HANGUL SYLLABLE NIEUN WE RIEULMIEUM + {0x87DC, 0xB247}, //1212 #HANGUL SYLLABLE NIEUN WE RIEULPIEUP + {0x87DD, 0xB248}, //1213 #HANGUL SYLLABLE NIEUN WE RIEULSIOS + {0x87DE, 0xB249}, //1214 #HANGUL SYLLABLE NIEUN WE RIEULTHIEUTH + {0x87DF, 0xB24A}, //1215 #HANGUL SYLLABLE NIEUN WE RIEULPHIEUPH + {0x87E0, 0xB24B}, //1216 #HANGUL SYLLABLE NIEUN WE RIEULHIEUH + {0x87E1, 0xB24C}, //1217 #HANGUL SYLLABLE NIEUN WE MIEUM + {0x87E2, 0xB24D}, //1218 #HANGUL SYLLABLE NIEUN WE PIEUP + {0x87E3, 0xB24E}, //1219 #HANGUL SYLLABLE NIEUN WE PIEUPSIOS + {0x87E4, 0xB24F}, //1220 #HANGUL SYLLABLE NIEUN WE SIOS + {0x87E5, 0xB250}, //1221 #HANGUL SYLLABLE NIEUN WE SSANGSIOS + {0x87E6, 0xB251}, //1222 #HANGUL SYLLABLE NIEUN WE IEUNG + {0x87E7, 0xB252}, //1223 #HANGUL SYLLABLE NIEUN WE CIEUC + {0x87E8, 0xB253}, //1224 #HANGUL SYLLABLE NIEUN WE CHIEUCH + {0x87E9, 0xB254}, //1225 #HANGUL SYLLABLE NIEUN WE KHIEUKH + {0x87EA, 0xB255}, //1226 #HANGUL SYLLABLE NIEUN WE THIEUTH + {0x87EB, 0xB256}, //1227 #HANGUL SYLLABLE NIEUN WE PHIEUPH + {0x87EC, 0xB257}, //1228 #HANGUL SYLLABLE NIEUN WE HIEUH + {0x87ED, 0xB259}, //1229 #HANGUL SYLLABLE NIEUN WI KIYEOK + {0x87EE, 0xB25A}, //1230 #HANGUL SYLLABLE NIEUN WI SSANGKIYEOK + {0x87EF, 0xB25B}, //1231 #HANGUL SYLLABLE NIEUN WI KIYEOKSIOS + {0x87F0, 0xB25D}, //1232 #HANGUL SYLLABLE NIEUN WI NIEUNCIEUC + {0x87F1, 0xB25E}, //1233 #HANGUL SYLLABLE NIEUN WI NIEUNHIEUH + {0x87F2, 0xB25F}, //1234 #HANGUL SYLLABLE NIEUN WI TIKEUT + {0x87F3, 0xB261}, //1235 #HANGUL SYLLABLE NIEUN WI RIEULKIYEOK + {0x87F4, 0xB262}, //1236 #HANGUL SYLLABLE NIEUN WI RIEULMIEUM + {0x87F5, 0xB263}, //1237 #HANGUL SYLLABLE NIEUN WI RIEULPIEUP + {0x87F6, 0xB264}, //1238 #HANGUL SYLLABLE NIEUN WI RIEULSIOS + {0x87F7, 0xB265}, //1239 #HANGUL SYLLABLE NIEUN WI RIEULTHIEUTH + {0x87F8, 0xB266}, //1240 #HANGUL SYLLABLE NIEUN WI RIEULPHIEUPH + {0x87F9, 0xB267}, //1241 #HANGUL SYLLABLE NIEUN WI RIEULHIEUH + {0x87FA, 0xB26A}, //1242 #HANGUL SYLLABLE NIEUN WI PIEUPSIOS + {0x87FB, 0xB26B}, //1243 #HANGUL SYLLABLE NIEUN WI SIOS + {0x87FC, 0xB26C}, //1244 #HANGUL SYLLABLE NIEUN WI SSANGSIOS + {0x87FD, 0xB26D}, //1245 #HANGUL SYLLABLE NIEUN WI IEUNG + {0x87FE, 0xB26E}, //1246 #HANGUL SYLLABLE NIEUN WI CIEUC + {0x8841, 0xB26F}, //1247 #HANGUL SYLLABLE NIEUN WI CHIEUCH + {0x8842, 0xB270}, //1248 #HANGUL SYLLABLE NIEUN WI KHIEUKH + {0x8843, 0xB271}, //1249 #HANGUL SYLLABLE NIEUN WI THIEUTH + {0x8844, 0xB272}, //1250 #HANGUL SYLLABLE NIEUN WI PHIEUPH + {0x8845, 0xB273}, //1251 #HANGUL SYLLABLE NIEUN WI HIEUH + {0x8846, 0xB276}, //1252 #HANGUL SYLLABLE NIEUN YU SSANGKIYEOK + {0x8847, 0xB277}, //1253 #HANGUL SYLLABLE NIEUN YU KIYEOKSIOS + {0x8848, 0xB278}, //1254 #HANGUL SYLLABLE NIEUN YU NIEUN + {0x8849, 0xB279}, //1255 #HANGUL SYLLABLE NIEUN YU NIEUNCIEUC + {0x884A, 0xB27A}, //1256 #HANGUL SYLLABLE NIEUN YU NIEUNHIEUH + {0x884B, 0xB27B}, //1257 #HANGUL SYLLABLE NIEUN YU TIKEUT + {0x884C, 0xB27D}, //1258 #HANGUL SYLLABLE NIEUN YU RIEULKIYEOK + {0x884D, 0xB27E}, //1259 #HANGUL SYLLABLE NIEUN YU RIEULMIEUM + {0x884E, 0xB27F}, //1260 #HANGUL SYLLABLE NIEUN YU RIEULPIEUP + {0x884F, 0xB280}, //1261 #HANGUL SYLLABLE NIEUN YU RIEULSIOS + {0x8850, 0xB281}, //1262 #HANGUL SYLLABLE NIEUN YU RIEULTHIEUTH + {0x8851, 0xB282}, //1263 #HANGUL SYLLABLE NIEUN YU RIEULPHIEUPH + {0x8852, 0xB283}, //1264 #HANGUL SYLLABLE NIEUN YU RIEULHIEUH + {0x8853, 0xB286}, //1265 #HANGUL SYLLABLE NIEUN YU PIEUPSIOS + {0x8854, 0xB287}, //1266 #HANGUL SYLLABLE NIEUN YU SIOS + {0x8855, 0xB288}, //1267 #HANGUL SYLLABLE NIEUN YU SSANGSIOS + {0x8856, 0xB28A}, //1268 #HANGUL SYLLABLE NIEUN YU CIEUC + {0x8857, 0xB28B}, //1269 #HANGUL SYLLABLE NIEUN YU CHIEUCH + {0x8858, 0xB28C}, //1270 #HANGUL SYLLABLE NIEUN YU KHIEUKH + {0x8859, 0xB28D}, //1271 #HANGUL SYLLABLE NIEUN YU THIEUTH + {0x885A, 0xB28E}, //1272 #HANGUL SYLLABLE NIEUN YU PHIEUPH + {0x8861, 0xB28F}, //1273 #HANGUL SYLLABLE NIEUN YU HIEUH + {0x8862, 0xB292}, //1274 #HANGUL SYLLABLE NIEUN EU SSANGKIYEOK + {0x8863, 0xB293}, //1275 #HANGUL SYLLABLE NIEUN EU KIYEOKSIOS + {0x8864, 0xB295}, //1276 #HANGUL SYLLABLE NIEUN EU NIEUNCIEUC + {0x8865, 0xB296}, //1277 #HANGUL SYLLABLE NIEUN EU NIEUNHIEUH + {0x8866, 0xB297}, //1278 #HANGUL SYLLABLE NIEUN EU TIKEUT + {0x8867, 0xB29B}, //1279 #HANGUL SYLLABLE NIEUN EU RIEULPIEUP + {0x8868, 0xB29C}, //1280 #HANGUL SYLLABLE NIEUN EU RIEULSIOS + {0x8869, 0xB29D}, //1281 #HANGUL SYLLABLE NIEUN EU RIEULTHIEUTH + {0x886A, 0xB29E}, //1282 #HANGUL SYLLABLE NIEUN EU RIEULPHIEUPH + {0x886B, 0xB29F}, //1283 #HANGUL SYLLABLE NIEUN EU RIEULHIEUH + {0x886C, 0xB2A2}, //1284 #HANGUL SYLLABLE NIEUN EU PIEUPSIOS + {0x886D, 0xB2A4}, //1285 #HANGUL SYLLABLE NIEUN EU SSANGSIOS + {0x886E, 0xB2A7}, //1286 #HANGUL SYLLABLE NIEUN EU CHIEUCH + {0x886F, 0xB2A8}, //1287 #HANGUL SYLLABLE NIEUN EU KHIEUKH + {0x8870, 0xB2A9}, //1288 #HANGUL SYLLABLE NIEUN EU THIEUTH + {0x8871, 0xB2AB}, //1289 #HANGUL SYLLABLE NIEUN EU HIEUH + {0x8872, 0xB2AD}, //1290 #HANGUL SYLLABLE NIEUN YI KIYEOK + {0x8873, 0xB2AE}, //1291 #HANGUL SYLLABLE NIEUN YI SSANGKIYEOK + {0x8874, 0xB2AF}, //1292 #HANGUL SYLLABLE NIEUN YI KIYEOKSIOS + {0x8875, 0xB2B1}, //1293 #HANGUL SYLLABLE NIEUN YI NIEUNCIEUC + {0x8876, 0xB2B2}, //1294 #HANGUL SYLLABLE NIEUN YI NIEUNHIEUH + {0x8877, 0xB2B3}, //1295 #HANGUL SYLLABLE NIEUN YI TIKEUT + {0x8878, 0xB2B5}, //1296 #HANGUL SYLLABLE NIEUN YI RIEULKIYEOK + {0x8879, 0xB2B6}, //1297 #HANGUL SYLLABLE NIEUN YI RIEULMIEUM + {0x887A, 0xB2B7}, //1298 #HANGUL SYLLABLE NIEUN YI RIEULPIEUP + {0x8881, 0xB2B8}, //1299 #HANGUL SYLLABLE NIEUN YI RIEULSIOS + {0x8882, 0xB2B9}, //1300 #HANGUL SYLLABLE NIEUN YI RIEULTHIEUTH + {0x8883, 0xB2BA}, //1301 #HANGUL SYLLABLE NIEUN YI RIEULPHIEUPH + {0x8884, 0xB2BB}, //1302 #HANGUL SYLLABLE NIEUN YI RIEULHIEUH + {0x8885, 0xB2BC}, //1303 #HANGUL SYLLABLE NIEUN YI MIEUM + {0x8886, 0xB2BD}, //1304 #HANGUL SYLLABLE NIEUN YI PIEUP + {0x8887, 0xB2BE}, //1305 #HANGUL SYLLABLE NIEUN YI PIEUPSIOS + {0x8888, 0xB2BF}, //1306 #HANGUL SYLLABLE NIEUN YI SIOS + {0x8889, 0xB2C0}, //1307 #HANGUL SYLLABLE NIEUN YI SSANGSIOS + {0x888A, 0xB2C1}, //1308 #HANGUL SYLLABLE NIEUN YI IEUNG + {0x888B, 0xB2C2}, //1309 #HANGUL SYLLABLE NIEUN YI CIEUC + {0x888C, 0xB2C3}, //1310 #HANGUL SYLLABLE NIEUN YI CHIEUCH + {0x888D, 0xB2C4}, //1311 #HANGUL SYLLABLE NIEUN YI KHIEUKH + {0x888E, 0xB2C5}, //1312 #HANGUL SYLLABLE NIEUN YI THIEUTH + {0x888F, 0xB2C6}, //1313 #HANGUL SYLLABLE NIEUN YI PHIEUPH + {0x8890, 0xB2C7}, //1314 #HANGUL SYLLABLE NIEUN YI HIEUH + {0x8891, 0xB2CA}, //1315 #HANGUL SYLLABLE NIEUN I SSANGKIYEOK + {0x8892, 0xB2CB}, //1316 #HANGUL SYLLABLE NIEUN I KIYEOKSIOS + {0x8893, 0xB2CD}, //1317 #HANGUL SYLLABLE NIEUN I NIEUNCIEUC + {0x8894, 0xB2CE}, //1318 #HANGUL SYLLABLE NIEUN I NIEUNHIEUH + {0x8895, 0xB2CF}, //1319 #HANGUL SYLLABLE NIEUN I TIKEUT + {0x8896, 0xB2D1}, //1320 #HANGUL SYLLABLE NIEUN I RIEULKIYEOK + {0x8897, 0xB2D3}, //1321 #HANGUL SYLLABLE NIEUN I RIEULPIEUP + {0x8898, 0xB2D4}, //1322 #HANGUL SYLLABLE NIEUN I RIEULSIOS + {0x8899, 0xB2D5}, //1323 #HANGUL SYLLABLE NIEUN I RIEULTHIEUTH + {0x889A, 0xB2D6}, //1324 #HANGUL SYLLABLE NIEUN I RIEULPHIEUPH + {0x889B, 0xB2D7}, //1325 #HANGUL SYLLABLE NIEUN I RIEULHIEUH + {0x889C, 0xB2DA}, //1326 #HANGUL SYLLABLE NIEUN I PIEUPSIOS + {0x889D, 0xB2DC}, //1327 #HANGUL SYLLABLE NIEUN I SSANGSIOS + {0x889E, 0xB2DE}, //1328 #HANGUL SYLLABLE NIEUN I CIEUC + {0x889F, 0xB2DF}, //1329 #HANGUL SYLLABLE NIEUN I CHIEUCH + {0x88A0, 0xB2E0}, //1330 #HANGUL SYLLABLE NIEUN I KHIEUKH + {0x88A1, 0xB2E1}, //1331 #HANGUL SYLLABLE NIEUN I THIEUTH + {0x88A2, 0xB2E3}, //1332 #HANGUL SYLLABLE NIEUN I HIEUH + {0x88A3, 0xB2E7}, //1333 #HANGUL SYLLABLE TIKEUT A KIYEOKSIOS + {0x88A4, 0xB2E9}, //1334 #HANGUL SYLLABLE TIKEUT A NIEUNCIEUC + {0x88A5, 0xB2EA}, //1335 #HANGUL SYLLABLE TIKEUT A NIEUNHIEUH + {0x88A6, 0xB2F0}, //1336 #HANGUL SYLLABLE TIKEUT A RIEULSIOS + {0x88A7, 0xB2F1}, //1337 #HANGUL SYLLABLE TIKEUT A RIEULTHIEUTH + {0x88A8, 0xB2F2}, //1338 #HANGUL SYLLABLE TIKEUT A RIEULPHIEUPH + {0x88A9, 0xB2F6}, //1339 #HANGUL SYLLABLE TIKEUT A PIEUPSIOS + {0x88AA, 0xB2FC}, //1340 #HANGUL SYLLABLE TIKEUT A KHIEUKH + {0x88AB, 0xB2FD}, //1341 #HANGUL SYLLABLE TIKEUT A THIEUTH + {0x88AC, 0xB2FE}, //1342 #HANGUL SYLLABLE TIKEUT A PHIEUPH + {0x88AD, 0xB302}, //1343 #HANGUL SYLLABLE TIKEUT AE SSANGKIYEOK + {0x88AE, 0xB303}, //1344 #HANGUL SYLLABLE TIKEUT AE KIYEOKSIOS + {0x88AF, 0xB305}, //1345 #HANGUL SYLLABLE TIKEUT AE NIEUNCIEUC + {0x88B0, 0xB306}, //1346 #HANGUL SYLLABLE TIKEUT AE NIEUNHIEUH + {0x88B1, 0xB307}, //1347 #HANGUL SYLLABLE TIKEUT AE TIKEUT + {0x88B2, 0xB309}, //1348 #HANGUL SYLLABLE TIKEUT AE RIEULKIYEOK + {0x88B3, 0xB30A}, //1349 #HANGUL SYLLABLE TIKEUT AE RIEULMIEUM + {0x88B4, 0xB30B}, //1350 #HANGUL SYLLABLE TIKEUT AE RIEULPIEUP + {0x88B5, 0xB30C}, //1351 #HANGUL SYLLABLE TIKEUT AE RIEULSIOS + {0x88B6, 0xB30D}, //1352 #HANGUL SYLLABLE TIKEUT AE RIEULTHIEUTH + {0x88B7, 0xB30E}, //1353 #HANGUL SYLLABLE TIKEUT AE RIEULPHIEUPH + {0x88B8, 0xB30F}, //1354 #HANGUL SYLLABLE TIKEUT AE RIEULHIEUH + {0x88B9, 0xB312}, //1355 #HANGUL SYLLABLE TIKEUT AE PIEUPSIOS + {0x88BA, 0xB316}, //1356 #HANGUL SYLLABLE TIKEUT AE CIEUC + {0x88BB, 0xB317}, //1357 #HANGUL SYLLABLE TIKEUT AE CHIEUCH + {0x88BC, 0xB318}, //1358 #HANGUL SYLLABLE TIKEUT AE KHIEUKH + {0x88BD, 0xB319}, //1359 #HANGUL SYLLABLE TIKEUT AE THIEUTH + {0x88BE, 0xB31A}, //1360 #HANGUL SYLLABLE TIKEUT AE PHIEUPH + {0x88BF, 0xB31B}, //1361 #HANGUL SYLLABLE TIKEUT AE HIEUH + {0x88C0, 0xB31D}, //1362 #HANGUL SYLLABLE TIKEUT YA KIYEOK + {0x88C1, 0xB31E}, //1363 #HANGUL SYLLABLE TIKEUT YA SSANGKIYEOK + {0x88C2, 0xB31F}, //1364 #HANGUL SYLLABLE TIKEUT YA KIYEOKSIOS + {0x88C3, 0xB320}, //1365 #HANGUL SYLLABLE TIKEUT YA NIEUN + {0x88C4, 0xB321}, //1366 #HANGUL SYLLABLE TIKEUT YA NIEUNCIEUC + {0x88C5, 0xB322}, //1367 #HANGUL SYLLABLE TIKEUT YA NIEUNHIEUH + {0x88C6, 0xB323}, //1368 #HANGUL SYLLABLE TIKEUT YA TIKEUT + {0x88C7, 0xB324}, //1369 #HANGUL SYLLABLE TIKEUT YA RIEUL + {0x88C8, 0xB325}, //1370 #HANGUL SYLLABLE TIKEUT YA RIEULKIYEOK + {0x88C9, 0xB326}, //1371 #HANGUL SYLLABLE TIKEUT YA RIEULMIEUM + {0x88CA, 0xB327}, //1372 #HANGUL SYLLABLE TIKEUT YA RIEULPIEUP + {0x88CB, 0xB328}, //1373 #HANGUL SYLLABLE TIKEUT YA RIEULSIOS + {0x88CC, 0xB329}, //1374 #HANGUL SYLLABLE TIKEUT YA RIEULTHIEUTH + {0x88CD, 0xB32A}, //1375 #HANGUL SYLLABLE TIKEUT YA RIEULPHIEUPH + {0x88CE, 0xB32B}, //1376 #HANGUL SYLLABLE TIKEUT YA RIEULHIEUH + {0x88CF, 0xB32C}, //1377 #HANGUL SYLLABLE TIKEUT YA MIEUM + {0x88D0, 0xB32D}, //1378 #HANGUL SYLLABLE TIKEUT YA PIEUP + {0x88D1, 0xB32E}, //1379 #HANGUL SYLLABLE TIKEUT YA PIEUPSIOS + {0x88D2, 0xB32F}, //1380 #HANGUL SYLLABLE TIKEUT YA SIOS + {0x88D3, 0xB330}, //1381 #HANGUL SYLLABLE TIKEUT YA SSANGSIOS + {0x88D4, 0xB331}, //1382 #HANGUL SYLLABLE TIKEUT YA IEUNG + {0x88D5, 0xB332}, //1383 #HANGUL SYLLABLE TIKEUT YA CIEUC + {0x88D6, 0xB333}, //1384 #HANGUL SYLLABLE TIKEUT YA CHIEUCH + {0x88D7, 0xB334}, //1385 #HANGUL SYLLABLE TIKEUT YA KHIEUKH + {0x88D8, 0xB335}, //1386 #HANGUL SYLLABLE TIKEUT YA THIEUTH + {0x88D9, 0xB336}, //1387 #HANGUL SYLLABLE TIKEUT YA PHIEUPH + {0x88DA, 0xB337}, //1388 #HANGUL SYLLABLE TIKEUT YA HIEUH + {0x88DB, 0xB338}, //1389 #HANGUL SYLLABLE TIKEUT YAE + {0x88DC, 0xB339}, //1390 #HANGUL SYLLABLE TIKEUT YAE KIYEOK + {0x88DD, 0xB33A}, //1391 #HANGUL SYLLABLE TIKEUT YAE SSANGKIYEOK + {0x88DE, 0xB33B}, //1392 #HANGUL SYLLABLE TIKEUT YAE KIYEOKSIOS + {0x88DF, 0xB33C}, //1393 #HANGUL SYLLABLE TIKEUT YAE NIEUN + {0x88E0, 0xB33D}, //1394 #HANGUL SYLLABLE TIKEUT YAE NIEUNCIEUC + {0x88E1, 0xB33E}, //1395 #HANGUL SYLLABLE TIKEUT YAE NIEUNHIEUH + {0x88E2, 0xB33F}, //1396 #HANGUL SYLLABLE TIKEUT YAE TIKEUT + {0x88E3, 0xB340}, //1397 #HANGUL SYLLABLE TIKEUT YAE RIEUL + {0x88E4, 0xB341}, //1398 #HANGUL SYLLABLE TIKEUT YAE RIEULKIYEOK + {0x88E5, 0xB342}, //1399 #HANGUL SYLLABLE TIKEUT YAE RIEULMIEUM + {0x88E6, 0xB343}, //1400 #HANGUL SYLLABLE TIKEUT YAE RIEULPIEUP + {0x88E7, 0xB344}, //1401 #HANGUL SYLLABLE TIKEUT YAE RIEULSIOS + {0x88E8, 0xB345}, //1402 #HANGUL SYLLABLE TIKEUT YAE RIEULTHIEUTH + {0x88E9, 0xB346}, //1403 #HANGUL SYLLABLE TIKEUT YAE RIEULPHIEUPH + {0x88EA, 0xB347}, //1404 #HANGUL SYLLABLE TIKEUT YAE RIEULHIEUH + {0x88EB, 0xB348}, //1405 #HANGUL SYLLABLE TIKEUT YAE MIEUM + {0x88EC, 0xB349}, //1406 #HANGUL SYLLABLE TIKEUT YAE PIEUP + {0x88ED, 0xB34A}, //1407 #HANGUL SYLLABLE TIKEUT YAE PIEUPSIOS + {0x88EE, 0xB34B}, //1408 #HANGUL SYLLABLE TIKEUT YAE SIOS + {0x88EF, 0xB34C}, //1409 #HANGUL SYLLABLE TIKEUT YAE SSANGSIOS + {0x88F0, 0xB34D}, //1410 #HANGUL SYLLABLE TIKEUT YAE IEUNG + {0x88F1, 0xB34E}, //1411 #HANGUL SYLLABLE TIKEUT YAE CIEUC + {0x88F2, 0xB34F}, //1412 #HANGUL SYLLABLE TIKEUT YAE CHIEUCH + {0x88F3, 0xB350}, //1413 #HANGUL SYLLABLE TIKEUT YAE KHIEUKH + {0x88F4, 0xB351}, //1414 #HANGUL SYLLABLE TIKEUT YAE THIEUTH + {0x88F5, 0xB352}, //1415 #HANGUL SYLLABLE TIKEUT YAE PHIEUPH + {0x88F6, 0xB353}, //1416 #HANGUL SYLLABLE TIKEUT YAE HIEUH + {0x88F7, 0xB357}, //1417 #HANGUL SYLLABLE TIKEUT EO KIYEOKSIOS + {0x88F8, 0xB359}, //1418 #HANGUL SYLLABLE TIKEUT EO NIEUNCIEUC + {0x88F9, 0xB35A}, //1419 #HANGUL SYLLABLE TIKEUT EO NIEUNHIEUH + {0x88FA, 0xB35D}, //1420 #HANGUL SYLLABLE TIKEUT EO RIEULKIYEOK + {0x88FB, 0xB360}, //1421 #HANGUL SYLLABLE TIKEUT EO RIEULSIOS + {0x88FC, 0xB361}, //1422 #HANGUL SYLLABLE TIKEUT EO RIEULTHIEUTH + {0x88FD, 0xB362}, //1423 #HANGUL SYLLABLE TIKEUT EO RIEULPHIEUPH + {0x88FE, 0xB363}, //1424 #HANGUL SYLLABLE TIKEUT EO RIEULHIEUH + {0x8941, 0xB366}, //1425 #HANGUL SYLLABLE TIKEUT EO PIEUPSIOS + {0x8942, 0xB368}, //1426 #HANGUL SYLLABLE TIKEUT EO SSANGSIOS + {0x8943, 0xB36A}, //1427 #HANGUL SYLLABLE TIKEUT EO CIEUC + {0x8944, 0xB36C}, //1428 #HANGUL SYLLABLE TIKEUT EO KHIEUKH + {0x8945, 0xB36D}, //1429 #HANGUL SYLLABLE TIKEUT EO THIEUTH + {0x8946, 0xB36F}, //1430 #HANGUL SYLLABLE TIKEUT EO HIEUH + {0x8947, 0xB372}, //1431 #HANGUL SYLLABLE TIKEUT E SSANGKIYEOK + {0x8948, 0xB373}, //1432 #HANGUL SYLLABLE TIKEUT E KIYEOKSIOS + {0x8949, 0xB375}, //1433 #HANGUL SYLLABLE TIKEUT E NIEUNCIEUC + {0x894A, 0xB376}, //1434 #HANGUL SYLLABLE TIKEUT E NIEUNHIEUH + {0x894B, 0xB377}, //1435 #HANGUL SYLLABLE TIKEUT E TIKEUT + {0x894C, 0xB379}, //1436 #HANGUL SYLLABLE TIKEUT E RIEULKIYEOK + {0x894D, 0xB37A}, //1437 #HANGUL SYLLABLE TIKEUT E RIEULMIEUM + {0x894E, 0xB37B}, //1438 #HANGUL SYLLABLE TIKEUT E RIEULPIEUP + {0x894F, 0xB37C}, //1439 #HANGUL SYLLABLE TIKEUT E RIEULSIOS + {0x8950, 0xB37D}, //1440 #HANGUL SYLLABLE TIKEUT E RIEULTHIEUTH + {0x8951, 0xB37E}, //1441 #HANGUL SYLLABLE TIKEUT E RIEULPHIEUPH + {0x8952, 0xB37F}, //1442 #HANGUL SYLLABLE TIKEUT E RIEULHIEUH + {0x8953, 0xB382}, //1443 #HANGUL SYLLABLE TIKEUT E PIEUPSIOS + {0x8954, 0xB386}, //1444 #HANGUL SYLLABLE TIKEUT E CIEUC + {0x8955, 0xB387}, //1445 #HANGUL SYLLABLE TIKEUT E CHIEUCH + {0x8956, 0xB388}, //1446 #HANGUL SYLLABLE TIKEUT E KHIEUKH + {0x8957, 0xB389}, //1447 #HANGUL SYLLABLE TIKEUT E THIEUTH + {0x8958, 0xB38A}, //1448 #HANGUL SYLLABLE TIKEUT E PHIEUPH + {0x8959, 0xB38B}, //1449 #HANGUL SYLLABLE TIKEUT E HIEUH + {0x895A, 0xB38D}, //1450 #HANGUL SYLLABLE TIKEUT YEO KIYEOK + {0x8961, 0xB38E}, //1451 #HANGUL SYLLABLE TIKEUT YEO SSANGKIYEOK + {0x8962, 0xB38F}, //1452 #HANGUL SYLLABLE TIKEUT YEO KIYEOKSIOS + {0x8963, 0xB391}, //1453 #HANGUL SYLLABLE TIKEUT YEO NIEUNCIEUC + {0x8964, 0xB392}, //1454 #HANGUL SYLLABLE TIKEUT YEO NIEUNHIEUH + {0x8965, 0xB393}, //1455 #HANGUL SYLLABLE TIKEUT YEO TIKEUT + {0x8966, 0xB395}, //1456 #HANGUL SYLLABLE TIKEUT YEO RIEULKIYEOK + {0x8967, 0xB396}, //1457 #HANGUL SYLLABLE TIKEUT YEO RIEULMIEUM + {0x8968, 0xB397}, //1458 #HANGUL SYLLABLE TIKEUT YEO RIEULPIEUP + {0x8969, 0xB398}, //1459 #HANGUL SYLLABLE TIKEUT YEO RIEULSIOS + {0x896A, 0xB399}, //1460 #HANGUL SYLLABLE TIKEUT YEO RIEULTHIEUTH + {0x896B, 0xB39A}, //1461 #HANGUL SYLLABLE TIKEUT YEO RIEULPHIEUPH + {0x896C, 0xB39B}, //1462 #HANGUL SYLLABLE TIKEUT YEO RIEULHIEUH + {0x896D, 0xB39C}, //1463 #HANGUL SYLLABLE TIKEUT YEO MIEUM + {0x896E, 0xB39D}, //1464 #HANGUL SYLLABLE TIKEUT YEO PIEUP + {0x896F, 0xB39E}, //1465 #HANGUL SYLLABLE TIKEUT YEO PIEUPSIOS + {0x8970, 0xB39F}, //1466 #HANGUL SYLLABLE TIKEUT YEO SIOS + {0x8971, 0xB3A2}, //1467 #HANGUL SYLLABLE TIKEUT YEO CIEUC + {0x8972, 0xB3A3}, //1468 #HANGUL SYLLABLE TIKEUT YEO CHIEUCH + {0x8973, 0xB3A4}, //1469 #HANGUL SYLLABLE TIKEUT YEO KHIEUKH + {0x8974, 0xB3A5}, //1470 #HANGUL SYLLABLE TIKEUT YEO THIEUTH + {0x8975, 0xB3A6}, //1471 #HANGUL SYLLABLE TIKEUT YEO PHIEUPH + {0x8976, 0xB3A7}, //1472 #HANGUL SYLLABLE TIKEUT YEO HIEUH + {0x8977, 0xB3A9}, //1473 #HANGUL SYLLABLE TIKEUT YE KIYEOK + {0x8978, 0xB3AA}, //1474 #HANGUL SYLLABLE TIKEUT YE SSANGKIYEOK + {0x8979, 0xB3AB}, //1475 #HANGUL SYLLABLE TIKEUT YE KIYEOKSIOS + {0x897A, 0xB3AD}, //1476 #HANGUL SYLLABLE TIKEUT YE NIEUNCIEUC + {0x8981, 0xB3AE}, //1477 #HANGUL SYLLABLE TIKEUT YE NIEUNHIEUH + {0x8982, 0xB3AF}, //1478 #HANGUL SYLLABLE TIKEUT YE TIKEUT + {0x8983, 0xB3B0}, //1479 #HANGUL SYLLABLE TIKEUT YE RIEUL + {0x8984, 0xB3B1}, //1480 #HANGUL SYLLABLE TIKEUT YE RIEULKIYEOK + {0x8985, 0xB3B2}, //1481 #HANGUL SYLLABLE TIKEUT YE RIEULMIEUM + {0x8986, 0xB3B3}, //1482 #HANGUL SYLLABLE TIKEUT YE RIEULPIEUP + {0x8987, 0xB3B4}, //1483 #HANGUL SYLLABLE TIKEUT YE RIEULSIOS + {0x8988, 0xB3B5}, //1484 #HANGUL SYLLABLE TIKEUT YE RIEULTHIEUTH + {0x8989, 0xB3B6}, //1485 #HANGUL SYLLABLE TIKEUT YE RIEULPHIEUPH + {0x898A, 0xB3B7}, //1486 #HANGUL SYLLABLE TIKEUT YE RIEULHIEUH + {0x898B, 0xB3B8}, //1487 #HANGUL SYLLABLE TIKEUT YE MIEUM + {0x898C, 0xB3B9}, //1488 #HANGUL SYLLABLE TIKEUT YE PIEUP + {0x898D, 0xB3BA}, //1489 #HANGUL SYLLABLE TIKEUT YE PIEUPSIOS + {0x898E, 0xB3BB}, //1490 #HANGUL SYLLABLE TIKEUT YE SIOS + {0x898F, 0xB3BC}, //1491 #HANGUL SYLLABLE TIKEUT YE SSANGSIOS + {0x8990, 0xB3BD}, //1492 #HANGUL SYLLABLE TIKEUT YE IEUNG + {0x8991, 0xB3BE}, //1493 #HANGUL SYLLABLE TIKEUT YE CIEUC + {0x8992, 0xB3BF}, //1494 #HANGUL SYLLABLE TIKEUT YE CHIEUCH + {0x8993, 0xB3C0}, //1495 #HANGUL SYLLABLE TIKEUT YE KHIEUKH + {0x8994, 0xB3C1}, //1496 #HANGUL SYLLABLE TIKEUT YE THIEUTH + {0x8995, 0xB3C2}, //1497 #HANGUL SYLLABLE TIKEUT YE PHIEUPH + {0x8996, 0xB3C3}, //1498 #HANGUL SYLLABLE TIKEUT YE HIEUH + {0x8997, 0xB3C6}, //1499 #HANGUL SYLLABLE TIKEUT O SSANGKIYEOK + {0x8998, 0xB3C7}, //1500 #HANGUL SYLLABLE TIKEUT O KIYEOKSIOS + {0x8999, 0xB3C9}, //1501 #HANGUL SYLLABLE TIKEUT O NIEUNCIEUC + {0x899A, 0xB3CA}, //1502 #HANGUL SYLLABLE TIKEUT O NIEUNHIEUH + {0x899B, 0xB3CD}, //1503 #HANGUL SYLLABLE TIKEUT O RIEULKIYEOK + {0x899C, 0xB3CF}, //1504 #HANGUL SYLLABLE TIKEUT O RIEULPIEUP + {0x899D, 0xB3D1}, //1505 #HANGUL SYLLABLE TIKEUT O RIEULTHIEUTH + {0x899E, 0xB3D2}, //1506 #HANGUL SYLLABLE TIKEUT O RIEULPHIEUPH + {0x899F, 0xB3D3}, //1507 #HANGUL SYLLABLE TIKEUT O RIEULHIEUH + {0x89A0, 0xB3D6}, //1508 #HANGUL SYLLABLE TIKEUT O PIEUPSIOS + {0x89A1, 0xB3D8}, //1509 #HANGUL SYLLABLE TIKEUT O SSANGSIOS + {0x89A2, 0xB3DA}, //1510 #HANGUL SYLLABLE TIKEUT O CIEUC + {0x89A3, 0xB3DC}, //1511 #HANGUL SYLLABLE TIKEUT O KHIEUKH + {0x89A4, 0xB3DE}, //1512 #HANGUL SYLLABLE TIKEUT O PHIEUPH + {0x89A5, 0xB3DF}, //1513 #HANGUL SYLLABLE TIKEUT O HIEUH + {0x89A6, 0xB3E1}, //1514 #HANGUL SYLLABLE TIKEUT WA KIYEOK + {0x89A7, 0xB3E2}, //1515 #HANGUL SYLLABLE TIKEUT WA SSANGKIYEOK + {0x89A8, 0xB3E3}, //1516 #HANGUL SYLLABLE TIKEUT WA KIYEOKSIOS + {0x89A9, 0xB3E5}, //1517 #HANGUL SYLLABLE TIKEUT WA NIEUNCIEUC + {0x89AA, 0xB3E6}, //1518 #HANGUL SYLLABLE TIKEUT WA NIEUNHIEUH + {0x89AB, 0xB3E7}, //1519 #HANGUL SYLLABLE TIKEUT WA TIKEUT + {0x89AC, 0xB3E9}, //1520 #HANGUL SYLLABLE TIKEUT WA RIEULKIYEOK + {0x89AD, 0xB3EA}, //1521 #HANGUL SYLLABLE TIKEUT WA RIEULMIEUM + {0x89AE, 0xB3EB}, //1522 #HANGUL SYLLABLE TIKEUT WA RIEULPIEUP + {0x89AF, 0xB3EC}, //1523 #HANGUL SYLLABLE TIKEUT WA RIEULSIOS + {0x89B0, 0xB3ED}, //1524 #HANGUL SYLLABLE TIKEUT WA RIEULTHIEUTH + {0x89B1, 0xB3EE}, //1525 #HANGUL SYLLABLE TIKEUT WA RIEULPHIEUPH + {0x89B2, 0xB3EF}, //1526 #HANGUL SYLLABLE TIKEUT WA RIEULHIEUH + {0x89B3, 0xB3F0}, //1527 #HANGUL SYLLABLE TIKEUT WA MIEUM + {0x89B4, 0xB3F1}, //1528 #HANGUL SYLLABLE TIKEUT WA PIEUP + {0x89B5, 0xB3F2}, //1529 #HANGUL SYLLABLE TIKEUT WA PIEUPSIOS + {0x89B6, 0xB3F3}, //1530 #HANGUL SYLLABLE TIKEUT WA SIOS + {0x89B7, 0xB3F4}, //1531 #HANGUL SYLLABLE TIKEUT WA SSANGSIOS + {0x89B8, 0xB3F5}, //1532 #HANGUL SYLLABLE TIKEUT WA IEUNG + {0x89B9, 0xB3F6}, //1533 #HANGUL SYLLABLE TIKEUT WA CIEUC + {0x89BA, 0xB3F7}, //1534 #HANGUL SYLLABLE TIKEUT WA CHIEUCH + {0x89BB, 0xB3F8}, //1535 #HANGUL SYLLABLE TIKEUT WA KHIEUKH + {0x89BC, 0xB3F9}, //1536 #HANGUL SYLLABLE TIKEUT WA THIEUTH + {0x89BD, 0xB3FA}, //1537 #HANGUL SYLLABLE TIKEUT WA PHIEUPH + {0x89BE, 0xB3FB}, //1538 #HANGUL SYLLABLE TIKEUT WA HIEUH + {0x89BF, 0xB3FD}, //1539 #HANGUL SYLLABLE TIKEUT WAE KIYEOK + {0x89C0, 0xB3FE}, //1540 #HANGUL SYLLABLE TIKEUT WAE SSANGKIYEOK + {0x89C1, 0xB3FF}, //1541 #HANGUL SYLLABLE TIKEUT WAE KIYEOKSIOS + {0x89C2, 0xB400}, //1542 #HANGUL SYLLABLE TIKEUT WAE NIEUN + {0x89C3, 0xB401}, //1543 #HANGUL SYLLABLE TIKEUT WAE NIEUNCIEUC + {0x89C4, 0xB402}, //1544 #HANGUL SYLLABLE TIKEUT WAE NIEUNHIEUH + {0x89C5, 0xB403}, //1545 #HANGUL SYLLABLE TIKEUT WAE TIKEUT + {0x89C6, 0xB404}, //1546 #HANGUL SYLLABLE TIKEUT WAE RIEUL + {0x89C7, 0xB405}, //1547 #HANGUL SYLLABLE TIKEUT WAE RIEULKIYEOK + {0x89C8, 0xB406}, //1548 #HANGUL SYLLABLE TIKEUT WAE RIEULMIEUM + {0x89C9, 0xB407}, //1549 #HANGUL SYLLABLE TIKEUT WAE RIEULPIEUP + {0x89CA, 0xB408}, //1550 #HANGUL SYLLABLE TIKEUT WAE RIEULSIOS + {0x89CB, 0xB409}, //1551 #HANGUL SYLLABLE TIKEUT WAE RIEULTHIEUTH + {0x89CC, 0xB40A}, //1552 #HANGUL SYLLABLE TIKEUT WAE RIEULPHIEUPH + {0x89CD, 0xB40B}, //1553 #HANGUL SYLLABLE TIKEUT WAE RIEULHIEUH + {0x89CE, 0xB40C}, //1554 #HANGUL SYLLABLE TIKEUT WAE MIEUM + {0x89CF, 0xB40D}, //1555 #HANGUL SYLLABLE TIKEUT WAE PIEUP + {0x89D0, 0xB40E}, //1556 #HANGUL SYLLABLE TIKEUT WAE PIEUPSIOS + {0x89D1, 0xB40F}, //1557 #HANGUL SYLLABLE TIKEUT WAE SIOS + {0x89D2, 0xB411}, //1558 #HANGUL SYLLABLE TIKEUT WAE IEUNG + {0x89D3, 0xB412}, //1559 #HANGUL SYLLABLE TIKEUT WAE CIEUC + {0x89D4, 0xB413}, //1560 #HANGUL SYLLABLE TIKEUT WAE CHIEUCH + {0x89D5, 0xB414}, //1561 #HANGUL SYLLABLE TIKEUT WAE KHIEUKH + {0x89D6, 0xB415}, //1562 #HANGUL SYLLABLE TIKEUT WAE THIEUTH + {0x89D7, 0xB416}, //1563 #HANGUL SYLLABLE TIKEUT WAE PHIEUPH + {0x89D8, 0xB417}, //1564 #HANGUL SYLLABLE TIKEUT WAE HIEUH + {0x89D9, 0xB419}, //1565 #HANGUL SYLLABLE TIKEUT OE KIYEOK + {0x89DA, 0xB41A}, //1566 #HANGUL SYLLABLE TIKEUT OE SSANGKIYEOK + {0x89DB, 0xB41B}, //1567 #HANGUL SYLLABLE TIKEUT OE KIYEOKSIOS + {0x89DC, 0xB41D}, //1568 #HANGUL SYLLABLE TIKEUT OE NIEUNCIEUC + {0x89DD, 0xB41E}, //1569 #HANGUL SYLLABLE TIKEUT OE NIEUNHIEUH + {0x89DE, 0xB41F}, //1570 #HANGUL SYLLABLE TIKEUT OE TIKEUT + {0x89DF, 0xB421}, //1571 #HANGUL SYLLABLE TIKEUT OE RIEULKIYEOK + {0x89E0, 0xB422}, //1572 #HANGUL SYLLABLE TIKEUT OE RIEULMIEUM + {0x89E1, 0xB423}, //1573 #HANGUL SYLLABLE TIKEUT OE RIEULPIEUP + {0x89E2, 0xB424}, //1574 #HANGUL SYLLABLE TIKEUT OE RIEULSIOS + {0x89E3, 0xB425}, //1575 #HANGUL SYLLABLE TIKEUT OE RIEULTHIEUTH + {0x89E4, 0xB426}, //1576 #HANGUL SYLLABLE TIKEUT OE RIEULPHIEUPH + {0x89E5, 0xB427}, //1577 #HANGUL SYLLABLE TIKEUT OE RIEULHIEUH + {0x89E6, 0xB42A}, //1578 #HANGUL SYLLABLE TIKEUT OE PIEUPSIOS + {0x89E7, 0xB42C}, //1579 #HANGUL SYLLABLE TIKEUT OE SSANGSIOS + {0x89E8, 0xB42D}, //1580 #HANGUL SYLLABLE TIKEUT OE IEUNG + {0x89E9, 0xB42E}, //1581 #HANGUL SYLLABLE TIKEUT OE CIEUC + {0x89EA, 0xB42F}, //1582 #HANGUL SYLLABLE TIKEUT OE CHIEUCH + {0x89EB, 0xB430}, //1583 #HANGUL SYLLABLE TIKEUT OE KHIEUKH + {0x89EC, 0xB431}, //1584 #HANGUL SYLLABLE TIKEUT OE THIEUTH + {0x89ED, 0xB432}, //1585 #HANGUL SYLLABLE TIKEUT OE PHIEUPH + {0x89EE, 0xB433}, //1586 #HANGUL SYLLABLE TIKEUT OE HIEUH + {0x89EF, 0xB435}, //1587 #HANGUL SYLLABLE TIKEUT YO KIYEOK + {0x89F0, 0xB436}, //1588 #HANGUL SYLLABLE TIKEUT YO SSANGKIYEOK + {0x89F1, 0xB437}, //1589 #HANGUL SYLLABLE TIKEUT YO KIYEOKSIOS + {0x89F2, 0xB438}, //1590 #HANGUL SYLLABLE TIKEUT YO NIEUN + {0x89F3, 0xB439}, //1591 #HANGUL SYLLABLE TIKEUT YO NIEUNCIEUC + {0x89F4, 0xB43A}, //1592 #HANGUL SYLLABLE TIKEUT YO NIEUNHIEUH + {0x89F5, 0xB43B}, //1593 #HANGUL SYLLABLE TIKEUT YO TIKEUT + {0x89F6, 0xB43C}, //1594 #HANGUL SYLLABLE TIKEUT YO RIEUL + {0x89F7, 0xB43D}, //1595 #HANGUL SYLLABLE TIKEUT YO RIEULKIYEOK + {0x89F8, 0xB43E}, //1596 #HANGUL SYLLABLE TIKEUT YO RIEULMIEUM + {0x89F9, 0xB43F}, //1597 #HANGUL SYLLABLE TIKEUT YO RIEULPIEUP + {0x89FA, 0xB440}, //1598 #HANGUL SYLLABLE TIKEUT YO RIEULSIOS + {0x89FB, 0xB441}, //1599 #HANGUL SYLLABLE TIKEUT YO RIEULTHIEUTH + {0x89FC, 0xB442}, //1600 #HANGUL SYLLABLE TIKEUT YO RIEULPHIEUPH + {0x89FD, 0xB443}, //1601 #HANGUL SYLLABLE TIKEUT YO RIEULHIEUH + {0x89FE, 0xB444}, //1602 #HANGUL SYLLABLE TIKEUT YO MIEUM + {0x8A41, 0xB445}, //1603 #HANGUL SYLLABLE TIKEUT YO PIEUP + {0x8A42, 0xB446}, //1604 #HANGUL SYLLABLE TIKEUT YO PIEUPSIOS + {0x8A43, 0xB447}, //1605 #HANGUL SYLLABLE TIKEUT YO SIOS + {0x8A44, 0xB448}, //1606 #HANGUL SYLLABLE TIKEUT YO SSANGSIOS + {0x8A45, 0xB449}, //1607 #HANGUL SYLLABLE TIKEUT YO IEUNG + {0x8A46, 0xB44A}, //1608 #HANGUL SYLLABLE TIKEUT YO CIEUC + {0x8A47, 0xB44B}, //1609 #HANGUL SYLLABLE TIKEUT YO CHIEUCH + {0x8A48, 0xB44C}, //1610 #HANGUL SYLLABLE TIKEUT YO KHIEUKH + {0x8A49, 0xB44D}, //1611 #HANGUL SYLLABLE TIKEUT YO THIEUTH + {0x8A4A, 0xB44E}, //1612 #HANGUL SYLLABLE TIKEUT YO PHIEUPH + {0x8A4B, 0xB44F}, //1613 #HANGUL SYLLABLE TIKEUT YO HIEUH + {0x8A4C, 0xB452}, //1614 #HANGUL SYLLABLE TIKEUT U SSANGKIYEOK + {0x8A4D, 0xB453}, //1615 #HANGUL SYLLABLE TIKEUT U KIYEOKSIOS + {0x8A4E, 0xB455}, //1616 #HANGUL SYLLABLE TIKEUT U NIEUNCIEUC + {0x8A4F, 0xB456}, //1617 #HANGUL SYLLABLE TIKEUT U NIEUNHIEUH + {0x8A50, 0xB457}, //1618 #HANGUL SYLLABLE TIKEUT U TIKEUT + {0x8A51, 0xB459}, //1619 #HANGUL SYLLABLE TIKEUT U RIEULKIYEOK + {0x8A52, 0xB45A}, //1620 #HANGUL SYLLABLE TIKEUT U RIEULMIEUM + {0x8A53, 0xB45B}, //1621 #HANGUL SYLLABLE TIKEUT U RIEULPIEUP + {0x8A54, 0xB45C}, //1622 #HANGUL SYLLABLE TIKEUT U RIEULSIOS + {0x8A55, 0xB45D}, //1623 #HANGUL SYLLABLE TIKEUT U RIEULTHIEUTH + {0x8A56, 0xB45E}, //1624 #HANGUL SYLLABLE TIKEUT U RIEULPHIEUPH + {0x8A57, 0xB45F}, //1625 #HANGUL SYLLABLE TIKEUT U RIEULHIEUH + {0x8A58, 0xB462}, //1626 #HANGUL SYLLABLE TIKEUT U PIEUPSIOS + {0x8A59, 0xB464}, //1627 #HANGUL SYLLABLE TIKEUT U SSANGSIOS + {0x8A5A, 0xB466}, //1628 #HANGUL SYLLABLE TIKEUT U CIEUC + {0x8A61, 0xB467}, //1629 #HANGUL SYLLABLE TIKEUT U CHIEUCH + {0x8A62, 0xB468}, //1630 #HANGUL SYLLABLE TIKEUT U KHIEUKH + {0x8A63, 0xB469}, //1631 #HANGUL SYLLABLE TIKEUT U THIEUTH + {0x8A64, 0xB46A}, //1632 #HANGUL SYLLABLE TIKEUT U PHIEUPH + {0x8A65, 0xB46B}, //1633 #HANGUL SYLLABLE TIKEUT U HIEUH + {0x8A66, 0xB46D}, //1634 #HANGUL SYLLABLE TIKEUT WEO KIYEOK + {0x8A67, 0xB46E}, //1635 #HANGUL SYLLABLE TIKEUT WEO SSANGKIYEOK + {0x8A68, 0xB46F}, //1636 #HANGUL SYLLABLE TIKEUT WEO KIYEOKSIOS + {0x8A69, 0xB470}, //1637 #HANGUL SYLLABLE TIKEUT WEO NIEUN + {0x8A6A, 0xB471}, //1638 #HANGUL SYLLABLE TIKEUT WEO NIEUNCIEUC + {0x8A6B, 0xB472}, //1639 #HANGUL SYLLABLE TIKEUT WEO NIEUNHIEUH + {0x8A6C, 0xB473}, //1640 #HANGUL SYLLABLE TIKEUT WEO TIKEUT + {0x8A6D, 0xB474}, //1641 #HANGUL SYLLABLE TIKEUT WEO RIEUL + {0x8A6E, 0xB475}, //1642 #HANGUL SYLLABLE TIKEUT WEO RIEULKIYEOK + {0x8A6F, 0xB476}, //1643 #HANGUL SYLLABLE TIKEUT WEO RIEULMIEUM + {0x8A70, 0xB477}, //1644 #HANGUL SYLLABLE TIKEUT WEO RIEULPIEUP + {0x8A71, 0xB478}, //1645 #HANGUL SYLLABLE TIKEUT WEO RIEULSIOS + {0x8A72, 0xB479}, //1646 #HANGUL SYLLABLE TIKEUT WEO RIEULTHIEUTH + {0x8A73, 0xB47A}, //1647 #HANGUL SYLLABLE TIKEUT WEO RIEULPHIEUPH + {0x8A74, 0xB47B}, //1648 #HANGUL SYLLABLE TIKEUT WEO RIEULHIEUH + {0x8A75, 0xB47C}, //1649 #HANGUL SYLLABLE TIKEUT WEO MIEUM + {0x8A76, 0xB47D}, //1650 #HANGUL SYLLABLE TIKEUT WEO PIEUP + {0x8A77, 0xB47E}, //1651 #HANGUL SYLLABLE TIKEUT WEO PIEUPSIOS + {0x8A78, 0xB47F}, //1652 #HANGUL SYLLABLE TIKEUT WEO SIOS + {0x8A79, 0xB481}, //1653 #HANGUL SYLLABLE TIKEUT WEO IEUNG + {0x8A7A, 0xB482}, //1654 #HANGUL SYLLABLE TIKEUT WEO CIEUC + {0x8A81, 0xB483}, //1655 #HANGUL SYLLABLE TIKEUT WEO CHIEUCH + {0x8A82, 0xB484}, //1656 #HANGUL SYLLABLE TIKEUT WEO KHIEUKH + {0x8A83, 0xB485}, //1657 #HANGUL SYLLABLE TIKEUT WEO THIEUTH + {0x8A84, 0xB486}, //1658 #HANGUL SYLLABLE TIKEUT WEO PHIEUPH + {0x8A85, 0xB487}, //1659 #HANGUL SYLLABLE TIKEUT WEO HIEUH + {0x8A86, 0xB489}, //1660 #HANGUL SYLLABLE TIKEUT WE KIYEOK + {0x8A87, 0xB48A}, //1661 #HANGUL SYLLABLE TIKEUT WE SSANGKIYEOK + {0x8A88, 0xB48B}, //1662 #HANGUL SYLLABLE TIKEUT WE KIYEOKSIOS + {0x8A89, 0xB48C}, //1663 #HANGUL SYLLABLE TIKEUT WE NIEUN + {0x8A8A, 0xB48D}, //1664 #HANGUL SYLLABLE TIKEUT WE NIEUNCIEUC + {0x8A8B, 0xB48E}, //1665 #HANGUL SYLLABLE TIKEUT WE NIEUNHIEUH + {0x8A8C, 0xB48F}, //1666 #HANGUL SYLLABLE TIKEUT WE TIKEUT + {0x8A8D, 0xB490}, //1667 #HANGUL SYLLABLE TIKEUT WE RIEUL + {0x8A8E, 0xB491}, //1668 #HANGUL SYLLABLE TIKEUT WE RIEULKIYEOK + {0x8A8F, 0xB492}, //1669 #HANGUL SYLLABLE TIKEUT WE RIEULMIEUM + {0x8A90, 0xB493}, //1670 #HANGUL SYLLABLE TIKEUT WE RIEULPIEUP + {0x8A91, 0xB494}, //1671 #HANGUL SYLLABLE TIKEUT WE RIEULSIOS + {0x8A92, 0xB495}, //1672 #HANGUL SYLLABLE TIKEUT WE RIEULTHIEUTH + {0x8A93, 0xB496}, //1673 #HANGUL SYLLABLE TIKEUT WE RIEULPHIEUPH + {0x8A94, 0xB497}, //1674 #HANGUL SYLLABLE TIKEUT WE RIEULHIEUH + {0x8A95, 0xB498}, //1675 #HANGUL SYLLABLE TIKEUT WE MIEUM + {0x8A96, 0xB499}, //1676 #HANGUL SYLLABLE TIKEUT WE PIEUP + {0x8A97, 0xB49A}, //1677 #HANGUL SYLLABLE TIKEUT WE PIEUPSIOS + {0x8A98, 0xB49B}, //1678 #HANGUL SYLLABLE TIKEUT WE SIOS + {0x8A99, 0xB49C}, //1679 #HANGUL SYLLABLE TIKEUT WE SSANGSIOS + {0x8A9A, 0xB49E}, //1680 #HANGUL SYLLABLE TIKEUT WE CIEUC + {0x8A9B, 0xB49F}, //1681 #HANGUL SYLLABLE TIKEUT WE CHIEUCH + {0x8A9C, 0xB4A0}, //1682 #HANGUL SYLLABLE TIKEUT WE KHIEUKH + {0x8A9D, 0xB4A1}, //1683 #HANGUL SYLLABLE TIKEUT WE THIEUTH + {0x8A9E, 0xB4A2}, //1684 #HANGUL SYLLABLE TIKEUT WE PHIEUPH + {0x8A9F, 0xB4A3}, //1685 #HANGUL SYLLABLE TIKEUT WE HIEUH + {0x8AA0, 0xB4A5}, //1686 #HANGUL SYLLABLE TIKEUT WI KIYEOK + {0x8AA1, 0xB4A6}, //1687 #HANGUL SYLLABLE TIKEUT WI SSANGKIYEOK + {0x8AA2, 0xB4A7}, //1688 #HANGUL SYLLABLE TIKEUT WI KIYEOKSIOS + {0x8AA3, 0xB4A9}, //1689 #HANGUL SYLLABLE TIKEUT WI NIEUNCIEUC + {0x8AA4, 0xB4AA}, //1690 #HANGUL SYLLABLE TIKEUT WI NIEUNHIEUH + {0x8AA5, 0xB4AB}, //1691 #HANGUL SYLLABLE TIKEUT WI TIKEUT + {0x8AA6, 0xB4AD}, //1692 #HANGUL SYLLABLE TIKEUT WI RIEULKIYEOK + {0x8AA7, 0xB4AE}, //1693 #HANGUL SYLLABLE TIKEUT WI RIEULMIEUM + {0x8AA8, 0xB4AF}, //1694 #HANGUL SYLLABLE TIKEUT WI RIEULPIEUP + {0x8AA9, 0xB4B0}, //1695 #HANGUL SYLLABLE TIKEUT WI RIEULSIOS + {0x8AAA, 0xB4B1}, //1696 #HANGUL SYLLABLE TIKEUT WI RIEULTHIEUTH + {0x8AAB, 0xB4B2}, //1697 #HANGUL SYLLABLE TIKEUT WI RIEULPHIEUPH + {0x8AAC, 0xB4B3}, //1698 #HANGUL SYLLABLE TIKEUT WI RIEULHIEUH + {0x8AAD, 0xB4B4}, //1699 #HANGUL SYLLABLE TIKEUT WI MIEUM + {0x8AAE, 0xB4B6}, //1700 #HANGUL SYLLABLE TIKEUT WI PIEUPSIOS + {0x8AAF, 0xB4B8}, //1701 #HANGUL SYLLABLE TIKEUT WI SSANGSIOS + {0x8AB0, 0xB4BA}, //1702 #HANGUL SYLLABLE TIKEUT WI CIEUC + {0x8AB1, 0xB4BB}, //1703 #HANGUL SYLLABLE TIKEUT WI CHIEUCH + {0x8AB2, 0xB4BC}, //1704 #HANGUL SYLLABLE TIKEUT WI KHIEUKH + {0x8AB3, 0xB4BD}, //1705 #HANGUL SYLLABLE TIKEUT WI THIEUTH + {0x8AB4, 0xB4BE}, //1706 #HANGUL SYLLABLE TIKEUT WI PHIEUPH + {0x8AB5, 0xB4BF}, //1707 #HANGUL SYLLABLE TIKEUT WI HIEUH + {0x8AB6, 0xB4C1}, //1708 #HANGUL SYLLABLE TIKEUT YU KIYEOK + {0x8AB7, 0xB4C2}, //1709 #HANGUL SYLLABLE TIKEUT YU SSANGKIYEOK + {0x8AB8, 0xB4C3}, //1710 #HANGUL SYLLABLE TIKEUT YU KIYEOKSIOS + {0x8AB9, 0xB4C5}, //1711 #HANGUL SYLLABLE TIKEUT YU NIEUNCIEUC + {0x8ABA, 0xB4C6}, //1712 #HANGUL SYLLABLE TIKEUT YU NIEUNHIEUH + {0x8ABB, 0xB4C7}, //1713 #HANGUL SYLLABLE TIKEUT YU TIKEUT + {0x8ABC, 0xB4C9}, //1714 #HANGUL SYLLABLE TIKEUT YU RIEULKIYEOK + {0x8ABD, 0xB4CA}, //1715 #HANGUL SYLLABLE TIKEUT YU RIEULMIEUM + {0x8ABE, 0xB4CB}, //1716 #HANGUL SYLLABLE TIKEUT YU RIEULPIEUP + {0x8ABF, 0xB4CC}, //1717 #HANGUL SYLLABLE TIKEUT YU RIEULSIOS + {0x8AC0, 0xB4CD}, //1718 #HANGUL SYLLABLE TIKEUT YU RIEULTHIEUTH + {0x8AC1, 0xB4CE}, //1719 #HANGUL SYLLABLE TIKEUT YU RIEULPHIEUPH + {0x8AC2, 0xB4CF}, //1720 #HANGUL SYLLABLE TIKEUT YU RIEULHIEUH + {0x8AC3, 0xB4D1}, //1721 #HANGUL SYLLABLE TIKEUT YU PIEUP + {0x8AC4, 0xB4D2}, //1722 #HANGUL SYLLABLE TIKEUT YU PIEUPSIOS + {0x8AC5, 0xB4D3}, //1723 #HANGUL SYLLABLE TIKEUT YU SIOS + {0x8AC6, 0xB4D4}, //1724 #HANGUL SYLLABLE TIKEUT YU SSANGSIOS + {0x8AC7, 0xB4D6}, //1725 #HANGUL SYLLABLE TIKEUT YU CIEUC + {0x8AC8, 0xB4D7}, //1726 #HANGUL SYLLABLE TIKEUT YU CHIEUCH + {0x8AC9, 0xB4D8}, //1727 #HANGUL SYLLABLE TIKEUT YU KHIEUKH + {0x8ACA, 0xB4D9}, //1728 #HANGUL SYLLABLE TIKEUT YU THIEUTH + {0x8ACB, 0xB4DA}, //1729 #HANGUL SYLLABLE TIKEUT YU PHIEUPH + {0x8ACC, 0xB4DB}, //1730 #HANGUL SYLLABLE TIKEUT YU HIEUH + {0x8ACD, 0xB4DE}, //1731 #HANGUL SYLLABLE TIKEUT EU SSANGKIYEOK + {0x8ACE, 0xB4DF}, //1732 #HANGUL SYLLABLE TIKEUT EU KIYEOKSIOS + {0x8ACF, 0xB4E1}, //1733 #HANGUL SYLLABLE TIKEUT EU NIEUNCIEUC + {0x8AD0, 0xB4E2}, //1734 #HANGUL SYLLABLE TIKEUT EU NIEUNHIEUH + {0x8AD1, 0xB4E5}, //1735 #HANGUL SYLLABLE TIKEUT EU RIEULKIYEOK + {0x8AD2, 0xB4E7}, //1736 #HANGUL SYLLABLE TIKEUT EU RIEULPIEUP + {0x8AD3, 0xB4E8}, //1737 #HANGUL SYLLABLE TIKEUT EU RIEULSIOS + {0x8AD4, 0xB4E9}, //1738 #HANGUL SYLLABLE TIKEUT EU RIEULTHIEUTH + {0x8AD5, 0xB4EA}, //1739 #HANGUL SYLLABLE TIKEUT EU RIEULPHIEUPH + {0x8AD6, 0xB4EB}, //1740 #HANGUL SYLLABLE TIKEUT EU RIEULHIEUH + {0x8AD7, 0xB4EE}, //1741 #HANGUL SYLLABLE TIKEUT EU PIEUPSIOS + {0x8AD8, 0xB4F0}, //1742 #HANGUL SYLLABLE TIKEUT EU SSANGSIOS + {0x8AD9, 0xB4F2}, //1743 #HANGUL SYLLABLE TIKEUT EU CIEUC + {0x8ADA, 0xB4F3}, //1744 #HANGUL SYLLABLE TIKEUT EU CHIEUCH + {0x8ADB, 0xB4F4}, //1745 #HANGUL SYLLABLE TIKEUT EU KHIEUKH + {0x8ADC, 0xB4F5}, //1746 #HANGUL SYLLABLE TIKEUT EU THIEUTH + {0x8ADD, 0xB4F6}, //1747 #HANGUL SYLLABLE TIKEUT EU PHIEUPH + {0x8ADE, 0xB4F7}, //1748 #HANGUL SYLLABLE TIKEUT EU HIEUH + {0x8ADF, 0xB4F9}, //1749 #HANGUL SYLLABLE TIKEUT YI KIYEOK + {0x8AE0, 0xB4FA}, //1750 #HANGUL SYLLABLE TIKEUT YI SSANGKIYEOK + {0x8AE1, 0xB4FB}, //1751 #HANGUL SYLLABLE TIKEUT YI KIYEOKSIOS + {0x8AE2, 0xB4FC}, //1752 #HANGUL SYLLABLE TIKEUT YI NIEUN + {0x8AE3, 0xB4FD}, //1753 #HANGUL SYLLABLE TIKEUT YI NIEUNCIEUC + {0x8AE4, 0xB4FE}, //1754 #HANGUL SYLLABLE TIKEUT YI NIEUNHIEUH + {0x8AE5, 0xB4FF}, //1755 #HANGUL SYLLABLE TIKEUT YI TIKEUT + {0x8AE6, 0xB500}, //1756 #HANGUL SYLLABLE TIKEUT YI RIEUL + {0x8AE7, 0xB501}, //1757 #HANGUL SYLLABLE TIKEUT YI RIEULKIYEOK + {0x8AE8, 0xB502}, //1758 #HANGUL SYLLABLE TIKEUT YI RIEULMIEUM + {0x8AE9, 0xB503}, //1759 #HANGUL SYLLABLE TIKEUT YI RIEULPIEUP + {0x8AEA, 0xB504}, //1760 #HANGUL SYLLABLE TIKEUT YI RIEULSIOS + {0x8AEB, 0xB505}, //1761 #HANGUL SYLLABLE TIKEUT YI RIEULTHIEUTH + {0x8AEC, 0xB506}, //1762 #HANGUL SYLLABLE TIKEUT YI RIEULPHIEUPH + {0x8AED, 0xB507}, //1763 #HANGUL SYLLABLE TIKEUT YI RIEULHIEUH + {0x8AEE, 0xB508}, //1764 #HANGUL SYLLABLE TIKEUT YI MIEUM + {0x8AEF, 0xB509}, //1765 #HANGUL SYLLABLE TIKEUT YI PIEUP + {0x8AF0, 0xB50A}, //1766 #HANGUL SYLLABLE TIKEUT YI PIEUPSIOS + {0x8AF1, 0xB50B}, //1767 #HANGUL SYLLABLE TIKEUT YI SIOS + {0x8AF2, 0xB50C}, //1768 #HANGUL SYLLABLE TIKEUT YI SSANGSIOS + {0x8AF3, 0xB50D}, //1769 #HANGUL SYLLABLE TIKEUT YI IEUNG + {0x8AF4, 0xB50E}, //1770 #HANGUL SYLLABLE TIKEUT YI CIEUC + {0x8AF5, 0xB50F}, //1771 #HANGUL SYLLABLE TIKEUT YI CHIEUCH + {0x8AF6, 0xB510}, //1772 #HANGUL SYLLABLE TIKEUT YI KHIEUKH + {0x8AF7, 0xB511}, //1773 #HANGUL SYLLABLE TIKEUT YI THIEUTH + {0x8AF8, 0xB512}, //1774 #HANGUL SYLLABLE TIKEUT YI PHIEUPH + {0x8AF9, 0xB513}, //1775 #HANGUL SYLLABLE TIKEUT YI HIEUH + {0x8AFA, 0xB516}, //1776 #HANGUL SYLLABLE TIKEUT I SSANGKIYEOK + {0x8AFB, 0xB517}, //1777 #HANGUL SYLLABLE TIKEUT I KIYEOKSIOS + {0x8AFC, 0xB519}, //1778 #HANGUL SYLLABLE TIKEUT I NIEUNCIEUC + {0x8AFD, 0xB51A}, //1779 #HANGUL SYLLABLE TIKEUT I NIEUNHIEUH + {0x8AFE, 0xB51D}, //1780 #HANGUL SYLLABLE TIKEUT I RIEULKIYEOK + {0x8B41, 0xB51E}, //1781 #HANGUL SYLLABLE TIKEUT I RIEULMIEUM + {0x8B42, 0xB51F}, //1782 #HANGUL SYLLABLE TIKEUT I RIEULPIEUP + {0x8B43, 0xB520}, //1783 #HANGUL SYLLABLE TIKEUT I RIEULSIOS + {0x8B44, 0xB521}, //1784 #HANGUL SYLLABLE TIKEUT I RIEULTHIEUTH + {0x8B45, 0xB522}, //1785 #HANGUL SYLLABLE TIKEUT I RIEULPHIEUPH + {0x8B46, 0xB523}, //1786 #HANGUL SYLLABLE TIKEUT I RIEULHIEUH + {0x8B47, 0xB526}, //1787 #HANGUL SYLLABLE TIKEUT I PIEUPSIOS + {0x8B48, 0xB52B}, //1788 #HANGUL SYLLABLE TIKEUT I CHIEUCH + {0x8B49, 0xB52C}, //1789 #HANGUL SYLLABLE TIKEUT I KHIEUKH + {0x8B4A, 0xB52D}, //1790 #HANGUL SYLLABLE TIKEUT I THIEUTH + {0x8B4B, 0xB52E}, //1791 #HANGUL SYLLABLE TIKEUT I PHIEUPH + {0x8B4C, 0xB52F}, //1792 #HANGUL SYLLABLE TIKEUT I HIEUH + {0x8B4D, 0xB532}, //1793 #HANGUL SYLLABLE SSANGTIKEUT A SSANGKIYEOK + {0x8B4E, 0xB533}, //1794 #HANGUL SYLLABLE SSANGTIKEUT A KIYEOKSIOS + {0x8B4F, 0xB535}, //1795 #HANGUL SYLLABLE SSANGTIKEUT A NIEUNCIEUC + {0x8B50, 0xB536}, //1796 #HANGUL SYLLABLE SSANGTIKEUT A NIEUNHIEUH + {0x8B51, 0xB537}, //1797 #HANGUL SYLLABLE SSANGTIKEUT A TIKEUT + {0x8B52, 0xB539}, //1798 #HANGUL SYLLABLE SSANGTIKEUT A RIEULKIYEOK + {0x8B53, 0xB53A}, //1799 #HANGUL SYLLABLE SSANGTIKEUT A RIEULMIEUM + {0x8B54, 0xB53B}, //1800 #HANGUL SYLLABLE SSANGTIKEUT A RIEULPIEUP + {0x8B55, 0xB53C}, //1801 #HANGUL SYLLABLE SSANGTIKEUT A RIEULSIOS + {0x8B56, 0xB53D}, //1802 #HANGUL SYLLABLE SSANGTIKEUT A RIEULTHIEUTH + {0x8B57, 0xB53E}, //1803 #HANGUL SYLLABLE SSANGTIKEUT A RIEULPHIEUPH + {0x8B58, 0xB53F}, //1804 #HANGUL SYLLABLE SSANGTIKEUT A RIEULHIEUH + {0x8B59, 0xB542}, //1805 #HANGUL SYLLABLE SSANGTIKEUT A PIEUPSIOS + {0x8B5A, 0xB546}, //1806 #HANGUL SYLLABLE SSANGTIKEUT A CIEUC + {0x8B61, 0xB547}, //1807 #HANGUL SYLLABLE SSANGTIKEUT A CHIEUCH + {0x8B62, 0xB548}, //1808 #HANGUL SYLLABLE SSANGTIKEUT A KHIEUKH + {0x8B63, 0xB549}, //1809 #HANGUL SYLLABLE SSANGTIKEUT A THIEUTH + {0x8B64, 0xB54A}, //1810 #HANGUL SYLLABLE SSANGTIKEUT A PHIEUPH + {0x8B65, 0xB54E}, //1811 #HANGUL SYLLABLE SSANGTIKEUT AE SSANGKIYEOK + {0x8B66, 0xB54F}, //1812 #HANGUL SYLLABLE SSANGTIKEUT AE KIYEOKSIOS + {0x8B67, 0xB551}, //1813 #HANGUL SYLLABLE SSANGTIKEUT AE NIEUNCIEUC + {0x8B68, 0xB552}, //1814 #HANGUL SYLLABLE SSANGTIKEUT AE NIEUNHIEUH + {0x8B69, 0xB553}, //1815 #HANGUL SYLLABLE SSANGTIKEUT AE TIKEUT + {0x8B6A, 0xB555}, //1816 #HANGUL SYLLABLE SSANGTIKEUT AE RIEULKIYEOK + {0x8B6B, 0xB556}, //1817 #HANGUL SYLLABLE SSANGTIKEUT AE RIEULMIEUM + {0x8B6C, 0xB557}, //1818 #HANGUL SYLLABLE SSANGTIKEUT AE RIEULPIEUP + {0x8B6D, 0xB558}, //1819 #HANGUL SYLLABLE SSANGTIKEUT AE RIEULSIOS + {0x8B6E, 0xB559}, //1820 #HANGUL SYLLABLE SSANGTIKEUT AE RIEULTHIEUTH + {0x8B6F, 0xB55A}, //1821 #HANGUL SYLLABLE SSANGTIKEUT AE RIEULPHIEUPH + {0x8B70, 0xB55B}, //1822 #HANGUL SYLLABLE SSANGTIKEUT AE RIEULHIEUH + {0x8B71, 0xB55E}, //1823 #HANGUL SYLLABLE SSANGTIKEUT AE PIEUPSIOS + {0x8B72, 0xB562}, //1824 #HANGUL SYLLABLE SSANGTIKEUT AE CIEUC + {0x8B73, 0xB563}, //1825 #HANGUL SYLLABLE SSANGTIKEUT AE CHIEUCH + {0x8B74, 0xB564}, //1826 #HANGUL SYLLABLE SSANGTIKEUT AE KHIEUKH + {0x8B75, 0xB565}, //1827 #HANGUL SYLLABLE SSANGTIKEUT AE THIEUTH + {0x8B76, 0xB566}, //1828 #HANGUL SYLLABLE SSANGTIKEUT AE PHIEUPH + {0x8B77, 0xB567}, //1829 #HANGUL SYLLABLE SSANGTIKEUT AE HIEUH + {0x8B78, 0xB568}, //1830 #HANGUL SYLLABLE SSANGTIKEUT YA + {0x8B79, 0xB569}, //1831 #HANGUL SYLLABLE SSANGTIKEUT YA KIYEOK + {0x8B7A, 0xB56A}, //1832 #HANGUL SYLLABLE SSANGTIKEUT YA SSANGKIYEOK + {0x8B81, 0xB56B}, //1833 #HANGUL SYLLABLE SSANGTIKEUT YA KIYEOKSIOS + {0x8B82, 0xB56C}, //1834 #HANGUL SYLLABLE SSANGTIKEUT YA NIEUN + {0x8B83, 0xB56D}, //1835 #HANGUL SYLLABLE SSANGTIKEUT YA NIEUNCIEUC + {0x8B84, 0xB56E}, //1836 #HANGUL SYLLABLE SSANGTIKEUT YA NIEUNHIEUH + {0x8B85, 0xB56F}, //1837 #HANGUL SYLLABLE SSANGTIKEUT YA TIKEUT + {0x8B86, 0xB570}, //1838 #HANGUL SYLLABLE SSANGTIKEUT YA RIEUL + {0x8B87, 0xB571}, //1839 #HANGUL SYLLABLE SSANGTIKEUT YA RIEULKIYEOK + {0x8B88, 0xB572}, //1840 #HANGUL SYLLABLE SSANGTIKEUT YA RIEULMIEUM + {0x8B89, 0xB573}, //1841 #HANGUL SYLLABLE SSANGTIKEUT YA RIEULPIEUP + {0x8B8A, 0xB574}, //1842 #HANGUL SYLLABLE SSANGTIKEUT YA RIEULSIOS + {0x8B8B, 0xB575}, //1843 #HANGUL SYLLABLE SSANGTIKEUT YA RIEULTHIEUTH + {0x8B8C, 0xB576}, //1844 #HANGUL SYLLABLE SSANGTIKEUT YA RIEULPHIEUPH + {0x8B8D, 0xB577}, //1845 #HANGUL SYLLABLE SSANGTIKEUT YA RIEULHIEUH + {0x8B8E, 0xB578}, //1846 #HANGUL SYLLABLE SSANGTIKEUT YA MIEUM + {0x8B8F, 0xB579}, //1847 #HANGUL SYLLABLE SSANGTIKEUT YA PIEUP + {0x8B90, 0xB57A}, //1848 #HANGUL SYLLABLE SSANGTIKEUT YA PIEUPSIOS + {0x8B91, 0xB57B}, //1849 #HANGUL SYLLABLE SSANGTIKEUT YA SIOS + {0x8B92, 0xB57C}, //1850 #HANGUL SYLLABLE SSANGTIKEUT YA SSANGSIOS + {0x8B93, 0xB57D}, //1851 #HANGUL SYLLABLE SSANGTIKEUT YA IEUNG + {0x8B94, 0xB57E}, //1852 #HANGUL SYLLABLE SSANGTIKEUT YA CIEUC + {0x8B95, 0xB57F}, //1853 #HANGUL SYLLABLE SSANGTIKEUT YA CHIEUCH + {0x8B96, 0xB580}, //1854 #HANGUL SYLLABLE SSANGTIKEUT YA KHIEUKH + {0x8B97, 0xB581}, //1855 #HANGUL SYLLABLE SSANGTIKEUT YA THIEUTH + {0x8B98, 0xB582}, //1856 #HANGUL SYLLABLE SSANGTIKEUT YA PHIEUPH + {0x8B99, 0xB583}, //1857 #HANGUL SYLLABLE SSANGTIKEUT YA HIEUH + {0x8B9A, 0xB584}, //1858 #HANGUL SYLLABLE SSANGTIKEUT YAE + {0x8B9B, 0xB585}, //1859 #HANGUL SYLLABLE SSANGTIKEUT YAE KIYEOK + {0x8B9C, 0xB586}, //1860 #HANGUL SYLLABLE SSANGTIKEUT YAE SSANGKIYEOK + {0x8B9D, 0xB587}, //1861 #HANGUL SYLLABLE SSANGTIKEUT YAE KIYEOKSIOS + {0x8B9E, 0xB588}, //1862 #HANGUL SYLLABLE SSANGTIKEUT YAE NIEUN + {0x8B9F, 0xB589}, //1863 #HANGUL SYLLABLE SSANGTIKEUT YAE NIEUNCIEUC + {0x8BA0, 0xB58A}, //1864 #HANGUL SYLLABLE SSANGTIKEUT YAE NIEUNHIEUH + {0x8BA1, 0xB58B}, //1865 #HANGUL SYLLABLE SSANGTIKEUT YAE TIKEUT + {0x8BA2, 0xB58C}, //1866 #HANGUL SYLLABLE SSANGTIKEUT YAE RIEUL + {0x8BA3, 0xB58D}, //1867 #HANGUL SYLLABLE SSANGTIKEUT YAE RIEULKIYEOK + {0x8BA4, 0xB58E}, //1868 #HANGUL SYLLABLE SSANGTIKEUT YAE RIEULMIEUM + {0x8BA5, 0xB58F}, //1869 #HANGUL SYLLABLE SSANGTIKEUT YAE RIEULPIEUP + {0x8BA6, 0xB590}, //1870 #HANGUL SYLLABLE SSANGTIKEUT YAE RIEULSIOS + {0x8BA7, 0xB591}, //1871 #HANGUL SYLLABLE SSANGTIKEUT YAE RIEULTHIEUTH + {0x8BA8, 0xB592}, //1872 #HANGUL SYLLABLE SSANGTIKEUT YAE RIEULPHIEUPH + {0x8BA9, 0xB593}, //1873 #HANGUL SYLLABLE SSANGTIKEUT YAE RIEULHIEUH + {0x8BAA, 0xB594}, //1874 #HANGUL SYLLABLE SSANGTIKEUT YAE MIEUM + {0x8BAB, 0xB595}, //1875 #HANGUL SYLLABLE SSANGTIKEUT YAE PIEUP + {0x8BAC, 0xB596}, //1876 #HANGUL SYLLABLE SSANGTIKEUT YAE PIEUPSIOS + {0x8BAD, 0xB597}, //1877 #HANGUL SYLLABLE SSANGTIKEUT YAE SIOS + {0x8BAE, 0xB598}, //1878 #HANGUL SYLLABLE SSANGTIKEUT YAE SSANGSIOS + {0x8BAF, 0xB599}, //1879 #HANGUL SYLLABLE SSANGTIKEUT YAE IEUNG + {0x8BB0, 0xB59A}, //1880 #HANGUL SYLLABLE SSANGTIKEUT YAE CIEUC + {0x8BB1, 0xB59B}, //1881 #HANGUL SYLLABLE SSANGTIKEUT YAE CHIEUCH + {0x8BB2, 0xB59C}, //1882 #HANGUL SYLLABLE SSANGTIKEUT YAE KHIEUKH + {0x8BB3, 0xB59D}, //1883 #HANGUL SYLLABLE SSANGTIKEUT YAE THIEUTH + {0x8BB4, 0xB59E}, //1884 #HANGUL SYLLABLE SSANGTIKEUT YAE PHIEUPH + {0x8BB5, 0xB59F}, //1885 #HANGUL SYLLABLE SSANGTIKEUT YAE HIEUH + {0x8BB6, 0xB5A2}, //1886 #HANGUL SYLLABLE SSANGTIKEUT EO SSANGKIYEOK + {0x8BB7, 0xB5A3}, //1887 #HANGUL SYLLABLE SSANGTIKEUT EO KIYEOKSIOS + {0x8BB8, 0xB5A5}, //1888 #HANGUL SYLLABLE SSANGTIKEUT EO NIEUNCIEUC + {0x8BB9, 0xB5A6}, //1889 #HANGUL SYLLABLE SSANGTIKEUT EO NIEUNHIEUH + {0x8BBA, 0xB5A7}, //1890 #HANGUL SYLLABLE SSANGTIKEUT EO TIKEUT + {0x8BBB, 0xB5A9}, //1891 #HANGUL SYLLABLE SSANGTIKEUT EO RIEULKIYEOK + {0x8BBC, 0xB5AC}, //1892 #HANGUL SYLLABLE SSANGTIKEUT EO RIEULSIOS + {0x8BBD, 0xB5AD}, //1893 #HANGUL SYLLABLE SSANGTIKEUT EO RIEULTHIEUTH + {0x8BBE, 0xB5AE}, //1894 #HANGUL SYLLABLE SSANGTIKEUT EO RIEULPHIEUPH + {0x8BBF, 0xB5AF}, //1895 #HANGUL SYLLABLE SSANGTIKEUT EO RIEULHIEUH + {0x8BC0, 0xB5B2}, //1896 #HANGUL SYLLABLE SSANGTIKEUT EO PIEUPSIOS + {0x8BC1, 0xB5B6}, //1897 #HANGUL SYLLABLE SSANGTIKEUT EO CIEUC + {0x8BC2, 0xB5B7}, //1898 #HANGUL SYLLABLE SSANGTIKEUT EO CHIEUCH + {0x8BC3, 0xB5B8}, //1899 #HANGUL SYLLABLE SSANGTIKEUT EO KHIEUKH + {0x8BC4, 0xB5B9}, //1900 #HANGUL SYLLABLE SSANGTIKEUT EO THIEUTH + {0x8BC5, 0xB5BA}, //1901 #HANGUL SYLLABLE SSANGTIKEUT EO PHIEUPH + {0x8BC6, 0xB5BE}, //1902 #HANGUL SYLLABLE SSANGTIKEUT E SSANGKIYEOK + {0x8BC7, 0xB5BF}, //1903 #HANGUL SYLLABLE SSANGTIKEUT E KIYEOKSIOS + {0x8BC8, 0xB5C1}, //1904 #HANGUL SYLLABLE SSANGTIKEUT E NIEUNCIEUC + {0x8BC9, 0xB5C2}, //1905 #HANGUL SYLLABLE SSANGTIKEUT E NIEUNHIEUH + {0x8BCA, 0xB5C3}, //1906 #HANGUL SYLLABLE SSANGTIKEUT E TIKEUT + {0x8BCB, 0xB5C5}, //1907 #HANGUL SYLLABLE SSANGTIKEUT E RIEULKIYEOK + {0x8BCC, 0xB5C6}, //1908 #HANGUL SYLLABLE SSANGTIKEUT E RIEULMIEUM + {0x8BCD, 0xB5C7}, //1909 #HANGUL SYLLABLE SSANGTIKEUT E RIEULPIEUP + {0x8BCE, 0xB5C8}, //1910 #HANGUL SYLLABLE SSANGTIKEUT E RIEULSIOS + {0x8BCF, 0xB5C9}, //1911 #HANGUL SYLLABLE SSANGTIKEUT E RIEULTHIEUTH + {0x8BD0, 0xB5CA}, //1912 #HANGUL SYLLABLE SSANGTIKEUT E RIEULPHIEUPH + {0x8BD1, 0xB5CB}, //1913 #HANGUL SYLLABLE SSANGTIKEUT E RIEULHIEUH + {0x8BD2, 0xB5CE}, //1914 #HANGUL SYLLABLE SSANGTIKEUT E PIEUPSIOS + {0x8BD3, 0xB5D2}, //1915 #HANGUL SYLLABLE SSANGTIKEUT E CIEUC + {0x8BD4, 0xB5D3}, //1916 #HANGUL SYLLABLE SSANGTIKEUT E CHIEUCH + {0x8BD5, 0xB5D4}, //1917 #HANGUL SYLLABLE SSANGTIKEUT E KHIEUKH + {0x8BD6, 0xB5D5}, //1918 #HANGUL SYLLABLE SSANGTIKEUT E THIEUTH + {0x8BD7, 0xB5D6}, //1919 #HANGUL SYLLABLE SSANGTIKEUT E PHIEUPH + {0x8BD8, 0xB5D7}, //1920 #HANGUL SYLLABLE SSANGTIKEUT E HIEUH + {0x8BD9, 0xB5D9}, //1921 #HANGUL SYLLABLE SSANGTIKEUT YEO KIYEOK + {0x8BDA, 0xB5DA}, //1922 #HANGUL SYLLABLE SSANGTIKEUT YEO SSANGKIYEOK + {0x8BDB, 0xB5DB}, //1923 #HANGUL SYLLABLE SSANGTIKEUT YEO KIYEOKSIOS + {0x8BDC, 0xB5DC}, //1924 #HANGUL SYLLABLE SSANGTIKEUT YEO NIEUN + {0x8BDD, 0xB5DD}, //1925 #HANGUL SYLLABLE SSANGTIKEUT YEO NIEUNCIEUC + {0x8BDE, 0xB5DE}, //1926 #HANGUL SYLLABLE SSANGTIKEUT YEO NIEUNHIEUH + {0x8BDF, 0xB5DF}, //1927 #HANGUL SYLLABLE SSANGTIKEUT YEO TIKEUT + {0x8BE0, 0xB5E0}, //1928 #HANGUL SYLLABLE SSANGTIKEUT YEO RIEUL + {0x8BE1, 0xB5E1}, //1929 #HANGUL SYLLABLE SSANGTIKEUT YEO RIEULKIYEOK + {0x8BE2, 0xB5E2}, //1930 #HANGUL SYLLABLE SSANGTIKEUT YEO RIEULMIEUM + {0x8BE3, 0xB5E3}, //1931 #HANGUL SYLLABLE SSANGTIKEUT YEO RIEULPIEUP + {0x8BE4, 0xB5E4}, //1932 #HANGUL SYLLABLE SSANGTIKEUT YEO RIEULSIOS + {0x8BE5, 0xB5E5}, //1933 #HANGUL SYLLABLE SSANGTIKEUT YEO RIEULTHIEUTH + {0x8BE6, 0xB5E6}, //1934 #HANGUL SYLLABLE SSANGTIKEUT YEO RIEULPHIEUPH + {0x8BE7, 0xB5E7}, //1935 #HANGUL SYLLABLE SSANGTIKEUT YEO RIEULHIEUH + {0x8BE8, 0xB5E8}, //1936 #HANGUL SYLLABLE SSANGTIKEUT YEO MIEUM + {0x8BE9, 0xB5E9}, //1937 #HANGUL SYLLABLE SSANGTIKEUT YEO PIEUP + {0x8BEA, 0xB5EA}, //1938 #HANGUL SYLLABLE SSANGTIKEUT YEO PIEUPSIOS + {0x8BEB, 0xB5EB}, //1939 #HANGUL SYLLABLE SSANGTIKEUT YEO SIOS + {0x8BEC, 0xB5ED}, //1940 #HANGUL SYLLABLE SSANGTIKEUT YEO IEUNG + {0x8BED, 0xB5EE}, //1941 #HANGUL SYLLABLE SSANGTIKEUT YEO CIEUC + {0x8BEE, 0xB5EF}, //1942 #HANGUL SYLLABLE SSANGTIKEUT YEO CHIEUCH + {0x8BEF, 0xB5F0}, //1943 #HANGUL SYLLABLE SSANGTIKEUT YEO KHIEUKH + {0x8BF0, 0xB5F1}, //1944 #HANGUL SYLLABLE SSANGTIKEUT YEO THIEUTH + {0x8BF1, 0xB5F2}, //1945 #HANGUL SYLLABLE SSANGTIKEUT YEO PHIEUPH + {0x8BF2, 0xB5F3}, //1946 #HANGUL SYLLABLE SSANGTIKEUT YEO HIEUH + {0x8BF3, 0xB5F4}, //1947 #HANGUL SYLLABLE SSANGTIKEUT YE + {0x8BF4, 0xB5F5}, //1948 #HANGUL SYLLABLE SSANGTIKEUT YE KIYEOK + {0x8BF5, 0xB5F6}, //1949 #HANGUL SYLLABLE SSANGTIKEUT YE SSANGKIYEOK + {0x8BF6, 0xB5F7}, //1950 #HANGUL SYLLABLE SSANGTIKEUT YE KIYEOKSIOS + {0x8BF7, 0xB5F8}, //1951 #HANGUL SYLLABLE SSANGTIKEUT YE NIEUN + {0x8BF8, 0xB5F9}, //1952 #HANGUL SYLLABLE SSANGTIKEUT YE NIEUNCIEUC + {0x8BF9, 0xB5FA}, //1953 #HANGUL SYLLABLE SSANGTIKEUT YE NIEUNHIEUH + {0x8BFA, 0xB5FB}, //1954 #HANGUL SYLLABLE SSANGTIKEUT YE TIKEUT + {0x8BFB, 0xB5FC}, //1955 #HANGUL SYLLABLE SSANGTIKEUT YE RIEUL + {0x8BFC, 0xB5FD}, //1956 #HANGUL SYLLABLE SSANGTIKEUT YE RIEULKIYEOK + {0x8BFD, 0xB5FE}, //1957 #HANGUL SYLLABLE SSANGTIKEUT YE RIEULMIEUM + {0x8BFE, 0xB5FF}, //1958 #HANGUL SYLLABLE SSANGTIKEUT YE RIEULPIEUP + {0x8C41, 0xB600}, //1959 #HANGUL SYLLABLE SSANGTIKEUT YE RIEULSIOS + {0x8C42, 0xB601}, //1960 #HANGUL SYLLABLE SSANGTIKEUT YE RIEULTHIEUTH + {0x8C43, 0xB602}, //1961 #HANGUL SYLLABLE SSANGTIKEUT YE RIEULPHIEUPH + {0x8C44, 0xB603}, //1962 #HANGUL SYLLABLE SSANGTIKEUT YE RIEULHIEUH + {0x8C45, 0xB604}, //1963 #HANGUL SYLLABLE SSANGTIKEUT YE MIEUM + {0x8C46, 0xB605}, //1964 #HANGUL SYLLABLE SSANGTIKEUT YE PIEUP + {0x8C47, 0xB606}, //1965 #HANGUL SYLLABLE SSANGTIKEUT YE PIEUPSIOS + {0x8C48, 0xB607}, //1966 #HANGUL SYLLABLE SSANGTIKEUT YE SIOS + {0x8C49, 0xB608}, //1967 #HANGUL SYLLABLE SSANGTIKEUT YE SSANGSIOS + {0x8C4A, 0xB609}, //1968 #HANGUL SYLLABLE SSANGTIKEUT YE IEUNG + {0x8C4B, 0xB60A}, //1969 #HANGUL SYLLABLE SSANGTIKEUT YE CIEUC + {0x8C4C, 0xB60B}, //1970 #HANGUL SYLLABLE SSANGTIKEUT YE CHIEUCH + {0x8C4D, 0xB60C}, //1971 #HANGUL SYLLABLE SSANGTIKEUT YE KHIEUKH + {0x8C4E, 0xB60D}, //1972 #HANGUL SYLLABLE SSANGTIKEUT YE THIEUTH + {0x8C4F, 0xB60E}, //1973 #HANGUL SYLLABLE SSANGTIKEUT YE PHIEUPH + {0x8C50, 0xB60F}, //1974 #HANGUL SYLLABLE SSANGTIKEUT YE HIEUH + {0x8C51, 0xB612}, //1975 #HANGUL SYLLABLE SSANGTIKEUT O SSANGKIYEOK + {0x8C52, 0xB613}, //1976 #HANGUL SYLLABLE SSANGTIKEUT O KIYEOKSIOS + {0x8C53, 0xB615}, //1977 #HANGUL SYLLABLE SSANGTIKEUT O NIEUNCIEUC + {0x8C54, 0xB616}, //1978 #HANGUL SYLLABLE SSANGTIKEUT O NIEUNHIEUH + {0x8C55, 0xB617}, //1979 #HANGUL SYLLABLE SSANGTIKEUT O TIKEUT + {0x8C56, 0xB619}, //1980 #HANGUL SYLLABLE SSANGTIKEUT O RIEULKIYEOK + {0x8C57, 0xB61A}, //1981 #HANGUL SYLLABLE SSANGTIKEUT O RIEULMIEUM + {0x8C58, 0xB61B}, //1982 #HANGUL SYLLABLE SSANGTIKEUT O RIEULPIEUP + {0x8C59, 0xB61C}, //1983 #HANGUL SYLLABLE SSANGTIKEUT O RIEULSIOS + {0x8C5A, 0xB61D}, //1984 #HANGUL SYLLABLE SSANGTIKEUT O RIEULTHIEUTH + {0x8C61, 0xB61E}, //1985 #HANGUL SYLLABLE SSANGTIKEUT O RIEULPHIEUPH + {0x8C62, 0xB61F}, //1986 #HANGUL SYLLABLE SSANGTIKEUT O RIEULHIEUH + {0x8C63, 0xB620}, //1987 #HANGUL SYLLABLE SSANGTIKEUT O MIEUM + {0x8C64, 0xB621}, //1988 #HANGUL SYLLABLE SSANGTIKEUT O PIEUP + {0x8C65, 0xB622}, //1989 #HANGUL SYLLABLE SSANGTIKEUT O PIEUPSIOS + {0x8C66, 0xB623}, //1990 #HANGUL SYLLABLE SSANGTIKEUT O SIOS + {0x8C67, 0xB624}, //1991 #HANGUL SYLLABLE SSANGTIKEUT O SSANGSIOS + {0x8C68, 0xB626}, //1992 #HANGUL SYLLABLE SSANGTIKEUT O CIEUC + {0x8C69, 0xB627}, //1993 #HANGUL SYLLABLE SSANGTIKEUT O CHIEUCH + {0x8C6A, 0xB628}, //1994 #HANGUL SYLLABLE SSANGTIKEUT O KHIEUKH + {0x8C6B, 0xB629}, //1995 #HANGUL SYLLABLE SSANGTIKEUT O THIEUTH + {0x8C6C, 0xB62A}, //1996 #HANGUL SYLLABLE SSANGTIKEUT O PHIEUPH + {0x8C6D, 0xB62B}, //1997 #HANGUL SYLLABLE SSANGTIKEUT O HIEUH + {0x8C6E, 0xB62D}, //1998 #HANGUL SYLLABLE SSANGTIKEUT WA KIYEOK + {0x8C6F, 0xB62E}, //1999 #HANGUL SYLLABLE SSANGTIKEUT WA SSANGKIYEOK + {0x8C70, 0xB62F}, //2000 #HANGUL SYLLABLE SSANGTIKEUT WA KIYEOKSIOS + {0x8C71, 0xB630}, //2001 #HANGUL SYLLABLE SSANGTIKEUT WA NIEUN + {0x8C72, 0xB631}, //2002 #HANGUL SYLLABLE SSANGTIKEUT WA NIEUNCIEUC + {0x8C73, 0xB632}, //2003 #HANGUL SYLLABLE SSANGTIKEUT WA NIEUNHIEUH + {0x8C74, 0xB633}, //2004 #HANGUL SYLLABLE SSANGTIKEUT WA TIKEUT + {0x8C75, 0xB635}, //2005 #HANGUL SYLLABLE SSANGTIKEUT WA RIEULKIYEOK + {0x8C76, 0xB636}, //2006 #HANGUL SYLLABLE SSANGTIKEUT WA RIEULMIEUM + {0x8C77, 0xB637}, //2007 #HANGUL SYLLABLE SSANGTIKEUT WA RIEULPIEUP + {0x8C78, 0xB638}, //2008 #HANGUL SYLLABLE SSANGTIKEUT WA RIEULSIOS + {0x8C79, 0xB639}, //2009 #HANGUL SYLLABLE SSANGTIKEUT WA RIEULTHIEUTH + {0x8C7A, 0xB63A}, //2010 #HANGUL SYLLABLE SSANGTIKEUT WA RIEULPHIEUPH + {0x8C81, 0xB63B}, //2011 #HANGUL SYLLABLE SSANGTIKEUT WA RIEULHIEUH + {0x8C82, 0xB63C}, //2012 #HANGUL SYLLABLE SSANGTIKEUT WA MIEUM + {0x8C83, 0xB63D}, //2013 #HANGUL SYLLABLE SSANGTIKEUT WA PIEUP + {0x8C84, 0xB63E}, //2014 #HANGUL SYLLABLE SSANGTIKEUT WA PIEUPSIOS + {0x8C85, 0xB63F}, //2015 #HANGUL SYLLABLE SSANGTIKEUT WA SIOS + {0x8C86, 0xB640}, //2016 #HANGUL SYLLABLE SSANGTIKEUT WA SSANGSIOS + {0x8C87, 0xB641}, //2017 #HANGUL SYLLABLE SSANGTIKEUT WA IEUNG + {0x8C88, 0xB642}, //2018 #HANGUL SYLLABLE SSANGTIKEUT WA CIEUC + {0x8C89, 0xB643}, //2019 #HANGUL SYLLABLE SSANGTIKEUT WA CHIEUCH + {0x8C8A, 0xB644}, //2020 #HANGUL SYLLABLE SSANGTIKEUT WA KHIEUKH + {0x8C8B, 0xB645}, //2021 #HANGUL SYLLABLE SSANGTIKEUT WA THIEUTH + {0x8C8C, 0xB646}, //2022 #HANGUL SYLLABLE SSANGTIKEUT WA PHIEUPH + {0x8C8D, 0xB647}, //2023 #HANGUL SYLLABLE SSANGTIKEUT WA HIEUH + {0x8C8E, 0xB649}, //2024 #HANGUL SYLLABLE SSANGTIKEUT WAE KIYEOK + {0x8C8F, 0xB64A}, //2025 #HANGUL SYLLABLE SSANGTIKEUT WAE SSANGKIYEOK + {0x8C90, 0xB64B}, //2026 #HANGUL SYLLABLE SSANGTIKEUT WAE KIYEOKSIOS + {0x8C91, 0xB64C}, //2027 #HANGUL SYLLABLE SSANGTIKEUT WAE NIEUN + {0x8C92, 0xB64D}, //2028 #HANGUL SYLLABLE SSANGTIKEUT WAE NIEUNCIEUC + {0x8C93, 0xB64E}, //2029 #HANGUL SYLLABLE SSANGTIKEUT WAE NIEUNHIEUH + {0x8C94, 0xB64F}, //2030 #HANGUL SYLLABLE SSANGTIKEUT WAE TIKEUT + {0x8C95, 0xB650}, //2031 #HANGUL SYLLABLE SSANGTIKEUT WAE RIEUL + {0x8C96, 0xB651}, //2032 #HANGUL SYLLABLE SSANGTIKEUT WAE RIEULKIYEOK + {0x8C97, 0xB652}, //2033 #HANGUL SYLLABLE SSANGTIKEUT WAE RIEULMIEUM + {0x8C98, 0xB653}, //2034 #HANGUL SYLLABLE SSANGTIKEUT WAE RIEULPIEUP + {0x8C99, 0xB654}, //2035 #HANGUL SYLLABLE SSANGTIKEUT WAE RIEULSIOS + {0x8C9A, 0xB655}, //2036 #HANGUL SYLLABLE SSANGTIKEUT WAE RIEULTHIEUTH + {0x8C9B, 0xB656}, //2037 #HANGUL SYLLABLE SSANGTIKEUT WAE RIEULPHIEUPH + {0x8C9C, 0xB657}, //2038 #HANGUL SYLLABLE SSANGTIKEUT WAE RIEULHIEUH + {0x8C9D, 0xB658}, //2039 #HANGUL SYLLABLE SSANGTIKEUT WAE MIEUM + {0x8C9E, 0xB659}, //2040 #HANGUL SYLLABLE SSANGTIKEUT WAE PIEUP + {0x8C9F, 0xB65A}, //2041 #HANGUL SYLLABLE SSANGTIKEUT WAE PIEUPSIOS + {0x8CA0, 0xB65B}, //2042 #HANGUL SYLLABLE SSANGTIKEUT WAE SIOS + {0x8CA1, 0xB65C}, //2043 #HANGUL SYLLABLE SSANGTIKEUT WAE SSANGSIOS + {0x8CA2, 0xB65D}, //2044 #HANGUL SYLLABLE SSANGTIKEUT WAE IEUNG + {0x8CA3, 0xB65E}, //2045 #HANGUL SYLLABLE SSANGTIKEUT WAE CIEUC + {0x8CA4, 0xB65F}, //2046 #HANGUL SYLLABLE SSANGTIKEUT WAE CHIEUCH + {0x8CA5, 0xB660}, //2047 #HANGUL SYLLABLE SSANGTIKEUT WAE KHIEUKH + {0x8CA6, 0xB661}, //2048 #HANGUL SYLLABLE SSANGTIKEUT WAE THIEUTH + {0x8CA7, 0xB662}, //2049 #HANGUL SYLLABLE SSANGTIKEUT WAE PHIEUPH + {0x8CA8, 0xB663}, //2050 #HANGUL SYLLABLE SSANGTIKEUT WAE HIEUH + {0x8CA9, 0xB665}, //2051 #HANGUL SYLLABLE SSANGTIKEUT OE KIYEOK + {0x8CAA, 0xB666}, //2052 #HANGUL SYLLABLE SSANGTIKEUT OE SSANGKIYEOK + {0x8CAB, 0xB667}, //2053 #HANGUL SYLLABLE SSANGTIKEUT OE KIYEOKSIOS + {0x8CAC, 0xB669}, //2054 #HANGUL SYLLABLE SSANGTIKEUT OE NIEUNCIEUC + {0x8CAD, 0xB66A}, //2055 #HANGUL SYLLABLE SSANGTIKEUT OE NIEUNHIEUH + {0x8CAE, 0xB66B}, //2056 #HANGUL SYLLABLE SSANGTIKEUT OE TIKEUT + {0x8CAF, 0xB66C}, //2057 #HANGUL SYLLABLE SSANGTIKEUT OE RIEUL + {0x8CB0, 0xB66D}, //2058 #HANGUL SYLLABLE SSANGTIKEUT OE RIEULKIYEOK + {0x8CB1, 0xB66E}, //2059 #HANGUL SYLLABLE SSANGTIKEUT OE RIEULMIEUM + {0x8CB2, 0xB66F}, //2060 #HANGUL SYLLABLE SSANGTIKEUT OE RIEULPIEUP + {0x8CB3, 0xB670}, //2061 #HANGUL SYLLABLE SSANGTIKEUT OE RIEULSIOS + {0x8CB4, 0xB671}, //2062 #HANGUL SYLLABLE SSANGTIKEUT OE RIEULTHIEUTH + {0x8CB5, 0xB672}, //2063 #HANGUL SYLLABLE SSANGTIKEUT OE RIEULPHIEUPH + {0x8CB6, 0xB673}, //2064 #HANGUL SYLLABLE SSANGTIKEUT OE RIEULHIEUH + {0x8CB7, 0xB674}, //2065 #HANGUL SYLLABLE SSANGTIKEUT OE MIEUM + {0x8CB8, 0xB675}, //2066 #HANGUL SYLLABLE SSANGTIKEUT OE PIEUP + {0x8CB9, 0xB676}, //2067 #HANGUL SYLLABLE SSANGTIKEUT OE PIEUPSIOS + {0x8CBA, 0xB677}, //2068 #HANGUL SYLLABLE SSANGTIKEUT OE SIOS + {0x8CBB, 0xB678}, //2069 #HANGUL SYLLABLE SSANGTIKEUT OE SSANGSIOS + {0x8CBC, 0xB679}, //2070 #HANGUL SYLLABLE SSANGTIKEUT OE IEUNG + {0x8CBD, 0xB67A}, //2071 #HANGUL SYLLABLE SSANGTIKEUT OE CIEUC + {0x8CBE, 0xB67B}, //2072 #HANGUL SYLLABLE SSANGTIKEUT OE CHIEUCH + {0x8CBF, 0xB67C}, //2073 #HANGUL SYLLABLE SSANGTIKEUT OE KHIEUKH + {0x8CC0, 0xB67D}, //2074 #HANGUL SYLLABLE SSANGTIKEUT OE THIEUTH + {0x8CC1, 0xB67E}, //2075 #HANGUL SYLLABLE SSANGTIKEUT OE PHIEUPH + {0x8CC2, 0xB67F}, //2076 #HANGUL SYLLABLE SSANGTIKEUT OE HIEUH + {0x8CC3, 0xB680}, //2077 #HANGUL SYLLABLE SSANGTIKEUT YO + {0x8CC4, 0xB681}, //2078 #HANGUL SYLLABLE SSANGTIKEUT YO KIYEOK + {0x8CC5, 0xB682}, //2079 #HANGUL SYLLABLE SSANGTIKEUT YO SSANGKIYEOK + {0x8CC6, 0xB683}, //2080 #HANGUL SYLLABLE SSANGTIKEUT YO KIYEOKSIOS + {0x8CC7, 0xB684}, //2081 #HANGUL SYLLABLE SSANGTIKEUT YO NIEUN + {0x8CC8, 0xB685}, //2082 #HANGUL SYLLABLE SSANGTIKEUT YO NIEUNCIEUC + {0x8CC9, 0xB686}, //2083 #HANGUL SYLLABLE SSANGTIKEUT YO NIEUNHIEUH + {0x8CCA, 0xB687}, //2084 #HANGUL SYLLABLE SSANGTIKEUT YO TIKEUT + {0x8CCB, 0xB688}, //2085 #HANGUL SYLLABLE SSANGTIKEUT YO RIEUL + {0x8CCC, 0xB689}, //2086 #HANGUL SYLLABLE SSANGTIKEUT YO RIEULKIYEOK + {0x8CCD, 0xB68A}, //2087 #HANGUL SYLLABLE SSANGTIKEUT YO RIEULMIEUM + {0x8CCE, 0xB68B}, //2088 #HANGUL SYLLABLE SSANGTIKEUT YO RIEULPIEUP + {0x8CCF, 0xB68C}, //2089 #HANGUL SYLLABLE SSANGTIKEUT YO RIEULSIOS + {0x8CD0, 0xB68D}, //2090 #HANGUL SYLLABLE SSANGTIKEUT YO RIEULTHIEUTH + {0x8CD1, 0xB68E}, //2091 #HANGUL SYLLABLE SSANGTIKEUT YO RIEULPHIEUPH + {0x8CD2, 0xB68F}, //2092 #HANGUL SYLLABLE SSANGTIKEUT YO RIEULHIEUH + {0x8CD3, 0xB690}, //2093 #HANGUL SYLLABLE SSANGTIKEUT YO MIEUM + {0x8CD4, 0xB691}, //2094 #HANGUL SYLLABLE SSANGTIKEUT YO PIEUP + {0x8CD5, 0xB692}, //2095 #HANGUL SYLLABLE SSANGTIKEUT YO PIEUPSIOS + {0x8CD6, 0xB693}, //2096 #HANGUL SYLLABLE SSANGTIKEUT YO SIOS + {0x8CD7, 0xB694}, //2097 #HANGUL SYLLABLE SSANGTIKEUT YO SSANGSIOS + {0x8CD8, 0xB695}, //2098 #HANGUL SYLLABLE SSANGTIKEUT YO IEUNG + {0x8CD9, 0xB696}, //2099 #HANGUL SYLLABLE SSANGTIKEUT YO CIEUC + {0x8CDA, 0xB697}, //2100 #HANGUL SYLLABLE SSANGTIKEUT YO CHIEUCH + {0x8CDB, 0xB698}, //2101 #HANGUL SYLLABLE SSANGTIKEUT YO KHIEUKH + {0x8CDC, 0xB699}, //2102 #HANGUL SYLLABLE SSANGTIKEUT YO THIEUTH + {0x8CDD, 0xB69A}, //2103 #HANGUL SYLLABLE SSANGTIKEUT YO PHIEUPH + {0x8CDE, 0xB69B}, //2104 #HANGUL SYLLABLE SSANGTIKEUT YO HIEUH + {0x8CDF, 0xB69E}, //2105 #HANGUL SYLLABLE SSANGTIKEUT U SSANGKIYEOK + {0x8CE0, 0xB69F}, //2106 #HANGUL SYLLABLE SSANGTIKEUT U KIYEOKSIOS + {0x8CE1, 0xB6A1}, //2107 #HANGUL SYLLABLE SSANGTIKEUT U NIEUNCIEUC + {0x8CE2, 0xB6A2}, //2108 #HANGUL SYLLABLE SSANGTIKEUT U NIEUNHIEUH + {0x8CE3, 0xB6A3}, //2109 #HANGUL SYLLABLE SSANGTIKEUT U TIKEUT + {0x8CE4, 0xB6A5}, //2110 #HANGUL SYLLABLE SSANGTIKEUT U RIEULKIYEOK + {0x8CE5, 0xB6A6}, //2111 #HANGUL SYLLABLE SSANGTIKEUT U RIEULMIEUM + {0x8CE6, 0xB6A7}, //2112 #HANGUL SYLLABLE SSANGTIKEUT U RIEULPIEUP + {0x8CE7, 0xB6A8}, //2113 #HANGUL SYLLABLE SSANGTIKEUT U RIEULSIOS + {0x8CE8, 0xB6A9}, //2114 #HANGUL SYLLABLE SSANGTIKEUT U RIEULTHIEUTH + {0x8CE9, 0xB6AA}, //2115 #HANGUL SYLLABLE SSANGTIKEUT U RIEULPHIEUPH + {0x8CEA, 0xB6AD}, //2116 #HANGUL SYLLABLE SSANGTIKEUT U PIEUP + {0x8CEB, 0xB6AE}, //2117 #HANGUL SYLLABLE SSANGTIKEUT U PIEUPSIOS + {0x8CEC, 0xB6AF}, //2118 #HANGUL SYLLABLE SSANGTIKEUT U SIOS + {0x8CED, 0xB6B0}, //2119 #HANGUL SYLLABLE SSANGTIKEUT U SSANGSIOS + {0x8CEE, 0xB6B2}, //2120 #HANGUL SYLLABLE SSANGTIKEUT U CIEUC + {0x8CEF, 0xB6B3}, //2121 #HANGUL SYLLABLE SSANGTIKEUT U CHIEUCH + {0x8CF0, 0xB6B4}, //2122 #HANGUL SYLLABLE SSANGTIKEUT U KHIEUKH + {0x8CF1, 0xB6B5}, //2123 #HANGUL SYLLABLE SSANGTIKEUT U THIEUTH + {0x8CF2, 0xB6B6}, //2124 #HANGUL SYLLABLE SSANGTIKEUT U PHIEUPH + {0x8CF3, 0xB6B7}, //2125 #HANGUL SYLLABLE SSANGTIKEUT U HIEUH + {0x8CF4, 0xB6B8}, //2126 #HANGUL SYLLABLE SSANGTIKEUT WEO + {0x8CF5, 0xB6B9}, //2127 #HANGUL SYLLABLE SSANGTIKEUT WEO KIYEOK + {0x8CF6, 0xB6BA}, //2128 #HANGUL SYLLABLE SSANGTIKEUT WEO SSANGKIYEOK + {0x8CF7, 0xB6BB}, //2129 #HANGUL SYLLABLE SSANGTIKEUT WEO KIYEOKSIOS + {0x8CF8, 0xB6BC}, //2130 #HANGUL SYLLABLE SSANGTIKEUT WEO NIEUN + {0x8CF9, 0xB6BD}, //2131 #HANGUL SYLLABLE SSANGTIKEUT WEO NIEUNCIEUC + {0x8CFA, 0xB6BE}, //2132 #HANGUL SYLLABLE SSANGTIKEUT WEO NIEUNHIEUH + {0x8CFB, 0xB6BF}, //2133 #HANGUL SYLLABLE SSANGTIKEUT WEO TIKEUT + {0x8CFC, 0xB6C0}, //2134 #HANGUL SYLLABLE SSANGTIKEUT WEO RIEUL + {0x8CFD, 0xB6C1}, //2135 #HANGUL SYLLABLE SSANGTIKEUT WEO RIEULKIYEOK + {0x8CFE, 0xB6C2}, //2136 #HANGUL SYLLABLE SSANGTIKEUT WEO RIEULMIEUM + {0x8D41, 0xB6C3}, //2137 #HANGUL SYLLABLE SSANGTIKEUT WEO RIEULPIEUP + {0x8D42, 0xB6C4}, //2138 #HANGUL SYLLABLE SSANGTIKEUT WEO RIEULSIOS + {0x8D43, 0xB6C5}, //2139 #HANGUL SYLLABLE SSANGTIKEUT WEO RIEULTHIEUTH + {0x8D44, 0xB6C6}, //2140 #HANGUL SYLLABLE SSANGTIKEUT WEO RIEULPHIEUPH + {0x8D45, 0xB6C7}, //2141 #HANGUL SYLLABLE SSANGTIKEUT WEO RIEULHIEUH + {0x8D46, 0xB6C8}, //2142 #HANGUL SYLLABLE SSANGTIKEUT WEO MIEUM + {0x8D47, 0xB6C9}, //2143 #HANGUL SYLLABLE SSANGTIKEUT WEO PIEUP + {0x8D48, 0xB6CA}, //2144 #HANGUL SYLLABLE SSANGTIKEUT WEO PIEUPSIOS + {0x8D49, 0xB6CB}, //2145 #HANGUL SYLLABLE SSANGTIKEUT WEO SIOS + {0x8D4A, 0xB6CC}, //2146 #HANGUL SYLLABLE SSANGTIKEUT WEO SSANGSIOS + {0x8D4B, 0xB6CD}, //2147 #HANGUL SYLLABLE SSANGTIKEUT WEO IEUNG + {0x8D4C, 0xB6CE}, //2148 #HANGUL SYLLABLE SSANGTIKEUT WEO CIEUC + {0x8D4D, 0xB6CF}, //2149 #HANGUL SYLLABLE SSANGTIKEUT WEO CHIEUCH + {0x8D4E, 0xB6D0}, //2150 #HANGUL SYLLABLE SSANGTIKEUT WEO KHIEUKH + {0x8D4F, 0xB6D1}, //2151 #HANGUL SYLLABLE SSANGTIKEUT WEO THIEUTH + {0x8D50, 0xB6D2}, //2152 #HANGUL SYLLABLE SSANGTIKEUT WEO PHIEUPH + {0x8D51, 0xB6D3}, //2153 #HANGUL SYLLABLE SSANGTIKEUT WEO HIEUH + {0x8D52, 0xB6D5}, //2154 #HANGUL SYLLABLE SSANGTIKEUT WE KIYEOK + {0x8D53, 0xB6D6}, //2155 #HANGUL SYLLABLE SSANGTIKEUT WE SSANGKIYEOK + {0x8D54, 0xB6D7}, //2156 #HANGUL SYLLABLE SSANGTIKEUT WE KIYEOKSIOS + {0x8D55, 0xB6D8}, //2157 #HANGUL SYLLABLE SSANGTIKEUT WE NIEUN + {0x8D56, 0xB6D9}, //2158 #HANGUL SYLLABLE SSANGTIKEUT WE NIEUNCIEUC + {0x8D57, 0xB6DA}, //2159 #HANGUL SYLLABLE SSANGTIKEUT WE NIEUNHIEUH + {0x8D58, 0xB6DB}, //2160 #HANGUL SYLLABLE SSANGTIKEUT WE TIKEUT + {0x8D59, 0xB6DC}, //2161 #HANGUL SYLLABLE SSANGTIKEUT WE RIEUL + {0x8D5A, 0xB6DD}, //2162 #HANGUL SYLLABLE SSANGTIKEUT WE RIEULKIYEOK + {0x8D61, 0xB6DE}, //2163 #HANGUL SYLLABLE SSANGTIKEUT WE RIEULMIEUM + {0x8D62, 0xB6DF}, //2164 #HANGUL SYLLABLE SSANGTIKEUT WE RIEULPIEUP + {0x8D63, 0xB6E0}, //2165 #HANGUL SYLLABLE SSANGTIKEUT WE RIEULSIOS + {0x8D64, 0xB6E1}, //2166 #HANGUL SYLLABLE SSANGTIKEUT WE RIEULTHIEUTH + {0x8D65, 0xB6E2}, //2167 #HANGUL SYLLABLE SSANGTIKEUT WE RIEULPHIEUPH + {0x8D66, 0xB6E3}, //2168 #HANGUL SYLLABLE SSANGTIKEUT WE RIEULHIEUH + {0x8D67, 0xB6E4}, //2169 #HANGUL SYLLABLE SSANGTIKEUT WE MIEUM + {0x8D68, 0xB6E5}, //2170 #HANGUL SYLLABLE SSANGTIKEUT WE PIEUP + {0x8D69, 0xB6E6}, //2171 #HANGUL SYLLABLE SSANGTIKEUT WE PIEUPSIOS + {0x8D6A, 0xB6E7}, //2172 #HANGUL SYLLABLE SSANGTIKEUT WE SIOS + {0x8D6B, 0xB6E8}, //2173 #HANGUL SYLLABLE SSANGTIKEUT WE SSANGSIOS + {0x8D6C, 0xB6E9}, //2174 #HANGUL SYLLABLE SSANGTIKEUT WE IEUNG + {0x8D6D, 0xB6EA}, //2175 #HANGUL SYLLABLE SSANGTIKEUT WE CIEUC + {0x8D6E, 0xB6EB}, //2176 #HANGUL SYLLABLE SSANGTIKEUT WE CHIEUCH + {0x8D6F, 0xB6EC}, //2177 #HANGUL SYLLABLE SSANGTIKEUT WE KHIEUKH + {0x8D70, 0xB6ED}, //2178 #HANGUL SYLLABLE SSANGTIKEUT WE THIEUTH + {0x8D71, 0xB6EE}, //2179 #HANGUL SYLLABLE SSANGTIKEUT WE PHIEUPH + {0x8D72, 0xB6EF}, //2180 #HANGUL SYLLABLE SSANGTIKEUT WE HIEUH + {0x8D73, 0xB6F1}, //2181 #HANGUL SYLLABLE SSANGTIKEUT WI KIYEOK + {0x8D74, 0xB6F2}, //2182 #HANGUL SYLLABLE SSANGTIKEUT WI SSANGKIYEOK + {0x8D75, 0xB6F3}, //2183 #HANGUL SYLLABLE SSANGTIKEUT WI KIYEOKSIOS + {0x8D76, 0xB6F5}, //2184 #HANGUL SYLLABLE SSANGTIKEUT WI NIEUNCIEUC + {0x8D77, 0xB6F6}, //2185 #HANGUL SYLLABLE SSANGTIKEUT WI NIEUNHIEUH + {0x8D78, 0xB6F7}, //2186 #HANGUL SYLLABLE SSANGTIKEUT WI TIKEUT + {0x8D79, 0xB6F9}, //2187 #HANGUL SYLLABLE SSANGTIKEUT WI RIEULKIYEOK + {0x8D7A, 0xB6FA}, //2188 #HANGUL SYLLABLE SSANGTIKEUT WI RIEULMIEUM + {0x8D81, 0xB6FB}, //2189 #HANGUL SYLLABLE SSANGTIKEUT WI RIEULPIEUP + {0x8D82, 0xB6FC}, //2190 #HANGUL SYLLABLE SSANGTIKEUT WI RIEULSIOS + {0x8D83, 0xB6FD}, //2191 #HANGUL SYLLABLE SSANGTIKEUT WI RIEULTHIEUTH + {0x8D84, 0xB6FE}, //2192 #HANGUL SYLLABLE SSANGTIKEUT WI RIEULPHIEUPH + {0x8D85, 0xB6FF}, //2193 #HANGUL SYLLABLE SSANGTIKEUT WI RIEULHIEUH + {0x8D86, 0xB702}, //2194 #HANGUL SYLLABLE SSANGTIKEUT WI PIEUPSIOS + {0x8D87, 0xB703}, //2195 #HANGUL SYLLABLE SSANGTIKEUT WI SIOS + {0x8D88, 0xB704}, //2196 #HANGUL SYLLABLE SSANGTIKEUT WI SSANGSIOS + {0x8D89, 0xB706}, //2197 #HANGUL SYLLABLE SSANGTIKEUT WI CIEUC + {0x8D8A, 0xB707}, //2198 #HANGUL SYLLABLE SSANGTIKEUT WI CHIEUCH + {0x8D8B, 0xB708}, //2199 #HANGUL SYLLABLE SSANGTIKEUT WI KHIEUKH + {0x8D8C, 0xB709}, //2200 #HANGUL SYLLABLE SSANGTIKEUT WI THIEUTH + {0x8D8D, 0xB70A}, //2201 #HANGUL SYLLABLE SSANGTIKEUT WI PHIEUPH + {0x8D8E, 0xB70B}, //2202 #HANGUL SYLLABLE SSANGTIKEUT WI HIEUH + {0x8D8F, 0xB70C}, //2203 #HANGUL SYLLABLE SSANGTIKEUT YU + {0x8D90, 0xB70D}, //2204 #HANGUL SYLLABLE SSANGTIKEUT YU KIYEOK + {0x8D91, 0xB70E}, //2205 #HANGUL SYLLABLE SSANGTIKEUT YU SSANGKIYEOK + {0x8D92, 0xB70F}, //2206 #HANGUL SYLLABLE SSANGTIKEUT YU KIYEOKSIOS + {0x8D93, 0xB710}, //2207 #HANGUL SYLLABLE SSANGTIKEUT YU NIEUN + {0x8D94, 0xB711}, //2208 #HANGUL SYLLABLE SSANGTIKEUT YU NIEUNCIEUC + {0x8D95, 0xB712}, //2209 #HANGUL SYLLABLE SSANGTIKEUT YU NIEUNHIEUH + {0x8D96, 0xB713}, //2210 #HANGUL SYLLABLE SSANGTIKEUT YU TIKEUT + {0x8D97, 0xB714}, //2211 #HANGUL SYLLABLE SSANGTIKEUT YU RIEUL + {0x8D98, 0xB715}, //2212 #HANGUL SYLLABLE SSANGTIKEUT YU RIEULKIYEOK + {0x8D99, 0xB716}, //2213 #HANGUL SYLLABLE SSANGTIKEUT YU RIEULMIEUM + {0x8D9A, 0xB717}, //2214 #HANGUL SYLLABLE SSANGTIKEUT YU RIEULPIEUP + {0x8D9B, 0xB718}, //2215 #HANGUL SYLLABLE SSANGTIKEUT YU RIEULSIOS + {0x8D9C, 0xB719}, //2216 #HANGUL SYLLABLE SSANGTIKEUT YU RIEULTHIEUTH + {0x8D9D, 0xB71A}, //2217 #HANGUL SYLLABLE SSANGTIKEUT YU RIEULPHIEUPH + {0x8D9E, 0xB71B}, //2218 #HANGUL SYLLABLE SSANGTIKEUT YU RIEULHIEUH + {0x8D9F, 0xB71C}, //2219 #HANGUL SYLLABLE SSANGTIKEUT YU MIEUM + {0x8DA0, 0xB71D}, //2220 #HANGUL SYLLABLE SSANGTIKEUT YU PIEUP + {0x8DA1, 0xB71E}, //2221 #HANGUL SYLLABLE SSANGTIKEUT YU PIEUPSIOS + {0x8DA2, 0xB71F}, //2222 #HANGUL SYLLABLE SSANGTIKEUT YU SIOS + {0x8DA3, 0xB720}, //2223 #HANGUL SYLLABLE SSANGTIKEUT YU SSANGSIOS + {0x8DA4, 0xB721}, //2224 #HANGUL SYLLABLE SSANGTIKEUT YU IEUNG + {0x8DA5, 0xB722}, //2225 #HANGUL SYLLABLE SSANGTIKEUT YU CIEUC + {0x8DA6, 0xB723}, //2226 #HANGUL SYLLABLE SSANGTIKEUT YU CHIEUCH + {0x8DA7, 0xB724}, //2227 #HANGUL SYLLABLE SSANGTIKEUT YU KHIEUKH + {0x8DA8, 0xB725}, //2228 #HANGUL SYLLABLE SSANGTIKEUT YU THIEUTH + {0x8DA9, 0xB726}, //2229 #HANGUL SYLLABLE SSANGTIKEUT YU PHIEUPH + {0x8DAA, 0xB727}, //2230 #HANGUL SYLLABLE SSANGTIKEUT YU HIEUH + {0x8DAB, 0xB72A}, //2231 #HANGUL SYLLABLE SSANGTIKEUT EU SSANGKIYEOK + {0x8DAC, 0xB72B}, //2232 #HANGUL SYLLABLE SSANGTIKEUT EU KIYEOKSIOS + {0x8DAD, 0xB72D}, //2233 #HANGUL SYLLABLE SSANGTIKEUT EU NIEUNCIEUC + {0x8DAE, 0xB72E}, //2234 #HANGUL SYLLABLE SSANGTIKEUT EU NIEUNHIEUH + {0x8DAF, 0xB731}, //2235 #HANGUL SYLLABLE SSANGTIKEUT EU RIEULKIYEOK + {0x8DB0, 0xB732}, //2236 #HANGUL SYLLABLE SSANGTIKEUT EU RIEULMIEUM + {0x8DB1, 0xB733}, //2237 #HANGUL SYLLABLE SSANGTIKEUT EU RIEULPIEUP + {0x8DB2, 0xB734}, //2238 #HANGUL SYLLABLE SSANGTIKEUT EU RIEULSIOS + {0x8DB3, 0xB735}, //2239 #HANGUL SYLLABLE SSANGTIKEUT EU RIEULTHIEUTH + {0x8DB4, 0xB736}, //2240 #HANGUL SYLLABLE SSANGTIKEUT EU RIEULPHIEUPH + {0x8DB5, 0xB737}, //2241 #HANGUL SYLLABLE SSANGTIKEUT EU RIEULHIEUH + {0x8DB6, 0xB73A}, //2242 #HANGUL SYLLABLE SSANGTIKEUT EU PIEUPSIOS + {0x8DB7, 0xB73C}, //2243 #HANGUL SYLLABLE SSANGTIKEUT EU SSANGSIOS + {0x8DB8, 0xB73D}, //2244 #HANGUL SYLLABLE SSANGTIKEUT EU IEUNG + {0x8DB9, 0xB73E}, //2245 #HANGUL SYLLABLE SSANGTIKEUT EU CIEUC + {0x8DBA, 0xB73F}, //2246 #HANGUL SYLLABLE SSANGTIKEUT EU CHIEUCH + {0x8DBB, 0xB740}, //2247 #HANGUL SYLLABLE SSANGTIKEUT EU KHIEUKH + {0x8DBC, 0xB741}, //2248 #HANGUL SYLLABLE SSANGTIKEUT EU THIEUTH + {0x8DBD, 0xB742}, //2249 #HANGUL SYLLABLE SSANGTIKEUT EU PHIEUPH + {0x8DBE, 0xB743}, //2250 #HANGUL SYLLABLE SSANGTIKEUT EU HIEUH + {0x8DBF, 0xB745}, //2251 #HANGUL SYLLABLE SSANGTIKEUT YI KIYEOK + {0x8DC0, 0xB746}, //2252 #HANGUL SYLLABLE SSANGTIKEUT YI SSANGKIYEOK + {0x8DC1, 0xB747}, //2253 #HANGUL SYLLABLE SSANGTIKEUT YI KIYEOKSIOS + {0x8DC2, 0xB749}, //2254 #HANGUL SYLLABLE SSANGTIKEUT YI NIEUNCIEUC + {0x8DC3, 0xB74A}, //2255 #HANGUL SYLLABLE SSANGTIKEUT YI NIEUNHIEUH + {0x8DC4, 0xB74B}, //2256 #HANGUL SYLLABLE SSANGTIKEUT YI TIKEUT + {0x8DC5, 0xB74D}, //2257 #HANGUL SYLLABLE SSANGTIKEUT YI RIEULKIYEOK + {0x8DC6, 0xB74E}, //2258 #HANGUL SYLLABLE SSANGTIKEUT YI RIEULMIEUM + {0x8DC7, 0xB74F}, //2259 #HANGUL SYLLABLE SSANGTIKEUT YI RIEULPIEUP + {0x8DC8, 0xB750}, //2260 #HANGUL SYLLABLE SSANGTIKEUT YI RIEULSIOS + {0x8DC9, 0xB751}, //2261 #HANGUL SYLLABLE SSANGTIKEUT YI RIEULTHIEUTH + {0x8DCA, 0xB752}, //2262 #HANGUL SYLLABLE SSANGTIKEUT YI RIEULPHIEUPH + {0x8DCB, 0xB753}, //2263 #HANGUL SYLLABLE SSANGTIKEUT YI RIEULHIEUH + {0x8DCC, 0xB756}, //2264 #HANGUL SYLLABLE SSANGTIKEUT YI PIEUPSIOS + {0x8DCD, 0xB757}, //2265 #HANGUL SYLLABLE SSANGTIKEUT YI SIOS + {0x8DCE, 0xB758}, //2266 #HANGUL SYLLABLE SSANGTIKEUT YI SSANGSIOS + {0x8DCF, 0xB759}, //2267 #HANGUL SYLLABLE SSANGTIKEUT YI IEUNG + {0x8DD0, 0xB75A}, //2268 #HANGUL SYLLABLE SSANGTIKEUT YI CIEUC + {0x8DD1, 0xB75B}, //2269 #HANGUL SYLLABLE SSANGTIKEUT YI CHIEUCH + {0x8DD2, 0xB75C}, //2270 #HANGUL SYLLABLE SSANGTIKEUT YI KHIEUKH + {0x8DD3, 0xB75D}, //2271 #HANGUL SYLLABLE SSANGTIKEUT YI THIEUTH + {0x8DD4, 0xB75E}, //2272 #HANGUL SYLLABLE SSANGTIKEUT YI PHIEUPH + {0x8DD5, 0xB75F}, //2273 #HANGUL SYLLABLE SSANGTIKEUT YI HIEUH + {0x8DD6, 0xB761}, //2274 #HANGUL SYLLABLE SSANGTIKEUT I KIYEOK + {0x8DD7, 0xB762}, //2275 #HANGUL SYLLABLE SSANGTIKEUT I SSANGKIYEOK + {0x8DD8, 0xB763}, //2276 #HANGUL SYLLABLE SSANGTIKEUT I KIYEOKSIOS + {0x8DD9, 0xB765}, //2277 #HANGUL SYLLABLE SSANGTIKEUT I NIEUNCIEUC + {0x8DDA, 0xB766}, //2278 #HANGUL SYLLABLE SSANGTIKEUT I NIEUNHIEUH + {0x8DDB, 0xB767}, //2279 #HANGUL SYLLABLE SSANGTIKEUT I TIKEUT + {0x8DDC, 0xB769}, //2280 #HANGUL SYLLABLE SSANGTIKEUT I RIEULKIYEOK + {0x8DDD, 0xB76A}, //2281 #HANGUL SYLLABLE SSANGTIKEUT I RIEULMIEUM + {0x8DDE, 0xB76B}, //2282 #HANGUL SYLLABLE SSANGTIKEUT I RIEULPIEUP + {0x8DDF, 0xB76C}, //2283 #HANGUL SYLLABLE SSANGTIKEUT I RIEULSIOS + {0x8DE0, 0xB76D}, //2284 #HANGUL SYLLABLE SSANGTIKEUT I RIEULTHIEUTH + {0x8DE1, 0xB76E}, //2285 #HANGUL SYLLABLE SSANGTIKEUT I RIEULPHIEUPH + {0x8DE2, 0xB76F}, //2286 #HANGUL SYLLABLE SSANGTIKEUT I RIEULHIEUH + {0x8DE3, 0xB772}, //2287 #HANGUL SYLLABLE SSANGTIKEUT I PIEUPSIOS + {0x8DE4, 0xB774}, //2288 #HANGUL SYLLABLE SSANGTIKEUT I SSANGSIOS + {0x8DE5, 0xB776}, //2289 #HANGUL SYLLABLE SSANGTIKEUT I CIEUC + {0x8DE6, 0xB777}, //2290 #HANGUL SYLLABLE SSANGTIKEUT I CHIEUCH + {0x8DE7, 0xB778}, //2291 #HANGUL SYLLABLE SSANGTIKEUT I KHIEUKH + {0x8DE8, 0xB779}, //2292 #HANGUL SYLLABLE SSANGTIKEUT I THIEUTH + {0x8DE9, 0xB77A}, //2293 #HANGUL SYLLABLE SSANGTIKEUT I PHIEUPH + {0x8DEA, 0xB77B}, //2294 #HANGUL SYLLABLE SSANGTIKEUT I HIEUH + {0x8DEB, 0xB77E}, //2295 #HANGUL SYLLABLE RIEUL A SSANGKIYEOK + {0x8DEC, 0xB77F}, //2296 #HANGUL SYLLABLE RIEUL A KIYEOKSIOS + {0x8DED, 0xB781}, //2297 #HANGUL SYLLABLE RIEUL A NIEUNCIEUC + {0x8DEE, 0xB782}, //2298 #HANGUL SYLLABLE RIEUL A NIEUNHIEUH + {0x8DEF, 0xB783}, //2299 #HANGUL SYLLABLE RIEUL A TIKEUT + {0x8DF0, 0xB785}, //2300 #HANGUL SYLLABLE RIEUL A RIEULKIYEOK + {0x8DF1, 0xB786}, //2301 #HANGUL SYLLABLE RIEUL A RIEULMIEUM + {0x8DF2, 0xB787}, //2302 #HANGUL SYLLABLE RIEUL A RIEULPIEUP + {0x8DF3, 0xB788}, //2303 #HANGUL SYLLABLE RIEUL A RIEULSIOS + {0x8DF4, 0xB789}, //2304 #HANGUL SYLLABLE RIEUL A RIEULTHIEUTH + {0x8DF5, 0xB78A}, //2305 #HANGUL SYLLABLE RIEUL A RIEULPHIEUPH + {0x8DF6, 0xB78B}, //2306 #HANGUL SYLLABLE RIEUL A RIEULHIEUH + {0x8DF7, 0xB78E}, //2307 #HANGUL SYLLABLE RIEUL A PIEUPSIOS + {0x8DF8, 0xB793}, //2308 #HANGUL SYLLABLE RIEUL A CHIEUCH + {0x8DF9, 0xB794}, //2309 #HANGUL SYLLABLE RIEUL A KHIEUKH + {0x8DFA, 0xB795}, //2310 #HANGUL SYLLABLE RIEUL A THIEUTH + {0x8DFB, 0xB79A}, //2311 #HANGUL SYLLABLE RIEUL AE SSANGKIYEOK + {0x8DFC, 0xB79B}, //2312 #HANGUL SYLLABLE RIEUL AE KIYEOKSIOS + {0x8DFD, 0xB79D}, //2313 #HANGUL SYLLABLE RIEUL AE NIEUNCIEUC + {0x8DFE, 0xB79E}, //2314 #HANGUL SYLLABLE RIEUL AE NIEUNHIEUH + {0x8E41, 0xB79F}, //2315 #HANGUL SYLLABLE RIEUL AE TIKEUT + {0x8E42, 0xB7A1}, //2316 #HANGUL SYLLABLE RIEUL AE RIEULKIYEOK + {0x8E43, 0xB7A2}, //2317 #HANGUL SYLLABLE RIEUL AE RIEULMIEUM + {0x8E44, 0xB7A3}, //2318 #HANGUL SYLLABLE RIEUL AE RIEULPIEUP + {0x8E45, 0xB7A4}, //2319 #HANGUL SYLLABLE RIEUL AE RIEULSIOS + {0x8E46, 0xB7A5}, //2320 #HANGUL SYLLABLE RIEUL AE RIEULTHIEUTH + {0x8E47, 0xB7A6}, //2321 #HANGUL SYLLABLE RIEUL AE RIEULPHIEUPH + {0x8E48, 0xB7A7}, //2322 #HANGUL SYLLABLE RIEUL AE RIEULHIEUH + {0x8E49, 0xB7AA}, //2323 #HANGUL SYLLABLE RIEUL AE PIEUPSIOS + {0x8E4A, 0xB7AE}, //2324 #HANGUL SYLLABLE RIEUL AE CIEUC + {0x8E4B, 0xB7AF}, //2325 #HANGUL SYLLABLE RIEUL AE CHIEUCH + {0x8E4C, 0xB7B0}, //2326 #HANGUL SYLLABLE RIEUL AE KHIEUKH + {0x8E4D, 0xB7B1}, //2327 #HANGUL SYLLABLE RIEUL AE THIEUTH + {0x8E4E, 0xB7B2}, //2328 #HANGUL SYLLABLE RIEUL AE PHIEUPH + {0x8E4F, 0xB7B3}, //2329 #HANGUL SYLLABLE RIEUL AE HIEUH + {0x8E50, 0xB7B6}, //2330 #HANGUL SYLLABLE RIEUL YA SSANGKIYEOK + {0x8E51, 0xB7B7}, //2331 #HANGUL SYLLABLE RIEUL YA KIYEOKSIOS + {0x8E52, 0xB7B9}, //2332 #HANGUL SYLLABLE RIEUL YA NIEUNCIEUC + {0x8E53, 0xB7BA}, //2333 #HANGUL SYLLABLE RIEUL YA NIEUNHIEUH + {0x8E54, 0xB7BB}, //2334 #HANGUL SYLLABLE RIEUL YA TIKEUT + {0x8E55, 0xB7BC}, //2335 #HANGUL SYLLABLE RIEUL YA RIEUL + {0x8E56, 0xB7BD}, //2336 #HANGUL SYLLABLE RIEUL YA RIEULKIYEOK + {0x8E57, 0xB7BE}, //2337 #HANGUL SYLLABLE RIEUL YA RIEULMIEUM + {0x8E58, 0xB7BF}, //2338 #HANGUL SYLLABLE RIEUL YA RIEULPIEUP + {0x8E59, 0xB7C0}, //2339 #HANGUL SYLLABLE RIEUL YA RIEULSIOS + {0x8E5A, 0xB7C1}, //2340 #HANGUL SYLLABLE RIEUL YA RIEULTHIEUTH + {0x8E61, 0xB7C2}, //2341 #HANGUL SYLLABLE RIEUL YA RIEULPHIEUPH + {0x8E62, 0xB7C3}, //2342 #HANGUL SYLLABLE RIEUL YA RIEULHIEUH + {0x8E63, 0xB7C4}, //2343 #HANGUL SYLLABLE RIEUL YA MIEUM + {0x8E64, 0xB7C5}, //2344 #HANGUL SYLLABLE RIEUL YA PIEUP + {0x8E65, 0xB7C6}, //2345 #HANGUL SYLLABLE RIEUL YA PIEUPSIOS + {0x8E66, 0xB7C8}, //2346 #HANGUL SYLLABLE RIEUL YA SSANGSIOS + {0x8E67, 0xB7CA}, //2347 #HANGUL SYLLABLE RIEUL YA CIEUC + {0x8E68, 0xB7CB}, //2348 #HANGUL SYLLABLE RIEUL YA CHIEUCH + {0x8E69, 0xB7CC}, //2349 #HANGUL SYLLABLE RIEUL YA KHIEUKH + {0x8E6A, 0xB7CD}, //2350 #HANGUL SYLLABLE RIEUL YA THIEUTH + {0x8E6B, 0xB7CE}, //2351 #HANGUL SYLLABLE RIEUL YA PHIEUPH + {0x8E6C, 0xB7CF}, //2352 #HANGUL SYLLABLE RIEUL YA HIEUH + {0x8E6D, 0xB7D0}, //2353 #HANGUL SYLLABLE RIEUL YAE + {0x8E6E, 0xB7D1}, //2354 #HANGUL SYLLABLE RIEUL YAE KIYEOK + {0x8E6F, 0xB7D2}, //2355 #HANGUL SYLLABLE RIEUL YAE SSANGKIYEOK + {0x8E70, 0xB7D3}, //2356 #HANGUL SYLLABLE RIEUL YAE KIYEOKSIOS + {0x8E71, 0xB7D4}, //2357 #HANGUL SYLLABLE RIEUL YAE NIEUN + {0x8E72, 0xB7D5}, //2358 #HANGUL SYLLABLE RIEUL YAE NIEUNCIEUC + {0x8E73, 0xB7D6}, //2359 #HANGUL SYLLABLE RIEUL YAE NIEUNHIEUH + {0x8E74, 0xB7D7}, //2360 #HANGUL SYLLABLE RIEUL YAE TIKEUT + {0x8E75, 0xB7D8}, //2361 #HANGUL SYLLABLE RIEUL YAE RIEUL + {0x8E76, 0xB7D9}, //2362 #HANGUL SYLLABLE RIEUL YAE RIEULKIYEOK + {0x8E77, 0xB7DA}, //2363 #HANGUL SYLLABLE RIEUL YAE RIEULMIEUM + {0x8E78, 0xB7DB}, //2364 #HANGUL SYLLABLE RIEUL YAE RIEULPIEUP + {0x8E79, 0xB7DC}, //2365 #HANGUL SYLLABLE RIEUL YAE RIEULSIOS + {0x8E7A, 0xB7DD}, //2366 #HANGUL SYLLABLE RIEUL YAE RIEULTHIEUTH + {0x8E81, 0xB7DE}, //2367 #HANGUL SYLLABLE RIEUL YAE RIEULPHIEUPH + {0x8E82, 0xB7DF}, //2368 #HANGUL SYLLABLE RIEUL YAE RIEULHIEUH + {0x8E83, 0xB7E0}, //2369 #HANGUL SYLLABLE RIEUL YAE MIEUM + {0x8E84, 0xB7E1}, //2370 #HANGUL SYLLABLE RIEUL YAE PIEUP + {0x8E85, 0xB7E2}, //2371 #HANGUL SYLLABLE RIEUL YAE PIEUPSIOS + {0x8E86, 0xB7E3}, //2372 #HANGUL SYLLABLE RIEUL YAE SIOS + {0x8E87, 0xB7E4}, //2373 #HANGUL SYLLABLE RIEUL YAE SSANGSIOS + {0x8E88, 0xB7E5}, //2374 #HANGUL SYLLABLE RIEUL YAE IEUNG + {0x8E89, 0xB7E6}, //2375 #HANGUL SYLLABLE RIEUL YAE CIEUC + {0x8E8A, 0xB7E7}, //2376 #HANGUL SYLLABLE RIEUL YAE CHIEUCH + {0x8E8B, 0xB7E8}, //2377 #HANGUL SYLLABLE RIEUL YAE KHIEUKH + {0x8E8C, 0xB7E9}, //2378 #HANGUL SYLLABLE RIEUL YAE THIEUTH + {0x8E8D, 0xB7EA}, //2379 #HANGUL SYLLABLE RIEUL YAE PHIEUPH + {0x8E8E, 0xB7EB}, //2380 #HANGUL SYLLABLE RIEUL YAE HIEUH + {0x8E8F, 0xB7EE}, //2381 #HANGUL SYLLABLE RIEUL EO SSANGKIYEOK + {0x8E90, 0xB7EF}, //2382 #HANGUL SYLLABLE RIEUL EO KIYEOKSIOS + {0x8E91, 0xB7F1}, //2383 #HANGUL SYLLABLE RIEUL EO NIEUNCIEUC + {0x8E92, 0xB7F2}, //2384 #HANGUL SYLLABLE RIEUL EO NIEUNHIEUH + {0x8E93, 0xB7F3}, //2385 #HANGUL SYLLABLE RIEUL EO TIKEUT + {0x8E94, 0xB7F5}, //2386 #HANGUL SYLLABLE RIEUL EO RIEULKIYEOK + {0x8E95, 0xB7F6}, //2387 #HANGUL SYLLABLE RIEUL EO RIEULMIEUM + {0x8E96, 0xB7F7}, //2388 #HANGUL SYLLABLE RIEUL EO RIEULPIEUP + {0x8E97, 0xB7F8}, //2389 #HANGUL SYLLABLE RIEUL EO RIEULSIOS + {0x8E98, 0xB7F9}, //2390 #HANGUL SYLLABLE RIEUL EO RIEULTHIEUTH + {0x8E99, 0xB7FA}, //2391 #HANGUL SYLLABLE RIEUL EO RIEULPHIEUPH + {0x8E9A, 0xB7FB}, //2392 #HANGUL SYLLABLE RIEUL EO RIEULHIEUH + {0x8E9B, 0xB7FE}, //2393 #HANGUL SYLLABLE RIEUL EO PIEUPSIOS + {0x8E9C, 0xB802}, //2394 #HANGUL SYLLABLE RIEUL EO CIEUC + {0x8E9D, 0xB803}, //2395 #HANGUL SYLLABLE RIEUL EO CHIEUCH + {0x8E9E, 0xB804}, //2396 #HANGUL SYLLABLE RIEUL EO KHIEUKH + {0x8E9F, 0xB805}, //2397 #HANGUL SYLLABLE RIEUL EO THIEUTH + {0x8EA0, 0xB806}, //2398 #HANGUL SYLLABLE RIEUL EO PHIEUPH + {0x8EA1, 0xB80A}, //2399 #HANGUL SYLLABLE RIEUL E SSANGKIYEOK + {0x8EA2, 0xB80B}, //2400 #HANGUL SYLLABLE RIEUL E KIYEOKSIOS + {0x8EA3, 0xB80D}, //2401 #HANGUL SYLLABLE RIEUL E NIEUNCIEUC + {0x8EA4, 0xB80E}, //2402 #HANGUL SYLLABLE RIEUL E NIEUNHIEUH + {0x8EA5, 0xB80F}, //2403 #HANGUL SYLLABLE RIEUL E TIKEUT + {0x8EA6, 0xB811}, //2404 #HANGUL SYLLABLE RIEUL E RIEULKIYEOK + {0x8EA7, 0xB812}, //2405 #HANGUL SYLLABLE RIEUL E RIEULMIEUM + {0x8EA8, 0xB813}, //2406 #HANGUL SYLLABLE RIEUL E RIEULPIEUP + {0x8EA9, 0xB814}, //2407 #HANGUL SYLLABLE RIEUL E RIEULSIOS + {0x8EAA, 0xB815}, //2408 #HANGUL SYLLABLE RIEUL E RIEULTHIEUTH + {0x8EAB, 0xB816}, //2409 #HANGUL SYLLABLE RIEUL E RIEULPHIEUPH + {0x8EAC, 0xB817}, //2410 #HANGUL SYLLABLE RIEUL E RIEULHIEUH + {0x8EAD, 0xB81A}, //2411 #HANGUL SYLLABLE RIEUL E PIEUPSIOS + {0x8EAE, 0xB81C}, //2412 #HANGUL SYLLABLE RIEUL E SSANGSIOS + {0x8EAF, 0xB81E}, //2413 #HANGUL SYLLABLE RIEUL E CIEUC + {0x8EB0, 0xB81F}, //2414 #HANGUL SYLLABLE RIEUL E CHIEUCH + {0x8EB1, 0xB820}, //2415 #HANGUL SYLLABLE RIEUL E KHIEUKH + {0x8EB2, 0xB821}, //2416 #HANGUL SYLLABLE RIEUL E THIEUTH + {0x8EB3, 0xB822}, //2417 #HANGUL SYLLABLE RIEUL E PHIEUPH + {0x8EB4, 0xB823}, //2418 #HANGUL SYLLABLE RIEUL E HIEUH + {0x8EB5, 0xB826}, //2419 #HANGUL SYLLABLE RIEUL YEO SSANGKIYEOK + {0x8EB6, 0xB827}, //2420 #HANGUL SYLLABLE RIEUL YEO KIYEOKSIOS + {0x8EB7, 0xB829}, //2421 #HANGUL SYLLABLE RIEUL YEO NIEUNCIEUC + {0x8EB8, 0xB82A}, //2422 #HANGUL SYLLABLE RIEUL YEO NIEUNHIEUH + {0x8EB9, 0xB82B}, //2423 #HANGUL SYLLABLE RIEUL YEO TIKEUT + {0x8EBA, 0xB82D}, //2424 #HANGUL SYLLABLE RIEUL YEO RIEULKIYEOK + {0x8EBB, 0xB82E}, //2425 #HANGUL SYLLABLE RIEUL YEO RIEULMIEUM + {0x8EBC, 0xB82F}, //2426 #HANGUL SYLLABLE RIEUL YEO RIEULPIEUP + {0x8EBD, 0xB830}, //2427 #HANGUL SYLLABLE RIEUL YEO RIEULSIOS + {0x8EBE, 0xB831}, //2428 #HANGUL SYLLABLE RIEUL YEO RIEULTHIEUTH + {0x8EBF, 0xB832}, //2429 #HANGUL SYLLABLE RIEUL YEO RIEULPHIEUPH + {0x8EC0, 0xB833}, //2430 #HANGUL SYLLABLE RIEUL YEO RIEULHIEUH + {0x8EC1, 0xB836}, //2431 #HANGUL SYLLABLE RIEUL YEO PIEUPSIOS + {0x8EC2, 0xB83A}, //2432 #HANGUL SYLLABLE RIEUL YEO CIEUC + {0x8EC3, 0xB83B}, //2433 #HANGUL SYLLABLE RIEUL YEO CHIEUCH + {0x8EC4, 0xB83C}, //2434 #HANGUL SYLLABLE RIEUL YEO KHIEUKH + {0x8EC5, 0xB83D}, //2435 #HANGUL SYLLABLE RIEUL YEO THIEUTH + {0x8EC6, 0xB83E}, //2436 #HANGUL SYLLABLE RIEUL YEO PHIEUPH + {0x8EC7, 0xB83F}, //2437 #HANGUL SYLLABLE RIEUL YEO HIEUH + {0x8EC8, 0xB841}, //2438 #HANGUL SYLLABLE RIEUL YE KIYEOK + {0x8EC9, 0xB842}, //2439 #HANGUL SYLLABLE RIEUL YE SSANGKIYEOK + {0x8ECA, 0xB843}, //2440 #HANGUL SYLLABLE RIEUL YE KIYEOKSIOS + {0x8ECB, 0xB845}, //2441 #HANGUL SYLLABLE RIEUL YE NIEUNCIEUC + {0x8ECC, 0xB846}, //2442 #HANGUL SYLLABLE RIEUL YE NIEUNHIEUH + {0x8ECD, 0xB847}, //2443 #HANGUL SYLLABLE RIEUL YE TIKEUT + {0x8ECE, 0xB848}, //2444 #HANGUL SYLLABLE RIEUL YE RIEUL + {0x8ECF, 0xB849}, //2445 #HANGUL SYLLABLE RIEUL YE RIEULKIYEOK + {0x8ED0, 0xB84A}, //2446 #HANGUL SYLLABLE RIEUL YE RIEULMIEUM + {0x8ED1, 0xB84B}, //2447 #HANGUL SYLLABLE RIEUL YE RIEULPIEUP + {0x8ED2, 0xB84C}, //2448 #HANGUL SYLLABLE RIEUL YE RIEULSIOS + {0x8ED3, 0xB84D}, //2449 #HANGUL SYLLABLE RIEUL YE RIEULTHIEUTH + {0x8ED4, 0xB84E}, //2450 #HANGUL SYLLABLE RIEUL YE RIEULPHIEUPH + {0x8ED5, 0xB84F}, //2451 #HANGUL SYLLABLE RIEUL YE RIEULHIEUH + {0x8ED6, 0xB850}, //2452 #HANGUL SYLLABLE RIEUL YE MIEUM + {0x8ED7, 0xB852}, //2453 #HANGUL SYLLABLE RIEUL YE PIEUPSIOS + {0x8ED8, 0xB854}, //2454 #HANGUL SYLLABLE RIEUL YE SSANGSIOS + {0x8ED9, 0xB855}, //2455 #HANGUL SYLLABLE RIEUL YE IEUNG + {0x8EDA, 0xB856}, //2456 #HANGUL SYLLABLE RIEUL YE CIEUC + {0x8EDB, 0xB857}, //2457 #HANGUL SYLLABLE RIEUL YE CHIEUCH + {0x8EDC, 0xB858}, //2458 #HANGUL SYLLABLE RIEUL YE KHIEUKH + {0x8EDD, 0xB859}, //2459 #HANGUL SYLLABLE RIEUL YE THIEUTH + {0x8EDE, 0xB85A}, //2460 #HANGUL SYLLABLE RIEUL YE PHIEUPH + {0x8EDF, 0xB85B}, //2461 #HANGUL SYLLABLE RIEUL YE HIEUH + {0x8EE0, 0xB85E}, //2462 #HANGUL SYLLABLE RIEUL O SSANGKIYEOK + {0x8EE1, 0xB85F}, //2463 #HANGUL SYLLABLE RIEUL O KIYEOKSIOS + {0x8EE2, 0xB861}, //2464 #HANGUL SYLLABLE RIEUL O NIEUNCIEUC + {0x8EE3, 0xB862}, //2465 #HANGUL SYLLABLE RIEUL O NIEUNHIEUH + {0x8EE4, 0xB863}, //2466 #HANGUL SYLLABLE RIEUL O TIKEUT + {0x8EE5, 0xB865}, //2467 #HANGUL SYLLABLE RIEUL O RIEULKIYEOK + {0x8EE6, 0xB866}, //2468 #HANGUL SYLLABLE RIEUL O RIEULMIEUM + {0x8EE7, 0xB867}, //2469 #HANGUL SYLLABLE RIEUL O RIEULPIEUP + {0x8EE8, 0xB868}, //2470 #HANGUL SYLLABLE RIEUL O RIEULSIOS + {0x8EE9, 0xB869}, //2471 #HANGUL SYLLABLE RIEUL O RIEULTHIEUTH + {0x8EEA, 0xB86A}, //2472 #HANGUL SYLLABLE RIEUL O RIEULPHIEUPH + {0x8EEB, 0xB86B}, //2473 #HANGUL SYLLABLE RIEUL O RIEULHIEUH + {0x8EEC, 0xB86E}, //2474 #HANGUL SYLLABLE RIEUL O PIEUPSIOS + {0x8EED, 0xB870}, //2475 #HANGUL SYLLABLE RIEUL O SSANGSIOS + {0x8EEE, 0xB872}, //2476 #HANGUL SYLLABLE RIEUL O CIEUC + {0x8EEF, 0xB873}, //2477 #HANGUL SYLLABLE RIEUL O CHIEUCH + {0x8EF0, 0xB874}, //2478 #HANGUL SYLLABLE RIEUL O KHIEUKH + {0x8EF1, 0xB875}, //2479 #HANGUL SYLLABLE RIEUL O THIEUTH + {0x8EF2, 0xB876}, //2480 #HANGUL SYLLABLE RIEUL O PHIEUPH + {0x8EF3, 0xB877}, //2481 #HANGUL SYLLABLE RIEUL O HIEUH + {0x8EF4, 0xB879}, //2482 #HANGUL SYLLABLE RIEUL WA KIYEOK + {0x8EF5, 0xB87A}, //2483 #HANGUL SYLLABLE RIEUL WA SSANGKIYEOK + {0x8EF6, 0xB87B}, //2484 #HANGUL SYLLABLE RIEUL WA KIYEOKSIOS + {0x8EF7, 0xB87D}, //2485 #HANGUL SYLLABLE RIEUL WA NIEUNCIEUC + {0x8EF8, 0xB87E}, //2486 #HANGUL SYLLABLE RIEUL WA NIEUNHIEUH + {0x8EF9, 0xB87F}, //2487 #HANGUL SYLLABLE RIEUL WA TIKEUT + {0x8EFA, 0xB880}, //2488 #HANGUL SYLLABLE RIEUL WA RIEUL + {0x8EFB, 0xB881}, //2489 #HANGUL SYLLABLE RIEUL WA RIEULKIYEOK + {0x8EFC, 0xB882}, //2490 #HANGUL SYLLABLE RIEUL WA RIEULMIEUM + {0x8EFD, 0xB883}, //2491 #HANGUL SYLLABLE RIEUL WA RIEULPIEUP + {0x8EFE, 0xB884}, //2492 #HANGUL SYLLABLE RIEUL WA RIEULSIOS + {0x8F41, 0xB885}, //2493 #HANGUL SYLLABLE RIEUL WA RIEULTHIEUTH + {0x8F42, 0xB886}, //2494 #HANGUL SYLLABLE RIEUL WA RIEULPHIEUPH + {0x8F43, 0xB887}, //2495 #HANGUL SYLLABLE RIEUL WA RIEULHIEUH + {0x8F44, 0xB888}, //2496 #HANGUL SYLLABLE RIEUL WA MIEUM + {0x8F45, 0xB889}, //2497 #HANGUL SYLLABLE RIEUL WA PIEUP + {0x8F46, 0xB88A}, //2498 #HANGUL SYLLABLE RIEUL WA PIEUPSIOS + {0x8F47, 0xB88B}, //2499 #HANGUL SYLLABLE RIEUL WA SIOS + {0x8F48, 0xB88C}, //2500 #HANGUL SYLLABLE RIEUL WA SSANGSIOS + {0x8F49, 0xB88E}, //2501 #HANGUL SYLLABLE RIEUL WA CIEUC + {0x8F4A, 0xB88F}, //2502 #HANGUL SYLLABLE RIEUL WA CHIEUCH + {0x8F4B, 0xB890}, //2503 #HANGUL SYLLABLE RIEUL WA KHIEUKH + {0x8F4C, 0xB891}, //2504 #HANGUL SYLLABLE RIEUL WA THIEUTH + {0x8F4D, 0xB892}, //2505 #HANGUL SYLLABLE RIEUL WA PHIEUPH + {0x8F4E, 0xB893}, //2506 #HANGUL SYLLABLE RIEUL WA HIEUH + {0x8F4F, 0xB894}, //2507 #HANGUL SYLLABLE RIEUL WAE + {0x8F50, 0xB895}, //2508 #HANGUL SYLLABLE RIEUL WAE KIYEOK + {0x8F51, 0xB896}, //2509 #HANGUL SYLLABLE RIEUL WAE SSANGKIYEOK + {0x8F52, 0xB897}, //2510 #HANGUL SYLLABLE RIEUL WAE KIYEOKSIOS + {0x8F53, 0xB898}, //2511 #HANGUL SYLLABLE RIEUL WAE NIEUN + {0x8F54, 0xB899}, //2512 #HANGUL SYLLABLE RIEUL WAE NIEUNCIEUC + {0x8F55, 0xB89A}, //2513 #HANGUL SYLLABLE RIEUL WAE NIEUNHIEUH + {0x8F56, 0xB89B}, //2514 #HANGUL SYLLABLE RIEUL WAE TIKEUT + {0x8F57, 0xB89C}, //2515 #HANGUL SYLLABLE RIEUL WAE RIEUL + {0x8F58, 0xB89D}, //2516 #HANGUL SYLLABLE RIEUL WAE RIEULKIYEOK + {0x8F59, 0xB89E}, //2517 #HANGUL SYLLABLE RIEUL WAE RIEULMIEUM + {0x8F5A, 0xB89F}, //2518 #HANGUL SYLLABLE RIEUL WAE RIEULPIEUP + {0x8F61, 0xB8A0}, //2519 #HANGUL SYLLABLE RIEUL WAE RIEULSIOS + {0x8F62, 0xB8A1}, //2520 #HANGUL SYLLABLE RIEUL WAE RIEULTHIEUTH + {0x8F63, 0xB8A2}, //2521 #HANGUL SYLLABLE RIEUL WAE RIEULPHIEUPH + {0x8F64, 0xB8A3}, //2522 #HANGUL SYLLABLE RIEUL WAE RIEULHIEUH + {0x8F65, 0xB8A4}, //2523 #HANGUL SYLLABLE RIEUL WAE MIEUM + {0x8F66, 0xB8A5}, //2524 #HANGUL SYLLABLE RIEUL WAE PIEUP + {0x8F67, 0xB8A6}, //2525 #HANGUL SYLLABLE RIEUL WAE PIEUPSIOS + {0x8F68, 0xB8A7}, //2526 #HANGUL SYLLABLE RIEUL WAE SIOS + {0x8F69, 0xB8A9}, //2527 #HANGUL SYLLABLE RIEUL WAE IEUNG + {0x8F6A, 0xB8AA}, //2528 #HANGUL SYLLABLE RIEUL WAE CIEUC + {0x8F6B, 0xB8AB}, //2529 #HANGUL SYLLABLE RIEUL WAE CHIEUCH + {0x8F6C, 0xB8AC}, //2530 #HANGUL SYLLABLE RIEUL WAE KHIEUKH + {0x8F6D, 0xB8AD}, //2531 #HANGUL SYLLABLE RIEUL WAE THIEUTH + {0x8F6E, 0xB8AE}, //2532 #HANGUL SYLLABLE RIEUL WAE PHIEUPH + {0x8F6F, 0xB8AF}, //2533 #HANGUL SYLLABLE RIEUL WAE HIEUH + {0x8F70, 0xB8B1}, //2534 #HANGUL SYLLABLE RIEUL OE KIYEOK + {0x8F71, 0xB8B2}, //2535 #HANGUL SYLLABLE RIEUL OE SSANGKIYEOK + {0x8F72, 0xB8B3}, //2536 #HANGUL SYLLABLE RIEUL OE KIYEOKSIOS + {0x8F73, 0xB8B5}, //2537 #HANGUL SYLLABLE RIEUL OE NIEUNCIEUC + {0x8F74, 0xB8B6}, //2538 #HANGUL SYLLABLE RIEUL OE NIEUNHIEUH + {0x8F75, 0xB8B7}, //2539 #HANGUL SYLLABLE RIEUL OE TIKEUT + {0x8F76, 0xB8B9}, //2540 #HANGUL SYLLABLE RIEUL OE RIEULKIYEOK + {0x8F77, 0xB8BA}, //2541 #HANGUL SYLLABLE RIEUL OE RIEULMIEUM + {0x8F78, 0xB8BB}, //2542 #HANGUL SYLLABLE RIEUL OE RIEULPIEUP + {0x8F79, 0xB8BC}, //2543 #HANGUL SYLLABLE RIEUL OE RIEULSIOS + {0x8F7A, 0xB8BD}, //2544 #HANGUL SYLLABLE RIEUL OE RIEULTHIEUTH + {0x8F81, 0xB8BE}, //2545 #HANGUL SYLLABLE RIEUL OE RIEULPHIEUPH + {0x8F82, 0xB8BF}, //2546 #HANGUL SYLLABLE RIEUL OE RIEULHIEUH + {0x8F83, 0xB8C2}, //2547 #HANGUL SYLLABLE RIEUL OE PIEUPSIOS + {0x8F84, 0xB8C4}, //2548 #HANGUL SYLLABLE RIEUL OE SSANGSIOS + {0x8F85, 0xB8C6}, //2549 #HANGUL SYLLABLE RIEUL OE CIEUC + {0x8F86, 0xB8C7}, //2550 #HANGUL SYLLABLE RIEUL OE CHIEUCH + {0x8F87, 0xB8C8}, //2551 #HANGUL SYLLABLE RIEUL OE KHIEUKH + {0x8F88, 0xB8C9}, //2552 #HANGUL SYLLABLE RIEUL OE THIEUTH + {0x8F89, 0xB8CA}, //2553 #HANGUL SYLLABLE RIEUL OE PHIEUPH + {0x8F8A, 0xB8CB}, //2554 #HANGUL SYLLABLE RIEUL OE HIEUH + {0x8F8B, 0xB8CD}, //2555 #HANGUL SYLLABLE RIEUL YO KIYEOK + {0x8F8C, 0xB8CE}, //2556 #HANGUL SYLLABLE RIEUL YO SSANGKIYEOK + {0x8F8D, 0xB8CF}, //2557 #HANGUL SYLLABLE RIEUL YO KIYEOKSIOS + {0x8F8E, 0xB8D1}, //2558 #HANGUL SYLLABLE RIEUL YO NIEUNCIEUC + {0x8F8F, 0xB8D2}, //2559 #HANGUL SYLLABLE RIEUL YO NIEUNHIEUH + {0x8F90, 0xB8D3}, //2560 #HANGUL SYLLABLE RIEUL YO TIKEUT + {0x8F91, 0xB8D5}, //2561 #HANGUL SYLLABLE RIEUL YO RIEULKIYEOK + {0x8F92, 0xB8D6}, //2562 #HANGUL SYLLABLE RIEUL YO RIEULMIEUM + {0x8F93, 0xB8D7}, //2563 #HANGUL SYLLABLE RIEUL YO RIEULPIEUP + {0x8F94, 0xB8D8}, //2564 #HANGUL SYLLABLE RIEUL YO RIEULSIOS + {0x8F95, 0xB8D9}, //2565 #HANGUL SYLLABLE RIEUL YO RIEULTHIEUTH + {0x8F96, 0xB8DA}, //2566 #HANGUL SYLLABLE RIEUL YO RIEULPHIEUPH + {0x8F97, 0xB8DB}, //2567 #HANGUL SYLLABLE RIEUL YO RIEULHIEUH + {0x8F98, 0xB8DC}, //2568 #HANGUL SYLLABLE RIEUL YO MIEUM + {0x8F99, 0xB8DE}, //2569 #HANGUL SYLLABLE RIEUL YO PIEUPSIOS + {0x8F9A, 0xB8E0}, //2570 #HANGUL SYLLABLE RIEUL YO SSANGSIOS + {0x8F9B, 0xB8E2}, //2571 #HANGUL SYLLABLE RIEUL YO CIEUC + {0x8F9C, 0xB8E3}, //2572 #HANGUL SYLLABLE RIEUL YO CHIEUCH + {0x8F9D, 0xB8E4}, //2573 #HANGUL SYLLABLE RIEUL YO KHIEUKH + {0x8F9E, 0xB8E5}, //2574 #HANGUL SYLLABLE RIEUL YO THIEUTH + {0x8F9F, 0xB8E6}, //2575 #HANGUL SYLLABLE RIEUL YO PHIEUPH + {0x8FA0, 0xB8E7}, //2576 #HANGUL SYLLABLE RIEUL YO HIEUH + {0x8FA1, 0xB8EA}, //2577 #HANGUL SYLLABLE RIEUL U SSANGKIYEOK + {0x8FA2, 0xB8EB}, //2578 #HANGUL SYLLABLE RIEUL U KIYEOKSIOS + {0x8FA3, 0xB8ED}, //2579 #HANGUL SYLLABLE RIEUL U NIEUNCIEUC + {0x8FA4, 0xB8EE}, //2580 #HANGUL SYLLABLE RIEUL U NIEUNHIEUH + {0x8FA5, 0xB8EF}, //2581 #HANGUL SYLLABLE RIEUL U TIKEUT + {0x8FA6, 0xB8F1}, //2582 #HANGUL SYLLABLE RIEUL U RIEULKIYEOK + {0x8FA7, 0xB8F2}, //2583 #HANGUL SYLLABLE RIEUL U RIEULMIEUM + {0x8FA8, 0xB8F3}, //2584 #HANGUL SYLLABLE RIEUL U RIEULPIEUP + {0x8FA9, 0xB8F4}, //2585 #HANGUL SYLLABLE RIEUL U RIEULSIOS + {0x8FAA, 0xB8F5}, //2586 #HANGUL SYLLABLE RIEUL U RIEULTHIEUTH + {0x8FAB, 0xB8F6}, //2587 #HANGUL SYLLABLE RIEUL U RIEULPHIEUPH + {0x8FAC, 0xB8F7}, //2588 #HANGUL SYLLABLE RIEUL U RIEULHIEUH + {0x8FAD, 0xB8FA}, //2589 #HANGUL SYLLABLE RIEUL U PIEUPSIOS + {0x8FAE, 0xB8FC}, //2590 #HANGUL SYLLABLE RIEUL U SSANGSIOS + {0x8FAF, 0xB8FE}, //2591 #HANGUL SYLLABLE RIEUL U CIEUC + {0x8FB0, 0xB8FF}, //2592 #HANGUL SYLLABLE RIEUL U CHIEUCH + {0x8FB1, 0xB900}, //2593 #HANGUL SYLLABLE RIEUL U KHIEUKH + {0x8FB2, 0xB901}, //2594 #HANGUL SYLLABLE RIEUL U THIEUTH + {0x8FB3, 0xB902}, //2595 #HANGUL SYLLABLE RIEUL U PHIEUPH + {0x8FB4, 0xB903}, //2596 #HANGUL SYLLABLE RIEUL U HIEUH + {0x8FB5, 0xB905}, //2597 #HANGUL SYLLABLE RIEUL WEO KIYEOK + {0x8FB6, 0xB906}, //2598 #HANGUL SYLLABLE RIEUL WEO SSANGKIYEOK + {0x8FB7, 0xB907}, //2599 #HANGUL SYLLABLE RIEUL WEO KIYEOKSIOS + {0x8FB8, 0xB908}, //2600 #HANGUL SYLLABLE RIEUL WEO NIEUN + {0x8FB9, 0xB909}, //2601 #HANGUL SYLLABLE RIEUL WEO NIEUNCIEUC + {0x8FBA, 0xB90A}, //2602 #HANGUL SYLLABLE RIEUL WEO NIEUNHIEUH + {0x8FBB, 0xB90B}, //2603 #HANGUL SYLLABLE RIEUL WEO TIKEUT + {0x8FBC, 0xB90C}, //2604 #HANGUL SYLLABLE RIEUL WEO RIEUL + {0x8FBD, 0xB90D}, //2605 #HANGUL SYLLABLE RIEUL WEO RIEULKIYEOK + {0x8FBE, 0xB90E}, //2606 #HANGUL SYLLABLE RIEUL WEO RIEULMIEUM + {0x8FBF, 0xB90F}, //2607 #HANGUL SYLLABLE RIEUL WEO RIEULPIEUP + {0x8FC0, 0xB910}, //2608 #HANGUL SYLLABLE RIEUL WEO RIEULSIOS + {0x8FC1, 0xB911}, //2609 #HANGUL SYLLABLE RIEUL WEO RIEULTHIEUTH + {0x8FC2, 0xB912}, //2610 #HANGUL SYLLABLE RIEUL WEO RIEULPHIEUPH + {0x8FC3, 0xB913}, //2611 #HANGUL SYLLABLE RIEUL WEO RIEULHIEUH + {0x8FC4, 0xB914}, //2612 #HANGUL SYLLABLE RIEUL WEO MIEUM + {0x8FC5, 0xB915}, //2613 #HANGUL SYLLABLE RIEUL WEO PIEUP + {0x8FC6, 0xB916}, //2614 #HANGUL SYLLABLE RIEUL WEO PIEUPSIOS + {0x8FC7, 0xB917}, //2615 #HANGUL SYLLABLE RIEUL WEO SIOS + {0x8FC8, 0xB919}, //2616 #HANGUL SYLLABLE RIEUL WEO IEUNG + {0x8FC9, 0xB91A}, //2617 #HANGUL SYLLABLE RIEUL WEO CIEUC + {0x8FCA, 0xB91B}, //2618 #HANGUL SYLLABLE RIEUL WEO CHIEUCH + {0x8FCB, 0xB91C}, //2619 #HANGUL SYLLABLE RIEUL WEO KHIEUKH + {0x8FCC, 0xB91D}, //2620 #HANGUL SYLLABLE RIEUL WEO THIEUTH + {0x8FCD, 0xB91E}, //2621 #HANGUL SYLLABLE RIEUL WEO PHIEUPH + {0x8FCE, 0xB91F}, //2622 #HANGUL SYLLABLE RIEUL WEO HIEUH + {0x8FCF, 0xB921}, //2623 #HANGUL SYLLABLE RIEUL WE KIYEOK + {0x8FD0, 0xB922}, //2624 #HANGUL SYLLABLE RIEUL WE SSANGKIYEOK + {0x8FD1, 0xB923}, //2625 #HANGUL SYLLABLE RIEUL WE KIYEOKSIOS + {0x8FD2, 0xB924}, //2626 #HANGUL SYLLABLE RIEUL WE NIEUN + {0x8FD3, 0xB925}, //2627 #HANGUL SYLLABLE RIEUL WE NIEUNCIEUC + {0x8FD4, 0xB926}, //2628 #HANGUL SYLLABLE RIEUL WE NIEUNHIEUH + {0x8FD5, 0xB927}, //2629 #HANGUL SYLLABLE RIEUL WE TIKEUT + {0x8FD6, 0xB928}, //2630 #HANGUL SYLLABLE RIEUL WE RIEUL + {0x8FD7, 0xB929}, //2631 #HANGUL SYLLABLE RIEUL WE RIEULKIYEOK + {0x8FD8, 0xB92A}, //2632 #HANGUL SYLLABLE RIEUL WE RIEULMIEUM + {0x8FD9, 0xB92B}, //2633 #HANGUL SYLLABLE RIEUL WE RIEULPIEUP + {0x8FDA, 0xB92C}, //2634 #HANGUL SYLLABLE RIEUL WE RIEULSIOS + {0x8FDB, 0xB92D}, //2635 #HANGUL SYLLABLE RIEUL WE RIEULTHIEUTH + {0x8FDC, 0xB92E}, //2636 #HANGUL SYLLABLE RIEUL WE RIEULPHIEUPH + {0x8FDD, 0xB92F}, //2637 #HANGUL SYLLABLE RIEUL WE RIEULHIEUH + {0x8FDE, 0xB930}, //2638 #HANGUL SYLLABLE RIEUL WE MIEUM + {0x8FDF, 0xB931}, //2639 #HANGUL SYLLABLE RIEUL WE PIEUP + {0x8FE0, 0xB932}, //2640 #HANGUL SYLLABLE RIEUL WE PIEUPSIOS + {0x8FE1, 0xB933}, //2641 #HANGUL SYLLABLE RIEUL WE SIOS + {0x8FE2, 0xB934}, //2642 #HANGUL SYLLABLE RIEUL WE SSANGSIOS + {0x8FE3, 0xB935}, //2643 #HANGUL SYLLABLE RIEUL WE IEUNG + {0x8FE4, 0xB936}, //2644 #HANGUL SYLLABLE RIEUL WE CIEUC + {0x8FE5, 0xB937}, //2645 #HANGUL SYLLABLE RIEUL WE CHIEUCH + {0x8FE6, 0xB938}, //2646 #HANGUL SYLLABLE RIEUL WE KHIEUKH + {0x8FE7, 0xB939}, //2647 #HANGUL SYLLABLE RIEUL WE THIEUTH + {0x8FE8, 0xB93A}, //2648 #HANGUL SYLLABLE RIEUL WE PHIEUPH + {0x8FE9, 0xB93B}, //2649 #HANGUL SYLLABLE RIEUL WE HIEUH + {0x8FEA, 0xB93E}, //2650 #HANGUL SYLLABLE RIEUL WI SSANGKIYEOK + {0x8FEB, 0xB93F}, //2651 #HANGUL SYLLABLE RIEUL WI KIYEOKSIOS + {0x8FEC, 0xB941}, //2652 #HANGUL SYLLABLE RIEUL WI NIEUNCIEUC + {0x8FED, 0xB942}, //2653 #HANGUL SYLLABLE RIEUL WI NIEUNHIEUH + {0x8FEE, 0xB943}, //2654 #HANGUL SYLLABLE RIEUL WI TIKEUT + {0x8FEF, 0xB945}, //2655 #HANGUL SYLLABLE RIEUL WI RIEULKIYEOK + {0x8FF0, 0xB946}, //2656 #HANGUL SYLLABLE RIEUL WI RIEULMIEUM + {0x8FF1, 0xB947}, //2657 #HANGUL SYLLABLE RIEUL WI RIEULPIEUP + {0x8FF2, 0xB948}, //2658 #HANGUL SYLLABLE RIEUL WI RIEULSIOS + {0x8FF3, 0xB949}, //2659 #HANGUL SYLLABLE RIEUL WI RIEULTHIEUTH + {0x8FF4, 0xB94A}, //2660 #HANGUL SYLLABLE RIEUL WI RIEULPHIEUPH + {0x8FF5, 0xB94B}, //2661 #HANGUL SYLLABLE RIEUL WI RIEULHIEUH + {0x8FF6, 0xB94D}, //2662 #HANGUL SYLLABLE RIEUL WI PIEUP + {0x8FF7, 0xB94E}, //2663 #HANGUL SYLLABLE RIEUL WI PIEUPSIOS + {0x8FF8, 0xB950}, //2664 #HANGUL SYLLABLE RIEUL WI SSANGSIOS + {0x8FF9, 0xB952}, //2665 #HANGUL SYLLABLE RIEUL WI CIEUC + {0x8FFA, 0xB953}, //2666 #HANGUL SYLLABLE RIEUL WI CHIEUCH + {0x8FFB, 0xB954}, //2667 #HANGUL SYLLABLE RIEUL WI KHIEUKH + {0x8FFC, 0xB955}, //2668 #HANGUL SYLLABLE RIEUL WI THIEUTH + {0x8FFD, 0xB956}, //2669 #HANGUL SYLLABLE RIEUL WI PHIEUPH + {0x8FFE, 0xB957}, //2670 #HANGUL SYLLABLE RIEUL WI HIEUH + {0x9041, 0xB95A}, //2671 #HANGUL SYLLABLE RIEUL YU SSANGKIYEOK + {0x9042, 0xB95B}, //2672 #HANGUL SYLLABLE RIEUL YU KIYEOKSIOS + {0x9043, 0xB95D}, //2673 #HANGUL SYLLABLE RIEUL YU NIEUNCIEUC + {0x9044, 0xB95E}, //2674 #HANGUL SYLLABLE RIEUL YU NIEUNHIEUH + {0x9045, 0xB95F}, //2675 #HANGUL SYLLABLE RIEUL YU TIKEUT + {0x9046, 0xB961}, //2676 #HANGUL SYLLABLE RIEUL YU RIEULKIYEOK + {0x9047, 0xB962}, //2677 #HANGUL SYLLABLE RIEUL YU RIEULMIEUM + {0x9048, 0xB963}, //2678 #HANGUL SYLLABLE RIEUL YU RIEULPIEUP + {0x9049, 0xB964}, //2679 #HANGUL SYLLABLE RIEUL YU RIEULSIOS + {0x904A, 0xB965}, //2680 #HANGUL SYLLABLE RIEUL YU RIEULTHIEUTH + {0x904B, 0xB966}, //2681 #HANGUL SYLLABLE RIEUL YU RIEULPHIEUPH + {0x904C, 0xB967}, //2682 #HANGUL SYLLABLE RIEUL YU RIEULHIEUH + {0x904D, 0xB96A}, //2683 #HANGUL SYLLABLE RIEUL YU PIEUPSIOS + {0x904E, 0xB96C}, //2684 #HANGUL SYLLABLE RIEUL YU SSANGSIOS + {0x904F, 0xB96E}, //2685 #HANGUL SYLLABLE RIEUL YU CIEUC + {0x9050, 0xB96F}, //2686 #HANGUL SYLLABLE RIEUL YU CHIEUCH + {0x9051, 0xB970}, //2687 #HANGUL SYLLABLE RIEUL YU KHIEUKH + {0x9052, 0xB971}, //2688 #HANGUL SYLLABLE RIEUL YU THIEUTH + {0x9053, 0xB972}, //2689 #HANGUL SYLLABLE RIEUL YU PHIEUPH + {0x9054, 0xB973}, //2690 #HANGUL SYLLABLE RIEUL YU HIEUH + {0x9055, 0xB976}, //2691 #HANGUL SYLLABLE RIEUL EU SSANGKIYEOK + {0x9056, 0xB977}, //2692 #HANGUL SYLLABLE RIEUL EU KIYEOKSIOS + {0x9057, 0xB979}, //2693 #HANGUL SYLLABLE RIEUL EU NIEUNCIEUC + {0x9058, 0xB97A}, //2694 #HANGUL SYLLABLE RIEUL EU NIEUNHIEUH + {0x9059, 0xB97B}, //2695 #HANGUL SYLLABLE RIEUL EU TIKEUT + {0x905A, 0xB97D}, //2696 #HANGUL SYLLABLE RIEUL EU RIEULKIYEOK + {0x9061, 0xB97E}, //2697 #HANGUL SYLLABLE RIEUL EU RIEULMIEUM + {0x9062, 0xB97F}, //2698 #HANGUL SYLLABLE RIEUL EU RIEULPIEUP + {0x9063, 0xB980}, //2699 #HANGUL SYLLABLE RIEUL EU RIEULSIOS + {0x9064, 0xB981}, //2700 #HANGUL SYLLABLE RIEUL EU RIEULTHIEUTH + {0x9065, 0xB982}, //2701 #HANGUL SYLLABLE RIEUL EU RIEULPHIEUPH + {0x9066, 0xB983}, //2702 #HANGUL SYLLABLE RIEUL EU RIEULHIEUH + {0x9067, 0xB986}, //2703 #HANGUL SYLLABLE RIEUL EU PIEUPSIOS + {0x9068, 0xB988}, //2704 #HANGUL SYLLABLE RIEUL EU SSANGSIOS + {0x9069, 0xB98B}, //2705 #HANGUL SYLLABLE RIEUL EU CHIEUCH + {0x906A, 0xB98C}, //2706 #HANGUL SYLLABLE RIEUL EU KHIEUKH + {0x906B, 0xB98F}, //2707 #HANGUL SYLLABLE RIEUL EU HIEUH + {0x906C, 0xB990}, //2708 #HANGUL SYLLABLE RIEUL YI + {0x906D, 0xB991}, //2709 #HANGUL SYLLABLE RIEUL YI KIYEOK + {0x906E, 0xB992}, //2710 #HANGUL SYLLABLE RIEUL YI SSANGKIYEOK + {0x906F, 0xB993}, //2711 #HANGUL SYLLABLE RIEUL YI KIYEOKSIOS + {0x9070, 0xB994}, //2712 #HANGUL SYLLABLE RIEUL YI NIEUN + {0x9071, 0xB995}, //2713 #HANGUL SYLLABLE RIEUL YI NIEUNCIEUC + {0x9072, 0xB996}, //2714 #HANGUL SYLLABLE RIEUL YI NIEUNHIEUH + {0x9073, 0xB997}, //2715 #HANGUL SYLLABLE RIEUL YI TIKEUT + {0x9074, 0xB998}, //2716 #HANGUL SYLLABLE RIEUL YI RIEUL + {0x9075, 0xB999}, //2717 #HANGUL SYLLABLE RIEUL YI RIEULKIYEOK + {0x9076, 0xB99A}, //2718 #HANGUL SYLLABLE RIEUL YI RIEULMIEUM + {0x9077, 0xB99B}, //2719 #HANGUL SYLLABLE RIEUL YI RIEULPIEUP + {0x9078, 0xB99C}, //2720 #HANGUL SYLLABLE RIEUL YI RIEULSIOS + {0x9079, 0xB99D}, //2721 #HANGUL SYLLABLE RIEUL YI RIEULTHIEUTH + {0x907A, 0xB99E}, //2722 #HANGUL SYLLABLE RIEUL YI RIEULPHIEUPH + {0x9081, 0xB99F}, //2723 #HANGUL SYLLABLE RIEUL YI RIEULHIEUH + {0x9082, 0xB9A0}, //2724 #HANGUL SYLLABLE RIEUL YI MIEUM + {0x9083, 0xB9A1}, //2725 #HANGUL SYLLABLE RIEUL YI PIEUP + {0x9084, 0xB9A2}, //2726 #HANGUL SYLLABLE RIEUL YI PIEUPSIOS + {0x9085, 0xB9A3}, //2727 #HANGUL SYLLABLE RIEUL YI SIOS + {0x9086, 0xB9A4}, //2728 #HANGUL SYLLABLE RIEUL YI SSANGSIOS + {0x9087, 0xB9A5}, //2729 #HANGUL SYLLABLE RIEUL YI IEUNG + {0x9088, 0xB9A6}, //2730 #HANGUL SYLLABLE RIEUL YI CIEUC + {0x9089, 0xB9A7}, //2731 #HANGUL SYLLABLE RIEUL YI CHIEUCH + {0x908A, 0xB9A8}, //2732 #HANGUL SYLLABLE RIEUL YI KHIEUKH + {0x908B, 0xB9A9}, //2733 #HANGUL SYLLABLE RIEUL YI THIEUTH + {0x908C, 0xB9AA}, //2734 #HANGUL SYLLABLE RIEUL YI PHIEUPH + {0x908D, 0xB9AB}, //2735 #HANGUL SYLLABLE RIEUL YI HIEUH + {0x908E, 0xB9AE}, //2736 #HANGUL SYLLABLE RIEUL I SSANGKIYEOK + {0x908F, 0xB9AF}, //2737 #HANGUL SYLLABLE RIEUL I KIYEOKSIOS + {0x9090, 0xB9B1}, //2738 #HANGUL SYLLABLE RIEUL I NIEUNCIEUC + {0x9091, 0xB9B2}, //2739 #HANGUL SYLLABLE RIEUL I NIEUNHIEUH + {0x9092, 0xB9B3}, //2740 #HANGUL SYLLABLE RIEUL I TIKEUT + {0x9093, 0xB9B5}, //2741 #HANGUL SYLLABLE RIEUL I RIEULKIYEOK + {0x9094, 0xB9B6}, //2742 #HANGUL SYLLABLE RIEUL I RIEULMIEUM + {0x9095, 0xB9B7}, //2743 #HANGUL SYLLABLE RIEUL I RIEULPIEUP + {0x9096, 0xB9B8}, //2744 #HANGUL SYLLABLE RIEUL I RIEULSIOS + {0x9097, 0xB9B9}, //2745 #HANGUL SYLLABLE RIEUL I RIEULTHIEUTH + {0x9098, 0xB9BA}, //2746 #HANGUL SYLLABLE RIEUL I RIEULPHIEUPH + {0x9099, 0xB9BB}, //2747 #HANGUL SYLLABLE RIEUL I RIEULHIEUH + {0x909A, 0xB9BE}, //2748 #HANGUL SYLLABLE RIEUL I PIEUPSIOS + {0x909B, 0xB9C0}, //2749 #HANGUL SYLLABLE RIEUL I SSANGSIOS + {0x909C, 0xB9C2}, //2750 #HANGUL SYLLABLE RIEUL I CIEUC + {0x909D, 0xB9C3}, //2751 #HANGUL SYLLABLE RIEUL I CHIEUCH + {0x909E, 0xB9C4}, //2752 #HANGUL SYLLABLE RIEUL I KHIEUKH + {0x909F, 0xB9C5}, //2753 #HANGUL SYLLABLE RIEUL I THIEUTH + {0x90A0, 0xB9C6}, //2754 #HANGUL SYLLABLE RIEUL I PHIEUPH + {0x90A1, 0xB9C7}, //2755 #HANGUL SYLLABLE RIEUL I HIEUH + {0x90A2, 0xB9CA}, //2756 #HANGUL SYLLABLE MIEUM A SSANGKIYEOK + {0x90A3, 0xB9CB}, //2757 #HANGUL SYLLABLE MIEUM A KIYEOKSIOS + {0x90A4, 0xB9CD}, //2758 #HANGUL SYLLABLE MIEUM A NIEUNCIEUC + {0x90A5, 0xB9D3}, //2759 #HANGUL SYLLABLE MIEUM A RIEULPIEUP + {0x90A6, 0xB9D4}, //2760 #HANGUL SYLLABLE MIEUM A RIEULSIOS + {0x90A7, 0xB9D5}, //2761 #HANGUL SYLLABLE MIEUM A RIEULTHIEUTH + {0x90A8, 0xB9D6}, //2762 #HANGUL SYLLABLE MIEUM A RIEULPHIEUPH + {0x90A9, 0xB9D7}, //2763 #HANGUL SYLLABLE MIEUM A RIEULHIEUH + {0x90AA, 0xB9DA}, //2764 #HANGUL SYLLABLE MIEUM A PIEUPSIOS + {0x90AB, 0xB9DC}, //2765 #HANGUL SYLLABLE MIEUM A SSANGSIOS + {0x90AC, 0xB9DF}, //2766 #HANGUL SYLLABLE MIEUM A CHIEUCH + {0x90AD, 0xB9E0}, //2767 #HANGUL SYLLABLE MIEUM A KHIEUKH + {0x90AE, 0xB9E2}, //2768 #HANGUL SYLLABLE MIEUM A PHIEUPH + {0x90AF, 0xB9E6}, //2769 #HANGUL SYLLABLE MIEUM AE SSANGKIYEOK + {0x90B0, 0xB9E7}, //2770 #HANGUL SYLLABLE MIEUM AE KIYEOKSIOS + {0x90B1, 0xB9E9}, //2771 #HANGUL SYLLABLE MIEUM AE NIEUNCIEUC + {0x90B2, 0xB9EA}, //2772 #HANGUL SYLLABLE MIEUM AE NIEUNHIEUH + {0x90B3, 0xB9EB}, //2773 #HANGUL SYLLABLE MIEUM AE TIKEUT + {0x90B4, 0xB9ED}, //2774 #HANGUL SYLLABLE MIEUM AE RIEULKIYEOK + {0x90B5, 0xB9EE}, //2775 #HANGUL SYLLABLE MIEUM AE RIEULMIEUM + {0x90B6, 0xB9EF}, //2776 #HANGUL SYLLABLE MIEUM AE RIEULPIEUP + {0x90B7, 0xB9F0}, //2777 #HANGUL SYLLABLE MIEUM AE RIEULSIOS + {0x90B8, 0xB9F1}, //2778 #HANGUL SYLLABLE MIEUM AE RIEULTHIEUTH + {0x90B9, 0xB9F2}, //2779 #HANGUL SYLLABLE MIEUM AE RIEULPHIEUPH + {0x90BA, 0xB9F3}, //2780 #HANGUL SYLLABLE MIEUM AE RIEULHIEUH + {0x90BB, 0xB9F6}, //2781 #HANGUL SYLLABLE MIEUM AE PIEUPSIOS + {0x90BC, 0xB9FB}, //2782 #HANGUL SYLLABLE MIEUM AE CHIEUCH + {0x90BD, 0xB9FC}, //2783 #HANGUL SYLLABLE MIEUM AE KHIEUKH + {0x90BE, 0xB9FD}, //2784 #HANGUL SYLLABLE MIEUM AE THIEUTH + {0x90BF, 0xB9FE}, //2785 #HANGUL SYLLABLE MIEUM AE PHIEUPH + {0x90C0, 0xB9FF}, //2786 #HANGUL SYLLABLE MIEUM AE HIEUH + {0x90C1, 0xBA02}, //2787 #HANGUL SYLLABLE MIEUM YA SSANGKIYEOK + {0x90C2, 0xBA03}, //2788 #HANGUL SYLLABLE MIEUM YA KIYEOKSIOS + {0x90C3, 0xBA04}, //2789 #HANGUL SYLLABLE MIEUM YA NIEUN + {0x90C4, 0xBA05}, //2790 #HANGUL SYLLABLE MIEUM YA NIEUNCIEUC + {0x90C5, 0xBA06}, //2791 #HANGUL SYLLABLE MIEUM YA NIEUNHIEUH + {0x90C6, 0xBA07}, //2792 #HANGUL SYLLABLE MIEUM YA TIKEUT + {0x90C7, 0xBA09}, //2793 #HANGUL SYLLABLE MIEUM YA RIEULKIYEOK + {0x90C8, 0xBA0A}, //2794 #HANGUL SYLLABLE MIEUM YA RIEULMIEUM + {0x90C9, 0xBA0B}, //2795 #HANGUL SYLLABLE MIEUM YA RIEULPIEUP + {0x90CA, 0xBA0C}, //2796 #HANGUL SYLLABLE MIEUM YA RIEULSIOS + {0x90CB, 0xBA0D}, //2797 #HANGUL SYLLABLE MIEUM YA RIEULTHIEUTH + {0x90CC, 0xBA0E}, //2798 #HANGUL SYLLABLE MIEUM YA RIEULPHIEUPH + {0x90CD, 0xBA0F}, //2799 #HANGUL SYLLABLE MIEUM YA RIEULHIEUH + {0x90CE, 0xBA10}, //2800 #HANGUL SYLLABLE MIEUM YA MIEUM + {0x90CF, 0xBA11}, //2801 #HANGUL SYLLABLE MIEUM YA PIEUP + {0x90D0, 0xBA12}, //2802 #HANGUL SYLLABLE MIEUM YA PIEUPSIOS + {0x90D1, 0xBA13}, //2803 #HANGUL SYLLABLE MIEUM YA SIOS + {0x90D2, 0xBA14}, //2804 #HANGUL SYLLABLE MIEUM YA SSANGSIOS + {0x90D3, 0xBA16}, //2805 #HANGUL SYLLABLE MIEUM YA CIEUC + {0x90D4, 0xBA17}, //2806 #HANGUL SYLLABLE MIEUM YA CHIEUCH + {0x90D5, 0xBA18}, //2807 #HANGUL SYLLABLE MIEUM YA KHIEUKH + {0x90D6, 0xBA19}, //2808 #HANGUL SYLLABLE MIEUM YA THIEUTH + {0x90D7, 0xBA1A}, //2809 #HANGUL SYLLABLE MIEUM YA PHIEUPH + {0x90D8, 0xBA1B}, //2810 #HANGUL SYLLABLE MIEUM YA HIEUH + {0x90D9, 0xBA1C}, //2811 #HANGUL SYLLABLE MIEUM YAE + {0x90DA, 0xBA1D}, //2812 #HANGUL SYLLABLE MIEUM YAE KIYEOK + {0x90DB, 0xBA1E}, //2813 #HANGUL SYLLABLE MIEUM YAE SSANGKIYEOK + {0x90DC, 0xBA1F}, //2814 #HANGUL SYLLABLE MIEUM YAE KIYEOKSIOS + {0x90DD, 0xBA20}, //2815 #HANGUL SYLLABLE MIEUM YAE NIEUN + {0x90DE, 0xBA21}, //2816 #HANGUL SYLLABLE MIEUM YAE NIEUNCIEUC + {0x90DF, 0xBA22}, //2817 #HANGUL SYLLABLE MIEUM YAE NIEUNHIEUH + {0x90E0, 0xBA23}, //2818 #HANGUL SYLLABLE MIEUM YAE TIKEUT + {0x90E1, 0xBA24}, //2819 #HANGUL SYLLABLE MIEUM YAE RIEUL + {0x90E2, 0xBA25}, //2820 #HANGUL SYLLABLE MIEUM YAE RIEULKIYEOK + {0x90E3, 0xBA26}, //2821 #HANGUL SYLLABLE MIEUM YAE RIEULMIEUM + {0x90E4, 0xBA27}, //2822 #HANGUL SYLLABLE MIEUM YAE RIEULPIEUP + {0x90E5, 0xBA28}, //2823 #HANGUL SYLLABLE MIEUM YAE RIEULSIOS + {0x90E6, 0xBA29}, //2824 #HANGUL SYLLABLE MIEUM YAE RIEULTHIEUTH + {0x90E7, 0xBA2A}, //2825 #HANGUL SYLLABLE MIEUM YAE RIEULPHIEUPH + {0x90E8, 0xBA2B}, //2826 #HANGUL SYLLABLE MIEUM YAE RIEULHIEUH + {0x90E9, 0xBA2C}, //2827 #HANGUL SYLLABLE MIEUM YAE MIEUM + {0x90EA, 0xBA2D}, //2828 #HANGUL SYLLABLE MIEUM YAE PIEUP + {0x90EB, 0xBA2E}, //2829 #HANGUL SYLLABLE MIEUM YAE PIEUPSIOS + {0x90EC, 0xBA2F}, //2830 #HANGUL SYLLABLE MIEUM YAE SIOS + {0x90ED, 0xBA30}, //2831 #HANGUL SYLLABLE MIEUM YAE SSANGSIOS + {0x90EE, 0xBA31}, //2832 #HANGUL SYLLABLE MIEUM YAE IEUNG + {0x90EF, 0xBA32}, //2833 #HANGUL SYLLABLE MIEUM YAE CIEUC + {0x90F0, 0xBA33}, //2834 #HANGUL SYLLABLE MIEUM YAE CHIEUCH + {0x90F1, 0xBA34}, //2835 #HANGUL SYLLABLE MIEUM YAE KHIEUKH + {0x90F2, 0xBA35}, //2836 #HANGUL SYLLABLE MIEUM YAE THIEUTH + {0x90F3, 0xBA36}, //2837 #HANGUL SYLLABLE MIEUM YAE PHIEUPH + {0x90F4, 0xBA37}, //2838 #HANGUL SYLLABLE MIEUM YAE HIEUH + {0x90F5, 0xBA3A}, //2839 #HANGUL SYLLABLE MIEUM EO SSANGKIYEOK + {0x90F6, 0xBA3B}, //2840 #HANGUL SYLLABLE MIEUM EO KIYEOKSIOS + {0x90F7, 0xBA3D}, //2841 #HANGUL SYLLABLE MIEUM EO NIEUNCIEUC + {0x90F8, 0xBA3E}, //2842 #HANGUL SYLLABLE MIEUM EO NIEUNHIEUH + {0x90F9, 0xBA3F}, //2843 #HANGUL SYLLABLE MIEUM EO TIKEUT + {0x90FA, 0xBA41}, //2844 #HANGUL SYLLABLE MIEUM EO RIEULKIYEOK + {0x90FB, 0xBA43}, //2845 #HANGUL SYLLABLE MIEUM EO RIEULPIEUP + {0x90FC, 0xBA44}, //2846 #HANGUL SYLLABLE MIEUM EO RIEULSIOS + {0x90FD, 0xBA45}, //2847 #HANGUL SYLLABLE MIEUM EO RIEULTHIEUTH + {0x90FE, 0xBA46}, //2848 #HANGUL SYLLABLE MIEUM EO RIEULPHIEUPH + {0x9141, 0xBA47}, //2849 #HANGUL SYLLABLE MIEUM EO RIEULHIEUH + {0x9142, 0xBA4A}, //2850 #HANGUL SYLLABLE MIEUM EO PIEUPSIOS + {0x9143, 0xBA4C}, //2851 #HANGUL SYLLABLE MIEUM EO SSANGSIOS + {0x9144, 0xBA4F}, //2852 #HANGUL SYLLABLE MIEUM EO CHIEUCH + {0x9145, 0xBA50}, //2853 #HANGUL SYLLABLE MIEUM EO KHIEUKH + {0x9146, 0xBA51}, //2854 #HANGUL SYLLABLE MIEUM EO THIEUTH + {0x9147, 0xBA52}, //2855 #HANGUL SYLLABLE MIEUM EO PHIEUPH + {0x9148, 0xBA56}, //2856 #HANGUL SYLLABLE MIEUM E SSANGKIYEOK + {0x9149, 0xBA57}, //2857 #HANGUL SYLLABLE MIEUM E KIYEOKSIOS + {0x914A, 0xBA59}, //2858 #HANGUL SYLLABLE MIEUM E NIEUNCIEUC + {0x914B, 0xBA5A}, //2859 #HANGUL SYLLABLE MIEUM E NIEUNHIEUH + {0x914C, 0xBA5B}, //2860 #HANGUL SYLLABLE MIEUM E TIKEUT + {0x914D, 0xBA5D}, //2861 #HANGUL SYLLABLE MIEUM E RIEULKIYEOK + {0x914E, 0xBA5E}, //2862 #HANGUL SYLLABLE MIEUM E RIEULMIEUM + {0x914F, 0xBA5F}, //2863 #HANGUL SYLLABLE MIEUM E RIEULPIEUP + {0x9150, 0xBA60}, //2864 #HANGUL SYLLABLE MIEUM E RIEULSIOS + {0x9151, 0xBA61}, //2865 #HANGUL SYLLABLE MIEUM E RIEULTHIEUTH + {0x9152, 0xBA62}, //2866 #HANGUL SYLLABLE MIEUM E RIEULPHIEUPH + {0x9153, 0xBA63}, //2867 #HANGUL SYLLABLE MIEUM E RIEULHIEUH + {0x9154, 0xBA66}, //2868 #HANGUL SYLLABLE MIEUM E PIEUPSIOS + {0x9155, 0xBA6A}, //2869 #HANGUL SYLLABLE MIEUM E CIEUC + {0x9156, 0xBA6B}, //2870 #HANGUL SYLLABLE MIEUM E CHIEUCH + {0x9157, 0xBA6C}, //2871 #HANGUL SYLLABLE MIEUM E KHIEUKH + {0x9158, 0xBA6D}, //2872 #HANGUL SYLLABLE MIEUM E THIEUTH + {0x9159, 0xBA6E}, //2873 #HANGUL SYLLABLE MIEUM E PHIEUPH + {0x915A, 0xBA6F}, //2874 #HANGUL SYLLABLE MIEUM E HIEUH + {0x9161, 0xBA72}, //2875 #HANGUL SYLLABLE MIEUM YEO SSANGKIYEOK + {0x9162, 0xBA73}, //2876 #HANGUL SYLLABLE MIEUM YEO KIYEOKSIOS + {0x9163, 0xBA75}, //2877 #HANGUL SYLLABLE MIEUM YEO NIEUNCIEUC + {0x9164, 0xBA76}, //2878 #HANGUL SYLLABLE MIEUM YEO NIEUNHIEUH + {0x9165, 0xBA77}, //2879 #HANGUL SYLLABLE MIEUM YEO TIKEUT + {0x9166, 0xBA79}, //2880 #HANGUL SYLLABLE MIEUM YEO RIEULKIYEOK + {0x9167, 0xBA7A}, //2881 #HANGUL SYLLABLE MIEUM YEO RIEULMIEUM + {0x9168, 0xBA7B}, //2882 #HANGUL SYLLABLE MIEUM YEO RIEULPIEUP + {0x9169, 0xBA7C}, //2883 #HANGUL SYLLABLE MIEUM YEO RIEULSIOS + {0x916A, 0xBA7D}, //2884 #HANGUL SYLLABLE MIEUM YEO RIEULTHIEUTH + {0x916B, 0xBA7E}, //2885 #HANGUL SYLLABLE MIEUM YEO RIEULPHIEUPH + {0x916C, 0xBA7F}, //2886 #HANGUL SYLLABLE MIEUM YEO RIEULHIEUH + {0x916D, 0xBA80}, //2887 #HANGUL SYLLABLE MIEUM YEO MIEUM + {0x916E, 0xBA81}, //2888 #HANGUL SYLLABLE MIEUM YEO PIEUP + {0x916F, 0xBA82}, //2889 #HANGUL SYLLABLE MIEUM YEO PIEUPSIOS + {0x9170, 0xBA86}, //2890 #HANGUL SYLLABLE MIEUM YEO CIEUC + {0x9171, 0xBA88}, //2891 #HANGUL SYLLABLE MIEUM YEO KHIEUKH + {0x9172, 0xBA89}, //2892 #HANGUL SYLLABLE MIEUM YEO THIEUTH + {0x9173, 0xBA8A}, //2893 #HANGUL SYLLABLE MIEUM YEO PHIEUPH + {0x9174, 0xBA8B}, //2894 #HANGUL SYLLABLE MIEUM YEO HIEUH + {0x9175, 0xBA8D}, //2895 #HANGUL SYLLABLE MIEUM YE KIYEOK + {0x9176, 0xBA8E}, //2896 #HANGUL SYLLABLE MIEUM YE SSANGKIYEOK + {0x9177, 0xBA8F}, //2897 #HANGUL SYLLABLE MIEUM YE KIYEOKSIOS + {0x9178, 0xBA90}, //2898 #HANGUL SYLLABLE MIEUM YE NIEUN + {0x9179, 0xBA91}, //2899 #HANGUL SYLLABLE MIEUM YE NIEUNCIEUC + {0x917A, 0xBA92}, //2900 #HANGUL SYLLABLE MIEUM YE NIEUNHIEUH + {0x9181, 0xBA93}, //2901 #HANGUL SYLLABLE MIEUM YE TIKEUT + {0x9182, 0xBA94}, //2902 #HANGUL SYLLABLE MIEUM YE RIEUL + {0x9183, 0xBA95}, //2903 #HANGUL SYLLABLE MIEUM YE RIEULKIYEOK + {0x9184, 0xBA96}, //2904 #HANGUL SYLLABLE MIEUM YE RIEULMIEUM + {0x9185, 0xBA97}, //2905 #HANGUL SYLLABLE MIEUM YE RIEULPIEUP + {0x9186, 0xBA98}, //2906 #HANGUL SYLLABLE MIEUM YE RIEULSIOS + {0x9187, 0xBA99}, //2907 #HANGUL SYLLABLE MIEUM YE RIEULTHIEUTH + {0x9188, 0xBA9A}, //2908 #HANGUL SYLLABLE MIEUM YE RIEULPHIEUPH + {0x9189, 0xBA9B}, //2909 #HANGUL SYLLABLE MIEUM YE RIEULHIEUH + {0x918A, 0xBA9C}, //2910 #HANGUL SYLLABLE MIEUM YE MIEUM + {0x918B, 0xBA9D}, //2911 #HANGUL SYLLABLE MIEUM YE PIEUP + {0x918C, 0xBA9E}, //2912 #HANGUL SYLLABLE MIEUM YE PIEUPSIOS + {0x918D, 0xBA9F}, //2913 #HANGUL SYLLABLE MIEUM YE SIOS + {0x918E, 0xBAA0}, //2914 #HANGUL SYLLABLE MIEUM YE SSANGSIOS + {0x918F, 0xBAA1}, //2915 #HANGUL SYLLABLE MIEUM YE IEUNG + {0x9190, 0xBAA2}, //2916 #HANGUL SYLLABLE MIEUM YE CIEUC + {0x9191, 0xBAA3}, //2917 #HANGUL SYLLABLE MIEUM YE CHIEUCH + {0x9192, 0xBAA4}, //2918 #HANGUL SYLLABLE MIEUM YE KHIEUKH + {0x9193, 0xBAA5}, //2919 #HANGUL SYLLABLE MIEUM YE THIEUTH + {0x9194, 0xBAA6}, //2920 #HANGUL SYLLABLE MIEUM YE PHIEUPH + {0x9195, 0xBAA7}, //2921 #HANGUL SYLLABLE MIEUM YE HIEUH + {0x9196, 0xBAAA}, //2922 #HANGUL SYLLABLE MIEUM O SSANGKIYEOK + {0x9197, 0xBAAD}, //2923 #HANGUL SYLLABLE MIEUM O NIEUNCIEUC + {0x9198, 0xBAAE}, //2924 #HANGUL SYLLABLE MIEUM O NIEUNHIEUH + {0x9199, 0xBAAF}, //2925 #HANGUL SYLLABLE MIEUM O TIKEUT + {0x919A, 0xBAB1}, //2926 #HANGUL SYLLABLE MIEUM O RIEULKIYEOK + {0x919B, 0xBAB3}, //2927 #HANGUL SYLLABLE MIEUM O RIEULPIEUP + {0x919C, 0xBAB4}, //2928 #HANGUL SYLLABLE MIEUM O RIEULSIOS + {0x919D, 0xBAB5}, //2929 #HANGUL SYLLABLE MIEUM O RIEULTHIEUTH + {0x919E, 0xBAB6}, //2930 #HANGUL SYLLABLE MIEUM O RIEULPHIEUPH + {0x919F, 0xBAB7}, //2931 #HANGUL SYLLABLE MIEUM O RIEULHIEUH + {0x91A0, 0xBABA}, //2932 #HANGUL SYLLABLE MIEUM O PIEUPSIOS + {0x91A1, 0xBABC}, //2933 #HANGUL SYLLABLE MIEUM O SSANGSIOS + {0x91A2, 0xBABE}, //2934 #HANGUL SYLLABLE MIEUM O CIEUC + {0x91A3, 0xBABF}, //2935 #HANGUL SYLLABLE MIEUM O CHIEUCH + {0x91A4, 0xBAC0}, //2936 #HANGUL SYLLABLE MIEUM O KHIEUKH + {0x91A5, 0xBAC1}, //2937 #HANGUL SYLLABLE MIEUM O THIEUTH + {0x91A6, 0xBAC2}, //2938 #HANGUL SYLLABLE MIEUM O PHIEUPH + {0x91A7, 0xBAC3}, //2939 #HANGUL SYLLABLE MIEUM O HIEUH + {0x91A8, 0xBAC5}, //2940 #HANGUL SYLLABLE MIEUM WA KIYEOK + {0x91A9, 0xBAC6}, //2941 #HANGUL SYLLABLE MIEUM WA SSANGKIYEOK + {0x91AA, 0xBAC7}, //2942 #HANGUL SYLLABLE MIEUM WA KIYEOKSIOS + {0x91AB, 0xBAC9}, //2943 #HANGUL SYLLABLE MIEUM WA NIEUNCIEUC + {0x91AC, 0xBACA}, //2944 #HANGUL SYLLABLE MIEUM WA NIEUNHIEUH + {0x91AD, 0xBACB}, //2945 #HANGUL SYLLABLE MIEUM WA TIKEUT + {0x91AE, 0xBACC}, //2946 #HANGUL SYLLABLE MIEUM WA RIEUL + {0x91AF, 0xBACD}, //2947 #HANGUL SYLLABLE MIEUM WA RIEULKIYEOK + {0x91B0, 0xBACE}, //2948 #HANGUL SYLLABLE MIEUM WA RIEULMIEUM + {0x91B1, 0xBACF}, //2949 #HANGUL SYLLABLE MIEUM WA RIEULPIEUP + {0x91B2, 0xBAD0}, //2950 #HANGUL SYLLABLE MIEUM WA RIEULSIOS + {0x91B3, 0xBAD1}, //2951 #HANGUL SYLLABLE MIEUM WA RIEULTHIEUTH + {0x91B4, 0xBAD2}, //2952 #HANGUL SYLLABLE MIEUM WA RIEULPHIEUPH + {0x91B5, 0xBAD3}, //2953 #HANGUL SYLLABLE MIEUM WA RIEULHIEUH + {0x91B6, 0xBAD4}, //2954 #HANGUL SYLLABLE MIEUM WA MIEUM + {0x91B7, 0xBAD5}, //2955 #HANGUL SYLLABLE MIEUM WA PIEUP + {0x91B8, 0xBAD6}, //2956 #HANGUL SYLLABLE MIEUM WA PIEUPSIOS + {0x91B9, 0xBAD7}, //2957 #HANGUL SYLLABLE MIEUM WA SIOS + {0x91BA, 0xBADA}, //2958 #HANGUL SYLLABLE MIEUM WA CIEUC + {0x91BB, 0xBADB}, //2959 #HANGUL SYLLABLE MIEUM WA CHIEUCH + {0x91BC, 0xBADC}, //2960 #HANGUL SYLLABLE MIEUM WA KHIEUKH + {0x91BD, 0xBADD}, //2961 #HANGUL SYLLABLE MIEUM WA THIEUTH + {0x91BE, 0xBADE}, //2962 #HANGUL SYLLABLE MIEUM WA PHIEUPH + {0x91BF, 0xBADF}, //2963 #HANGUL SYLLABLE MIEUM WA HIEUH + {0x91C0, 0xBAE0}, //2964 #HANGUL SYLLABLE MIEUM WAE + {0x91C1, 0xBAE1}, //2965 #HANGUL SYLLABLE MIEUM WAE KIYEOK + {0x91C2, 0xBAE2}, //2966 #HANGUL SYLLABLE MIEUM WAE SSANGKIYEOK + {0x91C3, 0xBAE3}, //2967 #HANGUL SYLLABLE MIEUM WAE KIYEOKSIOS + {0x91C4, 0xBAE4}, //2968 #HANGUL SYLLABLE MIEUM WAE NIEUN + {0x91C5, 0xBAE5}, //2969 #HANGUL SYLLABLE MIEUM WAE NIEUNCIEUC + {0x91C6, 0xBAE6}, //2970 #HANGUL SYLLABLE MIEUM WAE NIEUNHIEUH + {0x91C7, 0xBAE7}, //2971 #HANGUL SYLLABLE MIEUM WAE TIKEUT + {0x91C8, 0xBAE8}, //2972 #HANGUL SYLLABLE MIEUM WAE RIEUL + {0x91C9, 0xBAE9}, //2973 #HANGUL SYLLABLE MIEUM WAE RIEULKIYEOK + {0x91CA, 0xBAEA}, //2974 #HANGUL SYLLABLE MIEUM WAE RIEULMIEUM + {0x91CB, 0xBAEB}, //2975 #HANGUL SYLLABLE MIEUM WAE RIEULPIEUP + {0x91CC, 0xBAEC}, //2976 #HANGUL SYLLABLE MIEUM WAE RIEULSIOS + {0x91CD, 0xBAED}, //2977 #HANGUL SYLLABLE MIEUM WAE RIEULTHIEUTH + {0x91CE, 0xBAEE}, //2978 #HANGUL SYLLABLE MIEUM WAE RIEULPHIEUPH + {0x91CF, 0xBAEF}, //2979 #HANGUL SYLLABLE MIEUM WAE RIEULHIEUH + {0x91D0, 0xBAF0}, //2980 #HANGUL SYLLABLE MIEUM WAE MIEUM + {0x91D1, 0xBAF1}, //2981 #HANGUL SYLLABLE MIEUM WAE PIEUP + {0x91D2, 0xBAF2}, //2982 #HANGUL SYLLABLE MIEUM WAE PIEUPSIOS + {0x91D3, 0xBAF3}, //2983 #HANGUL SYLLABLE MIEUM WAE SIOS + {0x91D4, 0xBAF4}, //2984 #HANGUL SYLLABLE MIEUM WAE SSANGSIOS + {0x91D5, 0xBAF5}, //2985 #HANGUL SYLLABLE MIEUM WAE IEUNG + {0x91D6, 0xBAF6}, //2986 #HANGUL SYLLABLE MIEUM WAE CIEUC + {0x91D7, 0xBAF7}, //2987 #HANGUL SYLLABLE MIEUM WAE CHIEUCH + {0x91D8, 0xBAF8}, //2988 #HANGUL SYLLABLE MIEUM WAE KHIEUKH + {0x91D9, 0xBAF9}, //2989 #HANGUL SYLLABLE MIEUM WAE THIEUTH + {0x91DA, 0xBAFA}, //2990 #HANGUL SYLLABLE MIEUM WAE PHIEUPH + {0x91DB, 0xBAFB}, //2991 #HANGUL SYLLABLE MIEUM WAE HIEUH + {0x91DC, 0xBAFD}, //2992 #HANGUL SYLLABLE MIEUM OE KIYEOK + {0x91DD, 0xBAFE}, //2993 #HANGUL SYLLABLE MIEUM OE SSANGKIYEOK + {0x91DE, 0xBAFF}, //2994 #HANGUL SYLLABLE MIEUM OE KIYEOKSIOS + {0x91DF, 0xBB01}, //2995 #HANGUL SYLLABLE MIEUM OE NIEUNCIEUC + {0x91E0, 0xBB02}, //2996 #HANGUL SYLLABLE MIEUM OE NIEUNHIEUH + {0x91E1, 0xBB03}, //2997 #HANGUL SYLLABLE MIEUM OE TIKEUT + {0x91E2, 0xBB05}, //2998 #HANGUL SYLLABLE MIEUM OE RIEULKIYEOK + {0x91E3, 0xBB06}, //2999 #HANGUL SYLLABLE MIEUM OE RIEULMIEUM + {0x91E4, 0xBB07}, //3000 #HANGUL SYLLABLE MIEUM OE RIEULPIEUP + {0x91E5, 0xBB08}, //3001 #HANGUL SYLLABLE MIEUM OE RIEULSIOS + {0x91E6, 0xBB09}, //3002 #HANGUL SYLLABLE MIEUM OE RIEULTHIEUTH + {0x91E7, 0xBB0A}, //3003 #HANGUL SYLLABLE MIEUM OE RIEULPHIEUPH + {0x91E8, 0xBB0B}, //3004 #HANGUL SYLLABLE MIEUM OE RIEULHIEUH + {0x91E9, 0xBB0C}, //3005 #HANGUL SYLLABLE MIEUM OE MIEUM + {0x91EA, 0xBB0E}, //3006 #HANGUL SYLLABLE MIEUM OE PIEUPSIOS + {0x91EB, 0xBB10}, //3007 #HANGUL SYLLABLE MIEUM OE SSANGSIOS + {0x91EC, 0xBB12}, //3008 #HANGUL SYLLABLE MIEUM OE CIEUC + {0x91ED, 0xBB13}, //3009 #HANGUL SYLLABLE MIEUM OE CHIEUCH + {0x91EE, 0xBB14}, //3010 #HANGUL SYLLABLE MIEUM OE KHIEUKH + {0x91EF, 0xBB15}, //3011 #HANGUL SYLLABLE MIEUM OE THIEUTH + {0x91F0, 0xBB16}, //3012 #HANGUL SYLLABLE MIEUM OE PHIEUPH + {0x91F1, 0xBB17}, //3013 #HANGUL SYLLABLE MIEUM OE HIEUH + {0x91F2, 0xBB19}, //3014 #HANGUL SYLLABLE MIEUM YO KIYEOK + {0x91F3, 0xBB1A}, //3015 #HANGUL SYLLABLE MIEUM YO SSANGKIYEOK + {0x91F4, 0xBB1B}, //3016 #HANGUL SYLLABLE MIEUM YO KIYEOKSIOS + {0x91F5, 0xBB1D}, //3017 #HANGUL SYLLABLE MIEUM YO NIEUNCIEUC + {0x91F6, 0xBB1E}, //3018 #HANGUL SYLLABLE MIEUM YO NIEUNHIEUH + {0x91F7, 0xBB1F}, //3019 #HANGUL SYLLABLE MIEUM YO TIKEUT + {0x91F8, 0xBB21}, //3020 #HANGUL SYLLABLE MIEUM YO RIEULKIYEOK + {0x91F9, 0xBB22}, //3021 #HANGUL SYLLABLE MIEUM YO RIEULMIEUM + {0x91FA, 0xBB23}, //3022 #HANGUL SYLLABLE MIEUM YO RIEULPIEUP + {0x91FB, 0xBB24}, //3023 #HANGUL SYLLABLE MIEUM YO RIEULSIOS + {0x91FC, 0xBB25}, //3024 #HANGUL SYLLABLE MIEUM YO RIEULTHIEUTH + {0x91FD, 0xBB26}, //3025 #HANGUL SYLLABLE MIEUM YO RIEULPHIEUPH + {0x91FE, 0xBB27}, //3026 #HANGUL SYLLABLE MIEUM YO RIEULHIEUH + {0x9241, 0xBB28}, //3027 #HANGUL SYLLABLE MIEUM YO MIEUM + {0x9242, 0xBB2A}, //3028 #HANGUL SYLLABLE MIEUM YO PIEUPSIOS + {0x9243, 0xBB2C}, //3029 #HANGUL SYLLABLE MIEUM YO SSANGSIOS + {0x9244, 0xBB2D}, //3030 #HANGUL SYLLABLE MIEUM YO IEUNG + {0x9245, 0xBB2E}, //3031 #HANGUL SYLLABLE MIEUM YO CIEUC + {0x9246, 0xBB2F}, //3032 #HANGUL SYLLABLE MIEUM YO CHIEUCH + {0x9247, 0xBB30}, //3033 #HANGUL SYLLABLE MIEUM YO KHIEUKH + {0x9248, 0xBB31}, //3034 #HANGUL SYLLABLE MIEUM YO THIEUTH + {0x9249, 0xBB32}, //3035 #HANGUL SYLLABLE MIEUM YO PHIEUPH + {0x924A, 0xBB33}, //3036 #HANGUL SYLLABLE MIEUM YO HIEUH + {0x924B, 0xBB37}, //3037 #HANGUL SYLLABLE MIEUM U KIYEOKSIOS + {0x924C, 0xBB39}, //3038 #HANGUL SYLLABLE MIEUM U NIEUNCIEUC + {0x924D, 0xBB3A}, //3039 #HANGUL SYLLABLE MIEUM U NIEUNHIEUH + {0x924E, 0xBB3F}, //3040 #HANGUL SYLLABLE MIEUM U RIEULPIEUP + {0x924F, 0xBB40}, //3041 #HANGUL SYLLABLE MIEUM U RIEULSIOS + {0x9250, 0xBB41}, //3042 #HANGUL SYLLABLE MIEUM U RIEULTHIEUTH + {0x9251, 0xBB42}, //3043 #HANGUL SYLLABLE MIEUM U RIEULPHIEUPH + {0x9252, 0xBB43}, //3044 #HANGUL SYLLABLE MIEUM U RIEULHIEUH + {0x9253, 0xBB46}, //3045 #HANGUL SYLLABLE MIEUM U PIEUPSIOS + {0x9254, 0xBB48}, //3046 #HANGUL SYLLABLE MIEUM U SSANGSIOS + {0x9255, 0xBB4A}, //3047 #HANGUL SYLLABLE MIEUM U CIEUC + {0x9256, 0xBB4B}, //3048 #HANGUL SYLLABLE MIEUM U CHIEUCH + {0x9257, 0xBB4C}, //3049 #HANGUL SYLLABLE MIEUM U KHIEUKH + {0x9258, 0xBB4E}, //3050 #HANGUL SYLLABLE MIEUM U PHIEUPH + {0x9259, 0xBB51}, //3051 #HANGUL SYLLABLE MIEUM WEO KIYEOK + {0x925A, 0xBB52}, //3052 #HANGUL SYLLABLE MIEUM WEO SSANGKIYEOK + {0x9261, 0xBB53}, //3053 #HANGUL SYLLABLE MIEUM WEO KIYEOKSIOS + {0x9262, 0xBB55}, //3054 #HANGUL SYLLABLE MIEUM WEO NIEUNCIEUC + {0x9263, 0xBB56}, //3055 #HANGUL SYLLABLE MIEUM WEO NIEUNHIEUH + {0x9264, 0xBB57}, //3056 #HANGUL SYLLABLE MIEUM WEO TIKEUT + {0x9265, 0xBB59}, //3057 #HANGUL SYLLABLE MIEUM WEO RIEULKIYEOK + {0x9266, 0xBB5A}, //3058 #HANGUL SYLLABLE MIEUM WEO RIEULMIEUM + {0x9267, 0xBB5B}, //3059 #HANGUL SYLLABLE MIEUM WEO RIEULPIEUP + {0x9268, 0xBB5C}, //3060 #HANGUL SYLLABLE MIEUM WEO RIEULSIOS + {0x9269, 0xBB5D}, //3061 #HANGUL SYLLABLE MIEUM WEO RIEULTHIEUTH + {0x926A, 0xBB5E}, //3062 #HANGUL SYLLABLE MIEUM WEO RIEULPHIEUPH + {0x926B, 0xBB5F}, //3063 #HANGUL SYLLABLE MIEUM WEO RIEULHIEUH + {0x926C, 0xBB60}, //3064 #HANGUL SYLLABLE MIEUM WEO MIEUM + {0x926D, 0xBB62}, //3065 #HANGUL SYLLABLE MIEUM WEO PIEUPSIOS + {0x926E, 0xBB64}, //3066 #HANGUL SYLLABLE MIEUM WEO SSANGSIOS + {0x926F, 0xBB65}, //3067 #HANGUL SYLLABLE MIEUM WEO IEUNG + {0x9270, 0xBB66}, //3068 #HANGUL SYLLABLE MIEUM WEO CIEUC + {0x9271, 0xBB67}, //3069 #HANGUL SYLLABLE MIEUM WEO CHIEUCH + {0x9272, 0xBB68}, //3070 #HANGUL SYLLABLE MIEUM WEO KHIEUKH + {0x9273, 0xBB69}, //3071 #HANGUL SYLLABLE MIEUM WEO THIEUTH + {0x9274, 0xBB6A}, //3072 #HANGUL SYLLABLE MIEUM WEO PHIEUPH + {0x9275, 0xBB6B}, //3073 #HANGUL SYLLABLE MIEUM WEO HIEUH + {0x9276, 0xBB6D}, //3074 #HANGUL SYLLABLE MIEUM WE KIYEOK + {0x9277, 0xBB6E}, //3075 #HANGUL SYLLABLE MIEUM WE SSANGKIYEOK + {0x9278, 0xBB6F}, //3076 #HANGUL SYLLABLE MIEUM WE KIYEOKSIOS + {0x9279, 0xBB70}, //3077 #HANGUL SYLLABLE MIEUM WE NIEUN + {0x927A, 0xBB71}, //3078 #HANGUL SYLLABLE MIEUM WE NIEUNCIEUC + {0x9281, 0xBB72}, //3079 #HANGUL SYLLABLE MIEUM WE NIEUNHIEUH + {0x9282, 0xBB73}, //3080 #HANGUL SYLLABLE MIEUM WE TIKEUT + {0x9283, 0xBB74}, //3081 #HANGUL SYLLABLE MIEUM WE RIEUL + {0x9284, 0xBB75}, //3082 #HANGUL SYLLABLE MIEUM WE RIEULKIYEOK + {0x9285, 0xBB76}, //3083 #HANGUL SYLLABLE MIEUM WE RIEULMIEUM + {0x9286, 0xBB77}, //3084 #HANGUL SYLLABLE MIEUM WE RIEULPIEUP + {0x9287, 0xBB78}, //3085 #HANGUL SYLLABLE MIEUM WE RIEULSIOS + {0x9288, 0xBB79}, //3086 #HANGUL SYLLABLE MIEUM WE RIEULTHIEUTH + {0x9289, 0xBB7A}, //3087 #HANGUL SYLLABLE MIEUM WE RIEULPHIEUPH + {0x928A, 0xBB7B}, //3088 #HANGUL SYLLABLE MIEUM WE RIEULHIEUH + {0x928B, 0xBB7C}, //3089 #HANGUL SYLLABLE MIEUM WE MIEUM + {0x928C, 0xBB7D}, //3090 #HANGUL SYLLABLE MIEUM WE PIEUP + {0x928D, 0xBB7E}, //3091 #HANGUL SYLLABLE MIEUM WE PIEUPSIOS + {0x928E, 0xBB7F}, //3092 #HANGUL SYLLABLE MIEUM WE SIOS + {0x928F, 0xBB80}, //3093 #HANGUL SYLLABLE MIEUM WE SSANGSIOS + {0x9290, 0xBB81}, //3094 #HANGUL SYLLABLE MIEUM WE IEUNG + {0x9291, 0xBB82}, //3095 #HANGUL SYLLABLE MIEUM WE CIEUC + {0x9292, 0xBB83}, //3096 #HANGUL SYLLABLE MIEUM WE CHIEUCH + {0x9293, 0xBB84}, //3097 #HANGUL SYLLABLE MIEUM WE KHIEUKH + {0x9294, 0xBB85}, //3098 #HANGUL SYLLABLE MIEUM WE THIEUTH + {0x9295, 0xBB86}, //3099 #HANGUL SYLLABLE MIEUM WE PHIEUPH + {0x9296, 0xBB87}, //3100 #HANGUL SYLLABLE MIEUM WE HIEUH + {0x9297, 0xBB89}, //3101 #HANGUL SYLLABLE MIEUM WI KIYEOK + {0x9298, 0xBB8A}, //3102 #HANGUL SYLLABLE MIEUM WI SSANGKIYEOK + {0x9299, 0xBB8B}, //3103 #HANGUL SYLLABLE MIEUM WI KIYEOKSIOS + {0x929A, 0xBB8D}, //3104 #HANGUL SYLLABLE MIEUM WI NIEUNCIEUC + {0x929B, 0xBB8E}, //3105 #HANGUL SYLLABLE MIEUM WI NIEUNHIEUH + {0x929C, 0xBB8F}, //3106 #HANGUL SYLLABLE MIEUM WI TIKEUT + {0x929D, 0xBB91}, //3107 #HANGUL SYLLABLE MIEUM WI RIEULKIYEOK + {0x929E, 0xBB92}, //3108 #HANGUL SYLLABLE MIEUM WI RIEULMIEUM + {0x929F, 0xBB93}, //3109 #HANGUL SYLLABLE MIEUM WI RIEULPIEUP + {0x92A0, 0xBB94}, //3110 #HANGUL SYLLABLE MIEUM WI RIEULSIOS + {0x92A1, 0xBB95}, //3111 #HANGUL SYLLABLE MIEUM WI RIEULTHIEUTH + {0x92A2, 0xBB96}, //3112 #HANGUL SYLLABLE MIEUM WI RIEULPHIEUPH + {0x92A3, 0xBB97}, //3113 #HANGUL SYLLABLE MIEUM WI RIEULHIEUH + {0x92A4, 0xBB98}, //3114 #HANGUL SYLLABLE MIEUM WI MIEUM + {0x92A5, 0xBB99}, //3115 #HANGUL SYLLABLE MIEUM WI PIEUP + {0x92A6, 0xBB9A}, //3116 #HANGUL SYLLABLE MIEUM WI PIEUPSIOS + {0x92A7, 0xBB9B}, //3117 #HANGUL SYLLABLE MIEUM WI SIOS + {0x92A8, 0xBB9C}, //3118 #HANGUL SYLLABLE MIEUM WI SSANGSIOS + {0x92A9, 0xBB9D}, //3119 #HANGUL SYLLABLE MIEUM WI IEUNG + {0x92AA, 0xBB9E}, //3120 #HANGUL SYLLABLE MIEUM WI CIEUC + {0x92AB, 0xBB9F}, //3121 #HANGUL SYLLABLE MIEUM WI CHIEUCH + {0x92AC, 0xBBA0}, //3122 #HANGUL SYLLABLE MIEUM WI KHIEUKH + {0x92AD, 0xBBA1}, //3123 #HANGUL SYLLABLE MIEUM WI THIEUTH + {0x92AE, 0xBBA2}, //3124 #HANGUL SYLLABLE MIEUM WI PHIEUPH + {0x92AF, 0xBBA3}, //3125 #HANGUL SYLLABLE MIEUM WI HIEUH + {0x92B0, 0xBBA5}, //3126 #HANGUL SYLLABLE MIEUM YU KIYEOK + {0x92B1, 0xBBA6}, //3127 #HANGUL SYLLABLE MIEUM YU SSANGKIYEOK + {0x92B2, 0xBBA7}, //3128 #HANGUL SYLLABLE MIEUM YU KIYEOKSIOS + {0x92B3, 0xBBA9}, //3129 #HANGUL SYLLABLE MIEUM YU NIEUNCIEUC + {0x92B4, 0xBBAA}, //3130 #HANGUL SYLLABLE MIEUM YU NIEUNHIEUH + {0x92B5, 0xBBAB}, //3131 #HANGUL SYLLABLE MIEUM YU TIKEUT + {0x92B6, 0xBBAD}, //3132 #HANGUL SYLLABLE MIEUM YU RIEULKIYEOK + {0x92B7, 0xBBAE}, //3133 #HANGUL SYLLABLE MIEUM YU RIEULMIEUM + {0x92B8, 0xBBAF}, //3134 #HANGUL SYLLABLE MIEUM YU RIEULPIEUP + {0x92B9, 0xBBB0}, //3135 #HANGUL SYLLABLE MIEUM YU RIEULSIOS + {0x92BA, 0xBBB1}, //3136 #HANGUL SYLLABLE MIEUM YU RIEULTHIEUTH + {0x92BB, 0xBBB2}, //3137 #HANGUL SYLLABLE MIEUM YU RIEULPHIEUPH + {0x92BC, 0xBBB3}, //3138 #HANGUL SYLLABLE MIEUM YU RIEULHIEUH + {0x92BD, 0xBBB5}, //3139 #HANGUL SYLLABLE MIEUM YU PIEUP + {0x92BE, 0xBBB6}, //3140 #HANGUL SYLLABLE MIEUM YU PIEUPSIOS + {0x92BF, 0xBBB8}, //3141 #HANGUL SYLLABLE MIEUM YU SSANGSIOS + {0x92C0, 0xBBB9}, //3142 #HANGUL SYLLABLE MIEUM YU IEUNG + {0x92C1, 0xBBBA}, //3143 #HANGUL SYLLABLE MIEUM YU CIEUC + {0x92C2, 0xBBBB}, //3144 #HANGUL SYLLABLE MIEUM YU CHIEUCH + {0x92C3, 0xBBBC}, //3145 #HANGUL SYLLABLE MIEUM YU KHIEUKH + {0x92C4, 0xBBBD}, //3146 #HANGUL SYLLABLE MIEUM YU THIEUTH + {0x92C5, 0xBBBE}, //3147 #HANGUL SYLLABLE MIEUM YU PHIEUPH + {0x92C6, 0xBBBF}, //3148 #HANGUL SYLLABLE MIEUM YU HIEUH + {0x92C7, 0xBBC1}, //3149 #HANGUL SYLLABLE MIEUM EU KIYEOK + {0x92C8, 0xBBC2}, //3150 #HANGUL SYLLABLE MIEUM EU SSANGKIYEOK + {0x92C9, 0xBBC3}, //3151 #HANGUL SYLLABLE MIEUM EU KIYEOKSIOS + {0x92CA, 0xBBC5}, //3152 #HANGUL SYLLABLE MIEUM EU NIEUNCIEUC + {0x92CB, 0xBBC6}, //3153 #HANGUL SYLLABLE MIEUM EU NIEUNHIEUH + {0x92CC, 0xBBC7}, //3154 #HANGUL SYLLABLE MIEUM EU TIKEUT + {0x92CD, 0xBBC9}, //3155 #HANGUL SYLLABLE MIEUM EU RIEULKIYEOK + {0x92CE, 0xBBCA}, //3156 #HANGUL SYLLABLE MIEUM EU RIEULMIEUM + {0x92CF, 0xBBCB}, //3157 #HANGUL SYLLABLE MIEUM EU RIEULPIEUP + {0x92D0, 0xBBCC}, //3158 #HANGUL SYLLABLE MIEUM EU RIEULSIOS + {0x92D1, 0xBBCD}, //3159 #HANGUL SYLLABLE MIEUM EU RIEULTHIEUTH + {0x92D2, 0xBBCE}, //3160 #HANGUL SYLLABLE MIEUM EU RIEULPHIEUPH + {0x92D3, 0xBBCF}, //3161 #HANGUL SYLLABLE MIEUM EU RIEULHIEUH + {0x92D4, 0xBBD1}, //3162 #HANGUL SYLLABLE MIEUM EU PIEUP + {0x92D5, 0xBBD2}, //3163 #HANGUL SYLLABLE MIEUM EU PIEUPSIOS + {0x92D6, 0xBBD4}, //3164 #HANGUL SYLLABLE MIEUM EU SSANGSIOS + {0x92D7, 0xBBD5}, //3165 #HANGUL SYLLABLE MIEUM EU IEUNG + {0x92D8, 0xBBD6}, //3166 #HANGUL SYLLABLE MIEUM EU CIEUC + {0x92D9, 0xBBD7}, //3167 #HANGUL SYLLABLE MIEUM EU CHIEUCH + {0x92DA, 0xBBD8}, //3168 #HANGUL SYLLABLE MIEUM EU KHIEUKH + {0x92DB, 0xBBD9}, //3169 #HANGUL SYLLABLE MIEUM EU THIEUTH + {0x92DC, 0xBBDA}, //3170 #HANGUL SYLLABLE MIEUM EU PHIEUPH + {0x92DD, 0xBBDB}, //3171 #HANGUL SYLLABLE MIEUM EU HIEUH + {0x92DE, 0xBBDC}, //3172 #HANGUL SYLLABLE MIEUM YI + {0x92DF, 0xBBDD}, //3173 #HANGUL SYLLABLE MIEUM YI KIYEOK + {0x92E0, 0xBBDE}, //3174 #HANGUL SYLLABLE MIEUM YI SSANGKIYEOK + {0x92E1, 0xBBDF}, //3175 #HANGUL SYLLABLE MIEUM YI KIYEOKSIOS + {0x92E2, 0xBBE0}, //3176 #HANGUL SYLLABLE MIEUM YI NIEUN + {0x92E3, 0xBBE1}, //3177 #HANGUL SYLLABLE MIEUM YI NIEUNCIEUC + {0x92E4, 0xBBE2}, //3178 #HANGUL SYLLABLE MIEUM YI NIEUNHIEUH + {0x92E5, 0xBBE3}, //3179 #HANGUL SYLLABLE MIEUM YI TIKEUT + {0x92E6, 0xBBE4}, //3180 #HANGUL SYLLABLE MIEUM YI RIEUL + {0x92E7, 0xBBE5}, //3181 #HANGUL SYLLABLE MIEUM YI RIEULKIYEOK + {0x92E8, 0xBBE6}, //3182 #HANGUL SYLLABLE MIEUM YI RIEULMIEUM + {0x92E9, 0xBBE7}, //3183 #HANGUL SYLLABLE MIEUM YI RIEULPIEUP + {0x92EA, 0xBBE8}, //3184 #HANGUL SYLLABLE MIEUM YI RIEULSIOS + {0x92EB, 0xBBE9}, //3185 #HANGUL SYLLABLE MIEUM YI RIEULTHIEUTH + {0x92EC, 0xBBEA}, //3186 #HANGUL SYLLABLE MIEUM YI RIEULPHIEUPH + {0x92ED, 0xBBEB}, //3187 #HANGUL SYLLABLE MIEUM YI RIEULHIEUH + {0x92EE, 0xBBEC}, //3188 #HANGUL SYLLABLE MIEUM YI MIEUM + {0x92EF, 0xBBED}, //3189 #HANGUL SYLLABLE MIEUM YI PIEUP + {0x92F0, 0xBBEE}, //3190 #HANGUL SYLLABLE MIEUM YI PIEUPSIOS + {0x92F1, 0xBBEF}, //3191 #HANGUL SYLLABLE MIEUM YI SIOS + {0x92F2, 0xBBF0}, //3192 #HANGUL SYLLABLE MIEUM YI SSANGSIOS + {0x92F3, 0xBBF1}, //3193 #HANGUL SYLLABLE MIEUM YI IEUNG + {0x92F4, 0xBBF2}, //3194 #HANGUL SYLLABLE MIEUM YI CIEUC + {0x92F5, 0xBBF3}, //3195 #HANGUL SYLLABLE MIEUM YI CHIEUCH + {0x92F6, 0xBBF4}, //3196 #HANGUL SYLLABLE MIEUM YI KHIEUKH + {0x92F7, 0xBBF5}, //3197 #HANGUL SYLLABLE MIEUM YI THIEUTH + {0x92F8, 0xBBF6}, //3198 #HANGUL SYLLABLE MIEUM YI PHIEUPH + {0x92F9, 0xBBF7}, //3199 #HANGUL SYLLABLE MIEUM YI HIEUH + {0x92FA, 0xBBFA}, //3200 #HANGUL SYLLABLE MIEUM I SSANGKIYEOK + {0x92FB, 0xBBFB}, //3201 #HANGUL SYLLABLE MIEUM I KIYEOKSIOS + {0x92FC, 0xBBFD}, //3202 #HANGUL SYLLABLE MIEUM I NIEUNCIEUC + {0x92FD, 0xBBFE}, //3203 #HANGUL SYLLABLE MIEUM I NIEUNHIEUH + {0x92FE, 0xBC01}, //3204 #HANGUL SYLLABLE MIEUM I RIEULKIYEOK + {0x9341, 0xBC03}, //3205 #HANGUL SYLLABLE MIEUM I RIEULPIEUP + {0x9342, 0xBC04}, //3206 #HANGUL SYLLABLE MIEUM I RIEULSIOS + {0x9343, 0xBC05}, //3207 #HANGUL SYLLABLE MIEUM I RIEULTHIEUTH + {0x9344, 0xBC06}, //3208 #HANGUL SYLLABLE MIEUM I RIEULPHIEUPH + {0x9345, 0xBC07}, //3209 #HANGUL SYLLABLE MIEUM I RIEULHIEUH + {0x9346, 0xBC0A}, //3210 #HANGUL SYLLABLE MIEUM I PIEUPSIOS + {0x9347, 0xBC0E}, //3211 #HANGUL SYLLABLE MIEUM I CIEUC + {0x9348, 0xBC10}, //3212 #HANGUL SYLLABLE MIEUM I KHIEUKH + {0x9349, 0xBC12}, //3213 #HANGUL SYLLABLE MIEUM I PHIEUPH + {0x934A, 0xBC13}, //3214 #HANGUL SYLLABLE MIEUM I HIEUH + {0x934B, 0xBC19}, //3215 #HANGUL SYLLABLE PIEUP A NIEUNCIEUC + {0x934C, 0xBC1A}, //3216 #HANGUL SYLLABLE PIEUP A NIEUNHIEUH + {0x934D, 0xBC20}, //3217 #HANGUL SYLLABLE PIEUP A RIEULSIOS + {0x934E, 0xBC21}, //3218 #HANGUL SYLLABLE PIEUP A RIEULTHIEUTH + {0x934F, 0xBC22}, //3219 #HANGUL SYLLABLE PIEUP A RIEULPHIEUPH + {0x9350, 0xBC23}, //3220 #HANGUL SYLLABLE PIEUP A RIEULHIEUH + {0x9351, 0xBC26}, //3221 #HANGUL SYLLABLE PIEUP A PIEUPSIOS + {0x9352, 0xBC28}, //3222 #HANGUL SYLLABLE PIEUP A SSANGSIOS + {0x9353, 0xBC2A}, //3223 #HANGUL SYLLABLE PIEUP A CIEUC + {0x9354, 0xBC2B}, //3224 #HANGUL SYLLABLE PIEUP A CHIEUCH + {0x9355, 0xBC2C}, //3225 #HANGUL SYLLABLE PIEUP A KHIEUKH + {0x9356, 0xBC2E}, //3226 #HANGUL SYLLABLE PIEUP A PHIEUPH + {0x9357, 0xBC2F}, //3227 #HANGUL SYLLABLE PIEUP A HIEUH + {0x9358, 0xBC32}, //3228 #HANGUL SYLLABLE PIEUP AE SSANGKIYEOK + {0x9359, 0xBC33}, //3229 #HANGUL SYLLABLE PIEUP AE KIYEOKSIOS + {0x935A, 0xBC35}, //3230 #HANGUL SYLLABLE PIEUP AE NIEUNCIEUC + {0x9361, 0xBC36}, //3231 #HANGUL SYLLABLE PIEUP AE NIEUNHIEUH + {0x9362, 0xBC37}, //3232 #HANGUL SYLLABLE PIEUP AE TIKEUT + {0x9363, 0xBC39}, //3233 #HANGUL SYLLABLE PIEUP AE RIEULKIYEOK + {0x9364, 0xBC3A}, //3234 #HANGUL SYLLABLE PIEUP AE RIEULMIEUM + {0x9365, 0xBC3B}, //3235 #HANGUL SYLLABLE PIEUP AE RIEULPIEUP + {0x9366, 0xBC3C}, //3236 #HANGUL SYLLABLE PIEUP AE RIEULSIOS + {0x9367, 0xBC3D}, //3237 #HANGUL SYLLABLE PIEUP AE RIEULTHIEUTH + {0x9368, 0xBC3E}, //3238 #HANGUL SYLLABLE PIEUP AE RIEULPHIEUPH + {0x9369, 0xBC3F}, //3239 #HANGUL SYLLABLE PIEUP AE RIEULHIEUH + {0x936A, 0xBC42}, //3240 #HANGUL SYLLABLE PIEUP AE PIEUPSIOS + {0x936B, 0xBC46}, //3241 #HANGUL SYLLABLE PIEUP AE CIEUC + {0x936C, 0xBC47}, //3242 #HANGUL SYLLABLE PIEUP AE CHIEUCH + {0x936D, 0xBC48}, //3243 #HANGUL SYLLABLE PIEUP AE KHIEUKH + {0x936E, 0xBC4A}, //3244 #HANGUL SYLLABLE PIEUP AE PHIEUPH + {0x936F, 0xBC4B}, //3245 #HANGUL SYLLABLE PIEUP AE HIEUH + {0x9370, 0xBC4E}, //3246 #HANGUL SYLLABLE PIEUP YA SSANGKIYEOK + {0x9371, 0xBC4F}, //3247 #HANGUL SYLLABLE PIEUP YA KIYEOKSIOS + {0x9372, 0xBC51}, //3248 #HANGUL SYLLABLE PIEUP YA NIEUNCIEUC + {0x9373, 0xBC52}, //3249 #HANGUL SYLLABLE PIEUP YA NIEUNHIEUH + {0x9374, 0xBC53}, //3250 #HANGUL SYLLABLE PIEUP YA TIKEUT + {0x9375, 0xBC54}, //3251 #HANGUL SYLLABLE PIEUP YA RIEUL + {0x9376, 0xBC55}, //3252 #HANGUL SYLLABLE PIEUP YA RIEULKIYEOK + {0x9377, 0xBC56}, //3253 #HANGUL SYLLABLE PIEUP YA RIEULMIEUM + {0x9378, 0xBC57}, //3254 #HANGUL SYLLABLE PIEUP YA RIEULPIEUP + {0x9379, 0xBC58}, //3255 #HANGUL SYLLABLE PIEUP YA RIEULSIOS + {0x937A, 0xBC59}, //3256 #HANGUL SYLLABLE PIEUP YA RIEULTHIEUTH + {0x9381, 0xBC5A}, //3257 #HANGUL SYLLABLE PIEUP YA RIEULPHIEUPH + {0x9382, 0xBC5B}, //3258 #HANGUL SYLLABLE PIEUP YA RIEULHIEUH + {0x9383, 0xBC5C}, //3259 #HANGUL SYLLABLE PIEUP YA MIEUM + {0x9384, 0xBC5E}, //3260 #HANGUL SYLLABLE PIEUP YA PIEUPSIOS + {0x9385, 0xBC5F}, //3261 #HANGUL SYLLABLE PIEUP YA SIOS + {0x9386, 0xBC60}, //3262 #HANGUL SYLLABLE PIEUP YA SSANGSIOS + {0x9387, 0xBC61}, //3263 #HANGUL SYLLABLE PIEUP YA IEUNG + {0x9388, 0xBC62}, //3264 #HANGUL SYLLABLE PIEUP YA CIEUC + {0x9389, 0xBC63}, //3265 #HANGUL SYLLABLE PIEUP YA CHIEUCH + {0x938A, 0xBC64}, //3266 #HANGUL SYLLABLE PIEUP YA KHIEUKH + {0x938B, 0xBC65}, //3267 #HANGUL SYLLABLE PIEUP YA THIEUTH + {0x938C, 0xBC66}, //3268 #HANGUL SYLLABLE PIEUP YA PHIEUPH + {0x938D, 0xBC67}, //3269 #HANGUL SYLLABLE PIEUP YA HIEUH + {0x938E, 0xBC68}, //3270 #HANGUL SYLLABLE PIEUP YAE + {0x938F, 0xBC69}, //3271 #HANGUL SYLLABLE PIEUP YAE KIYEOK + {0x9390, 0xBC6A}, //3272 #HANGUL SYLLABLE PIEUP YAE SSANGKIYEOK + {0x9391, 0xBC6B}, //3273 #HANGUL SYLLABLE PIEUP YAE KIYEOKSIOS + {0x9392, 0xBC6C}, //3274 #HANGUL SYLLABLE PIEUP YAE NIEUN + {0x9393, 0xBC6D}, //3275 #HANGUL SYLLABLE PIEUP YAE NIEUNCIEUC + {0x9394, 0xBC6E}, //3276 #HANGUL SYLLABLE PIEUP YAE NIEUNHIEUH + {0x9395, 0xBC6F}, //3277 #HANGUL SYLLABLE PIEUP YAE TIKEUT + {0x9396, 0xBC70}, //3278 #HANGUL SYLLABLE PIEUP YAE RIEUL + {0x9397, 0xBC71}, //3279 #HANGUL SYLLABLE PIEUP YAE RIEULKIYEOK + {0x9398, 0xBC72}, //3280 #HANGUL SYLLABLE PIEUP YAE RIEULMIEUM + {0x9399, 0xBC73}, //3281 #HANGUL SYLLABLE PIEUP YAE RIEULPIEUP + {0x939A, 0xBC74}, //3282 #HANGUL SYLLABLE PIEUP YAE RIEULSIOS + {0x939B, 0xBC75}, //3283 #HANGUL SYLLABLE PIEUP YAE RIEULTHIEUTH + {0x939C, 0xBC76}, //3284 #HANGUL SYLLABLE PIEUP YAE RIEULPHIEUPH + {0x939D, 0xBC77}, //3285 #HANGUL SYLLABLE PIEUP YAE RIEULHIEUH + {0x939E, 0xBC78}, //3286 #HANGUL SYLLABLE PIEUP YAE MIEUM + {0x939F, 0xBC79}, //3287 #HANGUL SYLLABLE PIEUP YAE PIEUP + {0x93A0, 0xBC7A}, //3288 #HANGUL SYLLABLE PIEUP YAE PIEUPSIOS + {0x93A1, 0xBC7B}, //3289 #HANGUL SYLLABLE PIEUP YAE SIOS + {0x93A2, 0xBC7C}, //3290 #HANGUL SYLLABLE PIEUP YAE SSANGSIOS + {0x93A3, 0xBC7D}, //3291 #HANGUL SYLLABLE PIEUP YAE IEUNG + {0x93A4, 0xBC7E}, //3292 #HANGUL SYLLABLE PIEUP YAE CIEUC + {0x93A5, 0xBC7F}, //3293 #HANGUL SYLLABLE PIEUP YAE CHIEUCH + {0x93A6, 0xBC80}, //3294 #HANGUL SYLLABLE PIEUP YAE KHIEUKH + {0x93A7, 0xBC81}, //3295 #HANGUL SYLLABLE PIEUP YAE THIEUTH + {0x93A8, 0xBC82}, //3296 #HANGUL SYLLABLE PIEUP YAE PHIEUPH + {0x93A9, 0xBC83}, //3297 #HANGUL SYLLABLE PIEUP YAE HIEUH + {0x93AA, 0xBC86}, //3298 #HANGUL SYLLABLE PIEUP EO SSANGKIYEOK + {0x93AB, 0xBC87}, //3299 #HANGUL SYLLABLE PIEUP EO KIYEOKSIOS + {0x93AC, 0xBC89}, //3300 #HANGUL SYLLABLE PIEUP EO NIEUNCIEUC + {0x93AD, 0xBC8A}, //3301 #HANGUL SYLLABLE PIEUP EO NIEUNHIEUH + {0x93AE, 0xBC8D}, //3302 #HANGUL SYLLABLE PIEUP EO RIEULKIYEOK + {0x93AF, 0xBC8F}, //3303 #HANGUL SYLLABLE PIEUP EO RIEULPIEUP + {0x93B0, 0xBC90}, //3304 #HANGUL SYLLABLE PIEUP EO RIEULSIOS + {0x93B1, 0xBC91}, //3305 #HANGUL SYLLABLE PIEUP EO RIEULTHIEUTH + {0x93B2, 0xBC92}, //3306 #HANGUL SYLLABLE PIEUP EO RIEULPHIEUPH + {0x93B3, 0xBC93}, //3307 #HANGUL SYLLABLE PIEUP EO RIEULHIEUH + {0x93B4, 0xBC96}, //3308 #HANGUL SYLLABLE PIEUP EO PIEUPSIOS + {0x93B5, 0xBC98}, //3309 #HANGUL SYLLABLE PIEUP EO SSANGSIOS + {0x93B6, 0xBC9B}, //3310 #HANGUL SYLLABLE PIEUP EO CHIEUCH + {0x93B7, 0xBC9C}, //3311 #HANGUL SYLLABLE PIEUP EO KHIEUKH + {0x93B8, 0xBC9D}, //3312 #HANGUL SYLLABLE PIEUP EO THIEUTH + {0x93B9, 0xBC9E}, //3313 #HANGUL SYLLABLE PIEUP EO PHIEUPH + {0x93BA, 0xBC9F}, //3314 #HANGUL SYLLABLE PIEUP EO HIEUH + {0x93BB, 0xBCA2}, //3315 #HANGUL SYLLABLE PIEUP E SSANGKIYEOK + {0x93BC, 0xBCA3}, //3316 #HANGUL SYLLABLE PIEUP E KIYEOKSIOS + {0x93BD, 0xBCA5}, //3317 #HANGUL SYLLABLE PIEUP E NIEUNCIEUC + {0x93BE, 0xBCA6}, //3318 #HANGUL SYLLABLE PIEUP E NIEUNHIEUH + {0x93BF, 0xBCA9}, //3319 #HANGUL SYLLABLE PIEUP E RIEULKIYEOK + {0x93C0, 0xBCAA}, //3320 #HANGUL SYLLABLE PIEUP E RIEULMIEUM + {0x93C1, 0xBCAB}, //3321 #HANGUL SYLLABLE PIEUP E RIEULPIEUP + {0x93C2, 0xBCAC}, //3322 #HANGUL SYLLABLE PIEUP E RIEULSIOS + {0x93C3, 0xBCAD}, //3323 #HANGUL SYLLABLE PIEUP E RIEULTHIEUTH + {0x93C4, 0xBCAE}, //3324 #HANGUL SYLLABLE PIEUP E RIEULPHIEUPH + {0x93C5, 0xBCAF}, //3325 #HANGUL SYLLABLE PIEUP E RIEULHIEUH + {0x93C6, 0xBCB2}, //3326 #HANGUL SYLLABLE PIEUP E PIEUPSIOS + {0x93C7, 0xBCB6}, //3327 #HANGUL SYLLABLE PIEUP E CIEUC + {0x93C8, 0xBCB7}, //3328 #HANGUL SYLLABLE PIEUP E CHIEUCH + {0x93C9, 0xBCB8}, //3329 #HANGUL SYLLABLE PIEUP E KHIEUKH + {0x93CA, 0xBCB9}, //3330 #HANGUL SYLLABLE PIEUP E THIEUTH + {0x93CB, 0xBCBA}, //3331 #HANGUL SYLLABLE PIEUP E PHIEUPH + {0x93CC, 0xBCBB}, //3332 #HANGUL SYLLABLE PIEUP E HIEUH + {0x93CD, 0xBCBE}, //3333 #HANGUL SYLLABLE PIEUP YEO SSANGKIYEOK + {0x93CE, 0xBCBF}, //3334 #HANGUL SYLLABLE PIEUP YEO KIYEOKSIOS + {0x93CF, 0xBCC1}, //3335 #HANGUL SYLLABLE PIEUP YEO NIEUNCIEUC + {0x93D0, 0xBCC2}, //3336 #HANGUL SYLLABLE PIEUP YEO NIEUNHIEUH + {0x93D1, 0xBCC3}, //3337 #HANGUL SYLLABLE PIEUP YEO TIKEUT + {0x93D2, 0xBCC5}, //3338 #HANGUL SYLLABLE PIEUP YEO RIEULKIYEOK + {0x93D3, 0xBCC6}, //3339 #HANGUL SYLLABLE PIEUP YEO RIEULMIEUM + {0x93D4, 0xBCC7}, //3340 #HANGUL SYLLABLE PIEUP YEO RIEULPIEUP + {0x93D5, 0xBCC8}, //3341 #HANGUL SYLLABLE PIEUP YEO RIEULSIOS + {0x93D6, 0xBCC9}, //3342 #HANGUL SYLLABLE PIEUP YEO RIEULTHIEUTH + {0x93D7, 0xBCCA}, //3343 #HANGUL SYLLABLE PIEUP YEO RIEULPHIEUPH + {0x93D8, 0xBCCB}, //3344 #HANGUL SYLLABLE PIEUP YEO RIEULHIEUH + {0x93D9, 0xBCCC}, //3345 #HANGUL SYLLABLE PIEUP YEO MIEUM + {0x93DA, 0xBCCE}, //3346 #HANGUL SYLLABLE PIEUP YEO PIEUPSIOS + {0x93DB, 0xBCD2}, //3347 #HANGUL SYLLABLE PIEUP YEO CIEUC + {0x93DC, 0xBCD3}, //3348 #HANGUL SYLLABLE PIEUP YEO CHIEUCH + {0x93DD, 0xBCD4}, //3349 #HANGUL SYLLABLE PIEUP YEO KHIEUKH + {0x93DE, 0xBCD6}, //3350 #HANGUL SYLLABLE PIEUP YEO PHIEUPH + {0x93DF, 0xBCD7}, //3351 #HANGUL SYLLABLE PIEUP YEO HIEUH + {0x93E0, 0xBCD9}, //3352 #HANGUL SYLLABLE PIEUP YE KIYEOK + {0x93E1, 0xBCDA}, //3353 #HANGUL SYLLABLE PIEUP YE SSANGKIYEOK + {0x93E2, 0xBCDB}, //3354 #HANGUL SYLLABLE PIEUP YE KIYEOKSIOS + {0x93E3, 0xBCDD}, //3355 #HANGUL SYLLABLE PIEUP YE NIEUNCIEUC + {0x93E4, 0xBCDE}, //3356 #HANGUL SYLLABLE PIEUP YE NIEUNHIEUH + {0x93E5, 0xBCDF}, //3357 #HANGUL SYLLABLE PIEUP YE TIKEUT + {0x93E6, 0xBCE0}, //3358 #HANGUL SYLLABLE PIEUP YE RIEUL + {0x93E7, 0xBCE1}, //3359 #HANGUL SYLLABLE PIEUP YE RIEULKIYEOK + {0x93E8, 0xBCE2}, //3360 #HANGUL SYLLABLE PIEUP YE RIEULMIEUM + {0x93E9, 0xBCE3}, //3361 #HANGUL SYLLABLE PIEUP YE RIEULPIEUP + {0x93EA, 0xBCE4}, //3362 #HANGUL SYLLABLE PIEUP YE RIEULSIOS + {0x93EB, 0xBCE5}, //3363 #HANGUL SYLLABLE PIEUP YE RIEULTHIEUTH + {0x93EC, 0xBCE6}, //3364 #HANGUL SYLLABLE PIEUP YE RIEULPHIEUPH + {0x93ED, 0xBCE7}, //3365 #HANGUL SYLLABLE PIEUP YE RIEULHIEUH + {0x93EE, 0xBCE8}, //3366 #HANGUL SYLLABLE PIEUP YE MIEUM + {0x93EF, 0xBCE9}, //3367 #HANGUL SYLLABLE PIEUP YE PIEUP + {0x93F0, 0xBCEA}, //3368 #HANGUL SYLLABLE PIEUP YE PIEUPSIOS + {0x93F1, 0xBCEB}, //3369 #HANGUL SYLLABLE PIEUP YE SIOS + {0x93F2, 0xBCEC}, //3370 #HANGUL SYLLABLE PIEUP YE SSANGSIOS + {0x93F3, 0xBCED}, //3371 #HANGUL SYLLABLE PIEUP YE IEUNG + {0x93F4, 0xBCEE}, //3372 #HANGUL SYLLABLE PIEUP YE CIEUC + {0x93F5, 0xBCEF}, //3373 #HANGUL SYLLABLE PIEUP YE CHIEUCH + {0x93F6, 0xBCF0}, //3374 #HANGUL SYLLABLE PIEUP YE KHIEUKH + {0x93F7, 0xBCF1}, //3375 #HANGUL SYLLABLE PIEUP YE THIEUTH + {0x93F8, 0xBCF2}, //3376 #HANGUL SYLLABLE PIEUP YE PHIEUPH + {0x93F9, 0xBCF3}, //3377 #HANGUL SYLLABLE PIEUP YE HIEUH + {0x93FA, 0xBCF7}, //3378 #HANGUL SYLLABLE PIEUP O KIYEOKSIOS + {0x93FB, 0xBCF9}, //3379 #HANGUL SYLLABLE PIEUP O NIEUNCIEUC + {0x93FC, 0xBCFA}, //3380 #HANGUL SYLLABLE PIEUP O NIEUNHIEUH + {0x93FD, 0xBCFB}, //3381 #HANGUL SYLLABLE PIEUP O TIKEUT + {0x93FE, 0xBCFD}, //3382 #HANGUL SYLLABLE PIEUP O RIEULKIYEOK + {0x9441, 0xBCFE}, //3383 #HANGUL SYLLABLE PIEUP O RIEULMIEUM + {0x9442, 0xBCFF}, //3384 #HANGUL SYLLABLE PIEUP O RIEULPIEUP + {0x9443, 0xBD00}, //3385 #HANGUL SYLLABLE PIEUP O RIEULSIOS + {0x9444, 0xBD01}, //3386 #HANGUL SYLLABLE PIEUP O RIEULTHIEUTH + {0x9445, 0xBD02}, //3387 #HANGUL SYLLABLE PIEUP O RIEULPHIEUPH + {0x9446, 0xBD03}, //3388 #HANGUL SYLLABLE PIEUP O RIEULHIEUH + {0x9447, 0xBD06}, //3389 #HANGUL SYLLABLE PIEUP O PIEUPSIOS + {0x9448, 0xBD08}, //3390 #HANGUL SYLLABLE PIEUP O SSANGSIOS + {0x9449, 0xBD0A}, //3391 #HANGUL SYLLABLE PIEUP O CIEUC + {0x944A, 0xBD0B}, //3392 #HANGUL SYLLABLE PIEUP O CHIEUCH + {0x944B, 0xBD0C}, //3393 #HANGUL SYLLABLE PIEUP O KHIEUKH + {0x944C, 0xBD0D}, //3394 #HANGUL SYLLABLE PIEUP O THIEUTH + {0x944D, 0xBD0E}, //3395 #HANGUL SYLLABLE PIEUP O PHIEUPH + {0x944E, 0xBD0F}, //3396 #HANGUL SYLLABLE PIEUP O HIEUH + {0x944F, 0xBD11}, //3397 #HANGUL SYLLABLE PIEUP WA KIYEOK + {0x9450, 0xBD12}, //3398 #HANGUL SYLLABLE PIEUP WA SSANGKIYEOK + {0x9451, 0xBD13}, //3399 #HANGUL SYLLABLE PIEUP WA KIYEOKSIOS + {0x9452, 0xBD15}, //3400 #HANGUL SYLLABLE PIEUP WA NIEUNCIEUC + {0x9453, 0xBD16}, //3401 #HANGUL SYLLABLE PIEUP WA NIEUNHIEUH + {0x9454, 0xBD17}, //3402 #HANGUL SYLLABLE PIEUP WA TIKEUT + {0x9455, 0xBD18}, //3403 #HANGUL SYLLABLE PIEUP WA RIEUL + {0x9456, 0xBD19}, //3404 #HANGUL SYLLABLE PIEUP WA RIEULKIYEOK + {0x9457, 0xBD1A}, //3405 #HANGUL SYLLABLE PIEUP WA RIEULMIEUM + {0x9458, 0xBD1B}, //3406 #HANGUL SYLLABLE PIEUP WA RIEULPIEUP + {0x9459, 0xBD1C}, //3407 #HANGUL SYLLABLE PIEUP WA RIEULSIOS + {0x945A, 0xBD1D}, //3408 #HANGUL SYLLABLE PIEUP WA RIEULTHIEUTH + {0x9461, 0xBD1E}, //3409 #HANGUL SYLLABLE PIEUP WA RIEULPHIEUPH + {0x9462, 0xBD1F}, //3410 #HANGUL SYLLABLE PIEUP WA RIEULHIEUH + {0x9463, 0xBD20}, //3411 #HANGUL SYLLABLE PIEUP WA MIEUM + {0x9464, 0xBD21}, //3412 #HANGUL SYLLABLE PIEUP WA PIEUP + {0x9465, 0xBD22}, //3413 #HANGUL SYLLABLE PIEUP WA PIEUPSIOS + {0x9466, 0xBD23}, //3414 #HANGUL SYLLABLE PIEUP WA SIOS + {0x9467, 0xBD25}, //3415 #HANGUL SYLLABLE PIEUP WA IEUNG + {0x9468, 0xBD26}, //3416 #HANGUL SYLLABLE PIEUP WA CIEUC + {0x9469, 0xBD27}, //3417 #HANGUL SYLLABLE PIEUP WA CHIEUCH + {0x946A, 0xBD28}, //3418 #HANGUL SYLLABLE PIEUP WA KHIEUKH + {0x946B, 0xBD29}, //3419 #HANGUL SYLLABLE PIEUP WA THIEUTH + {0x946C, 0xBD2A}, //3420 #HANGUL SYLLABLE PIEUP WA PHIEUPH + {0x946D, 0xBD2B}, //3421 #HANGUL SYLLABLE PIEUP WA HIEUH + {0x946E, 0xBD2D}, //3422 #HANGUL SYLLABLE PIEUP WAE KIYEOK + {0x946F, 0xBD2E}, //3423 #HANGUL SYLLABLE PIEUP WAE SSANGKIYEOK + {0x9470, 0xBD2F}, //3424 #HANGUL SYLLABLE PIEUP WAE KIYEOKSIOS + {0x9471, 0xBD30}, //3425 #HANGUL SYLLABLE PIEUP WAE NIEUN + {0x9472, 0xBD31}, //3426 #HANGUL SYLLABLE PIEUP WAE NIEUNCIEUC + {0x9473, 0xBD32}, //3427 #HANGUL SYLLABLE PIEUP WAE NIEUNHIEUH + {0x9474, 0xBD33}, //3428 #HANGUL SYLLABLE PIEUP WAE TIKEUT + {0x9475, 0xBD34}, //3429 #HANGUL SYLLABLE PIEUP WAE RIEUL + {0x9476, 0xBD35}, //3430 #HANGUL SYLLABLE PIEUP WAE RIEULKIYEOK + {0x9477, 0xBD36}, //3431 #HANGUL SYLLABLE PIEUP WAE RIEULMIEUM + {0x9478, 0xBD37}, //3432 #HANGUL SYLLABLE PIEUP WAE RIEULPIEUP + {0x9479, 0xBD38}, //3433 #HANGUL SYLLABLE PIEUP WAE RIEULSIOS + {0x947A, 0xBD39}, //3434 #HANGUL SYLLABLE PIEUP WAE RIEULTHIEUTH + {0x9481, 0xBD3A}, //3435 #HANGUL SYLLABLE PIEUP WAE RIEULPHIEUPH + {0x9482, 0xBD3B}, //3436 #HANGUL SYLLABLE PIEUP WAE RIEULHIEUH + {0x9483, 0xBD3C}, //3437 #HANGUL SYLLABLE PIEUP WAE MIEUM + {0x9484, 0xBD3D}, //3438 #HANGUL SYLLABLE PIEUP WAE PIEUP + {0x9485, 0xBD3E}, //3439 #HANGUL SYLLABLE PIEUP WAE PIEUPSIOS + {0x9486, 0xBD3F}, //3440 #HANGUL SYLLABLE PIEUP WAE SIOS + {0x9487, 0xBD41}, //3441 #HANGUL SYLLABLE PIEUP WAE IEUNG + {0x9488, 0xBD42}, //3442 #HANGUL SYLLABLE PIEUP WAE CIEUC + {0x9489, 0xBD43}, //3443 #HANGUL SYLLABLE PIEUP WAE CHIEUCH + {0x948A, 0xBD44}, //3444 #HANGUL SYLLABLE PIEUP WAE KHIEUKH + {0x948B, 0xBD45}, //3445 #HANGUL SYLLABLE PIEUP WAE THIEUTH + {0x948C, 0xBD46}, //3446 #HANGUL SYLLABLE PIEUP WAE PHIEUPH + {0x948D, 0xBD47}, //3447 #HANGUL SYLLABLE PIEUP WAE HIEUH + {0x948E, 0xBD4A}, //3448 #HANGUL SYLLABLE PIEUP OE SSANGKIYEOK + {0x948F, 0xBD4B}, //3449 #HANGUL SYLLABLE PIEUP OE KIYEOKSIOS + {0x9490, 0xBD4D}, //3450 #HANGUL SYLLABLE PIEUP OE NIEUNCIEUC + {0x9491, 0xBD4E}, //3451 #HANGUL SYLLABLE PIEUP OE NIEUNHIEUH + {0x9492, 0xBD4F}, //3452 #HANGUL SYLLABLE PIEUP OE TIKEUT + {0x9493, 0xBD51}, //3453 #HANGUL SYLLABLE PIEUP OE RIEULKIYEOK + {0x9494, 0xBD52}, //3454 #HANGUL SYLLABLE PIEUP OE RIEULMIEUM + {0x9495, 0xBD53}, //3455 #HANGUL SYLLABLE PIEUP OE RIEULPIEUP + {0x9496, 0xBD54}, //3456 #HANGUL SYLLABLE PIEUP OE RIEULSIOS + {0x9497, 0xBD55}, //3457 #HANGUL SYLLABLE PIEUP OE RIEULTHIEUTH + {0x9498, 0xBD56}, //3458 #HANGUL SYLLABLE PIEUP OE RIEULPHIEUPH + {0x9499, 0xBD57}, //3459 #HANGUL SYLLABLE PIEUP OE RIEULHIEUH + {0x949A, 0xBD5A}, //3460 #HANGUL SYLLABLE PIEUP OE PIEUPSIOS + {0x949B, 0xBD5B}, //3461 #HANGUL SYLLABLE PIEUP OE SIOS + {0x949C, 0xBD5C}, //3462 #HANGUL SYLLABLE PIEUP OE SSANGSIOS + {0x949D, 0xBD5D}, //3463 #HANGUL SYLLABLE PIEUP OE IEUNG + {0x949E, 0xBD5E}, //3464 #HANGUL SYLLABLE PIEUP OE CIEUC + {0x949F, 0xBD5F}, //3465 #HANGUL SYLLABLE PIEUP OE CHIEUCH + {0x94A0, 0xBD60}, //3466 #HANGUL SYLLABLE PIEUP OE KHIEUKH + {0x94A1, 0xBD61}, //3467 #HANGUL SYLLABLE PIEUP OE THIEUTH + {0x94A2, 0xBD62}, //3468 #HANGUL SYLLABLE PIEUP OE PHIEUPH + {0x94A3, 0xBD63}, //3469 #HANGUL SYLLABLE PIEUP OE HIEUH + {0x94A4, 0xBD65}, //3470 #HANGUL SYLLABLE PIEUP YO KIYEOK + {0x94A5, 0xBD66}, //3471 #HANGUL SYLLABLE PIEUP YO SSANGKIYEOK + {0x94A6, 0xBD67}, //3472 #HANGUL SYLLABLE PIEUP YO KIYEOKSIOS + {0x94A7, 0xBD69}, //3473 #HANGUL SYLLABLE PIEUP YO NIEUNCIEUC + {0x94A8, 0xBD6A}, //3474 #HANGUL SYLLABLE PIEUP YO NIEUNHIEUH + {0x94A9, 0xBD6B}, //3475 #HANGUL SYLLABLE PIEUP YO TIKEUT + {0x94AA, 0xBD6C}, //3476 #HANGUL SYLLABLE PIEUP YO RIEUL + {0x94AB, 0xBD6D}, //3477 #HANGUL SYLLABLE PIEUP YO RIEULKIYEOK + {0x94AC, 0xBD6E}, //3478 #HANGUL SYLLABLE PIEUP YO RIEULMIEUM + {0x94AD, 0xBD6F}, //3479 #HANGUL SYLLABLE PIEUP YO RIEULPIEUP + {0x94AE, 0xBD70}, //3480 #HANGUL SYLLABLE PIEUP YO RIEULSIOS + {0x94AF, 0xBD71}, //3481 #HANGUL SYLLABLE PIEUP YO RIEULTHIEUTH + {0x94B0, 0xBD72}, //3482 #HANGUL SYLLABLE PIEUP YO RIEULPHIEUPH + {0x94B1, 0xBD73}, //3483 #HANGUL SYLLABLE PIEUP YO RIEULHIEUH + {0x94B2, 0xBD74}, //3484 #HANGUL SYLLABLE PIEUP YO MIEUM + {0x94B3, 0xBD75}, //3485 #HANGUL SYLLABLE PIEUP YO PIEUP + {0x94B4, 0xBD76}, //3486 #HANGUL SYLLABLE PIEUP YO PIEUPSIOS + {0x94B5, 0xBD77}, //3487 #HANGUL SYLLABLE PIEUP YO SIOS + {0x94B6, 0xBD78}, //3488 #HANGUL SYLLABLE PIEUP YO SSANGSIOS + {0x94B7, 0xBD79}, //3489 #HANGUL SYLLABLE PIEUP YO IEUNG + {0x94B8, 0xBD7A}, //3490 #HANGUL SYLLABLE PIEUP YO CIEUC + {0x94B9, 0xBD7B}, //3491 #HANGUL SYLLABLE PIEUP YO CHIEUCH + {0x94BA, 0xBD7C}, //3492 #HANGUL SYLLABLE PIEUP YO KHIEUKH + {0x94BB, 0xBD7D}, //3493 #HANGUL SYLLABLE PIEUP YO THIEUTH + {0x94BC, 0xBD7E}, //3494 #HANGUL SYLLABLE PIEUP YO PHIEUPH + {0x94BD, 0xBD7F}, //3495 #HANGUL SYLLABLE PIEUP YO HIEUH + {0x94BE, 0xBD82}, //3496 #HANGUL SYLLABLE PIEUP U SSANGKIYEOK + {0x94BF, 0xBD83}, //3497 #HANGUL SYLLABLE PIEUP U KIYEOKSIOS + {0x94C0, 0xBD85}, //3498 #HANGUL SYLLABLE PIEUP U NIEUNCIEUC + {0x94C1, 0xBD86}, //3499 #HANGUL SYLLABLE PIEUP U NIEUNHIEUH + {0x94C2, 0xBD8B}, //3500 #HANGUL SYLLABLE PIEUP U RIEULPIEUP + {0x94C3, 0xBD8C}, //3501 #HANGUL SYLLABLE PIEUP U RIEULSIOS + {0x94C4, 0xBD8D}, //3502 #HANGUL SYLLABLE PIEUP U RIEULTHIEUTH + {0x94C5, 0xBD8E}, //3503 #HANGUL SYLLABLE PIEUP U RIEULPHIEUPH + {0x94C6, 0xBD8F}, //3504 #HANGUL SYLLABLE PIEUP U RIEULHIEUH + {0x94C7, 0xBD92}, //3505 #HANGUL SYLLABLE PIEUP U PIEUPSIOS + {0x94C8, 0xBD94}, //3506 #HANGUL SYLLABLE PIEUP U SSANGSIOS + {0x94C9, 0xBD96}, //3507 #HANGUL SYLLABLE PIEUP U CIEUC + {0x94CA, 0xBD97}, //3508 #HANGUL SYLLABLE PIEUP U CHIEUCH + {0x94CB, 0xBD98}, //3509 #HANGUL SYLLABLE PIEUP U KHIEUKH + {0x94CC, 0xBD9B}, //3510 #HANGUL SYLLABLE PIEUP U HIEUH + {0x94CD, 0xBD9D}, //3511 #HANGUL SYLLABLE PIEUP WEO KIYEOK + {0x94CE, 0xBD9E}, //3512 #HANGUL SYLLABLE PIEUP WEO SSANGKIYEOK + {0x94CF, 0xBD9F}, //3513 #HANGUL SYLLABLE PIEUP WEO KIYEOKSIOS + {0x94D0, 0xBDA0}, //3514 #HANGUL SYLLABLE PIEUP WEO NIEUN + {0x94D1, 0xBDA1}, //3515 #HANGUL SYLLABLE PIEUP WEO NIEUNCIEUC + {0x94D2, 0xBDA2}, //3516 #HANGUL SYLLABLE PIEUP WEO NIEUNHIEUH + {0x94D3, 0xBDA3}, //3517 #HANGUL SYLLABLE PIEUP WEO TIKEUT + {0x94D4, 0xBDA5}, //3518 #HANGUL SYLLABLE PIEUP WEO RIEULKIYEOK + {0x94D5, 0xBDA6}, //3519 #HANGUL SYLLABLE PIEUP WEO RIEULMIEUM + {0x94D6, 0xBDA7}, //3520 #HANGUL SYLLABLE PIEUP WEO RIEULPIEUP + {0x94D7, 0xBDA8}, //3521 #HANGUL SYLLABLE PIEUP WEO RIEULSIOS + {0x94D8, 0xBDA9}, //3522 #HANGUL SYLLABLE PIEUP WEO RIEULTHIEUTH + {0x94D9, 0xBDAA}, //3523 #HANGUL SYLLABLE PIEUP WEO RIEULPHIEUPH + {0x94DA, 0xBDAB}, //3524 #HANGUL SYLLABLE PIEUP WEO RIEULHIEUH + {0x94DB, 0xBDAC}, //3525 #HANGUL SYLLABLE PIEUP WEO MIEUM + {0x94DC, 0xBDAD}, //3526 #HANGUL SYLLABLE PIEUP WEO PIEUP + {0x94DD, 0xBDAE}, //3527 #HANGUL SYLLABLE PIEUP WEO PIEUPSIOS + {0x94DE, 0xBDAF}, //3528 #HANGUL SYLLABLE PIEUP WEO SIOS + {0x94DF, 0xBDB1}, //3529 #HANGUL SYLLABLE PIEUP WEO IEUNG + {0x94E0, 0xBDB2}, //3530 #HANGUL SYLLABLE PIEUP WEO CIEUC + {0x94E1, 0xBDB3}, //3531 #HANGUL SYLLABLE PIEUP WEO CHIEUCH + {0x94E2, 0xBDB4}, //3532 #HANGUL SYLLABLE PIEUP WEO KHIEUKH + {0x94E3, 0xBDB5}, //3533 #HANGUL SYLLABLE PIEUP WEO THIEUTH + {0x94E4, 0xBDB6}, //3534 #HANGUL SYLLABLE PIEUP WEO PHIEUPH + {0x94E5, 0xBDB7}, //3535 #HANGUL SYLLABLE PIEUP WEO HIEUH + {0x94E6, 0xBDB9}, //3536 #HANGUL SYLLABLE PIEUP WE KIYEOK + {0x94E7, 0xBDBA}, //3537 #HANGUL SYLLABLE PIEUP WE SSANGKIYEOK + {0x94E8, 0xBDBB}, //3538 #HANGUL SYLLABLE PIEUP WE KIYEOKSIOS + {0x94E9, 0xBDBC}, //3539 #HANGUL SYLLABLE PIEUP WE NIEUN + {0x94EA, 0xBDBD}, //3540 #HANGUL SYLLABLE PIEUP WE NIEUNCIEUC + {0x94EB, 0xBDBE}, //3541 #HANGUL SYLLABLE PIEUP WE NIEUNHIEUH + {0x94EC, 0xBDBF}, //3542 #HANGUL SYLLABLE PIEUP WE TIKEUT + {0x94ED, 0xBDC0}, //3543 #HANGUL SYLLABLE PIEUP WE RIEUL + {0x94EE, 0xBDC1}, //3544 #HANGUL SYLLABLE PIEUP WE RIEULKIYEOK + {0x94EF, 0xBDC2}, //3545 #HANGUL SYLLABLE PIEUP WE RIEULMIEUM + {0x94F0, 0xBDC3}, //3546 #HANGUL SYLLABLE PIEUP WE RIEULPIEUP + {0x94F1, 0xBDC4}, //3547 #HANGUL SYLLABLE PIEUP WE RIEULSIOS + {0x94F2, 0xBDC5}, //3548 #HANGUL SYLLABLE PIEUP WE RIEULTHIEUTH + {0x94F3, 0xBDC6}, //3549 #HANGUL SYLLABLE PIEUP WE RIEULPHIEUPH + {0x94F4, 0xBDC7}, //3550 #HANGUL SYLLABLE PIEUP WE RIEULHIEUH + {0x94F5, 0xBDC8}, //3551 #HANGUL SYLLABLE PIEUP WE MIEUM + {0x94F6, 0xBDC9}, //3552 #HANGUL SYLLABLE PIEUP WE PIEUP + {0x94F7, 0xBDCA}, //3553 #HANGUL SYLLABLE PIEUP WE PIEUPSIOS + {0x94F8, 0xBDCB}, //3554 #HANGUL SYLLABLE PIEUP WE SIOS + {0x94F9, 0xBDCC}, //3555 #HANGUL SYLLABLE PIEUP WE SSANGSIOS + {0x94FA, 0xBDCD}, //3556 #HANGUL SYLLABLE PIEUP WE IEUNG + {0x94FB, 0xBDCE}, //3557 #HANGUL SYLLABLE PIEUP WE CIEUC + {0x94FC, 0xBDCF}, //3558 #HANGUL SYLLABLE PIEUP WE CHIEUCH + {0x94FD, 0xBDD0}, //3559 #HANGUL SYLLABLE PIEUP WE KHIEUKH + {0x94FE, 0xBDD1}, //3560 #HANGUL SYLLABLE PIEUP WE THIEUTH + {0x9541, 0xBDD2}, //3561 #HANGUL SYLLABLE PIEUP WE PHIEUPH + {0x9542, 0xBDD3}, //3562 #HANGUL SYLLABLE PIEUP WE HIEUH + {0x9543, 0xBDD6}, //3563 #HANGUL SYLLABLE PIEUP WI SSANGKIYEOK + {0x9544, 0xBDD7}, //3564 #HANGUL SYLLABLE PIEUP WI KIYEOKSIOS + {0x9545, 0xBDD9}, //3565 #HANGUL SYLLABLE PIEUP WI NIEUNCIEUC + {0x9546, 0xBDDA}, //3566 #HANGUL SYLLABLE PIEUP WI NIEUNHIEUH + {0x9547, 0xBDDB}, //3567 #HANGUL SYLLABLE PIEUP WI TIKEUT + {0x9548, 0xBDDD}, //3568 #HANGUL SYLLABLE PIEUP WI RIEULKIYEOK + {0x9549, 0xBDDE}, //3569 #HANGUL SYLLABLE PIEUP WI RIEULMIEUM + {0x954A, 0xBDDF}, //3570 #HANGUL SYLLABLE PIEUP WI RIEULPIEUP + {0x954B, 0xBDE0}, //3571 #HANGUL SYLLABLE PIEUP WI RIEULSIOS + {0x954C, 0xBDE1}, //3572 #HANGUL SYLLABLE PIEUP WI RIEULTHIEUTH + {0x954D, 0xBDE2}, //3573 #HANGUL SYLLABLE PIEUP WI RIEULPHIEUPH + {0x954E, 0xBDE3}, //3574 #HANGUL SYLLABLE PIEUP WI RIEULHIEUH + {0x954F, 0xBDE4}, //3575 #HANGUL SYLLABLE PIEUP WI MIEUM + {0x9550, 0xBDE5}, //3576 #HANGUL SYLLABLE PIEUP WI PIEUP + {0x9551, 0xBDE6}, //3577 #HANGUL SYLLABLE PIEUP WI PIEUPSIOS + {0x9552, 0xBDE7}, //3578 #HANGUL SYLLABLE PIEUP WI SIOS + {0x9553, 0xBDE8}, //3579 #HANGUL SYLLABLE PIEUP WI SSANGSIOS + {0x9554, 0xBDEA}, //3580 #HANGUL SYLLABLE PIEUP WI CIEUC + {0x9555, 0xBDEB}, //3581 #HANGUL SYLLABLE PIEUP WI CHIEUCH + {0x9556, 0xBDEC}, //3582 #HANGUL SYLLABLE PIEUP WI KHIEUKH + {0x9557, 0xBDED}, //3583 #HANGUL SYLLABLE PIEUP WI THIEUTH + {0x9558, 0xBDEE}, //3584 #HANGUL SYLLABLE PIEUP WI PHIEUPH + {0x9559, 0xBDEF}, //3585 #HANGUL SYLLABLE PIEUP WI HIEUH + {0x955A, 0xBDF1}, //3586 #HANGUL SYLLABLE PIEUP YU KIYEOK + {0x9561, 0xBDF2}, //3587 #HANGUL SYLLABLE PIEUP YU SSANGKIYEOK + {0x9562, 0xBDF3}, //3588 #HANGUL SYLLABLE PIEUP YU KIYEOKSIOS + {0x9563, 0xBDF5}, //3589 #HANGUL SYLLABLE PIEUP YU NIEUNCIEUC + {0x9564, 0xBDF6}, //3590 #HANGUL SYLLABLE PIEUP YU NIEUNHIEUH + {0x9565, 0xBDF7}, //3591 #HANGUL SYLLABLE PIEUP YU TIKEUT + {0x9566, 0xBDF9}, //3592 #HANGUL SYLLABLE PIEUP YU RIEULKIYEOK + {0x9567, 0xBDFA}, //3593 #HANGUL SYLLABLE PIEUP YU RIEULMIEUM + {0x9568, 0xBDFB}, //3594 #HANGUL SYLLABLE PIEUP YU RIEULPIEUP + {0x9569, 0xBDFC}, //3595 #HANGUL SYLLABLE PIEUP YU RIEULSIOS + {0x956A, 0xBDFD}, //3596 #HANGUL SYLLABLE PIEUP YU RIEULTHIEUTH + {0x956B, 0xBDFE}, //3597 #HANGUL SYLLABLE PIEUP YU RIEULPHIEUPH + {0x956C, 0xBDFF}, //3598 #HANGUL SYLLABLE PIEUP YU RIEULHIEUH + {0x956D, 0xBE01}, //3599 #HANGUL SYLLABLE PIEUP YU PIEUP + {0x956E, 0xBE02}, //3600 #HANGUL SYLLABLE PIEUP YU PIEUPSIOS + {0x956F, 0xBE04}, //3601 #HANGUL SYLLABLE PIEUP YU SSANGSIOS + {0x9570, 0xBE06}, //3602 #HANGUL SYLLABLE PIEUP YU CIEUC + {0x9571, 0xBE07}, //3603 #HANGUL SYLLABLE PIEUP YU CHIEUCH + {0x9572, 0xBE08}, //3604 #HANGUL SYLLABLE PIEUP YU KHIEUKH + {0x9573, 0xBE09}, //3605 #HANGUL SYLLABLE PIEUP YU THIEUTH + {0x9574, 0xBE0A}, //3606 #HANGUL SYLLABLE PIEUP YU PHIEUPH + {0x9575, 0xBE0B}, //3607 #HANGUL SYLLABLE PIEUP YU HIEUH + {0x9576, 0xBE0E}, //3608 #HANGUL SYLLABLE PIEUP EU SSANGKIYEOK + {0x9577, 0xBE0F}, //3609 #HANGUL SYLLABLE PIEUP EU KIYEOKSIOS + {0x9578, 0xBE11}, //3610 #HANGUL SYLLABLE PIEUP EU NIEUNCIEUC + {0x9579, 0xBE12}, //3611 #HANGUL SYLLABLE PIEUP EU NIEUNHIEUH + {0x957A, 0xBE13}, //3612 #HANGUL SYLLABLE PIEUP EU TIKEUT + {0x9581, 0xBE15}, //3613 #HANGUL SYLLABLE PIEUP EU RIEULKIYEOK + {0x9582, 0xBE16}, //3614 #HANGUL SYLLABLE PIEUP EU RIEULMIEUM + {0x9583, 0xBE17}, //3615 #HANGUL SYLLABLE PIEUP EU RIEULPIEUP + {0x9584, 0xBE18}, //3616 #HANGUL SYLLABLE PIEUP EU RIEULSIOS + {0x9585, 0xBE19}, //3617 #HANGUL SYLLABLE PIEUP EU RIEULTHIEUTH + {0x9586, 0xBE1A}, //3618 #HANGUL SYLLABLE PIEUP EU RIEULPHIEUPH + {0x9587, 0xBE1B}, //3619 #HANGUL SYLLABLE PIEUP EU RIEULHIEUH + {0x9588, 0xBE1E}, //3620 #HANGUL SYLLABLE PIEUP EU PIEUPSIOS + {0x9589, 0xBE20}, //3621 #HANGUL SYLLABLE PIEUP EU SSANGSIOS + {0x958A, 0xBE21}, //3622 #HANGUL SYLLABLE PIEUP EU IEUNG + {0x958B, 0xBE22}, //3623 #HANGUL SYLLABLE PIEUP EU CIEUC + {0x958C, 0xBE23}, //3624 #HANGUL SYLLABLE PIEUP EU CHIEUCH + {0x958D, 0xBE24}, //3625 #HANGUL SYLLABLE PIEUP EU KHIEUKH + {0x958E, 0xBE25}, //3626 #HANGUL SYLLABLE PIEUP EU THIEUTH + {0x958F, 0xBE26}, //3627 #HANGUL SYLLABLE PIEUP EU PHIEUPH + {0x9590, 0xBE27}, //3628 #HANGUL SYLLABLE PIEUP EU HIEUH + {0x9591, 0xBE28}, //3629 #HANGUL SYLLABLE PIEUP YI + {0x9592, 0xBE29}, //3630 #HANGUL SYLLABLE PIEUP YI KIYEOK + {0x9593, 0xBE2A}, //3631 #HANGUL SYLLABLE PIEUP YI SSANGKIYEOK + {0x9594, 0xBE2B}, //3632 #HANGUL SYLLABLE PIEUP YI KIYEOKSIOS + {0x9595, 0xBE2C}, //3633 #HANGUL SYLLABLE PIEUP YI NIEUN + {0x9596, 0xBE2D}, //3634 #HANGUL SYLLABLE PIEUP YI NIEUNCIEUC + {0x9597, 0xBE2E}, //3635 #HANGUL SYLLABLE PIEUP YI NIEUNHIEUH + {0x9598, 0xBE2F}, //3636 #HANGUL SYLLABLE PIEUP YI TIKEUT + {0x9599, 0xBE30}, //3637 #HANGUL SYLLABLE PIEUP YI RIEUL + {0x959A, 0xBE31}, //3638 #HANGUL SYLLABLE PIEUP YI RIEULKIYEOK + {0x959B, 0xBE32}, //3639 #HANGUL SYLLABLE PIEUP YI RIEULMIEUM + {0x959C, 0xBE33}, //3640 #HANGUL SYLLABLE PIEUP YI RIEULPIEUP + {0x959D, 0xBE34}, //3641 #HANGUL SYLLABLE PIEUP YI RIEULSIOS + {0x959E, 0xBE35}, //3642 #HANGUL SYLLABLE PIEUP YI RIEULTHIEUTH + {0x959F, 0xBE36}, //3643 #HANGUL SYLLABLE PIEUP YI RIEULPHIEUPH + {0x95A0, 0xBE37}, //3644 #HANGUL SYLLABLE PIEUP YI RIEULHIEUH + {0x95A1, 0xBE38}, //3645 #HANGUL SYLLABLE PIEUP YI MIEUM + {0x95A2, 0xBE39}, //3646 #HANGUL SYLLABLE PIEUP YI PIEUP + {0x95A3, 0xBE3A}, //3647 #HANGUL SYLLABLE PIEUP YI PIEUPSIOS + {0x95A4, 0xBE3B}, //3648 #HANGUL SYLLABLE PIEUP YI SIOS + {0x95A5, 0xBE3C}, //3649 #HANGUL SYLLABLE PIEUP YI SSANGSIOS + {0x95A6, 0xBE3D}, //3650 #HANGUL SYLLABLE PIEUP YI IEUNG + {0x95A7, 0xBE3E}, //3651 #HANGUL SYLLABLE PIEUP YI CIEUC + {0x95A8, 0xBE3F}, //3652 #HANGUL SYLLABLE PIEUP YI CHIEUCH + {0x95A9, 0xBE40}, //3653 #HANGUL SYLLABLE PIEUP YI KHIEUKH + {0x95AA, 0xBE41}, //3654 #HANGUL SYLLABLE PIEUP YI THIEUTH + {0x95AB, 0xBE42}, //3655 #HANGUL SYLLABLE PIEUP YI PHIEUPH + {0x95AC, 0xBE43}, //3656 #HANGUL SYLLABLE PIEUP YI HIEUH + {0x95AD, 0xBE46}, //3657 #HANGUL SYLLABLE PIEUP I SSANGKIYEOK + {0x95AE, 0xBE47}, //3658 #HANGUL SYLLABLE PIEUP I KIYEOKSIOS + {0x95AF, 0xBE49}, //3659 #HANGUL SYLLABLE PIEUP I NIEUNCIEUC + {0x95B0, 0xBE4A}, //3660 #HANGUL SYLLABLE PIEUP I NIEUNHIEUH + {0x95B1, 0xBE4B}, //3661 #HANGUL SYLLABLE PIEUP I TIKEUT + {0x95B2, 0xBE4D}, //3662 #HANGUL SYLLABLE PIEUP I RIEULKIYEOK + {0x95B3, 0xBE4F}, //3663 #HANGUL SYLLABLE PIEUP I RIEULPIEUP + {0x95B4, 0xBE50}, //3664 #HANGUL SYLLABLE PIEUP I RIEULSIOS + {0x95B5, 0xBE51}, //3665 #HANGUL SYLLABLE PIEUP I RIEULTHIEUTH + {0x95B6, 0xBE52}, //3666 #HANGUL SYLLABLE PIEUP I RIEULPHIEUPH + {0x95B7, 0xBE53}, //3667 #HANGUL SYLLABLE PIEUP I RIEULHIEUH + {0x95B8, 0xBE56}, //3668 #HANGUL SYLLABLE PIEUP I PIEUPSIOS + {0x95B9, 0xBE58}, //3669 #HANGUL SYLLABLE PIEUP I SSANGSIOS + {0x95BA, 0xBE5C}, //3670 #HANGUL SYLLABLE PIEUP I KHIEUKH + {0x95BB, 0xBE5D}, //3671 #HANGUL SYLLABLE PIEUP I THIEUTH + {0x95BC, 0xBE5E}, //3672 #HANGUL SYLLABLE PIEUP I PHIEUPH + {0x95BD, 0xBE5F}, //3673 #HANGUL SYLLABLE PIEUP I HIEUH + {0x95BE, 0xBE62}, //3674 #HANGUL SYLLABLE SSANGPIEUP A SSANGKIYEOK + {0x95BF, 0xBE63}, //3675 #HANGUL SYLLABLE SSANGPIEUP A KIYEOKSIOS + {0x95C0, 0xBE65}, //3676 #HANGUL SYLLABLE SSANGPIEUP A NIEUNCIEUC + {0x95C1, 0xBE66}, //3677 #HANGUL SYLLABLE SSANGPIEUP A NIEUNHIEUH + {0x95C2, 0xBE67}, //3678 #HANGUL SYLLABLE SSANGPIEUP A TIKEUT + {0x95C3, 0xBE69}, //3679 #HANGUL SYLLABLE SSANGPIEUP A RIEULKIYEOK + {0x95C4, 0xBE6B}, //3680 #HANGUL SYLLABLE SSANGPIEUP A RIEULPIEUP + {0x95C5, 0xBE6C}, //3681 #HANGUL SYLLABLE SSANGPIEUP A RIEULSIOS + {0x95C6, 0xBE6D}, //3682 #HANGUL SYLLABLE SSANGPIEUP A RIEULTHIEUTH + {0x95C7, 0xBE6E}, //3683 #HANGUL SYLLABLE SSANGPIEUP A RIEULPHIEUPH + {0x95C8, 0xBE6F}, //3684 #HANGUL SYLLABLE SSANGPIEUP A RIEULHIEUH + {0x95C9, 0xBE72}, //3685 #HANGUL SYLLABLE SSANGPIEUP A PIEUPSIOS + {0x95CA, 0xBE76}, //3686 #HANGUL SYLLABLE SSANGPIEUP A CIEUC + {0x95CB, 0xBE77}, //3687 #HANGUL SYLLABLE SSANGPIEUP A CHIEUCH + {0x95CC, 0xBE78}, //3688 #HANGUL SYLLABLE SSANGPIEUP A KHIEUKH + {0x95CD, 0xBE79}, //3689 #HANGUL SYLLABLE SSANGPIEUP A THIEUTH + {0x95CE, 0xBE7A}, //3690 #HANGUL SYLLABLE SSANGPIEUP A PHIEUPH + {0x95CF, 0xBE7E}, //3691 #HANGUL SYLLABLE SSANGPIEUP AE SSANGKIYEOK + {0x95D0, 0xBE7F}, //3692 #HANGUL SYLLABLE SSANGPIEUP AE KIYEOKSIOS + {0x95D1, 0xBE81}, //3693 #HANGUL SYLLABLE SSANGPIEUP AE NIEUNCIEUC + {0x95D2, 0xBE82}, //3694 #HANGUL SYLLABLE SSANGPIEUP AE NIEUNHIEUH + {0x95D3, 0xBE83}, //3695 #HANGUL SYLLABLE SSANGPIEUP AE TIKEUT + {0x95D4, 0xBE85}, //3696 #HANGUL SYLLABLE SSANGPIEUP AE RIEULKIYEOK + {0x95D5, 0xBE86}, //3697 #HANGUL SYLLABLE SSANGPIEUP AE RIEULMIEUM + {0x95D6, 0xBE87}, //3698 #HANGUL SYLLABLE SSANGPIEUP AE RIEULPIEUP + {0x95D7, 0xBE88}, //3699 #HANGUL SYLLABLE SSANGPIEUP AE RIEULSIOS + {0x95D8, 0xBE89}, //3700 #HANGUL SYLLABLE SSANGPIEUP AE RIEULTHIEUTH + {0x95D9, 0xBE8A}, //3701 #HANGUL SYLLABLE SSANGPIEUP AE RIEULPHIEUPH + {0x95DA, 0xBE8B}, //3702 #HANGUL SYLLABLE SSANGPIEUP AE RIEULHIEUH + {0x95DB, 0xBE8E}, //3703 #HANGUL SYLLABLE SSANGPIEUP AE PIEUPSIOS + {0x95DC, 0xBE92}, //3704 #HANGUL SYLLABLE SSANGPIEUP AE CIEUC + {0x95DD, 0xBE93}, //3705 #HANGUL SYLLABLE SSANGPIEUP AE CHIEUCH + {0x95DE, 0xBE94}, //3706 #HANGUL SYLLABLE SSANGPIEUP AE KHIEUKH + {0x95DF, 0xBE95}, //3707 #HANGUL SYLLABLE SSANGPIEUP AE THIEUTH + {0x95E0, 0xBE96}, //3708 #HANGUL SYLLABLE SSANGPIEUP AE PHIEUPH + {0x95E1, 0xBE97}, //3709 #HANGUL SYLLABLE SSANGPIEUP AE HIEUH + {0x95E2, 0xBE9A}, //3710 #HANGUL SYLLABLE SSANGPIEUP YA SSANGKIYEOK + {0x95E3, 0xBE9B}, //3711 #HANGUL SYLLABLE SSANGPIEUP YA KIYEOKSIOS + {0x95E4, 0xBE9C}, //3712 #HANGUL SYLLABLE SSANGPIEUP YA NIEUN + {0x95E5, 0xBE9D}, //3713 #HANGUL SYLLABLE SSANGPIEUP YA NIEUNCIEUC + {0x95E6, 0xBE9E}, //3714 #HANGUL SYLLABLE SSANGPIEUP YA NIEUNHIEUH + {0x95E7, 0xBE9F}, //3715 #HANGUL SYLLABLE SSANGPIEUP YA TIKEUT + {0x95E8, 0xBEA0}, //3716 #HANGUL SYLLABLE SSANGPIEUP YA RIEUL + {0x95E9, 0xBEA1}, //3717 #HANGUL SYLLABLE SSANGPIEUP YA RIEULKIYEOK + {0x95EA, 0xBEA2}, //3718 #HANGUL SYLLABLE SSANGPIEUP YA RIEULMIEUM + {0x95EB, 0xBEA3}, //3719 #HANGUL SYLLABLE SSANGPIEUP YA RIEULPIEUP + {0x95EC, 0xBEA4}, //3720 #HANGUL SYLLABLE SSANGPIEUP YA RIEULSIOS + {0x95ED, 0xBEA5}, //3721 #HANGUL SYLLABLE SSANGPIEUP YA RIEULTHIEUTH + {0x95EE, 0xBEA6}, //3722 #HANGUL SYLLABLE SSANGPIEUP YA RIEULPHIEUPH + {0x95EF, 0xBEA7}, //3723 #HANGUL SYLLABLE SSANGPIEUP YA RIEULHIEUH + {0x95F0, 0xBEA9}, //3724 #HANGUL SYLLABLE SSANGPIEUP YA PIEUP + {0x95F1, 0xBEAA}, //3725 #HANGUL SYLLABLE SSANGPIEUP YA PIEUPSIOS + {0x95F2, 0xBEAB}, //3726 #HANGUL SYLLABLE SSANGPIEUP YA SIOS + {0x95F3, 0xBEAC}, //3727 #HANGUL SYLLABLE SSANGPIEUP YA SSANGSIOS + {0x95F4, 0xBEAD}, //3728 #HANGUL SYLLABLE SSANGPIEUP YA IEUNG + {0x95F5, 0xBEAE}, //3729 #HANGUL SYLLABLE SSANGPIEUP YA CIEUC + {0x95F6, 0xBEAF}, //3730 #HANGUL SYLLABLE SSANGPIEUP YA CHIEUCH + {0x95F7, 0xBEB0}, //3731 #HANGUL SYLLABLE SSANGPIEUP YA KHIEUKH + {0x95F8, 0xBEB1}, //3732 #HANGUL SYLLABLE SSANGPIEUP YA THIEUTH + {0x95F9, 0xBEB2}, //3733 #HANGUL SYLLABLE SSANGPIEUP YA PHIEUPH + {0x95FA, 0xBEB3}, //3734 #HANGUL SYLLABLE SSANGPIEUP YA HIEUH + {0x95FB, 0xBEB4}, //3735 #HANGUL SYLLABLE SSANGPIEUP YAE + {0x95FC, 0xBEB5}, //3736 #HANGUL SYLLABLE SSANGPIEUP YAE KIYEOK + {0x95FD, 0xBEB6}, //3737 #HANGUL SYLLABLE SSANGPIEUP YAE SSANGKIYEOK + {0x95FE, 0xBEB7}, //3738 #HANGUL SYLLABLE SSANGPIEUP YAE KIYEOKSIOS + {0x9641, 0xBEB8}, //3739 #HANGUL SYLLABLE SSANGPIEUP YAE NIEUN + {0x9642, 0xBEB9}, //3740 #HANGUL SYLLABLE SSANGPIEUP YAE NIEUNCIEUC + {0x9643, 0xBEBA}, //3741 #HANGUL SYLLABLE SSANGPIEUP YAE NIEUNHIEUH + {0x9644, 0xBEBB}, //3742 #HANGUL SYLLABLE SSANGPIEUP YAE TIKEUT + {0x9645, 0xBEBC}, //3743 #HANGUL SYLLABLE SSANGPIEUP YAE RIEUL + {0x9646, 0xBEBD}, //3744 #HANGUL SYLLABLE SSANGPIEUP YAE RIEULKIYEOK + {0x9647, 0xBEBE}, //3745 #HANGUL SYLLABLE SSANGPIEUP YAE RIEULMIEUM + {0x9648, 0xBEBF}, //3746 #HANGUL SYLLABLE SSANGPIEUP YAE RIEULPIEUP + {0x9649, 0xBEC0}, //3747 #HANGUL SYLLABLE SSANGPIEUP YAE RIEULSIOS + {0x964A, 0xBEC1}, //3748 #HANGUL SYLLABLE SSANGPIEUP YAE RIEULTHIEUTH + {0x964B, 0xBEC2}, //3749 #HANGUL SYLLABLE SSANGPIEUP YAE RIEULPHIEUPH + {0x964C, 0xBEC3}, //3750 #HANGUL SYLLABLE SSANGPIEUP YAE RIEULHIEUH + {0x964D, 0xBEC4}, //3751 #HANGUL SYLLABLE SSANGPIEUP YAE MIEUM + {0x964E, 0xBEC5}, //3752 #HANGUL SYLLABLE SSANGPIEUP YAE PIEUP + {0x964F, 0xBEC6}, //3753 #HANGUL SYLLABLE SSANGPIEUP YAE PIEUPSIOS + {0x9650, 0xBEC7}, //3754 #HANGUL SYLLABLE SSANGPIEUP YAE SIOS + {0x9651, 0xBEC8}, //3755 #HANGUL SYLLABLE SSANGPIEUP YAE SSANGSIOS + {0x9652, 0xBEC9}, //3756 #HANGUL SYLLABLE SSANGPIEUP YAE IEUNG + {0x9653, 0xBECA}, //3757 #HANGUL SYLLABLE SSANGPIEUP YAE CIEUC + {0x9654, 0xBECB}, //3758 #HANGUL SYLLABLE SSANGPIEUP YAE CHIEUCH + {0x9655, 0xBECC}, //3759 #HANGUL SYLLABLE SSANGPIEUP YAE KHIEUKH + {0x9656, 0xBECD}, //3760 #HANGUL SYLLABLE SSANGPIEUP YAE THIEUTH + {0x9657, 0xBECE}, //3761 #HANGUL SYLLABLE SSANGPIEUP YAE PHIEUPH + {0x9658, 0xBECF}, //3762 #HANGUL SYLLABLE SSANGPIEUP YAE HIEUH + {0x9659, 0xBED2}, //3763 #HANGUL SYLLABLE SSANGPIEUP EO SSANGKIYEOK + {0x965A, 0xBED3}, //3764 #HANGUL SYLLABLE SSANGPIEUP EO KIYEOKSIOS + {0x9661, 0xBED5}, //3765 #HANGUL SYLLABLE SSANGPIEUP EO NIEUNCIEUC + {0x9662, 0xBED6}, //3766 #HANGUL SYLLABLE SSANGPIEUP EO NIEUNHIEUH + {0x9663, 0xBED9}, //3767 #HANGUL SYLLABLE SSANGPIEUP EO RIEULKIYEOK + {0x9664, 0xBEDA}, //3768 #HANGUL SYLLABLE SSANGPIEUP EO RIEULMIEUM + {0x9665, 0xBEDB}, //3769 #HANGUL SYLLABLE SSANGPIEUP EO RIEULPIEUP + {0x9666, 0xBEDC}, //3770 #HANGUL SYLLABLE SSANGPIEUP EO RIEULSIOS + {0x9667, 0xBEDD}, //3771 #HANGUL SYLLABLE SSANGPIEUP EO RIEULTHIEUTH + {0x9668, 0xBEDE}, //3772 #HANGUL SYLLABLE SSANGPIEUP EO RIEULPHIEUPH + {0x9669, 0xBEDF}, //3773 #HANGUL SYLLABLE SSANGPIEUP EO RIEULHIEUH + {0x966A, 0xBEE1}, //3774 #HANGUL SYLLABLE SSANGPIEUP EO PIEUP + {0x966B, 0xBEE2}, //3775 #HANGUL SYLLABLE SSANGPIEUP EO PIEUPSIOS + {0x966C, 0xBEE6}, //3776 #HANGUL SYLLABLE SSANGPIEUP EO CIEUC + {0x966D, 0xBEE7}, //3777 #HANGUL SYLLABLE SSANGPIEUP EO CHIEUCH + {0x966E, 0xBEE8}, //3778 #HANGUL SYLLABLE SSANGPIEUP EO KHIEUKH + {0x966F, 0xBEE9}, //3779 #HANGUL SYLLABLE SSANGPIEUP EO THIEUTH + {0x9670, 0xBEEA}, //3780 #HANGUL SYLLABLE SSANGPIEUP EO PHIEUPH + {0x9671, 0xBEEB}, //3781 #HANGUL SYLLABLE SSANGPIEUP EO HIEUH + {0x9672, 0xBEED}, //3782 #HANGUL SYLLABLE SSANGPIEUP E KIYEOK + {0x9673, 0xBEEE}, //3783 #HANGUL SYLLABLE SSANGPIEUP E SSANGKIYEOK + {0x9674, 0xBEEF}, //3784 #HANGUL SYLLABLE SSANGPIEUP E KIYEOKSIOS + {0x9675, 0xBEF0}, //3785 #HANGUL SYLLABLE SSANGPIEUP E NIEUN + {0x9676, 0xBEF1}, //3786 #HANGUL SYLLABLE SSANGPIEUP E NIEUNCIEUC + {0x9677, 0xBEF2}, //3787 #HANGUL SYLLABLE SSANGPIEUP E NIEUNHIEUH + {0x9678, 0xBEF3}, //3788 #HANGUL SYLLABLE SSANGPIEUP E TIKEUT + {0x9679, 0xBEF4}, //3789 #HANGUL SYLLABLE SSANGPIEUP E RIEUL + {0x967A, 0xBEF5}, //3790 #HANGUL SYLLABLE SSANGPIEUP E RIEULKIYEOK + {0x9681, 0xBEF6}, //3791 #HANGUL SYLLABLE SSANGPIEUP E RIEULMIEUM + {0x9682, 0xBEF7}, //3792 #HANGUL SYLLABLE SSANGPIEUP E RIEULPIEUP + {0x9683, 0xBEF8}, //3793 #HANGUL SYLLABLE SSANGPIEUP E RIEULSIOS + {0x9684, 0xBEF9}, //3794 #HANGUL SYLLABLE SSANGPIEUP E RIEULTHIEUTH + {0x9685, 0xBEFA}, //3795 #HANGUL SYLLABLE SSANGPIEUP E RIEULPHIEUPH + {0x9686, 0xBEFB}, //3796 #HANGUL SYLLABLE SSANGPIEUP E RIEULHIEUH + {0x9687, 0xBEFC}, //3797 #HANGUL SYLLABLE SSANGPIEUP E MIEUM + {0x9688, 0xBEFD}, //3798 #HANGUL SYLLABLE SSANGPIEUP E PIEUP + {0x9689, 0xBEFE}, //3799 #HANGUL SYLLABLE SSANGPIEUP E PIEUPSIOS + {0x968A, 0xBEFF}, //3800 #HANGUL SYLLABLE SSANGPIEUP E SIOS + {0x968B, 0xBF00}, //3801 #HANGUL SYLLABLE SSANGPIEUP E SSANGSIOS + {0x968C, 0xBF02}, //3802 #HANGUL SYLLABLE SSANGPIEUP E CIEUC + {0x968D, 0xBF03}, //3803 #HANGUL SYLLABLE SSANGPIEUP E CHIEUCH + {0x968E, 0xBF04}, //3804 #HANGUL SYLLABLE SSANGPIEUP E KHIEUKH + {0x968F, 0xBF05}, //3805 #HANGUL SYLLABLE SSANGPIEUP E THIEUTH + {0x9690, 0xBF06}, //3806 #HANGUL SYLLABLE SSANGPIEUP E PHIEUPH + {0x9691, 0xBF07}, //3807 #HANGUL SYLLABLE SSANGPIEUP E HIEUH + {0x9692, 0xBF0A}, //3808 #HANGUL SYLLABLE SSANGPIEUP YEO SSANGKIYEOK + {0x9693, 0xBF0B}, //3809 #HANGUL SYLLABLE SSANGPIEUP YEO KIYEOKSIOS + {0x9694, 0xBF0C}, //3810 #HANGUL SYLLABLE SSANGPIEUP YEO NIEUN + {0x9695, 0xBF0D}, //3811 #HANGUL SYLLABLE SSANGPIEUP YEO NIEUNCIEUC + {0x9696, 0xBF0E}, //3812 #HANGUL SYLLABLE SSANGPIEUP YEO NIEUNHIEUH + {0x9697, 0xBF0F}, //3813 #HANGUL SYLLABLE SSANGPIEUP YEO TIKEUT + {0x9698, 0xBF10}, //3814 #HANGUL SYLLABLE SSANGPIEUP YEO RIEUL + {0x9699, 0xBF11}, //3815 #HANGUL SYLLABLE SSANGPIEUP YEO RIEULKIYEOK + {0x969A, 0xBF12}, //3816 #HANGUL SYLLABLE SSANGPIEUP YEO RIEULMIEUM + {0x969B, 0xBF13}, //3817 #HANGUL SYLLABLE SSANGPIEUP YEO RIEULPIEUP + {0x969C, 0xBF14}, //3818 #HANGUL SYLLABLE SSANGPIEUP YEO RIEULSIOS + {0x969D, 0xBF15}, //3819 #HANGUL SYLLABLE SSANGPIEUP YEO RIEULTHIEUTH + {0x969E, 0xBF16}, //3820 #HANGUL SYLLABLE SSANGPIEUP YEO RIEULPHIEUPH + {0x969F, 0xBF17}, //3821 #HANGUL SYLLABLE SSANGPIEUP YEO RIEULHIEUH + {0x96A0, 0xBF1A}, //3822 #HANGUL SYLLABLE SSANGPIEUP YEO PIEUPSIOS + {0x96A1, 0xBF1E}, //3823 #HANGUL SYLLABLE SSANGPIEUP YEO CIEUC + {0x96A2, 0xBF1F}, //3824 #HANGUL SYLLABLE SSANGPIEUP YEO CHIEUCH + {0x96A3, 0xBF20}, //3825 #HANGUL SYLLABLE SSANGPIEUP YEO KHIEUKH + {0x96A4, 0xBF21}, //3826 #HANGUL SYLLABLE SSANGPIEUP YEO THIEUTH + {0x96A5, 0xBF22}, //3827 #HANGUL SYLLABLE SSANGPIEUP YEO PHIEUPH + {0x96A6, 0xBF23}, //3828 #HANGUL SYLLABLE SSANGPIEUP YEO HIEUH + {0x96A7, 0xBF24}, //3829 #HANGUL SYLLABLE SSANGPIEUP YE + {0x96A8, 0xBF25}, //3830 #HANGUL SYLLABLE SSANGPIEUP YE KIYEOK + {0x96A9, 0xBF26}, //3831 #HANGUL SYLLABLE SSANGPIEUP YE SSANGKIYEOK + {0x96AA, 0xBF27}, //3832 #HANGUL SYLLABLE SSANGPIEUP YE KIYEOKSIOS + {0x96AB, 0xBF28}, //3833 #HANGUL SYLLABLE SSANGPIEUP YE NIEUN + {0x96AC, 0xBF29}, //3834 #HANGUL SYLLABLE SSANGPIEUP YE NIEUNCIEUC + {0x96AD, 0xBF2A}, //3835 #HANGUL SYLLABLE SSANGPIEUP YE NIEUNHIEUH + {0x96AE, 0xBF2B}, //3836 #HANGUL SYLLABLE SSANGPIEUP YE TIKEUT + {0x96AF, 0xBF2C}, //3837 #HANGUL SYLLABLE SSANGPIEUP YE RIEUL + {0x96B0, 0xBF2D}, //3838 #HANGUL SYLLABLE SSANGPIEUP YE RIEULKIYEOK + {0x96B1, 0xBF2E}, //3839 #HANGUL SYLLABLE SSANGPIEUP YE RIEULMIEUM + {0x96B2, 0xBF2F}, //3840 #HANGUL SYLLABLE SSANGPIEUP YE RIEULPIEUP + {0x96B3, 0xBF30}, //3841 #HANGUL SYLLABLE SSANGPIEUP YE RIEULSIOS + {0x96B4, 0xBF31}, //3842 #HANGUL SYLLABLE SSANGPIEUP YE RIEULTHIEUTH + {0x96B5, 0xBF32}, //3843 #HANGUL SYLLABLE SSANGPIEUP YE RIEULPHIEUPH + {0x96B6, 0xBF33}, //3844 #HANGUL SYLLABLE SSANGPIEUP YE RIEULHIEUH + {0x96B7, 0xBF34}, //3845 #HANGUL SYLLABLE SSANGPIEUP YE MIEUM + {0x96B8, 0xBF35}, //3846 #HANGUL SYLLABLE SSANGPIEUP YE PIEUP + {0x96B9, 0xBF36}, //3847 #HANGUL SYLLABLE SSANGPIEUP YE PIEUPSIOS + {0x96BA, 0xBF37}, //3848 #HANGUL SYLLABLE SSANGPIEUP YE SIOS + {0x96BB, 0xBF38}, //3849 #HANGUL SYLLABLE SSANGPIEUP YE SSANGSIOS + {0x96BC, 0xBF39}, //3850 #HANGUL SYLLABLE SSANGPIEUP YE IEUNG + {0x96BD, 0xBF3A}, //3851 #HANGUL SYLLABLE SSANGPIEUP YE CIEUC + {0x96BE, 0xBF3B}, //3852 #HANGUL SYLLABLE SSANGPIEUP YE CHIEUCH + {0x96BF, 0xBF3C}, //3853 #HANGUL SYLLABLE SSANGPIEUP YE KHIEUKH + {0x96C0, 0xBF3D}, //3854 #HANGUL SYLLABLE SSANGPIEUP YE THIEUTH + {0x96C1, 0xBF3E}, //3855 #HANGUL SYLLABLE SSANGPIEUP YE PHIEUPH + {0x96C2, 0xBF3F}, //3856 #HANGUL SYLLABLE SSANGPIEUP YE HIEUH + {0x96C3, 0xBF42}, //3857 #HANGUL SYLLABLE SSANGPIEUP O SSANGKIYEOK + {0x96C4, 0xBF43}, //3858 #HANGUL SYLLABLE SSANGPIEUP O KIYEOKSIOS + {0x96C5, 0xBF45}, //3859 #HANGUL SYLLABLE SSANGPIEUP O NIEUNCIEUC + {0x96C6, 0xBF46}, //3860 #HANGUL SYLLABLE SSANGPIEUP O NIEUNHIEUH + {0x96C7, 0xBF47}, //3861 #HANGUL SYLLABLE SSANGPIEUP O TIKEUT + {0x96C8, 0xBF49}, //3862 #HANGUL SYLLABLE SSANGPIEUP O RIEULKIYEOK + {0x96C9, 0xBF4A}, //3863 #HANGUL SYLLABLE SSANGPIEUP O RIEULMIEUM + {0x96CA, 0xBF4B}, //3864 #HANGUL SYLLABLE SSANGPIEUP O RIEULPIEUP + {0x96CB, 0xBF4C}, //3865 #HANGUL SYLLABLE SSANGPIEUP O RIEULSIOS + {0x96CC, 0xBF4D}, //3866 #HANGUL SYLLABLE SSANGPIEUP O RIEULTHIEUTH + {0x96CD, 0xBF4E}, //3867 #HANGUL SYLLABLE SSANGPIEUP O RIEULPHIEUPH + {0x96CE, 0xBF4F}, //3868 #HANGUL SYLLABLE SSANGPIEUP O RIEULHIEUH + {0x96CF, 0xBF52}, //3869 #HANGUL SYLLABLE SSANGPIEUP O PIEUPSIOS + {0x96D0, 0xBF53}, //3870 #HANGUL SYLLABLE SSANGPIEUP O SIOS + {0x96D1, 0xBF54}, //3871 #HANGUL SYLLABLE SSANGPIEUP O SSANGSIOS + {0x96D2, 0xBF56}, //3872 #HANGUL SYLLABLE SSANGPIEUP O CIEUC + {0x96D3, 0xBF57}, //3873 #HANGUL SYLLABLE SSANGPIEUP O CHIEUCH + {0x96D4, 0xBF58}, //3874 #HANGUL SYLLABLE SSANGPIEUP O KHIEUKH + {0x96D5, 0xBF59}, //3875 #HANGUL SYLLABLE SSANGPIEUP O THIEUTH + {0x96D6, 0xBF5A}, //3876 #HANGUL SYLLABLE SSANGPIEUP O PHIEUPH + {0x96D7, 0xBF5B}, //3877 #HANGUL SYLLABLE SSANGPIEUP O HIEUH + {0x96D8, 0xBF5C}, //3878 #HANGUL SYLLABLE SSANGPIEUP WA + {0x96D9, 0xBF5D}, //3879 #HANGUL SYLLABLE SSANGPIEUP WA KIYEOK + {0x96DA, 0xBF5E}, //3880 #HANGUL SYLLABLE SSANGPIEUP WA SSANGKIYEOK + {0x96DB, 0xBF5F}, //3881 #HANGUL SYLLABLE SSANGPIEUP WA KIYEOKSIOS + {0x96DC, 0xBF60}, //3882 #HANGUL SYLLABLE SSANGPIEUP WA NIEUN + {0x96DD, 0xBF61}, //3883 #HANGUL SYLLABLE SSANGPIEUP WA NIEUNCIEUC + {0x96DE, 0xBF62}, //3884 #HANGUL SYLLABLE SSANGPIEUP WA NIEUNHIEUH + {0x96DF, 0xBF63}, //3885 #HANGUL SYLLABLE SSANGPIEUP WA TIKEUT + {0x96E0, 0xBF64}, //3886 #HANGUL SYLLABLE SSANGPIEUP WA RIEUL + {0x96E1, 0xBF65}, //3887 #HANGUL SYLLABLE SSANGPIEUP WA RIEULKIYEOK + {0x96E2, 0xBF66}, //3888 #HANGUL SYLLABLE SSANGPIEUP WA RIEULMIEUM + {0x96E3, 0xBF67}, //3889 #HANGUL SYLLABLE SSANGPIEUP WA RIEULPIEUP + {0x96E4, 0xBF68}, //3890 #HANGUL SYLLABLE SSANGPIEUP WA RIEULSIOS + {0x96E5, 0xBF69}, //3891 #HANGUL SYLLABLE SSANGPIEUP WA RIEULTHIEUTH + {0x96E6, 0xBF6A}, //3892 #HANGUL SYLLABLE SSANGPIEUP WA RIEULPHIEUPH + {0x96E7, 0xBF6B}, //3893 #HANGUL SYLLABLE SSANGPIEUP WA RIEULHIEUH + {0x96E8, 0xBF6C}, //3894 #HANGUL SYLLABLE SSANGPIEUP WA MIEUM + {0x96E9, 0xBF6D}, //3895 #HANGUL SYLLABLE SSANGPIEUP WA PIEUP + {0x96EA, 0xBF6E}, //3896 #HANGUL SYLLABLE SSANGPIEUP WA PIEUPSIOS + {0x96EB, 0xBF6F}, //3897 #HANGUL SYLLABLE SSANGPIEUP WA SIOS + {0x96EC, 0xBF70}, //3898 #HANGUL SYLLABLE SSANGPIEUP WA SSANGSIOS + {0x96ED, 0xBF71}, //3899 #HANGUL SYLLABLE SSANGPIEUP WA IEUNG + {0x96EE, 0xBF72}, //3900 #HANGUL SYLLABLE SSANGPIEUP WA CIEUC + {0x96EF, 0xBF73}, //3901 #HANGUL SYLLABLE SSANGPIEUP WA CHIEUCH + {0x96F0, 0xBF74}, //3902 #HANGUL SYLLABLE SSANGPIEUP WA KHIEUKH + {0x96F1, 0xBF75}, //3903 #HANGUL SYLLABLE SSANGPIEUP WA THIEUTH + {0x96F2, 0xBF76}, //3904 #HANGUL SYLLABLE SSANGPIEUP WA PHIEUPH + {0x96F3, 0xBF77}, //3905 #HANGUL SYLLABLE SSANGPIEUP WA HIEUH + {0x96F4, 0xBF78}, //3906 #HANGUL SYLLABLE SSANGPIEUP WAE + {0x96F5, 0xBF79}, //3907 #HANGUL SYLLABLE SSANGPIEUP WAE KIYEOK + {0x96F6, 0xBF7A}, //3908 #HANGUL SYLLABLE SSANGPIEUP WAE SSANGKIYEOK + {0x96F7, 0xBF7B}, //3909 #HANGUL SYLLABLE SSANGPIEUP WAE KIYEOKSIOS + {0x96F8, 0xBF7C}, //3910 #HANGUL SYLLABLE SSANGPIEUP WAE NIEUN + {0x96F9, 0xBF7D}, //3911 #HANGUL SYLLABLE SSANGPIEUP WAE NIEUNCIEUC + {0x96FA, 0xBF7E}, //3912 #HANGUL SYLLABLE SSANGPIEUP WAE NIEUNHIEUH + {0x96FB, 0xBF7F}, //3913 #HANGUL SYLLABLE SSANGPIEUP WAE TIKEUT + {0x96FC, 0xBF80}, //3914 #HANGUL SYLLABLE SSANGPIEUP WAE RIEUL + {0x96FD, 0xBF81}, //3915 #HANGUL SYLLABLE SSANGPIEUP WAE RIEULKIYEOK + {0x96FE, 0xBF82}, //3916 #HANGUL SYLLABLE SSANGPIEUP WAE RIEULMIEUM + {0x9741, 0xBF83}, //3917 #HANGUL SYLLABLE SSANGPIEUP WAE RIEULPIEUP + {0x9742, 0xBF84}, //3918 #HANGUL SYLLABLE SSANGPIEUP WAE RIEULSIOS + {0x9743, 0xBF85}, //3919 #HANGUL SYLLABLE SSANGPIEUP WAE RIEULTHIEUTH + {0x9744, 0xBF86}, //3920 #HANGUL SYLLABLE SSANGPIEUP WAE RIEULPHIEUPH + {0x9745, 0xBF87}, //3921 #HANGUL SYLLABLE SSANGPIEUP WAE RIEULHIEUH + {0x9746, 0xBF88}, //3922 #HANGUL SYLLABLE SSANGPIEUP WAE MIEUM + {0x9747, 0xBF89}, //3923 #HANGUL SYLLABLE SSANGPIEUP WAE PIEUP + {0x9748, 0xBF8A}, //3924 #HANGUL SYLLABLE SSANGPIEUP WAE PIEUPSIOS + {0x9749, 0xBF8B}, //3925 #HANGUL SYLLABLE SSANGPIEUP WAE SIOS + {0x974A, 0xBF8C}, //3926 #HANGUL SYLLABLE SSANGPIEUP WAE SSANGSIOS + {0x974B, 0xBF8D}, //3927 #HANGUL SYLLABLE SSANGPIEUP WAE IEUNG + {0x974C, 0xBF8E}, //3928 #HANGUL SYLLABLE SSANGPIEUP WAE CIEUC + {0x974D, 0xBF8F}, //3929 #HANGUL SYLLABLE SSANGPIEUP WAE CHIEUCH + {0x974E, 0xBF90}, //3930 #HANGUL SYLLABLE SSANGPIEUP WAE KHIEUKH + {0x974F, 0xBF91}, //3931 #HANGUL SYLLABLE SSANGPIEUP WAE THIEUTH + {0x9750, 0xBF92}, //3932 #HANGUL SYLLABLE SSANGPIEUP WAE PHIEUPH + {0x9751, 0xBF93}, //3933 #HANGUL SYLLABLE SSANGPIEUP WAE HIEUH + {0x9752, 0xBF95}, //3934 #HANGUL SYLLABLE SSANGPIEUP OE KIYEOK + {0x9753, 0xBF96}, //3935 #HANGUL SYLLABLE SSANGPIEUP OE SSANGKIYEOK + {0x9754, 0xBF97}, //3936 #HANGUL SYLLABLE SSANGPIEUP OE KIYEOKSIOS + {0x9755, 0xBF98}, //3937 #HANGUL SYLLABLE SSANGPIEUP OE NIEUN + {0x9756, 0xBF99}, //3938 #HANGUL SYLLABLE SSANGPIEUP OE NIEUNCIEUC + {0x9757, 0xBF9A}, //3939 #HANGUL SYLLABLE SSANGPIEUP OE NIEUNHIEUH + {0x9758, 0xBF9B}, //3940 #HANGUL SYLLABLE SSANGPIEUP OE TIKEUT + {0x9759, 0xBF9C}, //3941 #HANGUL SYLLABLE SSANGPIEUP OE RIEUL + {0x975A, 0xBF9D}, //3942 #HANGUL SYLLABLE SSANGPIEUP OE RIEULKIYEOK + {0x9761, 0xBF9E}, //3943 #HANGUL SYLLABLE SSANGPIEUP OE RIEULMIEUM + {0x9762, 0xBF9F}, //3944 #HANGUL SYLLABLE SSANGPIEUP OE RIEULPIEUP + {0x9763, 0xBFA0}, //3945 #HANGUL SYLLABLE SSANGPIEUP OE RIEULSIOS + {0x9764, 0xBFA1}, //3946 #HANGUL SYLLABLE SSANGPIEUP OE RIEULTHIEUTH + {0x9765, 0xBFA2}, //3947 #HANGUL SYLLABLE SSANGPIEUP OE RIEULPHIEUPH + {0x9766, 0xBFA3}, //3948 #HANGUL SYLLABLE SSANGPIEUP OE RIEULHIEUH + {0x9767, 0xBFA4}, //3949 #HANGUL SYLLABLE SSANGPIEUP OE MIEUM + {0x9768, 0xBFA5}, //3950 #HANGUL SYLLABLE SSANGPIEUP OE PIEUP + {0x9769, 0xBFA6}, //3951 #HANGUL SYLLABLE SSANGPIEUP OE PIEUPSIOS + {0x976A, 0xBFA7}, //3952 #HANGUL SYLLABLE SSANGPIEUP OE SIOS + {0x976B, 0xBFA8}, //3953 #HANGUL SYLLABLE SSANGPIEUP OE SSANGSIOS + {0x976C, 0xBFA9}, //3954 #HANGUL SYLLABLE SSANGPIEUP OE IEUNG + {0x976D, 0xBFAA}, //3955 #HANGUL SYLLABLE SSANGPIEUP OE CIEUC + {0x976E, 0xBFAB}, //3956 #HANGUL SYLLABLE SSANGPIEUP OE CHIEUCH + {0x976F, 0xBFAC}, //3957 #HANGUL SYLLABLE SSANGPIEUP OE KHIEUKH + {0x9770, 0xBFAD}, //3958 #HANGUL SYLLABLE SSANGPIEUP OE THIEUTH + {0x9771, 0xBFAE}, //3959 #HANGUL SYLLABLE SSANGPIEUP OE PHIEUPH + {0x9772, 0xBFAF}, //3960 #HANGUL SYLLABLE SSANGPIEUP OE HIEUH + {0x9773, 0xBFB1}, //3961 #HANGUL SYLLABLE SSANGPIEUP YO KIYEOK + {0x9774, 0xBFB2}, //3962 #HANGUL SYLLABLE SSANGPIEUP YO SSANGKIYEOK + {0x9775, 0xBFB3}, //3963 #HANGUL SYLLABLE SSANGPIEUP YO KIYEOKSIOS + {0x9776, 0xBFB4}, //3964 #HANGUL SYLLABLE SSANGPIEUP YO NIEUN + {0x9777, 0xBFB5}, //3965 #HANGUL SYLLABLE SSANGPIEUP YO NIEUNCIEUC + {0x9778, 0xBFB6}, //3966 #HANGUL SYLLABLE SSANGPIEUP YO NIEUNHIEUH + {0x9779, 0xBFB7}, //3967 #HANGUL SYLLABLE SSANGPIEUP YO TIKEUT + {0x977A, 0xBFB8}, //3968 #HANGUL SYLLABLE SSANGPIEUP YO RIEUL + {0x9781, 0xBFB9}, //3969 #HANGUL SYLLABLE SSANGPIEUP YO RIEULKIYEOK + {0x9782, 0xBFBA}, //3970 #HANGUL SYLLABLE SSANGPIEUP YO RIEULMIEUM + {0x9783, 0xBFBB}, //3971 #HANGUL SYLLABLE SSANGPIEUP YO RIEULPIEUP + {0x9784, 0xBFBC}, //3972 #HANGUL SYLLABLE SSANGPIEUP YO RIEULSIOS + {0x9785, 0xBFBD}, //3973 #HANGUL SYLLABLE SSANGPIEUP YO RIEULTHIEUTH + {0x9786, 0xBFBE}, //3974 #HANGUL SYLLABLE SSANGPIEUP YO RIEULPHIEUPH + {0x9787, 0xBFBF}, //3975 #HANGUL SYLLABLE SSANGPIEUP YO RIEULHIEUH + {0x9788, 0xBFC0}, //3976 #HANGUL SYLLABLE SSANGPIEUP YO MIEUM + {0x9789, 0xBFC1}, //3977 #HANGUL SYLLABLE SSANGPIEUP YO PIEUP + {0x978A, 0xBFC2}, //3978 #HANGUL SYLLABLE SSANGPIEUP YO PIEUPSIOS + {0x978B, 0xBFC3}, //3979 #HANGUL SYLLABLE SSANGPIEUP YO SIOS + {0x978C, 0xBFC4}, //3980 #HANGUL SYLLABLE SSANGPIEUP YO SSANGSIOS + {0x978D, 0xBFC6}, //3981 #HANGUL SYLLABLE SSANGPIEUP YO CIEUC + {0x978E, 0xBFC7}, //3982 #HANGUL SYLLABLE SSANGPIEUP YO CHIEUCH + {0x978F, 0xBFC8}, //3983 #HANGUL SYLLABLE SSANGPIEUP YO KHIEUKH + {0x9790, 0xBFC9}, //3984 #HANGUL SYLLABLE SSANGPIEUP YO THIEUTH + {0x9791, 0xBFCA}, //3985 #HANGUL SYLLABLE SSANGPIEUP YO PHIEUPH + {0x9792, 0xBFCB}, //3986 #HANGUL SYLLABLE SSANGPIEUP YO HIEUH + {0x9793, 0xBFCE}, //3987 #HANGUL SYLLABLE SSANGPIEUP U SSANGKIYEOK + {0x9794, 0xBFCF}, //3988 #HANGUL SYLLABLE SSANGPIEUP U KIYEOKSIOS + {0x9795, 0xBFD1}, //3989 #HANGUL SYLLABLE SSANGPIEUP U NIEUNCIEUC + {0x9796, 0xBFD2}, //3990 #HANGUL SYLLABLE SSANGPIEUP U NIEUNHIEUH + {0x9797, 0xBFD3}, //3991 #HANGUL SYLLABLE SSANGPIEUP U TIKEUT + {0x9798, 0xBFD5}, //3992 #HANGUL SYLLABLE SSANGPIEUP U RIEULKIYEOK + {0x9799, 0xBFD6}, //3993 #HANGUL SYLLABLE SSANGPIEUP U RIEULMIEUM + {0x979A, 0xBFD7}, //3994 #HANGUL SYLLABLE SSANGPIEUP U RIEULPIEUP + {0x979B, 0xBFD8}, //3995 #HANGUL SYLLABLE SSANGPIEUP U RIEULSIOS + {0x979C, 0xBFD9}, //3996 #HANGUL SYLLABLE SSANGPIEUP U RIEULTHIEUTH + {0x979D, 0xBFDA}, //3997 #HANGUL SYLLABLE SSANGPIEUP U RIEULPHIEUPH + {0x979E, 0xBFDB}, //3998 #HANGUL SYLLABLE SSANGPIEUP U RIEULHIEUH + {0x979F, 0xBFDD}, //3999 #HANGUL SYLLABLE SSANGPIEUP U PIEUP + {0x97A0, 0xBFDE}, //4000 #HANGUL SYLLABLE SSANGPIEUP U PIEUPSIOS + {0x97A1, 0xBFE0}, //4001 #HANGUL SYLLABLE SSANGPIEUP U SSANGSIOS + {0x97A2, 0xBFE2}, //4002 #HANGUL SYLLABLE SSANGPIEUP U CIEUC + {0x97A3, 0xBFE3}, //4003 #HANGUL SYLLABLE SSANGPIEUP U CHIEUCH + {0x97A4, 0xBFE4}, //4004 #HANGUL SYLLABLE SSANGPIEUP U KHIEUKH + {0x97A5, 0xBFE5}, //4005 #HANGUL SYLLABLE SSANGPIEUP U THIEUTH + {0x97A6, 0xBFE6}, //4006 #HANGUL SYLLABLE SSANGPIEUP U PHIEUPH + {0x97A7, 0xBFE7}, //4007 #HANGUL SYLLABLE SSANGPIEUP U HIEUH + {0x97A8, 0xBFE8}, //4008 #HANGUL SYLLABLE SSANGPIEUP WEO + {0x97A9, 0xBFE9}, //4009 #HANGUL SYLLABLE SSANGPIEUP WEO KIYEOK + {0x97AA, 0xBFEA}, //4010 #HANGUL SYLLABLE SSANGPIEUP WEO SSANGKIYEOK + {0x97AB, 0xBFEB}, //4011 #HANGUL SYLLABLE SSANGPIEUP WEO KIYEOKSIOS + {0x97AC, 0xBFEC}, //4012 #HANGUL SYLLABLE SSANGPIEUP WEO NIEUN + {0x97AD, 0xBFED}, //4013 #HANGUL SYLLABLE SSANGPIEUP WEO NIEUNCIEUC + {0x97AE, 0xBFEE}, //4014 #HANGUL SYLLABLE SSANGPIEUP WEO NIEUNHIEUH + {0x97AF, 0xBFEF}, //4015 #HANGUL SYLLABLE SSANGPIEUP WEO TIKEUT + {0x97B0, 0xBFF0}, //4016 #HANGUL SYLLABLE SSANGPIEUP WEO RIEUL + {0x97B1, 0xBFF1}, //4017 #HANGUL SYLLABLE SSANGPIEUP WEO RIEULKIYEOK + {0x97B2, 0xBFF2}, //4018 #HANGUL SYLLABLE SSANGPIEUP WEO RIEULMIEUM + {0x97B3, 0xBFF3}, //4019 #HANGUL SYLLABLE SSANGPIEUP WEO RIEULPIEUP + {0x97B4, 0xBFF4}, //4020 #HANGUL SYLLABLE SSANGPIEUP WEO RIEULSIOS + {0x97B5, 0xBFF5}, //4021 #HANGUL SYLLABLE SSANGPIEUP WEO RIEULTHIEUTH + {0x97B6, 0xBFF6}, //4022 #HANGUL SYLLABLE SSANGPIEUP WEO RIEULPHIEUPH + {0x97B7, 0xBFF7}, //4023 #HANGUL SYLLABLE SSANGPIEUP WEO RIEULHIEUH + {0x97B8, 0xBFF8}, //4024 #HANGUL SYLLABLE SSANGPIEUP WEO MIEUM + {0x97B9, 0xBFF9}, //4025 #HANGUL SYLLABLE SSANGPIEUP WEO PIEUP + {0x97BA, 0xBFFA}, //4026 #HANGUL SYLLABLE SSANGPIEUP WEO PIEUPSIOS + {0x97BB, 0xBFFB}, //4027 #HANGUL SYLLABLE SSANGPIEUP WEO SIOS + {0x97BC, 0xBFFC}, //4028 #HANGUL SYLLABLE SSANGPIEUP WEO SSANGSIOS + {0x97BD, 0xBFFD}, //4029 #HANGUL SYLLABLE SSANGPIEUP WEO IEUNG + {0x97BE, 0xBFFE}, //4030 #HANGUL SYLLABLE SSANGPIEUP WEO CIEUC + {0x97BF, 0xBFFF}, //4031 #HANGUL SYLLABLE SSANGPIEUP WEO CHIEUCH + {0x97C0, 0xC000}, //4032 #HANGUL SYLLABLE SSANGPIEUP WEO KHIEUKH + {0x97C1, 0xC001}, //4033 #HANGUL SYLLABLE SSANGPIEUP WEO THIEUTH + {0x97C2, 0xC002}, //4034 #HANGUL SYLLABLE SSANGPIEUP WEO PHIEUPH + {0x97C3, 0xC003}, //4035 #HANGUL SYLLABLE SSANGPIEUP WEO HIEUH + {0x97C4, 0xC004}, //4036 #HANGUL SYLLABLE SSANGPIEUP WE + {0x97C5, 0xC005}, //4037 #HANGUL SYLLABLE SSANGPIEUP WE KIYEOK + {0x97C6, 0xC006}, //4038 #HANGUL SYLLABLE SSANGPIEUP WE SSANGKIYEOK + {0x97C7, 0xC007}, //4039 #HANGUL SYLLABLE SSANGPIEUP WE KIYEOKSIOS + {0x97C8, 0xC008}, //4040 #HANGUL SYLLABLE SSANGPIEUP WE NIEUN + {0x97C9, 0xC009}, //4041 #HANGUL SYLLABLE SSANGPIEUP WE NIEUNCIEUC + {0x97CA, 0xC00A}, //4042 #HANGUL SYLLABLE SSANGPIEUP WE NIEUNHIEUH + {0x97CB, 0xC00B}, //4043 #HANGUL SYLLABLE SSANGPIEUP WE TIKEUT + {0x97CC, 0xC00C}, //4044 #HANGUL SYLLABLE SSANGPIEUP WE RIEUL + {0x97CD, 0xC00D}, //4045 #HANGUL SYLLABLE SSANGPIEUP WE RIEULKIYEOK + {0x97CE, 0xC00E}, //4046 #HANGUL SYLLABLE SSANGPIEUP WE RIEULMIEUM + {0x97CF, 0xC00F}, //4047 #HANGUL SYLLABLE SSANGPIEUP WE RIEULPIEUP + {0x97D0, 0xC010}, //4048 #HANGUL SYLLABLE SSANGPIEUP WE RIEULSIOS + {0x97D1, 0xC011}, //4049 #HANGUL SYLLABLE SSANGPIEUP WE RIEULTHIEUTH + {0x97D2, 0xC012}, //4050 #HANGUL SYLLABLE SSANGPIEUP WE RIEULPHIEUPH + {0x97D3, 0xC013}, //4051 #HANGUL SYLLABLE SSANGPIEUP WE RIEULHIEUH + {0x97D4, 0xC014}, //4052 #HANGUL SYLLABLE SSANGPIEUP WE MIEUM + {0x97D5, 0xC015}, //4053 #HANGUL SYLLABLE SSANGPIEUP WE PIEUP + {0x97D6, 0xC016}, //4054 #HANGUL SYLLABLE SSANGPIEUP WE PIEUPSIOS + {0x97D7, 0xC017}, //4055 #HANGUL SYLLABLE SSANGPIEUP WE SIOS + {0x97D8, 0xC018}, //4056 #HANGUL SYLLABLE SSANGPIEUP WE SSANGSIOS + {0x97D9, 0xC019}, //4057 #HANGUL SYLLABLE SSANGPIEUP WE IEUNG + {0x97DA, 0xC01A}, //4058 #HANGUL SYLLABLE SSANGPIEUP WE CIEUC + {0x97DB, 0xC01B}, //4059 #HANGUL SYLLABLE SSANGPIEUP WE CHIEUCH + {0x97DC, 0xC01C}, //4060 #HANGUL SYLLABLE SSANGPIEUP WE KHIEUKH + {0x97DD, 0xC01D}, //4061 #HANGUL SYLLABLE SSANGPIEUP WE THIEUTH + {0x97DE, 0xC01E}, //4062 #HANGUL SYLLABLE SSANGPIEUP WE PHIEUPH + {0x97DF, 0xC01F}, //4063 #HANGUL SYLLABLE SSANGPIEUP WE HIEUH + {0x97E0, 0xC020}, //4064 #HANGUL SYLLABLE SSANGPIEUP WI + {0x97E1, 0xC021}, //4065 #HANGUL SYLLABLE SSANGPIEUP WI KIYEOK + {0x97E2, 0xC022}, //4066 #HANGUL SYLLABLE SSANGPIEUP WI SSANGKIYEOK + {0x97E3, 0xC023}, //4067 #HANGUL SYLLABLE SSANGPIEUP WI KIYEOKSIOS + {0x97E4, 0xC024}, //4068 #HANGUL SYLLABLE SSANGPIEUP WI NIEUN + {0x97E5, 0xC025}, //4069 #HANGUL SYLLABLE SSANGPIEUP WI NIEUNCIEUC + {0x97E6, 0xC026}, //4070 #HANGUL SYLLABLE SSANGPIEUP WI NIEUNHIEUH + {0x97E7, 0xC027}, //4071 #HANGUL SYLLABLE SSANGPIEUP WI TIKEUT + {0x97E8, 0xC028}, //4072 #HANGUL SYLLABLE SSANGPIEUP WI RIEUL + {0x97E9, 0xC029}, //4073 #HANGUL SYLLABLE SSANGPIEUP WI RIEULKIYEOK + {0x97EA, 0xC02A}, //4074 #HANGUL SYLLABLE SSANGPIEUP WI RIEULMIEUM + {0x97EB, 0xC02B}, //4075 #HANGUL SYLLABLE SSANGPIEUP WI RIEULPIEUP + {0x97EC, 0xC02C}, //4076 #HANGUL SYLLABLE SSANGPIEUP WI RIEULSIOS + {0x97ED, 0xC02D}, //4077 #HANGUL SYLLABLE SSANGPIEUP WI RIEULTHIEUTH + {0x97EE, 0xC02E}, //4078 #HANGUL SYLLABLE SSANGPIEUP WI RIEULPHIEUPH + {0x97EF, 0xC02F}, //4079 #HANGUL SYLLABLE SSANGPIEUP WI RIEULHIEUH + {0x97F0, 0xC030}, //4080 #HANGUL SYLLABLE SSANGPIEUP WI MIEUM + {0x97F1, 0xC031}, //4081 #HANGUL SYLLABLE SSANGPIEUP WI PIEUP + {0x97F2, 0xC032}, //4082 #HANGUL SYLLABLE SSANGPIEUP WI PIEUPSIOS + {0x97F3, 0xC033}, //4083 #HANGUL SYLLABLE SSANGPIEUP WI SIOS + {0x97F4, 0xC034}, //4084 #HANGUL SYLLABLE SSANGPIEUP WI SSANGSIOS + {0x97F5, 0xC035}, //4085 #HANGUL SYLLABLE SSANGPIEUP WI IEUNG + {0x97F6, 0xC036}, //4086 #HANGUL SYLLABLE SSANGPIEUP WI CIEUC + {0x97F7, 0xC037}, //4087 #HANGUL SYLLABLE SSANGPIEUP WI CHIEUCH + {0x97F8, 0xC038}, //4088 #HANGUL SYLLABLE SSANGPIEUP WI KHIEUKH + {0x97F9, 0xC039}, //4089 #HANGUL SYLLABLE SSANGPIEUP WI THIEUTH + {0x97FA, 0xC03A}, //4090 #HANGUL SYLLABLE SSANGPIEUP WI PHIEUPH + {0x97FB, 0xC03B}, //4091 #HANGUL SYLLABLE SSANGPIEUP WI HIEUH + {0x97FC, 0xC03D}, //4092 #HANGUL SYLLABLE SSANGPIEUP YU KIYEOK + {0x97FD, 0xC03E}, //4093 #HANGUL SYLLABLE SSANGPIEUP YU SSANGKIYEOK + {0x97FE, 0xC03F}, //4094 #HANGUL SYLLABLE SSANGPIEUP YU KIYEOKSIOS + {0x9841, 0xC040}, //4095 #HANGUL SYLLABLE SSANGPIEUP YU NIEUN + {0x9842, 0xC041}, //4096 #HANGUL SYLLABLE SSANGPIEUP YU NIEUNCIEUC + {0x9843, 0xC042}, //4097 #HANGUL SYLLABLE SSANGPIEUP YU NIEUNHIEUH + {0x9844, 0xC043}, //4098 #HANGUL SYLLABLE SSANGPIEUP YU TIKEUT + {0x9845, 0xC044}, //4099 #HANGUL SYLLABLE SSANGPIEUP YU RIEUL + {0x9846, 0xC045}, //4100 #HANGUL SYLLABLE SSANGPIEUP YU RIEULKIYEOK + {0x9847, 0xC046}, //4101 #HANGUL SYLLABLE SSANGPIEUP YU RIEULMIEUM + {0x9848, 0xC047}, //4102 #HANGUL SYLLABLE SSANGPIEUP YU RIEULPIEUP + {0x9849, 0xC048}, //4103 #HANGUL SYLLABLE SSANGPIEUP YU RIEULSIOS + {0x984A, 0xC049}, //4104 #HANGUL SYLLABLE SSANGPIEUP YU RIEULTHIEUTH + {0x984B, 0xC04A}, //4105 #HANGUL SYLLABLE SSANGPIEUP YU RIEULPHIEUPH + {0x984C, 0xC04B}, //4106 #HANGUL SYLLABLE SSANGPIEUP YU RIEULHIEUH + {0x984D, 0xC04C}, //4107 #HANGUL SYLLABLE SSANGPIEUP YU MIEUM + {0x984E, 0xC04D}, //4108 #HANGUL SYLLABLE SSANGPIEUP YU PIEUP + {0x984F, 0xC04E}, //4109 #HANGUL SYLLABLE SSANGPIEUP YU PIEUPSIOS + {0x9850, 0xC04F}, //4110 #HANGUL SYLLABLE SSANGPIEUP YU SIOS + {0x9851, 0xC050}, //4111 #HANGUL SYLLABLE SSANGPIEUP YU SSANGSIOS + {0x9852, 0xC052}, //4112 #HANGUL SYLLABLE SSANGPIEUP YU CIEUC + {0x9853, 0xC053}, //4113 #HANGUL SYLLABLE SSANGPIEUP YU CHIEUCH + {0x9854, 0xC054}, //4114 #HANGUL SYLLABLE SSANGPIEUP YU KHIEUKH + {0x9855, 0xC055}, //4115 #HANGUL SYLLABLE SSANGPIEUP YU THIEUTH + {0x9856, 0xC056}, //4116 #HANGUL SYLLABLE SSANGPIEUP YU PHIEUPH + {0x9857, 0xC057}, //4117 #HANGUL SYLLABLE SSANGPIEUP YU HIEUH + {0x9858, 0xC059}, //4118 #HANGUL SYLLABLE SSANGPIEUP EU KIYEOK + {0x9859, 0xC05A}, //4119 #HANGUL SYLLABLE SSANGPIEUP EU SSANGKIYEOK + {0x985A, 0xC05B}, //4120 #HANGUL SYLLABLE SSANGPIEUP EU KIYEOKSIOS + {0x9861, 0xC05D}, //4121 #HANGUL SYLLABLE SSANGPIEUP EU NIEUNCIEUC + {0x9862, 0xC05E}, //4122 #HANGUL SYLLABLE SSANGPIEUP EU NIEUNHIEUH + {0x9863, 0xC05F}, //4123 #HANGUL SYLLABLE SSANGPIEUP EU TIKEUT + {0x9864, 0xC061}, //4124 #HANGUL SYLLABLE SSANGPIEUP EU RIEULKIYEOK + {0x9865, 0xC062}, //4125 #HANGUL SYLLABLE SSANGPIEUP EU RIEULMIEUM + {0x9866, 0xC063}, //4126 #HANGUL SYLLABLE SSANGPIEUP EU RIEULPIEUP + {0x9867, 0xC064}, //4127 #HANGUL SYLLABLE SSANGPIEUP EU RIEULSIOS + {0x9868, 0xC065}, //4128 #HANGUL SYLLABLE SSANGPIEUP EU RIEULTHIEUTH + {0x9869, 0xC066}, //4129 #HANGUL SYLLABLE SSANGPIEUP EU RIEULPHIEUPH + {0x986A, 0xC067}, //4130 #HANGUL SYLLABLE SSANGPIEUP EU RIEULHIEUH + {0x986B, 0xC06A}, //4131 #HANGUL SYLLABLE SSANGPIEUP EU PIEUPSIOS + {0x986C, 0xC06B}, //4132 #HANGUL SYLLABLE SSANGPIEUP EU SIOS + {0x986D, 0xC06C}, //4133 #HANGUL SYLLABLE SSANGPIEUP EU SSANGSIOS + {0x986E, 0xC06D}, //4134 #HANGUL SYLLABLE SSANGPIEUP EU IEUNG + {0x986F, 0xC06E}, //4135 #HANGUL SYLLABLE SSANGPIEUP EU CIEUC + {0x9870, 0xC06F}, //4136 #HANGUL SYLLABLE SSANGPIEUP EU CHIEUCH + {0x9871, 0xC070}, //4137 #HANGUL SYLLABLE SSANGPIEUP EU KHIEUKH + {0x9872, 0xC071}, //4138 #HANGUL SYLLABLE SSANGPIEUP EU THIEUTH + {0x9873, 0xC072}, //4139 #HANGUL SYLLABLE SSANGPIEUP EU PHIEUPH + {0x9874, 0xC073}, //4140 #HANGUL SYLLABLE SSANGPIEUP EU HIEUH + {0x9875, 0xC074}, //4141 #HANGUL SYLLABLE SSANGPIEUP YI + {0x9876, 0xC075}, //4142 #HANGUL SYLLABLE SSANGPIEUP YI KIYEOK + {0x9877, 0xC076}, //4143 #HANGUL SYLLABLE SSANGPIEUP YI SSANGKIYEOK + {0x9878, 0xC077}, //4144 #HANGUL SYLLABLE SSANGPIEUP YI KIYEOKSIOS + {0x9879, 0xC078}, //4145 #HANGUL SYLLABLE SSANGPIEUP YI NIEUN + {0x987A, 0xC079}, //4146 #HANGUL SYLLABLE SSANGPIEUP YI NIEUNCIEUC + {0x9881, 0xC07A}, //4147 #HANGUL SYLLABLE SSANGPIEUP YI NIEUNHIEUH + {0x9882, 0xC07B}, //4148 #HANGUL SYLLABLE SSANGPIEUP YI TIKEUT + {0x9883, 0xC07C}, //4149 #HANGUL SYLLABLE SSANGPIEUP YI RIEUL + {0x9884, 0xC07D}, //4150 #HANGUL SYLLABLE SSANGPIEUP YI RIEULKIYEOK + {0x9885, 0xC07E}, //4151 #HANGUL SYLLABLE SSANGPIEUP YI RIEULMIEUM + {0x9886, 0xC07F}, //4152 #HANGUL SYLLABLE SSANGPIEUP YI RIEULPIEUP + {0x9887, 0xC080}, //4153 #HANGUL SYLLABLE SSANGPIEUP YI RIEULSIOS + {0x9888, 0xC081}, //4154 #HANGUL SYLLABLE SSANGPIEUP YI RIEULTHIEUTH + {0x9889, 0xC082}, //4155 #HANGUL SYLLABLE SSANGPIEUP YI RIEULPHIEUPH + {0x988A, 0xC083}, //4156 #HANGUL SYLLABLE SSANGPIEUP YI RIEULHIEUH + {0x988B, 0xC084}, //4157 #HANGUL SYLLABLE SSANGPIEUP YI MIEUM + {0x988C, 0xC085}, //4158 #HANGUL SYLLABLE SSANGPIEUP YI PIEUP + {0x988D, 0xC086}, //4159 #HANGUL SYLLABLE SSANGPIEUP YI PIEUPSIOS + {0x988E, 0xC087}, //4160 #HANGUL SYLLABLE SSANGPIEUP YI SIOS + {0x988F, 0xC088}, //4161 #HANGUL SYLLABLE SSANGPIEUP YI SSANGSIOS + {0x9890, 0xC089}, //4162 #HANGUL SYLLABLE SSANGPIEUP YI IEUNG + {0x9891, 0xC08A}, //4163 #HANGUL SYLLABLE SSANGPIEUP YI CIEUC + {0x9892, 0xC08B}, //4164 #HANGUL SYLLABLE SSANGPIEUP YI CHIEUCH + {0x9893, 0xC08C}, //4165 #HANGUL SYLLABLE SSANGPIEUP YI KHIEUKH + {0x9894, 0xC08D}, //4166 #HANGUL SYLLABLE SSANGPIEUP YI THIEUTH + {0x9895, 0xC08E}, //4167 #HANGUL SYLLABLE SSANGPIEUP YI PHIEUPH + {0x9896, 0xC08F}, //4168 #HANGUL SYLLABLE SSANGPIEUP YI HIEUH + {0x9897, 0xC092}, //4169 #HANGUL SYLLABLE SSANGPIEUP I SSANGKIYEOK + {0x9898, 0xC093}, //4170 #HANGUL SYLLABLE SSANGPIEUP I KIYEOKSIOS + {0x9899, 0xC095}, //4171 #HANGUL SYLLABLE SSANGPIEUP I NIEUNCIEUC + {0x989A, 0xC096}, //4172 #HANGUL SYLLABLE SSANGPIEUP I NIEUNHIEUH + {0x989B, 0xC097}, //4173 #HANGUL SYLLABLE SSANGPIEUP I TIKEUT + {0x989C, 0xC099}, //4174 #HANGUL SYLLABLE SSANGPIEUP I RIEULKIYEOK + {0x989D, 0xC09A}, //4175 #HANGUL SYLLABLE SSANGPIEUP I RIEULMIEUM + {0x989E, 0xC09B}, //4176 #HANGUL SYLLABLE SSANGPIEUP I RIEULPIEUP + {0x989F, 0xC09C}, //4177 #HANGUL SYLLABLE SSANGPIEUP I RIEULSIOS + {0x98A0, 0xC09D}, //4178 #HANGUL SYLLABLE SSANGPIEUP I RIEULTHIEUTH + {0x98A1, 0xC09E}, //4179 #HANGUL SYLLABLE SSANGPIEUP I RIEULPHIEUPH + {0x98A2, 0xC09F}, //4180 #HANGUL SYLLABLE SSANGPIEUP I RIEULHIEUH + {0x98A3, 0xC0A2}, //4181 #HANGUL SYLLABLE SSANGPIEUP I PIEUPSIOS + {0x98A4, 0xC0A4}, //4182 #HANGUL SYLLABLE SSANGPIEUP I SSANGSIOS + {0x98A5, 0xC0A6}, //4183 #HANGUL SYLLABLE SSANGPIEUP I CIEUC + {0x98A6, 0xC0A7}, //4184 #HANGUL SYLLABLE SSANGPIEUP I CHIEUCH + {0x98A7, 0xC0A8}, //4185 #HANGUL SYLLABLE SSANGPIEUP I KHIEUKH + {0x98A8, 0xC0A9}, //4186 #HANGUL SYLLABLE SSANGPIEUP I THIEUTH + {0x98A9, 0xC0AA}, //4187 #HANGUL SYLLABLE SSANGPIEUP I PHIEUPH + {0x98AA, 0xC0AB}, //4188 #HANGUL SYLLABLE SSANGPIEUP I HIEUH + {0x98AB, 0xC0AE}, //4189 #HANGUL SYLLABLE SIOS A SSANGKIYEOK + {0x98AC, 0xC0B1}, //4190 #HANGUL SYLLABLE SIOS A NIEUNCIEUC + {0x98AD, 0xC0B2}, //4191 #HANGUL SYLLABLE SIOS A NIEUNHIEUH + {0x98AE, 0xC0B7}, //4192 #HANGUL SYLLABLE SIOS A RIEULPIEUP + {0x98AF, 0xC0B8}, //4193 #HANGUL SYLLABLE SIOS A RIEULSIOS + {0x98B0, 0xC0B9}, //4194 #HANGUL SYLLABLE SIOS A RIEULTHIEUTH + {0x98B1, 0xC0BA}, //4195 #HANGUL SYLLABLE SIOS A RIEULPHIEUPH + {0x98B2, 0xC0BB}, //4196 #HANGUL SYLLABLE SIOS A RIEULHIEUH + {0x98B3, 0xC0BE}, //4197 #HANGUL SYLLABLE SIOS A PIEUPSIOS + {0x98B4, 0xC0C2}, //4198 #HANGUL SYLLABLE SIOS A CIEUC + {0x98B5, 0xC0C3}, //4199 #HANGUL SYLLABLE SIOS A CHIEUCH + {0x98B6, 0xC0C4}, //4200 #HANGUL SYLLABLE SIOS A KHIEUKH + {0x98B7, 0xC0C6}, //4201 #HANGUL SYLLABLE SIOS A PHIEUPH + {0x98B8, 0xC0C7}, //4202 #HANGUL SYLLABLE SIOS A HIEUH + {0x98B9, 0xC0CA}, //4203 #HANGUL SYLLABLE SIOS AE SSANGKIYEOK + {0x98BA, 0xC0CB}, //4204 #HANGUL SYLLABLE SIOS AE KIYEOKSIOS + {0x98BB, 0xC0CD}, //4205 #HANGUL SYLLABLE SIOS AE NIEUNCIEUC + {0x98BC, 0xC0CE}, //4206 #HANGUL SYLLABLE SIOS AE NIEUNHIEUH + {0x98BD, 0xC0CF}, //4207 #HANGUL SYLLABLE SIOS AE TIKEUT + {0x98BE, 0xC0D1}, //4208 #HANGUL SYLLABLE SIOS AE RIEULKIYEOK + {0x98BF, 0xC0D2}, //4209 #HANGUL SYLLABLE SIOS AE RIEULMIEUM + {0x98C0, 0xC0D3}, //4210 #HANGUL SYLLABLE SIOS AE RIEULPIEUP + {0x98C1, 0xC0D4}, //4211 #HANGUL SYLLABLE SIOS AE RIEULSIOS + {0x98C2, 0xC0D5}, //4212 #HANGUL SYLLABLE SIOS AE RIEULTHIEUTH + {0x98C3, 0xC0D6}, //4213 #HANGUL SYLLABLE SIOS AE RIEULPHIEUPH + {0x98C4, 0xC0D7}, //4214 #HANGUL SYLLABLE SIOS AE RIEULHIEUH + {0x98C5, 0xC0DA}, //4215 #HANGUL SYLLABLE SIOS AE PIEUPSIOS + {0x98C6, 0xC0DE}, //4216 #HANGUL SYLLABLE SIOS AE CIEUC + {0x98C7, 0xC0DF}, //4217 #HANGUL SYLLABLE SIOS AE CHIEUCH + {0x98C8, 0xC0E0}, //4218 #HANGUL SYLLABLE SIOS AE KHIEUKH + {0x98C9, 0xC0E1}, //4219 #HANGUL SYLLABLE SIOS AE THIEUTH + {0x98CA, 0xC0E2}, //4220 #HANGUL SYLLABLE SIOS AE PHIEUPH + {0x98CB, 0xC0E3}, //4221 #HANGUL SYLLABLE SIOS AE HIEUH + {0x98CC, 0xC0E6}, //4222 #HANGUL SYLLABLE SIOS YA SSANGKIYEOK + {0x98CD, 0xC0E7}, //4223 #HANGUL SYLLABLE SIOS YA KIYEOKSIOS + {0x98CE, 0xC0E9}, //4224 #HANGUL SYLLABLE SIOS YA NIEUNCIEUC + {0x98CF, 0xC0EA}, //4225 #HANGUL SYLLABLE SIOS YA NIEUNHIEUH + {0x98D0, 0xC0EB}, //4226 #HANGUL SYLLABLE SIOS YA TIKEUT + {0x98D1, 0xC0ED}, //4227 #HANGUL SYLLABLE SIOS YA RIEULKIYEOK + {0x98D2, 0xC0EE}, //4228 #HANGUL SYLLABLE SIOS YA RIEULMIEUM + {0x98D3, 0xC0EF}, //4229 #HANGUL SYLLABLE SIOS YA RIEULPIEUP + {0x98D4, 0xC0F0}, //4230 #HANGUL SYLLABLE SIOS YA RIEULSIOS + {0x98D5, 0xC0F1}, //4231 #HANGUL SYLLABLE SIOS YA RIEULTHIEUTH + {0x98D6, 0xC0F2}, //4232 #HANGUL SYLLABLE SIOS YA RIEULPHIEUPH + {0x98D7, 0xC0F3}, //4233 #HANGUL SYLLABLE SIOS YA RIEULHIEUH + {0x98D8, 0xC0F6}, //4234 #HANGUL SYLLABLE SIOS YA PIEUPSIOS + {0x98D9, 0xC0F8}, //4235 #HANGUL SYLLABLE SIOS YA SSANGSIOS + {0x98DA, 0xC0FA}, //4236 #HANGUL SYLLABLE SIOS YA CIEUC + {0x98DB, 0xC0FB}, //4237 #HANGUL SYLLABLE SIOS YA CHIEUCH + {0x98DC, 0xC0FC}, //4238 #HANGUL SYLLABLE SIOS YA KHIEUKH + {0x98DD, 0xC0FD}, //4239 #HANGUL SYLLABLE SIOS YA THIEUTH + {0x98DE, 0xC0FE}, //4240 #HANGUL SYLLABLE SIOS YA PHIEUPH + {0x98DF, 0xC0FF}, //4241 #HANGUL SYLLABLE SIOS YA HIEUH + {0x98E0, 0xC101}, //4242 #HANGUL SYLLABLE SIOS YAE KIYEOK + {0x98E1, 0xC102}, //4243 #HANGUL SYLLABLE SIOS YAE SSANGKIYEOK + {0x98E2, 0xC103}, //4244 #HANGUL SYLLABLE SIOS YAE KIYEOKSIOS + {0x98E3, 0xC105}, //4245 #HANGUL SYLLABLE SIOS YAE NIEUNCIEUC + {0x98E4, 0xC106}, //4246 #HANGUL SYLLABLE SIOS YAE NIEUNHIEUH + {0x98E5, 0xC107}, //4247 #HANGUL SYLLABLE SIOS YAE TIKEUT + {0x98E6, 0xC109}, //4248 #HANGUL SYLLABLE SIOS YAE RIEULKIYEOK + {0x98E7, 0xC10A}, //4249 #HANGUL SYLLABLE SIOS YAE RIEULMIEUM + {0x98E8, 0xC10B}, //4250 #HANGUL SYLLABLE SIOS YAE RIEULPIEUP + {0x98E9, 0xC10C}, //4251 #HANGUL SYLLABLE SIOS YAE RIEULSIOS + {0x98EA, 0xC10D}, //4252 #HANGUL SYLLABLE SIOS YAE RIEULTHIEUTH + {0x98EB, 0xC10E}, //4253 #HANGUL SYLLABLE SIOS YAE RIEULPHIEUPH + {0x98EC, 0xC10F}, //4254 #HANGUL SYLLABLE SIOS YAE RIEULHIEUH + {0x98ED, 0xC111}, //4255 #HANGUL SYLLABLE SIOS YAE PIEUP + {0x98EE, 0xC112}, //4256 #HANGUL SYLLABLE SIOS YAE PIEUPSIOS + {0x98EF, 0xC113}, //4257 #HANGUL SYLLABLE SIOS YAE SIOS + {0x98F0, 0xC114}, //4258 #HANGUL SYLLABLE SIOS YAE SSANGSIOS + {0x98F1, 0xC116}, //4259 #HANGUL SYLLABLE SIOS YAE CIEUC + {0x98F2, 0xC117}, //4260 #HANGUL SYLLABLE SIOS YAE CHIEUCH + {0x98F3, 0xC118}, //4261 #HANGUL SYLLABLE SIOS YAE KHIEUKH + {0x98F4, 0xC119}, //4262 #HANGUL SYLLABLE SIOS YAE THIEUTH + {0x98F5, 0xC11A}, //4263 #HANGUL SYLLABLE SIOS YAE PHIEUPH + {0x98F6, 0xC11B}, //4264 #HANGUL SYLLABLE SIOS YAE HIEUH + {0x98F7, 0xC121}, //4265 #HANGUL SYLLABLE SIOS EO NIEUNCIEUC + {0x98F8, 0xC122}, //4266 #HANGUL SYLLABLE SIOS EO NIEUNHIEUH + {0x98F9, 0xC125}, //4267 #HANGUL SYLLABLE SIOS EO RIEULKIYEOK + {0x98FA, 0xC128}, //4268 #HANGUL SYLLABLE SIOS EO RIEULSIOS + {0x98FB, 0xC129}, //4269 #HANGUL SYLLABLE SIOS EO RIEULTHIEUTH + {0x98FC, 0xC12A}, //4270 #HANGUL SYLLABLE SIOS EO RIEULPHIEUPH + {0x98FD, 0xC12B}, //4271 #HANGUL SYLLABLE SIOS EO RIEULHIEUH + {0x98FE, 0xC12E}, //4272 #HANGUL SYLLABLE SIOS EO PIEUPSIOS + {0x9941, 0xC132}, //4273 #HANGUL SYLLABLE SIOS EO CIEUC + {0x9942, 0xC133}, //4274 #HANGUL SYLLABLE SIOS EO CHIEUCH + {0x9943, 0xC134}, //4275 #HANGUL SYLLABLE SIOS EO KHIEUKH + {0x9944, 0xC135}, //4276 #HANGUL SYLLABLE SIOS EO THIEUTH + {0x9945, 0xC137}, //4277 #HANGUL SYLLABLE SIOS EO HIEUH + {0x9946, 0xC13A}, //4278 #HANGUL SYLLABLE SIOS E SSANGKIYEOK + {0x9947, 0xC13B}, //4279 #HANGUL SYLLABLE SIOS E KIYEOKSIOS + {0x9948, 0xC13D}, //4280 #HANGUL SYLLABLE SIOS E NIEUNCIEUC + {0x9949, 0xC13E}, //4281 #HANGUL SYLLABLE SIOS E NIEUNHIEUH + {0x994A, 0xC13F}, //4282 #HANGUL SYLLABLE SIOS E TIKEUT + {0x994B, 0xC141}, //4283 #HANGUL SYLLABLE SIOS E RIEULKIYEOK + {0x994C, 0xC142}, //4284 #HANGUL SYLLABLE SIOS E RIEULMIEUM + {0x994D, 0xC143}, //4285 #HANGUL SYLLABLE SIOS E RIEULPIEUP + {0x994E, 0xC144}, //4286 #HANGUL SYLLABLE SIOS E RIEULSIOS + {0x994F, 0xC145}, //4287 #HANGUL SYLLABLE SIOS E RIEULTHIEUTH + {0x9950, 0xC146}, //4288 #HANGUL SYLLABLE SIOS E RIEULPHIEUPH + {0x9951, 0xC147}, //4289 #HANGUL SYLLABLE SIOS E RIEULHIEUH + {0x9952, 0xC14A}, //4290 #HANGUL SYLLABLE SIOS E PIEUPSIOS + {0x9953, 0xC14E}, //4291 #HANGUL SYLLABLE SIOS E CIEUC + {0x9954, 0xC14F}, //4292 #HANGUL SYLLABLE SIOS E CHIEUCH + {0x9955, 0xC150}, //4293 #HANGUL SYLLABLE SIOS E KHIEUKH + {0x9956, 0xC151}, //4294 #HANGUL SYLLABLE SIOS E THIEUTH + {0x9957, 0xC152}, //4295 #HANGUL SYLLABLE SIOS E PHIEUPH + {0x9958, 0xC153}, //4296 #HANGUL SYLLABLE SIOS E HIEUH + {0x9959, 0xC156}, //4297 #HANGUL SYLLABLE SIOS YEO SSANGKIYEOK + {0x995A, 0xC157}, //4298 #HANGUL SYLLABLE SIOS YEO KIYEOKSIOS + {0x9961, 0xC159}, //4299 #HANGUL SYLLABLE SIOS YEO NIEUNCIEUC + {0x9962, 0xC15A}, //4300 #HANGUL SYLLABLE SIOS YEO NIEUNHIEUH + {0x9963, 0xC15B}, //4301 #HANGUL SYLLABLE SIOS YEO TIKEUT + {0x9964, 0xC15D}, //4302 #HANGUL SYLLABLE SIOS YEO RIEULKIYEOK + {0x9965, 0xC15E}, //4303 #HANGUL SYLLABLE SIOS YEO RIEULMIEUM + {0x9966, 0xC15F}, //4304 #HANGUL SYLLABLE SIOS YEO RIEULPIEUP + {0x9967, 0xC160}, //4305 #HANGUL SYLLABLE SIOS YEO RIEULSIOS + {0x9968, 0xC161}, //4306 #HANGUL SYLLABLE SIOS YEO RIEULTHIEUTH + {0x9969, 0xC162}, //4307 #HANGUL SYLLABLE SIOS YEO RIEULPHIEUPH + {0x996A, 0xC163}, //4308 #HANGUL SYLLABLE SIOS YEO RIEULHIEUH + {0x996B, 0xC166}, //4309 #HANGUL SYLLABLE SIOS YEO PIEUPSIOS + {0x996C, 0xC16A}, //4310 #HANGUL SYLLABLE SIOS YEO CIEUC + {0x996D, 0xC16B}, //4311 #HANGUL SYLLABLE SIOS YEO CHIEUCH + {0x996E, 0xC16C}, //4312 #HANGUL SYLLABLE SIOS YEO KHIEUKH + {0x996F, 0xC16D}, //4313 #HANGUL SYLLABLE SIOS YEO THIEUTH + {0x9970, 0xC16E}, //4314 #HANGUL SYLLABLE SIOS YEO PHIEUPH + {0x9971, 0xC16F}, //4315 #HANGUL SYLLABLE SIOS YEO HIEUH + {0x9972, 0xC171}, //4316 #HANGUL SYLLABLE SIOS YE KIYEOK + {0x9973, 0xC172}, //4317 #HANGUL SYLLABLE SIOS YE SSANGKIYEOK + {0x9974, 0xC173}, //4318 #HANGUL SYLLABLE SIOS YE KIYEOKSIOS + {0x9975, 0xC175}, //4319 #HANGUL SYLLABLE SIOS YE NIEUNCIEUC + {0x9976, 0xC176}, //4320 #HANGUL SYLLABLE SIOS YE NIEUNHIEUH + {0x9977, 0xC177}, //4321 #HANGUL SYLLABLE SIOS YE TIKEUT + {0x9978, 0xC179}, //4322 #HANGUL SYLLABLE SIOS YE RIEULKIYEOK + {0x9979, 0xC17A}, //4323 #HANGUL SYLLABLE SIOS YE RIEULMIEUM + {0x997A, 0xC17B}, //4324 #HANGUL SYLLABLE SIOS YE RIEULPIEUP + {0x9981, 0xC17C}, //4325 #HANGUL SYLLABLE SIOS YE RIEULSIOS + {0x9982, 0xC17D}, //4326 #HANGUL SYLLABLE SIOS YE RIEULTHIEUTH + {0x9983, 0xC17E}, //4327 #HANGUL SYLLABLE SIOS YE RIEULPHIEUPH + {0x9984, 0xC17F}, //4328 #HANGUL SYLLABLE SIOS YE RIEULHIEUH + {0x9985, 0xC180}, //4329 #HANGUL SYLLABLE SIOS YE MIEUM + {0x9986, 0xC181}, //4330 #HANGUL SYLLABLE SIOS YE PIEUP + {0x9987, 0xC182}, //4331 #HANGUL SYLLABLE SIOS YE PIEUPSIOS + {0x9988, 0xC183}, //4332 #HANGUL SYLLABLE SIOS YE SIOS + {0x9989, 0xC184}, //4333 #HANGUL SYLLABLE SIOS YE SSANGSIOS + {0x998A, 0xC186}, //4334 #HANGUL SYLLABLE SIOS YE CIEUC + {0x998B, 0xC187}, //4335 #HANGUL SYLLABLE SIOS YE CHIEUCH + {0x998C, 0xC188}, //4336 #HANGUL SYLLABLE SIOS YE KHIEUKH + {0x998D, 0xC189}, //4337 #HANGUL SYLLABLE SIOS YE THIEUTH + {0x998E, 0xC18A}, //4338 #HANGUL SYLLABLE SIOS YE PHIEUPH + {0x998F, 0xC18B}, //4339 #HANGUL SYLLABLE SIOS YE HIEUH + {0x9990, 0xC18F}, //4340 #HANGUL SYLLABLE SIOS O KIYEOKSIOS + {0x9991, 0xC191}, //4341 #HANGUL SYLLABLE SIOS O NIEUNCIEUC + {0x9992, 0xC192}, //4342 #HANGUL SYLLABLE SIOS O NIEUNHIEUH + {0x9993, 0xC193}, //4343 #HANGUL SYLLABLE SIOS O TIKEUT + {0x9994, 0xC195}, //4344 #HANGUL SYLLABLE SIOS O RIEULKIYEOK + {0x9995, 0xC197}, //4345 #HANGUL SYLLABLE SIOS O RIEULPIEUP + {0x9996, 0xC198}, //4346 #HANGUL SYLLABLE SIOS O RIEULSIOS + {0x9997, 0xC199}, //4347 #HANGUL SYLLABLE SIOS O RIEULTHIEUTH + {0x9998, 0xC19A}, //4348 #HANGUL SYLLABLE SIOS O RIEULPHIEUPH + {0x9999, 0xC19B}, //4349 #HANGUL SYLLABLE SIOS O RIEULHIEUH + {0x999A, 0xC19E}, //4350 #HANGUL SYLLABLE SIOS O PIEUPSIOS + {0x999B, 0xC1A0}, //4351 #HANGUL SYLLABLE SIOS O SSANGSIOS + {0x999C, 0xC1A2}, //4352 #HANGUL SYLLABLE SIOS O CIEUC + {0x999D, 0xC1A3}, //4353 #HANGUL SYLLABLE SIOS O CHIEUCH + {0x999E, 0xC1A4}, //4354 #HANGUL SYLLABLE SIOS O KHIEUKH + {0x999F, 0xC1A6}, //4355 #HANGUL SYLLABLE SIOS O PHIEUPH + {0x99A0, 0xC1A7}, //4356 #HANGUL SYLLABLE SIOS O HIEUH + {0x99A1, 0xC1AA}, //4357 #HANGUL SYLLABLE SIOS WA SSANGKIYEOK + {0x99A2, 0xC1AB}, //4358 #HANGUL SYLLABLE SIOS WA KIYEOKSIOS + {0x99A3, 0xC1AD}, //4359 #HANGUL SYLLABLE SIOS WA NIEUNCIEUC + {0x99A4, 0xC1AE}, //4360 #HANGUL SYLLABLE SIOS WA NIEUNHIEUH + {0x99A5, 0xC1AF}, //4361 #HANGUL SYLLABLE SIOS WA TIKEUT + {0x99A6, 0xC1B1}, //4362 #HANGUL SYLLABLE SIOS WA RIEULKIYEOK + {0x99A7, 0xC1B2}, //4363 #HANGUL SYLLABLE SIOS WA RIEULMIEUM + {0x99A8, 0xC1B3}, //4364 #HANGUL SYLLABLE SIOS WA RIEULPIEUP + {0x99A9, 0xC1B4}, //4365 #HANGUL SYLLABLE SIOS WA RIEULSIOS + {0x99AA, 0xC1B5}, //4366 #HANGUL SYLLABLE SIOS WA RIEULTHIEUTH + {0x99AB, 0xC1B6}, //4367 #HANGUL SYLLABLE SIOS WA RIEULPHIEUPH + {0x99AC, 0xC1B7}, //4368 #HANGUL SYLLABLE SIOS WA RIEULHIEUH + {0x99AD, 0xC1B8}, //4369 #HANGUL SYLLABLE SIOS WA MIEUM + {0x99AE, 0xC1B9}, //4370 #HANGUL SYLLABLE SIOS WA PIEUP + {0x99AF, 0xC1BA}, //4371 #HANGUL SYLLABLE SIOS WA PIEUPSIOS + {0x99B0, 0xC1BB}, //4372 #HANGUL SYLLABLE SIOS WA SIOS + {0x99B1, 0xC1BC}, //4373 #HANGUL SYLLABLE SIOS WA SSANGSIOS + {0x99B2, 0xC1BE}, //4374 #HANGUL SYLLABLE SIOS WA CIEUC + {0x99B3, 0xC1BF}, //4375 #HANGUL SYLLABLE SIOS WA CHIEUCH + {0x99B4, 0xC1C0}, //4376 #HANGUL SYLLABLE SIOS WA KHIEUKH + {0x99B5, 0xC1C1}, //4377 #HANGUL SYLLABLE SIOS WA THIEUTH + {0x99B6, 0xC1C2}, //4378 #HANGUL SYLLABLE SIOS WA PHIEUPH + {0x99B7, 0xC1C3}, //4379 #HANGUL SYLLABLE SIOS WA HIEUH + {0x99B8, 0xC1C5}, //4380 #HANGUL SYLLABLE SIOS WAE KIYEOK + {0x99B9, 0xC1C6}, //4381 #HANGUL SYLLABLE SIOS WAE SSANGKIYEOK + {0x99BA, 0xC1C7}, //4382 #HANGUL SYLLABLE SIOS WAE KIYEOKSIOS + {0x99BB, 0xC1C9}, //4383 #HANGUL SYLLABLE SIOS WAE NIEUNCIEUC + {0x99BC, 0xC1CA}, //4384 #HANGUL SYLLABLE SIOS WAE NIEUNHIEUH + {0x99BD, 0xC1CB}, //4385 #HANGUL SYLLABLE SIOS WAE TIKEUT + {0x99BE, 0xC1CD}, //4386 #HANGUL SYLLABLE SIOS WAE RIEULKIYEOK + {0x99BF, 0xC1CE}, //4387 #HANGUL SYLLABLE SIOS WAE RIEULMIEUM + {0x99C0, 0xC1CF}, //4388 #HANGUL SYLLABLE SIOS WAE RIEULPIEUP + {0x99C1, 0xC1D0}, //4389 #HANGUL SYLLABLE SIOS WAE RIEULSIOS + {0x99C2, 0xC1D1}, //4390 #HANGUL SYLLABLE SIOS WAE RIEULTHIEUTH + {0x99C3, 0xC1D2}, //4391 #HANGUL SYLLABLE SIOS WAE RIEULPHIEUPH + {0x99C4, 0xC1D3}, //4392 #HANGUL SYLLABLE SIOS WAE RIEULHIEUH + {0x99C5, 0xC1D5}, //4393 #HANGUL SYLLABLE SIOS WAE PIEUP + {0x99C6, 0xC1D6}, //4394 #HANGUL SYLLABLE SIOS WAE PIEUPSIOS + {0x99C7, 0xC1D9}, //4395 #HANGUL SYLLABLE SIOS WAE IEUNG + {0x99C8, 0xC1DA}, //4396 #HANGUL SYLLABLE SIOS WAE CIEUC + {0x99C9, 0xC1DB}, //4397 #HANGUL SYLLABLE SIOS WAE CHIEUCH + {0x99CA, 0xC1DC}, //4398 #HANGUL SYLLABLE SIOS WAE KHIEUKH + {0x99CB, 0xC1DD}, //4399 #HANGUL SYLLABLE SIOS WAE THIEUTH + {0x99CC, 0xC1DE}, //4400 #HANGUL SYLLABLE SIOS WAE PHIEUPH + {0x99CD, 0xC1DF}, //4401 #HANGUL SYLLABLE SIOS WAE HIEUH + {0x99CE, 0xC1E1}, //4402 #HANGUL SYLLABLE SIOS OE KIYEOK + {0x99CF, 0xC1E2}, //4403 #HANGUL SYLLABLE SIOS OE SSANGKIYEOK + {0x99D0, 0xC1E3}, //4404 #HANGUL SYLLABLE SIOS OE KIYEOKSIOS + {0x99D1, 0xC1E5}, //4405 #HANGUL SYLLABLE SIOS OE NIEUNCIEUC + {0x99D2, 0xC1E6}, //4406 #HANGUL SYLLABLE SIOS OE NIEUNHIEUH + {0x99D3, 0xC1E7}, //4407 #HANGUL SYLLABLE SIOS OE TIKEUT + {0x99D4, 0xC1E9}, //4408 #HANGUL SYLLABLE SIOS OE RIEULKIYEOK + {0x99D5, 0xC1EA}, //4409 #HANGUL SYLLABLE SIOS OE RIEULMIEUM + {0x99D6, 0xC1EB}, //4410 #HANGUL SYLLABLE SIOS OE RIEULPIEUP + {0x99D7, 0xC1EC}, //4411 #HANGUL SYLLABLE SIOS OE RIEULSIOS + {0x99D8, 0xC1ED}, //4412 #HANGUL SYLLABLE SIOS OE RIEULTHIEUTH + {0x99D9, 0xC1EE}, //4413 #HANGUL SYLLABLE SIOS OE RIEULPHIEUPH + {0x99DA, 0xC1EF}, //4414 #HANGUL SYLLABLE SIOS OE RIEULHIEUH + {0x99DB, 0xC1F2}, //4415 #HANGUL SYLLABLE SIOS OE PIEUPSIOS + {0x99DC, 0xC1F4}, //4416 #HANGUL SYLLABLE SIOS OE SSANGSIOS + {0x99DD, 0xC1F5}, //4417 #HANGUL SYLLABLE SIOS OE IEUNG + {0x99DE, 0xC1F6}, //4418 #HANGUL SYLLABLE SIOS OE CIEUC + {0x99DF, 0xC1F7}, //4419 #HANGUL SYLLABLE SIOS OE CHIEUCH + {0x99E0, 0xC1F8}, //4420 #HANGUL SYLLABLE SIOS OE KHIEUKH + {0x99E1, 0xC1F9}, //4421 #HANGUL SYLLABLE SIOS OE THIEUTH + {0x99E2, 0xC1FA}, //4422 #HANGUL SYLLABLE SIOS OE PHIEUPH + {0x99E3, 0xC1FB}, //4423 #HANGUL SYLLABLE SIOS OE HIEUH + {0x99E4, 0xC1FE}, //4424 #HANGUL SYLLABLE SIOS YO SSANGKIYEOK + {0x99E5, 0xC1FF}, //4425 #HANGUL SYLLABLE SIOS YO KIYEOKSIOS + {0x99E6, 0xC201}, //4426 #HANGUL SYLLABLE SIOS YO NIEUNCIEUC + {0x99E7, 0xC202}, //4427 #HANGUL SYLLABLE SIOS YO NIEUNHIEUH + {0x99E8, 0xC203}, //4428 #HANGUL SYLLABLE SIOS YO TIKEUT + {0x99E9, 0xC205}, //4429 #HANGUL SYLLABLE SIOS YO RIEULKIYEOK + {0x99EA, 0xC206}, //4430 #HANGUL SYLLABLE SIOS YO RIEULMIEUM + {0x99EB, 0xC207}, //4431 #HANGUL SYLLABLE SIOS YO RIEULPIEUP + {0x99EC, 0xC208}, //4432 #HANGUL SYLLABLE SIOS YO RIEULSIOS + {0x99ED, 0xC209}, //4433 #HANGUL SYLLABLE SIOS YO RIEULTHIEUTH + {0x99EE, 0xC20A}, //4434 #HANGUL SYLLABLE SIOS YO RIEULPHIEUPH + {0x99EF, 0xC20B}, //4435 #HANGUL SYLLABLE SIOS YO RIEULHIEUH + {0x99F0, 0xC20E}, //4436 #HANGUL SYLLABLE SIOS YO PIEUPSIOS + {0x99F1, 0xC210}, //4437 #HANGUL SYLLABLE SIOS YO SSANGSIOS + {0x99F2, 0xC212}, //4438 #HANGUL SYLLABLE SIOS YO CIEUC + {0x99F3, 0xC213}, //4439 #HANGUL SYLLABLE SIOS YO CHIEUCH + {0x99F4, 0xC214}, //4440 #HANGUL SYLLABLE SIOS YO KHIEUKH + {0x99F5, 0xC215}, //4441 #HANGUL SYLLABLE SIOS YO THIEUTH + {0x99F6, 0xC216}, //4442 #HANGUL SYLLABLE SIOS YO PHIEUPH + {0x99F7, 0xC217}, //4443 #HANGUL SYLLABLE SIOS YO HIEUH + {0x99F8, 0xC21A}, //4444 #HANGUL SYLLABLE SIOS U SSANGKIYEOK + {0x99F9, 0xC21B}, //4445 #HANGUL SYLLABLE SIOS U KIYEOKSIOS + {0x99FA, 0xC21D}, //4446 #HANGUL SYLLABLE SIOS U NIEUNCIEUC + {0x99FB, 0xC21E}, //4447 #HANGUL SYLLABLE SIOS U NIEUNHIEUH + {0x99FC, 0xC221}, //4448 #HANGUL SYLLABLE SIOS U RIEULKIYEOK + {0x99FD, 0xC222}, //4449 #HANGUL SYLLABLE SIOS U RIEULMIEUM + {0x99FE, 0xC223}, //4450 #HANGUL SYLLABLE SIOS U RIEULPIEUP + {0x9A41, 0xC224}, //4451 #HANGUL SYLLABLE SIOS U RIEULSIOS + {0x9A42, 0xC225}, //4452 #HANGUL SYLLABLE SIOS U RIEULTHIEUTH + {0x9A43, 0xC226}, //4453 #HANGUL SYLLABLE SIOS U RIEULPHIEUPH + {0x9A44, 0xC227}, //4454 #HANGUL SYLLABLE SIOS U RIEULHIEUH + {0x9A45, 0xC22A}, //4455 #HANGUL SYLLABLE SIOS U PIEUPSIOS + {0x9A46, 0xC22C}, //4456 #HANGUL SYLLABLE SIOS U SSANGSIOS + {0x9A47, 0xC22E}, //4457 #HANGUL SYLLABLE SIOS U CIEUC + {0x9A48, 0xC230}, //4458 #HANGUL SYLLABLE SIOS U KHIEUKH + {0x9A49, 0xC233}, //4459 #HANGUL SYLLABLE SIOS U HIEUH + {0x9A4A, 0xC235}, //4460 #HANGUL SYLLABLE SIOS WEO KIYEOK + {0x9A4B, 0xC236}, //4461 #HANGUL SYLLABLE SIOS WEO SSANGKIYEOK + {0x9A4C, 0xC237}, //4462 #HANGUL SYLLABLE SIOS WEO KIYEOKSIOS + {0x9A4D, 0xC238}, //4463 #HANGUL SYLLABLE SIOS WEO NIEUN + {0x9A4E, 0xC239}, //4464 #HANGUL SYLLABLE SIOS WEO NIEUNCIEUC + {0x9A4F, 0xC23A}, //4465 #HANGUL SYLLABLE SIOS WEO NIEUNHIEUH + {0x9A50, 0xC23B}, //4466 #HANGUL SYLLABLE SIOS WEO TIKEUT + {0x9A51, 0xC23C}, //4467 #HANGUL SYLLABLE SIOS WEO RIEUL + {0x9A52, 0xC23D}, //4468 #HANGUL SYLLABLE SIOS WEO RIEULKIYEOK + {0x9A53, 0xC23E}, //4469 #HANGUL SYLLABLE SIOS WEO RIEULMIEUM + {0x9A54, 0xC23F}, //4470 #HANGUL SYLLABLE SIOS WEO RIEULPIEUP + {0x9A55, 0xC240}, //4471 #HANGUL SYLLABLE SIOS WEO RIEULSIOS + {0x9A56, 0xC241}, //4472 #HANGUL SYLLABLE SIOS WEO RIEULTHIEUTH + {0x9A57, 0xC242}, //4473 #HANGUL SYLLABLE SIOS WEO RIEULPHIEUPH + {0x9A58, 0xC243}, //4474 #HANGUL SYLLABLE SIOS WEO RIEULHIEUH + {0x9A59, 0xC244}, //4475 #HANGUL SYLLABLE SIOS WEO MIEUM + {0x9A5A, 0xC245}, //4476 #HANGUL SYLLABLE SIOS WEO PIEUP + {0x9A61, 0xC246}, //4477 #HANGUL SYLLABLE SIOS WEO PIEUPSIOS + {0x9A62, 0xC247}, //4478 #HANGUL SYLLABLE SIOS WEO SIOS + {0x9A63, 0xC249}, //4479 #HANGUL SYLLABLE SIOS WEO IEUNG + {0x9A64, 0xC24A}, //4480 #HANGUL SYLLABLE SIOS WEO CIEUC + {0x9A65, 0xC24B}, //4481 #HANGUL SYLLABLE SIOS WEO CHIEUCH + {0x9A66, 0xC24C}, //4482 #HANGUL SYLLABLE SIOS WEO KHIEUKH + {0x9A67, 0xC24D}, //4483 #HANGUL SYLLABLE SIOS WEO THIEUTH + {0x9A68, 0xC24E}, //4484 #HANGUL SYLLABLE SIOS WEO PHIEUPH + {0x9A69, 0xC24F}, //4485 #HANGUL SYLLABLE SIOS WEO HIEUH + {0x9A6A, 0xC252}, //4486 #HANGUL SYLLABLE SIOS WE SSANGKIYEOK + {0x9A6B, 0xC253}, //4487 #HANGUL SYLLABLE SIOS WE KIYEOKSIOS + {0x9A6C, 0xC255}, //4488 #HANGUL SYLLABLE SIOS WE NIEUNCIEUC + {0x9A6D, 0xC256}, //4489 #HANGUL SYLLABLE SIOS WE NIEUNHIEUH + {0x9A6E, 0xC257}, //4490 #HANGUL SYLLABLE SIOS WE TIKEUT + {0x9A6F, 0xC259}, //4491 #HANGUL SYLLABLE SIOS WE RIEULKIYEOK + {0x9A70, 0xC25A}, //4492 #HANGUL SYLLABLE SIOS WE RIEULMIEUM + {0x9A71, 0xC25B}, //4493 #HANGUL SYLLABLE SIOS WE RIEULPIEUP + {0x9A72, 0xC25C}, //4494 #HANGUL SYLLABLE SIOS WE RIEULSIOS + {0x9A73, 0xC25D}, //4495 #HANGUL SYLLABLE SIOS WE RIEULTHIEUTH + {0x9A74, 0xC25E}, //4496 #HANGUL SYLLABLE SIOS WE RIEULPHIEUPH + {0x9A75, 0xC25F}, //4497 #HANGUL SYLLABLE SIOS WE RIEULHIEUH + {0x9A76, 0xC261}, //4498 #HANGUL SYLLABLE SIOS WE PIEUP + {0x9A77, 0xC262}, //4499 #HANGUL SYLLABLE SIOS WE PIEUPSIOS + {0x9A78, 0xC263}, //4500 #HANGUL SYLLABLE SIOS WE SIOS + {0x9A79, 0xC264}, //4501 #HANGUL SYLLABLE SIOS WE SSANGSIOS + {0x9A7A, 0xC266}, //4502 #HANGUL SYLLABLE SIOS WE CIEUC + {0x9A81, 0xC267}, //4503 #HANGUL SYLLABLE SIOS WE CHIEUCH + {0x9A82, 0xC268}, //4504 #HANGUL SYLLABLE SIOS WE KHIEUKH + {0x9A83, 0xC269}, //4505 #HANGUL SYLLABLE SIOS WE THIEUTH + {0x9A84, 0xC26A}, //4506 #HANGUL SYLLABLE SIOS WE PHIEUPH + {0x9A85, 0xC26B}, //4507 #HANGUL SYLLABLE SIOS WE HIEUH + {0x9A86, 0xC26E}, //4508 #HANGUL SYLLABLE SIOS WI SSANGKIYEOK + {0x9A87, 0xC26F}, //4509 #HANGUL SYLLABLE SIOS WI KIYEOKSIOS + {0x9A88, 0xC271}, //4510 #HANGUL SYLLABLE SIOS WI NIEUNCIEUC + {0x9A89, 0xC272}, //4511 #HANGUL SYLLABLE SIOS WI NIEUNHIEUH + {0x9A8A, 0xC273}, //4512 #HANGUL SYLLABLE SIOS WI TIKEUT + {0x9A8B, 0xC275}, //4513 #HANGUL SYLLABLE SIOS WI RIEULKIYEOK + {0x9A8C, 0xC276}, //4514 #HANGUL SYLLABLE SIOS WI RIEULMIEUM + {0x9A8D, 0xC277}, //4515 #HANGUL SYLLABLE SIOS WI RIEULPIEUP + {0x9A8E, 0xC278}, //4516 #HANGUL SYLLABLE SIOS WI RIEULSIOS + {0x9A8F, 0xC279}, //4517 #HANGUL SYLLABLE SIOS WI RIEULTHIEUTH + {0x9A90, 0xC27A}, //4518 #HANGUL SYLLABLE SIOS WI RIEULPHIEUPH + {0x9A91, 0xC27B}, //4519 #HANGUL SYLLABLE SIOS WI RIEULHIEUH + {0x9A92, 0xC27E}, //4520 #HANGUL SYLLABLE SIOS WI PIEUPSIOS + {0x9A93, 0xC280}, //4521 #HANGUL SYLLABLE SIOS WI SSANGSIOS + {0x9A94, 0xC282}, //4522 #HANGUL SYLLABLE SIOS WI CIEUC + {0x9A95, 0xC283}, //4523 #HANGUL SYLLABLE SIOS WI CHIEUCH + {0x9A96, 0xC284}, //4524 #HANGUL SYLLABLE SIOS WI KHIEUKH + {0x9A97, 0xC285}, //4525 #HANGUL SYLLABLE SIOS WI THIEUTH + {0x9A98, 0xC286}, //4526 #HANGUL SYLLABLE SIOS WI PHIEUPH + {0x9A99, 0xC287}, //4527 #HANGUL SYLLABLE SIOS WI HIEUH + {0x9A9A, 0xC28A}, //4528 #HANGUL SYLLABLE SIOS YU SSANGKIYEOK + {0x9A9B, 0xC28B}, //4529 #HANGUL SYLLABLE SIOS YU KIYEOKSIOS + {0x9A9C, 0xC28C}, //4530 #HANGUL SYLLABLE SIOS YU NIEUN + {0x9A9D, 0xC28D}, //4531 #HANGUL SYLLABLE SIOS YU NIEUNCIEUC + {0x9A9E, 0xC28E}, //4532 #HANGUL SYLLABLE SIOS YU NIEUNHIEUH + {0x9A9F, 0xC28F}, //4533 #HANGUL SYLLABLE SIOS YU TIKEUT + {0x9AA0, 0xC291}, //4534 #HANGUL SYLLABLE SIOS YU RIEULKIYEOK + {0x9AA1, 0xC292}, //4535 #HANGUL SYLLABLE SIOS YU RIEULMIEUM + {0x9AA2, 0xC293}, //4536 #HANGUL SYLLABLE SIOS YU RIEULPIEUP + {0x9AA3, 0xC294}, //4537 #HANGUL SYLLABLE SIOS YU RIEULSIOS + {0x9AA4, 0xC295}, //4538 #HANGUL SYLLABLE SIOS YU RIEULTHIEUTH + {0x9AA5, 0xC296}, //4539 #HANGUL SYLLABLE SIOS YU RIEULPHIEUPH + {0x9AA6, 0xC297}, //4540 #HANGUL SYLLABLE SIOS YU RIEULHIEUH + {0x9AA7, 0xC299}, //4541 #HANGUL SYLLABLE SIOS YU PIEUP + {0x9AA8, 0xC29A}, //4542 #HANGUL SYLLABLE SIOS YU PIEUPSIOS + {0x9AA9, 0xC29C}, //4543 #HANGUL SYLLABLE SIOS YU SSANGSIOS + {0x9AAA, 0xC29E}, //4544 #HANGUL SYLLABLE SIOS YU CIEUC + {0x9AAB, 0xC29F}, //4545 #HANGUL SYLLABLE SIOS YU CHIEUCH + {0x9AAC, 0xC2A0}, //4546 #HANGUL SYLLABLE SIOS YU KHIEUKH + {0x9AAD, 0xC2A1}, //4547 #HANGUL SYLLABLE SIOS YU THIEUTH + {0x9AAE, 0xC2A2}, //4548 #HANGUL SYLLABLE SIOS YU PHIEUPH + {0x9AAF, 0xC2A3}, //4549 #HANGUL SYLLABLE SIOS YU HIEUH + {0x9AB0, 0xC2A6}, //4550 #HANGUL SYLLABLE SIOS EU SSANGKIYEOK + {0x9AB1, 0xC2A7}, //4551 #HANGUL SYLLABLE SIOS EU KIYEOKSIOS + {0x9AB2, 0xC2A9}, //4552 #HANGUL SYLLABLE SIOS EU NIEUNCIEUC + {0x9AB3, 0xC2AA}, //4553 #HANGUL SYLLABLE SIOS EU NIEUNHIEUH + {0x9AB4, 0xC2AB}, //4554 #HANGUL SYLLABLE SIOS EU TIKEUT + {0x9AB5, 0xC2AE}, //4555 #HANGUL SYLLABLE SIOS EU RIEULMIEUM + {0x9AB6, 0xC2AF}, //4556 #HANGUL SYLLABLE SIOS EU RIEULPIEUP + {0x9AB7, 0xC2B0}, //4557 #HANGUL SYLLABLE SIOS EU RIEULSIOS + {0x9AB8, 0xC2B1}, //4558 #HANGUL SYLLABLE SIOS EU RIEULTHIEUTH + {0x9AB9, 0xC2B2}, //4559 #HANGUL SYLLABLE SIOS EU RIEULPHIEUPH + {0x9ABA, 0xC2B3}, //4560 #HANGUL SYLLABLE SIOS EU RIEULHIEUH + {0x9ABB, 0xC2B6}, //4561 #HANGUL SYLLABLE SIOS EU PIEUPSIOS + {0x9ABC, 0xC2B8}, //4562 #HANGUL SYLLABLE SIOS EU SSANGSIOS + {0x9ABD, 0xC2BA}, //4563 #HANGUL SYLLABLE SIOS EU CIEUC + {0x9ABE, 0xC2BB}, //4564 #HANGUL SYLLABLE SIOS EU CHIEUCH + {0x9ABF, 0xC2BC}, //4565 #HANGUL SYLLABLE SIOS EU KHIEUKH + {0x9AC0, 0xC2BD}, //4566 #HANGUL SYLLABLE SIOS EU THIEUTH + {0x9AC1, 0xC2BE}, //4567 #HANGUL SYLLABLE SIOS EU PHIEUPH + {0x9AC2, 0xC2BF}, //4568 #HANGUL SYLLABLE SIOS EU HIEUH + {0x9AC3, 0xC2C0}, //4569 #HANGUL SYLLABLE SIOS YI + {0x9AC4, 0xC2C1}, //4570 #HANGUL SYLLABLE SIOS YI KIYEOK + {0x9AC5, 0xC2C2}, //4571 #HANGUL SYLLABLE SIOS YI SSANGKIYEOK + {0x9AC6, 0xC2C3}, //4572 #HANGUL SYLLABLE SIOS YI KIYEOKSIOS + {0x9AC7, 0xC2C4}, //4573 #HANGUL SYLLABLE SIOS YI NIEUN + {0x9AC8, 0xC2C5}, //4574 #HANGUL SYLLABLE SIOS YI NIEUNCIEUC + {0x9AC9, 0xC2C6}, //4575 #HANGUL SYLLABLE SIOS YI NIEUNHIEUH + {0x9ACA, 0xC2C7}, //4576 #HANGUL SYLLABLE SIOS YI TIKEUT + {0x9ACB, 0xC2C8}, //4577 #HANGUL SYLLABLE SIOS YI RIEUL + {0x9ACC, 0xC2C9}, //4578 #HANGUL SYLLABLE SIOS YI RIEULKIYEOK + {0x9ACD, 0xC2CA}, //4579 #HANGUL SYLLABLE SIOS YI RIEULMIEUM + {0x9ACE, 0xC2CB}, //4580 #HANGUL SYLLABLE SIOS YI RIEULPIEUP + {0x9ACF, 0xC2CC}, //4581 #HANGUL SYLLABLE SIOS YI RIEULSIOS + {0x9AD0, 0xC2CD}, //4582 #HANGUL SYLLABLE SIOS YI RIEULTHIEUTH + {0x9AD1, 0xC2CE}, //4583 #HANGUL SYLLABLE SIOS YI RIEULPHIEUPH + {0x9AD2, 0xC2CF}, //4584 #HANGUL SYLLABLE SIOS YI RIEULHIEUH + {0x9AD3, 0xC2D0}, //4585 #HANGUL SYLLABLE SIOS YI MIEUM + {0x9AD4, 0xC2D1}, //4586 #HANGUL SYLLABLE SIOS YI PIEUP + {0x9AD5, 0xC2D2}, //4587 #HANGUL SYLLABLE SIOS YI PIEUPSIOS + {0x9AD6, 0xC2D3}, //4588 #HANGUL SYLLABLE SIOS YI SIOS + {0x9AD7, 0xC2D4}, //4589 #HANGUL SYLLABLE SIOS YI SSANGSIOS + {0x9AD8, 0xC2D5}, //4590 #HANGUL SYLLABLE SIOS YI IEUNG + {0x9AD9, 0xC2D6}, //4591 #HANGUL SYLLABLE SIOS YI CIEUC + {0x9ADA, 0xC2D7}, //4592 #HANGUL SYLLABLE SIOS YI CHIEUCH + {0x9ADB, 0xC2D8}, //4593 #HANGUL SYLLABLE SIOS YI KHIEUKH + {0x9ADC, 0xC2D9}, //4594 #HANGUL SYLLABLE SIOS YI THIEUTH + {0x9ADD, 0xC2DA}, //4595 #HANGUL SYLLABLE SIOS YI PHIEUPH + {0x9ADE, 0xC2DB}, //4596 #HANGUL SYLLABLE SIOS YI HIEUH + {0x9ADF, 0xC2DE}, //4597 #HANGUL SYLLABLE SIOS I SSANGKIYEOK + {0x9AE0, 0xC2DF}, //4598 #HANGUL SYLLABLE SIOS I KIYEOKSIOS + {0x9AE1, 0xC2E1}, //4599 #HANGUL SYLLABLE SIOS I NIEUNCIEUC + {0x9AE2, 0xC2E2}, //4600 #HANGUL SYLLABLE SIOS I NIEUNHIEUH + {0x9AE3, 0xC2E5}, //4601 #HANGUL SYLLABLE SIOS I RIEULKIYEOK + {0x9AE4, 0xC2E6}, //4602 #HANGUL SYLLABLE SIOS I RIEULMIEUM + {0x9AE5, 0xC2E7}, //4603 #HANGUL SYLLABLE SIOS I RIEULPIEUP + {0x9AE6, 0xC2E8}, //4604 #HANGUL SYLLABLE SIOS I RIEULSIOS + {0x9AE7, 0xC2E9}, //4605 #HANGUL SYLLABLE SIOS I RIEULTHIEUTH + {0x9AE8, 0xC2EA}, //4606 #HANGUL SYLLABLE SIOS I RIEULPHIEUPH + {0x9AE9, 0xC2EE}, //4607 #HANGUL SYLLABLE SIOS I PIEUPSIOS + {0x9AEA, 0xC2F0}, //4608 #HANGUL SYLLABLE SIOS I SSANGSIOS + {0x9AEB, 0xC2F2}, //4609 #HANGUL SYLLABLE SIOS I CIEUC + {0x9AEC, 0xC2F3}, //4610 #HANGUL SYLLABLE SIOS I CHIEUCH + {0x9AED, 0xC2F4}, //4611 #HANGUL SYLLABLE SIOS I KHIEUKH + {0x9AEE, 0xC2F5}, //4612 #HANGUL SYLLABLE SIOS I THIEUTH + {0x9AEF, 0xC2F7}, //4613 #HANGUL SYLLABLE SIOS I HIEUH + {0x9AF0, 0xC2FA}, //4614 #HANGUL SYLLABLE SSANGSIOS A SSANGKIYEOK + {0x9AF1, 0xC2FD}, //4615 #HANGUL SYLLABLE SSANGSIOS A NIEUNCIEUC + {0x9AF2, 0xC2FE}, //4616 #HANGUL SYLLABLE SSANGSIOS A NIEUNHIEUH + {0x9AF3, 0xC2FF}, //4617 #HANGUL SYLLABLE SSANGSIOS A TIKEUT + {0x9AF4, 0xC301}, //4618 #HANGUL SYLLABLE SSANGSIOS A RIEULKIYEOK + {0x9AF5, 0xC302}, //4619 #HANGUL SYLLABLE SSANGSIOS A RIEULMIEUM + {0x9AF6, 0xC303}, //4620 #HANGUL SYLLABLE SSANGSIOS A RIEULPIEUP + {0x9AF7, 0xC304}, //4621 #HANGUL SYLLABLE SSANGSIOS A RIEULSIOS + {0x9AF8, 0xC305}, //4622 #HANGUL SYLLABLE SSANGSIOS A RIEULTHIEUTH + {0x9AF9, 0xC306}, //4623 #HANGUL SYLLABLE SSANGSIOS A RIEULPHIEUPH + {0x9AFA, 0xC307}, //4624 #HANGUL SYLLABLE SSANGSIOS A RIEULHIEUH + {0x9AFB, 0xC30A}, //4625 #HANGUL SYLLABLE SSANGSIOS A PIEUPSIOS + {0x9AFC, 0xC30B}, //4626 #HANGUL SYLLABLE SSANGSIOS A SIOS + {0x9AFD, 0xC30E}, //4627 #HANGUL SYLLABLE SSANGSIOS A CIEUC + {0x9AFE, 0xC30F}, //4628 #HANGUL SYLLABLE SSANGSIOS A CHIEUCH + {0x9B41, 0xC310}, //4629 #HANGUL SYLLABLE SSANGSIOS A KHIEUKH + {0x9B42, 0xC311}, //4630 #HANGUL SYLLABLE SSANGSIOS A THIEUTH + {0x9B43, 0xC312}, //4631 #HANGUL SYLLABLE SSANGSIOS A PHIEUPH + {0x9B44, 0xC316}, //4632 #HANGUL SYLLABLE SSANGSIOS AE SSANGKIYEOK + {0x9B45, 0xC317}, //4633 #HANGUL SYLLABLE SSANGSIOS AE KIYEOKSIOS + {0x9B46, 0xC319}, //4634 #HANGUL SYLLABLE SSANGSIOS AE NIEUNCIEUC + {0x9B47, 0xC31A}, //4635 #HANGUL SYLLABLE SSANGSIOS AE NIEUNHIEUH + {0x9B48, 0xC31B}, //4636 #HANGUL SYLLABLE SSANGSIOS AE TIKEUT + {0x9B49, 0xC31D}, //4637 #HANGUL SYLLABLE SSANGSIOS AE RIEULKIYEOK + {0x9B4A, 0xC31E}, //4638 #HANGUL SYLLABLE SSANGSIOS AE RIEULMIEUM + {0x9B4B, 0xC31F}, //4639 #HANGUL SYLLABLE SSANGSIOS AE RIEULPIEUP + {0x9B4C, 0xC320}, //4640 #HANGUL SYLLABLE SSANGSIOS AE RIEULSIOS + {0x9B4D, 0xC321}, //4641 #HANGUL SYLLABLE SSANGSIOS AE RIEULTHIEUTH + {0x9B4E, 0xC322}, //4642 #HANGUL SYLLABLE SSANGSIOS AE RIEULPHIEUPH + {0x9B4F, 0xC323}, //4643 #HANGUL SYLLABLE SSANGSIOS AE RIEULHIEUH + {0x9B50, 0xC326}, //4644 #HANGUL SYLLABLE SSANGSIOS AE PIEUPSIOS + {0x9B51, 0xC327}, //4645 #HANGUL SYLLABLE SSANGSIOS AE SIOS + {0x9B52, 0xC32A}, //4646 #HANGUL SYLLABLE SSANGSIOS AE CIEUC + {0x9B53, 0xC32B}, //4647 #HANGUL SYLLABLE SSANGSIOS AE CHIEUCH + {0x9B54, 0xC32C}, //4648 #HANGUL SYLLABLE SSANGSIOS AE KHIEUKH + {0x9B55, 0xC32D}, //4649 #HANGUL SYLLABLE SSANGSIOS AE THIEUTH + {0x9B56, 0xC32E}, //4650 #HANGUL SYLLABLE SSANGSIOS AE PHIEUPH + {0x9B57, 0xC32F}, //4651 #HANGUL SYLLABLE SSANGSIOS AE HIEUH + {0x9B58, 0xC330}, //4652 #HANGUL SYLLABLE SSANGSIOS YA + {0x9B59, 0xC331}, //4653 #HANGUL SYLLABLE SSANGSIOS YA KIYEOK + {0x9B5A, 0xC332}, //4654 #HANGUL SYLLABLE SSANGSIOS YA SSANGKIYEOK + {0x9B61, 0xC333}, //4655 #HANGUL SYLLABLE SSANGSIOS YA KIYEOKSIOS + {0x9B62, 0xC334}, //4656 #HANGUL SYLLABLE SSANGSIOS YA NIEUN + {0x9B63, 0xC335}, //4657 #HANGUL SYLLABLE SSANGSIOS YA NIEUNCIEUC + {0x9B64, 0xC336}, //4658 #HANGUL SYLLABLE SSANGSIOS YA NIEUNHIEUH + {0x9B65, 0xC337}, //4659 #HANGUL SYLLABLE SSANGSIOS YA TIKEUT + {0x9B66, 0xC338}, //4660 #HANGUL SYLLABLE SSANGSIOS YA RIEUL + {0x9B67, 0xC339}, //4661 #HANGUL SYLLABLE SSANGSIOS YA RIEULKIYEOK + {0x9B68, 0xC33A}, //4662 #HANGUL SYLLABLE SSANGSIOS YA RIEULMIEUM + {0x9B69, 0xC33B}, //4663 #HANGUL SYLLABLE SSANGSIOS YA RIEULPIEUP + {0x9B6A, 0xC33C}, //4664 #HANGUL SYLLABLE SSANGSIOS YA RIEULSIOS + {0x9B6B, 0xC33D}, //4665 #HANGUL SYLLABLE SSANGSIOS YA RIEULTHIEUTH + {0x9B6C, 0xC33E}, //4666 #HANGUL SYLLABLE SSANGSIOS YA RIEULPHIEUPH + {0x9B6D, 0xC33F}, //4667 #HANGUL SYLLABLE SSANGSIOS YA RIEULHIEUH + {0x9B6E, 0xC340}, //4668 #HANGUL SYLLABLE SSANGSIOS YA MIEUM + {0x9B6F, 0xC341}, //4669 #HANGUL SYLLABLE SSANGSIOS YA PIEUP + {0x9B70, 0xC342}, //4670 #HANGUL SYLLABLE SSANGSIOS YA PIEUPSIOS + {0x9B71, 0xC343}, //4671 #HANGUL SYLLABLE SSANGSIOS YA SIOS + {0x9B72, 0xC344}, //4672 #HANGUL SYLLABLE SSANGSIOS YA SSANGSIOS + {0x9B73, 0xC346}, //4673 #HANGUL SYLLABLE SSANGSIOS YA CIEUC + {0x9B74, 0xC347}, //4674 #HANGUL SYLLABLE SSANGSIOS YA CHIEUCH + {0x9B75, 0xC348}, //4675 #HANGUL SYLLABLE SSANGSIOS YA KHIEUKH + {0x9B76, 0xC349}, //4676 #HANGUL SYLLABLE SSANGSIOS YA THIEUTH + {0x9B77, 0xC34A}, //4677 #HANGUL SYLLABLE SSANGSIOS YA PHIEUPH + {0x9B78, 0xC34B}, //4678 #HANGUL SYLLABLE SSANGSIOS YA HIEUH + {0x9B79, 0xC34C}, //4679 #HANGUL SYLLABLE SSANGSIOS YAE + {0x9B7A, 0xC34D}, //4680 #HANGUL SYLLABLE SSANGSIOS YAE KIYEOK + {0x9B81, 0xC34E}, //4681 #HANGUL SYLLABLE SSANGSIOS YAE SSANGKIYEOK + {0x9B82, 0xC34F}, //4682 #HANGUL SYLLABLE SSANGSIOS YAE KIYEOKSIOS + {0x9B83, 0xC350}, //4683 #HANGUL SYLLABLE SSANGSIOS YAE NIEUN + {0x9B84, 0xC351}, //4684 #HANGUL SYLLABLE SSANGSIOS YAE NIEUNCIEUC + {0x9B85, 0xC352}, //4685 #HANGUL SYLLABLE SSANGSIOS YAE NIEUNHIEUH + {0x9B86, 0xC353}, //4686 #HANGUL SYLLABLE SSANGSIOS YAE TIKEUT + {0x9B87, 0xC354}, //4687 #HANGUL SYLLABLE SSANGSIOS YAE RIEUL + {0x9B88, 0xC355}, //4688 #HANGUL SYLLABLE SSANGSIOS YAE RIEULKIYEOK + {0x9B89, 0xC356}, //4689 #HANGUL SYLLABLE SSANGSIOS YAE RIEULMIEUM + {0x9B8A, 0xC357}, //4690 #HANGUL SYLLABLE SSANGSIOS YAE RIEULPIEUP + {0x9B8B, 0xC358}, //4691 #HANGUL SYLLABLE SSANGSIOS YAE RIEULSIOS + {0x9B8C, 0xC359}, //4692 #HANGUL SYLLABLE SSANGSIOS YAE RIEULTHIEUTH + {0x9B8D, 0xC35A}, //4693 #HANGUL SYLLABLE SSANGSIOS YAE RIEULPHIEUPH + {0x9B8E, 0xC35B}, //4694 #HANGUL SYLLABLE SSANGSIOS YAE RIEULHIEUH + {0x9B8F, 0xC35C}, //4695 #HANGUL SYLLABLE SSANGSIOS YAE MIEUM + {0x9B90, 0xC35D}, //4696 #HANGUL SYLLABLE SSANGSIOS YAE PIEUP + {0x9B91, 0xC35E}, //4697 #HANGUL SYLLABLE SSANGSIOS YAE PIEUPSIOS + {0x9B92, 0xC35F}, //4698 #HANGUL SYLLABLE SSANGSIOS YAE SIOS + {0x9B93, 0xC360}, //4699 #HANGUL SYLLABLE SSANGSIOS YAE SSANGSIOS + {0x9B94, 0xC361}, //4700 #HANGUL SYLLABLE SSANGSIOS YAE IEUNG + {0x9B95, 0xC362}, //4701 #HANGUL SYLLABLE SSANGSIOS YAE CIEUC + {0x9B96, 0xC363}, //4702 #HANGUL SYLLABLE SSANGSIOS YAE CHIEUCH + {0x9B97, 0xC364}, //4703 #HANGUL SYLLABLE SSANGSIOS YAE KHIEUKH + {0x9B98, 0xC365}, //4704 #HANGUL SYLLABLE SSANGSIOS YAE THIEUTH + {0x9B99, 0xC366}, //4705 #HANGUL SYLLABLE SSANGSIOS YAE PHIEUPH + {0x9B9A, 0xC367}, //4706 #HANGUL SYLLABLE SSANGSIOS YAE HIEUH + {0x9B9B, 0xC36A}, //4707 #HANGUL SYLLABLE SSANGSIOS EO SSANGKIYEOK + {0x9B9C, 0xC36B}, //4708 #HANGUL SYLLABLE SSANGSIOS EO KIYEOKSIOS + {0x9B9D, 0xC36D}, //4709 #HANGUL SYLLABLE SSANGSIOS EO NIEUNCIEUC + {0x9B9E, 0xC36E}, //4710 #HANGUL SYLLABLE SSANGSIOS EO NIEUNHIEUH + {0x9B9F, 0xC36F}, //4711 #HANGUL SYLLABLE SSANGSIOS EO TIKEUT + {0x9BA0, 0xC371}, //4712 #HANGUL SYLLABLE SSANGSIOS EO RIEULKIYEOK + {0x9BA1, 0xC373}, //4713 #HANGUL SYLLABLE SSANGSIOS EO RIEULPIEUP + {0x9BA2, 0xC374}, //4714 #HANGUL SYLLABLE SSANGSIOS EO RIEULSIOS + {0x9BA3, 0xC375}, //4715 #HANGUL SYLLABLE SSANGSIOS EO RIEULTHIEUTH + {0x9BA4, 0xC376}, //4716 #HANGUL SYLLABLE SSANGSIOS EO RIEULPHIEUPH + {0x9BA5, 0xC377}, //4717 #HANGUL SYLLABLE SSANGSIOS EO RIEULHIEUH + {0x9BA6, 0xC37A}, //4718 #HANGUL SYLLABLE SSANGSIOS EO PIEUPSIOS + {0x9BA7, 0xC37B}, //4719 #HANGUL SYLLABLE SSANGSIOS EO SIOS + {0x9BA8, 0xC37E}, //4720 #HANGUL SYLLABLE SSANGSIOS EO CIEUC + {0x9BA9, 0xC37F}, //4721 #HANGUL SYLLABLE SSANGSIOS EO CHIEUCH + {0x9BAA, 0xC380}, //4722 #HANGUL SYLLABLE SSANGSIOS EO KHIEUKH + {0x9BAB, 0xC381}, //4723 #HANGUL SYLLABLE SSANGSIOS EO THIEUTH + {0x9BAC, 0xC382}, //4724 #HANGUL SYLLABLE SSANGSIOS EO PHIEUPH + {0x9BAD, 0xC383}, //4725 #HANGUL SYLLABLE SSANGSIOS EO HIEUH + {0x9BAE, 0xC385}, //4726 #HANGUL SYLLABLE SSANGSIOS E KIYEOK + {0x9BAF, 0xC386}, //4727 #HANGUL SYLLABLE SSANGSIOS E SSANGKIYEOK + {0x9BB0, 0xC387}, //4728 #HANGUL SYLLABLE SSANGSIOS E KIYEOKSIOS + {0x9BB1, 0xC389}, //4729 #HANGUL SYLLABLE SSANGSIOS E NIEUNCIEUC + {0x9BB2, 0xC38A}, //4730 #HANGUL SYLLABLE SSANGSIOS E NIEUNHIEUH + {0x9BB3, 0xC38B}, //4731 #HANGUL SYLLABLE SSANGSIOS E TIKEUT + {0x9BB4, 0xC38D}, //4732 #HANGUL SYLLABLE SSANGSIOS E RIEULKIYEOK + {0x9BB5, 0xC38E}, //4733 #HANGUL SYLLABLE SSANGSIOS E RIEULMIEUM + {0x9BB6, 0xC38F}, //4734 #HANGUL SYLLABLE SSANGSIOS E RIEULPIEUP + {0x9BB7, 0xC390}, //4735 #HANGUL SYLLABLE SSANGSIOS E RIEULSIOS + {0x9BB8, 0xC391}, //4736 #HANGUL SYLLABLE SSANGSIOS E RIEULTHIEUTH + {0x9BB9, 0xC392}, //4737 #HANGUL SYLLABLE SSANGSIOS E RIEULPHIEUPH + {0x9BBA, 0xC393}, //4738 #HANGUL SYLLABLE SSANGSIOS E RIEULHIEUH + {0x9BBB, 0xC394}, //4739 #HANGUL SYLLABLE SSANGSIOS E MIEUM + {0x9BBC, 0xC395}, //4740 #HANGUL SYLLABLE SSANGSIOS E PIEUP + {0x9BBD, 0xC396}, //4741 #HANGUL SYLLABLE SSANGSIOS E PIEUPSIOS + {0x9BBE, 0xC397}, //4742 #HANGUL SYLLABLE SSANGSIOS E SIOS + {0x9BBF, 0xC398}, //4743 #HANGUL SYLLABLE SSANGSIOS E SSANGSIOS + {0x9BC0, 0xC399}, //4744 #HANGUL SYLLABLE SSANGSIOS E IEUNG + {0x9BC1, 0xC39A}, //4745 #HANGUL SYLLABLE SSANGSIOS E CIEUC + {0x9BC2, 0xC39B}, //4746 #HANGUL SYLLABLE SSANGSIOS E CHIEUCH + {0x9BC3, 0xC39C}, //4747 #HANGUL SYLLABLE SSANGSIOS E KHIEUKH + {0x9BC4, 0xC39D}, //4748 #HANGUL SYLLABLE SSANGSIOS E THIEUTH + {0x9BC5, 0xC39E}, //4749 #HANGUL SYLLABLE SSANGSIOS E PHIEUPH + {0x9BC6, 0xC39F}, //4750 #HANGUL SYLLABLE SSANGSIOS E HIEUH + {0x9BC7, 0xC3A0}, //4751 #HANGUL SYLLABLE SSANGSIOS YEO + {0x9BC8, 0xC3A1}, //4752 #HANGUL SYLLABLE SSANGSIOS YEO KIYEOK + {0x9BC9, 0xC3A2}, //4753 #HANGUL SYLLABLE SSANGSIOS YEO SSANGKIYEOK + {0x9BCA, 0xC3A3}, //4754 #HANGUL SYLLABLE SSANGSIOS YEO KIYEOKSIOS + {0x9BCB, 0xC3A4}, //4755 #HANGUL SYLLABLE SSANGSIOS YEO NIEUN + {0x9BCC, 0xC3A5}, //4756 #HANGUL SYLLABLE SSANGSIOS YEO NIEUNCIEUC + {0x9BCD, 0xC3A6}, //4757 #HANGUL SYLLABLE SSANGSIOS YEO NIEUNHIEUH + {0x9BCE, 0xC3A7}, //4758 #HANGUL SYLLABLE SSANGSIOS YEO TIKEUT + {0x9BCF, 0xC3A8}, //4759 #HANGUL SYLLABLE SSANGSIOS YEO RIEUL + {0x9BD0, 0xC3A9}, //4760 #HANGUL SYLLABLE SSANGSIOS YEO RIEULKIYEOK + {0x9BD1, 0xC3AA}, //4761 #HANGUL SYLLABLE SSANGSIOS YEO RIEULMIEUM + {0x9BD2, 0xC3AB}, //4762 #HANGUL SYLLABLE SSANGSIOS YEO RIEULPIEUP + {0x9BD3, 0xC3AC}, //4763 #HANGUL SYLLABLE SSANGSIOS YEO RIEULSIOS + {0x9BD4, 0xC3AD}, //4764 #HANGUL SYLLABLE SSANGSIOS YEO RIEULTHIEUTH + {0x9BD5, 0xC3AE}, //4765 #HANGUL SYLLABLE SSANGSIOS YEO RIEULPHIEUPH + {0x9BD6, 0xC3AF}, //4766 #HANGUL SYLLABLE SSANGSIOS YEO RIEULHIEUH + {0x9BD7, 0xC3B0}, //4767 #HANGUL SYLLABLE SSANGSIOS YEO MIEUM + {0x9BD8, 0xC3B1}, //4768 #HANGUL SYLLABLE SSANGSIOS YEO PIEUP + {0x9BD9, 0xC3B2}, //4769 #HANGUL SYLLABLE SSANGSIOS YEO PIEUPSIOS + {0x9BDA, 0xC3B3}, //4770 #HANGUL SYLLABLE SSANGSIOS YEO SIOS + {0x9BDB, 0xC3B4}, //4771 #HANGUL SYLLABLE SSANGSIOS YEO SSANGSIOS + {0x9BDC, 0xC3B5}, //4772 #HANGUL SYLLABLE SSANGSIOS YEO IEUNG + {0x9BDD, 0xC3B6}, //4773 #HANGUL SYLLABLE SSANGSIOS YEO CIEUC + {0x9BDE, 0xC3B7}, //4774 #HANGUL SYLLABLE SSANGSIOS YEO CHIEUCH + {0x9BDF, 0xC3B8}, //4775 #HANGUL SYLLABLE SSANGSIOS YEO KHIEUKH + {0x9BE0, 0xC3B9}, //4776 #HANGUL SYLLABLE SSANGSIOS YEO THIEUTH + {0x9BE1, 0xC3BA}, //4777 #HANGUL SYLLABLE SSANGSIOS YEO PHIEUPH + {0x9BE2, 0xC3BB}, //4778 #HANGUL SYLLABLE SSANGSIOS YEO HIEUH + {0x9BE3, 0xC3BC}, //4779 #HANGUL SYLLABLE SSANGSIOS YE + {0x9BE4, 0xC3BD}, //4780 #HANGUL SYLLABLE SSANGSIOS YE KIYEOK + {0x9BE5, 0xC3BE}, //4781 #HANGUL SYLLABLE SSANGSIOS YE SSANGKIYEOK + {0x9BE6, 0xC3BF}, //4782 #HANGUL SYLLABLE SSANGSIOS YE KIYEOKSIOS + {0x9BE7, 0xC3C1}, //4783 #HANGUL SYLLABLE SSANGSIOS YE NIEUNCIEUC + {0x9BE8, 0xC3C2}, //4784 #HANGUL SYLLABLE SSANGSIOS YE NIEUNHIEUH + {0x9BE9, 0xC3C3}, //4785 #HANGUL SYLLABLE SSANGSIOS YE TIKEUT + {0x9BEA, 0xC3C4}, //4786 #HANGUL SYLLABLE SSANGSIOS YE RIEUL + {0x9BEB, 0xC3C5}, //4787 #HANGUL SYLLABLE SSANGSIOS YE RIEULKIYEOK + {0x9BEC, 0xC3C6}, //4788 #HANGUL SYLLABLE SSANGSIOS YE RIEULMIEUM + {0x9BED, 0xC3C7}, //4789 #HANGUL SYLLABLE SSANGSIOS YE RIEULPIEUP + {0x9BEE, 0xC3C8}, //4790 #HANGUL SYLLABLE SSANGSIOS YE RIEULSIOS + {0x9BEF, 0xC3C9}, //4791 #HANGUL SYLLABLE SSANGSIOS YE RIEULTHIEUTH + {0x9BF0, 0xC3CA}, //4792 #HANGUL SYLLABLE SSANGSIOS YE RIEULPHIEUPH + {0x9BF1, 0xC3CB}, //4793 #HANGUL SYLLABLE SSANGSIOS YE RIEULHIEUH + {0x9BF2, 0xC3CC}, //4794 #HANGUL SYLLABLE SSANGSIOS YE MIEUM + {0x9BF3, 0xC3CD}, //4795 #HANGUL SYLLABLE SSANGSIOS YE PIEUP + {0x9BF4, 0xC3CE}, //4796 #HANGUL SYLLABLE SSANGSIOS YE PIEUPSIOS + {0x9BF5, 0xC3CF}, //4797 #HANGUL SYLLABLE SSANGSIOS YE SIOS + {0x9BF6, 0xC3D0}, //4798 #HANGUL SYLLABLE SSANGSIOS YE SSANGSIOS + {0x9BF7, 0xC3D1}, //4799 #HANGUL SYLLABLE SSANGSIOS YE IEUNG + {0x9BF8, 0xC3D2}, //4800 #HANGUL SYLLABLE SSANGSIOS YE CIEUC + {0x9BF9, 0xC3D3}, //4801 #HANGUL SYLLABLE SSANGSIOS YE CHIEUCH + {0x9BFA, 0xC3D4}, //4802 #HANGUL SYLLABLE SSANGSIOS YE KHIEUKH + {0x9BFB, 0xC3D5}, //4803 #HANGUL SYLLABLE SSANGSIOS YE THIEUTH + {0x9BFC, 0xC3D6}, //4804 #HANGUL SYLLABLE SSANGSIOS YE PHIEUPH + {0x9BFD, 0xC3D7}, //4805 #HANGUL SYLLABLE SSANGSIOS YE HIEUH + {0x9BFE, 0xC3DA}, //4806 #HANGUL SYLLABLE SSANGSIOS O SSANGKIYEOK + {0x9C41, 0xC3DB}, //4807 #HANGUL SYLLABLE SSANGSIOS O KIYEOKSIOS + {0x9C42, 0xC3DD}, //4808 #HANGUL SYLLABLE SSANGSIOS O NIEUNCIEUC + {0x9C43, 0xC3DE}, //4809 #HANGUL SYLLABLE SSANGSIOS O NIEUNHIEUH + {0x9C44, 0xC3E1}, //4810 #HANGUL SYLLABLE SSANGSIOS O RIEULKIYEOK + {0x9C45, 0xC3E3}, //4811 #HANGUL SYLLABLE SSANGSIOS O RIEULPIEUP + {0x9C46, 0xC3E4}, //4812 #HANGUL SYLLABLE SSANGSIOS O RIEULSIOS + {0x9C47, 0xC3E5}, //4813 #HANGUL SYLLABLE SSANGSIOS O RIEULTHIEUTH + {0x9C48, 0xC3E6}, //4814 #HANGUL SYLLABLE SSANGSIOS O RIEULPHIEUPH + {0x9C49, 0xC3E7}, //4815 #HANGUL SYLLABLE SSANGSIOS O RIEULHIEUH + {0x9C4A, 0xC3EA}, //4816 #HANGUL SYLLABLE SSANGSIOS O PIEUPSIOS + {0x9C4B, 0xC3EB}, //4817 #HANGUL SYLLABLE SSANGSIOS O SIOS + {0x9C4C, 0xC3EC}, //4818 #HANGUL SYLLABLE SSANGSIOS O SSANGSIOS + {0x9C4D, 0xC3EE}, //4819 #HANGUL SYLLABLE SSANGSIOS O CIEUC + {0x9C4E, 0xC3EF}, //4820 #HANGUL SYLLABLE SSANGSIOS O CHIEUCH + {0x9C4F, 0xC3F0}, //4821 #HANGUL SYLLABLE SSANGSIOS O KHIEUKH + {0x9C50, 0xC3F1}, //4822 #HANGUL SYLLABLE SSANGSIOS O THIEUTH + {0x9C51, 0xC3F2}, //4823 #HANGUL SYLLABLE SSANGSIOS O PHIEUPH + {0x9C52, 0xC3F3}, //4824 #HANGUL SYLLABLE SSANGSIOS O HIEUH + {0x9C53, 0xC3F6}, //4825 #HANGUL SYLLABLE SSANGSIOS WA SSANGKIYEOK + {0x9C54, 0xC3F7}, //4826 #HANGUL SYLLABLE SSANGSIOS WA KIYEOKSIOS + {0x9C55, 0xC3F9}, //4827 #HANGUL SYLLABLE SSANGSIOS WA NIEUNCIEUC + {0x9C56, 0xC3FA}, //4828 #HANGUL SYLLABLE SSANGSIOS WA NIEUNHIEUH + {0x9C57, 0xC3FB}, //4829 #HANGUL SYLLABLE SSANGSIOS WA TIKEUT + {0x9C58, 0xC3FC}, //4830 #HANGUL SYLLABLE SSANGSIOS WA RIEUL + {0x9C59, 0xC3FD}, //4831 #HANGUL SYLLABLE SSANGSIOS WA RIEULKIYEOK + {0x9C5A, 0xC3FE}, //4832 #HANGUL SYLLABLE SSANGSIOS WA RIEULMIEUM + {0x9C61, 0xC3FF}, //4833 #HANGUL SYLLABLE SSANGSIOS WA RIEULPIEUP + {0x9C62, 0xC400}, //4834 #HANGUL SYLLABLE SSANGSIOS WA RIEULSIOS + {0x9C63, 0xC401}, //4835 #HANGUL SYLLABLE SSANGSIOS WA RIEULTHIEUTH + {0x9C64, 0xC402}, //4836 #HANGUL SYLLABLE SSANGSIOS WA RIEULPHIEUPH + {0x9C65, 0xC403}, //4837 #HANGUL SYLLABLE SSANGSIOS WA RIEULHIEUH + {0x9C66, 0xC404}, //4838 #HANGUL SYLLABLE SSANGSIOS WA MIEUM + {0x9C67, 0xC405}, //4839 #HANGUL SYLLABLE SSANGSIOS WA PIEUP + {0x9C68, 0xC406}, //4840 #HANGUL SYLLABLE SSANGSIOS WA PIEUPSIOS + {0x9C69, 0xC407}, //4841 #HANGUL SYLLABLE SSANGSIOS WA SIOS + {0x9C6A, 0xC409}, //4842 #HANGUL SYLLABLE SSANGSIOS WA IEUNG + {0x9C6B, 0xC40A}, //4843 #HANGUL SYLLABLE SSANGSIOS WA CIEUC + {0x9C6C, 0xC40B}, //4844 #HANGUL SYLLABLE SSANGSIOS WA CHIEUCH + {0x9C6D, 0xC40C}, //4845 #HANGUL SYLLABLE SSANGSIOS WA KHIEUKH + {0x9C6E, 0xC40D}, //4846 #HANGUL SYLLABLE SSANGSIOS WA THIEUTH + {0x9C6F, 0xC40E}, //4847 #HANGUL SYLLABLE SSANGSIOS WA PHIEUPH + {0x9C70, 0xC40F}, //4848 #HANGUL SYLLABLE SSANGSIOS WA HIEUH + {0x9C71, 0xC411}, //4849 #HANGUL SYLLABLE SSANGSIOS WAE KIYEOK + {0x9C72, 0xC412}, //4850 #HANGUL SYLLABLE SSANGSIOS WAE SSANGKIYEOK + {0x9C73, 0xC413}, //4851 #HANGUL SYLLABLE SSANGSIOS WAE KIYEOKSIOS + {0x9C74, 0xC414}, //4852 #HANGUL SYLLABLE SSANGSIOS WAE NIEUN + {0x9C75, 0xC415}, //4853 #HANGUL SYLLABLE SSANGSIOS WAE NIEUNCIEUC + {0x9C76, 0xC416}, //4854 #HANGUL SYLLABLE SSANGSIOS WAE NIEUNHIEUH + {0x9C77, 0xC417}, //4855 #HANGUL SYLLABLE SSANGSIOS WAE TIKEUT + {0x9C78, 0xC418}, //4856 #HANGUL SYLLABLE SSANGSIOS WAE RIEUL + {0x9C79, 0xC419}, //4857 #HANGUL SYLLABLE SSANGSIOS WAE RIEULKIYEOK + {0x9C7A, 0xC41A}, //4858 #HANGUL SYLLABLE SSANGSIOS WAE RIEULMIEUM + {0x9C81, 0xC41B}, //4859 #HANGUL SYLLABLE SSANGSIOS WAE RIEULPIEUP + {0x9C82, 0xC41C}, //4860 #HANGUL SYLLABLE SSANGSIOS WAE RIEULSIOS + {0x9C83, 0xC41D}, //4861 #HANGUL SYLLABLE SSANGSIOS WAE RIEULTHIEUTH + {0x9C84, 0xC41E}, //4862 #HANGUL SYLLABLE SSANGSIOS WAE RIEULPHIEUPH + {0x9C85, 0xC41F}, //4863 #HANGUL SYLLABLE SSANGSIOS WAE RIEULHIEUH + {0x9C86, 0xC420}, //4864 #HANGUL SYLLABLE SSANGSIOS WAE MIEUM + {0x9C87, 0xC421}, //4865 #HANGUL SYLLABLE SSANGSIOS WAE PIEUP + {0x9C88, 0xC422}, //4866 #HANGUL SYLLABLE SSANGSIOS WAE PIEUPSIOS + {0x9C89, 0xC423}, //4867 #HANGUL SYLLABLE SSANGSIOS WAE SIOS + {0x9C8A, 0xC425}, //4868 #HANGUL SYLLABLE SSANGSIOS WAE IEUNG + {0x9C8B, 0xC426}, //4869 #HANGUL SYLLABLE SSANGSIOS WAE CIEUC + {0x9C8C, 0xC427}, //4870 #HANGUL SYLLABLE SSANGSIOS WAE CHIEUCH + {0x9C8D, 0xC428}, //4871 #HANGUL SYLLABLE SSANGSIOS WAE KHIEUKH + {0x9C8E, 0xC429}, //4872 #HANGUL SYLLABLE SSANGSIOS WAE THIEUTH + {0x9C8F, 0xC42A}, //4873 #HANGUL SYLLABLE SSANGSIOS WAE PHIEUPH + {0x9C90, 0xC42B}, //4874 #HANGUL SYLLABLE SSANGSIOS WAE HIEUH + {0x9C91, 0xC42D}, //4875 #HANGUL SYLLABLE SSANGSIOS OE KIYEOK + {0x9C92, 0xC42E}, //4876 #HANGUL SYLLABLE SSANGSIOS OE SSANGKIYEOK + {0x9C93, 0xC42F}, //4877 #HANGUL SYLLABLE SSANGSIOS OE KIYEOKSIOS + {0x9C94, 0xC431}, //4878 #HANGUL SYLLABLE SSANGSIOS OE NIEUNCIEUC + {0x9C95, 0xC432}, //4879 #HANGUL SYLLABLE SSANGSIOS OE NIEUNHIEUH + {0x9C96, 0xC433}, //4880 #HANGUL SYLLABLE SSANGSIOS OE TIKEUT + {0x9C97, 0xC435}, //4881 #HANGUL SYLLABLE SSANGSIOS OE RIEULKIYEOK + {0x9C98, 0xC436}, //4882 #HANGUL SYLLABLE SSANGSIOS OE RIEULMIEUM + {0x9C99, 0xC437}, //4883 #HANGUL SYLLABLE SSANGSIOS OE RIEULPIEUP + {0x9C9A, 0xC438}, //4884 #HANGUL SYLLABLE SSANGSIOS OE RIEULSIOS + {0x9C9B, 0xC439}, //4885 #HANGUL SYLLABLE SSANGSIOS OE RIEULTHIEUTH + {0x9C9C, 0xC43A}, //4886 #HANGUL SYLLABLE SSANGSIOS OE RIEULPHIEUPH + {0x9C9D, 0xC43B}, //4887 #HANGUL SYLLABLE SSANGSIOS OE RIEULHIEUH + {0x9C9E, 0xC43E}, //4888 #HANGUL SYLLABLE SSANGSIOS OE PIEUPSIOS + {0x9C9F, 0xC43F}, //4889 #HANGUL SYLLABLE SSANGSIOS OE SIOS + {0x9CA0, 0xC440}, //4890 #HANGUL SYLLABLE SSANGSIOS OE SSANGSIOS + {0x9CA1, 0xC441}, //4891 #HANGUL SYLLABLE SSANGSIOS OE IEUNG + {0x9CA2, 0xC442}, //4892 #HANGUL SYLLABLE SSANGSIOS OE CIEUC + {0x9CA3, 0xC443}, //4893 #HANGUL SYLLABLE SSANGSIOS OE CHIEUCH + {0x9CA4, 0xC444}, //4894 #HANGUL SYLLABLE SSANGSIOS OE KHIEUKH + {0x9CA5, 0xC445}, //4895 #HANGUL SYLLABLE SSANGSIOS OE THIEUTH + {0x9CA6, 0xC446}, //4896 #HANGUL SYLLABLE SSANGSIOS OE PHIEUPH + {0x9CA7, 0xC447}, //4897 #HANGUL SYLLABLE SSANGSIOS OE HIEUH + {0x9CA8, 0xC449}, //4898 #HANGUL SYLLABLE SSANGSIOS YO KIYEOK + {0x9CA9, 0xC44A}, //4899 #HANGUL SYLLABLE SSANGSIOS YO SSANGKIYEOK + {0x9CAA, 0xC44B}, //4900 #HANGUL SYLLABLE SSANGSIOS YO KIYEOKSIOS + {0x9CAB, 0xC44C}, //4901 #HANGUL SYLLABLE SSANGSIOS YO NIEUN + {0x9CAC, 0xC44D}, //4902 #HANGUL SYLLABLE SSANGSIOS YO NIEUNCIEUC + {0x9CAD, 0xC44E}, //4903 #HANGUL SYLLABLE SSANGSIOS YO NIEUNHIEUH + {0x9CAE, 0xC44F}, //4904 #HANGUL SYLLABLE SSANGSIOS YO TIKEUT + {0x9CAF, 0xC450}, //4905 #HANGUL SYLLABLE SSANGSIOS YO RIEUL + {0x9CB0, 0xC451}, //4906 #HANGUL SYLLABLE SSANGSIOS YO RIEULKIYEOK + {0x9CB1, 0xC452}, //4907 #HANGUL SYLLABLE SSANGSIOS YO RIEULMIEUM + {0x9CB2, 0xC453}, //4908 #HANGUL SYLLABLE SSANGSIOS YO RIEULPIEUP + {0x9CB3, 0xC454}, //4909 #HANGUL SYLLABLE SSANGSIOS YO RIEULSIOS + {0x9CB4, 0xC455}, //4910 #HANGUL SYLLABLE SSANGSIOS YO RIEULTHIEUTH + {0x9CB5, 0xC456}, //4911 #HANGUL SYLLABLE SSANGSIOS YO RIEULPHIEUPH + {0x9CB6, 0xC457}, //4912 #HANGUL SYLLABLE SSANGSIOS YO RIEULHIEUH + {0x9CB7, 0xC458}, //4913 #HANGUL SYLLABLE SSANGSIOS YO MIEUM + {0x9CB8, 0xC459}, //4914 #HANGUL SYLLABLE SSANGSIOS YO PIEUP + {0x9CB9, 0xC45A}, //4915 #HANGUL SYLLABLE SSANGSIOS YO PIEUPSIOS + {0x9CBA, 0xC45B}, //4916 #HANGUL SYLLABLE SSANGSIOS YO SIOS + {0x9CBB, 0xC45C}, //4917 #HANGUL SYLLABLE SSANGSIOS YO SSANGSIOS + {0x9CBC, 0xC45D}, //4918 #HANGUL SYLLABLE SSANGSIOS YO IEUNG + {0x9CBD, 0xC45E}, //4919 #HANGUL SYLLABLE SSANGSIOS YO CIEUC + {0x9CBE, 0xC45F}, //4920 #HANGUL SYLLABLE SSANGSIOS YO CHIEUCH + {0x9CBF, 0xC460}, //4921 #HANGUL SYLLABLE SSANGSIOS YO KHIEUKH + {0x9CC0, 0xC461}, //4922 #HANGUL SYLLABLE SSANGSIOS YO THIEUTH + {0x9CC1, 0xC462}, //4923 #HANGUL SYLLABLE SSANGSIOS YO PHIEUPH + {0x9CC2, 0xC463}, //4924 #HANGUL SYLLABLE SSANGSIOS YO HIEUH + {0x9CC3, 0xC466}, //4925 #HANGUL SYLLABLE SSANGSIOS U SSANGKIYEOK + {0x9CC4, 0xC467}, //4926 #HANGUL SYLLABLE SSANGSIOS U KIYEOKSIOS + {0x9CC5, 0xC469}, //4927 #HANGUL SYLLABLE SSANGSIOS U NIEUNCIEUC + {0x9CC6, 0xC46A}, //4928 #HANGUL SYLLABLE SSANGSIOS U NIEUNHIEUH + {0x9CC7, 0xC46B}, //4929 #HANGUL SYLLABLE SSANGSIOS U TIKEUT + {0x9CC8, 0xC46D}, //4930 #HANGUL SYLLABLE SSANGSIOS U RIEULKIYEOK + {0x9CC9, 0xC46E}, //4931 #HANGUL SYLLABLE SSANGSIOS U RIEULMIEUM + {0x9CCA, 0xC46F}, //4932 #HANGUL SYLLABLE SSANGSIOS U RIEULPIEUP + {0x9CCB, 0xC470}, //4933 #HANGUL SYLLABLE SSANGSIOS U RIEULSIOS + {0x9CCC, 0xC471}, //4934 #HANGUL SYLLABLE SSANGSIOS U RIEULTHIEUTH + {0x9CCD, 0xC472}, //4935 #HANGUL SYLLABLE SSANGSIOS U RIEULPHIEUPH + {0x9CCE, 0xC473}, //4936 #HANGUL SYLLABLE SSANGSIOS U RIEULHIEUH + {0x9CCF, 0xC476}, //4937 #HANGUL SYLLABLE SSANGSIOS U PIEUPSIOS + {0x9CD0, 0xC477}, //4938 #HANGUL SYLLABLE SSANGSIOS U SIOS + {0x9CD1, 0xC478}, //4939 #HANGUL SYLLABLE SSANGSIOS U SSANGSIOS + {0x9CD2, 0xC47A}, //4940 #HANGUL SYLLABLE SSANGSIOS U CIEUC + {0x9CD3, 0xC47B}, //4941 #HANGUL SYLLABLE SSANGSIOS U CHIEUCH + {0x9CD4, 0xC47C}, //4942 #HANGUL SYLLABLE SSANGSIOS U KHIEUKH + {0x9CD5, 0xC47D}, //4943 #HANGUL SYLLABLE SSANGSIOS U THIEUTH + {0x9CD6, 0xC47E}, //4944 #HANGUL SYLLABLE SSANGSIOS U PHIEUPH + {0x9CD7, 0xC47F}, //4945 #HANGUL SYLLABLE SSANGSIOS U HIEUH + {0x9CD8, 0xC481}, //4946 #HANGUL SYLLABLE SSANGSIOS WEO KIYEOK + {0x9CD9, 0xC482}, //4947 #HANGUL SYLLABLE SSANGSIOS WEO SSANGKIYEOK + {0x9CDA, 0xC483}, //4948 #HANGUL SYLLABLE SSANGSIOS WEO KIYEOKSIOS + {0x9CDB, 0xC484}, //4949 #HANGUL SYLLABLE SSANGSIOS WEO NIEUN + {0x9CDC, 0xC485}, //4950 #HANGUL SYLLABLE SSANGSIOS WEO NIEUNCIEUC + {0x9CDD, 0xC486}, //4951 #HANGUL SYLLABLE SSANGSIOS WEO NIEUNHIEUH + {0x9CDE, 0xC487}, //4952 #HANGUL SYLLABLE SSANGSIOS WEO TIKEUT + {0x9CDF, 0xC488}, //4953 #HANGUL SYLLABLE SSANGSIOS WEO RIEUL + {0x9CE0, 0xC489}, //4954 #HANGUL SYLLABLE SSANGSIOS WEO RIEULKIYEOK + {0x9CE1, 0xC48A}, //4955 #HANGUL SYLLABLE SSANGSIOS WEO RIEULMIEUM + {0x9CE2, 0xC48B}, //4956 #HANGUL SYLLABLE SSANGSIOS WEO RIEULPIEUP + {0x9CE3, 0xC48C}, //4957 #HANGUL SYLLABLE SSANGSIOS WEO RIEULSIOS + {0x9CE4, 0xC48D}, //4958 #HANGUL SYLLABLE SSANGSIOS WEO RIEULTHIEUTH + {0x9CE5, 0xC48E}, //4959 #HANGUL SYLLABLE SSANGSIOS WEO RIEULPHIEUPH + {0x9CE6, 0xC48F}, //4960 #HANGUL SYLLABLE SSANGSIOS WEO RIEULHIEUH + {0x9CE7, 0xC490}, //4961 #HANGUL SYLLABLE SSANGSIOS WEO MIEUM + {0x9CE8, 0xC491}, //4962 #HANGUL SYLLABLE SSANGSIOS WEO PIEUP + {0x9CE9, 0xC492}, //4963 #HANGUL SYLLABLE SSANGSIOS WEO PIEUPSIOS + {0x9CEA, 0xC493}, //4964 #HANGUL SYLLABLE SSANGSIOS WEO SIOS + {0x9CEB, 0xC495}, //4965 #HANGUL SYLLABLE SSANGSIOS WEO IEUNG + {0x9CEC, 0xC496}, //4966 #HANGUL SYLLABLE SSANGSIOS WEO CIEUC + {0x9CED, 0xC497}, //4967 #HANGUL SYLLABLE SSANGSIOS WEO CHIEUCH + {0x9CEE, 0xC498}, //4968 #HANGUL SYLLABLE SSANGSIOS WEO KHIEUKH + {0x9CEF, 0xC499}, //4969 #HANGUL SYLLABLE SSANGSIOS WEO THIEUTH + {0x9CF0, 0xC49A}, //4970 #HANGUL SYLLABLE SSANGSIOS WEO PHIEUPH + {0x9CF1, 0xC49B}, //4971 #HANGUL SYLLABLE SSANGSIOS WEO HIEUH + {0x9CF2, 0xC49D}, //4972 #HANGUL SYLLABLE SSANGSIOS WE KIYEOK + {0x9CF3, 0xC49E}, //4973 #HANGUL SYLLABLE SSANGSIOS WE SSANGKIYEOK + {0x9CF4, 0xC49F}, //4974 #HANGUL SYLLABLE SSANGSIOS WE KIYEOKSIOS + {0x9CF5, 0xC4A0}, //4975 #HANGUL SYLLABLE SSANGSIOS WE NIEUN + {0x9CF6, 0xC4A1}, //4976 #HANGUL SYLLABLE SSANGSIOS WE NIEUNCIEUC + {0x9CF7, 0xC4A2}, //4977 #HANGUL SYLLABLE SSANGSIOS WE NIEUNHIEUH + {0x9CF8, 0xC4A3}, //4978 #HANGUL SYLLABLE SSANGSIOS WE TIKEUT + {0x9CF9, 0xC4A4}, //4979 #HANGUL SYLLABLE SSANGSIOS WE RIEUL + {0x9CFA, 0xC4A5}, //4980 #HANGUL SYLLABLE SSANGSIOS WE RIEULKIYEOK + {0x9CFB, 0xC4A6}, //4981 #HANGUL SYLLABLE SSANGSIOS WE RIEULMIEUM + {0x9CFC, 0xC4A7}, //4982 #HANGUL SYLLABLE SSANGSIOS WE RIEULPIEUP + {0x9CFD, 0xC4A8}, //4983 #HANGUL SYLLABLE SSANGSIOS WE RIEULSIOS + {0x9CFE, 0xC4A9}, //4984 #HANGUL SYLLABLE SSANGSIOS WE RIEULTHIEUTH + {0x9D41, 0xC4AA}, //4985 #HANGUL SYLLABLE SSANGSIOS WE RIEULPHIEUPH + {0x9D42, 0xC4AB}, //4986 #HANGUL SYLLABLE SSANGSIOS WE RIEULHIEUH + {0x9D43, 0xC4AC}, //4987 #HANGUL SYLLABLE SSANGSIOS WE MIEUM + {0x9D44, 0xC4AD}, //4988 #HANGUL SYLLABLE SSANGSIOS WE PIEUP + {0x9D45, 0xC4AE}, //4989 #HANGUL SYLLABLE SSANGSIOS WE PIEUPSIOS + {0x9D46, 0xC4AF}, //4990 #HANGUL SYLLABLE SSANGSIOS WE SIOS + {0x9D47, 0xC4B0}, //4991 #HANGUL SYLLABLE SSANGSIOS WE SSANGSIOS + {0x9D48, 0xC4B1}, //4992 #HANGUL SYLLABLE SSANGSIOS WE IEUNG + {0x9D49, 0xC4B2}, //4993 #HANGUL SYLLABLE SSANGSIOS WE CIEUC + {0x9D4A, 0xC4B3}, //4994 #HANGUL SYLLABLE SSANGSIOS WE CHIEUCH + {0x9D4B, 0xC4B4}, //4995 #HANGUL SYLLABLE SSANGSIOS WE KHIEUKH + {0x9D4C, 0xC4B5}, //4996 #HANGUL SYLLABLE SSANGSIOS WE THIEUTH + {0x9D4D, 0xC4B6}, //4997 #HANGUL SYLLABLE SSANGSIOS WE PHIEUPH + {0x9D4E, 0xC4B7}, //4998 #HANGUL SYLLABLE SSANGSIOS WE HIEUH + {0x9D4F, 0xC4B9}, //4999 #HANGUL SYLLABLE SSANGSIOS WI KIYEOK + {0x9D50, 0xC4BA}, //5000 #HANGUL SYLLABLE SSANGSIOS WI SSANGKIYEOK + {0x9D51, 0xC4BB}, //5001 #HANGUL SYLLABLE SSANGSIOS WI KIYEOKSIOS + {0x9D52, 0xC4BD}, //5002 #HANGUL SYLLABLE SSANGSIOS WI NIEUNCIEUC + {0x9D53, 0xC4BE}, //5003 #HANGUL SYLLABLE SSANGSIOS WI NIEUNHIEUH + {0x9D54, 0xC4BF}, //5004 #HANGUL SYLLABLE SSANGSIOS WI TIKEUT + {0x9D55, 0xC4C0}, //5005 #HANGUL SYLLABLE SSANGSIOS WI RIEUL + {0x9D56, 0xC4C1}, //5006 #HANGUL SYLLABLE SSANGSIOS WI RIEULKIYEOK + {0x9D57, 0xC4C2}, //5007 #HANGUL SYLLABLE SSANGSIOS WI RIEULMIEUM + {0x9D58, 0xC4C3}, //5008 #HANGUL SYLLABLE SSANGSIOS WI RIEULPIEUP + {0x9D59, 0xC4C4}, //5009 #HANGUL SYLLABLE SSANGSIOS WI RIEULSIOS + {0x9D5A, 0xC4C5}, //5010 #HANGUL SYLLABLE SSANGSIOS WI RIEULTHIEUTH + {0x9D61, 0xC4C6}, //5011 #HANGUL SYLLABLE SSANGSIOS WI RIEULPHIEUPH + {0x9D62, 0xC4C7}, //5012 #HANGUL SYLLABLE SSANGSIOS WI RIEULHIEUH + {0x9D63, 0xC4C8}, //5013 #HANGUL SYLLABLE SSANGSIOS WI MIEUM + {0x9D64, 0xC4C9}, //5014 #HANGUL SYLLABLE SSANGSIOS WI PIEUP + {0x9D65, 0xC4CA}, //5015 #HANGUL SYLLABLE SSANGSIOS WI PIEUPSIOS + {0x9D66, 0xC4CB}, //5016 #HANGUL SYLLABLE SSANGSIOS WI SIOS + {0x9D67, 0xC4CC}, //5017 #HANGUL SYLLABLE SSANGSIOS WI SSANGSIOS + {0x9D68, 0xC4CD}, //5018 #HANGUL SYLLABLE SSANGSIOS WI IEUNG + {0x9D69, 0xC4CE}, //5019 #HANGUL SYLLABLE SSANGSIOS WI CIEUC + {0x9D6A, 0xC4CF}, //5020 #HANGUL SYLLABLE SSANGSIOS WI CHIEUCH + {0x9D6B, 0xC4D0}, //5021 #HANGUL SYLLABLE SSANGSIOS WI KHIEUKH + {0x9D6C, 0xC4D1}, //5022 #HANGUL SYLLABLE SSANGSIOS WI THIEUTH + {0x9D6D, 0xC4D2}, //5023 #HANGUL SYLLABLE SSANGSIOS WI PHIEUPH + {0x9D6E, 0xC4D3}, //5024 #HANGUL SYLLABLE SSANGSIOS WI HIEUH + {0x9D6F, 0xC4D4}, //5025 #HANGUL SYLLABLE SSANGSIOS YU + {0x9D70, 0xC4D5}, //5026 #HANGUL SYLLABLE SSANGSIOS YU KIYEOK + {0x9D71, 0xC4D6}, //5027 #HANGUL SYLLABLE SSANGSIOS YU SSANGKIYEOK + {0x9D72, 0xC4D7}, //5028 #HANGUL SYLLABLE SSANGSIOS YU KIYEOKSIOS + {0x9D73, 0xC4D8}, //5029 #HANGUL SYLLABLE SSANGSIOS YU NIEUN + {0x9D74, 0xC4D9}, //5030 #HANGUL SYLLABLE SSANGSIOS YU NIEUNCIEUC + {0x9D75, 0xC4DA}, //5031 #HANGUL SYLLABLE SSANGSIOS YU NIEUNHIEUH + {0x9D76, 0xC4DB}, //5032 #HANGUL SYLLABLE SSANGSIOS YU TIKEUT + {0x9D77, 0xC4DC}, //5033 #HANGUL SYLLABLE SSANGSIOS YU RIEUL + {0x9D78, 0xC4DD}, //5034 #HANGUL SYLLABLE SSANGSIOS YU RIEULKIYEOK + {0x9D79, 0xC4DE}, //5035 #HANGUL SYLLABLE SSANGSIOS YU RIEULMIEUM + {0x9D7A, 0xC4DF}, //5036 #HANGUL SYLLABLE SSANGSIOS YU RIEULPIEUP + {0x9D81, 0xC4E0}, //5037 #HANGUL SYLLABLE SSANGSIOS YU RIEULSIOS + {0x9D82, 0xC4E1}, //5038 #HANGUL SYLLABLE SSANGSIOS YU RIEULTHIEUTH + {0x9D83, 0xC4E2}, //5039 #HANGUL SYLLABLE SSANGSIOS YU RIEULPHIEUPH + {0x9D84, 0xC4E3}, //5040 #HANGUL SYLLABLE SSANGSIOS YU RIEULHIEUH + {0x9D85, 0xC4E4}, //5041 #HANGUL SYLLABLE SSANGSIOS YU MIEUM + {0x9D86, 0xC4E5}, //5042 #HANGUL SYLLABLE SSANGSIOS YU PIEUP + {0x9D87, 0xC4E6}, //5043 #HANGUL SYLLABLE SSANGSIOS YU PIEUPSIOS + {0x9D88, 0xC4E7}, //5044 #HANGUL SYLLABLE SSANGSIOS YU SIOS + {0x9D89, 0xC4E8}, //5045 #HANGUL SYLLABLE SSANGSIOS YU SSANGSIOS + {0x9D8A, 0xC4EA}, //5046 #HANGUL SYLLABLE SSANGSIOS YU CIEUC + {0x9D8B, 0xC4EB}, //5047 #HANGUL SYLLABLE SSANGSIOS YU CHIEUCH + {0x9D8C, 0xC4EC}, //5048 #HANGUL SYLLABLE SSANGSIOS YU KHIEUKH + {0x9D8D, 0xC4ED}, //5049 #HANGUL SYLLABLE SSANGSIOS YU THIEUTH + {0x9D8E, 0xC4EE}, //5050 #HANGUL SYLLABLE SSANGSIOS YU PHIEUPH + {0x9D8F, 0xC4EF}, //5051 #HANGUL SYLLABLE SSANGSIOS YU HIEUH + {0x9D90, 0xC4F2}, //5052 #HANGUL SYLLABLE SSANGSIOS EU SSANGKIYEOK + {0x9D91, 0xC4F3}, //5053 #HANGUL SYLLABLE SSANGSIOS EU KIYEOKSIOS + {0x9D92, 0xC4F5}, //5054 #HANGUL SYLLABLE SSANGSIOS EU NIEUNCIEUC + {0x9D93, 0xC4F6}, //5055 #HANGUL SYLLABLE SSANGSIOS EU NIEUNHIEUH + {0x9D94, 0xC4F7}, //5056 #HANGUL SYLLABLE SSANGSIOS EU TIKEUT + {0x9D95, 0xC4F9}, //5057 #HANGUL SYLLABLE SSANGSIOS EU RIEULKIYEOK + {0x9D96, 0xC4FB}, //5058 #HANGUL SYLLABLE SSANGSIOS EU RIEULPIEUP + {0x9D97, 0xC4FC}, //5059 #HANGUL SYLLABLE SSANGSIOS EU RIEULSIOS + {0x9D98, 0xC4FD}, //5060 #HANGUL SYLLABLE SSANGSIOS EU RIEULTHIEUTH + {0x9D99, 0xC4FE}, //5061 #HANGUL SYLLABLE SSANGSIOS EU RIEULPHIEUPH + {0x9D9A, 0xC502}, //5062 #HANGUL SYLLABLE SSANGSIOS EU PIEUPSIOS + {0x9D9B, 0xC503}, //5063 #HANGUL SYLLABLE SSANGSIOS EU SIOS + {0x9D9C, 0xC504}, //5064 #HANGUL SYLLABLE SSANGSIOS EU SSANGSIOS + {0x9D9D, 0xC505}, //5065 #HANGUL SYLLABLE SSANGSIOS EU IEUNG + {0x9D9E, 0xC506}, //5066 #HANGUL SYLLABLE SSANGSIOS EU CIEUC + {0x9D9F, 0xC507}, //5067 #HANGUL SYLLABLE SSANGSIOS EU CHIEUCH + {0x9DA0, 0xC508}, //5068 #HANGUL SYLLABLE SSANGSIOS EU KHIEUKH + {0x9DA1, 0xC509}, //5069 #HANGUL SYLLABLE SSANGSIOS EU THIEUTH + {0x9DA2, 0xC50A}, //5070 #HANGUL SYLLABLE SSANGSIOS EU PHIEUPH + {0x9DA3, 0xC50B}, //5071 #HANGUL SYLLABLE SSANGSIOS EU HIEUH + {0x9DA4, 0xC50D}, //5072 #HANGUL SYLLABLE SSANGSIOS YI KIYEOK + {0x9DA5, 0xC50E}, //5073 #HANGUL SYLLABLE SSANGSIOS YI SSANGKIYEOK + {0x9DA6, 0xC50F}, //5074 #HANGUL SYLLABLE SSANGSIOS YI KIYEOKSIOS + {0x9DA7, 0xC511}, //5075 #HANGUL SYLLABLE SSANGSIOS YI NIEUNCIEUC + {0x9DA8, 0xC512}, //5076 #HANGUL SYLLABLE SSANGSIOS YI NIEUNHIEUH + {0x9DA9, 0xC513}, //5077 #HANGUL SYLLABLE SSANGSIOS YI TIKEUT + {0x9DAA, 0xC515}, //5078 #HANGUL SYLLABLE SSANGSIOS YI RIEULKIYEOK + {0x9DAB, 0xC516}, //5079 #HANGUL SYLLABLE SSANGSIOS YI RIEULMIEUM + {0x9DAC, 0xC517}, //5080 #HANGUL SYLLABLE SSANGSIOS YI RIEULPIEUP + {0x9DAD, 0xC518}, //5081 #HANGUL SYLLABLE SSANGSIOS YI RIEULSIOS + {0x9DAE, 0xC519}, //5082 #HANGUL SYLLABLE SSANGSIOS YI RIEULTHIEUTH + {0x9DAF, 0xC51A}, //5083 #HANGUL SYLLABLE SSANGSIOS YI RIEULPHIEUPH + {0x9DB0, 0xC51B}, //5084 #HANGUL SYLLABLE SSANGSIOS YI RIEULHIEUH + {0x9DB1, 0xC51D}, //5085 #HANGUL SYLLABLE SSANGSIOS YI PIEUP + {0x9DB2, 0xC51E}, //5086 #HANGUL SYLLABLE SSANGSIOS YI PIEUPSIOS + {0x9DB3, 0xC51F}, //5087 #HANGUL SYLLABLE SSANGSIOS YI SIOS + {0x9DB4, 0xC520}, //5088 #HANGUL SYLLABLE SSANGSIOS YI SSANGSIOS + {0x9DB5, 0xC521}, //5089 #HANGUL SYLLABLE SSANGSIOS YI IEUNG + {0x9DB6, 0xC522}, //5090 #HANGUL SYLLABLE SSANGSIOS YI CIEUC + {0x9DB7, 0xC523}, //5091 #HANGUL SYLLABLE SSANGSIOS YI CHIEUCH + {0x9DB8, 0xC524}, //5092 #HANGUL SYLLABLE SSANGSIOS YI KHIEUKH + {0x9DB9, 0xC525}, //5093 #HANGUL SYLLABLE SSANGSIOS YI THIEUTH + {0x9DBA, 0xC526}, //5094 #HANGUL SYLLABLE SSANGSIOS YI PHIEUPH + {0x9DBB, 0xC527}, //5095 #HANGUL SYLLABLE SSANGSIOS YI HIEUH + {0x9DBC, 0xC52A}, //5096 #HANGUL SYLLABLE SSANGSIOS I SSANGKIYEOK + {0x9DBD, 0xC52B}, //5097 #HANGUL SYLLABLE SSANGSIOS I KIYEOKSIOS + {0x9DBE, 0xC52D}, //5098 #HANGUL SYLLABLE SSANGSIOS I NIEUNCIEUC + {0x9DBF, 0xC52E}, //5099 #HANGUL SYLLABLE SSANGSIOS I NIEUNHIEUH + {0x9DC0, 0xC52F}, //5100 #HANGUL SYLLABLE SSANGSIOS I TIKEUT + {0x9DC1, 0xC531}, //5101 #HANGUL SYLLABLE SSANGSIOS I RIEULKIYEOK + {0x9DC2, 0xC532}, //5102 #HANGUL SYLLABLE SSANGSIOS I RIEULMIEUM + {0x9DC3, 0xC533}, //5103 #HANGUL SYLLABLE SSANGSIOS I RIEULPIEUP + {0x9DC4, 0xC534}, //5104 #HANGUL SYLLABLE SSANGSIOS I RIEULSIOS + {0x9DC5, 0xC535}, //5105 #HANGUL SYLLABLE SSANGSIOS I RIEULTHIEUTH + {0x9DC6, 0xC536}, //5106 #HANGUL SYLLABLE SSANGSIOS I RIEULPHIEUPH + {0x9DC7, 0xC537}, //5107 #HANGUL SYLLABLE SSANGSIOS I RIEULHIEUH + {0x9DC8, 0xC53A}, //5108 #HANGUL SYLLABLE SSANGSIOS I PIEUPSIOS + {0x9DC9, 0xC53C}, //5109 #HANGUL SYLLABLE SSANGSIOS I SSANGSIOS + {0x9DCA, 0xC53E}, //5110 #HANGUL SYLLABLE SSANGSIOS I CIEUC + {0x9DCB, 0xC53F}, //5111 #HANGUL SYLLABLE SSANGSIOS I CHIEUCH + {0x9DCC, 0xC540}, //5112 #HANGUL SYLLABLE SSANGSIOS I KHIEUKH + {0x9DCD, 0xC541}, //5113 #HANGUL SYLLABLE SSANGSIOS I THIEUTH + {0x9DCE, 0xC542}, //5114 #HANGUL SYLLABLE SSANGSIOS I PHIEUPH + {0x9DCF, 0xC543}, //5115 #HANGUL SYLLABLE SSANGSIOS I HIEUH + {0x9DD0, 0xC546}, //5116 #HANGUL SYLLABLE IEUNG A SSANGKIYEOK + {0x9DD1, 0xC547}, //5117 #HANGUL SYLLABLE IEUNG A KIYEOKSIOS + {0x9DD2, 0xC54B}, //5118 #HANGUL SYLLABLE IEUNG A TIKEUT + {0x9DD3, 0xC54F}, //5119 #HANGUL SYLLABLE IEUNG A RIEULPIEUP + {0x9DD4, 0xC550}, //5120 #HANGUL SYLLABLE IEUNG A RIEULSIOS + {0x9DD5, 0xC551}, //5121 #HANGUL SYLLABLE IEUNG A RIEULTHIEUTH + {0x9DD6, 0xC552}, //5122 #HANGUL SYLLABLE IEUNG A RIEULPHIEUPH + {0x9DD7, 0xC556}, //5123 #HANGUL SYLLABLE IEUNG A PIEUPSIOS + {0x9DD8, 0xC55A}, //5124 #HANGUL SYLLABLE IEUNG A CIEUC + {0x9DD9, 0xC55B}, //5125 #HANGUL SYLLABLE IEUNG A CHIEUCH + {0x9DDA, 0xC55C}, //5126 #HANGUL SYLLABLE IEUNG A KHIEUKH + {0x9DDB, 0xC55F}, //5127 #HANGUL SYLLABLE IEUNG A HIEUH + {0x9DDC, 0xC562}, //5128 #HANGUL SYLLABLE IEUNG AE SSANGKIYEOK + {0x9DDD, 0xC563}, //5129 #HANGUL SYLLABLE IEUNG AE KIYEOKSIOS + {0x9DDE, 0xC565}, //5130 #HANGUL SYLLABLE IEUNG AE NIEUNCIEUC + {0x9DDF, 0xC566}, //5131 #HANGUL SYLLABLE IEUNG AE NIEUNHIEUH + {0x9DE0, 0xC567}, //5132 #HANGUL SYLLABLE IEUNG AE TIKEUT + {0x9DE1, 0xC569}, //5133 #HANGUL SYLLABLE IEUNG AE RIEULKIYEOK + {0x9DE2, 0xC56A}, //5134 #HANGUL SYLLABLE IEUNG AE RIEULMIEUM + {0x9DE3, 0xC56B}, //5135 #HANGUL SYLLABLE IEUNG AE RIEULPIEUP + {0x9DE4, 0xC56C}, //5136 #HANGUL SYLLABLE IEUNG AE RIEULSIOS + {0x9DE5, 0xC56D}, //5137 #HANGUL SYLLABLE IEUNG AE RIEULTHIEUTH + {0x9DE6, 0xC56E}, //5138 #HANGUL SYLLABLE IEUNG AE RIEULPHIEUPH + {0x9DE7, 0xC56F}, //5139 #HANGUL SYLLABLE IEUNG AE RIEULHIEUH + {0x9DE8, 0xC572}, //5140 #HANGUL SYLLABLE IEUNG AE PIEUPSIOS + {0x9DE9, 0xC576}, //5141 #HANGUL SYLLABLE IEUNG AE CIEUC + {0x9DEA, 0xC577}, //5142 #HANGUL SYLLABLE IEUNG AE CHIEUCH + {0x9DEB, 0xC578}, //5143 #HANGUL SYLLABLE IEUNG AE KHIEUKH + {0x9DEC, 0xC579}, //5144 #HANGUL SYLLABLE IEUNG AE THIEUTH + {0x9DED, 0xC57A}, //5145 #HANGUL SYLLABLE IEUNG AE PHIEUPH + {0x9DEE, 0xC57B}, //5146 #HANGUL SYLLABLE IEUNG AE HIEUH + {0x9DEF, 0xC57E}, //5147 #HANGUL SYLLABLE IEUNG YA SSANGKIYEOK + {0x9DF0, 0xC57F}, //5148 #HANGUL SYLLABLE IEUNG YA KIYEOKSIOS + {0x9DF1, 0xC581}, //5149 #HANGUL SYLLABLE IEUNG YA NIEUNCIEUC + {0x9DF2, 0xC582}, //5150 #HANGUL SYLLABLE IEUNG YA NIEUNHIEUH + {0x9DF3, 0xC583}, //5151 #HANGUL SYLLABLE IEUNG YA TIKEUT + {0x9DF4, 0xC585}, //5152 #HANGUL SYLLABLE IEUNG YA RIEULKIYEOK + {0x9DF5, 0xC586}, //5153 #HANGUL SYLLABLE IEUNG YA RIEULMIEUM + {0x9DF6, 0xC588}, //5154 #HANGUL SYLLABLE IEUNG YA RIEULSIOS + {0x9DF7, 0xC589}, //5155 #HANGUL SYLLABLE IEUNG YA RIEULTHIEUTH + {0x9DF8, 0xC58A}, //5156 #HANGUL SYLLABLE IEUNG YA RIEULPHIEUPH + {0x9DF9, 0xC58B}, //5157 #HANGUL SYLLABLE IEUNG YA RIEULHIEUH + {0x9DFA, 0xC58E}, //5158 #HANGUL SYLLABLE IEUNG YA PIEUPSIOS + {0x9DFB, 0xC590}, //5159 #HANGUL SYLLABLE IEUNG YA SSANGSIOS + {0x9DFC, 0xC592}, //5160 #HANGUL SYLLABLE IEUNG YA CIEUC + {0x9DFD, 0xC593}, //5161 #HANGUL SYLLABLE IEUNG YA CHIEUCH + {0x9DFE, 0xC594}, //5162 #HANGUL SYLLABLE IEUNG YA KHIEUKH + {0x9E41, 0xC596}, //5163 #HANGUL SYLLABLE IEUNG YA PHIEUPH + {0x9E42, 0xC599}, //5164 #HANGUL SYLLABLE IEUNG YAE KIYEOK + {0x9E43, 0xC59A}, //5165 #HANGUL SYLLABLE IEUNG YAE SSANGKIYEOK + {0x9E44, 0xC59B}, //5166 #HANGUL SYLLABLE IEUNG YAE KIYEOKSIOS + {0x9E45, 0xC59D}, //5167 #HANGUL SYLLABLE IEUNG YAE NIEUNCIEUC + {0x9E46, 0xC59E}, //5168 #HANGUL SYLLABLE IEUNG YAE NIEUNHIEUH + {0x9E47, 0xC59F}, //5169 #HANGUL SYLLABLE IEUNG YAE TIKEUT + {0x9E48, 0xC5A1}, //5170 #HANGUL SYLLABLE IEUNG YAE RIEULKIYEOK + {0x9E49, 0xC5A2}, //5171 #HANGUL SYLLABLE IEUNG YAE RIEULMIEUM + {0x9E4A, 0xC5A3}, //5172 #HANGUL SYLLABLE IEUNG YAE RIEULPIEUP + {0x9E4B, 0xC5A4}, //5173 #HANGUL SYLLABLE IEUNG YAE RIEULSIOS + {0x9E4C, 0xC5A5}, //5174 #HANGUL SYLLABLE IEUNG YAE RIEULTHIEUTH + {0x9E4D, 0xC5A6}, //5175 #HANGUL SYLLABLE IEUNG YAE RIEULPHIEUPH + {0x9E4E, 0xC5A7}, //5176 #HANGUL SYLLABLE IEUNG YAE RIEULHIEUH + {0x9E4F, 0xC5A8}, //5177 #HANGUL SYLLABLE IEUNG YAE MIEUM + {0x9E50, 0xC5AA}, //5178 #HANGUL SYLLABLE IEUNG YAE PIEUPSIOS + {0x9E51, 0xC5AB}, //5179 #HANGUL SYLLABLE IEUNG YAE SIOS + {0x9E52, 0xC5AC}, //5180 #HANGUL SYLLABLE IEUNG YAE SSANGSIOS + {0x9E53, 0xC5AD}, //5181 #HANGUL SYLLABLE IEUNG YAE IEUNG + {0x9E54, 0xC5AE}, //5182 #HANGUL SYLLABLE IEUNG YAE CIEUC + {0x9E55, 0xC5AF}, //5183 #HANGUL SYLLABLE IEUNG YAE CHIEUCH + {0x9E56, 0xC5B0}, //5184 #HANGUL SYLLABLE IEUNG YAE KHIEUKH + {0x9E57, 0xC5B1}, //5185 #HANGUL SYLLABLE IEUNG YAE THIEUTH + {0x9E58, 0xC5B2}, //5186 #HANGUL SYLLABLE IEUNG YAE PHIEUPH + {0x9E59, 0xC5B3}, //5187 #HANGUL SYLLABLE IEUNG YAE HIEUH + {0x9E5A, 0xC5B6}, //5188 #HANGUL SYLLABLE IEUNG EO SSANGKIYEOK + {0x9E61, 0xC5B7}, //5189 #HANGUL SYLLABLE IEUNG EO KIYEOKSIOS + {0x9E62, 0xC5BA}, //5190 #HANGUL SYLLABLE IEUNG EO NIEUNHIEUH + {0x9E63, 0xC5BF}, //5191 #HANGUL SYLLABLE IEUNG EO RIEULPIEUP + {0x9E64, 0xC5C0}, //5192 #HANGUL SYLLABLE IEUNG EO RIEULSIOS + {0x9E65, 0xC5C1}, //5193 #HANGUL SYLLABLE IEUNG EO RIEULTHIEUTH + {0x9E66, 0xC5C2}, //5194 #HANGUL SYLLABLE IEUNG EO RIEULPHIEUPH + {0x9E67, 0xC5C3}, //5195 #HANGUL SYLLABLE IEUNG EO RIEULHIEUH + {0x9E68, 0xC5CB}, //5196 #HANGUL SYLLABLE IEUNG EO CHIEUCH + {0x9E69, 0xC5CD}, //5197 #HANGUL SYLLABLE IEUNG EO THIEUTH + {0x9E6A, 0xC5CF}, //5198 #HANGUL SYLLABLE IEUNG EO HIEUH + {0x9E6B, 0xC5D2}, //5199 #HANGUL SYLLABLE IEUNG E SSANGKIYEOK + {0x9E6C, 0xC5D3}, //5200 #HANGUL SYLLABLE IEUNG E KIYEOKSIOS + {0x9E6D, 0xC5D5}, //5201 #HANGUL SYLLABLE IEUNG E NIEUNCIEUC + {0x9E6E, 0xC5D6}, //5202 #HANGUL SYLLABLE IEUNG E NIEUNHIEUH + {0x9E6F, 0xC5D7}, //5203 #HANGUL SYLLABLE IEUNG E TIKEUT + {0x9E70, 0xC5D9}, //5204 #HANGUL SYLLABLE IEUNG E RIEULKIYEOK + {0x9E71, 0xC5DA}, //5205 #HANGUL SYLLABLE IEUNG E RIEULMIEUM + {0x9E72, 0xC5DB}, //5206 #HANGUL SYLLABLE IEUNG E RIEULPIEUP + {0x9E73, 0xC5DC}, //5207 #HANGUL SYLLABLE IEUNG E RIEULSIOS + {0x9E74, 0xC5DD}, //5208 #HANGUL SYLLABLE IEUNG E RIEULTHIEUTH + {0x9E75, 0xC5DE}, //5209 #HANGUL SYLLABLE IEUNG E RIEULPHIEUPH + {0x9E76, 0xC5DF}, //5210 #HANGUL SYLLABLE IEUNG E RIEULHIEUH + {0x9E77, 0xC5E2}, //5211 #HANGUL SYLLABLE IEUNG E PIEUPSIOS + {0x9E78, 0xC5E4}, //5212 #HANGUL SYLLABLE IEUNG E SSANGSIOS + {0x9E79, 0xC5E6}, //5213 #HANGUL SYLLABLE IEUNG E CIEUC + {0x9E7A, 0xC5E7}, //5214 #HANGUL SYLLABLE IEUNG E CHIEUCH + {0x9E81, 0xC5E8}, //5215 #HANGUL SYLLABLE IEUNG E KHIEUKH + {0x9E82, 0xC5E9}, //5216 #HANGUL SYLLABLE IEUNG E THIEUTH + {0x9E83, 0xC5EA}, //5217 #HANGUL SYLLABLE IEUNG E PHIEUPH + {0x9E84, 0xC5EB}, //5218 #HANGUL SYLLABLE IEUNG E HIEUH + {0x9E85, 0xC5EF}, //5219 #HANGUL SYLLABLE IEUNG YEO KIYEOKSIOS + {0x9E86, 0xC5F1}, //5220 #HANGUL SYLLABLE IEUNG YEO NIEUNCIEUC + {0x9E87, 0xC5F2}, //5221 #HANGUL SYLLABLE IEUNG YEO NIEUNHIEUH + {0x9E88, 0xC5F3}, //5222 #HANGUL SYLLABLE IEUNG YEO TIKEUT + {0x9E89, 0xC5F5}, //5223 #HANGUL SYLLABLE IEUNG YEO RIEULKIYEOK + {0x9E8A, 0xC5F8}, //5224 #HANGUL SYLLABLE IEUNG YEO RIEULSIOS + {0x9E8B, 0xC5F9}, //5225 #HANGUL SYLLABLE IEUNG YEO RIEULTHIEUTH + {0x9E8C, 0xC5FA}, //5226 #HANGUL SYLLABLE IEUNG YEO RIEULPHIEUPH + {0x9E8D, 0xC5FB}, //5227 #HANGUL SYLLABLE IEUNG YEO RIEULHIEUH + {0x9E8E, 0xC602}, //5228 #HANGUL SYLLABLE IEUNG YEO CIEUC + {0x9E8F, 0xC603}, //5229 #HANGUL SYLLABLE IEUNG YEO CHIEUCH + {0x9E90, 0xC604}, //5230 #HANGUL SYLLABLE IEUNG YEO KHIEUKH + {0x9E91, 0xC609}, //5231 #HANGUL SYLLABLE IEUNG YE KIYEOK + {0x9E92, 0xC60A}, //5232 #HANGUL SYLLABLE IEUNG YE SSANGKIYEOK + {0x9E93, 0xC60B}, //5233 #HANGUL SYLLABLE IEUNG YE KIYEOKSIOS + {0x9E94, 0xC60D}, //5234 #HANGUL SYLLABLE IEUNG YE NIEUNCIEUC + {0x9E95, 0xC60E}, //5235 #HANGUL SYLLABLE IEUNG YE NIEUNHIEUH + {0x9E96, 0xC60F}, //5236 #HANGUL SYLLABLE IEUNG YE TIKEUT + {0x9E97, 0xC611}, //5237 #HANGUL SYLLABLE IEUNG YE RIEULKIYEOK + {0x9E98, 0xC612}, //5238 #HANGUL SYLLABLE IEUNG YE RIEULMIEUM + {0x9E99, 0xC613}, //5239 #HANGUL SYLLABLE IEUNG YE RIEULPIEUP + {0x9E9A, 0xC614}, //5240 #HANGUL SYLLABLE IEUNG YE RIEULSIOS + {0x9E9B, 0xC615}, //5241 #HANGUL SYLLABLE IEUNG YE RIEULTHIEUTH + {0x9E9C, 0xC616}, //5242 #HANGUL SYLLABLE IEUNG YE RIEULPHIEUPH + {0x9E9D, 0xC617}, //5243 #HANGUL SYLLABLE IEUNG YE RIEULHIEUH + {0x9E9E, 0xC61A}, //5244 #HANGUL SYLLABLE IEUNG YE PIEUPSIOS + {0x9E9F, 0xC61D}, //5245 #HANGUL SYLLABLE IEUNG YE IEUNG + {0x9EA0, 0xC61E}, //5246 #HANGUL SYLLABLE IEUNG YE CIEUC + {0x9EA1, 0xC61F}, //5247 #HANGUL SYLLABLE IEUNG YE CHIEUCH + {0x9EA2, 0xC620}, //5248 #HANGUL SYLLABLE IEUNG YE KHIEUKH + {0x9EA3, 0xC621}, //5249 #HANGUL SYLLABLE IEUNG YE THIEUTH + {0x9EA4, 0xC622}, //5250 #HANGUL SYLLABLE IEUNG YE PHIEUPH + {0x9EA5, 0xC623}, //5251 #HANGUL SYLLABLE IEUNG YE HIEUH + {0x9EA6, 0xC626}, //5252 #HANGUL SYLLABLE IEUNG O SSANGKIYEOK + {0x9EA7, 0xC627}, //5253 #HANGUL SYLLABLE IEUNG O KIYEOKSIOS + {0x9EA8, 0xC629}, //5254 #HANGUL SYLLABLE IEUNG O NIEUNCIEUC + {0x9EA9, 0xC62A}, //5255 #HANGUL SYLLABLE IEUNG O NIEUNHIEUH + {0x9EAA, 0xC62B}, //5256 #HANGUL SYLLABLE IEUNG O TIKEUT + {0x9EAB, 0xC62F}, //5257 #HANGUL SYLLABLE IEUNG O RIEULPIEUP + {0x9EAC, 0xC631}, //5258 #HANGUL SYLLABLE IEUNG O RIEULTHIEUTH + {0x9EAD, 0xC632}, //5259 #HANGUL SYLLABLE IEUNG O RIEULPHIEUPH + {0x9EAE, 0xC636}, //5260 #HANGUL SYLLABLE IEUNG O PIEUPSIOS + {0x9EAF, 0xC638}, //5261 #HANGUL SYLLABLE IEUNG O SSANGSIOS + {0x9EB0, 0xC63A}, //5262 #HANGUL SYLLABLE IEUNG O CIEUC + {0x9EB1, 0xC63C}, //5263 #HANGUL SYLLABLE IEUNG O KHIEUKH + {0x9EB2, 0xC63D}, //5264 #HANGUL SYLLABLE IEUNG O THIEUTH + {0x9EB3, 0xC63E}, //5265 #HANGUL SYLLABLE IEUNG O PHIEUPH + {0x9EB4, 0xC63F}, //5266 #HANGUL SYLLABLE IEUNG O HIEUH + {0x9EB5, 0xC642}, //5267 #HANGUL SYLLABLE IEUNG WA SSANGKIYEOK + {0x9EB6, 0xC643}, //5268 #HANGUL SYLLABLE IEUNG WA KIYEOKSIOS + {0x9EB7, 0xC645}, //5269 #HANGUL SYLLABLE IEUNG WA NIEUNCIEUC + {0x9EB8, 0xC646}, //5270 #HANGUL SYLLABLE IEUNG WA NIEUNHIEUH + {0x9EB9, 0xC647}, //5271 #HANGUL SYLLABLE IEUNG WA TIKEUT + {0x9EBA, 0xC649}, //5272 #HANGUL SYLLABLE IEUNG WA RIEULKIYEOK + {0x9EBB, 0xC64A}, //5273 #HANGUL SYLLABLE IEUNG WA RIEULMIEUM + {0x9EBC, 0xC64B}, //5274 #HANGUL SYLLABLE IEUNG WA RIEULPIEUP + {0x9EBD, 0xC64C}, //5275 #HANGUL SYLLABLE IEUNG WA RIEULSIOS + {0x9EBE, 0xC64D}, //5276 #HANGUL SYLLABLE IEUNG WA RIEULTHIEUTH + {0x9EBF, 0xC64E}, //5277 #HANGUL SYLLABLE IEUNG WA RIEULPHIEUPH + {0x9EC0, 0xC64F}, //5278 #HANGUL SYLLABLE IEUNG WA RIEULHIEUH + {0x9EC1, 0xC652}, //5279 #HANGUL SYLLABLE IEUNG WA PIEUPSIOS + {0x9EC2, 0xC656}, //5280 #HANGUL SYLLABLE IEUNG WA CIEUC + {0x9EC3, 0xC657}, //5281 #HANGUL SYLLABLE IEUNG WA CHIEUCH + {0x9EC4, 0xC658}, //5282 #HANGUL SYLLABLE IEUNG WA KHIEUKH + {0x9EC5, 0xC659}, //5283 #HANGUL SYLLABLE IEUNG WA THIEUTH + {0x9EC6, 0xC65A}, //5284 #HANGUL SYLLABLE IEUNG WA PHIEUPH + {0x9EC7, 0xC65B}, //5285 #HANGUL SYLLABLE IEUNG WA HIEUH + {0x9EC8, 0xC65E}, //5286 #HANGUL SYLLABLE IEUNG WAE SSANGKIYEOK + {0x9EC9, 0xC65F}, //5287 #HANGUL SYLLABLE IEUNG WAE KIYEOKSIOS + {0x9ECA, 0xC661}, //5288 #HANGUL SYLLABLE IEUNG WAE NIEUNCIEUC + {0x9ECB, 0xC662}, //5289 #HANGUL SYLLABLE IEUNG WAE NIEUNHIEUH + {0x9ECC, 0xC663}, //5290 #HANGUL SYLLABLE IEUNG WAE TIKEUT + {0x9ECD, 0xC664}, //5291 #HANGUL SYLLABLE IEUNG WAE RIEUL + {0x9ECE, 0xC665}, //5292 #HANGUL SYLLABLE IEUNG WAE RIEULKIYEOK + {0x9ECF, 0xC666}, //5293 #HANGUL SYLLABLE IEUNG WAE RIEULMIEUM + {0x9ED0, 0xC667}, //5294 #HANGUL SYLLABLE IEUNG WAE RIEULPIEUP + {0x9ED1, 0xC668}, //5295 #HANGUL SYLLABLE IEUNG WAE RIEULSIOS + {0x9ED2, 0xC669}, //5296 #HANGUL SYLLABLE IEUNG WAE RIEULTHIEUTH + {0x9ED3, 0xC66A}, //5297 #HANGUL SYLLABLE IEUNG WAE RIEULPHIEUPH + {0x9ED4, 0xC66B}, //5298 #HANGUL SYLLABLE IEUNG WAE RIEULHIEUH + {0x9ED5, 0xC66D}, //5299 #HANGUL SYLLABLE IEUNG WAE PIEUP + {0x9ED6, 0xC66E}, //5300 #HANGUL SYLLABLE IEUNG WAE PIEUPSIOS + {0x9ED7, 0xC670}, //5301 #HANGUL SYLLABLE IEUNG WAE SSANGSIOS + {0x9ED8, 0xC672}, //5302 #HANGUL SYLLABLE IEUNG WAE CIEUC + {0x9ED9, 0xC673}, //5303 #HANGUL SYLLABLE IEUNG WAE CHIEUCH + {0x9EDA, 0xC674}, //5304 #HANGUL SYLLABLE IEUNG WAE KHIEUKH + {0x9EDB, 0xC675}, //5305 #HANGUL SYLLABLE IEUNG WAE THIEUTH + {0x9EDC, 0xC676}, //5306 #HANGUL SYLLABLE IEUNG WAE PHIEUPH + {0x9EDD, 0xC677}, //5307 #HANGUL SYLLABLE IEUNG WAE HIEUH + {0x9EDE, 0xC67A}, //5308 #HANGUL SYLLABLE IEUNG OE SSANGKIYEOK + {0x9EDF, 0xC67B}, //5309 #HANGUL SYLLABLE IEUNG OE KIYEOKSIOS + {0x9EE0, 0xC67D}, //5310 #HANGUL SYLLABLE IEUNG OE NIEUNCIEUC + {0x9EE1, 0xC67E}, //5311 #HANGUL SYLLABLE IEUNG OE NIEUNHIEUH + {0x9EE2, 0xC67F}, //5312 #HANGUL SYLLABLE IEUNG OE TIKEUT + {0x9EE3, 0xC681}, //5313 #HANGUL SYLLABLE IEUNG OE RIEULKIYEOK + {0x9EE4, 0xC682}, //5314 #HANGUL SYLLABLE IEUNG OE RIEULMIEUM + {0x9EE5, 0xC683}, //5315 #HANGUL SYLLABLE IEUNG OE RIEULPIEUP + {0x9EE6, 0xC684}, //5316 #HANGUL SYLLABLE IEUNG OE RIEULSIOS + {0x9EE7, 0xC685}, //5317 #HANGUL SYLLABLE IEUNG OE RIEULTHIEUTH + {0x9EE8, 0xC686}, //5318 #HANGUL SYLLABLE IEUNG OE RIEULPHIEUPH + {0x9EE9, 0xC687}, //5319 #HANGUL SYLLABLE IEUNG OE RIEULHIEUH + {0x9EEA, 0xC68A}, //5320 #HANGUL SYLLABLE IEUNG OE PIEUPSIOS + {0x9EEB, 0xC68C}, //5321 #HANGUL SYLLABLE IEUNG OE SSANGSIOS + {0x9EEC, 0xC68E}, //5322 #HANGUL SYLLABLE IEUNG OE CIEUC + {0x9EED, 0xC68F}, //5323 #HANGUL SYLLABLE IEUNG OE CHIEUCH + {0x9EEE, 0xC690}, //5324 #HANGUL SYLLABLE IEUNG OE KHIEUKH + {0x9EEF, 0xC691}, //5325 #HANGUL SYLLABLE IEUNG OE THIEUTH + {0x9EF0, 0xC692}, //5326 #HANGUL SYLLABLE IEUNG OE PHIEUPH + {0x9EF1, 0xC693}, //5327 #HANGUL SYLLABLE IEUNG OE HIEUH + {0x9EF2, 0xC696}, //5328 #HANGUL SYLLABLE IEUNG YO SSANGKIYEOK + {0x9EF3, 0xC697}, //5329 #HANGUL SYLLABLE IEUNG YO KIYEOKSIOS + {0x9EF4, 0xC699}, //5330 #HANGUL SYLLABLE IEUNG YO NIEUNCIEUC + {0x9EF5, 0xC69A}, //5331 #HANGUL SYLLABLE IEUNG YO NIEUNHIEUH + {0x9EF6, 0xC69B}, //5332 #HANGUL SYLLABLE IEUNG YO TIKEUT + {0x9EF7, 0xC69D}, //5333 #HANGUL SYLLABLE IEUNG YO RIEULKIYEOK + {0x9EF8, 0xC69E}, //5334 #HANGUL SYLLABLE IEUNG YO RIEULMIEUM + {0x9EF9, 0xC69F}, //5335 #HANGUL SYLLABLE IEUNG YO RIEULPIEUP + {0x9EFA, 0xC6A0}, //5336 #HANGUL SYLLABLE IEUNG YO RIEULSIOS + {0x9EFB, 0xC6A1}, //5337 #HANGUL SYLLABLE IEUNG YO RIEULTHIEUTH + {0x9EFC, 0xC6A2}, //5338 #HANGUL SYLLABLE IEUNG YO RIEULPHIEUPH + {0x9EFD, 0xC6A3}, //5339 #HANGUL SYLLABLE IEUNG YO RIEULHIEUH + {0x9EFE, 0xC6A6}, //5340 #HANGUL SYLLABLE IEUNG YO PIEUPSIOS + {0x9F41, 0xC6A8}, //5341 #HANGUL SYLLABLE IEUNG YO SSANGSIOS + {0x9F42, 0xC6AA}, //5342 #HANGUL SYLLABLE IEUNG YO CIEUC + {0x9F43, 0xC6AB}, //5343 #HANGUL SYLLABLE IEUNG YO CHIEUCH + {0x9F44, 0xC6AC}, //5344 #HANGUL SYLLABLE IEUNG YO KHIEUKH + {0x9F45, 0xC6AD}, //5345 #HANGUL SYLLABLE IEUNG YO THIEUTH + {0x9F46, 0xC6AE}, //5346 #HANGUL SYLLABLE IEUNG YO PHIEUPH + {0x9F47, 0xC6AF}, //5347 #HANGUL SYLLABLE IEUNG YO HIEUH + {0x9F48, 0xC6B2}, //5348 #HANGUL SYLLABLE IEUNG U SSANGKIYEOK + {0x9F49, 0xC6B3}, //5349 #HANGUL SYLLABLE IEUNG U KIYEOKSIOS + {0x9F4A, 0xC6B5}, //5350 #HANGUL SYLLABLE IEUNG U NIEUNCIEUC + {0x9F4B, 0xC6B6}, //5351 #HANGUL SYLLABLE IEUNG U NIEUNHIEUH + {0x9F4C, 0xC6B7}, //5352 #HANGUL SYLLABLE IEUNG U TIKEUT + {0x9F4D, 0xC6BB}, //5353 #HANGUL SYLLABLE IEUNG U RIEULPIEUP + {0x9F4E, 0xC6BC}, //5354 #HANGUL SYLLABLE IEUNG U RIEULSIOS + {0x9F4F, 0xC6BD}, //5355 #HANGUL SYLLABLE IEUNG U RIEULTHIEUTH + {0x9F50, 0xC6BE}, //5356 #HANGUL SYLLABLE IEUNG U RIEULPHIEUPH + {0x9F51, 0xC6BF}, //5357 #HANGUL SYLLABLE IEUNG U RIEULHIEUH + {0x9F52, 0xC6C2}, //5358 #HANGUL SYLLABLE IEUNG U PIEUPSIOS + {0x9F53, 0xC6C4}, //5359 #HANGUL SYLLABLE IEUNG U SSANGSIOS + {0x9F54, 0xC6C6}, //5360 #HANGUL SYLLABLE IEUNG U CIEUC + {0x9F55, 0xC6C7}, //5361 #HANGUL SYLLABLE IEUNG U CHIEUCH + {0x9F56, 0xC6C8}, //5362 #HANGUL SYLLABLE IEUNG U KHIEUKH + {0x9F57, 0xC6C9}, //5363 #HANGUL SYLLABLE IEUNG U THIEUTH + {0x9F58, 0xC6CA}, //5364 #HANGUL SYLLABLE IEUNG U PHIEUPH + {0x9F59, 0xC6CB}, //5365 #HANGUL SYLLABLE IEUNG U HIEUH + {0x9F5A, 0xC6CE}, //5366 #HANGUL SYLLABLE IEUNG WEO SSANGKIYEOK + {0x9F61, 0xC6CF}, //5367 #HANGUL SYLLABLE IEUNG WEO KIYEOKSIOS + {0x9F62, 0xC6D1}, //5368 #HANGUL SYLLABLE IEUNG WEO NIEUNCIEUC + {0x9F63, 0xC6D2}, //5369 #HANGUL SYLLABLE IEUNG WEO NIEUNHIEUH + {0x9F64, 0xC6D3}, //5370 #HANGUL SYLLABLE IEUNG WEO TIKEUT + {0x9F65, 0xC6D5}, //5371 #HANGUL SYLLABLE IEUNG WEO RIEULKIYEOK + {0x9F66, 0xC6D6}, //5372 #HANGUL SYLLABLE IEUNG WEO RIEULMIEUM + {0x9F67, 0xC6D7}, //5373 #HANGUL SYLLABLE IEUNG WEO RIEULPIEUP + {0x9F68, 0xC6D8}, //5374 #HANGUL SYLLABLE IEUNG WEO RIEULSIOS + {0x9F69, 0xC6D9}, //5375 #HANGUL SYLLABLE IEUNG WEO RIEULTHIEUTH + {0x9F6A, 0xC6DA}, //5376 #HANGUL SYLLABLE IEUNG WEO RIEULPHIEUPH + {0x9F6B, 0xC6DB}, //5377 #HANGUL SYLLABLE IEUNG WEO RIEULHIEUH + {0x9F6C, 0xC6DE}, //5378 #HANGUL SYLLABLE IEUNG WEO PIEUPSIOS + {0x9F6D, 0xC6DF}, //5379 #HANGUL SYLLABLE IEUNG WEO SIOS + {0x9F6E, 0xC6E2}, //5380 #HANGUL SYLLABLE IEUNG WEO CIEUC + {0x9F6F, 0xC6E3}, //5381 #HANGUL SYLLABLE IEUNG WEO CHIEUCH + {0x9F70, 0xC6E4}, //5382 #HANGUL SYLLABLE IEUNG WEO KHIEUKH + {0x9F71, 0xC6E5}, //5383 #HANGUL SYLLABLE IEUNG WEO THIEUTH + {0x9F72, 0xC6E6}, //5384 #HANGUL SYLLABLE IEUNG WEO PHIEUPH + {0x9F73, 0xC6E7}, //5385 #HANGUL SYLLABLE IEUNG WEO HIEUH + {0x9F74, 0xC6EA}, //5386 #HANGUL SYLLABLE IEUNG WE SSANGKIYEOK + {0x9F75, 0xC6EB}, //5387 #HANGUL SYLLABLE IEUNG WE KIYEOKSIOS + {0x9F76, 0xC6ED}, //5388 #HANGUL SYLLABLE IEUNG WE NIEUNCIEUC + {0x9F77, 0xC6EE}, //5389 #HANGUL SYLLABLE IEUNG WE NIEUNHIEUH + {0x9F78, 0xC6EF}, //5390 #HANGUL SYLLABLE IEUNG WE TIKEUT + {0x9F79, 0xC6F1}, //5391 #HANGUL SYLLABLE IEUNG WE RIEULKIYEOK + {0x9F7A, 0xC6F2}, //5392 #HANGUL SYLLABLE IEUNG WE RIEULMIEUM + {0x9F81, 0xC6F3}, //5393 #HANGUL SYLLABLE IEUNG WE RIEULPIEUP + {0x9F82, 0xC6F4}, //5394 #HANGUL SYLLABLE IEUNG WE RIEULSIOS + {0x9F83, 0xC6F5}, //5395 #HANGUL SYLLABLE IEUNG WE RIEULTHIEUTH + {0x9F84, 0xC6F6}, //5396 #HANGUL SYLLABLE IEUNG WE RIEULPHIEUPH + {0x9F85, 0xC6F7}, //5397 #HANGUL SYLLABLE IEUNG WE RIEULHIEUH + {0x9F86, 0xC6FA}, //5398 #HANGUL SYLLABLE IEUNG WE PIEUPSIOS + {0x9F87, 0xC6FB}, //5399 #HANGUL SYLLABLE IEUNG WE SIOS + {0x9F88, 0xC6FC}, //5400 #HANGUL SYLLABLE IEUNG WE SSANGSIOS + {0x9F89, 0xC6FE}, //5401 #HANGUL SYLLABLE IEUNG WE CIEUC + {0x9F8A, 0xC6FF}, //5402 #HANGUL SYLLABLE IEUNG WE CHIEUCH + {0x9F8B, 0xC700}, //5403 #HANGUL SYLLABLE IEUNG WE KHIEUKH + {0x9F8C, 0xC701}, //5404 #HANGUL SYLLABLE IEUNG WE THIEUTH + {0x9F8D, 0xC702}, //5405 #HANGUL SYLLABLE IEUNG WE PHIEUPH + {0x9F8E, 0xC703}, //5406 #HANGUL SYLLABLE IEUNG WE HIEUH + {0x9F8F, 0xC706}, //5407 #HANGUL SYLLABLE IEUNG WI SSANGKIYEOK + {0x9F90, 0xC707}, //5408 #HANGUL SYLLABLE IEUNG WI KIYEOKSIOS + {0x9F91, 0xC709}, //5409 #HANGUL SYLLABLE IEUNG WI NIEUNCIEUC + {0x9F92, 0xC70A}, //5410 #HANGUL SYLLABLE IEUNG WI NIEUNHIEUH + {0x9F93, 0xC70B}, //5411 #HANGUL SYLLABLE IEUNG WI TIKEUT + {0x9F94, 0xC70D}, //5412 #HANGUL SYLLABLE IEUNG WI RIEULKIYEOK + {0x9F95, 0xC70E}, //5413 #HANGUL SYLLABLE IEUNG WI RIEULMIEUM + {0x9F96, 0xC70F}, //5414 #HANGUL SYLLABLE IEUNG WI RIEULPIEUP + {0x9F97, 0xC710}, //5415 #HANGUL SYLLABLE IEUNG WI RIEULSIOS + {0x9F98, 0xC711}, //5416 #HANGUL SYLLABLE IEUNG WI RIEULTHIEUTH + {0x9F99, 0xC712}, //5417 #HANGUL SYLLABLE IEUNG WI RIEULPHIEUPH + {0x9F9A, 0xC713}, //5418 #HANGUL SYLLABLE IEUNG WI RIEULHIEUH + {0x9F9B, 0xC716}, //5419 #HANGUL SYLLABLE IEUNG WI PIEUPSIOS + {0x9F9C, 0xC718}, //5420 #HANGUL SYLLABLE IEUNG WI SSANGSIOS + {0x9F9D, 0xC71A}, //5421 #HANGUL SYLLABLE IEUNG WI CIEUC + {0x9F9E, 0xC71B}, //5422 #HANGUL SYLLABLE IEUNG WI CHIEUCH + {0x9F9F, 0xC71C}, //5423 #HANGUL SYLLABLE IEUNG WI KHIEUKH + {0x9FA0, 0xC71D}, //5424 #HANGUL SYLLABLE IEUNG WI THIEUTH + {0x9FA1, 0xC71E}, //5425 #HANGUL SYLLABLE IEUNG WI PHIEUPH + {0x9FA2, 0xC71F}, //5426 #HANGUL SYLLABLE IEUNG WI HIEUH + {0x9FA3, 0xC722}, //5427 #HANGUL SYLLABLE IEUNG YU SSANGKIYEOK + {0x9FA4, 0xC723}, //5428 #HANGUL SYLLABLE IEUNG YU KIYEOKSIOS + {0x9FA5, 0xC725}, //5429 #HANGUL SYLLABLE IEUNG YU NIEUNCIEUC + {0x9FA6, 0xC726}, //5430 #HANGUL SYLLABLE IEUNG YU NIEUNHIEUH + {0x9FA7, 0xC727}, //5431 #HANGUL SYLLABLE IEUNG YU TIKEUT + {0x9FA8, 0xC729}, //5432 #HANGUL SYLLABLE IEUNG YU RIEULKIYEOK + {0x9FA9, 0xC72A}, //5433 #HANGUL SYLLABLE IEUNG YU RIEULMIEUM + {0x9FAA, 0xC72B}, //5434 #HANGUL SYLLABLE IEUNG YU RIEULPIEUP + {0x9FAB, 0xC72C}, //5435 #HANGUL SYLLABLE IEUNG YU RIEULSIOS + {0x9FAC, 0xC72D}, //5436 #HANGUL SYLLABLE IEUNG YU RIEULTHIEUTH + {0x9FAD, 0xC72E}, //5437 #HANGUL SYLLABLE IEUNG YU RIEULPHIEUPH + {0x9FAE, 0xC72F}, //5438 #HANGUL SYLLABLE IEUNG YU RIEULHIEUH + {0x9FAF, 0xC732}, //5439 #HANGUL SYLLABLE IEUNG YU PIEUPSIOS + {0x9FB0, 0xC734}, //5440 #HANGUL SYLLABLE IEUNG YU SSANGSIOS + {0x9FB1, 0xC736}, //5441 #HANGUL SYLLABLE IEUNG YU CIEUC + {0x9FB2, 0xC738}, //5442 #HANGUL SYLLABLE IEUNG YU KHIEUKH + {0x9FB3, 0xC739}, //5443 #HANGUL SYLLABLE IEUNG YU THIEUTH + {0x9FB4, 0xC73A}, //5444 #HANGUL SYLLABLE IEUNG YU PHIEUPH + {0x9FB5, 0xC73B}, //5445 #HANGUL SYLLABLE IEUNG YU HIEUH + {0x9FB6, 0xC73E}, //5446 #HANGUL SYLLABLE IEUNG EU SSANGKIYEOK + {0x9FB7, 0xC73F}, //5447 #HANGUL SYLLABLE IEUNG EU KIYEOKSIOS + {0x9FB8, 0xC741}, //5448 #HANGUL SYLLABLE IEUNG EU NIEUNCIEUC + {0x9FB9, 0xC742}, //5449 #HANGUL SYLLABLE IEUNG EU NIEUNHIEUH + {0x9FBA, 0xC743}, //5450 #HANGUL SYLLABLE IEUNG EU TIKEUT + {0x9FBB, 0xC745}, //5451 #HANGUL SYLLABLE IEUNG EU RIEULKIYEOK + {0x9FBC, 0xC746}, //5452 #HANGUL SYLLABLE IEUNG EU RIEULMIEUM + {0x9FBD, 0xC747}, //5453 #HANGUL SYLLABLE IEUNG EU RIEULPIEUP + {0x9FBE, 0xC748}, //5454 #HANGUL SYLLABLE IEUNG EU RIEULSIOS + {0x9FBF, 0xC749}, //5455 #HANGUL SYLLABLE IEUNG EU RIEULTHIEUTH + {0x9FC0, 0xC74B}, //5456 #HANGUL SYLLABLE IEUNG EU RIEULHIEUH + {0x9FC1, 0xC74E}, //5457 #HANGUL SYLLABLE IEUNG EU PIEUPSIOS + {0x9FC2, 0xC750}, //5458 #HANGUL SYLLABLE IEUNG EU SSANGSIOS + {0x9FC3, 0xC759}, //5459 #HANGUL SYLLABLE IEUNG YI KIYEOK + {0x9FC4, 0xC75A}, //5460 #HANGUL SYLLABLE IEUNG YI SSANGKIYEOK + {0x9FC5, 0xC75B}, //5461 #HANGUL SYLLABLE IEUNG YI KIYEOKSIOS + {0x9FC6, 0xC75D}, //5462 #HANGUL SYLLABLE IEUNG YI NIEUNCIEUC + {0x9FC7, 0xC75E}, //5463 #HANGUL SYLLABLE IEUNG YI NIEUNHIEUH + {0x9FC8, 0xC75F}, //5464 #HANGUL SYLLABLE IEUNG YI TIKEUT + {0x9FC9, 0xC761}, //5465 #HANGUL SYLLABLE IEUNG YI RIEULKIYEOK + {0x9FCA, 0xC762}, //5466 #HANGUL SYLLABLE IEUNG YI RIEULMIEUM + {0x9FCB, 0xC763}, //5467 #HANGUL SYLLABLE IEUNG YI RIEULPIEUP + {0x9FCC, 0xC764}, //5468 #HANGUL SYLLABLE IEUNG YI RIEULSIOS + {0x9FCD, 0xC765}, //5469 #HANGUL SYLLABLE IEUNG YI RIEULTHIEUTH + {0x9FCE, 0xC766}, //5470 #HANGUL SYLLABLE IEUNG YI RIEULPHIEUPH + {0x9FCF, 0xC767}, //5471 #HANGUL SYLLABLE IEUNG YI RIEULHIEUH + {0x9FD0, 0xC769}, //5472 #HANGUL SYLLABLE IEUNG YI PIEUP + {0x9FD1, 0xC76A}, //5473 #HANGUL SYLLABLE IEUNG YI PIEUPSIOS + {0x9FD2, 0xC76C}, //5474 #HANGUL SYLLABLE IEUNG YI SSANGSIOS + {0x9FD3, 0xC76D}, //5475 #HANGUL SYLLABLE IEUNG YI IEUNG + {0x9FD4, 0xC76E}, //5476 #HANGUL SYLLABLE IEUNG YI CIEUC + {0x9FD5, 0xC76F}, //5477 #HANGUL SYLLABLE IEUNG YI CHIEUCH + {0x9FD6, 0xC770}, //5478 #HANGUL SYLLABLE IEUNG YI KHIEUKH + {0x9FD7, 0xC771}, //5479 #HANGUL SYLLABLE IEUNG YI THIEUTH + {0x9FD8, 0xC772}, //5480 #HANGUL SYLLABLE IEUNG YI PHIEUPH + {0x9FD9, 0xC773}, //5481 #HANGUL SYLLABLE IEUNG YI HIEUH + {0x9FDA, 0xC776}, //5482 #HANGUL SYLLABLE IEUNG I SSANGKIYEOK + {0x9FDB, 0xC777}, //5483 #HANGUL SYLLABLE IEUNG I KIYEOKSIOS + {0x9FDC, 0xC779}, //5484 #HANGUL SYLLABLE IEUNG I NIEUNCIEUC + {0x9FDD, 0xC77A}, //5485 #HANGUL SYLLABLE IEUNG I NIEUNHIEUH + {0x9FDE, 0xC77B}, //5486 #HANGUL SYLLABLE IEUNG I TIKEUT + {0x9FDF, 0xC77F}, //5487 #HANGUL SYLLABLE IEUNG I RIEULPIEUP + {0x9FE0, 0xC780}, //5488 #HANGUL SYLLABLE IEUNG I RIEULSIOS + {0x9FE1, 0xC781}, //5489 #HANGUL SYLLABLE IEUNG I RIEULTHIEUTH + {0x9FE2, 0xC782}, //5490 #HANGUL SYLLABLE IEUNG I RIEULPHIEUPH + {0x9FE3, 0xC786}, //5491 #HANGUL SYLLABLE IEUNG I PIEUPSIOS + {0x9FE4, 0xC78B}, //5492 #HANGUL SYLLABLE IEUNG I CHIEUCH + {0x9FE5, 0xC78C}, //5493 #HANGUL SYLLABLE IEUNG I KHIEUKH + {0x9FE6, 0xC78D}, //5494 #HANGUL SYLLABLE IEUNG I THIEUTH + {0x9FE7, 0xC78F}, //5495 #HANGUL SYLLABLE IEUNG I HIEUH + {0x9FE8, 0xC792}, //5496 #HANGUL SYLLABLE CIEUC A SSANGKIYEOK + {0x9FE9, 0xC793}, //5497 #HANGUL SYLLABLE CIEUC A KIYEOKSIOS + {0x9FEA, 0xC795}, //5498 #HANGUL SYLLABLE CIEUC A NIEUNCIEUC + {0x9FEB, 0xC799}, //5499 #HANGUL SYLLABLE CIEUC A RIEULKIYEOK + {0x9FEC, 0xC79B}, //5500 #HANGUL SYLLABLE CIEUC A RIEULPIEUP + {0x9FED, 0xC79C}, //5501 #HANGUL SYLLABLE CIEUC A RIEULSIOS + {0x9FEE, 0xC79D}, //5502 #HANGUL SYLLABLE CIEUC A RIEULTHIEUTH + {0x9FEF, 0xC79E}, //5503 #HANGUL SYLLABLE CIEUC A RIEULPHIEUPH + {0x9FF0, 0xC79F}, //5504 #HANGUL SYLLABLE CIEUC A RIEULHIEUH + {0x9FF1, 0xC7A2}, //5505 #HANGUL SYLLABLE CIEUC A PIEUPSIOS + {0x9FF2, 0xC7A7}, //5506 #HANGUL SYLLABLE CIEUC A CHIEUCH + {0x9FF3, 0xC7A8}, //5507 #HANGUL SYLLABLE CIEUC A KHIEUKH + {0x9FF4, 0xC7A9}, //5508 #HANGUL SYLLABLE CIEUC A THIEUTH + {0x9FF5, 0xC7AA}, //5509 #HANGUL SYLLABLE CIEUC A PHIEUPH + {0x9FF6, 0xC7AB}, //5510 #HANGUL SYLLABLE CIEUC A HIEUH + {0x9FF7, 0xC7AE}, //5511 #HANGUL SYLLABLE CIEUC AE SSANGKIYEOK + {0x9FF8, 0xC7AF}, //5512 #HANGUL SYLLABLE CIEUC AE KIYEOKSIOS + {0x9FF9, 0xC7B1}, //5513 #HANGUL SYLLABLE CIEUC AE NIEUNCIEUC + {0x9FFA, 0xC7B2}, //5514 #HANGUL SYLLABLE CIEUC AE NIEUNHIEUH + {0x9FFB, 0xC7B3}, //5515 #HANGUL SYLLABLE CIEUC AE TIKEUT + {0x9FFC, 0xC7B5}, //5516 #HANGUL SYLLABLE CIEUC AE RIEULKIYEOK + {0x9FFD, 0xC7B6}, //5517 #HANGUL SYLLABLE CIEUC AE RIEULMIEUM + {0x9FFE, 0xC7B7}, //5518 #HANGUL SYLLABLE CIEUC AE RIEULPIEUP + {0xA041, 0xC7B8}, //5519 #HANGUL SYLLABLE CIEUC AE RIEULSIOS + {0xA042, 0xC7B9}, //5520 #HANGUL SYLLABLE CIEUC AE RIEULTHIEUTH + {0xA043, 0xC7BA}, //5521 #HANGUL SYLLABLE CIEUC AE RIEULPHIEUPH + {0xA044, 0xC7BB}, //5522 #HANGUL SYLLABLE CIEUC AE RIEULHIEUH + {0xA045, 0xC7BE}, //5523 #HANGUL SYLLABLE CIEUC AE PIEUPSIOS + {0xA046, 0xC7C2}, //5524 #HANGUL SYLLABLE CIEUC AE CIEUC + {0xA047, 0xC7C3}, //5525 #HANGUL SYLLABLE CIEUC AE CHIEUCH + {0xA048, 0xC7C4}, //5526 #HANGUL SYLLABLE CIEUC AE KHIEUKH + {0xA049, 0xC7C5}, //5527 #HANGUL SYLLABLE CIEUC AE THIEUTH + {0xA04A, 0xC7C6}, //5528 #HANGUL SYLLABLE CIEUC AE PHIEUPH + {0xA04B, 0xC7C7}, //5529 #HANGUL SYLLABLE CIEUC AE HIEUH + {0xA04C, 0xC7CA}, //5530 #HANGUL SYLLABLE CIEUC YA SSANGKIYEOK + {0xA04D, 0xC7CB}, //5531 #HANGUL SYLLABLE CIEUC YA KIYEOKSIOS + {0xA04E, 0xC7CD}, //5532 #HANGUL SYLLABLE CIEUC YA NIEUNCIEUC + {0xA04F, 0xC7CF}, //5533 #HANGUL SYLLABLE CIEUC YA TIKEUT + {0xA050, 0xC7D1}, //5534 #HANGUL SYLLABLE CIEUC YA RIEULKIYEOK + {0xA051, 0xC7D2}, //5535 #HANGUL SYLLABLE CIEUC YA RIEULMIEUM + {0xA052, 0xC7D3}, //5536 #HANGUL SYLLABLE CIEUC YA RIEULPIEUP + {0xA053, 0xC7D4}, //5537 #HANGUL SYLLABLE CIEUC YA RIEULSIOS + {0xA054, 0xC7D5}, //5538 #HANGUL SYLLABLE CIEUC YA RIEULTHIEUTH + {0xA055, 0xC7D6}, //5539 #HANGUL SYLLABLE CIEUC YA RIEULPHIEUPH + {0xA056, 0xC7D7}, //5540 #HANGUL SYLLABLE CIEUC YA RIEULHIEUH + {0xA057, 0xC7D9}, //5541 #HANGUL SYLLABLE CIEUC YA PIEUP + {0xA058, 0xC7DA}, //5542 #HANGUL SYLLABLE CIEUC YA PIEUPSIOS + {0xA059, 0xC7DB}, //5543 #HANGUL SYLLABLE CIEUC YA SIOS + {0xA05A, 0xC7DC}, //5544 #HANGUL SYLLABLE CIEUC YA SSANGSIOS + {0xA061, 0xC7DE}, //5545 #HANGUL SYLLABLE CIEUC YA CIEUC + {0xA062, 0xC7DF}, //5546 #HANGUL SYLLABLE CIEUC YA CHIEUCH + {0xA063, 0xC7E0}, //5547 #HANGUL SYLLABLE CIEUC YA KHIEUKH + {0xA064, 0xC7E1}, //5548 #HANGUL SYLLABLE CIEUC YA THIEUTH + {0xA065, 0xC7E2}, //5549 #HANGUL SYLLABLE CIEUC YA PHIEUPH + {0xA066, 0xC7E3}, //5550 #HANGUL SYLLABLE CIEUC YA HIEUH + {0xA067, 0xC7E5}, //5551 #HANGUL SYLLABLE CIEUC YAE KIYEOK + {0xA068, 0xC7E6}, //5552 #HANGUL SYLLABLE CIEUC YAE SSANGKIYEOK + {0xA069, 0xC7E7}, //5553 #HANGUL SYLLABLE CIEUC YAE KIYEOKSIOS + {0xA06A, 0xC7E9}, //5554 #HANGUL SYLLABLE CIEUC YAE NIEUNCIEUC + {0xA06B, 0xC7EA}, //5555 #HANGUL SYLLABLE CIEUC YAE NIEUNHIEUH + {0xA06C, 0xC7EB}, //5556 #HANGUL SYLLABLE CIEUC YAE TIKEUT + {0xA06D, 0xC7ED}, //5557 #HANGUL SYLLABLE CIEUC YAE RIEULKIYEOK + {0xA06E, 0xC7EE}, //5558 #HANGUL SYLLABLE CIEUC YAE RIEULMIEUM + {0xA06F, 0xC7EF}, //5559 #HANGUL SYLLABLE CIEUC YAE RIEULPIEUP + {0xA070, 0xC7F0}, //5560 #HANGUL SYLLABLE CIEUC YAE RIEULSIOS + {0xA071, 0xC7F1}, //5561 #HANGUL SYLLABLE CIEUC YAE RIEULTHIEUTH + {0xA072, 0xC7F2}, //5562 #HANGUL SYLLABLE CIEUC YAE RIEULPHIEUPH + {0xA073, 0xC7F3}, //5563 #HANGUL SYLLABLE CIEUC YAE RIEULHIEUH + {0xA074, 0xC7F4}, //5564 #HANGUL SYLLABLE CIEUC YAE MIEUM + {0xA075, 0xC7F5}, //5565 #HANGUL SYLLABLE CIEUC YAE PIEUP + {0xA076, 0xC7F6}, //5566 #HANGUL SYLLABLE CIEUC YAE PIEUPSIOS + {0xA077, 0xC7F7}, //5567 #HANGUL SYLLABLE CIEUC YAE SIOS + {0xA078, 0xC7F8}, //5568 #HANGUL SYLLABLE CIEUC YAE SSANGSIOS + {0xA079, 0xC7F9}, //5569 #HANGUL SYLLABLE CIEUC YAE IEUNG + {0xA07A, 0xC7FA}, //5570 #HANGUL SYLLABLE CIEUC YAE CIEUC + {0xA081, 0xC7FB}, //5571 #HANGUL SYLLABLE CIEUC YAE CHIEUCH + {0xA082, 0xC7FC}, //5572 #HANGUL SYLLABLE CIEUC YAE KHIEUKH + {0xA083, 0xC7FD}, //5573 #HANGUL SYLLABLE CIEUC YAE THIEUTH + {0xA084, 0xC7FE}, //5574 #HANGUL SYLLABLE CIEUC YAE PHIEUPH + {0xA085, 0xC7FF}, //5575 #HANGUL SYLLABLE CIEUC YAE HIEUH + {0xA086, 0xC802}, //5576 #HANGUL SYLLABLE CIEUC EO SSANGKIYEOK + {0xA087, 0xC803}, //5577 #HANGUL SYLLABLE CIEUC EO KIYEOKSIOS + {0xA088, 0xC805}, //5578 #HANGUL SYLLABLE CIEUC EO NIEUNCIEUC + {0xA089, 0xC806}, //5579 #HANGUL SYLLABLE CIEUC EO NIEUNHIEUH + {0xA08A, 0xC807}, //5580 #HANGUL SYLLABLE CIEUC EO TIKEUT + {0xA08B, 0xC809}, //5581 #HANGUL SYLLABLE CIEUC EO RIEULKIYEOK + {0xA08C, 0xC80B}, //5582 #HANGUL SYLLABLE CIEUC EO RIEULPIEUP + {0xA08D, 0xC80C}, //5583 #HANGUL SYLLABLE CIEUC EO RIEULSIOS + {0xA08E, 0xC80D}, //5584 #HANGUL SYLLABLE CIEUC EO RIEULTHIEUTH + {0xA08F, 0xC80E}, //5585 #HANGUL SYLLABLE CIEUC EO RIEULPHIEUPH + {0xA090, 0xC80F}, //5586 #HANGUL SYLLABLE CIEUC EO RIEULHIEUH + {0xA091, 0xC812}, //5587 #HANGUL SYLLABLE CIEUC EO PIEUPSIOS + {0xA092, 0xC814}, //5588 #HANGUL SYLLABLE CIEUC EO SSANGSIOS + {0xA093, 0xC817}, //5589 #HANGUL SYLLABLE CIEUC EO CHIEUCH + {0xA094, 0xC818}, //5590 #HANGUL SYLLABLE CIEUC EO KHIEUKH + {0xA095, 0xC819}, //5591 #HANGUL SYLLABLE CIEUC EO THIEUTH + {0xA096, 0xC81A}, //5592 #HANGUL SYLLABLE CIEUC EO PHIEUPH + {0xA097, 0xC81B}, //5593 #HANGUL SYLLABLE CIEUC EO HIEUH + {0xA098, 0xC81E}, //5594 #HANGUL SYLLABLE CIEUC E SSANGKIYEOK + {0xA099, 0xC81F}, //5595 #HANGUL SYLLABLE CIEUC E KIYEOKSIOS + {0xA09A, 0xC821}, //5596 #HANGUL SYLLABLE CIEUC E NIEUNCIEUC + {0xA09B, 0xC822}, //5597 #HANGUL SYLLABLE CIEUC E NIEUNHIEUH + {0xA09C, 0xC823}, //5598 #HANGUL SYLLABLE CIEUC E TIKEUT + {0xA09D, 0xC825}, //5599 #HANGUL SYLLABLE CIEUC E RIEULKIYEOK + {0xA09E, 0xC826}, //5600 #HANGUL SYLLABLE CIEUC E RIEULMIEUM + {0xA09F, 0xC827}, //5601 #HANGUL SYLLABLE CIEUC E RIEULPIEUP + {0xA0A0, 0xC828}, //5602 #HANGUL SYLLABLE CIEUC E RIEULSIOS + {0xA0A1, 0xC829}, //5603 #HANGUL SYLLABLE CIEUC E RIEULTHIEUTH + {0xA0A2, 0xC82A}, //5604 #HANGUL SYLLABLE CIEUC E RIEULPHIEUPH + {0xA0A3, 0xC82B}, //5605 #HANGUL SYLLABLE CIEUC E RIEULHIEUH + {0xA0A4, 0xC82E}, //5606 #HANGUL SYLLABLE CIEUC E PIEUPSIOS + {0xA0A5, 0xC830}, //5607 #HANGUL SYLLABLE CIEUC E SSANGSIOS + {0xA0A6, 0xC832}, //5608 #HANGUL SYLLABLE CIEUC E CIEUC + {0xA0A7, 0xC833}, //5609 #HANGUL SYLLABLE CIEUC E CHIEUCH + {0xA0A8, 0xC834}, //5610 #HANGUL SYLLABLE CIEUC E KHIEUKH + {0xA0A9, 0xC835}, //5611 #HANGUL SYLLABLE CIEUC E THIEUTH + {0xA0AA, 0xC836}, //5612 #HANGUL SYLLABLE CIEUC E PHIEUPH + {0xA0AB, 0xC837}, //5613 #HANGUL SYLLABLE CIEUC E HIEUH + {0xA0AC, 0xC839}, //5614 #HANGUL SYLLABLE CIEUC YEO KIYEOK + {0xA0AD, 0xC83A}, //5615 #HANGUL SYLLABLE CIEUC YEO SSANGKIYEOK + {0xA0AE, 0xC83B}, //5616 #HANGUL SYLLABLE CIEUC YEO KIYEOKSIOS + {0xA0AF, 0xC83D}, //5617 #HANGUL SYLLABLE CIEUC YEO NIEUNCIEUC + {0xA0B0, 0xC83E}, //5618 #HANGUL SYLLABLE CIEUC YEO NIEUNHIEUH + {0xA0B1, 0xC83F}, //5619 #HANGUL SYLLABLE CIEUC YEO TIKEUT + {0xA0B2, 0xC841}, //5620 #HANGUL SYLLABLE CIEUC YEO RIEULKIYEOK + {0xA0B3, 0xC842}, //5621 #HANGUL SYLLABLE CIEUC YEO RIEULMIEUM + {0xA0B4, 0xC843}, //5622 #HANGUL SYLLABLE CIEUC YEO RIEULPIEUP + {0xA0B5, 0xC844}, //5623 #HANGUL SYLLABLE CIEUC YEO RIEULSIOS + {0xA0B6, 0xC845}, //5624 #HANGUL SYLLABLE CIEUC YEO RIEULTHIEUTH + {0xA0B7, 0xC846}, //5625 #HANGUL SYLLABLE CIEUC YEO RIEULPHIEUPH + {0xA0B8, 0xC847}, //5626 #HANGUL SYLLABLE CIEUC YEO RIEULHIEUH + {0xA0B9, 0xC84A}, //5627 #HANGUL SYLLABLE CIEUC YEO PIEUPSIOS + {0xA0BA, 0xC84B}, //5628 #HANGUL SYLLABLE CIEUC YEO SIOS + {0xA0BB, 0xC84E}, //5629 #HANGUL SYLLABLE CIEUC YEO CIEUC + {0xA0BC, 0xC84F}, //5630 #HANGUL SYLLABLE CIEUC YEO CHIEUCH + {0xA0BD, 0xC850}, //5631 #HANGUL SYLLABLE CIEUC YEO KHIEUKH + {0xA0BE, 0xC851}, //5632 #HANGUL SYLLABLE CIEUC YEO THIEUTH + {0xA0BF, 0xC852}, //5633 #HANGUL SYLLABLE CIEUC YEO PHIEUPH + {0xA0C0, 0xC853}, //5634 #HANGUL SYLLABLE CIEUC YEO HIEUH + {0xA0C1, 0xC855}, //5635 #HANGUL SYLLABLE CIEUC YE KIYEOK + {0xA0C2, 0xC856}, //5636 #HANGUL SYLLABLE CIEUC YE SSANGKIYEOK + {0xA0C3, 0xC857}, //5637 #HANGUL SYLLABLE CIEUC YE KIYEOKSIOS + {0xA0C4, 0xC858}, //5638 #HANGUL SYLLABLE CIEUC YE NIEUN + {0xA0C5, 0xC859}, //5639 #HANGUL SYLLABLE CIEUC YE NIEUNCIEUC + {0xA0C6, 0xC85A}, //5640 #HANGUL SYLLABLE CIEUC YE NIEUNHIEUH + {0xA0C7, 0xC85B}, //5641 #HANGUL SYLLABLE CIEUC YE TIKEUT + {0xA0C8, 0xC85C}, //5642 #HANGUL SYLLABLE CIEUC YE RIEUL + {0xA0C9, 0xC85D}, //5643 #HANGUL SYLLABLE CIEUC YE RIEULKIYEOK + {0xA0CA, 0xC85E}, //5644 #HANGUL SYLLABLE CIEUC YE RIEULMIEUM + {0xA0CB, 0xC85F}, //5645 #HANGUL SYLLABLE CIEUC YE RIEULPIEUP + {0xA0CC, 0xC860}, //5646 #HANGUL SYLLABLE CIEUC YE RIEULSIOS + {0xA0CD, 0xC861}, //5647 #HANGUL SYLLABLE CIEUC YE RIEULTHIEUTH + {0xA0CE, 0xC862}, //5648 #HANGUL SYLLABLE CIEUC YE RIEULPHIEUPH + {0xA0CF, 0xC863}, //5649 #HANGUL SYLLABLE CIEUC YE RIEULHIEUH + {0xA0D0, 0xC864}, //5650 #HANGUL SYLLABLE CIEUC YE MIEUM + {0xA0D1, 0xC865}, //5651 #HANGUL SYLLABLE CIEUC YE PIEUP + {0xA0D2, 0xC866}, //5652 #HANGUL SYLLABLE CIEUC YE PIEUPSIOS + {0xA0D3, 0xC867}, //5653 #HANGUL SYLLABLE CIEUC YE SIOS + {0xA0D4, 0xC868}, //5654 #HANGUL SYLLABLE CIEUC YE SSANGSIOS + {0xA0D5, 0xC869}, //5655 #HANGUL SYLLABLE CIEUC YE IEUNG + {0xA0D6, 0xC86A}, //5656 #HANGUL SYLLABLE CIEUC YE CIEUC + {0xA0D7, 0xC86B}, //5657 #HANGUL SYLLABLE CIEUC YE CHIEUCH + {0xA0D8, 0xC86C}, //5658 #HANGUL SYLLABLE CIEUC YE KHIEUKH + {0xA0D9, 0xC86D}, //5659 #HANGUL SYLLABLE CIEUC YE THIEUTH + {0xA0DA, 0xC86E}, //5660 #HANGUL SYLLABLE CIEUC YE PHIEUPH + {0xA0DB, 0xC86F}, //5661 #HANGUL SYLLABLE CIEUC YE HIEUH + {0xA0DC, 0xC872}, //5662 #HANGUL SYLLABLE CIEUC O SSANGKIYEOK + {0xA0DD, 0xC873}, //5663 #HANGUL SYLLABLE CIEUC O KIYEOKSIOS + {0xA0DE, 0xC875}, //5664 #HANGUL SYLLABLE CIEUC O NIEUNCIEUC + {0xA0DF, 0xC876}, //5665 #HANGUL SYLLABLE CIEUC O NIEUNHIEUH + {0xA0E0, 0xC877}, //5666 #HANGUL SYLLABLE CIEUC O TIKEUT + {0xA0E1, 0xC879}, //5667 #HANGUL SYLLABLE CIEUC O RIEULKIYEOK + {0xA0E2, 0xC87B}, //5668 #HANGUL SYLLABLE CIEUC O RIEULPIEUP + {0xA0E3, 0xC87C}, //5669 #HANGUL SYLLABLE CIEUC O RIEULSIOS + {0xA0E4, 0xC87D}, //5670 #HANGUL SYLLABLE CIEUC O RIEULTHIEUTH + {0xA0E5, 0xC87E}, //5671 #HANGUL SYLLABLE CIEUC O RIEULPHIEUPH + {0xA0E6, 0xC87F}, //5672 #HANGUL SYLLABLE CIEUC O RIEULHIEUH + {0xA0E7, 0xC882}, //5673 #HANGUL SYLLABLE CIEUC O PIEUPSIOS + {0xA0E8, 0xC884}, //5674 #HANGUL SYLLABLE CIEUC O SSANGSIOS + {0xA0E9, 0xC888}, //5675 #HANGUL SYLLABLE CIEUC O KHIEUKH + {0xA0EA, 0xC889}, //5676 #HANGUL SYLLABLE CIEUC O THIEUTH + {0xA0EB, 0xC88A}, //5677 #HANGUL SYLLABLE CIEUC O PHIEUPH + {0xA0EC, 0xC88E}, //5678 #HANGUL SYLLABLE CIEUC WA SSANGKIYEOK + {0xA0ED, 0xC88F}, //5679 #HANGUL SYLLABLE CIEUC WA KIYEOKSIOS + {0xA0EE, 0xC890}, //5680 #HANGUL SYLLABLE CIEUC WA NIEUN + {0xA0EF, 0xC891}, //5681 #HANGUL SYLLABLE CIEUC WA NIEUNCIEUC + {0xA0F0, 0xC892}, //5682 #HANGUL SYLLABLE CIEUC WA NIEUNHIEUH + {0xA0F1, 0xC893}, //5683 #HANGUL SYLLABLE CIEUC WA TIKEUT + {0xA0F2, 0xC895}, //5684 #HANGUL SYLLABLE CIEUC WA RIEULKIYEOK + {0xA0F3, 0xC896}, //5685 #HANGUL SYLLABLE CIEUC WA RIEULMIEUM + {0xA0F4, 0xC897}, //5686 #HANGUL SYLLABLE CIEUC WA RIEULPIEUP + {0xA0F5, 0xC898}, //5687 #HANGUL SYLLABLE CIEUC WA RIEULSIOS + {0xA0F6, 0xC899}, //5688 #HANGUL SYLLABLE CIEUC WA RIEULTHIEUTH + {0xA0F7, 0xC89A}, //5689 #HANGUL SYLLABLE CIEUC WA RIEULPHIEUPH + {0xA0F8, 0xC89B}, //5690 #HANGUL SYLLABLE CIEUC WA RIEULHIEUH + {0xA0F9, 0xC89C}, //5691 #HANGUL SYLLABLE CIEUC WA MIEUM + {0xA0FA, 0xC89E}, //5692 #HANGUL SYLLABLE CIEUC WA PIEUPSIOS + {0xA0FB, 0xC8A0}, //5693 #HANGUL SYLLABLE CIEUC WA SSANGSIOS + {0xA0FC, 0xC8A2}, //5694 #HANGUL SYLLABLE CIEUC WA CIEUC + {0xA0FD, 0xC8A3}, //5695 #HANGUL SYLLABLE CIEUC WA CHIEUCH + {0xA0FE, 0xC8A4}, //5696 #HANGUL SYLLABLE CIEUC WA KHIEUKH + {0xA141, 0xC8A5}, //5697 #HANGUL SYLLABLE CIEUC WA THIEUTH + {0xA142, 0xC8A6}, //5698 #HANGUL SYLLABLE CIEUC WA PHIEUPH + {0xA143, 0xC8A7}, //5699 #HANGUL SYLLABLE CIEUC WA HIEUH + {0xA144, 0xC8A9}, //5700 #HANGUL SYLLABLE CIEUC WAE KIYEOK + {0xA145, 0xC8AA}, //5701 #HANGUL SYLLABLE CIEUC WAE SSANGKIYEOK + {0xA146, 0xC8AB}, //5702 #HANGUL SYLLABLE CIEUC WAE KIYEOKSIOS + {0xA147, 0xC8AC}, //5703 #HANGUL SYLLABLE CIEUC WAE NIEUN + {0xA148, 0xC8AD}, //5704 #HANGUL SYLLABLE CIEUC WAE NIEUNCIEUC + {0xA149, 0xC8AE}, //5705 #HANGUL SYLLABLE CIEUC WAE NIEUNHIEUH + {0xA14A, 0xC8AF}, //5706 #HANGUL SYLLABLE CIEUC WAE TIKEUT + {0xA14B, 0xC8B0}, //5707 #HANGUL SYLLABLE CIEUC WAE RIEUL + {0xA14C, 0xC8B1}, //5708 #HANGUL SYLLABLE CIEUC WAE RIEULKIYEOK + {0xA14D, 0xC8B2}, //5709 #HANGUL SYLLABLE CIEUC WAE RIEULMIEUM + {0xA14E, 0xC8B3}, //5710 #HANGUL SYLLABLE CIEUC WAE RIEULPIEUP + {0xA14F, 0xC8B4}, //5711 #HANGUL SYLLABLE CIEUC WAE RIEULSIOS + {0xA150, 0xC8B5}, //5712 #HANGUL SYLLABLE CIEUC WAE RIEULTHIEUTH + {0xA151, 0xC8B6}, //5713 #HANGUL SYLLABLE CIEUC WAE RIEULPHIEUPH + {0xA152, 0xC8B7}, //5714 #HANGUL SYLLABLE CIEUC WAE RIEULHIEUH + {0xA153, 0xC8B8}, //5715 #HANGUL SYLLABLE CIEUC WAE MIEUM + {0xA154, 0xC8B9}, //5716 #HANGUL SYLLABLE CIEUC WAE PIEUP + {0xA155, 0xC8BA}, //5717 #HANGUL SYLLABLE CIEUC WAE PIEUPSIOS + {0xA156, 0xC8BB}, //5718 #HANGUL SYLLABLE CIEUC WAE SIOS + {0xA157, 0xC8BE}, //5719 #HANGUL SYLLABLE CIEUC WAE CIEUC + {0xA158, 0xC8BF}, //5720 #HANGUL SYLLABLE CIEUC WAE CHIEUCH + {0xA159, 0xC8C0}, //5721 #HANGUL SYLLABLE CIEUC WAE KHIEUKH + {0xA15A, 0xC8C1}, //5722 #HANGUL SYLLABLE CIEUC WAE THIEUTH + {0xA161, 0xC8C2}, //5723 #HANGUL SYLLABLE CIEUC WAE PHIEUPH + {0xA162, 0xC8C3}, //5724 #HANGUL SYLLABLE CIEUC WAE HIEUH + {0xA163, 0xC8C5}, //5725 #HANGUL SYLLABLE CIEUC OE KIYEOK + {0xA164, 0xC8C6}, //5726 #HANGUL SYLLABLE CIEUC OE SSANGKIYEOK + {0xA165, 0xC8C7}, //5727 #HANGUL SYLLABLE CIEUC OE KIYEOKSIOS + {0xA166, 0xC8C9}, //5728 #HANGUL SYLLABLE CIEUC OE NIEUNCIEUC + {0xA167, 0xC8CA}, //5729 #HANGUL SYLLABLE CIEUC OE NIEUNHIEUH + {0xA168, 0xC8CB}, //5730 #HANGUL SYLLABLE CIEUC OE TIKEUT + {0xA169, 0xC8CD}, //5731 #HANGUL SYLLABLE CIEUC OE RIEULKIYEOK + {0xA16A, 0xC8CE}, //5732 #HANGUL SYLLABLE CIEUC OE RIEULMIEUM + {0xA16B, 0xC8CF}, //5733 #HANGUL SYLLABLE CIEUC OE RIEULPIEUP + {0xA16C, 0xC8D0}, //5734 #HANGUL SYLLABLE CIEUC OE RIEULSIOS + {0xA16D, 0xC8D1}, //5735 #HANGUL SYLLABLE CIEUC OE RIEULTHIEUTH + {0xA16E, 0xC8D2}, //5736 #HANGUL SYLLABLE CIEUC OE RIEULPHIEUPH + {0xA16F, 0xC8D3}, //5737 #HANGUL SYLLABLE CIEUC OE RIEULHIEUH + {0xA170, 0xC8D6}, //5738 #HANGUL SYLLABLE CIEUC OE PIEUPSIOS + {0xA171, 0xC8D8}, //5739 #HANGUL SYLLABLE CIEUC OE SSANGSIOS + {0xA172, 0xC8DA}, //5740 #HANGUL SYLLABLE CIEUC OE CIEUC + {0xA173, 0xC8DB}, //5741 #HANGUL SYLLABLE CIEUC OE CHIEUCH + {0xA174, 0xC8DC}, //5742 #HANGUL SYLLABLE CIEUC OE KHIEUKH + {0xA175, 0xC8DD}, //5743 #HANGUL SYLLABLE CIEUC OE THIEUTH + {0xA176, 0xC8DE}, //5744 #HANGUL SYLLABLE CIEUC OE PHIEUPH + {0xA177, 0xC8DF}, //5745 #HANGUL SYLLABLE CIEUC OE HIEUH + {0xA178, 0xC8E2}, //5746 #HANGUL SYLLABLE CIEUC YO SSANGKIYEOK + {0xA179, 0xC8E3}, //5747 #HANGUL SYLLABLE CIEUC YO KIYEOKSIOS + {0xA17A, 0xC8E5}, //5748 #HANGUL SYLLABLE CIEUC YO NIEUNCIEUC + {0xA181, 0xC8E6}, //5749 #HANGUL SYLLABLE CIEUC YO NIEUNHIEUH + {0xA182, 0xC8E7}, //5750 #HANGUL SYLLABLE CIEUC YO TIKEUT + {0xA183, 0xC8E8}, //5751 #HANGUL SYLLABLE CIEUC YO RIEUL + {0xA184, 0xC8E9}, //5752 #HANGUL SYLLABLE CIEUC YO RIEULKIYEOK + {0xA185, 0xC8EA}, //5753 #HANGUL SYLLABLE CIEUC YO RIEULMIEUM + {0xA186, 0xC8EB}, //5754 #HANGUL SYLLABLE CIEUC YO RIEULPIEUP + {0xA187, 0xC8EC}, //5755 #HANGUL SYLLABLE CIEUC YO RIEULSIOS + {0xA188, 0xC8ED}, //5756 #HANGUL SYLLABLE CIEUC YO RIEULTHIEUTH + {0xA189, 0xC8EE}, //5757 #HANGUL SYLLABLE CIEUC YO RIEULPHIEUPH + {0xA18A, 0xC8EF}, //5758 #HANGUL SYLLABLE CIEUC YO RIEULHIEUH + {0xA18B, 0xC8F0}, //5759 #HANGUL SYLLABLE CIEUC YO MIEUM + {0xA18C, 0xC8F1}, //5760 #HANGUL SYLLABLE CIEUC YO PIEUP + {0xA18D, 0xC8F2}, //5761 #HANGUL SYLLABLE CIEUC YO PIEUPSIOS + {0xA18E, 0xC8F3}, //5762 #HANGUL SYLLABLE CIEUC YO SIOS + {0xA18F, 0xC8F4}, //5763 #HANGUL SYLLABLE CIEUC YO SSANGSIOS + {0xA190, 0xC8F6}, //5764 #HANGUL SYLLABLE CIEUC YO CIEUC + {0xA191, 0xC8F7}, //5765 #HANGUL SYLLABLE CIEUC YO CHIEUCH + {0xA192, 0xC8F8}, //5766 #HANGUL SYLLABLE CIEUC YO KHIEUKH + {0xA193, 0xC8F9}, //5767 #HANGUL SYLLABLE CIEUC YO THIEUTH + {0xA194, 0xC8FA}, //5768 #HANGUL SYLLABLE CIEUC YO PHIEUPH + {0xA195, 0xC8FB}, //5769 #HANGUL SYLLABLE CIEUC YO HIEUH + {0xA196, 0xC8FE}, //5770 #HANGUL SYLLABLE CIEUC U SSANGKIYEOK + {0xA197, 0xC8FF}, //5771 #HANGUL SYLLABLE CIEUC U KIYEOKSIOS + {0xA198, 0xC901}, //5772 #HANGUL SYLLABLE CIEUC U NIEUNCIEUC + {0xA199, 0xC902}, //5773 #HANGUL SYLLABLE CIEUC U NIEUNHIEUH + {0xA19A, 0xC903}, //5774 #HANGUL SYLLABLE CIEUC U TIKEUT + {0xA19B, 0xC907}, //5775 #HANGUL SYLLABLE CIEUC U RIEULPIEUP + {0xA19C, 0xC908}, //5776 #HANGUL SYLLABLE CIEUC U RIEULSIOS + {0xA19D, 0xC909}, //5777 #HANGUL SYLLABLE CIEUC U RIEULTHIEUTH + {0xA19E, 0xC90A}, //5778 #HANGUL SYLLABLE CIEUC U RIEULPHIEUPH + {0xA19F, 0xC90B}, //5779 #HANGUL SYLLABLE CIEUC U RIEULHIEUH + {0xA1A0, 0xC90E}, //5780 #HANGUL SYLLABLE CIEUC U PIEUPSIOS + {0xA1A1, 0x3000}, //5781 #IDEOGRAPHIC SPACE + {0xA1A2, 0x3001}, //5782 #IDEOGRAPHIC COMMA + {0xA1A3, 0x3002}, //5783 #IDEOGRAPHIC FULL STOP + {0xA1A4, 0x00B7}, //5784 #MIDDLE DOT + {0xA1A5, 0x2025}, //5785 #TWO DOT LEADER + {0xA1A6, 0x2026}, //5786 #HORIZONTAL ELLIPSIS + {0xA1A7, 0x00A8}, //5787 #DIAERESIS + {0xA1A8, 0x3003}, //5788 #DITTO MARK + {0xA1A9, 0x00AD}, //5789 #SOFT HYPHEN + {0xA1AA, 0x2015}, //5790 #HORIZONTAL BAR + {0xA1AB, 0x2225}, //5791 #PARALLEL TO + {0xA1AC, 0xFF3C}, //5792 #FULLWIDTH REVERSE SOLIDUS + {0xA1AD, 0x223C}, //5793 #TILDE OPERATOR + {0xA1AE, 0x2018}, //5794 #LEFT SINGLE QUOTATION MARK + {0xA1AF, 0x2019}, //5795 #RIGHT SINGLE QUOTATION MARK + {0xA1B0, 0x201C}, //5796 #LEFT DOUBLE QUOTATION MARK + {0xA1B1, 0x201D}, //5797 #RIGHT DOUBLE QUOTATION MARK + {0xA1B2, 0x3014}, //5798 #LEFT TORTOISE SHELL BRACKET + {0xA1B3, 0x3015}, //5799 #RIGHT TORTOISE SHELL BRACKET + {0xA1B4, 0x3008}, //5800 #LEFT ANGLE BRACKET + {0xA1B5, 0x3009}, //5801 #RIGHT ANGLE BRACKET + {0xA1B6, 0x300A}, //5802 #LEFT DOUBLE ANGLE BRACKET + {0xA1B7, 0x300B}, //5803 #RIGHT DOUBLE ANGLE BRACKET + {0xA1B8, 0x300C}, //5804 #LEFT CORNER BRACKET + {0xA1B9, 0x300D}, //5805 #RIGHT CORNER BRACKET + {0xA1BA, 0x300E}, //5806 #LEFT WHITE CORNER BRACKET + {0xA1BB, 0x300F}, //5807 #RIGHT WHITE CORNER BRACKET + {0xA1BC, 0x3010}, //5808 #LEFT BLACK LENTICULAR BRACKET + {0xA1BD, 0x3011}, //5809 #RIGHT BLACK LENTICULAR BRACKET + {0xA1BE, 0x00B1}, //5810 #PLUS-MINUS SIGN + {0xA1BF, 0x00D7}, //5811 #MULTIPLICATION SIGN + {0xA1C0, 0x00F7}, //5812 #DIVISION SIGN + {0xA1C1, 0x2260}, //5813 #NOT EQUAL TO + {0xA1C2, 0x2264}, //5814 #LESS-THAN OR EQUAL TO + {0xA1C3, 0x2265}, //5815 #GREATER-THAN OR EQUAL TO + {0xA1C4, 0x221E}, //5816 #INFINITY + {0xA1C5, 0x2234}, //5817 #THEREFORE + {0xA1C6, 0x00B0}, //5818 #DEGREE SIGN + {0xA1C7, 0x2032}, //5819 #PRIME + {0xA1C8, 0x2033}, //5820 #DOUBLE PRIME + {0xA1C9, 0x2103}, //5821 #DEGREE CELSIUS + {0xA1CA, 0x212B}, //5822 #ANGSTROM SIGN + {0xA1CB, 0xFFE0}, //5823 #FULLWIDTH CENT SIGN + {0xA1CC, 0xFFE1}, //5824 #FULLWIDTH POUND SIGN + {0xA1CD, 0xFFE5}, //5825 #FULLWIDTH YEN SIGN + {0xA1CE, 0x2642}, //5826 #MALE SIGN + {0xA1CF, 0x2640}, //5827 #FEMALE SIGN + {0xA1D0, 0x2220}, //5828 #ANGLE + {0xA1D1, 0x22A5}, //5829 #UP TACK + {0xA1D2, 0x2312}, //5830 #ARC + {0xA1D3, 0x2202}, //5831 #PARTIAL DIFFERENTIAL + {0xA1D4, 0x2207}, //5832 #NABLA + {0xA1D5, 0x2261}, //5833 #IDENTICAL TO + {0xA1D6, 0x2252}, //5834 #APPROXIMATELY EQUAL TO OR THE IMAGE OF + {0xA1D7, 0x00A7}, //5835 #SECTION SIGN + {0xA1D8, 0x203B}, //5836 #REFERENCE MARK + {0xA1D9, 0x2606}, //5837 #WHITE STAR + {0xA1DA, 0x2605}, //5838 #BLACK STAR + {0xA1DB, 0x25CB}, //5839 #WHITE CIRCLE + {0xA1DC, 0x25CF}, //5840 #BLACK CIRCLE + {0xA1DD, 0x25CE}, //5841 #BULLSEYE + {0xA1DE, 0x25C7}, //5842 #WHITE DIAMOND + {0xA1DF, 0x25C6}, //5843 #BLACK DIAMOND + {0xA1E0, 0x25A1}, //5844 #WHITE SQUARE + {0xA1E1, 0x25A0}, //5845 #BLACK SQUARE + {0xA1E2, 0x25B3}, //5846 #WHITE UP-POINTING TRIANGLE + {0xA1E3, 0x25B2}, //5847 #BLACK UP-POINTING TRIANGLE + {0xA1E4, 0x25BD}, //5848 #WHITE DOWN-POINTING TRIANGLE + {0xA1E5, 0x25BC}, //5849 #BLACK DOWN-POINTING TRIANGLE + {0xA1E6, 0x2192}, //5850 #RIGHTWARDS ARROW + {0xA1E7, 0x2190}, //5851 #LEFTWARDS ARROW + {0xA1E8, 0x2191}, //5852 #UPWARDS ARROW + {0xA1E9, 0x2193}, //5853 #DOWNWARDS ARROW + {0xA1EA, 0x2194}, //5854 #LEFT RIGHT ARROW + {0xA1EB, 0x3013}, //5855 #GETA MARK + {0xA1EC, 0x226A}, //5856 #MUCH LESS-THAN + {0xA1ED, 0x226B}, //5857 #MUCH GREATER-THAN + {0xA1EE, 0x221A}, //5858 #SQUARE ROOT + {0xA1EF, 0x223D}, //5859 #REVERSED TILDE + {0xA1F0, 0x221D}, //5860 #PROPORTIONAL TO + {0xA1F1, 0x2235}, //5861 #BECAUSE + {0xA1F2, 0x222B}, //5862 #INTEGRAL + {0xA1F3, 0x222C}, //5863 #DOUBLE INTEGRAL + {0xA1F4, 0x2208}, //5864 #ELEMENT OF + {0xA1F5, 0x220B}, //5865 #CONTAINS AS MEMBER + {0xA1F6, 0x2286}, //5866 #SUBSET OF OR EQUAL TO + {0xA1F7, 0x2287}, //5867 #SUPERSET OF OR EQUAL TO + {0xA1F8, 0x2282}, //5868 #SUBSET OF + {0xA1F9, 0x2283}, //5869 #SUPERSET OF + {0xA1FA, 0x222A}, //5870 #UNION + {0xA1FB, 0x2229}, //5871 #INTERSECTION + {0xA1FC, 0x2227}, //5872 #LOGICAL AND + {0xA1FD, 0x2228}, //5873 #LOGICAL OR + {0xA1FE, 0xFFE2}, //5874 #FULLWIDTH NOT SIGN + {0xA241, 0xC910}, //5875 #HANGUL SYLLABLE CIEUC U SSANGSIOS + {0xA242, 0xC912}, //5876 #HANGUL SYLLABLE CIEUC U CIEUC + {0xA243, 0xC913}, //5877 #HANGUL SYLLABLE CIEUC U CHIEUCH + {0xA244, 0xC914}, //5878 #HANGUL SYLLABLE CIEUC U KHIEUKH + {0xA245, 0xC915}, //5879 #HANGUL SYLLABLE CIEUC U THIEUTH + {0xA246, 0xC916}, //5880 #HANGUL SYLLABLE CIEUC U PHIEUPH + {0xA247, 0xC917}, //5881 #HANGUL SYLLABLE CIEUC U HIEUH + {0xA248, 0xC919}, //5882 #HANGUL SYLLABLE CIEUC WEO KIYEOK + {0xA249, 0xC91A}, //5883 #HANGUL SYLLABLE CIEUC WEO SSANGKIYEOK + {0xA24A, 0xC91B}, //5884 #HANGUL SYLLABLE CIEUC WEO KIYEOKSIOS + {0xA24B, 0xC91C}, //5885 #HANGUL SYLLABLE CIEUC WEO NIEUN + {0xA24C, 0xC91D}, //5886 #HANGUL SYLLABLE CIEUC WEO NIEUNCIEUC + {0xA24D, 0xC91E}, //5887 #HANGUL SYLLABLE CIEUC WEO NIEUNHIEUH + {0xA24E, 0xC91F}, //5888 #HANGUL SYLLABLE CIEUC WEO TIKEUT + {0xA24F, 0xC920}, //5889 #HANGUL SYLLABLE CIEUC WEO RIEUL + {0xA250, 0xC921}, //5890 #HANGUL SYLLABLE CIEUC WEO RIEULKIYEOK + {0xA251, 0xC922}, //5891 #HANGUL SYLLABLE CIEUC WEO RIEULMIEUM + {0xA252, 0xC923}, //5892 #HANGUL SYLLABLE CIEUC WEO RIEULPIEUP + {0xA253, 0xC924}, //5893 #HANGUL SYLLABLE CIEUC WEO RIEULSIOS + {0xA254, 0xC925}, //5894 #HANGUL SYLLABLE CIEUC WEO RIEULTHIEUTH + {0xA255, 0xC926}, //5895 #HANGUL SYLLABLE CIEUC WEO RIEULPHIEUPH + {0xA256, 0xC927}, //5896 #HANGUL SYLLABLE CIEUC WEO RIEULHIEUH + {0xA257, 0xC928}, //5897 #HANGUL SYLLABLE CIEUC WEO MIEUM + {0xA258, 0xC929}, //5898 #HANGUL SYLLABLE CIEUC WEO PIEUP + {0xA259, 0xC92A}, //5899 #HANGUL SYLLABLE CIEUC WEO PIEUPSIOS + {0xA25A, 0xC92B}, //5900 #HANGUL SYLLABLE CIEUC WEO SIOS + {0xA261, 0xC92D}, //5901 #HANGUL SYLLABLE CIEUC WEO IEUNG + {0xA262, 0xC92E}, //5902 #HANGUL SYLLABLE CIEUC WEO CIEUC + {0xA263, 0xC92F}, //5903 #HANGUL SYLLABLE CIEUC WEO CHIEUCH + {0xA264, 0xC930}, //5904 #HANGUL SYLLABLE CIEUC WEO KHIEUKH + {0xA265, 0xC931}, //5905 #HANGUL SYLLABLE CIEUC WEO THIEUTH + {0xA266, 0xC932}, //5906 #HANGUL SYLLABLE CIEUC WEO PHIEUPH + {0xA267, 0xC933}, //5907 #HANGUL SYLLABLE CIEUC WEO HIEUH + {0xA268, 0xC935}, //5908 #HANGUL SYLLABLE CIEUC WE KIYEOK + {0xA269, 0xC936}, //5909 #HANGUL SYLLABLE CIEUC WE SSANGKIYEOK + {0xA26A, 0xC937}, //5910 #HANGUL SYLLABLE CIEUC WE KIYEOKSIOS + {0xA26B, 0xC938}, //5911 #HANGUL SYLLABLE CIEUC WE NIEUN + {0xA26C, 0xC939}, //5912 #HANGUL SYLLABLE CIEUC WE NIEUNCIEUC + {0xA26D, 0xC93A}, //5913 #HANGUL SYLLABLE CIEUC WE NIEUNHIEUH + {0xA26E, 0xC93B}, //5914 #HANGUL SYLLABLE CIEUC WE TIKEUT + {0xA26F, 0xC93C}, //5915 #HANGUL SYLLABLE CIEUC WE RIEUL + {0xA270, 0xC93D}, //5916 #HANGUL SYLLABLE CIEUC WE RIEULKIYEOK + {0xA271, 0xC93E}, //5917 #HANGUL SYLLABLE CIEUC WE RIEULMIEUM + {0xA272, 0xC93F}, //5918 #HANGUL SYLLABLE CIEUC WE RIEULPIEUP + {0xA273, 0xC940}, //5919 #HANGUL SYLLABLE CIEUC WE RIEULSIOS + {0xA274, 0xC941}, //5920 #HANGUL SYLLABLE CIEUC WE RIEULTHIEUTH + {0xA275, 0xC942}, //5921 #HANGUL SYLLABLE CIEUC WE RIEULPHIEUPH + {0xA276, 0xC943}, //5922 #HANGUL SYLLABLE CIEUC WE RIEULHIEUH + {0xA277, 0xC944}, //5923 #HANGUL SYLLABLE CIEUC WE MIEUM + {0xA278, 0xC945}, //5924 #HANGUL SYLLABLE CIEUC WE PIEUP + {0xA279, 0xC946}, //5925 #HANGUL SYLLABLE CIEUC WE PIEUPSIOS + {0xA27A, 0xC947}, //5926 #HANGUL SYLLABLE CIEUC WE SIOS + {0xA281, 0xC948}, //5927 #HANGUL SYLLABLE CIEUC WE SSANGSIOS + {0xA282, 0xC949}, //5928 #HANGUL SYLLABLE CIEUC WE IEUNG + {0xA283, 0xC94A}, //5929 #HANGUL SYLLABLE CIEUC WE CIEUC + {0xA284, 0xC94B}, //5930 #HANGUL SYLLABLE CIEUC WE CHIEUCH + {0xA285, 0xC94C}, //5931 #HANGUL SYLLABLE CIEUC WE KHIEUKH + {0xA286, 0xC94D}, //5932 #HANGUL SYLLABLE CIEUC WE THIEUTH + {0xA287, 0xC94E}, //5933 #HANGUL SYLLABLE CIEUC WE PHIEUPH + {0xA288, 0xC94F}, //5934 #HANGUL SYLLABLE CIEUC WE HIEUH + {0xA289, 0xC952}, //5935 #HANGUL SYLLABLE CIEUC WI SSANGKIYEOK + {0xA28A, 0xC953}, //5936 #HANGUL SYLLABLE CIEUC WI KIYEOKSIOS + {0xA28B, 0xC955}, //5937 #HANGUL SYLLABLE CIEUC WI NIEUNCIEUC + {0xA28C, 0xC956}, //5938 #HANGUL SYLLABLE CIEUC WI NIEUNHIEUH + {0xA28D, 0xC957}, //5939 #HANGUL SYLLABLE CIEUC WI TIKEUT + {0xA28E, 0xC959}, //5940 #HANGUL SYLLABLE CIEUC WI RIEULKIYEOK + {0xA28F, 0xC95A}, //5941 #HANGUL SYLLABLE CIEUC WI RIEULMIEUM + {0xA290, 0xC95B}, //5942 #HANGUL SYLLABLE CIEUC WI RIEULPIEUP + {0xA291, 0xC95C}, //5943 #HANGUL SYLLABLE CIEUC WI RIEULSIOS + {0xA292, 0xC95D}, //5944 #HANGUL SYLLABLE CIEUC WI RIEULTHIEUTH + {0xA293, 0xC95E}, //5945 #HANGUL SYLLABLE CIEUC WI RIEULPHIEUPH + {0xA294, 0xC95F}, //5946 #HANGUL SYLLABLE CIEUC WI RIEULHIEUH + {0xA295, 0xC962}, //5947 #HANGUL SYLLABLE CIEUC WI PIEUPSIOS + {0xA296, 0xC964}, //5948 #HANGUL SYLLABLE CIEUC WI SSANGSIOS + {0xA297, 0xC965}, //5949 #HANGUL SYLLABLE CIEUC WI IEUNG + {0xA298, 0xC966}, //5950 #HANGUL SYLLABLE CIEUC WI CIEUC + {0xA299, 0xC967}, //5951 #HANGUL SYLLABLE CIEUC WI CHIEUCH + {0xA29A, 0xC968}, //5952 #HANGUL SYLLABLE CIEUC WI KHIEUKH + {0xA29B, 0xC969}, //5953 #HANGUL SYLLABLE CIEUC WI THIEUTH + {0xA29C, 0xC96A}, //5954 #HANGUL SYLLABLE CIEUC WI PHIEUPH + {0xA29D, 0xC96B}, //5955 #HANGUL SYLLABLE CIEUC WI HIEUH + {0xA29E, 0xC96D}, //5956 #HANGUL SYLLABLE CIEUC YU KIYEOK + {0xA29F, 0xC96E}, //5957 #HANGUL SYLLABLE CIEUC YU SSANGKIYEOK + {0xA2A0, 0xC96F}, //5958 #HANGUL SYLLABLE CIEUC YU KIYEOKSIOS + {0xA2A1, 0x21D2}, //5959 #RIGHTWARDS DOUBLE ARROW + {0xA2A2, 0x21D4}, //5960 #LEFT RIGHT DOUBLE ARROW + {0xA2A3, 0x2200}, //5961 #FOR ALL + {0xA2A4, 0x2203}, //5962 #THERE EXISTS + {0xA2A5, 0x00B4}, //5963 #ACUTE ACCENT + {0xA2A6, 0xFF5E}, //5964 #FULLWIDTH TILDE + {0xA2A7, 0x02C7}, //5965 #CARON + {0xA2A8, 0x02D8}, //5966 #BREVE + {0xA2A9, 0x02DD}, //5967 #DOUBLE ACUTE ACCENT + {0xA2AA, 0x02DA}, //5968 #RING ABOVE + {0xA2AB, 0x02D9}, //5969 #DOT ABOVE + {0xA2AC, 0x00B8}, //5970 #CEDILLA + {0xA2AD, 0x02DB}, //5971 #OGONEK + {0xA2AE, 0x00A1}, //5972 #INVERTED EXCLAMATION MARK + {0xA2AF, 0x00BF}, //5973 #INVERTED QUESTION MARK + {0xA2B0, 0x02D0}, //5974 #MODIFIER LETTER TRIANGULAR COLON + {0xA2B1, 0x222E}, //5975 #CONTOUR INTEGRAL + {0xA2B2, 0x2211}, //5976 #N-ARY SUMMATION + {0xA2B3, 0x220F}, //5977 #N-ARY PRODUCT + {0xA2B4, 0x00A4}, //5978 #CURRENCY SIGN + {0xA2B5, 0x2109}, //5979 #DEGREE FAHRENHEIT + {0xA2B6, 0x2030}, //5980 #PER MILLE SIGN + {0xA2B7, 0x25C1}, //5981 #WHITE LEFT-POINTING TRIANGLE + {0xA2B8, 0x25C0}, //5982 #BLACK LEFT-POINTING TRIANGLE + {0xA2B9, 0x25B7}, //5983 #WHITE RIGHT-POINTING TRIANGLE + {0xA2BA, 0x25B6}, //5984 #BLACK RIGHT-POINTING TRIANGLE + {0xA2BB, 0x2664}, //5985 #WHITE SPADE SUIT + {0xA2BC, 0x2660}, //5986 #BLACK SPADE SUIT + {0xA2BD, 0x2661}, //5987 #WHITE HEART SUIT + {0xA2BE, 0x2665}, //5988 #BLACK HEART SUIT + {0xA2BF, 0x2667}, //5989 #WHITE CLUB SUIT + {0xA2C0, 0x2663}, //5990 #BLACK CLUB SUIT + {0xA2C1, 0x2299}, //5991 #CIRCLED DOT OPERATOR + {0xA2C2, 0x25C8}, //5992 #WHITE DIAMOND CONTAINING BLACK SMALL DIAMOND + {0xA2C3, 0x25A3}, //5993 #WHITE SQUARE CONTAINING BLACK SMALL SQUARE + {0xA2C4, 0x25D0}, //5994 #CIRCLE WITH LEFT HALF BLACK + {0xA2C5, 0x25D1}, //5995 #CIRCLE WITH RIGHT HALF BLACK + {0xA2C6, 0x2592}, //5996 #MEDIUM SHADE + {0xA2C7, 0x25A4}, //5997 #SQUARE WITH HORIZONTAL FILL + {0xA2C8, 0x25A5}, //5998 #SQUARE WITH VERTICAL FILL + {0xA2C9, 0x25A8}, //5999 #SQUARE WITH UPPER RIGHT TO LOWER LEFT FILL + {0xA2CA, 0x25A7}, //6000 #SQUARE WITH UPPER LEFT TO LOWER RIGHT FILL + {0xA2CB, 0x25A6}, //6001 #SQUARE WITH ORTHOGONAL CROSSHATCH FILL + {0xA2CC, 0x25A9}, //6002 #SQUARE WITH DIAGONAL CROSSHATCH FILL + {0xA2CD, 0x2668}, //6003 #HOT SPRINGS + {0xA2CE, 0x260F}, //6004 #WHITE TELEPHONE + {0xA2CF, 0x260E}, //6005 #BLACK TELEPHONE + {0xA2D0, 0x261C}, //6006 #WHITE LEFT POINTING INDEX + {0xA2D1, 0x261E}, //6007 #WHITE RIGHT POINTING INDEX + {0xA2D2, 0x00B6}, //6008 #PILCROW SIGN + {0xA2D3, 0x2020}, //6009 #DAGGER + {0xA2D4, 0x2021}, //6010 #DOUBLE DAGGER + {0xA2D5, 0x2195}, //6011 #UP DOWN ARROW + {0xA2D6, 0x2197}, //6012 #NORTH EAST ARROW + {0xA2D7, 0x2199}, //6013 #SOUTH WEST ARROW + {0xA2D8, 0x2196}, //6014 #NORTH WEST ARROW + {0xA2D9, 0x2198}, //6015 #SOUTH EAST ARROW + {0xA2DA, 0x266D}, //6016 #MUSIC FLAT SIGN + {0xA2DB, 0x2669}, //6017 #QUARTER NOTE + {0xA2DC, 0x266A}, //6018 #EIGHTH NOTE + {0xA2DD, 0x266C}, //6019 #BEAMED SIXTEENTH NOTES + {0xA2DE, 0x327F}, //6020 #KOREAN STANDARD SYMBOL + {0xA2DF, 0x321C}, //6021 #PARENTHESIZED HANGUL CIEUC U + {0xA2E0, 0x2116}, //6022 #NUMERO SIGN + {0xA2E1, 0x33C7}, //6023 #SQUARE CO + {0xA2E2, 0x2122}, //6024 #TRADE MARK SIGN + {0xA2E3, 0x33C2}, //6025 #SQUARE AM + {0xA2E4, 0x33D8}, //6026 #SQUARE PM + {0xA2E5, 0x2121}, //6027 #TELEPHONE SIGN + {0xA2E6, 0x20AC}, //6028 #EURO SIGN + {0xA2E7, 0x00AE}, //6029 #REGISTERED SIGN + {0xA341, 0xC971}, //6030 #HANGUL SYLLABLE CIEUC YU NIEUNCIEUC + {0xA342, 0xC972}, //6031 #HANGUL SYLLABLE CIEUC YU NIEUNHIEUH + {0xA343, 0xC973}, //6032 #HANGUL SYLLABLE CIEUC YU TIKEUT + {0xA344, 0xC975}, //6033 #HANGUL SYLLABLE CIEUC YU RIEULKIYEOK + {0xA345, 0xC976}, //6034 #HANGUL SYLLABLE CIEUC YU RIEULMIEUM + {0xA346, 0xC977}, //6035 #HANGUL SYLLABLE CIEUC YU RIEULPIEUP + {0xA347, 0xC978}, //6036 #HANGUL SYLLABLE CIEUC YU RIEULSIOS + {0xA348, 0xC979}, //6037 #HANGUL SYLLABLE CIEUC YU RIEULTHIEUTH + {0xA349, 0xC97A}, //6038 #HANGUL SYLLABLE CIEUC YU RIEULPHIEUPH + {0xA34A, 0xC97B}, //6039 #HANGUL SYLLABLE CIEUC YU RIEULHIEUH + {0xA34B, 0xC97D}, //6040 #HANGUL SYLLABLE CIEUC YU PIEUP + {0xA34C, 0xC97E}, //6041 #HANGUL SYLLABLE CIEUC YU PIEUPSIOS + {0xA34D, 0xC97F}, //6042 #HANGUL SYLLABLE CIEUC YU SIOS + {0xA34E, 0xC980}, //6043 #HANGUL SYLLABLE CIEUC YU SSANGSIOS + {0xA34F, 0xC981}, //6044 #HANGUL SYLLABLE CIEUC YU IEUNG + {0xA350, 0xC982}, //6045 #HANGUL SYLLABLE CIEUC YU CIEUC + {0xA351, 0xC983}, //6046 #HANGUL SYLLABLE CIEUC YU CHIEUCH + {0xA352, 0xC984}, //6047 #HANGUL SYLLABLE CIEUC YU KHIEUKH + {0xA353, 0xC985}, //6048 #HANGUL SYLLABLE CIEUC YU THIEUTH + {0xA354, 0xC986}, //6049 #HANGUL SYLLABLE CIEUC YU PHIEUPH + {0xA355, 0xC987}, //6050 #HANGUL SYLLABLE CIEUC YU HIEUH + {0xA356, 0xC98A}, //6051 #HANGUL SYLLABLE CIEUC EU SSANGKIYEOK + {0xA357, 0xC98B}, //6052 #HANGUL SYLLABLE CIEUC EU KIYEOKSIOS + {0xA358, 0xC98D}, //6053 #HANGUL SYLLABLE CIEUC EU NIEUNCIEUC + {0xA359, 0xC98E}, //6054 #HANGUL SYLLABLE CIEUC EU NIEUNHIEUH + {0xA35A, 0xC98F}, //6055 #HANGUL SYLLABLE CIEUC EU TIKEUT + {0xA361, 0xC991}, //6056 #HANGUL SYLLABLE CIEUC EU RIEULKIYEOK + {0xA362, 0xC992}, //6057 #HANGUL SYLLABLE CIEUC EU RIEULMIEUM + {0xA363, 0xC993}, //6058 #HANGUL SYLLABLE CIEUC EU RIEULPIEUP + {0xA364, 0xC994}, //6059 #HANGUL SYLLABLE CIEUC EU RIEULSIOS + {0xA365, 0xC995}, //6060 #HANGUL SYLLABLE CIEUC EU RIEULTHIEUTH + {0xA366, 0xC996}, //6061 #HANGUL SYLLABLE CIEUC EU RIEULPHIEUPH + {0xA367, 0xC997}, //6062 #HANGUL SYLLABLE CIEUC EU RIEULHIEUH + {0xA368, 0xC99A}, //6063 #HANGUL SYLLABLE CIEUC EU PIEUPSIOS + {0xA369, 0xC99C}, //6064 #HANGUL SYLLABLE CIEUC EU SSANGSIOS + {0xA36A, 0xC99E}, //6065 #HANGUL SYLLABLE CIEUC EU CIEUC + {0xA36B, 0xC99F}, //6066 #HANGUL SYLLABLE CIEUC EU CHIEUCH + {0xA36C, 0xC9A0}, //6067 #HANGUL SYLLABLE CIEUC EU KHIEUKH + {0xA36D, 0xC9A1}, //6068 #HANGUL SYLLABLE CIEUC EU THIEUTH + {0xA36E, 0xC9A2}, //6069 #HANGUL SYLLABLE CIEUC EU PHIEUPH + {0xA36F, 0xC9A3}, //6070 #HANGUL SYLLABLE CIEUC EU HIEUH + {0xA370, 0xC9A4}, //6071 #HANGUL SYLLABLE CIEUC YI + {0xA371, 0xC9A5}, //6072 #HANGUL SYLLABLE CIEUC YI KIYEOK + {0xA372, 0xC9A6}, //6073 #HANGUL SYLLABLE CIEUC YI SSANGKIYEOK + {0xA373, 0xC9A7}, //6074 #HANGUL SYLLABLE CIEUC YI KIYEOKSIOS + {0xA374, 0xC9A8}, //6075 #HANGUL SYLLABLE CIEUC YI NIEUN + {0xA375, 0xC9A9}, //6076 #HANGUL SYLLABLE CIEUC YI NIEUNCIEUC + {0xA376, 0xC9AA}, //6077 #HANGUL SYLLABLE CIEUC YI NIEUNHIEUH + {0xA377, 0xC9AB}, //6078 #HANGUL SYLLABLE CIEUC YI TIKEUT + {0xA378, 0xC9AC}, //6079 #HANGUL SYLLABLE CIEUC YI RIEUL + {0xA379, 0xC9AD}, //6080 #HANGUL SYLLABLE CIEUC YI RIEULKIYEOK + {0xA37A, 0xC9AE}, //6081 #HANGUL SYLLABLE CIEUC YI RIEULMIEUM + {0xA381, 0xC9AF}, //6082 #HANGUL SYLLABLE CIEUC YI RIEULPIEUP + {0xA382, 0xC9B0}, //6083 #HANGUL SYLLABLE CIEUC YI RIEULSIOS + {0xA383, 0xC9B1}, //6084 #HANGUL SYLLABLE CIEUC YI RIEULTHIEUTH + {0xA384, 0xC9B2}, //6085 #HANGUL SYLLABLE CIEUC YI RIEULPHIEUPH + {0xA385, 0xC9B3}, //6086 #HANGUL SYLLABLE CIEUC YI RIEULHIEUH + {0xA386, 0xC9B4}, //6087 #HANGUL SYLLABLE CIEUC YI MIEUM + {0xA387, 0xC9B5}, //6088 #HANGUL SYLLABLE CIEUC YI PIEUP + {0xA388, 0xC9B6}, //6089 #HANGUL SYLLABLE CIEUC YI PIEUPSIOS + {0xA389, 0xC9B7}, //6090 #HANGUL SYLLABLE CIEUC YI SIOS + {0xA38A, 0xC9B8}, //6091 #HANGUL SYLLABLE CIEUC YI SSANGSIOS + {0xA38B, 0xC9B9}, //6092 #HANGUL SYLLABLE CIEUC YI IEUNG + {0xA38C, 0xC9BA}, //6093 #HANGUL SYLLABLE CIEUC YI CIEUC + {0xA38D, 0xC9BB}, //6094 #HANGUL SYLLABLE CIEUC YI CHIEUCH + {0xA38E, 0xC9BC}, //6095 #HANGUL SYLLABLE CIEUC YI KHIEUKH + {0xA38F, 0xC9BD}, //6096 #HANGUL SYLLABLE CIEUC YI THIEUTH + {0xA390, 0xC9BE}, //6097 #HANGUL SYLLABLE CIEUC YI PHIEUPH + {0xA391, 0xC9BF}, //6098 #HANGUL SYLLABLE CIEUC YI HIEUH + {0xA392, 0xC9C2}, //6099 #HANGUL SYLLABLE CIEUC I SSANGKIYEOK + {0xA393, 0xC9C3}, //6100 #HANGUL SYLLABLE CIEUC I KIYEOKSIOS + {0xA394, 0xC9C5}, //6101 #HANGUL SYLLABLE CIEUC I NIEUNCIEUC + {0xA395, 0xC9C6}, //6102 #HANGUL SYLLABLE CIEUC I NIEUNHIEUH + {0xA396, 0xC9C9}, //6103 #HANGUL SYLLABLE CIEUC I RIEULKIYEOK + {0xA397, 0xC9CB}, //6104 #HANGUL SYLLABLE CIEUC I RIEULPIEUP + {0xA398, 0xC9CC}, //6105 #HANGUL SYLLABLE CIEUC I RIEULSIOS + {0xA399, 0xC9CD}, //6106 #HANGUL SYLLABLE CIEUC I RIEULTHIEUTH + {0xA39A, 0xC9CE}, //6107 #HANGUL SYLLABLE CIEUC I RIEULPHIEUPH + {0xA39B, 0xC9CF}, //6108 #HANGUL SYLLABLE CIEUC I RIEULHIEUH + {0xA39C, 0xC9D2}, //6109 #HANGUL SYLLABLE CIEUC I PIEUPSIOS + {0xA39D, 0xC9D4}, //6110 #HANGUL SYLLABLE CIEUC I SSANGSIOS + {0xA39E, 0xC9D7}, //6111 #HANGUL SYLLABLE CIEUC I CHIEUCH + {0xA39F, 0xC9D8}, //6112 #HANGUL SYLLABLE CIEUC I KHIEUKH + {0xA3A0, 0xC9DB}, //6113 #HANGUL SYLLABLE CIEUC I HIEUH + {0xA3A1, 0xFF01}, //6114 #FULLWIDTH EXCLAMATION MARK + {0xA3A2, 0xFF02}, //6115 #FULLWIDTH QUOTATION MARK + {0xA3A3, 0xFF03}, //6116 #FULLWIDTH NUMBER SIGN + {0xA3A4, 0xFF04}, //6117 #FULLWIDTH DOLLAR SIGN + {0xA3A5, 0xFF05}, //6118 #FULLWIDTH PERCENT SIGN + {0xA3A6, 0xFF06}, //6119 #FULLWIDTH AMPERSAND + {0xA3A7, 0xFF07}, //6120 #FULLWIDTH APOSTROPHE + {0xA3A8, 0xFF08}, //6121 #FULLWIDTH LEFT PARENTHESIS + {0xA3A9, 0xFF09}, //6122 #FULLWIDTH RIGHT PARENTHESIS + {0xA3AA, 0xFF0A}, //6123 #FULLWIDTH ASTERISK + {0xA3AB, 0xFF0B}, //6124 #FULLWIDTH PLUS SIGN + {0xA3AC, 0xFF0C}, //6125 #FULLWIDTH COMMA + {0xA3AD, 0xFF0D}, //6126 #FULLWIDTH HYPHEN-MINUS + {0xA3AE, 0xFF0E}, //6127 #FULLWIDTH FULL STOP + {0xA3AF, 0xFF0F}, //6128 #FULLWIDTH SOLIDUS + {0xA3B0, 0xFF10}, //6129 #FULLWIDTH DIGIT ZERO + {0xA3B1, 0xFF11}, //6130 #FULLWIDTH DIGIT ONE + {0xA3B2, 0xFF12}, //6131 #FULLWIDTH DIGIT TWO + {0xA3B3, 0xFF13}, //6132 #FULLWIDTH DIGIT THREE + {0xA3B4, 0xFF14}, //6133 #FULLWIDTH DIGIT FOUR + {0xA3B5, 0xFF15}, //6134 #FULLWIDTH DIGIT FIVE + {0xA3B6, 0xFF16}, //6135 #FULLWIDTH DIGIT SIX + {0xA3B7, 0xFF17}, //6136 #FULLWIDTH DIGIT SEVEN + {0xA3B8, 0xFF18}, //6137 #FULLWIDTH DIGIT EIGHT + {0xA3B9, 0xFF19}, //6138 #FULLWIDTH DIGIT NINE + {0xA3BA, 0xFF1A}, //6139 #FULLWIDTH COLON + {0xA3BB, 0xFF1B}, //6140 #FULLWIDTH SEMICOLON + {0xA3BC, 0xFF1C}, //6141 #FULLWIDTH LESS-THAN SIGN + {0xA3BD, 0xFF1D}, //6142 #FULLWIDTH EQUALS SIGN + {0xA3BE, 0xFF1E}, //6143 #FULLWIDTH GREATER-THAN SIGN + {0xA3BF, 0xFF1F}, //6144 #FULLWIDTH QUESTION MARK + {0xA3C0, 0xFF20}, //6145 #FULLWIDTH COMMERCIAL AT + {0xA3C1, 0xFF21}, //6146 #FULLWIDTH LATIN CAPITAL LETTER A + {0xA3C2, 0xFF22}, //6147 #FULLWIDTH LATIN CAPITAL LETTER B + {0xA3C3, 0xFF23}, //6148 #FULLWIDTH LATIN CAPITAL LETTER C + {0xA3C4, 0xFF24}, //6149 #FULLWIDTH LATIN CAPITAL LETTER D + {0xA3C5, 0xFF25}, //6150 #FULLWIDTH LATIN CAPITAL LETTER E + {0xA3C6, 0xFF26}, //6151 #FULLWIDTH LATIN CAPITAL LETTER F + {0xA3C7, 0xFF27}, //6152 #FULLWIDTH LATIN CAPITAL LETTER G + {0xA3C8, 0xFF28}, //6153 #FULLWIDTH LATIN CAPITAL LETTER H + {0xA3C9, 0xFF29}, //6154 #FULLWIDTH LATIN CAPITAL LETTER I + {0xA3CA, 0xFF2A}, //6155 #FULLWIDTH LATIN CAPITAL LETTER J + {0xA3CB, 0xFF2B}, //6156 #FULLWIDTH LATIN CAPITAL LETTER K + {0xA3CC, 0xFF2C}, //6157 #FULLWIDTH LATIN CAPITAL LETTER L + {0xA3CD, 0xFF2D}, //6158 #FULLWIDTH LATIN CAPITAL LETTER M + {0xA3CE, 0xFF2E}, //6159 #FULLWIDTH LATIN CAPITAL LETTER N + {0xA3CF, 0xFF2F}, //6160 #FULLWIDTH LATIN CAPITAL LETTER O + {0xA3D0, 0xFF30}, //6161 #FULLWIDTH LATIN CAPITAL LETTER P + {0xA3D1, 0xFF31}, //6162 #FULLWIDTH LATIN CAPITAL LETTER Q + {0xA3D2, 0xFF32}, //6163 #FULLWIDTH LATIN CAPITAL LETTER R + {0xA3D3, 0xFF33}, //6164 #FULLWIDTH LATIN CAPITAL LETTER S + {0xA3D4, 0xFF34}, //6165 #FULLWIDTH LATIN CAPITAL LETTER T + {0xA3D5, 0xFF35}, //6166 #FULLWIDTH LATIN CAPITAL LETTER U + {0xA3D6, 0xFF36}, //6167 #FULLWIDTH LATIN CAPITAL LETTER V + {0xA3D7, 0xFF37}, //6168 #FULLWIDTH LATIN CAPITAL LETTER W + {0xA3D8, 0xFF38}, //6169 #FULLWIDTH LATIN CAPITAL LETTER X + {0xA3D9, 0xFF39}, //6170 #FULLWIDTH LATIN CAPITAL LETTER Y + {0xA3DA, 0xFF3A}, //6171 #FULLWIDTH LATIN CAPITAL LETTER Z + {0xA3DB, 0xFF3B}, //6172 #FULLWIDTH LEFT SQUARE BRACKET + {0xA3DC, 0xFFE6}, //6173 #FULLWIDTH WON SIGN + {0xA3DD, 0xFF3D}, //6174 #FULLWIDTH RIGHT SQUARE BRACKET + {0xA3DE, 0xFF3E}, //6175 #FULLWIDTH CIRCUMFLEX ACCENT + {0xA3DF, 0xFF3F}, //6176 #FULLWIDTH LOW LINE + {0xA3E0, 0xFF40}, //6177 #FULLWIDTH GRAVE ACCENT + {0xA3E1, 0xFF41}, //6178 #FULLWIDTH LATIN SMALL LETTER A + {0xA3E2, 0xFF42}, //6179 #FULLWIDTH LATIN SMALL LETTER B + {0xA3E3, 0xFF43}, //6180 #FULLWIDTH LATIN SMALL LETTER C + {0xA3E4, 0xFF44}, //6181 #FULLWIDTH LATIN SMALL LETTER D + {0xA3E5, 0xFF45}, //6182 #FULLWIDTH LATIN SMALL LETTER E + {0xA3E6, 0xFF46}, //6183 #FULLWIDTH LATIN SMALL LETTER F + {0xA3E7, 0xFF47}, //6184 #FULLWIDTH LATIN SMALL LETTER G + {0xA3E8, 0xFF48}, //6185 #FULLWIDTH LATIN SMALL LETTER H + {0xA3E9, 0xFF49}, //6186 #FULLWIDTH LATIN SMALL LETTER I + {0xA3EA, 0xFF4A}, //6187 #FULLWIDTH LATIN SMALL LETTER J + {0xA3EB, 0xFF4B}, //6188 #FULLWIDTH LATIN SMALL LETTER K + {0xA3EC, 0xFF4C}, //6189 #FULLWIDTH LATIN SMALL LETTER L + {0xA3ED, 0xFF4D}, //6190 #FULLWIDTH LATIN SMALL LETTER M + {0xA3EE, 0xFF4E}, //6191 #FULLWIDTH LATIN SMALL LETTER N + {0xA3EF, 0xFF4F}, //6192 #FULLWIDTH LATIN SMALL LETTER O + {0xA3F0, 0xFF50}, //6193 #FULLWIDTH LATIN SMALL LETTER P + {0xA3F1, 0xFF51}, //6194 #FULLWIDTH LATIN SMALL LETTER Q + {0xA3F2, 0xFF52}, //6195 #FULLWIDTH LATIN SMALL LETTER R + {0xA3F3, 0xFF53}, //6196 #FULLWIDTH LATIN SMALL LETTER S + {0xA3F4, 0xFF54}, //6197 #FULLWIDTH LATIN SMALL LETTER T + {0xA3F5, 0xFF55}, //6198 #FULLWIDTH LATIN SMALL LETTER U + {0xA3F6, 0xFF56}, //6199 #FULLWIDTH LATIN SMALL LETTER V + {0xA3F7, 0xFF57}, //6200 #FULLWIDTH LATIN SMALL LETTER W + {0xA3F8, 0xFF58}, //6201 #FULLWIDTH LATIN SMALL LETTER X + {0xA3F9, 0xFF59}, //6202 #FULLWIDTH LATIN SMALL LETTER Y + {0xA3FA, 0xFF5A}, //6203 #FULLWIDTH LATIN SMALL LETTER Z + {0xA3FB, 0xFF5B}, //6204 #FULLWIDTH LEFT CURLY BRACKET + {0xA3FC, 0xFF5C}, //6205 #FULLWIDTH VERTICAL LINE + {0xA3FD, 0xFF5D}, //6206 #FULLWIDTH RIGHT CURLY BRACKET + {0xA3FE, 0xFFE3}, //6207 #FULLWIDTH MACRON + {0xA441, 0xC9DE}, //6208 #HANGUL SYLLABLE SSANGCIEUC A SSANGKIYEOK + {0xA442, 0xC9DF}, //6209 #HANGUL SYLLABLE SSANGCIEUC A KIYEOKSIOS + {0xA443, 0xC9E1}, //6210 #HANGUL SYLLABLE SSANGCIEUC A NIEUNCIEUC + {0xA444, 0xC9E3}, //6211 #HANGUL SYLLABLE SSANGCIEUC A TIKEUT + {0xA445, 0xC9E5}, //6212 #HANGUL SYLLABLE SSANGCIEUC A RIEULKIYEOK + {0xA446, 0xC9E6}, //6213 #HANGUL SYLLABLE SSANGCIEUC A RIEULMIEUM + {0xA447, 0xC9E8}, //6214 #HANGUL SYLLABLE SSANGCIEUC A RIEULSIOS + {0xA448, 0xC9E9}, //6215 #HANGUL SYLLABLE SSANGCIEUC A RIEULTHIEUTH + {0xA449, 0xC9EA}, //6216 #HANGUL SYLLABLE SSANGCIEUC A RIEULPHIEUPH + {0xA44A, 0xC9EB}, //6217 #HANGUL SYLLABLE SSANGCIEUC A RIEULHIEUH + {0xA44B, 0xC9EE}, //6218 #HANGUL SYLLABLE SSANGCIEUC A PIEUPSIOS + {0xA44C, 0xC9F2}, //6219 #HANGUL SYLLABLE SSANGCIEUC A CIEUC + {0xA44D, 0xC9F3}, //6220 #HANGUL SYLLABLE SSANGCIEUC A CHIEUCH + {0xA44E, 0xC9F4}, //6221 #HANGUL SYLLABLE SSANGCIEUC A KHIEUKH + {0xA44F, 0xC9F5}, //6222 #HANGUL SYLLABLE SSANGCIEUC A THIEUTH + {0xA450, 0xC9F6}, //6223 #HANGUL SYLLABLE SSANGCIEUC A PHIEUPH + {0xA451, 0xC9F7}, //6224 #HANGUL SYLLABLE SSANGCIEUC A HIEUH + {0xA452, 0xC9FA}, //6225 #HANGUL SYLLABLE SSANGCIEUC AE SSANGKIYEOK + {0xA453, 0xC9FB}, //6226 #HANGUL SYLLABLE SSANGCIEUC AE KIYEOKSIOS + {0xA454, 0xC9FD}, //6227 #HANGUL SYLLABLE SSANGCIEUC AE NIEUNCIEUC + {0xA455, 0xC9FE}, //6228 #HANGUL SYLLABLE SSANGCIEUC AE NIEUNHIEUH + {0xA456, 0xC9FF}, //6229 #HANGUL SYLLABLE SSANGCIEUC AE TIKEUT + {0xA457, 0xCA01}, //6230 #HANGUL SYLLABLE SSANGCIEUC AE RIEULKIYEOK + {0xA458, 0xCA02}, //6231 #HANGUL SYLLABLE SSANGCIEUC AE RIEULMIEUM + {0xA459, 0xCA03}, //6232 #HANGUL SYLLABLE SSANGCIEUC AE RIEULPIEUP + {0xA45A, 0xCA04}, //6233 #HANGUL SYLLABLE SSANGCIEUC AE RIEULSIOS + {0xA461, 0xCA05}, //6234 #HANGUL SYLLABLE SSANGCIEUC AE RIEULTHIEUTH + {0xA462, 0xCA06}, //6235 #HANGUL SYLLABLE SSANGCIEUC AE RIEULPHIEUPH + {0xA463, 0xCA07}, //6236 #HANGUL SYLLABLE SSANGCIEUC AE RIEULHIEUH + {0xA464, 0xCA0A}, //6237 #HANGUL SYLLABLE SSANGCIEUC AE PIEUPSIOS + {0xA465, 0xCA0E}, //6238 #HANGUL SYLLABLE SSANGCIEUC AE CIEUC + {0xA466, 0xCA0F}, //6239 #HANGUL SYLLABLE SSANGCIEUC AE CHIEUCH + {0xA467, 0xCA10}, //6240 #HANGUL SYLLABLE SSANGCIEUC AE KHIEUKH + {0xA468, 0xCA11}, //6241 #HANGUL SYLLABLE SSANGCIEUC AE THIEUTH + {0xA469, 0xCA12}, //6242 #HANGUL SYLLABLE SSANGCIEUC AE PHIEUPH + {0xA46A, 0xCA13}, //6243 #HANGUL SYLLABLE SSANGCIEUC AE HIEUH + {0xA46B, 0xCA15}, //6244 #HANGUL SYLLABLE SSANGCIEUC YA KIYEOK + {0xA46C, 0xCA16}, //6245 #HANGUL SYLLABLE SSANGCIEUC YA SSANGKIYEOK + {0xA46D, 0xCA17}, //6246 #HANGUL SYLLABLE SSANGCIEUC YA KIYEOKSIOS + {0xA46E, 0xCA19}, //6247 #HANGUL SYLLABLE SSANGCIEUC YA NIEUNCIEUC + {0xA46F, 0xCA1A}, //6248 #HANGUL SYLLABLE SSANGCIEUC YA NIEUNHIEUH + {0xA470, 0xCA1B}, //6249 #HANGUL SYLLABLE SSANGCIEUC YA TIKEUT + {0xA471, 0xCA1C}, //6250 #HANGUL SYLLABLE SSANGCIEUC YA RIEUL + {0xA472, 0xCA1D}, //6251 #HANGUL SYLLABLE SSANGCIEUC YA RIEULKIYEOK + {0xA473, 0xCA1E}, //6252 #HANGUL SYLLABLE SSANGCIEUC YA RIEULMIEUM + {0xA474, 0xCA1F}, //6253 #HANGUL SYLLABLE SSANGCIEUC YA RIEULPIEUP + {0xA475, 0xCA20}, //6254 #HANGUL SYLLABLE SSANGCIEUC YA RIEULSIOS + {0xA476, 0xCA21}, //6255 #HANGUL SYLLABLE SSANGCIEUC YA RIEULTHIEUTH + {0xA477, 0xCA22}, //6256 #HANGUL SYLLABLE SSANGCIEUC YA RIEULPHIEUPH + {0xA478, 0xCA23}, //6257 #HANGUL SYLLABLE SSANGCIEUC YA RIEULHIEUH + {0xA479, 0xCA24}, //6258 #HANGUL SYLLABLE SSANGCIEUC YA MIEUM + {0xA47A, 0xCA25}, //6259 #HANGUL SYLLABLE SSANGCIEUC YA PIEUP + {0xA481, 0xCA26}, //6260 #HANGUL SYLLABLE SSANGCIEUC YA PIEUPSIOS + {0xA482, 0xCA27}, //6261 #HANGUL SYLLABLE SSANGCIEUC YA SIOS + {0xA483, 0xCA28}, //6262 #HANGUL SYLLABLE SSANGCIEUC YA SSANGSIOS + {0xA484, 0xCA2A}, //6263 #HANGUL SYLLABLE SSANGCIEUC YA CIEUC + {0xA485, 0xCA2B}, //6264 #HANGUL SYLLABLE SSANGCIEUC YA CHIEUCH + {0xA486, 0xCA2C}, //6265 #HANGUL SYLLABLE SSANGCIEUC YA KHIEUKH + {0xA487, 0xCA2D}, //6266 #HANGUL SYLLABLE SSANGCIEUC YA THIEUTH + {0xA488, 0xCA2E}, //6267 #HANGUL SYLLABLE SSANGCIEUC YA PHIEUPH + {0xA489, 0xCA2F}, //6268 #HANGUL SYLLABLE SSANGCIEUC YA HIEUH + {0xA48A, 0xCA30}, //6269 #HANGUL SYLLABLE SSANGCIEUC YAE + {0xA48B, 0xCA31}, //6270 #HANGUL SYLLABLE SSANGCIEUC YAE KIYEOK + {0xA48C, 0xCA32}, //6271 #HANGUL SYLLABLE SSANGCIEUC YAE SSANGKIYEOK + {0xA48D, 0xCA33}, //6272 #HANGUL SYLLABLE SSANGCIEUC YAE KIYEOKSIOS + {0xA48E, 0xCA34}, //6273 #HANGUL SYLLABLE SSANGCIEUC YAE NIEUN + {0xA48F, 0xCA35}, //6274 #HANGUL SYLLABLE SSANGCIEUC YAE NIEUNCIEUC + {0xA490, 0xCA36}, //6275 #HANGUL SYLLABLE SSANGCIEUC YAE NIEUNHIEUH + {0xA491, 0xCA37}, //6276 #HANGUL SYLLABLE SSANGCIEUC YAE TIKEUT + {0xA492, 0xCA38}, //6277 #HANGUL SYLLABLE SSANGCIEUC YAE RIEUL + {0xA493, 0xCA39}, //6278 #HANGUL SYLLABLE SSANGCIEUC YAE RIEULKIYEOK + {0xA494, 0xCA3A}, //6279 #HANGUL SYLLABLE SSANGCIEUC YAE RIEULMIEUM + {0xA495, 0xCA3B}, //6280 #HANGUL SYLLABLE SSANGCIEUC YAE RIEULPIEUP + {0xA496, 0xCA3C}, //6281 #HANGUL SYLLABLE SSANGCIEUC YAE RIEULSIOS + {0xA497, 0xCA3D}, //6282 #HANGUL SYLLABLE SSANGCIEUC YAE RIEULTHIEUTH + {0xA498, 0xCA3E}, //6283 #HANGUL SYLLABLE SSANGCIEUC YAE RIEULPHIEUPH + {0xA499, 0xCA3F}, //6284 #HANGUL SYLLABLE SSANGCIEUC YAE RIEULHIEUH + {0xA49A, 0xCA40}, //6285 #HANGUL SYLLABLE SSANGCIEUC YAE MIEUM + {0xA49B, 0xCA41}, //6286 #HANGUL SYLLABLE SSANGCIEUC YAE PIEUP + {0xA49C, 0xCA42}, //6287 #HANGUL SYLLABLE SSANGCIEUC YAE PIEUPSIOS + {0xA49D, 0xCA43}, //6288 #HANGUL SYLLABLE SSANGCIEUC YAE SIOS + {0xA49E, 0xCA44}, //6289 #HANGUL SYLLABLE SSANGCIEUC YAE SSANGSIOS + {0xA49F, 0xCA45}, //6290 #HANGUL SYLLABLE SSANGCIEUC YAE IEUNG + {0xA4A0, 0xCA46}, //6291 #HANGUL SYLLABLE SSANGCIEUC YAE CIEUC + {0xA4A1, 0x3131}, //6292 #HANGUL LETTER KIYEOK + {0xA4A2, 0x3132}, //6293 #HANGUL LETTER SSANGKIYEOK + {0xA4A3, 0x3133}, //6294 #HANGUL LETTER KIYEOK-SIOS + {0xA4A4, 0x3134}, //6295 #HANGUL LETTER NIEUN + {0xA4A5, 0x3135}, //6296 #HANGUL LETTER NIEUN-CIEUC + {0xA4A6, 0x3136}, //6297 #HANGUL LETTER NIEUN-HIEUH + {0xA4A7, 0x3137}, //6298 #HANGUL LETTER TIKEUT + {0xA4A8, 0x3138}, //6299 #HANGUL LETTER SSANGTIKEUT + {0xA4A9, 0x3139}, //6300 #HANGUL LETTER RIEUL + {0xA4AA, 0x313A}, //6301 #HANGUL LETTER RIEUL-KIYEOK + {0xA4AB, 0x313B}, //6302 #HANGUL LETTER RIEUL-MIEUM + {0xA4AC, 0x313C}, //6303 #HANGUL LETTER RIEUL-PIEUP + {0xA4AD, 0x313D}, //6304 #HANGUL LETTER RIEUL-SIOS + {0xA4AE, 0x313E}, //6305 #HANGUL LETTER RIEUL-THIEUTH + {0xA4AF, 0x313F}, //6306 #HANGUL LETTER RIEUL-PHIEUPH + {0xA4B0, 0x3140}, //6307 #HANGUL LETTER RIEUL-HIEUH + {0xA4B1, 0x3141}, //6308 #HANGUL LETTER MIEUM + {0xA4B2, 0x3142}, //6309 #HANGUL LETTER PIEUP + {0xA4B3, 0x3143}, //6310 #HANGUL LETTER SSANGPIEUP + {0xA4B4, 0x3144}, //6311 #HANGUL LETTER PIEUP-SIOS + {0xA4B5, 0x3145}, //6312 #HANGUL LETTER SIOS + {0xA4B6, 0x3146}, //6313 #HANGUL LETTER SSANGSIOS + {0xA4B7, 0x3147}, //6314 #HANGUL LETTER IEUNG + {0xA4B8, 0x3148}, //6315 #HANGUL LETTER CIEUC + {0xA4B9, 0x3149}, //6316 #HANGUL LETTER SSANGCIEUC + {0xA4BA, 0x314A}, //6317 #HANGUL LETTER CHIEUCH + {0xA4BB, 0x314B}, //6318 #HANGUL LETTER KHIEUKH + {0xA4BC, 0x314C}, //6319 #HANGUL LETTER THIEUTH + {0xA4BD, 0x314D}, //6320 #HANGUL LETTER PHIEUPH + {0xA4BE, 0x314E}, //6321 #HANGUL LETTER HIEUH + {0xA4BF, 0x314F}, //6322 #HANGUL LETTER A + {0xA4C0, 0x3150}, //6323 #HANGUL LETTER AE + {0xA4C1, 0x3151}, //6324 #HANGUL LETTER YA + {0xA4C2, 0x3152}, //6325 #HANGUL LETTER YAE + {0xA4C3, 0x3153}, //6326 #HANGUL LETTER EO + {0xA4C4, 0x3154}, //6327 #HANGUL LETTER E + {0xA4C5, 0x3155}, //6328 #HANGUL LETTER YEO + {0xA4C6, 0x3156}, //6329 #HANGUL LETTER YE + {0xA4C7, 0x3157}, //6330 #HANGUL LETTER O + {0xA4C8, 0x3158}, //6331 #HANGUL LETTER WA + {0xA4C9, 0x3159}, //6332 #HANGUL LETTER WAE + {0xA4CA, 0x315A}, //6333 #HANGUL LETTER OE + {0xA4CB, 0x315B}, //6334 #HANGUL LETTER YO + {0xA4CC, 0x315C}, //6335 #HANGUL LETTER U + {0xA4CD, 0x315D}, //6336 #HANGUL LETTER WEO + {0xA4CE, 0x315E}, //6337 #HANGUL LETTER WE + {0xA4CF, 0x315F}, //6338 #HANGUL LETTER WI + {0xA4D0, 0x3160}, //6339 #HANGUL LETTER YU + {0xA4D1, 0x3161}, //6340 #HANGUL LETTER EU + {0xA4D2, 0x3162}, //6341 #HANGUL LETTER YI + {0xA4D3, 0x3163}, //6342 #HANGUL LETTER I + {0xA4D4, 0x3164}, //6343 #HANGUL FILLER + {0xA4D5, 0x3165}, //6344 #HANGUL LETTER SSANGNIEUN + {0xA4D6, 0x3166}, //6345 #HANGUL LETTER NIEUN-TIKEUT + {0xA4D7, 0x3167}, //6346 #HANGUL LETTER NIEUN-SIOS + {0xA4D8, 0x3168}, //6347 #HANGUL LETTER NIEUN-PANSIOS + {0xA4D9, 0x3169}, //6348 #HANGUL LETTER RIEUL-KIYEOK-SIOS + {0xA4DA, 0x316A}, //6349 #HANGUL LETTER RIEUL-TIKEUT + {0xA4DB, 0x316B}, //6350 #HANGUL LETTER RIEUL-PIEUP-SIOS + {0xA4DC, 0x316C}, //6351 #HANGUL LETTER RIEUL-PANSIOS + {0xA4DD, 0x316D}, //6352 #HANGUL LETTER RIEUL-YEORINHIEUH + {0xA4DE, 0x316E}, //6353 #HANGUL LETTER MIEUM-PIEUP + {0xA4DF, 0x316F}, //6354 #HANGUL LETTER MIEUM-SIOS + {0xA4E0, 0x3170}, //6355 #HANGUL LETTER MIEUM-PANSIOS + {0xA4E1, 0x3171}, //6356 #HANGUL LETTER KAPYEOUNMIEUM + {0xA4E2, 0x3172}, //6357 #HANGUL LETTER PIEUP-KIYEOK + {0xA4E3, 0x3173}, //6358 #HANGUL LETTER PIEUP-TIKEUT + {0xA4E4, 0x3174}, //6359 #HANGUL LETTER PIEUP-SIOS-KIYEOK + {0xA4E5, 0x3175}, //6360 #HANGUL LETTER PIEUP-SIOS-TIKEUT + {0xA4E6, 0x3176}, //6361 #HANGUL LETTER PIEUP-CIEUC + {0xA4E7, 0x3177}, //6362 #HANGUL LETTER PIEUP-THIEUTH + {0xA4E8, 0x3178}, //6363 #HANGUL LETTER KAPYEOUNPIEUP + {0xA4E9, 0x3179}, //6364 #HANGUL LETTER KAPYEOUNSSANGPIEUP + {0xA4EA, 0x317A}, //6365 #HANGUL LETTER SIOS-KIYEOK + {0xA4EB, 0x317B}, //6366 #HANGUL LETTER SIOS-NIEUN + {0xA4EC, 0x317C}, //6367 #HANGUL LETTER SIOS-TIKEUT + {0xA4ED, 0x317D}, //6368 #HANGUL LETTER SIOS-PIEUP + {0xA4EE, 0x317E}, //6369 #HANGUL LETTER SIOS-CIEUC + {0xA4EF, 0x317F}, //6370 #HANGUL LETTER PANSIOS + {0xA4F0, 0x3180}, //6371 #HANGUL LETTER SSANGIEUNG + {0xA4F1, 0x3181}, //6372 #HANGUL LETTER YESIEUNG + {0xA4F2, 0x3182}, //6373 #HANGUL LETTER YESIEUNG-SIOS + {0xA4F3, 0x3183}, //6374 #HANGUL LETTER YESIEUNG-PANSIOS + {0xA4F4, 0x3184}, //6375 #HANGUL LETTER KAPYEOUNPHIEUPH + {0xA4F5, 0x3185}, //6376 #HANGUL LETTER SSANGHIEUH + {0xA4F6, 0x3186}, //6377 #HANGUL LETTER YEORINHIEUH + {0xA4F7, 0x3187}, //6378 #HANGUL LETTER YO-YA + {0xA4F8, 0x3188}, //6379 #HANGUL LETTER YO-YAE + {0xA4F9, 0x3189}, //6380 #HANGUL LETTER YO-I + {0xA4FA, 0x318A}, //6381 #HANGUL LETTER YU-YEO + {0xA4FB, 0x318B}, //6382 #HANGUL LETTER YU-YE + {0xA4FC, 0x318C}, //6383 #HANGUL LETTER YU-I + {0xA4FD, 0x318D}, //6384 #HANGUL LETTER ARAEA + {0xA4FE, 0x318E}, //6385 #HANGUL LETTER ARAEAE + {0xA541, 0xCA47}, //6386 #HANGUL SYLLABLE SSANGCIEUC YAE CHIEUCH + {0xA542, 0xCA48}, //6387 #HANGUL SYLLABLE SSANGCIEUC YAE KHIEUKH + {0xA543, 0xCA49}, //6388 #HANGUL SYLLABLE SSANGCIEUC YAE THIEUTH + {0xA544, 0xCA4A}, //6389 #HANGUL SYLLABLE SSANGCIEUC YAE PHIEUPH + {0xA545, 0xCA4B}, //6390 #HANGUL SYLLABLE SSANGCIEUC YAE HIEUH + {0xA546, 0xCA4E}, //6391 #HANGUL SYLLABLE SSANGCIEUC EO SSANGKIYEOK + {0xA547, 0xCA4F}, //6392 #HANGUL SYLLABLE SSANGCIEUC EO KIYEOKSIOS + {0xA548, 0xCA51}, //6393 #HANGUL SYLLABLE SSANGCIEUC EO NIEUNCIEUC + {0xA549, 0xCA52}, //6394 #HANGUL SYLLABLE SSANGCIEUC EO NIEUNHIEUH + {0xA54A, 0xCA53}, //6395 #HANGUL SYLLABLE SSANGCIEUC EO TIKEUT + {0xA54B, 0xCA55}, //6396 #HANGUL SYLLABLE SSANGCIEUC EO RIEULKIYEOK + {0xA54C, 0xCA56}, //6397 #HANGUL SYLLABLE SSANGCIEUC EO RIEULMIEUM + {0xA54D, 0xCA57}, //6398 #HANGUL SYLLABLE SSANGCIEUC EO RIEULPIEUP + {0xA54E, 0xCA58}, //6399 #HANGUL SYLLABLE SSANGCIEUC EO RIEULSIOS + {0xA54F, 0xCA59}, //6400 #HANGUL SYLLABLE SSANGCIEUC EO RIEULTHIEUTH + {0xA550, 0xCA5A}, //6401 #HANGUL SYLLABLE SSANGCIEUC EO RIEULPHIEUPH + {0xA551, 0xCA5B}, //6402 #HANGUL SYLLABLE SSANGCIEUC EO RIEULHIEUH + {0xA552, 0xCA5E}, //6403 #HANGUL SYLLABLE SSANGCIEUC EO PIEUPSIOS + {0xA553, 0xCA62}, //6404 #HANGUL SYLLABLE SSANGCIEUC EO CIEUC + {0xA554, 0xCA63}, //6405 #HANGUL SYLLABLE SSANGCIEUC EO CHIEUCH + {0xA555, 0xCA64}, //6406 #HANGUL SYLLABLE SSANGCIEUC EO KHIEUKH + {0xA556, 0xCA65}, //6407 #HANGUL SYLLABLE SSANGCIEUC EO THIEUTH + {0xA557, 0xCA66}, //6408 #HANGUL SYLLABLE SSANGCIEUC EO PHIEUPH + {0xA558, 0xCA67}, //6409 #HANGUL SYLLABLE SSANGCIEUC EO HIEUH + {0xA559, 0xCA69}, //6410 #HANGUL SYLLABLE SSANGCIEUC E KIYEOK + {0xA55A, 0xCA6A}, //6411 #HANGUL SYLLABLE SSANGCIEUC E SSANGKIYEOK + {0xA561, 0xCA6B}, //6412 #HANGUL SYLLABLE SSANGCIEUC E KIYEOKSIOS + {0xA562, 0xCA6C}, //6413 #HANGUL SYLLABLE SSANGCIEUC E NIEUN + {0xA563, 0xCA6D}, //6414 #HANGUL SYLLABLE SSANGCIEUC E NIEUNCIEUC + {0xA564, 0xCA6E}, //6415 #HANGUL SYLLABLE SSANGCIEUC E NIEUNHIEUH + {0xA565, 0xCA6F}, //6416 #HANGUL SYLLABLE SSANGCIEUC E TIKEUT + {0xA566, 0xCA70}, //6417 #HANGUL SYLLABLE SSANGCIEUC E RIEUL + {0xA567, 0xCA71}, //6418 #HANGUL SYLLABLE SSANGCIEUC E RIEULKIYEOK + {0xA568, 0xCA72}, //6419 #HANGUL SYLLABLE SSANGCIEUC E RIEULMIEUM + {0xA569, 0xCA73}, //6420 #HANGUL SYLLABLE SSANGCIEUC E RIEULPIEUP + {0xA56A, 0xCA74}, //6421 #HANGUL SYLLABLE SSANGCIEUC E RIEULSIOS + {0xA56B, 0xCA75}, //6422 #HANGUL SYLLABLE SSANGCIEUC E RIEULTHIEUTH + {0xA56C, 0xCA76}, //6423 #HANGUL SYLLABLE SSANGCIEUC E RIEULPHIEUPH + {0xA56D, 0xCA77}, //6424 #HANGUL SYLLABLE SSANGCIEUC E RIEULHIEUH + {0xA56E, 0xCA78}, //6425 #HANGUL SYLLABLE SSANGCIEUC E MIEUM + {0xA56F, 0xCA79}, //6426 #HANGUL SYLLABLE SSANGCIEUC E PIEUP + {0xA570, 0xCA7A}, //6427 #HANGUL SYLLABLE SSANGCIEUC E PIEUPSIOS + {0xA571, 0xCA7B}, //6428 #HANGUL SYLLABLE SSANGCIEUC E SIOS + {0xA572, 0xCA7C}, //6429 #HANGUL SYLLABLE SSANGCIEUC E SSANGSIOS + {0xA573, 0xCA7E}, //6430 #HANGUL SYLLABLE SSANGCIEUC E CIEUC + {0xA574, 0xCA7F}, //6431 #HANGUL SYLLABLE SSANGCIEUC E CHIEUCH + {0xA575, 0xCA80}, //6432 #HANGUL SYLLABLE SSANGCIEUC E KHIEUKH + {0xA576, 0xCA81}, //6433 #HANGUL SYLLABLE SSANGCIEUC E THIEUTH + {0xA577, 0xCA82}, //6434 #HANGUL SYLLABLE SSANGCIEUC E PHIEUPH + {0xA578, 0xCA83}, //6435 #HANGUL SYLLABLE SSANGCIEUC E HIEUH + {0xA579, 0xCA85}, //6436 #HANGUL SYLLABLE SSANGCIEUC YEO KIYEOK + {0xA57A, 0xCA86}, //6437 #HANGUL SYLLABLE SSANGCIEUC YEO SSANGKIYEOK + {0xA581, 0xCA87}, //6438 #HANGUL SYLLABLE SSANGCIEUC YEO KIYEOKSIOS + {0xA582, 0xCA88}, //6439 #HANGUL SYLLABLE SSANGCIEUC YEO NIEUN + {0xA583, 0xCA89}, //6440 #HANGUL SYLLABLE SSANGCIEUC YEO NIEUNCIEUC + {0xA584, 0xCA8A}, //6441 #HANGUL SYLLABLE SSANGCIEUC YEO NIEUNHIEUH + {0xA585, 0xCA8B}, //6442 #HANGUL SYLLABLE SSANGCIEUC YEO TIKEUT + {0xA586, 0xCA8C}, //6443 #HANGUL SYLLABLE SSANGCIEUC YEO RIEUL + {0xA587, 0xCA8D}, //6444 #HANGUL SYLLABLE SSANGCIEUC YEO RIEULKIYEOK + {0xA588, 0xCA8E}, //6445 #HANGUL SYLLABLE SSANGCIEUC YEO RIEULMIEUM + {0xA589, 0xCA8F}, //6446 #HANGUL SYLLABLE SSANGCIEUC YEO RIEULPIEUP + {0xA58A, 0xCA90}, //6447 #HANGUL SYLLABLE SSANGCIEUC YEO RIEULSIOS + {0xA58B, 0xCA91}, //6448 #HANGUL SYLLABLE SSANGCIEUC YEO RIEULTHIEUTH + {0xA58C, 0xCA92}, //6449 #HANGUL SYLLABLE SSANGCIEUC YEO RIEULPHIEUPH + {0xA58D, 0xCA93}, //6450 #HANGUL SYLLABLE SSANGCIEUC YEO RIEULHIEUH + {0xA58E, 0xCA94}, //6451 #HANGUL SYLLABLE SSANGCIEUC YEO MIEUM + {0xA58F, 0xCA95}, //6452 #HANGUL SYLLABLE SSANGCIEUC YEO PIEUP + {0xA590, 0xCA96}, //6453 #HANGUL SYLLABLE SSANGCIEUC YEO PIEUPSIOS + {0xA591, 0xCA97}, //6454 #HANGUL SYLLABLE SSANGCIEUC YEO SIOS + {0xA592, 0xCA99}, //6455 #HANGUL SYLLABLE SSANGCIEUC YEO IEUNG + {0xA593, 0xCA9A}, //6456 #HANGUL SYLLABLE SSANGCIEUC YEO CIEUC + {0xA594, 0xCA9B}, //6457 #HANGUL SYLLABLE SSANGCIEUC YEO CHIEUCH + {0xA595, 0xCA9C}, //6458 #HANGUL SYLLABLE SSANGCIEUC YEO KHIEUKH + {0xA596, 0xCA9D}, //6459 #HANGUL SYLLABLE SSANGCIEUC YEO THIEUTH + {0xA597, 0xCA9E}, //6460 #HANGUL SYLLABLE SSANGCIEUC YEO PHIEUPH + {0xA598, 0xCA9F}, //6461 #HANGUL SYLLABLE SSANGCIEUC YEO HIEUH + {0xA599, 0xCAA0}, //6462 #HANGUL SYLLABLE SSANGCIEUC YE + {0xA59A, 0xCAA1}, //6463 #HANGUL SYLLABLE SSANGCIEUC YE KIYEOK + {0xA59B, 0xCAA2}, //6464 #HANGUL SYLLABLE SSANGCIEUC YE SSANGKIYEOK + {0xA59C, 0xCAA3}, //6465 #HANGUL SYLLABLE SSANGCIEUC YE KIYEOKSIOS + {0xA59D, 0xCAA4}, //6466 #HANGUL SYLLABLE SSANGCIEUC YE NIEUN + {0xA59E, 0xCAA5}, //6467 #HANGUL SYLLABLE SSANGCIEUC YE NIEUNCIEUC + {0xA59F, 0xCAA6}, //6468 #HANGUL SYLLABLE SSANGCIEUC YE NIEUNHIEUH + {0xA5A0, 0xCAA7}, //6469 #HANGUL SYLLABLE SSANGCIEUC YE TIKEUT + {0xA5A1, 0x2170}, //6470 #SMALL ROMAN NUMERAL ONE + {0xA5A2, 0x2171}, //6471 #SMALL ROMAN NUMERAL TWO + {0xA5A3, 0x2172}, //6472 #SMALL ROMAN NUMERAL THREE + {0xA5A4, 0x2173}, //6473 #SMALL ROMAN NUMERAL FOUR + {0xA5A5, 0x2174}, //6474 #SMALL ROMAN NUMERAL FIVE + {0xA5A6, 0x2175}, //6475 #SMALL ROMAN NUMERAL SIX + {0xA5A7, 0x2176}, //6476 #SMALL ROMAN NUMERAL SEVEN + {0xA5A8, 0x2177}, //6477 #SMALL ROMAN NUMERAL EIGHT + {0xA5A9, 0x2178}, //6478 #SMALL ROMAN NUMERAL NINE + {0xA5AA, 0x2179}, //6479 #SMALL ROMAN NUMERAL TEN + {0xA5B0, 0x2160}, //6480 #ROMAN NUMERAL ONE + {0xA5B1, 0x2161}, //6481 #ROMAN NUMERAL TWO + {0xA5B2, 0x2162}, //6482 #ROMAN NUMERAL THREE + {0xA5B3, 0x2163}, //6483 #ROMAN NUMERAL FOUR + {0xA5B4, 0x2164}, //6484 #ROMAN NUMERAL FIVE + {0xA5B5, 0x2165}, //6485 #ROMAN NUMERAL SIX + {0xA5B6, 0x2166}, //6486 #ROMAN NUMERAL SEVEN + {0xA5B7, 0x2167}, //6487 #ROMAN NUMERAL EIGHT + {0xA5B8, 0x2168}, //6488 #ROMAN NUMERAL NINE + {0xA5B9, 0x2169}, //6489 #ROMAN NUMERAL TEN + {0xA5C1, 0x0391}, //6490 #GREEK CAPITAL LETTER ALPHA + {0xA5C2, 0x0392}, //6491 #GREEK CAPITAL LETTER BETA + {0xA5C3, 0x0393}, //6492 #GREEK CAPITAL LETTER GAMMA + {0xA5C4, 0x0394}, //6493 #GREEK CAPITAL LETTER DELTA + {0xA5C5, 0x0395}, //6494 #GREEK CAPITAL LETTER EPSILON + {0xA5C6, 0x0396}, //6495 #GREEK CAPITAL LETTER ZETA + {0xA5C7, 0x0397}, //6496 #GREEK CAPITAL LETTER ETA + {0xA5C8, 0x0398}, //6497 #GREEK CAPITAL LETTER THETA + {0xA5C9, 0x0399}, //6498 #GREEK CAPITAL LETTER IOTA + {0xA5CA, 0x039A}, //6499 #GREEK CAPITAL LETTER KAPPA + {0xA5CB, 0x039B}, //6500 #GREEK CAPITAL LETTER LAMDA + {0xA5CC, 0x039C}, //6501 #GREEK CAPITAL LETTER MU + {0xA5CD, 0x039D}, //6502 #GREEK CAPITAL LETTER NU + {0xA5CE, 0x039E}, //6503 #GREEK CAPITAL LETTER XI + {0xA5CF, 0x039F}, //6504 #GREEK CAPITAL LETTER OMICRON + {0xA5D0, 0x03A0}, //6505 #GREEK CAPITAL LETTER PI + {0xA5D1, 0x03A1}, //6506 #GREEK CAPITAL LETTER RHO + {0xA5D2, 0x03A3}, //6507 #GREEK CAPITAL LETTER SIGMA + {0xA5D3, 0x03A4}, //6508 #GREEK CAPITAL LETTER TAU + {0xA5D4, 0x03A5}, //6509 #GREEK CAPITAL LETTER UPSILON + {0xA5D5, 0x03A6}, //6510 #GREEK CAPITAL LETTER PHI + {0xA5D6, 0x03A7}, //6511 #GREEK CAPITAL LETTER CHI + {0xA5D7, 0x03A8}, //6512 #GREEK CAPITAL LETTER PSI + {0xA5D8, 0x03A9}, //6513 #GREEK CAPITAL LETTER OMEGA + {0xA5E1, 0x03B1}, //6514 #GREEK SMALL LETTER ALPHA + {0xA5E2, 0x03B2}, //6515 #GREEK SMALL LETTER BETA + {0xA5E3, 0x03B3}, //6516 #GREEK SMALL LETTER GAMMA + {0xA5E4, 0x03B4}, //6517 #GREEK SMALL LETTER DELTA + {0xA5E5, 0x03B5}, //6518 #GREEK SMALL LETTER EPSILON + {0xA5E6, 0x03B6}, //6519 #GREEK SMALL LETTER ZETA + {0xA5E7, 0x03B7}, //6520 #GREEK SMALL LETTER ETA + {0xA5E8, 0x03B8}, //6521 #GREEK SMALL LETTER THETA + {0xA5E9, 0x03B9}, //6522 #GREEK SMALL LETTER IOTA + {0xA5EA, 0x03BA}, //6523 #GREEK SMALL LETTER KAPPA + {0xA5EB, 0x03BB}, //6524 #GREEK SMALL LETTER LAMDA + {0xA5EC, 0x03BC}, //6525 #GREEK SMALL LETTER MU + {0xA5ED, 0x03BD}, //6526 #GREEK SMALL LETTER NU + {0xA5EE, 0x03BE}, //6527 #GREEK SMALL LETTER XI + {0xA5EF, 0x03BF}, //6528 #GREEK SMALL LETTER OMICRON + {0xA5F0, 0x03C0}, //6529 #GREEK SMALL LETTER PI + {0xA5F1, 0x03C1}, //6530 #GREEK SMALL LETTER RHO + {0xA5F2, 0x03C3}, //6531 #GREEK SMALL LETTER SIGMA + {0xA5F3, 0x03C4}, //6532 #GREEK SMALL LETTER TAU + {0xA5F4, 0x03C5}, //6533 #GREEK SMALL LETTER UPSILON + {0xA5F5, 0x03C6}, //6534 #GREEK SMALL LETTER PHI + {0xA5F6, 0x03C7}, //6535 #GREEK SMALL LETTER CHI + {0xA5F7, 0x03C8}, //6536 #GREEK SMALL LETTER PSI + {0xA5F8, 0x03C9}, //6537 #GREEK SMALL LETTER OMEGA + {0xA641, 0xCAA8}, //6538 #HANGUL SYLLABLE SSANGCIEUC YE RIEUL + {0xA642, 0xCAA9}, //6539 #HANGUL SYLLABLE SSANGCIEUC YE RIEULKIYEOK + {0xA643, 0xCAAA}, //6540 #HANGUL SYLLABLE SSANGCIEUC YE RIEULMIEUM + {0xA644, 0xCAAB}, //6541 #HANGUL SYLLABLE SSANGCIEUC YE RIEULPIEUP + {0xA645, 0xCAAC}, //6542 #HANGUL SYLLABLE SSANGCIEUC YE RIEULSIOS + {0xA646, 0xCAAD}, //6543 #HANGUL SYLLABLE SSANGCIEUC YE RIEULTHIEUTH + {0xA647, 0xCAAE}, //6544 #HANGUL SYLLABLE SSANGCIEUC YE RIEULPHIEUPH + {0xA648, 0xCAAF}, //6545 #HANGUL SYLLABLE SSANGCIEUC YE RIEULHIEUH + {0xA649, 0xCAB0}, //6546 #HANGUL SYLLABLE SSANGCIEUC YE MIEUM + {0xA64A, 0xCAB1}, //6547 #HANGUL SYLLABLE SSANGCIEUC YE PIEUP + {0xA64B, 0xCAB2}, //6548 #HANGUL SYLLABLE SSANGCIEUC YE PIEUPSIOS + {0xA64C, 0xCAB3}, //6549 #HANGUL SYLLABLE SSANGCIEUC YE SIOS + {0xA64D, 0xCAB4}, //6550 #HANGUL SYLLABLE SSANGCIEUC YE SSANGSIOS + {0xA64E, 0xCAB5}, //6551 #HANGUL SYLLABLE SSANGCIEUC YE IEUNG + {0xA64F, 0xCAB6}, //6552 #HANGUL SYLLABLE SSANGCIEUC YE CIEUC + {0xA650, 0xCAB7}, //6553 #HANGUL SYLLABLE SSANGCIEUC YE CHIEUCH + {0xA651, 0xCAB8}, //6554 #HANGUL SYLLABLE SSANGCIEUC YE KHIEUKH + {0xA652, 0xCAB9}, //6555 #HANGUL SYLLABLE SSANGCIEUC YE THIEUTH + {0xA653, 0xCABA}, //6556 #HANGUL SYLLABLE SSANGCIEUC YE PHIEUPH + {0xA654, 0xCABB}, //6557 #HANGUL SYLLABLE SSANGCIEUC YE HIEUH + {0xA655, 0xCABE}, //6558 #HANGUL SYLLABLE SSANGCIEUC O SSANGKIYEOK + {0xA656, 0xCABF}, //6559 #HANGUL SYLLABLE SSANGCIEUC O KIYEOKSIOS + {0xA657, 0xCAC1}, //6560 #HANGUL SYLLABLE SSANGCIEUC O NIEUNCIEUC + {0xA658, 0xCAC2}, //6561 #HANGUL SYLLABLE SSANGCIEUC O NIEUNHIEUH + {0xA659, 0xCAC3}, //6562 #HANGUL SYLLABLE SSANGCIEUC O TIKEUT + {0xA65A, 0xCAC5}, //6563 #HANGUL SYLLABLE SSANGCIEUC O RIEULKIYEOK + {0xA661, 0xCAC6}, //6564 #HANGUL SYLLABLE SSANGCIEUC O RIEULMIEUM + {0xA662, 0xCAC7}, //6565 #HANGUL SYLLABLE SSANGCIEUC O RIEULPIEUP + {0xA663, 0xCAC8}, //6566 #HANGUL SYLLABLE SSANGCIEUC O RIEULSIOS + {0xA664, 0xCAC9}, //6567 #HANGUL SYLLABLE SSANGCIEUC O RIEULTHIEUTH + {0xA665, 0xCACA}, //6568 #HANGUL SYLLABLE SSANGCIEUC O RIEULPHIEUPH + {0xA666, 0xCACB}, //6569 #HANGUL SYLLABLE SSANGCIEUC O RIEULHIEUH + {0xA667, 0xCACE}, //6570 #HANGUL SYLLABLE SSANGCIEUC O PIEUPSIOS + {0xA668, 0xCAD0}, //6571 #HANGUL SYLLABLE SSANGCIEUC O SSANGSIOS + {0xA669, 0xCAD2}, //6572 #HANGUL SYLLABLE SSANGCIEUC O CIEUC + {0xA66A, 0xCAD4}, //6573 #HANGUL SYLLABLE SSANGCIEUC O KHIEUKH + {0xA66B, 0xCAD5}, //6574 #HANGUL SYLLABLE SSANGCIEUC O THIEUTH + {0xA66C, 0xCAD6}, //6575 #HANGUL SYLLABLE SSANGCIEUC O PHIEUPH + {0xA66D, 0xCAD7}, //6576 #HANGUL SYLLABLE SSANGCIEUC O HIEUH + {0xA66E, 0xCADA}, //6577 #HANGUL SYLLABLE SSANGCIEUC WA SSANGKIYEOK + {0xA66F, 0xCADB}, //6578 #HANGUL SYLLABLE SSANGCIEUC WA KIYEOKSIOS + {0xA670, 0xCADC}, //6579 #HANGUL SYLLABLE SSANGCIEUC WA NIEUN + {0xA671, 0xCADD}, //6580 #HANGUL SYLLABLE SSANGCIEUC WA NIEUNCIEUC + {0xA672, 0xCADE}, //6581 #HANGUL SYLLABLE SSANGCIEUC WA NIEUNHIEUH + {0xA673, 0xCADF}, //6582 #HANGUL SYLLABLE SSANGCIEUC WA TIKEUT + {0xA674, 0xCAE1}, //6583 #HANGUL SYLLABLE SSANGCIEUC WA RIEULKIYEOK + {0xA675, 0xCAE2}, //6584 #HANGUL SYLLABLE SSANGCIEUC WA RIEULMIEUM + {0xA676, 0xCAE3}, //6585 #HANGUL SYLLABLE SSANGCIEUC WA RIEULPIEUP + {0xA677, 0xCAE4}, //6586 #HANGUL SYLLABLE SSANGCIEUC WA RIEULSIOS + {0xA678, 0xCAE5}, //6587 #HANGUL SYLLABLE SSANGCIEUC WA RIEULTHIEUTH + {0xA679, 0xCAE6}, //6588 #HANGUL SYLLABLE SSANGCIEUC WA RIEULPHIEUPH + {0xA67A, 0xCAE7}, //6589 #HANGUL SYLLABLE SSANGCIEUC WA RIEULHIEUH + {0xA681, 0xCAE8}, //6590 #HANGUL SYLLABLE SSANGCIEUC WA MIEUM + {0xA682, 0xCAE9}, //6591 #HANGUL SYLLABLE SSANGCIEUC WA PIEUP + {0xA683, 0xCAEA}, //6592 #HANGUL SYLLABLE SSANGCIEUC WA PIEUPSIOS + {0xA684, 0xCAEB}, //6593 #HANGUL SYLLABLE SSANGCIEUC WA SIOS + {0xA685, 0xCAED}, //6594 #HANGUL SYLLABLE SSANGCIEUC WA IEUNG + {0xA686, 0xCAEE}, //6595 #HANGUL SYLLABLE SSANGCIEUC WA CIEUC + {0xA687, 0xCAEF}, //6596 #HANGUL SYLLABLE SSANGCIEUC WA CHIEUCH + {0xA688, 0xCAF0}, //6597 #HANGUL SYLLABLE SSANGCIEUC WA KHIEUKH + {0xA689, 0xCAF1}, //6598 #HANGUL SYLLABLE SSANGCIEUC WA THIEUTH + {0xA68A, 0xCAF2}, //6599 #HANGUL SYLLABLE SSANGCIEUC WA PHIEUPH + {0xA68B, 0xCAF3}, //6600 #HANGUL SYLLABLE SSANGCIEUC WA HIEUH + {0xA68C, 0xCAF5}, //6601 #HANGUL SYLLABLE SSANGCIEUC WAE KIYEOK + {0xA68D, 0xCAF6}, //6602 #HANGUL SYLLABLE SSANGCIEUC WAE SSANGKIYEOK + {0xA68E, 0xCAF7}, //6603 #HANGUL SYLLABLE SSANGCIEUC WAE KIYEOKSIOS + {0xA68F, 0xCAF8}, //6604 #HANGUL SYLLABLE SSANGCIEUC WAE NIEUN + {0xA690, 0xCAF9}, //6605 #HANGUL SYLLABLE SSANGCIEUC WAE NIEUNCIEUC + {0xA691, 0xCAFA}, //6606 #HANGUL SYLLABLE SSANGCIEUC WAE NIEUNHIEUH + {0xA692, 0xCAFB}, //6607 #HANGUL SYLLABLE SSANGCIEUC WAE TIKEUT + {0xA693, 0xCAFC}, //6608 #HANGUL SYLLABLE SSANGCIEUC WAE RIEUL + {0xA694, 0xCAFD}, //6609 #HANGUL SYLLABLE SSANGCIEUC WAE RIEULKIYEOK + {0xA695, 0xCAFE}, //6610 #HANGUL SYLLABLE SSANGCIEUC WAE RIEULMIEUM + {0xA696, 0xCAFF}, //6611 #HANGUL SYLLABLE SSANGCIEUC WAE RIEULPIEUP + {0xA697, 0xCB00}, //6612 #HANGUL SYLLABLE SSANGCIEUC WAE RIEULSIOS + {0xA698, 0xCB01}, //6613 #HANGUL SYLLABLE SSANGCIEUC WAE RIEULTHIEUTH + {0xA699, 0xCB02}, //6614 #HANGUL SYLLABLE SSANGCIEUC WAE RIEULPHIEUPH + {0xA69A, 0xCB03}, //6615 #HANGUL SYLLABLE SSANGCIEUC WAE RIEULHIEUH + {0xA69B, 0xCB04}, //6616 #HANGUL SYLLABLE SSANGCIEUC WAE MIEUM + {0xA69C, 0xCB05}, //6617 #HANGUL SYLLABLE SSANGCIEUC WAE PIEUP + {0xA69D, 0xCB06}, //6618 #HANGUL SYLLABLE SSANGCIEUC WAE PIEUPSIOS + {0xA69E, 0xCB07}, //6619 #HANGUL SYLLABLE SSANGCIEUC WAE SIOS + {0xA69F, 0xCB09}, //6620 #HANGUL SYLLABLE SSANGCIEUC WAE IEUNG + {0xA6A0, 0xCB0A}, //6621 #HANGUL SYLLABLE SSANGCIEUC WAE CIEUC + {0xA6A1, 0x2500}, //6622 #BOX DRAWINGS LIGHT HORIZONTAL + {0xA6A2, 0x2502}, //6623 #BOX DRAWINGS LIGHT VERTICAL + {0xA6A3, 0x250C}, //6624 #BOX DRAWINGS LIGHT DOWN AND RIGHT + {0xA6A4, 0x2510}, //6625 #BOX DRAWINGS LIGHT DOWN AND LEFT + {0xA6A5, 0x2518}, //6626 #BOX DRAWINGS LIGHT UP AND LEFT + {0xA6A6, 0x2514}, //6627 #BOX DRAWINGS LIGHT UP AND RIGHT + {0xA6A7, 0x251C}, //6628 #BOX DRAWINGS LIGHT VERTICAL AND RIGHT + {0xA6A8, 0x252C}, //6629 #BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + {0xA6A9, 0x2524}, //6630 #BOX DRAWINGS LIGHT VERTICAL AND LEFT + {0xA6AA, 0x2534}, //6631 #BOX DRAWINGS LIGHT UP AND HORIZONTAL + {0xA6AB, 0x253C}, //6632 #BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + {0xA6AC, 0x2501}, //6633 #BOX DRAWINGS HEAVY HORIZONTAL + {0xA6AD, 0x2503}, //6634 #BOX DRAWINGS HEAVY VERTICAL + {0xA6AE, 0x250F}, //6635 #BOX DRAWINGS HEAVY DOWN AND RIGHT + {0xA6AF, 0x2513}, //6636 #BOX DRAWINGS HEAVY DOWN AND LEFT + {0xA6B0, 0x251B}, //6637 #BOX DRAWINGS HEAVY UP AND LEFT + {0xA6B1, 0x2517}, //6638 #BOX DRAWINGS HEAVY UP AND RIGHT + {0xA6B2, 0x2523}, //6639 #BOX DRAWINGS HEAVY VERTICAL AND RIGHT + {0xA6B3, 0x2533}, //6640 #BOX DRAWINGS HEAVY DOWN AND HORIZONTAL + {0xA6B4, 0x252B}, //6641 #BOX DRAWINGS HEAVY VERTICAL AND LEFT + {0xA6B5, 0x253B}, //6642 #BOX DRAWINGS HEAVY UP AND HORIZONTAL + {0xA6B6, 0x254B}, //6643 #BOX DRAWINGS HEAVY VERTICAL AND HORIZONTAL + {0xA6B7, 0x2520}, //6644 #BOX DRAWINGS VERTICAL HEAVY AND RIGHT LIGHT + {0xA6B8, 0x252F}, //6645 #BOX DRAWINGS DOWN LIGHT AND HORIZONTAL HEAVY + {0xA6B9, 0x2528}, //6646 #BOX DRAWINGS VERTICAL HEAVY AND LEFT LIGHT + {0xA6BA, 0x2537}, //6647 #BOX DRAWINGS UP LIGHT AND HORIZONTAL HEAVY + {0xA6BB, 0x253F}, //6648 #BOX DRAWINGS VERTICAL LIGHT AND HORIZONTAL HEAVY + {0xA6BC, 0x251D}, //6649 #BOX DRAWINGS VERTICAL LIGHT AND RIGHT HEAVY + {0xA6BD, 0x2530}, //6650 #BOX DRAWINGS DOWN HEAVY AND HORIZONTAL LIGHT + {0xA6BE, 0x2525}, //6651 #BOX DRAWINGS VERTICAL LIGHT AND LEFT HEAVY + {0xA6BF, 0x2538}, //6652 #BOX DRAWINGS UP HEAVY AND HORIZONTAL LIGHT + {0xA6C0, 0x2542}, //6653 #BOX DRAWINGS VERTICAL HEAVY AND HORIZONTAL LIGHT + {0xA6C1, 0x2512}, //6654 #BOX DRAWINGS DOWN HEAVY AND LEFT LIGHT + {0xA6C2, 0x2511}, //6655 #BOX DRAWINGS DOWN LIGHT AND LEFT HEAVY + {0xA6C3, 0x251A}, //6656 #BOX DRAWINGS UP HEAVY AND LEFT LIGHT + {0xA6C4, 0x2519}, //6657 #BOX DRAWINGS UP LIGHT AND LEFT HEAVY + {0xA6C5, 0x2516}, //6658 #BOX DRAWINGS UP HEAVY AND RIGHT LIGHT + {0xA6C6, 0x2515}, //6659 #BOX DRAWINGS UP LIGHT AND RIGHT HEAVY + {0xA6C7, 0x250E}, //6660 #BOX DRAWINGS DOWN HEAVY AND RIGHT LIGHT + {0xA6C8, 0x250D}, //6661 #BOX DRAWINGS DOWN LIGHT AND RIGHT HEAVY + {0xA6C9, 0x251E}, //6662 #BOX DRAWINGS UP HEAVY AND RIGHT DOWN LIGHT + {0xA6CA, 0x251F}, //6663 #BOX DRAWINGS DOWN HEAVY AND RIGHT UP LIGHT + {0xA6CB, 0x2521}, //6664 #BOX DRAWINGS DOWN LIGHT AND RIGHT UP HEAVY + {0xA6CC, 0x2522}, //6665 #BOX DRAWINGS UP LIGHT AND RIGHT DOWN HEAVY + {0xA6CD, 0x2526}, //6666 #BOX DRAWINGS UP HEAVY AND LEFT DOWN LIGHT + {0xA6CE, 0x2527}, //6667 #BOX DRAWINGS DOWN HEAVY AND LEFT UP LIGHT + {0xA6CF, 0x2529}, //6668 #BOX DRAWINGS DOWN LIGHT AND LEFT UP HEAVY + {0xA6D0, 0x252A}, //6669 #BOX DRAWINGS UP LIGHT AND LEFT DOWN HEAVY + {0xA6D1, 0x252D}, //6670 #BOX DRAWINGS LEFT HEAVY AND RIGHT DOWN LIGHT + {0xA6D2, 0x252E}, //6671 #BOX DRAWINGS RIGHT HEAVY AND LEFT DOWN LIGHT + {0xA6D3, 0x2531}, //6672 #BOX DRAWINGS RIGHT LIGHT AND LEFT DOWN HEAVY + {0xA6D4, 0x2532}, //6673 #BOX DRAWINGS LEFT LIGHT AND RIGHT DOWN HEAVY + {0xA6D5, 0x2535}, //6674 #BOX DRAWINGS LEFT HEAVY AND RIGHT UP LIGHT + {0xA6D6, 0x2536}, //6675 #BOX DRAWINGS RIGHT HEAVY AND LEFT UP LIGHT + {0xA6D7, 0x2539}, //6676 #BOX DRAWINGS RIGHT LIGHT AND LEFT UP HEAVY + {0xA6D8, 0x253A}, //6677 #BOX DRAWINGS LEFT LIGHT AND RIGHT UP HEAVY + {0xA6D9, 0x253D}, //6678 #BOX DRAWINGS LEFT HEAVY AND RIGHT VERTICAL LIGHT + {0xA6DA, 0x253E}, //6679 #BOX DRAWINGS RIGHT HEAVY AND LEFT VERTICAL LIGHT + {0xA6DB, 0x2540}, //6680 #BOX DRAWINGS UP HEAVY AND DOWN HORIZONTAL LIGHT + {0xA6DC, 0x2541}, //6681 #BOX DRAWINGS DOWN HEAVY AND UP HORIZONTAL LIGHT + {0xA6DD, 0x2543}, //6682 #BOX DRAWINGS LEFT UP HEAVY AND RIGHT DOWN LIGHT + {0xA6DE, 0x2544}, //6683 #BOX DRAWINGS RIGHT UP HEAVY AND LEFT DOWN LIGHT + {0xA6DF, 0x2545}, //6684 #BOX DRAWINGS LEFT DOWN HEAVY AND RIGHT UP LIGHT + {0xA6E0, 0x2546}, //6685 #BOX DRAWINGS RIGHT DOWN HEAVY AND LEFT UP LIGHT + {0xA6E1, 0x2547}, //6686 #BOX DRAWINGS DOWN LIGHT AND UP HORIZONTAL HEAVY + {0xA6E2, 0x2548}, //6687 #BOX DRAWINGS UP LIGHT AND DOWN HORIZONTAL HEAVY + {0xA6E3, 0x2549}, //6688 #BOX DRAWINGS RIGHT LIGHT AND LEFT VERTICAL HEAVY + {0xA6E4, 0x254A}, //6689 #BOX DRAWINGS LEFT LIGHT AND RIGHT VERTICAL HEAVY + {0xA741, 0xCB0B}, //6690 #HANGUL SYLLABLE SSANGCIEUC WAE CHIEUCH + {0xA742, 0xCB0C}, //6691 #HANGUL SYLLABLE SSANGCIEUC WAE KHIEUKH + {0xA743, 0xCB0D}, //6692 #HANGUL SYLLABLE SSANGCIEUC WAE THIEUTH + {0xA744, 0xCB0E}, //6693 #HANGUL SYLLABLE SSANGCIEUC WAE PHIEUPH + {0xA745, 0xCB0F}, //6694 #HANGUL SYLLABLE SSANGCIEUC WAE HIEUH + {0xA746, 0xCB11}, //6695 #HANGUL SYLLABLE SSANGCIEUC OE KIYEOK + {0xA747, 0xCB12}, //6696 #HANGUL SYLLABLE SSANGCIEUC OE SSANGKIYEOK + {0xA748, 0xCB13}, //6697 #HANGUL SYLLABLE SSANGCIEUC OE KIYEOKSIOS + {0xA749, 0xCB15}, //6698 #HANGUL SYLLABLE SSANGCIEUC OE NIEUNCIEUC + {0xA74A, 0xCB16}, //6699 #HANGUL SYLLABLE SSANGCIEUC OE NIEUNHIEUH + {0xA74B, 0xCB17}, //6700 #HANGUL SYLLABLE SSANGCIEUC OE TIKEUT + {0xA74C, 0xCB19}, //6701 #HANGUL SYLLABLE SSANGCIEUC OE RIEULKIYEOK + {0xA74D, 0xCB1A}, //6702 #HANGUL SYLLABLE SSANGCIEUC OE RIEULMIEUM + {0xA74E, 0xCB1B}, //6703 #HANGUL SYLLABLE SSANGCIEUC OE RIEULPIEUP + {0xA74F, 0xCB1C}, //6704 #HANGUL SYLLABLE SSANGCIEUC OE RIEULSIOS + {0xA750, 0xCB1D}, //6705 #HANGUL SYLLABLE SSANGCIEUC OE RIEULTHIEUTH + {0xA751, 0xCB1E}, //6706 #HANGUL SYLLABLE SSANGCIEUC OE RIEULPHIEUPH + {0xA752, 0xCB1F}, //6707 #HANGUL SYLLABLE SSANGCIEUC OE RIEULHIEUH + {0xA753, 0xCB22}, //6708 #HANGUL SYLLABLE SSANGCIEUC OE PIEUPSIOS + {0xA754, 0xCB23}, //6709 #HANGUL SYLLABLE SSANGCIEUC OE SIOS + {0xA755, 0xCB24}, //6710 #HANGUL SYLLABLE SSANGCIEUC OE SSANGSIOS + {0xA756, 0xCB25}, //6711 #HANGUL SYLLABLE SSANGCIEUC OE IEUNG + {0xA757, 0xCB26}, //6712 #HANGUL SYLLABLE SSANGCIEUC OE CIEUC + {0xA758, 0xCB27}, //6713 #HANGUL SYLLABLE SSANGCIEUC OE CHIEUCH + {0xA759, 0xCB28}, //6714 #HANGUL SYLLABLE SSANGCIEUC OE KHIEUKH + {0xA75A, 0xCB29}, //6715 #HANGUL SYLLABLE SSANGCIEUC OE THIEUTH + {0xA761, 0xCB2A}, //6716 #HANGUL SYLLABLE SSANGCIEUC OE PHIEUPH + {0xA762, 0xCB2B}, //6717 #HANGUL SYLLABLE SSANGCIEUC OE HIEUH + {0xA763, 0xCB2C}, //6718 #HANGUL SYLLABLE SSANGCIEUC YO + {0xA764, 0xCB2D}, //6719 #HANGUL SYLLABLE SSANGCIEUC YO KIYEOK + {0xA765, 0xCB2E}, //6720 #HANGUL SYLLABLE SSANGCIEUC YO SSANGKIYEOK + {0xA766, 0xCB2F}, //6721 #HANGUL SYLLABLE SSANGCIEUC YO KIYEOKSIOS + {0xA767, 0xCB30}, //6722 #HANGUL SYLLABLE SSANGCIEUC YO NIEUN + {0xA768, 0xCB31}, //6723 #HANGUL SYLLABLE SSANGCIEUC YO NIEUNCIEUC + {0xA769, 0xCB32}, //6724 #HANGUL SYLLABLE SSANGCIEUC YO NIEUNHIEUH + {0xA76A, 0xCB33}, //6725 #HANGUL SYLLABLE SSANGCIEUC YO TIKEUT + {0xA76B, 0xCB34}, //6726 #HANGUL SYLLABLE SSANGCIEUC YO RIEUL + {0xA76C, 0xCB35}, //6727 #HANGUL SYLLABLE SSANGCIEUC YO RIEULKIYEOK + {0xA76D, 0xCB36}, //6728 #HANGUL SYLLABLE SSANGCIEUC YO RIEULMIEUM + {0xA76E, 0xCB37}, //6729 #HANGUL SYLLABLE SSANGCIEUC YO RIEULPIEUP + {0xA76F, 0xCB38}, //6730 #HANGUL SYLLABLE SSANGCIEUC YO RIEULSIOS + {0xA770, 0xCB39}, //6731 #HANGUL SYLLABLE SSANGCIEUC YO RIEULTHIEUTH + {0xA771, 0xCB3A}, //6732 #HANGUL SYLLABLE SSANGCIEUC YO RIEULPHIEUPH + {0xA772, 0xCB3B}, //6733 #HANGUL SYLLABLE SSANGCIEUC YO RIEULHIEUH + {0xA773, 0xCB3C}, //6734 #HANGUL SYLLABLE SSANGCIEUC YO MIEUM + {0xA774, 0xCB3D}, //6735 #HANGUL SYLLABLE SSANGCIEUC YO PIEUP + {0xA775, 0xCB3E}, //6736 #HANGUL SYLLABLE SSANGCIEUC YO PIEUPSIOS + {0xA776, 0xCB3F}, //6737 #HANGUL SYLLABLE SSANGCIEUC YO SIOS + {0xA777, 0xCB40}, //6738 #HANGUL SYLLABLE SSANGCIEUC YO SSANGSIOS + {0xA778, 0xCB42}, //6739 #HANGUL SYLLABLE SSANGCIEUC YO CIEUC + {0xA779, 0xCB43}, //6740 #HANGUL SYLLABLE SSANGCIEUC YO CHIEUCH + {0xA77A, 0xCB44}, //6741 #HANGUL SYLLABLE SSANGCIEUC YO KHIEUKH + {0xA781, 0xCB45}, //6742 #HANGUL SYLLABLE SSANGCIEUC YO THIEUTH + {0xA782, 0xCB46}, //6743 #HANGUL SYLLABLE SSANGCIEUC YO PHIEUPH + {0xA783, 0xCB47}, //6744 #HANGUL SYLLABLE SSANGCIEUC YO HIEUH + {0xA784, 0xCB4A}, //6745 #HANGUL SYLLABLE SSANGCIEUC U SSANGKIYEOK + {0xA785, 0xCB4B}, //6746 #HANGUL SYLLABLE SSANGCIEUC U KIYEOKSIOS + {0xA786, 0xCB4D}, //6747 #HANGUL SYLLABLE SSANGCIEUC U NIEUNCIEUC + {0xA787, 0xCB4E}, //6748 #HANGUL SYLLABLE SSANGCIEUC U NIEUNHIEUH + {0xA788, 0xCB4F}, //6749 #HANGUL SYLLABLE SSANGCIEUC U TIKEUT + {0xA789, 0xCB51}, //6750 #HANGUL SYLLABLE SSANGCIEUC U RIEULKIYEOK + {0xA78A, 0xCB52}, //6751 #HANGUL SYLLABLE SSANGCIEUC U RIEULMIEUM + {0xA78B, 0xCB53}, //6752 #HANGUL SYLLABLE SSANGCIEUC U RIEULPIEUP + {0xA78C, 0xCB54}, //6753 #HANGUL SYLLABLE SSANGCIEUC U RIEULSIOS + {0xA78D, 0xCB55}, //6754 #HANGUL SYLLABLE SSANGCIEUC U RIEULTHIEUTH + {0xA78E, 0xCB56}, //6755 #HANGUL SYLLABLE SSANGCIEUC U RIEULPHIEUPH + {0xA78F, 0xCB57}, //6756 #HANGUL SYLLABLE SSANGCIEUC U RIEULHIEUH + {0xA790, 0xCB5A}, //6757 #HANGUL SYLLABLE SSANGCIEUC U PIEUPSIOS + {0xA791, 0xCB5B}, //6758 #HANGUL SYLLABLE SSANGCIEUC U SIOS + {0xA792, 0xCB5C}, //6759 #HANGUL SYLLABLE SSANGCIEUC U SSANGSIOS + {0xA793, 0xCB5E}, //6760 #HANGUL SYLLABLE SSANGCIEUC U CIEUC + {0xA794, 0xCB5F}, //6761 #HANGUL SYLLABLE SSANGCIEUC U CHIEUCH + {0xA795, 0xCB60}, //6762 #HANGUL SYLLABLE SSANGCIEUC U KHIEUKH + {0xA796, 0xCB61}, //6763 #HANGUL SYLLABLE SSANGCIEUC U THIEUTH + {0xA797, 0xCB62}, //6764 #HANGUL SYLLABLE SSANGCIEUC U PHIEUPH + {0xA798, 0xCB63}, //6765 #HANGUL SYLLABLE SSANGCIEUC U HIEUH + {0xA799, 0xCB65}, //6766 #HANGUL SYLLABLE SSANGCIEUC WEO KIYEOK + {0xA79A, 0xCB66}, //6767 #HANGUL SYLLABLE SSANGCIEUC WEO SSANGKIYEOK + {0xA79B, 0xCB67}, //6768 #HANGUL SYLLABLE SSANGCIEUC WEO KIYEOKSIOS + {0xA79C, 0xCB68}, //6769 #HANGUL SYLLABLE SSANGCIEUC WEO NIEUN + {0xA79D, 0xCB69}, //6770 #HANGUL SYLLABLE SSANGCIEUC WEO NIEUNCIEUC + {0xA79E, 0xCB6A}, //6771 #HANGUL SYLLABLE SSANGCIEUC WEO NIEUNHIEUH + {0xA79F, 0xCB6B}, //6772 #HANGUL SYLLABLE SSANGCIEUC WEO TIKEUT + {0xA7A0, 0xCB6C}, //6773 #HANGUL SYLLABLE SSANGCIEUC WEO RIEUL + {0xA7A1, 0x3395}, //6774 #SQUARE MU L + {0xA7A2, 0x3396}, //6775 #SQUARE ML + {0xA7A3, 0x3397}, //6776 #SQUARE DL + {0xA7A4, 0x2113}, //6777 #SCRIPT SMALL L + {0xA7A5, 0x3398}, //6778 #SQUARE KL + {0xA7A6, 0x33C4}, //6779 #SQUARE CC + {0xA7A7, 0x33A3}, //6780 #SQUARE MM CUBED + {0xA7A8, 0x33A4}, //6781 #SQUARE CM CUBED + {0xA7A9, 0x33A5}, //6782 #SQUARE M CUBED + {0xA7AA, 0x33A6}, //6783 #SQUARE KM CUBED + {0xA7AB, 0x3399}, //6784 #SQUARE FM + {0xA7AC, 0x339A}, //6785 #SQUARE NM + {0xA7AD, 0x339B}, //6786 #SQUARE MU M + {0xA7AE, 0x339C}, //6787 #SQUARE MM + {0xA7AF, 0x339D}, //6788 #SQUARE CM + {0xA7B0, 0x339E}, //6789 #SQUARE KM + {0xA7B1, 0x339F}, //6790 #SQUARE MM SQUARED + {0xA7B2, 0x33A0}, //6791 #SQUARE CM SQUARED + {0xA7B3, 0x33A1}, //6792 #SQUARE M SQUARED + {0xA7B4, 0x33A2}, //6793 #SQUARE KM SQUARED + {0xA7B5, 0x33CA}, //6794 #SQUARE HA + {0xA7B6, 0x338D}, //6795 #SQUARE MU G + {0xA7B7, 0x338E}, //6796 #SQUARE MG + {0xA7B8, 0x338F}, //6797 #SQUARE KG + {0xA7B9, 0x33CF}, //6798 #SQUARE KT + {0xA7BA, 0x3388}, //6799 #SQUARE CAL + {0xA7BB, 0x3389}, //6800 #SQUARE KCAL + {0xA7BC, 0x33C8}, //6801 #SQUARE DB + {0xA7BD, 0x33A7}, //6802 #SQUARE M OVER S + {0xA7BE, 0x33A8}, //6803 #SQUARE M OVER S SQUARED + {0xA7BF, 0x33B0}, //6804 #SQUARE PS + {0xA7C0, 0x33B1}, //6805 #SQUARE NS + {0xA7C1, 0x33B2}, //6806 #SQUARE MU S + {0xA7C2, 0x33B3}, //6807 #SQUARE MS + {0xA7C3, 0x33B4}, //6808 #SQUARE PV + {0xA7C4, 0x33B5}, //6809 #SQUARE NV + {0xA7C5, 0x33B6}, //6810 #SQUARE MU V + {0xA7C6, 0x33B7}, //6811 #SQUARE MV + {0xA7C7, 0x33B8}, //6812 #SQUARE KV + {0xA7C8, 0x33B9}, //6813 #SQUARE MV MEGA + {0xA7C9, 0x3380}, //6814 #SQUARE PA AMPS + {0xA7CA, 0x3381}, //6815 #SQUARE NA + {0xA7CB, 0x3382}, //6816 #SQUARE MU A + {0xA7CC, 0x3383}, //6817 #SQUARE MA + {0xA7CD, 0x3384}, //6818 #SQUARE KA + {0xA7CE, 0x33BA}, //6819 #SQUARE PW + {0xA7CF, 0x33BB}, //6820 #SQUARE NW + {0xA7D0, 0x33BC}, //6821 #SQUARE MU W + {0xA7D1, 0x33BD}, //6822 #SQUARE MW + {0xA7D2, 0x33BE}, //6823 #SQUARE KW + {0xA7D3, 0x33BF}, //6824 #SQUARE MW MEGA + {0xA7D4, 0x3390}, //6825 #SQUARE HZ + {0xA7D5, 0x3391}, //6826 #SQUARE KHZ + {0xA7D6, 0x3392}, //6827 #SQUARE MHZ + {0xA7D7, 0x3393}, //6828 #SQUARE GHZ + {0xA7D8, 0x3394}, //6829 #SQUARE THZ + {0xA7D9, 0x2126}, //6830 #OHM SIGN + {0xA7DA, 0x33C0}, //6831 #SQUARE K OHM + {0xA7DB, 0x33C1}, //6832 #SQUARE M OHM + {0xA7DC, 0x338A}, //6833 #SQUARE PF + {0xA7DD, 0x338B}, //6834 #SQUARE NF + {0xA7DE, 0x338C}, //6835 #SQUARE MU F + {0xA7DF, 0x33D6}, //6836 #SQUARE MOL + {0xA7E0, 0x33C5}, //6837 #SQUARE CD + {0xA7E1, 0x33AD}, //6838 #SQUARE RAD + {0xA7E2, 0x33AE}, //6839 #SQUARE RAD OVER S + {0xA7E3, 0x33AF}, //6840 #SQUARE RAD OVER S SQUARED + {0xA7E4, 0x33DB}, //6841 #SQUARE SR + {0xA7E5, 0x33A9}, //6842 #SQUARE PA + {0xA7E6, 0x33AA}, //6843 #SQUARE KPA + {0xA7E7, 0x33AB}, //6844 #SQUARE MPA + {0xA7E8, 0x33AC}, //6845 #SQUARE GPA + {0xA7E9, 0x33DD}, //6846 #SQUARE WB + {0xA7EA, 0x33D0}, //6847 #SQUARE LM + {0xA7EB, 0x33D3}, //6848 #SQUARE LX + {0xA7EC, 0x33C3}, //6849 #SQUARE BQ + {0xA7ED, 0x33C9}, //6850 #SQUARE GY + {0xA7EE, 0x33DC}, //6851 #SQUARE SV + {0xA7EF, 0x33C6}, //6852 #SQUARE C OVER KG + {0xA841, 0xCB6D}, //6853 #HANGUL SYLLABLE SSANGCIEUC WEO RIEULKIYEOK + {0xA842, 0xCB6E}, //6854 #HANGUL SYLLABLE SSANGCIEUC WEO RIEULMIEUM + {0xA843, 0xCB6F}, //6855 #HANGUL SYLLABLE SSANGCIEUC WEO RIEULPIEUP + {0xA844, 0xCB70}, //6856 #HANGUL SYLLABLE SSANGCIEUC WEO RIEULSIOS + {0xA845, 0xCB71}, //6857 #HANGUL SYLLABLE SSANGCIEUC WEO RIEULTHIEUTH + {0xA846, 0xCB72}, //6858 #HANGUL SYLLABLE SSANGCIEUC WEO RIEULPHIEUPH + {0xA847, 0xCB73}, //6859 #HANGUL SYLLABLE SSANGCIEUC WEO RIEULHIEUH + {0xA848, 0xCB74}, //6860 #HANGUL SYLLABLE SSANGCIEUC WEO MIEUM + {0xA849, 0xCB75}, //6861 #HANGUL SYLLABLE SSANGCIEUC WEO PIEUP + {0xA84A, 0xCB76}, //6862 #HANGUL SYLLABLE SSANGCIEUC WEO PIEUPSIOS + {0xA84B, 0xCB77}, //6863 #HANGUL SYLLABLE SSANGCIEUC WEO SIOS + {0xA84C, 0xCB7A}, //6864 #HANGUL SYLLABLE SSANGCIEUC WEO CIEUC + {0xA84D, 0xCB7B}, //6865 #HANGUL SYLLABLE SSANGCIEUC WEO CHIEUCH + {0xA84E, 0xCB7C}, //6866 #HANGUL SYLLABLE SSANGCIEUC WEO KHIEUKH + {0xA84F, 0xCB7D}, //6867 #HANGUL SYLLABLE SSANGCIEUC WEO THIEUTH + {0xA850, 0xCB7E}, //6868 #HANGUL SYLLABLE SSANGCIEUC WEO PHIEUPH + {0xA851, 0xCB7F}, //6869 #HANGUL SYLLABLE SSANGCIEUC WEO HIEUH + {0xA852, 0xCB80}, //6870 #HANGUL SYLLABLE SSANGCIEUC WE + {0xA853, 0xCB81}, //6871 #HANGUL SYLLABLE SSANGCIEUC WE KIYEOK + {0xA854, 0xCB82}, //6872 #HANGUL SYLLABLE SSANGCIEUC WE SSANGKIYEOK + {0xA855, 0xCB83}, //6873 #HANGUL SYLLABLE SSANGCIEUC WE KIYEOKSIOS + {0xA856, 0xCB84}, //6874 #HANGUL SYLLABLE SSANGCIEUC WE NIEUN + {0xA857, 0xCB85}, //6875 #HANGUL SYLLABLE SSANGCIEUC WE NIEUNCIEUC + {0xA858, 0xCB86}, //6876 #HANGUL SYLLABLE SSANGCIEUC WE NIEUNHIEUH + {0xA859, 0xCB87}, //6877 #HANGUL SYLLABLE SSANGCIEUC WE TIKEUT + {0xA85A, 0xCB88}, //6878 #HANGUL SYLLABLE SSANGCIEUC WE RIEUL + {0xA861, 0xCB89}, //6879 #HANGUL SYLLABLE SSANGCIEUC WE RIEULKIYEOK + {0xA862, 0xCB8A}, //6880 #HANGUL SYLLABLE SSANGCIEUC WE RIEULMIEUM + {0xA863, 0xCB8B}, //6881 #HANGUL SYLLABLE SSANGCIEUC WE RIEULPIEUP + {0xA864, 0xCB8C}, //6882 #HANGUL SYLLABLE SSANGCIEUC WE RIEULSIOS + {0xA865, 0xCB8D}, //6883 #HANGUL SYLLABLE SSANGCIEUC WE RIEULTHIEUTH + {0xA866, 0xCB8E}, //6884 #HANGUL SYLLABLE SSANGCIEUC WE RIEULPHIEUPH + {0xA867, 0xCB8F}, //6885 #HANGUL SYLLABLE SSANGCIEUC WE RIEULHIEUH + {0xA868, 0xCB90}, //6886 #HANGUL SYLLABLE SSANGCIEUC WE MIEUM + {0xA869, 0xCB91}, //6887 #HANGUL SYLLABLE SSANGCIEUC WE PIEUP + {0xA86A, 0xCB92}, //6888 #HANGUL SYLLABLE SSANGCIEUC WE PIEUPSIOS + {0xA86B, 0xCB93}, //6889 #HANGUL SYLLABLE SSANGCIEUC WE SIOS + {0xA86C, 0xCB94}, //6890 #HANGUL SYLLABLE SSANGCIEUC WE SSANGSIOS + {0xA86D, 0xCB95}, //6891 #HANGUL SYLLABLE SSANGCIEUC WE IEUNG + {0xA86E, 0xCB96}, //6892 #HANGUL SYLLABLE SSANGCIEUC WE CIEUC + {0xA86F, 0xCB97}, //6893 #HANGUL SYLLABLE SSANGCIEUC WE CHIEUCH + {0xA870, 0xCB98}, //6894 #HANGUL SYLLABLE SSANGCIEUC WE KHIEUKH + {0xA871, 0xCB99}, //6895 #HANGUL SYLLABLE SSANGCIEUC WE THIEUTH + {0xA872, 0xCB9A}, //6896 #HANGUL SYLLABLE SSANGCIEUC WE PHIEUPH + {0xA873, 0xCB9B}, //6897 #HANGUL SYLLABLE SSANGCIEUC WE HIEUH + {0xA874, 0xCB9D}, //6898 #HANGUL SYLLABLE SSANGCIEUC WI KIYEOK + {0xA875, 0xCB9E}, //6899 #HANGUL SYLLABLE SSANGCIEUC WI SSANGKIYEOK + {0xA876, 0xCB9F}, //6900 #HANGUL SYLLABLE SSANGCIEUC WI KIYEOKSIOS + {0xA877, 0xCBA0}, //6901 #HANGUL SYLLABLE SSANGCIEUC WI NIEUN + {0xA878, 0xCBA1}, //6902 #HANGUL SYLLABLE SSANGCIEUC WI NIEUNCIEUC + {0xA879, 0xCBA2}, //6903 #HANGUL SYLLABLE SSANGCIEUC WI NIEUNHIEUH + {0xA87A, 0xCBA3}, //6904 #HANGUL SYLLABLE SSANGCIEUC WI TIKEUT + {0xA881, 0xCBA4}, //6905 #HANGUL SYLLABLE SSANGCIEUC WI RIEUL + {0xA882, 0xCBA5}, //6906 #HANGUL SYLLABLE SSANGCIEUC WI RIEULKIYEOK + {0xA883, 0xCBA6}, //6907 #HANGUL SYLLABLE SSANGCIEUC WI RIEULMIEUM + {0xA884, 0xCBA7}, //6908 #HANGUL SYLLABLE SSANGCIEUC WI RIEULPIEUP + {0xA885, 0xCBA8}, //6909 #HANGUL SYLLABLE SSANGCIEUC WI RIEULSIOS + {0xA886, 0xCBA9}, //6910 #HANGUL SYLLABLE SSANGCIEUC WI RIEULTHIEUTH + {0xA887, 0xCBAA}, //6911 #HANGUL SYLLABLE SSANGCIEUC WI RIEULPHIEUPH + {0xA888, 0xCBAB}, //6912 #HANGUL SYLLABLE SSANGCIEUC WI RIEULHIEUH + {0xA889, 0xCBAC}, //6913 #HANGUL SYLLABLE SSANGCIEUC WI MIEUM + {0xA88A, 0xCBAD}, //6914 #HANGUL SYLLABLE SSANGCIEUC WI PIEUP + {0xA88B, 0xCBAE}, //6915 #HANGUL SYLLABLE SSANGCIEUC WI PIEUPSIOS + {0xA88C, 0xCBAF}, //6916 #HANGUL SYLLABLE SSANGCIEUC WI SIOS + {0xA88D, 0xCBB0}, //6917 #HANGUL SYLLABLE SSANGCIEUC WI SSANGSIOS + {0xA88E, 0xCBB1}, //6918 #HANGUL SYLLABLE SSANGCIEUC WI IEUNG + {0xA88F, 0xCBB2}, //6919 #HANGUL SYLLABLE SSANGCIEUC WI CIEUC + {0xA890, 0xCBB3}, //6920 #HANGUL SYLLABLE SSANGCIEUC WI CHIEUCH + {0xA891, 0xCBB4}, //6921 #HANGUL SYLLABLE SSANGCIEUC WI KHIEUKH + {0xA892, 0xCBB5}, //6922 #HANGUL SYLLABLE SSANGCIEUC WI THIEUTH + {0xA893, 0xCBB6}, //6923 #HANGUL SYLLABLE SSANGCIEUC WI PHIEUPH + {0xA894, 0xCBB7}, //6924 #HANGUL SYLLABLE SSANGCIEUC WI HIEUH + {0xA895, 0xCBB9}, //6925 #HANGUL SYLLABLE SSANGCIEUC YU KIYEOK + {0xA896, 0xCBBA}, //6926 #HANGUL SYLLABLE SSANGCIEUC YU SSANGKIYEOK + {0xA897, 0xCBBB}, //6927 #HANGUL SYLLABLE SSANGCIEUC YU KIYEOKSIOS + {0xA898, 0xCBBC}, //6928 #HANGUL SYLLABLE SSANGCIEUC YU NIEUN + {0xA899, 0xCBBD}, //6929 #HANGUL SYLLABLE SSANGCIEUC YU NIEUNCIEUC + {0xA89A, 0xCBBE}, //6930 #HANGUL SYLLABLE SSANGCIEUC YU NIEUNHIEUH + {0xA89B, 0xCBBF}, //6931 #HANGUL SYLLABLE SSANGCIEUC YU TIKEUT + {0xA89C, 0xCBC0}, //6932 #HANGUL SYLLABLE SSANGCIEUC YU RIEUL + {0xA89D, 0xCBC1}, //6933 #HANGUL SYLLABLE SSANGCIEUC YU RIEULKIYEOK + {0xA89E, 0xCBC2}, //6934 #HANGUL SYLLABLE SSANGCIEUC YU RIEULMIEUM + {0xA89F, 0xCBC3}, //6935 #HANGUL SYLLABLE SSANGCIEUC YU RIEULPIEUP + {0xA8A0, 0xCBC4}, //6936 #HANGUL SYLLABLE SSANGCIEUC YU RIEULSIOS + {0xA8A1, 0x00C6}, //6937 #LATIN CAPITAL LETTER AE + {0xA8A2, 0x00D0}, //6938 #LATIN CAPITAL LETTER ETH + {0xA8A3, 0x00AA}, //6939 #FEMININE ORDINAL INDICATOR + {0xA8A4, 0x0126}, //6940 #LATIN CAPITAL LETTER H WITH STROKE + {0xA8A6, 0x0132}, //6941 #LATIN CAPITAL LIGATURE IJ + {0xA8A8, 0x013F}, //6942 #LATIN CAPITAL LETTER L WITH MIDDLE DOT + {0xA8A9, 0x0141}, //6943 #LATIN CAPITAL LETTER L WITH STROKE + {0xA8AA, 0x00D8}, //6944 #LATIN CAPITAL LETTER O WITH STROKE + {0xA8AB, 0x0152}, //6945 #LATIN CAPITAL LIGATURE OE + {0xA8AC, 0x00BA}, //6946 #MASCULINE ORDINAL INDICATOR + {0xA8AD, 0x00DE}, //6947 #LATIN CAPITAL LETTER THORN + {0xA8AE, 0x0166}, //6948 #LATIN CAPITAL LETTER T WITH STROKE + {0xA8AF, 0x014A}, //6949 #LATIN CAPITAL LETTER ENG + {0xA8B1, 0x3260}, //6950 #CIRCLED HANGUL KIYEOK + {0xA8B2, 0x3261}, //6951 #CIRCLED HANGUL NIEUN + {0xA8B3, 0x3262}, //6952 #CIRCLED HANGUL TIKEUT + {0xA8B4, 0x3263}, //6953 #CIRCLED HANGUL RIEUL + {0xA8B5, 0x3264}, //6954 #CIRCLED HANGUL MIEUM + {0xA8B6, 0x3265}, //6955 #CIRCLED HANGUL PIEUP + {0xA8B7, 0x3266}, //6956 #CIRCLED HANGUL SIOS + {0xA8B8, 0x3267}, //6957 #CIRCLED HANGUL IEUNG + {0xA8B9, 0x3268}, //6958 #CIRCLED HANGUL CIEUC + {0xA8BA, 0x3269}, //6959 #CIRCLED HANGUL CHIEUCH + {0xA8BB, 0x326A}, //6960 #CIRCLED HANGUL KHIEUKH + {0xA8BC, 0x326B}, //6961 #CIRCLED HANGUL THIEUTH + {0xA8BD, 0x326C}, //6962 #CIRCLED HANGUL PHIEUPH + {0xA8BE, 0x326D}, //6963 #CIRCLED HANGUL HIEUH + {0xA8BF, 0x326E}, //6964 #CIRCLED HANGUL KIYEOK A + {0xA8C0, 0x326F}, //6965 #CIRCLED HANGUL NIEUN A + {0xA8C1, 0x3270}, //6966 #CIRCLED HANGUL TIKEUT A + {0xA8C2, 0x3271}, //6967 #CIRCLED HANGUL RIEUL A + {0xA8C3, 0x3272}, //6968 #CIRCLED HANGUL MIEUM A + {0xA8C4, 0x3273}, //6969 #CIRCLED HANGUL PIEUP A + {0xA8C5, 0x3274}, //6970 #CIRCLED HANGUL SIOS A + {0xA8C6, 0x3275}, //6971 #CIRCLED HANGUL IEUNG A + {0xA8C7, 0x3276}, //6972 #CIRCLED HANGUL CIEUC A + {0xA8C8, 0x3277}, //6973 #CIRCLED HANGUL CHIEUCH A + {0xA8C9, 0x3278}, //6974 #CIRCLED HANGUL KHIEUKH A + {0xA8CA, 0x3279}, //6975 #CIRCLED HANGUL THIEUTH A + {0xA8CB, 0x327A}, //6976 #CIRCLED HANGUL PHIEUPH A + {0xA8CC, 0x327B}, //6977 #CIRCLED HANGUL HIEUH A + {0xA8CD, 0x24D0}, //6978 #CIRCLED LATIN SMALL LETTER A + {0xA8CE, 0x24D1}, //6979 #CIRCLED LATIN SMALL LETTER B + {0xA8CF, 0x24D2}, //6980 #CIRCLED LATIN SMALL LETTER C + {0xA8D0, 0x24D3}, //6981 #CIRCLED LATIN SMALL LETTER D + {0xA8D1, 0x24D4}, //6982 #CIRCLED LATIN SMALL LETTER E + {0xA8D2, 0x24D5}, //6983 #CIRCLED LATIN SMALL LETTER F + {0xA8D3, 0x24D6}, //6984 #CIRCLED LATIN SMALL LETTER G + {0xA8D4, 0x24D7}, //6985 #CIRCLED LATIN SMALL LETTER H + {0xA8D5, 0x24D8}, //6986 #CIRCLED LATIN SMALL LETTER I + {0xA8D6, 0x24D9}, //6987 #CIRCLED LATIN SMALL LETTER J + {0xA8D7, 0x24DA}, //6988 #CIRCLED LATIN SMALL LETTER K + {0xA8D8, 0x24DB}, //6989 #CIRCLED LATIN SMALL LETTER L + {0xA8D9, 0x24DC}, //6990 #CIRCLED LATIN SMALL LETTER M + {0xA8DA, 0x24DD}, //6991 #CIRCLED LATIN SMALL LETTER N + {0xA8DB, 0x24DE}, //6992 #CIRCLED LATIN SMALL LETTER O + {0xA8DC, 0x24DF}, //6993 #CIRCLED LATIN SMALL LETTER P + {0xA8DD, 0x24E0}, //6994 #CIRCLED LATIN SMALL LETTER Q + {0xA8DE, 0x24E1}, //6995 #CIRCLED LATIN SMALL LETTER R + {0xA8DF, 0x24E2}, //6996 #CIRCLED LATIN SMALL LETTER S + {0xA8E0, 0x24E3}, //6997 #CIRCLED LATIN SMALL LETTER T + {0xA8E1, 0x24E4}, //6998 #CIRCLED LATIN SMALL LETTER U + {0xA8E2, 0x24E5}, //6999 #CIRCLED LATIN SMALL LETTER V + {0xA8E3, 0x24E6}, //7000 #CIRCLED LATIN SMALL LETTER W + {0xA8E4, 0x24E7}, //7001 #CIRCLED LATIN SMALL LETTER X + {0xA8E5, 0x24E8}, //7002 #CIRCLED LATIN SMALL LETTER Y + {0xA8E6, 0x24E9}, //7003 #CIRCLED LATIN SMALL LETTER Z + {0xA8E7, 0x2460}, //7004 #CIRCLED DIGIT ONE + {0xA8E8, 0x2461}, //7005 #CIRCLED DIGIT TWO + {0xA8E9, 0x2462}, //7006 #CIRCLED DIGIT THREE + {0xA8EA, 0x2463}, //7007 #CIRCLED DIGIT FOUR + {0xA8EB, 0x2464}, //7008 #CIRCLED DIGIT FIVE + {0xA8EC, 0x2465}, //7009 #CIRCLED DIGIT SIX + {0xA8ED, 0x2466}, //7010 #CIRCLED DIGIT SEVEN + {0xA8EE, 0x2467}, //7011 #CIRCLED DIGIT EIGHT + {0xA8EF, 0x2468}, //7012 #CIRCLED DIGIT NINE + {0xA8F0, 0x2469}, //7013 #CIRCLED NUMBER TEN + {0xA8F1, 0x246A}, //7014 #CIRCLED NUMBER ELEVEN + {0xA8F2, 0x246B}, //7015 #CIRCLED NUMBER TWELVE + {0xA8F3, 0x246C}, //7016 #CIRCLED NUMBER THIRTEEN + {0xA8F4, 0x246D}, //7017 #CIRCLED NUMBER FOURTEEN + {0xA8F5, 0x246E}, //7018 #CIRCLED NUMBER FIFTEEN + {0xA8F6, 0x00BD}, //7019 #VULGAR FRACTION ONE HALF + {0xA8F7, 0x2153}, //7020 #VULGAR FRACTION ONE THIRD + {0xA8F8, 0x2154}, //7021 #VULGAR FRACTION TWO THIRDS + {0xA8F9, 0x00BC}, //7022 #VULGAR FRACTION ONE QUARTER + {0xA8FA, 0x00BE}, //7023 #VULGAR FRACTION THREE QUARTERS + {0xA8FB, 0x215B}, //7024 #VULGAR FRACTION ONE EIGHTH + {0xA8FC, 0x215C}, //7025 #VULGAR FRACTION THREE EIGHTHS + {0xA8FD, 0x215D}, //7026 #VULGAR FRACTION FIVE EIGHTHS + {0xA8FE, 0x215E}, //7027 #VULGAR FRACTION SEVEN EIGHTHS + {0xA941, 0xCBC5}, //7028 #HANGUL SYLLABLE SSANGCIEUC YU RIEULTHIEUTH + {0xA942, 0xCBC6}, //7029 #HANGUL SYLLABLE SSANGCIEUC YU RIEULPHIEUPH + {0xA943, 0xCBC7}, //7030 #HANGUL SYLLABLE SSANGCIEUC YU RIEULHIEUH + {0xA944, 0xCBC8}, //7031 #HANGUL SYLLABLE SSANGCIEUC YU MIEUM + {0xA945, 0xCBC9}, //7032 #HANGUL SYLLABLE SSANGCIEUC YU PIEUP + {0xA946, 0xCBCA}, //7033 #HANGUL SYLLABLE SSANGCIEUC YU PIEUPSIOS + {0xA947, 0xCBCB}, //7034 #HANGUL SYLLABLE SSANGCIEUC YU SIOS + {0xA948, 0xCBCC}, //7035 #HANGUL SYLLABLE SSANGCIEUC YU SSANGSIOS + {0xA949, 0xCBCD}, //7036 #HANGUL SYLLABLE SSANGCIEUC YU IEUNG + {0xA94A, 0xCBCE}, //7037 #HANGUL SYLLABLE SSANGCIEUC YU CIEUC + {0xA94B, 0xCBCF}, //7038 #HANGUL SYLLABLE SSANGCIEUC YU CHIEUCH + {0xA94C, 0xCBD0}, //7039 #HANGUL SYLLABLE SSANGCIEUC YU KHIEUKH + {0xA94D, 0xCBD1}, //7040 #HANGUL SYLLABLE SSANGCIEUC YU THIEUTH + {0xA94E, 0xCBD2}, //7041 #HANGUL SYLLABLE SSANGCIEUC YU PHIEUPH + {0xA94F, 0xCBD3}, //7042 #HANGUL SYLLABLE SSANGCIEUC YU HIEUH + {0xA950, 0xCBD5}, //7043 #HANGUL SYLLABLE SSANGCIEUC EU KIYEOK + {0xA951, 0xCBD6}, //7044 #HANGUL SYLLABLE SSANGCIEUC EU SSANGKIYEOK + {0xA952, 0xCBD7}, //7045 #HANGUL SYLLABLE SSANGCIEUC EU KIYEOKSIOS + {0xA953, 0xCBD8}, //7046 #HANGUL SYLLABLE SSANGCIEUC EU NIEUN + {0xA954, 0xCBD9}, //7047 #HANGUL SYLLABLE SSANGCIEUC EU NIEUNCIEUC + {0xA955, 0xCBDA}, //7048 #HANGUL SYLLABLE SSANGCIEUC EU NIEUNHIEUH + {0xA956, 0xCBDB}, //7049 #HANGUL SYLLABLE SSANGCIEUC EU TIKEUT + {0xA957, 0xCBDC}, //7050 #HANGUL SYLLABLE SSANGCIEUC EU RIEUL + {0xA958, 0xCBDD}, //7051 #HANGUL SYLLABLE SSANGCIEUC EU RIEULKIYEOK + {0xA959, 0xCBDE}, //7052 #HANGUL SYLLABLE SSANGCIEUC EU RIEULMIEUM + {0xA95A, 0xCBDF}, //7053 #HANGUL SYLLABLE SSANGCIEUC EU RIEULPIEUP + {0xA961, 0xCBE0}, //7054 #HANGUL SYLLABLE SSANGCIEUC EU RIEULSIOS + {0xA962, 0xCBE1}, //7055 #HANGUL SYLLABLE SSANGCIEUC EU RIEULTHIEUTH + {0xA963, 0xCBE2}, //7056 #HANGUL SYLLABLE SSANGCIEUC EU RIEULPHIEUPH + {0xA964, 0xCBE3}, //7057 #HANGUL SYLLABLE SSANGCIEUC EU RIEULHIEUH + {0xA965, 0xCBE5}, //7058 #HANGUL SYLLABLE SSANGCIEUC EU PIEUP + {0xA966, 0xCBE6}, //7059 #HANGUL SYLLABLE SSANGCIEUC EU PIEUPSIOS + {0xA967, 0xCBE8}, //7060 #HANGUL SYLLABLE SSANGCIEUC EU SSANGSIOS + {0xA968, 0xCBEA}, //7061 #HANGUL SYLLABLE SSANGCIEUC EU CIEUC + {0xA969, 0xCBEB}, //7062 #HANGUL SYLLABLE SSANGCIEUC EU CHIEUCH + {0xA96A, 0xCBEC}, //7063 #HANGUL SYLLABLE SSANGCIEUC EU KHIEUKH + {0xA96B, 0xCBED}, //7064 #HANGUL SYLLABLE SSANGCIEUC EU THIEUTH + {0xA96C, 0xCBEE}, //7065 #HANGUL SYLLABLE SSANGCIEUC EU PHIEUPH + {0xA96D, 0xCBEF}, //7066 #HANGUL SYLLABLE SSANGCIEUC EU HIEUH + {0xA96E, 0xCBF0}, //7067 #HANGUL SYLLABLE SSANGCIEUC YI + {0xA96F, 0xCBF1}, //7068 #HANGUL SYLLABLE SSANGCIEUC YI KIYEOK + {0xA970, 0xCBF2}, //7069 #HANGUL SYLLABLE SSANGCIEUC YI SSANGKIYEOK + {0xA971, 0xCBF3}, //7070 #HANGUL SYLLABLE SSANGCIEUC YI KIYEOKSIOS + {0xA972, 0xCBF4}, //7071 #HANGUL SYLLABLE SSANGCIEUC YI NIEUN + {0xA973, 0xCBF5}, //7072 #HANGUL SYLLABLE SSANGCIEUC YI NIEUNCIEUC + {0xA974, 0xCBF6}, //7073 #HANGUL SYLLABLE SSANGCIEUC YI NIEUNHIEUH + {0xA975, 0xCBF7}, //7074 #HANGUL SYLLABLE SSANGCIEUC YI TIKEUT + {0xA976, 0xCBF8}, //7075 #HANGUL SYLLABLE SSANGCIEUC YI RIEUL + {0xA977, 0xCBF9}, //7076 #HANGUL SYLLABLE SSANGCIEUC YI RIEULKIYEOK + {0xA978, 0xCBFA}, //7077 #HANGUL SYLLABLE SSANGCIEUC YI RIEULMIEUM + {0xA979, 0xCBFB}, //7078 #HANGUL SYLLABLE SSANGCIEUC YI RIEULPIEUP + {0xA97A, 0xCBFC}, //7079 #HANGUL SYLLABLE SSANGCIEUC YI RIEULSIOS + {0xA981, 0xCBFD}, //7080 #HANGUL SYLLABLE SSANGCIEUC YI RIEULTHIEUTH + {0xA982, 0xCBFE}, //7081 #HANGUL SYLLABLE SSANGCIEUC YI RIEULPHIEUPH + {0xA983, 0xCBFF}, //7082 #HANGUL SYLLABLE SSANGCIEUC YI RIEULHIEUH + {0xA984, 0xCC00}, //7083 #HANGUL SYLLABLE SSANGCIEUC YI MIEUM + {0xA985, 0xCC01}, //7084 #HANGUL SYLLABLE SSANGCIEUC YI PIEUP + {0xA986, 0xCC02}, //7085 #HANGUL SYLLABLE SSANGCIEUC YI PIEUPSIOS + {0xA987, 0xCC03}, //7086 #HANGUL SYLLABLE SSANGCIEUC YI SIOS + {0xA988, 0xCC04}, //7087 #HANGUL SYLLABLE SSANGCIEUC YI SSANGSIOS + {0xA989, 0xCC05}, //7088 #HANGUL SYLLABLE SSANGCIEUC YI IEUNG + {0xA98A, 0xCC06}, //7089 #HANGUL SYLLABLE SSANGCIEUC YI CIEUC + {0xA98B, 0xCC07}, //7090 #HANGUL SYLLABLE SSANGCIEUC YI CHIEUCH + {0xA98C, 0xCC08}, //7091 #HANGUL SYLLABLE SSANGCIEUC YI KHIEUKH + {0xA98D, 0xCC09}, //7092 #HANGUL SYLLABLE SSANGCIEUC YI THIEUTH + {0xA98E, 0xCC0A}, //7093 #HANGUL SYLLABLE SSANGCIEUC YI PHIEUPH + {0xA98F, 0xCC0B}, //7094 #HANGUL SYLLABLE SSANGCIEUC YI HIEUH + {0xA990, 0xCC0E}, //7095 #HANGUL SYLLABLE SSANGCIEUC I SSANGKIYEOK + {0xA991, 0xCC0F}, //7096 #HANGUL SYLLABLE SSANGCIEUC I KIYEOKSIOS + {0xA992, 0xCC11}, //7097 #HANGUL SYLLABLE SSANGCIEUC I NIEUNCIEUC + {0xA993, 0xCC12}, //7098 #HANGUL SYLLABLE SSANGCIEUC I NIEUNHIEUH + {0xA994, 0xCC13}, //7099 #HANGUL SYLLABLE SSANGCIEUC I TIKEUT + {0xA995, 0xCC15}, //7100 #HANGUL SYLLABLE SSANGCIEUC I RIEULKIYEOK + {0xA996, 0xCC16}, //7101 #HANGUL SYLLABLE SSANGCIEUC I RIEULMIEUM + {0xA997, 0xCC17}, //7102 #HANGUL SYLLABLE SSANGCIEUC I RIEULPIEUP + {0xA998, 0xCC18}, //7103 #HANGUL SYLLABLE SSANGCIEUC I RIEULSIOS + {0xA999, 0xCC19}, //7104 #HANGUL SYLLABLE SSANGCIEUC I RIEULTHIEUTH + {0xA99A, 0xCC1A}, //7105 #HANGUL SYLLABLE SSANGCIEUC I RIEULPHIEUPH + {0xA99B, 0xCC1B}, //7106 #HANGUL SYLLABLE SSANGCIEUC I RIEULHIEUH + {0xA99C, 0xCC1E}, //7107 #HANGUL SYLLABLE SSANGCIEUC I PIEUPSIOS + {0xA99D, 0xCC1F}, //7108 #HANGUL SYLLABLE SSANGCIEUC I SIOS + {0xA99E, 0xCC20}, //7109 #HANGUL SYLLABLE SSANGCIEUC I SSANGSIOS + {0xA99F, 0xCC23}, //7110 #HANGUL SYLLABLE SSANGCIEUC I CHIEUCH + {0xA9A0, 0xCC24}, //7111 #HANGUL SYLLABLE SSANGCIEUC I KHIEUKH + {0xA9A1, 0x00E6}, //7112 #LATIN SMALL LETTER AE + {0xA9A2, 0x0111}, //7113 #LATIN SMALL LETTER D WITH STROKE + {0xA9A3, 0x00F0}, //7114 #LATIN SMALL LETTER ETH + {0xA9A4, 0x0127}, //7115 #LATIN SMALL LETTER H WITH STROKE + {0xA9A5, 0x0131}, //7116 #LATIN SMALL LETTER DOTLESS I + {0xA9A6, 0x0133}, //7117 #LATIN SMALL LIGATURE IJ + {0xA9A7, 0x0138}, //7118 #LATIN SMALL LETTER KRA + {0xA9A8, 0x0140}, //7119 #LATIN SMALL LETTER L WITH MIDDLE DOT + {0xA9A9, 0x0142}, //7120 #LATIN SMALL LETTER L WITH STROKE + {0xA9AA, 0x00F8}, //7121 #LATIN SMALL LETTER O WITH STROKE + {0xA9AB, 0x0153}, //7122 #LATIN SMALL LIGATURE OE + {0xA9AC, 0x00DF}, //7123 #LATIN SMALL LETTER SHARP S + {0xA9AD, 0x00FE}, //7124 #LATIN SMALL LETTER THORN + {0xA9AE, 0x0167}, //7125 #LATIN SMALL LETTER T WITH STROKE + {0xA9AF, 0x014B}, //7126 #LATIN SMALL LETTER ENG + {0xA9B0, 0x0149}, //7127 #LATIN SMALL LETTER N PRECEDED BY APOSTROPHE + {0xA9B1, 0x3200}, //7128 #PARENTHESIZED HANGUL KIYEOK + {0xA9B2, 0x3201}, //7129 #PARENTHESIZED HANGUL NIEUN + {0xA9B3, 0x3202}, //7130 #PARENTHESIZED HANGUL TIKEUT + {0xA9B4, 0x3203}, //7131 #PARENTHESIZED HANGUL RIEUL + {0xA9B5, 0x3204}, //7132 #PARENTHESIZED HANGUL MIEUM + {0xA9B6, 0x3205}, //7133 #PARENTHESIZED HANGUL PIEUP + {0xA9B7, 0x3206}, //7134 #PARENTHESIZED HANGUL SIOS + {0xA9B8, 0x3207}, //7135 #PARENTHESIZED HANGUL IEUNG + {0xA9B9, 0x3208}, //7136 #PARENTHESIZED HANGUL CIEUC + {0xA9BA, 0x3209}, //7137 #PARENTHESIZED HANGUL CHIEUCH + {0xA9BB, 0x320A}, //7138 #PARENTHESIZED HANGUL KHIEUKH + {0xA9BC, 0x320B}, //7139 #PARENTHESIZED HANGUL THIEUTH + {0xA9BD, 0x320C}, //7140 #PARENTHESIZED HANGUL PHIEUPH + {0xA9BE, 0x320D}, //7141 #PARENTHESIZED HANGUL HIEUH + {0xA9BF, 0x320E}, //7142 #PARENTHESIZED HANGUL KIYEOK A + {0xA9C0, 0x320F}, //7143 #PARENTHESIZED HANGUL NIEUN A + {0xA9C1, 0x3210}, //7144 #PARENTHESIZED HANGUL TIKEUT A + {0xA9C2, 0x3211}, //7145 #PARENTHESIZED HANGUL RIEUL A + {0xA9C3, 0x3212}, //7146 #PARENTHESIZED HANGUL MIEUM A + {0xA9C4, 0x3213}, //7147 #PARENTHESIZED HANGUL PIEUP A + {0xA9C5, 0x3214}, //7148 #PARENTHESIZED HANGUL SIOS A + {0xA9C6, 0x3215}, //7149 #PARENTHESIZED HANGUL IEUNG A + {0xA9C7, 0x3216}, //7150 #PARENTHESIZED HANGUL CIEUC A + {0xA9C8, 0x3217}, //7151 #PARENTHESIZED HANGUL CHIEUCH A + {0xA9C9, 0x3218}, //7152 #PARENTHESIZED HANGUL KHIEUKH A + {0xA9CA, 0x3219}, //7153 #PARENTHESIZED HANGUL THIEUTH A + {0xA9CB, 0x321A}, //7154 #PARENTHESIZED HANGUL PHIEUPH A + {0xA9CC, 0x321B}, //7155 #PARENTHESIZED HANGUL HIEUH A + {0xA9CD, 0x249C}, //7156 #PARENTHESIZED LATIN SMALL LETTER A + {0xA9CE, 0x249D}, //7157 #PARENTHESIZED LATIN SMALL LETTER B + {0xA9CF, 0x249E}, //7158 #PARENTHESIZED LATIN SMALL LETTER C + {0xA9D0, 0x249F}, //7159 #PARENTHESIZED LATIN SMALL LETTER D + {0xA9D1, 0x24A0}, //7160 #PARENTHESIZED LATIN SMALL LETTER E + {0xA9D2, 0x24A1}, //7161 #PARENTHESIZED LATIN SMALL LETTER F + {0xA9D3, 0x24A2}, //7162 #PARENTHESIZED LATIN SMALL LETTER G + {0xA9D4, 0x24A3}, //7163 #PARENTHESIZED LATIN SMALL LETTER H + {0xA9D5, 0x24A4}, //7164 #PARENTHESIZED LATIN SMALL LETTER I + {0xA9D6, 0x24A5}, //7165 #PARENTHESIZED LATIN SMALL LETTER J + {0xA9D7, 0x24A6}, //7166 #PARENTHESIZED LATIN SMALL LETTER K + {0xA9D8, 0x24A7}, //7167 #PARENTHESIZED LATIN SMALL LETTER L + {0xA9D9, 0x24A8}, //7168 #PARENTHESIZED LATIN SMALL LETTER M + {0xA9DA, 0x24A9}, //7169 #PARENTHESIZED LATIN SMALL LETTER N + {0xA9DB, 0x24AA}, //7170 #PARENTHESIZED LATIN SMALL LETTER O + {0xA9DC, 0x24AB}, //7171 #PARENTHESIZED LATIN SMALL LETTER P + {0xA9DD, 0x24AC}, //7172 #PARENTHESIZED LATIN SMALL LETTER Q + {0xA9DE, 0x24AD}, //7173 #PARENTHESIZED LATIN SMALL LETTER R + {0xA9DF, 0x24AE}, //7174 #PARENTHESIZED LATIN SMALL LETTER S + {0xA9E0, 0x24AF}, //7175 #PARENTHESIZED LATIN SMALL LETTER T + {0xA9E1, 0x24B0}, //7176 #PARENTHESIZED LATIN SMALL LETTER U + {0xA9E2, 0x24B1}, //7177 #PARENTHESIZED LATIN SMALL LETTER V + {0xA9E3, 0x24B2}, //7178 #PARENTHESIZED LATIN SMALL LETTER W + {0xA9E4, 0x24B3}, //7179 #PARENTHESIZED LATIN SMALL LETTER X + {0xA9E5, 0x24B4}, //7180 #PARENTHESIZED LATIN SMALL LETTER Y + {0xA9E6, 0x24B5}, //7181 #PARENTHESIZED LATIN SMALL LETTER Z + {0xA9E7, 0x2474}, //7182 #PARENTHESIZED DIGIT ONE + {0xA9E8, 0x2475}, //7183 #PARENTHESIZED DIGIT TWO + {0xA9E9, 0x2476}, //7184 #PARENTHESIZED DIGIT THREE + {0xA9EA, 0x2477}, //7185 #PARENTHESIZED DIGIT FOUR + {0xA9EB, 0x2478}, //7186 #PARENTHESIZED DIGIT FIVE + {0xA9EC, 0x2479}, //7187 #PARENTHESIZED DIGIT SIX + {0xA9ED, 0x247A}, //7188 #PARENTHESIZED DIGIT SEVEN + {0xA9EE, 0x247B}, //7189 #PARENTHESIZED DIGIT EIGHT + {0xA9EF, 0x247C}, //7190 #PARENTHESIZED DIGIT NINE + {0xA9F0, 0x247D}, //7191 #PARENTHESIZED NUMBER TEN + {0xA9F1, 0x247E}, //7192 #PARENTHESIZED NUMBER ELEVEN + {0xA9F2, 0x247F}, //7193 #PARENTHESIZED NUMBER TWELVE + {0xA9F3, 0x2480}, //7194 #PARENTHESIZED NUMBER THIRTEEN + {0xA9F4, 0x2481}, //7195 #PARENTHESIZED NUMBER FOURTEEN + {0xA9F5, 0x2482}, //7196 #PARENTHESIZED NUMBER FIFTEEN + {0xA9F6, 0x00B9}, //7197 #SUPERSCRIPT ONE + {0xA9F7, 0x00B2}, //7198 #SUPERSCRIPT TWO + {0xA9F8, 0x00B3}, //7199 #SUPERSCRIPT THREE + {0xA9F9, 0x2074}, //7200 #SUPERSCRIPT FOUR + {0xA9FA, 0x207F}, //7201 #SUPERSCRIPT LATIN SMALL LETTER N + {0xA9FB, 0x2081}, //7202 #SUBSCRIPT ONE + {0xA9FC, 0x2082}, //7203 #SUBSCRIPT TWO + {0xA9FD, 0x2083}, //7204 #SUBSCRIPT THREE + {0xA9FE, 0x2084}, //7205 #SUBSCRIPT FOUR + {0xAA41, 0xCC25}, //7206 #HANGUL SYLLABLE SSANGCIEUC I THIEUTH + {0xAA42, 0xCC26}, //7207 #HANGUL SYLLABLE SSANGCIEUC I PHIEUPH + {0xAA43, 0xCC2A}, //7208 #HANGUL SYLLABLE CHIEUCH A SSANGKIYEOK + {0xAA44, 0xCC2B}, //7209 #HANGUL SYLLABLE CHIEUCH A KIYEOKSIOS + {0xAA45, 0xCC2D}, //7210 #HANGUL SYLLABLE CHIEUCH A NIEUNCIEUC + {0xAA46, 0xCC2F}, //7211 #HANGUL SYLLABLE CHIEUCH A TIKEUT + {0xAA47, 0xCC31}, //7212 #HANGUL SYLLABLE CHIEUCH A RIEULKIYEOK + {0xAA48, 0xCC32}, //7213 #HANGUL SYLLABLE CHIEUCH A RIEULMIEUM + {0xAA49, 0xCC33}, //7214 #HANGUL SYLLABLE CHIEUCH A RIEULPIEUP + {0xAA4A, 0xCC34}, //7215 #HANGUL SYLLABLE CHIEUCH A RIEULSIOS + {0xAA4B, 0xCC35}, //7216 #HANGUL SYLLABLE CHIEUCH A RIEULTHIEUTH + {0xAA4C, 0xCC36}, //7217 #HANGUL SYLLABLE CHIEUCH A RIEULPHIEUPH + {0xAA4D, 0xCC37}, //7218 #HANGUL SYLLABLE CHIEUCH A RIEULHIEUH + {0xAA4E, 0xCC3A}, //7219 #HANGUL SYLLABLE CHIEUCH A PIEUPSIOS + {0xAA4F, 0xCC3F}, //7220 #HANGUL SYLLABLE CHIEUCH A CHIEUCH + {0xAA50, 0xCC40}, //7221 #HANGUL SYLLABLE CHIEUCH A KHIEUKH + {0xAA51, 0xCC41}, //7222 #HANGUL SYLLABLE CHIEUCH A THIEUTH + {0xAA52, 0xCC42}, //7223 #HANGUL SYLLABLE CHIEUCH A PHIEUPH + {0xAA53, 0xCC43}, //7224 #HANGUL SYLLABLE CHIEUCH A HIEUH + {0xAA54, 0xCC46}, //7225 #HANGUL SYLLABLE CHIEUCH AE SSANGKIYEOK + {0xAA55, 0xCC47}, //7226 #HANGUL SYLLABLE CHIEUCH AE KIYEOKSIOS + {0xAA56, 0xCC49}, //7227 #HANGUL SYLLABLE CHIEUCH AE NIEUNCIEUC + {0xAA57, 0xCC4A}, //7228 #HANGUL SYLLABLE CHIEUCH AE NIEUNHIEUH + {0xAA58, 0xCC4B}, //7229 #HANGUL SYLLABLE CHIEUCH AE TIKEUT + {0xAA59, 0xCC4D}, //7230 #HANGUL SYLLABLE CHIEUCH AE RIEULKIYEOK + {0xAA5A, 0xCC4E}, //7231 #HANGUL SYLLABLE CHIEUCH AE RIEULMIEUM + {0xAA61, 0xCC4F}, //7232 #HANGUL SYLLABLE CHIEUCH AE RIEULPIEUP + {0xAA62, 0xCC50}, //7233 #HANGUL SYLLABLE CHIEUCH AE RIEULSIOS + {0xAA63, 0xCC51}, //7234 #HANGUL SYLLABLE CHIEUCH AE RIEULTHIEUTH + {0xAA64, 0xCC52}, //7235 #HANGUL SYLLABLE CHIEUCH AE RIEULPHIEUPH + {0xAA65, 0xCC53}, //7236 #HANGUL SYLLABLE CHIEUCH AE RIEULHIEUH + {0xAA66, 0xCC56}, //7237 #HANGUL SYLLABLE CHIEUCH AE PIEUPSIOS + {0xAA67, 0xCC5A}, //7238 #HANGUL SYLLABLE CHIEUCH AE CIEUC + {0xAA68, 0xCC5B}, //7239 #HANGUL SYLLABLE CHIEUCH AE CHIEUCH + {0xAA69, 0xCC5C}, //7240 #HANGUL SYLLABLE CHIEUCH AE KHIEUKH + {0xAA6A, 0xCC5D}, //7241 #HANGUL SYLLABLE CHIEUCH AE THIEUTH + {0xAA6B, 0xCC5E}, //7242 #HANGUL SYLLABLE CHIEUCH AE PHIEUPH + {0xAA6C, 0xCC5F}, //7243 #HANGUL SYLLABLE CHIEUCH AE HIEUH + {0xAA6D, 0xCC61}, //7244 #HANGUL SYLLABLE CHIEUCH YA KIYEOK + {0xAA6E, 0xCC62}, //7245 #HANGUL SYLLABLE CHIEUCH YA SSANGKIYEOK + {0xAA6F, 0xCC63}, //7246 #HANGUL SYLLABLE CHIEUCH YA KIYEOKSIOS + {0xAA70, 0xCC65}, //7247 #HANGUL SYLLABLE CHIEUCH YA NIEUNCIEUC + {0xAA71, 0xCC67}, //7248 #HANGUL SYLLABLE CHIEUCH YA TIKEUT + {0xAA72, 0xCC69}, //7249 #HANGUL SYLLABLE CHIEUCH YA RIEULKIYEOK + {0xAA73, 0xCC6A}, //7250 #HANGUL SYLLABLE CHIEUCH YA RIEULMIEUM + {0xAA74, 0xCC6B}, //7251 #HANGUL SYLLABLE CHIEUCH YA RIEULPIEUP + {0xAA75, 0xCC6C}, //7252 #HANGUL SYLLABLE CHIEUCH YA RIEULSIOS + {0xAA76, 0xCC6D}, //7253 #HANGUL SYLLABLE CHIEUCH YA RIEULTHIEUTH + {0xAA77, 0xCC6E}, //7254 #HANGUL SYLLABLE CHIEUCH YA RIEULPHIEUPH + {0xAA78, 0xCC6F}, //7255 #HANGUL SYLLABLE CHIEUCH YA RIEULHIEUH + {0xAA79, 0xCC71}, //7256 #HANGUL SYLLABLE CHIEUCH YA PIEUP + {0xAA7A, 0xCC72}, //7257 #HANGUL SYLLABLE CHIEUCH YA PIEUPSIOS + {0xAA81, 0xCC73}, //7258 #HANGUL SYLLABLE CHIEUCH YA SIOS + {0xAA82, 0xCC74}, //7259 #HANGUL SYLLABLE CHIEUCH YA SSANGSIOS + {0xAA83, 0xCC76}, //7260 #HANGUL SYLLABLE CHIEUCH YA CIEUC + {0xAA84, 0xCC77}, //7261 #HANGUL SYLLABLE CHIEUCH YA CHIEUCH + {0xAA85, 0xCC78}, //7262 #HANGUL SYLLABLE CHIEUCH YA KHIEUKH + {0xAA86, 0xCC79}, //7263 #HANGUL SYLLABLE CHIEUCH YA THIEUTH + {0xAA87, 0xCC7A}, //7264 #HANGUL SYLLABLE CHIEUCH YA PHIEUPH + {0xAA88, 0xCC7B}, //7265 #HANGUL SYLLABLE CHIEUCH YA HIEUH + {0xAA89, 0xCC7C}, //7266 #HANGUL SYLLABLE CHIEUCH YAE + {0xAA8A, 0xCC7D}, //7267 #HANGUL SYLLABLE CHIEUCH YAE KIYEOK + {0xAA8B, 0xCC7E}, //7268 #HANGUL SYLLABLE CHIEUCH YAE SSANGKIYEOK + {0xAA8C, 0xCC7F}, //7269 #HANGUL SYLLABLE CHIEUCH YAE KIYEOKSIOS + {0xAA8D, 0xCC80}, //7270 #HANGUL SYLLABLE CHIEUCH YAE NIEUN + {0xAA8E, 0xCC81}, //7271 #HANGUL SYLLABLE CHIEUCH YAE NIEUNCIEUC + {0xAA8F, 0xCC82}, //7272 #HANGUL SYLLABLE CHIEUCH YAE NIEUNHIEUH + {0xAA90, 0xCC83}, //7273 #HANGUL SYLLABLE CHIEUCH YAE TIKEUT + {0xAA91, 0xCC84}, //7274 #HANGUL SYLLABLE CHIEUCH YAE RIEUL + {0xAA92, 0xCC85}, //7275 #HANGUL SYLLABLE CHIEUCH YAE RIEULKIYEOK + {0xAA93, 0xCC86}, //7276 #HANGUL SYLLABLE CHIEUCH YAE RIEULMIEUM + {0xAA94, 0xCC87}, //7277 #HANGUL SYLLABLE CHIEUCH YAE RIEULPIEUP + {0xAA95, 0xCC88}, //7278 #HANGUL SYLLABLE CHIEUCH YAE RIEULSIOS + {0xAA96, 0xCC89}, //7279 #HANGUL SYLLABLE CHIEUCH YAE RIEULTHIEUTH + {0xAA97, 0xCC8A}, //7280 #HANGUL SYLLABLE CHIEUCH YAE RIEULPHIEUPH + {0xAA98, 0xCC8B}, //7281 #HANGUL SYLLABLE CHIEUCH YAE RIEULHIEUH + {0xAA99, 0xCC8C}, //7282 #HANGUL SYLLABLE CHIEUCH YAE MIEUM + {0xAA9A, 0xCC8D}, //7283 #HANGUL SYLLABLE CHIEUCH YAE PIEUP + {0xAA9B, 0xCC8E}, //7284 #HANGUL SYLLABLE CHIEUCH YAE PIEUPSIOS + {0xAA9C, 0xCC8F}, //7285 #HANGUL SYLLABLE CHIEUCH YAE SIOS + {0xAA9D, 0xCC90}, //7286 #HANGUL SYLLABLE CHIEUCH YAE SSANGSIOS + {0xAA9E, 0xCC91}, //7287 #HANGUL SYLLABLE CHIEUCH YAE IEUNG + {0xAA9F, 0xCC92}, //7288 #HANGUL SYLLABLE CHIEUCH YAE CIEUC + {0xAAA0, 0xCC93}, //7289 #HANGUL SYLLABLE CHIEUCH YAE CHIEUCH + {0xAAA1, 0x3041}, //7290 #HIRAGANA LETTER SMALL A + {0xAAA2, 0x3042}, //7291 #HIRAGANA LETTER A + {0xAAA3, 0x3043}, //7292 #HIRAGANA LETTER SMALL I + {0xAAA4, 0x3044}, //7293 #HIRAGANA LETTER I + {0xAAA5, 0x3045}, //7294 #HIRAGANA LETTER SMALL U + {0xAAA6, 0x3046}, //7295 #HIRAGANA LETTER U + {0xAAA7, 0x3047}, //7296 #HIRAGANA LETTER SMALL E + {0xAAA8, 0x3048}, //7297 #HIRAGANA LETTER E + {0xAAA9, 0x3049}, //7298 #HIRAGANA LETTER SMALL O + {0xAAAA, 0x304A}, //7299 #HIRAGANA LETTER O + {0xAAAB, 0x304B}, //7300 #HIRAGANA LETTER KA + {0xAAAC, 0x304C}, //7301 #HIRAGANA LETTER GA + {0xAAAD, 0x304D}, //7302 #HIRAGANA LETTER KI + {0xAAAE, 0x304E}, //7303 #HIRAGANA LETTER GI + {0xAAAF, 0x304F}, //7304 #HIRAGANA LETTER KU + {0xAAB0, 0x3050}, //7305 #HIRAGANA LETTER GU + {0xAAB1, 0x3051}, //7306 #HIRAGANA LETTER KE + {0xAAB2, 0x3052}, //7307 #HIRAGANA LETTER GE + {0xAAB3, 0x3053}, //7308 #HIRAGANA LETTER KO + {0xAAB4, 0x3054}, //7309 #HIRAGANA LETTER GO + {0xAAB5, 0x3055}, //7310 #HIRAGANA LETTER SA + {0xAAB6, 0x3056}, //7311 #HIRAGANA LETTER ZA + {0xAAB7, 0x3057}, //7312 #HIRAGANA LETTER SI + {0xAAB8, 0x3058}, //7313 #HIRAGANA LETTER ZI + {0xAAB9, 0x3059}, //7314 #HIRAGANA LETTER SU + {0xAABA, 0x305A}, //7315 #HIRAGANA LETTER ZU + {0xAABB, 0x305B}, //7316 #HIRAGANA LETTER SE + {0xAABC, 0x305C}, //7317 #HIRAGANA LETTER ZE + {0xAABD, 0x305D}, //7318 #HIRAGANA LETTER SO + {0xAABE, 0x305E}, //7319 #HIRAGANA LETTER ZO + {0xAABF, 0x305F}, //7320 #HIRAGANA LETTER TA + {0xAAC0, 0x3060}, //7321 #HIRAGANA LETTER DA + {0xAAC1, 0x3061}, //7322 #HIRAGANA LETTER TI + {0xAAC2, 0x3062}, //7323 #HIRAGANA LETTER DI + {0xAAC3, 0x3063}, //7324 #HIRAGANA LETTER SMALL TU + {0xAAC4, 0x3064}, //7325 #HIRAGANA LETTER TU + {0xAAC5, 0x3065}, //7326 #HIRAGANA LETTER DU + {0xAAC6, 0x3066}, //7327 #HIRAGANA LETTER TE + {0xAAC7, 0x3067}, //7328 #HIRAGANA LETTER DE + {0xAAC8, 0x3068}, //7329 #HIRAGANA LETTER TO + {0xAAC9, 0x3069}, //7330 #HIRAGANA LETTER DO + {0xAACA, 0x306A}, //7331 #HIRAGANA LETTER NA + {0xAACB, 0x306B}, //7332 #HIRAGANA LETTER NI + {0xAACC, 0x306C}, //7333 #HIRAGANA LETTER NU + {0xAACD, 0x306D}, //7334 #HIRAGANA LETTER NE + {0xAACE, 0x306E}, //7335 #HIRAGANA LETTER NO + {0xAACF, 0x306F}, //7336 #HIRAGANA LETTER HA + {0xAAD0, 0x3070}, //7337 #HIRAGANA LETTER BA + {0xAAD1, 0x3071}, //7338 #HIRAGANA LETTER PA + {0xAAD2, 0x3072}, //7339 #HIRAGANA LETTER HI + {0xAAD3, 0x3073}, //7340 #HIRAGANA LETTER BI + {0xAAD4, 0x3074}, //7341 #HIRAGANA LETTER PI + {0xAAD5, 0x3075}, //7342 #HIRAGANA LETTER HU + {0xAAD6, 0x3076}, //7343 #HIRAGANA LETTER BU + {0xAAD7, 0x3077}, //7344 #HIRAGANA LETTER PU + {0xAAD8, 0x3078}, //7345 #HIRAGANA LETTER HE + {0xAAD9, 0x3079}, //7346 #HIRAGANA LETTER BE + {0xAADA, 0x307A}, //7347 #HIRAGANA LETTER PE + {0xAADB, 0x307B}, //7348 #HIRAGANA LETTER HO + {0xAADC, 0x307C}, //7349 #HIRAGANA LETTER BO + {0xAADD, 0x307D}, //7350 #HIRAGANA LETTER PO + {0xAADE, 0x307E}, //7351 #HIRAGANA LETTER MA + {0xAADF, 0x307F}, //7352 #HIRAGANA LETTER MI + {0xAAE0, 0x3080}, //7353 #HIRAGANA LETTER MU + {0xAAE1, 0x3081}, //7354 #HIRAGANA LETTER ME + {0xAAE2, 0x3082}, //7355 #HIRAGANA LETTER MO + {0xAAE3, 0x3083}, //7356 #HIRAGANA LETTER SMALL YA + {0xAAE4, 0x3084}, //7357 #HIRAGANA LETTER YA + {0xAAE5, 0x3085}, //7358 #HIRAGANA LETTER SMALL YU + {0xAAE6, 0x3086}, //7359 #HIRAGANA LETTER YU + {0xAAE7, 0x3087}, //7360 #HIRAGANA LETTER SMALL YO + {0xAAE8, 0x3088}, //7361 #HIRAGANA LETTER YO + {0xAAE9, 0x3089}, //7362 #HIRAGANA LETTER RA + {0xAAEA, 0x308A}, //7363 #HIRAGANA LETTER RI + {0xAAEB, 0x308B}, //7364 #HIRAGANA LETTER RU + {0xAAEC, 0x308C}, //7365 #HIRAGANA LETTER RE + {0xAAED, 0x308D}, //7366 #HIRAGANA LETTER RO + {0xAAEE, 0x308E}, //7367 #HIRAGANA LETTER SMALL WA + {0xAAEF, 0x308F}, //7368 #HIRAGANA LETTER WA + {0xAAF0, 0x3090}, //7369 #HIRAGANA LETTER WI + {0xAAF1, 0x3091}, //7370 #HIRAGANA LETTER WE + {0xAAF2, 0x3092}, //7371 #HIRAGANA LETTER WO + {0xAAF3, 0x3093}, //7372 #HIRAGANA LETTER N + {0xAB41, 0xCC94}, //7373 #HANGUL SYLLABLE CHIEUCH YAE KHIEUKH + {0xAB42, 0xCC95}, //7374 #HANGUL SYLLABLE CHIEUCH YAE THIEUTH + {0xAB43, 0xCC96}, //7375 #HANGUL SYLLABLE CHIEUCH YAE PHIEUPH + {0xAB44, 0xCC97}, //7376 #HANGUL SYLLABLE CHIEUCH YAE HIEUH + {0xAB45, 0xCC9A}, //7377 #HANGUL SYLLABLE CHIEUCH EO SSANGKIYEOK + {0xAB46, 0xCC9B}, //7378 #HANGUL SYLLABLE CHIEUCH EO KIYEOKSIOS + {0xAB47, 0xCC9D}, //7379 #HANGUL SYLLABLE CHIEUCH EO NIEUNCIEUC + {0xAB48, 0xCC9E}, //7380 #HANGUL SYLLABLE CHIEUCH EO NIEUNHIEUH + {0xAB49, 0xCC9F}, //7381 #HANGUL SYLLABLE CHIEUCH EO TIKEUT + {0xAB4A, 0xCCA1}, //7382 #HANGUL SYLLABLE CHIEUCH EO RIEULKIYEOK + {0xAB4B, 0xCCA2}, //7383 #HANGUL SYLLABLE CHIEUCH EO RIEULMIEUM + {0xAB4C, 0xCCA3}, //7384 #HANGUL SYLLABLE CHIEUCH EO RIEULPIEUP + {0xAB4D, 0xCCA4}, //7385 #HANGUL SYLLABLE CHIEUCH EO RIEULSIOS + {0xAB4E, 0xCCA5}, //7386 #HANGUL SYLLABLE CHIEUCH EO RIEULTHIEUTH + {0xAB4F, 0xCCA6}, //7387 #HANGUL SYLLABLE CHIEUCH EO RIEULPHIEUPH + {0xAB50, 0xCCA7}, //7388 #HANGUL SYLLABLE CHIEUCH EO RIEULHIEUH + {0xAB51, 0xCCAA}, //7389 #HANGUL SYLLABLE CHIEUCH EO PIEUPSIOS + {0xAB52, 0xCCAE}, //7390 #HANGUL SYLLABLE CHIEUCH EO CIEUC + {0xAB53, 0xCCAF}, //7391 #HANGUL SYLLABLE CHIEUCH EO CHIEUCH + {0xAB54, 0xCCB0}, //7392 #HANGUL SYLLABLE CHIEUCH EO KHIEUKH + {0xAB55, 0xCCB1}, //7393 #HANGUL SYLLABLE CHIEUCH EO THIEUTH + {0xAB56, 0xCCB2}, //7394 #HANGUL SYLLABLE CHIEUCH EO PHIEUPH + {0xAB57, 0xCCB3}, //7395 #HANGUL SYLLABLE CHIEUCH EO HIEUH + {0xAB58, 0xCCB6}, //7396 #HANGUL SYLLABLE CHIEUCH E SSANGKIYEOK + {0xAB59, 0xCCB7}, //7397 #HANGUL SYLLABLE CHIEUCH E KIYEOKSIOS + {0xAB5A, 0xCCB9}, //7398 #HANGUL SYLLABLE CHIEUCH E NIEUNCIEUC + {0xAB61, 0xCCBA}, //7399 #HANGUL SYLLABLE CHIEUCH E NIEUNHIEUH + {0xAB62, 0xCCBB}, //7400 #HANGUL SYLLABLE CHIEUCH E TIKEUT + {0xAB63, 0xCCBD}, //7401 #HANGUL SYLLABLE CHIEUCH E RIEULKIYEOK + {0xAB64, 0xCCBE}, //7402 #HANGUL SYLLABLE CHIEUCH E RIEULMIEUM + {0xAB65, 0xCCBF}, //7403 #HANGUL SYLLABLE CHIEUCH E RIEULPIEUP + {0xAB66, 0xCCC0}, //7404 #HANGUL SYLLABLE CHIEUCH E RIEULSIOS + {0xAB67, 0xCCC1}, //7405 #HANGUL SYLLABLE CHIEUCH E RIEULTHIEUTH + {0xAB68, 0xCCC2}, //7406 #HANGUL SYLLABLE CHIEUCH E RIEULPHIEUPH + {0xAB69, 0xCCC3}, //7407 #HANGUL SYLLABLE CHIEUCH E RIEULHIEUH + {0xAB6A, 0xCCC6}, //7408 #HANGUL SYLLABLE CHIEUCH E PIEUPSIOS + {0xAB6B, 0xCCC8}, //7409 #HANGUL SYLLABLE CHIEUCH E SSANGSIOS + {0xAB6C, 0xCCCA}, //7410 #HANGUL SYLLABLE CHIEUCH E CIEUC + {0xAB6D, 0xCCCB}, //7411 #HANGUL SYLLABLE CHIEUCH E CHIEUCH + {0xAB6E, 0xCCCC}, //7412 #HANGUL SYLLABLE CHIEUCH E KHIEUKH + {0xAB6F, 0xCCCD}, //7413 #HANGUL SYLLABLE CHIEUCH E THIEUTH + {0xAB70, 0xCCCE}, //7414 #HANGUL SYLLABLE CHIEUCH E PHIEUPH + {0xAB71, 0xCCCF}, //7415 #HANGUL SYLLABLE CHIEUCH E HIEUH + {0xAB72, 0xCCD1}, //7416 #HANGUL SYLLABLE CHIEUCH YEO KIYEOK + {0xAB73, 0xCCD2}, //7417 #HANGUL SYLLABLE CHIEUCH YEO SSANGKIYEOK + {0xAB74, 0xCCD3}, //7418 #HANGUL SYLLABLE CHIEUCH YEO KIYEOKSIOS + {0xAB75, 0xCCD5}, //7419 #HANGUL SYLLABLE CHIEUCH YEO NIEUNCIEUC + {0xAB76, 0xCCD6}, //7420 #HANGUL SYLLABLE CHIEUCH YEO NIEUNHIEUH + {0xAB77, 0xCCD7}, //7421 #HANGUL SYLLABLE CHIEUCH YEO TIKEUT + {0xAB78, 0xCCD8}, //7422 #HANGUL SYLLABLE CHIEUCH YEO RIEUL + {0xAB79, 0xCCD9}, //7423 #HANGUL SYLLABLE CHIEUCH YEO RIEULKIYEOK + {0xAB7A, 0xCCDA}, //7424 #HANGUL SYLLABLE CHIEUCH YEO RIEULMIEUM + {0xAB81, 0xCCDB}, //7425 #HANGUL SYLLABLE CHIEUCH YEO RIEULPIEUP + {0xAB82, 0xCCDC}, //7426 #HANGUL SYLLABLE CHIEUCH YEO RIEULSIOS + {0xAB83, 0xCCDD}, //7427 #HANGUL SYLLABLE CHIEUCH YEO RIEULTHIEUTH + {0xAB84, 0xCCDE}, //7428 #HANGUL SYLLABLE CHIEUCH YEO RIEULPHIEUPH + {0xAB85, 0xCCDF}, //7429 #HANGUL SYLLABLE CHIEUCH YEO RIEULHIEUH + {0xAB86, 0xCCE0}, //7430 #HANGUL SYLLABLE CHIEUCH YEO MIEUM + {0xAB87, 0xCCE1}, //7431 #HANGUL SYLLABLE CHIEUCH YEO PIEUP + {0xAB88, 0xCCE2}, //7432 #HANGUL SYLLABLE CHIEUCH YEO PIEUPSIOS + {0xAB89, 0xCCE3}, //7433 #HANGUL SYLLABLE CHIEUCH YEO SIOS + {0xAB8A, 0xCCE5}, //7434 #HANGUL SYLLABLE CHIEUCH YEO IEUNG + {0xAB8B, 0xCCE6}, //7435 #HANGUL SYLLABLE CHIEUCH YEO CIEUC + {0xAB8C, 0xCCE7}, //7436 #HANGUL SYLLABLE CHIEUCH YEO CHIEUCH + {0xAB8D, 0xCCE8}, //7437 #HANGUL SYLLABLE CHIEUCH YEO KHIEUKH + {0xAB8E, 0xCCE9}, //7438 #HANGUL SYLLABLE CHIEUCH YEO THIEUTH + {0xAB8F, 0xCCEA}, //7439 #HANGUL SYLLABLE CHIEUCH YEO PHIEUPH + {0xAB90, 0xCCEB}, //7440 #HANGUL SYLLABLE CHIEUCH YEO HIEUH + {0xAB91, 0xCCED}, //7441 #HANGUL SYLLABLE CHIEUCH YE KIYEOK + {0xAB92, 0xCCEE}, //7442 #HANGUL SYLLABLE CHIEUCH YE SSANGKIYEOK + {0xAB93, 0xCCEF}, //7443 #HANGUL SYLLABLE CHIEUCH YE KIYEOKSIOS + {0xAB94, 0xCCF1}, //7444 #HANGUL SYLLABLE CHIEUCH YE NIEUNCIEUC + {0xAB95, 0xCCF2}, //7445 #HANGUL SYLLABLE CHIEUCH YE NIEUNHIEUH + {0xAB96, 0xCCF3}, //7446 #HANGUL SYLLABLE CHIEUCH YE TIKEUT + {0xAB97, 0xCCF4}, //7447 #HANGUL SYLLABLE CHIEUCH YE RIEUL + {0xAB98, 0xCCF5}, //7448 #HANGUL SYLLABLE CHIEUCH YE RIEULKIYEOK + {0xAB99, 0xCCF6}, //7449 #HANGUL SYLLABLE CHIEUCH YE RIEULMIEUM + {0xAB9A, 0xCCF7}, //7450 #HANGUL SYLLABLE CHIEUCH YE RIEULPIEUP + {0xAB9B, 0xCCF8}, //7451 #HANGUL SYLLABLE CHIEUCH YE RIEULSIOS + {0xAB9C, 0xCCF9}, //7452 #HANGUL SYLLABLE CHIEUCH YE RIEULTHIEUTH + {0xAB9D, 0xCCFA}, //7453 #HANGUL SYLLABLE CHIEUCH YE RIEULPHIEUPH + {0xAB9E, 0xCCFB}, //7454 #HANGUL SYLLABLE CHIEUCH YE RIEULHIEUH + {0xAB9F, 0xCCFC}, //7455 #HANGUL SYLLABLE CHIEUCH YE MIEUM + {0xABA0, 0xCCFD}, //7456 #HANGUL SYLLABLE CHIEUCH YE PIEUP + {0xABA1, 0x30A1}, //7457 #KATAKANA LETTER SMALL A + {0xABA2, 0x30A2}, //7458 #KATAKANA LETTER A + {0xABA3, 0x30A3}, //7459 #KATAKANA LETTER SMALL I + {0xABA4, 0x30A4}, //7460 #KATAKANA LETTER I + {0xABA5, 0x30A5}, //7461 #KATAKANA LETTER SMALL U + {0xABA6, 0x30A6}, //7462 #KATAKANA LETTER U + {0xABA7, 0x30A7}, //7463 #KATAKANA LETTER SMALL E + {0xABA8, 0x30A8}, //7464 #KATAKANA LETTER E + {0xABA9, 0x30A9}, //7465 #KATAKANA LETTER SMALL O + {0xABAA, 0x30AA}, //7466 #KATAKANA LETTER O + {0xABAB, 0x30AB}, //7467 #KATAKANA LETTER KA + {0xABAC, 0x30AC}, //7468 #KATAKANA LETTER GA + {0xABAD, 0x30AD}, //7469 #KATAKANA LETTER KI + {0xABAE, 0x30AE}, //7470 #KATAKANA LETTER GI + {0xABAF, 0x30AF}, //7471 #KATAKANA LETTER KU + {0xABB0, 0x30B0}, //7472 #KATAKANA LETTER GU + {0xABB1, 0x30B1}, //7473 #KATAKANA LETTER KE + {0xABB2, 0x30B2}, //7474 #KATAKANA LETTER GE + {0xABB3, 0x30B3}, //7475 #KATAKANA LETTER KO + {0xABB4, 0x30B4}, //7476 #KATAKANA LETTER GO + {0xABB5, 0x30B5}, //7477 #KATAKANA LETTER SA + {0xABB6, 0x30B6}, //7478 #KATAKANA LETTER ZA + {0xABB7, 0x30B7}, //7479 #KATAKANA LETTER SI + {0xABB8, 0x30B8}, //7480 #KATAKANA LETTER ZI + {0xABB9, 0x30B9}, //7481 #KATAKANA LETTER SU + {0xABBA, 0x30BA}, //7482 #KATAKANA LETTER ZU + {0xABBB, 0x30BB}, //7483 #KATAKANA LETTER SE + {0xABBC, 0x30BC}, //7484 #KATAKANA LETTER ZE + {0xABBD, 0x30BD}, //7485 #KATAKANA LETTER SO + {0xABBE, 0x30BE}, //7486 #KATAKANA LETTER ZO + {0xABBF, 0x30BF}, //7487 #KATAKANA LETTER TA + {0xABC0, 0x30C0}, //7488 #KATAKANA LETTER DA + {0xABC1, 0x30C1}, //7489 #KATAKANA LETTER TI + {0xABC2, 0x30C2}, //7490 #KATAKANA LETTER DI + {0xABC3, 0x30C3}, //7491 #KATAKANA LETTER SMALL TU + {0xABC4, 0x30C4}, //7492 #KATAKANA LETTER TU + {0xABC5, 0x30C5}, //7493 #KATAKANA LETTER DU + {0xABC6, 0x30C6}, //7494 #KATAKANA LETTER TE + {0xABC7, 0x30C7}, //7495 #KATAKANA LETTER DE + {0xABC8, 0x30C8}, //7496 #KATAKANA LETTER TO + {0xABC9, 0x30C9}, //7497 #KATAKANA LETTER DO + {0xABCA, 0x30CA}, //7498 #KATAKANA LETTER NA + {0xABCB, 0x30CB}, //7499 #KATAKANA LETTER NI + {0xABCC, 0x30CC}, //7500 #KATAKANA LETTER NU + {0xABCD, 0x30CD}, //7501 #KATAKANA LETTER NE + {0xABCE, 0x30CE}, //7502 #KATAKANA LETTER NO + {0xABCF, 0x30CF}, //7503 #KATAKANA LETTER HA + {0xABD0, 0x30D0}, //7504 #KATAKANA LETTER BA + {0xABD1, 0x30D1}, //7505 #KATAKANA LETTER PA + {0xABD2, 0x30D2}, //7506 #KATAKANA LETTER HI + {0xABD3, 0x30D3}, //7507 #KATAKANA LETTER BI + {0xABD4, 0x30D4}, //7508 #KATAKANA LETTER PI + {0xABD5, 0x30D5}, //7509 #KATAKANA LETTER HU + {0xABD6, 0x30D6}, //7510 #KATAKANA LETTER BU + {0xABD7, 0x30D7}, //7511 #KATAKANA LETTER PU + {0xABD8, 0x30D8}, //7512 #KATAKANA LETTER HE + {0xABD9, 0x30D9}, //7513 #KATAKANA LETTER BE + {0xABDA, 0x30DA}, //7514 #KATAKANA LETTER PE + {0xABDB, 0x30DB}, //7515 #KATAKANA LETTER HO + {0xABDC, 0x30DC}, //7516 #KATAKANA LETTER BO + {0xABDD, 0x30DD}, //7517 #KATAKANA LETTER PO + {0xABDE, 0x30DE}, //7518 #KATAKANA LETTER MA + {0xABDF, 0x30DF}, //7519 #KATAKANA LETTER MI + {0xABE0, 0x30E0}, //7520 #KATAKANA LETTER MU + {0xABE1, 0x30E1}, //7521 #KATAKANA LETTER ME + {0xABE2, 0x30E2}, //7522 #KATAKANA LETTER MO + {0xABE3, 0x30E3}, //7523 #KATAKANA LETTER SMALL YA + {0xABE4, 0x30E4}, //7524 #KATAKANA LETTER YA + {0xABE5, 0x30E5}, //7525 #KATAKANA LETTER SMALL YU + {0xABE6, 0x30E6}, //7526 #KATAKANA LETTER YU + {0xABE7, 0x30E7}, //7527 #KATAKANA LETTER SMALL YO + {0xABE8, 0x30E8}, //7528 #KATAKANA LETTER YO + {0xABE9, 0x30E9}, //7529 #KATAKANA LETTER RA + {0xABEA, 0x30EA}, //7530 #KATAKANA LETTER RI + {0xABEB, 0x30EB}, //7531 #KATAKANA LETTER RU + {0xABEC, 0x30EC}, //7532 #KATAKANA LETTER RE + {0xABED, 0x30ED}, //7533 #KATAKANA LETTER RO + {0xABEE, 0x30EE}, //7534 #KATAKANA LETTER SMALL WA + {0xABEF, 0x30EF}, //7535 #KATAKANA LETTER WA + {0xABF0, 0x30F0}, //7536 #KATAKANA LETTER WI + {0xABF1, 0x30F1}, //7537 #KATAKANA LETTER WE + {0xABF2, 0x30F2}, //7538 #KATAKANA LETTER WO + {0xABF3, 0x30F3}, //7539 #KATAKANA LETTER N + {0xABF4, 0x30F4}, //7540 #KATAKANA LETTER VU + {0xABF5, 0x30F5}, //7541 #KATAKANA LETTER SMALL KA + {0xABF6, 0x30F6}, //7542 #KATAKANA LETTER SMALL KE + {0xAC41, 0xCCFE}, //7543 #HANGUL SYLLABLE CHIEUCH YE PIEUPSIOS + {0xAC42, 0xCCFF}, //7544 #HANGUL SYLLABLE CHIEUCH YE SIOS + {0xAC43, 0xCD00}, //7545 #HANGUL SYLLABLE CHIEUCH YE SSANGSIOS + {0xAC44, 0xCD02}, //7546 #HANGUL SYLLABLE CHIEUCH YE CIEUC + {0xAC45, 0xCD03}, //7547 #HANGUL SYLLABLE CHIEUCH YE CHIEUCH + {0xAC46, 0xCD04}, //7548 #HANGUL SYLLABLE CHIEUCH YE KHIEUKH + {0xAC47, 0xCD05}, //7549 #HANGUL SYLLABLE CHIEUCH YE THIEUTH + {0xAC48, 0xCD06}, //7550 #HANGUL SYLLABLE CHIEUCH YE PHIEUPH + {0xAC49, 0xCD07}, //7551 #HANGUL SYLLABLE CHIEUCH YE HIEUH + {0xAC4A, 0xCD0A}, //7552 #HANGUL SYLLABLE CHIEUCH O SSANGKIYEOK + {0xAC4B, 0xCD0B}, //7553 #HANGUL SYLLABLE CHIEUCH O KIYEOKSIOS + {0xAC4C, 0xCD0D}, //7554 #HANGUL SYLLABLE CHIEUCH O NIEUNCIEUC + {0xAC4D, 0xCD0E}, //7555 #HANGUL SYLLABLE CHIEUCH O NIEUNHIEUH + {0xAC4E, 0xCD0F}, //7556 #HANGUL SYLLABLE CHIEUCH O TIKEUT + {0xAC4F, 0xCD11}, //7557 #HANGUL SYLLABLE CHIEUCH O RIEULKIYEOK + {0xAC50, 0xCD12}, //7558 #HANGUL SYLLABLE CHIEUCH O RIEULMIEUM + {0xAC51, 0xCD13}, //7559 #HANGUL SYLLABLE CHIEUCH O RIEULPIEUP + {0xAC52, 0xCD14}, //7560 #HANGUL SYLLABLE CHIEUCH O RIEULSIOS + {0xAC53, 0xCD15}, //7561 #HANGUL SYLLABLE CHIEUCH O RIEULTHIEUTH + {0xAC54, 0xCD16}, //7562 #HANGUL SYLLABLE CHIEUCH O RIEULPHIEUPH + {0xAC55, 0xCD17}, //7563 #HANGUL SYLLABLE CHIEUCH O RIEULHIEUH + {0xAC56, 0xCD1A}, //7564 #HANGUL SYLLABLE CHIEUCH O PIEUPSIOS + {0xAC57, 0xCD1C}, //7565 #HANGUL SYLLABLE CHIEUCH O SSANGSIOS + {0xAC58, 0xCD1E}, //7566 #HANGUL SYLLABLE CHIEUCH O CIEUC + {0xAC59, 0xCD1F}, //7567 #HANGUL SYLLABLE CHIEUCH O CHIEUCH + {0xAC5A, 0xCD20}, //7568 #HANGUL SYLLABLE CHIEUCH O KHIEUKH + {0xAC61, 0xCD21}, //7569 #HANGUL SYLLABLE CHIEUCH O THIEUTH + {0xAC62, 0xCD22}, //7570 #HANGUL SYLLABLE CHIEUCH O PHIEUPH + {0xAC63, 0xCD23}, //7571 #HANGUL SYLLABLE CHIEUCH O HIEUH + {0xAC64, 0xCD25}, //7572 #HANGUL SYLLABLE CHIEUCH WA KIYEOK + {0xAC65, 0xCD26}, //7573 #HANGUL SYLLABLE CHIEUCH WA SSANGKIYEOK + {0xAC66, 0xCD27}, //7574 #HANGUL SYLLABLE CHIEUCH WA KIYEOKSIOS + {0xAC67, 0xCD29}, //7575 #HANGUL SYLLABLE CHIEUCH WA NIEUNCIEUC + {0xAC68, 0xCD2A}, //7576 #HANGUL SYLLABLE CHIEUCH WA NIEUNHIEUH + {0xAC69, 0xCD2B}, //7577 #HANGUL SYLLABLE CHIEUCH WA TIKEUT + {0xAC6A, 0xCD2D}, //7578 #HANGUL SYLLABLE CHIEUCH WA RIEULKIYEOK + {0xAC6B, 0xCD2E}, //7579 #HANGUL SYLLABLE CHIEUCH WA RIEULMIEUM + {0xAC6C, 0xCD2F}, //7580 #HANGUL SYLLABLE CHIEUCH WA RIEULPIEUP + {0xAC6D, 0xCD30}, //7581 #HANGUL SYLLABLE CHIEUCH WA RIEULSIOS + {0xAC6E, 0xCD31}, //7582 #HANGUL SYLLABLE CHIEUCH WA RIEULTHIEUTH + {0xAC6F, 0xCD32}, //7583 #HANGUL SYLLABLE CHIEUCH WA RIEULPHIEUPH + {0xAC70, 0xCD33}, //7584 #HANGUL SYLLABLE CHIEUCH WA RIEULHIEUH + {0xAC71, 0xCD34}, //7585 #HANGUL SYLLABLE CHIEUCH WA MIEUM + {0xAC72, 0xCD35}, //7586 #HANGUL SYLLABLE CHIEUCH WA PIEUP + {0xAC73, 0xCD36}, //7587 #HANGUL SYLLABLE CHIEUCH WA PIEUPSIOS + {0xAC74, 0xCD37}, //7588 #HANGUL SYLLABLE CHIEUCH WA SIOS + {0xAC75, 0xCD38}, //7589 #HANGUL SYLLABLE CHIEUCH WA SSANGSIOS + {0xAC76, 0xCD3A}, //7590 #HANGUL SYLLABLE CHIEUCH WA CIEUC + {0xAC77, 0xCD3B}, //7591 #HANGUL SYLLABLE CHIEUCH WA CHIEUCH + {0xAC78, 0xCD3C}, //7592 #HANGUL SYLLABLE CHIEUCH WA KHIEUKH + {0xAC79, 0xCD3D}, //7593 #HANGUL SYLLABLE CHIEUCH WA THIEUTH + {0xAC7A, 0xCD3E}, //7594 #HANGUL SYLLABLE CHIEUCH WA PHIEUPH + {0xAC81, 0xCD3F}, //7595 #HANGUL SYLLABLE CHIEUCH WA HIEUH + {0xAC82, 0xCD40}, //7596 #HANGUL SYLLABLE CHIEUCH WAE + {0xAC83, 0xCD41}, //7597 #HANGUL SYLLABLE CHIEUCH WAE KIYEOK + {0xAC84, 0xCD42}, //7598 #HANGUL SYLLABLE CHIEUCH WAE SSANGKIYEOK + {0xAC85, 0xCD43}, //7599 #HANGUL SYLLABLE CHIEUCH WAE KIYEOKSIOS + {0xAC86, 0xCD44}, //7600 #HANGUL SYLLABLE CHIEUCH WAE NIEUN + {0xAC87, 0xCD45}, //7601 #HANGUL SYLLABLE CHIEUCH WAE NIEUNCIEUC + {0xAC88, 0xCD46}, //7602 #HANGUL SYLLABLE CHIEUCH WAE NIEUNHIEUH + {0xAC89, 0xCD47}, //7603 #HANGUL SYLLABLE CHIEUCH WAE TIKEUT + {0xAC8A, 0xCD48}, //7604 #HANGUL SYLLABLE CHIEUCH WAE RIEUL + {0xAC8B, 0xCD49}, //7605 #HANGUL SYLLABLE CHIEUCH WAE RIEULKIYEOK + {0xAC8C, 0xCD4A}, //7606 #HANGUL SYLLABLE CHIEUCH WAE RIEULMIEUM + {0xAC8D, 0xCD4B}, //7607 #HANGUL SYLLABLE CHIEUCH WAE RIEULPIEUP + {0xAC8E, 0xCD4C}, //7608 #HANGUL SYLLABLE CHIEUCH WAE RIEULSIOS + {0xAC8F, 0xCD4D}, //7609 #HANGUL SYLLABLE CHIEUCH WAE RIEULTHIEUTH + {0xAC90, 0xCD4E}, //7610 #HANGUL SYLLABLE CHIEUCH WAE RIEULPHIEUPH + {0xAC91, 0xCD4F}, //7611 #HANGUL SYLLABLE CHIEUCH WAE RIEULHIEUH + {0xAC92, 0xCD50}, //7612 #HANGUL SYLLABLE CHIEUCH WAE MIEUM + {0xAC93, 0xCD51}, //7613 #HANGUL SYLLABLE CHIEUCH WAE PIEUP + {0xAC94, 0xCD52}, //7614 #HANGUL SYLLABLE CHIEUCH WAE PIEUPSIOS + {0xAC95, 0xCD53}, //7615 #HANGUL SYLLABLE CHIEUCH WAE SIOS + {0xAC96, 0xCD54}, //7616 #HANGUL SYLLABLE CHIEUCH WAE SSANGSIOS + {0xAC97, 0xCD55}, //7617 #HANGUL SYLLABLE CHIEUCH WAE IEUNG + {0xAC98, 0xCD56}, //7618 #HANGUL SYLLABLE CHIEUCH WAE CIEUC + {0xAC99, 0xCD57}, //7619 #HANGUL SYLLABLE CHIEUCH WAE CHIEUCH + {0xAC9A, 0xCD58}, //7620 #HANGUL SYLLABLE CHIEUCH WAE KHIEUKH + {0xAC9B, 0xCD59}, //7621 #HANGUL SYLLABLE CHIEUCH WAE THIEUTH + {0xAC9C, 0xCD5A}, //7622 #HANGUL SYLLABLE CHIEUCH WAE PHIEUPH + {0xAC9D, 0xCD5B}, //7623 #HANGUL SYLLABLE CHIEUCH WAE HIEUH + {0xAC9E, 0xCD5D}, //7624 #HANGUL SYLLABLE CHIEUCH OE KIYEOK + {0xAC9F, 0xCD5E}, //7625 #HANGUL SYLLABLE CHIEUCH OE SSANGKIYEOK + {0xACA0, 0xCD5F}, //7626 #HANGUL SYLLABLE CHIEUCH OE KIYEOKSIOS + {0xACA1, 0x0410}, //7627 #CYRILLIC CAPITAL LETTER A + {0xACA2, 0x0411}, //7628 #CYRILLIC CAPITAL LETTER BE + {0xACA3, 0x0412}, //7629 #CYRILLIC CAPITAL LETTER VE + {0xACA4, 0x0413}, //7630 #CYRILLIC CAPITAL LETTER GHE + {0xACA5, 0x0414}, //7631 #CYRILLIC CAPITAL LETTER DE + {0xACA6, 0x0415}, //7632 #CYRILLIC CAPITAL LETTER IE + {0xACA7, 0x0401}, //7633 #CYRILLIC CAPITAL LETTER IO + {0xACA8, 0x0416}, //7634 #CYRILLIC CAPITAL LETTER ZHE + {0xACA9, 0x0417}, //7635 #CYRILLIC CAPITAL LETTER ZE + {0xACAA, 0x0418}, //7636 #CYRILLIC CAPITAL LETTER I + {0xACAB, 0x0419}, //7637 #CYRILLIC CAPITAL LETTER SHORT I + {0xACAC, 0x041A}, //7638 #CYRILLIC CAPITAL LETTER KA + {0xACAD, 0x041B}, //7639 #CYRILLIC CAPITAL LETTER EL + {0xACAE, 0x041C}, //7640 #CYRILLIC CAPITAL LETTER EM + {0xACAF, 0x041D}, //7641 #CYRILLIC CAPITAL LETTER EN + {0xACB0, 0x041E}, //7642 #CYRILLIC CAPITAL LETTER O + {0xACB1, 0x041F}, //7643 #CYRILLIC CAPITAL LETTER PE + {0xACB2, 0x0420}, //7644 #CYRILLIC CAPITAL LETTER ER + {0xACB3, 0x0421}, //7645 #CYRILLIC CAPITAL LETTER ES + {0xACB4, 0x0422}, //7646 #CYRILLIC CAPITAL LETTER TE + {0xACB5, 0x0423}, //7647 #CYRILLIC CAPITAL LETTER U + {0xACB6, 0x0424}, //7648 #CYRILLIC CAPITAL LETTER EF + {0xACB7, 0x0425}, //7649 #CYRILLIC CAPITAL LETTER HA + {0xACB8, 0x0426}, //7650 #CYRILLIC CAPITAL LETTER TSE + {0xACB9, 0x0427}, //7651 #CYRILLIC CAPITAL LETTER CHE + {0xACBA, 0x0428}, //7652 #CYRILLIC CAPITAL LETTER SHA + {0xACBB, 0x0429}, //7653 #CYRILLIC CAPITAL LETTER SHCHA + {0xACBC, 0x042A}, //7654 #CYRILLIC CAPITAL LETTER HARD SIGN + {0xACBD, 0x042B}, //7655 #CYRILLIC CAPITAL LETTER YERU + {0xACBE, 0x042C}, //7656 #CYRILLIC CAPITAL LETTER SOFT SIGN + {0xACBF, 0x042D}, //7657 #CYRILLIC CAPITAL LETTER E + {0xACC0, 0x042E}, //7658 #CYRILLIC CAPITAL LETTER YU + {0xACC1, 0x042F}, //7659 #CYRILLIC CAPITAL LETTER YA + {0xACD1, 0x0430}, //7660 #CYRILLIC SMALL LETTER A + {0xACD2, 0x0431}, //7661 #CYRILLIC SMALL LETTER BE + {0xACD3, 0x0432}, //7662 #CYRILLIC SMALL LETTER VE + {0xACD4, 0x0433}, //7663 #CYRILLIC SMALL LETTER GHE + {0xACD5, 0x0434}, //7664 #CYRILLIC SMALL LETTER DE + {0xACD6, 0x0435}, //7665 #CYRILLIC SMALL LETTER IE + {0xACD7, 0x0451}, //7666 #CYRILLIC SMALL LETTER IO + {0xACD8, 0x0436}, //7667 #CYRILLIC SMALL LETTER ZHE + {0xACD9, 0x0437}, //7668 #CYRILLIC SMALL LETTER ZE + {0xACDA, 0x0438}, //7669 #CYRILLIC SMALL LETTER I + {0xACDB, 0x0439}, //7670 #CYRILLIC SMALL LETTER SHORT I + {0xACDC, 0x043A}, //7671 #CYRILLIC SMALL LETTER KA + {0xACDD, 0x043B}, //7672 #CYRILLIC SMALL LETTER EL + {0xACDE, 0x043C}, //7673 #CYRILLIC SMALL LETTER EM + {0xACDF, 0x043D}, //7674 #CYRILLIC SMALL LETTER EN + {0xACE0, 0x043E}, //7675 #CYRILLIC SMALL LETTER O + {0xACE1, 0x043F}, //7676 #CYRILLIC SMALL LETTER PE + {0xACE2, 0x0440}, //7677 #CYRILLIC SMALL LETTER ER + {0xACE3, 0x0441}, //7678 #CYRILLIC SMALL LETTER ES + {0xACE4, 0x0442}, //7679 #CYRILLIC SMALL LETTER TE + {0xACE5, 0x0443}, //7680 #CYRILLIC SMALL LETTER U + {0xACE6, 0x0444}, //7681 #CYRILLIC SMALL LETTER EF + {0xACE7, 0x0445}, //7682 #CYRILLIC SMALL LETTER HA + {0xACE8, 0x0446}, //7683 #CYRILLIC SMALL LETTER TSE + {0xACE9, 0x0447}, //7684 #CYRILLIC SMALL LETTER CHE + {0xACEA, 0x0448}, //7685 #CYRILLIC SMALL LETTER SHA + {0xACEB, 0x0449}, //7686 #CYRILLIC SMALL LETTER SHCHA + {0xACEC, 0x044A}, //7687 #CYRILLIC SMALL LETTER HARD SIGN + {0xACED, 0x044B}, //7688 #CYRILLIC SMALL LETTER YERU + {0xACEE, 0x044C}, //7689 #CYRILLIC SMALL LETTER SOFT SIGN + {0xACEF, 0x044D}, //7690 #CYRILLIC SMALL LETTER E + {0xACF0, 0x044E}, //7691 #CYRILLIC SMALL LETTER YU + {0xACF1, 0x044F}, //7692 #CYRILLIC SMALL LETTER YA + {0xAD41, 0xCD61}, //7693 #HANGUL SYLLABLE CHIEUCH OE NIEUNCIEUC + {0xAD42, 0xCD62}, //7694 #HANGUL SYLLABLE CHIEUCH OE NIEUNHIEUH + {0xAD43, 0xCD63}, //7695 #HANGUL SYLLABLE CHIEUCH OE TIKEUT + {0xAD44, 0xCD65}, //7696 #HANGUL SYLLABLE CHIEUCH OE RIEULKIYEOK + {0xAD45, 0xCD66}, //7697 #HANGUL SYLLABLE CHIEUCH OE RIEULMIEUM + {0xAD46, 0xCD67}, //7698 #HANGUL SYLLABLE CHIEUCH OE RIEULPIEUP + {0xAD47, 0xCD68}, //7699 #HANGUL SYLLABLE CHIEUCH OE RIEULSIOS + {0xAD48, 0xCD69}, //7700 #HANGUL SYLLABLE CHIEUCH OE RIEULTHIEUTH + {0xAD49, 0xCD6A}, //7701 #HANGUL SYLLABLE CHIEUCH OE RIEULPHIEUPH + {0xAD4A, 0xCD6B}, //7702 #HANGUL SYLLABLE CHIEUCH OE RIEULHIEUH + {0xAD4B, 0xCD6E}, //7703 #HANGUL SYLLABLE CHIEUCH OE PIEUPSIOS + {0xAD4C, 0xCD70}, //7704 #HANGUL SYLLABLE CHIEUCH OE SSANGSIOS + {0xAD4D, 0xCD72}, //7705 #HANGUL SYLLABLE CHIEUCH OE CIEUC + {0xAD4E, 0xCD73}, //7706 #HANGUL SYLLABLE CHIEUCH OE CHIEUCH + {0xAD4F, 0xCD74}, //7707 #HANGUL SYLLABLE CHIEUCH OE KHIEUKH + {0xAD50, 0xCD75}, //7708 #HANGUL SYLLABLE CHIEUCH OE THIEUTH + {0xAD51, 0xCD76}, //7709 #HANGUL SYLLABLE CHIEUCH OE PHIEUPH + {0xAD52, 0xCD77}, //7710 #HANGUL SYLLABLE CHIEUCH OE HIEUH + {0xAD53, 0xCD79}, //7711 #HANGUL SYLLABLE CHIEUCH YO KIYEOK + {0xAD54, 0xCD7A}, //7712 #HANGUL SYLLABLE CHIEUCH YO SSANGKIYEOK + {0xAD55, 0xCD7B}, //7713 #HANGUL SYLLABLE CHIEUCH YO KIYEOKSIOS + {0xAD56, 0xCD7C}, //7714 #HANGUL SYLLABLE CHIEUCH YO NIEUN + {0xAD57, 0xCD7D}, //7715 #HANGUL SYLLABLE CHIEUCH YO NIEUNCIEUC + {0xAD58, 0xCD7E}, //7716 #HANGUL SYLLABLE CHIEUCH YO NIEUNHIEUH + {0xAD59, 0xCD7F}, //7717 #HANGUL SYLLABLE CHIEUCH YO TIKEUT + {0xAD5A, 0xCD80}, //7718 #HANGUL SYLLABLE CHIEUCH YO RIEUL + {0xAD61, 0xCD81}, //7719 #HANGUL SYLLABLE CHIEUCH YO RIEULKIYEOK + {0xAD62, 0xCD82}, //7720 #HANGUL SYLLABLE CHIEUCH YO RIEULMIEUM + {0xAD63, 0xCD83}, //7721 #HANGUL SYLLABLE CHIEUCH YO RIEULPIEUP + {0xAD64, 0xCD84}, //7722 #HANGUL SYLLABLE CHIEUCH YO RIEULSIOS + {0xAD65, 0xCD85}, //7723 #HANGUL SYLLABLE CHIEUCH YO RIEULTHIEUTH + {0xAD66, 0xCD86}, //7724 #HANGUL SYLLABLE CHIEUCH YO RIEULPHIEUPH + {0xAD67, 0xCD87}, //7725 #HANGUL SYLLABLE CHIEUCH YO RIEULHIEUH + {0xAD68, 0xCD89}, //7726 #HANGUL SYLLABLE CHIEUCH YO PIEUP + {0xAD69, 0xCD8A}, //7727 #HANGUL SYLLABLE CHIEUCH YO PIEUPSIOS + {0xAD6A, 0xCD8B}, //7728 #HANGUL SYLLABLE CHIEUCH YO SIOS + {0xAD6B, 0xCD8C}, //7729 #HANGUL SYLLABLE CHIEUCH YO SSANGSIOS + {0xAD6C, 0xCD8D}, //7730 #HANGUL SYLLABLE CHIEUCH YO IEUNG + {0xAD6D, 0xCD8E}, //7731 #HANGUL SYLLABLE CHIEUCH YO CIEUC + {0xAD6E, 0xCD8F}, //7732 #HANGUL SYLLABLE CHIEUCH YO CHIEUCH + {0xAD6F, 0xCD90}, //7733 #HANGUL SYLLABLE CHIEUCH YO KHIEUKH + {0xAD70, 0xCD91}, //7734 #HANGUL SYLLABLE CHIEUCH YO THIEUTH + {0xAD71, 0xCD92}, //7735 #HANGUL SYLLABLE CHIEUCH YO PHIEUPH + {0xAD72, 0xCD93}, //7736 #HANGUL SYLLABLE CHIEUCH YO HIEUH + {0xAD73, 0xCD96}, //7737 #HANGUL SYLLABLE CHIEUCH U SSANGKIYEOK + {0xAD74, 0xCD97}, //7738 #HANGUL SYLLABLE CHIEUCH U KIYEOKSIOS + {0xAD75, 0xCD99}, //7739 #HANGUL SYLLABLE CHIEUCH U NIEUNCIEUC + {0xAD76, 0xCD9A}, //7740 #HANGUL SYLLABLE CHIEUCH U NIEUNHIEUH + {0xAD77, 0xCD9B}, //7741 #HANGUL SYLLABLE CHIEUCH U TIKEUT + {0xAD78, 0xCD9D}, //7742 #HANGUL SYLLABLE CHIEUCH U RIEULKIYEOK + {0xAD79, 0xCD9E}, //7743 #HANGUL SYLLABLE CHIEUCH U RIEULMIEUM + {0xAD7A, 0xCD9F}, //7744 #HANGUL SYLLABLE CHIEUCH U RIEULPIEUP + {0xAD81, 0xCDA0}, //7745 #HANGUL SYLLABLE CHIEUCH U RIEULSIOS + {0xAD82, 0xCDA1}, //7746 #HANGUL SYLLABLE CHIEUCH U RIEULTHIEUTH + {0xAD83, 0xCDA2}, //7747 #HANGUL SYLLABLE CHIEUCH U RIEULPHIEUPH + {0xAD84, 0xCDA3}, //7748 #HANGUL SYLLABLE CHIEUCH U RIEULHIEUH + {0xAD85, 0xCDA6}, //7749 #HANGUL SYLLABLE CHIEUCH U PIEUPSIOS + {0xAD86, 0xCDA8}, //7750 #HANGUL SYLLABLE CHIEUCH U SSANGSIOS + {0xAD87, 0xCDAA}, //7751 #HANGUL SYLLABLE CHIEUCH U CIEUC + {0xAD88, 0xCDAB}, //7752 #HANGUL SYLLABLE CHIEUCH U CHIEUCH + {0xAD89, 0xCDAC}, //7753 #HANGUL SYLLABLE CHIEUCH U KHIEUKH + {0xAD8A, 0xCDAD}, //7754 #HANGUL SYLLABLE CHIEUCH U THIEUTH + {0xAD8B, 0xCDAE}, //7755 #HANGUL SYLLABLE CHIEUCH U PHIEUPH + {0xAD8C, 0xCDAF}, //7756 #HANGUL SYLLABLE CHIEUCH U HIEUH + {0xAD8D, 0xCDB1}, //7757 #HANGUL SYLLABLE CHIEUCH WEO KIYEOK + {0xAD8E, 0xCDB2}, //7758 #HANGUL SYLLABLE CHIEUCH WEO SSANGKIYEOK + {0xAD8F, 0xCDB3}, //7759 #HANGUL SYLLABLE CHIEUCH WEO KIYEOKSIOS + {0xAD90, 0xCDB4}, //7760 #HANGUL SYLLABLE CHIEUCH WEO NIEUN + {0xAD91, 0xCDB5}, //7761 #HANGUL SYLLABLE CHIEUCH WEO NIEUNCIEUC + {0xAD92, 0xCDB6}, //7762 #HANGUL SYLLABLE CHIEUCH WEO NIEUNHIEUH + {0xAD93, 0xCDB7}, //7763 #HANGUL SYLLABLE CHIEUCH WEO TIKEUT + {0xAD94, 0xCDB8}, //7764 #HANGUL SYLLABLE CHIEUCH WEO RIEUL + {0xAD95, 0xCDB9}, //7765 #HANGUL SYLLABLE CHIEUCH WEO RIEULKIYEOK + {0xAD96, 0xCDBA}, //7766 #HANGUL SYLLABLE CHIEUCH WEO RIEULMIEUM + {0xAD97, 0xCDBB}, //7767 #HANGUL SYLLABLE CHIEUCH WEO RIEULPIEUP + {0xAD98, 0xCDBC}, //7768 #HANGUL SYLLABLE CHIEUCH WEO RIEULSIOS + {0xAD99, 0xCDBD}, //7769 #HANGUL SYLLABLE CHIEUCH WEO RIEULTHIEUTH + {0xAD9A, 0xCDBE}, //7770 #HANGUL SYLLABLE CHIEUCH WEO RIEULPHIEUPH + {0xAD9B, 0xCDBF}, //7771 #HANGUL SYLLABLE CHIEUCH WEO RIEULHIEUH + {0xAD9C, 0xCDC0}, //7772 #HANGUL SYLLABLE CHIEUCH WEO MIEUM + {0xAD9D, 0xCDC1}, //7773 #HANGUL SYLLABLE CHIEUCH WEO PIEUP + {0xAD9E, 0xCDC2}, //7774 #HANGUL SYLLABLE CHIEUCH WEO PIEUPSIOS + {0xAD9F, 0xCDC3}, //7775 #HANGUL SYLLABLE CHIEUCH WEO SIOS + {0xADA0, 0xCDC5}, //7776 #HANGUL SYLLABLE CHIEUCH WEO IEUNG + {0xAE41, 0xCDC6}, //7777 #HANGUL SYLLABLE CHIEUCH WEO CIEUC + {0xAE42, 0xCDC7}, //7778 #HANGUL SYLLABLE CHIEUCH WEO CHIEUCH + {0xAE43, 0xCDC8}, //7779 #HANGUL SYLLABLE CHIEUCH WEO KHIEUKH + {0xAE44, 0xCDC9}, //7780 #HANGUL SYLLABLE CHIEUCH WEO THIEUTH + {0xAE45, 0xCDCA}, //7781 #HANGUL SYLLABLE CHIEUCH WEO PHIEUPH + {0xAE46, 0xCDCB}, //7782 #HANGUL SYLLABLE CHIEUCH WEO HIEUH + {0xAE47, 0xCDCD}, //7783 #HANGUL SYLLABLE CHIEUCH WE KIYEOK + {0xAE48, 0xCDCE}, //7784 #HANGUL SYLLABLE CHIEUCH WE SSANGKIYEOK + {0xAE49, 0xCDCF}, //7785 #HANGUL SYLLABLE CHIEUCH WE KIYEOKSIOS + {0xAE4A, 0xCDD1}, //7786 #HANGUL SYLLABLE CHIEUCH WE NIEUNCIEUC + {0xAE4B, 0xCDD2}, //7787 #HANGUL SYLLABLE CHIEUCH WE NIEUNHIEUH + {0xAE4C, 0xCDD3}, //7788 #HANGUL SYLLABLE CHIEUCH WE TIKEUT + {0xAE4D, 0xCDD4}, //7789 #HANGUL SYLLABLE CHIEUCH WE RIEUL + {0xAE4E, 0xCDD5}, //7790 #HANGUL SYLLABLE CHIEUCH WE RIEULKIYEOK + {0xAE4F, 0xCDD6}, //7791 #HANGUL SYLLABLE CHIEUCH WE RIEULMIEUM + {0xAE50, 0xCDD7}, //7792 #HANGUL SYLLABLE CHIEUCH WE RIEULPIEUP + {0xAE51, 0xCDD8}, //7793 #HANGUL SYLLABLE CHIEUCH WE RIEULSIOS + {0xAE52, 0xCDD9}, //7794 #HANGUL SYLLABLE CHIEUCH WE RIEULTHIEUTH + {0xAE53, 0xCDDA}, //7795 #HANGUL SYLLABLE CHIEUCH WE RIEULPHIEUPH + {0xAE54, 0xCDDB}, //7796 #HANGUL SYLLABLE CHIEUCH WE RIEULHIEUH + {0xAE55, 0xCDDC}, //7797 #HANGUL SYLLABLE CHIEUCH WE MIEUM + {0xAE56, 0xCDDD}, //7798 #HANGUL SYLLABLE CHIEUCH WE PIEUP + {0xAE57, 0xCDDE}, //7799 #HANGUL SYLLABLE CHIEUCH WE PIEUPSIOS + {0xAE58, 0xCDDF}, //7800 #HANGUL SYLLABLE CHIEUCH WE SIOS + {0xAE59, 0xCDE0}, //7801 #HANGUL SYLLABLE CHIEUCH WE SSANGSIOS + {0xAE5A, 0xCDE1}, //7802 #HANGUL SYLLABLE CHIEUCH WE IEUNG + {0xAE61, 0xCDE2}, //7803 #HANGUL SYLLABLE CHIEUCH WE CIEUC + {0xAE62, 0xCDE3}, //7804 #HANGUL SYLLABLE CHIEUCH WE CHIEUCH + {0xAE63, 0xCDE4}, //7805 #HANGUL SYLLABLE CHIEUCH WE KHIEUKH + {0xAE64, 0xCDE5}, //7806 #HANGUL SYLLABLE CHIEUCH WE THIEUTH + {0xAE65, 0xCDE6}, //7807 #HANGUL SYLLABLE CHIEUCH WE PHIEUPH + {0xAE66, 0xCDE7}, //7808 #HANGUL SYLLABLE CHIEUCH WE HIEUH + {0xAE67, 0xCDE9}, //7809 #HANGUL SYLLABLE CHIEUCH WI KIYEOK + {0xAE68, 0xCDEA}, //7810 #HANGUL SYLLABLE CHIEUCH WI SSANGKIYEOK + {0xAE69, 0xCDEB}, //7811 #HANGUL SYLLABLE CHIEUCH WI KIYEOKSIOS + {0xAE6A, 0xCDED}, //7812 #HANGUL SYLLABLE CHIEUCH WI NIEUNCIEUC + {0xAE6B, 0xCDEE}, //7813 #HANGUL SYLLABLE CHIEUCH WI NIEUNHIEUH + {0xAE6C, 0xCDEF}, //7814 #HANGUL SYLLABLE CHIEUCH WI TIKEUT + {0xAE6D, 0xCDF1}, //7815 #HANGUL SYLLABLE CHIEUCH WI RIEULKIYEOK + {0xAE6E, 0xCDF2}, //7816 #HANGUL SYLLABLE CHIEUCH WI RIEULMIEUM + {0xAE6F, 0xCDF3}, //7817 #HANGUL SYLLABLE CHIEUCH WI RIEULPIEUP + {0xAE70, 0xCDF4}, //7818 #HANGUL SYLLABLE CHIEUCH WI RIEULSIOS + {0xAE71, 0xCDF5}, //7819 #HANGUL SYLLABLE CHIEUCH WI RIEULTHIEUTH + {0xAE72, 0xCDF6}, //7820 #HANGUL SYLLABLE CHIEUCH WI RIEULPHIEUPH + {0xAE73, 0xCDF7}, //7821 #HANGUL SYLLABLE CHIEUCH WI RIEULHIEUH + {0xAE74, 0xCDFA}, //7822 #HANGUL SYLLABLE CHIEUCH WI PIEUPSIOS + {0xAE75, 0xCDFC}, //7823 #HANGUL SYLLABLE CHIEUCH WI SSANGSIOS + {0xAE76, 0xCDFE}, //7824 #HANGUL SYLLABLE CHIEUCH WI CIEUC + {0xAE77, 0xCDFF}, //7825 #HANGUL SYLLABLE CHIEUCH WI CHIEUCH + {0xAE78, 0xCE00}, //7826 #HANGUL SYLLABLE CHIEUCH WI KHIEUKH + {0xAE79, 0xCE01}, //7827 #HANGUL SYLLABLE CHIEUCH WI THIEUTH + {0xAE7A, 0xCE02}, //7828 #HANGUL SYLLABLE CHIEUCH WI PHIEUPH + {0xAE81, 0xCE03}, //7829 #HANGUL SYLLABLE CHIEUCH WI HIEUH + {0xAE82, 0xCE05}, //7830 #HANGUL SYLLABLE CHIEUCH YU KIYEOK + {0xAE83, 0xCE06}, //7831 #HANGUL SYLLABLE CHIEUCH YU SSANGKIYEOK + {0xAE84, 0xCE07}, //7832 #HANGUL SYLLABLE CHIEUCH YU KIYEOKSIOS + {0xAE85, 0xCE09}, //7833 #HANGUL SYLLABLE CHIEUCH YU NIEUNCIEUC + {0xAE86, 0xCE0A}, //7834 #HANGUL SYLLABLE CHIEUCH YU NIEUNHIEUH + {0xAE87, 0xCE0B}, //7835 #HANGUL SYLLABLE CHIEUCH YU TIKEUT + {0xAE88, 0xCE0D}, //7836 #HANGUL SYLLABLE CHIEUCH YU RIEULKIYEOK + {0xAE89, 0xCE0E}, //7837 #HANGUL SYLLABLE CHIEUCH YU RIEULMIEUM + {0xAE8A, 0xCE0F}, //7838 #HANGUL SYLLABLE CHIEUCH YU RIEULPIEUP + {0xAE8B, 0xCE10}, //7839 #HANGUL SYLLABLE CHIEUCH YU RIEULSIOS + {0xAE8C, 0xCE11}, //7840 #HANGUL SYLLABLE CHIEUCH YU RIEULTHIEUTH + {0xAE8D, 0xCE12}, //7841 #HANGUL SYLLABLE CHIEUCH YU RIEULPHIEUPH + {0xAE8E, 0xCE13}, //7842 #HANGUL SYLLABLE CHIEUCH YU RIEULHIEUH + {0xAE8F, 0xCE15}, //7843 #HANGUL SYLLABLE CHIEUCH YU PIEUP + {0xAE90, 0xCE16}, //7844 #HANGUL SYLLABLE CHIEUCH YU PIEUPSIOS + {0xAE91, 0xCE17}, //7845 #HANGUL SYLLABLE CHIEUCH YU SIOS + {0xAE92, 0xCE18}, //7846 #HANGUL SYLLABLE CHIEUCH YU SSANGSIOS + {0xAE93, 0xCE1A}, //7847 #HANGUL SYLLABLE CHIEUCH YU CIEUC + {0xAE94, 0xCE1B}, //7848 #HANGUL SYLLABLE CHIEUCH YU CHIEUCH + {0xAE95, 0xCE1C}, //7849 #HANGUL SYLLABLE CHIEUCH YU KHIEUKH + {0xAE96, 0xCE1D}, //7850 #HANGUL SYLLABLE CHIEUCH YU THIEUTH + {0xAE97, 0xCE1E}, //7851 #HANGUL SYLLABLE CHIEUCH YU PHIEUPH + {0xAE98, 0xCE1F}, //7852 #HANGUL SYLLABLE CHIEUCH YU HIEUH + {0xAE99, 0xCE22}, //7853 #HANGUL SYLLABLE CHIEUCH EU SSANGKIYEOK + {0xAE9A, 0xCE23}, //7854 #HANGUL SYLLABLE CHIEUCH EU KIYEOKSIOS + {0xAE9B, 0xCE25}, //7855 #HANGUL SYLLABLE CHIEUCH EU NIEUNCIEUC + {0xAE9C, 0xCE26}, //7856 #HANGUL SYLLABLE CHIEUCH EU NIEUNHIEUH + {0xAE9D, 0xCE27}, //7857 #HANGUL SYLLABLE CHIEUCH EU TIKEUT + {0xAE9E, 0xCE29}, //7858 #HANGUL SYLLABLE CHIEUCH EU RIEULKIYEOK + {0xAE9F, 0xCE2A}, //7859 #HANGUL SYLLABLE CHIEUCH EU RIEULMIEUM + {0xAEA0, 0xCE2B}, //7860 #HANGUL SYLLABLE CHIEUCH EU RIEULPIEUP + {0xAF41, 0xCE2C}, //7861 #HANGUL SYLLABLE CHIEUCH EU RIEULSIOS + {0xAF42, 0xCE2D}, //7862 #HANGUL SYLLABLE CHIEUCH EU RIEULTHIEUTH + {0xAF43, 0xCE2E}, //7863 #HANGUL SYLLABLE CHIEUCH EU RIEULPHIEUPH + {0xAF44, 0xCE2F}, //7864 #HANGUL SYLLABLE CHIEUCH EU RIEULHIEUH + {0xAF45, 0xCE32}, //7865 #HANGUL SYLLABLE CHIEUCH EU PIEUPSIOS + {0xAF46, 0xCE34}, //7866 #HANGUL SYLLABLE CHIEUCH EU SSANGSIOS + {0xAF47, 0xCE36}, //7867 #HANGUL SYLLABLE CHIEUCH EU CIEUC + {0xAF48, 0xCE37}, //7868 #HANGUL SYLLABLE CHIEUCH EU CHIEUCH + {0xAF49, 0xCE38}, //7869 #HANGUL SYLLABLE CHIEUCH EU KHIEUKH + {0xAF4A, 0xCE39}, //7870 #HANGUL SYLLABLE CHIEUCH EU THIEUTH + {0xAF4B, 0xCE3A}, //7871 #HANGUL SYLLABLE CHIEUCH EU PHIEUPH + {0xAF4C, 0xCE3B}, //7872 #HANGUL SYLLABLE CHIEUCH EU HIEUH + {0xAF4D, 0xCE3C}, //7873 #HANGUL SYLLABLE CHIEUCH YI + {0xAF4E, 0xCE3D}, //7874 #HANGUL SYLLABLE CHIEUCH YI KIYEOK + {0xAF4F, 0xCE3E}, //7875 #HANGUL SYLLABLE CHIEUCH YI SSANGKIYEOK + {0xAF50, 0xCE3F}, //7876 #HANGUL SYLLABLE CHIEUCH YI KIYEOKSIOS + {0xAF51, 0xCE40}, //7877 #HANGUL SYLLABLE CHIEUCH YI NIEUN + {0xAF52, 0xCE41}, //7878 #HANGUL SYLLABLE CHIEUCH YI NIEUNCIEUC + {0xAF53, 0xCE42}, //7879 #HANGUL SYLLABLE CHIEUCH YI NIEUNHIEUH + {0xAF54, 0xCE43}, //7880 #HANGUL SYLLABLE CHIEUCH YI TIKEUT + {0xAF55, 0xCE44}, //7881 #HANGUL SYLLABLE CHIEUCH YI RIEUL + {0xAF56, 0xCE45}, //7882 #HANGUL SYLLABLE CHIEUCH YI RIEULKIYEOK + {0xAF57, 0xCE46}, //7883 #HANGUL SYLLABLE CHIEUCH YI RIEULMIEUM + {0xAF58, 0xCE47}, //7884 #HANGUL SYLLABLE CHIEUCH YI RIEULPIEUP + {0xAF59, 0xCE48}, //7885 #HANGUL SYLLABLE CHIEUCH YI RIEULSIOS + {0xAF5A, 0xCE49}, //7886 #HANGUL SYLLABLE CHIEUCH YI RIEULTHIEUTH + {0xAF61, 0xCE4A}, //7887 #HANGUL SYLLABLE CHIEUCH YI RIEULPHIEUPH + {0xAF62, 0xCE4B}, //7888 #HANGUL SYLLABLE CHIEUCH YI RIEULHIEUH + {0xAF63, 0xCE4C}, //7889 #HANGUL SYLLABLE CHIEUCH YI MIEUM + {0xAF64, 0xCE4D}, //7890 #HANGUL SYLLABLE CHIEUCH YI PIEUP + {0xAF65, 0xCE4E}, //7891 #HANGUL SYLLABLE CHIEUCH YI PIEUPSIOS + {0xAF66, 0xCE4F}, //7892 #HANGUL SYLLABLE CHIEUCH YI SIOS + {0xAF67, 0xCE50}, //7893 #HANGUL SYLLABLE CHIEUCH YI SSANGSIOS + {0xAF68, 0xCE51}, //7894 #HANGUL SYLLABLE CHIEUCH YI IEUNG + {0xAF69, 0xCE52}, //7895 #HANGUL SYLLABLE CHIEUCH YI CIEUC + {0xAF6A, 0xCE53}, //7896 #HANGUL SYLLABLE CHIEUCH YI CHIEUCH + {0xAF6B, 0xCE54}, //7897 #HANGUL SYLLABLE CHIEUCH YI KHIEUKH + {0xAF6C, 0xCE55}, //7898 #HANGUL SYLLABLE CHIEUCH YI THIEUTH + {0xAF6D, 0xCE56}, //7899 #HANGUL SYLLABLE CHIEUCH YI PHIEUPH + {0xAF6E, 0xCE57}, //7900 #HANGUL SYLLABLE CHIEUCH YI HIEUH + {0xAF6F, 0xCE5A}, //7901 #HANGUL SYLLABLE CHIEUCH I SSANGKIYEOK + {0xAF70, 0xCE5B}, //7902 #HANGUL SYLLABLE CHIEUCH I KIYEOKSIOS + {0xAF71, 0xCE5D}, //7903 #HANGUL SYLLABLE CHIEUCH I NIEUNCIEUC + {0xAF72, 0xCE5E}, //7904 #HANGUL SYLLABLE CHIEUCH I NIEUNHIEUH + {0xAF73, 0xCE62}, //7905 #HANGUL SYLLABLE CHIEUCH I RIEULMIEUM + {0xAF74, 0xCE63}, //7906 #HANGUL SYLLABLE CHIEUCH I RIEULPIEUP + {0xAF75, 0xCE64}, //7907 #HANGUL SYLLABLE CHIEUCH I RIEULSIOS + {0xAF76, 0xCE65}, //7908 #HANGUL SYLLABLE CHIEUCH I RIEULTHIEUTH + {0xAF77, 0xCE66}, //7909 #HANGUL SYLLABLE CHIEUCH I RIEULPHIEUPH + {0xAF78, 0xCE67}, //7910 #HANGUL SYLLABLE CHIEUCH I RIEULHIEUH + {0xAF79, 0xCE6A}, //7911 #HANGUL SYLLABLE CHIEUCH I PIEUPSIOS + {0xAF7A, 0xCE6C}, //7912 #HANGUL SYLLABLE CHIEUCH I SSANGSIOS + {0xAF81, 0xCE6E}, //7913 #HANGUL SYLLABLE CHIEUCH I CIEUC + {0xAF82, 0xCE6F}, //7914 #HANGUL SYLLABLE CHIEUCH I CHIEUCH + {0xAF83, 0xCE70}, //7915 #HANGUL SYLLABLE CHIEUCH I KHIEUKH + {0xAF84, 0xCE71}, //7916 #HANGUL SYLLABLE CHIEUCH I THIEUTH + {0xAF85, 0xCE72}, //7917 #HANGUL SYLLABLE CHIEUCH I PHIEUPH + {0xAF86, 0xCE73}, //7918 #HANGUL SYLLABLE CHIEUCH I HIEUH + {0xAF87, 0xCE76}, //7919 #HANGUL SYLLABLE KHIEUKH A SSANGKIYEOK + {0xAF88, 0xCE77}, //7920 #HANGUL SYLLABLE KHIEUKH A KIYEOKSIOS + {0xAF89, 0xCE79}, //7921 #HANGUL SYLLABLE KHIEUKH A NIEUNCIEUC + {0xAF8A, 0xCE7A}, //7922 #HANGUL SYLLABLE KHIEUKH A NIEUNHIEUH + {0xAF8B, 0xCE7B}, //7923 #HANGUL SYLLABLE KHIEUKH A TIKEUT + {0xAF8C, 0xCE7D}, //7924 #HANGUL SYLLABLE KHIEUKH A RIEULKIYEOK + {0xAF8D, 0xCE7E}, //7925 #HANGUL SYLLABLE KHIEUKH A RIEULMIEUM + {0xAF8E, 0xCE7F}, //7926 #HANGUL SYLLABLE KHIEUKH A RIEULPIEUP + {0xAF8F, 0xCE80}, //7927 #HANGUL SYLLABLE KHIEUKH A RIEULSIOS + {0xAF90, 0xCE81}, //7928 #HANGUL SYLLABLE KHIEUKH A RIEULTHIEUTH + {0xAF91, 0xCE82}, //7929 #HANGUL SYLLABLE KHIEUKH A RIEULPHIEUPH + {0xAF92, 0xCE83}, //7930 #HANGUL SYLLABLE KHIEUKH A RIEULHIEUH + {0xAF93, 0xCE86}, //7931 #HANGUL SYLLABLE KHIEUKH A PIEUPSIOS + {0xAF94, 0xCE88}, //7932 #HANGUL SYLLABLE KHIEUKH A SSANGSIOS + {0xAF95, 0xCE8A}, //7933 #HANGUL SYLLABLE KHIEUKH A CIEUC + {0xAF96, 0xCE8B}, //7934 #HANGUL SYLLABLE KHIEUKH A CHIEUCH + {0xAF97, 0xCE8C}, //7935 #HANGUL SYLLABLE KHIEUKH A KHIEUKH + {0xAF98, 0xCE8D}, //7936 #HANGUL SYLLABLE KHIEUKH A THIEUTH + {0xAF99, 0xCE8E}, //7937 #HANGUL SYLLABLE KHIEUKH A PHIEUPH + {0xAF9A, 0xCE8F}, //7938 #HANGUL SYLLABLE KHIEUKH A HIEUH + {0xAF9B, 0xCE92}, //7939 #HANGUL SYLLABLE KHIEUKH AE SSANGKIYEOK + {0xAF9C, 0xCE93}, //7940 #HANGUL SYLLABLE KHIEUKH AE KIYEOKSIOS + {0xAF9D, 0xCE95}, //7941 #HANGUL SYLLABLE KHIEUKH AE NIEUNCIEUC + {0xAF9E, 0xCE96}, //7942 #HANGUL SYLLABLE KHIEUKH AE NIEUNHIEUH + {0xAF9F, 0xCE97}, //7943 #HANGUL SYLLABLE KHIEUKH AE TIKEUT + {0xAFA0, 0xCE99}, //7944 #HANGUL SYLLABLE KHIEUKH AE RIEULKIYEOK + {0xB041, 0xCE9A}, //7945 #HANGUL SYLLABLE KHIEUKH AE RIEULMIEUM + {0xB042, 0xCE9B}, //7946 #HANGUL SYLLABLE KHIEUKH AE RIEULPIEUP + {0xB043, 0xCE9C}, //7947 #HANGUL SYLLABLE KHIEUKH AE RIEULSIOS + {0xB044, 0xCE9D}, //7948 #HANGUL SYLLABLE KHIEUKH AE RIEULTHIEUTH + {0xB045, 0xCE9E}, //7949 #HANGUL SYLLABLE KHIEUKH AE RIEULPHIEUPH + {0xB046, 0xCE9F}, //7950 #HANGUL SYLLABLE KHIEUKH AE RIEULHIEUH + {0xB047, 0xCEA2}, //7951 #HANGUL SYLLABLE KHIEUKH AE PIEUPSIOS + {0xB048, 0xCEA6}, //7952 #HANGUL SYLLABLE KHIEUKH AE CIEUC + {0xB049, 0xCEA7}, //7953 #HANGUL SYLLABLE KHIEUKH AE CHIEUCH + {0xB04A, 0xCEA8}, //7954 #HANGUL SYLLABLE KHIEUKH AE KHIEUKH + {0xB04B, 0xCEA9}, //7955 #HANGUL SYLLABLE KHIEUKH AE THIEUTH + {0xB04C, 0xCEAA}, //7956 #HANGUL SYLLABLE KHIEUKH AE PHIEUPH + {0xB04D, 0xCEAB}, //7957 #HANGUL SYLLABLE KHIEUKH AE HIEUH + {0xB04E, 0xCEAE}, //7958 #HANGUL SYLLABLE KHIEUKH YA SSANGKIYEOK + {0xB04F, 0xCEAF}, //7959 #HANGUL SYLLABLE KHIEUKH YA KIYEOKSIOS + {0xB050, 0xCEB0}, //7960 #HANGUL SYLLABLE KHIEUKH YA NIEUN + {0xB051, 0xCEB1}, //7961 #HANGUL SYLLABLE KHIEUKH YA NIEUNCIEUC + {0xB052, 0xCEB2}, //7962 #HANGUL SYLLABLE KHIEUKH YA NIEUNHIEUH + {0xB053, 0xCEB3}, //7963 #HANGUL SYLLABLE KHIEUKH YA TIKEUT + {0xB054, 0xCEB4}, //7964 #HANGUL SYLLABLE KHIEUKH YA RIEUL + {0xB055, 0xCEB5}, //7965 #HANGUL SYLLABLE KHIEUKH YA RIEULKIYEOK + {0xB056, 0xCEB6}, //7966 #HANGUL SYLLABLE KHIEUKH YA RIEULMIEUM + {0xB057, 0xCEB7}, //7967 #HANGUL SYLLABLE KHIEUKH YA RIEULPIEUP + {0xB058, 0xCEB8}, //7968 #HANGUL SYLLABLE KHIEUKH YA RIEULSIOS + {0xB059, 0xCEB9}, //7969 #HANGUL SYLLABLE KHIEUKH YA RIEULTHIEUTH + {0xB05A, 0xCEBA}, //7970 #HANGUL SYLLABLE KHIEUKH YA RIEULPHIEUPH + {0xB061, 0xCEBB}, //7971 #HANGUL SYLLABLE KHIEUKH YA RIEULHIEUH + {0xB062, 0xCEBC}, //7972 #HANGUL SYLLABLE KHIEUKH YA MIEUM + {0xB063, 0xCEBD}, //7973 #HANGUL SYLLABLE KHIEUKH YA PIEUP + {0xB064, 0xCEBE}, //7974 #HANGUL SYLLABLE KHIEUKH YA PIEUPSIOS + {0xB065, 0xCEBF}, //7975 #HANGUL SYLLABLE KHIEUKH YA SIOS + {0xB066, 0xCEC0}, //7976 #HANGUL SYLLABLE KHIEUKH YA SSANGSIOS + {0xB067, 0xCEC2}, //7977 #HANGUL SYLLABLE KHIEUKH YA CIEUC + {0xB068, 0xCEC3}, //7978 #HANGUL SYLLABLE KHIEUKH YA CHIEUCH + {0xB069, 0xCEC4}, //7979 #HANGUL SYLLABLE KHIEUKH YA KHIEUKH + {0xB06A, 0xCEC5}, //7980 #HANGUL SYLLABLE KHIEUKH YA THIEUTH + {0xB06B, 0xCEC6}, //7981 #HANGUL SYLLABLE KHIEUKH YA PHIEUPH + {0xB06C, 0xCEC7}, //7982 #HANGUL SYLLABLE KHIEUKH YA HIEUH + {0xB06D, 0xCEC8}, //7983 #HANGUL SYLLABLE KHIEUKH YAE + {0xB06E, 0xCEC9}, //7984 #HANGUL SYLLABLE KHIEUKH YAE KIYEOK + {0xB06F, 0xCECA}, //7985 #HANGUL SYLLABLE KHIEUKH YAE SSANGKIYEOK + {0xB070, 0xCECB}, //7986 #HANGUL SYLLABLE KHIEUKH YAE KIYEOKSIOS + {0xB071, 0xCECC}, //7987 #HANGUL SYLLABLE KHIEUKH YAE NIEUN + {0xB072, 0xCECD}, //7988 #HANGUL SYLLABLE KHIEUKH YAE NIEUNCIEUC + {0xB073, 0xCECE}, //7989 #HANGUL SYLLABLE KHIEUKH YAE NIEUNHIEUH + {0xB074, 0xCECF}, //7990 #HANGUL SYLLABLE KHIEUKH YAE TIKEUT + {0xB075, 0xCED0}, //7991 #HANGUL SYLLABLE KHIEUKH YAE RIEUL + {0xB076, 0xCED1}, //7992 #HANGUL SYLLABLE KHIEUKH YAE RIEULKIYEOK + {0xB077, 0xCED2}, //7993 #HANGUL SYLLABLE KHIEUKH YAE RIEULMIEUM + {0xB078, 0xCED3}, //7994 #HANGUL SYLLABLE KHIEUKH YAE RIEULPIEUP + {0xB079, 0xCED4}, //7995 #HANGUL SYLLABLE KHIEUKH YAE RIEULSIOS + {0xB07A, 0xCED5}, //7996 #HANGUL SYLLABLE KHIEUKH YAE RIEULTHIEUTH + {0xB081, 0xCED6}, //7997 #HANGUL SYLLABLE KHIEUKH YAE RIEULPHIEUPH + {0xB082, 0xCED7}, //7998 #HANGUL SYLLABLE KHIEUKH YAE RIEULHIEUH + {0xB083, 0xCED8}, //7999 #HANGUL SYLLABLE KHIEUKH YAE MIEUM + {0xB084, 0xCED9}, //8000 #HANGUL SYLLABLE KHIEUKH YAE PIEUP + {0xB085, 0xCEDA}, //8001 #HANGUL SYLLABLE KHIEUKH YAE PIEUPSIOS + {0xB086, 0xCEDB}, //8002 #HANGUL SYLLABLE KHIEUKH YAE SIOS + {0xB087, 0xCEDC}, //8003 #HANGUL SYLLABLE KHIEUKH YAE SSANGSIOS + {0xB088, 0xCEDD}, //8004 #HANGUL SYLLABLE KHIEUKH YAE IEUNG + {0xB089, 0xCEDE}, //8005 #HANGUL SYLLABLE KHIEUKH YAE CIEUC + {0xB08A, 0xCEDF}, //8006 #HANGUL SYLLABLE KHIEUKH YAE CHIEUCH + {0xB08B, 0xCEE0}, //8007 #HANGUL SYLLABLE KHIEUKH YAE KHIEUKH + {0xB08C, 0xCEE1}, //8008 #HANGUL SYLLABLE KHIEUKH YAE THIEUTH + {0xB08D, 0xCEE2}, //8009 #HANGUL SYLLABLE KHIEUKH YAE PHIEUPH + {0xB08E, 0xCEE3}, //8010 #HANGUL SYLLABLE KHIEUKH YAE HIEUH + {0xB08F, 0xCEE6}, //8011 #HANGUL SYLLABLE KHIEUKH EO SSANGKIYEOK + {0xB090, 0xCEE7}, //8012 #HANGUL SYLLABLE KHIEUKH EO KIYEOKSIOS + {0xB091, 0xCEE9}, //8013 #HANGUL SYLLABLE KHIEUKH EO NIEUNCIEUC + {0xB092, 0xCEEA}, //8014 #HANGUL SYLLABLE KHIEUKH EO NIEUNHIEUH + {0xB093, 0xCEED}, //8015 #HANGUL SYLLABLE KHIEUKH EO RIEULKIYEOK + {0xB094, 0xCEEE}, //8016 #HANGUL SYLLABLE KHIEUKH EO RIEULMIEUM + {0xB095, 0xCEEF}, //8017 #HANGUL SYLLABLE KHIEUKH EO RIEULPIEUP + {0xB096, 0xCEF0}, //8018 #HANGUL SYLLABLE KHIEUKH EO RIEULSIOS + {0xB097, 0xCEF1}, //8019 #HANGUL SYLLABLE KHIEUKH EO RIEULTHIEUTH + {0xB098, 0xCEF2}, //8020 #HANGUL SYLLABLE KHIEUKH EO RIEULPHIEUPH + {0xB099, 0xCEF3}, //8021 #HANGUL SYLLABLE KHIEUKH EO RIEULHIEUH + {0xB09A, 0xCEF6}, //8022 #HANGUL SYLLABLE KHIEUKH EO PIEUPSIOS + {0xB09B, 0xCEFA}, //8023 #HANGUL SYLLABLE KHIEUKH EO CIEUC + {0xB09C, 0xCEFB}, //8024 #HANGUL SYLLABLE KHIEUKH EO CHIEUCH + {0xB09D, 0xCEFC}, //8025 #HANGUL SYLLABLE KHIEUKH EO KHIEUKH + {0xB09E, 0xCEFD}, //8026 #HANGUL SYLLABLE KHIEUKH EO THIEUTH + {0xB09F, 0xCEFE}, //8027 #HANGUL SYLLABLE KHIEUKH EO PHIEUPH + {0xB0A0, 0xCEFF}, //8028 #HANGUL SYLLABLE KHIEUKH EO HIEUH + {0xB0A1, 0xAC00}, //8029 #HANGUL SYLLABLE KIYEOK A + {0xB0A2, 0xAC01}, //8030 #HANGUL SYLLABLE KIYEOK A KIYEOK + {0xB0A3, 0xAC04}, //8031 #HANGUL SYLLABLE KIYEOK A NIEUN + {0xB0A4, 0xAC07}, //8032 #HANGUL SYLLABLE KIYEOK A TIKEUT + {0xB0A5, 0xAC08}, //8033 #HANGUL SYLLABLE KIYEOK A RIEUL + {0xB0A6, 0xAC09}, //8034 #HANGUL SYLLABLE KIYEOK A RIEULKIYEOK + {0xB0A7, 0xAC0A}, //8035 #HANGUL SYLLABLE KIYEOK A RIEULMIEUM + {0xB0A8, 0xAC10}, //8036 #HANGUL SYLLABLE KIYEOK A MIEUM + {0xB0A9, 0xAC11}, //8037 #HANGUL SYLLABLE KIYEOK A PIEUP + {0xB0AA, 0xAC12}, //8038 #HANGUL SYLLABLE KIYEOK A PIEUPSIOS + {0xB0AB, 0xAC13}, //8039 #HANGUL SYLLABLE KIYEOK A SIOS + {0xB0AC, 0xAC14}, //8040 #HANGUL SYLLABLE KIYEOK A SSANGSIOS + {0xB0AD, 0xAC15}, //8041 #HANGUL SYLLABLE KIYEOK A IEUNG + {0xB0AE, 0xAC16}, //8042 #HANGUL SYLLABLE KIYEOK A CIEUC + {0xB0AF, 0xAC17}, //8043 #HANGUL SYLLABLE KIYEOK A CHIEUCH + {0xB0B0, 0xAC19}, //8044 #HANGUL SYLLABLE KIYEOK A THIEUTH + {0xB0B1, 0xAC1A}, //8045 #HANGUL SYLLABLE KIYEOK A PHIEUPH + {0xB0B2, 0xAC1B}, //8046 #HANGUL SYLLABLE KIYEOK A HIEUH + {0xB0B3, 0xAC1C}, //8047 #HANGUL SYLLABLE KIYEOK AE + {0xB0B4, 0xAC1D}, //8048 #HANGUL SYLLABLE KIYEOK AE KIYEOK + {0xB0B5, 0xAC20}, //8049 #HANGUL SYLLABLE KIYEOK AE NIEUN + {0xB0B6, 0xAC24}, //8050 #HANGUL SYLLABLE KIYEOK AE RIEUL + {0xB0B7, 0xAC2C}, //8051 #HANGUL SYLLABLE KIYEOK AE MIEUM + {0xB0B8, 0xAC2D}, //8052 #HANGUL SYLLABLE KIYEOK AE PIEUP + {0xB0B9, 0xAC2F}, //8053 #HANGUL SYLLABLE KIYEOK AE SIOS + {0xB0BA, 0xAC30}, //8054 #HANGUL SYLLABLE KIYEOK AE SSANGSIOS + {0xB0BB, 0xAC31}, //8055 #HANGUL SYLLABLE KIYEOK AE IEUNG + {0xB0BC, 0xAC38}, //8056 #HANGUL SYLLABLE KIYEOK YA + {0xB0BD, 0xAC39}, //8057 #HANGUL SYLLABLE KIYEOK YA KIYEOK + {0xB0BE, 0xAC3C}, //8058 #HANGUL SYLLABLE KIYEOK YA NIEUN + {0xB0BF, 0xAC40}, //8059 #HANGUL SYLLABLE KIYEOK YA RIEUL + {0xB0C0, 0xAC4B}, //8060 #HANGUL SYLLABLE KIYEOK YA SIOS + {0xB0C1, 0xAC4D}, //8061 #HANGUL SYLLABLE KIYEOK YA IEUNG + {0xB0C2, 0xAC54}, //8062 #HANGUL SYLLABLE KIYEOK YAE + {0xB0C3, 0xAC58}, //8063 #HANGUL SYLLABLE KIYEOK YAE NIEUN + {0xB0C4, 0xAC5C}, //8064 #HANGUL SYLLABLE KIYEOK YAE RIEUL + {0xB0C5, 0xAC70}, //8065 #HANGUL SYLLABLE KIYEOK EO + {0xB0C6, 0xAC71}, //8066 #HANGUL SYLLABLE KIYEOK EO KIYEOK + {0xB0C7, 0xAC74}, //8067 #HANGUL SYLLABLE KIYEOK EO NIEUN + {0xB0C8, 0xAC77}, //8068 #HANGUL SYLLABLE KIYEOK EO TIKEUT + {0xB0C9, 0xAC78}, //8069 #HANGUL SYLLABLE KIYEOK EO RIEUL + {0xB0CA, 0xAC7A}, //8070 #HANGUL SYLLABLE KIYEOK EO RIEULMIEUM + {0xB0CB, 0xAC80}, //8071 #HANGUL SYLLABLE KIYEOK EO MIEUM + {0xB0CC, 0xAC81}, //8072 #HANGUL SYLLABLE KIYEOK EO PIEUP + {0xB0CD, 0xAC83}, //8073 #HANGUL SYLLABLE KIYEOK EO SIOS + {0xB0CE, 0xAC84}, //8074 #HANGUL SYLLABLE KIYEOK EO SSANGSIOS + {0xB0CF, 0xAC85}, //8075 #HANGUL SYLLABLE KIYEOK EO IEUNG + {0xB0D0, 0xAC86}, //8076 #HANGUL SYLLABLE KIYEOK EO CIEUC + {0xB0D1, 0xAC89}, //8077 #HANGUL SYLLABLE KIYEOK EO THIEUTH + {0xB0D2, 0xAC8A}, //8078 #HANGUL SYLLABLE KIYEOK EO PHIEUPH + {0xB0D3, 0xAC8B}, //8079 #HANGUL SYLLABLE KIYEOK EO HIEUH + {0xB0D4, 0xAC8C}, //8080 #HANGUL SYLLABLE KIYEOK E + {0xB0D5, 0xAC90}, //8081 #HANGUL SYLLABLE KIYEOK E NIEUN + {0xB0D6, 0xAC94}, //8082 #HANGUL SYLLABLE KIYEOK E RIEUL + {0xB0D7, 0xAC9C}, //8083 #HANGUL SYLLABLE KIYEOK E MIEUM + {0xB0D8, 0xAC9D}, //8084 #HANGUL SYLLABLE KIYEOK E PIEUP + {0xB0D9, 0xAC9F}, //8085 #HANGUL SYLLABLE KIYEOK E SIOS + {0xB0DA, 0xACA0}, //8086 #HANGUL SYLLABLE KIYEOK E SSANGSIOS + {0xB0DB, 0xACA1}, //8087 #HANGUL SYLLABLE KIYEOK E IEUNG + {0xB0DC, 0xACA8}, //8088 #HANGUL SYLLABLE KIYEOK YEO + {0xB0DD, 0xACA9}, //8089 #HANGUL SYLLABLE KIYEOK YEO KIYEOK + {0xB0DE, 0xACAA}, //8090 #HANGUL SYLLABLE KIYEOK YEO SSANGKIYEOK + {0xB0DF, 0xACAC}, //8091 #HANGUL SYLLABLE KIYEOK YEO NIEUN + {0xB0E0, 0xACAF}, //8092 #HANGUL SYLLABLE KIYEOK YEO TIKEUT + {0xB0E1, 0xACB0}, //8093 #HANGUL SYLLABLE KIYEOK YEO RIEUL + {0xB0E2, 0xACB8}, //8094 #HANGUL SYLLABLE KIYEOK YEO MIEUM + {0xB0E3, 0xACB9}, //8095 #HANGUL SYLLABLE KIYEOK YEO PIEUP + {0xB0E4, 0xACBB}, //8096 #HANGUL SYLLABLE KIYEOK YEO SIOS + {0xB0E5, 0xACBC}, //8097 #HANGUL SYLLABLE KIYEOK YEO SSANGSIOS + {0xB0E6, 0xACBD}, //8098 #HANGUL SYLLABLE KIYEOK YEO IEUNG + {0xB0E7, 0xACC1}, //8099 #HANGUL SYLLABLE KIYEOK YEO THIEUTH + {0xB0E8, 0xACC4}, //8100 #HANGUL SYLLABLE KIYEOK YE + {0xB0E9, 0xACC8}, //8101 #HANGUL SYLLABLE KIYEOK YE NIEUN + {0xB0EA, 0xACCC}, //8102 #HANGUL SYLLABLE KIYEOK YE RIEUL + {0xB0EB, 0xACD5}, //8103 #HANGUL SYLLABLE KIYEOK YE PIEUP + {0xB0EC, 0xACD7}, //8104 #HANGUL SYLLABLE KIYEOK YE SIOS + {0xB0ED, 0xACE0}, //8105 #HANGUL SYLLABLE KIYEOK O + {0xB0EE, 0xACE1}, //8106 #HANGUL SYLLABLE KIYEOK O KIYEOK + {0xB0EF, 0xACE4}, //8107 #HANGUL SYLLABLE KIYEOK O NIEUN + {0xB0F0, 0xACE7}, //8108 #HANGUL SYLLABLE KIYEOK O TIKEUT + {0xB0F1, 0xACE8}, //8109 #HANGUL SYLLABLE KIYEOK O RIEUL + {0xB0F2, 0xACEA}, //8110 #HANGUL SYLLABLE KIYEOK O RIEULMIEUM + {0xB0F3, 0xACEC}, //8111 #HANGUL SYLLABLE KIYEOK O RIEULSIOS + {0xB0F4, 0xACEF}, //8112 #HANGUL SYLLABLE KIYEOK O RIEULHIEUH + {0xB0F5, 0xACF0}, //8113 #HANGUL SYLLABLE KIYEOK O MIEUM + {0xB0F6, 0xACF1}, //8114 #HANGUL SYLLABLE KIYEOK O PIEUP + {0xB0F7, 0xACF3}, //8115 #HANGUL SYLLABLE KIYEOK O SIOS + {0xB0F8, 0xACF5}, //8116 #HANGUL SYLLABLE KIYEOK O IEUNG + {0xB0F9, 0xACF6}, //8117 #HANGUL SYLLABLE KIYEOK O CIEUC + {0xB0FA, 0xACFC}, //8118 #HANGUL SYLLABLE KIYEOK WA + {0xB0FB, 0xACFD}, //8119 #HANGUL SYLLABLE KIYEOK WA KIYEOK + {0xB0FC, 0xAD00}, //8120 #HANGUL SYLLABLE KIYEOK WA NIEUN + {0xB0FD, 0xAD04}, //8121 #HANGUL SYLLABLE KIYEOK WA RIEUL + {0xB0FE, 0xAD06}, //8122 #HANGUL SYLLABLE KIYEOK WA RIEULMIEUM + {0xB141, 0xCF02}, //8123 #HANGUL SYLLABLE KHIEUKH E SSANGKIYEOK + {0xB142, 0xCF03}, //8124 #HANGUL SYLLABLE KHIEUKH E KIYEOKSIOS + {0xB143, 0xCF05}, //8125 #HANGUL SYLLABLE KHIEUKH E NIEUNCIEUC + {0xB144, 0xCF06}, //8126 #HANGUL SYLLABLE KHIEUKH E NIEUNHIEUH + {0xB145, 0xCF07}, //8127 #HANGUL SYLLABLE KHIEUKH E TIKEUT + {0xB146, 0xCF09}, //8128 #HANGUL SYLLABLE KHIEUKH E RIEULKIYEOK + {0xB147, 0xCF0A}, //8129 #HANGUL SYLLABLE KHIEUKH E RIEULMIEUM + {0xB148, 0xCF0B}, //8130 #HANGUL SYLLABLE KHIEUKH E RIEULPIEUP + {0xB149, 0xCF0C}, //8131 #HANGUL SYLLABLE KHIEUKH E RIEULSIOS + {0xB14A, 0xCF0D}, //8132 #HANGUL SYLLABLE KHIEUKH E RIEULTHIEUTH + {0xB14B, 0xCF0E}, //8133 #HANGUL SYLLABLE KHIEUKH E RIEULPHIEUPH + {0xB14C, 0xCF0F}, //8134 #HANGUL SYLLABLE KHIEUKH E RIEULHIEUH + {0xB14D, 0xCF12}, //8135 #HANGUL SYLLABLE KHIEUKH E PIEUPSIOS + {0xB14E, 0xCF14}, //8136 #HANGUL SYLLABLE KHIEUKH E SSANGSIOS + {0xB14F, 0xCF16}, //8137 #HANGUL SYLLABLE KHIEUKH E CIEUC + {0xB150, 0xCF17}, //8138 #HANGUL SYLLABLE KHIEUKH E CHIEUCH + {0xB151, 0xCF18}, //8139 #HANGUL SYLLABLE KHIEUKH E KHIEUKH + {0xB152, 0xCF19}, //8140 #HANGUL SYLLABLE KHIEUKH E THIEUTH + {0xB153, 0xCF1A}, //8141 #HANGUL SYLLABLE KHIEUKH E PHIEUPH + {0xB154, 0xCF1B}, //8142 #HANGUL SYLLABLE KHIEUKH E HIEUH + {0xB155, 0xCF1D}, //8143 #HANGUL SYLLABLE KHIEUKH YEO KIYEOK + {0xB156, 0xCF1E}, //8144 #HANGUL SYLLABLE KHIEUKH YEO SSANGKIYEOK + {0xB157, 0xCF1F}, //8145 #HANGUL SYLLABLE KHIEUKH YEO KIYEOKSIOS + {0xB158, 0xCF21}, //8146 #HANGUL SYLLABLE KHIEUKH YEO NIEUNCIEUC + {0xB159, 0xCF22}, //8147 #HANGUL SYLLABLE KHIEUKH YEO NIEUNHIEUH + {0xB15A, 0xCF23}, //8148 #HANGUL SYLLABLE KHIEUKH YEO TIKEUT + {0xB161, 0xCF25}, //8149 #HANGUL SYLLABLE KHIEUKH YEO RIEULKIYEOK + {0xB162, 0xCF26}, //8150 #HANGUL SYLLABLE KHIEUKH YEO RIEULMIEUM + {0xB163, 0xCF27}, //8151 #HANGUL SYLLABLE KHIEUKH YEO RIEULPIEUP + {0xB164, 0xCF28}, //8152 #HANGUL SYLLABLE KHIEUKH YEO RIEULSIOS + {0xB165, 0xCF29}, //8153 #HANGUL SYLLABLE KHIEUKH YEO RIEULTHIEUTH + {0xB166, 0xCF2A}, //8154 #HANGUL SYLLABLE KHIEUKH YEO RIEULPHIEUPH + {0xB167, 0xCF2B}, //8155 #HANGUL SYLLABLE KHIEUKH YEO RIEULHIEUH + {0xB168, 0xCF2E}, //8156 #HANGUL SYLLABLE KHIEUKH YEO PIEUPSIOS + {0xB169, 0xCF32}, //8157 #HANGUL SYLLABLE KHIEUKH YEO CIEUC + {0xB16A, 0xCF33}, //8158 #HANGUL SYLLABLE KHIEUKH YEO CHIEUCH + {0xB16B, 0xCF34}, //8159 #HANGUL SYLLABLE KHIEUKH YEO KHIEUKH + {0xB16C, 0xCF35}, //8160 #HANGUL SYLLABLE KHIEUKH YEO THIEUTH + {0xB16D, 0xCF36}, //8161 #HANGUL SYLLABLE KHIEUKH YEO PHIEUPH + {0xB16E, 0xCF37}, //8162 #HANGUL SYLLABLE KHIEUKH YEO HIEUH + {0xB16F, 0xCF39}, //8163 #HANGUL SYLLABLE KHIEUKH YE KIYEOK + {0xB170, 0xCF3A}, //8164 #HANGUL SYLLABLE KHIEUKH YE SSANGKIYEOK + {0xB171, 0xCF3B}, //8165 #HANGUL SYLLABLE KHIEUKH YE KIYEOKSIOS + {0xB172, 0xCF3C}, //8166 #HANGUL SYLLABLE KHIEUKH YE NIEUN + {0xB173, 0xCF3D}, //8167 #HANGUL SYLLABLE KHIEUKH YE NIEUNCIEUC + {0xB174, 0xCF3E}, //8168 #HANGUL SYLLABLE KHIEUKH YE NIEUNHIEUH + {0xB175, 0xCF3F}, //8169 #HANGUL SYLLABLE KHIEUKH YE TIKEUT + {0xB176, 0xCF40}, //8170 #HANGUL SYLLABLE KHIEUKH YE RIEUL + {0xB177, 0xCF41}, //8171 #HANGUL SYLLABLE KHIEUKH YE RIEULKIYEOK + {0xB178, 0xCF42}, //8172 #HANGUL SYLLABLE KHIEUKH YE RIEULMIEUM + {0xB179, 0xCF43}, //8173 #HANGUL SYLLABLE KHIEUKH YE RIEULPIEUP + {0xB17A, 0xCF44}, //8174 #HANGUL SYLLABLE KHIEUKH YE RIEULSIOS + {0xB181, 0xCF45}, //8175 #HANGUL SYLLABLE KHIEUKH YE RIEULTHIEUTH + {0xB182, 0xCF46}, //8176 #HANGUL SYLLABLE KHIEUKH YE RIEULPHIEUPH + {0xB183, 0xCF47}, //8177 #HANGUL SYLLABLE KHIEUKH YE RIEULHIEUH + {0xB184, 0xCF48}, //8178 #HANGUL SYLLABLE KHIEUKH YE MIEUM + {0xB185, 0xCF49}, //8179 #HANGUL SYLLABLE KHIEUKH YE PIEUP + {0xB186, 0xCF4A}, //8180 #HANGUL SYLLABLE KHIEUKH YE PIEUPSIOS + {0xB187, 0xCF4B}, //8181 #HANGUL SYLLABLE KHIEUKH YE SIOS + {0xB188, 0xCF4C}, //8182 #HANGUL SYLLABLE KHIEUKH YE SSANGSIOS + {0xB189, 0xCF4D}, //8183 #HANGUL SYLLABLE KHIEUKH YE IEUNG + {0xB18A, 0xCF4E}, //8184 #HANGUL SYLLABLE KHIEUKH YE CIEUC + {0xB18B, 0xCF4F}, //8185 #HANGUL SYLLABLE KHIEUKH YE CHIEUCH + {0xB18C, 0xCF50}, //8186 #HANGUL SYLLABLE KHIEUKH YE KHIEUKH + {0xB18D, 0xCF51}, //8187 #HANGUL SYLLABLE KHIEUKH YE THIEUTH + {0xB18E, 0xCF52}, //8188 #HANGUL SYLLABLE KHIEUKH YE PHIEUPH + {0xB18F, 0xCF53}, //8189 #HANGUL SYLLABLE KHIEUKH YE HIEUH + {0xB190, 0xCF56}, //8190 #HANGUL SYLLABLE KHIEUKH O SSANGKIYEOK + {0xB191, 0xCF57}, //8191 #HANGUL SYLLABLE KHIEUKH O KIYEOKSIOS + {0xB192, 0xCF59}, //8192 #HANGUL SYLLABLE KHIEUKH O NIEUNCIEUC + {0xB193, 0xCF5A}, //8193 #HANGUL SYLLABLE KHIEUKH O NIEUNHIEUH + {0xB194, 0xCF5B}, //8194 #HANGUL SYLLABLE KHIEUKH O TIKEUT + {0xB195, 0xCF5D}, //8195 #HANGUL SYLLABLE KHIEUKH O RIEULKIYEOK + {0xB196, 0xCF5E}, //8196 #HANGUL SYLLABLE KHIEUKH O RIEULMIEUM + {0xB197, 0xCF5F}, //8197 #HANGUL SYLLABLE KHIEUKH O RIEULPIEUP + {0xB198, 0xCF60}, //8198 #HANGUL SYLLABLE KHIEUKH O RIEULSIOS + {0xB199, 0xCF61}, //8199 #HANGUL SYLLABLE KHIEUKH O RIEULTHIEUTH + {0xB19A, 0xCF62}, //8200 #HANGUL SYLLABLE KHIEUKH O RIEULPHIEUPH + {0xB19B, 0xCF63}, //8201 #HANGUL SYLLABLE KHIEUKH O RIEULHIEUH + {0xB19C, 0xCF66}, //8202 #HANGUL SYLLABLE KHIEUKH O PIEUPSIOS + {0xB19D, 0xCF68}, //8203 #HANGUL SYLLABLE KHIEUKH O SSANGSIOS + {0xB19E, 0xCF6A}, //8204 #HANGUL SYLLABLE KHIEUKH O CIEUC + {0xB19F, 0xCF6B}, //8205 #HANGUL SYLLABLE KHIEUKH O CHIEUCH + {0xB1A0, 0xCF6C}, //8206 #HANGUL SYLLABLE KHIEUKH O KHIEUKH + {0xB1A1, 0xAD0C}, //8207 #HANGUL SYLLABLE KIYEOK WA MIEUM + {0xB1A2, 0xAD0D}, //8208 #HANGUL SYLLABLE KIYEOK WA PIEUP + {0xB1A3, 0xAD0F}, //8209 #HANGUL SYLLABLE KIYEOK WA SIOS + {0xB1A4, 0xAD11}, //8210 #HANGUL SYLLABLE KIYEOK WA IEUNG + {0xB1A5, 0xAD18}, //8211 #HANGUL SYLLABLE KIYEOK WAE + {0xB1A6, 0xAD1C}, //8212 #HANGUL SYLLABLE KIYEOK WAE NIEUN + {0xB1A7, 0xAD20}, //8213 #HANGUL SYLLABLE KIYEOK WAE RIEUL + {0xB1A8, 0xAD29}, //8214 #HANGUL SYLLABLE KIYEOK WAE PIEUP + {0xB1A9, 0xAD2C}, //8215 #HANGUL SYLLABLE KIYEOK WAE SSANGSIOS + {0xB1AA, 0xAD2D}, //8216 #HANGUL SYLLABLE KIYEOK WAE IEUNG + {0xB1AB, 0xAD34}, //8217 #HANGUL SYLLABLE KIYEOK OE + {0xB1AC, 0xAD35}, //8218 #HANGUL SYLLABLE KIYEOK OE KIYEOK + {0xB1AD, 0xAD38}, //8219 #HANGUL SYLLABLE KIYEOK OE NIEUN + {0xB1AE, 0xAD3C}, //8220 #HANGUL SYLLABLE KIYEOK OE RIEUL + {0xB1AF, 0xAD44}, //8221 #HANGUL SYLLABLE KIYEOK OE MIEUM + {0xB1B0, 0xAD45}, //8222 #HANGUL SYLLABLE KIYEOK OE PIEUP + {0xB1B1, 0xAD47}, //8223 #HANGUL SYLLABLE KIYEOK OE SIOS + {0xB1B2, 0xAD49}, //8224 #HANGUL SYLLABLE KIYEOK OE IEUNG + {0xB1B3, 0xAD50}, //8225 #HANGUL SYLLABLE KIYEOK YO + {0xB1B4, 0xAD54}, //8226 #HANGUL SYLLABLE KIYEOK YO NIEUN + {0xB1B5, 0xAD58}, //8227 #HANGUL SYLLABLE KIYEOK YO RIEUL + {0xB1B6, 0xAD61}, //8228 #HANGUL SYLLABLE KIYEOK YO PIEUP + {0xB1B7, 0xAD63}, //8229 #HANGUL SYLLABLE KIYEOK YO SIOS + {0xB1B8, 0xAD6C}, //8230 #HANGUL SYLLABLE KIYEOK U + {0xB1B9, 0xAD6D}, //8231 #HANGUL SYLLABLE KIYEOK U KIYEOK + {0xB1BA, 0xAD70}, //8232 #HANGUL SYLLABLE KIYEOK U NIEUN + {0xB1BB, 0xAD73}, //8233 #HANGUL SYLLABLE KIYEOK U TIKEUT + {0xB1BC, 0xAD74}, //8234 #HANGUL SYLLABLE KIYEOK U RIEUL + {0xB1BD, 0xAD75}, //8235 #HANGUL SYLLABLE KIYEOK U RIEULKIYEOK + {0xB1BE, 0xAD76}, //8236 #HANGUL SYLLABLE KIYEOK U RIEULMIEUM + {0xB1BF, 0xAD7B}, //8237 #HANGUL SYLLABLE KIYEOK U RIEULHIEUH + {0xB1C0, 0xAD7C}, //8238 #HANGUL SYLLABLE KIYEOK U MIEUM + {0xB1C1, 0xAD7D}, //8239 #HANGUL SYLLABLE KIYEOK U PIEUP + {0xB1C2, 0xAD7F}, //8240 #HANGUL SYLLABLE KIYEOK U SIOS + {0xB1C3, 0xAD81}, //8241 #HANGUL SYLLABLE KIYEOK U IEUNG + {0xB1C4, 0xAD82}, //8242 #HANGUL SYLLABLE KIYEOK U CIEUC + {0xB1C5, 0xAD88}, //8243 #HANGUL SYLLABLE KIYEOK WEO + {0xB1C6, 0xAD89}, //8244 #HANGUL SYLLABLE KIYEOK WEO KIYEOK + {0xB1C7, 0xAD8C}, //8245 #HANGUL SYLLABLE KIYEOK WEO NIEUN + {0xB1C8, 0xAD90}, //8246 #HANGUL SYLLABLE KIYEOK WEO RIEUL + {0xB1C9, 0xAD9C}, //8247 #HANGUL SYLLABLE KIYEOK WEO SSANGSIOS + {0xB1CA, 0xAD9D}, //8248 #HANGUL SYLLABLE KIYEOK WEO IEUNG + {0xB1CB, 0xADA4}, //8249 #HANGUL SYLLABLE KIYEOK WE + {0xB1CC, 0xADB7}, //8250 #HANGUL SYLLABLE KIYEOK WE SIOS + {0xB1CD, 0xADC0}, //8251 #HANGUL SYLLABLE KIYEOK WI + {0xB1CE, 0xADC1}, //8252 #HANGUL SYLLABLE KIYEOK WI KIYEOK + {0xB1CF, 0xADC4}, //8253 #HANGUL SYLLABLE KIYEOK WI NIEUN + {0xB1D0, 0xADC8}, //8254 #HANGUL SYLLABLE KIYEOK WI RIEUL + {0xB1D1, 0xADD0}, //8255 #HANGUL SYLLABLE KIYEOK WI MIEUM + {0xB1D2, 0xADD1}, //8256 #HANGUL SYLLABLE KIYEOK WI PIEUP + {0xB1D3, 0xADD3}, //8257 #HANGUL SYLLABLE KIYEOK WI SIOS + {0xB1D4, 0xADDC}, //8258 #HANGUL SYLLABLE KIYEOK YU + {0xB1D5, 0xADE0}, //8259 #HANGUL SYLLABLE KIYEOK YU NIEUN + {0xB1D6, 0xADE4}, //8260 #HANGUL SYLLABLE KIYEOK YU RIEUL + {0xB1D7, 0xADF8}, //8261 #HANGUL SYLLABLE KIYEOK EU + {0xB1D8, 0xADF9}, //8262 #HANGUL SYLLABLE KIYEOK EU KIYEOK + {0xB1D9, 0xADFC}, //8263 #HANGUL SYLLABLE KIYEOK EU NIEUN + {0xB1DA, 0xADFF}, //8264 #HANGUL SYLLABLE KIYEOK EU TIKEUT + {0xB1DB, 0xAE00}, //8265 #HANGUL SYLLABLE KIYEOK EU RIEUL + {0xB1DC, 0xAE01}, //8266 #HANGUL SYLLABLE KIYEOK EU RIEULKIYEOK + {0xB1DD, 0xAE08}, //8267 #HANGUL SYLLABLE KIYEOK EU MIEUM + {0xB1DE, 0xAE09}, //8268 #HANGUL SYLLABLE KIYEOK EU PIEUP + {0xB1DF, 0xAE0B}, //8269 #HANGUL SYLLABLE KIYEOK EU SIOS + {0xB1E0, 0xAE0D}, //8270 #HANGUL SYLLABLE KIYEOK EU IEUNG + {0xB1E1, 0xAE14}, //8271 #HANGUL SYLLABLE KIYEOK YI + {0xB1E2, 0xAE30}, //8272 #HANGUL SYLLABLE KIYEOK I + {0xB1E3, 0xAE31}, //8273 #HANGUL SYLLABLE KIYEOK I KIYEOK + {0xB1E4, 0xAE34}, //8274 #HANGUL SYLLABLE KIYEOK I NIEUN + {0xB1E5, 0xAE37}, //8275 #HANGUL SYLLABLE KIYEOK I TIKEUT + {0xB1E6, 0xAE38}, //8276 #HANGUL SYLLABLE KIYEOK I RIEUL + {0xB1E7, 0xAE3A}, //8277 #HANGUL SYLLABLE KIYEOK I RIEULMIEUM + {0xB1E8, 0xAE40}, //8278 #HANGUL SYLLABLE KIYEOK I MIEUM + {0xB1E9, 0xAE41}, //8279 #HANGUL SYLLABLE KIYEOK I PIEUP + {0xB1EA, 0xAE43}, //8280 #HANGUL SYLLABLE KIYEOK I SIOS + {0xB1EB, 0xAE45}, //8281 #HANGUL SYLLABLE KIYEOK I IEUNG + {0xB1EC, 0xAE46}, //8282 #HANGUL SYLLABLE KIYEOK I CIEUC + {0xB1ED, 0xAE4A}, //8283 #HANGUL SYLLABLE KIYEOK I PHIEUPH + {0xB1EE, 0xAE4C}, //8284 #HANGUL SYLLABLE SSANGKIYEOK A + {0xB1EF, 0xAE4D}, //8285 #HANGUL SYLLABLE SSANGKIYEOK A KIYEOK + {0xB1F0, 0xAE4E}, //8286 #HANGUL SYLLABLE SSANGKIYEOK A SSANGKIYEOK + {0xB1F1, 0xAE50}, //8287 #HANGUL SYLLABLE SSANGKIYEOK A NIEUN + {0xB1F2, 0xAE54}, //8288 #HANGUL SYLLABLE SSANGKIYEOK A RIEUL + {0xB1F3, 0xAE56}, //8289 #HANGUL SYLLABLE SSANGKIYEOK A RIEULMIEUM + {0xB1F4, 0xAE5C}, //8290 #HANGUL SYLLABLE SSANGKIYEOK A MIEUM + {0xB1F5, 0xAE5D}, //8291 #HANGUL SYLLABLE SSANGKIYEOK A PIEUP + {0xB1F6, 0xAE5F}, //8292 #HANGUL SYLLABLE SSANGKIYEOK A SIOS + {0xB1F7, 0xAE60}, //8293 #HANGUL SYLLABLE SSANGKIYEOK A SSANGSIOS + {0xB1F8, 0xAE61}, //8294 #HANGUL SYLLABLE SSANGKIYEOK A IEUNG + {0xB1F9, 0xAE65}, //8295 #HANGUL SYLLABLE SSANGKIYEOK A THIEUTH + {0xB1FA, 0xAE68}, //8296 #HANGUL SYLLABLE SSANGKIYEOK AE + {0xB1FB, 0xAE69}, //8297 #HANGUL SYLLABLE SSANGKIYEOK AE KIYEOK + {0xB1FC, 0xAE6C}, //8298 #HANGUL SYLLABLE SSANGKIYEOK AE NIEUN + {0xB1FD, 0xAE70}, //8299 #HANGUL SYLLABLE SSANGKIYEOK AE RIEUL + {0xB1FE, 0xAE78}, //8300 #HANGUL SYLLABLE SSANGKIYEOK AE MIEUM + {0xB241, 0xCF6D}, //8301 #HANGUL SYLLABLE KHIEUKH O THIEUTH + {0xB242, 0xCF6E}, //8302 #HANGUL SYLLABLE KHIEUKH O PHIEUPH + {0xB243, 0xCF6F}, //8303 #HANGUL SYLLABLE KHIEUKH O HIEUH + {0xB244, 0xCF72}, //8304 #HANGUL SYLLABLE KHIEUKH WA SSANGKIYEOK + {0xB245, 0xCF73}, //8305 #HANGUL SYLLABLE KHIEUKH WA KIYEOKSIOS + {0xB246, 0xCF75}, //8306 #HANGUL SYLLABLE KHIEUKH WA NIEUNCIEUC + {0xB247, 0xCF76}, //8307 #HANGUL SYLLABLE KHIEUKH WA NIEUNHIEUH + {0xB248, 0xCF77}, //8308 #HANGUL SYLLABLE KHIEUKH WA TIKEUT + {0xB249, 0xCF79}, //8309 #HANGUL SYLLABLE KHIEUKH WA RIEULKIYEOK + {0xB24A, 0xCF7A}, //8310 #HANGUL SYLLABLE KHIEUKH WA RIEULMIEUM + {0xB24B, 0xCF7B}, //8311 #HANGUL SYLLABLE KHIEUKH WA RIEULPIEUP + {0xB24C, 0xCF7C}, //8312 #HANGUL SYLLABLE KHIEUKH WA RIEULSIOS + {0xB24D, 0xCF7D}, //8313 #HANGUL SYLLABLE KHIEUKH WA RIEULTHIEUTH + {0xB24E, 0xCF7E}, //8314 #HANGUL SYLLABLE KHIEUKH WA RIEULPHIEUPH + {0xB24F, 0xCF7F}, //8315 #HANGUL SYLLABLE KHIEUKH WA RIEULHIEUH + {0xB250, 0xCF81}, //8316 #HANGUL SYLLABLE KHIEUKH WA PIEUP + {0xB251, 0xCF82}, //8317 #HANGUL SYLLABLE KHIEUKH WA PIEUPSIOS + {0xB252, 0xCF83}, //8318 #HANGUL SYLLABLE KHIEUKH WA SIOS + {0xB253, 0xCF84}, //8319 #HANGUL SYLLABLE KHIEUKH WA SSANGSIOS + {0xB254, 0xCF86}, //8320 #HANGUL SYLLABLE KHIEUKH WA CIEUC + {0xB255, 0xCF87}, //8321 #HANGUL SYLLABLE KHIEUKH WA CHIEUCH + {0xB256, 0xCF88}, //8322 #HANGUL SYLLABLE KHIEUKH WA KHIEUKH + {0xB257, 0xCF89}, //8323 #HANGUL SYLLABLE KHIEUKH WA THIEUTH + {0xB258, 0xCF8A}, //8324 #HANGUL SYLLABLE KHIEUKH WA PHIEUPH + {0xB259, 0xCF8B}, //8325 #HANGUL SYLLABLE KHIEUKH WA HIEUH + {0xB25A, 0xCF8D}, //8326 #HANGUL SYLLABLE KHIEUKH WAE KIYEOK + {0xB261, 0xCF8E}, //8327 #HANGUL SYLLABLE KHIEUKH WAE SSANGKIYEOK + {0xB262, 0xCF8F}, //8328 #HANGUL SYLLABLE KHIEUKH WAE KIYEOKSIOS + {0xB263, 0xCF90}, //8329 #HANGUL SYLLABLE KHIEUKH WAE NIEUN + {0xB264, 0xCF91}, //8330 #HANGUL SYLLABLE KHIEUKH WAE NIEUNCIEUC + {0xB265, 0xCF92}, //8331 #HANGUL SYLLABLE KHIEUKH WAE NIEUNHIEUH + {0xB266, 0xCF93}, //8332 #HANGUL SYLLABLE KHIEUKH WAE TIKEUT + {0xB267, 0xCF94}, //8333 #HANGUL SYLLABLE KHIEUKH WAE RIEUL + {0xB268, 0xCF95}, //8334 #HANGUL SYLLABLE KHIEUKH WAE RIEULKIYEOK + {0xB269, 0xCF96}, //8335 #HANGUL SYLLABLE KHIEUKH WAE RIEULMIEUM + {0xB26A, 0xCF97}, //8336 #HANGUL SYLLABLE KHIEUKH WAE RIEULPIEUP + {0xB26B, 0xCF98}, //8337 #HANGUL SYLLABLE KHIEUKH WAE RIEULSIOS + {0xB26C, 0xCF99}, //8338 #HANGUL SYLLABLE KHIEUKH WAE RIEULTHIEUTH + {0xB26D, 0xCF9A}, //8339 #HANGUL SYLLABLE KHIEUKH WAE RIEULPHIEUPH + {0xB26E, 0xCF9B}, //8340 #HANGUL SYLLABLE KHIEUKH WAE RIEULHIEUH + {0xB26F, 0xCF9C}, //8341 #HANGUL SYLLABLE KHIEUKH WAE MIEUM + {0xB270, 0xCF9D}, //8342 #HANGUL SYLLABLE KHIEUKH WAE PIEUP + {0xB271, 0xCF9E}, //8343 #HANGUL SYLLABLE KHIEUKH WAE PIEUPSIOS + {0xB272, 0xCF9F}, //8344 #HANGUL SYLLABLE KHIEUKH WAE SIOS + {0xB273, 0xCFA0}, //8345 #HANGUL SYLLABLE KHIEUKH WAE SSANGSIOS + {0xB274, 0xCFA2}, //8346 #HANGUL SYLLABLE KHIEUKH WAE CIEUC + {0xB275, 0xCFA3}, //8347 #HANGUL SYLLABLE KHIEUKH WAE CHIEUCH + {0xB276, 0xCFA4}, //8348 #HANGUL SYLLABLE KHIEUKH WAE KHIEUKH + {0xB277, 0xCFA5}, //8349 #HANGUL SYLLABLE KHIEUKH WAE THIEUTH + {0xB278, 0xCFA6}, //8350 #HANGUL SYLLABLE KHIEUKH WAE PHIEUPH + {0xB279, 0xCFA7}, //8351 #HANGUL SYLLABLE KHIEUKH WAE HIEUH + {0xB27A, 0xCFA9}, //8352 #HANGUL SYLLABLE KHIEUKH OE KIYEOK + {0xB281, 0xCFAA}, //8353 #HANGUL SYLLABLE KHIEUKH OE SSANGKIYEOK + {0xB282, 0xCFAB}, //8354 #HANGUL SYLLABLE KHIEUKH OE KIYEOKSIOS + {0xB283, 0xCFAC}, //8355 #HANGUL SYLLABLE KHIEUKH OE NIEUN + {0xB284, 0xCFAD}, //8356 #HANGUL SYLLABLE KHIEUKH OE NIEUNCIEUC + {0xB285, 0xCFAE}, //8357 #HANGUL SYLLABLE KHIEUKH OE NIEUNHIEUH + {0xB286, 0xCFAF}, //8358 #HANGUL SYLLABLE KHIEUKH OE TIKEUT + {0xB287, 0xCFB1}, //8359 #HANGUL SYLLABLE KHIEUKH OE RIEULKIYEOK + {0xB288, 0xCFB2}, //8360 #HANGUL SYLLABLE KHIEUKH OE RIEULMIEUM + {0xB289, 0xCFB3}, //8361 #HANGUL SYLLABLE KHIEUKH OE RIEULPIEUP + {0xB28A, 0xCFB4}, //8362 #HANGUL SYLLABLE KHIEUKH OE RIEULSIOS + {0xB28B, 0xCFB5}, //8363 #HANGUL SYLLABLE KHIEUKH OE RIEULTHIEUTH + {0xB28C, 0xCFB6}, //8364 #HANGUL SYLLABLE KHIEUKH OE RIEULPHIEUPH + {0xB28D, 0xCFB7}, //8365 #HANGUL SYLLABLE KHIEUKH OE RIEULHIEUH + {0xB28E, 0xCFB8}, //8366 #HANGUL SYLLABLE KHIEUKH OE MIEUM + {0xB28F, 0xCFB9}, //8367 #HANGUL SYLLABLE KHIEUKH OE PIEUP + {0xB290, 0xCFBA}, //8368 #HANGUL SYLLABLE KHIEUKH OE PIEUPSIOS + {0xB291, 0xCFBB}, //8369 #HANGUL SYLLABLE KHIEUKH OE SIOS + {0xB292, 0xCFBC}, //8370 #HANGUL SYLLABLE KHIEUKH OE SSANGSIOS + {0xB293, 0xCFBD}, //8371 #HANGUL SYLLABLE KHIEUKH OE IEUNG + {0xB294, 0xCFBE}, //8372 #HANGUL SYLLABLE KHIEUKH OE CIEUC + {0xB295, 0xCFBF}, //8373 #HANGUL SYLLABLE KHIEUKH OE CHIEUCH + {0xB296, 0xCFC0}, //8374 #HANGUL SYLLABLE KHIEUKH OE KHIEUKH + {0xB297, 0xCFC1}, //8375 #HANGUL SYLLABLE KHIEUKH OE THIEUTH + {0xB298, 0xCFC2}, //8376 #HANGUL SYLLABLE KHIEUKH OE PHIEUPH + {0xB299, 0xCFC3}, //8377 #HANGUL SYLLABLE KHIEUKH OE HIEUH + {0xB29A, 0xCFC5}, //8378 #HANGUL SYLLABLE KHIEUKH YO KIYEOK + {0xB29B, 0xCFC6}, //8379 #HANGUL SYLLABLE KHIEUKH YO SSANGKIYEOK + {0xB29C, 0xCFC7}, //8380 #HANGUL SYLLABLE KHIEUKH YO KIYEOKSIOS + {0xB29D, 0xCFC8}, //8381 #HANGUL SYLLABLE KHIEUKH YO NIEUN + {0xB29E, 0xCFC9}, //8382 #HANGUL SYLLABLE KHIEUKH YO NIEUNCIEUC + {0xB29F, 0xCFCA}, //8383 #HANGUL SYLLABLE KHIEUKH YO NIEUNHIEUH + {0xB2A0, 0xCFCB}, //8384 #HANGUL SYLLABLE KHIEUKH YO TIKEUT + {0xB2A1, 0xAE79}, //8385 #HANGUL SYLLABLE SSANGKIYEOK AE PIEUP + {0xB2A2, 0xAE7B}, //8386 #HANGUL SYLLABLE SSANGKIYEOK AE SIOS + {0xB2A3, 0xAE7C}, //8387 #HANGUL SYLLABLE SSANGKIYEOK AE SSANGSIOS + {0xB2A4, 0xAE7D}, //8388 #HANGUL SYLLABLE SSANGKIYEOK AE IEUNG + {0xB2A5, 0xAE84}, //8389 #HANGUL SYLLABLE SSANGKIYEOK YA + {0xB2A6, 0xAE85}, //8390 #HANGUL SYLLABLE SSANGKIYEOK YA KIYEOK + {0xB2A7, 0xAE8C}, //8391 #HANGUL SYLLABLE SSANGKIYEOK YA RIEUL + {0xB2A8, 0xAEBC}, //8392 #HANGUL SYLLABLE SSANGKIYEOK EO + {0xB2A9, 0xAEBD}, //8393 #HANGUL SYLLABLE SSANGKIYEOK EO KIYEOK + {0xB2AA, 0xAEBE}, //8394 #HANGUL SYLLABLE SSANGKIYEOK EO SSANGKIYEOK + {0xB2AB, 0xAEC0}, //8395 #HANGUL SYLLABLE SSANGKIYEOK EO NIEUN + {0xB2AC, 0xAEC4}, //8396 #HANGUL SYLLABLE SSANGKIYEOK EO RIEUL + {0xB2AD, 0xAECC}, //8397 #HANGUL SYLLABLE SSANGKIYEOK EO MIEUM + {0xB2AE, 0xAECD}, //8398 #HANGUL SYLLABLE SSANGKIYEOK EO PIEUP + {0xB2AF, 0xAECF}, //8399 #HANGUL SYLLABLE SSANGKIYEOK EO SIOS + {0xB2B0, 0xAED0}, //8400 #HANGUL SYLLABLE SSANGKIYEOK EO SSANGSIOS + {0xB2B1, 0xAED1}, //8401 #HANGUL SYLLABLE SSANGKIYEOK EO IEUNG + {0xB2B2, 0xAED8}, //8402 #HANGUL SYLLABLE SSANGKIYEOK E + {0xB2B3, 0xAED9}, //8403 #HANGUL SYLLABLE SSANGKIYEOK E KIYEOK + {0xB2B4, 0xAEDC}, //8404 #HANGUL SYLLABLE SSANGKIYEOK E NIEUN + {0xB2B5, 0xAEE8}, //8405 #HANGUL SYLLABLE SSANGKIYEOK E MIEUM + {0xB2B6, 0xAEEB}, //8406 #HANGUL SYLLABLE SSANGKIYEOK E SIOS + {0xB2B7, 0xAEED}, //8407 #HANGUL SYLLABLE SSANGKIYEOK E IEUNG + {0xB2B8, 0xAEF4}, //8408 #HANGUL SYLLABLE SSANGKIYEOK YEO + {0xB2B9, 0xAEF8}, //8409 #HANGUL SYLLABLE SSANGKIYEOK YEO NIEUN + {0xB2BA, 0xAEFC}, //8410 #HANGUL SYLLABLE SSANGKIYEOK YEO RIEUL + {0xB2BB, 0xAF07}, //8411 #HANGUL SYLLABLE SSANGKIYEOK YEO SIOS + {0xB2BC, 0xAF08}, //8412 #HANGUL SYLLABLE SSANGKIYEOK YEO SSANGSIOS + {0xB2BD, 0xAF0D}, //8413 #HANGUL SYLLABLE SSANGKIYEOK YEO THIEUTH + {0xB2BE, 0xAF10}, //8414 #HANGUL SYLLABLE SSANGKIYEOK YE + {0xB2BF, 0xAF2C}, //8415 #HANGUL SYLLABLE SSANGKIYEOK O + {0xB2C0, 0xAF2D}, //8416 #HANGUL SYLLABLE SSANGKIYEOK O KIYEOK + {0xB2C1, 0xAF30}, //8417 #HANGUL SYLLABLE SSANGKIYEOK O NIEUN + {0xB2C2, 0xAF32}, //8418 #HANGUL SYLLABLE SSANGKIYEOK O NIEUNHIEUH + {0xB2C3, 0xAF34}, //8419 #HANGUL SYLLABLE SSANGKIYEOK O RIEUL + {0xB2C4, 0xAF3C}, //8420 #HANGUL SYLLABLE SSANGKIYEOK O MIEUM + {0xB2C5, 0xAF3D}, //8421 #HANGUL SYLLABLE SSANGKIYEOK O PIEUP + {0xB2C6, 0xAF3F}, //8422 #HANGUL SYLLABLE SSANGKIYEOK O SIOS + {0xB2C7, 0xAF41}, //8423 #HANGUL SYLLABLE SSANGKIYEOK O IEUNG + {0xB2C8, 0xAF42}, //8424 #HANGUL SYLLABLE SSANGKIYEOK O CIEUC + {0xB2C9, 0xAF43}, //8425 #HANGUL SYLLABLE SSANGKIYEOK O CHIEUCH + {0xB2CA, 0xAF48}, //8426 #HANGUL SYLLABLE SSANGKIYEOK WA + {0xB2CB, 0xAF49}, //8427 #HANGUL SYLLABLE SSANGKIYEOK WA KIYEOK + {0xB2CC, 0xAF50}, //8428 #HANGUL SYLLABLE SSANGKIYEOK WA RIEUL + {0xB2CD, 0xAF5C}, //8429 #HANGUL SYLLABLE SSANGKIYEOK WA SSANGSIOS + {0xB2CE, 0xAF5D}, //8430 #HANGUL SYLLABLE SSANGKIYEOK WA IEUNG + {0xB2CF, 0xAF64}, //8431 #HANGUL SYLLABLE SSANGKIYEOK WAE + {0xB2D0, 0xAF65}, //8432 #HANGUL SYLLABLE SSANGKIYEOK WAE KIYEOK + {0xB2D1, 0xAF79}, //8433 #HANGUL SYLLABLE SSANGKIYEOK WAE IEUNG + {0xB2D2, 0xAF80}, //8434 #HANGUL SYLLABLE SSANGKIYEOK OE + {0xB2D3, 0xAF84}, //8435 #HANGUL SYLLABLE SSANGKIYEOK OE NIEUN + {0xB2D4, 0xAF88}, //8436 #HANGUL SYLLABLE SSANGKIYEOK OE RIEUL + {0xB2D5, 0xAF90}, //8437 #HANGUL SYLLABLE SSANGKIYEOK OE MIEUM + {0xB2D6, 0xAF91}, //8438 #HANGUL SYLLABLE SSANGKIYEOK OE PIEUP + {0xB2D7, 0xAF95}, //8439 #HANGUL SYLLABLE SSANGKIYEOK OE IEUNG + {0xB2D8, 0xAF9C}, //8440 #HANGUL SYLLABLE SSANGKIYEOK YO + {0xB2D9, 0xAFB8}, //8441 #HANGUL SYLLABLE SSANGKIYEOK U + {0xB2DA, 0xAFB9}, //8442 #HANGUL SYLLABLE SSANGKIYEOK U KIYEOK + {0xB2DB, 0xAFBC}, //8443 #HANGUL SYLLABLE SSANGKIYEOK U NIEUN + {0xB2DC, 0xAFC0}, //8444 #HANGUL SYLLABLE SSANGKIYEOK U RIEUL + {0xB2DD, 0xAFC7}, //8445 #HANGUL SYLLABLE SSANGKIYEOK U RIEULHIEUH + {0xB2DE, 0xAFC8}, //8446 #HANGUL SYLLABLE SSANGKIYEOK U MIEUM + {0xB2DF, 0xAFC9}, //8447 #HANGUL SYLLABLE SSANGKIYEOK U PIEUP + {0xB2E0, 0xAFCB}, //8448 #HANGUL SYLLABLE SSANGKIYEOK U SIOS + {0xB2E1, 0xAFCD}, //8449 #HANGUL SYLLABLE SSANGKIYEOK U IEUNG + {0xB2E2, 0xAFCE}, //8450 #HANGUL SYLLABLE SSANGKIYEOK U CIEUC + {0xB2E3, 0xAFD4}, //8451 #HANGUL SYLLABLE SSANGKIYEOK WEO + {0xB2E4, 0xAFDC}, //8452 #HANGUL SYLLABLE SSANGKIYEOK WEO RIEUL + {0xB2E5, 0xAFE8}, //8453 #HANGUL SYLLABLE SSANGKIYEOK WEO SSANGSIOS + {0xB2E6, 0xAFE9}, //8454 #HANGUL SYLLABLE SSANGKIYEOK WEO IEUNG + {0xB2E7, 0xAFF0}, //8455 #HANGUL SYLLABLE SSANGKIYEOK WE + {0xB2E8, 0xAFF1}, //8456 #HANGUL SYLLABLE SSANGKIYEOK WE KIYEOK + {0xB2E9, 0xAFF4}, //8457 #HANGUL SYLLABLE SSANGKIYEOK WE NIEUN + {0xB2EA, 0xAFF8}, //8458 #HANGUL SYLLABLE SSANGKIYEOK WE RIEUL + {0xB2EB, 0xB000}, //8459 #HANGUL SYLLABLE SSANGKIYEOK WE MIEUM + {0xB2EC, 0xB001}, //8460 #HANGUL SYLLABLE SSANGKIYEOK WE PIEUP + {0xB2ED, 0xB004}, //8461 #HANGUL SYLLABLE SSANGKIYEOK WE SSANGSIOS + {0xB2EE, 0xB00C}, //8462 #HANGUL SYLLABLE SSANGKIYEOK WI + {0xB2EF, 0xB010}, //8463 #HANGUL SYLLABLE SSANGKIYEOK WI NIEUN + {0xB2F0, 0xB014}, //8464 #HANGUL SYLLABLE SSANGKIYEOK WI RIEUL + {0xB2F1, 0xB01C}, //8465 #HANGUL SYLLABLE SSANGKIYEOK WI MIEUM + {0xB2F2, 0xB01D}, //8466 #HANGUL SYLLABLE SSANGKIYEOK WI PIEUP + {0xB2F3, 0xB028}, //8467 #HANGUL SYLLABLE SSANGKIYEOK YU + {0xB2F4, 0xB044}, //8468 #HANGUL SYLLABLE SSANGKIYEOK EU + {0xB2F5, 0xB045}, //8469 #HANGUL SYLLABLE SSANGKIYEOK EU KIYEOK + {0xB2F6, 0xB048}, //8470 #HANGUL SYLLABLE SSANGKIYEOK EU NIEUN + {0xB2F7, 0xB04A}, //8471 #HANGUL SYLLABLE SSANGKIYEOK EU NIEUNHIEUH + {0xB2F8, 0xB04C}, //8472 #HANGUL SYLLABLE SSANGKIYEOK EU RIEUL + {0xB2F9, 0xB04E}, //8473 #HANGUL SYLLABLE SSANGKIYEOK EU RIEULMIEUM + {0xB2FA, 0xB053}, //8474 #HANGUL SYLLABLE SSANGKIYEOK EU RIEULHIEUH + {0xB2FB, 0xB054}, //8475 #HANGUL SYLLABLE SSANGKIYEOK EU MIEUM + {0xB2FC, 0xB055}, //8476 #HANGUL SYLLABLE SSANGKIYEOK EU PIEUP + {0xB2FD, 0xB057}, //8477 #HANGUL SYLLABLE SSANGKIYEOK EU SIOS + {0xB2FE, 0xB059}, //8478 #HANGUL SYLLABLE SSANGKIYEOK EU IEUNG + {0xB341, 0xCFCC}, //8479 #HANGUL SYLLABLE KHIEUKH YO RIEUL + {0xB342, 0xCFCD}, //8480 #HANGUL SYLLABLE KHIEUKH YO RIEULKIYEOK + {0xB343, 0xCFCE}, //8481 #HANGUL SYLLABLE KHIEUKH YO RIEULMIEUM + {0xB344, 0xCFCF}, //8482 #HANGUL SYLLABLE KHIEUKH YO RIEULPIEUP + {0xB345, 0xCFD0}, //8483 #HANGUL SYLLABLE KHIEUKH YO RIEULSIOS + {0xB346, 0xCFD1}, //8484 #HANGUL SYLLABLE KHIEUKH YO RIEULTHIEUTH + {0xB347, 0xCFD2}, //8485 #HANGUL SYLLABLE KHIEUKH YO RIEULPHIEUPH + {0xB348, 0xCFD3}, //8486 #HANGUL SYLLABLE KHIEUKH YO RIEULHIEUH + {0xB349, 0xCFD4}, //8487 #HANGUL SYLLABLE KHIEUKH YO MIEUM + {0xB34A, 0xCFD5}, //8488 #HANGUL SYLLABLE KHIEUKH YO PIEUP + {0xB34B, 0xCFD6}, //8489 #HANGUL SYLLABLE KHIEUKH YO PIEUPSIOS + {0xB34C, 0xCFD7}, //8490 #HANGUL SYLLABLE KHIEUKH YO SIOS + {0xB34D, 0xCFD8}, //8491 #HANGUL SYLLABLE KHIEUKH YO SSANGSIOS + {0xB34E, 0xCFD9}, //8492 #HANGUL SYLLABLE KHIEUKH YO IEUNG + {0xB34F, 0xCFDA}, //8493 #HANGUL SYLLABLE KHIEUKH YO CIEUC + {0xB350, 0xCFDB}, //8494 #HANGUL SYLLABLE KHIEUKH YO CHIEUCH + {0xB351, 0xCFDC}, //8495 #HANGUL SYLLABLE KHIEUKH YO KHIEUKH + {0xB352, 0xCFDD}, //8496 #HANGUL SYLLABLE KHIEUKH YO THIEUTH + {0xB353, 0xCFDE}, //8497 #HANGUL SYLLABLE KHIEUKH YO PHIEUPH + {0xB354, 0xCFDF}, //8498 #HANGUL SYLLABLE KHIEUKH YO HIEUH + {0xB355, 0xCFE2}, //8499 #HANGUL SYLLABLE KHIEUKH U SSANGKIYEOK + {0xB356, 0xCFE3}, //8500 #HANGUL SYLLABLE KHIEUKH U KIYEOKSIOS + {0xB357, 0xCFE5}, //8501 #HANGUL SYLLABLE KHIEUKH U NIEUNCIEUC + {0xB358, 0xCFE6}, //8502 #HANGUL SYLLABLE KHIEUKH U NIEUNHIEUH + {0xB359, 0xCFE7}, //8503 #HANGUL SYLLABLE KHIEUKH U TIKEUT + {0xB35A, 0xCFE9}, //8504 #HANGUL SYLLABLE KHIEUKH U RIEULKIYEOK + {0xB361, 0xCFEA}, //8505 #HANGUL SYLLABLE KHIEUKH U RIEULMIEUM + {0xB362, 0xCFEB}, //8506 #HANGUL SYLLABLE KHIEUKH U RIEULPIEUP + {0xB363, 0xCFEC}, //8507 #HANGUL SYLLABLE KHIEUKH U RIEULSIOS + {0xB364, 0xCFED}, //8508 #HANGUL SYLLABLE KHIEUKH U RIEULTHIEUTH + {0xB365, 0xCFEE}, //8509 #HANGUL SYLLABLE KHIEUKH U RIEULPHIEUPH + {0xB366, 0xCFEF}, //8510 #HANGUL SYLLABLE KHIEUKH U RIEULHIEUH + {0xB367, 0xCFF2}, //8511 #HANGUL SYLLABLE KHIEUKH U PIEUPSIOS + {0xB368, 0xCFF4}, //8512 #HANGUL SYLLABLE KHIEUKH U SSANGSIOS + {0xB369, 0xCFF6}, //8513 #HANGUL SYLLABLE KHIEUKH U CIEUC + {0xB36A, 0xCFF7}, //8514 #HANGUL SYLLABLE KHIEUKH U CHIEUCH + {0xB36B, 0xCFF8}, //8515 #HANGUL SYLLABLE KHIEUKH U KHIEUKH + {0xB36C, 0xCFF9}, //8516 #HANGUL SYLLABLE KHIEUKH U THIEUTH + {0xB36D, 0xCFFA}, //8517 #HANGUL SYLLABLE KHIEUKH U PHIEUPH + {0xB36E, 0xCFFB}, //8518 #HANGUL SYLLABLE KHIEUKH U HIEUH + {0xB36F, 0xCFFD}, //8519 #HANGUL SYLLABLE KHIEUKH WEO KIYEOK + {0xB370, 0xCFFE}, //8520 #HANGUL SYLLABLE KHIEUKH WEO SSANGKIYEOK + {0xB371, 0xCFFF}, //8521 #HANGUL SYLLABLE KHIEUKH WEO KIYEOKSIOS + {0xB372, 0xD001}, //8522 #HANGUL SYLLABLE KHIEUKH WEO NIEUNCIEUC + {0xB373, 0xD002}, //8523 #HANGUL SYLLABLE KHIEUKH WEO NIEUNHIEUH + {0xB374, 0xD003}, //8524 #HANGUL SYLLABLE KHIEUKH WEO TIKEUT + {0xB375, 0xD005}, //8525 #HANGUL SYLLABLE KHIEUKH WEO RIEULKIYEOK + {0xB376, 0xD006}, //8526 #HANGUL SYLLABLE KHIEUKH WEO RIEULMIEUM + {0xB377, 0xD007}, //8527 #HANGUL SYLLABLE KHIEUKH WEO RIEULPIEUP + {0xB378, 0xD008}, //8528 #HANGUL SYLLABLE KHIEUKH WEO RIEULSIOS + {0xB379, 0xD009}, //8529 #HANGUL SYLLABLE KHIEUKH WEO RIEULTHIEUTH + {0xB37A, 0xD00A}, //8530 #HANGUL SYLLABLE KHIEUKH WEO RIEULPHIEUPH + {0xB381, 0xD00B}, //8531 #HANGUL SYLLABLE KHIEUKH WEO RIEULHIEUH + {0xB382, 0xD00C}, //8532 #HANGUL SYLLABLE KHIEUKH WEO MIEUM + {0xB383, 0xD00D}, //8533 #HANGUL SYLLABLE KHIEUKH WEO PIEUP + {0xB384, 0xD00E}, //8534 #HANGUL SYLLABLE KHIEUKH WEO PIEUPSIOS + {0xB385, 0xD00F}, //8535 #HANGUL SYLLABLE KHIEUKH WEO SIOS + {0xB386, 0xD010}, //8536 #HANGUL SYLLABLE KHIEUKH WEO SSANGSIOS + {0xB387, 0xD012}, //8537 #HANGUL SYLLABLE KHIEUKH WEO CIEUC + {0xB388, 0xD013}, //8538 #HANGUL SYLLABLE KHIEUKH WEO CHIEUCH + {0xB389, 0xD014}, //8539 #HANGUL SYLLABLE KHIEUKH WEO KHIEUKH + {0xB38A, 0xD015}, //8540 #HANGUL SYLLABLE KHIEUKH WEO THIEUTH + {0xB38B, 0xD016}, //8541 #HANGUL SYLLABLE KHIEUKH WEO PHIEUPH + {0xB38C, 0xD017}, //8542 #HANGUL SYLLABLE KHIEUKH WEO HIEUH + {0xB38D, 0xD019}, //8543 #HANGUL SYLLABLE KHIEUKH WE KIYEOK + {0xB38E, 0xD01A}, //8544 #HANGUL SYLLABLE KHIEUKH WE SSANGKIYEOK + {0xB38F, 0xD01B}, //8545 #HANGUL SYLLABLE KHIEUKH WE KIYEOKSIOS + {0xB390, 0xD01C}, //8546 #HANGUL SYLLABLE KHIEUKH WE NIEUN + {0xB391, 0xD01D}, //8547 #HANGUL SYLLABLE KHIEUKH WE NIEUNCIEUC + {0xB392, 0xD01E}, //8548 #HANGUL SYLLABLE KHIEUKH WE NIEUNHIEUH + {0xB393, 0xD01F}, //8549 #HANGUL SYLLABLE KHIEUKH WE TIKEUT + {0xB394, 0xD020}, //8550 #HANGUL SYLLABLE KHIEUKH WE RIEUL + {0xB395, 0xD021}, //8551 #HANGUL SYLLABLE KHIEUKH WE RIEULKIYEOK + {0xB396, 0xD022}, //8552 #HANGUL SYLLABLE KHIEUKH WE RIEULMIEUM + {0xB397, 0xD023}, //8553 #HANGUL SYLLABLE KHIEUKH WE RIEULPIEUP + {0xB398, 0xD024}, //8554 #HANGUL SYLLABLE KHIEUKH WE RIEULSIOS + {0xB399, 0xD025}, //8555 #HANGUL SYLLABLE KHIEUKH WE RIEULTHIEUTH + {0xB39A, 0xD026}, //8556 #HANGUL SYLLABLE KHIEUKH WE RIEULPHIEUPH + {0xB39B, 0xD027}, //8557 #HANGUL SYLLABLE KHIEUKH WE RIEULHIEUH + {0xB39C, 0xD028}, //8558 #HANGUL SYLLABLE KHIEUKH WE MIEUM + {0xB39D, 0xD029}, //8559 #HANGUL SYLLABLE KHIEUKH WE PIEUP + {0xB39E, 0xD02A}, //8560 #HANGUL SYLLABLE KHIEUKH WE PIEUPSIOS + {0xB39F, 0xD02B}, //8561 #HANGUL SYLLABLE KHIEUKH WE SIOS + {0xB3A0, 0xD02C}, //8562 #HANGUL SYLLABLE KHIEUKH WE SSANGSIOS + {0xB3A1, 0xB05D}, //8563 #HANGUL SYLLABLE SSANGKIYEOK EU THIEUTH + {0xB3A2, 0xB07C}, //8564 #HANGUL SYLLABLE SSANGKIYEOK I + {0xB3A3, 0xB07D}, //8565 #HANGUL SYLLABLE SSANGKIYEOK I KIYEOK + {0xB3A4, 0xB080}, //8566 #HANGUL SYLLABLE SSANGKIYEOK I NIEUN + {0xB3A5, 0xB084}, //8567 #HANGUL SYLLABLE SSANGKIYEOK I RIEUL + {0xB3A6, 0xB08C}, //8568 #HANGUL SYLLABLE SSANGKIYEOK I MIEUM + {0xB3A7, 0xB08D}, //8569 #HANGUL SYLLABLE SSANGKIYEOK I PIEUP + {0xB3A8, 0xB08F}, //8570 #HANGUL SYLLABLE SSANGKIYEOK I SIOS + {0xB3A9, 0xB091}, //8571 #HANGUL SYLLABLE SSANGKIYEOK I IEUNG + {0xB3AA, 0xB098}, //8572 #HANGUL SYLLABLE NIEUN A + {0xB3AB, 0xB099}, //8573 #HANGUL SYLLABLE NIEUN A KIYEOK + {0xB3AC, 0xB09A}, //8574 #HANGUL SYLLABLE NIEUN A SSANGKIYEOK + {0xB3AD, 0xB09C}, //8575 #HANGUL SYLLABLE NIEUN A NIEUN + {0xB3AE, 0xB09F}, //8576 #HANGUL SYLLABLE NIEUN A TIKEUT + {0xB3AF, 0xB0A0}, //8577 #HANGUL SYLLABLE NIEUN A RIEUL + {0xB3B0, 0xB0A1}, //8578 #HANGUL SYLLABLE NIEUN A RIEULKIYEOK + {0xB3B1, 0xB0A2}, //8579 #HANGUL SYLLABLE NIEUN A RIEULMIEUM + {0xB3B2, 0xB0A8}, //8580 #HANGUL SYLLABLE NIEUN A MIEUM + {0xB3B3, 0xB0A9}, //8581 #HANGUL SYLLABLE NIEUN A PIEUP + {0xB3B4, 0xB0AB}, //8582 #HANGUL SYLLABLE NIEUN A SIOS + {0xB3B5, 0xB0AC}, //8583 #HANGUL SYLLABLE NIEUN A SSANGSIOS + {0xB3B6, 0xB0AD}, //8584 #HANGUL SYLLABLE NIEUN A IEUNG + {0xB3B7, 0xB0AE}, //8585 #HANGUL SYLLABLE NIEUN A CIEUC + {0xB3B8, 0xB0AF}, //8586 #HANGUL SYLLABLE NIEUN A CHIEUCH + {0xB3B9, 0xB0B1}, //8587 #HANGUL SYLLABLE NIEUN A THIEUTH + {0xB3BA, 0xB0B3}, //8588 #HANGUL SYLLABLE NIEUN A HIEUH + {0xB3BB, 0xB0B4}, //8589 #HANGUL SYLLABLE NIEUN AE + {0xB3BC, 0xB0B5}, //8590 #HANGUL SYLLABLE NIEUN AE KIYEOK + {0xB3BD, 0xB0B8}, //8591 #HANGUL SYLLABLE NIEUN AE NIEUN + {0xB3BE, 0xB0BC}, //8592 #HANGUL SYLLABLE NIEUN AE RIEUL + {0xB3BF, 0xB0C4}, //8593 #HANGUL SYLLABLE NIEUN AE MIEUM + {0xB3C0, 0xB0C5}, //8594 #HANGUL SYLLABLE NIEUN AE PIEUP + {0xB3C1, 0xB0C7}, //8595 #HANGUL SYLLABLE NIEUN AE SIOS + {0xB3C2, 0xB0C8}, //8596 #HANGUL SYLLABLE NIEUN AE SSANGSIOS + {0xB3C3, 0xB0C9}, //8597 #HANGUL SYLLABLE NIEUN AE IEUNG + {0xB3C4, 0xB0D0}, //8598 #HANGUL SYLLABLE NIEUN YA + {0xB3C5, 0xB0D1}, //8599 #HANGUL SYLLABLE NIEUN YA KIYEOK + {0xB3C6, 0xB0D4}, //8600 #HANGUL SYLLABLE NIEUN YA NIEUN + {0xB3C7, 0xB0D8}, //8601 #HANGUL SYLLABLE NIEUN YA RIEUL + {0xB3C8, 0xB0E0}, //8602 #HANGUL SYLLABLE NIEUN YA MIEUM + {0xB3C9, 0xB0E5}, //8603 #HANGUL SYLLABLE NIEUN YA IEUNG + {0xB3CA, 0xB108}, //8604 #HANGUL SYLLABLE NIEUN EO + {0xB3CB, 0xB109}, //8605 #HANGUL SYLLABLE NIEUN EO KIYEOK + {0xB3CC, 0xB10B}, //8606 #HANGUL SYLLABLE NIEUN EO KIYEOKSIOS + {0xB3CD, 0xB10C}, //8607 #HANGUL SYLLABLE NIEUN EO NIEUN + {0xB3CE, 0xB110}, //8608 #HANGUL SYLLABLE NIEUN EO RIEUL + {0xB3CF, 0xB112}, //8609 #HANGUL SYLLABLE NIEUN EO RIEULMIEUM + {0xB3D0, 0xB113}, //8610 #HANGUL SYLLABLE NIEUN EO RIEULPIEUP + {0xB3D1, 0xB118}, //8611 #HANGUL SYLLABLE NIEUN EO MIEUM + {0xB3D2, 0xB119}, //8612 #HANGUL SYLLABLE NIEUN EO PIEUP + {0xB3D3, 0xB11B}, //8613 #HANGUL SYLLABLE NIEUN EO SIOS + {0xB3D4, 0xB11C}, //8614 #HANGUL SYLLABLE NIEUN EO SSANGSIOS + {0xB3D5, 0xB11D}, //8615 #HANGUL SYLLABLE NIEUN EO IEUNG + {0xB3D6, 0xB123}, //8616 #HANGUL SYLLABLE NIEUN EO HIEUH + {0xB3D7, 0xB124}, //8617 #HANGUL SYLLABLE NIEUN E + {0xB3D8, 0xB125}, //8618 #HANGUL SYLLABLE NIEUN E KIYEOK + {0xB3D9, 0xB128}, //8619 #HANGUL SYLLABLE NIEUN E NIEUN + {0xB3DA, 0xB12C}, //8620 #HANGUL SYLLABLE NIEUN E RIEUL + {0xB3DB, 0xB134}, //8621 #HANGUL SYLLABLE NIEUN E MIEUM + {0xB3DC, 0xB135}, //8622 #HANGUL SYLLABLE NIEUN E PIEUP + {0xB3DD, 0xB137}, //8623 #HANGUL SYLLABLE NIEUN E SIOS + {0xB3DE, 0xB138}, //8624 #HANGUL SYLLABLE NIEUN E SSANGSIOS + {0xB3DF, 0xB139}, //8625 #HANGUL SYLLABLE NIEUN E IEUNG + {0xB3E0, 0xB140}, //8626 #HANGUL SYLLABLE NIEUN YEO + {0xB3E1, 0xB141}, //8627 #HANGUL SYLLABLE NIEUN YEO KIYEOK + {0xB3E2, 0xB144}, //8628 #HANGUL SYLLABLE NIEUN YEO NIEUN + {0xB3E3, 0xB148}, //8629 #HANGUL SYLLABLE NIEUN YEO RIEUL + {0xB3E4, 0xB150}, //8630 #HANGUL SYLLABLE NIEUN YEO MIEUM + {0xB3E5, 0xB151}, //8631 #HANGUL SYLLABLE NIEUN YEO PIEUP + {0xB3E6, 0xB154}, //8632 #HANGUL SYLLABLE NIEUN YEO SSANGSIOS + {0xB3E7, 0xB155}, //8633 #HANGUL SYLLABLE NIEUN YEO IEUNG + {0xB3E8, 0xB158}, //8634 #HANGUL SYLLABLE NIEUN YEO KHIEUKH + {0xB3E9, 0xB15C}, //8635 #HANGUL SYLLABLE NIEUN YE + {0xB3EA, 0xB160}, //8636 #HANGUL SYLLABLE NIEUN YE NIEUN + {0xB3EB, 0xB178}, //8637 #HANGUL SYLLABLE NIEUN O + {0xB3EC, 0xB179}, //8638 #HANGUL SYLLABLE NIEUN O KIYEOK + {0xB3ED, 0xB17C}, //8639 #HANGUL SYLLABLE NIEUN O NIEUN + {0xB3EE, 0xB180}, //8640 #HANGUL SYLLABLE NIEUN O RIEUL + {0xB3EF, 0xB182}, //8641 #HANGUL SYLLABLE NIEUN O RIEULMIEUM + {0xB3F0, 0xB188}, //8642 #HANGUL SYLLABLE NIEUN O MIEUM + {0xB3F1, 0xB189}, //8643 #HANGUL SYLLABLE NIEUN O PIEUP + {0xB3F2, 0xB18B}, //8644 #HANGUL SYLLABLE NIEUN O SIOS + {0xB3F3, 0xB18D}, //8645 #HANGUL SYLLABLE NIEUN O IEUNG + {0xB3F4, 0xB192}, //8646 #HANGUL SYLLABLE NIEUN O PHIEUPH + {0xB3F5, 0xB193}, //8647 #HANGUL SYLLABLE NIEUN O HIEUH + {0xB3F6, 0xB194}, //8648 #HANGUL SYLLABLE NIEUN WA + {0xB3F7, 0xB198}, //8649 #HANGUL SYLLABLE NIEUN WA NIEUN + {0xB3F8, 0xB19C}, //8650 #HANGUL SYLLABLE NIEUN WA RIEUL + {0xB3F9, 0xB1A8}, //8651 #HANGUL SYLLABLE NIEUN WA SSANGSIOS + {0xB3FA, 0xB1CC}, //8652 #HANGUL SYLLABLE NIEUN OE + {0xB3FB, 0xB1D0}, //8653 #HANGUL SYLLABLE NIEUN OE NIEUN + {0xB3FC, 0xB1D4}, //8654 #HANGUL SYLLABLE NIEUN OE RIEUL + {0xB3FD, 0xB1DC}, //8655 #HANGUL SYLLABLE NIEUN OE MIEUM + {0xB3FE, 0xB1DD}, //8656 #HANGUL SYLLABLE NIEUN OE PIEUP + {0xB441, 0xD02E}, //8657 #HANGUL SYLLABLE KHIEUKH WE CIEUC + {0xB442, 0xD02F}, //8658 #HANGUL SYLLABLE KHIEUKH WE CHIEUCH + {0xB443, 0xD030}, //8659 #HANGUL SYLLABLE KHIEUKH WE KHIEUKH + {0xB444, 0xD031}, //8660 #HANGUL SYLLABLE KHIEUKH WE THIEUTH + {0xB445, 0xD032}, //8661 #HANGUL SYLLABLE KHIEUKH WE PHIEUPH + {0xB446, 0xD033}, //8662 #HANGUL SYLLABLE KHIEUKH WE HIEUH + {0xB447, 0xD036}, //8663 #HANGUL SYLLABLE KHIEUKH WI SSANGKIYEOK + {0xB448, 0xD037}, //8664 #HANGUL SYLLABLE KHIEUKH WI KIYEOKSIOS + {0xB449, 0xD039}, //8665 #HANGUL SYLLABLE KHIEUKH WI NIEUNCIEUC + {0xB44A, 0xD03A}, //8666 #HANGUL SYLLABLE KHIEUKH WI NIEUNHIEUH + {0xB44B, 0xD03B}, //8667 #HANGUL SYLLABLE KHIEUKH WI TIKEUT + {0xB44C, 0xD03D}, //8668 #HANGUL SYLLABLE KHIEUKH WI RIEULKIYEOK + {0xB44D, 0xD03E}, //8669 #HANGUL SYLLABLE KHIEUKH WI RIEULMIEUM + {0xB44E, 0xD03F}, //8670 #HANGUL SYLLABLE KHIEUKH WI RIEULPIEUP + {0xB44F, 0xD040}, //8671 #HANGUL SYLLABLE KHIEUKH WI RIEULSIOS + {0xB450, 0xD041}, //8672 #HANGUL SYLLABLE KHIEUKH WI RIEULTHIEUTH + {0xB451, 0xD042}, //8673 #HANGUL SYLLABLE KHIEUKH WI RIEULPHIEUPH + {0xB452, 0xD043}, //8674 #HANGUL SYLLABLE KHIEUKH WI RIEULHIEUH + {0xB453, 0xD046}, //8675 #HANGUL SYLLABLE KHIEUKH WI PIEUPSIOS + {0xB454, 0xD048}, //8676 #HANGUL SYLLABLE KHIEUKH WI SSANGSIOS + {0xB455, 0xD04A}, //8677 #HANGUL SYLLABLE KHIEUKH WI CIEUC + {0xB456, 0xD04B}, //8678 #HANGUL SYLLABLE KHIEUKH WI CHIEUCH + {0xB457, 0xD04C}, //8679 #HANGUL SYLLABLE KHIEUKH WI KHIEUKH + {0xB458, 0xD04D}, //8680 #HANGUL SYLLABLE KHIEUKH WI THIEUTH + {0xB459, 0xD04E}, //8681 #HANGUL SYLLABLE KHIEUKH WI PHIEUPH + {0xB45A, 0xD04F}, //8682 #HANGUL SYLLABLE KHIEUKH WI HIEUH + {0xB461, 0xD051}, //8683 #HANGUL SYLLABLE KHIEUKH YU KIYEOK + {0xB462, 0xD052}, //8684 #HANGUL SYLLABLE KHIEUKH YU SSANGKIYEOK + {0xB463, 0xD053}, //8685 #HANGUL SYLLABLE KHIEUKH YU KIYEOKSIOS + {0xB464, 0xD055}, //8686 #HANGUL SYLLABLE KHIEUKH YU NIEUNCIEUC + {0xB465, 0xD056}, //8687 #HANGUL SYLLABLE KHIEUKH YU NIEUNHIEUH + {0xB466, 0xD057}, //8688 #HANGUL SYLLABLE KHIEUKH YU TIKEUT + {0xB467, 0xD059}, //8689 #HANGUL SYLLABLE KHIEUKH YU RIEULKIYEOK + {0xB468, 0xD05A}, //8690 #HANGUL SYLLABLE KHIEUKH YU RIEULMIEUM + {0xB469, 0xD05B}, //8691 #HANGUL SYLLABLE KHIEUKH YU RIEULPIEUP + {0xB46A, 0xD05C}, //8692 #HANGUL SYLLABLE KHIEUKH YU RIEULSIOS + {0xB46B, 0xD05D}, //8693 #HANGUL SYLLABLE KHIEUKH YU RIEULTHIEUTH + {0xB46C, 0xD05E}, //8694 #HANGUL SYLLABLE KHIEUKH YU RIEULPHIEUPH + {0xB46D, 0xD05F}, //8695 #HANGUL SYLLABLE KHIEUKH YU RIEULHIEUH + {0xB46E, 0xD061}, //8696 #HANGUL SYLLABLE KHIEUKH YU PIEUP + {0xB46F, 0xD062}, //8697 #HANGUL SYLLABLE KHIEUKH YU PIEUPSIOS + {0xB470, 0xD063}, //8698 #HANGUL SYLLABLE KHIEUKH YU SIOS + {0xB471, 0xD064}, //8699 #HANGUL SYLLABLE KHIEUKH YU SSANGSIOS + {0xB472, 0xD065}, //8700 #HANGUL SYLLABLE KHIEUKH YU IEUNG + {0xB473, 0xD066}, //8701 #HANGUL SYLLABLE KHIEUKH YU CIEUC + {0xB474, 0xD067}, //8702 #HANGUL SYLLABLE KHIEUKH YU CHIEUCH + {0xB475, 0xD068}, //8703 #HANGUL SYLLABLE KHIEUKH YU KHIEUKH + {0xB476, 0xD069}, //8704 #HANGUL SYLLABLE KHIEUKH YU THIEUTH + {0xB477, 0xD06A}, //8705 #HANGUL SYLLABLE KHIEUKH YU PHIEUPH + {0xB478, 0xD06B}, //8706 #HANGUL SYLLABLE KHIEUKH YU HIEUH + {0xB479, 0xD06E}, //8707 #HANGUL SYLLABLE KHIEUKH EU SSANGKIYEOK + {0xB47A, 0xD06F}, //8708 #HANGUL SYLLABLE KHIEUKH EU KIYEOKSIOS + {0xB481, 0xD071}, //8709 #HANGUL SYLLABLE KHIEUKH EU NIEUNCIEUC + {0xB482, 0xD072}, //8710 #HANGUL SYLLABLE KHIEUKH EU NIEUNHIEUH + {0xB483, 0xD073}, //8711 #HANGUL SYLLABLE KHIEUKH EU TIKEUT + {0xB484, 0xD075}, //8712 #HANGUL SYLLABLE KHIEUKH EU RIEULKIYEOK + {0xB485, 0xD076}, //8713 #HANGUL SYLLABLE KHIEUKH EU RIEULMIEUM + {0xB486, 0xD077}, //8714 #HANGUL SYLLABLE KHIEUKH EU RIEULPIEUP + {0xB487, 0xD078}, //8715 #HANGUL SYLLABLE KHIEUKH EU RIEULSIOS + {0xB488, 0xD079}, //8716 #HANGUL SYLLABLE KHIEUKH EU RIEULTHIEUTH + {0xB489, 0xD07A}, //8717 #HANGUL SYLLABLE KHIEUKH EU RIEULPHIEUPH + {0xB48A, 0xD07B}, //8718 #HANGUL SYLLABLE KHIEUKH EU RIEULHIEUH + {0xB48B, 0xD07E}, //8719 #HANGUL SYLLABLE KHIEUKH EU PIEUPSIOS + {0xB48C, 0xD07F}, //8720 #HANGUL SYLLABLE KHIEUKH EU SIOS + {0xB48D, 0xD080}, //8721 #HANGUL SYLLABLE KHIEUKH EU SSANGSIOS + {0xB48E, 0xD082}, //8722 #HANGUL SYLLABLE KHIEUKH EU CIEUC + {0xB48F, 0xD083}, //8723 #HANGUL SYLLABLE KHIEUKH EU CHIEUCH + {0xB490, 0xD084}, //8724 #HANGUL SYLLABLE KHIEUKH EU KHIEUKH + {0xB491, 0xD085}, //8725 #HANGUL SYLLABLE KHIEUKH EU THIEUTH + {0xB492, 0xD086}, //8726 #HANGUL SYLLABLE KHIEUKH EU PHIEUPH + {0xB493, 0xD087}, //8727 #HANGUL SYLLABLE KHIEUKH EU HIEUH + {0xB494, 0xD088}, //8728 #HANGUL SYLLABLE KHIEUKH YI + {0xB495, 0xD089}, //8729 #HANGUL SYLLABLE KHIEUKH YI KIYEOK + {0xB496, 0xD08A}, //8730 #HANGUL SYLLABLE KHIEUKH YI SSANGKIYEOK + {0xB497, 0xD08B}, //8731 #HANGUL SYLLABLE KHIEUKH YI KIYEOKSIOS + {0xB498, 0xD08C}, //8732 #HANGUL SYLLABLE KHIEUKH YI NIEUN + {0xB499, 0xD08D}, //8733 #HANGUL SYLLABLE KHIEUKH YI NIEUNCIEUC + {0xB49A, 0xD08E}, //8734 #HANGUL SYLLABLE KHIEUKH YI NIEUNHIEUH + {0xB49B, 0xD08F}, //8735 #HANGUL SYLLABLE KHIEUKH YI TIKEUT + {0xB49C, 0xD090}, //8736 #HANGUL SYLLABLE KHIEUKH YI RIEUL + {0xB49D, 0xD091}, //8737 #HANGUL SYLLABLE KHIEUKH YI RIEULKIYEOK + {0xB49E, 0xD092}, //8738 #HANGUL SYLLABLE KHIEUKH YI RIEULMIEUM + {0xB49F, 0xD093}, //8739 #HANGUL SYLLABLE KHIEUKH YI RIEULPIEUP + {0xB4A0, 0xD094}, //8740 #HANGUL SYLLABLE KHIEUKH YI RIEULSIOS + {0xB4A1, 0xB1DF}, //8741 #HANGUL SYLLABLE NIEUN OE SIOS + {0xB4A2, 0xB1E8}, //8742 #HANGUL SYLLABLE NIEUN YO + {0xB4A3, 0xB1E9}, //8743 #HANGUL SYLLABLE NIEUN YO KIYEOK + {0xB4A4, 0xB1EC}, //8744 #HANGUL SYLLABLE NIEUN YO NIEUN + {0xB4A5, 0xB1F0}, //8745 #HANGUL SYLLABLE NIEUN YO RIEUL + {0xB4A6, 0xB1F9}, //8746 #HANGUL SYLLABLE NIEUN YO PIEUP + {0xB4A7, 0xB1FB}, //8747 #HANGUL SYLLABLE NIEUN YO SIOS + {0xB4A8, 0xB1FD}, //8748 #HANGUL SYLLABLE NIEUN YO IEUNG + {0xB4A9, 0xB204}, //8749 #HANGUL SYLLABLE NIEUN U + {0xB4AA, 0xB205}, //8750 #HANGUL SYLLABLE NIEUN U KIYEOK + {0xB4AB, 0xB208}, //8751 #HANGUL SYLLABLE NIEUN U NIEUN + {0xB4AC, 0xB20B}, //8752 #HANGUL SYLLABLE NIEUN U TIKEUT + {0xB4AD, 0xB20C}, //8753 #HANGUL SYLLABLE NIEUN U RIEUL + {0xB4AE, 0xB214}, //8754 #HANGUL SYLLABLE NIEUN U MIEUM + {0xB4AF, 0xB215}, //8755 #HANGUL SYLLABLE NIEUN U PIEUP + {0xB4B0, 0xB217}, //8756 #HANGUL SYLLABLE NIEUN U SIOS + {0xB4B1, 0xB219}, //8757 #HANGUL SYLLABLE NIEUN U IEUNG + {0xB4B2, 0xB220}, //8758 #HANGUL SYLLABLE NIEUN WEO + {0xB4B3, 0xB234}, //8759 #HANGUL SYLLABLE NIEUN WEO SSANGSIOS + {0xB4B4, 0xB23C}, //8760 #HANGUL SYLLABLE NIEUN WE + {0xB4B5, 0xB258}, //8761 #HANGUL SYLLABLE NIEUN WI + {0xB4B6, 0xB25C}, //8762 #HANGUL SYLLABLE NIEUN WI NIEUN + {0xB4B7, 0xB260}, //8763 #HANGUL SYLLABLE NIEUN WI RIEUL + {0xB4B8, 0xB268}, //8764 #HANGUL SYLLABLE NIEUN WI MIEUM + {0xB4B9, 0xB269}, //8765 #HANGUL SYLLABLE NIEUN WI PIEUP + {0xB4BA, 0xB274}, //8766 #HANGUL SYLLABLE NIEUN YU + {0xB4BB, 0xB275}, //8767 #HANGUL SYLLABLE NIEUN YU KIYEOK + {0xB4BC, 0xB27C}, //8768 #HANGUL SYLLABLE NIEUN YU RIEUL + {0xB4BD, 0xB284}, //8769 #HANGUL SYLLABLE NIEUN YU MIEUM + {0xB4BE, 0xB285}, //8770 #HANGUL SYLLABLE NIEUN YU PIEUP + {0xB4BF, 0xB289}, //8771 #HANGUL SYLLABLE NIEUN YU IEUNG + {0xB4C0, 0xB290}, //8772 #HANGUL SYLLABLE NIEUN EU + {0xB4C1, 0xB291}, //8773 #HANGUL SYLLABLE NIEUN EU KIYEOK + {0xB4C2, 0xB294}, //8774 #HANGUL SYLLABLE NIEUN EU NIEUN + {0xB4C3, 0xB298}, //8775 #HANGUL SYLLABLE NIEUN EU RIEUL + {0xB4C4, 0xB299}, //8776 #HANGUL SYLLABLE NIEUN EU RIEULKIYEOK + {0xB4C5, 0xB29A}, //8777 #HANGUL SYLLABLE NIEUN EU RIEULMIEUM + {0xB4C6, 0xB2A0}, //8778 #HANGUL SYLLABLE NIEUN EU MIEUM + {0xB4C7, 0xB2A1}, //8779 #HANGUL SYLLABLE NIEUN EU PIEUP + {0xB4C8, 0xB2A3}, //8780 #HANGUL SYLLABLE NIEUN EU SIOS + {0xB4C9, 0xB2A5}, //8781 #HANGUL SYLLABLE NIEUN EU IEUNG + {0xB4CA, 0xB2A6}, //8782 #HANGUL SYLLABLE NIEUN EU CIEUC + {0xB4CB, 0xB2AA}, //8783 #HANGUL SYLLABLE NIEUN EU PHIEUPH + {0xB4CC, 0xB2AC}, //8784 #HANGUL SYLLABLE NIEUN YI + {0xB4CD, 0xB2B0}, //8785 #HANGUL SYLLABLE NIEUN YI NIEUN + {0xB4CE, 0xB2B4}, //8786 #HANGUL SYLLABLE NIEUN YI RIEUL + {0xB4CF, 0xB2C8}, //8787 #HANGUL SYLLABLE NIEUN I + {0xB4D0, 0xB2C9}, //8788 #HANGUL SYLLABLE NIEUN I KIYEOK + {0xB4D1, 0xB2CC}, //8789 #HANGUL SYLLABLE NIEUN I NIEUN + {0xB4D2, 0xB2D0}, //8790 #HANGUL SYLLABLE NIEUN I RIEUL + {0xB4D3, 0xB2D2}, //8791 #HANGUL SYLLABLE NIEUN I RIEULMIEUM + {0xB4D4, 0xB2D8}, //8792 #HANGUL SYLLABLE NIEUN I MIEUM + {0xB4D5, 0xB2D9}, //8793 #HANGUL SYLLABLE NIEUN I PIEUP + {0xB4D6, 0xB2DB}, //8794 #HANGUL SYLLABLE NIEUN I SIOS + {0xB4D7, 0xB2DD}, //8795 #HANGUL SYLLABLE NIEUN I IEUNG + {0xB4D8, 0xB2E2}, //8796 #HANGUL SYLLABLE NIEUN I PHIEUPH + {0xB4D9, 0xB2E4}, //8797 #HANGUL SYLLABLE TIKEUT A + {0xB4DA, 0xB2E5}, //8798 #HANGUL SYLLABLE TIKEUT A KIYEOK + {0xB4DB, 0xB2E6}, //8799 #HANGUL SYLLABLE TIKEUT A SSANGKIYEOK + {0xB4DC, 0xB2E8}, //8800 #HANGUL SYLLABLE TIKEUT A NIEUN + {0xB4DD, 0xB2EB}, //8801 #HANGUL SYLLABLE TIKEUT A TIKEUT + {0xB4DE, 0xB2EC}, //8802 #HANGUL SYLLABLE TIKEUT A RIEUL + {0xB4DF, 0xB2ED}, //8803 #HANGUL SYLLABLE TIKEUT A RIEULKIYEOK + {0xB4E0, 0xB2EE}, //8804 #HANGUL SYLLABLE TIKEUT A RIEULMIEUM + {0xB4E1, 0xB2EF}, //8805 #HANGUL SYLLABLE TIKEUT A RIEULPIEUP + {0xB4E2, 0xB2F3}, //8806 #HANGUL SYLLABLE TIKEUT A RIEULHIEUH + {0xB4E3, 0xB2F4}, //8807 #HANGUL SYLLABLE TIKEUT A MIEUM + {0xB4E4, 0xB2F5}, //8808 #HANGUL SYLLABLE TIKEUT A PIEUP + {0xB4E5, 0xB2F7}, //8809 #HANGUL SYLLABLE TIKEUT A SIOS + {0xB4E6, 0xB2F8}, //8810 #HANGUL SYLLABLE TIKEUT A SSANGSIOS + {0xB4E7, 0xB2F9}, //8811 #HANGUL SYLLABLE TIKEUT A IEUNG + {0xB4E8, 0xB2FA}, //8812 #HANGUL SYLLABLE TIKEUT A CIEUC + {0xB4E9, 0xB2FB}, //8813 #HANGUL SYLLABLE TIKEUT A CHIEUCH + {0xB4EA, 0xB2FF}, //8814 #HANGUL SYLLABLE TIKEUT A HIEUH + {0xB4EB, 0xB300}, //8815 #HANGUL SYLLABLE TIKEUT AE + {0xB4EC, 0xB301}, //8816 #HANGUL SYLLABLE TIKEUT AE KIYEOK + {0xB4ED, 0xB304}, //8817 #HANGUL SYLLABLE TIKEUT AE NIEUN + {0xB4EE, 0xB308}, //8818 #HANGUL SYLLABLE TIKEUT AE RIEUL + {0xB4EF, 0xB310}, //8819 #HANGUL SYLLABLE TIKEUT AE MIEUM + {0xB4F0, 0xB311}, //8820 #HANGUL SYLLABLE TIKEUT AE PIEUP + {0xB4F1, 0xB313}, //8821 #HANGUL SYLLABLE TIKEUT AE SIOS + {0xB4F2, 0xB314}, //8822 #HANGUL SYLLABLE TIKEUT AE SSANGSIOS + {0xB4F3, 0xB315}, //8823 #HANGUL SYLLABLE TIKEUT AE IEUNG + {0xB4F4, 0xB31C}, //8824 #HANGUL SYLLABLE TIKEUT YA + {0xB4F5, 0xB354}, //8825 #HANGUL SYLLABLE TIKEUT EO + {0xB4F6, 0xB355}, //8826 #HANGUL SYLLABLE TIKEUT EO KIYEOK + {0xB4F7, 0xB356}, //8827 #HANGUL SYLLABLE TIKEUT EO SSANGKIYEOK + {0xB4F8, 0xB358}, //8828 #HANGUL SYLLABLE TIKEUT EO NIEUN + {0xB4F9, 0xB35B}, //8829 #HANGUL SYLLABLE TIKEUT EO TIKEUT + {0xB4FA, 0xB35C}, //8830 #HANGUL SYLLABLE TIKEUT EO RIEUL + {0xB4FB, 0xB35E}, //8831 #HANGUL SYLLABLE TIKEUT EO RIEULMIEUM + {0xB4FC, 0xB35F}, //8832 #HANGUL SYLLABLE TIKEUT EO RIEULPIEUP + {0xB4FD, 0xB364}, //8833 #HANGUL SYLLABLE TIKEUT EO MIEUM + {0xB4FE, 0xB365}, //8834 #HANGUL SYLLABLE TIKEUT EO PIEUP + {0xB541, 0xD095}, //8835 #HANGUL SYLLABLE KHIEUKH YI RIEULTHIEUTH + {0xB542, 0xD096}, //8836 #HANGUL SYLLABLE KHIEUKH YI RIEULPHIEUPH + {0xB543, 0xD097}, //8837 #HANGUL SYLLABLE KHIEUKH YI RIEULHIEUH + {0xB544, 0xD098}, //8838 #HANGUL SYLLABLE KHIEUKH YI MIEUM + {0xB545, 0xD099}, //8839 #HANGUL SYLLABLE KHIEUKH YI PIEUP + {0xB546, 0xD09A}, //8840 #HANGUL SYLLABLE KHIEUKH YI PIEUPSIOS + {0xB547, 0xD09B}, //8841 #HANGUL SYLLABLE KHIEUKH YI SIOS + {0xB548, 0xD09C}, //8842 #HANGUL SYLLABLE KHIEUKH YI SSANGSIOS + {0xB549, 0xD09D}, //8843 #HANGUL SYLLABLE KHIEUKH YI IEUNG + {0xB54A, 0xD09E}, //8844 #HANGUL SYLLABLE KHIEUKH YI CIEUC + {0xB54B, 0xD09F}, //8845 #HANGUL SYLLABLE KHIEUKH YI CHIEUCH + {0xB54C, 0xD0A0}, //8846 #HANGUL SYLLABLE KHIEUKH YI KHIEUKH + {0xB54D, 0xD0A1}, //8847 #HANGUL SYLLABLE KHIEUKH YI THIEUTH + {0xB54E, 0xD0A2}, //8848 #HANGUL SYLLABLE KHIEUKH YI PHIEUPH + {0xB54F, 0xD0A3}, //8849 #HANGUL SYLLABLE KHIEUKH YI HIEUH + {0xB550, 0xD0A6}, //8850 #HANGUL SYLLABLE KHIEUKH I SSANGKIYEOK + {0xB551, 0xD0A7}, //8851 #HANGUL SYLLABLE KHIEUKH I KIYEOKSIOS + {0xB552, 0xD0A9}, //8852 #HANGUL SYLLABLE KHIEUKH I NIEUNCIEUC + {0xB553, 0xD0AA}, //8853 #HANGUL SYLLABLE KHIEUKH I NIEUNHIEUH + {0xB554, 0xD0AB}, //8854 #HANGUL SYLLABLE KHIEUKH I TIKEUT + {0xB555, 0xD0AD}, //8855 #HANGUL SYLLABLE KHIEUKH I RIEULKIYEOK + {0xB556, 0xD0AE}, //8856 #HANGUL SYLLABLE KHIEUKH I RIEULMIEUM + {0xB557, 0xD0AF}, //8857 #HANGUL SYLLABLE KHIEUKH I RIEULPIEUP + {0xB558, 0xD0B0}, //8858 #HANGUL SYLLABLE KHIEUKH I RIEULSIOS + {0xB559, 0xD0B1}, //8859 #HANGUL SYLLABLE KHIEUKH I RIEULTHIEUTH + {0xB55A, 0xD0B2}, //8860 #HANGUL SYLLABLE KHIEUKH I RIEULPHIEUPH + {0xB561, 0xD0B3}, //8861 #HANGUL SYLLABLE KHIEUKH I RIEULHIEUH + {0xB562, 0xD0B6}, //8862 #HANGUL SYLLABLE KHIEUKH I PIEUPSIOS + {0xB563, 0xD0B8}, //8863 #HANGUL SYLLABLE KHIEUKH I SSANGSIOS + {0xB564, 0xD0BA}, //8864 #HANGUL SYLLABLE KHIEUKH I CIEUC + {0xB565, 0xD0BB}, //8865 #HANGUL SYLLABLE KHIEUKH I CHIEUCH + {0xB566, 0xD0BC}, //8866 #HANGUL SYLLABLE KHIEUKH I KHIEUKH + {0xB567, 0xD0BD}, //8867 #HANGUL SYLLABLE KHIEUKH I THIEUTH + {0xB568, 0xD0BE}, //8868 #HANGUL SYLLABLE KHIEUKH I PHIEUPH + {0xB569, 0xD0BF}, //8869 #HANGUL SYLLABLE KHIEUKH I HIEUH + {0xB56A, 0xD0C2}, //8870 #HANGUL SYLLABLE THIEUTH A SSANGKIYEOK + {0xB56B, 0xD0C3}, //8871 #HANGUL SYLLABLE THIEUTH A KIYEOKSIOS + {0xB56C, 0xD0C5}, //8872 #HANGUL SYLLABLE THIEUTH A NIEUNCIEUC + {0xB56D, 0xD0C6}, //8873 #HANGUL SYLLABLE THIEUTH A NIEUNHIEUH + {0xB56E, 0xD0C7}, //8874 #HANGUL SYLLABLE THIEUTH A TIKEUT + {0xB56F, 0xD0CA}, //8875 #HANGUL SYLLABLE THIEUTH A RIEULMIEUM + {0xB570, 0xD0CB}, //8876 #HANGUL SYLLABLE THIEUTH A RIEULPIEUP + {0xB571, 0xD0CC}, //8877 #HANGUL SYLLABLE THIEUTH A RIEULSIOS + {0xB572, 0xD0CD}, //8878 #HANGUL SYLLABLE THIEUTH A RIEULTHIEUTH + {0xB573, 0xD0CE}, //8879 #HANGUL SYLLABLE THIEUTH A RIEULPHIEUPH + {0xB574, 0xD0CF}, //8880 #HANGUL SYLLABLE THIEUTH A RIEULHIEUH + {0xB575, 0xD0D2}, //8881 #HANGUL SYLLABLE THIEUTH A PIEUPSIOS + {0xB576, 0xD0D6}, //8882 #HANGUL SYLLABLE THIEUTH A CIEUC + {0xB577, 0xD0D7}, //8883 #HANGUL SYLLABLE THIEUTH A CHIEUCH + {0xB578, 0xD0D8}, //8884 #HANGUL SYLLABLE THIEUTH A KHIEUKH + {0xB579, 0xD0D9}, //8885 #HANGUL SYLLABLE THIEUTH A THIEUTH + {0xB57A, 0xD0DA}, //8886 #HANGUL SYLLABLE THIEUTH A PHIEUPH + {0xB581, 0xD0DB}, //8887 #HANGUL SYLLABLE THIEUTH A HIEUH + {0xB582, 0xD0DE}, //8888 #HANGUL SYLLABLE THIEUTH AE SSANGKIYEOK + {0xB583, 0xD0DF}, //8889 #HANGUL SYLLABLE THIEUTH AE KIYEOKSIOS + {0xB584, 0xD0E1}, //8890 #HANGUL SYLLABLE THIEUTH AE NIEUNCIEUC + {0xB585, 0xD0E2}, //8891 #HANGUL SYLLABLE THIEUTH AE NIEUNHIEUH + {0xB586, 0xD0E3}, //8892 #HANGUL SYLLABLE THIEUTH AE TIKEUT + {0xB587, 0xD0E5}, //8893 #HANGUL SYLLABLE THIEUTH AE RIEULKIYEOK + {0xB588, 0xD0E6}, //8894 #HANGUL SYLLABLE THIEUTH AE RIEULMIEUM + {0xB589, 0xD0E7}, //8895 #HANGUL SYLLABLE THIEUTH AE RIEULPIEUP + {0xB58A, 0xD0E8}, //8896 #HANGUL SYLLABLE THIEUTH AE RIEULSIOS + {0xB58B, 0xD0E9}, //8897 #HANGUL SYLLABLE THIEUTH AE RIEULTHIEUTH + {0xB58C, 0xD0EA}, //8898 #HANGUL SYLLABLE THIEUTH AE RIEULPHIEUPH + {0xB58D, 0xD0EB}, //8899 #HANGUL SYLLABLE THIEUTH AE RIEULHIEUH + {0xB58E, 0xD0EE}, //8900 #HANGUL SYLLABLE THIEUTH AE PIEUPSIOS + {0xB58F, 0xD0F2}, //8901 #HANGUL SYLLABLE THIEUTH AE CIEUC + {0xB590, 0xD0F3}, //8902 #HANGUL SYLLABLE THIEUTH AE CHIEUCH + {0xB591, 0xD0F4}, //8903 #HANGUL SYLLABLE THIEUTH AE KHIEUKH + {0xB592, 0xD0F5}, //8904 #HANGUL SYLLABLE THIEUTH AE THIEUTH + {0xB593, 0xD0F6}, //8905 #HANGUL SYLLABLE THIEUTH AE PHIEUPH + {0xB594, 0xD0F7}, //8906 #HANGUL SYLLABLE THIEUTH AE HIEUH + {0xB595, 0xD0F9}, //8907 #HANGUL SYLLABLE THIEUTH YA KIYEOK + {0xB596, 0xD0FA}, //8908 #HANGUL SYLLABLE THIEUTH YA SSANGKIYEOK + {0xB597, 0xD0FB}, //8909 #HANGUL SYLLABLE THIEUTH YA KIYEOKSIOS + {0xB598, 0xD0FC}, //8910 #HANGUL SYLLABLE THIEUTH YA NIEUN + {0xB599, 0xD0FD}, //8911 #HANGUL SYLLABLE THIEUTH YA NIEUNCIEUC + {0xB59A, 0xD0FE}, //8912 #HANGUL SYLLABLE THIEUTH YA NIEUNHIEUH + {0xB59B, 0xD0FF}, //8913 #HANGUL SYLLABLE THIEUTH YA TIKEUT + {0xB59C, 0xD100}, //8914 #HANGUL SYLLABLE THIEUTH YA RIEUL + {0xB59D, 0xD101}, //8915 #HANGUL SYLLABLE THIEUTH YA RIEULKIYEOK + {0xB59E, 0xD102}, //8916 #HANGUL SYLLABLE THIEUTH YA RIEULMIEUM + {0xB59F, 0xD103}, //8917 #HANGUL SYLLABLE THIEUTH YA RIEULPIEUP + {0xB5A0, 0xD104}, //8918 #HANGUL SYLLABLE THIEUTH YA RIEULSIOS + {0xB5A1, 0xB367}, //8919 #HANGUL SYLLABLE TIKEUT EO SIOS + {0xB5A2, 0xB369}, //8920 #HANGUL SYLLABLE TIKEUT EO IEUNG + {0xB5A3, 0xB36B}, //8921 #HANGUL SYLLABLE TIKEUT EO CHIEUCH + {0xB5A4, 0xB36E}, //8922 #HANGUL SYLLABLE TIKEUT EO PHIEUPH + {0xB5A5, 0xB370}, //8923 #HANGUL SYLLABLE TIKEUT E + {0xB5A6, 0xB371}, //8924 #HANGUL SYLLABLE TIKEUT E KIYEOK + {0xB5A7, 0xB374}, //8925 #HANGUL SYLLABLE TIKEUT E NIEUN + {0xB5A8, 0xB378}, //8926 #HANGUL SYLLABLE TIKEUT E RIEUL + {0xB5A9, 0xB380}, //8927 #HANGUL SYLLABLE TIKEUT E MIEUM + {0xB5AA, 0xB381}, //8928 #HANGUL SYLLABLE TIKEUT E PIEUP + {0xB5AB, 0xB383}, //8929 #HANGUL SYLLABLE TIKEUT E SIOS + {0xB5AC, 0xB384}, //8930 #HANGUL SYLLABLE TIKEUT E SSANGSIOS + {0xB5AD, 0xB385}, //8931 #HANGUL SYLLABLE TIKEUT E IEUNG + {0xB5AE, 0xB38C}, //8932 #HANGUL SYLLABLE TIKEUT YEO + {0xB5AF, 0xB390}, //8933 #HANGUL SYLLABLE TIKEUT YEO NIEUN + {0xB5B0, 0xB394}, //8934 #HANGUL SYLLABLE TIKEUT YEO RIEUL + {0xB5B1, 0xB3A0}, //8935 #HANGUL SYLLABLE TIKEUT YEO SSANGSIOS + {0xB5B2, 0xB3A1}, //8936 #HANGUL SYLLABLE TIKEUT YEO IEUNG + {0xB5B3, 0xB3A8}, //8937 #HANGUL SYLLABLE TIKEUT YE + {0xB5B4, 0xB3AC}, //8938 #HANGUL SYLLABLE TIKEUT YE NIEUN + {0xB5B5, 0xB3C4}, //8939 #HANGUL SYLLABLE TIKEUT O + {0xB5B6, 0xB3C5}, //8940 #HANGUL SYLLABLE TIKEUT O KIYEOK + {0xB5B7, 0xB3C8}, //8941 #HANGUL SYLLABLE TIKEUT O NIEUN + {0xB5B8, 0xB3CB}, //8942 #HANGUL SYLLABLE TIKEUT O TIKEUT + {0xB5B9, 0xB3CC}, //8943 #HANGUL SYLLABLE TIKEUT O RIEUL + {0xB5BA, 0xB3CE}, //8944 #HANGUL SYLLABLE TIKEUT O RIEULMIEUM + {0xB5BB, 0xB3D0}, //8945 #HANGUL SYLLABLE TIKEUT O RIEULSIOS + {0xB5BC, 0xB3D4}, //8946 #HANGUL SYLLABLE TIKEUT O MIEUM + {0xB5BD, 0xB3D5}, //8947 #HANGUL SYLLABLE TIKEUT O PIEUP + {0xB5BE, 0xB3D7}, //8948 #HANGUL SYLLABLE TIKEUT O SIOS + {0xB5BF, 0xB3D9}, //8949 #HANGUL SYLLABLE TIKEUT O IEUNG + {0xB5C0, 0xB3DB}, //8950 #HANGUL SYLLABLE TIKEUT O CHIEUCH + {0xB5C1, 0xB3DD}, //8951 #HANGUL SYLLABLE TIKEUT O THIEUTH + {0xB5C2, 0xB3E0}, //8952 #HANGUL SYLLABLE TIKEUT WA + {0xB5C3, 0xB3E4}, //8953 #HANGUL SYLLABLE TIKEUT WA NIEUN + {0xB5C4, 0xB3E8}, //8954 #HANGUL SYLLABLE TIKEUT WA RIEUL + {0xB5C5, 0xB3FC}, //8955 #HANGUL SYLLABLE TIKEUT WAE + {0xB5C6, 0xB410}, //8956 #HANGUL SYLLABLE TIKEUT WAE SSANGSIOS + {0xB5C7, 0xB418}, //8957 #HANGUL SYLLABLE TIKEUT OE + {0xB5C8, 0xB41C}, //8958 #HANGUL SYLLABLE TIKEUT OE NIEUN + {0xB5C9, 0xB420}, //8959 #HANGUL SYLLABLE TIKEUT OE RIEUL + {0xB5CA, 0xB428}, //8960 #HANGUL SYLLABLE TIKEUT OE MIEUM + {0xB5CB, 0xB429}, //8961 #HANGUL SYLLABLE TIKEUT OE PIEUP + {0xB5CC, 0xB42B}, //8962 #HANGUL SYLLABLE TIKEUT OE SIOS + {0xB5CD, 0xB434}, //8963 #HANGUL SYLLABLE TIKEUT YO + {0xB5CE, 0xB450}, //8964 #HANGUL SYLLABLE TIKEUT U + {0xB5CF, 0xB451}, //8965 #HANGUL SYLLABLE TIKEUT U KIYEOK + {0xB5D0, 0xB454}, //8966 #HANGUL SYLLABLE TIKEUT U NIEUN + {0xB5D1, 0xB458}, //8967 #HANGUL SYLLABLE TIKEUT U RIEUL + {0xB5D2, 0xB460}, //8968 #HANGUL SYLLABLE TIKEUT U MIEUM + {0xB5D3, 0xB461}, //8969 #HANGUL SYLLABLE TIKEUT U PIEUP + {0xB5D4, 0xB463}, //8970 #HANGUL SYLLABLE TIKEUT U SIOS + {0xB5D5, 0xB465}, //8971 #HANGUL SYLLABLE TIKEUT U IEUNG + {0xB5D6, 0xB46C}, //8972 #HANGUL SYLLABLE TIKEUT WEO + {0xB5D7, 0xB480}, //8973 #HANGUL SYLLABLE TIKEUT WEO SSANGSIOS + {0xB5D8, 0xB488}, //8974 #HANGUL SYLLABLE TIKEUT WE + {0xB5D9, 0xB49D}, //8975 #HANGUL SYLLABLE TIKEUT WE IEUNG + {0xB5DA, 0xB4A4}, //8976 #HANGUL SYLLABLE TIKEUT WI + {0xB5DB, 0xB4A8}, //8977 #HANGUL SYLLABLE TIKEUT WI NIEUN + {0xB5DC, 0xB4AC}, //8978 #HANGUL SYLLABLE TIKEUT WI RIEUL + {0xB5DD, 0xB4B5}, //8979 #HANGUL SYLLABLE TIKEUT WI PIEUP + {0xB5DE, 0xB4B7}, //8980 #HANGUL SYLLABLE TIKEUT WI SIOS + {0xB5DF, 0xB4B9}, //8981 #HANGUL SYLLABLE TIKEUT WI IEUNG + {0xB5E0, 0xB4C0}, //8982 #HANGUL SYLLABLE TIKEUT YU + {0xB5E1, 0xB4C4}, //8983 #HANGUL SYLLABLE TIKEUT YU NIEUN + {0xB5E2, 0xB4C8}, //8984 #HANGUL SYLLABLE TIKEUT YU RIEUL + {0xB5E3, 0xB4D0}, //8985 #HANGUL SYLLABLE TIKEUT YU MIEUM + {0xB5E4, 0xB4D5}, //8986 #HANGUL SYLLABLE TIKEUT YU IEUNG + {0xB5E5, 0xB4DC}, //8987 #HANGUL SYLLABLE TIKEUT EU + {0xB5E6, 0xB4DD}, //8988 #HANGUL SYLLABLE TIKEUT EU KIYEOK + {0xB5E7, 0xB4E0}, //8989 #HANGUL SYLLABLE TIKEUT EU NIEUN + {0xB5E8, 0xB4E3}, //8990 #HANGUL SYLLABLE TIKEUT EU TIKEUT + {0xB5E9, 0xB4E4}, //8991 #HANGUL SYLLABLE TIKEUT EU RIEUL + {0xB5EA, 0xB4E6}, //8992 #HANGUL SYLLABLE TIKEUT EU RIEULMIEUM + {0xB5EB, 0xB4EC}, //8993 #HANGUL SYLLABLE TIKEUT EU MIEUM + {0xB5EC, 0xB4ED}, //8994 #HANGUL SYLLABLE TIKEUT EU PIEUP + {0xB5ED, 0xB4EF}, //8995 #HANGUL SYLLABLE TIKEUT EU SIOS + {0xB5EE, 0xB4F1}, //8996 #HANGUL SYLLABLE TIKEUT EU IEUNG + {0xB5EF, 0xB4F8}, //8997 #HANGUL SYLLABLE TIKEUT YI + {0xB5F0, 0xB514}, //8998 #HANGUL SYLLABLE TIKEUT I + {0xB5F1, 0xB515}, //8999 #HANGUL SYLLABLE TIKEUT I KIYEOK + {0xB5F2, 0xB518}, //9000 #HANGUL SYLLABLE TIKEUT I NIEUN + {0xB5F3, 0xB51B}, //9001 #HANGUL SYLLABLE TIKEUT I TIKEUT + {0xB5F4, 0xB51C}, //9002 #HANGUL SYLLABLE TIKEUT I RIEUL + {0xB5F5, 0xB524}, //9003 #HANGUL SYLLABLE TIKEUT I MIEUM + {0xB5F6, 0xB525}, //9004 #HANGUL SYLLABLE TIKEUT I PIEUP + {0xB5F7, 0xB527}, //9005 #HANGUL SYLLABLE TIKEUT I SIOS + {0xB5F8, 0xB528}, //9006 #HANGUL SYLLABLE TIKEUT I SSANGSIOS + {0xB5F9, 0xB529}, //9007 #HANGUL SYLLABLE TIKEUT I IEUNG + {0xB5FA, 0xB52A}, //9008 #HANGUL SYLLABLE TIKEUT I CIEUC + {0xB5FB, 0xB530}, //9009 #HANGUL SYLLABLE SSANGTIKEUT A + {0xB5FC, 0xB531}, //9010 #HANGUL SYLLABLE SSANGTIKEUT A KIYEOK + {0xB5FD, 0xB534}, //9011 #HANGUL SYLLABLE SSANGTIKEUT A NIEUN + {0xB5FE, 0xB538}, //9012 #HANGUL SYLLABLE SSANGTIKEUT A RIEUL + {0xB641, 0xD105}, //9013 #HANGUL SYLLABLE THIEUTH YA RIEULTHIEUTH + {0xB642, 0xD106}, //9014 #HANGUL SYLLABLE THIEUTH YA RIEULPHIEUPH + {0xB643, 0xD107}, //9015 #HANGUL SYLLABLE THIEUTH YA RIEULHIEUH + {0xB644, 0xD108}, //9016 #HANGUL SYLLABLE THIEUTH YA MIEUM + {0xB645, 0xD109}, //9017 #HANGUL SYLLABLE THIEUTH YA PIEUP + {0xB646, 0xD10A}, //9018 #HANGUL SYLLABLE THIEUTH YA PIEUPSIOS + {0xB647, 0xD10B}, //9019 #HANGUL SYLLABLE THIEUTH YA SIOS + {0xB648, 0xD10C}, //9020 #HANGUL SYLLABLE THIEUTH YA SSANGSIOS + {0xB649, 0xD10E}, //9021 #HANGUL SYLLABLE THIEUTH YA CIEUC + {0xB64A, 0xD10F}, //9022 #HANGUL SYLLABLE THIEUTH YA CHIEUCH + {0xB64B, 0xD110}, //9023 #HANGUL SYLLABLE THIEUTH YA KHIEUKH + {0xB64C, 0xD111}, //9024 #HANGUL SYLLABLE THIEUTH YA THIEUTH + {0xB64D, 0xD112}, //9025 #HANGUL SYLLABLE THIEUTH YA PHIEUPH + {0xB64E, 0xD113}, //9026 #HANGUL SYLLABLE THIEUTH YA HIEUH + {0xB64F, 0xD114}, //9027 #HANGUL SYLLABLE THIEUTH YAE + {0xB650, 0xD115}, //9028 #HANGUL SYLLABLE THIEUTH YAE KIYEOK + {0xB651, 0xD116}, //9029 #HANGUL SYLLABLE THIEUTH YAE SSANGKIYEOK + {0xB652, 0xD117}, //9030 #HANGUL SYLLABLE THIEUTH YAE KIYEOKSIOS + {0xB653, 0xD118}, //9031 #HANGUL SYLLABLE THIEUTH YAE NIEUN + {0xB654, 0xD119}, //9032 #HANGUL SYLLABLE THIEUTH YAE NIEUNCIEUC + {0xB655, 0xD11A}, //9033 #HANGUL SYLLABLE THIEUTH YAE NIEUNHIEUH + {0xB656, 0xD11B}, //9034 #HANGUL SYLLABLE THIEUTH YAE TIKEUT + {0xB657, 0xD11C}, //9035 #HANGUL SYLLABLE THIEUTH YAE RIEUL + {0xB658, 0xD11D}, //9036 #HANGUL SYLLABLE THIEUTH YAE RIEULKIYEOK + {0xB659, 0xD11E}, //9037 #HANGUL SYLLABLE THIEUTH YAE RIEULMIEUM + {0xB65A, 0xD11F}, //9038 #HANGUL SYLLABLE THIEUTH YAE RIEULPIEUP + {0xB661, 0xD120}, //9039 #HANGUL SYLLABLE THIEUTH YAE RIEULSIOS + {0xB662, 0xD121}, //9040 #HANGUL SYLLABLE THIEUTH YAE RIEULTHIEUTH + {0xB663, 0xD122}, //9041 #HANGUL SYLLABLE THIEUTH YAE RIEULPHIEUPH + {0xB664, 0xD123}, //9042 #HANGUL SYLLABLE THIEUTH YAE RIEULHIEUH + {0xB665, 0xD124}, //9043 #HANGUL SYLLABLE THIEUTH YAE MIEUM + {0xB666, 0xD125}, //9044 #HANGUL SYLLABLE THIEUTH YAE PIEUP + {0xB667, 0xD126}, //9045 #HANGUL SYLLABLE THIEUTH YAE PIEUPSIOS + {0xB668, 0xD127}, //9046 #HANGUL SYLLABLE THIEUTH YAE SIOS + {0xB669, 0xD128}, //9047 #HANGUL SYLLABLE THIEUTH YAE SSANGSIOS + {0xB66A, 0xD129}, //9048 #HANGUL SYLLABLE THIEUTH YAE IEUNG + {0xB66B, 0xD12A}, //9049 #HANGUL SYLLABLE THIEUTH YAE CIEUC + {0xB66C, 0xD12B}, //9050 #HANGUL SYLLABLE THIEUTH YAE CHIEUCH + {0xB66D, 0xD12C}, //9051 #HANGUL SYLLABLE THIEUTH YAE KHIEUKH + {0xB66E, 0xD12D}, //9052 #HANGUL SYLLABLE THIEUTH YAE THIEUTH + {0xB66F, 0xD12E}, //9053 #HANGUL SYLLABLE THIEUTH YAE PHIEUPH + {0xB670, 0xD12F}, //9054 #HANGUL SYLLABLE THIEUTH YAE HIEUH + {0xB671, 0xD132}, //9055 #HANGUL SYLLABLE THIEUTH EO SSANGKIYEOK + {0xB672, 0xD133}, //9056 #HANGUL SYLLABLE THIEUTH EO KIYEOKSIOS + {0xB673, 0xD135}, //9057 #HANGUL SYLLABLE THIEUTH EO NIEUNCIEUC + {0xB674, 0xD136}, //9058 #HANGUL SYLLABLE THIEUTH EO NIEUNHIEUH + {0xB675, 0xD137}, //9059 #HANGUL SYLLABLE THIEUTH EO TIKEUT + {0xB676, 0xD139}, //9060 #HANGUL SYLLABLE THIEUTH EO RIEULKIYEOK + {0xB677, 0xD13B}, //9061 #HANGUL SYLLABLE THIEUTH EO RIEULPIEUP + {0xB678, 0xD13C}, //9062 #HANGUL SYLLABLE THIEUTH EO RIEULSIOS + {0xB679, 0xD13D}, //9063 #HANGUL SYLLABLE THIEUTH EO RIEULTHIEUTH + {0xB67A, 0xD13E}, //9064 #HANGUL SYLLABLE THIEUTH EO RIEULPHIEUPH + {0xB681, 0xD13F}, //9065 #HANGUL SYLLABLE THIEUTH EO RIEULHIEUH + {0xB682, 0xD142}, //9066 #HANGUL SYLLABLE THIEUTH EO PIEUPSIOS + {0xB683, 0xD146}, //9067 #HANGUL SYLLABLE THIEUTH EO CIEUC + {0xB684, 0xD147}, //9068 #HANGUL SYLLABLE THIEUTH EO CHIEUCH + {0xB685, 0xD148}, //9069 #HANGUL SYLLABLE THIEUTH EO KHIEUKH + {0xB686, 0xD149}, //9070 #HANGUL SYLLABLE THIEUTH EO THIEUTH + {0xB687, 0xD14A}, //9071 #HANGUL SYLLABLE THIEUTH EO PHIEUPH + {0xB688, 0xD14B}, //9072 #HANGUL SYLLABLE THIEUTH EO HIEUH + {0xB689, 0xD14E}, //9073 #HANGUL SYLLABLE THIEUTH E SSANGKIYEOK + {0xB68A, 0xD14F}, //9074 #HANGUL SYLLABLE THIEUTH E KIYEOKSIOS + {0xB68B, 0xD151}, //9075 #HANGUL SYLLABLE THIEUTH E NIEUNCIEUC + {0xB68C, 0xD152}, //9076 #HANGUL SYLLABLE THIEUTH E NIEUNHIEUH + {0xB68D, 0xD153}, //9077 #HANGUL SYLLABLE THIEUTH E TIKEUT + {0xB68E, 0xD155}, //9078 #HANGUL SYLLABLE THIEUTH E RIEULKIYEOK + {0xB68F, 0xD156}, //9079 #HANGUL SYLLABLE THIEUTH E RIEULMIEUM + {0xB690, 0xD157}, //9080 #HANGUL SYLLABLE THIEUTH E RIEULPIEUP + {0xB691, 0xD158}, //9081 #HANGUL SYLLABLE THIEUTH E RIEULSIOS + {0xB692, 0xD159}, //9082 #HANGUL SYLLABLE THIEUTH E RIEULTHIEUTH + {0xB693, 0xD15A}, //9083 #HANGUL SYLLABLE THIEUTH E RIEULPHIEUPH + {0xB694, 0xD15B}, //9084 #HANGUL SYLLABLE THIEUTH E RIEULHIEUH + {0xB695, 0xD15E}, //9085 #HANGUL SYLLABLE THIEUTH E PIEUPSIOS + {0xB696, 0xD160}, //9086 #HANGUL SYLLABLE THIEUTH E SSANGSIOS + {0xB697, 0xD162}, //9087 #HANGUL SYLLABLE THIEUTH E CIEUC + {0xB698, 0xD163}, //9088 #HANGUL SYLLABLE THIEUTH E CHIEUCH + {0xB699, 0xD164}, //9089 #HANGUL SYLLABLE THIEUTH E KHIEUKH + {0xB69A, 0xD165}, //9090 #HANGUL SYLLABLE THIEUTH E THIEUTH + {0xB69B, 0xD166}, //9091 #HANGUL SYLLABLE THIEUTH E PHIEUPH + {0xB69C, 0xD167}, //9092 #HANGUL SYLLABLE THIEUTH E HIEUH + {0xB69D, 0xD169}, //9093 #HANGUL SYLLABLE THIEUTH YEO KIYEOK + {0xB69E, 0xD16A}, //9094 #HANGUL SYLLABLE THIEUTH YEO SSANGKIYEOK + {0xB69F, 0xD16B}, //9095 #HANGUL SYLLABLE THIEUTH YEO KIYEOKSIOS + {0xB6A0, 0xD16D}, //9096 #HANGUL SYLLABLE THIEUTH YEO NIEUNCIEUC + {0xB6A1, 0xB540}, //9097 #HANGUL SYLLABLE SSANGTIKEUT A MIEUM + {0xB6A2, 0xB541}, //9098 #HANGUL SYLLABLE SSANGTIKEUT A PIEUP + {0xB6A3, 0xB543}, //9099 #HANGUL SYLLABLE SSANGTIKEUT A SIOS + {0xB6A4, 0xB544}, //9100 #HANGUL SYLLABLE SSANGTIKEUT A SSANGSIOS + {0xB6A5, 0xB545}, //9101 #HANGUL SYLLABLE SSANGTIKEUT A IEUNG + {0xB6A6, 0xB54B}, //9102 #HANGUL SYLLABLE SSANGTIKEUT A HIEUH + {0xB6A7, 0xB54C}, //9103 #HANGUL SYLLABLE SSANGTIKEUT AE + {0xB6A8, 0xB54D}, //9104 #HANGUL SYLLABLE SSANGTIKEUT AE KIYEOK + {0xB6A9, 0xB550}, //9105 #HANGUL SYLLABLE SSANGTIKEUT AE NIEUN + {0xB6AA, 0xB554}, //9106 #HANGUL SYLLABLE SSANGTIKEUT AE RIEUL + {0xB6AB, 0xB55C}, //9107 #HANGUL SYLLABLE SSANGTIKEUT AE MIEUM + {0xB6AC, 0xB55D}, //9108 #HANGUL SYLLABLE SSANGTIKEUT AE PIEUP + {0xB6AD, 0xB55F}, //9109 #HANGUL SYLLABLE SSANGTIKEUT AE SIOS + {0xB6AE, 0xB560}, //9110 #HANGUL SYLLABLE SSANGTIKEUT AE SSANGSIOS + {0xB6AF, 0xB561}, //9111 #HANGUL SYLLABLE SSANGTIKEUT AE IEUNG + {0xB6B0, 0xB5A0}, //9112 #HANGUL SYLLABLE SSANGTIKEUT EO + {0xB6B1, 0xB5A1}, //9113 #HANGUL SYLLABLE SSANGTIKEUT EO KIYEOK + {0xB6B2, 0xB5A4}, //9114 #HANGUL SYLLABLE SSANGTIKEUT EO NIEUN + {0xB6B3, 0xB5A8}, //9115 #HANGUL SYLLABLE SSANGTIKEUT EO RIEUL + {0xB6B4, 0xB5AA}, //9116 #HANGUL SYLLABLE SSANGTIKEUT EO RIEULMIEUM + {0xB6B5, 0xB5AB}, //9117 #HANGUL SYLLABLE SSANGTIKEUT EO RIEULPIEUP + {0xB6B6, 0xB5B0}, //9118 #HANGUL SYLLABLE SSANGTIKEUT EO MIEUM + {0xB6B7, 0xB5B1}, //9119 #HANGUL SYLLABLE SSANGTIKEUT EO PIEUP + {0xB6B8, 0xB5B3}, //9120 #HANGUL SYLLABLE SSANGTIKEUT EO SIOS + {0xB6B9, 0xB5B4}, //9121 #HANGUL SYLLABLE SSANGTIKEUT EO SSANGSIOS + {0xB6BA, 0xB5B5}, //9122 #HANGUL SYLLABLE SSANGTIKEUT EO IEUNG + {0xB6BB, 0xB5BB}, //9123 #HANGUL SYLLABLE SSANGTIKEUT EO HIEUH + {0xB6BC, 0xB5BC}, //9124 #HANGUL SYLLABLE SSANGTIKEUT E + {0xB6BD, 0xB5BD}, //9125 #HANGUL SYLLABLE SSANGTIKEUT E KIYEOK + {0xB6BE, 0xB5C0}, //9126 #HANGUL SYLLABLE SSANGTIKEUT E NIEUN + {0xB6BF, 0xB5C4}, //9127 #HANGUL SYLLABLE SSANGTIKEUT E RIEUL + {0xB6C0, 0xB5CC}, //9128 #HANGUL SYLLABLE SSANGTIKEUT E MIEUM + {0xB6C1, 0xB5CD}, //9129 #HANGUL SYLLABLE SSANGTIKEUT E PIEUP + {0xB6C2, 0xB5CF}, //9130 #HANGUL SYLLABLE SSANGTIKEUT E SIOS + {0xB6C3, 0xB5D0}, //9131 #HANGUL SYLLABLE SSANGTIKEUT E SSANGSIOS + {0xB6C4, 0xB5D1}, //9132 #HANGUL SYLLABLE SSANGTIKEUT E IEUNG + {0xB6C5, 0xB5D8}, //9133 #HANGUL SYLLABLE SSANGTIKEUT YEO + {0xB6C6, 0xB5EC}, //9134 #HANGUL SYLLABLE SSANGTIKEUT YEO SSANGSIOS + {0xB6C7, 0xB610}, //9135 #HANGUL SYLLABLE SSANGTIKEUT O + {0xB6C8, 0xB611}, //9136 #HANGUL SYLLABLE SSANGTIKEUT O KIYEOK + {0xB6C9, 0xB614}, //9137 #HANGUL SYLLABLE SSANGTIKEUT O NIEUN + {0xB6CA, 0xB618}, //9138 #HANGUL SYLLABLE SSANGTIKEUT O RIEUL + {0xB6CB, 0xB625}, //9139 #HANGUL SYLLABLE SSANGTIKEUT O IEUNG + {0xB6CC, 0xB62C}, //9140 #HANGUL SYLLABLE SSANGTIKEUT WA + {0xB6CD, 0xB634}, //9141 #HANGUL SYLLABLE SSANGTIKEUT WA RIEUL + {0xB6CE, 0xB648}, //9142 #HANGUL SYLLABLE SSANGTIKEUT WAE + {0xB6CF, 0xB664}, //9143 #HANGUL SYLLABLE SSANGTIKEUT OE + {0xB6D0, 0xB668}, //9144 #HANGUL SYLLABLE SSANGTIKEUT OE NIEUN + {0xB6D1, 0xB69C}, //9145 #HANGUL SYLLABLE SSANGTIKEUT U + {0xB6D2, 0xB69D}, //9146 #HANGUL SYLLABLE SSANGTIKEUT U KIYEOK + {0xB6D3, 0xB6A0}, //9147 #HANGUL SYLLABLE SSANGTIKEUT U NIEUN + {0xB6D4, 0xB6A4}, //9148 #HANGUL SYLLABLE SSANGTIKEUT U RIEUL + {0xB6D5, 0xB6AB}, //9149 #HANGUL SYLLABLE SSANGTIKEUT U RIEULHIEUH + {0xB6D6, 0xB6AC}, //9150 #HANGUL SYLLABLE SSANGTIKEUT U MIEUM + {0xB6D7, 0xB6B1}, //9151 #HANGUL SYLLABLE SSANGTIKEUT U IEUNG + {0xB6D8, 0xB6D4}, //9152 #HANGUL SYLLABLE SSANGTIKEUT WE + {0xB6D9, 0xB6F0}, //9153 #HANGUL SYLLABLE SSANGTIKEUT WI + {0xB6DA, 0xB6F4}, //9154 #HANGUL SYLLABLE SSANGTIKEUT WI NIEUN + {0xB6DB, 0xB6F8}, //9155 #HANGUL SYLLABLE SSANGTIKEUT WI RIEUL + {0xB6DC, 0xB700}, //9156 #HANGUL SYLLABLE SSANGTIKEUT WI MIEUM + {0xB6DD, 0xB701}, //9157 #HANGUL SYLLABLE SSANGTIKEUT WI PIEUP + {0xB6DE, 0xB705}, //9158 #HANGUL SYLLABLE SSANGTIKEUT WI IEUNG + {0xB6DF, 0xB728}, //9159 #HANGUL SYLLABLE SSANGTIKEUT EU + {0xB6E0, 0xB729}, //9160 #HANGUL SYLLABLE SSANGTIKEUT EU KIYEOK + {0xB6E1, 0xB72C}, //9161 #HANGUL SYLLABLE SSANGTIKEUT EU NIEUN + {0xB6E2, 0xB72F}, //9162 #HANGUL SYLLABLE SSANGTIKEUT EU TIKEUT + {0xB6E3, 0xB730}, //9163 #HANGUL SYLLABLE SSANGTIKEUT EU RIEUL + {0xB6E4, 0xB738}, //9164 #HANGUL SYLLABLE SSANGTIKEUT EU MIEUM + {0xB6E5, 0xB739}, //9165 #HANGUL SYLLABLE SSANGTIKEUT EU PIEUP + {0xB6E6, 0xB73B}, //9166 #HANGUL SYLLABLE SSANGTIKEUT EU SIOS + {0xB6E7, 0xB744}, //9167 #HANGUL SYLLABLE SSANGTIKEUT YI + {0xB6E8, 0xB748}, //9168 #HANGUL SYLLABLE SSANGTIKEUT YI NIEUN + {0xB6E9, 0xB74C}, //9169 #HANGUL SYLLABLE SSANGTIKEUT YI RIEUL + {0xB6EA, 0xB754}, //9170 #HANGUL SYLLABLE SSANGTIKEUT YI MIEUM + {0xB6EB, 0xB755}, //9171 #HANGUL SYLLABLE SSANGTIKEUT YI PIEUP + {0xB6EC, 0xB760}, //9172 #HANGUL SYLLABLE SSANGTIKEUT I + {0xB6ED, 0xB764}, //9173 #HANGUL SYLLABLE SSANGTIKEUT I NIEUN + {0xB6EE, 0xB768}, //9174 #HANGUL SYLLABLE SSANGTIKEUT I RIEUL + {0xB6EF, 0xB770}, //9175 #HANGUL SYLLABLE SSANGTIKEUT I MIEUM + {0xB6F0, 0xB771}, //9176 #HANGUL SYLLABLE SSANGTIKEUT I PIEUP + {0xB6F1, 0xB773}, //9177 #HANGUL SYLLABLE SSANGTIKEUT I SIOS + {0xB6F2, 0xB775}, //9178 #HANGUL SYLLABLE SSANGTIKEUT I IEUNG + {0xB6F3, 0xB77C}, //9179 #HANGUL SYLLABLE RIEUL A + {0xB6F4, 0xB77D}, //9180 #HANGUL SYLLABLE RIEUL A KIYEOK + {0xB6F5, 0xB780}, //9181 #HANGUL SYLLABLE RIEUL A NIEUN + {0xB6F6, 0xB784}, //9182 #HANGUL SYLLABLE RIEUL A RIEUL + {0xB6F7, 0xB78C}, //9183 #HANGUL SYLLABLE RIEUL A MIEUM + {0xB6F8, 0xB78D}, //9184 #HANGUL SYLLABLE RIEUL A PIEUP + {0xB6F9, 0xB78F}, //9185 #HANGUL SYLLABLE RIEUL A SIOS + {0xB6FA, 0xB790}, //9186 #HANGUL SYLLABLE RIEUL A SSANGSIOS + {0xB6FB, 0xB791}, //9187 #HANGUL SYLLABLE RIEUL A IEUNG + {0xB6FC, 0xB792}, //9188 #HANGUL SYLLABLE RIEUL A CIEUC + {0xB6FD, 0xB796}, //9189 #HANGUL SYLLABLE RIEUL A PHIEUPH + {0xB6FE, 0xB797}, //9190 #HANGUL SYLLABLE RIEUL A HIEUH + {0xB741, 0xD16E}, //9191 #HANGUL SYLLABLE THIEUTH YEO NIEUNHIEUH + {0xB742, 0xD16F}, //9192 #HANGUL SYLLABLE THIEUTH YEO TIKEUT + {0xB743, 0xD170}, //9193 #HANGUL SYLLABLE THIEUTH YEO RIEUL + {0xB744, 0xD171}, //9194 #HANGUL SYLLABLE THIEUTH YEO RIEULKIYEOK + {0xB745, 0xD172}, //9195 #HANGUL SYLLABLE THIEUTH YEO RIEULMIEUM + {0xB746, 0xD173}, //9196 #HANGUL SYLLABLE THIEUTH YEO RIEULPIEUP + {0xB747, 0xD174}, //9197 #HANGUL SYLLABLE THIEUTH YEO RIEULSIOS + {0xB748, 0xD175}, //9198 #HANGUL SYLLABLE THIEUTH YEO RIEULTHIEUTH + {0xB749, 0xD176}, //9199 #HANGUL SYLLABLE THIEUTH YEO RIEULPHIEUPH + {0xB74A, 0xD177}, //9200 #HANGUL SYLLABLE THIEUTH YEO RIEULHIEUH + {0xB74B, 0xD178}, //9201 #HANGUL SYLLABLE THIEUTH YEO MIEUM + {0xB74C, 0xD179}, //9202 #HANGUL SYLLABLE THIEUTH YEO PIEUP + {0xB74D, 0xD17A}, //9203 #HANGUL SYLLABLE THIEUTH YEO PIEUPSIOS + {0xB74E, 0xD17B}, //9204 #HANGUL SYLLABLE THIEUTH YEO SIOS + {0xB74F, 0xD17D}, //9205 #HANGUL SYLLABLE THIEUTH YEO IEUNG + {0xB750, 0xD17E}, //9206 #HANGUL SYLLABLE THIEUTH YEO CIEUC + {0xB751, 0xD17F}, //9207 #HANGUL SYLLABLE THIEUTH YEO CHIEUCH + {0xB752, 0xD180}, //9208 #HANGUL SYLLABLE THIEUTH YEO KHIEUKH + {0xB753, 0xD181}, //9209 #HANGUL SYLLABLE THIEUTH YEO THIEUTH + {0xB754, 0xD182}, //9210 #HANGUL SYLLABLE THIEUTH YEO PHIEUPH + {0xB755, 0xD183}, //9211 #HANGUL SYLLABLE THIEUTH YEO HIEUH + {0xB756, 0xD185}, //9212 #HANGUL SYLLABLE THIEUTH YE KIYEOK + {0xB757, 0xD186}, //9213 #HANGUL SYLLABLE THIEUTH YE SSANGKIYEOK + {0xB758, 0xD187}, //9214 #HANGUL SYLLABLE THIEUTH YE KIYEOKSIOS + {0xB759, 0xD189}, //9215 #HANGUL SYLLABLE THIEUTH YE NIEUNCIEUC + {0xB75A, 0xD18A}, //9216 #HANGUL SYLLABLE THIEUTH YE NIEUNHIEUH + {0xB761, 0xD18B}, //9217 #HANGUL SYLLABLE THIEUTH YE TIKEUT + {0xB762, 0xD18C}, //9218 #HANGUL SYLLABLE THIEUTH YE RIEUL + {0xB763, 0xD18D}, //9219 #HANGUL SYLLABLE THIEUTH YE RIEULKIYEOK + {0xB764, 0xD18E}, //9220 #HANGUL SYLLABLE THIEUTH YE RIEULMIEUM + {0xB765, 0xD18F}, //9221 #HANGUL SYLLABLE THIEUTH YE RIEULPIEUP + {0xB766, 0xD190}, //9222 #HANGUL SYLLABLE THIEUTH YE RIEULSIOS + {0xB767, 0xD191}, //9223 #HANGUL SYLLABLE THIEUTH YE RIEULTHIEUTH + {0xB768, 0xD192}, //9224 #HANGUL SYLLABLE THIEUTH YE RIEULPHIEUPH + {0xB769, 0xD193}, //9225 #HANGUL SYLLABLE THIEUTH YE RIEULHIEUH + {0xB76A, 0xD194}, //9226 #HANGUL SYLLABLE THIEUTH YE MIEUM + {0xB76B, 0xD195}, //9227 #HANGUL SYLLABLE THIEUTH YE PIEUP + {0xB76C, 0xD196}, //9228 #HANGUL SYLLABLE THIEUTH YE PIEUPSIOS + {0xB76D, 0xD197}, //9229 #HANGUL SYLLABLE THIEUTH YE SIOS + {0xB76E, 0xD198}, //9230 #HANGUL SYLLABLE THIEUTH YE SSANGSIOS + {0xB76F, 0xD199}, //9231 #HANGUL SYLLABLE THIEUTH YE IEUNG + {0xB770, 0xD19A}, //9232 #HANGUL SYLLABLE THIEUTH YE CIEUC + {0xB771, 0xD19B}, //9233 #HANGUL SYLLABLE THIEUTH YE CHIEUCH + {0xB772, 0xD19C}, //9234 #HANGUL SYLLABLE THIEUTH YE KHIEUKH + {0xB773, 0xD19D}, //9235 #HANGUL SYLLABLE THIEUTH YE THIEUTH + {0xB774, 0xD19E}, //9236 #HANGUL SYLLABLE THIEUTH YE PHIEUPH + {0xB775, 0xD19F}, //9237 #HANGUL SYLLABLE THIEUTH YE HIEUH + {0xB776, 0xD1A2}, //9238 #HANGUL SYLLABLE THIEUTH O SSANGKIYEOK + {0xB777, 0xD1A3}, //9239 #HANGUL SYLLABLE THIEUTH O KIYEOKSIOS + {0xB778, 0xD1A5}, //9240 #HANGUL SYLLABLE THIEUTH O NIEUNCIEUC + {0xB779, 0xD1A6}, //9241 #HANGUL SYLLABLE THIEUTH O NIEUNHIEUH + {0xB77A, 0xD1A7}, //9242 #HANGUL SYLLABLE THIEUTH O TIKEUT + {0xB781, 0xD1A9}, //9243 #HANGUL SYLLABLE THIEUTH O RIEULKIYEOK + {0xB782, 0xD1AA}, //9244 #HANGUL SYLLABLE THIEUTH O RIEULMIEUM + {0xB783, 0xD1AB}, //9245 #HANGUL SYLLABLE THIEUTH O RIEULPIEUP + {0xB784, 0xD1AC}, //9246 #HANGUL SYLLABLE THIEUTH O RIEULSIOS + {0xB785, 0xD1AD}, //9247 #HANGUL SYLLABLE THIEUTH O RIEULTHIEUTH + {0xB786, 0xD1AE}, //9248 #HANGUL SYLLABLE THIEUTH O RIEULPHIEUPH + {0xB787, 0xD1AF}, //9249 #HANGUL SYLLABLE THIEUTH O RIEULHIEUH + {0xB788, 0xD1B2}, //9250 #HANGUL SYLLABLE THIEUTH O PIEUPSIOS + {0xB789, 0xD1B4}, //9251 #HANGUL SYLLABLE THIEUTH O SSANGSIOS + {0xB78A, 0xD1B6}, //9252 #HANGUL SYLLABLE THIEUTH O CIEUC + {0xB78B, 0xD1B7}, //9253 #HANGUL SYLLABLE THIEUTH O CHIEUCH + {0xB78C, 0xD1B8}, //9254 #HANGUL SYLLABLE THIEUTH O KHIEUKH + {0xB78D, 0xD1B9}, //9255 #HANGUL SYLLABLE THIEUTH O THIEUTH + {0xB78E, 0xD1BB}, //9256 #HANGUL SYLLABLE THIEUTH O HIEUH + {0xB78F, 0xD1BD}, //9257 #HANGUL SYLLABLE THIEUTH WA KIYEOK + {0xB790, 0xD1BE}, //9258 #HANGUL SYLLABLE THIEUTH WA SSANGKIYEOK + {0xB791, 0xD1BF}, //9259 #HANGUL SYLLABLE THIEUTH WA KIYEOKSIOS + {0xB792, 0xD1C1}, //9260 #HANGUL SYLLABLE THIEUTH WA NIEUNCIEUC + {0xB793, 0xD1C2}, //9261 #HANGUL SYLLABLE THIEUTH WA NIEUNHIEUH + {0xB794, 0xD1C3}, //9262 #HANGUL SYLLABLE THIEUTH WA TIKEUT + {0xB795, 0xD1C4}, //9263 #HANGUL SYLLABLE THIEUTH WA RIEUL + {0xB796, 0xD1C5}, //9264 #HANGUL SYLLABLE THIEUTH WA RIEULKIYEOK + {0xB797, 0xD1C6}, //9265 #HANGUL SYLLABLE THIEUTH WA RIEULMIEUM + {0xB798, 0xD1C7}, //9266 #HANGUL SYLLABLE THIEUTH WA RIEULPIEUP + {0xB799, 0xD1C8}, //9267 #HANGUL SYLLABLE THIEUTH WA RIEULSIOS + {0xB79A, 0xD1C9}, //9268 #HANGUL SYLLABLE THIEUTH WA RIEULTHIEUTH + {0xB79B, 0xD1CA}, //9269 #HANGUL SYLLABLE THIEUTH WA RIEULPHIEUPH + {0xB79C, 0xD1CB}, //9270 #HANGUL SYLLABLE THIEUTH WA RIEULHIEUH + {0xB79D, 0xD1CC}, //9271 #HANGUL SYLLABLE THIEUTH WA MIEUM + {0xB79E, 0xD1CD}, //9272 #HANGUL SYLLABLE THIEUTH WA PIEUP + {0xB79F, 0xD1CE}, //9273 #HANGUL SYLLABLE THIEUTH WA PIEUPSIOS + {0xB7A0, 0xD1CF}, //9274 #HANGUL SYLLABLE THIEUTH WA SIOS + {0xB7A1, 0xB798}, //9275 #HANGUL SYLLABLE RIEUL AE + {0xB7A2, 0xB799}, //9276 #HANGUL SYLLABLE RIEUL AE KIYEOK + {0xB7A3, 0xB79C}, //9277 #HANGUL SYLLABLE RIEUL AE NIEUN + {0xB7A4, 0xB7A0}, //9278 #HANGUL SYLLABLE RIEUL AE RIEUL + {0xB7A5, 0xB7A8}, //9279 #HANGUL SYLLABLE RIEUL AE MIEUM + {0xB7A6, 0xB7A9}, //9280 #HANGUL SYLLABLE RIEUL AE PIEUP + {0xB7A7, 0xB7AB}, //9281 #HANGUL SYLLABLE RIEUL AE SIOS + {0xB7A8, 0xB7AC}, //9282 #HANGUL SYLLABLE RIEUL AE SSANGSIOS + {0xB7A9, 0xB7AD}, //9283 #HANGUL SYLLABLE RIEUL AE IEUNG + {0xB7AA, 0xB7B4}, //9284 #HANGUL SYLLABLE RIEUL YA + {0xB7AB, 0xB7B5}, //9285 #HANGUL SYLLABLE RIEUL YA KIYEOK + {0xB7AC, 0xB7B8}, //9286 #HANGUL SYLLABLE RIEUL YA NIEUN + {0xB7AD, 0xB7C7}, //9287 #HANGUL SYLLABLE RIEUL YA SIOS + {0xB7AE, 0xB7C9}, //9288 #HANGUL SYLLABLE RIEUL YA IEUNG + {0xB7AF, 0xB7EC}, //9289 #HANGUL SYLLABLE RIEUL EO + {0xB7B0, 0xB7ED}, //9290 #HANGUL SYLLABLE RIEUL EO KIYEOK + {0xB7B1, 0xB7F0}, //9291 #HANGUL SYLLABLE RIEUL EO NIEUN + {0xB7B2, 0xB7F4}, //9292 #HANGUL SYLLABLE RIEUL EO RIEUL + {0xB7B3, 0xB7FC}, //9293 #HANGUL SYLLABLE RIEUL EO MIEUM + {0xB7B4, 0xB7FD}, //9294 #HANGUL SYLLABLE RIEUL EO PIEUP + {0xB7B5, 0xB7FF}, //9295 #HANGUL SYLLABLE RIEUL EO SIOS + {0xB7B6, 0xB800}, //9296 #HANGUL SYLLABLE RIEUL EO SSANGSIOS + {0xB7B7, 0xB801}, //9297 #HANGUL SYLLABLE RIEUL EO IEUNG + {0xB7B8, 0xB807}, //9298 #HANGUL SYLLABLE RIEUL EO HIEUH + {0xB7B9, 0xB808}, //9299 #HANGUL SYLLABLE RIEUL E + {0xB7BA, 0xB809}, //9300 #HANGUL SYLLABLE RIEUL E KIYEOK + {0xB7BB, 0xB80C}, //9301 #HANGUL SYLLABLE RIEUL E NIEUN + {0xB7BC, 0xB810}, //9302 #HANGUL SYLLABLE RIEUL E RIEUL + {0xB7BD, 0xB818}, //9303 #HANGUL SYLLABLE RIEUL E MIEUM + {0xB7BE, 0xB819}, //9304 #HANGUL SYLLABLE RIEUL E PIEUP + {0xB7BF, 0xB81B}, //9305 #HANGUL SYLLABLE RIEUL E SIOS + {0xB7C0, 0xB81D}, //9306 #HANGUL SYLLABLE RIEUL E IEUNG + {0xB7C1, 0xB824}, //9307 #HANGUL SYLLABLE RIEUL YEO + {0xB7C2, 0xB825}, //9308 #HANGUL SYLLABLE RIEUL YEO KIYEOK + {0xB7C3, 0xB828}, //9309 #HANGUL SYLLABLE RIEUL YEO NIEUN + {0xB7C4, 0xB82C}, //9310 #HANGUL SYLLABLE RIEUL YEO RIEUL + {0xB7C5, 0xB834}, //9311 #HANGUL SYLLABLE RIEUL YEO MIEUM + {0xB7C6, 0xB835}, //9312 #HANGUL SYLLABLE RIEUL YEO PIEUP + {0xB7C7, 0xB837}, //9313 #HANGUL SYLLABLE RIEUL YEO SIOS + {0xB7C8, 0xB838}, //9314 #HANGUL SYLLABLE RIEUL YEO SSANGSIOS + {0xB7C9, 0xB839}, //9315 #HANGUL SYLLABLE RIEUL YEO IEUNG + {0xB7CA, 0xB840}, //9316 #HANGUL SYLLABLE RIEUL YE + {0xB7CB, 0xB844}, //9317 #HANGUL SYLLABLE RIEUL YE NIEUN + {0xB7CC, 0xB851}, //9318 #HANGUL SYLLABLE RIEUL YE PIEUP + {0xB7CD, 0xB853}, //9319 #HANGUL SYLLABLE RIEUL YE SIOS + {0xB7CE, 0xB85C}, //9320 #HANGUL SYLLABLE RIEUL O + {0xB7CF, 0xB85D}, //9321 #HANGUL SYLLABLE RIEUL O KIYEOK + {0xB7D0, 0xB860}, //9322 #HANGUL SYLLABLE RIEUL O NIEUN + {0xB7D1, 0xB864}, //9323 #HANGUL SYLLABLE RIEUL O RIEUL + {0xB7D2, 0xB86C}, //9324 #HANGUL SYLLABLE RIEUL O MIEUM + {0xB7D3, 0xB86D}, //9325 #HANGUL SYLLABLE RIEUL O PIEUP + {0xB7D4, 0xB86F}, //9326 #HANGUL SYLLABLE RIEUL O SIOS + {0xB7D5, 0xB871}, //9327 #HANGUL SYLLABLE RIEUL O IEUNG + {0xB7D6, 0xB878}, //9328 #HANGUL SYLLABLE RIEUL WA + {0xB7D7, 0xB87C}, //9329 #HANGUL SYLLABLE RIEUL WA NIEUN + {0xB7D8, 0xB88D}, //9330 #HANGUL SYLLABLE RIEUL WA IEUNG + {0xB7D9, 0xB8A8}, //9331 #HANGUL SYLLABLE RIEUL WAE SSANGSIOS + {0xB7DA, 0xB8B0}, //9332 #HANGUL SYLLABLE RIEUL OE + {0xB7DB, 0xB8B4}, //9333 #HANGUL SYLLABLE RIEUL OE NIEUN + {0xB7DC, 0xB8B8}, //9334 #HANGUL SYLLABLE RIEUL OE RIEUL + {0xB7DD, 0xB8C0}, //9335 #HANGUL SYLLABLE RIEUL OE MIEUM + {0xB7DE, 0xB8C1}, //9336 #HANGUL SYLLABLE RIEUL OE PIEUP + {0xB7DF, 0xB8C3}, //9337 #HANGUL SYLLABLE RIEUL OE SIOS + {0xB7E0, 0xB8C5}, //9338 #HANGUL SYLLABLE RIEUL OE IEUNG + {0xB7E1, 0xB8CC}, //9339 #HANGUL SYLLABLE RIEUL YO + {0xB7E2, 0xB8D0}, //9340 #HANGUL SYLLABLE RIEUL YO NIEUN + {0xB7E3, 0xB8D4}, //9341 #HANGUL SYLLABLE RIEUL YO RIEUL + {0xB7E4, 0xB8DD}, //9342 #HANGUL SYLLABLE RIEUL YO PIEUP + {0xB7E5, 0xB8DF}, //9343 #HANGUL SYLLABLE RIEUL YO SIOS + {0xB7E6, 0xB8E1}, //9344 #HANGUL SYLLABLE RIEUL YO IEUNG + {0xB7E7, 0xB8E8}, //9345 #HANGUL SYLLABLE RIEUL U + {0xB7E8, 0xB8E9}, //9346 #HANGUL SYLLABLE RIEUL U KIYEOK + {0xB7E9, 0xB8EC}, //9347 #HANGUL SYLLABLE RIEUL U NIEUN + {0xB7EA, 0xB8F0}, //9348 #HANGUL SYLLABLE RIEUL U RIEUL + {0xB7EB, 0xB8F8}, //9349 #HANGUL SYLLABLE RIEUL U MIEUM + {0xB7EC, 0xB8F9}, //9350 #HANGUL SYLLABLE RIEUL U PIEUP + {0xB7ED, 0xB8FB}, //9351 #HANGUL SYLLABLE RIEUL U SIOS + {0xB7EE, 0xB8FD}, //9352 #HANGUL SYLLABLE RIEUL U IEUNG + {0xB7EF, 0xB904}, //9353 #HANGUL SYLLABLE RIEUL WEO + {0xB7F0, 0xB918}, //9354 #HANGUL SYLLABLE RIEUL WEO SSANGSIOS + {0xB7F1, 0xB920}, //9355 #HANGUL SYLLABLE RIEUL WE + {0xB7F2, 0xB93C}, //9356 #HANGUL SYLLABLE RIEUL WI + {0xB7F3, 0xB93D}, //9357 #HANGUL SYLLABLE RIEUL WI KIYEOK + {0xB7F4, 0xB940}, //9358 #HANGUL SYLLABLE RIEUL WI NIEUN + {0xB7F5, 0xB944}, //9359 #HANGUL SYLLABLE RIEUL WI RIEUL + {0xB7F6, 0xB94C}, //9360 #HANGUL SYLLABLE RIEUL WI MIEUM + {0xB7F7, 0xB94F}, //9361 #HANGUL SYLLABLE RIEUL WI SIOS + {0xB7F8, 0xB951}, //9362 #HANGUL SYLLABLE RIEUL WI IEUNG + {0xB7F9, 0xB958}, //9363 #HANGUL SYLLABLE RIEUL YU + {0xB7FA, 0xB959}, //9364 #HANGUL SYLLABLE RIEUL YU KIYEOK + {0xB7FB, 0xB95C}, //9365 #HANGUL SYLLABLE RIEUL YU NIEUN + {0xB7FC, 0xB960}, //9366 #HANGUL SYLLABLE RIEUL YU RIEUL + {0xB7FD, 0xB968}, //9367 #HANGUL SYLLABLE RIEUL YU MIEUM + {0xB7FE, 0xB969}, //9368 #HANGUL SYLLABLE RIEUL YU PIEUP + {0xB841, 0xD1D0}, //9369 #HANGUL SYLLABLE THIEUTH WA SSANGSIOS + {0xB842, 0xD1D1}, //9370 #HANGUL SYLLABLE THIEUTH WA IEUNG + {0xB843, 0xD1D2}, //9371 #HANGUL SYLLABLE THIEUTH WA CIEUC + {0xB844, 0xD1D3}, //9372 #HANGUL SYLLABLE THIEUTH WA CHIEUCH + {0xB845, 0xD1D4}, //9373 #HANGUL SYLLABLE THIEUTH WA KHIEUKH + {0xB846, 0xD1D5}, //9374 #HANGUL SYLLABLE THIEUTH WA THIEUTH + {0xB847, 0xD1D6}, //9375 #HANGUL SYLLABLE THIEUTH WA PHIEUPH + {0xB848, 0xD1D7}, //9376 #HANGUL SYLLABLE THIEUTH WA HIEUH + {0xB849, 0xD1D9}, //9377 #HANGUL SYLLABLE THIEUTH WAE KIYEOK + {0xB84A, 0xD1DA}, //9378 #HANGUL SYLLABLE THIEUTH WAE SSANGKIYEOK + {0xB84B, 0xD1DB}, //9379 #HANGUL SYLLABLE THIEUTH WAE KIYEOKSIOS + {0xB84C, 0xD1DC}, //9380 #HANGUL SYLLABLE THIEUTH WAE NIEUN + {0xB84D, 0xD1DD}, //9381 #HANGUL SYLLABLE THIEUTH WAE NIEUNCIEUC + {0xB84E, 0xD1DE}, //9382 #HANGUL SYLLABLE THIEUTH WAE NIEUNHIEUH + {0xB84F, 0xD1DF}, //9383 #HANGUL SYLLABLE THIEUTH WAE TIKEUT + {0xB850, 0xD1E0}, //9384 #HANGUL SYLLABLE THIEUTH WAE RIEUL + {0xB851, 0xD1E1}, //9385 #HANGUL SYLLABLE THIEUTH WAE RIEULKIYEOK + {0xB852, 0xD1E2}, //9386 #HANGUL SYLLABLE THIEUTH WAE RIEULMIEUM + {0xB853, 0xD1E3}, //9387 #HANGUL SYLLABLE THIEUTH WAE RIEULPIEUP + {0xB854, 0xD1E4}, //9388 #HANGUL SYLLABLE THIEUTH WAE RIEULSIOS + {0xB855, 0xD1E5}, //9389 #HANGUL SYLLABLE THIEUTH WAE RIEULTHIEUTH + {0xB856, 0xD1E6}, //9390 #HANGUL SYLLABLE THIEUTH WAE RIEULPHIEUPH + {0xB857, 0xD1E7}, //9391 #HANGUL SYLLABLE THIEUTH WAE RIEULHIEUH + {0xB858, 0xD1E8}, //9392 #HANGUL SYLLABLE THIEUTH WAE MIEUM + {0xB859, 0xD1E9}, //9393 #HANGUL SYLLABLE THIEUTH WAE PIEUP + {0xB85A, 0xD1EA}, //9394 #HANGUL SYLLABLE THIEUTH WAE PIEUPSIOS + {0xB861, 0xD1EB}, //9395 #HANGUL SYLLABLE THIEUTH WAE SIOS + {0xB862, 0xD1EC}, //9396 #HANGUL SYLLABLE THIEUTH WAE SSANGSIOS + {0xB863, 0xD1ED}, //9397 #HANGUL SYLLABLE THIEUTH WAE IEUNG + {0xB864, 0xD1EE}, //9398 #HANGUL SYLLABLE THIEUTH WAE CIEUC + {0xB865, 0xD1EF}, //9399 #HANGUL SYLLABLE THIEUTH WAE CHIEUCH + {0xB866, 0xD1F0}, //9400 #HANGUL SYLLABLE THIEUTH WAE KHIEUKH + {0xB867, 0xD1F1}, //9401 #HANGUL SYLLABLE THIEUTH WAE THIEUTH + {0xB868, 0xD1F2}, //9402 #HANGUL SYLLABLE THIEUTH WAE PHIEUPH + {0xB869, 0xD1F3}, //9403 #HANGUL SYLLABLE THIEUTH WAE HIEUH + {0xB86A, 0xD1F5}, //9404 #HANGUL SYLLABLE THIEUTH OE KIYEOK + {0xB86B, 0xD1F6}, //9405 #HANGUL SYLLABLE THIEUTH OE SSANGKIYEOK + {0xB86C, 0xD1F7}, //9406 #HANGUL SYLLABLE THIEUTH OE KIYEOKSIOS + {0xB86D, 0xD1F9}, //9407 #HANGUL SYLLABLE THIEUTH OE NIEUNCIEUC + {0xB86E, 0xD1FA}, //9408 #HANGUL SYLLABLE THIEUTH OE NIEUNHIEUH + {0xB86F, 0xD1FB}, //9409 #HANGUL SYLLABLE THIEUTH OE TIKEUT + {0xB870, 0xD1FC}, //9410 #HANGUL SYLLABLE THIEUTH OE RIEUL + {0xB871, 0xD1FD}, //9411 #HANGUL SYLLABLE THIEUTH OE RIEULKIYEOK + {0xB872, 0xD1FE}, //9412 #HANGUL SYLLABLE THIEUTH OE RIEULMIEUM + {0xB873, 0xD1FF}, //9413 #HANGUL SYLLABLE THIEUTH OE RIEULPIEUP + {0xB874, 0xD200}, //9414 #HANGUL SYLLABLE THIEUTH OE RIEULSIOS + {0xB875, 0xD201}, //9415 #HANGUL SYLLABLE THIEUTH OE RIEULTHIEUTH + {0xB876, 0xD202}, //9416 #HANGUL SYLLABLE THIEUTH OE RIEULPHIEUPH + {0xB877, 0xD203}, //9417 #HANGUL SYLLABLE THIEUTH OE RIEULHIEUH + {0xB878, 0xD204}, //9418 #HANGUL SYLLABLE THIEUTH OE MIEUM + {0xB879, 0xD205}, //9419 #HANGUL SYLLABLE THIEUTH OE PIEUP + {0xB87A, 0xD206}, //9420 #HANGUL SYLLABLE THIEUTH OE PIEUPSIOS + {0xB881, 0xD208}, //9421 #HANGUL SYLLABLE THIEUTH OE SSANGSIOS + {0xB882, 0xD20A}, //9422 #HANGUL SYLLABLE THIEUTH OE CIEUC + {0xB883, 0xD20B}, //9423 #HANGUL SYLLABLE THIEUTH OE CHIEUCH + {0xB884, 0xD20C}, //9424 #HANGUL SYLLABLE THIEUTH OE KHIEUKH + {0xB885, 0xD20D}, //9425 #HANGUL SYLLABLE THIEUTH OE THIEUTH + {0xB886, 0xD20E}, //9426 #HANGUL SYLLABLE THIEUTH OE PHIEUPH + {0xB887, 0xD20F}, //9427 #HANGUL SYLLABLE THIEUTH OE HIEUH + {0xB888, 0xD211}, //9428 #HANGUL SYLLABLE THIEUTH YO KIYEOK + {0xB889, 0xD212}, //9429 #HANGUL SYLLABLE THIEUTH YO SSANGKIYEOK + {0xB88A, 0xD213}, //9430 #HANGUL SYLLABLE THIEUTH YO KIYEOKSIOS + {0xB88B, 0xD214}, //9431 #HANGUL SYLLABLE THIEUTH YO NIEUN + {0xB88C, 0xD215}, //9432 #HANGUL SYLLABLE THIEUTH YO NIEUNCIEUC + {0xB88D, 0xD216}, //9433 #HANGUL SYLLABLE THIEUTH YO NIEUNHIEUH + {0xB88E, 0xD217}, //9434 #HANGUL SYLLABLE THIEUTH YO TIKEUT + {0xB88F, 0xD218}, //9435 #HANGUL SYLLABLE THIEUTH YO RIEUL + {0xB890, 0xD219}, //9436 #HANGUL SYLLABLE THIEUTH YO RIEULKIYEOK + {0xB891, 0xD21A}, //9437 #HANGUL SYLLABLE THIEUTH YO RIEULMIEUM + {0xB892, 0xD21B}, //9438 #HANGUL SYLLABLE THIEUTH YO RIEULPIEUP + {0xB893, 0xD21C}, //9439 #HANGUL SYLLABLE THIEUTH YO RIEULSIOS + {0xB894, 0xD21D}, //9440 #HANGUL SYLLABLE THIEUTH YO RIEULTHIEUTH + {0xB895, 0xD21E}, //9441 #HANGUL SYLLABLE THIEUTH YO RIEULPHIEUPH + {0xB896, 0xD21F}, //9442 #HANGUL SYLLABLE THIEUTH YO RIEULHIEUH + {0xB897, 0xD220}, //9443 #HANGUL SYLLABLE THIEUTH YO MIEUM + {0xB898, 0xD221}, //9444 #HANGUL SYLLABLE THIEUTH YO PIEUP + {0xB899, 0xD222}, //9445 #HANGUL SYLLABLE THIEUTH YO PIEUPSIOS + {0xB89A, 0xD223}, //9446 #HANGUL SYLLABLE THIEUTH YO SIOS + {0xB89B, 0xD224}, //9447 #HANGUL SYLLABLE THIEUTH YO SSANGSIOS + {0xB89C, 0xD225}, //9448 #HANGUL SYLLABLE THIEUTH YO IEUNG + {0xB89D, 0xD226}, //9449 #HANGUL SYLLABLE THIEUTH YO CIEUC + {0xB89E, 0xD227}, //9450 #HANGUL SYLLABLE THIEUTH YO CHIEUCH + {0xB89F, 0xD228}, //9451 #HANGUL SYLLABLE THIEUTH YO KHIEUKH + {0xB8A0, 0xD229}, //9452 #HANGUL SYLLABLE THIEUTH YO THIEUTH + {0xB8A1, 0xB96B}, //9453 #HANGUL SYLLABLE RIEUL YU SIOS + {0xB8A2, 0xB96D}, //9454 #HANGUL SYLLABLE RIEUL YU IEUNG + {0xB8A3, 0xB974}, //9455 #HANGUL SYLLABLE RIEUL EU + {0xB8A4, 0xB975}, //9456 #HANGUL SYLLABLE RIEUL EU KIYEOK + {0xB8A5, 0xB978}, //9457 #HANGUL SYLLABLE RIEUL EU NIEUN + {0xB8A6, 0xB97C}, //9458 #HANGUL SYLLABLE RIEUL EU RIEUL + {0xB8A7, 0xB984}, //9459 #HANGUL SYLLABLE RIEUL EU MIEUM + {0xB8A8, 0xB985}, //9460 #HANGUL SYLLABLE RIEUL EU PIEUP + {0xB8A9, 0xB987}, //9461 #HANGUL SYLLABLE RIEUL EU SIOS + {0xB8AA, 0xB989}, //9462 #HANGUL SYLLABLE RIEUL EU IEUNG + {0xB8AB, 0xB98A}, //9463 #HANGUL SYLLABLE RIEUL EU CIEUC + {0xB8AC, 0xB98D}, //9464 #HANGUL SYLLABLE RIEUL EU THIEUTH + {0xB8AD, 0xB98E}, //9465 #HANGUL SYLLABLE RIEUL EU PHIEUPH + {0xB8AE, 0xB9AC}, //9466 #HANGUL SYLLABLE RIEUL I + {0xB8AF, 0xB9AD}, //9467 #HANGUL SYLLABLE RIEUL I KIYEOK + {0xB8B0, 0xB9B0}, //9468 #HANGUL SYLLABLE RIEUL I NIEUN + {0xB8B1, 0xB9B4}, //9469 #HANGUL SYLLABLE RIEUL I RIEUL + {0xB8B2, 0xB9BC}, //9470 #HANGUL SYLLABLE RIEUL I MIEUM + {0xB8B3, 0xB9BD}, //9471 #HANGUL SYLLABLE RIEUL I PIEUP + {0xB8B4, 0xB9BF}, //9472 #HANGUL SYLLABLE RIEUL I SIOS + {0xB8B5, 0xB9C1}, //9473 #HANGUL SYLLABLE RIEUL I IEUNG + {0xB8B6, 0xB9C8}, //9474 #HANGUL SYLLABLE MIEUM A + {0xB8B7, 0xB9C9}, //9475 #HANGUL SYLLABLE MIEUM A KIYEOK + {0xB8B8, 0xB9CC}, //9476 #HANGUL SYLLABLE MIEUM A NIEUN + {0xB8B9, 0xB9CE}, //9477 #HANGUL SYLLABLE MIEUM A NIEUNHIEUH + {0xB8BA, 0xB9CF}, //9478 #HANGUL SYLLABLE MIEUM A TIKEUT + {0xB8BB, 0xB9D0}, //9479 #HANGUL SYLLABLE MIEUM A RIEUL + {0xB8BC, 0xB9D1}, //9480 #HANGUL SYLLABLE MIEUM A RIEULKIYEOK + {0xB8BD, 0xB9D2}, //9481 #HANGUL SYLLABLE MIEUM A RIEULMIEUM + {0xB8BE, 0xB9D8}, //9482 #HANGUL SYLLABLE MIEUM A MIEUM + {0xB8BF, 0xB9D9}, //9483 #HANGUL SYLLABLE MIEUM A PIEUP + {0xB8C0, 0xB9DB}, //9484 #HANGUL SYLLABLE MIEUM A SIOS + {0xB8C1, 0xB9DD}, //9485 #HANGUL SYLLABLE MIEUM A IEUNG + {0xB8C2, 0xB9DE}, //9486 #HANGUL SYLLABLE MIEUM A CIEUC + {0xB8C3, 0xB9E1}, //9487 #HANGUL SYLLABLE MIEUM A THIEUTH + {0xB8C4, 0xB9E3}, //9488 #HANGUL SYLLABLE MIEUM A HIEUH + {0xB8C5, 0xB9E4}, //9489 #HANGUL SYLLABLE MIEUM AE + {0xB8C6, 0xB9E5}, //9490 #HANGUL SYLLABLE MIEUM AE KIYEOK + {0xB8C7, 0xB9E8}, //9491 #HANGUL SYLLABLE MIEUM AE NIEUN + {0xB8C8, 0xB9EC}, //9492 #HANGUL SYLLABLE MIEUM AE RIEUL + {0xB8C9, 0xB9F4}, //9493 #HANGUL SYLLABLE MIEUM AE MIEUM + {0xB8CA, 0xB9F5}, //9494 #HANGUL SYLLABLE MIEUM AE PIEUP + {0xB8CB, 0xB9F7}, //9495 #HANGUL SYLLABLE MIEUM AE SIOS + {0xB8CC, 0xB9F8}, //9496 #HANGUL SYLLABLE MIEUM AE SSANGSIOS + {0xB8CD, 0xB9F9}, //9497 #HANGUL SYLLABLE MIEUM AE IEUNG + {0xB8CE, 0xB9FA}, //9498 #HANGUL SYLLABLE MIEUM AE CIEUC + {0xB8CF, 0xBA00}, //9499 #HANGUL SYLLABLE MIEUM YA + {0xB8D0, 0xBA01}, //9500 #HANGUL SYLLABLE MIEUM YA KIYEOK + {0xB8D1, 0xBA08}, //9501 #HANGUL SYLLABLE MIEUM YA RIEUL + {0xB8D2, 0xBA15}, //9502 #HANGUL SYLLABLE MIEUM YA IEUNG + {0xB8D3, 0xBA38}, //9503 #HANGUL SYLLABLE MIEUM EO + {0xB8D4, 0xBA39}, //9504 #HANGUL SYLLABLE MIEUM EO KIYEOK + {0xB8D5, 0xBA3C}, //9505 #HANGUL SYLLABLE MIEUM EO NIEUN + {0xB8D6, 0xBA40}, //9506 #HANGUL SYLLABLE MIEUM EO RIEUL + {0xB8D7, 0xBA42}, //9507 #HANGUL SYLLABLE MIEUM EO RIEULMIEUM + {0xB8D8, 0xBA48}, //9508 #HANGUL SYLLABLE MIEUM EO MIEUM + {0xB8D9, 0xBA49}, //9509 #HANGUL SYLLABLE MIEUM EO PIEUP + {0xB8DA, 0xBA4B}, //9510 #HANGUL SYLLABLE MIEUM EO SIOS + {0xB8DB, 0xBA4D}, //9511 #HANGUL SYLLABLE MIEUM EO IEUNG + {0xB8DC, 0xBA4E}, //9512 #HANGUL SYLLABLE MIEUM EO CIEUC + {0xB8DD, 0xBA53}, //9513 #HANGUL SYLLABLE MIEUM EO HIEUH + {0xB8DE, 0xBA54}, //9514 #HANGUL SYLLABLE MIEUM E + {0xB8DF, 0xBA55}, //9515 #HANGUL SYLLABLE MIEUM E KIYEOK + {0xB8E0, 0xBA58}, //9516 #HANGUL SYLLABLE MIEUM E NIEUN + {0xB8E1, 0xBA5C}, //9517 #HANGUL SYLLABLE MIEUM E RIEUL + {0xB8E2, 0xBA64}, //9518 #HANGUL SYLLABLE MIEUM E MIEUM + {0xB8E3, 0xBA65}, //9519 #HANGUL SYLLABLE MIEUM E PIEUP + {0xB8E4, 0xBA67}, //9520 #HANGUL SYLLABLE MIEUM E SIOS + {0xB8E5, 0xBA68}, //9521 #HANGUL SYLLABLE MIEUM E SSANGSIOS + {0xB8E6, 0xBA69}, //9522 #HANGUL SYLLABLE MIEUM E IEUNG + {0xB8E7, 0xBA70}, //9523 #HANGUL SYLLABLE MIEUM YEO + {0xB8E8, 0xBA71}, //9524 #HANGUL SYLLABLE MIEUM YEO KIYEOK + {0xB8E9, 0xBA74}, //9525 #HANGUL SYLLABLE MIEUM YEO NIEUN + {0xB8EA, 0xBA78}, //9526 #HANGUL SYLLABLE MIEUM YEO RIEUL + {0xB8EB, 0xBA83}, //9527 #HANGUL SYLLABLE MIEUM YEO SIOS + {0xB8EC, 0xBA84}, //9528 #HANGUL SYLLABLE MIEUM YEO SSANGSIOS + {0xB8ED, 0xBA85}, //9529 #HANGUL SYLLABLE MIEUM YEO IEUNG + {0xB8EE, 0xBA87}, //9530 #HANGUL SYLLABLE MIEUM YEO CHIEUCH + {0xB8EF, 0xBA8C}, //9531 #HANGUL SYLLABLE MIEUM YE + {0xB8F0, 0xBAA8}, //9532 #HANGUL SYLLABLE MIEUM O + {0xB8F1, 0xBAA9}, //9533 #HANGUL SYLLABLE MIEUM O KIYEOK + {0xB8F2, 0xBAAB}, //9534 #HANGUL SYLLABLE MIEUM O KIYEOKSIOS + {0xB8F3, 0xBAAC}, //9535 #HANGUL SYLLABLE MIEUM O NIEUN + {0xB8F4, 0xBAB0}, //9536 #HANGUL SYLLABLE MIEUM O RIEUL + {0xB8F5, 0xBAB2}, //9537 #HANGUL SYLLABLE MIEUM O RIEULMIEUM + {0xB8F6, 0xBAB8}, //9538 #HANGUL SYLLABLE MIEUM O MIEUM + {0xB8F7, 0xBAB9}, //9539 #HANGUL SYLLABLE MIEUM O PIEUP + {0xB8F8, 0xBABB}, //9540 #HANGUL SYLLABLE MIEUM O SIOS + {0xB8F9, 0xBABD}, //9541 #HANGUL SYLLABLE MIEUM O IEUNG + {0xB8FA, 0xBAC4}, //9542 #HANGUL SYLLABLE MIEUM WA + {0xB8FB, 0xBAC8}, //9543 #HANGUL SYLLABLE MIEUM WA NIEUN + {0xB8FC, 0xBAD8}, //9544 #HANGUL SYLLABLE MIEUM WA SSANGSIOS + {0xB8FD, 0xBAD9}, //9545 #HANGUL SYLLABLE MIEUM WA IEUNG + {0xB8FE, 0xBAFC}, //9546 #HANGUL SYLLABLE MIEUM OE + {0xB941, 0xD22A}, //9547 #HANGUL SYLLABLE THIEUTH YO PHIEUPH + {0xB942, 0xD22B}, //9548 #HANGUL SYLLABLE THIEUTH YO HIEUH + {0xB943, 0xD22E}, //9549 #HANGUL SYLLABLE THIEUTH U SSANGKIYEOK + {0xB944, 0xD22F}, //9550 #HANGUL SYLLABLE THIEUTH U KIYEOKSIOS + {0xB945, 0xD231}, //9551 #HANGUL SYLLABLE THIEUTH U NIEUNCIEUC + {0xB946, 0xD232}, //9552 #HANGUL SYLLABLE THIEUTH U NIEUNHIEUH + {0xB947, 0xD233}, //9553 #HANGUL SYLLABLE THIEUTH U TIKEUT + {0xB948, 0xD235}, //9554 #HANGUL SYLLABLE THIEUTH U RIEULKIYEOK + {0xB949, 0xD236}, //9555 #HANGUL SYLLABLE THIEUTH U RIEULMIEUM + {0xB94A, 0xD237}, //9556 #HANGUL SYLLABLE THIEUTH U RIEULPIEUP + {0xB94B, 0xD238}, //9557 #HANGUL SYLLABLE THIEUTH U RIEULSIOS + {0xB94C, 0xD239}, //9558 #HANGUL SYLLABLE THIEUTH U RIEULTHIEUTH + {0xB94D, 0xD23A}, //9559 #HANGUL SYLLABLE THIEUTH U RIEULPHIEUPH + {0xB94E, 0xD23B}, //9560 #HANGUL SYLLABLE THIEUTH U RIEULHIEUH + {0xB94F, 0xD23E}, //9561 #HANGUL SYLLABLE THIEUTH U PIEUPSIOS + {0xB950, 0xD240}, //9562 #HANGUL SYLLABLE THIEUTH U SSANGSIOS + {0xB951, 0xD242}, //9563 #HANGUL SYLLABLE THIEUTH U CIEUC + {0xB952, 0xD243}, //9564 #HANGUL SYLLABLE THIEUTH U CHIEUCH + {0xB953, 0xD244}, //9565 #HANGUL SYLLABLE THIEUTH U KHIEUKH + {0xB954, 0xD245}, //9566 #HANGUL SYLLABLE THIEUTH U THIEUTH + {0xB955, 0xD246}, //9567 #HANGUL SYLLABLE THIEUTH U PHIEUPH + {0xB956, 0xD247}, //9568 #HANGUL SYLLABLE THIEUTH U HIEUH + {0xB957, 0xD249}, //9569 #HANGUL SYLLABLE THIEUTH WEO KIYEOK + {0xB958, 0xD24A}, //9570 #HANGUL SYLLABLE THIEUTH WEO SSANGKIYEOK + {0xB959, 0xD24B}, //9571 #HANGUL SYLLABLE THIEUTH WEO KIYEOKSIOS + {0xB95A, 0xD24C}, //9572 #HANGUL SYLLABLE THIEUTH WEO NIEUN + {0xB961, 0xD24D}, //9573 #HANGUL SYLLABLE THIEUTH WEO NIEUNCIEUC + {0xB962, 0xD24E}, //9574 #HANGUL SYLLABLE THIEUTH WEO NIEUNHIEUH + {0xB963, 0xD24F}, //9575 #HANGUL SYLLABLE THIEUTH WEO TIKEUT + {0xB964, 0xD250}, //9576 #HANGUL SYLLABLE THIEUTH WEO RIEUL + {0xB965, 0xD251}, //9577 #HANGUL SYLLABLE THIEUTH WEO RIEULKIYEOK + {0xB966, 0xD252}, //9578 #HANGUL SYLLABLE THIEUTH WEO RIEULMIEUM + {0xB967, 0xD253}, //9579 #HANGUL SYLLABLE THIEUTH WEO RIEULPIEUP + {0xB968, 0xD254}, //9580 #HANGUL SYLLABLE THIEUTH WEO RIEULSIOS + {0xB969, 0xD255}, //9581 #HANGUL SYLLABLE THIEUTH WEO RIEULTHIEUTH + {0xB96A, 0xD256}, //9582 #HANGUL SYLLABLE THIEUTH WEO RIEULPHIEUPH + {0xB96B, 0xD257}, //9583 #HANGUL SYLLABLE THIEUTH WEO RIEULHIEUH + {0xB96C, 0xD258}, //9584 #HANGUL SYLLABLE THIEUTH WEO MIEUM + {0xB96D, 0xD259}, //9585 #HANGUL SYLLABLE THIEUTH WEO PIEUP + {0xB96E, 0xD25A}, //9586 #HANGUL SYLLABLE THIEUTH WEO PIEUPSIOS + {0xB96F, 0xD25B}, //9587 #HANGUL SYLLABLE THIEUTH WEO SIOS + {0xB970, 0xD25D}, //9588 #HANGUL SYLLABLE THIEUTH WEO IEUNG + {0xB971, 0xD25E}, //9589 #HANGUL SYLLABLE THIEUTH WEO CIEUC + {0xB972, 0xD25F}, //9590 #HANGUL SYLLABLE THIEUTH WEO CHIEUCH + {0xB973, 0xD260}, //9591 #HANGUL SYLLABLE THIEUTH WEO KHIEUKH + {0xB974, 0xD261}, //9592 #HANGUL SYLLABLE THIEUTH WEO THIEUTH + {0xB975, 0xD262}, //9593 #HANGUL SYLLABLE THIEUTH WEO PHIEUPH + {0xB976, 0xD263}, //9594 #HANGUL SYLLABLE THIEUTH WEO HIEUH + {0xB977, 0xD265}, //9595 #HANGUL SYLLABLE THIEUTH WE KIYEOK + {0xB978, 0xD266}, //9596 #HANGUL SYLLABLE THIEUTH WE SSANGKIYEOK + {0xB979, 0xD267}, //9597 #HANGUL SYLLABLE THIEUTH WE KIYEOKSIOS + {0xB97A, 0xD268}, //9598 #HANGUL SYLLABLE THIEUTH WE NIEUN + {0xB981, 0xD269}, //9599 #HANGUL SYLLABLE THIEUTH WE NIEUNCIEUC + {0xB982, 0xD26A}, //9600 #HANGUL SYLLABLE THIEUTH WE NIEUNHIEUH + {0xB983, 0xD26B}, //9601 #HANGUL SYLLABLE THIEUTH WE TIKEUT + {0xB984, 0xD26C}, //9602 #HANGUL SYLLABLE THIEUTH WE RIEUL + {0xB985, 0xD26D}, //9603 #HANGUL SYLLABLE THIEUTH WE RIEULKIYEOK + {0xB986, 0xD26E}, //9604 #HANGUL SYLLABLE THIEUTH WE RIEULMIEUM + {0xB987, 0xD26F}, //9605 #HANGUL SYLLABLE THIEUTH WE RIEULPIEUP + {0xB988, 0xD270}, //9606 #HANGUL SYLLABLE THIEUTH WE RIEULSIOS + {0xB989, 0xD271}, //9607 #HANGUL SYLLABLE THIEUTH WE RIEULTHIEUTH + {0xB98A, 0xD272}, //9608 #HANGUL SYLLABLE THIEUTH WE RIEULPHIEUPH + {0xB98B, 0xD273}, //9609 #HANGUL SYLLABLE THIEUTH WE RIEULHIEUH + {0xB98C, 0xD274}, //9610 #HANGUL SYLLABLE THIEUTH WE MIEUM + {0xB98D, 0xD275}, //9611 #HANGUL SYLLABLE THIEUTH WE PIEUP + {0xB98E, 0xD276}, //9612 #HANGUL SYLLABLE THIEUTH WE PIEUPSIOS + {0xB98F, 0xD277}, //9613 #HANGUL SYLLABLE THIEUTH WE SIOS + {0xB990, 0xD278}, //9614 #HANGUL SYLLABLE THIEUTH WE SSANGSIOS + {0xB991, 0xD279}, //9615 #HANGUL SYLLABLE THIEUTH WE IEUNG + {0xB992, 0xD27A}, //9616 #HANGUL SYLLABLE THIEUTH WE CIEUC + {0xB993, 0xD27B}, //9617 #HANGUL SYLLABLE THIEUTH WE CHIEUCH + {0xB994, 0xD27C}, //9618 #HANGUL SYLLABLE THIEUTH WE KHIEUKH + {0xB995, 0xD27D}, //9619 #HANGUL SYLLABLE THIEUTH WE THIEUTH + {0xB996, 0xD27E}, //9620 #HANGUL SYLLABLE THIEUTH WE PHIEUPH + {0xB997, 0xD27F}, //9621 #HANGUL SYLLABLE THIEUTH WE HIEUH + {0xB998, 0xD282}, //9622 #HANGUL SYLLABLE THIEUTH WI SSANGKIYEOK + {0xB999, 0xD283}, //9623 #HANGUL SYLLABLE THIEUTH WI KIYEOKSIOS + {0xB99A, 0xD285}, //9624 #HANGUL SYLLABLE THIEUTH WI NIEUNCIEUC + {0xB99B, 0xD286}, //9625 #HANGUL SYLLABLE THIEUTH WI NIEUNHIEUH + {0xB99C, 0xD287}, //9626 #HANGUL SYLLABLE THIEUTH WI TIKEUT + {0xB99D, 0xD289}, //9627 #HANGUL SYLLABLE THIEUTH WI RIEULKIYEOK + {0xB99E, 0xD28A}, //9628 #HANGUL SYLLABLE THIEUTH WI RIEULMIEUM + {0xB99F, 0xD28B}, //9629 #HANGUL SYLLABLE THIEUTH WI RIEULPIEUP + {0xB9A0, 0xD28C}, //9630 #HANGUL SYLLABLE THIEUTH WI RIEULSIOS + {0xB9A1, 0xBB00}, //9631 #HANGUL SYLLABLE MIEUM OE NIEUN + {0xB9A2, 0xBB04}, //9632 #HANGUL SYLLABLE MIEUM OE RIEUL + {0xB9A3, 0xBB0D}, //9633 #HANGUL SYLLABLE MIEUM OE PIEUP + {0xB9A4, 0xBB0F}, //9634 #HANGUL SYLLABLE MIEUM OE SIOS + {0xB9A5, 0xBB11}, //9635 #HANGUL SYLLABLE MIEUM OE IEUNG + {0xB9A6, 0xBB18}, //9636 #HANGUL SYLLABLE MIEUM YO + {0xB9A7, 0xBB1C}, //9637 #HANGUL SYLLABLE MIEUM YO NIEUN + {0xB9A8, 0xBB20}, //9638 #HANGUL SYLLABLE MIEUM YO RIEUL + {0xB9A9, 0xBB29}, //9639 #HANGUL SYLLABLE MIEUM YO PIEUP + {0xB9AA, 0xBB2B}, //9640 #HANGUL SYLLABLE MIEUM YO SIOS + {0xB9AB, 0xBB34}, //9641 #HANGUL SYLLABLE MIEUM U + {0xB9AC, 0xBB35}, //9642 #HANGUL SYLLABLE MIEUM U KIYEOK + {0xB9AD, 0xBB36}, //9643 #HANGUL SYLLABLE MIEUM U SSANGKIYEOK + {0xB9AE, 0xBB38}, //9644 #HANGUL SYLLABLE MIEUM U NIEUN + {0xB9AF, 0xBB3B}, //9645 #HANGUL SYLLABLE MIEUM U TIKEUT + {0xB9B0, 0xBB3C}, //9646 #HANGUL SYLLABLE MIEUM U RIEUL + {0xB9B1, 0xBB3D}, //9647 #HANGUL SYLLABLE MIEUM U RIEULKIYEOK + {0xB9B2, 0xBB3E}, //9648 #HANGUL SYLLABLE MIEUM U RIEULMIEUM + {0xB9B3, 0xBB44}, //9649 #HANGUL SYLLABLE MIEUM U MIEUM + {0xB9B4, 0xBB45}, //9650 #HANGUL SYLLABLE MIEUM U PIEUP + {0xB9B5, 0xBB47}, //9651 #HANGUL SYLLABLE MIEUM U SIOS + {0xB9B6, 0xBB49}, //9652 #HANGUL SYLLABLE MIEUM U IEUNG + {0xB9B7, 0xBB4D}, //9653 #HANGUL SYLLABLE MIEUM U THIEUTH + {0xB9B8, 0xBB4F}, //9654 #HANGUL SYLLABLE MIEUM U HIEUH + {0xB9B9, 0xBB50}, //9655 #HANGUL SYLLABLE MIEUM WEO + {0xB9BA, 0xBB54}, //9656 #HANGUL SYLLABLE MIEUM WEO NIEUN + {0xB9BB, 0xBB58}, //9657 #HANGUL SYLLABLE MIEUM WEO RIEUL + {0xB9BC, 0xBB61}, //9658 #HANGUL SYLLABLE MIEUM WEO PIEUP + {0xB9BD, 0xBB63}, //9659 #HANGUL SYLLABLE MIEUM WEO SIOS + {0xB9BE, 0xBB6C}, //9660 #HANGUL SYLLABLE MIEUM WE + {0xB9BF, 0xBB88}, //9661 #HANGUL SYLLABLE MIEUM WI + {0xB9C0, 0xBB8C}, //9662 #HANGUL SYLLABLE MIEUM WI NIEUN + {0xB9C1, 0xBB90}, //9663 #HANGUL SYLLABLE MIEUM WI RIEUL + {0xB9C2, 0xBBA4}, //9664 #HANGUL SYLLABLE MIEUM YU + {0xB9C3, 0xBBA8}, //9665 #HANGUL SYLLABLE MIEUM YU NIEUN + {0xB9C4, 0xBBAC}, //9666 #HANGUL SYLLABLE MIEUM YU RIEUL + {0xB9C5, 0xBBB4}, //9667 #HANGUL SYLLABLE MIEUM YU MIEUM + {0xB9C6, 0xBBB7}, //9668 #HANGUL SYLLABLE MIEUM YU SIOS + {0xB9C7, 0xBBC0}, //9669 #HANGUL SYLLABLE MIEUM EU + {0xB9C8, 0xBBC4}, //9670 #HANGUL SYLLABLE MIEUM EU NIEUN + {0xB9C9, 0xBBC8}, //9671 #HANGUL SYLLABLE MIEUM EU RIEUL + {0xB9CA, 0xBBD0}, //9672 #HANGUL SYLLABLE MIEUM EU MIEUM + {0xB9CB, 0xBBD3}, //9673 #HANGUL SYLLABLE MIEUM EU SIOS + {0xB9CC, 0xBBF8}, //9674 #HANGUL SYLLABLE MIEUM I + {0xB9CD, 0xBBF9}, //9675 #HANGUL SYLLABLE MIEUM I KIYEOK + {0xB9CE, 0xBBFC}, //9676 #HANGUL SYLLABLE MIEUM I NIEUN + {0xB9CF, 0xBBFF}, //9677 #HANGUL SYLLABLE MIEUM I TIKEUT + {0xB9D0, 0xBC00}, //9678 #HANGUL SYLLABLE MIEUM I RIEUL + {0xB9D1, 0xBC02}, //9679 #HANGUL SYLLABLE MIEUM I RIEULMIEUM + {0xB9D2, 0xBC08}, //9680 #HANGUL SYLLABLE MIEUM I MIEUM + {0xB9D3, 0xBC09}, //9681 #HANGUL SYLLABLE MIEUM I PIEUP + {0xB9D4, 0xBC0B}, //9682 #HANGUL SYLLABLE MIEUM I SIOS + {0xB9D5, 0xBC0C}, //9683 #HANGUL SYLLABLE MIEUM I SSANGSIOS + {0xB9D6, 0xBC0D}, //9684 #HANGUL SYLLABLE MIEUM I IEUNG + {0xB9D7, 0xBC0F}, //9685 #HANGUL SYLLABLE MIEUM I CHIEUCH + {0xB9D8, 0xBC11}, //9686 #HANGUL SYLLABLE MIEUM I THIEUTH + {0xB9D9, 0xBC14}, //9687 #HANGUL SYLLABLE PIEUP A + {0xB9DA, 0xBC15}, //9688 #HANGUL SYLLABLE PIEUP A KIYEOK + {0xB9DB, 0xBC16}, //9689 #HANGUL SYLLABLE PIEUP A SSANGKIYEOK + {0xB9DC, 0xBC17}, //9690 #HANGUL SYLLABLE PIEUP A KIYEOKSIOS + {0xB9DD, 0xBC18}, //9691 #HANGUL SYLLABLE PIEUP A NIEUN + {0xB9DE, 0xBC1B}, //9692 #HANGUL SYLLABLE PIEUP A TIKEUT + {0xB9DF, 0xBC1C}, //9693 #HANGUL SYLLABLE PIEUP A RIEUL + {0xB9E0, 0xBC1D}, //9694 #HANGUL SYLLABLE PIEUP A RIEULKIYEOK + {0xB9E1, 0xBC1E}, //9695 #HANGUL SYLLABLE PIEUP A RIEULMIEUM + {0xB9E2, 0xBC1F}, //9696 #HANGUL SYLLABLE PIEUP A RIEULPIEUP + {0xB9E3, 0xBC24}, //9697 #HANGUL SYLLABLE PIEUP A MIEUM + {0xB9E4, 0xBC25}, //9698 #HANGUL SYLLABLE PIEUP A PIEUP + {0xB9E5, 0xBC27}, //9699 #HANGUL SYLLABLE PIEUP A SIOS + {0xB9E6, 0xBC29}, //9700 #HANGUL SYLLABLE PIEUP A IEUNG + {0xB9E7, 0xBC2D}, //9701 #HANGUL SYLLABLE PIEUP A THIEUTH + {0xB9E8, 0xBC30}, //9702 #HANGUL SYLLABLE PIEUP AE + {0xB9E9, 0xBC31}, //9703 #HANGUL SYLLABLE PIEUP AE KIYEOK + {0xB9EA, 0xBC34}, //9704 #HANGUL SYLLABLE PIEUP AE NIEUN + {0xB9EB, 0xBC38}, //9705 #HANGUL SYLLABLE PIEUP AE RIEUL + {0xB9EC, 0xBC40}, //9706 #HANGUL SYLLABLE PIEUP AE MIEUM + {0xB9ED, 0xBC41}, //9707 #HANGUL SYLLABLE PIEUP AE PIEUP + {0xB9EE, 0xBC43}, //9708 #HANGUL SYLLABLE PIEUP AE SIOS + {0xB9EF, 0xBC44}, //9709 #HANGUL SYLLABLE PIEUP AE SSANGSIOS + {0xB9F0, 0xBC45}, //9710 #HANGUL SYLLABLE PIEUP AE IEUNG + {0xB9F1, 0xBC49}, //9711 #HANGUL SYLLABLE PIEUP AE THIEUTH + {0xB9F2, 0xBC4C}, //9712 #HANGUL SYLLABLE PIEUP YA + {0xB9F3, 0xBC4D}, //9713 #HANGUL SYLLABLE PIEUP YA KIYEOK + {0xB9F4, 0xBC50}, //9714 #HANGUL SYLLABLE PIEUP YA NIEUN + {0xB9F5, 0xBC5D}, //9715 #HANGUL SYLLABLE PIEUP YA PIEUP + {0xB9F6, 0xBC84}, //9716 #HANGUL SYLLABLE PIEUP EO + {0xB9F7, 0xBC85}, //9717 #HANGUL SYLLABLE PIEUP EO KIYEOK + {0xB9F8, 0xBC88}, //9718 #HANGUL SYLLABLE PIEUP EO NIEUN + {0xB9F9, 0xBC8B}, //9719 #HANGUL SYLLABLE PIEUP EO TIKEUT + {0xB9FA, 0xBC8C}, //9720 #HANGUL SYLLABLE PIEUP EO RIEUL + {0xB9FB, 0xBC8E}, //9721 #HANGUL SYLLABLE PIEUP EO RIEULMIEUM + {0xB9FC, 0xBC94}, //9722 #HANGUL SYLLABLE PIEUP EO MIEUM + {0xB9FD, 0xBC95}, //9723 #HANGUL SYLLABLE PIEUP EO PIEUP + {0xB9FE, 0xBC97}, //9724 #HANGUL SYLLABLE PIEUP EO SIOS + {0xBA41, 0xD28D}, //9725 #HANGUL SYLLABLE THIEUTH WI RIEULTHIEUTH + {0xBA42, 0xD28E}, //9726 #HANGUL SYLLABLE THIEUTH WI RIEULPHIEUPH + {0xBA43, 0xD28F}, //9727 #HANGUL SYLLABLE THIEUTH WI RIEULHIEUH + {0xBA44, 0xD292}, //9728 #HANGUL SYLLABLE THIEUTH WI PIEUPSIOS + {0xBA45, 0xD293}, //9729 #HANGUL SYLLABLE THIEUTH WI SIOS + {0xBA46, 0xD294}, //9730 #HANGUL SYLLABLE THIEUTH WI SSANGSIOS + {0xBA47, 0xD296}, //9731 #HANGUL SYLLABLE THIEUTH WI CIEUC + {0xBA48, 0xD297}, //9732 #HANGUL SYLLABLE THIEUTH WI CHIEUCH + {0xBA49, 0xD298}, //9733 #HANGUL SYLLABLE THIEUTH WI KHIEUKH + {0xBA4A, 0xD299}, //9734 #HANGUL SYLLABLE THIEUTH WI THIEUTH + {0xBA4B, 0xD29A}, //9735 #HANGUL SYLLABLE THIEUTH WI PHIEUPH + {0xBA4C, 0xD29B}, //9736 #HANGUL SYLLABLE THIEUTH WI HIEUH + {0xBA4D, 0xD29D}, //9737 #HANGUL SYLLABLE THIEUTH YU KIYEOK + {0xBA4E, 0xD29E}, //9738 #HANGUL SYLLABLE THIEUTH YU SSANGKIYEOK + {0xBA4F, 0xD29F}, //9739 #HANGUL SYLLABLE THIEUTH YU KIYEOKSIOS + {0xBA50, 0xD2A1}, //9740 #HANGUL SYLLABLE THIEUTH YU NIEUNCIEUC + {0xBA51, 0xD2A2}, //9741 #HANGUL SYLLABLE THIEUTH YU NIEUNHIEUH + {0xBA52, 0xD2A3}, //9742 #HANGUL SYLLABLE THIEUTH YU TIKEUT + {0xBA53, 0xD2A5}, //9743 #HANGUL SYLLABLE THIEUTH YU RIEULKIYEOK + {0xBA54, 0xD2A6}, //9744 #HANGUL SYLLABLE THIEUTH YU RIEULMIEUM + {0xBA55, 0xD2A7}, //9745 #HANGUL SYLLABLE THIEUTH YU RIEULPIEUP + {0xBA56, 0xD2A8}, //9746 #HANGUL SYLLABLE THIEUTH YU RIEULSIOS + {0xBA57, 0xD2A9}, //9747 #HANGUL SYLLABLE THIEUTH YU RIEULTHIEUTH + {0xBA58, 0xD2AA}, //9748 #HANGUL SYLLABLE THIEUTH YU RIEULPHIEUPH + {0xBA59, 0xD2AB}, //9749 #HANGUL SYLLABLE THIEUTH YU RIEULHIEUH + {0xBA5A, 0xD2AD}, //9750 #HANGUL SYLLABLE THIEUTH YU PIEUP + {0xBA61, 0xD2AE}, //9751 #HANGUL SYLLABLE THIEUTH YU PIEUPSIOS + {0xBA62, 0xD2AF}, //9752 #HANGUL SYLLABLE THIEUTH YU SIOS + {0xBA63, 0xD2B0}, //9753 #HANGUL SYLLABLE THIEUTH YU SSANGSIOS + {0xBA64, 0xD2B2}, //9754 #HANGUL SYLLABLE THIEUTH YU CIEUC + {0xBA65, 0xD2B3}, //9755 #HANGUL SYLLABLE THIEUTH YU CHIEUCH + {0xBA66, 0xD2B4}, //9756 #HANGUL SYLLABLE THIEUTH YU KHIEUKH + {0xBA67, 0xD2B5}, //9757 #HANGUL SYLLABLE THIEUTH YU THIEUTH + {0xBA68, 0xD2B6}, //9758 #HANGUL SYLLABLE THIEUTH YU PHIEUPH + {0xBA69, 0xD2B7}, //9759 #HANGUL SYLLABLE THIEUTH YU HIEUH + {0xBA6A, 0xD2BA}, //9760 #HANGUL SYLLABLE THIEUTH EU SSANGKIYEOK + {0xBA6B, 0xD2BB}, //9761 #HANGUL SYLLABLE THIEUTH EU KIYEOKSIOS + {0xBA6C, 0xD2BD}, //9762 #HANGUL SYLLABLE THIEUTH EU NIEUNCIEUC + {0xBA6D, 0xD2BE}, //9763 #HANGUL SYLLABLE THIEUTH EU NIEUNHIEUH + {0xBA6E, 0xD2C1}, //9764 #HANGUL SYLLABLE THIEUTH EU RIEULKIYEOK + {0xBA6F, 0xD2C3}, //9765 #HANGUL SYLLABLE THIEUTH EU RIEULPIEUP + {0xBA70, 0xD2C4}, //9766 #HANGUL SYLLABLE THIEUTH EU RIEULSIOS + {0xBA71, 0xD2C5}, //9767 #HANGUL SYLLABLE THIEUTH EU RIEULTHIEUTH + {0xBA72, 0xD2C6}, //9768 #HANGUL SYLLABLE THIEUTH EU RIEULPHIEUPH + {0xBA73, 0xD2C7}, //9769 #HANGUL SYLLABLE THIEUTH EU RIEULHIEUH + {0xBA74, 0xD2CA}, //9770 #HANGUL SYLLABLE THIEUTH EU PIEUPSIOS + {0xBA75, 0xD2CC}, //9771 #HANGUL SYLLABLE THIEUTH EU SSANGSIOS + {0xBA76, 0xD2CD}, //9772 #HANGUL SYLLABLE THIEUTH EU IEUNG + {0xBA77, 0xD2CE}, //9773 #HANGUL SYLLABLE THIEUTH EU CIEUC + {0xBA78, 0xD2CF}, //9774 #HANGUL SYLLABLE THIEUTH EU CHIEUCH + {0xBA79, 0xD2D0}, //9775 #HANGUL SYLLABLE THIEUTH EU KHIEUKH + {0xBA7A, 0xD2D1}, //9776 #HANGUL SYLLABLE THIEUTH EU THIEUTH + {0xBA81, 0xD2D2}, //9777 #HANGUL SYLLABLE THIEUTH EU PHIEUPH + {0xBA82, 0xD2D3}, //9778 #HANGUL SYLLABLE THIEUTH EU HIEUH + {0xBA83, 0xD2D5}, //9779 #HANGUL SYLLABLE THIEUTH YI KIYEOK + {0xBA84, 0xD2D6}, //9780 #HANGUL SYLLABLE THIEUTH YI SSANGKIYEOK + {0xBA85, 0xD2D7}, //9781 #HANGUL SYLLABLE THIEUTH YI KIYEOKSIOS + {0xBA86, 0xD2D9}, //9782 #HANGUL SYLLABLE THIEUTH YI NIEUNCIEUC + {0xBA87, 0xD2DA}, //9783 #HANGUL SYLLABLE THIEUTH YI NIEUNHIEUH + {0xBA88, 0xD2DB}, //9784 #HANGUL SYLLABLE THIEUTH YI TIKEUT + {0xBA89, 0xD2DD}, //9785 #HANGUL SYLLABLE THIEUTH YI RIEULKIYEOK + {0xBA8A, 0xD2DE}, //9786 #HANGUL SYLLABLE THIEUTH YI RIEULMIEUM + {0xBA8B, 0xD2DF}, //9787 #HANGUL SYLLABLE THIEUTH YI RIEULPIEUP + {0xBA8C, 0xD2E0}, //9788 #HANGUL SYLLABLE THIEUTH YI RIEULSIOS + {0xBA8D, 0xD2E1}, //9789 #HANGUL SYLLABLE THIEUTH YI RIEULTHIEUTH + {0xBA8E, 0xD2E2}, //9790 #HANGUL SYLLABLE THIEUTH YI RIEULPHIEUPH + {0xBA8F, 0xD2E3}, //9791 #HANGUL SYLLABLE THIEUTH YI RIEULHIEUH + {0xBA90, 0xD2E6}, //9792 #HANGUL SYLLABLE THIEUTH YI PIEUPSIOS + {0xBA91, 0xD2E7}, //9793 #HANGUL SYLLABLE THIEUTH YI SIOS + {0xBA92, 0xD2E8}, //9794 #HANGUL SYLLABLE THIEUTH YI SSANGSIOS + {0xBA93, 0xD2E9}, //9795 #HANGUL SYLLABLE THIEUTH YI IEUNG + {0xBA94, 0xD2EA}, //9796 #HANGUL SYLLABLE THIEUTH YI CIEUC + {0xBA95, 0xD2EB}, //9797 #HANGUL SYLLABLE THIEUTH YI CHIEUCH + {0xBA96, 0xD2EC}, //9798 #HANGUL SYLLABLE THIEUTH YI KHIEUKH + {0xBA97, 0xD2ED}, //9799 #HANGUL SYLLABLE THIEUTH YI THIEUTH + {0xBA98, 0xD2EE}, //9800 #HANGUL SYLLABLE THIEUTH YI PHIEUPH + {0xBA99, 0xD2EF}, //9801 #HANGUL SYLLABLE THIEUTH YI HIEUH + {0xBA9A, 0xD2F2}, //9802 #HANGUL SYLLABLE THIEUTH I SSANGKIYEOK + {0xBA9B, 0xD2F3}, //9803 #HANGUL SYLLABLE THIEUTH I KIYEOKSIOS + {0xBA9C, 0xD2F5}, //9804 #HANGUL SYLLABLE THIEUTH I NIEUNCIEUC + {0xBA9D, 0xD2F6}, //9805 #HANGUL SYLLABLE THIEUTH I NIEUNHIEUH + {0xBA9E, 0xD2F7}, //9806 #HANGUL SYLLABLE THIEUTH I TIKEUT + {0xBA9F, 0xD2F9}, //9807 #HANGUL SYLLABLE THIEUTH I RIEULKIYEOK + {0xBAA0, 0xD2FA}, //9808 #HANGUL SYLLABLE THIEUTH I RIEULMIEUM + {0xBAA1, 0xBC99}, //9809 #HANGUL SYLLABLE PIEUP EO IEUNG + {0xBAA2, 0xBC9A}, //9810 #HANGUL SYLLABLE PIEUP EO CIEUC + {0xBAA3, 0xBCA0}, //9811 #HANGUL SYLLABLE PIEUP E + {0xBAA4, 0xBCA1}, //9812 #HANGUL SYLLABLE PIEUP E KIYEOK + {0xBAA5, 0xBCA4}, //9813 #HANGUL SYLLABLE PIEUP E NIEUN + {0xBAA6, 0xBCA7}, //9814 #HANGUL SYLLABLE PIEUP E TIKEUT + {0xBAA7, 0xBCA8}, //9815 #HANGUL SYLLABLE PIEUP E RIEUL + {0xBAA8, 0xBCB0}, //9816 #HANGUL SYLLABLE PIEUP E MIEUM + {0xBAA9, 0xBCB1}, //9817 #HANGUL SYLLABLE PIEUP E PIEUP + {0xBAAA, 0xBCB3}, //9818 #HANGUL SYLLABLE PIEUP E SIOS + {0xBAAB, 0xBCB4}, //9819 #HANGUL SYLLABLE PIEUP E SSANGSIOS + {0xBAAC, 0xBCB5}, //9820 #HANGUL SYLLABLE PIEUP E IEUNG + {0xBAAD, 0xBCBC}, //9821 #HANGUL SYLLABLE PIEUP YEO + {0xBAAE, 0xBCBD}, //9822 #HANGUL SYLLABLE PIEUP YEO KIYEOK + {0xBAAF, 0xBCC0}, //9823 #HANGUL SYLLABLE PIEUP YEO NIEUN + {0xBAB0, 0xBCC4}, //9824 #HANGUL SYLLABLE PIEUP YEO RIEUL + {0xBAB1, 0xBCCD}, //9825 #HANGUL SYLLABLE PIEUP YEO PIEUP + {0xBAB2, 0xBCCF}, //9826 #HANGUL SYLLABLE PIEUP YEO SIOS + {0xBAB3, 0xBCD0}, //9827 #HANGUL SYLLABLE PIEUP YEO SSANGSIOS + {0xBAB4, 0xBCD1}, //9828 #HANGUL SYLLABLE PIEUP YEO IEUNG + {0xBAB5, 0xBCD5}, //9829 #HANGUL SYLLABLE PIEUP YEO THIEUTH + {0xBAB6, 0xBCD8}, //9830 #HANGUL SYLLABLE PIEUP YE + {0xBAB7, 0xBCDC}, //9831 #HANGUL SYLLABLE PIEUP YE NIEUN + {0xBAB8, 0xBCF4}, //9832 #HANGUL SYLLABLE PIEUP O + {0xBAB9, 0xBCF5}, //9833 #HANGUL SYLLABLE PIEUP O KIYEOK + {0xBABA, 0xBCF6}, //9834 #HANGUL SYLLABLE PIEUP O SSANGKIYEOK + {0xBABB, 0xBCF8}, //9835 #HANGUL SYLLABLE PIEUP O NIEUN + {0xBABC, 0xBCFC}, //9836 #HANGUL SYLLABLE PIEUP O RIEUL + {0xBABD, 0xBD04}, //9837 #HANGUL SYLLABLE PIEUP O MIEUM + {0xBABE, 0xBD05}, //9838 #HANGUL SYLLABLE PIEUP O PIEUP + {0xBABF, 0xBD07}, //9839 #HANGUL SYLLABLE PIEUP O SIOS + {0xBAC0, 0xBD09}, //9840 #HANGUL SYLLABLE PIEUP O IEUNG + {0xBAC1, 0xBD10}, //9841 #HANGUL SYLLABLE PIEUP WA + {0xBAC2, 0xBD14}, //9842 #HANGUL SYLLABLE PIEUP WA NIEUN + {0xBAC3, 0xBD24}, //9843 #HANGUL SYLLABLE PIEUP WA SSANGSIOS + {0xBAC4, 0xBD2C}, //9844 #HANGUL SYLLABLE PIEUP WAE + {0xBAC5, 0xBD40}, //9845 #HANGUL SYLLABLE PIEUP WAE SSANGSIOS + {0xBAC6, 0xBD48}, //9846 #HANGUL SYLLABLE PIEUP OE + {0xBAC7, 0xBD49}, //9847 #HANGUL SYLLABLE PIEUP OE KIYEOK + {0xBAC8, 0xBD4C}, //9848 #HANGUL SYLLABLE PIEUP OE NIEUN + {0xBAC9, 0xBD50}, //9849 #HANGUL SYLLABLE PIEUP OE RIEUL + {0xBACA, 0xBD58}, //9850 #HANGUL SYLLABLE PIEUP OE MIEUM + {0xBACB, 0xBD59}, //9851 #HANGUL SYLLABLE PIEUP OE PIEUP + {0xBACC, 0xBD64}, //9852 #HANGUL SYLLABLE PIEUP YO + {0xBACD, 0xBD68}, //9853 #HANGUL SYLLABLE PIEUP YO NIEUN + {0xBACE, 0xBD80}, //9854 #HANGUL SYLLABLE PIEUP U + {0xBACF, 0xBD81}, //9855 #HANGUL SYLLABLE PIEUP U KIYEOK + {0xBAD0, 0xBD84}, //9856 #HANGUL SYLLABLE PIEUP U NIEUN + {0xBAD1, 0xBD87}, //9857 #HANGUL SYLLABLE PIEUP U TIKEUT + {0xBAD2, 0xBD88}, //9858 #HANGUL SYLLABLE PIEUP U RIEUL + {0xBAD3, 0xBD89}, //9859 #HANGUL SYLLABLE PIEUP U RIEULKIYEOK + {0xBAD4, 0xBD8A}, //9860 #HANGUL SYLLABLE PIEUP U RIEULMIEUM + {0xBAD5, 0xBD90}, //9861 #HANGUL SYLLABLE PIEUP U MIEUM + {0xBAD6, 0xBD91}, //9862 #HANGUL SYLLABLE PIEUP U PIEUP + {0xBAD7, 0xBD93}, //9863 #HANGUL SYLLABLE PIEUP U SIOS + {0xBAD8, 0xBD95}, //9864 #HANGUL SYLLABLE PIEUP U IEUNG + {0xBAD9, 0xBD99}, //9865 #HANGUL SYLLABLE PIEUP U THIEUTH + {0xBADA, 0xBD9A}, //9866 #HANGUL SYLLABLE PIEUP U PHIEUPH + {0xBADB, 0xBD9C}, //9867 #HANGUL SYLLABLE PIEUP WEO + {0xBADC, 0xBDA4}, //9868 #HANGUL SYLLABLE PIEUP WEO RIEUL + {0xBADD, 0xBDB0}, //9869 #HANGUL SYLLABLE PIEUP WEO SSANGSIOS + {0xBADE, 0xBDB8}, //9870 #HANGUL SYLLABLE PIEUP WE + {0xBADF, 0xBDD4}, //9871 #HANGUL SYLLABLE PIEUP WI + {0xBAE0, 0xBDD5}, //9872 #HANGUL SYLLABLE PIEUP WI KIYEOK + {0xBAE1, 0xBDD8}, //9873 #HANGUL SYLLABLE PIEUP WI NIEUN + {0xBAE2, 0xBDDC}, //9874 #HANGUL SYLLABLE PIEUP WI RIEUL + {0xBAE3, 0xBDE9}, //9875 #HANGUL SYLLABLE PIEUP WI IEUNG + {0xBAE4, 0xBDF0}, //9876 #HANGUL SYLLABLE PIEUP YU + {0xBAE5, 0xBDF4}, //9877 #HANGUL SYLLABLE PIEUP YU NIEUN + {0xBAE6, 0xBDF8}, //9878 #HANGUL SYLLABLE PIEUP YU RIEUL + {0xBAE7, 0xBE00}, //9879 #HANGUL SYLLABLE PIEUP YU MIEUM + {0xBAE8, 0xBE03}, //9880 #HANGUL SYLLABLE PIEUP YU SIOS + {0xBAE9, 0xBE05}, //9881 #HANGUL SYLLABLE PIEUP YU IEUNG + {0xBAEA, 0xBE0C}, //9882 #HANGUL SYLLABLE PIEUP EU + {0xBAEB, 0xBE0D}, //9883 #HANGUL SYLLABLE PIEUP EU KIYEOK + {0xBAEC, 0xBE10}, //9884 #HANGUL SYLLABLE PIEUP EU NIEUN + {0xBAED, 0xBE14}, //9885 #HANGUL SYLLABLE PIEUP EU RIEUL + {0xBAEE, 0xBE1C}, //9886 #HANGUL SYLLABLE PIEUP EU MIEUM + {0xBAEF, 0xBE1D}, //9887 #HANGUL SYLLABLE PIEUP EU PIEUP + {0xBAF0, 0xBE1F}, //9888 #HANGUL SYLLABLE PIEUP EU SIOS + {0xBAF1, 0xBE44}, //9889 #HANGUL SYLLABLE PIEUP I + {0xBAF2, 0xBE45}, //9890 #HANGUL SYLLABLE PIEUP I KIYEOK + {0xBAF3, 0xBE48}, //9891 #HANGUL SYLLABLE PIEUP I NIEUN + {0xBAF4, 0xBE4C}, //9892 #HANGUL SYLLABLE PIEUP I RIEUL + {0xBAF5, 0xBE4E}, //9893 #HANGUL SYLLABLE PIEUP I RIEULMIEUM + {0xBAF6, 0xBE54}, //9894 #HANGUL SYLLABLE PIEUP I MIEUM + {0xBAF7, 0xBE55}, //9895 #HANGUL SYLLABLE PIEUP I PIEUP + {0xBAF8, 0xBE57}, //9896 #HANGUL SYLLABLE PIEUP I SIOS + {0xBAF9, 0xBE59}, //9897 #HANGUL SYLLABLE PIEUP I IEUNG + {0xBAFA, 0xBE5A}, //9898 #HANGUL SYLLABLE PIEUP I CIEUC + {0xBAFB, 0xBE5B}, //9899 #HANGUL SYLLABLE PIEUP I CHIEUCH + {0xBAFC, 0xBE60}, //9900 #HANGUL SYLLABLE SSANGPIEUP A + {0xBAFD, 0xBE61}, //9901 #HANGUL SYLLABLE SSANGPIEUP A KIYEOK + {0xBAFE, 0xBE64}, //9902 #HANGUL SYLLABLE SSANGPIEUP A NIEUN + {0xBB41, 0xD2FB}, //9903 #HANGUL SYLLABLE THIEUTH I RIEULPIEUP + {0xBB42, 0xD2FC}, //9904 #HANGUL SYLLABLE THIEUTH I RIEULSIOS + {0xBB43, 0xD2FD}, //9905 #HANGUL SYLLABLE THIEUTH I RIEULTHIEUTH + {0xBB44, 0xD2FE}, //9906 #HANGUL SYLLABLE THIEUTH I RIEULPHIEUPH + {0xBB45, 0xD2FF}, //9907 #HANGUL SYLLABLE THIEUTH I RIEULHIEUH + {0xBB46, 0xD302}, //9908 #HANGUL SYLLABLE THIEUTH I PIEUPSIOS + {0xBB47, 0xD304}, //9909 #HANGUL SYLLABLE THIEUTH I SSANGSIOS + {0xBB48, 0xD306}, //9910 #HANGUL SYLLABLE THIEUTH I CIEUC + {0xBB49, 0xD307}, //9911 #HANGUL SYLLABLE THIEUTH I CHIEUCH + {0xBB4A, 0xD308}, //9912 #HANGUL SYLLABLE THIEUTH I KHIEUKH + {0xBB4B, 0xD309}, //9913 #HANGUL SYLLABLE THIEUTH I THIEUTH + {0xBB4C, 0xD30A}, //9914 #HANGUL SYLLABLE THIEUTH I PHIEUPH + {0xBB4D, 0xD30B}, //9915 #HANGUL SYLLABLE THIEUTH I HIEUH + {0xBB4E, 0xD30F}, //9916 #HANGUL SYLLABLE PHIEUPH A KIYEOKSIOS + {0xBB4F, 0xD311}, //9917 #HANGUL SYLLABLE PHIEUPH A NIEUNCIEUC + {0xBB50, 0xD312}, //9918 #HANGUL SYLLABLE PHIEUPH A NIEUNHIEUH + {0xBB51, 0xD313}, //9919 #HANGUL SYLLABLE PHIEUPH A TIKEUT + {0xBB52, 0xD315}, //9920 #HANGUL SYLLABLE PHIEUPH A RIEULKIYEOK + {0xBB53, 0xD317}, //9921 #HANGUL SYLLABLE PHIEUPH A RIEULPIEUP + {0xBB54, 0xD318}, //9922 #HANGUL SYLLABLE PHIEUPH A RIEULSIOS + {0xBB55, 0xD319}, //9923 #HANGUL SYLLABLE PHIEUPH A RIEULTHIEUTH + {0xBB56, 0xD31A}, //9924 #HANGUL SYLLABLE PHIEUPH A RIEULPHIEUPH + {0xBB57, 0xD31B}, //9925 #HANGUL SYLLABLE PHIEUPH A RIEULHIEUH + {0xBB58, 0xD31E}, //9926 #HANGUL SYLLABLE PHIEUPH A PIEUPSIOS + {0xBB59, 0xD322}, //9927 #HANGUL SYLLABLE PHIEUPH A CIEUC + {0xBB5A, 0xD323}, //9928 #HANGUL SYLLABLE PHIEUPH A CHIEUCH + {0xBB61, 0xD324}, //9929 #HANGUL SYLLABLE PHIEUPH A KHIEUKH + {0xBB62, 0xD326}, //9930 #HANGUL SYLLABLE PHIEUPH A PHIEUPH + {0xBB63, 0xD327}, //9931 #HANGUL SYLLABLE PHIEUPH A HIEUH + {0xBB64, 0xD32A}, //9932 #HANGUL SYLLABLE PHIEUPH AE SSANGKIYEOK + {0xBB65, 0xD32B}, //9933 #HANGUL SYLLABLE PHIEUPH AE KIYEOKSIOS + {0xBB66, 0xD32D}, //9934 #HANGUL SYLLABLE PHIEUPH AE NIEUNCIEUC + {0xBB67, 0xD32E}, //9935 #HANGUL SYLLABLE PHIEUPH AE NIEUNHIEUH + {0xBB68, 0xD32F}, //9936 #HANGUL SYLLABLE PHIEUPH AE TIKEUT + {0xBB69, 0xD331}, //9937 #HANGUL SYLLABLE PHIEUPH AE RIEULKIYEOK + {0xBB6A, 0xD332}, //9938 #HANGUL SYLLABLE PHIEUPH AE RIEULMIEUM + {0xBB6B, 0xD333}, //9939 #HANGUL SYLLABLE PHIEUPH AE RIEULPIEUP + {0xBB6C, 0xD334}, //9940 #HANGUL SYLLABLE PHIEUPH AE RIEULSIOS + {0xBB6D, 0xD335}, //9941 #HANGUL SYLLABLE PHIEUPH AE RIEULTHIEUTH + {0xBB6E, 0xD336}, //9942 #HANGUL SYLLABLE PHIEUPH AE RIEULPHIEUPH + {0xBB6F, 0xD337}, //9943 #HANGUL SYLLABLE PHIEUPH AE RIEULHIEUH + {0xBB70, 0xD33A}, //9944 #HANGUL SYLLABLE PHIEUPH AE PIEUPSIOS + {0xBB71, 0xD33E}, //9945 #HANGUL SYLLABLE PHIEUPH AE CIEUC + {0xBB72, 0xD33F}, //9946 #HANGUL SYLLABLE PHIEUPH AE CHIEUCH + {0xBB73, 0xD340}, //9947 #HANGUL SYLLABLE PHIEUPH AE KHIEUKH + {0xBB74, 0xD341}, //9948 #HANGUL SYLLABLE PHIEUPH AE THIEUTH + {0xBB75, 0xD342}, //9949 #HANGUL SYLLABLE PHIEUPH AE PHIEUPH + {0xBB76, 0xD343}, //9950 #HANGUL SYLLABLE PHIEUPH AE HIEUH + {0xBB77, 0xD346}, //9951 #HANGUL SYLLABLE PHIEUPH YA SSANGKIYEOK + {0xBB78, 0xD347}, //9952 #HANGUL SYLLABLE PHIEUPH YA KIYEOKSIOS + {0xBB79, 0xD348}, //9953 #HANGUL SYLLABLE PHIEUPH YA NIEUN + {0xBB7A, 0xD349}, //9954 #HANGUL SYLLABLE PHIEUPH YA NIEUNCIEUC + {0xBB81, 0xD34A}, //9955 #HANGUL SYLLABLE PHIEUPH YA NIEUNHIEUH + {0xBB82, 0xD34B}, //9956 #HANGUL SYLLABLE PHIEUPH YA TIKEUT + {0xBB83, 0xD34C}, //9957 #HANGUL SYLLABLE PHIEUPH YA RIEUL + {0xBB84, 0xD34D}, //9958 #HANGUL SYLLABLE PHIEUPH YA RIEULKIYEOK + {0xBB85, 0xD34E}, //9959 #HANGUL SYLLABLE PHIEUPH YA RIEULMIEUM + {0xBB86, 0xD34F}, //9960 #HANGUL SYLLABLE PHIEUPH YA RIEULPIEUP + {0xBB87, 0xD350}, //9961 #HANGUL SYLLABLE PHIEUPH YA RIEULSIOS + {0xBB88, 0xD351}, //9962 #HANGUL SYLLABLE PHIEUPH YA RIEULTHIEUTH + {0xBB89, 0xD352}, //9963 #HANGUL SYLLABLE PHIEUPH YA RIEULPHIEUPH + {0xBB8A, 0xD353}, //9964 #HANGUL SYLLABLE PHIEUPH YA RIEULHIEUH + {0xBB8B, 0xD354}, //9965 #HANGUL SYLLABLE PHIEUPH YA MIEUM + {0xBB8C, 0xD355}, //9966 #HANGUL SYLLABLE PHIEUPH YA PIEUP + {0xBB8D, 0xD356}, //9967 #HANGUL SYLLABLE PHIEUPH YA PIEUPSIOS + {0xBB8E, 0xD357}, //9968 #HANGUL SYLLABLE PHIEUPH YA SIOS + {0xBB8F, 0xD358}, //9969 #HANGUL SYLLABLE PHIEUPH YA SSANGSIOS + {0xBB90, 0xD359}, //9970 #HANGUL SYLLABLE PHIEUPH YA IEUNG + {0xBB91, 0xD35A}, //9971 #HANGUL SYLLABLE PHIEUPH YA CIEUC + {0xBB92, 0xD35B}, //9972 #HANGUL SYLLABLE PHIEUPH YA CHIEUCH + {0xBB93, 0xD35C}, //9973 #HANGUL SYLLABLE PHIEUPH YA KHIEUKH + {0xBB94, 0xD35D}, //9974 #HANGUL SYLLABLE PHIEUPH YA THIEUTH + {0xBB95, 0xD35E}, //9975 #HANGUL SYLLABLE PHIEUPH YA PHIEUPH + {0xBB96, 0xD35F}, //9976 #HANGUL SYLLABLE PHIEUPH YA HIEUH + {0xBB97, 0xD360}, //9977 #HANGUL SYLLABLE PHIEUPH YAE + {0xBB98, 0xD361}, //9978 #HANGUL SYLLABLE PHIEUPH YAE KIYEOK + {0xBB99, 0xD362}, //9979 #HANGUL SYLLABLE PHIEUPH YAE SSANGKIYEOK + {0xBB9A, 0xD363}, //9980 #HANGUL SYLLABLE PHIEUPH YAE KIYEOKSIOS + {0xBB9B, 0xD364}, //9981 #HANGUL SYLLABLE PHIEUPH YAE NIEUN + {0xBB9C, 0xD365}, //9982 #HANGUL SYLLABLE PHIEUPH YAE NIEUNCIEUC + {0xBB9D, 0xD366}, //9983 #HANGUL SYLLABLE PHIEUPH YAE NIEUNHIEUH + {0xBB9E, 0xD367}, //9984 #HANGUL SYLLABLE PHIEUPH YAE TIKEUT + {0xBB9F, 0xD368}, //9985 #HANGUL SYLLABLE PHIEUPH YAE RIEUL + {0xBBA0, 0xD369}, //9986 #HANGUL SYLLABLE PHIEUPH YAE RIEULKIYEOK + {0xBBA1, 0xBE68}, //9987 #HANGUL SYLLABLE SSANGPIEUP A RIEUL + {0xBBA2, 0xBE6A}, //9988 #HANGUL SYLLABLE SSANGPIEUP A RIEULMIEUM + {0xBBA3, 0xBE70}, //9989 #HANGUL SYLLABLE SSANGPIEUP A MIEUM + {0xBBA4, 0xBE71}, //9990 #HANGUL SYLLABLE SSANGPIEUP A PIEUP + {0xBBA5, 0xBE73}, //9991 #HANGUL SYLLABLE SSANGPIEUP A SIOS + {0xBBA6, 0xBE74}, //9992 #HANGUL SYLLABLE SSANGPIEUP A SSANGSIOS + {0xBBA7, 0xBE75}, //9993 #HANGUL SYLLABLE SSANGPIEUP A IEUNG + {0xBBA8, 0xBE7B}, //9994 #HANGUL SYLLABLE SSANGPIEUP A HIEUH + {0xBBA9, 0xBE7C}, //9995 #HANGUL SYLLABLE SSANGPIEUP AE + {0xBBAA, 0xBE7D}, //9996 #HANGUL SYLLABLE SSANGPIEUP AE KIYEOK + {0xBBAB, 0xBE80}, //9997 #HANGUL SYLLABLE SSANGPIEUP AE NIEUN + {0xBBAC, 0xBE84}, //9998 #HANGUL SYLLABLE SSANGPIEUP AE RIEUL + {0xBBAD, 0xBE8C}, //9999 #HANGUL SYLLABLE SSANGPIEUP AE MIEUM + {0xBBAE, 0xBE8D}, //10000 #HANGUL SYLLABLE SSANGPIEUP AE PIEUP + {0xBBAF, 0xBE8F}, //10001 #HANGUL SYLLABLE SSANGPIEUP AE SIOS + {0xBBB0, 0xBE90}, //10002 #HANGUL SYLLABLE SSANGPIEUP AE SSANGSIOS + {0xBBB1, 0xBE91}, //10003 #HANGUL SYLLABLE SSANGPIEUP AE IEUNG + {0xBBB2, 0xBE98}, //10004 #HANGUL SYLLABLE SSANGPIEUP YA + {0xBBB3, 0xBE99}, //10005 #HANGUL SYLLABLE SSANGPIEUP YA KIYEOK + {0xBBB4, 0xBEA8}, //10006 #HANGUL SYLLABLE SSANGPIEUP YA MIEUM + {0xBBB5, 0xBED0}, //10007 #HANGUL SYLLABLE SSANGPIEUP EO + {0xBBB6, 0xBED1}, //10008 #HANGUL SYLLABLE SSANGPIEUP EO KIYEOK + {0xBBB7, 0xBED4}, //10009 #HANGUL SYLLABLE SSANGPIEUP EO NIEUN + {0xBBB8, 0xBED7}, //10010 #HANGUL SYLLABLE SSANGPIEUP EO TIKEUT + {0xBBB9, 0xBED8}, //10011 #HANGUL SYLLABLE SSANGPIEUP EO RIEUL + {0xBBBA, 0xBEE0}, //10012 #HANGUL SYLLABLE SSANGPIEUP EO MIEUM + {0xBBBB, 0xBEE3}, //10013 #HANGUL SYLLABLE SSANGPIEUP EO SIOS + {0xBBBC, 0xBEE4}, //10014 #HANGUL SYLLABLE SSANGPIEUP EO SSANGSIOS + {0xBBBD, 0xBEE5}, //10015 #HANGUL SYLLABLE SSANGPIEUP EO IEUNG + {0xBBBE, 0xBEEC}, //10016 #HANGUL SYLLABLE SSANGPIEUP E + {0xBBBF, 0xBF01}, //10017 #HANGUL SYLLABLE SSANGPIEUP E IEUNG + {0xBBC0, 0xBF08}, //10018 #HANGUL SYLLABLE SSANGPIEUP YEO + {0xBBC1, 0xBF09}, //10019 #HANGUL SYLLABLE SSANGPIEUP YEO KIYEOK + {0xBBC2, 0xBF18}, //10020 #HANGUL SYLLABLE SSANGPIEUP YEO MIEUM + {0xBBC3, 0xBF19}, //10021 #HANGUL SYLLABLE SSANGPIEUP YEO PIEUP + {0xBBC4, 0xBF1B}, //10022 #HANGUL SYLLABLE SSANGPIEUP YEO SIOS + {0xBBC5, 0xBF1C}, //10023 #HANGUL SYLLABLE SSANGPIEUP YEO SSANGSIOS + {0xBBC6, 0xBF1D}, //10024 #HANGUL SYLLABLE SSANGPIEUP YEO IEUNG + {0xBBC7, 0xBF40}, //10025 #HANGUL SYLLABLE SSANGPIEUP O + {0xBBC8, 0xBF41}, //10026 #HANGUL SYLLABLE SSANGPIEUP O KIYEOK + {0xBBC9, 0xBF44}, //10027 #HANGUL SYLLABLE SSANGPIEUP O NIEUN + {0xBBCA, 0xBF48}, //10028 #HANGUL SYLLABLE SSANGPIEUP O RIEUL + {0xBBCB, 0xBF50}, //10029 #HANGUL SYLLABLE SSANGPIEUP O MIEUM + {0xBBCC, 0xBF51}, //10030 #HANGUL SYLLABLE SSANGPIEUP O PIEUP + {0xBBCD, 0xBF55}, //10031 #HANGUL SYLLABLE SSANGPIEUP O IEUNG + {0xBBCE, 0xBF94}, //10032 #HANGUL SYLLABLE SSANGPIEUP OE + {0xBBCF, 0xBFB0}, //10033 #HANGUL SYLLABLE SSANGPIEUP YO + {0xBBD0, 0xBFC5}, //10034 #HANGUL SYLLABLE SSANGPIEUP YO IEUNG + {0xBBD1, 0xBFCC}, //10035 #HANGUL SYLLABLE SSANGPIEUP U + {0xBBD2, 0xBFCD}, //10036 #HANGUL SYLLABLE SSANGPIEUP U KIYEOK + {0xBBD3, 0xBFD0}, //10037 #HANGUL SYLLABLE SSANGPIEUP U NIEUN + {0xBBD4, 0xBFD4}, //10038 #HANGUL SYLLABLE SSANGPIEUP U RIEUL + {0xBBD5, 0xBFDC}, //10039 #HANGUL SYLLABLE SSANGPIEUP U MIEUM + {0xBBD6, 0xBFDF}, //10040 #HANGUL SYLLABLE SSANGPIEUP U SIOS + {0xBBD7, 0xBFE1}, //10041 #HANGUL SYLLABLE SSANGPIEUP U IEUNG + {0xBBD8, 0xC03C}, //10042 #HANGUL SYLLABLE SSANGPIEUP YU + {0xBBD9, 0xC051}, //10043 #HANGUL SYLLABLE SSANGPIEUP YU IEUNG + {0xBBDA, 0xC058}, //10044 #HANGUL SYLLABLE SSANGPIEUP EU + {0xBBDB, 0xC05C}, //10045 #HANGUL SYLLABLE SSANGPIEUP EU NIEUN + {0xBBDC, 0xC060}, //10046 #HANGUL SYLLABLE SSANGPIEUP EU RIEUL + {0xBBDD, 0xC068}, //10047 #HANGUL SYLLABLE SSANGPIEUP EU MIEUM + {0xBBDE, 0xC069}, //10048 #HANGUL SYLLABLE SSANGPIEUP EU PIEUP + {0xBBDF, 0xC090}, //10049 #HANGUL SYLLABLE SSANGPIEUP I + {0xBBE0, 0xC091}, //10050 #HANGUL SYLLABLE SSANGPIEUP I KIYEOK + {0xBBE1, 0xC094}, //10051 #HANGUL SYLLABLE SSANGPIEUP I NIEUN + {0xBBE2, 0xC098}, //10052 #HANGUL SYLLABLE SSANGPIEUP I RIEUL + {0xBBE3, 0xC0A0}, //10053 #HANGUL SYLLABLE SSANGPIEUP I MIEUM + {0xBBE4, 0xC0A1}, //10054 #HANGUL SYLLABLE SSANGPIEUP I PIEUP + {0xBBE5, 0xC0A3}, //10055 #HANGUL SYLLABLE SSANGPIEUP I SIOS + {0xBBE6, 0xC0A5}, //10056 #HANGUL SYLLABLE SSANGPIEUP I IEUNG + {0xBBE7, 0xC0AC}, //10057 #HANGUL SYLLABLE SIOS A + {0xBBE8, 0xC0AD}, //10058 #HANGUL SYLLABLE SIOS A KIYEOK + {0xBBE9, 0xC0AF}, //10059 #HANGUL SYLLABLE SIOS A KIYEOKSIOS + {0xBBEA, 0xC0B0}, //10060 #HANGUL SYLLABLE SIOS A NIEUN + {0xBBEB, 0xC0B3}, //10061 #HANGUL SYLLABLE SIOS A TIKEUT + {0xBBEC, 0xC0B4}, //10062 #HANGUL SYLLABLE SIOS A RIEUL + {0xBBED, 0xC0B5}, //10063 #HANGUL SYLLABLE SIOS A RIEULKIYEOK + {0xBBEE, 0xC0B6}, //10064 #HANGUL SYLLABLE SIOS A RIEULMIEUM + {0xBBEF, 0xC0BC}, //10065 #HANGUL SYLLABLE SIOS A MIEUM + {0xBBF0, 0xC0BD}, //10066 #HANGUL SYLLABLE SIOS A PIEUP + {0xBBF1, 0xC0BF}, //10067 #HANGUL SYLLABLE SIOS A SIOS + {0xBBF2, 0xC0C0}, //10068 #HANGUL SYLLABLE SIOS A SSANGSIOS + {0xBBF3, 0xC0C1}, //10069 #HANGUL SYLLABLE SIOS A IEUNG + {0xBBF4, 0xC0C5}, //10070 #HANGUL SYLLABLE SIOS A THIEUTH + {0xBBF5, 0xC0C8}, //10071 #HANGUL SYLLABLE SIOS AE + {0xBBF6, 0xC0C9}, //10072 #HANGUL SYLLABLE SIOS AE KIYEOK + {0xBBF7, 0xC0CC}, //10073 #HANGUL SYLLABLE SIOS AE NIEUN + {0xBBF8, 0xC0D0}, //10074 #HANGUL SYLLABLE SIOS AE RIEUL + {0xBBF9, 0xC0D8}, //10075 #HANGUL SYLLABLE SIOS AE MIEUM + {0xBBFA, 0xC0D9}, //10076 #HANGUL SYLLABLE SIOS AE PIEUP + {0xBBFB, 0xC0DB}, //10077 #HANGUL SYLLABLE SIOS AE SIOS + {0xBBFC, 0xC0DC}, //10078 #HANGUL SYLLABLE SIOS AE SSANGSIOS + {0xBBFD, 0xC0DD}, //10079 #HANGUL SYLLABLE SIOS AE IEUNG + {0xBBFE, 0xC0E4}, //10080 #HANGUL SYLLABLE SIOS YA + {0xBC41, 0xD36A}, //10081 #HANGUL SYLLABLE PHIEUPH YAE RIEULMIEUM + {0xBC42, 0xD36B}, //10082 #HANGUL SYLLABLE PHIEUPH YAE RIEULPIEUP + {0xBC43, 0xD36C}, //10083 #HANGUL SYLLABLE PHIEUPH YAE RIEULSIOS + {0xBC44, 0xD36D}, //10084 #HANGUL SYLLABLE PHIEUPH YAE RIEULTHIEUTH + {0xBC45, 0xD36E}, //10085 #HANGUL SYLLABLE PHIEUPH YAE RIEULPHIEUPH + {0xBC46, 0xD36F}, //10086 #HANGUL SYLLABLE PHIEUPH YAE RIEULHIEUH + {0xBC47, 0xD370}, //10087 #HANGUL SYLLABLE PHIEUPH YAE MIEUM + {0xBC48, 0xD371}, //10088 #HANGUL SYLLABLE PHIEUPH YAE PIEUP + {0xBC49, 0xD372}, //10089 #HANGUL SYLLABLE PHIEUPH YAE PIEUPSIOS + {0xBC4A, 0xD373}, //10090 #HANGUL SYLLABLE PHIEUPH YAE SIOS + {0xBC4B, 0xD374}, //10091 #HANGUL SYLLABLE PHIEUPH YAE SSANGSIOS + {0xBC4C, 0xD375}, //10092 #HANGUL SYLLABLE PHIEUPH YAE IEUNG + {0xBC4D, 0xD376}, //10093 #HANGUL SYLLABLE PHIEUPH YAE CIEUC + {0xBC4E, 0xD377}, //10094 #HANGUL SYLLABLE PHIEUPH YAE CHIEUCH + {0xBC4F, 0xD378}, //10095 #HANGUL SYLLABLE PHIEUPH YAE KHIEUKH + {0xBC50, 0xD379}, //10096 #HANGUL SYLLABLE PHIEUPH YAE THIEUTH + {0xBC51, 0xD37A}, //10097 #HANGUL SYLLABLE PHIEUPH YAE PHIEUPH + {0xBC52, 0xD37B}, //10098 #HANGUL SYLLABLE PHIEUPH YAE HIEUH + {0xBC53, 0xD37E}, //10099 #HANGUL SYLLABLE PHIEUPH EO SSANGKIYEOK + {0xBC54, 0xD37F}, //10100 #HANGUL SYLLABLE PHIEUPH EO KIYEOKSIOS + {0xBC55, 0xD381}, //10101 #HANGUL SYLLABLE PHIEUPH EO NIEUNCIEUC + {0xBC56, 0xD382}, //10102 #HANGUL SYLLABLE PHIEUPH EO NIEUNHIEUH + {0xBC57, 0xD383}, //10103 #HANGUL SYLLABLE PHIEUPH EO TIKEUT + {0xBC58, 0xD385}, //10104 #HANGUL SYLLABLE PHIEUPH EO RIEULKIYEOK + {0xBC59, 0xD386}, //10105 #HANGUL SYLLABLE PHIEUPH EO RIEULMIEUM + {0xBC5A, 0xD387}, //10106 #HANGUL SYLLABLE PHIEUPH EO RIEULPIEUP + {0xBC61, 0xD388}, //10107 #HANGUL SYLLABLE PHIEUPH EO RIEULSIOS + {0xBC62, 0xD389}, //10108 #HANGUL SYLLABLE PHIEUPH EO RIEULTHIEUTH + {0xBC63, 0xD38A}, //10109 #HANGUL SYLLABLE PHIEUPH EO RIEULPHIEUPH + {0xBC64, 0xD38B}, //10110 #HANGUL SYLLABLE PHIEUPH EO RIEULHIEUH + {0xBC65, 0xD38E}, //10111 #HANGUL SYLLABLE PHIEUPH EO PIEUPSIOS + {0xBC66, 0xD392}, //10112 #HANGUL SYLLABLE PHIEUPH EO CIEUC + {0xBC67, 0xD393}, //10113 #HANGUL SYLLABLE PHIEUPH EO CHIEUCH + {0xBC68, 0xD394}, //10114 #HANGUL SYLLABLE PHIEUPH EO KHIEUKH + {0xBC69, 0xD395}, //10115 #HANGUL SYLLABLE PHIEUPH EO THIEUTH + {0xBC6A, 0xD396}, //10116 #HANGUL SYLLABLE PHIEUPH EO PHIEUPH + {0xBC6B, 0xD397}, //10117 #HANGUL SYLLABLE PHIEUPH EO HIEUH + {0xBC6C, 0xD39A}, //10118 #HANGUL SYLLABLE PHIEUPH E SSANGKIYEOK + {0xBC6D, 0xD39B}, //10119 #HANGUL SYLLABLE PHIEUPH E KIYEOKSIOS + {0xBC6E, 0xD39D}, //10120 #HANGUL SYLLABLE PHIEUPH E NIEUNCIEUC + {0xBC6F, 0xD39E}, //10121 #HANGUL SYLLABLE PHIEUPH E NIEUNHIEUH + {0xBC70, 0xD39F}, //10122 #HANGUL SYLLABLE PHIEUPH E TIKEUT + {0xBC71, 0xD3A1}, //10123 #HANGUL SYLLABLE PHIEUPH E RIEULKIYEOK + {0xBC72, 0xD3A2}, //10124 #HANGUL SYLLABLE PHIEUPH E RIEULMIEUM + {0xBC73, 0xD3A3}, //10125 #HANGUL SYLLABLE PHIEUPH E RIEULPIEUP + {0xBC74, 0xD3A4}, //10126 #HANGUL SYLLABLE PHIEUPH E RIEULSIOS + {0xBC75, 0xD3A5}, //10127 #HANGUL SYLLABLE PHIEUPH E RIEULTHIEUTH + {0xBC76, 0xD3A6}, //10128 #HANGUL SYLLABLE PHIEUPH E RIEULPHIEUPH + {0xBC77, 0xD3A7}, //10129 #HANGUL SYLLABLE PHIEUPH E RIEULHIEUH + {0xBC78, 0xD3AA}, //10130 #HANGUL SYLLABLE PHIEUPH E PIEUPSIOS + {0xBC79, 0xD3AC}, //10131 #HANGUL SYLLABLE PHIEUPH E SSANGSIOS + {0xBC7A, 0xD3AE}, //10132 #HANGUL SYLLABLE PHIEUPH E CIEUC + {0xBC81, 0xD3AF}, //10133 #HANGUL SYLLABLE PHIEUPH E CHIEUCH + {0xBC82, 0xD3B0}, //10134 #HANGUL SYLLABLE PHIEUPH E KHIEUKH + {0xBC83, 0xD3B1}, //10135 #HANGUL SYLLABLE PHIEUPH E THIEUTH + {0xBC84, 0xD3B2}, //10136 #HANGUL SYLLABLE PHIEUPH E PHIEUPH + {0xBC85, 0xD3B3}, //10137 #HANGUL SYLLABLE PHIEUPH E HIEUH + {0xBC86, 0xD3B5}, //10138 #HANGUL SYLLABLE PHIEUPH YEO KIYEOK + {0xBC87, 0xD3B6}, //10139 #HANGUL SYLLABLE PHIEUPH YEO SSANGKIYEOK + {0xBC88, 0xD3B7}, //10140 #HANGUL SYLLABLE PHIEUPH YEO KIYEOKSIOS + {0xBC89, 0xD3B9}, //10141 #HANGUL SYLLABLE PHIEUPH YEO NIEUNCIEUC + {0xBC8A, 0xD3BA}, //10142 #HANGUL SYLLABLE PHIEUPH YEO NIEUNHIEUH + {0xBC8B, 0xD3BB}, //10143 #HANGUL SYLLABLE PHIEUPH YEO TIKEUT + {0xBC8C, 0xD3BD}, //10144 #HANGUL SYLLABLE PHIEUPH YEO RIEULKIYEOK + {0xBC8D, 0xD3BE}, //10145 #HANGUL SYLLABLE PHIEUPH YEO RIEULMIEUM + {0xBC8E, 0xD3BF}, //10146 #HANGUL SYLLABLE PHIEUPH YEO RIEULPIEUP + {0xBC8F, 0xD3C0}, //10147 #HANGUL SYLLABLE PHIEUPH YEO RIEULSIOS + {0xBC90, 0xD3C1}, //10148 #HANGUL SYLLABLE PHIEUPH YEO RIEULTHIEUTH + {0xBC91, 0xD3C2}, //10149 #HANGUL SYLLABLE PHIEUPH YEO RIEULPHIEUPH + {0xBC92, 0xD3C3}, //10150 #HANGUL SYLLABLE PHIEUPH YEO RIEULHIEUH + {0xBC93, 0xD3C6}, //10151 #HANGUL SYLLABLE PHIEUPH YEO PIEUPSIOS + {0xBC94, 0xD3C7}, //10152 #HANGUL SYLLABLE PHIEUPH YEO SIOS + {0xBC95, 0xD3CA}, //10153 #HANGUL SYLLABLE PHIEUPH YEO CIEUC + {0xBC96, 0xD3CB}, //10154 #HANGUL SYLLABLE PHIEUPH YEO CHIEUCH + {0xBC97, 0xD3CC}, //10155 #HANGUL SYLLABLE PHIEUPH YEO KHIEUKH + {0xBC98, 0xD3CD}, //10156 #HANGUL SYLLABLE PHIEUPH YEO THIEUTH + {0xBC99, 0xD3CE}, //10157 #HANGUL SYLLABLE PHIEUPH YEO PHIEUPH + {0xBC9A, 0xD3CF}, //10158 #HANGUL SYLLABLE PHIEUPH YEO HIEUH + {0xBC9B, 0xD3D1}, //10159 #HANGUL SYLLABLE PHIEUPH YE KIYEOK + {0xBC9C, 0xD3D2}, //10160 #HANGUL SYLLABLE PHIEUPH YE SSANGKIYEOK + {0xBC9D, 0xD3D3}, //10161 #HANGUL SYLLABLE PHIEUPH YE KIYEOKSIOS + {0xBC9E, 0xD3D4}, //10162 #HANGUL SYLLABLE PHIEUPH YE NIEUN + {0xBC9F, 0xD3D5}, //10163 #HANGUL SYLLABLE PHIEUPH YE NIEUNCIEUC + {0xBCA0, 0xD3D6}, //10164 #HANGUL SYLLABLE PHIEUPH YE NIEUNHIEUH + {0xBCA1, 0xC0E5}, //10165 #HANGUL SYLLABLE SIOS YA KIYEOK + {0xBCA2, 0xC0E8}, //10166 #HANGUL SYLLABLE SIOS YA NIEUN + {0xBCA3, 0xC0EC}, //10167 #HANGUL SYLLABLE SIOS YA RIEUL + {0xBCA4, 0xC0F4}, //10168 #HANGUL SYLLABLE SIOS YA MIEUM + {0xBCA5, 0xC0F5}, //10169 #HANGUL SYLLABLE SIOS YA PIEUP + {0xBCA6, 0xC0F7}, //10170 #HANGUL SYLLABLE SIOS YA SIOS + {0xBCA7, 0xC0F9}, //10171 #HANGUL SYLLABLE SIOS YA IEUNG + {0xBCA8, 0xC100}, //10172 #HANGUL SYLLABLE SIOS YAE + {0xBCA9, 0xC104}, //10173 #HANGUL SYLLABLE SIOS YAE NIEUN + {0xBCAA, 0xC108}, //10174 #HANGUL SYLLABLE SIOS YAE RIEUL + {0xBCAB, 0xC110}, //10175 #HANGUL SYLLABLE SIOS YAE MIEUM + {0xBCAC, 0xC115}, //10176 #HANGUL SYLLABLE SIOS YAE IEUNG + {0xBCAD, 0xC11C}, //10177 #HANGUL SYLLABLE SIOS EO + {0xBCAE, 0xC11D}, //10178 #HANGUL SYLLABLE SIOS EO KIYEOK + {0xBCAF, 0xC11E}, //10179 #HANGUL SYLLABLE SIOS EO SSANGKIYEOK + {0xBCB0, 0xC11F}, //10180 #HANGUL SYLLABLE SIOS EO KIYEOKSIOS + {0xBCB1, 0xC120}, //10181 #HANGUL SYLLABLE SIOS EO NIEUN + {0xBCB2, 0xC123}, //10182 #HANGUL SYLLABLE SIOS EO TIKEUT + {0xBCB3, 0xC124}, //10183 #HANGUL SYLLABLE SIOS EO RIEUL + {0xBCB4, 0xC126}, //10184 #HANGUL SYLLABLE SIOS EO RIEULMIEUM + {0xBCB5, 0xC127}, //10185 #HANGUL SYLLABLE SIOS EO RIEULPIEUP + {0xBCB6, 0xC12C}, //10186 #HANGUL SYLLABLE SIOS EO MIEUM + {0xBCB7, 0xC12D}, //10187 #HANGUL SYLLABLE SIOS EO PIEUP + {0xBCB8, 0xC12F}, //10188 #HANGUL SYLLABLE SIOS EO SIOS + {0xBCB9, 0xC130}, //10189 #HANGUL SYLLABLE SIOS EO SSANGSIOS + {0xBCBA, 0xC131}, //10190 #HANGUL SYLLABLE SIOS EO IEUNG + {0xBCBB, 0xC136}, //10191 #HANGUL SYLLABLE SIOS EO PHIEUPH + {0xBCBC, 0xC138}, //10192 #HANGUL SYLLABLE SIOS E + {0xBCBD, 0xC139}, //10193 #HANGUL SYLLABLE SIOS E KIYEOK + {0xBCBE, 0xC13C}, //10194 #HANGUL SYLLABLE SIOS E NIEUN + {0xBCBF, 0xC140}, //10195 #HANGUL SYLLABLE SIOS E RIEUL + {0xBCC0, 0xC148}, //10196 #HANGUL SYLLABLE SIOS E MIEUM + {0xBCC1, 0xC149}, //10197 #HANGUL SYLLABLE SIOS E PIEUP + {0xBCC2, 0xC14B}, //10198 #HANGUL SYLLABLE SIOS E SIOS + {0xBCC3, 0xC14C}, //10199 #HANGUL SYLLABLE SIOS E SSANGSIOS + {0xBCC4, 0xC14D}, //10200 #HANGUL SYLLABLE SIOS E IEUNG + {0xBCC5, 0xC154}, //10201 #HANGUL SYLLABLE SIOS YEO + {0xBCC6, 0xC155}, //10202 #HANGUL SYLLABLE SIOS YEO KIYEOK + {0xBCC7, 0xC158}, //10203 #HANGUL SYLLABLE SIOS YEO NIEUN + {0xBCC8, 0xC15C}, //10204 #HANGUL SYLLABLE SIOS YEO RIEUL + {0xBCC9, 0xC164}, //10205 #HANGUL SYLLABLE SIOS YEO MIEUM + {0xBCCA, 0xC165}, //10206 #HANGUL SYLLABLE SIOS YEO PIEUP + {0xBCCB, 0xC167}, //10207 #HANGUL SYLLABLE SIOS YEO SIOS + {0xBCCC, 0xC168}, //10208 #HANGUL SYLLABLE SIOS YEO SSANGSIOS + {0xBCCD, 0xC169}, //10209 #HANGUL SYLLABLE SIOS YEO IEUNG + {0xBCCE, 0xC170}, //10210 #HANGUL SYLLABLE SIOS YE + {0xBCCF, 0xC174}, //10211 #HANGUL SYLLABLE SIOS YE NIEUN + {0xBCD0, 0xC178}, //10212 #HANGUL SYLLABLE SIOS YE RIEUL + {0xBCD1, 0xC185}, //10213 #HANGUL SYLLABLE SIOS YE IEUNG + {0xBCD2, 0xC18C}, //10214 #HANGUL SYLLABLE SIOS O + {0xBCD3, 0xC18D}, //10215 #HANGUL SYLLABLE SIOS O KIYEOK + {0xBCD4, 0xC18E}, //10216 #HANGUL SYLLABLE SIOS O SSANGKIYEOK + {0xBCD5, 0xC190}, //10217 #HANGUL SYLLABLE SIOS O NIEUN + {0xBCD6, 0xC194}, //10218 #HANGUL SYLLABLE SIOS O RIEUL + {0xBCD7, 0xC196}, //10219 #HANGUL SYLLABLE SIOS O RIEULMIEUM + {0xBCD8, 0xC19C}, //10220 #HANGUL SYLLABLE SIOS O MIEUM + {0xBCD9, 0xC19D}, //10221 #HANGUL SYLLABLE SIOS O PIEUP + {0xBCDA, 0xC19F}, //10222 #HANGUL SYLLABLE SIOS O SIOS + {0xBCDB, 0xC1A1}, //10223 #HANGUL SYLLABLE SIOS O IEUNG + {0xBCDC, 0xC1A5}, //10224 #HANGUL SYLLABLE SIOS O THIEUTH + {0xBCDD, 0xC1A8}, //10225 #HANGUL SYLLABLE SIOS WA + {0xBCDE, 0xC1A9}, //10226 #HANGUL SYLLABLE SIOS WA KIYEOK + {0xBCDF, 0xC1AC}, //10227 #HANGUL SYLLABLE SIOS WA NIEUN + {0xBCE0, 0xC1B0}, //10228 #HANGUL SYLLABLE SIOS WA RIEUL + {0xBCE1, 0xC1BD}, //10229 #HANGUL SYLLABLE SIOS WA IEUNG + {0xBCE2, 0xC1C4}, //10230 #HANGUL SYLLABLE SIOS WAE + {0xBCE3, 0xC1C8}, //10231 #HANGUL SYLLABLE SIOS WAE NIEUN + {0xBCE4, 0xC1CC}, //10232 #HANGUL SYLLABLE SIOS WAE RIEUL + {0xBCE5, 0xC1D4}, //10233 #HANGUL SYLLABLE SIOS WAE MIEUM + {0xBCE6, 0xC1D7}, //10234 #HANGUL SYLLABLE SIOS WAE SIOS + {0xBCE7, 0xC1D8}, //10235 #HANGUL SYLLABLE SIOS WAE SSANGSIOS + {0xBCE8, 0xC1E0}, //10236 #HANGUL SYLLABLE SIOS OE + {0xBCE9, 0xC1E4}, //10237 #HANGUL SYLLABLE SIOS OE NIEUN + {0xBCEA, 0xC1E8}, //10238 #HANGUL SYLLABLE SIOS OE RIEUL + {0xBCEB, 0xC1F0}, //10239 #HANGUL SYLLABLE SIOS OE MIEUM + {0xBCEC, 0xC1F1}, //10240 #HANGUL SYLLABLE SIOS OE PIEUP + {0xBCED, 0xC1F3}, //10241 #HANGUL SYLLABLE SIOS OE SIOS + {0xBCEE, 0xC1FC}, //10242 #HANGUL SYLLABLE SIOS YO + {0xBCEF, 0xC1FD}, //10243 #HANGUL SYLLABLE SIOS YO KIYEOK + {0xBCF0, 0xC200}, //10244 #HANGUL SYLLABLE SIOS YO NIEUN + {0xBCF1, 0xC204}, //10245 #HANGUL SYLLABLE SIOS YO RIEUL + {0xBCF2, 0xC20C}, //10246 #HANGUL SYLLABLE SIOS YO MIEUM + {0xBCF3, 0xC20D}, //10247 #HANGUL SYLLABLE SIOS YO PIEUP + {0xBCF4, 0xC20F}, //10248 #HANGUL SYLLABLE SIOS YO SIOS + {0xBCF5, 0xC211}, //10249 #HANGUL SYLLABLE SIOS YO IEUNG + {0xBCF6, 0xC218}, //10250 #HANGUL SYLLABLE SIOS U + {0xBCF7, 0xC219}, //10251 #HANGUL SYLLABLE SIOS U KIYEOK + {0xBCF8, 0xC21C}, //10252 #HANGUL SYLLABLE SIOS U NIEUN + {0xBCF9, 0xC21F}, //10253 #HANGUL SYLLABLE SIOS U TIKEUT + {0xBCFA, 0xC220}, //10254 #HANGUL SYLLABLE SIOS U RIEUL + {0xBCFB, 0xC228}, //10255 #HANGUL SYLLABLE SIOS U MIEUM + {0xBCFC, 0xC229}, //10256 #HANGUL SYLLABLE SIOS U PIEUP + {0xBCFD, 0xC22B}, //10257 #HANGUL SYLLABLE SIOS U SIOS + {0xBCFE, 0xC22D}, //10258 #HANGUL SYLLABLE SIOS U IEUNG + {0xBD41, 0xD3D7}, //10259 #HANGUL SYLLABLE PHIEUPH YE TIKEUT + {0xBD42, 0xD3D9}, //10260 #HANGUL SYLLABLE PHIEUPH YE RIEULKIYEOK + {0xBD43, 0xD3DA}, //10261 #HANGUL SYLLABLE PHIEUPH YE RIEULMIEUM + {0xBD44, 0xD3DB}, //10262 #HANGUL SYLLABLE PHIEUPH YE RIEULPIEUP + {0xBD45, 0xD3DC}, //10263 #HANGUL SYLLABLE PHIEUPH YE RIEULSIOS + {0xBD46, 0xD3DD}, //10264 #HANGUL SYLLABLE PHIEUPH YE RIEULTHIEUTH + {0xBD47, 0xD3DE}, //10265 #HANGUL SYLLABLE PHIEUPH YE RIEULPHIEUPH + {0xBD48, 0xD3DF}, //10266 #HANGUL SYLLABLE PHIEUPH YE RIEULHIEUH + {0xBD49, 0xD3E0}, //10267 #HANGUL SYLLABLE PHIEUPH YE MIEUM + {0xBD4A, 0xD3E2}, //10268 #HANGUL SYLLABLE PHIEUPH YE PIEUPSIOS + {0xBD4B, 0xD3E4}, //10269 #HANGUL SYLLABLE PHIEUPH YE SSANGSIOS + {0xBD4C, 0xD3E5}, //10270 #HANGUL SYLLABLE PHIEUPH YE IEUNG + {0xBD4D, 0xD3E6}, //10271 #HANGUL SYLLABLE PHIEUPH YE CIEUC + {0xBD4E, 0xD3E7}, //10272 #HANGUL SYLLABLE PHIEUPH YE CHIEUCH + {0xBD4F, 0xD3E8}, //10273 #HANGUL SYLLABLE PHIEUPH YE KHIEUKH + {0xBD50, 0xD3E9}, //10274 #HANGUL SYLLABLE PHIEUPH YE THIEUTH + {0xBD51, 0xD3EA}, //10275 #HANGUL SYLLABLE PHIEUPH YE PHIEUPH + {0xBD52, 0xD3EB}, //10276 #HANGUL SYLLABLE PHIEUPH YE HIEUH + {0xBD53, 0xD3EE}, //10277 #HANGUL SYLLABLE PHIEUPH O SSANGKIYEOK + {0xBD54, 0xD3EF}, //10278 #HANGUL SYLLABLE PHIEUPH O KIYEOKSIOS + {0xBD55, 0xD3F1}, //10279 #HANGUL SYLLABLE PHIEUPH O NIEUNCIEUC + {0xBD56, 0xD3F2}, //10280 #HANGUL SYLLABLE PHIEUPH O NIEUNHIEUH + {0xBD57, 0xD3F3}, //10281 #HANGUL SYLLABLE PHIEUPH O TIKEUT + {0xBD58, 0xD3F5}, //10282 #HANGUL SYLLABLE PHIEUPH O RIEULKIYEOK + {0xBD59, 0xD3F6}, //10283 #HANGUL SYLLABLE PHIEUPH O RIEULMIEUM + {0xBD5A, 0xD3F7}, //10284 #HANGUL SYLLABLE PHIEUPH O RIEULPIEUP + {0xBD61, 0xD3F8}, //10285 #HANGUL SYLLABLE PHIEUPH O RIEULSIOS + {0xBD62, 0xD3F9}, //10286 #HANGUL SYLLABLE PHIEUPH O RIEULTHIEUTH + {0xBD63, 0xD3FA}, //10287 #HANGUL SYLLABLE PHIEUPH O RIEULPHIEUPH + {0xBD64, 0xD3FB}, //10288 #HANGUL SYLLABLE PHIEUPH O RIEULHIEUH + {0xBD65, 0xD3FE}, //10289 #HANGUL SYLLABLE PHIEUPH O PIEUPSIOS + {0xBD66, 0xD400}, //10290 #HANGUL SYLLABLE PHIEUPH O SSANGSIOS + {0xBD67, 0xD402}, //10291 #HANGUL SYLLABLE PHIEUPH O CIEUC + {0xBD68, 0xD403}, //10292 #HANGUL SYLLABLE PHIEUPH O CHIEUCH + {0xBD69, 0xD404}, //10293 #HANGUL SYLLABLE PHIEUPH O KHIEUKH + {0xBD6A, 0xD405}, //10294 #HANGUL SYLLABLE PHIEUPH O THIEUTH + {0xBD6B, 0xD406}, //10295 #HANGUL SYLLABLE PHIEUPH O PHIEUPH + {0xBD6C, 0xD407}, //10296 #HANGUL SYLLABLE PHIEUPH O HIEUH + {0xBD6D, 0xD409}, //10297 #HANGUL SYLLABLE PHIEUPH WA KIYEOK + {0xBD6E, 0xD40A}, //10298 #HANGUL SYLLABLE PHIEUPH WA SSANGKIYEOK + {0xBD6F, 0xD40B}, //10299 #HANGUL SYLLABLE PHIEUPH WA KIYEOKSIOS + {0xBD70, 0xD40C}, //10300 #HANGUL SYLLABLE PHIEUPH WA NIEUN + {0xBD71, 0xD40D}, //10301 #HANGUL SYLLABLE PHIEUPH WA NIEUNCIEUC + {0xBD72, 0xD40E}, //10302 #HANGUL SYLLABLE PHIEUPH WA NIEUNHIEUH + {0xBD73, 0xD40F}, //10303 #HANGUL SYLLABLE PHIEUPH WA TIKEUT + {0xBD74, 0xD410}, //10304 #HANGUL SYLLABLE PHIEUPH WA RIEUL + {0xBD75, 0xD411}, //10305 #HANGUL SYLLABLE PHIEUPH WA RIEULKIYEOK + {0xBD76, 0xD412}, //10306 #HANGUL SYLLABLE PHIEUPH WA RIEULMIEUM + {0xBD77, 0xD413}, //10307 #HANGUL SYLLABLE PHIEUPH WA RIEULPIEUP + {0xBD78, 0xD414}, //10308 #HANGUL SYLLABLE PHIEUPH WA RIEULSIOS + {0xBD79, 0xD415}, //10309 #HANGUL SYLLABLE PHIEUPH WA RIEULTHIEUTH + {0xBD7A, 0xD416}, //10310 #HANGUL SYLLABLE PHIEUPH WA RIEULPHIEUPH + {0xBD81, 0xD417}, //10311 #HANGUL SYLLABLE PHIEUPH WA RIEULHIEUH + {0xBD82, 0xD418}, //10312 #HANGUL SYLLABLE PHIEUPH WA MIEUM + {0xBD83, 0xD419}, //10313 #HANGUL SYLLABLE PHIEUPH WA PIEUP + {0xBD84, 0xD41A}, //10314 #HANGUL SYLLABLE PHIEUPH WA PIEUPSIOS + {0xBD85, 0xD41B}, //10315 #HANGUL SYLLABLE PHIEUPH WA SIOS + {0xBD86, 0xD41C}, //10316 #HANGUL SYLLABLE PHIEUPH WA SSANGSIOS + {0xBD87, 0xD41E}, //10317 #HANGUL SYLLABLE PHIEUPH WA CIEUC + {0xBD88, 0xD41F}, //10318 #HANGUL SYLLABLE PHIEUPH WA CHIEUCH + {0xBD89, 0xD420}, //10319 #HANGUL SYLLABLE PHIEUPH WA KHIEUKH + {0xBD8A, 0xD421}, //10320 #HANGUL SYLLABLE PHIEUPH WA THIEUTH + {0xBD8B, 0xD422}, //10321 #HANGUL SYLLABLE PHIEUPH WA PHIEUPH + {0xBD8C, 0xD423}, //10322 #HANGUL SYLLABLE PHIEUPH WA HIEUH + {0xBD8D, 0xD424}, //10323 #HANGUL SYLLABLE PHIEUPH WAE + {0xBD8E, 0xD425}, //10324 #HANGUL SYLLABLE PHIEUPH WAE KIYEOK + {0xBD8F, 0xD426}, //10325 #HANGUL SYLLABLE PHIEUPH WAE SSANGKIYEOK + {0xBD90, 0xD427}, //10326 #HANGUL SYLLABLE PHIEUPH WAE KIYEOKSIOS + {0xBD91, 0xD428}, //10327 #HANGUL SYLLABLE PHIEUPH WAE NIEUN + {0xBD92, 0xD429}, //10328 #HANGUL SYLLABLE PHIEUPH WAE NIEUNCIEUC + {0xBD93, 0xD42A}, //10329 #HANGUL SYLLABLE PHIEUPH WAE NIEUNHIEUH + {0xBD94, 0xD42B}, //10330 #HANGUL SYLLABLE PHIEUPH WAE TIKEUT + {0xBD95, 0xD42C}, //10331 #HANGUL SYLLABLE PHIEUPH WAE RIEUL + {0xBD96, 0xD42D}, //10332 #HANGUL SYLLABLE PHIEUPH WAE RIEULKIYEOK + {0xBD97, 0xD42E}, //10333 #HANGUL SYLLABLE PHIEUPH WAE RIEULMIEUM + {0xBD98, 0xD42F}, //10334 #HANGUL SYLLABLE PHIEUPH WAE RIEULPIEUP + {0xBD99, 0xD430}, //10335 #HANGUL SYLLABLE PHIEUPH WAE RIEULSIOS + {0xBD9A, 0xD431}, //10336 #HANGUL SYLLABLE PHIEUPH WAE RIEULTHIEUTH + {0xBD9B, 0xD432}, //10337 #HANGUL SYLLABLE PHIEUPH WAE RIEULPHIEUPH + {0xBD9C, 0xD433}, //10338 #HANGUL SYLLABLE PHIEUPH WAE RIEULHIEUH + {0xBD9D, 0xD434}, //10339 #HANGUL SYLLABLE PHIEUPH WAE MIEUM + {0xBD9E, 0xD435}, //10340 #HANGUL SYLLABLE PHIEUPH WAE PIEUP + {0xBD9F, 0xD436}, //10341 #HANGUL SYLLABLE PHIEUPH WAE PIEUPSIOS + {0xBDA0, 0xD437}, //10342 #HANGUL SYLLABLE PHIEUPH WAE SIOS + {0xBDA1, 0xC22F}, //10343 #HANGUL SYLLABLE SIOS U CHIEUCH + {0xBDA2, 0xC231}, //10344 #HANGUL SYLLABLE SIOS U THIEUTH + {0xBDA3, 0xC232}, //10345 #HANGUL SYLLABLE SIOS U PHIEUPH + {0xBDA4, 0xC234}, //10346 #HANGUL SYLLABLE SIOS WEO + {0xBDA5, 0xC248}, //10347 #HANGUL SYLLABLE SIOS WEO SSANGSIOS + {0xBDA6, 0xC250}, //10348 #HANGUL SYLLABLE SIOS WE + {0xBDA7, 0xC251}, //10349 #HANGUL SYLLABLE SIOS WE KIYEOK + {0xBDA8, 0xC254}, //10350 #HANGUL SYLLABLE SIOS WE NIEUN + {0xBDA9, 0xC258}, //10351 #HANGUL SYLLABLE SIOS WE RIEUL + {0xBDAA, 0xC260}, //10352 #HANGUL SYLLABLE SIOS WE MIEUM + {0xBDAB, 0xC265}, //10353 #HANGUL SYLLABLE SIOS WE IEUNG + {0xBDAC, 0xC26C}, //10354 #HANGUL SYLLABLE SIOS WI + {0xBDAD, 0xC26D}, //10355 #HANGUL SYLLABLE SIOS WI KIYEOK + {0xBDAE, 0xC270}, //10356 #HANGUL SYLLABLE SIOS WI NIEUN + {0xBDAF, 0xC274}, //10357 #HANGUL SYLLABLE SIOS WI RIEUL + {0xBDB0, 0xC27C}, //10358 #HANGUL SYLLABLE SIOS WI MIEUM + {0xBDB1, 0xC27D}, //10359 #HANGUL SYLLABLE SIOS WI PIEUP + {0xBDB2, 0xC27F}, //10360 #HANGUL SYLLABLE SIOS WI SIOS + {0xBDB3, 0xC281}, //10361 #HANGUL SYLLABLE SIOS WI IEUNG + {0xBDB4, 0xC288}, //10362 #HANGUL SYLLABLE SIOS YU + {0xBDB5, 0xC289}, //10363 #HANGUL SYLLABLE SIOS YU KIYEOK + {0xBDB6, 0xC290}, //10364 #HANGUL SYLLABLE SIOS YU RIEUL + {0xBDB7, 0xC298}, //10365 #HANGUL SYLLABLE SIOS YU MIEUM + {0xBDB8, 0xC29B}, //10366 #HANGUL SYLLABLE SIOS YU SIOS + {0xBDB9, 0xC29D}, //10367 #HANGUL SYLLABLE SIOS YU IEUNG + {0xBDBA, 0xC2A4}, //10368 #HANGUL SYLLABLE SIOS EU + {0xBDBB, 0xC2A5}, //10369 #HANGUL SYLLABLE SIOS EU KIYEOK + {0xBDBC, 0xC2A8}, //10370 #HANGUL SYLLABLE SIOS EU NIEUN + {0xBDBD, 0xC2AC}, //10371 #HANGUL SYLLABLE SIOS EU RIEUL + {0xBDBE, 0xC2AD}, //10372 #HANGUL SYLLABLE SIOS EU RIEULKIYEOK + {0xBDBF, 0xC2B4}, //10373 #HANGUL SYLLABLE SIOS EU MIEUM + {0xBDC0, 0xC2B5}, //10374 #HANGUL SYLLABLE SIOS EU PIEUP + {0xBDC1, 0xC2B7}, //10375 #HANGUL SYLLABLE SIOS EU SIOS + {0xBDC2, 0xC2B9}, //10376 #HANGUL SYLLABLE SIOS EU IEUNG + {0xBDC3, 0xC2DC}, //10377 #HANGUL SYLLABLE SIOS I + {0xBDC4, 0xC2DD}, //10378 #HANGUL SYLLABLE SIOS I KIYEOK + {0xBDC5, 0xC2E0}, //10379 #HANGUL SYLLABLE SIOS I NIEUN + {0xBDC6, 0xC2E3}, //10380 #HANGUL SYLLABLE SIOS I TIKEUT + {0xBDC7, 0xC2E4}, //10381 #HANGUL SYLLABLE SIOS I RIEUL + {0xBDC8, 0xC2EB}, //10382 #HANGUL SYLLABLE SIOS I RIEULHIEUH + {0xBDC9, 0xC2EC}, //10383 #HANGUL SYLLABLE SIOS I MIEUM + {0xBDCA, 0xC2ED}, //10384 #HANGUL SYLLABLE SIOS I PIEUP + {0xBDCB, 0xC2EF}, //10385 #HANGUL SYLLABLE SIOS I SIOS + {0xBDCC, 0xC2F1}, //10386 #HANGUL SYLLABLE SIOS I IEUNG + {0xBDCD, 0xC2F6}, //10387 #HANGUL SYLLABLE SIOS I PHIEUPH + {0xBDCE, 0xC2F8}, //10388 #HANGUL SYLLABLE SSANGSIOS A + {0xBDCF, 0xC2F9}, //10389 #HANGUL SYLLABLE SSANGSIOS A KIYEOK + {0xBDD0, 0xC2FB}, //10390 #HANGUL SYLLABLE SSANGSIOS A KIYEOKSIOS + {0xBDD1, 0xC2FC}, //10391 #HANGUL SYLLABLE SSANGSIOS A NIEUN + {0xBDD2, 0xC300}, //10392 #HANGUL SYLLABLE SSANGSIOS A RIEUL + {0xBDD3, 0xC308}, //10393 #HANGUL SYLLABLE SSANGSIOS A MIEUM + {0xBDD4, 0xC309}, //10394 #HANGUL SYLLABLE SSANGSIOS A PIEUP + {0xBDD5, 0xC30C}, //10395 #HANGUL SYLLABLE SSANGSIOS A SSANGSIOS + {0xBDD6, 0xC30D}, //10396 #HANGUL SYLLABLE SSANGSIOS A IEUNG + {0xBDD7, 0xC313}, //10397 #HANGUL SYLLABLE SSANGSIOS A HIEUH + {0xBDD8, 0xC314}, //10398 #HANGUL SYLLABLE SSANGSIOS AE + {0xBDD9, 0xC315}, //10399 #HANGUL SYLLABLE SSANGSIOS AE KIYEOK + {0xBDDA, 0xC318}, //10400 #HANGUL SYLLABLE SSANGSIOS AE NIEUN + {0xBDDB, 0xC31C}, //10401 #HANGUL SYLLABLE SSANGSIOS AE RIEUL + {0xBDDC, 0xC324}, //10402 #HANGUL SYLLABLE SSANGSIOS AE MIEUM + {0xBDDD, 0xC325}, //10403 #HANGUL SYLLABLE SSANGSIOS AE PIEUP + {0xBDDE, 0xC328}, //10404 #HANGUL SYLLABLE SSANGSIOS AE SSANGSIOS + {0xBDDF, 0xC329}, //10405 #HANGUL SYLLABLE SSANGSIOS AE IEUNG + {0xBDE0, 0xC345}, //10406 #HANGUL SYLLABLE SSANGSIOS YA IEUNG + {0xBDE1, 0xC368}, //10407 #HANGUL SYLLABLE SSANGSIOS EO + {0xBDE2, 0xC369}, //10408 #HANGUL SYLLABLE SSANGSIOS EO KIYEOK + {0xBDE3, 0xC36C}, //10409 #HANGUL SYLLABLE SSANGSIOS EO NIEUN + {0xBDE4, 0xC370}, //10410 #HANGUL SYLLABLE SSANGSIOS EO RIEUL + {0xBDE5, 0xC372}, //10411 #HANGUL SYLLABLE SSANGSIOS EO RIEULMIEUM + {0xBDE6, 0xC378}, //10412 #HANGUL SYLLABLE SSANGSIOS EO MIEUM + {0xBDE7, 0xC379}, //10413 #HANGUL SYLLABLE SSANGSIOS EO PIEUP + {0xBDE8, 0xC37C}, //10414 #HANGUL SYLLABLE SSANGSIOS EO SSANGSIOS + {0xBDE9, 0xC37D}, //10415 #HANGUL SYLLABLE SSANGSIOS EO IEUNG + {0xBDEA, 0xC384}, //10416 #HANGUL SYLLABLE SSANGSIOS E + {0xBDEB, 0xC388}, //10417 #HANGUL SYLLABLE SSANGSIOS E NIEUN + {0xBDEC, 0xC38C}, //10418 #HANGUL SYLLABLE SSANGSIOS E RIEUL + {0xBDED, 0xC3C0}, //10419 #HANGUL SYLLABLE SSANGSIOS YE NIEUN + {0xBDEE, 0xC3D8}, //10420 #HANGUL SYLLABLE SSANGSIOS O + {0xBDEF, 0xC3D9}, //10421 #HANGUL SYLLABLE SSANGSIOS O KIYEOK + {0xBDF0, 0xC3DC}, //10422 #HANGUL SYLLABLE SSANGSIOS O NIEUN + {0xBDF1, 0xC3DF}, //10423 #HANGUL SYLLABLE SSANGSIOS O TIKEUT + {0xBDF2, 0xC3E0}, //10424 #HANGUL SYLLABLE SSANGSIOS O RIEUL + {0xBDF3, 0xC3E2}, //10425 #HANGUL SYLLABLE SSANGSIOS O RIEULMIEUM + {0xBDF4, 0xC3E8}, //10426 #HANGUL SYLLABLE SSANGSIOS O MIEUM + {0xBDF5, 0xC3E9}, //10427 #HANGUL SYLLABLE SSANGSIOS O PIEUP + {0xBDF6, 0xC3ED}, //10428 #HANGUL SYLLABLE SSANGSIOS O IEUNG + {0xBDF7, 0xC3F4}, //10429 #HANGUL SYLLABLE SSANGSIOS WA + {0xBDF8, 0xC3F5}, //10430 #HANGUL SYLLABLE SSANGSIOS WA KIYEOK + {0xBDF9, 0xC3F8}, //10431 #HANGUL SYLLABLE SSANGSIOS WA NIEUN + {0xBDFA, 0xC408}, //10432 #HANGUL SYLLABLE SSANGSIOS WA SSANGSIOS + {0xBDFB, 0xC410}, //10433 #HANGUL SYLLABLE SSANGSIOS WAE + {0xBDFC, 0xC424}, //10434 #HANGUL SYLLABLE SSANGSIOS WAE SSANGSIOS + {0xBDFD, 0xC42C}, //10435 #HANGUL SYLLABLE SSANGSIOS OE + {0xBDFE, 0xC430}, //10436 #HANGUL SYLLABLE SSANGSIOS OE NIEUN + {0xBE41, 0xD438}, //10437 #HANGUL SYLLABLE PHIEUPH WAE SSANGSIOS + {0xBE42, 0xD439}, //10438 #HANGUL SYLLABLE PHIEUPH WAE IEUNG + {0xBE43, 0xD43A}, //10439 #HANGUL SYLLABLE PHIEUPH WAE CIEUC + {0xBE44, 0xD43B}, //10440 #HANGUL SYLLABLE PHIEUPH WAE CHIEUCH + {0xBE45, 0xD43C}, //10441 #HANGUL SYLLABLE PHIEUPH WAE KHIEUKH + {0xBE46, 0xD43D}, //10442 #HANGUL SYLLABLE PHIEUPH WAE THIEUTH + {0xBE47, 0xD43E}, //10443 #HANGUL SYLLABLE PHIEUPH WAE PHIEUPH + {0xBE48, 0xD43F}, //10444 #HANGUL SYLLABLE PHIEUPH WAE HIEUH + {0xBE49, 0xD441}, //10445 #HANGUL SYLLABLE PHIEUPH OE KIYEOK + {0xBE4A, 0xD442}, //10446 #HANGUL SYLLABLE PHIEUPH OE SSANGKIYEOK + {0xBE4B, 0xD443}, //10447 #HANGUL SYLLABLE PHIEUPH OE KIYEOKSIOS + {0xBE4C, 0xD445}, //10448 #HANGUL SYLLABLE PHIEUPH OE NIEUNCIEUC + {0xBE4D, 0xD446}, //10449 #HANGUL SYLLABLE PHIEUPH OE NIEUNHIEUH + {0xBE4E, 0xD447}, //10450 #HANGUL SYLLABLE PHIEUPH OE TIKEUT + {0xBE4F, 0xD448}, //10451 #HANGUL SYLLABLE PHIEUPH OE RIEUL + {0xBE50, 0xD449}, //10452 #HANGUL SYLLABLE PHIEUPH OE RIEULKIYEOK + {0xBE51, 0xD44A}, //10453 #HANGUL SYLLABLE PHIEUPH OE RIEULMIEUM + {0xBE52, 0xD44B}, //10454 #HANGUL SYLLABLE PHIEUPH OE RIEULPIEUP + {0xBE53, 0xD44C}, //10455 #HANGUL SYLLABLE PHIEUPH OE RIEULSIOS + {0xBE54, 0xD44D}, //10456 #HANGUL SYLLABLE PHIEUPH OE RIEULTHIEUTH + {0xBE55, 0xD44E}, //10457 #HANGUL SYLLABLE PHIEUPH OE RIEULPHIEUPH + {0xBE56, 0xD44F}, //10458 #HANGUL SYLLABLE PHIEUPH OE RIEULHIEUH + {0xBE57, 0xD450}, //10459 #HANGUL SYLLABLE PHIEUPH OE MIEUM + {0xBE58, 0xD451}, //10460 #HANGUL SYLLABLE PHIEUPH OE PIEUP + {0xBE59, 0xD452}, //10461 #HANGUL SYLLABLE PHIEUPH OE PIEUPSIOS + {0xBE5A, 0xD453}, //10462 #HANGUL SYLLABLE PHIEUPH OE SIOS + {0xBE61, 0xD454}, //10463 #HANGUL SYLLABLE PHIEUPH OE SSANGSIOS + {0xBE62, 0xD455}, //10464 #HANGUL SYLLABLE PHIEUPH OE IEUNG + {0xBE63, 0xD456}, //10465 #HANGUL SYLLABLE PHIEUPH OE CIEUC + {0xBE64, 0xD457}, //10466 #HANGUL SYLLABLE PHIEUPH OE CHIEUCH + {0xBE65, 0xD458}, //10467 #HANGUL SYLLABLE PHIEUPH OE KHIEUKH + {0xBE66, 0xD459}, //10468 #HANGUL SYLLABLE PHIEUPH OE THIEUTH + {0xBE67, 0xD45A}, //10469 #HANGUL SYLLABLE PHIEUPH OE PHIEUPH + {0xBE68, 0xD45B}, //10470 #HANGUL SYLLABLE PHIEUPH OE HIEUH + {0xBE69, 0xD45D}, //10471 #HANGUL SYLLABLE PHIEUPH YO KIYEOK + {0xBE6A, 0xD45E}, //10472 #HANGUL SYLLABLE PHIEUPH YO SSANGKIYEOK + {0xBE6B, 0xD45F}, //10473 #HANGUL SYLLABLE PHIEUPH YO KIYEOKSIOS + {0xBE6C, 0xD461}, //10474 #HANGUL SYLLABLE PHIEUPH YO NIEUNCIEUC + {0xBE6D, 0xD462}, //10475 #HANGUL SYLLABLE PHIEUPH YO NIEUNHIEUH + {0xBE6E, 0xD463}, //10476 #HANGUL SYLLABLE PHIEUPH YO TIKEUT + {0xBE6F, 0xD465}, //10477 #HANGUL SYLLABLE PHIEUPH YO RIEULKIYEOK + {0xBE70, 0xD466}, //10478 #HANGUL SYLLABLE PHIEUPH YO RIEULMIEUM + {0xBE71, 0xD467}, //10479 #HANGUL SYLLABLE PHIEUPH YO RIEULPIEUP + {0xBE72, 0xD468}, //10480 #HANGUL SYLLABLE PHIEUPH YO RIEULSIOS + {0xBE73, 0xD469}, //10481 #HANGUL SYLLABLE PHIEUPH YO RIEULTHIEUTH + {0xBE74, 0xD46A}, //10482 #HANGUL SYLLABLE PHIEUPH YO RIEULPHIEUPH + {0xBE75, 0xD46B}, //10483 #HANGUL SYLLABLE PHIEUPH YO RIEULHIEUH + {0xBE76, 0xD46C}, //10484 #HANGUL SYLLABLE PHIEUPH YO MIEUM + {0xBE77, 0xD46E}, //10485 #HANGUL SYLLABLE PHIEUPH YO PIEUPSIOS + {0xBE78, 0xD470}, //10486 #HANGUL SYLLABLE PHIEUPH YO SSANGSIOS + {0xBE79, 0xD471}, //10487 #HANGUL SYLLABLE PHIEUPH YO IEUNG + {0xBE7A, 0xD472}, //10488 #HANGUL SYLLABLE PHIEUPH YO CIEUC + {0xBE81, 0xD473}, //10489 #HANGUL SYLLABLE PHIEUPH YO CHIEUCH + {0xBE82, 0xD474}, //10490 #HANGUL SYLLABLE PHIEUPH YO KHIEUKH + {0xBE83, 0xD475}, //10491 #HANGUL SYLLABLE PHIEUPH YO THIEUTH + {0xBE84, 0xD476}, //10492 #HANGUL SYLLABLE PHIEUPH YO PHIEUPH + {0xBE85, 0xD477}, //10493 #HANGUL SYLLABLE PHIEUPH YO HIEUH + {0xBE86, 0xD47A}, //10494 #HANGUL SYLLABLE PHIEUPH U SSANGKIYEOK + {0xBE87, 0xD47B}, //10495 #HANGUL SYLLABLE PHIEUPH U KIYEOKSIOS + {0xBE88, 0xD47D}, //10496 #HANGUL SYLLABLE PHIEUPH U NIEUNCIEUC + {0xBE89, 0xD47E}, //10497 #HANGUL SYLLABLE PHIEUPH U NIEUNHIEUH + {0xBE8A, 0xD481}, //10498 #HANGUL SYLLABLE PHIEUPH U RIEULKIYEOK + {0xBE8B, 0xD483}, //10499 #HANGUL SYLLABLE PHIEUPH U RIEULPIEUP + {0xBE8C, 0xD484}, //10500 #HANGUL SYLLABLE PHIEUPH U RIEULSIOS + {0xBE8D, 0xD485}, //10501 #HANGUL SYLLABLE PHIEUPH U RIEULTHIEUTH + {0xBE8E, 0xD486}, //10502 #HANGUL SYLLABLE PHIEUPH U RIEULPHIEUPH + {0xBE8F, 0xD487}, //10503 #HANGUL SYLLABLE PHIEUPH U RIEULHIEUH + {0xBE90, 0xD48A}, //10504 #HANGUL SYLLABLE PHIEUPH U PIEUPSIOS + {0xBE91, 0xD48C}, //10505 #HANGUL SYLLABLE PHIEUPH U SSANGSIOS + {0xBE92, 0xD48E}, //10506 #HANGUL SYLLABLE PHIEUPH U CIEUC + {0xBE93, 0xD48F}, //10507 #HANGUL SYLLABLE PHIEUPH U CHIEUCH + {0xBE94, 0xD490}, //10508 #HANGUL SYLLABLE PHIEUPH U KHIEUKH + {0xBE95, 0xD491}, //10509 #HANGUL SYLLABLE PHIEUPH U THIEUTH + {0xBE96, 0xD492}, //10510 #HANGUL SYLLABLE PHIEUPH U PHIEUPH + {0xBE97, 0xD493}, //10511 #HANGUL SYLLABLE PHIEUPH U HIEUH + {0xBE98, 0xD495}, //10512 #HANGUL SYLLABLE PHIEUPH WEO KIYEOK + {0xBE99, 0xD496}, //10513 #HANGUL SYLLABLE PHIEUPH WEO SSANGKIYEOK + {0xBE9A, 0xD497}, //10514 #HANGUL SYLLABLE PHIEUPH WEO KIYEOKSIOS + {0xBE9B, 0xD498}, //10515 #HANGUL SYLLABLE PHIEUPH WEO NIEUN + {0xBE9C, 0xD499}, //10516 #HANGUL SYLLABLE PHIEUPH WEO NIEUNCIEUC + {0xBE9D, 0xD49A}, //10517 #HANGUL SYLLABLE PHIEUPH WEO NIEUNHIEUH + {0xBE9E, 0xD49B}, //10518 #HANGUL SYLLABLE PHIEUPH WEO TIKEUT + {0xBE9F, 0xD49C}, //10519 #HANGUL SYLLABLE PHIEUPH WEO RIEUL + {0xBEA0, 0xD49D}, //10520 #HANGUL SYLLABLE PHIEUPH WEO RIEULKIYEOK + {0xBEA1, 0xC434}, //10521 #HANGUL SYLLABLE SSANGSIOS OE RIEUL + {0xBEA2, 0xC43C}, //10522 #HANGUL SYLLABLE SSANGSIOS OE MIEUM + {0xBEA3, 0xC43D}, //10523 #HANGUL SYLLABLE SSANGSIOS OE PIEUP + {0xBEA4, 0xC448}, //10524 #HANGUL SYLLABLE SSANGSIOS YO + {0xBEA5, 0xC464}, //10525 #HANGUL SYLLABLE SSANGSIOS U + {0xBEA6, 0xC465}, //10526 #HANGUL SYLLABLE SSANGSIOS U KIYEOK + {0xBEA7, 0xC468}, //10527 #HANGUL SYLLABLE SSANGSIOS U NIEUN + {0xBEA8, 0xC46C}, //10528 #HANGUL SYLLABLE SSANGSIOS U RIEUL + {0xBEA9, 0xC474}, //10529 #HANGUL SYLLABLE SSANGSIOS U MIEUM + {0xBEAA, 0xC475}, //10530 #HANGUL SYLLABLE SSANGSIOS U PIEUP + {0xBEAB, 0xC479}, //10531 #HANGUL SYLLABLE SSANGSIOS U IEUNG + {0xBEAC, 0xC480}, //10532 #HANGUL SYLLABLE SSANGSIOS WEO + {0xBEAD, 0xC494}, //10533 #HANGUL SYLLABLE SSANGSIOS WEO SSANGSIOS + {0xBEAE, 0xC49C}, //10534 #HANGUL SYLLABLE SSANGSIOS WE + {0xBEAF, 0xC4B8}, //10535 #HANGUL SYLLABLE SSANGSIOS WI + {0xBEB0, 0xC4BC}, //10536 #HANGUL SYLLABLE SSANGSIOS WI NIEUN + {0xBEB1, 0xC4E9}, //10537 #HANGUL SYLLABLE SSANGSIOS YU IEUNG + {0xBEB2, 0xC4F0}, //10538 #HANGUL SYLLABLE SSANGSIOS EU + {0xBEB3, 0xC4F1}, //10539 #HANGUL SYLLABLE SSANGSIOS EU KIYEOK + {0xBEB4, 0xC4F4}, //10540 #HANGUL SYLLABLE SSANGSIOS EU NIEUN + {0xBEB5, 0xC4F8}, //10541 #HANGUL SYLLABLE SSANGSIOS EU RIEUL + {0xBEB6, 0xC4FA}, //10542 #HANGUL SYLLABLE SSANGSIOS EU RIEULMIEUM + {0xBEB7, 0xC4FF}, //10543 #HANGUL SYLLABLE SSANGSIOS EU RIEULHIEUH + {0xBEB8, 0xC500}, //10544 #HANGUL SYLLABLE SSANGSIOS EU MIEUM + {0xBEB9, 0xC501}, //10545 #HANGUL SYLLABLE SSANGSIOS EU PIEUP + {0xBEBA, 0xC50C}, //10546 #HANGUL SYLLABLE SSANGSIOS YI + {0xBEBB, 0xC510}, //10547 #HANGUL SYLLABLE SSANGSIOS YI NIEUN + {0xBEBC, 0xC514}, //10548 #HANGUL SYLLABLE SSANGSIOS YI RIEUL + {0xBEBD, 0xC51C}, //10549 #HANGUL SYLLABLE SSANGSIOS YI MIEUM + {0xBEBE, 0xC528}, //10550 #HANGUL SYLLABLE SSANGSIOS I + {0xBEBF, 0xC529}, //10551 #HANGUL SYLLABLE SSANGSIOS I KIYEOK + {0xBEC0, 0xC52C}, //10552 #HANGUL SYLLABLE SSANGSIOS I NIEUN + {0xBEC1, 0xC530}, //10553 #HANGUL SYLLABLE SSANGSIOS I RIEUL + {0xBEC2, 0xC538}, //10554 #HANGUL SYLLABLE SSANGSIOS I MIEUM + {0xBEC3, 0xC539}, //10555 #HANGUL SYLLABLE SSANGSIOS I PIEUP + {0xBEC4, 0xC53B}, //10556 #HANGUL SYLLABLE SSANGSIOS I SIOS + {0xBEC5, 0xC53D}, //10557 #HANGUL SYLLABLE SSANGSIOS I IEUNG + {0xBEC6, 0xC544}, //10558 #HANGUL SYLLABLE IEUNG A + {0xBEC7, 0xC545}, //10559 #HANGUL SYLLABLE IEUNG A KIYEOK + {0xBEC8, 0xC548}, //10560 #HANGUL SYLLABLE IEUNG A NIEUN + {0xBEC9, 0xC549}, //10561 #HANGUL SYLLABLE IEUNG A NIEUNCIEUC + {0xBECA, 0xC54A}, //10562 #HANGUL SYLLABLE IEUNG A NIEUNHIEUH + {0xBECB, 0xC54C}, //10563 #HANGUL SYLLABLE IEUNG A RIEUL + {0xBECC, 0xC54D}, //10564 #HANGUL SYLLABLE IEUNG A RIEULKIYEOK + {0xBECD, 0xC54E}, //10565 #HANGUL SYLLABLE IEUNG A RIEULMIEUM + {0xBECE, 0xC553}, //10566 #HANGUL SYLLABLE IEUNG A RIEULHIEUH + {0xBECF, 0xC554}, //10567 #HANGUL SYLLABLE IEUNG A MIEUM + {0xBED0, 0xC555}, //10568 #HANGUL SYLLABLE IEUNG A PIEUP + {0xBED1, 0xC557}, //10569 #HANGUL SYLLABLE IEUNG A SIOS + {0xBED2, 0xC558}, //10570 #HANGUL SYLLABLE IEUNG A SSANGSIOS + {0xBED3, 0xC559}, //10571 #HANGUL SYLLABLE IEUNG A IEUNG + {0xBED4, 0xC55D}, //10572 #HANGUL SYLLABLE IEUNG A THIEUTH + {0xBED5, 0xC55E}, //10573 #HANGUL SYLLABLE IEUNG A PHIEUPH + {0xBED6, 0xC560}, //10574 #HANGUL SYLLABLE IEUNG AE + {0xBED7, 0xC561}, //10575 #HANGUL SYLLABLE IEUNG AE KIYEOK + {0xBED8, 0xC564}, //10576 #HANGUL SYLLABLE IEUNG AE NIEUN + {0xBED9, 0xC568}, //10577 #HANGUL SYLLABLE IEUNG AE RIEUL + {0xBEDA, 0xC570}, //10578 #HANGUL SYLLABLE IEUNG AE MIEUM + {0xBEDB, 0xC571}, //10579 #HANGUL SYLLABLE IEUNG AE PIEUP + {0xBEDC, 0xC573}, //10580 #HANGUL SYLLABLE IEUNG AE SIOS + {0xBEDD, 0xC574}, //10581 #HANGUL SYLLABLE IEUNG AE SSANGSIOS + {0xBEDE, 0xC575}, //10582 #HANGUL SYLLABLE IEUNG AE IEUNG + {0xBEDF, 0xC57C}, //10583 #HANGUL SYLLABLE IEUNG YA + {0xBEE0, 0xC57D}, //10584 #HANGUL SYLLABLE IEUNG YA KIYEOK + {0xBEE1, 0xC580}, //10585 #HANGUL SYLLABLE IEUNG YA NIEUN + {0xBEE2, 0xC584}, //10586 #HANGUL SYLLABLE IEUNG YA RIEUL + {0xBEE3, 0xC587}, //10587 #HANGUL SYLLABLE IEUNG YA RIEULPIEUP + {0xBEE4, 0xC58C}, //10588 #HANGUL SYLLABLE IEUNG YA MIEUM + {0xBEE5, 0xC58D}, //10589 #HANGUL SYLLABLE IEUNG YA PIEUP + {0xBEE6, 0xC58F}, //10590 #HANGUL SYLLABLE IEUNG YA SIOS + {0xBEE7, 0xC591}, //10591 #HANGUL SYLLABLE IEUNG YA IEUNG + {0xBEE8, 0xC595}, //10592 #HANGUL SYLLABLE IEUNG YA THIEUTH + {0xBEE9, 0xC597}, //10593 #HANGUL SYLLABLE IEUNG YA HIEUH + {0xBEEA, 0xC598}, //10594 #HANGUL SYLLABLE IEUNG YAE + {0xBEEB, 0xC59C}, //10595 #HANGUL SYLLABLE IEUNG YAE NIEUN + {0xBEEC, 0xC5A0}, //10596 #HANGUL SYLLABLE IEUNG YAE RIEUL + {0xBEED, 0xC5A9}, //10597 #HANGUL SYLLABLE IEUNG YAE PIEUP + {0xBEEE, 0xC5B4}, //10598 #HANGUL SYLLABLE IEUNG EO + {0xBEEF, 0xC5B5}, //10599 #HANGUL SYLLABLE IEUNG EO KIYEOK + {0xBEF0, 0xC5B8}, //10600 #HANGUL SYLLABLE IEUNG EO NIEUN + {0xBEF1, 0xC5B9}, //10601 #HANGUL SYLLABLE IEUNG EO NIEUNCIEUC + {0xBEF2, 0xC5BB}, //10602 #HANGUL SYLLABLE IEUNG EO TIKEUT + {0xBEF3, 0xC5BC}, //10603 #HANGUL SYLLABLE IEUNG EO RIEUL + {0xBEF4, 0xC5BD}, //10604 #HANGUL SYLLABLE IEUNG EO RIEULKIYEOK + {0xBEF5, 0xC5BE}, //10605 #HANGUL SYLLABLE IEUNG EO RIEULMIEUM + {0xBEF6, 0xC5C4}, //10606 #HANGUL SYLLABLE IEUNG EO MIEUM + {0xBEF7, 0xC5C5}, //10607 #HANGUL SYLLABLE IEUNG EO PIEUP + {0xBEF8, 0xC5C6}, //10608 #HANGUL SYLLABLE IEUNG EO PIEUPSIOS + {0xBEF9, 0xC5C7}, //10609 #HANGUL SYLLABLE IEUNG EO SIOS + {0xBEFA, 0xC5C8}, //10610 #HANGUL SYLLABLE IEUNG EO SSANGSIOS + {0xBEFB, 0xC5C9}, //10611 #HANGUL SYLLABLE IEUNG EO IEUNG + {0xBEFC, 0xC5CA}, //10612 #HANGUL SYLLABLE IEUNG EO CIEUC + {0xBEFD, 0xC5CC}, //10613 #HANGUL SYLLABLE IEUNG EO KHIEUKH + {0xBEFE, 0xC5CE}, //10614 #HANGUL SYLLABLE IEUNG EO PHIEUPH + {0xBF41, 0xD49E}, //10615 #HANGUL SYLLABLE PHIEUPH WEO RIEULMIEUM + {0xBF42, 0xD49F}, //10616 #HANGUL SYLLABLE PHIEUPH WEO RIEULPIEUP + {0xBF43, 0xD4A0}, //10617 #HANGUL SYLLABLE PHIEUPH WEO RIEULSIOS + {0xBF44, 0xD4A1}, //10618 #HANGUL SYLLABLE PHIEUPH WEO RIEULTHIEUTH + {0xBF45, 0xD4A2}, //10619 #HANGUL SYLLABLE PHIEUPH WEO RIEULPHIEUPH + {0xBF46, 0xD4A3}, //10620 #HANGUL SYLLABLE PHIEUPH WEO RIEULHIEUH + {0xBF47, 0xD4A4}, //10621 #HANGUL SYLLABLE PHIEUPH WEO MIEUM + {0xBF48, 0xD4A5}, //10622 #HANGUL SYLLABLE PHIEUPH WEO PIEUP + {0xBF49, 0xD4A6}, //10623 #HANGUL SYLLABLE PHIEUPH WEO PIEUPSIOS + {0xBF4A, 0xD4A7}, //10624 #HANGUL SYLLABLE PHIEUPH WEO SIOS + {0xBF4B, 0xD4A8}, //10625 #HANGUL SYLLABLE PHIEUPH WEO SSANGSIOS + {0xBF4C, 0xD4AA}, //10626 #HANGUL SYLLABLE PHIEUPH WEO CIEUC + {0xBF4D, 0xD4AB}, //10627 #HANGUL SYLLABLE PHIEUPH WEO CHIEUCH + {0xBF4E, 0xD4AC}, //10628 #HANGUL SYLLABLE PHIEUPH WEO KHIEUKH + {0xBF4F, 0xD4AD}, //10629 #HANGUL SYLLABLE PHIEUPH WEO THIEUTH + {0xBF50, 0xD4AE}, //10630 #HANGUL SYLLABLE PHIEUPH WEO PHIEUPH + {0xBF51, 0xD4AF}, //10631 #HANGUL SYLLABLE PHIEUPH WEO HIEUH + {0xBF52, 0xD4B0}, //10632 #HANGUL SYLLABLE PHIEUPH WE + {0xBF53, 0xD4B1}, //10633 #HANGUL SYLLABLE PHIEUPH WE KIYEOK + {0xBF54, 0xD4B2}, //10634 #HANGUL SYLLABLE PHIEUPH WE SSANGKIYEOK + {0xBF55, 0xD4B3}, //10635 #HANGUL SYLLABLE PHIEUPH WE KIYEOKSIOS + {0xBF56, 0xD4B4}, //10636 #HANGUL SYLLABLE PHIEUPH WE NIEUN + {0xBF57, 0xD4B5}, //10637 #HANGUL SYLLABLE PHIEUPH WE NIEUNCIEUC + {0xBF58, 0xD4B6}, //10638 #HANGUL SYLLABLE PHIEUPH WE NIEUNHIEUH + {0xBF59, 0xD4B7}, //10639 #HANGUL SYLLABLE PHIEUPH WE TIKEUT + {0xBF5A, 0xD4B8}, //10640 #HANGUL SYLLABLE PHIEUPH WE RIEUL + {0xBF61, 0xD4B9}, //10641 #HANGUL SYLLABLE PHIEUPH WE RIEULKIYEOK + {0xBF62, 0xD4BA}, //10642 #HANGUL SYLLABLE PHIEUPH WE RIEULMIEUM + {0xBF63, 0xD4BB}, //10643 #HANGUL SYLLABLE PHIEUPH WE RIEULPIEUP + {0xBF64, 0xD4BC}, //10644 #HANGUL SYLLABLE PHIEUPH WE RIEULSIOS + {0xBF65, 0xD4BD}, //10645 #HANGUL SYLLABLE PHIEUPH WE RIEULTHIEUTH + {0xBF66, 0xD4BE}, //10646 #HANGUL SYLLABLE PHIEUPH WE RIEULPHIEUPH + {0xBF67, 0xD4BF}, //10647 #HANGUL SYLLABLE PHIEUPH WE RIEULHIEUH + {0xBF68, 0xD4C0}, //10648 #HANGUL SYLLABLE PHIEUPH WE MIEUM + {0xBF69, 0xD4C1}, //10649 #HANGUL SYLLABLE PHIEUPH WE PIEUP + {0xBF6A, 0xD4C2}, //10650 #HANGUL SYLLABLE PHIEUPH WE PIEUPSIOS + {0xBF6B, 0xD4C3}, //10651 #HANGUL SYLLABLE PHIEUPH WE SIOS + {0xBF6C, 0xD4C4}, //10652 #HANGUL SYLLABLE PHIEUPH WE SSANGSIOS + {0xBF6D, 0xD4C5}, //10653 #HANGUL SYLLABLE PHIEUPH WE IEUNG + {0xBF6E, 0xD4C6}, //10654 #HANGUL SYLLABLE PHIEUPH WE CIEUC + {0xBF6F, 0xD4C7}, //10655 #HANGUL SYLLABLE PHIEUPH WE CHIEUCH + {0xBF70, 0xD4C8}, //10656 #HANGUL SYLLABLE PHIEUPH WE KHIEUKH + {0xBF71, 0xD4C9}, //10657 #HANGUL SYLLABLE PHIEUPH WE THIEUTH + {0xBF72, 0xD4CA}, //10658 #HANGUL SYLLABLE PHIEUPH WE PHIEUPH + {0xBF73, 0xD4CB}, //10659 #HANGUL SYLLABLE PHIEUPH WE HIEUH + {0xBF74, 0xD4CD}, //10660 #HANGUL SYLLABLE PHIEUPH WI KIYEOK + {0xBF75, 0xD4CE}, //10661 #HANGUL SYLLABLE PHIEUPH WI SSANGKIYEOK + {0xBF76, 0xD4CF}, //10662 #HANGUL SYLLABLE PHIEUPH WI KIYEOKSIOS + {0xBF77, 0xD4D1}, //10663 #HANGUL SYLLABLE PHIEUPH WI NIEUNCIEUC + {0xBF78, 0xD4D2}, //10664 #HANGUL SYLLABLE PHIEUPH WI NIEUNHIEUH + {0xBF79, 0xD4D3}, //10665 #HANGUL SYLLABLE PHIEUPH WI TIKEUT + {0xBF7A, 0xD4D5}, //10666 #HANGUL SYLLABLE PHIEUPH WI RIEULKIYEOK + {0xBF81, 0xD4D6}, //10667 #HANGUL SYLLABLE PHIEUPH WI RIEULMIEUM + {0xBF82, 0xD4D7}, //10668 #HANGUL SYLLABLE PHIEUPH WI RIEULPIEUP + {0xBF83, 0xD4D8}, //10669 #HANGUL SYLLABLE PHIEUPH WI RIEULSIOS + {0xBF84, 0xD4D9}, //10670 #HANGUL SYLLABLE PHIEUPH WI RIEULTHIEUTH + {0xBF85, 0xD4DA}, //10671 #HANGUL SYLLABLE PHIEUPH WI RIEULPHIEUPH + {0xBF86, 0xD4DB}, //10672 #HANGUL SYLLABLE PHIEUPH WI RIEULHIEUH + {0xBF87, 0xD4DD}, //10673 #HANGUL SYLLABLE PHIEUPH WI PIEUP + {0xBF88, 0xD4DE}, //10674 #HANGUL SYLLABLE PHIEUPH WI PIEUPSIOS + {0xBF89, 0xD4E0}, //10675 #HANGUL SYLLABLE PHIEUPH WI SSANGSIOS + {0xBF8A, 0xD4E1}, //10676 #HANGUL SYLLABLE PHIEUPH WI IEUNG + {0xBF8B, 0xD4E2}, //10677 #HANGUL SYLLABLE PHIEUPH WI CIEUC + {0xBF8C, 0xD4E3}, //10678 #HANGUL SYLLABLE PHIEUPH WI CHIEUCH + {0xBF8D, 0xD4E4}, //10679 #HANGUL SYLLABLE PHIEUPH WI KHIEUKH + {0xBF8E, 0xD4E5}, //10680 #HANGUL SYLLABLE PHIEUPH WI THIEUTH + {0xBF8F, 0xD4E6}, //10681 #HANGUL SYLLABLE PHIEUPH WI PHIEUPH + {0xBF90, 0xD4E7}, //10682 #HANGUL SYLLABLE PHIEUPH WI HIEUH + {0xBF91, 0xD4E9}, //10683 #HANGUL SYLLABLE PHIEUPH YU KIYEOK + {0xBF92, 0xD4EA}, //10684 #HANGUL SYLLABLE PHIEUPH YU SSANGKIYEOK + {0xBF93, 0xD4EB}, //10685 #HANGUL SYLLABLE PHIEUPH YU KIYEOKSIOS + {0xBF94, 0xD4ED}, //10686 #HANGUL SYLLABLE PHIEUPH YU NIEUNCIEUC + {0xBF95, 0xD4EE}, //10687 #HANGUL SYLLABLE PHIEUPH YU NIEUNHIEUH + {0xBF96, 0xD4EF}, //10688 #HANGUL SYLLABLE PHIEUPH YU TIKEUT + {0xBF97, 0xD4F1}, //10689 #HANGUL SYLLABLE PHIEUPH YU RIEULKIYEOK + {0xBF98, 0xD4F2}, //10690 #HANGUL SYLLABLE PHIEUPH YU RIEULMIEUM + {0xBF99, 0xD4F3}, //10691 #HANGUL SYLLABLE PHIEUPH YU RIEULPIEUP + {0xBF9A, 0xD4F4}, //10692 #HANGUL SYLLABLE PHIEUPH YU RIEULSIOS + {0xBF9B, 0xD4F5}, //10693 #HANGUL SYLLABLE PHIEUPH YU RIEULTHIEUTH + {0xBF9C, 0xD4F6}, //10694 #HANGUL SYLLABLE PHIEUPH YU RIEULPHIEUPH + {0xBF9D, 0xD4F7}, //10695 #HANGUL SYLLABLE PHIEUPH YU RIEULHIEUH + {0xBF9E, 0xD4F9}, //10696 #HANGUL SYLLABLE PHIEUPH YU PIEUP + {0xBF9F, 0xD4FA}, //10697 #HANGUL SYLLABLE PHIEUPH YU PIEUPSIOS + {0xBFA0, 0xD4FC}, //10698 #HANGUL SYLLABLE PHIEUPH YU SSANGSIOS + {0xBFA1, 0xC5D0}, //10699 #HANGUL SYLLABLE IEUNG E + {0xBFA2, 0xC5D1}, //10700 #HANGUL SYLLABLE IEUNG E KIYEOK + {0xBFA3, 0xC5D4}, //10701 #HANGUL SYLLABLE IEUNG E NIEUN + {0xBFA4, 0xC5D8}, //10702 #HANGUL SYLLABLE IEUNG E RIEUL + {0xBFA5, 0xC5E0}, //10703 #HANGUL SYLLABLE IEUNG E MIEUM + {0xBFA6, 0xC5E1}, //10704 #HANGUL SYLLABLE IEUNG E PIEUP + {0xBFA7, 0xC5E3}, //10705 #HANGUL SYLLABLE IEUNG E SIOS + {0xBFA8, 0xC5E5}, //10706 #HANGUL SYLLABLE IEUNG E IEUNG + {0xBFA9, 0xC5EC}, //10707 #HANGUL SYLLABLE IEUNG YEO + {0xBFAA, 0xC5ED}, //10708 #HANGUL SYLLABLE IEUNG YEO KIYEOK + {0xBFAB, 0xC5EE}, //10709 #HANGUL SYLLABLE IEUNG YEO SSANGKIYEOK + {0xBFAC, 0xC5F0}, //10710 #HANGUL SYLLABLE IEUNG YEO NIEUN + {0xBFAD, 0xC5F4}, //10711 #HANGUL SYLLABLE IEUNG YEO RIEUL + {0xBFAE, 0xC5F6}, //10712 #HANGUL SYLLABLE IEUNG YEO RIEULMIEUM + {0xBFAF, 0xC5F7}, //10713 #HANGUL SYLLABLE IEUNG YEO RIEULPIEUP + {0xBFB0, 0xC5FC}, //10714 #HANGUL SYLLABLE IEUNG YEO MIEUM + {0xBFB1, 0xC5FD}, //10715 #HANGUL SYLLABLE IEUNG YEO PIEUP + {0xBFB2, 0xC5FE}, //10716 #HANGUL SYLLABLE IEUNG YEO PIEUPSIOS + {0xBFB3, 0xC5FF}, //10717 #HANGUL SYLLABLE IEUNG YEO SIOS + {0xBFB4, 0xC600}, //10718 #HANGUL SYLLABLE IEUNG YEO SSANGSIOS + {0xBFB5, 0xC601}, //10719 #HANGUL SYLLABLE IEUNG YEO IEUNG + {0xBFB6, 0xC605}, //10720 #HANGUL SYLLABLE IEUNG YEO THIEUTH + {0xBFB7, 0xC606}, //10721 #HANGUL SYLLABLE IEUNG YEO PHIEUPH + {0xBFB8, 0xC607}, //10722 #HANGUL SYLLABLE IEUNG YEO HIEUH + {0xBFB9, 0xC608}, //10723 #HANGUL SYLLABLE IEUNG YE + {0xBFBA, 0xC60C}, //10724 #HANGUL SYLLABLE IEUNG YE NIEUN + {0xBFBB, 0xC610}, //10725 #HANGUL SYLLABLE IEUNG YE RIEUL + {0xBFBC, 0xC618}, //10726 #HANGUL SYLLABLE IEUNG YE MIEUM + {0xBFBD, 0xC619}, //10727 #HANGUL SYLLABLE IEUNG YE PIEUP + {0xBFBE, 0xC61B}, //10728 #HANGUL SYLLABLE IEUNG YE SIOS + {0xBFBF, 0xC61C}, //10729 #HANGUL SYLLABLE IEUNG YE SSANGSIOS + {0xBFC0, 0xC624}, //10730 #HANGUL SYLLABLE IEUNG O + {0xBFC1, 0xC625}, //10731 #HANGUL SYLLABLE IEUNG O KIYEOK + {0xBFC2, 0xC628}, //10732 #HANGUL SYLLABLE IEUNG O NIEUN + {0xBFC3, 0xC62C}, //10733 #HANGUL SYLLABLE IEUNG O RIEUL + {0xBFC4, 0xC62D}, //10734 #HANGUL SYLLABLE IEUNG O RIEULKIYEOK + {0xBFC5, 0xC62E}, //10735 #HANGUL SYLLABLE IEUNG O RIEULMIEUM + {0xBFC6, 0xC630}, //10736 #HANGUL SYLLABLE IEUNG O RIEULSIOS + {0xBFC7, 0xC633}, //10737 #HANGUL SYLLABLE IEUNG O RIEULHIEUH + {0xBFC8, 0xC634}, //10738 #HANGUL SYLLABLE IEUNG O MIEUM + {0xBFC9, 0xC635}, //10739 #HANGUL SYLLABLE IEUNG O PIEUP + {0xBFCA, 0xC637}, //10740 #HANGUL SYLLABLE IEUNG O SIOS + {0xBFCB, 0xC639}, //10741 #HANGUL SYLLABLE IEUNG O IEUNG + {0xBFCC, 0xC63B}, //10742 #HANGUL SYLLABLE IEUNG O CHIEUCH + {0xBFCD, 0xC640}, //10743 #HANGUL SYLLABLE IEUNG WA + {0xBFCE, 0xC641}, //10744 #HANGUL SYLLABLE IEUNG WA KIYEOK + {0xBFCF, 0xC644}, //10745 #HANGUL SYLLABLE IEUNG WA NIEUN + {0xBFD0, 0xC648}, //10746 #HANGUL SYLLABLE IEUNG WA RIEUL + {0xBFD1, 0xC650}, //10747 #HANGUL SYLLABLE IEUNG WA MIEUM + {0xBFD2, 0xC651}, //10748 #HANGUL SYLLABLE IEUNG WA PIEUP + {0xBFD3, 0xC653}, //10749 #HANGUL SYLLABLE IEUNG WA SIOS + {0xBFD4, 0xC654}, //10750 #HANGUL SYLLABLE IEUNG WA SSANGSIOS + {0xBFD5, 0xC655}, //10751 #HANGUL SYLLABLE IEUNG WA IEUNG + {0xBFD6, 0xC65C}, //10752 #HANGUL SYLLABLE IEUNG WAE + {0xBFD7, 0xC65D}, //10753 #HANGUL SYLLABLE IEUNG WAE KIYEOK + {0xBFD8, 0xC660}, //10754 #HANGUL SYLLABLE IEUNG WAE NIEUN + {0xBFD9, 0xC66C}, //10755 #HANGUL SYLLABLE IEUNG WAE MIEUM + {0xBFDA, 0xC66F}, //10756 #HANGUL SYLLABLE IEUNG WAE SIOS + {0xBFDB, 0xC671}, //10757 #HANGUL SYLLABLE IEUNG WAE IEUNG + {0xBFDC, 0xC678}, //10758 #HANGUL SYLLABLE IEUNG OE + {0xBFDD, 0xC679}, //10759 #HANGUL SYLLABLE IEUNG OE KIYEOK + {0xBFDE, 0xC67C}, //10760 #HANGUL SYLLABLE IEUNG OE NIEUN + {0xBFDF, 0xC680}, //10761 #HANGUL SYLLABLE IEUNG OE RIEUL + {0xBFE0, 0xC688}, //10762 #HANGUL SYLLABLE IEUNG OE MIEUM + {0xBFE1, 0xC689}, //10763 #HANGUL SYLLABLE IEUNG OE PIEUP + {0xBFE2, 0xC68B}, //10764 #HANGUL SYLLABLE IEUNG OE SIOS + {0xBFE3, 0xC68D}, //10765 #HANGUL SYLLABLE IEUNG OE IEUNG + {0xBFE4, 0xC694}, //10766 #HANGUL SYLLABLE IEUNG YO + {0xBFE5, 0xC695}, //10767 #HANGUL SYLLABLE IEUNG YO KIYEOK + {0xBFE6, 0xC698}, //10768 #HANGUL SYLLABLE IEUNG YO NIEUN + {0xBFE7, 0xC69C}, //10769 #HANGUL SYLLABLE IEUNG YO RIEUL + {0xBFE8, 0xC6A4}, //10770 #HANGUL SYLLABLE IEUNG YO MIEUM + {0xBFE9, 0xC6A5}, //10771 #HANGUL SYLLABLE IEUNG YO PIEUP + {0xBFEA, 0xC6A7}, //10772 #HANGUL SYLLABLE IEUNG YO SIOS + {0xBFEB, 0xC6A9}, //10773 #HANGUL SYLLABLE IEUNG YO IEUNG + {0xBFEC, 0xC6B0}, //10774 #HANGUL SYLLABLE IEUNG U + {0xBFED, 0xC6B1}, //10775 #HANGUL SYLLABLE IEUNG U KIYEOK + {0xBFEE, 0xC6B4}, //10776 #HANGUL SYLLABLE IEUNG U NIEUN + {0xBFEF, 0xC6B8}, //10777 #HANGUL SYLLABLE IEUNG U RIEUL + {0xBFF0, 0xC6B9}, //10778 #HANGUL SYLLABLE IEUNG U RIEULKIYEOK + {0xBFF1, 0xC6BA}, //10779 #HANGUL SYLLABLE IEUNG U RIEULMIEUM + {0xBFF2, 0xC6C0}, //10780 #HANGUL SYLLABLE IEUNG U MIEUM + {0xBFF3, 0xC6C1}, //10781 #HANGUL SYLLABLE IEUNG U PIEUP + {0xBFF4, 0xC6C3}, //10782 #HANGUL SYLLABLE IEUNG U SIOS + {0xBFF5, 0xC6C5}, //10783 #HANGUL SYLLABLE IEUNG U IEUNG + {0xBFF6, 0xC6CC}, //10784 #HANGUL SYLLABLE IEUNG WEO + {0xBFF7, 0xC6CD}, //10785 #HANGUL SYLLABLE IEUNG WEO KIYEOK + {0xBFF8, 0xC6D0}, //10786 #HANGUL SYLLABLE IEUNG WEO NIEUN + {0xBFF9, 0xC6D4}, //10787 #HANGUL SYLLABLE IEUNG WEO RIEUL + {0xBFFA, 0xC6DC}, //10788 #HANGUL SYLLABLE IEUNG WEO MIEUM + {0xBFFB, 0xC6DD}, //10789 #HANGUL SYLLABLE IEUNG WEO PIEUP + {0xBFFC, 0xC6E0}, //10790 #HANGUL SYLLABLE IEUNG WEO SSANGSIOS + {0xBFFD, 0xC6E1}, //10791 #HANGUL SYLLABLE IEUNG WEO IEUNG + {0xBFFE, 0xC6E8}, //10792 #HANGUL SYLLABLE IEUNG WE + {0xC041, 0xD4FE}, //10793 #HANGUL SYLLABLE PHIEUPH YU CIEUC + {0xC042, 0xD4FF}, //10794 #HANGUL SYLLABLE PHIEUPH YU CHIEUCH + {0xC043, 0xD500}, //10795 #HANGUL SYLLABLE PHIEUPH YU KHIEUKH + {0xC044, 0xD501}, //10796 #HANGUL SYLLABLE PHIEUPH YU THIEUTH + {0xC045, 0xD502}, //10797 #HANGUL SYLLABLE PHIEUPH YU PHIEUPH + {0xC046, 0xD503}, //10798 #HANGUL SYLLABLE PHIEUPH YU HIEUH + {0xC047, 0xD505}, //10799 #HANGUL SYLLABLE PHIEUPH EU KIYEOK + {0xC048, 0xD506}, //10800 #HANGUL SYLLABLE PHIEUPH EU SSANGKIYEOK + {0xC049, 0xD507}, //10801 #HANGUL SYLLABLE PHIEUPH EU KIYEOKSIOS + {0xC04A, 0xD509}, //10802 #HANGUL SYLLABLE PHIEUPH EU NIEUNCIEUC + {0xC04B, 0xD50A}, //10803 #HANGUL SYLLABLE PHIEUPH EU NIEUNHIEUH + {0xC04C, 0xD50B}, //10804 #HANGUL SYLLABLE PHIEUPH EU TIKEUT + {0xC04D, 0xD50D}, //10805 #HANGUL SYLLABLE PHIEUPH EU RIEULKIYEOK + {0xC04E, 0xD50E}, //10806 #HANGUL SYLLABLE PHIEUPH EU RIEULMIEUM + {0xC04F, 0xD50F}, //10807 #HANGUL SYLLABLE PHIEUPH EU RIEULPIEUP + {0xC050, 0xD510}, //10808 #HANGUL SYLLABLE PHIEUPH EU RIEULSIOS + {0xC051, 0xD511}, //10809 #HANGUL SYLLABLE PHIEUPH EU RIEULTHIEUTH + {0xC052, 0xD512}, //10810 #HANGUL SYLLABLE PHIEUPH EU RIEULPHIEUPH + {0xC053, 0xD513}, //10811 #HANGUL SYLLABLE PHIEUPH EU RIEULHIEUH + {0xC054, 0xD516}, //10812 #HANGUL SYLLABLE PHIEUPH EU PIEUPSIOS + {0xC055, 0xD518}, //10813 #HANGUL SYLLABLE PHIEUPH EU SSANGSIOS + {0xC056, 0xD519}, //10814 #HANGUL SYLLABLE PHIEUPH EU IEUNG + {0xC057, 0xD51A}, //10815 #HANGUL SYLLABLE PHIEUPH EU CIEUC + {0xC058, 0xD51B}, //10816 #HANGUL SYLLABLE PHIEUPH EU CHIEUCH + {0xC059, 0xD51C}, //10817 #HANGUL SYLLABLE PHIEUPH EU KHIEUKH + {0xC05A, 0xD51D}, //10818 #HANGUL SYLLABLE PHIEUPH EU THIEUTH + {0xC061, 0xD51E}, //10819 #HANGUL SYLLABLE PHIEUPH EU PHIEUPH + {0xC062, 0xD51F}, //10820 #HANGUL SYLLABLE PHIEUPH EU HIEUH + {0xC063, 0xD520}, //10821 #HANGUL SYLLABLE PHIEUPH YI + {0xC064, 0xD521}, //10822 #HANGUL SYLLABLE PHIEUPH YI KIYEOK + {0xC065, 0xD522}, //10823 #HANGUL SYLLABLE PHIEUPH YI SSANGKIYEOK + {0xC066, 0xD523}, //10824 #HANGUL SYLLABLE PHIEUPH YI KIYEOKSIOS + {0xC067, 0xD524}, //10825 #HANGUL SYLLABLE PHIEUPH YI NIEUN + {0xC068, 0xD525}, //10826 #HANGUL SYLLABLE PHIEUPH YI NIEUNCIEUC + {0xC069, 0xD526}, //10827 #HANGUL SYLLABLE PHIEUPH YI NIEUNHIEUH + {0xC06A, 0xD527}, //10828 #HANGUL SYLLABLE PHIEUPH YI TIKEUT + {0xC06B, 0xD528}, //10829 #HANGUL SYLLABLE PHIEUPH YI RIEUL + {0xC06C, 0xD529}, //10830 #HANGUL SYLLABLE PHIEUPH YI RIEULKIYEOK + {0xC06D, 0xD52A}, //10831 #HANGUL SYLLABLE PHIEUPH YI RIEULMIEUM + {0xC06E, 0xD52B}, //10832 #HANGUL SYLLABLE PHIEUPH YI RIEULPIEUP + {0xC06F, 0xD52C}, //10833 #HANGUL SYLLABLE PHIEUPH YI RIEULSIOS + {0xC070, 0xD52D}, //10834 #HANGUL SYLLABLE PHIEUPH YI RIEULTHIEUTH + {0xC071, 0xD52E}, //10835 #HANGUL SYLLABLE PHIEUPH YI RIEULPHIEUPH + {0xC072, 0xD52F}, //10836 #HANGUL SYLLABLE PHIEUPH YI RIEULHIEUH + {0xC073, 0xD530}, //10837 #HANGUL SYLLABLE PHIEUPH YI MIEUM + {0xC074, 0xD531}, //10838 #HANGUL SYLLABLE PHIEUPH YI PIEUP + {0xC075, 0xD532}, //10839 #HANGUL SYLLABLE PHIEUPH YI PIEUPSIOS + {0xC076, 0xD533}, //10840 #HANGUL SYLLABLE PHIEUPH YI SIOS + {0xC077, 0xD534}, //10841 #HANGUL SYLLABLE PHIEUPH YI SSANGSIOS + {0xC078, 0xD535}, //10842 #HANGUL SYLLABLE PHIEUPH YI IEUNG + {0xC079, 0xD536}, //10843 #HANGUL SYLLABLE PHIEUPH YI CIEUC + {0xC07A, 0xD537}, //10844 #HANGUL SYLLABLE PHIEUPH YI CHIEUCH + {0xC081, 0xD538}, //10845 #HANGUL SYLLABLE PHIEUPH YI KHIEUKH + {0xC082, 0xD539}, //10846 #HANGUL SYLLABLE PHIEUPH YI THIEUTH + {0xC083, 0xD53A}, //10847 #HANGUL SYLLABLE PHIEUPH YI PHIEUPH + {0xC084, 0xD53B}, //10848 #HANGUL SYLLABLE PHIEUPH YI HIEUH + {0xC085, 0xD53E}, //10849 #HANGUL SYLLABLE PHIEUPH I SSANGKIYEOK + {0xC086, 0xD53F}, //10850 #HANGUL SYLLABLE PHIEUPH I KIYEOKSIOS + {0xC087, 0xD541}, //10851 #HANGUL SYLLABLE PHIEUPH I NIEUNCIEUC + {0xC088, 0xD542}, //10852 #HANGUL SYLLABLE PHIEUPH I NIEUNHIEUH + {0xC089, 0xD543}, //10853 #HANGUL SYLLABLE PHIEUPH I TIKEUT + {0xC08A, 0xD545}, //10854 #HANGUL SYLLABLE PHIEUPH I RIEULKIYEOK + {0xC08B, 0xD546}, //10855 #HANGUL SYLLABLE PHIEUPH I RIEULMIEUM + {0xC08C, 0xD547}, //10856 #HANGUL SYLLABLE PHIEUPH I RIEULPIEUP + {0xC08D, 0xD548}, //10857 #HANGUL SYLLABLE PHIEUPH I RIEULSIOS + {0xC08E, 0xD549}, //10858 #HANGUL SYLLABLE PHIEUPH I RIEULTHIEUTH + {0xC08F, 0xD54A}, //10859 #HANGUL SYLLABLE PHIEUPH I RIEULPHIEUPH + {0xC090, 0xD54B}, //10860 #HANGUL SYLLABLE PHIEUPH I RIEULHIEUH + {0xC091, 0xD54E}, //10861 #HANGUL SYLLABLE PHIEUPH I PIEUPSIOS + {0xC092, 0xD550}, //10862 #HANGUL SYLLABLE PHIEUPH I SSANGSIOS + {0xC093, 0xD552}, //10863 #HANGUL SYLLABLE PHIEUPH I CIEUC + {0xC094, 0xD553}, //10864 #HANGUL SYLLABLE PHIEUPH I CHIEUCH + {0xC095, 0xD554}, //10865 #HANGUL SYLLABLE PHIEUPH I KHIEUKH + {0xC096, 0xD555}, //10866 #HANGUL SYLLABLE PHIEUPH I THIEUTH + {0xC097, 0xD556}, //10867 #HANGUL SYLLABLE PHIEUPH I PHIEUPH + {0xC098, 0xD557}, //10868 #HANGUL SYLLABLE PHIEUPH I HIEUH + {0xC099, 0xD55A}, //10869 #HANGUL SYLLABLE HIEUH A SSANGKIYEOK + {0xC09A, 0xD55B}, //10870 #HANGUL SYLLABLE HIEUH A KIYEOKSIOS + {0xC09B, 0xD55D}, //10871 #HANGUL SYLLABLE HIEUH A NIEUNCIEUC + {0xC09C, 0xD55E}, //10872 #HANGUL SYLLABLE HIEUH A NIEUNHIEUH + {0xC09D, 0xD55F}, //10873 #HANGUL SYLLABLE HIEUH A TIKEUT + {0xC09E, 0xD561}, //10874 #HANGUL SYLLABLE HIEUH A RIEULKIYEOK + {0xC09F, 0xD562}, //10875 #HANGUL SYLLABLE HIEUH A RIEULMIEUM + {0xC0A0, 0xD563}, //10876 #HANGUL SYLLABLE HIEUH A RIEULPIEUP + {0xC0A1, 0xC6E9}, //10877 #HANGUL SYLLABLE IEUNG WE KIYEOK + {0xC0A2, 0xC6EC}, //10878 #HANGUL SYLLABLE IEUNG WE NIEUN + {0xC0A3, 0xC6F0}, //10879 #HANGUL SYLLABLE IEUNG WE RIEUL + {0xC0A4, 0xC6F8}, //10880 #HANGUL SYLLABLE IEUNG WE MIEUM + {0xC0A5, 0xC6F9}, //10881 #HANGUL SYLLABLE IEUNG WE PIEUP + {0xC0A6, 0xC6FD}, //10882 #HANGUL SYLLABLE IEUNG WE IEUNG + {0xC0A7, 0xC704}, //10883 #HANGUL SYLLABLE IEUNG WI + {0xC0A8, 0xC705}, //10884 #HANGUL SYLLABLE IEUNG WI KIYEOK + {0xC0A9, 0xC708}, //10885 #HANGUL SYLLABLE IEUNG WI NIEUN + {0xC0AA, 0xC70C}, //10886 #HANGUL SYLLABLE IEUNG WI RIEUL + {0xC0AB, 0xC714}, //10887 #HANGUL SYLLABLE IEUNG WI MIEUM + {0xC0AC, 0xC715}, //10888 #HANGUL SYLLABLE IEUNG WI PIEUP + {0xC0AD, 0xC717}, //10889 #HANGUL SYLLABLE IEUNG WI SIOS + {0xC0AE, 0xC719}, //10890 #HANGUL SYLLABLE IEUNG WI IEUNG + {0xC0AF, 0xC720}, //10891 #HANGUL SYLLABLE IEUNG YU + {0xC0B0, 0xC721}, //10892 #HANGUL SYLLABLE IEUNG YU KIYEOK + {0xC0B1, 0xC724}, //10893 #HANGUL SYLLABLE IEUNG YU NIEUN + {0xC0B2, 0xC728}, //10894 #HANGUL SYLLABLE IEUNG YU RIEUL + {0xC0B3, 0xC730}, //10895 #HANGUL SYLLABLE IEUNG YU MIEUM + {0xC0B4, 0xC731}, //10896 #HANGUL SYLLABLE IEUNG YU PIEUP + {0xC0B5, 0xC733}, //10897 #HANGUL SYLLABLE IEUNG YU SIOS + {0xC0B6, 0xC735}, //10898 #HANGUL SYLLABLE IEUNG YU IEUNG + {0xC0B7, 0xC737}, //10899 #HANGUL SYLLABLE IEUNG YU CHIEUCH + {0xC0B8, 0xC73C}, //10900 #HANGUL SYLLABLE IEUNG EU + {0xC0B9, 0xC73D}, //10901 #HANGUL SYLLABLE IEUNG EU KIYEOK + {0xC0BA, 0xC740}, //10902 #HANGUL SYLLABLE IEUNG EU NIEUN + {0xC0BB, 0xC744}, //10903 #HANGUL SYLLABLE IEUNG EU RIEUL + {0xC0BC, 0xC74A}, //10904 #HANGUL SYLLABLE IEUNG EU RIEULPHIEUPH + {0xC0BD, 0xC74C}, //10905 #HANGUL SYLLABLE IEUNG EU MIEUM + {0xC0BE, 0xC74D}, //10906 #HANGUL SYLLABLE IEUNG EU PIEUP + {0xC0BF, 0xC74F}, //10907 #HANGUL SYLLABLE IEUNG EU SIOS + {0xC0C0, 0xC751}, //10908 #HANGUL SYLLABLE IEUNG EU IEUNG + {0xC0C1, 0xC752}, //10909 #HANGUL SYLLABLE IEUNG EU CIEUC + {0xC0C2, 0xC753}, //10910 #HANGUL SYLLABLE IEUNG EU CHIEUCH + {0xC0C3, 0xC754}, //10911 #HANGUL SYLLABLE IEUNG EU KHIEUKH + {0xC0C4, 0xC755}, //10912 #HANGUL SYLLABLE IEUNG EU THIEUTH + {0xC0C5, 0xC756}, //10913 #HANGUL SYLLABLE IEUNG EU PHIEUPH + {0xC0C6, 0xC757}, //10914 #HANGUL SYLLABLE IEUNG EU HIEUH + {0xC0C7, 0xC758}, //10915 #HANGUL SYLLABLE IEUNG YI + {0xC0C8, 0xC75C}, //10916 #HANGUL SYLLABLE IEUNG YI NIEUN + {0xC0C9, 0xC760}, //10917 #HANGUL SYLLABLE IEUNG YI RIEUL + {0xC0CA, 0xC768}, //10918 #HANGUL SYLLABLE IEUNG YI MIEUM + {0xC0CB, 0xC76B}, //10919 #HANGUL SYLLABLE IEUNG YI SIOS + {0xC0CC, 0xC774}, //10920 #HANGUL SYLLABLE IEUNG I + {0xC0CD, 0xC775}, //10921 #HANGUL SYLLABLE IEUNG I KIYEOK + {0xC0CE, 0xC778}, //10922 #HANGUL SYLLABLE IEUNG I NIEUN + {0xC0CF, 0xC77C}, //10923 #HANGUL SYLLABLE IEUNG I RIEUL + {0xC0D0, 0xC77D}, //10924 #HANGUL SYLLABLE IEUNG I RIEULKIYEOK + {0xC0D1, 0xC77E}, //10925 #HANGUL SYLLABLE IEUNG I RIEULMIEUM + {0xC0D2, 0xC783}, //10926 #HANGUL SYLLABLE IEUNG I RIEULHIEUH + {0xC0D3, 0xC784}, //10927 #HANGUL SYLLABLE IEUNG I MIEUM + {0xC0D4, 0xC785}, //10928 #HANGUL SYLLABLE IEUNG I PIEUP + {0xC0D5, 0xC787}, //10929 #HANGUL SYLLABLE IEUNG I SIOS + {0xC0D6, 0xC788}, //10930 #HANGUL SYLLABLE IEUNG I SSANGSIOS + {0xC0D7, 0xC789}, //10931 #HANGUL SYLLABLE IEUNG I IEUNG + {0xC0D8, 0xC78A}, //10932 #HANGUL SYLLABLE IEUNG I CIEUC + {0xC0D9, 0xC78E}, //10933 #HANGUL SYLLABLE IEUNG I PHIEUPH + {0xC0DA, 0xC790}, //10934 #HANGUL SYLLABLE CIEUC A + {0xC0DB, 0xC791}, //10935 #HANGUL SYLLABLE CIEUC A KIYEOK + {0xC0DC, 0xC794}, //10936 #HANGUL SYLLABLE CIEUC A NIEUN + {0xC0DD, 0xC796}, //10937 #HANGUL SYLLABLE CIEUC A NIEUNHIEUH + {0xC0DE, 0xC797}, //10938 #HANGUL SYLLABLE CIEUC A TIKEUT + {0xC0DF, 0xC798}, //10939 #HANGUL SYLLABLE CIEUC A RIEUL + {0xC0E0, 0xC79A}, //10940 #HANGUL SYLLABLE CIEUC A RIEULMIEUM + {0xC0E1, 0xC7A0}, //10941 #HANGUL SYLLABLE CIEUC A MIEUM + {0xC0E2, 0xC7A1}, //10942 #HANGUL SYLLABLE CIEUC A PIEUP + {0xC0E3, 0xC7A3}, //10943 #HANGUL SYLLABLE CIEUC A SIOS + {0xC0E4, 0xC7A4}, //10944 #HANGUL SYLLABLE CIEUC A SSANGSIOS + {0xC0E5, 0xC7A5}, //10945 #HANGUL SYLLABLE CIEUC A IEUNG + {0xC0E6, 0xC7A6}, //10946 #HANGUL SYLLABLE CIEUC A CIEUC + {0xC0E7, 0xC7AC}, //10947 #HANGUL SYLLABLE CIEUC AE + {0xC0E8, 0xC7AD}, //10948 #HANGUL SYLLABLE CIEUC AE KIYEOK + {0xC0E9, 0xC7B0}, //10949 #HANGUL SYLLABLE CIEUC AE NIEUN + {0xC0EA, 0xC7B4}, //10950 #HANGUL SYLLABLE CIEUC AE RIEUL + {0xC0EB, 0xC7BC}, //10951 #HANGUL SYLLABLE CIEUC AE MIEUM + {0xC0EC, 0xC7BD}, //10952 #HANGUL SYLLABLE CIEUC AE PIEUP + {0xC0ED, 0xC7BF}, //10953 #HANGUL SYLLABLE CIEUC AE SIOS + {0xC0EE, 0xC7C0}, //10954 #HANGUL SYLLABLE CIEUC AE SSANGSIOS + {0xC0EF, 0xC7C1}, //10955 #HANGUL SYLLABLE CIEUC AE IEUNG + {0xC0F0, 0xC7C8}, //10956 #HANGUL SYLLABLE CIEUC YA + {0xC0F1, 0xC7C9}, //10957 #HANGUL SYLLABLE CIEUC YA KIYEOK + {0xC0F2, 0xC7CC}, //10958 #HANGUL SYLLABLE CIEUC YA NIEUN + {0xC0F3, 0xC7CE}, //10959 #HANGUL SYLLABLE CIEUC YA NIEUNHIEUH + {0xC0F4, 0xC7D0}, //10960 #HANGUL SYLLABLE CIEUC YA RIEUL + {0xC0F5, 0xC7D8}, //10961 #HANGUL SYLLABLE CIEUC YA MIEUM + {0xC0F6, 0xC7DD}, //10962 #HANGUL SYLLABLE CIEUC YA IEUNG + {0xC0F7, 0xC7E4}, //10963 #HANGUL SYLLABLE CIEUC YAE + {0xC0F8, 0xC7E8}, //10964 #HANGUL SYLLABLE CIEUC YAE NIEUN + {0xC0F9, 0xC7EC}, //10965 #HANGUL SYLLABLE CIEUC YAE RIEUL + {0xC0FA, 0xC800}, //10966 #HANGUL SYLLABLE CIEUC EO + {0xC0FB, 0xC801}, //10967 #HANGUL SYLLABLE CIEUC EO KIYEOK + {0xC0FC, 0xC804}, //10968 #HANGUL SYLLABLE CIEUC EO NIEUN + {0xC0FD, 0xC808}, //10969 #HANGUL SYLLABLE CIEUC EO RIEUL + {0xC0FE, 0xC80A}, //10970 #HANGUL SYLLABLE CIEUC EO RIEULMIEUM + {0xC141, 0xD564}, //10971 #HANGUL SYLLABLE HIEUH A RIEULSIOS + {0xC142, 0xD566}, //10972 #HANGUL SYLLABLE HIEUH A RIEULPHIEUPH + {0xC143, 0xD567}, //10973 #HANGUL SYLLABLE HIEUH A RIEULHIEUH + {0xC144, 0xD56A}, //10974 #HANGUL SYLLABLE HIEUH A PIEUPSIOS + {0xC145, 0xD56C}, //10975 #HANGUL SYLLABLE HIEUH A SSANGSIOS + {0xC146, 0xD56E}, //10976 #HANGUL SYLLABLE HIEUH A CIEUC + {0xC147, 0xD56F}, //10977 #HANGUL SYLLABLE HIEUH A CHIEUCH + {0xC148, 0xD570}, //10978 #HANGUL SYLLABLE HIEUH A KHIEUKH + {0xC149, 0xD571}, //10979 #HANGUL SYLLABLE HIEUH A THIEUTH + {0xC14A, 0xD572}, //10980 #HANGUL SYLLABLE HIEUH A PHIEUPH + {0xC14B, 0xD573}, //10981 #HANGUL SYLLABLE HIEUH A HIEUH + {0xC14C, 0xD576}, //10982 #HANGUL SYLLABLE HIEUH AE SSANGKIYEOK + {0xC14D, 0xD577}, //10983 #HANGUL SYLLABLE HIEUH AE KIYEOKSIOS + {0xC14E, 0xD579}, //10984 #HANGUL SYLLABLE HIEUH AE NIEUNCIEUC + {0xC14F, 0xD57A}, //10985 #HANGUL SYLLABLE HIEUH AE NIEUNHIEUH + {0xC150, 0xD57B}, //10986 #HANGUL SYLLABLE HIEUH AE TIKEUT + {0xC151, 0xD57D}, //10987 #HANGUL SYLLABLE HIEUH AE RIEULKIYEOK + {0xC152, 0xD57E}, //10988 #HANGUL SYLLABLE HIEUH AE RIEULMIEUM + {0xC153, 0xD57F}, //10989 #HANGUL SYLLABLE HIEUH AE RIEULPIEUP + {0xC154, 0xD580}, //10990 #HANGUL SYLLABLE HIEUH AE RIEULSIOS + {0xC155, 0xD581}, //10991 #HANGUL SYLLABLE HIEUH AE RIEULTHIEUTH + {0xC156, 0xD582}, //10992 #HANGUL SYLLABLE HIEUH AE RIEULPHIEUPH + {0xC157, 0xD583}, //10993 #HANGUL SYLLABLE HIEUH AE RIEULHIEUH + {0xC158, 0xD586}, //10994 #HANGUL SYLLABLE HIEUH AE PIEUPSIOS + {0xC159, 0xD58A}, //10995 #HANGUL SYLLABLE HIEUH AE CIEUC + {0xC15A, 0xD58B}, //10996 #HANGUL SYLLABLE HIEUH AE CHIEUCH + {0xC161, 0xD58C}, //10997 #HANGUL SYLLABLE HIEUH AE KHIEUKH + {0xC162, 0xD58D}, //10998 #HANGUL SYLLABLE HIEUH AE THIEUTH + {0xC163, 0xD58E}, //10999 #HANGUL SYLLABLE HIEUH AE PHIEUPH + {0xC164, 0xD58F}, //11000 #HANGUL SYLLABLE HIEUH AE HIEUH + {0xC165, 0xD591}, //11001 #HANGUL SYLLABLE HIEUH YA KIYEOK + {0xC166, 0xD592}, //11002 #HANGUL SYLLABLE HIEUH YA SSANGKIYEOK + {0xC167, 0xD593}, //11003 #HANGUL SYLLABLE HIEUH YA KIYEOKSIOS + {0xC168, 0xD594}, //11004 #HANGUL SYLLABLE HIEUH YA NIEUN + {0xC169, 0xD595}, //11005 #HANGUL SYLLABLE HIEUH YA NIEUNCIEUC + {0xC16A, 0xD596}, //11006 #HANGUL SYLLABLE HIEUH YA NIEUNHIEUH + {0xC16B, 0xD597}, //11007 #HANGUL SYLLABLE HIEUH YA TIKEUT + {0xC16C, 0xD598}, //11008 #HANGUL SYLLABLE HIEUH YA RIEUL + {0xC16D, 0xD599}, //11009 #HANGUL SYLLABLE HIEUH YA RIEULKIYEOK + {0xC16E, 0xD59A}, //11010 #HANGUL SYLLABLE HIEUH YA RIEULMIEUM + {0xC16F, 0xD59B}, //11011 #HANGUL SYLLABLE HIEUH YA RIEULPIEUP + {0xC170, 0xD59C}, //11012 #HANGUL SYLLABLE HIEUH YA RIEULSIOS + {0xC171, 0xD59D}, //11013 #HANGUL SYLLABLE HIEUH YA RIEULTHIEUTH + {0xC172, 0xD59E}, //11014 #HANGUL SYLLABLE HIEUH YA RIEULPHIEUPH + {0xC173, 0xD59F}, //11015 #HANGUL SYLLABLE HIEUH YA RIEULHIEUH + {0xC174, 0xD5A0}, //11016 #HANGUL SYLLABLE HIEUH YA MIEUM + {0xC175, 0xD5A1}, //11017 #HANGUL SYLLABLE HIEUH YA PIEUP + {0xC176, 0xD5A2}, //11018 #HANGUL SYLLABLE HIEUH YA PIEUPSIOS + {0xC177, 0xD5A3}, //11019 #HANGUL SYLLABLE HIEUH YA SIOS + {0xC178, 0xD5A4}, //11020 #HANGUL SYLLABLE HIEUH YA SSANGSIOS + {0xC179, 0xD5A6}, //11021 #HANGUL SYLLABLE HIEUH YA CIEUC + {0xC17A, 0xD5A7}, //11022 #HANGUL SYLLABLE HIEUH YA CHIEUCH + {0xC181, 0xD5A8}, //11023 #HANGUL SYLLABLE HIEUH YA KHIEUKH + {0xC182, 0xD5A9}, //11024 #HANGUL SYLLABLE HIEUH YA THIEUTH + {0xC183, 0xD5AA}, //11025 #HANGUL SYLLABLE HIEUH YA PHIEUPH + {0xC184, 0xD5AB}, //11026 #HANGUL SYLLABLE HIEUH YA HIEUH + {0xC185, 0xD5AC}, //11027 #HANGUL SYLLABLE HIEUH YAE + {0xC186, 0xD5AD}, //11028 #HANGUL SYLLABLE HIEUH YAE KIYEOK + {0xC187, 0xD5AE}, //11029 #HANGUL SYLLABLE HIEUH YAE SSANGKIYEOK + {0xC188, 0xD5AF}, //11030 #HANGUL SYLLABLE HIEUH YAE KIYEOKSIOS + {0xC189, 0xD5B0}, //11031 #HANGUL SYLLABLE HIEUH YAE NIEUN + {0xC18A, 0xD5B1}, //11032 #HANGUL SYLLABLE HIEUH YAE NIEUNCIEUC + {0xC18B, 0xD5B2}, //11033 #HANGUL SYLLABLE HIEUH YAE NIEUNHIEUH + {0xC18C, 0xD5B3}, //11034 #HANGUL SYLLABLE HIEUH YAE TIKEUT + {0xC18D, 0xD5B4}, //11035 #HANGUL SYLLABLE HIEUH YAE RIEUL + {0xC18E, 0xD5B5}, //11036 #HANGUL SYLLABLE HIEUH YAE RIEULKIYEOK + {0xC18F, 0xD5B6}, //11037 #HANGUL SYLLABLE HIEUH YAE RIEULMIEUM + {0xC190, 0xD5B7}, //11038 #HANGUL SYLLABLE HIEUH YAE RIEULPIEUP + {0xC191, 0xD5B8}, //11039 #HANGUL SYLLABLE HIEUH YAE RIEULSIOS + {0xC192, 0xD5B9}, //11040 #HANGUL SYLLABLE HIEUH YAE RIEULTHIEUTH + {0xC193, 0xD5BA}, //11041 #HANGUL SYLLABLE HIEUH YAE RIEULPHIEUPH + {0xC194, 0xD5BB}, //11042 #HANGUL SYLLABLE HIEUH YAE RIEULHIEUH + {0xC195, 0xD5BC}, //11043 #HANGUL SYLLABLE HIEUH YAE MIEUM + {0xC196, 0xD5BD}, //11044 #HANGUL SYLLABLE HIEUH YAE PIEUP + {0xC197, 0xD5BE}, //11045 #HANGUL SYLLABLE HIEUH YAE PIEUPSIOS + {0xC198, 0xD5BF}, //11046 #HANGUL SYLLABLE HIEUH YAE SIOS + {0xC199, 0xD5C0}, //11047 #HANGUL SYLLABLE HIEUH YAE SSANGSIOS + {0xC19A, 0xD5C1}, //11048 #HANGUL SYLLABLE HIEUH YAE IEUNG + {0xC19B, 0xD5C2}, //11049 #HANGUL SYLLABLE HIEUH YAE CIEUC + {0xC19C, 0xD5C3}, //11050 #HANGUL SYLLABLE HIEUH YAE CHIEUCH + {0xC19D, 0xD5C4}, //11051 #HANGUL SYLLABLE HIEUH YAE KHIEUKH + {0xC19E, 0xD5C5}, //11052 #HANGUL SYLLABLE HIEUH YAE THIEUTH + {0xC19F, 0xD5C6}, //11053 #HANGUL SYLLABLE HIEUH YAE PHIEUPH + {0xC1A0, 0xD5C7}, //11054 #HANGUL SYLLABLE HIEUH YAE HIEUH + {0xC1A1, 0xC810}, //11055 #HANGUL SYLLABLE CIEUC EO MIEUM + {0xC1A2, 0xC811}, //11056 #HANGUL SYLLABLE CIEUC EO PIEUP + {0xC1A3, 0xC813}, //11057 #HANGUL SYLLABLE CIEUC EO SIOS + {0xC1A4, 0xC815}, //11058 #HANGUL SYLLABLE CIEUC EO IEUNG + {0xC1A5, 0xC816}, //11059 #HANGUL SYLLABLE CIEUC EO CIEUC + {0xC1A6, 0xC81C}, //11060 #HANGUL SYLLABLE CIEUC E + {0xC1A7, 0xC81D}, //11061 #HANGUL SYLLABLE CIEUC E KIYEOK + {0xC1A8, 0xC820}, //11062 #HANGUL SYLLABLE CIEUC E NIEUN + {0xC1A9, 0xC824}, //11063 #HANGUL SYLLABLE CIEUC E RIEUL + {0xC1AA, 0xC82C}, //11064 #HANGUL SYLLABLE CIEUC E MIEUM + {0xC1AB, 0xC82D}, //11065 #HANGUL SYLLABLE CIEUC E PIEUP + {0xC1AC, 0xC82F}, //11066 #HANGUL SYLLABLE CIEUC E SIOS + {0xC1AD, 0xC831}, //11067 #HANGUL SYLLABLE CIEUC E IEUNG + {0xC1AE, 0xC838}, //11068 #HANGUL SYLLABLE CIEUC YEO + {0xC1AF, 0xC83C}, //11069 #HANGUL SYLLABLE CIEUC YEO NIEUN + {0xC1B0, 0xC840}, //11070 #HANGUL SYLLABLE CIEUC YEO RIEUL + {0xC1B1, 0xC848}, //11071 #HANGUL SYLLABLE CIEUC YEO MIEUM + {0xC1B2, 0xC849}, //11072 #HANGUL SYLLABLE CIEUC YEO PIEUP + {0xC1B3, 0xC84C}, //11073 #HANGUL SYLLABLE CIEUC YEO SSANGSIOS + {0xC1B4, 0xC84D}, //11074 #HANGUL SYLLABLE CIEUC YEO IEUNG + {0xC1B5, 0xC854}, //11075 #HANGUL SYLLABLE CIEUC YE + {0xC1B6, 0xC870}, //11076 #HANGUL SYLLABLE CIEUC O + {0xC1B7, 0xC871}, //11077 #HANGUL SYLLABLE CIEUC O KIYEOK + {0xC1B8, 0xC874}, //11078 #HANGUL SYLLABLE CIEUC O NIEUN + {0xC1B9, 0xC878}, //11079 #HANGUL SYLLABLE CIEUC O RIEUL + {0xC1BA, 0xC87A}, //11080 #HANGUL SYLLABLE CIEUC O RIEULMIEUM + {0xC1BB, 0xC880}, //11081 #HANGUL SYLLABLE CIEUC O MIEUM + {0xC1BC, 0xC881}, //11082 #HANGUL SYLLABLE CIEUC O PIEUP + {0xC1BD, 0xC883}, //11083 #HANGUL SYLLABLE CIEUC O SIOS + {0xC1BE, 0xC885}, //11084 #HANGUL SYLLABLE CIEUC O IEUNG + {0xC1BF, 0xC886}, //11085 #HANGUL SYLLABLE CIEUC O CIEUC + {0xC1C0, 0xC887}, //11086 #HANGUL SYLLABLE CIEUC O CHIEUCH + {0xC1C1, 0xC88B}, //11087 #HANGUL SYLLABLE CIEUC O HIEUH + {0xC1C2, 0xC88C}, //11088 #HANGUL SYLLABLE CIEUC WA + {0xC1C3, 0xC88D}, //11089 #HANGUL SYLLABLE CIEUC WA KIYEOK + {0xC1C4, 0xC894}, //11090 #HANGUL SYLLABLE CIEUC WA RIEUL + {0xC1C5, 0xC89D}, //11091 #HANGUL SYLLABLE CIEUC WA PIEUP + {0xC1C6, 0xC89F}, //11092 #HANGUL SYLLABLE CIEUC WA SIOS + {0xC1C7, 0xC8A1}, //11093 #HANGUL SYLLABLE CIEUC WA IEUNG + {0xC1C8, 0xC8A8}, //11094 #HANGUL SYLLABLE CIEUC WAE + {0xC1C9, 0xC8BC}, //11095 #HANGUL SYLLABLE CIEUC WAE SSANGSIOS + {0xC1CA, 0xC8BD}, //11096 #HANGUL SYLLABLE CIEUC WAE IEUNG + {0xC1CB, 0xC8C4}, //11097 #HANGUL SYLLABLE CIEUC OE + {0xC1CC, 0xC8C8}, //11098 #HANGUL SYLLABLE CIEUC OE NIEUN + {0xC1CD, 0xC8CC}, //11099 #HANGUL SYLLABLE CIEUC OE RIEUL + {0xC1CE, 0xC8D4}, //11100 #HANGUL SYLLABLE CIEUC OE MIEUM + {0xC1CF, 0xC8D5}, //11101 #HANGUL SYLLABLE CIEUC OE PIEUP + {0xC1D0, 0xC8D7}, //11102 #HANGUL SYLLABLE CIEUC OE SIOS + {0xC1D1, 0xC8D9}, //11103 #HANGUL SYLLABLE CIEUC OE IEUNG + {0xC1D2, 0xC8E0}, //11104 #HANGUL SYLLABLE CIEUC YO + {0xC1D3, 0xC8E1}, //11105 #HANGUL SYLLABLE CIEUC YO KIYEOK + {0xC1D4, 0xC8E4}, //11106 #HANGUL SYLLABLE CIEUC YO NIEUN + {0xC1D5, 0xC8F5}, //11107 #HANGUL SYLLABLE CIEUC YO IEUNG + {0xC1D6, 0xC8FC}, //11108 #HANGUL SYLLABLE CIEUC U + {0xC1D7, 0xC8FD}, //11109 #HANGUL SYLLABLE CIEUC U KIYEOK + {0xC1D8, 0xC900}, //11110 #HANGUL SYLLABLE CIEUC U NIEUN + {0xC1D9, 0xC904}, //11111 #HANGUL SYLLABLE CIEUC U RIEUL + {0xC1DA, 0xC905}, //11112 #HANGUL SYLLABLE CIEUC U RIEULKIYEOK + {0xC1DB, 0xC906}, //11113 #HANGUL SYLLABLE CIEUC U RIEULMIEUM + {0xC1DC, 0xC90C}, //11114 #HANGUL SYLLABLE CIEUC U MIEUM + {0xC1DD, 0xC90D}, //11115 #HANGUL SYLLABLE CIEUC U PIEUP + {0xC1DE, 0xC90F}, //11116 #HANGUL SYLLABLE CIEUC U SIOS + {0xC1DF, 0xC911}, //11117 #HANGUL SYLLABLE CIEUC U IEUNG + {0xC1E0, 0xC918}, //11118 #HANGUL SYLLABLE CIEUC WEO + {0xC1E1, 0xC92C}, //11119 #HANGUL SYLLABLE CIEUC WEO SSANGSIOS + {0xC1E2, 0xC934}, //11120 #HANGUL SYLLABLE CIEUC WE + {0xC1E3, 0xC950}, //11121 #HANGUL SYLLABLE CIEUC WI + {0xC1E4, 0xC951}, //11122 #HANGUL SYLLABLE CIEUC WI KIYEOK + {0xC1E5, 0xC954}, //11123 #HANGUL SYLLABLE CIEUC WI NIEUN + {0xC1E6, 0xC958}, //11124 #HANGUL SYLLABLE CIEUC WI RIEUL + {0xC1E7, 0xC960}, //11125 #HANGUL SYLLABLE CIEUC WI MIEUM + {0xC1E8, 0xC961}, //11126 #HANGUL SYLLABLE CIEUC WI PIEUP + {0xC1E9, 0xC963}, //11127 #HANGUL SYLLABLE CIEUC WI SIOS + {0xC1EA, 0xC96C}, //11128 #HANGUL SYLLABLE CIEUC YU + {0xC1EB, 0xC970}, //11129 #HANGUL SYLLABLE CIEUC YU NIEUN + {0xC1EC, 0xC974}, //11130 #HANGUL SYLLABLE CIEUC YU RIEUL + {0xC1ED, 0xC97C}, //11131 #HANGUL SYLLABLE CIEUC YU MIEUM + {0xC1EE, 0xC988}, //11132 #HANGUL SYLLABLE CIEUC EU + {0xC1EF, 0xC989}, //11133 #HANGUL SYLLABLE CIEUC EU KIYEOK + {0xC1F0, 0xC98C}, //11134 #HANGUL SYLLABLE CIEUC EU NIEUN + {0xC1F1, 0xC990}, //11135 #HANGUL SYLLABLE CIEUC EU RIEUL + {0xC1F2, 0xC998}, //11136 #HANGUL SYLLABLE CIEUC EU MIEUM + {0xC1F3, 0xC999}, //11137 #HANGUL SYLLABLE CIEUC EU PIEUP + {0xC1F4, 0xC99B}, //11138 #HANGUL SYLLABLE CIEUC EU SIOS + {0xC1F5, 0xC99D}, //11139 #HANGUL SYLLABLE CIEUC EU IEUNG + {0xC1F6, 0xC9C0}, //11140 #HANGUL SYLLABLE CIEUC I + {0xC1F7, 0xC9C1}, //11141 #HANGUL SYLLABLE CIEUC I KIYEOK + {0xC1F8, 0xC9C4}, //11142 #HANGUL SYLLABLE CIEUC I NIEUN + {0xC1F9, 0xC9C7}, //11143 #HANGUL SYLLABLE CIEUC I TIKEUT + {0xC1FA, 0xC9C8}, //11144 #HANGUL SYLLABLE CIEUC I RIEUL + {0xC1FB, 0xC9CA}, //11145 #HANGUL SYLLABLE CIEUC I RIEULMIEUM + {0xC1FC, 0xC9D0}, //11146 #HANGUL SYLLABLE CIEUC I MIEUM + {0xC1FD, 0xC9D1}, //11147 #HANGUL SYLLABLE CIEUC I PIEUP + {0xC1FE, 0xC9D3}, //11148 #HANGUL SYLLABLE CIEUC I SIOS + {0xC241, 0xD5CA}, //11149 #HANGUL SYLLABLE HIEUH EO SSANGKIYEOK + {0xC242, 0xD5CB}, //11150 #HANGUL SYLLABLE HIEUH EO KIYEOKSIOS + {0xC243, 0xD5CD}, //11151 #HANGUL SYLLABLE HIEUH EO NIEUNCIEUC + {0xC244, 0xD5CE}, //11152 #HANGUL SYLLABLE HIEUH EO NIEUNHIEUH + {0xC245, 0xD5CF}, //11153 #HANGUL SYLLABLE HIEUH EO TIKEUT + {0xC246, 0xD5D1}, //11154 #HANGUL SYLLABLE HIEUH EO RIEULKIYEOK + {0xC247, 0xD5D3}, //11155 #HANGUL SYLLABLE HIEUH EO RIEULPIEUP + {0xC248, 0xD5D4}, //11156 #HANGUL SYLLABLE HIEUH EO RIEULSIOS + {0xC249, 0xD5D5}, //11157 #HANGUL SYLLABLE HIEUH EO RIEULTHIEUTH + {0xC24A, 0xD5D6}, //11158 #HANGUL SYLLABLE HIEUH EO RIEULPHIEUPH + {0xC24B, 0xD5D7}, //11159 #HANGUL SYLLABLE HIEUH EO RIEULHIEUH + {0xC24C, 0xD5DA}, //11160 #HANGUL SYLLABLE HIEUH EO PIEUPSIOS + {0xC24D, 0xD5DC}, //11161 #HANGUL SYLLABLE HIEUH EO SSANGSIOS + {0xC24E, 0xD5DE}, //11162 #HANGUL SYLLABLE HIEUH EO CIEUC + {0xC24F, 0xD5DF}, //11163 #HANGUL SYLLABLE HIEUH EO CHIEUCH + {0xC250, 0xD5E0}, //11164 #HANGUL SYLLABLE HIEUH EO KHIEUKH + {0xC251, 0xD5E1}, //11165 #HANGUL SYLLABLE HIEUH EO THIEUTH + {0xC252, 0xD5E2}, //11166 #HANGUL SYLLABLE HIEUH EO PHIEUPH + {0xC253, 0xD5E3}, //11167 #HANGUL SYLLABLE HIEUH EO HIEUH + {0xC254, 0xD5E6}, //11168 #HANGUL SYLLABLE HIEUH E SSANGKIYEOK + {0xC255, 0xD5E7}, //11169 #HANGUL SYLLABLE HIEUH E KIYEOKSIOS + {0xC256, 0xD5E9}, //11170 #HANGUL SYLLABLE HIEUH E NIEUNCIEUC + {0xC257, 0xD5EA}, //11171 #HANGUL SYLLABLE HIEUH E NIEUNHIEUH + {0xC258, 0xD5EB}, //11172 #HANGUL SYLLABLE HIEUH E TIKEUT + {0xC259, 0xD5ED}, //11173 #HANGUL SYLLABLE HIEUH E RIEULKIYEOK + {0xC25A, 0xD5EE}, //11174 #HANGUL SYLLABLE HIEUH E RIEULMIEUM + {0xC261, 0xD5EF}, //11175 #HANGUL SYLLABLE HIEUH E RIEULPIEUP + {0xC262, 0xD5F0}, //11176 #HANGUL SYLLABLE HIEUH E RIEULSIOS + {0xC263, 0xD5F1}, //11177 #HANGUL SYLLABLE HIEUH E RIEULTHIEUTH + {0xC264, 0xD5F2}, //11178 #HANGUL SYLLABLE HIEUH E RIEULPHIEUPH + {0xC265, 0xD5F3}, //11179 #HANGUL SYLLABLE HIEUH E RIEULHIEUH + {0xC266, 0xD5F6}, //11180 #HANGUL SYLLABLE HIEUH E PIEUPSIOS + {0xC267, 0xD5F8}, //11181 #HANGUL SYLLABLE HIEUH E SSANGSIOS + {0xC268, 0xD5FA}, //11182 #HANGUL SYLLABLE HIEUH E CIEUC + {0xC269, 0xD5FB}, //11183 #HANGUL SYLLABLE HIEUH E CHIEUCH + {0xC26A, 0xD5FC}, //11184 #HANGUL SYLLABLE HIEUH E KHIEUKH + {0xC26B, 0xD5FD}, //11185 #HANGUL SYLLABLE HIEUH E THIEUTH + {0xC26C, 0xD5FE}, //11186 #HANGUL SYLLABLE HIEUH E PHIEUPH + {0xC26D, 0xD5FF}, //11187 #HANGUL SYLLABLE HIEUH E HIEUH + {0xC26E, 0xD602}, //11188 #HANGUL SYLLABLE HIEUH YEO SSANGKIYEOK + {0xC26F, 0xD603}, //11189 #HANGUL SYLLABLE HIEUH YEO KIYEOKSIOS + {0xC270, 0xD605}, //11190 #HANGUL SYLLABLE HIEUH YEO NIEUNCIEUC + {0xC271, 0xD606}, //11191 #HANGUL SYLLABLE HIEUH YEO NIEUNHIEUH + {0xC272, 0xD607}, //11192 #HANGUL SYLLABLE HIEUH YEO TIKEUT + {0xC273, 0xD609}, //11193 #HANGUL SYLLABLE HIEUH YEO RIEULKIYEOK + {0xC274, 0xD60A}, //11194 #HANGUL SYLLABLE HIEUH YEO RIEULMIEUM + {0xC275, 0xD60B}, //11195 #HANGUL SYLLABLE HIEUH YEO RIEULPIEUP + {0xC276, 0xD60C}, //11196 #HANGUL SYLLABLE HIEUH YEO RIEULSIOS + {0xC277, 0xD60D}, //11197 #HANGUL SYLLABLE HIEUH YEO RIEULTHIEUTH + {0xC278, 0xD60E}, //11198 #HANGUL SYLLABLE HIEUH YEO RIEULPHIEUPH + {0xC279, 0xD60F}, //11199 #HANGUL SYLLABLE HIEUH YEO RIEULHIEUH + {0xC27A, 0xD612}, //11200 #HANGUL SYLLABLE HIEUH YEO PIEUPSIOS + {0xC281, 0xD616}, //11201 #HANGUL SYLLABLE HIEUH YEO CIEUC + {0xC282, 0xD617}, //11202 #HANGUL SYLLABLE HIEUH YEO CHIEUCH + {0xC283, 0xD618}, //11203 #HANGUL SYLLABLE HIEUH YEO KHIEUKH + {0xC284, 0xD619}, //11204 #HANGUL SYLLABLE HIEUH YEO THIEUTH + {0xC285, 0xD61A}, //11205 #HANGUL SYLLABLE HIEUH YEO PHIEUPH + {0xC286, 0xD61B}, //11206 #HANGUL SYLLABLE HIEUH YEO HIEUH + {0xC287, 0xD61D}, //11207 #HANGUL SYLLABLE HIEUH YE KIYEOK + {0xC288, 0xD61E}, //11208 #HANGUL SYLLABLE HIEUH YE SSANGKIYEOK + {0xC289, 0xD61F}, //11209 #HANGUL SYLLABLE HIEUH YE KIYEOKSIOS + {0xC28A, 0xD621}, //11210 #HANGUL SYLLABLE HIEUH YE NIEUNCIEUC + {0xC28B, 0xD622}, //11211 #HANGUL SYLLABLE HIEUH YE NIEUNHIEUH + {0xC28C, 0xD623}, //11212 #HANGUL SYLLABLE HIEUH YE TIKEUT + {0xC28D, 0xD625}, //11213 #HANGUL SYLLABLE HIEUH YE RIEULKIYEOK + {0xC28E, 0xD626}, //11214 #HANGUL SYLLABLE HIEUH YE RIEULMIEUM + {0xC28F, 0xD627}, //11215 #HANGUL SYLLABLE HIEUH YE RIEULPIEUP + {0xC290, 0xD628}, //11216 #HANGUL SYLLABLE HIEUH YE RIEULSIOS + {0xC291, 0xD629}, //11217 #HANGUL SYLLABLE HIEUH YE RIEULTHIEUTH + {0xC292, 0xD62A}, //11218 #HANGUL SYLLABLE HIEUH YE RIEULPHIEUPH + {0xC293, 0xD62B}, //11219 #HANGUL SYLLABLE HIEUH YE RIEULHIEUH + {0xC294, 0xD62C}, //11220 #HANGUL SYLLABLE HIEUH YE MIEUM + {0xC295, 0xD62E}, //11221 #HANGUL SYLLABLE HIEUH YE PIEUPSIOS + {0xC296, 0xD62F}, //11222 #HANGUL SYLLABLE HIEUH YE SIOS + {0xC297, 0xD630}, //11223 #HANGUL SYLLABLE HIEUH YE SSANGSIOS + {0xC298, 0xD631}, //11224 #HANGUL SYLLABLE HIEUH YE IEUNG + {0xC299, 0xD632}, //11225 #HANGUL SYLLABLE HIEUH YE CIEUC + {0xC29A, 0xD633}, //11226 #HANGUL SYLLABLE HIEUH YE CHIEUCH + {0xC29B, 0xD634}, //11227 #HANGUL SYLLABLE HIEUH YE KHIEUKH + {0xC29C, 0xD635}, //11228 #HANGUL SYLLABLE HIEUH YE THIEUTH + {0xC29D, 0xD636}, //11229 #HANGUL SYLLABLE HIEUH YE PHIEUPH + {0xC29E, 0xD637}, //11230 #HANGUL SYLLABLE HIEUH YE HIEUH + {0xC29F, 0xD63A}, //11231 #HANGUL SYLLABLE HIEUH O SSANGKIYEOK + {0xC2A0, 0xD63B}, //11232 #HANGUL SYLLABLE HIEUH O KIYEOKSIOS + {0xC2A1, 0xC9D5}, //11233 #HANGUL SYLLABLE CIEUC I IEUNG + {0xC2A2, 0xC9D6}, //11234 #HANGUL SYLLABLE CIEUC I CIEUC + {0xC2A3, 0xC9D9}, //11235 #HANGUL SYLLABLE CIEUC I THIEUTH + {0xC2A4, 0xC9DA}, //11236 #HANGUL SYLLABLE CIEUC I PHIEUPH + {0xC2A5, 0xC9DC}, //11237 #HANGUL SYLLABLE SSANGCIEUC A + {0xC2A6, 0xC9DD}, //11238 #HANGUL SYLLABLE SSANGCIEUC A KIYEOK + {0xC2A7, 0xC9E0}, //11239 #HANGUL SYLLABLE SSANGCIEUC A NIEUN + {0xC2A8, 0xC9E2}, //11240 #HANGUL SYLLABLE SSANGCIEUC A NIEUNHIEUH + {0xC2A9, 0xC9E4}, //11241 #HANGUL SYLLABLE SSANGCIEUC A RIEUL + {0xC2AA, 0xC9E7}, //11242 #HANGUL SYLLABLE SSANGCIEUC A RIEULPIEUP + {0xC2AB, 0xC9EC}, //11243 #HANGUL SYLLABLE SSANGCIEUC A MIEUM + {0xC2AC, 0xC9ED}, //11244 #HANGUL SYLLABLE SSANGCIEUC A PIEUP + {0xC2AD, 0xC9EF}, //11245 #HANGUL SYLLABLE SSANGCIEUC A SIOS + {0xC2AE, 0xC9F0}, //11246 #HANGUL SYLLABLE SSANGCIEUC A SSANGSIOS + {0xC2AF, 0xC9F1}, //11247 #HANGUL SYLLABLE SSANGCIEUC A IEUNG + {0xC2B0, 0xC9F8}, //11248 #HANGUL SYLLABLE SSANGCIEUC AE + {0xC2B1, 0xC9F9}, //11249 #HANGUL SYLLABLE SSANGCIEUC AE KIYEOK + {0xC2B2, 0xC9FC}, //11250 #HANGUL SYLLABLE SSANGCIEUC AE NIEUN + {0xC2B3, 0xCA00}, //11251 #HANGUL SYLLABLE SSANGCIEUC AE RIEUL + {0xC2B4, 0xCA08}, //11252 #HANGUL SYLLABLE SSANGCIEUC AE MIEUM + {0xC2B5, 0xCA09}, //11253 #HANGUL SYLLABLE SSANGCIEUC AE PIEUP + {0xC2B6, 0xCA0B}, //11254 #HANGUL SYLLABLE SSANGCIEUC AE SIOS + {0xC2B7, 0xCA0C}, //11255 #HANGUL SYLLABLE SSANGCIEUC AE SSANGSIOS + {0xC2B8, 0xCA0D}, //11256 #HANGUL SYLLABLE SSANGCIEUC AE IEUNG + {0xC2B9, 0xCA14}, //11257 #HANGUL SYLLABLE SSANGCIEUC YA + {0xC2BA, 0xCA18}, //11258 #HANGUL SYLLABLE SSANGCIEUC YA NIEUN + {0xC2BB, 0xCA29}, //11259 #HANGUL SYLLABLE SSANGCIEUC YA IEUNG + {0xC2BC, 0xCA4C}, //11260 #HANGUL SYLLABLE SSANGCIEUC EO + {0xC2BD, 0xCA4D}, //11261 #HANGUL SYLLABLE SSANGCIEUC EO KIYEOK + {0xC2BE, 0xCA50}, //11262 #HANGUL SYLLABLE SSANGCIEUC EO NIEUN + {0xC2BF, 0xCA54}, //11263 #HANGUL SYLLABLE SSANGCIEUC EO RIEUL + {0xC2C0, 0xCA5C}, //11264 #HANGUL SYLLABLE SSANGCIEUC EO MIEUM + {0xC2C1, 0xCA5D}, //11265 #HANGUL SYLLABLE SSANGCIEUC EO PIEUP + {0xC2C2, 0xCA5F}, //11266 #HANGUL SYLLABLE SSANGCIEUC EO SIOS + {0xC2C3, 0xCA60}, //11267 #HANGUL SYLLABLE SSANGCIEUC EO SSANGSIOS + {0xC2C4, 0xCA61}, //11268 #HANGUL SYLLABLE SSANGCIEUC EO IEUNG + {0xC2C5, 0xCA68}, //11269 #HANGUL SYLLABLE SSANGCIEUC E + {0xC2C6, 0xCA7D}, //11270 #HANGUL SYLLABLE SSANGCIEUC E IEUNG + {0xC2C7, 0xCA84}, //11271 #HANGUL SYLLABLE SSANGCIEUC YEO + {0xC2C8, 0xCA98}, //11272 #HANGUL SYLLABLE SSANGCIEUC YEO SSANGSIOS + {0xC2C9, 0xCABC}, //11273 #HANGUL SYLLABLE SSANGCIEUC O + {0xC2CA, 0xCABD}, //11274 #HANGUL SYLLABLE SSANGCIEUC O KIYEOK + {0xC2CB, 0xCAC0}, //11275 #HANGUL SYLLABLE SSANGCIEUC O NIEUN + {0xC2CC, 0xCAC4}, //11276 #HANGUL SYLLABLE SSANGCIEUC O RIEUL + {0xC2CD, 0xCACC}, //11277 #HANGUL SYLLABLE SSANGCIEUC O MIEUM + {0xC2CE, 0xCACD}, //11278 #HANGUL SYLLABLE SSANGCIEUC O PIEUP + {0xC2CF, 0xCACF}, //11279 #HANGUL SYLLABLE SSANGCIEUC O SIOS + {0xC2D0, 0xCAD1}, //11280 #HANGUL SYLLABLE SSANGCIEUC O IEUNG + {0xC2D1, 0xCAD3}, //11281 #HANGUL SYLLABLE SSANGCIEUC O CHIEUCH + {0xC2D2, 0xCAD8}, //11282 #HANGUL SYLLABLE SSANGCIEUC WA + {0xC2D3, 0xCAD9}, //11283 #HANGUL SYLLABLE SSANGCIEUC WA KIYEOK + {0xC2D4, 0xCAE0}, //11284 #HANGUL SYLLABLE SSANGCIEUC WA RIEUL + {0xC2D5, 0xCAEC}, //11285 #HANGUL SYLLABLE SSANGCIEUC WA SSANGSIOS + {0xC2D6, 0xCAF4}, //11286 #HANGUL SYLLABLE SSANGCIEUC WAE + {0xC2D7, 0xCB08}, //11287 #HANGUL SYLLABLE SSANGCIEUC WAE SSANGSIOS + {0xC2D8, 0xCB10}, //11288 #HANGUL SYLLABLE SSANGCIEUC OE + {0xC2D9, 0xCB14}, //11289 #HANGUL SYLLABLE SSANGCIEUC OE NIEUN + {0xC2DA, 0xCB18}, //11290 #HANGUL SYLLABLE SSANGCIEUC OE RIEUL + {0xC2DB, 0xCB20}, //11291 #HANGUL SYLLABLE SSANGCIEUC OE MIEUM + {0xC2DC, 0xCB21}, //11292 #HANGUL SYLLABLE SSANGCIEUC OE PIEUP + {0xC2DD, 0xCB41}, //11293 #HANGUL SYLLABLE SSANGCIEUC YO IEUNG + {0xC2DE, 0xCB48}, //11294 #HANGUL SYLLABLE SSANGCIEUC U + {0xC2DF, 0xCB49}, //11295 #HANGUL SYLLABLE SSANGCIEUC U KIYEOK + {0xC2E0, 0xCB4C}, //11296 #HANGUL SYLLABLE SSANGCIEUC U NIEUN + {0xC2E1, 0xCB50}, //11297 #HANGUL SYLLABLE SSANGCIEUC U RIEUL + {0xC2E2, 0xCB58}, //11298 #HANGUL SYLLABLE SSANGCIEUC U MIEUM + {0xC2E3, 0xCB59}, //11299 #HANGUL SYLLABLE SSANGCIEUC U PIEUP + {0xC2E4, 0xCB5D}, //11300 #HANGUL SYLLABLE SSANGCIEUC U IEUNG + {0xC2E5, 0xCB64}, //11301 #HANGUL SYLLABLE SSANGCIEUC WEO + {0xC2E6, 0xCB78}, //11302 #HANGUL SYLLABLE SSANGCIEUC WEO SSANGSIOS + {0xC2E7, 0xCB79}, //11303 #HANGUL SYLLABLE SSANGCIEUC WEO IEUNG + {0xC2E8, 0xCB9C}, //11304 #HANGUL SYLLABLE SSANGCIEUC WI + {0xC2E9, 0xCBB8}, //11305 #HANGUL SYLLABLE SSANGCIEUC YU + {0xC2EA, 0xCBD4}, //11306 #HANGUL SYLLABLE SSANGCIEUC EU + {0xC2EB, 0xCBE4}, //11307 #HANGUL SYLLABLE SSANGCIEUC EU MIEUM + {0xC2EC, 0xCBE7}, //11308 #HANGUL SYLLABLE SSANGCIEUC EU SIOS + {0xC2ED, 0xCBE9}, //11309 #HANGUL SYLLABLE SSANGCIEUC EU IEUNG + {0xC2EE, 0xCC0C}, //11310 #HANGUL SYLLABLE SSANGCIEUC I + {0xC2EF, 0xCC0D}, //11311 #HANGUL SYLLABLE SSANGCIEUC I KIYEOK + {0xC2F0, 0xCC10}, //11312 #HANGUL SYLLABLE SSANGCIEUC I NIEUN + {0xC2F1, 0xCC14}, //11313 #HANGUL SYLLABLE SSANGCIEUC I RIEUL + {0xC2F2, 0xCC1C}, //11314 #HANGUL SYLLABLE SSANGCIEUC I MIEUM + {0xC2F3, 0xCC1D}, //11315 #HANGUL SYLLABLE SSANGCIEUC I PIEUP + {0xC2F4, 0xCC21}, //11316 #HANGUL SYLLABLE SSANGCIEUC I IEUNG + {0xC2F5, 0xCC22}, //11317 #HANGUL SYLLABLE SSANGCIEUC I CIEUC + {0xC2F6, 0xCC27}, //11318 #HANGUL SYLLABLE SSANGCIEUC I HIEUH + {0xC2F7, 0xCC28}, //11319 #HANGUL SYLLABLE CHIEUCH A + {0xC2F8, 0xCC29}, //11320 #HANGUL SYLLABLE CHIEUCH A KIYEOK + {0xC2F9, 0xCC2C}, //11321 #HANGUL SYLLABLE CHIEUCH A NIEUN + {0xC2FA, 0xCC2E}, //11322 #HANGUL SYLLABLE CHIEUCH A NIEUNHIEUH + {0xC2FB, 0xCC30}, //11323 #HANGUL SYLLABLE CHIEUCH A RIEUL + {0xC2FC, 0xCC38}, //11324 #HANGUL SYLLABLE CHIEUCH A MIEUM + {0xC2FD, 0xCC39}, //11325 #HANGUL SYLLABLE CHIEUCH A PIEUP + {0xC2FE, 0xCC3B}, //11326 #HANGUL SYLLABLE CHIEUCH A SIOS + {0xC341, 0xD63D}, //11327 #HANGUL SYLLABLE HIEUH O NIEUNCIEUC + {0xC342, 0xD63E}, //11328 #HANGUL SYLLABLE HIEUH O NIEUNHIEUH + {0xC343, 0xD63F}, //11329 #HANGUL SYLLABLE HIEUH O TIKEUT + {0xC344, 0xD641}, //11330 #HANGUL SYLLABLE HIEUH O RIEULKIYEOK + {0xC345, 0xD642}, //11331 #HANGUL SYLLABLE HIEUH O RIEULMIEUM + {0xC346, 0xD643}, //11332 #HANGUL SYLLABLE HIEUH O RIEULPIEUP + {0xC347, 0xD644}, //11333 #HANGUL SYLLABLE HIEUH O RIEULSIOS + {0xC348, 0xD646}, //11334 #HANGUL SYLLABLE HIEUH O RIEULPHIEUPH + {0xC349, 0xD647}, //11335 #HANGUL SYLLABLE HIEUH O RIEULHIEUH + {0xC34A, 0xD64A}, //11336 #HANGUL SYLLABLE HIEUH O PIEUPSIOS + {0xC34B, 0xD64C}, //11337 #HANGUL SYLLABLE HIEUH O SSANGSIOS + {0xC34C, 0xD64E}, //11338 #HANGUL SYLLABLE HIEUH O CIEUC + {0xC34D, 0xD64F}, //11339 #HANGUL SYLLABLE HIEUH O CHIEUCH + {0xC34E, 0xD650}, //11340 #HANGUL SYLLABLE HIEUH O KHIEUKH + {0xC34F, 0xD652}, //11341 #HANGUL SYLLABLE HIEUH O PHIEUPH + {0xC350, 0xD653}, //11342 #HANGUL SYLLABLE HIEUH O HIEUH + {0xC351, 0xD656}, //11343 #HANGUL SYLLABLE HIEUH WA SSANGKIYEOK + {0xC352, 0xD657}, //11344 #HANGUL SYLLABLE HIEUH WA KIYEOKSIOS + {0xC353, 0xD659}, //11345 #HANGUL SYLLABLE HIEUH WA NIEUNCIEUC + {0xC354, 0xD65A}, //11346 #HANGUL SYLLABLE HIEUH WA NIEUNHIEUH + {0xC355, 0xD65B}, //11347 #HANGUL SYLLABLE HIEUH WA TIKEUT + {0xC356, 0xD65D}, //11348 #HANGUL SYLLABLE HIEUH WA RIEULKIYEOK + {0xC357, 0xD65E}, //11349 #HANGUL SYLLABLE HIEUH WA RIEULMIEUM + {0xC358, 0xD65F}, //11350 #HANGUL SYLLABLE HIEUH WA RIEULPIEUP + {0xC359, 0xD660}, //11351 #HANGUL SYLLABLE HIEUH WA RIEULSIOS + {0xC35A, 0xD661}, //11352 #HANGUL SYLLABLE HIEUH WA RIEULTHIEUTH + {0xC361, 0xD662}, //11353 #HANGUL SYLLABLE HIEUH WA RIEULPHIEUPH + {0xC362, 0xD663}, //11354 #HANGUL SYLLABLE HIEUH WA RIEULHIEUH + {0xC363, 0xD664}, //11355 #HANGUL SYLLABLE HIEUH WA MIEUM + {0xC364, 0xD665}, //11356 #HANGUL SYLLABLE HIEUH WA PIEUP + {0xC365, 0xD666}, //11357 #HANGUL SYLLABLE HIEUH WA PIEUPSIOS + {0xC366, 0xD668}, //11358 #HANGUL SYLLABLE HIEUH WA SSANGSIOS + {0xC367, 0xD66A}, //11359 #HANGUL SYLLABLE HIEUH WA CIEUC + {0xC368, 0xD66B}, //11360 #HANGUL SYLLABLE HIEUH WA CHIEUCH + {0xC369, 0xD66C}, //11361 #HANGUL SYLLABLE HIEUH WA KHIEUKH + {0xC36A, 0xD66D}, //11362 #HANGUL SYLLABLE HIEUH WA THIEUTH + {0xC36B, 0xD66E}, //11363 #HANGUL SYLLABLE HIEUH WA PHIEUPH + {0xC36C, 0xD66F}, //11364 #HANGUL SYLLABLE HIEUH WA HIEUH + {0xC36D, 0xD672}, //11365 #HANGUL SYLLABLE HIEUH WAE SSANGKIYEOK + {0xC36E, 0xD673}, //11366 #HANGUL SYLLABLE HIEUH WAE KIYEOKSIOS + {0xC36F, 0xD675}, //11367 #HANGUL SYLLABLE HIEUH WAE NIEUNCIEUC + {0xC370, 0xD676}, //11368 #HANGUL SYLLABLE HIEUH WAE NIEUNHIEUH + {0xC371, 0xD677}, //11369 #HANGUL SYLLABLE HIEUH WAE TIKEUT + {0xC372, 0xD678}, //11370 #HANGUL SYLLABLE HIEUH WAE RIEUL + {0xC373, 0xD679}, //11371 #HANGUL SYLLABLE HIEUH WAE RIEULKIYEOK + {0xC374, 0xD67A}, //11372 #HANGUL SYLLABLE HIEUH WAE RIEULMIEUM + {0xC375, 0xD67B}, //11373 #HANGUL SYLLABLE HIEUH WAE RIEULPIEUP + {0xC376, 0xD67C}, //11374 #HANGUL SYLLABLE HIEUH WAE RIEULSIOS + {0xC377, 0xD67D}, //11375 #HANGUL SYLLABLE HIEUH WAE RIEULTHIEUTH + {0xC378, 0xD67E}, //11376 #HANGUL SYLLABLE HIEUH WAE RIEULPHIEUPH + {0xC379, 0xD67F}, //11377 #HANGUL SYLLABLE HIEUH WAE RIEULHIEUH + {0xC37A, 0xD680}, //11378 #HANGUL SYLLABLE HIEUH WAE MIEUM + {0xC381, 0xD681}, //11379 #HANGUL SYLLABLE HIEUH WAE PIEUP + {0xC382, 0xD682}, //11380 #HANGUL SYLLABLE HIEUH WAE PIEUPSIOS + {0xC383, 0xD684}, //11381 #HANGUL SYLLABLE HIEUH WAE SSANGSIOS + {0xC384, 0xD686}, //11382 #HANGUL SYLLABLE HIEUH WAE CIEUC + {0xC385, 0xD687}, //11383 #HANGUL SYLLABLE HIEUH WAE CHIEUCH + {0xC386, 0xD688}, //11384 #HANGUL SYLLABLE HIEUH WAE KHIEUKH + {0xC387, 0xD689}, //11385 #HANGUL SYLLABLE HIEUH WAE THIEUTH + {0xC388, 0xD68A}, //11386 #HANGUL SYLLABLE HIEUH WAE PHIEUPH + {0xC389, 0xD68B}, //11387 #HANGUL SYLLABLE HIEUH WAE HIEUH + {0xC38A, 0xD68E}, //11388 #HANGUL SYLLABLE HIEUH OE SSANGKIYEOK + {0xC38B, 0xD68F}, //11389 #HANGUL SYLLABLE HIEUH OE KIYEOKSIOS + {0xC38C, 0xD691}, //11390 #HANGUL SYLLABLE HIEUH OE NIEUNCIEUC + {0xC38D, 0xD692}, //11391 #HANGUL SYLLABLE HIEUH OE NIEUNHIEUH + {0xC38E, 0xD693}, //11392 #HANGUL SYLLABLE HIEUH OE TIKEUT + {0xC38F, 0xD695}, //11393 #HANGUL SYLLABLE HIEUH OE RIEULKIYEOK + {0xC390, 0xD696}, //11394 #HANGUL SYLLABLE HIEUH OE RIEULMIEUM + {0xC391, 0xD697}, //11395 #HANGUL SYLLABLE HIEUH OE RIEULPIEUP + {0xC392, 0xD698}, //11396 #HANGUL SYLLABLE HIEUH OE RIEULSIOS + {0xC393, 0xD699}, //11397 #HANGUL SYLLABLE HIEUH OE RIEULTHIEUTH + {0xC394, 0xD69A}, //11398 #HANGUL SYLLABLE HIEUH OE RIEULPHIEUPH + {0xC395, 0xD69B}, //11399 #HANGUL SYLLABLE HIEUH OE RIEULHIEUH + {0xC396, 0xD69C}, //11400 #HANGUL SYLLABLE HIEUH OE MIEUM + {0xC397, 0xD69E}, //11401 #HANGUL SYLLABLE HIEUH OE PIEUPSIOS + {0xC398, 0xD6A0}, //11402 #HANGUL SYLLABLE HIEUH OE SSANGSIOS + {0xC399, 0xD6A2}, //11403 #HANGUL SYLLABLE HIEUH OE CIEUC + {0xC39A, 0xD6A3}, //11404 #HANGUL SYLLABLE HIEUH OE CHIEUCH + {0xC39B, 0xD6A4}, //11405 #HANGUL SYLLABLE HIEUH OE KHIEUKH + {0xC39C, 0xD6A5}, //11406 #HANGUL SYLLABLE HIEUH OE THIEUTH + {0xC39D, 0xD6A6}, //11407 #HANGUL SYLLABLE HIEUH OE PHIEUPH + {0xC39E, 0xD6A7}, //11408 #HANGUL SYLLABLE HIEUH OE HIEUH + {0xC39F, 0xD6A9}, //11409 #HANGUL SYLLABLE HIEUH YO KIYEOK + {0xC3A0, 0xD6AA}, //11410 #HANGUL SYLLABLE HIEUH YO SSANGKIYEOK + {0xC3A1, 0xCC3C}, //11411 #HANGUL SYLLABLE CHIEUCH A SSANGSIOS + {0xC3A2, 0xCC3D}, //11412 #HANGUL SYLLABLE CHIEUCH A IEUNG + {0xC3A3, 0xCC3E}, //11413 #HANGUL SYLLABLE CHIEUCH A CIEUC + {0xC3A4, 0xCC44}, //11414 #HANGUL SYLLABLE CHIEUCH AE + {0xC3A5, 0xCC45}, //11415 #HANGUL SYLLABLE CHIEUCH AE KIYEOK + {0xC3A6, 0xCC48}, //11416 #HANGUL SYLLABLE CHIEUCH AE NIEUN + {0xC3A7, 0xCC4C}, //11417 #HANGUL SYLLABLE CHIEUCH AE RIEUL + {0xC3A8, 0xCC54}, //11418 #HANGUL SYLLABLE CHIEUCH AE MIEUM + {0xC3A9, 0xCC55}, //11419 #HANGUL SYLLABLE CHIEUCH AE PIEUP + {0xC3AA, 0xCC57}, //11420 #HANGUL SYLLABLE CHIEUCH AE SIOS + {0xC3AB, 0xCC58}, //11421 #HANGUL SYLLABLE CHIEUCH AE SSANGSIOS + {0xC3AC, 0xCC59}, //11422 #HANGUL SYLLABLE CHIEUCH AE IEUNG + {0xC3AD, 0xCC60}, //11423 #HANGUL SYLLABLE CHIEUCH YA + {0xC3AE, 0xCC64}, //11424 #HANGUL SYLLABLE CHIEUCH YA NIEUN + {0xC3AF, 0xCC66}, //11425 #HANGUL SYLLABLE CHIEUCH YA NIEUNHIEUH + {0xC3B0, 0xCC68}, //11426 #HANGUL SYLLABLE CHIEUCH YA RIEUL + {0xC3B1, 0xCC70}, //11427 #HANGUL SYLLABLE CHIEUCH YA MIEUM + {0xC3B2, 0xCC75}, //11428 #HANGUL SYLLABLE CHIEUCH YA IEUNG + {0xC3B3, 0xCC98}, //11429 #HANGUL SYLLABLE CHIEUCH EO + {0xC3B4, 0xCC99}, //11430 #HANGUL SYLLABLE CHIEUCH EO KIYEOK + {0xC3B5, 0xCC9C}, //11431 #HANGUL SYLLABLE CHIEUCH EO NIEUN + {0xC3B6, 0xCCA0}, //11432 #HANGUL SYLLABLE CHIEUCH EO RIEUL + {0xC3B7, 0xCCA8}, //11433 #HANGUL SYLLABLE CHIEUCH EO MIEUM + {0xC3B8, 0xCCA9}, //11434 #HANGUL SYLLABLE CHIEUCH EO PIEUP + {0xC3B9, 0xCCAB}, //11435 #HANGUL SYLLABLE CHIEUCH EO SIOS + {0xC3BA, 0xCCAC}, //11436 #HANGUL SYLLABLE CHIEUCH EO SSANGSIOS + {0xC3BB, 0xCCAD}, //11437 #HANGUL SYLLABLE CHIEUCH EO IEUNG + {0xC3BC, 0xCCB4}, //11438 #HANGUL SYLLABLE CHIEUCH E + {0xC3BD, 0xCCB5}, //11439 #HANGUL SYLLABLE CHIEUCH E KIYEOK + {0xC3BE, 0xCCB8}, //11440 #HANGUL SYLLABLE CHIEUCH E NIEUN + {0xC3BF, 0xCCBC}, //11441 #HANGUL SYLLABLE CHIEUCH E RIEUL + {0xC3C0, 0xCCC4}, //11442 #HANGUL SYLLABLE CHIEUCH E MIEUM + {0xC3C1, 0xCCC5}, //11443 #HANGUL SYLLABLE CHIEUCH E PIEUP + {0xC3C2, 0xCCC7}, //11444 #HANGUL SYLLABLE CHIEUCH E SIOS + {0xC3C3, 0xCCC9}, //11445 #HANGUL SYLLABLE CHIEUCH E IEUNG + {0xC3C4, 0xCCD0}, //11446 #HANGUL SYLLABLE CHIEUCH YEO + {0xC3C5, 0xCCD4}, //11447 #HANGUL SYLLABLE CHIEUCH YEO NIEUN + {0xC3C6, 0xCCE4}, //11448 #HANGUL SYLLABLE CHIEUCH YEO SSANGSIOS + {0xC3C7, 0xCCEC}, //11449 #HANGUL SYLLABLE CHIEUCH YE + {0xC3C8, 0xCCF0}, //11450 #HANGUL SYLLABLE CHIEUCH YE NIEUN + {0xC3C9, 0xCD01}, //11451 #HANGUL SYLLABLE CHIEUCH YE IEUNG + {0xC3CA, 0xCD08}, //11452 #HANGUL SYLLABLE CHIEUCH O + {0xC3CB, 0xCD09}, //11453 #HANGUL SYLLABLE CHIEUCH O KIYEOK + {0xC3CC, 0xCD0C}, //11454 #HANGUL SYLLABLE CHIEUCH O NIEUN + {0xC3CD, 0xCD10}, //11455 #HANGUL SYLLABLE CHIEUCH O RIEUL + {0xC3CE, 0xCD18}, //11456 #HANGUL SYLLABLE CHIEUCH O MIEUM + {0xC3CF, 0xCD19}, //11457 #HANGUL SYLLABLE CHIEUCH O PIEUP + {0xC3D0, 0xCD1B}, //11458 #HANGUL SYLLABLE CHIEUCH O SIOS + {0xC3D1, 0xCD1D}, //11459 #HANGUL SYLLABLE CHIEUCH O IEUNG + {0xC3D2, 0xCD24}, //11460 #HANGUL SYLLABLE CHIEUCH WA + {0xC3D3, 0xCD28}, //11461 #HANGUL SYLLABLE CHIEUCH WA NIEUN + {0xC3D4, 0xCD2C}, //11462 #HANGUL SYLLABLE CHIEUCH WA RIEUL + {0xC3D5, 0xCD39}, //11463 #HANGUL SYLLABLE CHIEUCH WA IEUNG + {0xC3D6, 0xCD5C}, //11464 #HANGUL SYLLABLE CHIEUCH OE + {0xC3D7, 0xCD60}, //11465 #HANGUL SYLLABLE CHIEUCH OE NIEUN + {0xC3D8, 0xCD64}, //11466 #HANGUL SYLLABLE CHIEUCH OE RIEUL + {0xC3D9, 0xCD6C}, //11467 #HANGUL SYLLABLE CHIEUCH OE MIEUM + {0xC3DA, 0xCD6D}, //11468 #HANGUL SYLLABLE CHIEUCH OE PIEUP + {0xC3DB, 0xCD6F}, //11469 #HANGUL SYLLABLE CHIEUCH OE SIOS + {0xC3DC, 0xCD71}, //11470 #HANGUL SYLLABLE CHIEUCH OE IEUNG + {0xC3DD, 0xCD78}, //11471 #HANGUL SYLLABLE CHIEUCH YO + {0xC3DE, 0xCD88}, //11472 #HANGUL SYLLABLE CHIEUCH YO MIEUM + {0xC3DF, 0xCD94}, //11473 #HANGUL SYLLABLE CHIEUCH U + {0xC3E0, 0xCD95}, //11474 #HANGUL SYLLABLE CHIEUCH U KIYEOK + {0xC3E1, 0xCD98}, //11475 #HANGUL SYLLABLE CHIEUCH U NIEUN + {0xC3E2, 0xCD9C}, //11476 #HANGUL SYLLABLE CHIEUCH U RIEUL + {0xC3E3, 0xCDA4}, //11477 #HANGUL SYLLABLE CHIEUCH U MIEUM + {0xC3E4, 0xCDA5}, //11478 #HANGUL SYLLABLE CHIEUCH U PIEUP + {0xC3E5, 0xCDA7}, //11479 #HANGUL SYLLABLE CHIEUCH U SIOS + {0xC3E6, 0xCDA9}, //11480 #HANGUL SYLLABLE CHIEUCH U IEUNG + {0xC3E7, 0xCDB0}, //11481 #HANGUL SYLLABLE CHIEUCH WEO + {0xC3E8, 0xCDC4}, //11482 #HANGUL SYLLABLE CHIEUCH WEO SSANGSIOS + {0xC3E9, 0xCDCC}, //11483 #HANGUL SYLLABLE CHIEUCH WE + {0xC3EA, 0xCDD0}, //11484 #HANGUL SYLLABLE CHIEUCH WE NIEUN + {0xC3EB, 0xCDE8}, //11485 #HANGUL SYLLABLE CHIEUCH WI + {0xC3EC, 0xCDEC}, //11486 #HANGUL SYLLABLE CHIEUCH WI NIEUN + {0xC3ED, 0xCDF0}, //11487 #HANGUL SYLLABLE CHIEUCH WI RIEUL + {0xC3EE, 0xCDF8}, //11488 #HANGUL SYLLABLE CHIEUCH WI MIEUM + {0xC3EF, 0xCDF9}, //11489 #HANGUL SYLLABLE CHIEUCH WI PIEUP + {0xC3F0, 0xCDFB}, //11490 #HANGUL SYLLABLE CHIEUCH WI SIOS + {0xC3F1, 0xCDFD}, //11491 #HANGUL SYLLABLE CHIEUCH WI IEUNG + {0xC3F2, 0xCE04}, //11492 #HANGUL SYLLABLE CHIEUCH YU + {0xC3F3, 0xCE08}, //11493 #HANGUL SYLLABLE CHIEUCH YU NIEUN + {0xC3F4, 0xCE0C}, //11494 #HANGUL SYLLABLE CHIEUCH YU RIEUL + {0xC3F5, 0xCE14}, //11495 #HANGUL SYLLABLE CHIEUCH YU MIEUM + {0xC3F6, 0xCE19}, //11496 #HANGUL SYLLABLE CHIEUCH YU IEUNG + {0xC3F7, 0xCE20}, //11497 #HANGUL SYLLABLE CHIEUCH EU + {0xC3F8, 0xCE21}, //11498 #HANGUL SYLLABLE CHIEUCH EU KIYEOK + {0xC3F9, 0xCE24}, //11499 #HANGUL SYLLABLE CHIEUCH EU NIEUN + {0xC3FA, 0xCE28}, //11500 #HANGUL SYLLABLE CHIEUCH EU RIEUL + {0xC3FB, 0xCE30}, //11501 #HANGUL SYLLABLE CHIEUCH EU MIEUM + {0xC3FC, 0xCE31}, //11502 #HANGUL SYLLABLE CHIEUCH EU PIEUP + {0xC3FD, 0xCE33}, //11503 #HANGUL SYLLABLE CHIEUCH EU SIOS + {0xC3FE, 0xCE35}, //11504 #HANGUL SYLLABLE CHIEUCH EU IEUNG + {0xC441, 0xD6AB}, //11505 #HANGUL SYLLABLE HIEUH YO KIYEOKSIOS + {0xC442, 0xD6AD}, //11506 #HANGUL SYLLABLE HIEUH YO NIEUNCIEUC + {0xC443, 0xD6AE}, //11507 #HANGUL SYLLABLE HIEUH YO NIEUNHIEUH + {0xC444, 0xD6AF}, //11508 #HANGUL SYLLABLE HIEUH YO TIKEUT + {0xC445, 0xD6B1}, //11509 #HANGUL SYLLABLE HIEUH YO RIEULKIYEOK + {0xC446, 0xD6B2}, //11510 #HANGUL SYLLABLE HIEUH YO RIEULMIEUM + {0xC447, 0xD6B3}, //11511 #HANGUL SYLLABLE HIEUH YO RIEULPIEUP + {0xC448, 0xD6B4}, //11512 #HANGUL SYLLABLE HIEUH YO RIEULSIOS + {0xC449, 0xD6B5}, //11513 #HANGUL SYLLABLE HIEUH YO RIEULTHIEUTH + {0xC44A, 0xD6B6}, //11514 #HANGUL SYLLABLE HIEUH YO RIEULPHIEUPH + {0xC44B, 0xD6B7}, //11515 #HANGUL SYLLABLE HIEUH YO RIEULHIEUH + {0xC44C, 0xD6B8}, //11516 #HANGUL SYLLABLE HIEUH YO MIEUM + {0xC44D, 0xD6BA}, //11517 #HANGUL SYLLABLE HIEUH YO PIEUPSIOS + {0xC44E, 0xD6BC}, //11518 #HANGUL SYLLABLE HIEUH YO SSANGSIOS + {0xC44F, 0xD6BD}, //11519 #HANGUL SYLLABLE HIEUH YO IEUNG + {0xC450, 0xD6BE}, //11520 #HANGUL SYLLABLE HIEUH YO CIEUC + {0xC451, 0xD6BF}, //11521 #HANGUL SYLLABLE HIEUH YO CHIEUCH + {0xC452, 0xD6C0}, //11522 #HANGUL SYLLABLE HIEUH YO KHIEUKH + {0xC453, 0xD6C1}, //11523 #HANGUL SYLLABLE HIEUH YO THIEUTH + {0xC454, 0xD6C2}, //11524 #HANGUL SYLLABLE HIEUH YO PHIEUPH + {0xC455, 0xD6C3}, //11525 #HANGUL SYLLABLE HIEUH YO HIEUH + {0xC456, 0xD6C6}, //11526 #HANGUL SYLLABLE HIEUH U SSANGKIYEOK + {0xC457, 0xD6C7}, //11527 #HANGUL SYLLABLE HIEUH U KIYEOKSIOS + {0xC458, 0xD6C9}, //11528 #HANGUL SYLLABLE HIEUH U NIEUNCIEUC + {0xC459, 0xD6CA}, //11529 #HANGUL SYLLABLE HIEUH U NIEUNHIEUH + {0xC45A, 0xD6CB}, //11530 #HANGUL SYLLABLE HIEUH U TIKEUT + {0xC461, 0xD6CD}, //11531 #HANGUL SYLLABLE HIEUH U RIEULKIYEOK + {0xC462, 0xD6CE}, //11532 #HANGUL SYLLABLE HIEUH U RIEULMIEUM + {0xC463, 0xD6CF}, //11533 #HANGUL SYLLABLE HIEUH U RIEULPIEUP + {0xC464, 0xD6D0}, //11534 #HANGUL SYLLABLE HIEUH U RIEULSIOS + {0xC465, 0xD6D2}, //11535 #HANGUL SYLLABLE HIEUH U RIEULPHIEUPH + {0xC466, 0xD6D3}, //11536 #HANGUL SYLLABLE HIEUH U RIEULHIEUH + {0xC467, 0xD6D5}, //11537 #HANGUL SYLLABLE HIEUH U PIEUP + {0xC468, 0xD6D6}, //11538 #HANGUL SYLLABLE HIEUH U PIEUPSIOS + {0xC469, 0xD6D8}, //11539 #HANGUL SYLLABLE HIEUH U SSANGSIOS + {0xC46A, 0xD6DA}, //11540 #HANGUL SYLLABLE HIEUH U CIEUC + {0xC46B, 0xD6DB}, //11541 #HANGUL SYLLABLE HIEUH U CHIEUCH + {0xC46C, 0xD6DC}, //11542 #HANGUL SYLLABLE HIEUH U KHIEUKH + {0xC46D, 0xD6DD}, //11543 #HANGUL SYLLABLE HIEUH U THIEUTH + {0xC46E, 0xD6DE}, //11544 #HANGUL SYLLABLE HIEUH U PHIEUPH + {0xC46F, 0xD6DF}, //11545 #HANGUL SYLLABLE HIEUH U HIEUH + {0xC470, 0xD6E1}, //11546 #HANGUL SYLLABLE HIEUH WEO KIYEOK + {0xC471, 0xD6E2}, //11547 #HANGUL SYLLABLE HIEUH WEO SSANGKIYEOK + {0xC472, 0xD6E3}, //11548 #HANGUL SYLLABLE HIEUH WEO KIYEOKSIOS + {0xC473, 0xD6E5}, //11549 #HANGUL SYLLABLE HIEUH WEO NIEUNCIEUC + {0xC474, 0xD6E6}, //11550 #HANGUL SYLLABLE HIEUH WEO NIEUNHIEUH + {0xC475, 0xD6E7}, //11551 #HANGUL SYLLABLE HIEUH WEO TIKEUT + {0xC476, 0xD6E9}, //11552 #HANGUL SYLLABLE HIEUH WEO RIEULKIYEOK + {0xC477, 0xD6EA}, //11553 #HANGUL SYLLABLE HIEUH WEO RIEULMIEUM + {0xC478, 0xD6EB}, //11554 #HANGUL SYLLABLE HIEUH WEO RIEULPIEUP + {0xC479, 0xD6EC}, //11555 #HANGUL SYLLABLE HIEUH WEO RIEULSIOS + {0xC47A, 0xD6ED}, //11556 #HANGUL SYLLABLE HIEUH WEO RIEULTHIEUTH + {0xC481, 0xD6EE}, //11557 #HANGUL SYLLABLE HIEUH WEO RIEULPHIEUPH + {0xC482, 0xD6EF}, //11558 #HANGUL SYLLABLE HIEUH WEO RIEULHIEUH + {0xC483, 0xD6F1}, //11559 #HANGUL SYLLABLE HIEUH WEO PIEUP + {0xC484, 0xD6F2}, //11560 #HANGUL SYLLABLE HIEUH WEO PIEUPSIOS + {0xC485, 0xD6F3}, //11561 #HANGUL SYLLABLE HIEUH WEO SIOS + {0xC486, 0xD6F4}, //11562 #HANGUL SYLLABLE HIEUH WEO SSANGSIOS + {0xC487, 0xD6F6}, //11563 #HANGUL SYLLABLE HIEUH WEO CIEUC + {0xC488, 0xD6F7}, //11564 #HANGUL SYLLABLE HIEUH WEO CHIEUCH + {0xC489, 0xD6F8}, //11565 #HANGUL SYLLABLE HIEUH WEO KHIEUKH + {0xC48A, 0xD6F9}, //11566 #HANGUL SYLLABLE HIEUH WEO THIEUTH + {0xC48B, 0xD6FA}, //11567 #HANGUL SYLLABLE HIEUH WEO PHIEUPH + {0xC48C, 0xD6FB}, //11568 #HANGUL SYLLABLE HIEUH WEO HIEUH + {0xC48D, 0xD6FE}, //11569 #HANGUL SYLLABLE HIEUH WE SSANGKIYEOK + {0xC48E, 0xD6FF}, //11570 #HANGUL SYLLABLE HIEUH WE KIYEOKSIOS + {0xC48F, 0xD701}, //11571 #HANGUL SYLLABLE HIEUH WE NIEUNCIEUC + {0xC490, 0xD702}, //11572 #HANGUL SYLLABLE HIEUH WE NIEUNHIEUH + {0xC491, 0xD703}, //11573 #HANGUL SYLLABLE HIEUH WE TIKEUT + {0xC492, 0xD705}, //11574 #HANGUL SYLLABLE HIEUH WE RIEULKIYEOK + {0xC493, 0xD706}, //11575 #HANGUL SYLLABLE HIEUH WE RIEULMIEUM + {0xC494, 0xD707}, //11576 #HANGUL SYLLABLE HIEUH WE RIEULPIEUP + {0xC495, 0xD708}, //11577 #HANGUL SYLLABLE HIEUH WE RIEULSIOS + {0xC496, 0xD709}, //11578 #HANGUL SYLLABLE HIEUH WE RIEULTHIEUTH + {0xC497, 0xD70A}, //11579 #HANGUL SYLLABLE HIEUH WE RIEULPHIEUPH + {0xC498, 0xD70B}, //11580 #HANGUL SYLLABLE HIEUH WE RIEULHIEUH + {0xC499, 0xD70C}, //11581 #HANGUL SYLLABLE HIEUH WE MIEUM + {0xC49A, 0xD70D}, //11582 #HANGUL SYLLABLE HIEUH WE PIEUP + {0xC49B, 0xD70E}, //11583 #HANGUL SYLLABLE HIEUH WE PIEUPSIOS + {0xC49C, 0xD70F}, //11584 #HANGUL SYLLABLE HIEUH WE SIOS + {0xC49D, 0xD710}, //11585 #HANGUL SYLLABLE HIEUH WE SSANGSIOS + {0xC49E, 0xD712}, //11586 #HANGUL SYLLABLE HIEUH WE CIEUC + {0xC49F, 0xD713}, //11587 #HANGUL SYLLABLE HIEUH WE CHIEUCH + {0xC4A0, 0xD714}, //11588 #HANGUL SYLLABLE HIEUH WE KHIEUKH + {0xC4A1, 0xCE58}, //11589 #HANGUL SYLLABLE CHIEUCH I + {0xC4A2, 0xCE59}, //11590 #HANGUL SYLLABLE CHIEUCH I KIYEOK + {0xC4A3, 0xCE5C}, //11591 #HANGUL SYLLABLE CHIEUCH I NIEUN + {0xC4A4, 0xCE5F}, //11592 #HANGUL SYLLABLE CHIEUCH I TIKEUT + {0xC4A5, 0xCE60}, //11593 #HANGUL SYLLABLE CHIEUCH I RIEUL + {0xC4A6, 0xCE61}, //11594 #HANGUL SYLLABLE CHIEUCH I RIEULKIYEOK + {0xC4A7, 0xCE68}, //11595 #HANGUL SYLLABLE CHIEUCH I MIEUM + {0xC4A8, 0xCE69}, //11596 #HANGUL SYLLABLE CHIEUCH I PIEUP + {0xC4A9, 0xCE6B}, //11597 #HANGUL SYLLABLE CHIEUCH I SIOS + {0xC4AA, 0xCE6D}, //11598 #HANGUL SYLLABLE CHIEUCH I IEUNG + {0xC4AB, 0xCE74}, //11599 #HANGUL SYLLABLE KHIEUKH A + {0xC4AC, 0xCE75}, //11600 #HANGUL SYLLABLE KHIEUKH A KIYEOK + {0xC4AD, 0xCE78}, //11601 #HANGUL SYLLABLE KHIEUKH A NIEUN + {0xC4AE, 0xCE7C}, //11602 #HANGUL SYLLABLE KHIEUKH A RIEUL + {0xC4AF, 0xCE84}, //11603 #HANGUL SYLLABLE KHIEUKH A MIEUM + {0xC4B0, 0xCE85}, //11604 #HANGUL SYLLABLE KHIEUKH A PIEUP + {0xC4B1, 0xCE87}, //11605 #HANGUL SYLLABLE KHIEUKH A SIOS + {0xC4B2, 0xCE89}, //11606 #HANGUL SYLLABLE KHIEUKH A IEUNG + {0xC4B3, 0xCE90}, //11607 #HANGUL SYLLABLE KHIEUKH AE + {0xC4B4, 0xCE91}, //11608 #HANGUL SYLLABLE KHIEUKH AE KIYEOK + {0xC4B5, 0xCE94}, //11609 #HANGUL SYLLABLE KHIEUKH AE NIEUN + {0xC4B6, 0xCE98}, //11610 #HANGUL SYLLABLE KHIEUKH AE RIEUL + {0xC4B7, 0xCEA0}, //11611 #HANGUL SYLLABLE KHIEUKH AE MIEUM + {0xC4B8, 0xCEA1}, //11612 #HANGUL SYLLABLE KHIEUKH AE PIEUP + {0xC4B9, 0xCEA3}, //11613 #HANGUL SYLLABLE KHIEUKH AE SIOS + {0xC4BA, 0xCEA4}, //11614 #HANGUL SYLLABLE KHIEUKH AE SSANGSIOS + {0xC4BB, 0xCEA5}, //11615 #HANGUL SYLLABLE KHIEUKH AE IEUNG + {0xC4BC, 0xCEAC}, //11616 #HANGUL SYLLABLE KHIEUKH YA + {0xC4BD, 0xCEAD}, //11617 #HANGUL SYLLABLE KHIEUKH YA KIYEOK + {0xC4BE, 0xCEC1}, //11618 #HANGUL SYLLABLE KHIEUKH YA IEUNG + {0xC4BF, 0xCEE4}, //11619 #HANGUL SYLLABLE KHIEUKH EO + {0xC4C0, 0xCEE5}, //11620 #HANGUL SYLLABLE KHIEUKH EO KIYEOK + {0xC4C1, 0xCEE8}, //11621 #HANGUL SYLLABLE KHIEUKH EO NIEUN + {0xC4C2, 0xCEEB}, //11622 #HANGUL SYLLABLE KHIEUKH EO TIKEUT + {0xC4C3, 0xCEEC}, //11623 #HANGUL SYLLABLE KHIEUKH EO RIEUL + {0xC4C4, 0xCEF4}, //11624 #HANGUL SYLLABLE KHIEUKH EO MIEUM + {0xC4C5, 0xCEF5}, //11625 #HANGUL SYLLABLE KHIEUKH EO PIEUP + {0xC4C6, 0xCEF7}, //11626 #HANGUL SYLLABLE KHIEUKH EO SIOS + {0xC4C7, 0xCEF8}, //11627 #HANGUL SYLLABLE KHIEUKH EO SSANGSIOS + {0xC4C8, 0xCEF9}, //11628 #HANGUL SYLLABLE KHIEUKH EO IEUNG + {0xC4C9, 0xCF00}, //11629 #HANGUL SYLLABLE KHIEUKH E + {0xC4CA, 0xCF01}, //11630 #HANGUL SYLLABLE KHIEUKH E KIYEOK + {0xC4CB, 0xCF04}, //11631 #HANGUL SYLLABLE KHIEUKH E NIEUN + {0xC4CC, 0xCF08}, //11632 #HANGUL SYLLABLE KHIEUKH E RIEUL + {0xC4CD, 0xCF10}, //11633 #HANGUL SYLLABLE KHIEUKH E MIEUM + {0xC4CE, 0xCF11}, //11634 #HANGUL SYLLABLE KHIEUKH E PIEUP + {0xC4CF, 0xCF13}, //11635 #HANGUL SYLLABLE KHIEUKH E SIOS + {0xC4D0, 0xCF15}, //11636 #HANGUL SYLLABLE KHIEUKH E IEUNG + {0xC4D1, 0xCF1C}, //11637 #HANGUL SYLLABLE KHIEUKH YEO + {0xC4D2, 0xCF20}, //11638 #HANGUL SYLLABLE KHIEUKH YEO NIEUN + {0xC4D3, 0xCF24}, //11639 #HANGUL SYLLABLE KHIEUKH YEO RIEUL + {0xC4D4, 0xCF2C}, //11640 #HANGUL SYLLABLE KHIEUKH YEO MIEUM + {0xC4D5, 0xCF2D}, //11641 #HANGUL SYLLABLE KHIEUKH YEO PIEUP + {0xC4D6, 0xCF2F}, //11642 #HANGUL SYLLABLE KHIEUKH YEO SIOS + {0xC4D7, 0xCF30}, //11643 #HANGUL SYLLABLE KHIEUKH YEO SSANGSIOS + {0xC4D8, 0xCF31}, //11644 #HANGUL SYLLABLE KHIEUKH YEO IEUNG + {0xC4D9, 0xCF38}, //11645 #HANGUL SYLLABLE KHIEUKH YE + {0xC4DA, 0xCF54}, //11646 #HANGUL SYLLABLE KHIEUKH O + {0xC4DB, 0xCF55}, //11647 #HANGUL SYLLABLE KHIEUKH O KIYEOK + {0xC4DC, 0xCF58}, //11648 #HANGUL SYLLABLE KHIEUKH O NIEUN + {0xC4DD, 0xCF5C}, //11649 #HANGUL SYLLABLE KHIEUKH O RIEUL + {0xC4DE, 0xCF64}, //11650 #HANGUL SYLLABLE KHIEUKH O MIEUM + {0xC4DF, 0xCF65}, //11651 #HANGUL SYLLABLE KHIEUKH O PIEUP + {0xC4E0, 0xCF67}, //11652 #HANGUL SYLLABLE KHIEUKH O SIOS + {0xC4E1, 0xCF69}, //11653 #HANGUL SYLLABLE KHIEUKH O IEUNG + {0xC4E2, 0xCF70}, //11654 #HANGUL SYLLABLE KHIEUKH WA + {0xC4E3, 0xCF71}, //11655 #HANGUL SYLLABLE KHIEUKH WA KIYEOK + {0xC4E4, 0xCF74}, //11656 #HANGUL SYLLABLE KHIEUKH WA NIEUN + {0xC4E5, 0xCF78}, //11657 #HANGUL SYLLABLE KHIEUKH WA RIEUL + {0xC4E6, 0xCF80}, //11658 #HANGUL SYLLABLE KHIEUKH WA MIEUM + {0xC4E7, 0xCF85}, //11659 #HANGUL SYLLABLE KHIEUKH WA IEUNG + {0xC4E8, 0xCF8C}, //11660 #HANGUL SYLLABLE KHIEUKH WAE + {0xC4E9, 0xCFA1}, //11661 #HANGUL SYLLABLE KHIEUKH WAE IEUNG + {0xC4EA, 0xCFA8}, //11662 #HANGUL SYLLABLE KHIEUKH OE + {0xC4EB, 0xCFB0}, //11663 #HANGUL SYLLABLE KHIEUKH OE RIEUL + {0xC4EC, 0xCFC4}, //11664 #HANGUL SYLLABLE KHIEUKH YO + {0xC4ED, 0xCFE0}, //11665 #HANGUL SYLLABLE KHIEUKH U + {0xC4EE, 0xCFE1}, //11666 #HANGUL SYLLABLE KHIEUKH U KIYEOK + {0xC4EF, 0xCFE4}, //11667 #HANGUL SYLLABLE KHIEUKH U NIEUN + {0xC4F0, 0xCFE8}, //11668 #HANGUL SYLLABLE KHIEUKH U RIEUL + {0xC4F1, 0xCFF0}, //11669 #HANGUL SYLLABLE KHIEUKH U MIEUM + {0xC4F2, 0xCFF1}, //11670 #HANGUL SYLLABLE KHIEUKH U PIEUP + {0xC4F3, 0xCFF3}, //11671 #HANGUL SYLLABLE KHIEUKH U SIOS + {0xC4F4, 0xCFF5}, //11672 #HANGUL SYLLABLE KHIEUKH U IEUNG + {0xC4F5, 0xCFFC}, //11673 #HANGUL SYLLABLE KHIEUKH WEO + {0xC4F6, 0xD000}, //11674 #HANGUL SYLLABLE KHIEUKH WEO NIEUN + {0xC4F7, 0xD004}, //11675 #HANGUL SYLLABLE KHIEUKH WEO RIEUL + {0xC4F8, 0xD011}, //11676 #HANGUL SYLLABLE KHIEUKH WEO IEUNG + {0xC4F9, 0xD018}, //11677 #HANGUL SYLLABLE KHIEUKH WE + {0xC4FA, 0xD02D}, //11678 #HANGUL SYLLABLE KHIEUKH WE IEUNG + {0xC4FB, 0xD034}, //11679 #HANGUL SYLLABLE KHIEUKH WI + {0xC4FC, 0xD035}, //11680 #HANGUL SYLLABLE KHIEUKH WI KIYEOK + {0xC4FD, 0xD038}, //11681 #HANGUL SYLLABLE KHIEUKH WI NIEUN + {0xC4FE, 0xD03C}, //11682 #HANGUL SYLLABLE KHIEUKH WI RIEUL + {0xC541, 0xD715}, //11683 #HANGUL SYLLABLE HIEUH WE THIEUTH + {0xC542, 0xD716}, //11684 #HANGUL SYLLABLE HIEUH WE PHIEUPH + {0xC543, 0xD717}, //11685 #HANGUL SYLLABLE HIEUH WE HIEUH + {0xC544, 0xD71A}, //11686 #HANGUL SYLLABLE HIEUH WI SSANGKIYEOK + {0xC545, 0xD71B}, //11687 #HANGUL SYLLABLE HIEUH WI KIYEOKSIOS + {0xC546, 0xD71D}, //11688 #HANGUL SYLLABLE HIEUH WI NIEUNCIEUC + {0xC547, 0xD71E}, //11689 #HANGUL SYLLABLE HIEUH WI NIEUNHIEUH + {0xC548, 0xD71F}, //11690 #HANGUL SYLLABLE HIEUH WI TIKEUT + {0xC549, 0xD721}, //11691 #HANGUL SYLLABLE HIEUH WI RIEULKIYEOK + {0xC54A, 0xD722}, //11692 #HANGUL SYLLABLE HIEUH WI RIEULMIEUM + {0xC54B, 0xD723}, //11693 #HANGUL SYLLABLE HIEUH WI RIEULPIEUP + {0xC54C, 0xD724}, //11694 #HANGUL SYLLABLE HIEUH WI RIEULSIOS + {0xC54D, 0xD725}, //11695 #HANGUL SYLLABLE HIEUH WI RIEULTHIEUTH + {0xC54E, 0xD726}, //11696 #HANGUL SYLLABLE HIEUH WI RIEULPHIEUPH + {0xC54F, 0xD727}, //11697 #HANGUL SYLLABLE HIEUH WI RIEULHIEUH + {0xC550, 0xD72A}, //11698 #HANGUL SYLLABLE HIEUH WI PIEUPSIOS + {0xC551, 0xD72C}, //11699 #HANGUL SYLLABLE HIEUH WI SSANGSIOS + {0xC552, 0xD72E}, //11700 #HANGUL SYLLABLE HIEUH WI CIEUC + {0xC553, 0xD72F}, //11701 #HANGUL SYLLABLE HIEUH WI CHIEUCH + {0xC554, 0xD730}, //11702 #HANGUL SYLLABLE HIEUH WI KHIEUKH + {0xC555, 0xD731}, //11703 #HANGUL SYLLABLE HIEUH WI THIEUTH + {0xC556, 0xD732}, //11704 #HANGUL SYLLABLE HIEUH WI PHIEUPH + {0xC557, 0xD733}, //11705 #HANGUL SYLLABLE HIEUH WI HIEUH + {0xC558, 0xD736}, //11706 #HANGUL SYLLABLE HIEUH YU SSANGKIYEOK + {0xC559, 0xD737}, //11707 #HANGUL SYLLABLE HIEUH YU KIYEOKSIOS + {0xC55A, 0xD739}, //11708 #HANGUL SYLLABLE HIEUH YU NIEUNCIEUC + {0xC561, 0xD73A}, //11709 #HANGUL SYLLABLE HIEUH YU NIEUNHIEUH + {0xC562, 0xD73B}, //11710 #HANGUL SYLLABLE HIEUH YU TIKEUT + {0xC563, 0xD73D}, //11711 #HANGUL SYLLABLE HIEUH YU RIEULKIYEOK + {0xC564, 0xD73E}, //11712 #HANGUL SYLLABLE HIEUH YU RIEULMIEUM + {0xC565, 0xD73F}, //11713 #HANGUL SYLLABLE HIEUH YU RIEULPIEUP + {0xC566, 0xD740}, //11714 #HANGUL SYLLABLE HIEUH YU RIEULSIOS + {0xC567, 0xD741}, //11715 #HANGUL SYLLABLE HIEUH YU RIEULTHIEUTH + {0xC568, 0xD742}, //11716 #HANGUL SYLLABLE HIEUH YU RIEULPHIEUPH + {0xC569, 0xD743}, //11717 #HANGUL SYLLABLE HIEUH YU RIEULHIEUH + {0xC56A, 0xD745}, //11718 #HANGUL SYLLABLE HIEUH YU PIEUP + {0xC56B, 0xD746}, //11719 #HANGUL SYLLABLE HIEUH YU PIEUPSIOS + {0xC56C, 0xD748}, //11720 #HANGUL SYLLABLE HIEUH YU SSANGSIOS + {0xC56D, 0xD74A}, //11721 #HANGUL SYLLABLE HIEUH YU CIEUC + {0xC56E, 0xD74B}, //11722 #HANGUL SYLLABLE HIEUH YU CHIEUCH + {0xC56F, 0xD74C}, //11723 #HANGUL SYLLABLE HIEUH YU KHIEUKH + {0xC570, 0xD74D}, //11724 #HANGUL SYLLABLE HIEUH YU THIEUTH + {0xC571, 0xD74E}, //11725 #HANGUL SYLLABLE HIEUH YU PHIEUPH + {0xC572, 0xD74F}, //11726 #HANGUL SYLLABLE HIEUH YU HIEUH + {0xC573, 0xD752}, //11727 #HANGUL SYLLABLE HIEUH EU SSANGKIYEOK + {0xC574, 0xD753}, //11728 #HANGUL SYLLABLE HIEUH EU KIYEOKSIOS + {0xC575, 0xD755}, //11729 #HANGUL SYLLABLE HIEUH EU NIEUNCIEUC + {0xC576, 0xD75A}, //11730 #HANGUL SYLLABLE HIEUH EU RIEULMIEUM + {0xC577, 0xD75B}, //11731 #HANGUL SYLLABLE HIEUH EU RIEULPIEUP + {0xC578, 0xD75C}, //11732 #HANGUL SYLLABLE HIEUH EU RIEULSIOS + {0xC579, 0xD75D}, //11733 #HANGUL SYLLABLE HIEUH EU RIEULTHIEUTH + {0xC57A, 0xD75E}, //11734 #HANGUL SYLLABLE HIEUH EU RIEULPHIEUPH + {0xC581, 0xD75F}, //11735 #HANGUL SYLLABLE HIEUH EU RIEULHIEUH + {0xC582, 0xD762}, //11736 #HANGUL SYLLABLE HIEUH EU PIEUPSIOS + {0xC583, 0xD764}, //11737 #HANGUL SYLLABLE HIEUH EU SSANGSIOS + {0xC584, 0xD766}, //11738 #HANGUL SYLLABLE HIEUH EU CIEUC + {0xC585, 0xD767}, //11739 #HANGUL SYLLABLE HIEUH EU CHIEUCH + {0xC586, 0xD768}, //11740 #HANGUL SYLLABLE HIEUH EU KHIEUKH + {0xC587, 0xD76A}, //11741 #HANGUL SYLLABLE HIEUH EU PHIEUPH + {0xC588, 0xD76B}, //11742 #HANGUL SYLLABLE HIEUH EU HIEUH + {0xC589, 0xD76D}, //11743 #HANGUL SYLLABLE HIEUH YI KIYEOK + {0xC58A, 0xD76E}, //11744 #HANGUL SYLLABLE HIEUH YI SSANGKIYEOK + {0xC58B, 0xD76F}, //11745 #HANGUL SYLLABLE HIEUH YI KIYEOKSIOS + {0xC58C, 0xD771}, //11746 #HANGUL SYLLABLE HIEUH YI NIEUNCIEUC + {0xC58D, 0xD772}, //11747 #HANGUL SYLLABLE HIEUH YI NIEUNHIEUH + {0xC58E, 0xD773}, //11748 #HANGUL SYLLABLE HIEUH YI TIKEUT + {0xC58F, 0xD775}, //11749 #HANGUL SYLLABLE HIEUH YI RIEULKIYEOK + {0xC590, 0xD776}, //11750 #HANGUL SYLLABLE HIEUH YI RIEULMIEUM + {0xC591, 0xD777}, //11751 #HANGUL SYLLABLE HIEUH YI RIEULPIEUP + {0xC592, 0xD778}, //11752 #HANGUL SYLLABLE HIEUH YI RIEULSIOS + {0xC593, 0xD779}, //11753 #HANGUL SYLLABLE HIEUH YI RIEULTHIEUTH + {0xC594, 0xD77A}, //11754 #HANGUL SYLLABLE HIEUH YI RIEULPHIEUPH + {0xC595, 0xD77B}, //11755 #HANGUL SYLLABLE HIEUH YI RIEULHIEUH + {0xC596, 0xD77E}, //11756 #HANGUL SYLLABLE HIEUH YI PIEUPSIOS + {0xC597, 0xD77F}, //11757 #HANGUL SYLLABLE HIEUH YI SIOS + {0xC598, 0xD780}, //11758 #HANGUL SYLLABLE HIEUH YI SSANGSIOS + {0xC599, 0xD782}, //11759 #HANGUL SYLLABLE HIEUH YI CIEUC + {0xC59A, 0xD783}, //11760 #HANGUL SYLLABLE HIEUH YI CHIEUCH + {0xC59B, 0xD784}, //11761 #HANGUL SYLLABLE HIEUH YI KHIEUKH + {0xC59C, 0xD785}, //11762 #HANGUL SYLLABLE HIEUH YI THIEUTH + {0xC59D, 0xD786}, //11763 #HANGUL SYLLABLE HIEUH YI PHIEUPH + {0xC59E, 0xD787}, //11764 #HANGUL SYLLABLE HIEUH YI HIEUH + {0xC59F, 0xD78A}, //11765 #HANGUL SYLLABLE HIEUH I SSANGKIYEOK + {0xC5A0, 0xD78B}, //11766 #HANGUL SYLLABLE HIEUH I KIYEOKSIOS + {0xC5A1, 0xD044}, //11767 #HANGUL SYLLABLE KHIEUKH WI MIEUM + {0xC5A2, 0xD045}, //11768 #HANGUL SYLLABLE KHIEUKH WI PIEUP + {0xC5A3, 0xD047}, //11769 #HANGUL SYLLABLE KHIEUKH WI SIOS + {0xC5A4, 0xD049}, //11770 #HANGUL SYLLABLE KHIEUKH WI IEUNG + {0xC5A5, 0xD050}, //11771 #HANGUL SYLLABLE KHIEUKH YU + {0xC5A6, 0xD054}, //11772 #HANGUL SYLLABLE KHIEUKH YU NIEUN + {0xC5A7, 0xD058}, //11773 #HANGUL SYLLABLE KHIEUKH YU RIEUL + {0xC5A8, 0xD060}, //11774 #HANGUL SYLLABLE KHIEUKH YU MIEUM + {0xC5A9, 0xD06C}, //11775 #HANGUL SYLLABLE KHIEUKH EU + {0xC5AA, 0xD06D}, //11776 #HANGUL SYLLABLE KHIEUKH EU KIYEOK + {0xC5AB, 0xD070}, //11777 #HANGUL SYLLABLE KHIEUKH EU NIEUN + {0xC5AC, 0xD074}, //11778 #HANGUL SYLLABLE KHIEUKH EU RIEUL + {0xC5AD, 0xD07C}, //11779 #HANGUL SYLLABLE KHIEUKH EU MIEUM + {0xC5AE, 0xD07D}, //11780 #HANGUL SYLLABLE KHIEUKH EU PIEUP + {0xC5AF, 0xD081}, //11781 #HANGUL SYLLABLE KHIEUKH EU IEUNG + {0xC5B0, 0xD0A4}, //11782 #HANGUL SYLLABLE KHIEUKH I + {0xC5B1, 0xD0A5}, //11783 #HANGUL SYLLABLE KHIEUKH I KIYEOK + {0xC5B2, 0xD0A8}, //11784 #HANGUL SYLLABLE KHIEUKH I NIEUN + {0xC5B3, 0xD0AC}, //11785 #HANGUL SYLLABLE KHIEUKH I RIEUL + {0xC5B4, 0xD0B4}, //11786 #HANGUL SYLLABLE KHIEUKH I MIEUM + {0xC5B5, 0xD0B5}, //11787 #HANGUL SYLLABLE KHIEUKH I PIEUP + {0xC5B6, 0xD0B7}, //11788 #HANGUL SYLLABLE KHIEUKH I SIOS + {0xC5B7, 0xD0B9}, //11789 #HANGUL SYLLABLE KHIEUKH I IEUNG + {0xC5B8, 0xD0C0}, //11790 #HANGUL SYLLABLE THIEUTH A + {0xC5B9, 0xD0C1}, //11791 #HANGUL SYLLABLE THIEUTH A KIYEOK + {0xC5BA, 0xD0C4}, //11792 #HANGUL SYLLABLE THIEUTH A NIEUN + {0xC5BB, 0xD0C8}, //11793 #HANGUL SYLLABLE THIEUTH A RIEUL + {0xC5BC, 0xD0C9}, //11794 #HANGUL SYLLABLE THIEUTH A RIEULKIYEOK + {0xC5BD, 0xD0D0}, //11795 #HANGUL SYLLABLE THIEUTH A MIEUM + {0xC5BE, 0xD0D1}, //11796 #HANGUL SYLLABLE THIEUTH A PIEUP + {0xC5BF, 0xD0D3}, //11797 #HANGUL SYLLABLE THIEUTH A SIOS + {0xC5C0, 0xD0D4}, //11798 #HANGUL SYLLABLE THIEUTH A SSANGSIOS + {0xC5C1, 0xD0D5}, //11799 #HANGUL SYLLABLE THIEUTH A IEUNG + {0xC5C2, 0xD0DC}, //11800 #HANGUL SYLLABLE THIEUTH AE + {0xC5C3, 0xD0DD}, //11801 #HANGUL SYLLABLE THIEUTH AE KIYEOK + {0xC5C4, 0xD0E0}, //11802 #HANGUL SYLLABLE THIEUTH AE NIEUN + {0xC5C5, 0xD0E4}, //11803 #HANGUL SYLLABLE THIEUTH AE RIEUL + {0xC5C6, 0xD0EC}, //11804 #HANGUL SYLLABLE THIEUTH AE MIEUM + {0xC5C7, 0xD0ED}, //11805 #HANGUL SYLLABLE THIEUTH AE PIEUP + {0xC5C8, 0xD0EF}, //11806 #HANGUL SYLLABLE THIEUTH AE SIOS + {0xC5C9, 0xD0F0}, //11807 #HANGUL SYLLABLE THIEUTH AE SSANGSIOS + {0xC5CA, 0xD0F1}, //11808 #HANGUL SYLLABLE THIEUTH AE IEUNG + {0xC5CB, 0xD0F8}, //11809 #HANGUL SYLLABLE THIEUTH YA + {0xC5CC, 0xD10D}, //11810 #HANGUL SYLLABLE THIEUTH YA IEUNG + {0xC5CD, 0xD130}, //11811 #HANGUL SYLLABLE THIEUTH EO + {0xC5CE, 0xD131}, //11812 #HANGUL SYLLABLE THIEUTH EO KIYEOK + {0xC5CF, 0xD134}, //11813 #HANGUL SYLLABLE THIEUTH EO NIEUN + {0xC5D0, 0xD138}, //11814 #HANGUL SYLLABLE THIEUTH EO RIEUL + {0xC5D1, 0xD13A}, //11815 #HANGUL SYLLABLE THIEUTH EO RIEULMIEUM + {0xC5D2, 0xD140}, //11816 #HANGUL SYLLABLE THIEUTH EO MIEUM + {0xC5D3, 0xD141}, //11817 #HANGUL SYLLABLE THIEUTH EO PIEUP + {0xC5D4, 0xD143}, //11818 #HANGUL SYLLABLE THIEUTH EO SIOS + {0xC5D5, 0xD144}, //11819 #HANGUL SYLLABLE THIEUTH EO SSANGSIOS + {0xC5D6, 0xD145}, //11820 #HANGUL SYLLABLE THIEUTH EO IEUNG + {0xC5D7, 0xD14C}, //11821 #HANGUL SYLLABLE THIEUTH E + {0xC5D8, 0xD14D}, //11822 #HANGUL SYLLABLE THIEUTH E KIYEOK + {0xC5D9, 0xD150}, //11823 #HANGUL SYLLABLE THIEUTH E NIEUN + {0xC5DA, 0xD154}, //11824 #HANGUL SYLLABLE THIEUTH E RIEUL + {0xC5DB, 0xD15C}, //11825 #HANGUL SYLLABLE THIEUTH E MIEUM + {0xC5DC, 0xD15D}, //11826 #HANGUL SYLLABLE THIEUTH E PIEUP + {0xC5DD, 0xD15F}, //11827 #HANGUL SYLLABLE THIEUTH E SIOS + {0xC5DE, 0xD161}, //11828 #HANGUL SYLLABLE THIEUTH E IEUNG + {0xC5DF, 0xD168}, //11829 #HANGUL SYLLABLE THIEUTH YEO + {0xC5E0, 0xD16C}, //11830 #HANGUL SYLLABLE THIEUTH YEO NIEUN + {0xC5E1, 0xD17C}, //11831 #HANGUL SYLLABLE THIEUTH YEO SSANGSIOS + {0xC5E2, 0xD184}, //11832 #HANGUL SYLLABLE THIEUTH YE + {0xC5E3, 0xD188}, //11833 #HANGUL SYLLABLE THIEUTH YE NIEUN + {0xC5E4, 0xD1A0}, //11834 #HANGUL SYLLABLE THIEUTH O + {0xC5E5, 0xD1A1}, //11835 #HANGUL SYLLABLE THIEUTH O KIYEOK + {0xC5E6, 0xD1A4}, //11836 #HANGUL SYLLABLE THIEUTH O NIEUN + {0xC5E7, 0xD1A8}, //11837 #HANGUL SYLLABLE THIEUTH O RIEUL + {0xC5E8, 0xD1B0}, //11838 #HANGUL SYLLABLE THIEUTH O MIEUM + {0xC5E9, 0xD1B1}, //11839 #HANGUL SYLLABLE THIEUTH O PIEUP + {0xC5EA, 0xD1B3}, //11840 #HANGUL SYLLABLE THIEUTH O SIOS + {0xC5EB, 0xD1B5}, //11841 #HANGUL SYLLABLE THIEUTH O IEUNG + {0xC5EC, 0xD1BA}, //11842 #HANGUL SYLLABLE THIEUTH O PHIEUPH + {0xC5ED, 0xD1BC}, //11843 #HANGUL SYLLABLE THIEUTH WA + {0xC5EE, 0xD1C0}, //11844 #HANGUL SYLLABLE THIEUTH WA NIEUN + {0xC5EF, 0xD1D8}, //11845 #HANGUL SYLLABLE THIEUTH WAE + {0xC5F0, 0xD1F4}, //11846 #HANGUL SYLLABLE THIEUTH OE + {0xC5F1, 0xD1F8}, //11847 #HANGUL SYLLABLE THIEUTH OE NIEUN + {0xC5F2, 0xD207}, //11848 #HANGUL SYLLABLE THIEUTH OE SIOS + {0xC5F3, 0xD209}, //11849 #HANGUL SYLLABLE THIEUTH OE IEUNG + {0xC5F4, 0xD210}, //11850 #HANGUL SYLLABLE THIEUTH YO + {0xC5F5, 0xD22C}, //11851 #HANGUL SYLLABLE THIEUTH U + {0xC5F6, 0xD22D}, //11852 #HANGUL SYLLABLE THIEUTH U KIYEOK + {0xC5F7, 0xD230}, //11853 #HANGUL SYLLABLE THIEUTH U NIEUN + {0xC5F8, 0xD234}, //11854 #HANGUL SYLLABLE THIEUTH U RIEUL + {0xC5F9, 0xD23C}, //11855 #HANGUL SYLLABLE THIEUTH U MIEUM + {0xC5FA, 0xD23D}, //11856 #HANGUL SYLLABLE THIEUTH U PIEUP + {0xC5FB, 0xD23F}, //11857 #HANGUL SYLLABLE THIEUTH U SIOS + {0xC5FC, 0xD241}, //11858 #HANGUL SYLLABLE THIEUTH U IEUNG + {0xC5FD, 0xD248}, //11859 #HANGUL SYLLABLE THIEUTH WEO + {0xC5FE, 0xD25C}, //11860 #HANGUL SYLLABLE THIEUTH WEO SSANGSIOS + {0xC641, 0xD78D}, //11861 #HANGUL SYLLABLE HIEUH I NIEUNCIEUC + {0xC642, 0xD78E}, //11862 #HANGUL SYLLABLE HIEUH I NIEUNHIEUH + {0xC643, 0xD78F}, //11863 #HANGUL SYLLABLE HIEUH I TIKEUT + {0xC644, 0xD791}, //11864 #HANGUL SYLLABLE HIEUH I RIEULKIYEOK + {0xC645, 0xD792}, //11865 #HANGUL SYLLABLE HIEUH I RIEULMIEUM + {0xC646, 0xD793}, //11866 #HANGUL SYLLABLE HIEUH I RIEULPIEUP + {0xC647, 0xD794}, //11867 #HANGUL SYLLABLE HIEUH I RIEULSIOS + {0xC648, 0xD795}, //11868 #HANGUL SYLLABLE HIEUH I RIEULTHIEUTH + {0xC649, 0xD796}, //11869 #HANGUL SYLLABLE HIEUH I RIEULPHIEUPH + {0xC64A, 0xD797}, //11870 #HANGUL SYLLABLE HIEUH I RIEULHIEUH + {0xC64B, 0xD79A}, //11871 #HANGUL SYLLABLE HIEUH I PIEUPSIOS + {0xC64C, 0xD79C}, //11872 #HANGUL SYLLABLE HIEUH I SSANGSIOS + {0xC64D, 0xD79E}, //11873 #HANGUL SYLLABLE HIEUH I CIEUC + {0xC64E, 0xD79F}, //11874 #HANGUL SYLLABLE HIEUH I CHIEUCH + {0xC64F, 0xD7A0}, //11875 #HANGUL SYLLABLE HIEUH I KHIEUKH + {0xC650, 0xD7A1}, //11876 #HANGUL SYLLABLE HIEUH I THIEUTH + {0xC651, 0xD7A2}, //11877 #HANGUL SYLLABLE HIEUH I PHIEUPH + {0xC652, 0xD7A3}, //11878 #HANGUL SYLLABLE HIEUH I HIEUH + {0xC6A1, 0xD264}, //11879 #HANGUL SYLLABLE THIEUTH WE + {0xC6A2, 0xD280}, //11880 #HANGUL SYLLABLE THIEUTH WI + {0xC6A3, 0xD281}, //11881 #HANGUL SYLLABLE THIEUTH WI KIYEOK + {0xC6A4, 0xD284}, //11882 #HANGUL SYLLABLE THIEUTH WI NIEUN + {0xC6A5, 0xD288}, //11883 #HANGUL SYLLABLE THIEUTH WI RIEUL + {0xC6A6, 0xD290}, //11884 #HANGUL SYLLABLE THIEUTH WI MIEUM + {0xC6A7, 0xD291}, //11885 #HANGUL SYLLABLE THIEUTH WI PIEUP + {0xC6A8, 0xD295}, //11886 #HANGUL SYLLABLE THIEUTH WI IEUNG + {0xC6A9, 0xD29C}, //11887 #HANGUL SYLLABLE THIEUTH YU + {0xC6AA, 0xD2A0}, //11888 #HANGUL SYLLABLE THIEUTH YU NIEUN + {0xC6AB, 0xD2A4}, //11889 #HANGUL SYLLABLE THIEUTH YU RIEUL + {0xC6AC, 0xD2AC}, //11890 #HANGUL SYLLABLE THIEUTH YU MIEUM + {0xC6AD, 0xD2B1}, //11891 #HANGUL SYLLABLE THIEUTH YU IEUNG + {0xC6AE, 0xD2B8}, //11892 #HANGUL SYLLABLE THIEUTH EU + {0xC6AF, 0xD2B9}, //11893 #HANGUL SYLLABLE THIEUTH EU KIYEOK + {0xC6B0, 0xD2BC}, //11894 #HANGUL SYLLABLE THIEUTH EU NIEUN + {0xC6B1, 0xD2BF}, //11895 #HANGUL SYLLABLE THIEUTH EU TIKEUT + {0xC6B2, 0xD2C0}, //11896 #HANGUL SYLLABLE THIEUTH EU RIEUL + {0xC6B3, 0xD2C2}, //11897 #HANGUL SYLLABLE THIEUTH EU RIEULMIEUM + {0xC6B4, 0xD2C8}, //11898 #HANGUL SYLLABLE THIEUTH EU MIEUM + {0xC6B5, 0xD2C9}, //11899 #HANGUL SYLLABLE THIEUTH EU PIEUP + {0xC6B6, 0xD2CB}, //11900 #HANGUL SYLLABLE THIEUTH EU SIOS + {0xC6B7, 0xD2D4}, //11901 #HANGUL SYLLABLE THIEUTH YI + {0xC6B8, 0xD2D8}, //11902 #HANGUL SYLLABLE THIEUTH YI NIEUN + {0xC6B9, 0xD2DC}, //11903 #HANGUL SYLLABLE THIEUTH YI RIEUL + {0xC6BA, 0xD2E4}, //11904 #HANGUL SYLLABLE THIEUTH YI MIEUM + {0xC6BB, 0xD2E5}, //11905 #HANGUL SYLLABLE THIEUTH YI PIEUP + {0xC6BC, 0xD2F0}, //11906 #HANGUL SYLLABLE THIEUTH I + {0xC6BD, 0xD2F1}, //11907 #HANGUL SYLLABLE THIEUTH I KIYEOK + {0xC6BE, 0xD2F4}, //11908 #HANGUL SYLLABLE THIEUTH I NIEUN + {0xC6BF, 0xD2F8}, //11909 #HANGUL SYLLABLE THIEUTH I RIEUL + {0xC6C0, 0xD300}, //11910 #HANGUL SYLLABLE THIEUTH I MIEUM + {0xC6C1, 0xD301}, //11911 #HANGUL SYLLABLE THIEUTH I PIEUP + {0xC6C2, 0xD303}, //11912 #HANGUL SYLLABLE THIEUTH I SIOS + {0xC6C3, 0xD305}, //11913 #HANGUL SYLLABLE THIEUTH I IEUNG + {0xC6C4, 0xD30C}, //11914 #HANGUL SYLLABLE PHIEUPH A + {0xC6C5, 0xD30D}, //11915 #HANGUL SYLLABLE PHIEUPH A KIYEOK + {0xC6C6, 0xD30E}, //11916 #HANGUL SYLLABLE PHIEUPH A SSANGKIYEOK + {0xC6C7, 0xD310}, //11917 #HANGUL SYLLABLE PHIEUPH A NIEUN + {0xC6C8, 0xD314}, //11918 #HANGUL SYLLABLE PHIEUPH A RIEUL + {0xC6C9, 0xD316}, //11919 #HANGUL SYLLABLE PHIEUPH A RIEULMIEUM + {0xC6CA, 0xD31C}, //11920 #HANGUL SYLLABLE PHIEUPH A MIEUM + {0xC6CB, 0xD31D}, //11921 #HANGUL SYLLABLE PHIEUPH A PIEUP + {0xC6CC, 0xD31F}, //11922 #HANGUL SYLLABLE PHIEUPH A SIOS + {0xC6CD, 0xD320}, //11923 #HANGUL SYLLABLE PHIEUPH A SSANGSIOS + {0xC6CE, 0xD321}, //11924 #HANGUL SYLLABLE PHIEUPH A IEUNG + {0xC6CF, 0xD325}, //11925 #HANGUL SYLLABLE PHIEUPH A THIEUTH + {0xC6D0, 0xD328}, //11926 #HANGUL SYLLABLE PHIEUPH AE + {0xC6D1, 0xD329}, //11927 #HANGUL SYLLABLE PHIEUPH AE KIYEOK + {0xC6D2, 0xD32C}, //11928 #HANGUL SYLLABLE PHIEUPH AE NIEUN + {0xC6D3, 0xD330}, //11929 #HANGUL SYLLABLE PHIEUPH AE RIEUL + {0xC6D4, 0xD338}, //11930 #HANGUL SYLLABLE PHIEUPH AE MIEUM + {0xC6D5, 0xD339}, //11931 #HANGUL SYLLABLE PHIEUPH AE PIEUP + {0xC6D6, 0xD33B}, //11932 #HANGUL SYLLABLE PHIEUPH AE SIOS + {0xC6D7, 0xD33C}, //11933 #HANGUL SYLLABLE PHIEUPH AE SSANGSIOS + {0xC6D8, 0xD33D}, //11934 #HANGUL SYLLABLE PHIEUPH AE IEUNG + {0xC6D9, 0xD344}, //11935 #HANGUL SYLLABLE PHIEUPH YA + {0xC6DA, 0xD345}, //11936 #HANGUL SYLLABLE PHIEUPH YA KIYEOK + {0xC6DB, 0xD37C}, //11937 #HANGUL SYLLABLE PHIEUPH EO + {0xC6DC, 0xD37D}, //11938 #HANGUL SYLLABLE PHIEUPH EO KIYEOK + {0xC6DD, 0xD380}, //11939 #HANGUL SYLLABLE PHIEUPH EO NIEUN + {0xC6DE, 0xD384}, //11940 #HANGUL SYLLABLE PHIEUPH EO RIEUL + {0xC6DF, 0xD38C}, //11941 #HANGUL SYLLABLE PHIEUPH EO MIEUM + {0xC6E0, 0xD38D}, //11942 #HANGUL SYLLABLE PHIEUPH EO PIEUP + {0xC6E1, 0xD38F}, //11943 #HANGUL SYLLABLE PHIEUPH EO SIOS + {0xC6E2, 0xD390}, //11944 #HANGUL SYLLABLE PHIEUPH EO SSANGSIOS + {0xC6E3, 0xD391}, //11945 #HANGUL SYLLABLE PHIEUPH EO IEUNG + {0xC6E4, 0xD398}, //11946 #HANGUL SYLLABLE PHIEUPH E + {0xC6E5, 0xD399}, //11947 #HANGUL SYLLABLE PHIEUPH E KIYEOK + {0xC6E6, 0xD39C}, //11948 #HANGUL SYLLABLE PHIEUPH E NIEUN + {0xC6E7, 0xD3A0}, //11949 #HANGUL SYLLABLE PHIEUPH E RIEUL + {0xC6E8, 0xD3A8}, //11950 #HANGUL SYLLABLE PHIEUPH E MIEUM + {0xC6E9, 0xD3A9}, //11951 #HANGUL SYLLABLE PHIEUPH E PIEUP + {0xC6EA, 0xD3AB}, //11952 #HANGUL SYLLABLE PHIEUPH E SIOS + {0xC6EB, 0xD3AD}, //11953 #HANGUL SYLLABLE PHIEUPH E IEUNG + {0xC6EC, 0xD3B4}, //11954 #HANGUL SYLLABLE PHIEUPH YEO + {0xC6ED, 0xD3B8}, //11955 #HANGUL SYLLABLE PHIEUPH YEO NIEUN + {0xC6EE, 0xD3BC}, //11956 #HANGUL SYLLABLE PHIEUPH YEO RIEUL + {0xC6EF, 0xD3C4}, //11957 #HANGUL SYLLABLE PHIEUPH YEO MIEUM + {0xC6F0, 0xD3C5}, //11958 #HANGUL SYLLABLE PHIEUPH YEO PIEUP + {0xC6F1, 0xD3C8}, //11959 #HANGUL SYLLABLE PHIEUPH YEO SSANGSIOS + {0xC6F2, 0xD3C9}, //11960 #HANGUL SYLLABLE PHIEUPH YEO IEUNG + {0xC6F3, 0xD3D0}, //11961 #HANGUL SYLLABLE PHIEUPH YE + {0xC6F4, 0xD3D8}, //11962 #HANGUL SYLLABLE PHIEUPH YE RIEUL + {0xC6F5, 0xD3E1}, //11963 #HANGUL SYLLABLE PHIEUPH YE PIEUP + {0xC6F6, 0xD3E3}, //11964 #HANGUL SYLLABLE PHIEUPH YE SIOS + {0xC6F7, 0xD3EC}, //11965 #HANGUL SYLLABLE PHIEUPH O + {0xC6F8, 0xD3ED}, //11966 #HANGUL SYLLABLE PHIEUPH O KIYEOK + {0xC6F9, 0xD3F0}, //11967 #HANGUL SYLLABLE PHIEUPH O NIEUN + {0xC6FA, 0xD3F4}, //11968 #HANGUL SYLLABLE PHIEUPH O RIEUL + {0xC6FB, 0xD3FC}, //11969 #HANGUL SYLLABLE PHIEUPH O MIEUM + {0xC6FC, 0xD3FD}, //11970 #HANGUL SYLLABLE PHIEUPH O PIEUP + {0xC6FD, 0xD3FF}, //11971 #HANGUL SYLLABLE PHIEUPH O SIOS + {0xC6FE, 0xD401}, //11972 #HANGUL SYLLABLE PHIEUPH O IEUNG + {0xC7A1, 0xD408}, //11973 #HANGUL SYLLABLE PHIEUPH WA + {0xC7A2, 0xD41D}, //11974 #HANGUL SYLLABLE PHIEUPH WA IEUNG + {0xC7A3, 0xD440}, //11975 #HANGUL SYLLABLE PHIEUPH OE + {0xC7A4, 0xD444}, //11976 #HANGUL SYLLABLE PHIEUPH OE NIEUN + {0xC7A5, 0xD45C}, //11977 #HANGUL SYLLABLE PHIEUPH YO + {0xC7A6, 0xD460}, //11978 #HANGUL SYLLABLE PHIEUPH YO NIEUN + {0xC7A7, 0xD464}, //11979 #HANGUL SYLLABLE PHIEUPH YO RIEUL + {0xC7A8, 0xD46D}, //11980 #HANGUL SYLLABLE PHIEUPH YO PIEUP + {0xC7A9, 0xD46F}, //11981 #HANGUL SYLLABLE PHIEUPH YO SIOS + {0xC7AA, 0xD478}, //11982 #HANGUL SYLLABLE PHIEUPH U + {0xC7AB, 0xD479}, //11983 #HANGUL SYLLABLE PHIEUPH U KIYEOK + {0xC7AC, 0xD47C}, //11984 #HANGUL SYLLABLE PHIEUPH U NIEUN + {0xC7AD, 0xD47F}, //11985 #HANGUL SYLLABLE PHIEUPH U TIKEUT + {0xC7AE, 0xD480}, //11986 #HANGUL SYLLABLE PHIEUPH U RIEUL + {0xC7AF, 0xD482}, //11987 #HANGUL SYLLABLE PHIEUPH U RIEULMIEUM + {0xC7B0, 0xD488}, //11988 #HANGUL SYLLABLE PHIEUPH U MIEUM + {0xC7B1, 0xD489}, //11989 #HANGUL SYLLABLE PHIEUPH U PIEUP + {0xC7B2, 0xD48B}, //11990 #HANGUL SYLLABLE PHIEUPH U SIOS + {0xC7B3, 0xD48D}, //11991 #HANGUL SYLLABLE PHIEUPH U IEUNG + {0xC7B4, 0xD494}, //11992 #HANGUL SYLLABLE PHIEUPH WEO + {0xC7B5, 0xD4A9}, //11993 #HANGUL SYLLABLE PHIEUPH WEO IEUNG + {0xC7B6, 0xD4CC}, //11994 #HANGUL SYLLABLE PHIEUPH WI + {0xC7B7, 0xD4D0}, //11995 #HANGUL SYLLABLE PHIEUPH WI NIEUN + {0xC7B8, 0xD4D4}, //11996 #HANGUL SYLLABLE PHIEUPH WI RIEUL + {0xC7B9, 0xD4DC}, //11997 #HANGUL SYLLABLE PHIEUPH WI MIEUM + {0xC7BA, 0xD4DF}, //11998 #HANGUL SYLLABLE PHIEUPH WI SIOS + {0xC7BB, 0xD4E8}, //11999 #HANGUL SYLLABLE PHIEUPH YU + {0xC7BC, 0xD4EC}, //12000 #HANGUL SYLLABLE PHIEUPH YU NIEUN + {0xC7BD, 0xD4F0}, //12001 #HANGUL SYLLABLE PHIEUPH YU RIEUL + {0xC7BE, 0xD4F8}, //12002 #HANGUL SYLLABLE PHIEUPH YU MIEUM + {0xC7BF, 0xD4FB}, //12003 #HANGUL SYLLABLE PHIEUPH YU SIOS + {0xC7C0, 0xD4FD}, //12004 #HANGUL SYLLABLE PHIEUPH YU IEUNG + {0xC7C1, 0xD504}, //12005 #HANGUL SYLLABLE PHIEUPH EU + {0xC7C2, 0xD508}, //12006 #HANGUL SYLLABLE PHIEUPH EU NIEUN + {0xC7C3, 0xD50C}, //12007 #HANGUL SYLLABLE PHIEUPH EU RIEUL + {0xC7C4, 0xD514}, //12008 #HANGUL SYLLABLE PHIEUPH EU MIEUM + {0xC7C5, 0xD515}, //12009 #HANGUL SYLLABLE PHIEUPH EU PIEUP + {0xC7C6, 0xD517}, //12010 #HANGUL SYLLABLE PHIEUPH EU SIOS + {0xC7C7, 0xD53C}, //12011 #HANGUL SYLLABLE PHIEUPH I + {0xC7C8, 0xD53D}, //12012 #HANGUL SYLLABLE PHIEUPH I KIYEOK + {0xC7C9, 0xD540}, //12013 #HANGUL SYLLABLE PHIEUPH I NIEUN + {0xC7CA, 0xD544}, //12014 #HANGUL SYLLABLE PHIEUPH I RIEUL + {0xC7CB, 0xD54C}, //12015 #HANGUL SYLLABLE PHIEUPH I MIEUM + {0xC7CC, 0xD54D}, //12016 #HANGUL SYLLABLE PHIEUPH I PIEUP + {0xC7CD, 0xD54F}, //12017 #HANGUL SYLLABLE PHIEUPH I SIOS + {0xC7CE, 0xD551}, //12018 #HANGUL SYLLABLE PHIEUPH I IEUNG + {0xC7CF, 0xD558}, //12019 #HANGUL SYLLABLE HIEUH A + {0xC7D0, 0xD559}, //12020 #HANGUL SYLLABLE HIEUH A KIYEOK + {0xC7D1, 0xD55C}, //12021 #HANGUL SYLLABLE HIEUH A NIEUN + {0xC7D2, 0xD560}, //12022 #HANGUL SYLLABLE HIEUH A RIEUL + {0xC7D3, 0xD565}, //12023 #HANGUL SYLLABLE HIEUH A RIEULTHIEUTH + {0xC7D4, 0xD568}, //12024 #HANGUL SYLLABLE HIEUH A MIEUM + {0xC7D5, 0xD569}, //12025 #HANGUL SYLLABLE HIEUH A PIEUP + {0xC7D6, 0xD56B}, //12026 #HANGUL SYLLABLE HIEUH A SIOS + {0xC7D7, 0xD56D}, //12027 #HANGUL SYLLABLE HIEUH A IEUNG + {0xC7D8, 0xD574}, //12028 #HANGUL SYLLABLE HIEUH AE + {0xC7D9, 0xD575}, //12029 #HANGUL SYLLABLE HIEUH AE KIYEOK + {0xC7DA, 0xD578}, //12030 #HANGUL SYLLABLE HIEUH AE NIEUN + {0xC7DB, 0xD57C}, //12031 #HANGUL SYLLABLE HIEUH AE RIEUL + {0xC7DC, 0xD584}, //12032 #HANGUL SYLLABLE HIEUH AE MIEUM + {0xC7DD, 0xD585}, //12033 #HANGUL SYLLABLE HIEUH AE PIEUP + {0xC7DE, 0xD587}, //12034 #HANGUL SYLLABLE HIEUH AE SIOS + {0xC7DF, 0xD588}, //12035 #HANGUL SYLLABLE HIEUH AE SSANGSIOS + {0xC7E0, 0xD589}, //12036 #HANGUL SYLLABLE HIEUH AE IEUNG + {0xC7E1, 0xD590}, //12037 #HANGUL SYLLABLE HIEUH YA + {0xC7E2, 0xD5A5}, //12038 #HANGUL SYLLABLE HIEUH YA IEUNG + {0xC7E3, 0xD5C8}, //12039 #HANGUL SYLLABLE HIEUH EO + {0xC7E4, 0xD5C9}, //12040 #HANGUL SYLLABLE HIEUH EO KIYEOK + {0xC7E5, 0xD5CC}, //12041 #HANGUL SYLLABLE HIEUH EO NIEUN + {0xC7E6, 0xD5D0}, //12042 #HANGUL SYLLABLE HIEUH EO RIEUL + {0xC7E7, 0xD5D2}, //12043 #HANGUL SYLLABLE HIEUH EO RIEULMIEUM + {0xC7E8, 0xD5D8}, //12044 #HANGUL SYLLABLE HIEUH EO MIEUM + {0xC7E9, 0xD5D9}, //12045 #HANGUL SYLLABLE HIEUH EO PIEUP + {0xC7EA, 0xD5DB}, //12046 #HANGUL SYLLABLE HIEUH EO SIOS + {0xC7EB, 0xD5DD}, //12047 #HANGUL SYLLABLE HIEUH EO IEUNG + {0xC7EC, 0xD5E4}, //12048 #HANGUL SYLLABLE HIEUH E + {0xC7ED, 0xD5E5}, //12049 #HANGUL SYLLABLE HIEUH E KIYEOK + {0xC7EE, 0xD5E8}, //12050 #HANGUL SYLLABLE HIEUH E NIEUN + {0xC7EF, 0xD5EC}, //12051 #HANGUL SYLLABLE HIEUH E RIEUL + {0xC7F0, 0xD5F4}, //12052 #HANGUL SYLLABLE HIEUH E MIEUM + {0xC7F1, 0xD5F5}, //12053 #HANGUL SYLLABLE HIEUH E PIEUP + {0xC7F2, 0xD5F7}, //12054 #HANGUL SYLLABLE HIEUH E SIOS + {0xC7F3, 0xD5F9}, //12055 #HANGUL SYLLABLE HIEUH E IEUNG + {0xC7F4, 0xD600}, //12056 #HANGUL SYLLABLE HIEUH YEO + {0xC7F5, 0xD601}, //12057 #HANGUL SYLLABLE HIEUH YEO KIYEOK + {0xC7F6, 0xD604}, //12058 #HANGUL SYLLABLE HIEUH YEO NIEUN + {0xC7F7, 0xD608}, //12059 #HANGUL SYLLABLE HIEUH YEO RIEUL + {0xC7F8, 0xD610}, //12060 #HANGUL SYLLABLE HIEUH YEO MIEUM + {0xC7F9, 0xD611}, //12061 #HANGUL SYLLABLE HIEUH YEO PIEUP + {0xC7FA, 0xD613}, //12062 #HANGUL SYLLABLE HIEUH YEO SIOS + {0xC7FB, 0xD614}, //12063 #HANGUL SYLLABLE HIEUH YEO SSANGSIOS + {0xC7FC, 0xD615}, //12064 #HANGUL SYLLABLE HIEUH YEO IEUNG + {0xC7FD, 0xD61C}, //12065 #HANGUL SYLLABLE HIEUH YE + {0xC7FE, 0xD620}, //12066 #HANGUL SYLLABLE HIEUH YE NIEUN + {0xC8A1, 0xD624}, //12067 #HANGUL SYLLABLE HIEUH YE RIEUL + {0xC8A2, 0xD62D}, //12068 #HANGUL SYLLABLE HIEUH YE PIEUP + {0xC8A3, 0xD638}, //12069 #HANGUL SYLLABLE HIEUH O + {0xC8A4, 0xD639}, //12070 #HANGUL SYLLABLE HIEUH O KIYEOK + {0xC8A5, 0xD63C}, //12071 #HANGUL SYLLABLE HIEUH O NIEUN + {0xC8A6, 0xD640}, //12072 #HANGUL SYLLABLE HIEUH O RIEUL + {0xC8A7, 0xD645}, //12073 #HANGUL SYLLABLE HIEUH O RIEULTHIEUTH + {0xC8A8, 0xD648}, //12074 #HANGUL SYLLABLE HIEUH O MIEUM + {0xC8A9, 0xD649}, //12075 #HANGUL SYLLABLE HIEUH O PIEUP + {0xC8AA, 0xD64B}, //12076 #HANGUL SYLLABLE HIEUH O SIOS + {0xC8AB, 0xD64D}, //12077 #HANGUL SYLLABLE HIEUH O IEUNG + {0xC8AC, 0xD651}, //12078 #HANGUL SYLLABLE HIEUH O THIEUTH + {0xC8AD, 0xD654}, //12079 #HANGUL SYLLABLE HIEUH WA + {0xC8AE, 0xD655}, //12080 #HANGUL SYLLABLE HIEUH WA KIYEOK + {0xC8AF, 0xD658}, //12081 #HANGUL SYLLABLE HIEUH WA NIEUN + {0xC8B0, 0xD65C}, //12082 #HANGUL SYLLABLE HIEUH WA RIEUL + {0xC8B1, 0xD667}, //12083 #HANGUL SYLLABLE HIEUH WA SIOS + {0xC8B2, 0xD669}, //12084 #HANGUL SYLLABLE HIEUH WA IEUNG + {0xC8B3, 0xD670}, //12085 #HANGUL SYLLABLE HIEUH WAE + {0xC8B4, 0xD671}, //12086 #HANGUL SYLLABLE HIEUH WAE KIYEOK + {0xC8B5, 0xD674}, //12087 #HANGUL SYLLABLE HIEUH WAE NIEUN + {0xC8B6, 0xD683}, //12088 #HANGUL SYLLABLE HIEUH WAE SIOS + {0xC8B7, 0xD685}, //12089 #HANGUL SYLLABLE HIEUH WAE IEUNG + {0xC8B8, 0xD68C}, //12090 #HANGUL SYLLABLE HIEUH OE + {0xC8B9, 0xD68D}, //12091 #HANGUL SYLLABLE HIEUH OE KIYEOK + {0xC8BA, 0xD690}, //12092 #HANGUL SYLLABLE HIEUH OE NIEUN + {0xC8BB, 0xD694}, //12093 #HANGUL SYLLABLE HIEUH OE RIEUL + {0xC8BC, 0xD69D}, //12094 #HANGUL SYLLABLE HIEUH OE PIEUP + {0xC8BD, 0xD69F}, //12095 #HANGUL SYLLABLE HIEUH OE SIOS + {0xC8BE, 0xD6A1}, //12096 #HANGUL SYLLABLE HIEUH OE IEUNG + {0xC8BF, 0xD6A8}, //12097 #HANGUL SYLLABLE HIEUH YO + {0xC8C0, 0xD6AC}, //12098 #HANGUL SYLLABLE HIEUH YO NIEUN + {0xC8C1, 0xD6B0}, //12099 #HANGUL SYLLABLE HIEUH YO RIEUL + {0xC8C2, 0xD6B9}, //12100 #HANGUL SYLLABLE HIEUH YO PIEUP + {0xC8C3, 0xD6BB}, //12101 #HANGUL SYLLABLE HIEUH YO SIOS + {0xC8C4, 0xD6C4}, //12102 #HANGUL SYLLABLE HIEUH U + {0xC8C5, 0xD6C5}, //12103 #HANGUL SYLLABLE HIEUH U KIYEOK + {0xC8C6, 0xD6C8}, //12104 #HANGUL SYLLABLE HIEUH U NIEUN + {0xC8C7, 0xD6CC}, //12105 #HANGUL SYLLABLE HIEUH U RIEUL + {0xC8C8, 0xD6D1}, //12106 #HANGUL SYLLABLE HIEUH U RIEULTHIEUTH + {0xC8C9, 0xD6D4}, //12107 #HANGUL SYLLABLE HIEUH U MIEUM + {0xC8CA, 0xD6D7}, //12108 #HANGUL SYLLABLE HIEUH U SIOS + {0xC8CB, 0xD6D9}, //12109 #HANGUL SYLLABLE HIEUH U IEUNG + {0xC8CC, 0xD6E0}, //12110 #HANGUL SYLLABLE HIEUH WEO + {0xC8CD, 0xD6E4}, //12111 #HANGUL SYLLABLE HIEUH WEO NIEUN + {0xC8CE, 0xD6E8}, //12112 #HANGUL SYLLABLE HIEUH WEO RIEUL + {0xC8CF, 0xD6F0}, //12113 #HANGUL SYLLABLE HIEUH WEO MIEUM + {0xC8D0, 0xD6F5}, //12114 #HANGUL SYLLABLE HIEUH WEO IEUNG + {0xC8D1, 0xD6FC}, //12115 #HANGUL SYLLABLE HIEUH WE + {0xC8D2, 0xD6FD}, //12116 #HANGUL SYLLABLE HIEUH WE KIYEOK + {0xC8D3, 0xD700}, //12117 #HANGUL SYLLABLE HIEUH WE NIEUN + {0xC8D4, 0xD704}, //12118 #HANGUL SYLLABLE HIEUH WE RIEUL + {0xC8D5, 0xD711}, //12119 #HANGUL SYLLABLE HIEUH WE IEUNG + {0xC8D6, 0xD718}, //12120 #HANGUL SYLLABLE HIEUH WI + {0xC8D7, 0xD719}, //12121 #HANGUL SYLLABLE HIEUH WI KIYEOK + {0xC8D8, 0xD71C}, //12122 #HANGUL SYLLABLE HIEUH WI NIEUN + {0xC8D9, 0xD720}, //12123 #HANGUL SYLLABLE HIEUH WI RIEUL + {0xC8DA, 0xD728}, //12124 #HANGUL SYLLABLE HIEUH WI MIEUM + {0xC8DB, 0xD729}, //12125 #HANGUL SYLLABLE HIEUH WI PIEUP + {0xC8DC, 0xD72B}, //12126 #HANGUL SYLLABLE HIEUH WI SIOS + {0xC8DD, 0xD72D}, //12127 #HANGUL SYLLABLE HIEUH WI IEUNG + {0xC8DE, 0xD734}, //12128 #HANGUL SYLLABLE HIEUH YU + {0xC8DF, 0xD735}, //12129 #HANGUL SYLLABLE HIEUH YU KIYEOK + {0xC8E0, 0xD738}, //12130 #HANGUL SYLLABLE HIEUH YU NIEUN + {0xC8E1, 0xD73C}, //12131 #HANGUL SYLLABLE HIEUH YU RIEUL + {0xC8E2, 0xD744}, //12132 #HANGUL SYLLABLE HIEUH YU MIEUM + {0xC8E3, 0xD747}, //12133 #HANGUL SYLLABLE HIEUH YU SIOS + {0xC8E4, 0xD749}, //12134 #HANGUL SYLLABLE HIEUH YU IEUNG + {0xC8E5, 0xD750}, //12135 #HANGUL SYLLABLE HIEUH EU + {0xC8E6, 0xD751}, //12136 #HANGUL SYLLABLE HIEUH EU KIYEOK + {0xC8E7, 0xD754}, //12137 #HANGUL SYLLABLE HIEUH EU NIEUN + {0xC8E8, 0xD756}, //12138 #HANGUL SYLLABLE HIEUH EU NIEUNHIEUH + {0xC8E9, 0xD757}, //12139 #HANGUL SYLLABLE HIEUH EU TIKEUT + {0xC8EA, 0xD758}, //12140 #HANGUL SYLLABLE HIEUH EU RIEUL + {0xC8EB, 0xD759}, //12141 #HANGUL SYLLABLE HIEUH EU RIEULKIYEOK + {0xC8EC, 0xD760}, //12142 #HANGUL SYLLABLE HIEUH EU MIEUM + {0xC8ED, 0xD761}, //12143 #HANGUL SYLLABLE HIEUH EU PIEUP + {0xC8EE, 0xD763}, //12144 #HANGUL SYLLABLE HIEUH EU SIOS + {0xC8EF, 0xD765}, //12145 #HANGUL SYLLABLE HIEUH EU IEUNG + {0xC8F0, 0xD769}, //12146 #HANGUL SYLLABLE HIEUH EU THIEUTH + {0xC8F1, 0xD76C}, //12147 #HANGUL SYLLABLE HIEUH YI + {0xC8F2, 0xD770}, //12148 #HANGUL SYLLABLE HIEUH YI NIEUN + {0xC8F3, 0xD774}, //12149 #HANGUL SYLLABLE HIEUH YI RIEUL + {0xC8F4, 0xD77C}, //12150 #HANGUL SYLLABLE HIEUH YI MIEUM + {0xC8F5, 0xD77D}, //12151 #HANGUL SYLLABLE HIEUH YI PIEUP + {0xC8F6, 0xD781}, //12152 #HANGUL SYLLABLE HIEUH YI IEUNG + {0xC8F7, 0xD788}, //12153 #HANGUL SYLLABLE HIEUH I + {0xC8F8, 0xD789}, //12154 #HANGUL SYLLABLE HIEUH I KIYEOK + {0xC8F9, 0xD78C}, //12155 #HANGUL SYLLABLE HIEUH I NIEUN + {0xC8FA, 0xD790}, //12156 #HANGUL SYLLABLE HIEUH I RIEUL + {0xC8FB, 0xD798}, //12157 #HANGUL SYLLABLE HIEUH I MIEUM + {0xC8FC, 0xD799}, //12158 #HANGUL SYLLABLE HIEUH I PIEUP + {0xC8FD, 0xD79B}, //12159 #HANGUL SYLLABLE HIEUH I SIOS + {0xC8FE, 0xD79D}, //12160 #HANGUL SYLLABLE HIEUH I IEUNG + {0xCAA1, 0x4F3D}, //12161 #CJK UNIFIED IDEOGRAPH + {0xCAA2, 0x4F73}, //12162 #CJK UNIFIED IDEOGRAPH + {0xCAA3, 0x5047}, //12163 #CJK UNIFIED IDEOGRAPH + {0xCAA4, 0x50F9}, //12164 #CJK UNIFIED IDEOGRAPH + {0xCAA5, 0x52A0}, //12165 #CJK UNIFIED IDEOGRAPH + {0xCAA6, 0x53EF}, //12166 #CJK UNIFIED IDEOGRAPH + {0xCAA7, 0x5475}, //12167 #CJK UNIFIED IDEOGRAPH + {0xCAA8, 0x54E5}, //12168 #CJK UNIFIED IDEOGRAPH + {0xCAA9, 0x5609}, //12169 #CJK UNIFIED IDEOGRAPH + {0xCAAA, 0x5AC1}, //12170 #CJK UNIFIED IDEOGRAPH + {0xCAAB, 0x5BB6}, //12171 #CJK UNIFIED IDEOGRAPH + {0xCAAC, 0x6687}, //12172 #CJK UNIFIED IDEOGRAPH + {0xCAAD, 0x67B6}, //12173 #CJK UNIFIED IDEOGRAPH + {0xCAAE, 0x67B7}, //12174 #CJK UNIFIED IDEOGRAPH + {0xCAAF, 0x67EF}, //12175 #CJK UNIFIED IDEOGRAPH + {0xCAB0, 0x6B4C}, //12176 #CJK UNIFIED IDEOGRAPH + {0xCAB1, 0x73C2}, //12177 #CJK UNIFIED IDEOGRAPH + {0xCAB2, 0x75C2}, //12178 #CJK UNIFIED IDEOGRAPH + {0xCAB3, 0x7A3C}, //12179 #CJK UNIFIED IDEOGRAPH + {0xCAB4, 0x82DB}, //12180 #CJK UNIFIED IDEOGRAPH + {0xCAB5, 0x8304}, //12181 #CJK UNIFIED IDEOGRAPH + {0xCAB6, 0x8857}, //12182 #CJK UNIFIED IDEOGRAPH + {0xCAB7, 0x8888}, //12183 #CJK UNIFIED IDEOGRAPH + {0xCAB8, 0x8A36}, //12184 #CJK UNIFIED IDEOGRAPH + {0xCAB9, 0x8CC8}, //12185 #CJK UNIFIED IDEOGRAPH + {0xCABA, 0x8DCF}, //12186 #CJK UNIFIED IDEOGRAPH + {0xCABB, 0x8EFB}, //12187 #CJK UNIFIED IDEOGRAPH + {0xCABC, 0x8FE6}, //12188 #CJK UNIFIED IDEOGRAPH + {0xCABD, 0x99D5}, //12189 #CJK UNIFIED IDEOGRAPH + {0xCABE, 0x523B}, //12190 #CJK UNIFIED IDEOGRAPH + {0xCABF, 0x5374}, //12191 #CJK UNIFIED IDEOGRAPH + {0xCAC0, 0x5404}, //12192 #CJK UNIFIED IDEOGRAPH + {0xCAC1, 0x606A}, //12193 #CJK UNIFIED IDEOGRAPH + {0xCAC2, 0x6164}, //12194 #CJK UNIFIED IDEOGRAPH + {0xCAC3, 0x6BBC}, //12195 #CJK UNIFIED IDEOGRAPH + {0xCAC4, 0x73CF}, //12196 #CJK UNIFIED IDEOGRAPH + {0xCAC5, 0x811A}, //12197 #CJK UNIFIED IDEOGRAPH + {0xCAC6, 0x89BA}, //12198 #CJK UNIFIED IDEOGRAPH + {0xCAC7, 0x89D2}, //12199 #CJK UNIFIED IDEOGRAPH + {0xCAC8, 0x95A3}, //12200 #CJK UNIFIED IDEOGRAPH + {0xCAC9, 0x4F83}, //12201 #CJK UNIFIED IDEOGRAPH + {0xCACA, 0x520A}, //12202 #CJK UNIFIED IDEOGRAPH + {0xCACB, 0x58BE}, //12203 #CJK UNIFIED IDEOGRAPH + {0xCACC, 0x5978}, //12204 #CJK UNIFIED IDEOGRAPH + {0xCACD, 0x59E6}, //12205 #CJK UNIFIED IDEOGRAPH + {0xCACE, 0x5E72}, //12206 #CJK UNIFIED IDEOGRAPH + {0xCACF, 0x5E79}, //12207 #CJK UNIFIED IDEOGRAPH + {0xCAD0, 0x61C7}, //12208 #CJK UNIFIED IDEOGRAPH + {0xCAD1, 0x63C0}, //12209 #CJK UNIFIED IDEOGRAPH + {0xCAD2, 0x6746}, //12210 #CJK UNIFIED IDEOGRAPH + {0xCAD3, 0x67EC}, //12211 #CJK UNIFIED IDEOGRAPH + {0xCAD4, 0x687F}, //12212 #CJK UNIFIED IDEOGRAPH + {0xCAD5, 0x6F97}, //12213 #CJK UNIFIED IDEOGRAPH + {0xCAD6, 0x764E}, //12214 #CJK UNIFIED IDEOGRAPH + {0xCAD7, 0x770B}, //12215 #CJK UNIFIED IDEOGRAPH + {0xCAD8, 0x78F5}, //12216 #CJK UNIFIED IDEOGRAPH + {0xCAD9, 0x7A08}, //12217 #CJK UNIFIED IDEOGRAPH + {0xCADA, 0x7AFF}, //12218 #CJK UNIFIED IDEOGRAPH + {0xCADB, 0x7C21}, //12219 #CJK UNIFIED IDEOGRAPH + {0xCADC, 0x809D}, //12220 #CJK UNIFIED IDEOGRAPH + {0xCADD, 0x826E}, //12221 #CJK UNIFIED IDEOGRAPH + {0xCADE, 0x8271}, //12222 #CJK UNIFIED IDEOGRAPH + {0xCADF, 0x8AEB}, //12223 #CJK UNIFIED IDEOGRAPH + {0xCAE0, 0x9593}, //12224 #CJK UNIFIED IDEOGRAPH + {0xCAE1, 0x4E6B}, //12225 #CJK UNIFIED IDEOGRAPH + {0xCAE2, 0x559D}, //12226 #CJK UNIFIED IDEOGRAPH + {0xCAE3, 0x66F7}, //12227 #CJK UNIFIED IDEOGRAPH + {0xCAE4, 0x6E34}, //12228 #CJK UNIFIED IDEOGRAPH + {0xCAE5, 0x78A3}, //12229 #CJK UNIFIED IDEOGRAPH + {0xCAE6, 0x7AED}, //12230 #CJK UNIFIED IDEOGRAPH + {0xCAE7, 0x845B}, //12231 #CJK UNIFIED IDEOGRAPH + {0xCAE8, 0x8910}, //12232 #CJK UNIFIED IDEOGRAPH + {0xCAE9, 0x874E}, //12233 #CJK UNIFIED IDEOGRAPH + {0xCAEA, 0x97A8}, //12234 #CJK UNIFIED IDEOGRAPH + {0xCAEB, 0x52D8}, //12235 #CJK UNIFIED IDEOGRAPH + {0xCAEC, 0x574E}, //12236 #CJK UNIFIED IDEOGRAPH + {0xCAED, 0x582A}, //12237 #CJK UNIFIED IDEOGRAPH + {0xCAEE, 0x5D4C}, //12238 #CJK UNIFIED IDEOGRAPH + {0xCAEF, 0x611F}, //12239 #CJK UNIFIED IDEOGRAPH + {0xCAF0, 0x61BE}, //12240 #CJK UNIFIED IDEOGRAPH + {0xCAF1, 0x6221}, //12241 #CJK UNIFIED IDEOGRAPH + {0xCAF2, 0x6562}, //12242 #CJK UNIFIED IDEOGRAPH + {0xCAF3, 0x67D1}, //12243 #CJK UNIFIED IDEOGRAPH + {0xCAF4, 0x6A44}, //12244 #CJK UNIFIED IDEOGRAPH + {0xCAF5, 0x6E1B}, //12245 #CJK UNIFIED IDEOGRAPH + {0xCAF6, 0x7518}, //12246 #CJK UNIFIED IDEOGRAPH + {0xCAF7, 0x75B3}, //12247 #CJK UNIFIED IDEOGRAPH + {0xCAF8, 0x76E3}, //12248 #CJK UNIFIED IDEOGRAPH + {0xCAF9, 0x77B0}, //12249 #CJK UNIFIED IDEOGRAPH + {0xCAFA, 0x7D3A}, //12250 #CJK UNIFIED IDEOGRAPH + {0xCAFB, 0x90AF}, //12251 #CJK UNIFIED IDEOGRAPH + {0xCAFC, 0x9451}, //12252 #CJK UNIFIED IDEOGRAPH + {0xCAFD, 0x9452}, //12253 #CJK UNIFIED IDEOGRAPH + {0xCAFE, 0x9F95}, //12254 #CJK UNIFIED IDEOGRAPH + {0xCBA1, 0x5323}, //12255 #CJK UNIFIED IDEOGRAPH + {0xCBA2, 0x5CAC}, //12256 #CJK UNIFIED IDEOGRAPH + {0xCBA3, 0x7532}, //12257 #CJK UNIFIED IDEOGRAPH + {0xCBA4, 0x80DB}, //12258 #CJK UNIFIED IDEOGRAPH + {0xCBA5, 0x9240}, //12259 #CJK UNIFIED IDEOGRAPH + {0xCBA6, 0x9598}, //12260 #CJK UNIFIED IDEOGRAPH + {0xCBA7, 0x525B}, //12261 #CJK UNIFIED IDEOGRAPH + {0xCBA8, 0x5808}, //12262 #CJK UNIFIED IDEOGRAPH + {0xCBA9, 0x59DC}, //12263 #CJK UNIFIED IDEOGRAPH + {0xCBAA, 0x5CA1}, //12264 #CJK UNIFIED IDEOGRAPH + {0xCBAB, 0x5D17}, //12265 #CJK UNIFIED IDEOGRAPH + {0xCBAC, 0x5EB7}, //12266 #CJK UNIFIED IDEOGRAPH + {0xCBAD, 0x5F3A}, //12267 #CJK UNIFIED IDEOGRAPH + {0xCBAE, 0x5F4A}, //12268 #CJK UNIFIED IDEOGRAPH + {0xCBAF, 0x6177}, //12269 #CJK UNIFIED IDEOGRAPH + {0xCBB0, 0x6C5F}, //12270 #CJK UNIFIED IDEOGRAPH + {0xCBB1, 0x757A}, //12271 #CJK UNIFIED IDEOGRAPH + {0xCBB2, 0x7586}, //12272 #CJK UNIFIED IDEOGRAPH + {0xCBB3, 0x7CE0}, //12273 #CJK UNIFIED IDEOGRAPH + {0xCBB4, 0x7D73}, //12274 #CJK UNIFIED IDEOGRAPH + {0xCBB5, 0x7DB1}, //12275 #CJK UNIFIED IDEOGRAPH + {0xCBB6, 0x7F8C}, //12276 #CJK UNIFIED IDEOGRAPH + {0xCBB7, 0x8154}, //12277 #CJK UNIFIED IDEOGRAPH + {0xCBB8, 0x8221}, //12278 #CJK UNIFIED IDEOGRAPH + {0xCBB9, 0x8591}, //12279 #CJK UNIFIED IDEOGRAPH + {0xCBBA, 0x8941}, //12280 #CJK UNIFIED IDEOGRAPH + {0xCBBB, 0x8B1B}, //12281 #CJK UNIFIED IDEOGRAPH + {0xCBBC, 0x92FC}, //12282 #CJK UNIFIED IDEOGRAPH + {0xCBBD, 0x964D}, //12283 #CJK UNIFIED IDEOGRAPH + {0xCBBE, 0x9C47}, //12284 #CJK UNIFIED IDEOGRAPH + {0xCBBF, 0x4ECB}, //12285 #CJK UNIFIED IDEOGRAPH + {0xCBC0, 0x4EF7}, //12286 #CJK UNIFIED IDEOGRAPH + {0xCBC1, 0x500B}, //12287 #CJK UNIFIED IDEOGRAPH + {0xCBC2, 0x51F1}, //12288 #CJK UNIFIED IDEOGRAPH + {0xCBC3, 0x584F}, //12289 #CJK UNIFIED IDEOGRAPH + {0xCBC4, 0x6137}, //12290 #CJK UNIFIED IDEOGRAPH + {0xCBC5, 0x613E}, //12291 #CJK UNIFIED IDEOGRAPH + {0xCBC6, 0x6168}, //12292 #CJK UNIFIED IDEOGRAPH + {0xCBC7, 0x6539}, //12293 #CJK UNIFIED IDEOGRAPH + {0xCBC8, 0x69EA}, //12294 #CJK UNIFIED IDEOGRAPH + {0xCBC9, 0x6F11}, //12295 #CJK UNIFIED IDEOGRAPH + {0xCBCA, 0x75A5}, //12296 #CJK UNIFIED IDEOGRAPH + {0xCBCB, 0x7686}, //12297 #CJK UNIFIED IDEOGRAPH + {0xCBCC, 0x76D6}, //12298 #CJK UNIFIED IDEOGRAPH + {0xCBCD, 0x7B87}, //12299 #CJK UNIFIED IDEOGRAPH + {0xCBCE, 0x82A5}, //12300 #CJK UNIFIED IDEOGRAPH + {0xCBCF, 0x84CB}, //12301 #CJK UNIFIED IDEOGRAPH + {0xCBD0, 0xF900}, //12302 #CJK COMPATIBILITY IDEOGRAPH + {0xCBD1, 0x93A7}, //12303 #CJK UNIFIED IDEOGRAPH + {0xCBD2, 0x958B}, //12304 #CJK UNIFIED IDEOGRAPH + {0xCBD3, 0x5580}, //12305 #CJK UNIFIED IDEOGRAPH + {0xCBD4, 0x5BA2}, //12306 #CJK UNIFIED IDEOGRAPH + {0xCBD5, 0x5751}, //12307 #CJK UNIFIED IDEOGRAPH + {0xCBD6, 0xF901}, //12308 #CJK COMPATIBILITY IDEOGRAPH + {0xCBD7, 0x7CB3}, //12309 #CJK UNIFIED IDEOGRAPH + {0xCBD8, 0x7FB9}, //12310 #CJK UNIFIED IDEOGRAPH + {0xCBD9, 0x91B5}, //12311 #CJK UNIFIED IDEOGRAPH + {0xCBDA, 0x5028}, //12312 #CJK UNIFIED IDEOGRAPH + {0xCBDB, 0x53BB}, //12313 #CJK UNIFIED IDEOGRAPH + {0xCBDC, 0x5C45}, //12314 #CJK UNIFIED IDEOGRAPH + {0xCBDD, 0x5DE8}, //12315 #CJK UNIFIED IDEOGRAPH + {0xCBDE, 0x62D2}, //12316 #CJK UNIFIED IDEOGRAPH + {0xCBDF, 0x636E}, //12317 #CJK UNIFIED IDEOGRAPH + {0xCBE0, 0x64DA}, //12318 #CJK UNIFIED IDEOGRAPH + {0xCBE1, 0x64E7}, //12319 #CJK UNIFIED IDEOGRAPH + {0xCBE2, 0x6E20}, //12320 #CJK UNIFIED IDEOGRAPH + {0xCBE3, 0x70AC}, //12321 #CJK UNIFIED IDEOGRAPH + {0xCBE4, 0x795B}, //12322 #CJK UNIFIED IDEOGRAPH + {0xCBE5, 0x8DDD}, //12323 #CJK UNIFIED IDEOGRAPH + {0xCBE6, 0x8E1E}, //12324 #CJK UNIFIED IDEOGRAPH + {0xCBE7, 0xF902}, //12325 #CJK COMPATIBILITY IDEOGRAPH + {0xCBE8, 0x907D}, //12326 #CJK UNIFIED IDEOGRAPH + {0xCBE9, 0x9245}, //12327 #CJK UNIFIED IDEOGRAPH + {0xCBEA, 0x92F8}, //12328 #CJK UNIFIED IDEOGRAPH + {0xCBEB, 0x4E7E}, //12329 #CJK UNIFIED IDEOGRAPH + {0xCBEC, 0x4EF6}, //12330 #CJK UNIFIED IDEOGRAPH + {0xCBED, 0x5065}, //12331 #CJK UNIFIED IDEOGRAPH + {0xCBEE, 0x5DFE}, //12332 #CJK UNIFIED IDEOGRAPH + {0xCBEF, 0x5EFA}, //12333 #CJK UNIFIED IDEOGRAPH + {0xCBF0, 0x6106}, //12334 #CJK UNIFIED IDEOGRAPH + {0xCBF1, 0x6957}, //12335 #CJK UNIFIED IDEOGRAPH + {0xCBF2, 0x8171}, //12336 #CJK UNIFIED IDEOGRAPH + {0xCBF3, 0x8654}, //12337 #CJK UNIFIED IDEOGRAPH + {0xCBF4, 0x8E47}, //12338 #CJK UNIFIED IDEOGRAPH + {0xCBF5, 0x9375}, //12339 #CJK UNIFIED IDEOGRAPH + {0xCBF6, 0x9A2B}, //12340 #CJK UNIFIED IDEOGRAPH + {0xCBF7, 0x4E5E}, //12341 #CJK UNIFIED IDEOGRAPH + {0xCBF8, 0x5091}, //12342 #CJK UNIFIED IDEOGRAPH + {0xCBF9, 0x6770}, //12343 #CJK UNIFIED IDEOGRAPH + {0xCBFA, 0x6840}, //12344 #CJK UNIFIED IDEOGRAPH + {0xCBFB, 0x5109}, //12345 #CJK UNIFIED IDEOGRAPH + {0xCBFC, 0x528D}, //12346 #CJK UNIFIED IDEOGRAPH + {0xCBFD, 0x5292}, //12347 #CJK UNIFIED IDEOGRAPH + {0xCBFE, 0x6AA2}, //12348 #CJK UNIFIED IDEOGRAPH + {0xCCA1, 0x77BC}, //12349 #CJK UNIFIED IDEOGRAPH + {0xCCA2, 0x9210}, //12350 #CJK UNIFIED IDEOGRAPH + {0xCCA3, 0x9ED4}, //12351 #CJK UNIFIED IDEOGRAPH + {0xCCA4, 0x52AB}, //12352 #CJK UNIFIED IDEOGRAPH + {0xCCA5, 0x602F}, //12353 #CJK UNIFIED IDEOGRAPH + {0xCCA6, 0x8FF2}, //12354 #CJK UNIFIED IDEOGRAPH + {0xCCA7, 0x5048}, //12355 #CJK UNIFIED IDEOGRAPH + {0xCCA8, 0x61A9}, //12356 #CJK UNIFIED IDEOGRAPH + {0xCCA9, 0x63ED}, //12357 #CJK UNIFIED IDEOGRAPH + {0xCCAA, 0x64CA}, //12358 #CJK UNIFIED IDEOGRAPH + {0xCCAB, 0x683C}, //12359 #CJK UNIFIED IDEOGRAPH + {0xCCAC, 0x6A84}, //12360 #CJK UNIFIED IDEOGRAPH + {0xCCAD, 0x6FC0}, //12361 #CJK UNIFIED IDEOGRAPH + {0xCCAE, 0x8188}, //12362 #CJK UNIFIED IDEOGRAPH + {0xCCAF, 0x89A1}, //12363 #CJK UNIFIED IDEOGRAPH + {0xCCB0, 0x9694}, //12364 #CJK UNIFIED IDEOGRAPH + {0xCCB1, 0x5805}, //12365 #CJK UNIFIED IDEOGRAPH + {0xCCB2, 0x727D}, //12366 #CJK UNIFIED IDEOGRAPH + {0xCCB3, 0x72AC}, //12367 #CJK UNIFIED IDEOGRAPH + {0xCCB4, 0x7504}, //12368 #CJK UNIFIED IDEOGRAPH + {0xCCB5, 0x7D79}, //12369 #CJK UNIFIED IDEOGRAPH + {0xCCB6, 0x7E6D}, //12370 #CJK UNIFIED IDEOGRAPH + {0xCCB7, 0x80A9}, //12371 #CJK UNIFIED IDEOGRAPH + {0xCCB8, 0x898B}, //12372 #CJK UNIFIED IDEOGRAPH + {0xCCB9, 0x8B74}, //12373 #CJK UNIFIED IDEOGRAPH + {0xCCBA, 0x9063}, //12374 #CJK UNIFIED IDEOGRAPH + {0xCCBB, 0x9D51}, //12375 #CJK UNIFIED IDEOGRAPH + {0xCCBC, 0x6289}, //12376 #CJK UNIFIED IDEOGRAPH + {0xCCBD, 0x6C7A}, //12377 #CJK UNIFIED IDEOGRAPH + {0xCCBE, 0x6F54}, //12378 #CJK UNIFIED IDEOGRAPH + {0xCCBF, 0x7D50}, //12379 #CJK UNIFIED IDEOGRAPH + {0xCCC0, 0x7F3A}, //12380 #CJK UNIFIED IDEOGRAPH + {0xCCC1, 0x8A23}, //12381 #CJK UNIFIED IDEOGRAPH + {0xCCC2, 0x517C}, //12382 #CJK UNIFIED IDEOGRAPH + {0xCCC3, 0x614A}, //12383 #CJK UNIFIED IDEOGRAPH + {0xCCC4, 0x7B9D}, //12384 #CJK UNIFIED IDEOGRAPH + {0xCCC5, 0x8B19}, //12385 #CJK UNIFIED IDEOGRAPH + {0xCCC6, 0x9257}, //12386 #CJK UNIFIED IDEOGRAPH + {0xCCC7, 0x938C}, //12387 #CJK UNIFIED IDEOGRAPH + {0xCCC8, 0x4EAC}, //12388 #CJK UNIFIED IDEOGRAPH + {0xCCC9, 0x4FD3}, //12389 #CJK UNIFIED IDEOGRAPH + {0xCCCA, 0x501E}, //12390 #CJK UNIFIED IDEOGRAPH + {0xCCCB, 0x50BE}, //12391 #CJK UNIFIED IDEOGRAPH + {0xCCCC, 0x5106}, //12392 #CJK UNIFIED IDEOGRAPH + {0xCCCD, 0x52C1}, //12393 #CJK UNIFIED IDEOGRAPH + {0xCCCE, 0x52CD}, //12394 #CJK UNIFIED IDEOGRAPH + {0xCCCF, 0x537F}, //12395 #CJK UNIFIED IDEOGRAPH + {0xCCD0, 0x5770}, //12396 #CJK UNIFIED IDEOGRAPH + {0xCCD1, 0x5883}, //12397 #CJK UNIFIED IDEOGRAPH + {0xCCD2, 0x5E9A}, //12398 #CJK UNIFIED IDEOGRAPH + {0xCCD3, 0x5F91}, //12399 #CJK UNIFIED IDEOGRAPH + {0xCCD4, 0x6176}, //12400 #CJK UNIFIED IDEOGRAPH + {0xCCD5, 0x61AC}, //12401 #CJK UNIFIED IDEOGRAPH + {0xCCD6, 0x64CE}, //12402 #CJK UNIFIED IDEOGRAPH + {0xCCD7, 0x656C}, //12403 #CJK UNIFIED IDEOGRAPH + {0xCCD8, 0x666F}, //12404 #CJK UNIFIED IDEOGRAPH + {0xCCD9, 0x66BB}, //12405 #CJK UNIFIED IDEOGRAPH + {0xCCDA, 0x66F4}, //12406 #CJK UNIFIED IDEOGRAPH + {0xCCDB, 0x6897}, //12407 #CJK UNIFIED IDEOGRAPH + {0xCCDC, 0x6D87}, //12408 #CJK UNIFIED IDEOGRAPH + {0xCCDD, 0x7085}, //12409 #CJK UNIFIED IDEOGRAPH + {0xCCDE, 0x70F1}, //12410 #CJK UNIFIED IDEOGRAPH + {0xCCDF, 0x749F}, //12411 #CJK UNIFIED IDEOGRAPH + {0xCCE0, 0x74A5}, //12412 #CJK UNIFIED IDEOGRAPH + {0xCCE1, 0x74CA}, //12413 #CJK UNIFIED IDEOGRAPH + {0xCCE2, 0x75D9}, //12414 #CJK UNIFIED IDEOGRAPH + {0xCCE3, 0x786C}, //12415 #CJK UNIFIED IDEOGRAPH + {0xCCE4, 0x78EC}, //12416 #CJK UNIFIED IDEOGRAPH + {0xCCE5, 0x7ADF}, //12417 #CJK UNIFIED IDEOGRAPH + {0xCCE6, 0x7AF6}, //12418 #CJK UNIFIED IDEOGRAPH + {0xCCE7, 0x7D45}, //12419 #CJK UNIFIED IDEOGRAPH + {0xCCE8, 0x7D93}, //12420 #CJK UNIFIED IDEOGRAPH + {0xCCE9, 0x8015}, //12421 #CJK UNIFIED IDEOGRAPH + {0xCCEA, 0x803F}, //12422 #CJK UNIFIED IDEOGRAPH + {0xCCEB, 0x811B}, //12423 #CJK UNIFIED IDEOGRAPH + {0xCCEC, 0x8396}, //12424 #CJK UNIFIED IDEOGRAPH + {0xCCED, 0x8B66}, //12425 #CJK UNIFIED IDEOGRAPH + {0xCCEE, 0x8F15}, //12426 #CJK UNIFIED IDEOGRAPH + {0xCCEF, 0x9015}, //12427 #CJK UNIFIED IDEOGRAPH + {0xCCF0, 0x93E1}, //12428 #CJK UNIFIED IDEOGRAPH + {0xCCF1, 0x9803}, //12429 #CJK UNIFIED IDEOGRAPH + {0xCCF2, 0x9838}, //12430 #CJK UNIFIED IDEOGRAPH + {0xCCF3, 0x9A5A}, //12431 #CJK UNIFIED IDEOGRAPH + {0xCCF4, 0x9BE8}, //12432 #CJK UNIFIED IDEOGRAPH + {0xCCF5, 0x4FC2}, //12433 #CJK UNIFIED IDEOGRAPH + {0xCCF6, 0x5553}, //12434 #CJK UNIFIED IDEOGRAPH + {0xCCF7, 0x583A}, //12435 #CJK UNIFIED IDEOGRAPH + {0xCCF8, 0x5951}, //12436 #CJK UNIFIED IDEOGRAPH + {0xCCF9, 0x5B63}, //12437 #CJK UNIFIED IDEOGRAPH + {0xCCFA, 0x5C46}, //12438 #CJK UNIFIED IDEOGRAPH + {0xCCFB, 0x60B8}, //12439 #CJK UNIFIED IDEOGRAPH + {0xCCFC, 0x6212}, //12440 #CJK UNIFIED IDEOGRAPH + {0xCCFD, 0x6842}, //12441 #CJK UNIFIED IDEOGRAPH + {0xCCFE, 0x68B0}, //12442 #CJK UNIFIED IDEOGRAPH + {0xCDA1, 0x68E8}, //12443 #CJK UNIFIED IDEOGRAPH + {0xCDA2, 0x6EAA}, //12444 #CJK UNIFIED IDEOGRAPH + {0xCDA3, 0x754C}, //12445 #CJK UNIFIED IDEOGRAPH + {0xCDA4, 0x7678}, //12446 #CJK UNIFIED IDEOGRAPH + {0xCDA5, 0x78CE}, //12447 #CJK UNIFIED IDEOGRAPH + {0xCDA6, 0x7A3D}, //12448 #CJK UNIFIED IDEOGRAPH + {0xCDA7, 0x7CFB}, //12449 #CJK UNIFIED IDEOGRAPH + {0xCDA8, 0x7E6B}, //12450 #CJK UNIFIED IDEOGRAPH + {0xCDA9, 0x7E7C}, //12451 #CJK UNIFIED IDEOGRAPH + {0xCDAA, 0x8A08}, //12452 #CJK UNIFIED IDEOGRAPH + {0xCDAB, 0x8AA1}, //12453 #CJK UNIFIED IDEOGRAPH + {0xCDAC, 0x8C3F}, //12454 #CJK UNIFIED IDEOGRAPH + {0xCDAD, 0x968E}, //12455 #CJK UNIFIED IDEOGRAPH + {0xCDAE, 0x9DC4}, //12456 #CJK UNIFIED IDEOGRAPH + {0xCDAF, 0x53E4}, //12457 #CJK UNIFIED IDEOGRAPH + {0xCDB0, 0x53E9}, //12458 #CJK UNIFIED IDEOGRAPH + {0xCDB1, 0x544A}, //12459 #CJK UNIFIED IDEOGRAPH + {0xCDB2, 0x5471}, //12460 #CJK UNIFIED IDEOGRAPH + {0xCDB3, 0x56FA}, //12461 #CJK UNIFIED IDEOGRAPH + {0xCDB4, 0x59D1}, //12462 #CJK UNIFIED IDEOGRAPH + {0xCDB5, 0x5B64}, //12463 #CJK UNIFIED IDEOGRAPH + {0xCDB6, 0x5C3B}, //12464 #CJK UNIFIED IDEOGRAPH + {0xCDB7, 0x5EAB}, //12465 #CJK UNIFIED IDEOGRAPH + {0xCDB8, 0x62F7}, //12466 #CJK UNIFIED IDEOGRAPH + {0xCDB9, 0x6537}, //12467 #CJK UNIFIED IDEOGRAPH + {0xCDBA, 0x6545}, //12468 #CJK UNIFIED IDEOGRAPH + {0xCDBB, 0x6572}, //12469 #CJK UNIFIED IDEOGRAPH + {0xCDBC, 0x66A0}, //12470 #CJK UNIFIED IDEOGRAPH + {0xCDBD, 0x67AF}, //12471 #CJK UNIFIED IDEOGRAPH + {0xCDBE, 0x69C1}, //12472 #CJK UNIFIED IDEOGRAPH + {0xCDBF, 0x6CBD}, //12473 #CJK UNIFIED IDEOGRAPH + {0xCDC0, 0x75FC}, //12474 #CJK UNIFIED IDEOGRAPH + {0xCDC1, 0x7690}, //12475 #CJK UNIFIED IDEOGRAPH + {0xCDC2, 0x777E}, //12476 #CJK UNIFIED IDEOGRAPH + {0xCDC3, 0x7A3F}, //12477 #CJK UNIFIED IDEOGRAPH + {0xCDC4, 0x7F94}, //12478 #CJK UNIFIED IDEOGRAPH + {0xCDC5, 0x8003}, //12479 #CJK UNIFIED IDEOGRAPH + {0xCDC6, 0x80A1}, //12480 #CJK UNIFIED IDEOGRAPH + {0xCDC7, 0x818F}, //12481 #CJK UNIFIED IDEOGRAPH + {0xCDC8, 0x82E6}, //12482 #CJK UNIFIED IDEOGRAPH + {0xCDC9, 0x82FD}, //12483 #CJK UNIFIED IDEOGRAPH + {0xCDCA, 0x83F0}, //12484 #CJK UNIFIED IDEOGRAPH + {0xCDCB, 0x85C1}, //12485 #CJK UNIFIED IDEOGRAPH + {0xCDCC, 0x8831}, //12486 #CJK UNIFIED IDEOGRAPH + {0xCDCD, 0x88B4}, //12487 #CJK UNIFIED IDEOGRAPH + {0xCDCE, 0x8AA5}, //12488 #CJK UNIFIED IDEOGRAPH + {0xCDCF, 0xF903}, //12489 #CJK COMPATIBILITY IDEOGRAPH + {0xCDD0, 0x8F9C}, //12490 #CJK UNIFIED IDEOGRAPH + {0xCDD1, 0x932E}, //12491 #CJK UNIFIED IDEOGRAPH + {0xCDD2, 0x96C7}, //12492 #CJK UNIFIED IDEOGRAPH + {0xCDD3, 0x9867}, //12493 #CJK UNIFIED IDEOGRAPH + {0xCDD4, 0x9AD8}, //12494 #CJK UNIFIED IDEOGRAPH + {0xCDD5, 0x9F13}, //12495 #CJK UNIFIED IDEOGRAPH + {0xCDD6, 0x54ED}, //12496 #CJK UNIFIED IDEOGRAPH + {0xCDD7, 0x659B}, //12497 #CJK UNIFIED IDEOGRAPH + {0xCDD8, 0x66F2}, //12498 #CJK UNIFIED IDEOGRAPH + {0xCDD9, 0x688F}, //12499 #CJK UNIFIED IDEOGRAPH + {0xCDDA, 0x7A40}, //12500 #CJK UNIFIED IDEOGRAPH + {0xCDDB, 0x8C37}, //12501 #CJK UNIFIED IDEOGRAPH + {0xCDDC, 0x9D60}, //12502 #CJK UNIFIED IDEOGRAPH + {0xCDDD, 0x56F0}, //12503 #CJK UNIFIED IDEOGRAPH + {0xCDDE, 0x5764}, //12504 #CJK UNIFIED IDEOGRAPH + {0xCDDF, 0x5D11}, //12505 #CJK UNIFIED IDEOGRAPH + {0xCDE0, 0x6606}, //12506 #CJK UNIFIED IDEOGRAPH + {0xCDE1, 0x68B1}, //12507 #CJK UNIFIED IDEOGRAPH + {0xCDE2, 0x68CD}, //12508 #CJK UNIFIED IDEOGRAPH + {0xCDE3, 0x6EFE}, //12509 #CJK UNIFIED IDEOGRAPH + {0xCDE4, 0x7428}, //12510 #CJK UNIFIED IDEOGRAPH + {0xCDE5, 0x889E}, //12511 #CJK UNIFIED IDEOGRAPH + {0xCDE6, 0x9BE4}, //12512 #CJK UNIFIED IDEOGRAPH + {0xCDE7, 0x6C68}, //12513 #CJK UNIFIED IDEOGRAPH + {0xCDE8, 0xF904}, //12514 #CJK COMPATIBILITY IDEOGRAPH + {0xCDE9, 0x9AA8}, //12515 #CJK UNIFIED IDEOGRAPH + {0xCDEA, 0x4F9B}, //12516 #CJK UNIFIED IDEOGRAPH + {0xCDEB, 0x516C}, //12517 #CJK UNIFIED IDEOGRAPH + {0xCDEC, 0x5171}, //12518 #CJK UNIFIED IDEOGRAPH + {0xCDED, 0x529F}, //12519 #CJK UNIFIED IDEOGRAPH + {0xCDEE, 0x5B54}, //12520 #CJK UNIFIED IDEOGRAPH + {0xCDEF, 0x5DE5}, //12521 #CJK UNIFIED IDEOGRAPH + {0xCDF0, 0x6050}, //12522 #CJK UNIFIED IDEOGRAPH + {0xCDF1, 0x606D}, //12523 #CJK UNIFIED IDEOGRAPH + {0xCDF2, 0x62F1}, //12524 #CJK UNIFIED IDEOGRAPH + {0xCDF3, 0x63A7}, //12525 #CJK UNIFIED IDEOGRAPH + {0xCDF4, 0x653B}, //12526 #CJK UNIFIED IDEOGRAPH + {0xCDF5, 0x73D9}, //12527 #CJK UNIFIED IDEOGRAPH + {0xCDF6, 0x7A7A}, //12528 #CJK UNIFIED IDEOGRAPH + {0xCDF7, 0x86A3}, //12529 #CJK UNIFIED IDEOGRAPH + {0xCDF8, 0x8CA2}, //12530 #CJK UNIFIED IDEOGRAPH + {0xCDF9, 0x978F}, //12531 #CJK UNIFIED IDEOGRAPH + {0xCDFA, 0x4E32}, //12532 #CJK UNIFIED IDEOGRAPH + {0xCDFB, 0x5BE1}, //12533 #CJK UNIFIED IDEOGRAPH + {0xCDFC, 0x6208}, //12534 #CJK UNIFIED IDEOGRAPH + {0xCDFD, 0x679C}, //12535 #CJK UNIFIED IDEOGRAPH + {0xCDFE, 0x74DC}, //12536 #CJK UNIFIED IDEOGRAPH + {0xCEA1, 0x79D1}, //12537 #CJK UNIFIED IDEOGRAPH + {0xCEA2, 0x83D3}, //12538 #CJK UNIFIED IDEOGRAPH + {0xCEA3, 0x8A87}, //12539 #CJK UNIFIED IDEOGRAPH + {0xCEA4, 0x8AB2}, //12540 #CJK UNIFIED IDEOGRAPH + {0xCEA5, 0x8DE8}, //12541 #CJK UNIFIED IDEOGRAPH + {0xCEA6, 0x904E}, //12542 #CJK UNIFIED IDEOGRAPH + {0xCEA7, 0x934B}, //12543 #CJK UNIFIED IDEOGRAPH + {0xCEA8, 0x9846}, //12544 #CJK UNIFIED IDEOGRAPH + {0xCEA9, 0x5ED3}, //12545 #CJK UNIFIED IDEOGRAPH + {0xCEAA, 0x69E8}, //12546 #CJK UNIFIED IDEOGRAPH + {0xCEAB, 0x85FF}, //12547 #CJK UNIFIED IDEOGRAPH + {0xCEAC, 0x90ED}, //12548 #CJK UNIFIED IDEOGRAPH + {0xCEAD, 0xF905}, //12549 #CJK COMPATIBILITY IDEOGRAPH + {0xCEAE, 0x51A0}, //12550 #CJK UNIFIED IDEOGRAPH + {0xCEAF, 0x5B98}, //12551 #CJK UNIFIED IDEOGRAPH + {0xCEB0, 0x5BEC}, //12552 #CJK UNIFIED IDEOGRAPH + {0xCEB1, 0x6163}, //12553 #CJK UNIFIED IDEOGRAPH + {0xCEB2, 0x68FA}, //12554 #CJK UNIFIED IDEOGRAPH + {0xCEB3, 0x6B3E}, //12555 #CJK UNIFIED IDEOGRAPH + {0xCEB4, 0x704C}, //12556 #CJK UNIFIED IDEOGRAPH + {0xCEB5, 0x742F}, //12557 #CJK UNIFIED IDEOGRAPH + {0xCEB6, 0x74D8}, //12558 #CJK UNIFIED IDEOGRAPH + {0xCEB7, 0x7BA1}, //12559 #CJK UNIFIED IDEOGRAPH + {0xCEB8, 0x7F50}, //12560 #CJK UNIFIED IDEOGRAPH + {0xCEB9, 0x83C5}, //12561 #CJK UNIFIED IDEOGRAPH + {0xCEBA, 0x89C0}, //12562 #CJK UNIFIED IDEOGRAPH + {0xCEBB, 0x8CAB}, //12563 #CJK UNIFIED IDEOGRAPH + {0xCEBC, 0x95DC}, //12564 #CJK UNIFIED IDEOGRAPH + {0xCEBD, 0x9928}, //12565 #CJK UNIFIED IDEOGRAPH + {0xCEBE, 0x522E}, //12566 #CJK UNIFIED IDEOGRAPH + {0xCEBF, 0x605D}, //12567 #CJK UNIFIED IDEOGRAPH + {0xCEC0, 0x62EC}, //12568 #CJK UNIFIED IDEOGRAPH + {0xCEC1, 0x9002}, //12569 #CJK UNIFIED IDEOGRAPH + {0xCEC2, 0x4F8A}, //12570 #CJK UNIFIED IDEOGRAPH + {0xCEC3, 0x5149}, //12571 #CJK UNIFIED IDEOGRAPH + {0xCEC4, 0x5321}, //12572 #CJK UNIFIED IDEOGRAPH + {0xCEC5, 0x58D9}, //12573 #CJK UNIFIED IDEOGRAPH + {0xCEC6, 0x5EE3}, //12574 #CJK UNIFIED IDEOGRAPH + {0xCEC7, 0x66E0}, //12575 #CJK UNIFIED IDEOGRAPH + {0xCEC8, 0x6D38}, //12576 #CJK UNIFIED IDEOGRAPH + {0xCEC9, 0x709A}, //12577 #CJK UNIFIED IDEOGRAPH + {0xCECA, 0x72C2}, //12578 #CJK UNIFIED IDEOGRAPH + {0xCECB, 0x73D6}, //12579 #CJK UNIFIED IDEOGRAPH + {0xCECC, 0x7B50}, //12580 #CJK UNIFIED IDEOGRAPH + {0xCECD, 0x80F1}, //12581 #CJK UNIFIED IDEOGRAPH + {0xCECE, 0x945B}, //12582 #CJK UNIFIED IDEOGRAPH + {0xCECF, 0x5366}, //12583 #CJK UNIFIED IDEOGRAPH + {0xCED0, 0x639B}, //12584 #CJK UNIFIED IDEOGRAPH + {0xCED1, 0x7F6B}, //12585 #CJK UNIFIED IDEOGRAPH + {0xCED2, 0x4E56}, //12586 #CJK UNIFIED IDEOGRAPH + {0xCED3, 0x5080}, //12587 #CJK UNIFIED IDEOGRAPH + {0xCED4, 0x584A}, //12588 #CJK UNIFIED IDEOGRAPH + {0xCED5, 0x58DE}, //12589 #CJK UNIFIED IDEOGRAPH + {0xCED6, 0x602A}, //12590 #CJK UNIFIED IDEOGRAPH + {0xCED7, 0x6127}, //12591 #CJK UNIFIED IDEOGRAPH + {0xCED8, 0x62D0}, //12592 #CJK UNIFIED IDEOGRAPH + {0xCED9, 0x69D0}, //12593 #CJK UNIFIED IDEOGRAPH + {0xCEDA, 0x9B41}, //12594 #CJK UNIFIED IDEOGRAPH + {0xCEDB, 0x5B8F}, //12595 #CJK UNIFIED IDEOGRAPH + {0xCEDC, 0x7D18}, //12596 #CJK UNIFIED IDEOGRAPH + {0xCEDD, 0x80B1}, //12597 #CJK UNIFIED IDEOGRAPH + {0xCEDE, 0x8F5F}, //12598 #CJK UNIFIED IDEOGRAPH + {0xCEDF, 0x4EA4}, //12599 #CJK UNIFIED IDEOGRAPH + {0xCEE0, 0x50D1}, //12600 #CJK UNIFIED IDEOGRAPH + {0xCEE1, 0x54AC}, //12601 #CJK UNIFIED IDEOGRAPH + {0xCEE2, 0x55AC}, //12602 #CJK UNIFIED IDEOGRAPH + {0xCEE3, 0x5B0C}, //12603 #CJK UNIFIED IDEOGRAPH + {0xCEE4, 0x5DA0}, //12604 #CJK UNIFIED IDEOGRAPH + {0xCEE5, 0x5DE7}, //12605 #CJK UNIFIED IDEOGRAPH + {0xCEE6, 0x652A}, //12606 #CJK UNIFIED IDEOGRAPH + {0xCEE7, 0x654E}, //12607 #CJK UNIFIED IDEOGRAPH + {0xCEE8, 0x6821}, //12608 #CJK UNIFIED IDEOGRAPH + {0xCEE9, 0x6A4B}, //12609 #CJK UNIFIED IDEOGRAPH + {0xCEEA, 0x72E1}, //12610 #CJK UNIFIED IDEOGRAPH + {0xCEEB, 0x768E}, //12611 #CJK UNIFIED IDEOGRAPH + {0xCEEC, 0x77EF}, //12612 #CJK UNIFIED IDEOGRAPH + {0xCEED, 0x7D5E}, //12613 #CJK UNIFIED IDEOGRAPH + {0xCEEE, 0x7FF9}, //12614 #CJK UNIFIED IDEOGRAPH + {0xCEEF, 0x81A0}, //12615 #CJK UNIFIED IDEOGRAPH + {0xCEF0, 0x854E}, //12616 #CJK UNIFIED IDEOGRAPH + {0xCEF1, 0x86DF}, //12617 #CJK UNIFIED IDEOGRAPH + {0xCEF2, 0x8F03}, //12618 #CJK UNIFIED IDEOGRAPH + {0xCEF3, 0x8F4E}, //12619 #CJK UNIFIED IDEOGRAPH + {0xCEF4, 0x90CA}, //12620 #CJK UNIFIED IDEOGRAPH + {0xCEF5, 0x9903}, //12621 #CJK UNIFIED IDEOGRAPH + {0xCEF6, 0x9A55}, //12622 #CJK UNIFIED IDEOGRAPH + {0xCEF7, 0x9BAB}, //12623 #CJK UNIFIED IDEOGRAPH + {0xCEF8, 0x4E18}, //12624 #CJK UNIFIED IDEOGRAPH + {0xCEF9, 0x4E45}, //12625 #CJK UNIFIED IDEOGRAPH + {0xCEFA, 0x4E5D}, //12626 #CJK UNIFIED IDEOGRAPH + {0xCEFB, 0x4EC7}, //12627 #CJK UNIFIED IDEOGRAPH + {0xCEFC, 0x4FF1}, //12628 #CJK UNIFIED IDEOGRAPH + {0xCEFD, 0x5177}, //12629 #CJK UNIFIED IDEOGRAPH + {0xCEFE, 0x52FE}, //12630 #CJK UNIFIED IDEOGRAPH + {0xCFA1, 0x5340}, //12631 #CJK UNIFIED IDEOGRAPH + {0xCFA2, 0x53E3}, //12632 #CJK UNIFIED IDEOGRAPH + {0xCFA3, 0x53E5}, //12633 #CJK UNIFIED IDEOGRAPH + {0xCFA4, 0x548E}, //12634 #CJK UNIFIED IDEOGRAPH + {0xCFA5, 0x5614}, //12635 #CJK UNIFIED IDEOGRAPH + {0xCFA6, 0x5775}, //12636 #CJK UNIFIED IDEOGRAPH + {0xCFA7, 0x57A2}, //12637 #CJK UNIFIED IDEOGRAPH + {0xCFA8, 0x5BC7}, //12638 #CJK UNIFIED IDEOGRAPH + {0xCFA9, 0x5D87}, //12639 #CJK UNIFIED IDEOGRAPH + {0xCFAA, 0x5ED0}, //12640 #CJK UNIFIED IDEOGRAPH + {0xCFAB, 0x61FC}, //12641 #CJK UNIFIED IDEOGRAPH + {0xCFAC, 0x62D8}, //12642 #CJK UNIFIED IDEOGRAPH + {0xCFAD, 0x6551}, //12643 #CJK UNIFIED IDEOGRAPH + {0xCFAE, 0x67B8}, //12644 #CJK UNIFIED IDEOGRAPH + {0xCFAF, 0x67E9}, //12645 #CJK UNIFIED IDEOGRAPH + {0xCFB0, 0x69CB}, //12646 #CJK UNIFIED IDEOGRAPH + {0xCFB1, 0x6B50}, //12647 #CJK UNIFIED IDEOGRAPH + {0xCFB2, 0x6BC6}, //12648 #CJK UNIFIED IDEOGRAPH + {0xCFB3, 0x6BEC}, //12649 #CJK UNIFIED IDEOGRAPH + {0xCFB4, 0x6C42}, //12650 #CJK UNIFIED IDEOGRAPH + {0xCFB5, 0x6E9D}, //12651 #CJK UNIFIED IDEOGRAPH + {0xCFB6, 0x7078}, //12652 #CJK UNIFIED IDEOGRAPH + {0xCFB7, 0x72D7}, //12653 #CJK UNIFIED IDEOGRAPH + {0xCFB8, 0x7396}, //12654 #CJK UNIFIED IDEOGRAPH + {0xCFB9, 0x7403}, //12655 #CJK UNIFIED IDEOGRAPH + {0xCFBA, 0x77BF}, //12656 #CJK UNIFIED IDEOGRAPH + {0xCFBB, 0x77E9}, //12657 #CJK UNIFIED IDEOGRAPH + {0xCFBC, 0x7A76}, //12658 #CJK UNIFIED IDEOGRAPH + {0xCFBD, 0x7D7F}, //12659 #CJK UNIFIED IDEOGRAPH + {0xCFBE, 0x8009}, //12660 #CJK UNIFIED IDEOGRAPH + {0xCFBF, 0x81FC}, //12661 #CJK UNIFIED IDEOGRAPH + {0xCFC0, 0x8205}, //12662 #CJK UNIFIED IDEOGRAPH + {0xCFC1, 0x820A}, //12663 #CJK UNIFIED IDEOGRAPH + {0xCFC2, 0x82DF}, //12664 #CJK UNIFIED IDEOGRAPH + {0xCFC3, 0x8862}, //12665 #CJK UNIFIED IDEOGRAPH + {0xCFC4, 0x8B33}, //12666 #CJK UNIFIED IDEOGRAPH + {0xCFC5, 0x8CFC}, //12667 #CJK UNIFIED IDEOGRAPH + {0xCFC6, 0x8EC0}, //12668 #CJK UNIFIED IDEOGRAPH + {0xCFC7, 0x9011}, //12669 #CJK UNIFIED IDEOGRAPH + {0xCFC8, 0x90B1}, //12670 #CJK UNIFIED IDEOGRAPH + {0xCFC9, 0x9264}, //12671 #CJK UNIFIED IDEOGRAPH + {0xCFCA, 0x92B6}, //12672 #CJK UNIFIED IDEOGRAPH + {0xCFCB, 0x99D2}, //12673 #CJK UNIFIED IDEOGRAPH + {0xCFCC, 0x9A45}, //12674 #CJK UNIFIED IDEOGRAPH + {0xCFCD, 0x9CE9}, //12675 #CJK UNIFIED IDEOGRAPH + {0xCFCE, 0x9DD7}, //12676 #CJK UNIFIED IDEOGRAPH + {0xCFCF, 0x9F9C}, //12677 #CJK UNIFIED IDEOGRAPH + {0xCFD0, 0x570B}, //12678 #CJK UNIFIED IDEOGRAPH + {0xCFD1, 0x5C40}, //12679 #CJK UNIFIED IDEOGRAPH + {0xCFD2, 0x83CA}, //12680 #CJK UNIFIED IDEOGRAPH + {0xCFD3, 0x97A0}, //12681 #CJK UNIFIED IDEOGRAPH + {0xCFD4, 0x97AB}, //12682 #CJK UNIFIED IDEOGRAPH + {0xCFD5, 0x9EB4}, //12683 #CJK UNIFIED IDEOGRAPH + {0xCFD6, 0x541B}, //12684 #CJK UNIFIED IDEOGRAPH + {0xCFD7, 0x7A98}, //12685 #CJK UNIFIED IDEOGRAPH + {0xCFD8, 0x7FA4}, //12686 #CJK UNIFIED IDEOGRAPH + {0xCFD9, 0x88D9}, //12687 #CJK UNIFIED IDEOGRAPH + {0xCFDA, 0x8ECD}, //12688 #CJK UNIFIED IDEOGRAPH + {0xCFDB, 0x90E1}, //12689 #CJK UNIFIED IDEOGRAPH + {0xCFDC, 0x5800}, //12690 #CJK UNIFIED IDEOGRAPH + {0xCFDD, 0x5C48}, //12691 #CJK UNIFIED IDEOGRAPH + {0xCFDE, 0x6398}, //12692 #CJK UNIFIED IDEOGRAPH + {0xCFDF, 0x7A9F}, //12693 #CJK UNIFIED IDEOGRAPH + {0xCFE0, 0x5BAE}, //12694 #CJK UNIFIED IDEOGRAPH + {0xCFE1, 0x5F13}, //12695 #CJK UNIFIED IDEOGRAPH + {0xCFE2, 0x7A79}, //12696 #CJK UNIFIED IDEOGRAPH + {0xCFE3, 0x7AAE}, //12697 #CJK UNIFIED IDEOGRAPH + {0xCFE4, 0x828E}, //12698 #CJK UNIFIED IDEOGRAPH + {0xCFE5, 0x8EAC}, //12699 #CJK UNIFIED IDEOGRAPH + {0xCFE6, 0x5026}, //12700 #CJK UNIFIED IDEOGRAPH + {0xCFE7, 0x5238}, //12701 #CJK UNIFIED IDEOGRAPH + {0xCFE8, 0x52F8}, //12702 #CJK UNIFIED IDEOGRAPH + {0xCFE9, 0x5377}, //12703 #CJK UNIFIED IDEOGRAPH + {0xCFEA, 0x5708}, //12704 #CJK UNIFIED IDEOGRAPH + {0xCFEB, 0x62F3}, //12705 #CJK UNIFIED IDEOGRAPH + {0xCFEC, 0x6372}, //12706 #CJK UNIFIED IDEOGRAPH + {0xCFED, 0x6B0A}, //12707 #CJK UNIFIED IDEOGRAPH + {0xCFEE, 0x6DC3}, //12708 #CJK UNIFIED IDEOGRAPH + {0xCFEF, 0x7737}, //12709 #CJK UNIFIED IDEOGRAPH + {0xCFF0, 0x53A5}, //12710 #CJK UNIFIED IDEOGRAPH + {0xCFF1, 0x7357}, //12711 #CJK UNIFIED IDEOGRAPH + {0xCFF2, 0x8568}, //12712 #CJK UNIFIED IDEOGRAPH + {0xCFF3, 0x8E76}, //12713 #CJK UNIFIED IDEOGRAPH + {0xCFF4, 0x95D5}, //12714 #CJK UNIFIED IDEOGRAPH + {0xCFF5, 0x673A}, //12715 #CJK UNIFIED IDEOGRAPH + {0xCFF6, 0x6AC3}, //12716 #CJK UNIFIED IDEOGRAPH + {0xCFF7, 0x6F70}, //12717 #CJK UNIFIED IDEOGRAPH + {0xCFF8, 0x8A6D}, //12718 #CJK UNIFIED IDEOGRAPH + {0xCFF9, 0x8ECC}, //12719 #CJK UNIFIED IDEOGRAPH + {0xCFFA, 0x994B}, //12720 #CJK UNIFIED IDEOGRAPH + {0xCFFB, 0xF906}, //12721 #CJK COMPATIBILITY IDEOGRAPH + {0xCFFC, 0x6677}, //12722 #CJK UNIFIED IDEOGRAPH + {0xCFFD, 0x6B78}, //12723 #CJK UNIFIED IDEOGRAPH + {0xCFFE, 0x8CB4}, //12724 #CJK UNIFIED IDEOGRAPH + {0xD0A1, 0x9B3C}, //12725 #CJK UNIFIED IDEOGRAPH + {0xD0A2, 0xF907}, //12726 #CJK COMPATIBILITY IDEOGRAPH + {0xD0A3, 0x53EB}, //12727 #CJK UNIFIED IDEOGRAPH + {0xD0A4, 0x572D}, //12728 #CJK UNIFIED IDEOGRAPH + {0xD0A5, 0x594E}, //12729 #CJK UNIFIED IDEOGRAPH + {0xD0A6, 0x63C6}, //12730 #CJK UNIFIED IDEOGRAPH + {0xD0A7, 0x69FB}, //12731 #CJK UNIFIED IDEOGRAPH + {0xD0A8, 0x73EA}, //12732 #CJK UNIFIED IDEOGRAPH + {0xD0A9, 0x7845}, //12733 #CJK UNIFIED IDEOGRAPH + {0xD0AA, 0x7ABA}, //12734 #CJK UNIFIED IDEOGRAPH + {0xD0AB, 0x7AC5}, //12735 #CJK UNIFIED IDEOGRAPH + {0xD0AC, 0x7CFE}, //12736 #CJK UNIFIED IDEOGRAPH + {0xD0AD, 0x8475}, //12737 #CJK UNIFIED IDEOGRAPH + {0xD0AE, 0x898F}, //12738 #CJK UNIFIED IDEOGRAPH + {0xD0AF, 0x8D73}, //12739 #CJK UNIFIED IDEOGRAPH + {0xD0B0, 0x9035}, //12740 #CJK UNIFIED IDEOGRAPH + {0xD0B1, 0x95A8}, //12741 #CJK UNIFIED IDEOGRAPH + {0xD0B2, 0x52FB}, //12742 #CJK UNIFIED IDEOGRAPH + {0xD0B3, 0x5747}, //12743 #CJK UNIFIED IDEOGRAPH + {0xD0B4, 0x7547}, //12744 #CJK UNIFIED IDEOGRAPH + {0xD0B5, 0x7B60}, //12745 #CJK UNIFIED IDEOGRAPH + {0xD0B6, 0x83CC}, //12746 #CJK UNIFIED IDEOGRAPH + {0xD0B7, 0x921E}, //12747 #CJK UNIFIED IDEOGRAPH + {0xD0B8, 0xF908}, //12748 #CJK COMPATIBILITY IDEOGRAPH + {0xD0B9, 0x6A58}, //12749 #CJK UNIFIED IDEOGRAPH + {0xD0BA, 0x514B}, //12750 #CJK UNIFIED IDEOGRAPH + {0xD0BB, 0x524B}, //12751 #CJK UNIFIED IDEOGRAPH + {0xD0BC, 0x5287}, //12752 #CJK UNIFIED IDEOGRAPH + {0xD0BD, 0x621F}, //12753 #CJK UNIFIED IDEOGRAPH + {0xD0BE, 0x68D8}, //12754 #CJK UNIFIED IDEOGRAPH + {0xD0BF, 0x6975}, //12755 #CJK UNIFIED IDEOGRAPH + {0xD0C0, 0x9699}, //12756 #CJK UNIFIED IDEOGRAPH + {0xD0C1, 0x50C5}, //12757 #CJK UNIFIED IDEOGRAPH + {0xD0C2, 0x52A4}, //12758 #CJK UNIFIED IDEOGRAPH + {0xD0C3, 0x52E4}, //12759 #CJK UNIFIED IDEOGRAPH + {0xD0C4, 0x61C3}, //12760 #CJK UNIFIED IDEOGRAPH + {0xD0C5, 0x65A4}, //12761 #CJK UNIFIED IDEOGRAPH + {0xD0C6, 0x6839}, //12762 #CJK UNIFIED IDEOGRAPH + {0xD0C7, 0x69FF}, //12763 #CJK UNIFIED IDEOGRAPH + {0xD0C8, 0x747E}, //12764 #CJK UNIFIED IDEOGRAPH + {0xD0C9, 0x7B4B}, //12765 #CJK UNIFIED IDEOGRAPH + {0xD0CA, 0x82B9}, //12766 #CJK UNIFIED IDEOGRAPH + {0xD0CB, 0x83EB}, //12767 #CJK UNIFIED IDEOGRAPH + {0xD0CC, 0x89B2}, //12768 #CJK UNIFIED IDEOGRAPH + {0xD0CD, 0x8B39}, //12769 #CJK UNIFIED IDEOGRAPH + {0xD0CE, 0x8FD1}, //12770 #CJK UNIFIED IDEOGRAPH + {0xD0CF, 0x9949}, //12771 #CJK UNIFIED IDEOGRAPH + {0xD0D0, 0xF909}, //12772 #CJK COMPATIBILITY IDEOGRAPH + {0xD0D1, 0x4ECA}, //12773 #CJK UNIFIED IDEOGRAPH + {0xD0D2, 0x5997}, //12774 #CJK UNIFIED IDEOGRAPH + {0xD0D3, 0x64D2}, //12775 #CJK UNIFIED IDEOGRAPH + {0xD0D4, 0x6611}, //12776 #CJK UNIFIED IDEOGRAPH + {0xD0D5, 0x6A8E}, //12777 #CJK UNIFIED IDEOGRAPH + {0xD0D6, 0x7434}, //12778 #CJK UNIFIED IDEOGRAPH + {0xD0D7, 0x7981}, //12779 #CJK UNIFIED IDEOGRAPH + {0xD0D8, 0x79BD}, //12780 #CJK UNIFIED IDEOGRAPH + {0xD0D9, 0x82A9}, //12781 #CJK UNIFIED IDEOGRAPH + {0xD0DA, 0x887E}, //12782 #CJK UNIFIED IDEOGRAPH + {0xD0DB, 0x887F}, //12783 #CJK UNIFIED IDEOGRAPH + {0xD0DC, 0x895F}, //12784 #CJK UNIFIED IDEOGRAPH + {0xD0DD, 0xF90A}, //12785 #CJK COMPATIBILITY IDEOGRAPH + {0xD0DE, 0x9326}, //12786 #CJK UNIFIED IDEOGRAPH + {0xD0DF, 0x4F0B}, //12787 #CJK UNIFIED IDEOGRAPH + {0xD0E0, 0x53CA}, //12788 #CJK UNIFIED IDEOGRAPH + {0xD0E1, 0x6025}, //12789 #CJK UNIFIED IDEOGRAPH + {0xD0E2, 0x6271}, //12790 #CJK UNIFIED IDEOGRAPH + {0xD0E3, 0x6C72}, //12791 #CJK UNIFIED IDEOGRAPH + {0xD0E4, 0x7D1A}, //12792 #CJK UNIFIED IDEOGRAPH + {0xD0E5, 0x7D66}, //12793 #CJK UNIFIED IDEOGRAPH + {0xD0E6, 0x4E98}, //12794 #CJK UNIFIED IDEOGRAPH + {0xD0E7, 0x5162}, //12795 #CJK UNIFIED IDEOGRAPH + {0xD0E8, 0x77DC}, //12796 #CJK UNIFIED IDEOGRAPH + {0xD0E9, 0x80AF}, //12797 #CJK UNIFIED IDEOGRAPH + {0xD0EA, 0x4F01}, //12798 #CJK UNIFIED IDEOGRAPH + {0xD0EB, 0x4F0E}, //12799 #CJK UNIFIED IDEOGRAPH + {0xD0EC, 0x5176}, //12800 #CJK UNIFIED IDEOGRAPH + {0xD0ED, 0x5180}, //12801 #CJK UNIFIED IDEOGRAPH + {0xD0EE, 0x55DC}, //12802 #CJK UNIFIED IDEOGRAPH + {0xD0EF, 0x5668}, //12803 #CJK UNIFIED IDEOGRAPH + {0xD0F0, 0x573B}, //12804 #CJK UNIFIED IDEOGRAPH + {0xD0F1, 0x57FA}, //12805 #CJK UNIFIED IDEOGRAPH + {0xD0F2, 0x57FC}, //12806 #CJK UNIFIED IDEOGRAPH + {0xD0F3, 0x5914}, //12807 #CJK UNIFIED IDEOGRAPH + {0xD0F4, 0x5947}, //12808 #CJK UNIFIED IDEOGRAPH + {0xD0F5, 0x5993}, //12809 #CJK UNIFIED IDEOGRAPH + {0xD0F6, 0x5BC4}, //12810 #CJK UNIFIED IDEOGRAPH + {0xD0F7, 0x5C90}, //12811 #CJK UNIFIED IDEOGRAPH + {0xD0F8, 0x5D0E}, //12812 #CJK UNIFIED IDEOGRAPH + {0xD0F9, 0x5DF1}, //12813 #CJK UNIFIED IDEOGRAPH + {0xD0FA, 0x5E7E}, //12814 #CJK UNIFIED IDEOGRAPH + {0xD0FB, 0x5FCC}, //12815 #CJK UNIFIED IDEOGRAPH + {0xD0FC, 0x6280}, //12816 #CJK UNIFIED IDEOGRAPH + {0xD0FD, 0x65D7}, //12817 #CJK UNIFIED IDEOGRAPH + {0xD0FE, 0x65E3}, //12818 #CJK UNIFIED IDEOGRAPH + {0xD1A1, 0x671E}, //12819 #CJK UNIFIED IDEOGRAPH + {0xD1A2, 0x671F}, //12820 #CJK UNIFIED IDEOGRAPH + {0xD1A3, 0x675E}, //12821 #CJK UNIFIED IDEOGRAPH + {0xD1A4, 0x68CB}, //12822 #CJK UNIFIED IDEOGRAPH + {0xD1A5, 0x68C4}, //12823 #CJK UNIFIED IDEOGRAPH + {0xD1A6, 0x6A5F}, //12824 #CJK UNIFIED IDEOGRAPH + {0xD1A7, 0x6B3A}, //12825 #CJK UNIFIED IDEOGRAPH + {0xD1A8, 0x6C23}, //12826 #CJK UNIFIED IDEOGRAPH + {0xD1A9, 0x6C7D}, //12827 #CJK UNIFIED IDEOGRAPH + {0xD1AA, 0x6C82}, //12828 #CJK UNIFIED IDEOGRAPH + {0xD1AB, 0x6DC7}, //12829 #CJK UNIFIED IDEOGRAPH + {0xD1AC, 0x7398}, //12830 #CJK UNIFIED IDEOGRAPH + {0xD1AD, 0x7426}, //12831 #CJK UNIFIED IDEOGRAPH + {0xD1AE, 0x742A}, //12832 #CJK UNIFIED IDEOGRAPH + {0xD1AF, 0x7482}, //12833 #CJK UNIFIED IDEOGRAPH + {0xD1B0, 0x74A3}, //12834 #CJK UNIFIED IDEOGRAPH + {0xD1B1, 0x7578}, //12835 #CJK UNIFIED IDEOGRAPH + {0xD1B2, 0x757F}, //12836 #CJK UNIFIED IDEOGRAPH + {0xD1B3, 0x7881}, //12837 #CJK UNIFIED IDEOGRAPH + {0xD1B4, 0x78EF}, //12838 #CJK UNIFIED IDEOGRAPH + {0xD1B5, 0x7941}, //12839 #CJK UNIFIED IDEOGRAPH + {0xD1B6, 0x7947}, //12840 #CJK UNIFIED IDEOGRAPH + {0xD1B7, 0x7948}, //12841 #CJK UNIFIED IDEOGRAPH + {0xD1B8, 0x797A}, //12842 #CJK UNIFIED IDEOGRAPH + {0xD1B9, 0x7B95}, //12843 #CJK UNIFIED IDEOGRAPH + {0xD1BA, 0x7D00}, //12844 #CJK UNIFIED IDEOGRAPH + {0xD1BB, 0x7DBA}, //12845 #CJK UNIFIED IDEOGRAPH + {0xD1BC, 0x7F88}, //12846 #CJK UNIFIED IDEOGRAPH + {0xD1BD, 0x8006}, //12847 #CJK UNIFIED IDEOGRAPH + {0xD1BE, 0x802D}, //12848 #CJK UNIFIED IDEOGRAPH + {0xD1BF, 0x808C}, //12849 #CJK UNIFIED IDEOGRAPH + {0xD1C0, 0x8A18}, //12850 #CJK UNIFIED IDEOGRAPH + {0xD1C1, 0x8B4F}, //12851 #CJK UNIFIED IDEOGRAPH + {0xD1C2, 0x8C48}, //12852 #CJK UNIFIED IDEOGRAPH + {0xD1C3, 0x8D77}, //12853 #CJK UNIFIED IDEOGRAPH + {0xD1C4, 0x9321}, //12854 #CJK UNIFIED IDEOGRAPH + {0xD1C5, 0x9324}, //12855 #CJK UNIFIED IDEOGRAPH + {0xD1C6, 0x98E2}, //12856 #CJK UNIFIED IDEOGRAPH + {0xD1C7, 0x9951}, //12857 #CJK UNIFIED IDEOGRAPH + {0xD1C8, 0x9A0E}, //12858 #CJK UNIFIED IDEOGRAPH + {0xD1C9, 0x9A0F}, //12859 #CJK UNIFIED IDEOGRAPH + {0xD1CA, 0x9A65}, //12860 #CJK UNIFIED IDEOGRAPH + {0xD1CB, 0x9E92}, //12861 #CJK UNIFIED IDEOGRAPH + {0xD1CC, 0x7DCA}, //12862 #CJK UNIFIED IDEOGRAPH + {0xD1CD, 0x4F76}, //12863 #CJK UNIFIED IDEOGRAPH + {0xD1CE, 0x5409}, //12864 #CJK UNIFIED IDEOGRAPH + {0xD1CF, 0x62EE}, //12865 #CJK UNIFIED IDEOGRAPH + {0xD1D0, 0x6854}, //12866 #CJK UNIFIED IDEOGRAPH + {0xD1D1, 0x91D1}, //12867 #CJK UNIFIED IDEOGRAPH + {0xD1D2, 0x55AB}, //12868 #CJK UNIFIED IDEOGRAPH + {0xD1D3, 0x513A}, //12869 #CJK UNIFIED IDEOGRAPH + {0xD1D4, 0xF90B}, //12870 #CJK COMPATIBILITY IDEOGRAPH + {0xD1D5, 0xF90C}, //12871 #CJK COMPATIBILITY IDEOGRAPH + {0xD1D6, 0x5A1C}, //12872 #CJK UNIFIED IDEOGRAPH + {0xD1D7, 0x61E6}, //12873 #CJK UNIFIED IDEOGRAPH + {0xD1D8, 0xF90D}, //12874 #CJK COMPATIBILITY IDEOGRAPH + {0xD1D9, 0x62CF}, //12875 #CJK UNIFIED IDEOGRAPH + {0xD1DA, 0x62FF}, //12876 #CJK UNIFIED IDEOGRAPH + {0xD1DB, 0xF90E}, //12877 #CJK COMPATIBILITY IDEOGRAPH + {0xD1DC, 0xF90F}, //12878 #CJK COMPATIBILITY IDEOGRAPH + {0xD1DD, 0xF910}, //12879 #CJK COMPATIBILITY IDEOGRAPH + {0xD1DE, 0xF911}, //12880 #CJK COMPATIBILITY IDEOGRAPH + {0xD1DF, 0xF912}, //12881 #CJK COMPATIBILITY IDEOGRAPH + {0xD1E0, 0xF913}, //12882 #CJK COMPATIBILITY IDEOGRAPH + {0xD1E1, 0x90A3}, //12883 #CJK UNIFIED IDEOGRAPH + {0xD1E2, 0xF914}, //12884 #CJK COMPATIBILITY IDEOGRAPH + {0xD1E3, 0xF915}, //12885 #CJK COMPATIBILITY IDEOGRAPH + {0xD1E4, 0xF916}, //12886 #CJK COMPATIBILITY IDEOGRAPH + {0xD1E5, 0xF917}, //12887 #CJK COMPATIBILITY IDEOGRAPH + {0xD1E6, 0xF918}, //12888 #CJK COMPATIBILITY IDEOGRAPH + {0xD1E7, 0x8AFE}, //12889 #CJK UNIFIED IDEOGRAPH + {0xD1E8, 0xF919}, //12890 #CJK COMPATIBILITY IDEOGRAPH + {0xD1E9, 0xF91A}, //12891 #CJK COMPATIBILITY IDEOGRAPH + {0xD1EA, 0xF91B}, //12892 #CJK COMPATIBILITY IDEOGRAPH + {0xD1EB, 0xF91C}, //12893 #CJK COMPATIBILITY IDEOGRAPH + {0xD1EC, 0x6696}, //12894 #CJK UNIFIED IDEOGRAPH + {0xD1ED, 0xF91D}, //12895 #CJK COMPATIBILITY IDEOGRAPH + {0xD1EE, 0x7156}, //12896 #CJK UNIFIED IDEOGRAPH + {0xD1EF, 0xF91E}, //12897 #CJK COMPATIBILITY IDEOGRAPH + {0xD1F0, 0xF91F}, //12898 #CJK COMPATIBILITY IDEOGRAPH + {0xD1F1, 0x96E3}, //12899 #CJK UNIFIED IDEOGRAPH + {0xD1F2, 0xF920}, //12900 #CJK COMPATIBILITY IDEOGRAPH + {0xD1F3, 0x634F}, //12901 #CJK UNIFIED IDEOGRAPH + {0xD1F4, 0x637A}, //12902 #CJK UNIFIED IDEOGRAPH + {0xD1F5, 0x5357}, //12903 #CJK UNIFIED IDEOGRAPH + {0xD1F6, 0xF921}, //12904 #CJK COMPATIBILITY IDEOGRAPH + {0xD1F7, 0x678F}, //12905 #CJK UNIFIED IDEOGRAPH + {0xD1F8, 0x6960}, //12906 #CJK UNIFIED IDEOGRAPH + {0xD1F9, 0x6E73}, //12907 #CJK UNIFIED IDEOGRAPH + {0xD1FA, 0xF922}, //12908 #CJK COMPATIBILITY IDEOGRAPH + {0xD1FB, 0x7537}, //12909 #CJK UNIFIED IDEOGRAPH + {0xD1FC, 0xF923}, //12910 #CJK COMPATIBILITY IDEOGRAPH + {0xD1FD, 0xF924}, //12911 #CJK COMPATIBILITY IDEOGRAPH + {0xD1FE, 0xF925}, //12912 #CJK COMPATIBILITY IDEOGRAPH + {0xD2A1, 0x7D0D}, //12913 #CJK UNIFIED IDEOGRAPH + {0xD2A2, 0xF926}, //12914 #CJK COMPATIBILITY IDEOGRAPH + {0xD2A3, 0xF927}, //12915 #CJK COMPATIBILITY IDEOGRAPH + {0xD2A4, 0x8872}, //12916 #CJK UNIFIED IDEOGRAPH + {0xD2A5, 0x56CA}, //12917 #CJK UNIFIED IDEOGRAPH + {0xD2A6, 0x5A18}, //12918 #CJK UNIFIED IDEOGRAPH + {0xD2A7, 0xF928}, //12919 #CJK COMPATIBILITY IDEOGRAPH + {0xD2A8, 0xF929}, //12920 #CJK COMPATIBILITY IDEOGRAPH + {0xD2A9, 0xF92A}, //12921 #CJK COMPATIBILITY IDEOGRAPH + {0xD2AA, 0xF92B}, //12922 #CJK COMPATIBILITY IDEOGRAPH + {0xD2AB, 0xF92C}, //12923 #CJK COMPATIBILITY IDEOGRAPH + {0xD2AC, 0x4E43}, //12924 #CJK UNIFIED IDEOGRAPH + {0xD2AD, 0xF92D}, //12925 #CJK COMPATIBILITY IDEOGRAPH + {0xD2AE, 0x5167}, //12926 #CJK UNIFIED IDEOGRAPH + {0xD2AF, 0x5948}, //12927 #CJK UNIFIED IDEOGRAPH + {0xD2B0, 0x67F0}, //12928 #CJK UNIFIED IDEOGRAPH + {0xD2B1, 0x8010}, //12929 #CJK UNIFIED IDEOGRAPH + {0xD2B2, 0xF92E}, //12930 #CJK COMPATIBILITY IDEOGRAPH + {0xD2B3, 0x5973}, //12931 #CJK UNIFIED IDEOGRAPH + {0xD2B4, 0x5E74}, //12932 #CJK UNIFIED IDEOGRAPH + {0xD2B5, 0x649A}, //12933 #CJK UNIFIED IDEOGRAPH + {0xD2B6, 0x79CA}, //12934 #CJK UNIFIED IDEOGRAPH + {0xD2B7, 0x5FF5}, //12935 #CJK UNIFIED IDEOGRAPH + {0xD2B8, 0x606C}, //12936 #CJK UNIFIED IDEOGRAPH + {0xD2B9, 0x62C8}, //12937 #CJK UNIFIED IDEOGRAPH + {0xD2BA, 0x637B}, //12938 #CJK UNIFIED IDEOGRAPH + {0xD2BB, 0x5BE7}, //12939 #CJK UNIFIED IDEOGRAPH + {0xD2BC, 0x5BD7}, //12940 #CJK UNIFIED IDEOGRAPH + {0xD2BD, 0x52AA}, //12941 #CJK UNIFIED IDEOGRAPH + {0xD2BE, 0xF92F}, //12942 #CJK COMPATIBILITY IDEOGRAPH + {0xD2BF, 0x5974}, //12943 #CJK UNIFIED IDEOGRAPH + {0xD2C0, 0x5F29}, //12944 #CJK UNIFIED IDEOGRAPH + {0xD2C1, 0x6012}, //12945 #CJK UNIFIED IDEOGRAPH + {0xD2C2, 0xF930}, //12946 #CJK COMPATIBILITY IDEOGRAPH + {0xD2C3, 0xF931}, //12947 #CJK COMPATIBILITY IDEOGRAPH + {0xD2C4, 0xF932}, //12948 #CJK COMPATIBILITY IDEOGRAPH + {0xD2C5, 0x7459}, //12949 #CJK UNIFIED IDEOGRAPH + {0xD2C6, 0xF933}, //12950 #CJK COMPATIBILITY IDEOGRAPH + {0xD2C7, 0xF934}, //12951 #CJK COMPATIBILITY IDEOGRAPH + {0xD2C8, 0xF935}, //12952 #CJK COMPATIBILITY IDEOGRAPH + {0xD2C9, 0xF936}, //12953 #CJK COMPATIBILITY IDEOGRAPH + {0xD2CA, 0xF937}, //12954 #CJK COMPATIBILITY IDEOGRAPH + {0xD2CB, 0xF938}, //12955 #CJK COMPATIBILITY IDEOGRAPH + {0xD2CC, 0x99D1}, //12956 #CJK UNIFIED IDEOGRAPH + {0xD2CD, 0xF939}, //12957 #CJK COMPATIBILITY IDEOGRAPH + {0xD2CE, 0xF93A}, //12958 #CJK COMPATIBILITY IDEOGRAPH + {0xD2CF, 0xF93B}, //12959 #CJK COMPATIBILITY IDEOGRAPH + {0xD2D0, 0xF93C}, //12960 #CJK COMPATIBILITY IDEOGRAPH + {0xD2D1, 0xF93D}, //12961 #CJK COMPATIBILITY IDEOGRAPH + {0xD2D2, 0xF93E}, //12962 #CJK COMPATIBILITY IDEOGRAPH + {0xD2D3, 0xF93F}, //12963 #CJK COMPATIBILITY IDEOGRAPH + {0xD2D4, 0xF940}, //12964 #CJK COMPATIBILITY IDEOGRAPH + {0xD2D5, 0xF941}, //12965 #CJK COMPATIBILITY IDEOGRAPH + {0xD2D6, 0xF942}, //12966 #CJK COMPATIBILITY IDEOGRAPH + {0xD2D7, 0xF943}, //12967 #CJK COMPATIBILITY IDEOGRAPH + {0xD2D8, 0x6FC3}, //12968 #CJK UNIFIED IDEOGRAPH + {0xD2D9, 0xF944}, //12969 #CJK COMPATIBILITY IDEOGRAPH + {0xD2DA, 0xF945}, //12970 #CJK COMPATIBILITY IDEOGRAPH + {0xD2DB, 0x81BF}, //12971 #CJK UNIFIED IDEOGRAPH + {0xD2DC, 0x8FB2}, //12972 #CJK UNIFIED IDEOGRAPH + {0xD2DD, 0x60F1}, //12973 #CJK UNIFIED IDEOGRAPH + {0xD2DE, 0xF946}, //12974 #CJK COMPATIBILITY IDEOGRAPH + {0xD2DF, 0xF947}, //12975 #CJK COMPATIBILITY IDEOGRAPH + {0xD2E0, 0x8166}, //12976 #CJK UNIFIED IDEOGRAPH + {0xD2E1, 0xF948}, //12977 #CJK COMPATIBILITY IDEOGRAPH + {0xD2E2, 0xF949}, //12978 #CJK COMPATIBILITY IDEOGRAPH + {0xD2E3, 0x5C3F}, //12979 #CJK UNIFIED IDEOGRAPH + {0xD2E4, 0xF94A}, //12980 #CJK COMPATIBILITY IDEOGRAPH + {0xD2E5, 0xF94B}, //12981 #CJK COMPATIBILITY IDEOGRAPH + {0xD2E6, 0xF94C}, //12982 #CJK COMPATIBILITY IDEOGRAPH + {0xD2E7, 0xF94D}, //12983 #CJK COMPATIBILITY IDEOGRAPH + {0xD2E8, 0xF94E}, //12984 #CJK COMPATIBILITY IDEOGRAPH + {0xD2E9, 0xF94F}, //12985 #CJK COMPATIBILITY IDEOGRAPH + {0xD2EA, 0xF950}, //12986 #CJK COMPATIBILITY IDEOGRAPH + {0xD2EB, 0xF951}, //12987 #CJK COMPATIBILITY IDEOGRAPH + {0xD2EC, 0x5AE9}, //12988 #CJK UNIFIED IDEOGRAPH + {0xD2ED, 0x8A25}, //12989 #CJK UNIFIED IDEOGRAPH + {0xD2EE, 0x677B}, //12990 #CJK UNIFIED IDEOGRAPH + {0xD2EF, 0x7D10}, //12991 #CJK UNIFIED IDEOGRAPH + {0xD2F0, 0xF952}, //12992 #CJK COMPATIBILITY IDEOGRAPH + {0xD2F1, 0xF953}, //12993 #CJK COMPATIBILITY IDEOGRAPH + {0xD2F2, 0xF954}, //12994 #CJK COMPATIBILITY IDEOGRAPH + {0xD2F3, 0xF955}, //12995 #CJK COMPATIBILITY IDEOGRAPH + {0xD2F4, 0xF956}, //12996 #CJK COMPATIBILITY IDEOGRAPH + {0xD2F5, 0xF957}, //12997 #CJK COMPATIBILITY IDEOGRAPH + {0xD2F6, 0x80FD}, //12998 #CJK UNIFIED IDEOGRAPH + {0xD2F7, 0xF958}, //12999 #CJK COMPATIBILITY IDEOGRAPH + {0xD2F8, 0xF959}, //13000 #CJK COMPATIBILITY IDEOGRAPH + {0xD2F9, 0x5C3C}, //13001 #CJK UNIFIED IDEOGRAPH + {0xD2FA, 0x6CE5}, //13002 #CJK UNIFIED IDEOGRAPH + {0xD2FB, 0x533F}, //13003 #CJK UNIFIED IDEOGRAPH + {0xD2FC, 0x6EBA}, //13004 #CJK UNIFIED IDEOGRAPH + {0xD2FD, 0x591A}, //13005 #CJK UNIFIED IDEOGRAPH + {0xD2FE, 0x8336}, //13006 #CJK UNIFIED IDEOGRAPH + {0xD3A1, 0x4E39}, //13007 #CJK UNIFIED IDEOGRAPH + {0xD3A2, 0x4EB6}, //13008 #CJK UNIFIED IDEOGRAPH + {0xD3A3, 0x4F46}, //13009 #CJK UNIFIED IDEOGRAPH + {0xD3A4, 0x55AE}, //13010 #CJK UNIFIED IDEOGRAPH + {0xD3A5, 0x5718}, //13011 #CJK UNIFIED IDEOGRAPH + {0xD3A6, 0x58C7}, //13012 #CJK UNIFIED IDEOGRAPH + {0xD3A7, 0x5F56}, //13013 #CJK UNIFIED IDEOGRAPH + {0xD3A8, 0x65B7}, //13014 #CJK UNIFIED IDEOGRAPH + {0xD3A9, 0x65E6}, //13015 #CJK UNIFIED IDEOGRAPH + {0xD3AA, 0x6A80}, //13016 #CJK UNIFIED IDEOGRAPH + {0xD3AB, 0x6BB5}, //13017 #CJK UNIFIED IDEOGRAPH + {0xD3AC, 0x6E4D}, //13018 #CJK UNIFIED IDEOGRAPH + {0xD3AD, 0x77ED}, //13019 #CJK UNIFIED IDEOGRAPH + {0xD3AE, 0x7AEF}, //13020 #CJK UNIFIED IDEOGRAPH + {0xD3AF, 0x7C1E}, //13021 #CJK UNIFIED IDEOGRAPH + {0xD3B0, 0x7DDE}, //13022 #CJK UNIFIED IDEOGRAPH + {0xD3B1, 0x86CB}, //13023 #CJK UNIFIED IDEOGRAPH + {0xD3B2, 0x8892}, //13024 #CJK UNIFIED IDEOGRAPH + {0xD3B3, 0x9132}, //13025 #CJK UNIFIED IDEOGRAPH + {0xD3B4, 0x935B}, //13026 #CJK UNIFIED IDEOGRAPH + {0xD3B5, 0x64BB}, //13027 #CJK UNIFIED IDEOGRAPH + {0xD3B6, 0x6FBE}, //13028 #CJK UNIFIED IDEOGRAPH + {0xD3B7, 0x737A}, //13029 #CJK UNIFIED IDEOGRAPH + {0xD3B8, 0x75B8}, //13030 #CJK UNIFIED IDEOGRAPH + {0xD3B9, 0x9054}, //13031 #CJK UNIFIED IDEOGRAPH + {0xD3BA, 0x5556}, //13032 #CJK UNIFIED IDEOGRAPH + {0xD3BB, 0x574D}, //13033 #CJK UNIFIED IDEOGRAPH + {0xD3BC, 0x61BA}, //13034 #CJK UNIFIED IDEOGRAPH + {0xD3BD, 0x64D4}, //13035 #CJK UNIFIED IDEOGRAPH + {0xD3BE, 0x66C7}, //13036 #CJK UNIFIED IDEOGRAPH + {0xD3BF, 0x6DE1}, //13037 #CJK UNIFIED IDEOGRAPH + {0xD3C0, 0x6E5B}, //13038 #CJK UNIFIED IDEOGRAPH + {0xD3C1, 0x6F6D}, //13039 #CJK UNIFIED IDEOGRAPH + {0xD3C2, 0x6FB9}, //13040 #CJK UNIFIED IDEOGRAPH + {0xD3C3, 0x75F0}, //13041 #CJK UNIFIED IDEOGRAPH + {0xD3C4, 0x8043}, //13042 #CJK UNIFIED IDEOGRAPH + {0xD3C5, 0x81BD}, //13043 #CJK UNIFIED IDEOGRAPH + {0xD3C6, 0x8541}, //13044 #CJK UNIFIED IDEOGRAPH + {0xD3C7, 0x8983}, //13045 #CJK UNIFIED IDEOGRAPH + {0xD3C8, 0x8AC7}, //13046 #CJK UNIFIED IDEOGRAPH + {0xD3C9, 0x8B5A}, //13047 #CJK UNIFIED IDEOGRAPH + {0xD3CA, 0x931F}, //13048 #CJK UNIFIED IDEOGRAPH + {0xD3CB, 0x6C93}, //13049 #CJK UNIFIED IDEOGRAPH + {0xD3CC, 0x7553}, //13050 #CJK UNIFIED IDEOGRAPH + {0xD3CD, 0x7B54}, //13051 #CJK UNIFIED IDEOGRAPH + {0xD3CE, 0x8E0F}, //13052 #CJK UNIFIED IDEOGRAPH + {0xD3CF, 0x905D}, //13053 #CJK UNIFIED IDEOGRAPH + {0xD3D0, 0x5510}, //13054 #CJK UNIFIED IDEOGRAPH + {0xD3D1, 0x5802}, //13055 #CJK UNIFIED IDEOGRAPH + {0xD3D2, 0x5858}, //13056 #CJK UNIFIED IDEOGRAPH + {0xD3D3, 0x5E62}, //13057 #CJK UNIFIED IDEOGRAPH + {0xD3D4, 0x6207}, //13058 #CJK UNIFIED IDEOGRAPH + {0xD3D5, 0x649E}, //13059 #CJK UNIFIED IDEOGRAPH + {0xD3D6, 0x68E0}, //13060 #CJK UNIFIED IDEOGRAPH + {0xD3D7, 0x7576}, //13061 #CJK UNIFIED IDEOGRAPH + {0xD3D8, 0x7CD6}, //13062 #CJK UNIFIED IDEOGRAPH + {0xD3D9, 0x87B3}, //13063 #CJK UNIFIED IDEOGRAPH + {0xD3DA, 0x9EE8}, //13064 #CJK UNIFIED IDEOGRAPH + {0xD3DB, 0x4EE3}, //13065 #CJK UNIFIED IDEOGRAPH + {0xD3DC, 0x5788}, //13066 #CJK UNIFIED IDEOGRAPH + {0xD3DD, 0x576E}, //13067 #CJK UNIFIED IDEOGRAPH + {0xD3DE, 0x5927}, //13068 #CJK UNIFIED IDEOGRAPH + {0xD3DF, 0x5C0D}, //13069 #CJK UNIFIED IDEOGRAPH + {0xD3E0, 0x5CB1}, //13070 #CJK UNIFIED IDEOGRAPH + {0xD3E1, 0x5E36}, //13071 #CJK UNIFIED IDEOGRAPH + {0xD3E2, 0x5F85}, //13072 #CJK UNIFIED IDEOGRAPH + {0xD3E3, 0x6234}, //13073 #CJK UNIFIED IDEOGRAPH + {0xD3E4, 0x64E1}, //13074 #CJK UNIFIED IDEOGRAPH + {0xD3E5, 0x73B3}, //13075 #CJK UNIFIED IDEOGRAPH + {0xD3E6, 0x81FA}, //13076 #CJK UNIFIED IDEOGRAPH + {0xD3E7, 0x888B}, //13077 #CJK UNIFIED IDEOGRAPH + {0xD3E8, 0x8CB8}, //13078 #CJK UNIFIED IDEOGRAPH + {0xD3E9, 0x968A}, //13079 #CJK UNIFIED IDEOGRAPH + {0xD3EA, 0x9EDB}, //13080 #CJK UNIFIED IDEOGRAPH + {0xD3EB, 0x5B85}, //13081 #CJK UNIFIED IDEOGRAPH + {0xD3EC, 0x5FB7}, //13082 #CJK UNIFIED IDEOGRAPH + {0xD3ED, 0x60B3}, //13083 #CJK UNIFIED IDEOGRAPH + {0xD3EE, 0x5012}, //13084 #CJK UNIFIED IDEOGRAPH + {0xD3EF, 0x5200}, //13085 #CJK UNIFIED IDEOGRAPH + {0xD3F0, 0x5230}, //13086 #CJK UNIFIED IDEOGRAPH + {0xD3F1, 0x5716}, //13087 #CJK UNIFIED IDEOGRAPH + {0xD3F2, 0x5835}, //13088 #CJK UNIFIED IDEOGRAPH + {0xD3F3, 0x5857}, //13089 #CJK UNIFIED IDEOGRAPH + {0xD3F4, 0x5C0E}, //13090 #CJK UNIFIED IDEOGRAPH + {0xD3F5, 0x5C60}, //13091 #CJK UNIFIED IDEOGRAPH + {0xD3F6, 0x5CF6}, //13092 #CJK UNIFIED IDEOGRAPH + {0xD3F7, 0x5D8B}, //13093 #CJK UNIFIED IDEOGRAPH + {0xD3F8, 0x5EA6}, //13094 #CJK UNIFIED IDEOGRAPH + {0xD3F9, 0x5F92}, //13095 #CJK UNIFIED IDEOGRAPH + {0xD3FA, 0x60BC}, //13096 #CJK UNIFIED IDEOGRAPH + {0xD3FB, 0x6311}, //13097 #CJK UNIFIED IDEOGRAPH + {0xD3FC, 0x6389}, //13098 #CJK UNIFIED IDEOGRAPH + {0xD3FD, 0x6417}, //13099 #CJK UNIFIED IDEOGRAPH + {0xD3FE, 0x6843}, //13100 #CJK UNIFIED IDEOGRAPH + {0xD4A1, 0x68F9}, //13101 #CJK UNIFIED IDEOGRAPH + {0xD4A2, 0x6AC2}, //13102 #CJK UNIFIED IDEOGRAPH + {0xD4A3, 0x6DD8}, //13103 #CJK UNIFIED IDEOGRAPH + {0xD4A4, 0x6E21}, //13104 #CJK UNIFIED IDEOGRAPH + {0xD4A5, 0x6ED4}, //13105 #CJK UNIFIED IDEOGRAPH + {0xD4A6, 0x6FE4}, //13106 #CJK UNIFIED IDEOGRAPH + {0xD4A7, 0x71FE}, //13107 #CJK UNIFIED IDEOGRAPH + {0xD4A8, 0x76DC}, //13108 #CJK UNIFIED IDEOGRAPH + {0xD4A9, 0x7779}, //13109 #CJK UNIFIED IDEOGRAPH + {0xD4AA, 0x79B1}, //13110 #CJK UNIFIED IDEOGRAPH + {0xD4AB, 0x7A3B}, //13111 #CJK UNIFIED IDEOGRAPH + {0xD4AC, 0x8404}, //13112 #CJK UNIFIED IDEOGRAPH + {0xD4AD, 0x89A9}, //13113 #CJK UNIFIED IDEOGRAPH + {0xD4AE, 0x8CED}, //13114 #CJK UNIFIED IDEOGRAPH + {0xD4AF, 0x8DF3}, //13115 #CJK UNIFIED IDEOGRAPH + {0xD4B0, 0x8E48}, //13116 #CJK UNIFIED IDEOGRAPH + {0xD4B1, 0x9003}, //13117 #CJK UNIFIED IDEOGRAPH + {0xD4B2, 0x9014}, //13118 #CJK UNIFIED IDEOGRAPH + {0xD4B3, 0x9053}, //13119 #CJK UNIFIED IDEOGRAPH + {0xD4B4, 0x90FD}, //13120 #CJK UNIFIED IDEOGRAPH + {0xD4B5, 0x934D}, //13121 #CJK UNIFIED IDEOGRAPH + {0xD4B6, 0x9676}, //13122 #CJK UNIFIED IDEOGRAPH + {0xD4B7, 0x97DC}, //13123 #CJK UNIFIED IDEOGRAPH + {0xD4B8, 0x6BD2}, //13124 #CJK UNIFIED IDEOGRAPH + {0xD4B9, 0x7006}, //13125 #CJK UNIFIED IDEOGRAPH + {0xD4BA, 0x7258}, //13126 #CJK UNIFIED IDEOGRAPH + {0xD4BB, 0x72A2}, //13127 #CJK UNIFIED IDEOGRAPH + {0xD4BC, 0x7368}, //13128 #CJK UNIFIED IDEOGRAPH + {0xD4BD, 0x7763}, //13129 #CJK UNIFIED IDEOGRAPH + {0xD4BE, 0x79BF}, //13130 #CJK UNIFIED IDEOGRAPH + {0xD4BF, 0x7BE4}, //13131 #CJK UNIFIED IDEOGRAPH + {0xD4C0, 0x7E9B}, //13132 #CJK UNIFIED IDEOGRAPH + {0xD4C1, 0x8B80}, //13133 #CJK UNIFIED IDEOGRAPH + {0xD4C2, 0x58A9}, //13134 #CJK UNIFIED IDEOGRAPH + {0xD4C3, 0x60C7}, //13135 #CJK UNIFIED IDEOGRAPH + {0xD4C4, 0x6566}, //13136 #CJK UNIFIED IDEOGRAPH + {0xD4C5, 0x65FD}, //13137 #CJK UNIFIED IDEOGRAPH + {0xD4C6, 0x66BE}, //13138 #CJK UNIFIED IDEOGRAPH + {0xD4C7, 0x6C8C}, //13139 #CJK UNIFIED IDEOGRAPH + {0xD4C8, 0x711E}, //13140 #CJK UNIFIED IDEOGRAPH + {0xD4C9, 0x71C9}, //13141 #CJK UNIFIED IDEOGRAPH + {0xD4CA, 0x8C5A}, //13142 #CJK UNIFIED IDEOGRAPH + {0xD4CB, 0x9813}, //13143 #CJK UNIFIED IDEOGRAPH + {0xD4CC, 0x4E6D}, //13144 #CJK UNIFIED IDEOGRAPH + {0xD4CD, 0x7A81}, //13145 #CJK UNIFIED IDEOGRAPH + {0xD4CE, 0x4EDD}, //13146 #CJK UNIFIED IDEOGRAPH + {0xD4CF, 0x51AC}, //13147 #CJK UNIFIED IDEOGRAPH + {0xD4D0, 0x51CD}, //13148 #CJK UNIFIED IDEOGRAPH + {0xD4D1, 0x52D5}, //13149 #CJK UNIFIED IDEOGRAPH + {0xD4D2, 0x540C}, //13150 #CJK UNIFIED IDEOGRAPH + {0xD4D3, 0x61A7}, //13151 #CJK UNIFIED IDEOGRAPH + {0xD4D4, 0x6771}, //13152 #CJK UNIFIED IDEOGRAPH + {0xD4D5, 0x6850}, //13153 #CJK UNIFIED IDEOGRAPH + {0xD4D6, 0x68DF}, //13154 #CJK UNIFIED IDEOGRAPH + {0xD4D7, 0x6D1E}, //13155 #CJK UNIFIED IDEOGRAPH + {0xD4D8, 0x6F7C}, //13156 #CJK UNIFIED IDEOGRAPH + {0xD4D9, 0x75BC}, //13157 #CJK UNIFIED IDEOGRAPH + {0xD4DA, 0x77B3}, //13158 #CJK UNIFIED IDEOGRAPH + {0xD4DB, 0x7AE5}, //13159 #CJK UNIFIED IDEOGRAPH + {0xD4DC, 0x80F4}, //13160 #CJK UNIFIED IDEOGRAPH + {0xD4DD, 0x8463}, //13161 #CJK UNIFIED IDEOGRAPH + {0xD4DE, 0x9285}, //13162 #CJK UNIFIED IDEOGRAPH + {0xD4DF, 0x515C}, //13163 #CJK UNIFIED IDEOGRAPH + {0xD4E0, 0x6597}, //13164 #CJK UNIFIED IDEOGRAPH + {0xD4E1, 0x675C}, //13165 #CJK UNIFIED IDEOGRAPH + {0xD4E2, 0x6793}, //13166 #CJK UNIFIED IDEOGRAPH + {0xD4E3, 0x75D8}, //13167 #CJK UNIFIED IDEOGRAPH + {0xD4E4, 0x7AC7}, //13168 #CJK UNIFIED IDEOGRAPH + {0xD4E5, 0x8373}, //13169 #CJK UNIFIED IDEOGRAPH + {0xD4E6, 0xF95A}, //13170 #CJK COMPATIBILITY IDEOGRAPH + {0xD4E7, 0x8C46}, //13171 #CJK UNIFIED IDEOGRAPH + {0xD4E8, 0x9017}, //13172 #CJK UNIFIED IDEOGRAPH + {0xD4E9, 0x982D}, //13173 #CJK UNIFIED IDEOGRAPH + {0xD4EA, 0x5C6F}, //13174 #CJK UNIFIED IDEOGRAPH + {0xD4EB, 0x81C0}, //13175 #CJK UNIFIED IDEOGRAPH + {0xD4EC, 0x829A}, //13176 #CJK UNIFIED IDEOGRAPH + {0xD4ED, 0x9041}, //13177 #CJK UNIFIED IDEOGRAPH + {0xD4EE, 0x906F}, //13178 #CJK UNIFIED IDEOGRAPH + {0xD4EF, 0x920D}, //13179 #CJK UNIFIED IDEOGRAPH + {0xD4F0, 0x5F97}, //13180 #CJK UNIFIED IDEOGRAPH + {0xD4F1, 0x5D9D}, //13181 #CJK UNIFIED IDEOGRAPH + {0xD4F2, 0x6A59}, //13182 #CJK UNIFIED IDEOGRAPH + {0xD4F3, 0x71C8}, //13183 #CJK UNIFIED IDEOGRAPH + {0xD4F4, 0x767B}, //13184 #CJK UNIFIED IDEOGRAPH + {0xD4F5, 0x7B49}, //13185 #CJK UNIFIED IDEOGRAPH + {0xD4F6, 0x85E4}, //13186 #CJK UNIFIED IDEOGRAPH + {0xD4F7, 0x8B04}, //13187 #CJK UNIFIED IDEOGRAPH + {0xD4F8, 0x9127}, //13188 #CJK UNIFIED IDEOGRAPH + {0xD4F9, 0x9A30}, //13189 #CJK UNIFIED IDEOGRAPH + {0xD4FA, 0x5587}, //13190 #CJK UNIFIED IDEOGRAPH + {0xD4FB, 0x61F6}, //13191 #CJK UNIFIED IDEOGRAPH + {0xD4FC, 0xF95B}, //13192 #CJK COMPATIBILITY IDEOGRAPH + {0xD4FD, 0x7669}, //13193 #CJK UNIFIED IDEOGRAPH + {0xD4FE, 0x7F85}, //13194 #CJK UNIFIED IDEOGRAPH + {0xD5A1, 0x863F}, //13195 #CJK UNIFIED IDEOGRAPH + {0xD5A2, 0x87BA}, //13196 #CJK UNIFIED IDEOGRAPH + {0xD5A3, 0x88F8}, //13197 #CJK UNIFIED IDEOGRAPH + {0xD5A4, 0x908F}, //13198 #CJK UNIFIED IDEOGRAPH + {0xD5A5, 0xF95C}, //13199 #CJK COMPATIBILITY IDEOGRAPH + {0xD5A6, 0x6D1B}, //13200 #CJK UNIFIED IDEOGRAPH + {0xD5A7, 0x70D9}, //13201 #CJK UNIFIED IDEOGRAPH + {0xD5A8, 0x73DE}, //13202 #CJK UNIFIED IDEOGRAPH + {0xD5A9, 0x7D61}, //13203 #CJK UNIFIED IDEOGRAPH + {0xD5AA, 0x843D}, //13204 #CJK UNIFIED IDEOGRAPH + {0xD5AB, 0xF95D}, //13205 #CJK COMPATIBILITY IDEOGRAPH + {0xD5AC, 0x916A}, //13206 #CJK UNIFIED IDEOGRAPH + {0xD5AD, 0x99F1}, //13207 #CJK UNIFIED IDEOGRAPH + {0xD5AE, 0xF95E}, //13208 #CJK COMPATIBILITY IDEOGRAPH + {0xD5AF, 0x4E82}, //13209 #CJK UNIFIED IDEOGRAPH + {0xD5B0, 0x5375}, //13210 #CJK UNIFIED IDEOGRAPH + {0xD5B1, 0x6B04}, //13211 #CJK UNIFIED IDEOGRAPH + {0xD5B2, 0x6B12}, //13212 #CJK UNIFIED IDEOGRAPH + {0xD5B3, 0x703E}, //13213 #CJK UNIFIED IDEOGRAPH + {0xD5B4, 0x721B}, //13214 #CJK UNIFIED IDEOGRAPH + {0xD5B5, 0x862D}, //13215 #CJK UNIFIED IDEOGRAPH + {0xD5B6, 0x9E1E}, //13216 #CJK UNIFIED IDEOGRAPH + {0xD5B7, 0x524C}, //13217 #CJK UNIFIED IDEOGRAPH + {0xD5B8, 0x8FA3}, //13218 #CJK UNIFIED IDEOGRAPH + {0xD5B9, 0x5D50}, //13219 #CJK UNIFIED IDEOGRAPH + {0xD5BA, 0x64E5}, //13220 #CJK UNIFIED IDEOGRAPH + {0xD5BB, 0x652C}, //13221 #CJK UNIFIED IDEOGRAPH + {0xD5BC, 0x6B16}, //13222 #CJK UNIFIED IDEOGRAPH + {0xD5BD, 0x6FEB}, //13223 #CJK UNIFIED IDEOGRAPH + {0xD5BE, 0x7C43}, //13224 #CJK UNIFIED IDEOGRAPH + {0xD5BF, 0x7E9C}, //13225 #CJK UNIFIED IDEOGRAPH + {0xD5C0, 0x85CD}, //13226 #CJK UNIFIED IDEOGRAPH + {0xD5C1, 0x8964}, //13227 #CJK UNIFIED IDEOGRAPH + {0xD5C2, 0x89BD}, //13228 #CJK UNIFIED IDEOGRAPH + {0xD5C3, 0x62C9}, //13229 #CJK UNIFIED IDEOGRAPH + {0xD5C4, 0x81D8}, //13230 #CJK UNIFIED IDEOGRAPH + {0xD5C5, 0x881F}, //13231 #CJK UNIFIED IDEOGRAPH + {0xD5C6, 0x5ECA}, //13232 #CJK UNIFIED IDEOGRAPH + {0xD5C7, 0x6717}, //13233 #CJK UNIFIED IDEOGRAPH + {0xD5C8, 0x6D6A}, //13234 #CJK UNIFIED IDEOGRAPH + {0xD5C9, 0x72FC}, //13235 #CJK UNIFIED IDEOGRAPH + {0xD5CA, 0x7405}, //13236 #CJK UNIFIED IDEOGRAPH + {0xD5CB, 0x746F}, //13237 #CJK UNIFIED IDEOGRAPH + {0xD5CC, 0x8782}, //13238 #CJK UNIFIED IDEOGRAPH + {0xD5CD, 0x90DE}, //13239 #CJK UNIFIED IDEOGRAPH + {0xD5CE, 0x4F86}, //13240 #CJK UNIFIED IDEOGRAPH + {0xD5CF, 0x5D0D}, //13241 #CJK UNIFIED IDEOGRAPH + {0xD5D0, 0x5FA0}, //13242 #CJK UNIFIED IDEOGRAPH + {0xD5D1, 0x840A}, //13243 #CJK UNIFIED IDEOGRAPH + {0xD5D2, 0x51B7}, //13244 #CJK UNIFIED IDEOGRAPH + {0xD5D3, 0x63A0}, //13245 #CJK UNIFIED IDEOGRAPH + {0xD5D4, 0x7565}, //13246 #CJK UNIFIED IDEOGRAPH + {0xD5D5, 0x4EAE}, //13247 #CJK UNIFIED IDEOGRAPH + {0xD5D6, 0x5006}, //13248 #CJK UNIFIED IDEOGRAPH + {0xD5D7, 0x5169}, //13249 #CJK UNIFIED IDEOGRAPH + {0xD5D8, 0x51C9}, //13250 #CJK UNIFIED IDEOGRAPH + {0xD5D9, 0x6881}, //13251 #CJK UNIFIED IDEOGRAPH + {0xD5DA, 0x6A11}, //13252 #CJK UNIFIED IDEOGRAPH + {0xD5DB, 0x7CAE}, //13253 #CJK UNIFIED IDEOGRAPH + {0xD5DC, 0x7CB1}, //13254 #CJK UNIFIED IDEOGRAPH + {0xD5DD, 0x7CE7}, //13255 #CJK UNIFIED IDEOGRAPH + {0xD5DE, 0x826F}, //13256 #CJK UNIFIED IDEOGRAPH + {0xD5DF, 0x8AD2}, //13257 #CJK UNIFIED IDEOGRAPH + {0xD5E0, 0x8F1B}, //13258 #CJK UNIFIED IDEOGRAPH + {0xD5E1, 0x91CF}, //13259 #CJK UNIFIED IDEOGRAPH + {0xD5E2, 0x4FB6}, //13260 #CJK UNIFIED IDEOGRAPH + {0xD5E3, 0x5137}, //13261 #CJK UNIFIED IDEOGRAPH + {0xD5E4, 0x52F5}, //13262 #CJK UNIFIED IDEOGRAPH + {0xD5E5, 0x5442}, //13263 #CJK UNIFIED IDEOGRAPH + {0xD5E6, 0x5EEC}, //13264 #CJK UNIFIED IDEOGRAPH + {0xD5E7, 0x616E}, //13265 #CJK UNIFIED IDEOGRAPH + {0xD5E8, 0x623E}, //13266 #CJK UNIFIED IDEOGRAPH + {0xD5E9, 0x65C5}, //13267 #CJK UNIFIED IDEOGRAPH + {0xD5EA, 0x6ADA}, //13268 #CJK UNIFIED IDEOGRAPH + {0xD5EB, 0x6FFE}, //13269 #CJK UNIFIED IDEOGRAPH + {0xD5EC, 0x792A}, //13270 #CJK UNIFIED IDEOGRAPH + {0xD5ED, 0x85DC}, //13271 #CJK UNIFIED IDEOGRAPH + {0xD5EE, 0x8823}, //13272 #CJK UNIFIED IDEOGRAPH + {0xD5EF, 0x95AD}, //13273 #CJK UNIFIED IDEOGRAPH + {0xD5F0, 0x9A62}, //13274 #CJK UNIFIED IDEOGRAPH + {0xD5F1, 0x9A6A}, //13275 #CJK UNIFIED IDEOGRAPH + {0xD5F2, 0x9E97}, //13276 #CJK UNIFIED IDEOGRAPH + {0xD5F3, 0x9ECE}, //13277 #CJK UNIFIED IDEOGRAPH + {0xD5F4, 0x529B}, //13278 #CJK UNIFIED IDEOGRAPH + {0xD5F5, 0x66C6}, //13279 #CJK UNIFIED IDEOGRAPH + {0xD5F6, 0x6B77}, //13280 #CJK UNIFIED IDEOGRAPH + {0xD5F7, 0x701D}, //13281 #CJK UNIFIED IDEOGRAPH + {0xD5F8, 0x792B}, //13282 #CJK UNIFIED IDEOGRAPH + {0xD5F9, 0x8F62}, //13283 #CJK UNIFIED IDEOGRAPH + {0xD5FA, 0x9742}, //13284 #CJK UNIFIED IDEOGRAPH + {0xD5FB, 0x6190}, //13285 #CJK UNIFIED IDEOGRAPH + {0xD5FC, 0x6200}, //13286 #CJK UNIFIED IDEOGRAPH + {0xD5FD, 0x6523}, //13287 #CJK UNIFIED IDEOGRAPH + {0xD5FE, 0x6F23}, //13288 #CJK UNIFIED IDEOGRAPH + {0xD6A1, 0x7149}, //13289 #CJK UNIFIED IDEOGRAPH + {0xD6A2, 0x7489}, //13290 #CJK UNIFIED IDEOGRAPH + {0xD6A3, 0x7DF4}, //13291 #CJK UNIFIED IDEOGRAPH + {0xD6A4, 0x806F}, //13292 #CJK UNIFIED IDEOGRAPH + {0xD6A5, 0x84EE}, //13293 #CJK UNIFIED IDEOGRAPH + {0xD6A6, 0x8F26}, //13294 #CJK UNIFIED IDEOGRAPH + {0xD6A7, 0x9023}, //13295 #CJK UNIFIED IDEOGRAPH + {0xD6A8, 0x934A}, //13296 #CJK UNIFIED IDEOGRAPH + {0xD6A9, 0x51BD}, //13297 #CJK UNIFIED IDEOGRAPH + {0xD6AA, 0x5217}, //13298 #CJK UNIFIED IDEOGRAPH + {0xD6AB, 0x52A3}, //13299 #CJK UNIFIED IDEOGRAPH + {0xD6AC, 0x6D0C}, //13300 #CJK UNIFIED IDEOGRAPH + {0xD6AD, 0x70C8}, //13301 #CJK UNIFIED IDEOGRAPH + {0xD6AE, 0x88C2}, //13302 #CJK UNIFIED IDEOGRAPH + {0xD6AF, 0x5EC9}, //13303 #CJK UNIFIED IDEOGRAPH + {0xD6B0, 0x6582}, //13304 #CJK UNIFIED IDEOGRAPH + {0xD6B1, 0x6BAE}, //13305 #CJK UNIFIED IDEOGRAPH + {0xD6B2, 0x6FC2}, //13306 #CJK UNIFIED IDEOGRAPH + {0xD6B3, 0x7C3E}, //13307 #CJK UNIFIED IDEOGRAPH + {0xD6B4, 0x7375}, //13308 #CJK UNIFIED IDEOGRAPH + {0xD6B5, 0x4EE4}, //13309 #CJK UNIFIED IDEOGRAPH + {0xD6B6, 0x4F36}, //13310 #CJK UNIFIED IDEOGRAPH + {0xD6B7, 0x56F9}, //13311 #CJK UNIFIED IDEOGRAPH + {0xD6B8, 0xF95F}, //13312 #CJK COMPATIBILITY IDEOGRAPH + {0xD6B9, 0x5CBA}, //13313 #CJK UNIFIED IDEOGRAPH + {0xD6BA, 0x5DBA}, //13314 #CJK UNIFIED IDEOGRAPH + {0xD6BB, 0x601C}, //13315 #CJK UNIFIED IDEOGRAPH + {0xD6BC, 0x73B2}, //13316 #CJK UNIFIED IDEOGRAPH + {0xD6BD, 0x7B2D}, //13317 #CJK UNIFIED IDEOGRAPH + {0xD6BE, 0x7F9A}, //13318 #CJK UNIFIED IDEOGRAPH + {0xD6BF, 0x7FCE}, //13319 #CJK UNIFIED IDEOGRAPH + {0xD6C0, 0x8046}, //13320 #CJK UNIFIED IDEOGRAPH + {0xD6C1, 0x901E}, //13321 #CJK UNIFIED IDEOGRAPH + {0xD6C2, 0x9234}, //13322 #CJK UNIFIED IDEOGRAPH + {0xD6C3, 0x96F6}, //13323 #CJK UNIFIED IDEOGRAPH + {0xD6C4, 0x9748}, //13324 #CJK UNIFIED IDEOGRAPH + {0xD6C5, 0x9818}, //13325 #CJK UNIFIED IDEOGRAPH + {0xD6C6, 0x9F61}, //13326 #CJK UNIFIED IDEOGRAPH + {0xD6C7, 0x4F8B}, //13327 #CJK UNIFIED IDEOGRAPH + {0xD6C8, 0x6FA7}, //13328 #CJK UNIFIED IDEOGRAPH + {0xD6C9, 0x79AE}, //13329 #CJK UNIFIED IDEOGRAPH + {0xD6CA, 0x91B4}, //13330 #CJK UNIFIED IDEOGRAPH + {0xD6CB, 0x96B7}, //13331 #CJK UNIFIED IDEOGRAPH + {0xD6CC, 0x52DE}, //13332 #CJK UNIFIED IDEOGRAPH + {0xD6CD, 0xF960}, //13333 #CJK COMPATIBILITY IDEOGRAPH + {0xD6CE, 0x6488}, //13334 #CJK UNIFIED IDEOGRAPH + {0xD6CF, 0x64C4}, //13335 #CJK UNIFIED IDEOGRAPH + {0xD6D0, 0x6AD3}, //13336 #CJK UNIFIED IDEOGRAPH + {0xD6D1, 0x6F5E}, //13337 #CJK UNIFIED IDEOGRAPH + {0xD6D2, 0x7018}, //13338 #CJK UNIFIED IDEOGRAPH + {0xD6D3, 0x7210}, //13339 #CJK UNIFIED IDEOGRAPH + {0xD6D4, 0x76E7}, //13340 #CJK UNIFIED IDEOGRAPH + {0xD6D5, 0x8001}, //13341 #CJK UNIFIED IDEOGRAPH + {0xD6D6, 0x8606}, //13342 #CJK UNIFIED IDEOGRAPH + {0xD6D7, 0x865C}, //13343 #CJK UNIFIED IDEOGRAPH + {0xD6D8, 0x8DEF}, //13344 #CJK UNIFIED IDEOGRAPH + {0xD6D9, 0x8F05}, //13345 #CJK UNIFIED IDEOGRAPH + {0xD6DA, 0x9732}, //13346 #CJK UNIFIED IDEOGRAPH + {0xD6DB, 0x9B6F}, //13347 #CJK UNIFIED IDEOGRAPH + {0xD6DC, 0x9DFA}, //13348 #CJK UNIFIED IDEOGRAPH + {0xD6DD, 0x9E75}, //13349 #CJK UNIFIED IDEOGRAPH + {0xD6DE, 0x788C}, //13350 #CJK UNIFIED IDEOGRAPH + {0xD6DF, 0x797F}, //13351 #CJK UNIFIED IDEOGRAPH + {0xD6E0, 0x7DA0}, //13352 #CJK UNIFIED IDEOGRAPH + {0xD6E1, 0x83C9}, //13353 #CJK UNIFIED IDEOGRAPH + {0xD6E2, 0x9304}, //13354 #CJK UNIFIED IDEOGRAPH + {0xD6E3, 0x9E7F}, //13355 #CJK UNIFIED IDEOGRAPH + {0xD6E4, 0x9E93}, //13356 #CJK UNIFIED IDEOGRAPH + {0xD6E5, 0x8AD6}, //13357 #CJK UNIFIED IDEOGRAPH + {0xD6E6, 0x58DF}, //13358 #CJK UNIFIED IDEOGRAPH + {0xD6E7, 0x5F04}, //13359 #CJK UNIFIED IDEOGRAPH + {0xD6E8, 0x6727}, //13360 #CJK UNIFIED IDEOGRAPH + {0xD6E9, 0x7027}, //13361 #CJK UNIFIED IDEOGRAPH + {0xD6EA, 0x74CF}, //13362 #CJK UNIFIED IDEOGRAPH + {0xD6EB, 0x7C60}, //13363 #CJK UNIFIED IDEOGRAPH + {0xD6EC, 0x807E}, //13364 #CJK UNIFIED IDEOGRAPH + {0xD6ED, 0x5121}, //13365 #CJK UNIFIED IDEOGRAPH + {0xD6EE, 0x7028}, //13366 #CJK UNIFIED IDEOGRAPH + {0xD6EF, 0x7262}, //13367 #CJK UNIFIED IDEOGRAPH + {0xD6F0, 0x78CA}, //13368 #CJK UNIFIED IDEOGRAPH + {0xD6F1, 0x8CC2}, //13369 #CJK UNIFIED IDEOGRAPH + {0xD6F2, 0x8CDA}, //13370 #CJK UNIFIED IDEOGRAPH + {0xD6F3, 0x8CF4}, //13371 #CJK UNIFIED IDEOGRAPH + {0xD6F4, 0x96F7}, //13372 #CJK UNIFIED IDEOGRAPH + {0xD6F5, 0x4E86}, //13373 #CJK UNIFIED IDEOGRAPH + {0xD6F6, 0x50DA}, //13374 #CJK UNIFIED IDEOGRAPH + {0xD6F7, 0x5BEE}, //13375 #CJK UNIFIED IDEOGRAPH + {0xD6F8, 0x5ED6}, //13376 #CJK UNIFIED IDEOGRAPH + {0xD6F9, 0x6599}, //13377 #CJK UNIFIED IDEOGRAPH + {0xD6FA, 0x71CE}, //13378 #CJK UNIFIED IDEOGRAPH + {0xD6FB, 0x7642}, //13379 #CJK UNIFIED IDEOGRAPH + {0xD6FC, 0x77AD}, //13380 #CJK UNIFIED IDEOGRAPH + {0xD6FD, 0x804A}, //13381 #CJK UNIFIED IDEOGRAPH + {0xD6FE, 0x84FC}, //13382 #CJK UNIFIED IDEOGRAPH + {0xD7A1, 0x907C}, //13383 #CJK UNIFIED IDEOGRAPH + {0xD7A2, 0x9B27}, //13384 #CJK UNIFIED IDEOGRAPH + {0xD7A3, 0x9F8D}, //13385 #CJK UNIFIED IDEOGRAPH + {0xD7A4, 0x58D8}, //13386 #CJK UNIFIED IDEOGRAPH + {0xD7A5, 0x5A41}, //13387 #CJK UNIFIED IDEOGRAPH + {0xD7A6, 0x5C62}, //13388 #CJK UNIFIED IDEOGRAPH + {0xD7A7, 0x6A13}, //13389 #CJK UNIFIED IDEOGRAPH + {0xD7A8, 0x6DDA}, //13390 #CJK UNIFIED IDEOGRAPH + {0xD7A9, 0x6F0F}, //13391 #CJK UNIFIED IDEOGRAPH + {0xD7AA, 0x763B}, //13392 #CJK UNIFIED IDEOGRAPH + {0xD7AB, 0x7D2F}, //13393 #CJK UNIFIED IDEOGRAPH + {0xD7AC, 0x7E37}, //13394 #CJK UNIFIED IDEOGRAPH + {0xD7AD, 0x851E}, //13395 #CJK UNIFIED IDEOGRAPH + {0xD7AE, 0x8938}, //13396 #CJK UNIFIED IDEOGRAPH + {0xD7AF, 0x93E4}, //13397 #CJK UNIFIED IDEOGRAPH + {0xD7B0, 0x964B}, //13398 #CJK UNIFIED IDEOGRAPH + {0xD7B1, 0x5289}, //13399 #CJK UNIFIED IDEOGRAPH + {0xD7B2, 0x65D2}, //13400 #CJK UNIFIED IDEOGRAPH + {0xD7B3, 0x67F3}, //13401 #CJK UNIFIED IDEOGRAPH + {0xD7B4, 0x69B4}, //13402 #CJK UNIFIED IDEOGRAPH + {0xD7B5, 0x6D41}, //13403 #CJK UNIFIED IDEOGRAPH + {0xD7B6, 0x6E9C}, //13404 #CJK UNIFIED IDEOGRAPH + {0xD7B7, 0x700F}, //13405 #CJK UNIFIED IDEOGRAPH + {0xD7B8, 0x7409}, //13406 #CJK UNIFIED IDEOGRAPH + {0xD7B9, 0x7460}, //13407 #CJK UNIFIED IDEOGRAPH + {0xD7BA, 0x7559}, //13408 #CJK UNIFIED IDEOGRAPH + {0xD7BB, 0x7624}, //13409 #CJK UNIFIED IDEOGRAPH + {0xD7BC, 0x786B}, //13410 #CJK UNIFIED IDEOGRAPH + {0xD7BD, 0x8B2C}, //13411 #CJK UNIFIED IDEOGRAPH + {0xD7BE, 0x985E}, //13412 #CJK UNIFIED IDEOGRAPH + {0xD7BF, 0x516D}, //13413 #CJK UNIFIED IDEOGRAPH + {0xD7C0, 0x622E}, //13414 #CJK UNIFIED IDEOGRAPH + {0xD7C1, 0x9678}, //13415 #CJK UNIFIED IDEOGRAPH + {0xD7C2, 0x4F96}, //13416 #CJK UNIFIED IDEOGRAPH + {0xD7C3, 0x502B}, //13417 #CJK UNIFIED IDEOGRAPH + {0xD7C4, 0x5D19}, //13418 #CJK UNIFIED IDEOGRAPH + {0xD7C5, 0x6DEA}, //13419 #CJK UNIFIED IDEOGRAPH + {0xD7C6, 0x7DB8}, //13420 #CJK UNIFIED IDEOGRAPH + {0xD7C7, 0x8F2A}, //13421 #CJK UNIFIED IDEOGRAPH + {0xD7C8, 0x5F8B}, //13422 #CJK UNIFIED IDEOGRAPH + {0xD7C9, 0x6144}, //13423 #CJK UNIFIED IDEOGRAPH + {0xD7CA, 0x6817}, //13424 #CJK UNIFIED IDEOGRAPH + {0xD7CB, 0xF961}, //13425 #CJK COMPATIBILITY IDEOGRAPH + {0xD7CC, 0x9686}, //13426 #CJK UNIFIED IDEOGRAPH + {0xD7CD, 0x52D2}, //13427 #CJK UNIFIED IDEOGRAPH + {0xD7CE, 0x808B}, //13428 #CJK UNIFIED IDEOGRAPH + {0xD7CF, 0x51DC}, //13429 #CJK UNIFIED IDEOGRAPH + {0xD7D0, 0x51CC}, //13430 #CJK UNIFIED IDEOGRAPH + {0xD7D1, 0x695E}, //13431 #CJK UNIFIED IDEOGRAPH + {0xD7D2, 0x7A1C}, //13432 #CJK UNIFIED IDEOGRAPH + {0xD7D3, 0x7DBE}, //13433 #CJK UNIFIED IDEOGRAPH + {0xD7D4, 0x83F1}, //13434 #CJK UNIFIED IDEOGRAPH + {0xD7D5, 0x9675}, //13435 #CJK UNIFIED IDEOGRAPH + {0xD7D6, 0x4FDA}, //13436 #CJK UNIFIED IDEOGRAPH + {0xD7D7, 0x5229}, //13437 #CJK UNIFIED IDEOGRAPH + {0xD7D8, 0x5398}, //13438 #CJK UNIFIED IDEOGRAPH + {0xD7D9, 0x540F}, //13439 #CJK UNIFIED IDEOGRAPH + {0xD7DA, 0x550E}, //13440 #CJK UNIFIED IDEOGRAPH + {0xD7DB, 0x5C65}, //13441 #CJK UNIFIED IDEOGRAPH + {0xD7DC, 0x60A7}, //13442 #CJK UNIFIED IDEOGRAPH + {0xD7DD, 0x674E}, //13443 #CJK UNIFIED IDEOGRAPH + {0xD7DE, 0x68A8}, //13444 #CJK UNIFIED IDEOGRAPH + {0xD7DF, 0x6D6C}, //13445 #CJK UNIFIED IDEOGRAPH + {0xD7E0, 0x7281}, //13446 #CJK UNIFIED IDEOGRAPH + {0xD7E1, 0x72F8}, //13447 #CJK UNIFIED IDEOGRAPH + {0xD7E2, 0x7406}, //13448 #CJK UNIFIED IDEOGRAPH + {0xD7E3, 0x7483}, //13449 #CJK UNIFIED IDEOGRAPH + {0xD7E4, 0xF962}, //13450 #CJK COMPATIBILITY IDEOGRAPH + {0xD7E5, 0x75E2}, //13451 #CJK UNIFIED IDEOGRAPH + {0xD7E6, 0x7C6C}, //13452 #CJK UNIFIED IDEOGRAPH + {0xD7E7, 0x7F79}, //13453 #CJK UNIFIED IDEOGRAPH + {0xD7E8, 0x7FB8}, //13454 #CJK UNIFIED IDEOGRAPH + {0xD7E9, 0x8389}, //13455 #CJK UNIFIED IDEOGRAPH + {0xD7EA, 0x88CF}, //13456 #CJK UNIFIED IDEOGRAPH + {0xD7EB, 0x88E1}, //13457 #CJK UNIFIED IDEOGRAPH + {0xD7EC, 0x91CC}, //13458 #CJK UNIFIED IDEOGRAPH + {0xD7ED, 0x91D0}, //13459 #CJK UNIFIED IDEOGRAPH + {0xD7EE, 0x96E2}, //13460 #CJK UNIFIED IDEOGRAPH + {0xD7EF, 0x9BC9}, //13461 #CJK UNIFIED IDEOGRAPH + {0xD7F0, 0x541D}, //13462 #CJK UNIFIED IDEOGRAPH + {0xD7F1, 0x6F7E}, //13463 #CJK UNIFIED IDEOGRAPH + {0xD7F2, 0x71D0}, //13464 #CJK UNIFIED IDEOGRAPH + {0xD7F3, 0x7498}, //13465 #CJK UNIFIED IDEOGRAPH + {0xD7F4, 0x85FA}, //13466 #CJK UNIFIED IDEOGRAPH + {0xD7F5, 0x8EAA}, //13467 #CJK UNIFIED IDEOGRAPH + {0xD7F6, 0x96A3}, //13468 #CJK UNIFIED IDEOGRAPH + {0xD7F7, 0x9C57}, //13469 #CJK UNIFIED IDEOGRAPH + {0xD7F8, 0x9E9F}, //13470 #CJK UNIFIED IDEOGRAPH + {0xD7F9, 0x6797}, //13471 #CJK UNIFIED IDEOGRAPH + {0xD7FA, 0x6DCB}, //13472 #CJK UNIFIED IDEOGRAPH + {0xD7FB, 0x7433}, //13473 #CJK UNIFIED IDEOGRAPH + {0xD7FC, 0x81E8}, //13474 #CJK UNIFIED IDEOGRAPH + {0xD7FD, 0x9716}, //13475 #CJK UNIFIED IDEOGRAPH + {0xD7FE, 0x782C}, //13476 #CJK UNIFIED IDEOGRAPH + {0xD8A1, 0x7ACB}, //13477 #CJK UNIFIED IDEOGRAPH + {0xD8A2, 0x7B20}, //13478 #CJK UNIFIED IDEOGRAPH + {0xD8A3, 0x7C92}, //13479 #CJK UNIFIED IDEOGRAPH + {0xD8A4, 0x6469}, //13480 #CJK UNIFIED IDEOGRAPH + {0xD8A5, 0x746A}, //13481 #CJK UNIFIED IDEOGRAPH + {0xD8A6, 0x75F2}, //13482 #CJK UNIFIED IDEOGRAPH + {0xD8A7, 0x78BC}, //13483 #CJK UNIFIED IDEOGRAPH + {0xD8A8, 0x78E8}, //13484 #CJK UNIFIED IDEOGRAPH + {0xD8A9, 0x99AC}, //13485 #CJK UNIFIED IDEOGRAPH + {0xD8AA, 0x9B54}, //13486 #CJK UNIFIED IDEOGRAPH + {0xD8AB, 0x9EBB}, //13487 #CJK UNIFIED IDEOGRAPH + {0xD8AC, 0x5BDE}, //13488 #CJK UNIFIED IDEOGRAPH + {0xD8AD, 0x5E55}, //13489 #CJK UNIFIED IDEOGRAPH + {0xD8AE, 0x6F20}, //13490 #CJK UNIFIED IDEOGRAPH + {0xD8AF, 0x819C}, //13491 #CJK UNIFIED IDEOGRAPH + {0xD8B0, 0x83AB}, //13492 #CJK UNIFIED IDEOGRAPH + {0xD8B1, 0x9088}, //13493 #CJK UNIFIED IDEOGRAPH + {0xD8B2, 0x4E07}, //13494 #CJK UNIFIED IDEOGRAPH + {0xD8B3, 0x534D}, //13495 #CJK UNIFIED IDEOGRAPH + {0xD8B4, 0x5A29}, //13496 #CJK UNIFIED IDEOGRAPH + {0xD8B5, 0x5DD2}, //13497 #CJK UNIFIED IDEOGRAPH + {0xD8B6, 0x5F4E}, //13498 #CJK UNIFIED IDEOGRAPH + {0xD8B7, 0x6162}, //13499 #CJK UNIFIED IDEOGRAPH + {0xD8B8, 0x633D}, //13500 #CJK UNIFIED IDEOGRAPH + {0xD8B9, 0x6669}, //13501 #CJK UNIFIED IDEOGRAPH + {0xD8BA, 0x66FC}, //13502 #CJK UNIFIED IDEOGRAPH + {0xD8BB, 0x6EFF}, //13503 #CJK UNIFIED IDEOGRAPH + {0xD8BC, 0x6F2B}, //13504 #CJK UNIFIED IDEOGRAPH + {0xD8BD, 0x7063}, //13505 #CJK UNIFIED IDEOGRAPH + {0xD8BE, 0x779E}, //13506 #CJK UNIFIED IDEOGRAPH + {0xD8BF, 0x842C}, //13507 #CJK UNIFIED IDEOGRAPH + {0xD8C0, 0x8513}, //13508 #CJK UNIFIED IDEOGRAPH + {0xD8C1, 0x883B}, //13509 #CJK UNIFIED IDEOGRAPH + {0xD8C2, 0x8F13}, //13510 #CJK UNIFIED IDEOGRAPH + {0xD8C3, 0x9945}, //13511 #CJK UNIFIED IDEOGRAPH + {0xD8C4, 0x9C3B}, //13512 #CJK UNIFIED IDEOGRAPH + {0xD8C5, 0x551C}, //13513 #CJK UNIFIED IDEOGRAPH + {0xD8C6, 0x62B9}, //13514 #CJK UNIFIED IDEOGRAPH + {0xD8C7, 0x672B}, //13515 #CJK UNIFIED IDEOGRAPH + {0xD8C8, 0x6CAB}, //13516 #CJK UNIFIED IDEOGRAPH + {0xD8C9, 0x8309}, //13517 #CJK UNIFIED IDEOGRAPH + {0xD8CA, 0x896A}, //13518 #CJK UNIFIED IDEOGRAPH + {0xD8CB, 0x977A}, //13519 #CJK UNIFIED IDEOGRAPH + {0xD8CC, 0x4EA1}, //13520 #CJK UNIFIED IDEOGRAPH + {0xD8CD, 0x5984}, //13521 #CJK UNIFIED IDEOGRAPH + {0xD8CE, 0x5FD8}, //13522 #CJK UNIFIED IDEOGRAPH + {0xD8CF, 0x5FD9}, //13523 #CJK UNIFIED IDEOGRAPH + {0xD8D0, 0x671B}, //13524 #CJK UNIFIED IDEOGRAPH + {0xD8D1, 0x7DB2}, //13525 #CJK UNIFIED IDEOGRAPH + {0xD8D2, 0x7F54}, //13526 #CJK UNIFIED IDEOGRAPH + {0xD8D3, 0x8292}, //13527 #CJK UNIFIED IDEOGRAPH + {0xD8D4, 0x832B}, //13528 #CJK UNIFIED IDEOGRAPH + {0xD8D5, 0x83BD}, //13529 #CJK UNIFIED IDEOGRAPH + {0xD8D6, 0x8F1E}, //13530 #CJK UNIFIED IDEOGRAPH + {0xD8D7, 0x9099}, //13531 #CJK UNIFIED IDEOGRAPH + {0xD8D8, 0x57CB}, //13532 #CJK UNIFIED IDEOGRAPH + {0xD8D9, 0x59B9}, //13533 #CJK UNIFIED IDEOGRAPH + {0xD8DA, 0x5A92}, //13534 #CJK UNIFIED IDEOGRAPH + {0xD8DB, 0x5BD0}, //13535 #CJK UNIFIED IDEOGRAPH + {0xD8DC, 0x6627}, //13536 #CJK UNIFIED IDEOGRAPH + {0xD8DD, 0x679A}, //13537 #CJK UNIFIED IDEOGRAPH + {0xD8DE, 0x6885}, //13538 #CJK UNIFIED IDEOGRAPH + {0xD8DF, 0x6BCF}, //13539 #CJK UNIFIED IDEOGRAPH + {0xD8E0, 0x7164}, //13540 #CJK UNIFIED IDEOGRAPH + {0xD8E1, 0x7F75}, //13541 #CJK UNIFIED IDEOGRAPH + {0xD8E2, 0x8CB7}, //13542 #CJK UNIFIED IDEOGRAPH + {0xD8E3, 0x8CE3}, //13543 #CJK UNIFIED IDEOGRAPH + {0xD8E4, 0x9081}, //13544 #CJK UNIFIED IDEOGRAPH + {0xD8E5, 0x9B45}, //13545 #CJK UNIFIED IDEOGRAPH + {0xD8E6, 0x8108}, //13546 #CJK UNIFIED IDEOGRAPH + {0xD8E7, 0x8C8A}, //13547 #CJK UNIFIED IDEOGRAPH + {0xD8E8, 0x964C}, //13548 #CJK UNIFIED IDEOGRAPH + {0xD8E9, 0x9A40}, //13549 #CJK UNIFIED IDEOGRAPH + {0xD8EA, 0x9EA5}, //13550 #CJK UNIFIED IDEOGRAPH + {0xD8EB, 0x5B5F}, //13551 #CJK UNIFIED IDEOGRAPH + {0xD8EC, 0x6C13}, //13552 #CJK UNIFIED IDEOGRAPH + {0xD8ED, 0x731B}, //13553 #CJK UNIFIED IDEOGRAPH + {0xD8EE, 0x76F2}, //13554 #CJK UNIFIED IDEOGRAPH + {0xD8EF, 0x76DF}, //13555 #CJK UNIFIED IDEOGRAPH + {0xD8F0, 0x840C}, //13556 #CJK UNIFIED IDEOGRAPH + {0xD8F1, 0x51AA}, //13557 #CJK UNIFIED IDEOGRAPH + {0xD8F2, 0x8993}, //13558 #CJK UNIFIED IDEOGRAPH + {0xD8F3, 0x514D}, //13559 #CJK UNIFIED IDEOGRAPH + {0xD8F4, 0x5195}, //13560 #CJK UNIFIED IDEOGRAPH + {0xD8F5, 0x52C9}, //13561 #CJK UNIFIED IDEOGRAPH + {0xD8F6, 0x68C9}, //13562 #CJK UNIFIED IDEOGRAPH + {0xD8F7, 0x6C94}, //13563 #CJK UNIFIED IDEOGRAPH + {0xD8F8, 0x7704}, //13564 #CJK UNIFIED IDEOGRAPH + {0xD8F9, 0x7720}, //13565 #CJK UNIFIED IDEOGRAPH + {0xD8FA, 0x7DBF}, //13566 #CJK UNIFIED IDEOGRAPH + {0xD8FB, 0x7DEC}, //13567 #CJK UNIFIED IDEOGRAPH + {0xD8FC, 0x9762}, //13568 #CJK UNIFIED IDEOGRAPH + {0xD8FD, 0x9EB5}, //13569 #CJK UNIFIED IDEOGRAPH + {0xD8FE, 0x6EC5}, //13570 #CJK UNIFIED IDEOGRAPH + {0xD9A1, 0x8511}, //13571 #CJK UNIFIED IDEOGRAPH + {0xD9A2, 0x51A5}, //13572 #CJK UNIFIED IDEOGRAPH + {0xD9A3, 0x540D}, //13573 #CJK UNIFIED IDEOGRAPH + {0xD9A4, 0x547D}, //13574 #CJK UNIFIED IDEOGRAPH + {0xD9A5, 0x660E}, //13575 #CJK UNIFIED IDEOGRAPH + {0xD9A6, 0x669D}, //13576 #CJK UNIFIED IDEOGRAPH + {0xD9A7, 0x6927}, //13577 #CJK UNIFIED IDEOGRAPH + {0xD9A8, 0x6E9F}, //13578 #CJK UNIFIED IDEOGRAPH + {0xD9A9, 0x76BF}, //13579 #CJK UNIFIED IDEOGRAPH + {0xD9AA, 0x7791}, //13580 #CJK UNIFIED IDEOGRAPH + {0xD9AB, 0x8317}, //13581 #CJK UNIFIED IDEOGRAPH + {0xD9AC, 0x84C2}, //13582 #CJK UNIFIED IDEOGRAPH + {0xD9AD, 0x879F}, //13583 #CJK UNIFIED IDEOGRAPH + {0xD9AE, 0x9169}, //13584 #CJK UNIFIED IDEOGRAPH + {0xD9AF, 0x9298}, //13585 #CJK UNIFIED IDEOGRAPH + {0xD9B0, 0x9CF4}, //13586 #CJK UNIFIED IDEOGRAPH + {0xD9B1, 0x8882}, //13587 #CJK UNIFIED IDEOGRAPH + {0xD9B2, 0x4FAE}, //13588 #CJK UNIFIED IDEOGRAPH + {0xD9B3, 0x5192}, //13589 #CJK UNIFIED IDEOGRAPH + {0xD9B4, 0x52DF}, //13590 #CJK UNIFIED IDEOGRAPH + {0xD9B5, 0x59C6}, //13591 #CJK UNIFIED IDEOGRAPH + {0xD9B6, 0x5E3D}, //13592 #CJK UNIFIED IDEOGRAPH + {0xD9B7, 0x6155}, //13593 #CJK UNIFIED IDEOGRAPH + {0xD9B8, 0x6478}, //13594 #CJK UNIFIED IDEOGRAPH + {0xD9B9, 0x6479}, //13595 #CJK UNIFIED IDEOGRAPH + {0xD9BA, 0x66AE}, //13596 #CJK UNIFIED IDEOGRAPH + {0xD9BB, 0x67D0}, //13597 #CJK UNIFIED IDEOGRAPH + {0xD9BC, 0x6A21}, //13598 #CJK UNIFIED IDEOGRAPH + {0xD9BD, 0x6BCD}, //13599 #CJK UNIFIED IDEOGRAPH + {0xD9BE, 0x6BDB}, //13600 #CJK UNIFIED IDEOGRAPH + {0xD9BF, 0x725F}, //13601 #CJK UNIFIED IDEOGRAPH + {0xD9C0, 0x7261}, //13602 #CJK UNIFIED IDEOGRAPH + {0xD9C1, 0x7441}, //13603 #CJK UNIFIED IDEOGRAPH + {0xD9C2, 0x7738}, //13604 #CJK UNIFIED IDEOGRAPH + {0xD9C3, 0x77DB}, //13605 #CJK UNIFIED IDEOGRAPH + {0xD9C4, 0x8017}, //13606 #CJK UNIFIED IDEOGRAPH + {0xD9C5, 0x82BC}, //13607 #CJK UNIFIED IDEOGRAPH + {0xD9C6, 0x8305}, //13608 #CJK UNIFIED IDEOGRAPH + {0xD9C7, 0x8B00}, //13609 #CJK UNIFIED IDEOGRAPH + {0xD9C8, 0x8B28}, //13610 #CJK UNIFIED IDEOGRAPH + {0xD9C9, 0x8C8C}, //13611 #CJK UNIFIED IDEOGRAPH + {0xD9CA, 0x6728}, //13612 #CJK UNIFIED IDEOGRAPH + {0xD9CB, 0x6C90}, //13613 #CJK UNIFIED IDEOGRAPH + {0xD9CC, 0x7267}, //13614 #CJK UNIFIED IDEOGRAPH + {0xD9CD, 0x76EE}, //13615 #CJK UNIFIED IDEOGRAPH + {0xD9CE, 0x7766}, //13616 #CJK UNIFIED IDEOGRAPH + {0xD9CF, 0x7A46}, //13617 #CJK UNIFIED IDEOGRAPH + {0xD9D0, 0x9DA9}, //13618 #CJK UNIFIED IDEOGRAPH + {0xD9D1, 0x6B7F}, //13619 #CJK UNIFIED IDEOGRAPH + {0xD9D2, 0x6C92}, //13620 #CJK UNIFIED IDEOGRAPH + {0xD9D3, 0x5922}, //13621 #CJK UNIFIED IDEOGRAPH + {0xD9D4, 0x6726}, //13622 #CJK UNIFIED IDEOGRAPH + {0xD9D5, 0x8499}, //13623 #CJK UNIFIED IDEOGRAPH + {0xD9D6, 0x536F}, //13624 #CJK UNIFIED IDEOGRAPH + {0xD9D7, 0x5893}, //13625 #CJK UNIFIED IDEOGRAPH + {0xD9D8, 0x5999}, //13626 #CJK UNIFIED IDEOGRAPH + {0xD9D9, 0x5EDF}, //13627 #CJK UNIFIED IDEOGRAPH + {0xD9DA, 0x63CF}, //13628 #CJK UNIFIED IDEOGRAPH + {0xD9DB, 0x6634}, //13629 #CJK UNIFIED IDEOGRAPH + {0xD9DC, 0x6773}, //13630 #CJK UNIFIED IDEOGRAPH + {0xD9DD, 0x6E3A}, //13631 #CJK UNIFIED IDEOGRAPH + {0xD9DE, 0x732B}, //13632 #CJK UNIFIED IDEOGRAPH + {0xD9DF, 0x7AD7}, //13633 #CJK UNIFIED IDEOGRAPH + {0xD9E0, 0x82D7}, //13634 #CJK UNIFIED IDEOGRAPH + {0xD9E1, 0x9328}, //13635 #CJK UNIFIED IDEOGRAPH + {0xD9E2, 0x52D9}, //13636 #CJK UNIFIED IDEOGRAPH + {0xD9E3, 0x5DEB}, //13637 #CJK UNIFIED IDEOGRAPH + {0xD9E4, 0x61AE}, //13638 #CJK UNIFIED IDEOGRAPH + {0xD9E5, 0x61CB}, //13639 #CJK UNIFIED IDEOGRAPH + {0xD9E6, 0x620A}, //13640 #CJK UNIFIED IDEOGRAPH + {0xD9E7, 0x62C7}, //13641 #CJK UNIFIED IDEOGRAPH + {0xD9E8, 0x64AB}, //13642 #CJK UNIFIED IDEOGRAPH + {0xD9E9, 0x65E0}, //13643 #CJK UNIFIED IDEOGRAPH + {0xD9EA, 0x6959}, //13644 #CJK UNIFIED IDEOGRAPH + {0xD9EB, 0x6B66}, //13645 #CJK UNIFIED IDEOGRAPH + {0xD9EC, 0x6BCB}, //13646 #CJK UNIFIED IDEOGRAPH + {0xD9ED, 0x7121}, //13647 #CJK UNIFIED IDEOGRAPH + {0xD9EE, 0x73F7}, //13648 #CJK UNIFIED IDEOGRAPH + {0xD9EF, 0x755D}, //13649 #CJK UNIFIED IDEOGRAPH + {0xD9F0, 0x7E46}, //13650 #CJK UNIFIED IDEOGRAPH + {0xD9F1, 0x821E}, //13651 #CJK UNIFIED IDEOGRAPH + {0xD9F2, 0x8302}, //13652 #CJK UNIFIED IDEOGRAPH + {0xD9F3, 0x856A}, //13653 #CJK UNIFIED IDEOGRAPH + {0xD9F4, 0x8AA3}, //13654 #CJK UNIFIED IDEOGRAPH + {0xD9F5, 0x8CBF}, //13655 #CJK UNIFIED IDEOGRAPH + {0xD9F6, 0x9727}, //13656 #CJK UNIFIED IDEOGRAPH + {0xD9F7, 0x9D61}, //13657 #CJK UNIFIED IDEOGRAPH + {0xD9F8, 0x58A8}, //13658 #CJK UNIFIED IDEOGRAPH + {0xD9F9, 0x9ED8}, //13659 #CJK UNIFIED IDEOGRAPH + {0xD9FA, 0x5011}, //13660 #CJK UNIFIED IDEOGRAPH + {0xD9FB, 0x520E}, //13661 #CJK UNIFIED IDEOGRAPH + {0xD9FC, 0x543B}, //13662 #CJK UNIFIED IDEOGRAPH + {0xD9FD, 0x554F}, //13663 #CJK UNIFIED IDEOGRAPH + {0xD9FE, 0x6587}, //13664 #CJK UNIFIED IDEOGRAPH + {0xDAA1, 0x6C76}, //13665 #CJK UNIFIED IDEOGRAPH + {0xDAA2, 0x7D0A}, //13666 #CJK UNIFIED IDEOGRAPH + {0xDAA3, 0x7D0B}, //13667 #CJK UNIFIED IDEOGRAPH + {0xDAA4, 0x805E}, //13668 #CJK UNIFIED IDEOGRAPH + {0xDAA5, 0x868A}, //13669 #CJK UNIFIED IDEOGRAPH + {0xDAA6, 0x9580}, //13670 #CJK UNIFIED IDEOGRAPH + {0xDAA7, 0x96EF}, //13671 #CJK UNIFIED IDEOGRAPH + {0xDAA8, 0x52FF}, //13672 #CJK UNIFIED IDEOGRAPH + {0xDAA9, 0x6C95}, //13673 #CJK UNIFIED IDEOGRAPH + {0xDAAA, 0x7269}, //13674 #CJK UNIFIED IDEOGRAPH + {0xDAAB, 0x5473}, //13675 #CJK UNIFIED IDEOGRAPH + {0xDAAC, 0x5A9A}, //13676 #CJK UNIFIED IDEOGRAPH + {0xDAAD, 0x5C3E}, //13677 #CJK UNIFIED IDEOGRAPH + {0xDAAE, 0x5D4B}, //13678 #CJK UNIFIED IDEOGRAPH + {0xDAAF, 0x5F4C}, //13679 #CJK UNIFIED IDEOGRAPH + {0xDAB0, 0x5FAE}, //13680 #CJK UNIFIED IDEOGRAPH + {0xDAB1, 0x672A}, //13681 #CJK UNIFIED IDEOGRAPH + {0xDAB2, 0x68B6}, //13682 #CJK UNIFIED IDEOGRAPH + {0xDAB3, 0x6963}, //13683 #CJK UNIFIED IDEOGRAPH + {0xDAB4, 0x6E3C}, //13684 #CJK UNIFIED IDEOGRAPH + {0xDAB5, 0x6E44}, //13685 #CJK UNIFIED IDEOGRAPH + {0xDAB6, 0x7709}, //13686 #CJK UNIFIED IDEOGRAPH + {0xDAB7, 0x7C73}, //13687 #CJK UNIFIED IDEOGRAPH + {0xDAB8, 0x7F8E}, //13688 #CJK UNIFIED IDEOGRAPH + {0xDAB9, 0x8587}, //13689 #CJK UNIFIED IDEOGRAPH + {0xDABA, 0x8B0E}, //13690 #CJK UNIFIED IDEOGRAPH + {0xDABB, 0x8FF7}, //13691 #CJK UNIFIED IDEOGRAPH + {0xDABC, 0x9761}, //13692 #CJK UNIFIED IDEOGRAPH + {0xDABD, 0x9EF4}, //13693 #CJK UNIFIED IDEOGRAPH + {0xDABE, 0x5CB7}, //13694 #CJK UNIFIED IDEOGRAPH + {0xDABF, 0x60B6}, //13695 #CJK UNIFIED IDEOGRAPH + {0xDAC0, 0x610D}, //13696 #CJK UNIFIED IDEOGRAPH + {0xDAC1, 0x61AB}, //13697 #CJK UNIFIED IDEOGRAPH + {0xDAC2, 0x654F}, //13698 #CJK UNIFIED IDEOGRAPH + {0xDAC3, 0x65FB}, //13699 #CJK UNIFIED IDEOGRAPH + {0xDAC4, 0x65FC}, //13700 #CJK UNIFIED IDEOGRAPH + {0xDAC5, 0x6C11}, //13701 #CJK UNIFIED IDEOGRAPH + {0xDAC6, 0x6CEF}, //13702 #CJK UNIFIED IDEOGRAPH + {0xDAC7, 0x739F}, //13703 #CJK UNIFIED IDEOGRAPH + {0xDAC8, 0x73C9}, //13704 #CJK UNIFIED IDEOGRAPH + {0xDAC9, 0x7DE1}, //13705 #CJK UNIFIED IDEOGRAPH + {0xDACA, 0x9594}, //13706 #CJK UNIFIED IDEOGRAPH + {0xDACB, 0x5BC6}, //13707 #CJK UNIFIED IDEOGRAPH + {0xDACC, 0x871C}, //13708 #CJK UNIFIED IDEOGRAPH + {0xDACD, 0x8B10}, //13709 #CJK UNIFIED IDEOGRAPH + {0xDACE, 0x525D}, //13710 #CJK UNIFIED IDEOGRAPH + {0xDACF, 0x535A}, //13711 #CJK UNIFIED IDEOGRAPH + {0xDAD0, 0x62CD}, //13712 #CJK UNIFIED IDEOGRAPH + {0xDAD1, 0x640F}, //13713 #CJK UNIFIED IDEOGRAPH + {0xDAD2, 0x64B2}, //13714 #CJK UNIFIED IDEOGRAPH + {0xDAD3, 0x6734}, //13715 #CJK UNIFIED IDEOGRAPH + {0xDAD4, 0x6A38}, //13716 #CJK UNIFIED IDEOGRAPH + {0xDAD5, 0x6CCA}, //13717 #CJK UNIFIED IDEOGRAPH + {0xDAD6, 0x73C0}, //13718 #CJK UNIFIED IDEOGRAPH + {0xDAD7, 0x749E}, //13719 #CJK UNIFIED IDEOGRAPH + {0xDAD8, 0x7B94}, //13720 #CJK UNIFIED IDEOGRAPH + {0xDAD9, 0x7C95}, //13721 #CJK UNIFIED IDEOGRAPH + {0xDADA, 0x7E1B}, //13722 #CJK UNIFIED IDEOGRAPH + {0xDADB, 0x818A}, //13723 #CJK UNIFIED IDEOGRAPH + {0xDADC, 0x8236}, //13724 #CJK UNIFIED IDEOGRAPH + {0xDADD, 0x8584}, //13725 #CJK UNIFIED IDEOGRAPH + {0xDADE, 0x8FEB}, //13726 #CJK UNIFIED IDEOGRAPH + {0xDADF, 0x96F9}, //13727 #CJK UNIFIED IDEOGRAPH + {0xDAE0, 0x99C1}, //13728 #CJK UNIFIED IDEOGRAPH + {0xDAE1, 0x4F34}, //13729 #CJK UNIFIED IDEOGRAPH + {0xDAE2, 0x534A}, //13730 #CJK UNIFIED IDEOGRAPH + {0xDAE3, 0x53CD}, //13731 #CJK UNIFIED IDEOGRAPH + {0xDAE4, 0x53DB}, //13732 #CJK UNIFIED IDEOGRAPH + {0xDAE5, 0x62CC}, //13733 #CJK UNIFIED IDEOGRAPH + {0xDAE6, 0x642C}, //13734 #CJK UNIFIED IDEOGRAPH + {0xDAE7, 0x6500}, //13735 #CJK UNIFIED IDEOGRAPH + {0xDAE8, 0x6591}, //13736 #CJK UNIFIED IDEOGRAPH + {0xDAE9, 0x69C3}, //13737 #CJK UNIFIED IDEOGRAPH + {0xDAEA, 0x6CEE}, //13738 #CJK UNIFIED IDEOGRAPH + {0xDAEB, 0x6F58}, //13739 #CJK UNIFIED IDEOGRAPH + {0xDAEC, 0x73ED}, //13740 #CJK UNIFIED IDEOGRAPH + {0xDAED, 0x7554}, //13741 #CJK UNIFIED IDEOGRAPH + {0xDAEE, 0x7622}, //13742 #CJK UNIFIED IDEOGRAPH + {0xDAEF, 0x76E4}, //13743 #CJK UNIFIED IDEOGRAPH + {0xDAF0, 0x76FC}, //13744 #CJK UNIFIED IDEOGRAPH + {0xDAF1, 0x78D0}, //13745 #CJK UNIFIED IDEOGRAPH + {0xDAF2, 0x78FB}, //13746 #CJK UNIFIED IDEOGRAPH + {0xDAF3, 0x792C}, //13747 #CJK UNIFIED IDEOGRAPH + {0xDAF4, 0x7D46}, //13748 #CJK UNIFIED IDEOGRAPH + {0xDAF5, 0x822C}, //13749 #CJK UNIFIED IDEOGRAPH + {0xDAF6, 0x87E0}, //13750 #CJK UNIFIED IDEOGRAPH + {0xDAF7, 0x8FD4}, //13751 #CJK UNIFIED IDEOGRAPH + {0xDAF8, 0x9812}, //13752 #CJK UNIFIED IDEOGRAPH + {0xDAF9, 0x98EF}, //13753 #CJK UNIFIED IDEOGRAPH + {0xDAFA, 0x52C3}, //13754 #CJK UNIFIED IDEOGRAPH + {0xDAFB, 0x62D4}, //13755 #CJK UNIFIED IDEOGRAPH + {0xDAFC, 0x64A5}, //13756 #CJK UNIFIED IDEOGRAPH + {0xDAFD, 0x6E24}, //13757 #CJK UNIFIED IDEOGRAPH + {0xDAFE, 0x6F51}, //13758 #CJK UNIFIED IDEOGRAPH + {0xDBA1, 0x767C}, //13759 #CJK UNIFIED IDEOGRAPH + {0xDBA2, 0x8DCB}, //13760 #CJK UNIFIED IDEOGRAPH + {0xDBA3, 0x91B1}, //13761 #CJK UNIFIED IDEOGRAPH + {0xDBA4, 0x9262}, //13762 #CJK UNIFIED IDEOGRAPH + {0xDBA5, 0x9AEE}, //13763 #CJK UNIFIED IDEOGRAPH + {0xDBA6, 0x9B43}, //13764 #CJK UNIFIED IDEOGRAPH + {0xDBA7, 0x5023}, //13765 #CJK UNIFIED IDEOGRAPH + {0xDBA8, 0x508D}, //13766 #CJK UNIFIED IDEOGRAPH + {0xDBA9, 0x574A}, //13767 #CJK UNIFIED IDEOGRAPH + {0xDBAA, 0x59A8}, //13768 #CJK UNIFIED IDEOGRAPH + {0xDBAB, 0x5C28}, //13769 #CJK UNIFIED IDEOGRAPH + {0xDBAC, 0x5E47}, //13770 #CJK UNIFIED IDEOGRAPH + {0xDBAD, 0x5F77}, //13771 #CJK UNIFIED IDEOGRAPH + {0xDBAE, 0x623F}, //13772 #CJK UNIFIED IDEOGRAPH + {0xDBAF, 0x653E}, //13773 #CJK UNIFIED IDEOGRAPH + {0xDBB0, 0x65B9}, //13774 #CJK UNIFIED IDEOGRAPH + {0xDBB1, 0x65C1}, //13775 #CJK UNIFIED IDEOGRAPH + {0xDBB2, 0x6609}, //13776 #CJK UNIFIED IDEOGRAPH + {0xDBB3, 0x678B}, //13777 #CJK UNIFIED IDEOGRAPH + {0xDBB4, 0x699C}, //13778 #CJK UNIFIED IDEOGRAPH + {0xDBB5, 0x6EC2}, //13779 #CJK UNIFIED IDEOGRAPH + {0xDBB6, 0x78C5}, //13780 #CJK UNIFIED IDEOGRAPH + {0xDBB7, 0x7D21}, //13781 #CJK UNIFIED IDEOGRAPH + {0xDBB8, 0x80AA}, //13782 #CJK UNIFIED IDEOGRAPH + {0xDBB9, 0x8180}, //13783 #CJK UNIFIED IDEOGRAPH + {0xDBBA, 0x822B}, //13784 #CJK UNIFIED IDEOGRAPH + {0xDBBB, 0x82B3}, //13785 #CJK UNIFIED IDEOGRAPH + {0xDBBC, 0x84A1}, //13786 #CJK UNIFIED IDEOGRAPH + {0xDBBD, 0x868C}, //13787 #CJK UNIFIED IDEOGRAPH + {0xDBBE, 0x8A2A}, //13788 #CJK UNIFIED IDEOGRAPH + {0xDBBF, 0x8B17}, //13789 #CJK UNIFIED IDEOGRAPH + {0xDBC0, 0x90A6}, //13790 #CJK UNIFIED IDEOGRAPH + {0xDBC1, 0x9632}, //13791 #CJK UNIFIED IDEOGRAPH + {0xDBC2, 0x9F90}, //13792 #CJK UNIFIED IDEOGRAPH + {0xDBC3, 0x500D}, //13793 #CJK UNIFIED IDEOGRAPH + {0xDBC4, 0x4FF3}, //13794 #CJK UNIFIED IDEOGRAPH + {0xDBC5, 0xF963}, //13795 #CJK COMPATIBILITY IDEOGRAPH + {0xDBC6, 0x57F9}, //13796 #CJK UNIFIED IDEOGRAPH + {0xDBC7, 0x5F98}, //13797 #CJK UNIFIED IDEOGRAPH + {0xDBC8, 0x62DC}, //13798 #CJK UNIFIED IDEOGRAPH + {0xDBC9, 0x6392}, //13799 #CJK UNIFIED IDEOGRAPH + {0xDBCA, 0x676F}, //13800 #CJK UNIFIED IDEOGRAPH + {0xDBCB, 0x6E43}, //13801 #CJK UNIFIED IDEOGRAPH + {0xDBCC, 0x7119}, //13802 #CJK UNIFIED IDEOGRAPH + {0xDBCD, 0x76C3}, //13803 #CJK UNIFIED IDEOGRAPH + {0xDBCE, 0x80CC}, //13804 #CJK UNIFIED IDEOGRAPH + {0xDBCF, 0x80DA}, //13805 #CJK UNIFIED IDEOGRAPH + {0xDBD0, 0x88F4}, //13806 #CJK UNIFIED IDEOGRAPH + {0xDBD1, 0x88F5}, //13807 #CJK UNIFIED IDEOGRAPH + {0xDBD2, 0x8919}, //13808 #CJK UNIFIED IDEOGRAPH + {0xDBD3, 0x8CE0}, //13809 #CJK UNIFIED IDEOGRAPH + {0xDBD4, 0x8F29}, //13810 #CJK UNIFIED IDEOGRAPH + {0xDBD5, 0x914D}, //13811 #CJK UNIFIED IDEOGRAPH + {0xDBD6, 0x966A}, //13812 #CJK UNIFIED IDEOGRAPH + {0xDBD7, 0x4F2F}, //13813 #CJK UNIFIED IDEOGRAPH + {0xDBD8, 0x4F70}, //13814 #CJK UNIFIED IDEOGRAPH + {0xDBD9, 0x5E1B}, //13815 #CJK UNIFIED IDEOGRAPH + {0xDBDA, 0x67CF}, //13816 #CJK UNIFIED IDEOGRAPH + {0xDBDB, 0x6822}, //13817 #CJK UNIFIED IDEOGRAPH + {0xDBDC, 0x767D}, //13818 #CJK UNIFIED IDEOGRAPH + {0xDBDD, 0x767E}, //13819 #CJK UNIFIED IDEOGRAPH + {0xDBDE, 0x9B44}, //13820 #CJK UNIFIED IDEOGRAPH + {0xDBDF, 0x5E61}, //13821 #CJK UNIFIED IDEOGRAPH + {0xDBE0, 0x6A0A}, //13822 #CJK UNIFIED IDEOGRAPH + {0xDBE1, 0x7169}, //13823 #CJK UNIFIED IDEOGRAPH + {0xDBE2, 0x71D4}, //13824 #CJK UNIFIED IDEOGRAPH + {0xDBE3, 0x756A}, //13825 #CJK UNIFIED IDEOGRAPH + {0xDBE4, 0xF964}, //13826 #CJK COMPATIBILITY IDEOGRAPH + {0xDBE5, 0x7E41}, //13827 #CJK UNIFIED IDEOGRAPH + {0xDBE6, 0x8543}, //13828 #CJK UNIFIED IDEOGRAPH + {0xDBE7, 0x85E9}, //13829 #CJK UNIFIED IDEOGRAPH + {0xDBE8, 0x98DC}, //13830 #CJK UNIFIED IDEOGRAPH + {0xDBE9, 0x4F10}, //13831 #CJK UNIFIED IDEOGRAPH + {0xDBEA, 0x7B4F}, //13832 #CJK UNIFIED IDEOGRAPH + {0xDBEB, 0x7F70}, //13833 #CJK UNIFIED IDEOGRAPH + {0xDBEC, 0x95A5}, //13834 #CJK UNIFIED IDEOGRAPH + {0xDBED, 0x51E1}, //13835 #CJK UNIFIED IDEOGRAPH + {0xDBEE, 0x5E06}, //13836 #CJK UNIFIED IDEOGRAPH + {0xDBEF, 0x68B5}, //13837 #CJK UNIFIED IDEOGRAPH + {0xDBF0, 0x6C3E}, //13838 #CJK UNIFIED IDEOGRAPH + {0xDBF1, 0x6C4E}, //13839 #CJK UNIFIED IDEOGRAPH + {0xDBF2, 0x6CDB}, //13840 #CJK UNIFIED IDEOGRAPH + {0xDBF3, 0x72AF}, //13841 #CJK UNIFIED IDEOGRAPH + {0xDBF4, 0x7BC4}, //13842 #CJK UNIFIED IDEOGRAPH + {0xDBF5, 0x8303}, //13843 #CJK UNIFIED IDEOGRAPH + {0xDBF6, 0x6CD5}, //13844 #CJK UNIFIED IDEOGRAPH + {0xDBF7, 0x743A}, //13845 #CJK UNIFIED IDEOGRAPH + {0xDBF8, 0x50FB}, //13846 #CJK UNIFIED IDEOGRAPH + {0xDBF9, 0x5288}, //13847 #CJK UNIFIED IDEOGRAPH + {0xDBFA, 0x58C1}, //13848 #CJK UNIFIED IDEOGRAPH + {0xDBFB, 0x64D8}, //13849 #CJK UNIFIED IDEOGRAPH + {0xDBFC, 0x6A97}, //13850 #CJK UNIFIED IDEOGRAPH + {0xDBFD, 0x74A7}, //13851 #CJK UNIFIED IDEOGRAPH + {0xDBFE, 0x7656}, //13852 #CJK UNIFIED IDEOGRAPH + {0xDCA1, 0x78A7}, //13853 #CJK UNIFIED IDEOGRAPH + {0xDCA2, 0x8617}, //13854 #CJK UNIFIED IDEOGRAPH + {0xDCA3, 0x95E2}, //13855 #CJK UNIFIED IDEOGRAPH + {0xDCA4, 0x9739}, //13856 #CJK UNIFIED IDEOGRAPH + {0xDCA5, 0xF965}, //13857 #CJK COMPATIBILITY IDEOGRAPH + {0xDCA6, 0x535E}, //13858 #CJK UNIFIED IDEOGRAPH + {0xDCA7, 0x5F01}, //13859 #CJK UNIFIED IDEOGRAPH + {0xDCA8, 0x8B8A}, //13860 #CJK UNIFIED IDEOGRAPH + {0xDCA9, 0x8FA8}, //13861 #CJK UNIFIED IDEOGRAPH + {0xDCAA, 0x8FAF}, //13862 #CJK UNIFIED IDEOGRAPH + {0xDCAB, 0x908A}, //13863 #CJK UNIFIED IDEOGRAPH + {0xDCAC, 0x5225}, //13864 #CJK UNIFIED IDEOGRAPH + {0xDCAD, 0x77A5}, //13865 #CJK UNIFIED IDEOGRAPH + {0xDCAE, 0x9C49}, //13866 #CJK UNIFIED IDEOGRAPH + {0xDCAF, 0x9F08}, //13867 #CJK UNIFIED IDEOGRAPH + {0xDCB0, 0x4E19}, //13868 #CJK UNIFIED IDEOGRAPH + {0xDCB1, 0x5002}, //13869 #CJK UNIFIED IDEOGRAPH + {0xDCB2, 0x5175}, //13870 #CJK UNIFIED IDEOGRAPH + {0xDCB3, 0x5C5B}, //13871 #CJK UNIFIED IDEOGRAPH + {0xDCB4, 0x5E77}, //13872 #CJK UNIFIED IDEOGRAPH + {0xDCB5, 0x661E}, //13873 #CJK UNIFIED IDEOGRAPH + {0xDCB6, 0x663A}, //13874 #CJK UNIFIED IDEOGRAPH + {0xDCB7, 0x67C4}, //13875 #CJK UNIFIED IDEOGRAPH + {0xDCB8, 0x68C5}, //13876 #CJK UNIFIED IDEOGRAPH + {0xDCB9, 0x70B3}, //13877 #CJK UNIFIED IDEOGRAPH + {0xDCBA, 0x7501}, //13878 #CJK UNIFIED IDEOGRAPH + {0xDCBB, 0x75C5}, //13879 #CJK UNIFIED IDEOGRAPH + {0xDCBC, 0x79C9}, //13880 #CJK UNIFIED IDEOGRAPH + {0xDCBD, 0x7ADD}, //13881 #CJK UNIFIED IDEOGRAPH + {0xDCBE, 0x8F27}, //13882 #CJK UNIFIED IDEOGRAPH + {0xDCBF, 0x9920}, //13883 #CJK UNIFIED IDEOGRAPH + {0xDCC0, 0x9A08}, //13884 #CJK UNIFIED IDEOGRAPH + {0xDCC1, 0x4FDD}, //13885 #CJK UNIFIED IDEOGRAPH + {0xDCC2, 0x5821}, //13886 #CJK UNIFIED IDEOGRAPH + {0xDCC3, 0x5831}, //13887 #CJK UNIFIED IDEOGRAPH + {0xDCC4, 0x5BF6}, //13888 #CJK UNIFIED IDEOGRAPH + {0xDCC5, 0x666E}, //13889 #CJK UNIFIED IDEOGRAPH + {0xDCC6, 0x6B65}, //13890 #CJK UNIFIED IDEOGRAPH + {0xDCC7, 0x6D11}, //13891 #CJK UNIFIED IDEOGRAPH + {0xDCC8, 0x6E7A}, //13892 #CJK UNIFIED IDEOGRAPH + {0xDCC9, 0x6F7D}, //13893 #CJK UNIFIED IDEOGRAPH + {0xDCCA, 0x73E4}, //13894 #CJK UNIFIED IDEOGRAPH + {0xDCCB, 0x752B}, //13895 #CJK UNIFIED IDEOGRAPH + {0xDCCC, 0x83E9}, //13896 #CJK UNIFIED IDEOGRAPH + {0xDCCD, 0x88DC}, //13897 #CJK UNIFIED IDEOGRAPH + {0xDCCE, 0x8913}, //13898 #CJK UNIFIED IDEOGRAPH + {0xDCCF, 0x8B5C}, //13899 #CJK UNIFIED IDEOGRAPH + {0xDCD0, 0x8F14}, //13900 #CJK UNIFIED IDEOGRAPH + {0xDCD1, 0x4F0F}, //13901 #CJK UNIFIED IDEOGRAPH + {0xDCD2, 0x50D5}, //13902 #CJK UNIFIED IDEOGRAPH + {0xDCD3, 0x5310}, //13903 #CJK UNIFIED IDEOGRAPH + {0xDCD4, 0x535C}, //13904 #CJK UNIFIED IDEOGRAPH + {0xDCD5, 0x5B93}, //13905 #CJK UNIFIED IDEOGRAPH + {0xDCD6, 0x5FA9}, //13906 #CJK UNIFIED IDEOGRAPH + {0xDCD7, 0x670D}, //13907 #CJK UNIFIED IDEOGRAPH + {0xDCD8, 0x798F}, //13908 #CJK UNIFIED IDEOGRAPH + {0xDCD9, 0x8179}, //13909 #CJK UNIFIED IDEOGRAPH + {0xDCDA, 0x832F}, //13910 #CJK UNIFIED IDEOGRAPH + {0xDCDB, 0x8514}, //13911 #CJK UNIFIED IDEOGRAPH + {0xDCDC, 0x8907}, //13912 #CJK UNIFIED IDEOGRAPH + {0xDCDD, 0x8986}, //13913 #CJK UNIFIED IDEOGRAPH + {0xDCDE, 0x8F39}, //13914 #CJK UNIFIED IDEOGRAPH + {0xDCDF, 0x8F3B}, //13915 #CJK UNIFIED IDEOGRAPH + {0xDCE0, 0x99A5}, //13916 #CJK UNIFIED IDEOGRAPH + {0xDCE1, 0x9C12}, //13917 #CJK UNIFIED IDEOGRAPH + {0xDCE2, 0x672C}, //13918 #CJK UNIFIED IDEOGRAPH + {0xDCE3, 0x4E76}, //13919 #CJK UNIFIED IDEOGRAPH + {0xDCE4, 0x4FF8}, //13920 #CJK UNIFIED IDEOGRAPH + {0xDCE5, 0x5949}, //13921 #CJK UNIFIED IDEOGRAPH + {0xDCE6, 0x5C01}, //13922 #CJK UNIFIED IDEOGRAPH + {0xDCE7, 0x5CEF}, //13923 #CJK UNIFIED IDEOGRAPH + {0xDCE8, 0x5CF0}, //13924 #CJK UNIFIED IDEOGRAPH + {0xDCE9, 0x6367}, //13925 #CJK UNIFIED IDEOGRAPH + {0xDCEA, 0x68D2}, //13926 #CJK UNIFIED IDEOGRAPH + {0xDCEB, 0x70FD}, //13927 #CJK UNIFIED IDEOGRAPH + {0xDCEC, 0x71A2}, //13928 #CJK UNIFIED IDEOGRAPH + {0xDCED, 0x742B}, //13929 #CJK UNIFIED IDEOGRAPH + {0xDCEE, 0x7E2B}, //13930 #CJK UNIFIED IDEOGRAPH + {0xDCEF, 0x84EC}, //13931 #CJK UNIFIED IDEOGRAPH + {0xDCF0, 0x8702}, //13932 #CJK UNIFIED IDEOGRAPH + {0xDCF1, 0x9022}, //13933 #CJK UNIFIED IDEOGRAPH + {0xDCF2, 0x92D2}, //13934 #CJK UNIFIED IDEOGRAPH + {0xDCF3, 0x9CF3}, //13935 #CJK UNIFIED IDEOGRAPH + {0xDCF4, 0x4E0D}, //13936 #CJK UNIFIED IDEOGRAPH + {0xDCF5, 0x4ED8}, //13937 #CJK UNIFIED IDEOGRAPH + {0xDCF6, 0x4FEF}, //13938 #CJK UNIFIED IDEOGRAPH + {0xDCF7, 0x5085}, //13939 #CJK UNIFIED IDEOGRAPH + {0xDCF8, 0x5256}, //13940 #CJK UNIFIED IDEOGRAPH + {0xDCF9, 0x526F}, //13941 #CJK UNIFIED IDEOGRAPH + {0xDCFA, 0x5426}, //13942 #CJK UNIFIED IDEOGRAPH + {0xDCFB, 0x5490}, //13943 #CJK UNIFIED IDEOGRAPH + {0xDCFC, 0x57E0}, //13944 #CJK UNIFIED IDEOGRAPH + {0xDCFD, 0x592B}, //13945 #CJK UNIFIED IDEOGRAPH + {0xDCFE, 0x5A66}, //13946 #CJK UNIFIED IDEOGRAPH + {0xDDA1, 0x5B5A}, //13947 #CJK UNIFIED IDEOGRAPH + {0xDDA2, 0x5B75}, //13948 #CJK UNIFIED IDEOGRAPH + {0xDDA3, 0x5BCC}, //13949 #CJK UNIFIED IDEOGRAPH + {0xDDA4, 0x5E9C}, //13950 #CJK UNIFIED IDEOGRAPH + {0xDDA5, 0xF966}, //13951 #CJK COMPATIBILITY IDEOGRAPH + {0xDDA6, 0x6276}, //13952 #CJK UNIFIED IDEOGRAPH + {0xDDA7, 0x6577}, //13953 #CJK UNIFIED IDEOGRAPH + {0xDDA8, 0x65A7}, //13954 #CJK UNIFIED IDEOGRAPH + {0xDDA9, 0x6D6E}, //13955 #CJK UNIFIED IDEOGRAPH + {0xDDAA, 0x6EA5}, //13956 #CJK UNIFIED IDEOGRAPH + {0xDDAB, 0x7236}, //13957 #CJK UNIFIED IDEOGRAPH + {0xDDAC, 0x7B26}, //13958 #CJK UNIFIED IDEOGRAPH + {0xDDAD, 0x7C3F}, //13959 #CJK UNIFIED IDEOGRAPH + {0xDDAE, 0x7F36}, //13960 #CJK UNIFIED IDEOGRAPH + {0xDDAF, 0x8150}, //13961 #CJK UNIFIED IDEOGRAPH + {0xDDB0, 0x8151}, //13962 #CJK UNIFIED IDEOGRAPH + {0xDDB1, 0x819A}, //13963 #CJK UNIFIED IDEOGRAPH + {0xDDB2, 0x8240}, //13964 #CJK UNIFIED IDEOGRAPH + {0xDDB3, 0x8299}, //13965 #CJK UNIFIED IDEOGRAPH + {0xDDB4, 0x83A9}, //13966 #CJK UNIFIED IDEOGRAPH + {0xDDB5, 0x8A03}, //13967 #CJK UNIFIED IDEOGRAPH + {0xDDB6, 0x8CA0}, //13968 #CJK UNIFIED IDEOGRAPH + {0xDDB7, 0x8CE6}, //13969 #CJK UNIFIED IDEOGRAPH + {0xDDB8, 0x8CFB}, //13970 #CJK UNIFIED IDEOGRAPH + {0xDDB9, 0x8D74}, //13971 #CJK UNIFIED IDEOGRAPH + {0xDDBA, 0x8DBA}, //13972 #CJK UNIFIED IDEOGRAPH + {0xDDBB, 0x90E8}, //13973 #CJK UNIFIED IDEOGRAPH + {0xDDBC, 0x91DC}, //13974 #CJK UNIFIED IDEOGRAPH + {0xDDBD, 0x961C}, //13975 #CJK UNIFIED IDEOGRAPH + {0xDDBE, 0x9644}, //13976 #CJK UNIFIED IDEOGRAPH + {0xDDBF, 0x99D9}, //13977 #CJK UNIFIED IDEOGRAPH + {0xDDC0, 0x9CE7}, //13978 #CJK UNIFIED IDEOGRAPH + {0xDDC1, 0x5317}, //13979 #CJK UNIFIED IDEOGRAPH + {0xDDC2, 0x5206}, //13980 #CJK UNIFIED IDEOGRAPH + {0xDDC3, 0x5429}, //13981 #CJK UNIFIED IDEOGRAPH + {0xDDC4, 0x5674}, //13982 #CJK UNIFIED IDEOGRAPH + {0xDDC5, 0x58B3}, //13983 #CJK UNIFIED IDEOGRAPH + {0xDDC6, 0x5954}, //13984 #CJK UNIFIED IDEOGRAPH + {0xDDC7, 0x596E}, //13985 #CJK UNIFIED IDEOGRAPH + {0xDDC8, 0x5FFF}, //13986 #CJK UNIFIED IDEOGRAPH + {0xDDC9, 0x61A4}, //13987 #CJK UNIFIED IDEOGRAPH + {0xDDCA, 0x626E}, //13988 #CJK UNIFIED IDEOGRAPH + {0xDDCB, 0x6610}, //13989 #CJK UNIFIED IDEOGRAPH + {0xDDCC, 0x6C7E}, //13990 #CJK UNIFIED IDEOGRAPH + {0xDDCD, 0x711A}, //13991 #CJK UNIFIED IDEOGRAPH + {0xDDCE, 0x76C6}, //13992 #CJK UNIFIED IDEOGRAPH + {0xDDCF, 0x7C89}, //13993 #CJK UNIFIED IDEOGRAPH + {0xDDD0, 0x7CDE}, //13994 #CJK UNIFIED IDEOGRAPH + {0xDDD1, 0x7D1B}, //13995 #CJK UNIFIED IDEOGRAPH + {0xDDD2, 0x82AC}, //13996 #CJK UNIFIED IDEOGRAPH + {0xDDD3, 0x8CC1}, //13997 #CJK UNIFIED IDEOGRAPH + {0xDDD4, 0x96F0}, //13998 #CJK UNIFIED IDEOGRAPH + {0xDDD5, 0xF967}, //13999 #CJK COMPATIBILITY IDEOGRAPH + {0xDDD6, 0x4F5B}, //14000 #CJK UNIFIED IDEOGRAPH + {0xDDD7, 0x5F17}, //14001 #CJK UNIFIED IDEOGRAPH + {0xDDD8, 0x5F7F}, //14002 #CJK UNIFIED IDEOGRAPH + {0xDDD9, 0x62C2}, //14003 #CJK UNIFIED IDEOGRAPH + {0xDDDA, 0x5D29}, //14004 #CJK UNIFIED IDEOGRAPH + {0xDDDB, 0x670B}, //14005 #CJK UNIFIED IDEOGRAPH + {0xDDDC, 0x68DA}, //14006 #CJK UNIFIED IDEOGRAPH + {0xDDDD, 0x787C}, //14007 #CJK UNIFIED IDEOGRAPH + {0xDDDE, 0x7E43}, //14008 #CJK UNIFIED IDEOGRAPH + {0xDDDF, 0x9D6C}, //14009 #CJK UNIFIED IDEOGRAPH + {0xDDE0, 0x4E15}, //14010 #CJK UNIFIED IDEOGRAPH + {0xDDE1, 0x5099}, //14011 #CJK UNIFIED IDEOGRAPH + {0xDDE2, 0x5315}, //14012 #CJK UNIFIED IDEOGRAPH + {0xDDE3, 0x532A}, //14013 #CJK UNIFIED IDEOGRAPH + {0xDDE4, 0x5351}, //14014 #CJK UNIFIED IDEOGRAPH + {0xDDE5, 0x5983}, //14015 #CJK UNIFIED IDEOGRAPH + {0xDDE6, 0x5A62}, //14016 #CJK UNIFIED IDEOGRAPH + {0xDDE7, 0x5E87}, //14017 #CJK UNIFIED IDEOGRAPH + {0xDDE8, 0x60B2}, //14018 #CJK UNIFIED IDEOGRAPH + {0xDDE9, 0x618A}, //14019 #CJK UNIFIED IDEOGRAPH + {0xDDEA, 0x6249}, //14020 #CJK UNIFIED IDEOGRAPH + {0xDDEB, 0x6279}, //14021 #CJK UNIFIED IDEOGRAPH + {0xDDEC, 0x6590}, //14022 #CJK UNIFIED IDEOGRAPH + {0xDDED, 0x6787}, //14023 #CJK UNIFIED IDEOGRAPH + {0xDDEE, 0x69A7}, //14024 #CJK UNIFIED IDEOGRAPH + {0xDDEF, 0x6BD4}, //14025 #CJK UNIFIED IDEOGRAPH + {0xDDF0, 0x6BD6}, //14026 #CJK UNIFIED IDEOGRAPH + {0xDDF1, 0x6BD7}, //14027 #CJK UNIFIED IDEOGRAPH + {0xDDF2, 0x6BD8}, //14028 #CJK UNIFIED IDEOGRAPH + {0xDDF3, 0x6CB8}, //14029 #CJK UNIFIED IDEOGRAPH + {0xDDF4, 0xF968}, //14030 #CJK COMPATIBILITY IDEOGRAPH + {0xDDF5, 0x7435}, //14031 #CJK UNIFIED IDEOGRAPH + {0xDDF6, 0x75FA}, //14032 #CJK UNIFIED IDEOGRAPH + {0xDDF7, 0x7812}, //14033 #CJK UNIFIED IDEOGRAPH + {0xDDF8, 0x7891}, //14034 #CJK UNIFIED IDEOGRAPH + {0xDDF9, 0x79D5}, //14035 #CJK UNIFIED IDEOGRAPH + {0xDDFA, 0x79D8}, //14036 #CJK UNIFIED IDEOGRAPH + {0xDDFB, 0x7C83}, //14037 #CJK UNIFIED IDEOGRAPH + {0xDDFC, 0x7DCB}, //14038 #CJK UNIFIED IDEOGRAPH + {0xDDFD, 0x7FE1}, //14039 #CJK UNIFIED IDEOGRAPH + {0xDDFE, 0x80A5}, //14040 #CJK UNIFIED IDEOGRAPH + {0xDEA1, 0x813E}, //14041 #CJK UNIFIED IDEOGRAPH + {0xDEA2, 0x81C2}, //14042 #CJK UNIFIED IDEOGRAPH + {0xDEA3, 0x83F2}, //14043 #CJK UNIFIED IDEOGRAPH + {0xDEA4, 0x871A}, //14044 #CJK UNIFIED IDEOGRAPH + {0xDEA5, 0x88E8}, //14045 #CJK UNIFIED IDEOGRAPH + {0xDEA6, 0x8AB9}, //14046 #CJK UNIFIED IDEOGRAPH + {0xDEA7, 0x8B6C}, //14047 #CJK UNIFIED IDEOGRAPH + {0xDEA8, 0x8CBB}, //14048 #CJK UNIFIED IDEOGRAPH + {0xDEA9, 0x9119}, //14049 #CJK UNIFIED IDEOGRAPH + {0xDEAA, 0x975E}, //14050 #CJK UNIFIED IDEOGRAPH + {0xDEAB, 0x98DB}, //14051 #CJK UNIFIED IDEOGRAPH + {0xDEAC, 0x9F3B}, //14052 #CJK UNIFIED IDEOGRAPH + {0xDEAD, 0x56AC}, //14053 #CJK UNIFIED IDEOGRAPH + {0xDEAE, 0x5B2A}, //14054 #CJK UNIFIED IDEOGRAPH + {0xDEAF, 0x5F6C}, //14055 #CJK UNIFIED IDEOGRAPH + {0xDEB0, 0x658C}, //14056 #CJK UNIFIED IDEOGRAPH + {0xDEB1, 0x6AB3}, //14057 #CJK UNIFIED IDEOGRAPH + {0xDEB2, 0x6BAF}, //14058 #CJK UNIFIED IDEOGRAPH + {0xDEB3, 0x6D5C}, //14059 #CJK UNIFIED IDEOGRAPH + {0xDEB4, 0x6FF1}, //14060 #CJK UNIFIED IDEOGRAPH + {0xDEB5, 0x7015}, //14061 #CJK UNIFIED IDEOGRAPH + {0xDEB6, 0x725D}, //14062 #CJK UNIFIED IDEOGRAPH + {0xDEB7, 0x73AD}, //14063 #CJK UNIFIED IDEOGRAPH + {0xDEB8, 0x8CA7}, //14064 #CJK UNIFIED IDEOGRAPH + {0xDEB9, 0x8CD3}, //14065 #CJK UNIFIED IDEOGRAPH + {0xDEBA, 0x983B}, //14066 #CJK UNIFIED IDEOGRAPH + {0xDEBB, 0x6191}, //14067 #CJK UNIFIED IDEOGRAPH + {0xDEBC, 0x6C37}, //14068 #CJK UNIFIED IDEOGRAPH + {0xDEBD, 0x8058}, //14069 #CJK UNIFIED IDEOGRAPH + {0xDEBE, 0x9A01}, //14070 #CJK UNIFIED IDEOGRAPH + {0xDEBF, 0x4E4D}, //14071 #CJK UNIFIED IDEOGRAPH + {0xDEC0, 0x4E8B}, //14072 #CJK UNIFIED IDEOGRAPH + {0xDEC1, 0x4E9B}, //14073 #CJK UNIFIED IDEOGRAPH + {0xDEC2, 0x4ED5}, //14074 #CJK UNIFIED IDEOGRAPH + {0xDEC3, 0x4F3A}, //14075 #CJK UNIFIED IDEOGRAPH + {0xDEC4, 0x4F3C}, //14076 #CJK UNIFIED IDEOGRAPH + {0xDEC5, 0x4F7F}, //14077 #CJK UNIFIED IDEOGRAPH + {0xDEC6, 0x4FDF}, //14078 #CJK UNIFIED IDEOGRAPH + {0xDEC7, 0x50FF}, //14079 #CJK UNIFIED IDEOGRAPH + {0xDEC8, 0x53F2}, //14080 #CJK UNIFIED IDEOGRAPH + {0xDEC9, 0x53F8}, //14081 #CJK UNIFIED IDEOGRAPH + {0xDECA, 0x5506}, //14082 #CJK UNIFIED IDEOGRAPH + {0xDECB, 0x55E3}, //14083 #CJK UNIFIED IDEOGRAPH + {0xDECC, 0x56DB}, //14084 #CJK UNIFIED IDEOGRAPH + {0xDECD, 0x58EB}, //14085 #CJK UNIFIED IDEOGRAPH + {0xDECE, 0x5962}, //14086 #CJK UNIFIED IDEOGRAPH + {0xDECF, 0x5A11}, //14087 #CJK UNIFIED IDEOGRAPH + {0xDED0, 0x5BEB}, //14088 #CJK UNIFIED IDEOGRAPH + {0xDED1, 0x5BFA}, //14089 #CJK UNIFIED IDEOGRAPH + {0xDED2, 0x5C04}, //14090 #CJK UNIFIED IDEOGRAPH + {0xDED3, 0x5DF3}, //14091 #CJK UNIFIED IDEOGRAPH + {0xDED4, 0x5E2B}, //14092 #CJK UNIFIED IDEOGRAPH + {0xDED5, 0x5F99}, //14093 #CJK UNIFIED IDEOGRAPH + {0xDED6, 0x601D}, //14094 #CJK UNIFIED IDEOGRAPH + {0xDED7, 0x6368}, //14095 #CJK UNIFIED IDEOGRAPH + {0xDED8, 0x659C}, //14096 #CJK UNIFIED IDEOGRAPH + {0xDED9, 0x65AF}, //14097 #CJK UNIFIED IDEOGRAPH + {0xDEDA, 0x67F6}, //14098 #CJK UNIFIED IDEOGRAPH + {0xDEDB, 0x67FB}, //14099 #CJK UNIFIED IDEOGRAPH + {0xDEDC, 0x68AD}, //14100 #CJK UNIFIED IDEOGRAPH + {0xDEDD, 0x6B7B}, //14101 #CJK UNIFIED IDEOGRAPH + {0xDEDE, 0x6C99}, //14102 #CJK UNIFIED IDEOGRAPH + {0xDEDF, 0x6CD7}, //14103 #CJK UNIFIED IDEOGRAPH + {0xDEE0, 0x6E23}, //14104 #CJK UNIFIED IDEOGRAPH + {0xDEE1, 0x7009}, //14105 #CJK UNIFIED IDEOGRAPH + {0xDEE2, 0x7345}, //14106 #CJK UNIFIED IDEOGRAPH + {0xDEE3, 0x7802}, //14107 #CJK UNIFIED IDEOGRAPH + {0xDEE4, 0x793E}, //14108 #CJK UNIFIED IDEOGRAPH + {0xDEE5, 0x7940}, //14109 #CJK UNIFIED IDEOGRAPH + {0xDEE6, 0x7960}, //14110 #CJK UNIFIED IDEOGRAPH + {0xDEE7, 0x79C1}, //14111 #CJK UNIFIED IDEOGRAPH + {0xDEE8, 0x7BE9}, //14112 #CJK UNIFIED IDEOGRAPH + {0xDEE9, 0x7D17}, //14113 #CJK UNIFIED IDEOGRAPH + {0xDEEA, 0x7D72}, //14114 #CJK UNIFIED IDEOGRAPH + {0xDEEB, 0x8086}, //14115 #CJK UNIFIED IDEOGRAPH + {0xDEEC, 0x820D}, //14116 #CJK UNIFIED IDEOGRAPH + {0xDEED, 0x838E}, //14117 #CJK UNIFIED IDEOGRAPH + {0xDEEE, 0x84D1}, //14118 #CJK UNIFIED IDEOGRAPH + {0xDEEF, 0x86C7}, //14119 #CJK UNIFIED IDEOGRAPH + {0xDEF0, 0x88DF}, //14120 #CJK UNIFIED IDEOGRAPH + {0xDEF1, 0x8A50}, //14121 #CJK UNIFIED IDEOGRAPH + {0xDEF2, 0x8A5E}, //14122 #CJK UNIFIED IDEOGRAPH + {0xDEF3, 0x8B1D}, //14123 #CJK UNIFIED IDEOGRAPH + {0xDEF4, 0x8CDC}, //14124 #CJK UNIFIED IDEOGRAPH + {0xDEF5, 0x8D66}, //14125 #CJK UNIFIED IDEOGRAPH + {0xDEF6, 0x8FAD}, //14126 #CJK UNIFIED IDEOGRAPH + {0xDEF7, 0x90AA}, //14127 #CJK UNIFIED IDEOGRAPH + {0xDEF8, 0x98FC}, //14128 #CJK UNIFIED IDEOGRAPH + {0xDEF9, 0x99DF}, //14129 #CJK UNIFIED IDEOGRAPH + {0xDEFA, 0x9E9D}, //14130 #CJK UNIFIED IDEOGRAPH + {0xDEFB, 0x524A}, //14131 #CJK UNIFIED IDEOGRAPH + {0xDEFC, 0xF969}, //14132 #CJK COMPATIBILITY IDEOGRAPH + {0xDEFD, 0x6714}, //14133 #CJK UNIFIED IDEOGRAPH + {0xDEFE, 0xF96A}, //14134 #CJK COMPATIBILITY IDEOGRAPH + {0xDFA1, 0x5098}, //14135 #CJK UNIFIED IDEOGRAPH + {0xDFA2, 0x522A}, //14136 #CJK UNIFIED IDEOGRAPH + {0xDFA3, 0x5C71}, //14137 #CJK UNIFIED IDEOGRAPH + {0xDFA4, 0x6563}, //14138 #CJK UNIFIED IDEOGRAPH + {0xDFA5, 0x6C55}, //14139 #CJK UNIFIED IDEOGRAPH + {0xDFA6, 0x73CA}, //14140 #CJK UNIFIED IDEOGRAPH + {0xDFA7, 0x7523}, //14141 #CJK UNIFIED IDEOGRAPH + {0xDFA8, 0x759D}, //14142 #CJK UNIFIED IDEOGRAPH + {0xDFA9, 0x7B97}, //14143 #CJK UNIFIED IDEOGRAPH + {0xDFAA, 0x849C}, //14144 #CJK UNIFIED IDEOGRAPH + {0xDFAB, 0x9178}, //14145 #CJK UNIFIED IDEOGRAPH + {0xDFAC, 0x9730}, //14146 #CJK UNIFIED IDEOGRAPH + {0xDFAD, 0x4E77}, //14147 #CJK UNIFIED IDEOGRAPH + {0xDFAE, 0x6492}, //14148 #CJK UNIFIED IDEOGRAPH + {0xDFAF, 0x6BBA}, //14149 #CJK UNIFIED IDEOGRAPH + {0xDFB0, 0x715E}, //14150 #CJK UNIFIED IDEOGRAPH + {0xDFB1, 0x85A9}, //14151 #CJK UNIFIED IDEOGRAPH + {0xDFB2, 0x4E09}, //14152 #CJK UNIFIED IDEOGRAPH + {0xDFB3, 0xF96B}, //14153 #CJK COMPATIBILITY IDEOGRAPH + {0xDFB4, 0x6749}, //14154 #CJK UNIFIED IDEOGRAPH + {0xDFB5, 0x68EE}, //14155 #CJK UNIFIED IDEOGRAPH + {0xDFB6, 0x6E17}, //14156 #CJK UNIFIED IDEOGRAPH + {0xDFB7, 0x829F}, //14157 #CJK UNIFIED IDEOGRAPH + {0xDFB8, 0x8518}, //14158 #CJK UNIFIED IDEOGRAPH + {0xDFB9, 0x886B}, //14159 #CJK UNIFIED IDEOGRAPH + {0xDFBA, 0x63F7}, //14160 #CJK UNIFIED IDEOGRAPH + {0xDFBB, 0x6F81}, //14161 #CJK UNIFIED IDEOGRAPH + {0xDFBC, 0x9212}, //14162 #CJK UNIFIED IDEOGRAPH + {0xDFBD, 0x98AF}, //14163 #CJK UNIFIED IDEOGRAPH + {0xDFBE, 0x4E0A}, //14164 #CJK UNIFIED IDEOGRAPH + {0xDFBF, 0x50B7}, //14165 #CJK UNIFIED IDEOGRAPH + {0xDFC0, 0x50CF}, //14166 #CJK UNIFIED IDEOGRAPH + {0xDFC1, 0x511F}, //14167 #CJK UNIFIED IDEOGRAPH + {0xDFC2, 0x5546}, //14168 #CJK UNIFIED IDEOGRAPH + {0xDFC3, 0x55AA}, //14169 #CJK UNIFIED IDEOGRAPH + {0xDFC4, 0x5617}, //14170 #CJK UNIFIED IDEOGRAPH + {0xDFC5, 0x5B40}, //14171 #CJK UNIFIED IDEOGRAPH + {0xDFC6, 0x5C19}, //14172 #CJK UNIFIED IDEOGRAPH + {0xDFC7, 0x5CE0}, //14173 #CJK UNIFIED IDEOGRAPH + {0xDFC8, 0x5E38}, //14174 #CJK UNIFIED IDEOGRAPH + {0xDFC9, 0x5E8A}, //14175 #CJK UNIFIED IDEOGRAPH + {0xDFCA, 0x5EA0}, //14176 #CJK UNIFIED IDEOGRAPH + {0xDFCB, 0x5EC2}, //14177 #CJK UNIFIED IDEOGRAPH + {0xDFCC, 0x60F3}, //14178 #CJK UNIFIED IDEOGRAPH + {0xDFCD, 0x6851}, //14179 #CJK UNIFIED IDEOGRAPH + {0xDFCE, 0x6A61}, //14180 #CJK UNIFIED IDEOGRAPH + {0xDFCF, 0x6E58}, //14181 #CJK UNIFIED IDEOGRAPH + {0xDFD0, 0x723D}, //14182 #CJK UNIFIED IDEOGRAPH + {0xDFD1, 0x7240}, //14183 #CJK UNIFIED IDEOGRAPH + {0xDFD2, 0x72C0}, //14184 #CJK UNIFIED IDEOGRAPH + {0xDFD3, 0x76F8}, //14185 #CJK UNIFIED IDEOGRAPH + {0xDFD4, 0x7965}, //14186 #CJK UNIFIED IDEOGRAPH + {0xDFD5, 0x7BB1}, //14187 #CJK UNIFIED IDEOGRAPH + {0xDFD6, 0x7FD4}, //14188 #CJK UNIFIED IDEOGRAPH + {0xDFD7, 0x88F3}, //14189 #CJK UNIFIED IDEOGRAPH + {0xDFD8, 0x89F4}, //14190 #CJK UNIFIED IDEOGRAPH + {0xDFD9, 0x8A73}, //14191 #CJK UNIFIED IDEOGRAPH + {0xDFDA, 0x8C61}, //14192 #CJK UNIFIED IDEOGRAPH + {0xDFDB, 0x8CDE}, //14193 #CJK UNIFIED IDEOGRAPH + {0xDFDC, 0x971C}, //14194 #CJK UNIFIED IDEOGRAPH + {0xDFDD, 0x585E}, //14195 #CJK UNIFIED IDEOGRAPH + {0xDFDE, 0x74BD}, //14196 #CJK UNIFIED IDEOGRAPH + {0xDFDF, 0x8CFD}, //14197 #CJK UNIFIED IDEOGRAPH + {0xDFE0, 0x55C7}, //14198 #CJK UNIFIED IDEOGRAPH + {0xDFE1, 0xF96C}, //14199 #CJK COMPATIBILITY IDEOGRAPH + {0xDFE2, 0x7A61}, //14200 #CJK UNIFIED IDEOGRAPH + {0xDFE3, 0x7D22}, //14201 #CJK UNIFIED IDEOGRAPH + {0xDFE4, 0x8272}, //14202 #CJK UNIFIED IDEOGRAPH + {0xDFE5, 0x7272}, //14203 #CJK UNIFIED IDEOGRAPH + {0xDFE6, 0x751F}, //14204 #CJK UNIFIED IDEOGRAPH + {0xDFE7, 0x7525}, //14205 #CJK UNIFIED IDEOGRAPH + {0xDFE8, 0xF96D}, //14206 #CJK COMPATIBILITY IDEOGRAPH + {0xDFE9, 0x7B19}, //14207 #CJK UNIFIED IDEOGRAPH + {0xDFEA, 0x5885}, //14208 #CJK UNIFIED IDEOGRAPH + {0xDFEB, 0x58FB}, //14209 #CJK UNIFIED IDEOGRAPH + {0xDFEC, 0x5DBC}, //14210 #CJK UNIFIED IDEOGRAPH + {0xDFED, 0x5E8F}, //14211 #CJK UNIFIED IDEOGRAPH + {0xDFEE, 0x5EB6}, //14212 #CJK UNIFIED IDEOGRAPH + {0xDFEF, 0x5F90}, //14213 #CJK UNIFIED IDEOGRAPH + {0xDFF0, 0x6055}, //14214 #CJK UNIFIED IDEOGRAPH + {0xDFF1, 0x6292}, //14215 #CJK UNIFIED IDEOGRAPH + {0xDFF2, 0x637F}, //14216 #CJK UNIFIED IDEOGRAPH + {0xDFF3, 0x654D}, //14217 #CJK UNIFIED IDEOGRAPH + {0xDFF4, 0x6691}, //14218 #CJK UNIFIED IDEOGRAPH + {0xDFF5, 0x66D9}, //14219 #CJK UNIFIED IDEOGRAPH + {0xDFF6, 0x66F8}, //14220 #CJK UNIFIED IDEOGRAPH + {0xDFF7, 0x6816}, //14221 #CJK UNIFIED IDEOGRAPH + {0xDFF8, 0x68F2}, //14222 #CJK UNIFIED IDEOGRAPH + {0xDFF9, 0x7280}, //14223 #CJK UNIFIED IDEOGRAPH + {0xDFFA, 0x745E}, //14224 #CJK UNIFIED IDEOGRAPH + {0xDFFB, 0x7B6E}, //14225 #CJK UNIFIED IDEOGRAPH + {0xDFFC, 0x7D6E}, //14226 #CJK UNIFIED IDEOGRAPH + {0xDFFD, 0x7DD6}, //14227 #CJK UNIFIED IDEOGRAPH + {0xDFFE, 0x7F72}, //14228 #CJK UNIFIED IDEOGRAPH + {0xE0A1, 0x80E5}, //14229 #CJK UNIFIED IDEOGRAPH + {0xE0A2, 0x8212}, //14230 #CJK UNIFIED IDEOGRAPH + {0xE0A3, 0x85AF}, //14231 #CJK UNIFIED IDEOGRAPH + {0xE0A4, 0x897F}, //14232 #CJK UNIFIED IDEOGRAPH + {0xE0A5, 0x8A93}, //14233 #CJK UNIFIED IDEOGRAPH + {0xE0A6, 0x901D}, //14234 #CJK UNIFIED IDEOGRAPH + {0xE0A7, 0x92E4}, //14235 #CJK UNIFIED IDEOGRAPH + {0xE0A8, 0x9ECD}, //14236 #CJK UNIFIED IDEOGRAPH + {0xE0A9, 0x9F20}, //14237 #CJK UNIFIED IDEOGRAPH + {0xE0AA, 0x5915}, //14238 #CJK UNIFIED IDEOGRAPH + {0xE0AB, 0x596D}, //14239 #CJK UNIFIED IDEOGRAPH + {0xE0AC, 0x5E2D}, //14240 #CJK UNIFIED IDEOGRAPH + {0xE0AD, 0x60DC}, //14241 #CJK UNIFIED IDEOGRAPH + {0xE0AE, 0x6614}, //14242 #CJK UNIFIED IDEOGRAPH + {0xE0AF, 0x6673}, //14243 #CJK UNIFIED IDEOGRAPH + {0xE0B0, 0x6790}, //14244 #CJK UNIFIED IDEOGRAPH + {0xE0B1, 0x6C50}, //14245 #CJK UNIFIED IDEOGRAPH + {0xE0B2, 0x6DC5}, //14246 #CJK UNIFIED IDEOGRAPH + {0xE0B3, 0x6F5F}, //14247 #CJK UNIFIED IDEOGRAPH + {0xE0B4, 0x77F3}, //14248 #CJK UNIFIED IDEOGRAPH + {0xE0B5, 0x78A9}, //14249 #CJK UNIFIED IDEOGRAPH + {0xE0B6, 0x84C6}, //14250 #CJK UNIFIED IDEOGRAPH + {0xE0B7, 0x91CB}, //14251 #CJK UNIFIED IDEOGRAPH + {0xE0B8, 0x932B}, //14252 #CJK UNIFIED IDEOGRAPH + {0xE0B9, 0x4ED9}, //14253 #CJK UNIFIED IDEOGRAPH + {0xE0BA, 0x50CA}, //14254 #CJK UNIFIED IDEOGRAPH + {0xE0BB, 0x5148}, //14255 #CJK UNIFIED IDEOGRAPH + {0xE0BC, 0x5584}, //14256 #CJK UNIFIED IDEOGRAPH + {0xE0BD, 0x5B0B}, //14257 #CJK UNIFIED IDEOGRAPH + {0xE0BE, 0x5BA3}, //14258 #CJK UNIFIED IDEOGRAPH + {0xE0BF, 0x6247}, //14259 #CJK UNIFIED IDEOGRAPH + {0xE0C0, 0x657E}, //14260 #CJK UNIFIED IDEOGRAPH + {0xE0C1, 0x65CB}, //14261 #CJK UNIFIED IDEOGRAPH + {0xE0C2, 0x6E32}, //14262 #CJK UNIFIED IDEOGRAPH + {0xE0C3, 0x717D}, //14263 #CJK UNIFIED IDEOGRAPH + {0xE0C4, 0x7401}, //14264 #CJK UNIFIED IDEOGRAPH + {0xE0C5, 0x7444}, //14265 #CJK UNIFIED IDEOGRAPH + {0xE0C6, 0x7487}, //14266 #CJK UNIFIED IDEOGRAPH + {0xE0C7, 0x74BF}, //14267 #CJK UNIFIED IDEOGRAPH + {0xE0C8, 0x766C}, //14268 #CJK UNIFIED IDEOGRAPH + {0xE0C9, 0x79AA}, //14269 #CJK UNIFIED IDEOGRAPH + {0xE0CA, 0x7DDA}, //14270 #CJK UNIFIED IDEOGRAPH + {0xE0CB, 0x7E55}, //14271 #CJK UNIFIED IDEOGRAPH + {0xE0CC, 0x7FA8}, //14272 #CJK UNIFIED IDEOGRAPH + {0xE0CD, 0x817A}, //14273 #CJK UNIFIED IDEOGRAPH + {0xE0CE, 0x81B3}, //14274 #CJK UNIFIED IDEOGRAPH + {0xE0CF, 0x8239}, //14275 #CJK UNIFIED IDEOGRAPH + {0xE0D0, 0x861A}, //14276 #CJK UNIFIED IDEOGRAPH + {0xE0D1, 0x87EC}, //14277 #CJK UNIFIED IDEOGRAPH + {0xE0D2, 0x8A75}, //14278 #CJK UNIFIED IDEOGRAPH + {0xE0D3, 0x8DE3}, //14279 #CJK UNIFIED IDEOGRAPH + {0xE0D4, 0x9078}, //14280 #CJK UNIFIED IDEOGRAPH + {0xE0D5, 0x9291}, //14281 #CJK UNIFIED IDEOGRAPH + {0xE0D6, 0x9425}, //14282 #CJK UNIFIED IDEOGRAPH + {0xE0D7, 0x994D}, //14283 #CJK UNIFIED IDEOGRAPH + {0xE0D8, 0x9BAE}, //14284 #CJK UNIFIED IDEOGRAPH + {0xE0D9, 0x5368}, //14285 #CJK UNIFIED IDEOGRAPH + {0xE0DA, 0x5C51}, //14286 #CJK UNIFIED IDEOGRAPH + {0xE0DB, 0x6954}, //14287 #CJK UNIFIED IDEOGRAPH + {0xE0DC, 0x6CC4}, //14288 #CJK UNIFIED IDEOGRAPH + {0xE0DD, 0x6D29}, //14289 #CJK UNIFIED IDEOGRAPH + {0xE0DE, 0x6E2B}, //14290 #CJK UNIFIED IDEOGRAPH + {0xE0DF, 0x820C}, //14291 #CJK UNIFIED IDEOGRAPH + {0xE0E0, 0x859B}, //14292 #CJK UNIFIED IDEOGRAPH + {0xE0E1, 0x893B}, //14293 #CJK UNIFIED IDEOGRAPH + {0xE0E2, 0x8A2D}, //14294 #CJK UNIFIED IDEOGRAPH + {0xE0E3, 0x8AAA}, //14295 #CJK UNIFIED IDEOGRAPH + {0xE0E4, 0x96EA}, //14296 #CJK UNIFIED IDEOGRAPH + {0xE0E5, 0x9F67}, //14297 #CJK UNIFIED IDEOGRAPH + {0xE0E6, 0x5261}, //14298 #CJK UNIFIED IDEOGRAPH + {0xE0E7, 0x66B9}, //14299 #CJK UNIFIED IDEOGRAPH + {0xE0E8, 0x6BB2}, //14300 #CJK UNIFIED IDEOGRAPH + {0xE0E9, 0x7E96}, //14301 #CJK UNIFIED IDEOGRAPH + {0xE0EA, 0x87FE}, //14302 #CJK UNIFIED IDEOGRAPH + {0xE0EB, 0x8D0D}, //14303 #CJK UNIFIED IDEOGRAPH + {0xE0EC, 0x9583}, //14304 #CJK UNIFIED IDEOGRAPH + {0xE0ED, 0x965D}, //14305 #CJK UNIFIED IDEOGRAPH + {0xE0EE, 0x651D}, //14306 #CJK UNIFIED IDEOGRAPH + {0xE0EF, 0x6D89}, //14307 #CJK UNIFIED IDEOGRAPH + {0xE0F0, 0x71EE}, //14308 #CJK UNIFIED IDEOGRAPH + {0xE0F1, 0xF96E}, //14309 #CJK COMPATIBILITY IDEOGRAPH + {0xE0F2, 0x57CE}, //14310 #CJK UNIFIED IDEOGRAPH + {0xE0F3, 0x59D3}, //14311 #CJK UNIFIED IDEOGRAPH + {0xE0F4, 0x5BAC}, //14312 #CJK UNIFIED IDEOGRAPH + {0xE0F5, 0x6027}, //14313 #CJK UNIFIED IDEOGRAPH + {0xE0F6, 0x60FA}, //14314 #CJK UNIFIED IDEOGRAPH + {0xE0F7, 0x6210}, //14315 #CJK UNIFIED IDEOGRAPH + {0xE0F8, 0x661F}, //14316 #CJK UNIFIED IDEOGRAPH + {0xE0F9, 0x665F}, //14317 #CJK UNIFIED IDEOGRAPH + {0xE0FA, 0x7329}, //14318 #CJK UNIFIED IDEOGRAPH + {0xE0FB, 0x73F9}, //14319 #CJK UNIFIED IDEOGRAPH + {0xE0FC, 0x76DB}, //14320 #CJK UNIFIED IDEOGRAPH + {0xE0FD, 0x7701}, //14321 #CJK UNIFIED IDEOGRAPH + {0xE0FE, 0x7B6C}, //14322 #CJK UNIFIED IDEOGRAPH + {0xE1A1, 0x8056}, //14323 #CJK UNIFIED IDEOGRAPH + {0xE1A2, 0x8072}, //14324 #CJK UNIFIED IDEOGRAPH + {0xE1A3, 0x8165}, //14325 #CJK UNIFIED IDEOGRAPH + {0xE1A4, 0x8AA0}, //14326 #CJK UNIFIED IDEOGRAPH + {0xE1A5, 0x9192}, //14327 #CJK UNIFIED IDEOGRAPH + {0xE1A6, 0x4E16}, //14328 #CJK UNIFIED IDEOGRAPH + {0xE1A7, 0x52E2}, //14329 #CJK UNIFIED IDEOGRAPH + {0xE1A8, 0x6B72}, //14330 #CJK UNIFIED IDEOGRAPH + {0xE1A9, 0x6D17}, //14331 #CJK UNIFIED IDEOGRAPH + {0xE1AA, 0x7A05}, //14332 #CJK UNIFIED IDEOGRAPH + {0xE1AB, 0x7B39}, //14333 #CJK UNIFIED IDEOGRAPH + {0xE1AC, 0x7D30}, //14334 #CJK UNIFIED IDEOGRAPH + {0xE1AD, 0xF96F}, //14335 #CJK COMPATIBILITY IDEOGRAPH + {0xE1AE, 0x8CB0}, //14336 #CJK UNIFIED IDEOGRAPH + {0xE1AF, 0x53EC}, //14337 #CJK UNIFIED IDEOGRAPH + {0xE1B0, 0x562F}, //14338 #CJK UNIFIED IDEOGRAPH + {0xE1B1, 0x5851}, //14339 #CJK UNIFIED IDEOGRAPH + {0xE1B2, 0x5BB5}, //14340 #CJK UNIFIED IDEOGRAPH + {0xE1B3, 0x5C0F}, //14341 #CJK UNIFIED IDEOGRAPH + {0xE1B4, 0x5C11}, //14342 #CJK UNIFIED IDEOGRAPH + {0xE1B5, 0x5DE2}, //14343 #CJK UNIFIED IDEOGRAPH + {0xE1B6, 0x6240}, //14344 #CJK UNIFIED IDEOGRAPH + {0xE1B7, 0x6383}, //14345 #CJK UNIFIED IDEOGRAPH + {0xE1B8, 0x6414}, //14346 #CJK UNIFIED IDEOGRAPH + {0xE1B9, 0x662D}, //14347 #CJK UNIFIED IDEOGRAPH + {0xE1BA, 0x68B3}, //14348 #CJK UNIFIED IDEOGRAPH + {0xE1BB, 0x6CBC}, //14349 #CJK UNIFIED IDEOGRAPH + {0xE1BC, 0x6D88}, //14350 #CJK UNIFIED IDEOGRAPH + {0xE1BD, 0x6EAF}, //14351 #CJK UNIFIED IDEOGRAPH + {0xE1BE, 0x701F}, //14352 #CJK UNIFIED IDEOGRAPH + {0xE1BF, 0x70A4}, //14353 #CJK UNIFIED IDEOGRAPH + {0xE1C0, 0x71D2}, //14354 #CJK UNIFIED IDEOGRAPH + {0xE1C1, 0x7526}, //14355 #CJK UNIFIED IDEOGRAPH + {0xE1C2, 0x758F}, //14356 #CJK UNIFIED IDEOGRAPH + {0xE1C3, 0x758E}, //14357 #CJK UNIFIED IDEOGRAPH + {0xE1C4, 0x7619}, //14358 #CJK UNIFIED IDEOGRAPH + {0xE1C5, 0x7B11}, //14359 #CJK UNIFIED IDEOGRAPH + {0xE1C6, 0x7BE0}, //14360 #CJK UNIFIED IDEOGRAPH + {0xE1C7, 0x7C2B}, //14361 #CJK UNIFIED IDEOGRAPH + {0xE1C8, 0x7D20}, //14362 #CJK UNIFIED IDEOGRAPH + {0xE1C9, 0x7D39}, //14363 #CJK UNIFIED IDEOGRAPH + {0xE1CA, 0x852C}, //14364 #CJK UNIFIED IDEOGRAPH + {0xE1CB, 0x856D}, //14365 #CJK UNIFIED IDEOGRAPH + {0xE1CC, 0x8607}, //14366 #CJK UNIFIED IDEOGRAPH + {0xE1CD, 0x8A34}, //14367 #CJK UNIFIED IDEOGRAPH + {0xE1CE, 0x900D}, //14368 #CJK UNIFIED IDEOGRAPH + {0xE1CF, 0x9061}, //14369 #CJK UNIFIED IDEOGRAPH + {0xE1D0, 0x90B5}, //14370 #CJK UNIFIED IDEOGRAPH + {0xE1D1, 0x92B7}, //14371 #CJK UNIFIED IDEOGRAPH + {0xE1D2, 0x97F6}, //14372 #CJK UNIFIED IDEOGRAPH + {0xE1D3, 0x9A37}, //14373 #CJK UNIFIED IDEOGRAPH + {0xE1D4, 0x4FD7}, //14374 #CJK UNIFIED IDEOGRAPH + {0xE1D5, 0x5C6C}, //14375 #CJK UNIFIED IDEOGRAPH + {0xE1D6, 0x675F}, //14376 #CJK UNIFIED IDEOGRAPH + {0xE1D7, 0x6D91}, //14377 #CJK UNIFIED IDEOGRAPH + {0xE1D8, 0x7C9F}, //14378 #CJK UNIFIED IDEOGRAPH + {0xE1D9, 0x7E8C}, //14379 #CJK UNIFIED IDEOGRAPH + {0xE1DA, 0x8B16}, //14380 #CJK UNIFIED IDEOGRAPH + {0xE1DB, 0x8D16}, //14381 #CJK UNIFIED IDEOGRAPH + {0xE1DC, 0x901F}, //14382 #CJK UNIFIED IDEOGRAPH + {0xE1DD, 0x5B6B}, //14383 #CJK UNIFIED IDEOGRAPH + {0xE1DE, 0x5DFD}, //14384 #CJK UNIFIED IDEOGRAPH + {0xE1DF, 0x640D}, //14385 #CJK UNIFIED IDEOGRAPH + {0xE1E0, 0x84C0}, //14386 #CJK UNIFIED IDEOGRAPH + {0xE1E1, 0x905C}, //14387 #CJK UNIFIED IDEOGRAPH + {0xE1E2, 0x98E1}, //14388 #CJK UNIFIED IDEOGRAPH + {0xE1E3, 0x7387}, //14389 #CJK UNIFIED IDEOGRAPH + {0xE1E4, 0x5B8B}, //14390 #CJK UNIFIED IDEOGRAPH + {0xE1E5, 0x609A}, //14391 #CJK UNIFIED IDEOGRAPH + {0xE1E6, 0x677E}, //14392 #CJK UNIFIED IDEOGRAPH + {0xE1E7, 0x6DDE}, //14393 #CJK UNIFIED IDEOGRAPH + {0xE1E8, 0x8A1F}, //14394 #CJK UNIFIED IDEOGRAPH + {0xE1E9, 0x8AA6}, //14395 #CJK UNIFIED IDEOGRAPH + {0xE1EA, 0x9001}, //14396 #CJK UNIFIED IDEOGRAPH + {0xE1EB, 0x980C}, //14397 #CJK UNIFIED IDEOGRAPH + {0xE1EC, 0x5237}, //14398 #CJK UNIFIED IDEOGRAPH + {0xE1ED, 0xF970}, //14399 #CJK COMPATIBILITY IDEOGRAPH + {0xE1EE, 0x7051}, //14400 #CJK UNIFIED IDEOGRAPH + {0xE1EF, 0x788E}, //14401 #CJK UNIFIED IDEOGRAPH + {0xE1F0, 0x9396}, //14402 #CJK UNIFIED IDEOGRAPH + {0xE1F1, 0x8870}, //14403 #CJK UNIFIED IDEOGRAPH + {0xE1F2, 0x91D7}, //14404 #CJK UNIFIED IDEOGRAPH + {0xE1F3, 0x4FEE}, //14405 #CJK UNIFIED IDEOGRAPH + {0xE1F4, 0x53D7}, //14406 #CJK UNIFIED IDEOGRAPH + {0xE1F5, 0x55FD}, //14407 #CJK UNIFIED IDEOGRAPH + {0xE1F6, 0x56DA}, //14408 #CJK UNIFIED IDEOGRAPH + {0xE1F7, 0x5782}, //14409 #CJK UNIFIED IDEOGRAPH + {0xE1F8, 0x58FD}, //14410 #CJK UNIFIED IDEOGRAPH + {0xE1F9, 0x5AC2}, //14411 #CJK UNIFIED IDEOGRAPH + {0xE1FA, 0x5B88}, //14412 #CJK UNIFIED IDEOGRAPH + {0xE1FB, 0x5CAB}, //14413 #CJK UNIFIED IDEOGRAPH + {0xE1FC, 0x5CC0}, //14414 #CJK UNIFIED IDEOGRAPH + {0xE1FD, 0x5E25}, //14415 #CJK UNIFIED IDEOGRAPH + {0xE1FE, 0x6101}, //14416 #CJK UNIFIED IDEOGRAPH + {0xE2A1, 0x620D}, //14417 #CJK UNIFIED IDEOGRAPH + {0xE2A2, 0x624B}, //14418 #CJK UNIFIED IDEOGRAPH + {0xE2A3, 0x6388}, //14419 #CJK UNIFIED IDEOGRAPH + {0xE2A4, 0x641C}, //14420 #CJK UNIFIED IDEOGRAPH + {0xE2A5, 0x6536}, //14421 #CJK UNIFIED IDEOGRAPH + {0xE2A6, 0x6578}, //14422 #CJK UNIFIED IDEOGRAPH + {0xE2A7, 0x6A39}, //14423 #CJK UNIFIED IDEOGRAPH + {0xE2A8, 0x6B8A}, //14424 #CJK UNIFIED IDEOGRAPH + {0xE2A9, 0x6C34}, //14425 #CJK UNIFIED IDEOGRAPH + {0xE2AA, 0x6D19}, //14426 #CJK UNIFIED IDEOGRAPH + {0xE2AB, 0x6F31}, //14427 #CJK UNIFIED IDEOGRAPH + {0xE2AC, 0x71E7}, //14428 #CJK UNIFIED IDEOGRAPH + {0xE2AD, 0x72E9}, //14429 #CJK UNIFIED IDEOGRAPH + {0xE2AE, 0x7378}, //14430 #CJK UNIFIED IDEOGRAPH + {0xE2AF, 0x7407}, //14431 #CJK UNIFIED IDEOGRAPH + {0xE2B0, 0x74B2}, //14432 #CJK UNIFIED IDEOGRAPH + {0xE2B1, 0x7626}, //14433 #CJK UNIFIED IDEOGRAPH + {0xE2B2, 0x7761}, //14434 #CJK UNIFIED IDEOGRAPH + {0xE2B3, 0x79C0}, //14435 #CJK UNIFIED IDEOGRAPH + {0xE2B4, 0x7A57}, //14436 #CJK UNIFIED IDEOGRAPH + {0xE2B5, 0x7AEA}, //14437 #CJK UNIFIED IDEOGRAPH + {0xE2B6, 0x7CB9}, //14438 #CJK UNIFIED IDEOGRAPH + {0xE2B7, 0x7D8F}, //14439 #CJK UNIFIED IDEOGRAPH + {0xE2B8, 0x7DAC}, //14440 #CJK UNIFIED IDEOGRAPH + {0xE2B9, 0x7E61}, //14441 #CJK UNIFIED IDEOGRAPH + {0xE2BA, 0x7F9E}, //14442 #CJK UNIFIED IDEOGRAPH + {0xE2BB, 0x8129}, //14443 #CJK UNIFIED IDEOGRAPH + {0xE2BC, 0x8331}, //14444 #CJK UNIFIED IDEOGRAPH + {0xE2BD, 0x8490}, //14445 #CJK UNIFIED IDEOGRAPH + {0xE2BE, 0x84DA}, //14446 #CJK UNIFIED IDEOGRAPH + {0xE2BF, 0x85EA}, //14447 #CJK UNIFIED IDEOGRAPH + {0xE2C0, 0x8896}, //14448 #CJK UNIFIED IDEOGRAPH + {0xE2C1, 0x8AB0}, //14449 #CJK UNIFIED IDEOGRAPH + {0xE2C2, 0x8B90}, //14450 #CJK UNIFIED IDEOGRAPH + {0xE2C3, 0x8F38}, //14451 #CJK UNIFIED IDEOGRAPH + {0xE2C4, 0x9042}, //14452 #CJK UNIFIED IDEOGRAPH + {0xE2C5, 0x9083}, //14453 #CJK UNIFIED IDEOGRAPH + {0xE2C6, 0x916C}, //14454 #CJK UNIFIED IDEOGRAPH + {0xE2C7, 0x9296}, //14455 #CJK UNIFIED IDEOGRAPH + {0xE2C8, 0x92B9}, //14456 #CJK UNIFIED IDEOGRAPH + {0xE2C9, 0x968B}, //14457 #CJK UNIFIED IDEOGRAPH + {0xE2CA, 0x96A7}, //14458 #CJK UNIFIED IDEOGRAPH + {0xE2CB, 0x96A8}, //14459 #CJK UNIFIED IDEOGRAPH + {0xE2CC, 0x96D6}, //14460 #CJK UNIFIED IDEOGRAPH + {0xE2CD, 0x9700}, //14461 #CJK UNIFIED IDEOGRAPH + {0xE2CE, 0x9808}, //14462 #CJK UNIFIED IDEOGRAPH + {0xE2CF, 0x9996}, //14463 #CJK UNIFIED IDEOGRAPH + {0xE2D0, 0x9AD3}, //14464 #CJK UNIFIED IDEOGRAPH + {0xE2D1, 0x9B1A}, //14465 #CJK UNIFIED IDEOGRAPH + {0xE2D2, 0x53D4}, //14466 #CJK UNIFIED IDEOGRAPH + {0xE2D3, 0x587E}, //14467 #CJK UNIFIED IDEOGRAPH + {0xE2D4, 0x5919}, //14468 #CJK UNIFIED IDEOGRAPH + {0xE2D5, 0x5B70}, //14469 #CJK UNIFIED IDEOGRAPH + {0xE2D6, 0x5BBF}, //14470 #CJK UNIFIED IDEOGRAPH + {0xE2D7, 0x6DD1}, //14471 #CJK UNIFIED IDEOGRAPH + {0xE2D8, 0x6F5A}, //14472 #CJK UNIFIED IDEOGRAPH + {0xE2D9, 0x719F}, //14473 #CJK UNIFIED IDEOGRAPH + {0xE2DA, 0x7421}, //14474 #CJK UNIFIED IDEOGRAPH + {0xE2DB, 0x74B9}, //14475 #CJK UNIFIED IDEOGRAPH + {0xE2DC, 0x8085}, //14476 #CJK UNIFIED IDEOGRAPH + {0xE2DD, 0x83FD}, //14477 #CJK UNIFIED IDEOGRAPH + {0xE2DE, 0x5DE1}, //14478 #CJK UNIFIED IDEOGRAPH + {0xE2DF, 0x5F87}, //14479 #CJK UNIFIED IDEOGRAPH + {0xE2E0, 0x5FAA}, //14480 #CJK UNIFIED IDEOGRAPH + {0xE2E1, 0x6042}, //14481 #CJK UNIFIED IDEOGRAPH + {0xE2E2, 0x65EC}, //14482 #CJK UNIFIED IDEOGRAPH + {0xE2E3, 0x6812}, //14483 #CJK UNIFIED IDEOGRAPH + {0xE2E4, 0x696F}, //14484 #CJK UNIFIED IDEOGRAPH + {0xE2E5, 0x6A53}, //14485 #CJK UNIFIED IDEOGRAPH + {0xE2E6, 0x6B89}, //14486 #CJK UNIFIED IDEOGRAPH + {0xE2E7, 0x6D35}, //14487 #CJK UNIFIED IDEOGRAPH + {0xE2E8, 0x6DF3}, //14488 #CJK UNIFIED IDEOGRAPH + {0xE2E9, 0x73E3}, //14489 #CJK UNIFIED IDEOGRAPH + {0xE2EA, 0x76FE}, //14490 #CJK UNIFIED IDEOGRAPH + {0xE2EB, 0x77AC}, //14491 #CJK UNIFIED IDEOGRAPH + {0xE2EC, 0x7B4D}, //14492 #CJK UNIFIED IDEOGRAPH + {0xE2ED, 0x7D14}, //14493 #CJK UNIFIED IDEOGRAPH + {0xE2EE, 0x8123}, //14494 #CJK UNIFIED IDEOGRAPH + {0xE2EF, 0x821C}, //14495 #CJK UNIFIED IDEOGRAPH + {0xE2F0, 0x8340}, //14496 #CJK UNIFIED IDEOGRAPH + {0xE2F1, 0x84F4}, //14497 #CJK UNIFIED IDEOGRAPH + {0xE2F2, 0x8563}, //14498 #CJK UNIFIED IDEOGRAPH + {0xE2F3, 0x8A62}, //14499 #CJK UNIFIED IDEOGRAPH + {0xE2F4, 0x8AC4}, //14500 #CJK UNIFIED IDEOGRAPH + {0xE2F5, 0x9187}, //14501 #CJK UNIFIED IDEOGRAPH + {0xE2F6, 0x931E}, //14502 #CJK UNIFIED IDEOGRAPH + {0xE2F7, 0x9806}, //14503 #CJK UNIFIED IDEOGRAPH + {0xE2F8, 0x99B4}, //14504 #CJK UNIFIED IDEOGRAPH + {0xE2F9, 0x620C}, //14505 #CJK UNIFIED IDEOGRAPH + {0xE2FA, 0x8853}, //14506 #CJK UNIFIED IDEOGRAPH + {0xE2FB, 0x8FF0}, //14507 #CJK UNIFIED IDEOGRAPH + {0xE2FC, 0x9265}, //14508 #CJK UNIFIED IDEOGRAPH + {0xE2FD, 0x5D07}, //14509 #CJK UNIFIED IDEOGRAPH + {0xE2FE, 0x5D27}, //14510 #CJK UNIFIED IDEOGRAPH + {0xE3A1, 0x5D69}, //14511 #CJK UNIFIED IDEOGRAPH + {0xE3A2, 0x745F}, //14512 #CJK UNIFIED IDEOGRAPH + {0xE3A3, 0x819D}, //14513 #CJK UNIFIED IDEOGRAPH + {0xE3A4, 0x8768}, //14514 #CJK UNIFIED IDEOGRAPH + {0xE3A5, 0x6FD5}, //14515 #CJK UNIFIED IDEOGRAPH + {0xE3A6, 0x62FE}, //14516 #CJK UNIFIED IDEOGRAPH + {0xE3A7, 0x7FD2}, //14517 #CJK UNIFIED IDEOGRAPH + {0xE3A8, 0x8936}, //14518 #CJK UNIFIED IDEOGRAPH + {0xE3A9, 0x8972}, //14519 #CJK UNIFIED IDEOGRAPH + {0xE3AA, 0x4E1E}, //14520 #CJK UNIFIED IDEOGRAPH + {0xE3AB, 0x4E58}, //14521 #CJK UNIFIED IDEOGRAPH + {0xE3AC, 0x50E7}, //14522 #CJK UNIFIED IDEOGRAPH + {0xE3AD, 0x52DD}, //14523 #CJK UNIFIED IDEOGRAPH + {0xE3AE, 0x5347}, //14524 #CJK UNIFIED IDEOGRAPH + {0xE3AF, 0x627F}, //14525 #CJK UNIFIED IDEOGRAPH + {0xE3B0, 0x6607}, //14526 #CJK UNIFIED IDEOGRAPH + {0xE3B1, 0x7E69}, //14527 #CJK UNIFIED IDEOGRAPH + {0xE3B2, 0x8805}, //14528 #CJK UNIFIED IDEOGRAPH + {0xE3B3, 0x965E}, //14529 #CJK UNIFIED IDEOGRAPH + {0xE3B4, 0x4F8D}, //14530 #CJK UNIFIED IDEOGRAPH + {0xE3B5, 0x5319}, //14531 #CJK UNIFIED IDEOGRAPH + {0xE3B6, 0x5636}, //14532 #CJK UNIFIED IDEOGRAPH + {0xE3B7, 0x59CB}, //14533 #CJK UNIFIED IDEOGRAPH + {0xE3B8, 0x5AA4}, //14534 #CJK UNIFIED IDEOGRAPH + {0xE3B9, 0x5C38}, //14535 #CJK UNIFIED IDEOGRAPH + {0xE3BA, 0x5C4E}, //14536 #CJK UNIFIED IDEOGRAPH + {0xE3BB, 0x5C4D}, //14537 #CJK UNIFIED IDEOGRAPH + {0xE3BC, 0x5E02}, //14538 #CJK UNIFIED IDEOGRAPH + {0xE3BD, 0x5F11}, //14539 #CJK UNIFIED IDEOGRAPH + {0xE3BE, 0x6043}, //14540 #CJK UNIFIED IDEOGRAPH + {0xE3BF, 0x65BD}, //14541 #CJK UNIFIED IDEOGRAPH + {0xE3C0, 0x662F}, //14542 #CJK UNIFIED IDEOGRAPH + {0xE3C1, 0x6642}, //14543 #CJK UNIFIED IDEOGRAPH + {0xE3C2, 0x67BE}, //14544 #CJK UNIFIED IDEOGRAPH + {0xE3C3, 0x67F4}, //14545 #CJK UNIFIED IDEOGRAPH + {0xE3C4, 0x731C}, //14546 #CJK UNIFIED IDEOGRAPH + {0xE3C5, 0x77E2}, //14547 #CJK UNIFIED IDEOGRAPH + {0xE3C6, 0x793A}, //14548 #CJK UNIFIED IDEOGRAPH + {0xE3C7, 0x7FC5}, //14549 #CJK UNIFIED IDEOGRAPH + {0xE3C8, 0x8494}, //14550 #CJK UNIFIED IDEOGRAPH + {0xE3C9, 0x84CD}, //14551 #CJK UNIFIED IDEOGRAPH + {0xE3CA, 0x8996}, //14552 #CJK UNIFIED IDEOGRAPH + {0xE3CB, 0x8A66}, //14553 #CJK UNIFIED IDEOGRAPH + {0xE3CC, 0x8A69}, //14554 #CJK UNIFIED IDEOGRAPH + {0xE3CD, 0x8AE1}, //14555 #CJK UNIFIED IDEOGRAPH + {0xE3CE, 0x8C55}, //14556 #CJK UNIFIED IDEOGRAPH + {0xE3CF, 0x8C7A}, //14557 #CJK UNIFIED IDEOGRAPH + {0xE3D0, 0x57F4}, //14558 #CJK UNIFIED IDEOGRAPH + {0xE3D1, 0x5BD4}, //14559 #CJK UNIFIED IDEOGRAPH + {0xE3D2, 0x5F0F}, //14560 #CJK UNIFIED IDEOGRAPH + {0xE3D3, 0x606F}, //14561 #CJK UNIFIED IDEOGRAPH + {0xE3D4, 0x62ED}, //14562 #CJK UNIFIED IDEOGRAPH + {0xE3D5, 0x690D}, //14563 #CJK UNIFIED IDEOGRAPH + {0xE3D6, 0x6B96}, //14564 #CJK UNIFIED IDEOGRAPH + {0xE3D7, 0x6E5C}, //14565 #CJK UNIFIED IDEOGRAPH + {0xE3D8, 0x7184}, //14566 #CJK UNIFIED IDEOGRAPH + {0xE3D9, 0x7BD2}, //14567 #CJK UNIFIED IDEOGRAPH + {0xE3DA, 0x8755}, //14568 #CJK UNIFIED IDEOGRAPH + {0xE3DB, 0x8B58}, //14569 #CJK UNIFIED IDEOGRAPH + {0xE3DC, 0x8EFE}, //14570 #CJK UNIFIED IDEOGRAPH + {0xE3DD, 0x98DF}, //14571 #CJK UNIFIED IDEOGRAPH + {0xE3DE, 0x98FE}, //14572 #CJK UNIFIED IDEOGRAPH + {0xE3DF, 0x4F38}, //14573 #CJK UNIFIED IDEOGRAPH + {0xE3E0, 0x4F81}, //14574 #CJK UNIFIED IDEOGRAPH + {0xE3E1, 0x4FE1}, //14575 #CJK UNIFIED IDEOGRAPH + {0xE3E2, 0x547B}, //14576 #CJK UNIFIED IDEOGRAPH + {0xE3E3, 0x5A20}, //14577 #CJK UNIFIED IDEOGRAPH + {0xE3E4, 0x5BB8}, //14578 #CJK UNIFIED IDEOGRAPH + {0xE3E5, 0x613C}, //14579 #CJK UNIFIED IDEOGRAPH + {0xE3E6, 0x65B0}, //14580 #CJK UNIFIED IDEOGRAPH + {0xE3E7, 0x6668}, //14581 #CJK UNIFIED IDEOGRAPH + {0xE3E8, 0x71FC}, //14582 #CJK UNIFIED IDEOGRAPH + {0xE3E9, 0x7533}, //14583 #CJK UNIFIED IDEOGRAPH + {0xE3EA, 0x795E}, //14584 #CJK UNIFIED IDEOGRAPH + {0xE3EB, 0x7D33}, //14585 #CJK UNIFIED IDEOGRAPH + {0xE3EC, 0x814E}, //14586 #CJK UNIFIED IDEOGRAPH + {0xE3ED, 0x81E3}, //14587 #CJK UNIFIED IDEOGRAPH + {0xE3EE, 0x8398}, //14588 #CJK UNIFIED IDEOGRAPH + {0xE3EF, 0x85AA}, //14589 #CJK UNIFIED IDEOGRAPH + {0xE3F0, 0x85CE}, //14590 #CJK UNIFIED IDEOGRAPH + {0xE3F1, 0x8703}, //14591 #CJK UNIFIED IDEOGRAPH + {0xE3F2, 0x8A0A}, //14592 #CJK UNIFIED IDEOGRAPH + {0xE3F3, 0x8EAB}, //14593 #CJK UNIFIED IDEOGRAPH + {0xE3F4, 0x8F9B}, //14594 #CJK UNIFIED IDEOGRAPH + {0xE3F5, 0xF971}, //14595 #CJK COMPATIBILITY IDEOGRAPH + {0xE3F6, 0x8FC5}, //14596 #CJK UNIFIED IDEOGRAPH + {0xE3F7, 0x5931}, //14597 #CJK UNIFIED IDEOGRAPH + {0xE3F8, 0x5BA4}, //14598 #CJK UNIFIED IDEOGRAPH + {0xE3F9, 0x5BE6}, //14599 #CJK UNIFIED IDEOGRAPH + {0xE3FA, 0x6089}, //14600 #CJK UNIFIED IDEOGRAPH + {0xE3FB, 0x5BE9}, //14601 #CJK UNIFIED IDEOGRAPH + {0xE3FC, 0x5C0B}, //14602 #CJK UNIFIED IDEOGRAPH + {0xE3FD, 0x5FC3}, //14603 #CJK UNIFIED IDEOGRAPH + {0xE3FE, 0x6C81}, //14604 #CJK UNIFIED IDEOGRAPH + {0xE4A1, 0xF972}, //14605 #CJK COMPATIBILITY IDEOGRAPH + {0xE4A2, 0x6DF1}, //14606 #CJK UNIFIED IDEOGRAPH + {0xE4A3, 0x700B}, //14607 #CJK UNIFIED IDEOGRAPH + {0xE4A4, 0x751A}, //14608 #CJK UNIFIED IDEOGRAPH + {0xE4A5, 0x82AF}, //14609 #CJK UNIFIED IDEOGRAPH + {0xE4A6, 0x8AF6}, //14610 #CJK UNIFIED IDEOGRAPH + {0xE4A7, 0x4EC0}, //14611 #CJK UNIFIED IDEOGRAPH + {0xE4A8, 0x5341}, //14612 #CJK UNIFIED IDEOGRAPH + {0xE4A9, 0xF973}, //14613 #CJK COMPATIBILITY IDEOGRAPH + {0xE4AA, 0x96D9}, //14614 #CJK UNIFIED IDEOGRAPH + {0xE4AB, 0x6C0F}, //14615 #CJK UNIFIED IDEOGRAPH + {0xE4AC, 0x4E9E}, //14616 #CJK UNIFIED IDEOGRAPH + {0xE4AD, 0x4FC4}, //14617 #CJK UNIFIED IDEOGRAPH + {0xE4AE, 0x5152}, //14618 #CJK UNIFIED IDEOGRAPH + {0xE4AF, 0x555E}, //14619 #CJK UNIFIED IDEOGRAPH + {0xE4B0, 0x5A25}, //14620 #CJK UNIFIED IDEOGRAPH + {0xE4B1, 0x5CE8}, //14621 #CJK UNIFIED IDEOGRAPH + {0xE4B2, 0x6211}, //14622 #CJK UNIFIED IDEOGRAPH + {0xE4B3, 0x7259}, //14623 #CJK UNIFIED IDEOGRAPH + {0xE4B4, 0x82BD}, //14624 #CJK UNIFIED IDEOGRAPH + {0xE4B5, 0x83AA}, //14625 #CJK UNIFIED IDEOGRAPH + {0xE4B6, 0x86FE}, //14626 #CJK UNIFIED IDEOGRAPH + {0xE4B7, 0x8859}, //14627 #CJK UNIFIED IDEOGRAPH + {0xE4B8, 0x8A1D}, //14628 #CJK UNIFIED IDEOGRAPH + {0xE4B9, 0x963F}, //14629 #CJK UNIFIED IDEOGRAPH + {0xE4BA, 0x96C5}, //14630 #CJK UNIFIED IDEOGRAPH + {0xE4BB, 0x9913}, //14631 #CJK UNIFIED IDEOGRAPH + {0xE4BC, 0x9D09}, //14632 #CJK UNIFIED IDEOGRAPH + {0xE4BD, 0x9D5D}, //14633 #CJK UNIFIED IDEOGRAPH + {0xE4BE, 0x580A}, //14634 #CJK UNIFIED IDEOGRAPH + {0xE4BF, 0x5CB3}, //14635 #CJK UNIFIED IDEOGRAPH + {0xE4C0, 0x5DBD}, //14636 #CJK UNIFIED IDEOGRAPH + {0xE4C1, 0x5E44}, //14637 #CJK UNIFIED IDEOGRAPH + {0xE4C2, 0x60E1}, //14638 #CJK UNIFIED IDEOGRAPH + {0xE4C3, 0x6115}, //14639 #CJK UNIFIED IDEOGRAPH + {0xE4C4, 0x63E1}, //14640 #CJK UNIFIED IDEOGRAPH + {0xE4C5, 0x6A02}, //14641 #CJK UNIFIED IDEOGRAPH + {0xE4C6, 0x6E25}, //14642 #CJK UNIFIED IDEOGRAPH + {0xE4C7, 0x9102}, //14643 #CJK UNIFIED IDEOGRAPH + {0xE4C8, 0x9354}, //14644 #CJK UNIFIED IDEOGRAPH + {0xE4C9, 0x984E}, //14645 #CJK UNIFIED IDEOGRAPH + {0xE4CA, 0x9C10}, //14646 #CJK UNIFIED IDEOGRAPH + {0xE4CB, 0x9F77}, //14647 #CJK UNIFIED IDEOGRAPH + {0xE4CC, 0x5B89}, //14648 #CJK UNIFIED IDEOGRAPH + {0xE4CD, 0x5CB8}, //14649 #CJK UNIFIED IDEOGRAPH + {0xE4CE, 0x6309}, //14650 #CJK UNIFIED IDEOGRAPH + {0xE4CF, 0x664F}, //14651 #CJK UNIFIED IDEOGRAPH + {0xE4D0, 0x6848}, //14652 #CJK UNIFIED IDEOGRAPH + {0xE4D1, 0x773C}, //14653 #CJK UNIFIED IDEOGRAPH + {0xE4D2, 0x96C1}, //14654 #CJK UNIFIED IDEOGRAPH + {0xE4D3, 0x978D}, //14655 #CJK UNIFIED IDEOGRAPH + {0xE4D4, 0x9854}, //14656 #CJK UNIFIED IDEOGRAPH + {0xE4D5, 0x9B9F}, //14657 #CJK UNIFIED IDEOGRAPH + {0xE4D6, 0x65A1}, //14658 #CJK UNIFIED IDEOGRAPH + {0xE4D7, 0x8B01}, //14659 #CJK UNIFIED IDEOGRAPH + {0xE4D8, 0x8ECB}, //14660 #CJK UNIFIED IDEOGRAPH + {0xE4D9, 0x95BC}, //14661 #CJK UNIFIED IDEOGRAPH + {0xE4DA, 0x5535}, //14662 #CJK UNIFIED IDEOGRAPH + {0xE4DB, 0x5CA9}, //14663 #CJK UNIFIED IDEOGRAPH + {0xE4DC, 0x5DD6}, //14664 #CJK UNIFIED IDEOGRAPH + {0xE4DD, 0x5EB5}, //14665 #CJK UNIFIED IDEOGRAPH + {0xE4DE, 0x6697}, //14666 #CJK UNIFIED IDEOGRAPH + {0xE4DF, 0x764C}, //14667 #CJK UNIFIED IDEOGRAPH + {0xE4E0, 0x83F4}, //14668 #CJK UNIFIED IDEOGRAPH + {0xE4E1, 0x95C7}, //14669 #CJK UNIFIED IDEOGRAPH + {0xE4E2, 0x58D3}, //14670 #CJK UNIFIED IDEOGRAPH + {0xE4E3, 0x62BC}, //14671 #CJK UNIFIED IDEOGRAPH + {0xE4E4, 0x72CE}, //14672 #CJK UNIFIED IDEOGRAPH + {0xE4E5, 0x9D28}, //14673 #CJK UNIFIED IDEOGRAPH + {0xE4E6, 0x4EF0}, //14674 #CJK UNIFIED IDEOGRAPH + {0xE4E7, 0x592E}, //14675 #CJK UNIFIED IDEOGRAPH + {0xE4E8, 0x600F}, //14676 #CJK UNIFIED IDEOGRAPH + {0xE4E9, 0x663B}, //14677 #CJK UNIFIED IDEOGRAPH + {0xE4EA, 0x6B83}, //14678 #CJK UNIFIED IDEOGRAPH + {0xE4EB, 0x79E7}, //14679 #CJK UNIFIED IDEOGRAPH + {0xE4EC, 0x9D26}, //14680 #CJK UNIFIED IDEOGRAPH + {0xE4ED, 0x5393}, //14681 #CJK UNIFIED IDEOGRAPH + {0xE4EE, 0x54C0}, //14682 #CJK UNIFIED IDEOGRAPH + {0xE4EF, 0x57C3}, //14683 #CJK UNIFIED IDEOGRAPH + {0xE4F0, 0x5D16}, //14684 #CJK UNIFIED IDEOGRAPH + {0xE4F1, 0x611B}, //14685 #CJK UNIFIED IDEOGRAPH + {0xE4F2, 0x66D6}, //14686 #CJK UNIFIED IDEOGRAPH + {0xE4F3, 0x6DAF}, //14687 #CJK UNIFIED IDEOGRAPH + {0xE4F4, 0x788D}, //14688 #CJK UNIFIED IDEOGRAPH + {0xE4F5, 0x827E}, //14689 #CJK UNIFIED IDEOGRAPH + {0xE4F6, 0x9698}, //14690 #CJK UNIFIED IDEOGRAPH + {0xE4F7, 0x9744}, //14691 #CJK UNIFIED IDEOGRAPH + {0xE4F8, 0x5384}, //14692 #CJK UNIFIED IDEOGRAPH + {0xE4F9, 0x627C}, //14693 #CJK UNIFIED IDEOGRAPH + {0xE4FA, 0x6396}, //14694 #CJK UNIFIED IDEOGRAPH + {0xE4FB, 0x6DB2}, //14695 #CJK UNIFIED IDEOGRAPH + {0xE4FC, 0x7E0A}, //14696 #CJK UNIFIED IDEOGRAPH + {0xE4FD, 0x814B}, //14697 #CJK UNIFIED IDEOGRAPH + {0xE4FE, 0x984D}, //14698 #CJK UNIFIED IDEOGRAPH + {0xE5A1, 0x6AFB}, //14699 #CJK UNIFIED IDEOGRAPH + {0xE5A2, 0x7F4C}, //14700 #CJK UNIFIED IDEOGRAPH + {0xE5A3, 0x9DAF}, //14701 #CJK UNIFIED IDEOGRAPH + {0xE5A4, 0x9E1A}, //14702 #CJK UNIFIED IDEOGRAPH + {0xE5A5, 0x4E5F}, //14703 #CJK UNIFIED IDEOGRAPH + {0xE5A6, 0x503B}, //14704 #CJK UNIFIED IDEOGRAPH + {0xE5A7, 0x51B6}, //14705 #CJK UNIFIED IDEOGRAPH + {0xE5A8, 0x591C}, //14706 #CJK UNIFIED IDEOGRAPH + {0xE5A9, 0x60F9}, //14707 #CJK UNIFIED IDEOGRAPH + {0xE5AA, 0x63F6}, //14708 #CJK UNIFIED IDEOGRAPH + {0xE5AB, 0x6930}, //14709 #CJK UNIFIED IDEOGRAPH + {0xE5AC, 0x723A}, //14710 #CJK UNIFIED IDEOGRAPH + {0xE5AD, 0x8036}, //14711 #CJK UNIFIED IDEOGRAPH + {0xE5AE, 0xF974}, //14712 #CJK COMPATIBILITY IDEOGRAPH + {0xE5AF, 0x91CE}, //14713 #CJK UNIFIED IDEOGRAPH + {0xE5B0, 0x5F31}, //14714 #CJK UNIFIED IDEOGRAPH + {0xE5B1, 0xF975}, //14715 #CJK COMPATIBILITY IDEOGRAPH + {0xE5B2, 0xF976}, //14716 #CJK COMPATIBILITY IDEOGRAPH + {0xE5B3, 0x7D04}, //14717 #CJK UNIFIED IDEOGRAPH + {0xE5B4, 0x82E5}, //14718 #CJK UNIFIED IDEOGRAPH + {0xE5B5, 0x846F}, //14719 #CJK UNIFIED IDEOGRAPH + {0xE5B6, 0x84BB}, //14720 #CJK UNIFIED IDEOGRAPH + {0xE5B7, 0x85E5}, //14721 #CJK UNIFIED IDEOGRAPH + {0xE5B8, 0x8E8D}, //14722 #CJK UNIFIED IDEOGRAPH + {0xE5B9, 0xF977}, //14723 #CJK COMPATIBILITY IDEOGRAPH + {0xE5BA, 0x4F6F}, //14724 #CJK UNIFIED IDEOGRAPH + {0xE5BB, 0xF978}, //14725 #CJK COMPATIBILITY IDEOGRAPH + {0xE5BC, 0xF979}, //14726 #CJK COMPATIBILITY IDEOGRAPH + {0xE5BD, 0x58E4}, //14727 #CJK UNIFIED IDEOGRAPH + {0xE5BE, 0x5B43}, //14728 #CJK UNIFIED IDEOGRAPH + {0xE5BF, 0x6059}, //14729 #CJK UNIFIED IDEOGRAPH + {0xE5C0, 0x63DA}, //14730 #CJK UNIFIED IDEOGRAPH + {0xE5C1, 0x6518}, //14731 #CJK UNIFIED IDEOGRAPH + {0xE5C2, 0x656D}, //14732 #CJK UNIFIED IDEOGRAPH + {0xE5C3, 0x6698}, //14733 #CJK UNIFIED IDEOGRAPH + {0xE5C4, 0xF97A}, //14734 #CJK COMPATIBILITY IDEOGRAPH + {0xE5C5, 0x694A}, //14735 #CJK UNIFIED IDEOGRAPH + {0xE5C6, 0x6A23}, //14736 #CJK UNIFIED IDEOGRAPH + {0xE5C7, 0x6D0B}, //14737 #CJK UNIFIED IDEOGRAPH + {0xE5C8, 0x7001}, //14738 #CJK UNIFIED IDEOGRAPH + {0xE5C9, 0x716C}, //14739 #CJK UNIFIED IDEOGRAPH + {0xE5CA, 0x75D2}, //14740 #CJK UNIFIED IDEOGRAPH + {0xE5CB, 0x760D}, //14741 #CJK UNIFIED IDEOGRAPH + {0xE5CC, 0x79B3}, //14742 #CJK UNIFIED IDEOGRAPH + {0xE5CD, 0x7A70}, //14743 #CJK UNIFIED IDEOGRAPH + {0xE5CE, 0xF97B}, //14744 #CJK COMPATIBILITY IDEOGRAPH + {0xE5CF, 0x7F8A}, //14745 #CJK UNIFIED IDEOGRAPH + {0xE5D0, 0xF97C}, //14746 #CJK COMPATIBILITY IDEOGRAPH + {0xE5D1, 0x8944}, //14747 #CJK UNIFIED IDEOGRAPH + {0xE5D2, 0xF97D}, //14748 #CJK COMPATIBILITY IDEOGRAPH + {0xE5D3, 0x8B93}, //14749 #CJK UNIFIED IDEOGRAPH + {0xE5D4, 0x91C0}, //14750 #CJK UNIFIED IDEOGRAPH + {0xE5D5, 0x967D}, //14751 #CJK UNIFIED IDEOGRAPH + {0xE5D6, 0xF97E}, //14752 #CJK COMPATIBILITY IDEOGRAPH + {0xE5D7, 0x990A}, //14753 #CJK UNIFIED IDEOGRAPH + {0xE5D8, 0x5704}, //14754 #CJK UNIFIED IDEOGRAPH + {0xE5D9, 0x5FA1}, //14755 #CJK UNIFIED IDEOGRAPH + {0xE5DA, 0x65BC}, //14756 #CJK UNIFIED IDEOGRAPH + {0xE5DB, 0x6F01}, //14757 #CJK UNIFIED IDEOGRAPH + {0xE5DC, 0x7600}, //14758 #CJK UNIFIED IDEOGRAPH + {0xE5DD, 0x79A6}, //14759 #CJK UNIFIED IDEOGRAPH + {0xE5DE, 0x8A9E}, //14760 #CJK UNIFIED IDEOGRAPH + {0xE5DF, 0x99AD}, //14761 #CJK UNIFIED IDEOGRAPH + {0xE5E0, 0x9B5A}, //14762 #CJK UNIFIED IDEOGRAPH + {0xE5E1, 0x9F6C}, //14763 #CJK UNIFIED IDEOGRAPH + {0xE5E2, 0x5104}, //14764 #CJK UNIFIED IDEOGRAPH + {0xE5E3, 0x61B6}, //14765 #CJK UNIFIED IDEOGRAPH + {0xE5E4, 0x6291}, //14766 #CJK UNIFIED IDEOGRAPH + {0xE5E5, 0x6A8D}, //14767 #CJK UNIFIED IDEOGRAPH + {0xE5E6, 0x81C6}, //14768 #CJK UNIFIED IDEOGRAPH + {0xE5E7, 0x5043}, //14769 #CJK UNIFIED IDEOGRAPH + {0xE5E8, 0x5830}, //14770 #CJK UNIFIED IDEOGRAPH + {0xE5E9, 0x5F66}, //14771 #CJK UNIFIED IDEOGRAPH + {0xE5EA, 0x7109}, //14772 #CJK UNIFIED IDEOGRAPH + {0xE5EB, 0x8A00}, //14773 #CJK UNIFIED IDEOGRAPH + {0xE5EC, 0x8AFA}, //14774 #CJK UNIFIED IDEOGRAPH + {0xE5ED, 0x5B7C}, //14775 #CJK UNIFIED IDEOGRAPH + {0xE5EE, 0x8616}, //14776 #CJK UNIFIED IDEOGRAPH + {0xE5EF, 0x4FFA}, //14777 #CJK UNIFIED IDEOGRAPH + {0xE5F0, 0x513C}, //14778 #CJK UNIFIED IDEOGRAPH + {0xE5F1, 0x56B4}, //14779 #CJK UNIFIED IDEOGRAPH + {0xE5F2, 0x5944}, //14780 #CJK UNIFIED IDEOGRAPH + {0xE5F3, 0x63A9}, //14781 #CJK UNIFIED IDEOGRAPH + {0xE5F4, 0x6DF9}, //14782 #CJK UNIFIED IDEOGRAPH + {0xE5F5, 0x5DAA}, //14783 #CJK UNIFIED IDEOGRAPH + {0xE5F6, 0x696D}, //14784 #CJK UNIFIED IDEOGRAPH + {0xE5F7, 0x5186}, //14785 #CJK UNIFIED IDEOGRAPH + {0xE5F8, 0x4E88}, //14786 #CJK UNIFIED IDEOGRAPH + {0xE5F9, 0x4F59}, //14787 #CJK UNIFIED IDEOGRAPH + {0xE5FA, 0xF97F}, //14788 #CJK COMPATIBILITY IDEOGRAPH + {0xE5FB, 0xF980}, //14789 #CJK COMPATIBILITY IDEOGRAPH + {0xE5FC, 0xF981}, //14790 #CJK COMPATIBILITY IDEOGRAPH + {0xE5FD, 0x5982}, //14791 #CJK UNIFIED IDEOGRAPH + {0xE5FE, 0xF982}, //14792 #CJK COMPATIBILITY IDEOGRAPH + {0xE6A1, 0xF983}, //14793 #CJK COMPATIBILITY IDEOGRAPH + {0xE6A2, 0x6B5F}, //14794 #CJK UNIFIED IDEOGRAPH + {0xE6A3, 0x6C5D}, //14795 #CJK UNIFIED IDEOGRAPH + {0xE6A4, 0xF984}, //14796 #CJK COMPATIBILITY IDEOGRAPH + {0xE6A5, 0x74B5}, //14797 #CJK UNIFIED IDEOGRAPH + {0xE6A6, 0x7916}, //14798 #CJK UNIFIED IDEOGRAPH + {0xE6A7, 0xF985}, //14799 #CJK COMPATIBILITY IDEOGRAPH + {0xE6A8, 0x8207}, //14800 #CJK UNIFIED IDEOGRAPH + {0xE6A9, 0x8245}, //14801 #CJK UNIFIED IDEOGRAPH + {0xE6AA, 0x8339}, //14802 #CJK UNIFIED IDEOGRAPH + {0xE6AB, 0x8F3F}, //14803 #CJK UNIFIED IDEOGRAPH + {0xE6AC, 0x8F5D}, //14804 #CJK UNIFIED IDEOGRAPH + {0xE6AD, 0xF986}, //14805 #CJK COMPATIBILITY IDEOGRAPH + {0xE6AE, 0x9918}, //14806 #CJK UNIFIED IDEOGRAPH + {0xE6AF, 0xF987}, //14807 #CJK COMPATIBILITY IDEOGRAPH + {0xE6B0, 0xF988}, //14808 #CJK COMPATIBILITY IDEOGRAPH + {0xE6B1, 0xF989}, //14809 #CJK COMPATIBILITY IDEOGRAPH + {0xE6B2, 0x4EA6}, //14810 #CJK UNIFIED IDEOGRAPH + {0xE6B3, 0xF98A}, //14811 #CJK COMPATIBILITY IDEOGRAPH + {0xE6B4, 0x57DF}, //14812 #CJK UNIFIED IDEOGRAPH + {0xE6B5, 0x5F79}, //14813 #CJK UNIFIED IDEOGRAPH + {0xE6B6, 0x6613}, //14814 #CJK UNIFIED IDEOGRAPH + {0xE6B7, 0xF98B}, //14815 #CJK COMPATIBILITY IDEOGRAPH + {0xE6B8, 0xF98C}, //14816 #CJK COMPATIBILITY IDEOGRAPH + {0xE6B9, 0x75AB}, //14817 #CJK UNIFIED IDEOGRAPH + {0xE6BA, 0x7E79}, //14818 #CJK UNIFIED IDEOGRAPH + {0xE6BB, 0x8B6F}, //14819 #CJK UNIFIED IDEOGRAPH + {0xE6BC, 0xF98D}, //14820 #CJK COMPATIBILITY IDEOGRAPH + {0xE6BD, 0x9006}, //14821 #CJK UNIFIED IDEOGRAPH + {0xE6BE, 0x9A5B}, //14822 #CJK UNIFIED IDEOGRAPH + {0xE6BF, 0x56A5}, //14823 #CJK UNIFIED IDEOGRAPH + {0xE6C0, 0x5827}, //14824 #CJK UNIFIED IDEOGRAPH + {0xE6C1, 0x59F8}, //14825 #CJK UNIFIED IDEOGRAPH + {0xE6C2, 0x5A1F}, //14826 #CJK UNIFIED IDEOGRAPH + {0xE6C3, 0x5BB4}, //14827 #CJK UNIFIED IDEOGRAPH + {0xE6C4, 0xF98E}, //14828 #CJK COMPATIBILITY IDEOGRAPH + {0xE6C5, 0x5EF6}, //14829 #CJK UNIFIED IDEOGRAPH + {0xE6C6, 0xF98F}, //14830 #CJK COMPATIBILITY IDEOGRAPH + {0xE6C7, 0xF990}, //14831 #CJK COMPATIBILITY IDEOGRAPH + {0xE6C8, 0x6350}, //14832 #CJK UNIFIED IDEOGRAPH + {0xE6C9, 0x633B}, //14833 #CJK UNIFIED IDEOGRAPH + {0xE6CA, 0xF991}, //14834 #CJK COMPATIBILITY IDEOGRAPH + {0xE6CB, 0x693D}, //14835 #CJK UNIFIED IDEOGRAPH + {0xE6CC, 0x6C87}, //14836 #CJK UNIFIED IDEOGRAPH + {0xE6CD, 0x6CBF}, //14837 #CJK UNIFIED IDEOGRAPH + {0xE6CE, 0x6D8E}, //14838 #CJK UNIFIED IDEOGRAPH + {0xE6CF, 0x6D93}, //14839 #CJK UNIFIED IDEOGRAPH + {0xE6D0, 0x6DF5}, //14840 #CJK UNIFIED IDEOGRAPH + {0xE6D1, 0x6F14}, //14841 #CJK UNIFIED IDEOGRAPH + {0xE6D2, 0xF992}, //14842 #CJK COMPATIBILITY IDEOGRAPH + {0xE6D3, 0x70DF}, //14843 #CJK UNIFIED IDEOGRAPH + {0xE6D4, 0x7136}, //14844 #CJK UNIFIED IDEOGRAPH + {0xE6D5, 0x7159}, //14845 #CJK UNIFIED IDEOGRAPH + {0xE6D6, 0xF993}, //14846 #CJK COMPATIBILITY IDEOGRAPH + {0xE6D7, 0x71C3}, //14847 #CJK UNIFIED IDEOGRAPH + {0xE6D8, 0x71D5}, //14848 #CJK UNIFIED IDEOGRAPH + {0xE6D9, 0xF994}, //14849 #CJK COMPATIBILITY IDEOGRAPH + {0xE6DA, 0x784F}, //14850 #CJK UNIFIED IDEOGRAPH + {0xE6DB, 0x786F}, //14851 #CJK UNIFIED IDEOGRAPH + {0xE6DC, 0xF995}, //14852 #CJK COMPATIBILITY IDEOGRAPH + {0xE6DD, 0x7B75}, //14853 #CJK UNIFIED IDEOGRAPH + {0xE6DE, 0x7DE3}, //14854 #CJK UNIFIED IDEOGRAPH + {0xE6DF, 0xF996}, //14855 #CJK COMPATIBILITY IDEOGRAPH + {0xE6E0, 0x7E2F}, //14856 #CJK UNIFIED IDEOGRAPH + {0xE6E1, 0xF997}, //14857 #CJK COMPATIBILITY IDEOGRAPH + {0xE6E2, 0x884D}, //14858 #CJK UNIFIED IDEOGRAPH + {0xE6E3, 0x8EDF}, //14859 #CJK UNIFIED IDEOGRAPH + {0xE6E4, 0xF998}, //14860 #CJK COMPATIBILITY IDEOGRAPH + {0xE6E5, 0xF999}, //14861 #CJK COMPATIBILITY IDEOGRAPH + {0xE6E6, 0xF99A}, //14862 #CJK COMPATIBILITY IDEOGRAPH + {0xE6E7, 0x925B}, //14863 #CJK UNIFIED IDEOGRAPH + {0xE6E8, 0xF99B}, //14864 #CJK COMPATIBILITY IDEOGRAPH + {0xE6E9, 0x9CF6}, //14865 #CJK UNIFIED IDEOGRAPH + {0xE6EA, 0xF99C}, //14866 #CJK COMPATIBILITY IDEOGRAPH + {0xE6EB, 0xF99D}, //14867 #CJK COMPATIBILITY IDEOGRAPH + {0xE6EC, 0xF99E}, //14868 #CJK COMPATIBILITY IDEOGRAPH + {0xE6ED, 0x6085}, //14869 #CJK UNIFIED IDEOGRAPH + {0xE6EE, 0x6D85}, //14870 #CJK UNIFIED IDEOGRAPH + {0xE6EF, 0xF99F}, //14871 #CJK COMPATIBILITY IDEOGRAPH + {0xE6F0, 0x71B1}, //14872 #CJK UNIFIED IDEOGRAPH + {0xE6F1, 0xF9A0}, //14873 #CJK COMPATIBILITY IDEOGRAPH + {0xE6F2, 0xF9A1}, //14874 #CJK COMPATIBILITY IDEOGRAPH + {0xE6F3, 0x95B1}, //14875 #CJK UNIFIED IDEOGRAPH + {0xE6F4, 0x53AD}, //14876 #CJK UNIFIED IDEOGRAPH + {0xE6F5, 0xF9A2}, //14877 #CJK COMPATIBILITY IDEOGRAPH + {0xE6F6, 0xF9A3}, //14878 #CJK COMPATIBILITY IDEOGRAPH + {0xE6F7, 0xF9A4}, //14879 #CJK COMPATIBILITY IDEOGRAPH + {0xE6F8, 0x67D3}, //14880 #CJK UNIFIED IDEOGRAPH + {0xE6F9, 0xF9A5}, //14881 #CJK COMPATIBILITY IDEOGRAPH + {0xE6FA, 0x708E}, //14882 #CJK UNIFIED IDEOGRAPH + {0xE6FB, 0x7130}, //14883 #CJK UNIFIED IDEOGRAPH + {0xE6FC, 0x7430}, //14884 #CJK UNIFIED IDEOGRAPH + {0xE6FD, 0x8276}, //14885 #CJK UNIFIED IDEOGRAPH + {0xE6FE, 0x82D2}, //14886 #CJK UNIFIED IDEOGRAPH + {0xE7A1, 0xF9A6}, //14887 #CJK COMPATIBILITY IDEOGRAPH + {0xE7A2, 0x95BB}, //14888 #CJK UNIFIED IDEOGRAPH + {0xE7A3, 0x9AE5}, //14889 #CJK UNIFIED IDEOGRAPH + {0xE7A4, 0x9E7D}, //14890 #CJK UNIFIED IDEOGRAPH + {0xE7A5, 0x66C4}, //14891 #CJK UNIFIED IDEOGRAPH + {0xE7A6, 0xF9A7}, //14892 #CJK COMPATIBILITY IDEOGRAPH + {0xE7A7, 0x71C1}, //14893 #CJK UNIFIED IDEOGRAPH + {0xE7A8, 0x8449}, //14894 #CJK UNIFIED IDEOGRAPH + {0xE7A9, 0xF9A8}, //14895 #CJK COMPATIBILITY IDEOGRAPH + {0xE7AA, 0xF9A9}, //14896 #CJK COMPATIBILITY IDEOGRAPH + {0xE7AB, 0x584B}, //14897 #CJK UNIFIED IDEOGRAPH + {0xE7AC, 0xF9AA}, //14898 #CJK COMPATIBILITY IDEOGRAPH + {0xE7AD, 0xF9AB}, //14899 #CJK COMPATIBILITY IDEOGRAPH + {0xE7AE, 0x5DB8}, //14900 #CJK UNIFIED IDEOGRAPH + {0xE7AF, 0x5F71}, //14901 #CJK UNIFIED IDEOGRAPH + {0xE7B0, 0xF9AC}, //14902 #CJK COMPATIBILITY IDEOGRAPH + {0xE7B1, 0x6620}, //14903 #CJK UNIFIED IDEOGRAPH + {0xE7B2, 0x668E}, //14904 #CJK UNIFIED IDEOGRAPH + {0xE7B3, 0x6979}, //14905 #CJK UNIFIED IDEOGRAPH + {0xE7B4, 0x69AE}, //14906 #CJK UNIFIED IDEOGRAPH + {0xE7B5, 0x6C38}, //14907 #CJK UNIFIED IDEOGRAPH + {0xE7B6, 0x6CF3}, //14908 #CJK UNIFIED IDEOGRAPH + {0xE7B7, 0x6E36}, //14909 #CJK UNIFIED IDEOGRAPH + {0xE7B8, 0x6F41}, //14910 #CJK UNIFIED IDEOGRAPH + {0xE7B9, 0x6FDA}, //14911 #CJK UNIFIED IDEOGRAPH + {0xE7BA, 0x701B}, //14912 #CJK UNIFIED IDEOGRAPH + {0xE7BB, 0x702F}, //14913 #CJK UNIFIED IDEOGRAPH + {0xE7BC, 0x7150}, //14914 #CJK UNIFIED IDEOGRAPH + {0xE7BD, 0x71DF}, //14915 #CJK UNIFIED IDEOGRAPH + {0xE7BE, 0x7370}, //14916 #CJK UNIFIED IDEOGRAPH + {0xE7BF, 0xF9AD}, //14917 #CJK COMPATIBILITY IDEOGRAPH + {0xE7C0, 0x745B}, //14918 #CJK UNIFIED IDEOGRAPH + {0xE7C1, 0xF9AE}, //14919 #CJK COMPATIBILITY IDEOGRAPH + {0xE7C2, 0x74D4}, //14920 #CJK UNIFIED IDEOGRAPH + {0xE7C3, 0x76C8}, //14921 #CJK UNIFIED IDEOGRAPH + {0xE7C4, 0x7A4E}, //14922 #CJK UNIFIED IDEOGRAPH + {0xE7C5, 0x7E93}, //14923 #CJK UNIFIED IDEOGRAPH + {0xE7C6, 0xF9AF}, //14924 #CJK COMPATIBILITY IDEOGRAPH + {0xE7C7, 0xF9B0}, //14925 #CJK COMPATIBILITY IDEOGRAPH + {0xE7C8, 0x82F1}, //14926 #CJK UNIFIED IDEOGRAPH + {0xE7C9, 0x8A60}, //14927 #CJK UNIFIED IDEOGRAPH + {0xE7CA, 0x8FCE}, //14928 #CJK UNIFIED IDEOGRAPH + {0xE7CB, 0xF9B1}, //14929 #CJK COMPATIBILITY IDEOGRAPH + {0xE7CC, 0x9348}, //14930 #CJK UNIFIED IDEOGRAPH + {0xE7CD, 0xF9B2}, //14931 #CJK COMPATIBILITY IDEOGRAPH + {0xE7CE, 0x9719}, //14932 #CJK UNIFIED IDEOGRAPH + {0xE7CF, 0xF9B3}, //14933 #CJK COMPATIBILITY IDEOGRAPH + {0xE7D0, 0xF9B4}, //14934 #CJK COMPATIBILITY IDEOGRAPH + {0xE7D1, 0x4E42}, //14935 #CJK UNIFIED IDEOGRAPH + {0xE7D2, 0x502A}, //14936 #CJK UNIFIED IDEOGRAPH + {0xE7D3, 0xF9B5}, //14937 #CJK COMPATIBILITY IDEOGRAPH + {0xE7D4, 0x5208}, //14938 #CJK UNIFIED IDEOGRAPH + {0xE7D5, 0x53E1}, //14939 #CJK UNIFIED IDEOGRAPH + {0xE7D6, 0x66F3}, //14940 #CJK UNIFIED IDEOGRAPH + {0xE7D7, 0x6C6D}, //14941 #CJK UNIFIED IDEOGRAPH + {0xE7D8, 0x6FCA}, //14942 #CJK UNIFIED IDEOGRAPH + {0xE7D9, 0x730A}, //14943 #CJK UNIFIED IDEOGRAPH + {0xE7DA, 0x777F}, //14944 #CJK UNIFIED IDEOGRAPH + {0xE7DB, 0x7A62}, //14945 #CJK UNIFIED IDEOGRAPH + {0xE7DC, 0x82AE}, //14946 #CJK UNIFIED IDEOGRAPH + {0xE7DD, 0x85DD}, //14947 #CJK UNIFIED IDEOGRAPH + {0xE7DE, 0x8602}, //14948 #CJK UNIFIED IDEOGRAPH + {0xE7DF, 0xF9B6}, //14949 #CJK COMPATIBILITY IDEOGRAPH + {0xE7E0, 0x88D4}, //14950 #CJK UNIFIED IDEOGRAPH + {0xE7E1, 0x8A63}, //14951 #CJK UNIFIED IDEOGRAPH + {0xE7E2, 0x8B7D}, //14952 #CJK UNIFIED IDEOGRAPH + {0xE7E3, 0x8C6B}, //14953 #CJK UNIFIED IDEOGRAPH + {0xE7E4, 0xF9B7}, //14954 #CJK COMPATIBILITY IDEOGRAPH + {0xE7E5, 0x92B3}, //14955 #CJK UNIFIED IDEOGRAPH + {0xE7E6, 0xF9B8}, //14956 #CJK COMPATIBILITY IDEOGRAPH + {0xE7E7, 0x9713}, //14957 #CJK UNIFIED IDEOGRAPH + {0xE7E8, 0x9810}, //14958 #CJK UNIFIED IDEOGRAPH + {0xE7E9, 0x4E94}, //14959 #CJK UNIFIED IDEOGRAPH + {0xE7EA, 0x4F0D}, //14960 #CJK UNIFIED IDEOGRAPH + {0xE7EB, 0x4FC9}, //14961 #CJK UNIFIED IDEOGRAPH + {0xE7EC, 0x50B2}, //14962 #CJK UNIFIED IDEOGRAPH + {0xE7ED, 0x5348}, //14963 #CJK UNIFIED IDEOGRAPH + {0xE7EE, 0x543E}, //14964 #CJK UNIFIED IDEOGRAPH + {0xE7EF, 0x5433}, //14965 #CJK UNIFIED IDEOGRAPH + {0xE7F0, 0x55DA}, //14966 #CJK UNIFIED IDEOGRAPH + {0xE7F1, 0x5862}, //14967 #CJK UNIFIED IDEOGRAPH + {0xE7F2, 0x58BA}, //14968 #CJK UNIFIED IDEOGRAPH + {0xE7F3, 0x5967}, //14969 #CJK UNIFIED IDEOGRAPH + {0xE7F4, 0x5A1B}, //14970 #CJK UNIFIED IDEOGRAPH + {0xE7F5, 0x5BE4}, //14971 #CJK UNIFIED IDEOGRAPH + {0xE7F6, 0x609F}, //14972 #CJK UNIFIED IDEOGRAPH + {0xE7F7, 0xF9B9}, //14973 #CJK COMPATIBILITY IDEOGRAPH + {0xE7F8, 0x61CA}, //14974 #CJK UNIFIED IDEOGRAPH + {0xE7F9, 0x6556}, //14975 #CJK UNIFIED IDEOGRAPH + {0xE7FA, 0x65FF}, //14976 #CJK UNIFIED IDEOGRAPH + {0xE7FB, 0x6664}, //14977 #CJK UNIFIED IDEOGRAPH + {0xE7FC, 0x68A7}, //14978 #CJK UNIFIED IDEOGRAPH + {0xE7FD, 0x6C5A}, //14979 #CJK UNIFIED IDEOGRAPH + {0xE7FE, 0x6FB3}, //14980 #CJK UNIFIED IDEOGRAPH + {0xE8A1, 0x70CF}, //14981 #CJK UNIFIED IDEOGRAPH + {0xE8A2, 0x71AC}, //14982 #CJK UNIFIED IDEOGRAPH + {0xE8A3, 0x7352}, //14983 #CJK UNIFIED IDEOGRAPH + {0xE8A4, 0x7B7D}, //14984 #CJK UNIFIED IDEOGRAPH + {0xE8A5, 0x8708}, //14985 #CJK UNIFIED IDEOGRAPH + {0xE8A6, 0x8AA4}, //14986 #CJK UNIFIED IDEOGRAPH + {0xE8A7, 0x9C32}, //14987 #CJK UNIFIED IDEOGRAPH + {0xE8A8, 0x9F07}, //14988 #CJK UNIFIED IDEOGRAPH + {0xE8A9, 0x5C4B}, //14989 #CJK UNIFIED IDEOGRAPH + {0xE8AA, 0x6C83}, //14990 #CJK UNIFIED IDEOGRAPH + {0xE8AB, 0x7344}, //14991 #CJK UNIFIED IDEOGRAPH + {0xE8AC, 0x7389}, //14992 #CJK UNIFIED IDEOGRAPH + {0xE8AD, 0x923A}, //14993 #CJK UNIFIED IDEOGRAPH + {0xE8AE, 0x6EAB}, //14994 #CJK UNIFIED IDEOGRAPH + {0xE8AF, 0x7465}, //14995 #CJK UNIFIED IDEOGRAPH + {0xE8B0, 0x761F}, //14996 #CJK UNIFIED IDEOGRAPH + {0xE8B1, 0x7A69}, //14997 #CJK UNIFIED IDEOGRAPH + {0xE8B2, 0x7E15}, //14998 #CJK UNIFIED IDEOGRAPH + {0xE8B3, 0x860A}, //14999 #CJK UNIFIED IDEOGRAPH + {0xE8B4, 0x5140}, //15000 #CJK UNIFIED IDEOGRAPH + {0xE8B5, 0x58C5}, //15001 #CJK UNIFIED IDEOGRAPH + {0xE8B6, 0x64C1}, //15002 #CJK UNIFIED IDEOGRAPH + {0xE8B7, 0x74EE}, //15003 #CJK UNIFIED IDEOGRAPH + {0xE8B8, 0x7515}, //15004 #CJK UNIFIED IDEOGRAPH + {0xE8B9, 0x7670}, //15005 #CJK UNIFIED IDEOGRAPH + {0xE8BA, 0x7FC1}, //15006 #CJK UNIFIED IDEOGRAPH + {0xE8BB, 0x9095}, //15007 #CJK UNIFIED IDEOGRAPH + {0xE8BC, 0x96CD}, //15008 #CJK UNIFIED IDEOGRAPH + {0xE8BD, 0x9954}, //15009 #CJK UNIFIED IDEOGRAPH + {0xE8BE, 0x6E26}, //15010 #CJK UNIFIED IDEOGRAPH + {0xE8BF, 0x74E6}, //15011 #CJK UNIFIED IDEOGRAPH + {0xE8C0, 0x7AA9}, //15012 #CJK UNIFIED IDEOGRAPH + {0xE8C1, 0x7AAA}, //15013 #CJK UNIFIED IDEOGRAPH + {0xE8C2, 0x81E5}, //15014 #CJK UNIFIED IDEOGRAPH + {0xE8C3, 0x86D9}, //15015 #CJK UNIFIED IDEOGRAPH + {0xE8C4, 0x8778}, //15016 #CJK UNIFIED IDEOGRAPH + {0xE8C5, 0x8A1B}, //15017 #CJK UNIFIED IDEOGRAPH + {0xE8C6, 0x5A49}, //15018 #CJK UNIFIED IDEOGRAPH + {0xE8C7, 0x5B8C}, //15019 #CJK UNIFIED IDEOGRAPH + {0xE8C8, 0x5B9B}, //15020 #CJK UNIFIED IDEOGRAPH + {0xE8C9, 0x68A1}, //15021 #CJK UNIFIED IDEOGRAPH + {0xE8CA, 0x6900}, //15022 #CJK UNIFIED IDEOGRAPH + {0xE8CB, 0x6D63}, //15023 #CJK UNIFIED IDEOGRAPH + {0xE8CC, 0x73A9}, //15024 #CJK UNIFIED IDEOGRAPH + {0xE8CD, 0x7413}, //15025 #CJK UNIFIED IDEOGRAPH + {0xE8CE, 0x742C}, //15026 #CJK UNIFIED IDEOGRAPH + {0xE8CF, 0x7897}, //15027 #CJK UNIFIED IDEOGRAPH + {0xE8D0, 0x7DE9}, //15028 #CJK UNIFIED IDEOGRAPH + {0xE8D1, 0x7FEB}, //15029 #CJK UNIFIED IDEOGRAPH + {0xE8D2, 0x8118}, //15030 #CJK UNIFIED IDEOGRAPH + {0xE8D3, 0x8155}, //15031 #CJK UNIFIED IDEOGRAPH + {0xE8D4, 0x839E}, //15032 #CJK UNIFIED IDEOGRAPH + {0xE8D5, 0x8C4C}, //15033 #CJK UNIFIED IDEOGRAPH + {0xE8D6, 0x962E}, //15034 #CJK UNIFIED IDEOGRAPH + {0xE8D7, 0x9811}, //15035 #CJK UNIFIED IDEOGRAPH + {0xE8D8, 0x66F0}, //15036 #CJK UNIFIED IDEOGRAPH + {0xE8D9, 0x5F80}, //15037 #CJK UNIFIED IDEOGRAPH + {0xE8DA, 0x65FA}, //15038 #CJK UNIFIED IDEOGRAPH + {0xE8DB, 0x6789}, //15039 #CJK UNIFIED IDEOGRAPH + {0xE8DC, 0x6C6A}, //15040 #CJK UNIFIED IDEOGRAPH + {0xE8DD, 0x738B}, //15041 #CJK UNIFIED IDEOGRAPH + {0xE8DE, 0x502D}, //15042 #CJK UNIFIED IDEOGRAPH + {0xE8DF, 0x5A03}, //15043 #CJK UNIFIED IDEOGRAPH + {0xE8E0, 0x6B6A}, //15044 #CJK UNIFIED IDEOGRAPH + {0xE8E1, 0x77EE}, //15045 #CJK UNIFIED IDEOGRAPH + {0xE8E2, 0x5916}, //15046 #CJK UNIFIED IDEOGRAPH + {0xE8E3, 0x5D6C}, //15047 #CJK UNIFIED IDEOGRAPH + {0xE8E4, 0x5DCD}, //15048 #CJK UNIFIED IDEOGRAPH + {0xE8E5, 0x7325}, //15049 #CJK UNIFIED IDEOGRAPH + {0xE8E6, 0x754F}, //15050 #CJK UNIFIED IDEOGRAPH + {0xE8E7, 0xF9BA}, //15051 #CJK COMPATIBILITY IDEOGRAPH + {0xE8E8, 0xF9BB}, //15052 #CJK COMPATIBILITY IDEOGRAPH + {0xE8E9, 0x50E5}, //15053 #CJK UNIFIED IDEOGRAPH + {0xE8EA, 0x51F9}, //15054 #CJK UNIFIED IDEOGRAPH + {0xE8EB, 0x582F}, //15055 #CJK UNIFIED IDEOGRAPH + {0xE8EC, 0x592D}, //15056 #CJK UNIFIED IDEOGRAPH + {0xE8ED, 0x5996}, //15057 #CJK UNIFIED IDEOGRAPH + {0xE8EE, 0x59DA}, //15058 #CJK UNIFIED IDEOGRAPH + {0xE8EF, 0x5BE5}, //15059 #CJK UNIFIED IDEOGRAPH + {0xE8F0, 0xF9BC}, //15060 #CJK COMPATIBILITY IDEOGRAPH + {0xE8F1, 0xF9BD}, //15061 #CJK COMPATIBILITY IDEOGRAPH + {0xE8F2, 0x5DA2}, //15062 #CJK UNIFIED IDEOGRAPH + {0xE8F3, 0x62D7}, //15063 #CJK UNIFIED IDEOGRAPH + {0xE8F4, 0x6416}, //15064 #CJK UNIFIED IDEOGRAPH + {0xE8F5, 0x6493}, //15065 #CJK UNIFIED IDEOGRAPH + {0xE8F6, 0x64FE}, //15066 #CJK UNIFIED IDEOGRAPH + {0xE8F7, 0xF9BE}, //15067 #CJK COMPATIBILITY IDEOGRAPH + {0xE8F8, 0x66DC}, //15068 #CJK UNIFIED IDEOGRAPH + {0xE8F9, 0xF9BF}, //15069 #CJK COMPATIBILITY IDEOGRAPH + {0xE8FA, 0x6A48}, //15070 #CJK UNIFIED IDEOGRAPH + {0xE8FB, 0xF9C0}, //15071 #CJK COMPATIBILITY IDEOGRAPH + {0xE8FC, 0x71FF}, //15072 #CJK UNIFIED IDEOGRAPH + {0xE8FD, 0x7464}, //15073 #CJK UNIFIED IDEOGRAPH + {0xE8FE, 0xF9C1}, //15074 #CJK COMPATIBILITY IDEOGRAPH + {0xE9A1, 0x7A88}, //15075 #CJK UNIFIED IDEOGRAPH + {0xE9A2, 0x7AAF}, //15076 #CJK UNIFIED IDEOGRAPH + {0xE9A3, 0x7E47}, //15077 #CJK UNIFIED IDEOGRAPH + {0xE9A4, 0x7E5E}, //15078 #CJK UNIFIED IDEOGRAPH + {0xE9A5, 0x8000}, //15079 #CJK UNIFIED IDEOGRAPH + {0xE9A6, 0x8170}, //15080 #CJK UNIFIED IDEOGRAPH + {0xE9A7, 0xF9C2}, //15081 #CJK COMPATIBILITY IDEOGRAPH + {0xE9A8, 0x87EF}, //15082 #CJK UNIFIED IDEOGRAPH + {0xE9A9, 0x8981}, //15083 #CJK UNIFIED IDEOGRAPH + {0xE9AA, 0x8B20}, //15084 #CJK UNIFIED IDEOGRAPH + {0xE9AB, 0x9059}, //15085 #CJK UNIFIED IDEOGRAPH + {0xE9AC, 0xF9C3}, //15086 #CJK COMPATIBILITY IDEOGRAPH + {0xE9AD, 0x9080}, //15087 #CJK UNIFIED IDEOGRAPH + {0xE9AE, 0x9952}, //15088 #CJK UNIFIED IDEOGRAPH + {0xE9AF, 0x617E}, //15089 #CJK UNIFIED IDEOGRAPH + {0xE9B0, 0x6B32}, //15090 #CJK UNIFIED IDEOGRAPH + {0xE9B1, 0x6D74}, //15091 #CJK UNIFIED IDEOGRAPH + {0xE9B2, 0x7E1F}, //15092 #CJK UNIFIED IDEOGRAPH + {0xE9B3, 0x8925}, //15093 #CJK UNIFIED IDEOGRAPH + {0xE9B4, 0x8FB1}, //15094 #CJK UNIFIED IDEOGRAPH + {0xE9B5, 0x4FD1}, //15095 #CJK UNIFIED IDEOGRAPH + {0xE9B6, 0x50AD}, //15096 #CJK UNIFIED IDEOGRAPH + {0xE9B7, 0x5197}, //15097 #CJK UNIFIED IDEOGRAPH + {0xE9B8, 0x52C7}, //15098 #CJK UNIFIED IDEOGRAPH + {0xE9B9, 0x57C7}, //15099 #CJK UNIFIED IDEOGRAPH + {0xE9BA, 0x5889}, //15100 #CJK UNIFIED IDEOGRAPH + {0xE9BB, 0x5BB9}, //15101 #CJK UNIFIED IDEOGRAPH + {0xE9BC, 0x5EB8}, //15102 #CJK UNIFIED IDEOGRAPH + {0xE9BD, 0x6142}, //15103 #CJK UNIFIED IDEOGRAPH + {0xE9BE, 0x6995}, //15104 #CJK UNIFIED IDEOGRAPH + {0xE9BF, 0x6D8C}, //15105 #CJK UNIFIED IDEOGRAPH + {0xE9C0, 0x6E67}, //15106 #CJK UNIFIED IDEOGRAPH + {0xE9C1, 0x6EB6}, //15107 #CJK UNIFIED IDEOGRAPH + {0xE9C2, 0x7194}, //15108 #CJK UNIFIED IDEOGRAPH + {0xE9C3, 0x7462}, //15109 #CJK UNIFIED IDEOGRAPH + {0xE9C4, 0x7528}, //15110 #CJK UNIFIED IDEOGRAPH + {0xE9C5, 0x752C}, //15111 #CJK UNIFIED IDEOGRAPH + {0xE9C6, 0x8073}, //15112 #CJK UNIFIED IDEOGRAPH + {0xE9C7, 0x8338}, //15113 #CJK UNIFIED IDEOGRAPH + {0xE9C8, 0x84C9}, //15114 #CJK UNIFIED IDEOGRAPH + {0xE9C9, 0x8E0A}, //15115 #CJK UNIFIED IDEOGRAPH + {0xE9CA, 0x9394}, //15116 #CJK UNIFIED IDEOGRAPH + {0xE9CB, 0x93DE}, //15117 #CJK UNIFIED IDEOGRAPH + {0xE9CC, 0xF9C4}, //15118 #CJK COMPATIBILITY IDEOGRAPH + {0xE9CD, 0x4E8E}, //15119 #CJK UNIFIED IDEOGRAPH + {0xE9CE, 0x4F51}, //15120 #CJK UNIFIED IDEOGRAPH + {0xE9CF, 0x5076}, //15121 #CJK UNIFIED IDEOGRAPH + {0xE9D0, 0x512A}, //15122 #CJK UNIFIED IDEOGRAPH + {0xE9D1, 0x53C8}, //15123 #CJK UNIFIED IDEOGRAPH + {0xE9D2, 0x53CB}, //15124 #CJK UNIFIED IDEOGRAPH + {0xE9D3, 0x53F3}, //15125 #CJK UNIFIED IDEOGRAPH + {0xE9D4, 0x5B87}, //15126 #CJK UNIFIED IDEOGRAPH + {0xE9D5, 0x5BD3}, //15127 #CJK UNIFIED IDEOGRAPH + {0xE9D6, 0x5C24}, //15128 #CJK UNIFIED IDEOGRAPH + {0xE9D7, 0x611A}, //15129 #CJK UNIFIED IDEOGRAPH + {0xE9D8, 0x6182}, //15130 #CJK UNIFIED IDEOGRAPH + {0xE9D9, 0x65F4}, //15131 #CJK UNIFIED IDEOGRAPH + {0xE9DA, 0x725B}, //15132 #CJK UNIFIED IDEOGRAPH + {0xE9DB, 0x7397}, //15133 #CJK UNIFIED IDEOGRAPH + {0xE9DC, 0x7440}, //15134 #CJK UNIFIED IDEOGRAPH + {0xE9DD, 0x76C2}, //15135 #CJK UNIFIED IDEOGRAPH + {0xE9DE, 0x7950}, //15136 #CJK UNIFIED IDEOGRAPH + {0xE9DF, 0x7991}, //15137 #CJK UNIFIED IDEOGRAPH + {0xE9E0, 0x79B9}, //15138 #CJK UNIFIED IDEOGRAPH + {0xE9E1, 0x7D06}, //15139 #CJK UNIFIED IDEOGRAPH + {0xE9E2, 0x7FBD}, //15140 #CJK UNIFIED IDEOGRAPH + {0xE9E3, 0x828B}, //15141 #CJK UNIFIED IDEOGRAPH + {0xE9E4, 0x85D5}, //15142 #CJK UNIFIED IDEOGRAPH + {0xE9E5, 0x865E}, //15143 #CJK UNIFIED IDEOGRAPH + {0xE9E6, 0x8FC2}, //15144 #CJK UNIFIED IDEOGRAPH + {0xE9E7, 0x9047}, //15145 #CJK UNIFIED IDEOGRAPH + {0xE9E8, 0x90F5}, //15146 #CJK UNIFIED IDEOGRAPH + {0xE9E9, 0x91EA}, //15147 #CJK UNIFIED IDEOGRAPH + {0xE9EA, 0x9685}, //15148 #CJK UNIFIED IDEOGRAPH + {0xE9EB, 0x96E8}, //15149 #CJK UNIFIED IDEOGRAPH + {0xE9EC, 0x96E9}, //15150 #CJK UNIFIED IDEOGRAPH + {0xE9ED, 0x52D6}, //15151 #CJK UNIFIED IDEOGRAPH + {0xE9EE, 0x5F67}, //15152 #CJK UNIFIED IDEOGRAPH + {0xE9EF, 0x65ED}, //15153 #CJK UNIFIED IDEOGRAPH + {0xE9F0, 0x6631}, //15154 #CJK UNIFIED IDEOGRAPH + {0xE9F1, 0x682F}, //15155 #CJK UNIFIED IDEOGRAPH + {0xE9F2, 0x715C}, //15156 #CJK UNIFIED IDEOGRAPH + {0xE9F3, 0x7A36}, //15157 #CJK UNIFIED IDEOGRAPH + {0xE9F4, 0x90C1}, //15158 #CJK UNIFIED IDEOGRAPH + {0xE9F5, 0x980A}, //15159 #CJK UNIFIED IDEOGRAPH + {0xE9F6, 0x4E91}, //15160 #CJK UNIFIED IDEOGRAPH + {0xE9F7, 0xF9C5}, //15161 #CJK COMPATIBILITY IDEOGRAPH + {0xE9F8, 0x6A52}, //15162 #CJK UNIFIED IDEOGRAPH + {0xE9F9, 0x6B9E}, //15163 #CJK UNIFIED IDEOGRAPH + {0xE9FA, 0x6F90}, //15164 #CJK UNIFIED IDEOGRAPH + {0xE9FB, 0x7189}, //15165 #CJK UNIFIED IDEOGRAPH + {0xE9FC, 0x8018}, //15166 #CJK UNIFIED IDEOGRAPH + {0xE9FD, 0x82B8}, //15167 #CJK UNIFIED IDEOGRAPH + {0xE9FE, 0x8553}, //15168 #CJK UNIFIED IDEOGRAPH + {0xEAA1, 0x904B}, //15169 #CJK UNIFIED IDEOGRAPH + {0xEAA2, 0x9695}, //15170 #CJK UNIFIED IDEOGRAPH + {0xEAA3, 0x96F2}, //15171 #CJK UNIFIED IDEOGRAPH + {0xEAA4, 0x97FB}, //15172 #CJK UNIFIED IDEOGRAPH + {0xEAA5, 0x851A}, //15173 #CJK UNIFIED IDEOGRAPH + {0xEAA6, 0x9B31}, //15174 #CJK UNIFIED IDEOGRAPH + {0xEAA7, 0x4E90}, //15175 #CJK UNIFIED IDEOGRAPH + {0xEAA8, 0x718A}, //15176 #CJK UNIFIED IDEOGRAPH + {0xEAA9, 0x96C4}, //15177 #CJK UNIFIED IDEOGRAPH + {0xEAAA, 0x5143}, //15178 #CJK UNIFIED IDEOGRAPH + {0xEAAB, 0x539F}, //15179 #CJK UNIFIED IDEOGRAPH + {0xEAAC, 0x54E1}, //15180 #CJK UNIFIED IDEOGRAPH + {0xEAAD, 0x5713}, //15181 #CJK UNIFIED IDEOGRAPH + {0xEAAE, 0x5712}, //15182 #CJK UNIFIED IDEOGRAPH + {0xEAAF, 0x57A3}, //15183 #CJK UNIFIED IDEOGRAPH + {0xEAB0, 0x5A9B}, //15184 #CJK UNIFIED IDEOGRAPH + {0xEAB1, 0x5AC4}, //15185 #CJK UNIFIED IDEOGRAPH + {0xEAB2, 0x5BC3}, //15186 #CJK UNIFIED IDEOGRAPH + {0xEAB3, 0x6028}, //15187 #CJK UNIFIED IDEOGRAPH + {0xEAB4, 0x613F}, //15188 #CJK UNIFIED IDEOGRAPH + {0xEAB5, 0x63F4}, //15189 #CJK UNIFIED IDEOGRAPH + {0xEAB6, 0x6C85}, //15190 #CJK UNIFIED IDEOGRAPH + {0xEAB7, 0x6D39}, //15191 #CJK UNIFIED IDEOGRAPH + {0xEAB8, 0x6E72}, //15192 #CJK UNIFIED IDEOGRAPH + {0xEAB9, 0x6E90}, //15193 #CJK UNIFIED IDEOGRAPH + {0xEABA, 0x7230}, //15194 #CJK UNIFIED IDEOGRAPH + {0xEABB, 0x733F}, //15195 #CJK UNIFIED IDEOGRAPH + {0xEABC, 0x7457}, //15196 #CJK UNIFIED IDEOGRAPH + {0xEABD, 0x82D1}, //15197 #CJK UNIFIED IDEOGRAPH + {0xEABE, 0x8881}, //15198 #CJK UNIFIED IDEOGRAPH + {0xEABF, 0x8F45}, //15199 #CJK UNIFIED IDEOGRAPH + {0xEAC0, 0x9060}, //15200 #CJK UNIFIED IDEOGRAPH + {0xEAC1, 0xF9C6}, //15201 #CJK COMPATIBILITY IDEOGRAPH + {0xEAC2, 0x9662}, //15202 #CJK UNIFIED IDEOGRAPH + {0xEAC3, 0x9858}, //15203 #CJK UNIFIED IDEOGRAPH + {0xEAC4, 0x9D1B}, //15204 #CJK UNIFIED IDEOGRAPH + {0xEAC5, 0x6708}, //15205 #CJK UNIFIED IDEOGRAPH + {0xEAC6, 0x8D8A}, //15206 #CJK UNIFIED IDEOGRAPH + {0xEAC7, 0x925E}, //15207 #CJK UNIFIED IDEOGRAPH + {0xEAC8, 0x4F4D}, //15208 #CJK UNIFIED IDEOGRAPH + {0xEAC9, 0x5049}, //15209 #CJK UNIFIED IDEOGRAPH + {0xEACA, 0x50DE}, //15210 #CJK UNIFIED IDEOGRAPH + {0xEACB, 0x5371}, //15211 #CJK UNIFIED IDEOGRAPH + {0xEACC, 0x570D}, //15212 #CJK UNIFIED IDEOGRAPH + {0xEACD, 0x59D4}, //15213 #CJK UNIFIED IDEOGRAPH + {0xEACE, 0x5A01}, //15214 #CJK UNIFIED IDEOGRAPH + {0xEACF, 0x5C09}, //15215 #CJK UNIFIED IDEOGRAPH + {0xEAD0, 0x6170}, //15216 #CJK UNIFIED IDEOGRAPH + {0xEAD1, 0x6690}, //15217 #CJK UNIFIED IDEOGRAPH + {0xEAD2, 0x6E2D}, //15218 #CJK UNIFIED IDEOGRAPH + {0xEAD3, 0x7232}, //15219 #CJK UNIFIED IDEOGRAPH + {0xEAD4, 0x744B}, //15220 #CJK UNIFIED IDEOGRAPH + {0xEAD5, 0x7DEF}, //15221 #CJK UNIFIED IDEOGRAPH + {0xEAD6, 0x80C3}, //15222 #CJK UNIFIED IDEOGRAPH + {0xEAD7, 0x840E}, //15223 #CJK UNIFIED IDEOGRAPH + {0xEAD8, 0x8466}, //15224 #CJK UNIFIED IDEOGRAPH + {0xEAD9, 0x853F}, //15225 #CJK UNIFIED IDEOGRAPH + {0xEADA, 0x875F}, //15226 #CJK UNIFIED IDEOGRAPH + {0xEADB, 0x885B}, //15227 #CJK UNIFIED IDEOGRAPH + {0xEADC, 0x8918}, //15228 #CJK UNIFIED IDEOGRAPH + {0xEADD, 0x8B02}, //15229 #CJK UNIFIED IDEOGRAPH + {0xEADE, 0x9055}, //15230 #CJK UNIFIED IDEOGRAPH + {0xEADF, 0x97CB}, //15231 #CJK UNIFIED IDEOGRAPH + {0xEAE0, 0x9B4F}, //15232 #CJK UNIFIED IDEOGRAPH + {0xEAE1, 0x4E73}, //15233 #CJK UNIFIED IDEOGRAPH + {0xEAE2, 0x4F91}, //15234 #CJK UNIFIED IDEOGRAPH + {0xEAE3, 0x5112}, //15235 #CJK UNIFIED IDEOGRAPH + {0xEAE4, 0x516A}, //15236 #CJK UNIFIED IDEOGRAPH + {0xEAE5, 0xF9C7}, //15237 #CJK COMPATIBILITY IDEOGRAPH + {0xEAE6, 0x552F}, //15238 #CJK UNIFIED IDEOGRAPH + {0xEAE7, 0x55A9}, //15239 #CJK UNIFIED IDEOGRAPH + {0xEAE8, 0x5B7A}, //15240 #CJK UNIFIED IDEOGRAPH + {0xEAE9, 0x5BA5}, //15241 #CJK UNIFIED IDEOGRAPH + {0xEAEA, 0x5E7C}, //15242 #CJK UNIFIED IDEOGRAPH + {0xEAEB, 0x5E7D}, //15243 #CJK UNIFIED IDEOGRAPH + {0xEAEC, 0x5EBE}, //15244 #CJK UNIFIED IDEOGRAPH + {0xEAED, 0x60A0}, //15245 #CJK UNIFIED IDEOGRAPH + {0xEAEE, 0x60DF}, //15246 #CJK UNIFIED IDEOGRAPH + {0xEAEF, 0x6108}, //15247 #CJK UNIFIED IDEOGRAPH + {0xEAF0, 0x6109}, //15248 #CJK UNIFIED IDEOGRAPH + {0xEAF1, 0x63C4}, //15249 #CJK UNIFIED IDEOGRAPH + {0xEAF2, 0x6538}, //15250 #CJK UNIFIED IDEOGRAPH + {0xEAF3, 0x6709}, //15251 #CJK UNIFIED IDEOGRAPH + {0xEAF4, 0xF9C8}, //15252 #CJK COMPATIBILITY IDEOGRAPH + {0xEAF5, 0x67D4}, //15253 #CJK UNIFIED IDEOGRAPH + {0xEAF6, 0x67DA}, //15254 #CJK UNIFIED IDEOGRAPH + {0xEAF7, 0xF9C9}, //15255 #CJK COMPATIBILITY IDEOGRAPH + {0xEAF8, 0x6961}, //15256 #CJK UNIFIED IDEOGRAPH + {0xEAF9, 0x6962}, //15257 #CJK UNIFIED IDEOGRAPH + {0xEAFA, 0x6CB9}, //15258 #CJK UNIFIED IDEOGRAPH + {0xEAFB, 0x6D27}, //15259 #CJK UNIFIED IDEOGRAPH + {0xEAFC, 0xF9CA}, //15260 #CJK COMPATIBILITY IDEOGRAPH + {0xEAFD, 0x6E38}, //15261 #CJK UNIFIED IDEOGRAPH + {0xEAFE, 0xF9CB}, //15262 #CJK COMPATIBILITY IDEOGRAPH + {0xEBA1, 0x6FE1}, //15263 #CJK UNIFIED IDEOGRAPH + {0xEBA2, 0x7336}, //15264 #CJK UNIFIED IDEOGRAPH + {0xEBA3, 0x7337}, //15265 #CJK UNIFIED IDEOGRAPH + {0xEBA4, 0xF9CC}, //15266 #CJK COMPATIBILITY IDEOGRAPH + {0xEBA5, 0x745C}, //15267 #CJK UNIFIED IDEOGRAPH + {0xEBA6, 0x7531}, //15268 #CJK UNIFIED IDEOGRAPH + {0xEBA7, 0xF9CD}, //15269 #CJK COMPATIBILITY IDEOGRAPH + {0xEBA8, 0x7652}, //15270 #CJK UNIFIED IDEOGRAPH + {0xEBA9, 0xF9CE}, //15271 #CJK COMPATIBILITY IDEOGRAPH + {0xEBAA, 0xF9CF}, //15272 #CJK COMPATIBILITY IDEOGRAPH + {0xEBAB, 0x7DAD}, //15273 #CJK UNIFIED IDEOGRAPH + {0xEBAC, 0x81FE}, //15274 #CJK UNIFIED IDEOGRAPH + {0xEBAD, 0x8438}, //15275 #CJK UNIFIED IDEOGRAPH + {0xEBAE, 0x88D5}, //15276 #CJK UNIFIED IDEOGRAPH + {0xEBAF, 0x8A98}, //15277 #CJK UNIFIED IDEOGRAPH + {0xEBB0, 0x8ADB}, //15278 #CJK UNIFIED IDEOGRAPH + {0xEBB1, 0x8AED}, //15279 #CJK UNIFIED IDEOGRAPH + {0xEBB2, 0x8E30}, //15280 #CJK UNIFIED IDEOGRAPH + {0xEBB3, 0x8E42}, //15281 #CJK UNIFIED IDEOGRAPH + {0xEBB4, 0x904A}, //15282 #CJK UNIFIED IDEOGRAPH + {0xEBB5, 0x903E}, //15283 #CJK UNIFIED IDEOGRAPH + {0xEBB6, 0x907A}, //15284 #CJK UNIFIED IDEOGRAPH + {0xEBB7, 0x9149}, //15285 #CJK UNIFIED IDEOGRAPH + {0xEBB8, 0x91C9}, //15286 #CJK UNIFIED IDEOGRAPH + {0xEBB9, 0x936E}, //15287 #CJK UNIFIED IDEOGRAPH + {0xEBBA, 0xF9D0}, //15288 #CJK COMPATIBILITY IDEOGRAPH + {0xEBBB, 0xF9D1}, //15289 #CJK COMPATIBILITY IDEOGRAPH + {0xEBBC, 0x5809}, //15290 #CJK UNIFIED IDEOGRAPH + {0xEBBD, 0xF9D2}, //15291 #CJK COMPATIBILITY IDEOGRAPH + {0xEBBE, 0x6BD3}, //15292 #CJK UNIFIED IDEOGRAPH + {0xEBBF, 0x8089}, //15293 #CJK UNIFIED IDEOGRAPH + {0xEBC0, 0x80B2}, //15294 #CJK UNIFIED IDEOGRAPH + {0xEBC1, 0xF9D3}, //15295 #CJK COMPATIBILITY IDEOGRAPH + {0xEBC2, 0xF9D4}, //15296 #CJK COMPATIBILITY IDEOGRAPH + {0xEBC3, 0x5141}, //15297 #CJK UNIFIED IDEOGRAPH + {0xEBC4, 0x596B}, //15298 #CJK UNIFIED IDEOGRAPH + {0xEBC5, 0x5C39}, //15299 #CJK UNIFIED IDEOGRAPH + {0xEBC6, 0xF9D5}, //15300 #CJK COMPATIBILITY IDEOGRAPH + {0xEBC7, 0xF9D6}, //15301 #CJK COMPATIBILITY IDEOGRAPH + {0xEBC8, 0x6F64}, //15302 #CJK UNIFIED IDEOGRAPH + {0xEBC9, 0x73A7}, //15303 #CJK UNIFIED IDEOGRAPH + {0xEBCA, 0x80E4}, //15304 #CJK UNIFIED IDEOGRAPH + {0xEBCB, 0x8D07}, //15305 #CJK UNIFIED IDEOGRAPH + {0xEBCC, 0xF9D7}, //15306 #CJK COMPATIBILITY IDEOGRAPH + {0xEBCD, 0x9217}, //15307 #CJK UNIFIED IDEOGRAPH + {0xEBCE, 0x958F}, //15308 #CJK UNIFIED IDEOGRAPH + {0xEBCF, 0xF9D8}, //15309 #CJK COMPATIBILITY IDEOGRAPH + {0xEBD0, 0xF9D9}, //15310 #CJK COMPATIBILITY IDEOGRAPH + {0xEBD1, 0xF9DA}, //15311 #CJK COMPATIBILITY IDEOGRAPH + {0xEBD2, 0xF9DB}, //15312 #CJK COMPATIBILITY IDEOGRAPH + {0xEBD3, 0x807F}, //15313 #CJK UNIFIED IDEOGRAPH + {0xEBD4, 0x620E}, //15314 #CJK UNIFIED IDEOGRAPH + {0xEBD5, 0x701C}, //15315 #CJK UNIFIED IDEOGRAPH + {0xEBD6, 0x7D68}, //15316 #CJK UNIFIED IDEOGRAPH + {0xEBD7, 0x878D}, //15317 #CJK UNIFIED IDEOGRAPH + {0xEBD8, 0xF9DC}, //15318 #CJK COMPATIBILITY IDEOGRAPH + {0xEBD9, 0x57A0}, //15319 #CJK UNIFIED IDEOGRAPH + {0xEBDA, 0x6069}, //15320 #CJK UNIFIED IDEOGRAPH + {0xEBDB, 0x6147}, //15321 #CJK UNIFIED IDEOGRAPH + {0xEBDC, 0x6BB7}, //15322 #CJK UNIFIED IDEOGRAPH + {0xEBDD, 0x8ABE}, //15323 #CJK UNIFIED IDEOGRAPH + {0xEBDE, 0x9280}, //15324 #CJK UNIFIED IDEOGRAPH + {0xEBDF, 0x96B1}, //15325 #CJK UNIFIED IDEOGRAPH + {0xEBE0, 0x4E59}, //15326 #CJK UNIFIED IDEOGRAPH + {0xEBE1, 0x541F}, //15327 #CJK UNIFIED IDEOGRAPH + {0xEBE2, 0x6DEB}, //15328 #CJK UNIFIED IDEOGRAPH + {0xEBE3, 0x852D}, //15329 #CJK UNIFIED IDEOGRAPH + {0xEBE4, 0x9670}, //15330 #CJK UNIFIED IDEOGRAPH + {0xEBE5, 0x97F3}, //15331 #CJK UNIFIED IDEOGRAPH + {0xEBE6, 0x98EE}, //15332 #CJK UNIFIED IDEOGRAPH + {0xEBE7, 0x63D6}, //15333 #CJK UNIFIED IDEOGRAPH + {0xEBE8, 0x6CE3}, //15334 #CJK UNIFIED IDEOGRAPH + {0xEBE9, 0x9091}, //15335 #CJK UNIFIED IDEOGRAPH + {0xEBEA, 0x51DD}, //15336 #CJK UNIFIED IDEOGRAPH + {0xEBEB, 0x61C9}, //15337 #CJK UNIFIED IDEOGRAPH + {0xEBEC, 0x81BA}, //15338 #CJK UNIFIED IDEOGRAPH + {0xEBED, 0x9DF9}, //15339 #CJK UNIFIED IDEOGRAPH + {0xEBEE, 0x4F9D}, //15340 #CJK UNIFIED IDEOGRAPH + {0xEBEF, 0x501A}, //15341 #CJK UNIFIED IDEOGRAPH + {0xEBF0, 0x5100}, //15342 #CJK UNIFIED IDEOGRAPH + {0xEBF1, 0x5B9C}, //15343 #CJK UNIFIED IDEOGRAPH + {0xEBF2, 0x610F}, //15344 #CJK UNIFIED IDEOGRAPH + {0xEBF3, 0x61FF}, //15345 #CJK UNIFIED IDEOGRAPH + {0xEBF4, 0x64EC}, //15346 #CJK UNIFIED IDEOGRAPH + {0xEBF5, 0x6905}, //15347 #CJK UNIFIED IDEOGRAPH + {0xEBF6, 0x6BC5}, //15348 #CJK UNIFIED IDEOGRAPH + {0xEBF7, 0x7591}, //15349 #CJK UNIFIED IDEOGRAPH + {0xEBF8, 0x77E3}, //15350 #CJK UNIFIED IDEOGRAPH + {0xEBF9, 0x7FA9}, //15351 #CJK UNIFIED IDEOGRAPH + {0xEBFA, 0x8264}, //15352 #CJK UNIFIED IDEOGRAPH + {0xEBFB, 0x858F}, //15353 #CJK UNIFIED IDEOGRAPH + {0xEBFC, 0x87FB}, //15354 #CJK UNIFIED IDEOGRAPH + {0xEBFD, 0x8863}, //15355 #CJK UNIFIED IDEOGRAPH + {0xEBFE, 0x8ABC}, //15356 #CJK UNIFIED IDEOGRAPH + {0xECA1, 0x8B70}, //15357 #CJK UNIFIED IDEOGRAPH + {0xECA2, 0x91AB}, //15358 #CJK UNIFIED IDEOGRAPH + {0xECA3, 0x4E8C}, //15359 #CJK UNIFIED IDEOGRAPH + {0xECA4, 0x4EE5}, //15360 #CJK UNIFIED IDEOGRAPH + {0xECA5, 0x4F0A}, //15361 #CJK UNIFIED IDEOGRAPH + {0xECA6, 0xF9DD}, //15362 #CJK COMPATIBILITY IDEOGRAPH + {0xECA7, 0xF9DE}, //15363 #CJK COMPATIBILITY IDEOGRAPH + {0xECA8, 0x5937}, //15364 #CJK UNIFIED IDEOGRAPH + {0xECA9, 0x59E8}, //15365 #CJK UNIFIED IDEOGRAPH + {0xECAA, 0xF9DF}, //15366 #CJK COMPATIBILITY IDEOGRAPH + {0xECAB, 0x5DF2}, //15367 #CJK UNIFIED IDEOGRAPH + {0xECAC, 0x5F1B}, //15368 #CJK UNIFIED IDEOGRAPH + {0xECAD, 0x5F5B}, //15369 #CJK UNIFIED IDEOGRAPH + {0xECAE, 0x6021}, //15370 #CJK UNIFIED IDEOGRAPH + {0xECAF, 0xF9E0}, //15371 #CJK COMPATIBILITY IDEOGRAPH + {0xECB0, 0xF9E1}, //15372 #CJK COMPATIBILITY IDEOGRAPH + {0xECB1, 0xF9E2}, //15373 #CJK COMPATIBILITY IDEOGRAPH + {0xECB2, 0xF9E3}, //15374 #CJK COMPATIBILITY IDEOGRAPH + {0xECB3, 0x723E}, //15375 #CJK UNIFIED IDEOGRAPH + {0xECB4, 0x73E5}, //15376 #CJK UNIFIED IDEOGRAPH + {0xECB5, 0xF9E4}, //15377 #CJK COMPATIBILITY IDEOGRAPH + {0xECB6, 0x7570}, //15378 #CJK UNIFIED IDEOGRAPH + {0xECB7, 0x75CD}, //15379 #CJK UNIFIED IDEOGRAPH + {0xECB8, 0xF9E5}, //15380 #CJK COMPATIBILITY IDEOGRAPH + {0xECB9, 0x79FB}, //15381 #CJK UNIFIED IDEOGRAPH + {0xECBA, 0xF9E6}, //15382 #CJK COMPATIBILITY IDEOGRAPH + {0xECBB, 0x800C}, //15383 #CJK UNIFIED IDEOGRAPH + {0xECBC, 0x8033}, //15384 #CJK UNIFIED IDEOGRAPH + {0xECBD, 0x8084}, //15385 #CJK UNIFIED IDEOGRAPH + {0xECBE, 0x82E1}, //15386 #CJK UNIFIED IDEOGRAPH + {0xECBF, 0x8351}, //15387 #CJK UNIFIED IDEOGRAPH + {0xECC0, 0xF9E7}, //15388 #CJK COMPATIBILITY IDEOGRAPH + {0xECC1, 0xF9E8}, //15389 #CJK COMPATIBILITY IDEOGRAPH + {0xECC2, 0x8CBD}, //15390 #CJK UNIFIED IDEOGRAPH + {0xECC3, 0x8CB3}, //15391 #CJK UNIFIED IDEOGRAPH + {0xECC4, 0x9087}, //15392 #CJK UNIFIED IDEOGRAPH + {0xECC5, 0xF9E9}, //15393 #CJK COMPATIBILITY IDEOGRAPH + {0xECC6, 0xF9EA}, //15394 #CJK COMPATIBILITY IDEOGRAPH + {0xECC7, 0x98F4}, //15395 #CJK UNIFIED IDEOGRAPH + {0xECC8, 0x990C}, //15396 #CJK UNIFIED IDEOGRAPH + {0xECC9, 0xF9EB}, //15397 #CJK COMPATIBILITY IDEOGRAPH + {0xECCA, 0xF9EC}, //15398 #CJK COMPATIBILITY IDEOGRAPH + {0xECCB, 0x7037}, //15399 #CJK UNIFIED IDEOGRAPH + {0xECCC, 0x76CA}, //15400 #CJK UNIFIED IDEOGRAPH + {0xECCD, 0x7FCA}, //15401 #CJK UNIFIED IDEOGRAPH + {0xECCE, 0x7FCC}, //15402 #CJK UNIFIED IDEOGRAPH + {0xECCF, 0x7FFC}, //15403 #CJK UNIFIED IDEOGRAPH + {0xECD0, 0x8B1A}, //15404 #CJK UNIFIED IDEOGRAPH + {0xECD1, 0x4EBA}, //15405 #CJK UNIFIED IDEOGRAPH + {0xECD2, 0x4EC1}, //15406 #CJK UNIFIED IDEOGRAPH + {0xECD3, 0x5203}, //15407 #CJK UNIFIED IDEOGRAPH + {0xECD4, 0x5370}, //15408 #CJK UNIFIED IDEOGRAPH + {0xECD5, 0xF9ED}, //15409 #CJK COMPATIBILITY IDEOGRAPH + {0xECD6, 0x54BD}, //15410 #CJK UNIFIED IDEOGRAPH + {0xECD7, 0x56E0}, //15411 #CJK UNIFIED IDEOGRAPH + {0xECD8, 0x59FB}, //15412 #CJK UNIFIED IDEOGRAPH + {0xECD9, 0x5BC5}, //15413 #CJK UNIFIED IDEOGRAPH + {0xECDA, 0x5F15}, //15414 #CJK UNIFIED IDEOGRAPH + {0xECDB, 0x5FCD}, //15415 #CJK UNIFIED IDEOGRAPH + {0xECDC, 0x6E6E}, //15416 #CJK UNIFIED IDEOGRAPH + {0xECDD, 0xF9EE}, //15417 #CJK COMPATIBILITY IDEOGRAPH + {0xECDE, 0xF9EF}, //15418 #CJK COMPATIBILITY IDEOGRAPH + {0xECDF, 0x7D6A}, //15419 #CJK UNIFIED IDEOGRAPH + {0xECE0, 0x8335}, //15420 #CJK UNIFIED IDEOGRAPH + {0xECE1, 0xF9F0}, //15421 #CJK COMPATIBILITY IDEOGRAPH + {0xECE2, 0x8693}, //15422 #CJK UNIFIED IDEOGRAPH + {0xECE3, 0x8A8D}, //15423 #CJK UNIFIED IDEOGRAPH + {0xECE4, 0xF9F1}, //15424 #CJK COMPATIBILITY IDEOGRAPH + {0xECE5, 0x976D}, //15425 #CJK UNIFIED IDEOGRAPH + {0xECE6, 0x9777}, //15426 #CJK UNIFIED IDEOGRAPH + {0xECE7, 0xF9F2}, //15427 #CJK COMPATIBILITY IDEOGRAPH + {0xECE8, 0xF9F3}, //15428 #CJK COMPATIBILITY IDEOGRAPH + {0xECE9, 0x4E00}, //15429 #CJK UNIFIED IDEOGRAPH + {0xECEA, 0x4F5A}, //15430 #CJK UNIFIED IDEOGRAPH + {0xECEB, 0x4F7E}, //15431 #CJK UNIFIED IDEOGRAPH + {0xECEC, 0x58F9}, //15432 #CJK UNIFIED IDEOGRAPH + {0xECED, 0x65E5}, //15433 #CJK UNIFIED IDEOGRAPH + {0xECEE, 0x6EA2}, //15434 #CJK UNIFIED IDEOGRAPH + {0xECEF, 0x9038}, //15435 #CJK UNIFIED IDEOGRAPH + {0xECF0, 0x93B0}, //15436 #CJK UNIFIED IDEOGRAPH + {0xECF1, 0x99B9}, //15437 #CJK UNIFIED IDEOGRAPH + {0xECF2, 0x4EFB}, //15438 #CJK UNIFIED IDEOGRAPH + {0xECF3, 0x58EC}, //15439 #CJK UNIFIED IDEOGRAPH + {0xECF4, 0x598A}, //15440 #CJK UNIFIED IDEOGRAPH + {0xECF5, 0x59D9}, //15441 #CJK UNIFIED IDEOGRAPH + {0xECF6, 0x6041}, //15442 #CJK UNIFIED IDEOGRAPH + {0xECF7, 0xF9F4}, //15443 #CJK COMPATIBILITY IDEOGRAPH + {0xECF8, 0xF9F5}, //15444 #CJK COMPATIBILITY IDEOGRAPH + {0xECF9, 0x7A14}, //15445 #CJK UNIFIED IDEOGRAPH + {0xECFA, 0xF9F6}, //15446 #CJK COMPATIBILITY IDEOGRAPH + {0xECFB, 0x834F}, //15447 #CJK UNIFIED IDEOGRAPH + {0xECFC, 0x8CC3}, //15448 #CJK UNIFIED IDEOGRAPH + {0xECFD, 0x5165}, //15449 #CJK UNIFIED IDEOGRAPH + {0xECFE, 0x5344}, //15450 #CJK UNIFIED IDEOGRAPH + {0xEDA1, 0xF9F7}, //15451 #CJK COMPATIBILITY IDEOGRAPH + {0xEDA2, 0xF9F8}, //15452 #CJK COMPATIBILITY IDEOGRAPH + {0xEDA3, 0xF9F9}, //15453 #CJK COMPATIBILITY IDEOGRAPH + {0xEDA4, 0x4ECD}, //15454 #CJK UNIFIED IDEOGRAPH + {0xEDA5, 0x5269}, //15455 #CJK UNIFIED IDEOGRAPH + {0xEDA6, 0x5B55}, //15456 #CJK UNIFIED IDEOGRAPH + {0xEDA7, 0x82BF}, //15457 #CJK UNIFIED IDEOGRAPH + {0xEDA8, 0x4ED4}, //15458 #CJK UNIFIED IDEOGRAPH + {0xEDA9, 0x523A}, //15459 #CJK UNIFIED IDEOGRAPH + {0xEDAA, 0x54A8}, //15460 #CJK UNIFIED IDEOGRAPH + {0xEDAB, 0x59C9}, //15461 #CJK UNIFIED IDEOGRAPH + {0xEDAC, 0x59FF}, //15462 #CJK UNIFIED IDEOGRAPH + {0xEDAD, 0x5B50}, //15463 #CJK UNIFIED IDEOGRAPH + {0xEDAE, 0x5B57}, //15464 #CJK UNIFIED IDEOGRAPH + {0xEDAF, 0x5B5C}, //15465 #CJK UNIFIED IDEOGRAPH + {0xEDB0, 0x6063}, //15466 #CJK UNIFIED IDEOGRAPH + {0xEDB1, 0x6148}, //15467 #CJK UNIFIED IDEOGRAPH + {0xEDB2, 0x6ECB}, //15468 #CJK UNIFIED IDEOGRAPH + {0xEDB3, 0x7099}, //15469 #CJK UNIFIED IDEOGRAPH + {0xEDB4, 0x716E}, //15470 #CJK UNIFIED IDEOGRAPH + {0xEDB5, 0x7386}, //15471 #CJK UNIFIED IDEOGRAPH + {0xEDB6, 0x74F7}, //15472 #CJK UNIFIED IDEOGRAPH + {0xEDB7, 0x75B5}, //15473 #CJK UNIFIED IDEOGRAPH + {0xEDB8, 0x78C1}, //15474 #CJK UNIFIED IDEOGRAPH + {0xEDB9, 0x7D2B}, //15475 #CJK UNIFIED IDEOGRAPH + {0xEDBA, 0x8005}, //15476 #CJK UNIFIED IDEOGRAPH + {0xEDBB, 0x81EA}, //15477 #CJK UNIFIED IDEOGRAPH + {0xEDBC, 0x8328}, //15478 #CJK UNIFIED IDEOGRAPH + {0xEDBD, 0x8517}, //15479 #CJK UNIFIED IDEOGRAPH + {0xEDBE, 0x85C9}, //15480 #CJK UNIFIED IDEOGRAPH + {0xEDBF, 0x8AEE}, //15481 #CJK UNIFIED IDEOGRAPH + {0xEDC0, 0x8CC7}, //15482 #CJK UNIFIED IDEOGRAPH + {0xEDC1, 0x96CC}, //15483 #CJK UNIFIED IDEOGRAPH + {0xEDC2, 0x4F5C}, //15484 #CJK UNIFIED IDEOGRAPH + {0xEDC3, 0x52FA}, //15485 #CJK UNIFIED IDEOGRAPH + {0xEDC4, 0x56BC}, //15486 #CJK UNIFIED IDEOGRAPH + {0xEDC5, 0x65AB}, //15487 #CJK UNIFIED IDEOGRAPH + {0xEDC6, 0x6628}, //15488 #CJK UNIFIED IDEOGRAPH + {0xEDC7, 0x707C}, //15489 #CJK UNIFIED IDEOGRAPH + {0xEDC8, 0x70B8}, //15490 #CJK UNIFIED IDEOGRAPH + {0xEDC9, 0x7235}, //15491 #CJK UNIFIED IDEOGRAPH + {0xEDCA, 0x7DBD}, //15492 #CJK UNIFIED IDEOGRAPH + {0xEDCB, 0x828D}, //15493 #CJK UNIFIED IDEOGRAPH + {0xEDCC, 0x914C}, //15494 #CJK UNIFIED IDEOGRAPH + {0xEDCD, 0x96C0}, //15495 #CJK UNIFIED IDEOGRAPH + {0xEDCE, 0x9D72}, //15496 #CJK UNIFIED IDEOGRAPH + {0xEDCF, 0x5B71}, //15497 #CJK UNIFIED IDEOGRAPH + {0xEDD0, 0x68E7}, //15498 #CJK UNIFIED IDEOGRAPH + {0xEDD1, 0x6B98}, //15499 #CJK UNIFIED IDEOGRAPH + {0xEDD2, 0x6F7A}, //15500 #CJK UNIFIED IDEOGRAPH + {0xEDD3, 0x76DE}, //15501 #CJK UNIFIED IDEOGRAPH + {0xEDD4, 0x5C91}, //15502 #CJK UNIFIED IDEOGRAPH + {0xEDD5, 0x66AB}, //15503 #CJK UNIFIED IDEOGRAPH + {0xEDD6, 0x6F5B}, //15504 #CJK UNIFIED IDEOGRAPH + {0xEDD7, 0x7BB4}, //15505 #CJK UNIFIED IDEOGRAPH + {0xEDD8, 0x7C2A}, //15506 #CJK UNIFIED IDEOGRAPH + {0xEDD9, 0x8836}, //15507 #CJK UNIFIED IDEOGRAPH + {0xEDDA, 0x96DC}, //15508 #CJK UNIFIED IDEOGRAPH + {0xEDDB, 0x4E08}, //15509 #CJK UNIFIED IDEOGRAPH + {0xEDDC, 0x4ED7}, //15510 #CJK UNIFIED IDEOGRAPH + {0xEDDD, 0x5320}, //15511 #CJK UNIFIED IDEOGRAPH + {0xEDDE, 0x5834}, //15512 #CJK UNIFIED IDEOGRAPH + {0xEDDF, 0x58BB}, //15513 #CJK UNIFIED IDEOGRAPH + {0xEDE0, 0x58EF}, //15514 #CJK UNIFIED IDEOGRAPH + {0xEDE1, 0x596C}, //15515 #CJK UNIFIED IDEOGRAPH + {0xEDE2, 0x5C07}, //15516 #CJK UNIFIED IDEOGRAPH + {0xEDE3, 0x5E33}, //15517 #CJK UNIFIED IDEOGRAPH + {0xEDE4, 0x5E84}, //15518 #CJK UNIFIED IDEOGRAPH + {0xEDE5, 0x5F35}, //15519 #CJK UNIFIED IDEOGRAPH + {0xEDE6, 0x638C}, //15520 #CJK UNIFIED IDEOGRAPH + {0xEDE7, 0x66B2}, //15521 #CJK UNIFIED IDEOGRAPH + {0xEDE8, 0x6756}, //15522 #CJK UNIFIED IDEOGRAPH + {0xEDE9, 0x6A1F}, //15523 #CJK UNIFIED IDEOGRAPH + {0xEDEA, 0x6AA3}, //15524 #CJK UNIFIED IDEOGRAPH + {0xEDEB, 0x6B0C}, //15525 #CJK UNIFIED IDEOGRAPH + {0xEDEC, 0x6F3F}, //15526 #CJK UNIFIED IDEOGRAPH + {0xEDED, 0x7246}, //15527 #CJK UNIFIED IDEOGRAPH + {0xEDEE, 0xF9FA}, //15528 #CJK COMPATIBILITY IDEOGRAPH + {0xEDEF, 0x7350}, //15529 #CJK UNIFIED IDEOGRAPH + {0xEDF0, 0x748B}, //15530 #CJK UNIFIED IDEOGRAPH + {0xEDF1, 0x7AE0}, //15531 #CJK UNIFIED IDEOGRAPH + {0xEDF2, 0x7CA7}, //15532 #CJK UNIFIED IDEOGRAPH + {0xEDF3, 0x8178}, //15533 #CJK UNIFIED IDEOGRAPH + {0xEDF4, 0x81DF}, //15534 #CJK UNIFIED IDEOGRAPH + {0xEDF5, 0x81E7}, //15535 #CJK UNIFIED IDEOGRAPH + {0xEDF6, 0x838A}, //15536 #CJK UNIFIED IDEOGRAPH + {0xEDF7, 0x846C}, //15537 #CJK UNIFIED IDEOGRAPH + {0xEDF8, 0x8523}, //15538 #CJK UNIFIED IDEOGRAPH + {0xEDF9, 0x8594}, //15539 #CJK UNIFIED IDEOGRAPH + {0xEDFA, 0x85CF}, //15540 #CJK UNIFIED IDEOGRAPH + {0xEDFB, 0x88DD}, //15541 #CJK UNIFIED IDEOGRAPH + {0xEDFC, 0x8D13}, //15542 #CJK UNIFIED IDEOGRAPH + {0xEDFD, 0x91AC}, //15543 #CJK UNIFIED IDEOGRAPH + {0xEDFE, 0x9577}, //15544 #CJK UNIFIED IDEOGRAPH + {0xEEA1, 0x969C}, //15545 #CJK UNIFIED IDEOGRAPH + {0xEEA2, 0x518D}, //15546 #CJK UNIFIED IDEOGRAPH + {0xEEA3, 0x54C9}, //15547 #CJK UNIFIED IDEOGRAPH + {0xEEA4, 0x5728}, //15548 #CJK UNIFIED IDEOGRAPH + {0xEEA5, 0x5BB0}, //15549 #CJK UNIFIED IDEOGRAPH + {0xEEA6, 0x624D}, //15550 #CJK UNIFIED IDEOGRAPH + {0xEEA7, 0x6750}, //15551 #CJK UNIFIED IDEOGRAPH + {0xEEA8, 0x683D}, //15552 #CJK UNIFIED IDEOGRAPH + {0xEEA9, 0x6893}, //15553 #CJK UNIFIED IDEOGRAPH + {0xEEAA, 0x6E3D}, //15554 #CJK UNIFIED IDEOGRAPH + {0xEEAB, 0x6ED3}, //15555 #CJK UNIFIED IDEOGRAPH + {0xEEAC, 0x707D}, //15556 #CJK UNIFIED IDEOGRAPH + {0xEEAD, 0x7E21}, //15557 #CJK UNIFIED IDEOGRAPH + {0xEEAE, 0x88C1}, //15558 #CJK UNIFIED IDEOGRAPH + {0xEEAF, 0x8CA1}, //15559 #CJK UNIFIED IDEOGRAPH + {0xEEB0, 0x8F09}, //15560 #CJK UNIFIED IDEOGRAPH + {0xEEB1, 0x9F4B}, //15561 #CJK UNIFIED IDEOGRAPH + {0xEEB2, 0x9F4E}, //15562 #CJK UNIFIED IDEOGRAPH + {0xEEB3, 0x722D}, //15563 #CJK UNIFIED IDEOGRAPH + {0xEEB4, 0x7B8F}, //15564 #CJK UNIFIED IDEOGRAPH + {0xEEB5, 0x8ACD}, //15565 #CJK UNIFIED IDEOGRAPH + {0xEEB6, 0x931A}, //15566 #CJK UNIFIED IDEOGRAPH + {0xEEB7, 0x4F47}, //15567 #CJK UNIFIED IDEOGRAPH + {0xEEB8, 0x4F4E}, //15568 #CJK UNIFIED IDEOGRAPH + {0xEEB9, 0x5132}, //15569 #CJK UNIFIED IDEOGRAPH + {0xEEBA, 0x5480}, //15570 #CJK UNIFIED IDEOGRAPH + {0xEEBB, 0x59D0}, //15571 #CJK UNIFIED IDEOGRAPH + {0xEEBC, 0x5E95}, //15572 #CJK UNIFIED IDEOGRAPH + {0xEEBD, 0x62B5}, //15573 #CJK UNIFIED IDEOGRAPH + {0xEEBE, 0x6775}, //15574 #CJK UNIFIED IDEOGRAPH + {0xEEBF, 0x696E}, //15575 #CJK UNIFIED IDEOGRAPH + {0xEEC0, 0x6A17}, //15576 #CJK UNIFIED IDEOGRAPH + {0xEEC1, 0x6CAE}, //15577 #CJK UNIFIED IDEOGRAPH + {0xEEC2, 0x6E1A}, //15578 #CJK UNIFIED IDEOGRAPH + {0xEEC3, 0x72D9}, //15579 #CJK UNIFIED IDEOGRAPH + {0xEEC4, 0x732A}, //15580 #CJK UNIFIED IDEOGRAPH + {0xEEC5, 0x75BD}, //15581 #CJK UNIFIED IDEOGRAPH + {0xEEC6, 0x7BB8}, //15582 #CJK UNIFIED IDEOGRAPH + {0xEEC7, 0x7D35}, //15583 #CJK UNIFIED IDEOGRAPH + {0xEEC8, 0x82E7}, //15584 #CJK UNIFIED IDEOGRAPH + {0xEEC9, 0x83F9}, //15585 #CJK UNIFIED IDEOGRAPH + {0xEECA, 0x8457}, //15586 #CJK UNIFIED IDEOGRAPH + {0xEECB, 0x85F7}, //15587 #CJK UNIFIED IDEOGRAPH + {0xEECC, 0x8A5B}, //15588 #CJK UNIFIED IDEOGRAPH + {0xEECD, 0x8CAF}, //15589 #CJK UNIFIED IDEOGRAPH + {0xEECE, 0x8E87}, //15590 #CJK UNIFIED IDEOGRAPH + {0xEECF, 0x9019}, //15591 #CJK UNIFIED IDEOGRAPH + {0xEED0, 0x90B8}, //15592 #CJK UNIFIED IDEOGRAPH + {0xEED1, 0x96CE}, //15593 #CJK UNIFIED IDEOGRAPH + {0xEED2, 0x9F5F}, //15594 #CJK UNIFIED IDEOGRAPH + {0xEED3, 0x52E3}, //15595 #CJK UNIFIED IDEOGRAPH + {0xEED4, 0x540A}, //15596 #CJK UNIFIED IDEOGRAPH + {0xEED5, 0x5AE1}, //15597 #CJK UNIFIED IDEOGRAPH + {0xEED6, 0x5BC2}, //15598 #CJK UNIFIED IDEOGRAPH + {0xEED7, 0x6458}, //15599 #CJK UNIFIED IDEOGRAPH + {0xEED8, 0x6575}, //15600 #CJK UNIFIED IDEOGRAPH + {0xEED9, 0x6EF4}, //15601 #CJK UNIFIED IDEOGRAPH + {0xEEDA, 0x72C4}, //15602 #CJK UNIFIED IDEOGRAPH + {0xEEDB, 0xF9FB}, //15603 #CJK COMPATIBILITY IDEOGRAPH + {0xEEDC, 0x7684}, //15604 #CJK UNIFIED IDEOGRAPH + {0xEEDD, 0x7A4D}, //15605 #CJK UNIFIED IDEOGRAPH + {0xEEDE, 0x7B1B}, //15606 #CJK UNIFIED IDEOGRAPH + {0xEEDF, 0x7C4D}, //15607 #CJK UNIFIED IDEOGRAPH + {0xEEE0, 0x7E3E}, //15608 #CJK UNIFIED IDEOGRAPH + {0xEEE1, 0x7FDF}, //15609 #CJK UNIFIED IDEOGRAPH + {0xEEE2, 0x837B}, //15610 #CJK UNIFIED IDEOGRAPH + {0xEEE3, 0x8B2B}, //15611 #CJK UNIFIED IDEOGRAPH + {0xEEE4, 0x8CCA}, //15612 #CJK UNIFIED IDEOGRAPH + {0xEEE5, 0x8D64}, //15613 #CJK UNIFIED IDEOGRAPH + {0xEEE6, 0x8DE1}, //15614 #CJK UNIFIED IDEOGRAPH + {0xEEE7, 0x8E5F}, //15615 #CJK UNIFIED IDEOGRAPH + {0xEEE8, 0x8FEA}, //15616 #CJK UNIFIED IDEOGRAPH + {0xEEE9, 0x8FF9}, //15617 #CJK UNIFIED IDEOGRAPH + {0xEEEA, 0x9069}, //15618 #CJK UNIFIED IDEOGRAPH + {0xEEEB, 0x93D1}, //15619 #CJK UNIFIED IDEOGRAPH + {0xEEEC, 0x4F43}, //15620 #CJK UNIFIED IDEOGRAPH + {0xEEED, 0x4F7A}, //15621 #CJK UNIFIED IDEOGRAPH + {0xEEEE, 0x50B3}, //15622 #CJK UNIFIED IDEOGRAPH + {0xEEEF, 0x5168}, //15623 #CJK UNIFIED IDEOGRAPH + {0xEEF0, 0x5178}, //15624 #CJK UNIFIED IDEOGRAPH + {0xEEF1, 0x524D}, //15625 #CJK UNIFIED IDEOGRAPH + {0xEEF2, 0x526A}, //15626 #CJK UNIFIED IDEOGRAPH + {0xEEF3, 0x5861}, //15627 #CJK UNIFIED IDEOGRAPH + {0xEEF4, 0x587C}, //15628 #CJK UNIFIED IDEOGRAPH + {0xEEF5, 0x5960}, //15629 #CJK UNIFIED IDEOGRAPH + {0xEEF6, 0x5C08}, //15630 #CJK UNIFIED IDEOGRAPH + {0xEEF7, 0x5C55}, //15631 #CJK UNIFIED IDEOGRAPH + {0xEEF8, 0x5EDB}, //15632 #CJK UNIFIED IDEOGRAPH + {0xEEF9, 0x609B}, //15633 #CJK UNIFIED IDEOGRAPH + {0xEEFA, 0x6230}, //15634 #CJK UNIFIED IDEOGRAPH + {0xEEFB, 0x6813}, //15635 #CJK UNIFIED IDEOGRAPH + {0xEEFC, 0x6BBF}, //15636 #CJK UNIFIED IDEOGRAPH + {0xEEFD, 0x6C08}, //15637 #CJK UNIFIED IDEOGRAPH + {0xEEFE, 0x6FB1}, //15638 #CJK UNIFIED IDEOGRAPH + {0xEFA1, 0x714E}, //15639 #CJK UNIFIED IDEOGRAPH + {0xEFA2, 0x7420}, //15640 #CJK UNIFIED IDEOGRAPH + {0xEFA3, 0x7530}, //15641 #CJK UNIFIED IDEOGRAPH + {0xEFA4, 0x7538}, //15642 #CJK UNIFIED IDEOGRAPH + {0xEFA5, 0x7551}, //15643 #CJK UNIFIED IDEOGRAPH + {0xEFA6, 0x7672}, //15644 #CJK UNIFIED IDEOGRAPH + {0xEFA7, 0x7B4C}, //15645 #CJK UNIFIED IDEOGRAPH + {0xEFA8, 0x7B8B}, //15646 #CJK UNIFIED IDEOGRAPH + {0xEFA9, 0x7BAD}, //15647 #CJK UNIFIED IDEOGRAPH + {0xEFAA, 0x7BC6}, //15648 #CJK UNIFIED IDEOGRAPH + {0xEFAB, 0x7E8F}, //15649 #CJK UNIFIED IDEOGRAPH + {0xEFAC, 0x8A6E}, //15650 #CJK UNIFIED IDEOGRAPH + {0xEFAD, 0x8F3E}, //15651 #CJK UNIFIED IDEOGRAPH + {0xEFAE, 0x8F49}, //15652 #CJK UNIFIED IDEOGRAPH + {0xEFAF, 0x923F}, //15653 #CJK UNIFIED IDEOGRAPH + {0xEFB0, 0x9293}, //15654 #CJK UNIFIED IDEOGRAPH + {0xEFB1, 0x9322}, //15655 #CJK UNIFIED IDEOGRAPH + {0xEFB2, 0x942B}, //15656 #CJK UNIFIED IDEOGRAPH + {0xEFB3, 0x96FB}, //15657 #CJK UNIFIED IDEOGRAPH + {0xEFB4, 0x985A}, //15658 #CJK UNIFIED IDEOGRAPH + {0xEFB5, 0x986B}, //15659 #CJK UNIFIED IDEOGRAPH + {0xEFB6, 0x991E}, //15660 #CJK UNIFIED IDEOGRAPH + {0xEFB7, 0x5207}, //15661 #CJK UNIFIED IDEOGRAPH + {0xEFB8, 0x622A}, //15662 #CJK UNIFIED IDEOGRAPH + {0xEFB9, 0x6298}, //15663 #CJK UNIFIED IDEOGRAPH + {0xEFBA, 0x6D59}, //15664 #CJK UNIFIED IDEOGRAPH + {0xEFBB, 0x7664}, //15665 #CJK UNIFIED IDEOGRAPH + {0xEFBC, 0x7ACA}, //15666 #CJK UNIFIED IDEOGRAPH + {0xEFBD, 0x7BC0}, //15667 #CJK UNIFIED IDEOGRAPH + {0xEFBE, 0x7D76}, //15668 #CJK UNIFIED IDEOGRAPH + {0xEFBF, 0x5360}, //15669 #CJK UNIFIED IDEOGRAPH + {0xEFC0, 0x5CBE}, //15670 #CJK UNIFIED IDEOGRAPH + {0xEFC1, 0x5E97}, //15671 #CJK UNIFIED IDEOGRAPH + {0xEFC2, 0x6F38}, //15672 #CJK UNIFIED IDEOGRAPH + {0xEFC3, 0x70B9}, //15673 #CJK UNIFIED IDEOGRAPH + {0xEFC4, 0x7C98}, //15674 #CJK UNIFIED IDEOGRAPH + {0xEFC5, 0x9711}, //15675 #CJK UNIFIED IDEOGRAPH + {0xEFC6, 0x9B8E}, //15676 #CJK UNIFIED IDEOGRAPH + {0xEFC7, 0x9EDE}, //15677 #CJK UNIFIED IDEOGRAPH + {0xEFC8, 0x63A5}, //15678 #CJK UNIFIED IDEOGRAPH + {0xEFC9, 0x647A}, //15679 #CJK UNIFIED IDEOGRAPH + {0xEFCA, 0x8776}, //15680 #CJK UNIFIED IDEOGRAPH + {0xEFCB, 0x4E01}, //15681 #CJK UNIFIED IDEOGRAPH + {0xEFCC, 0x4E95}, //15682 #CJK UNIFIED IDEOGRAPH + {0xEFCD, 0x4EAD}, //15683 #CJK UNIFIED IDEOGRAPH + {0xEFCE, 0x505C}, //15684 #CJK UNIFIED IDEOGRAPH + {0xEFCF, 0x5075}, //15685 #CJK UNIFIED IDEOGRAPH + {0xEFD0, 0x5448}, //15686 #CJK UNIFIED IDEOGRAPH + {0xEFD1, 0x59C3}, //15687 #CJK UNIFIED IDEOGRAPH + {0xEFD2, 0x5B9A}, //15688 #CJK UNIFIED IDEOGRAPH + {0xEFD3, 0x5E40}, //15689 #CJK UNIFIED IDEOGRAPH + {0xEFD4, 0x5EAD}, //15690 #CJK UNIFIED IDEOGRAPH + {0xEFD5, 0x5EF7}, //15691 #CJK UNIFIED IDEOGRAPH + {0xEFD6, 0x5F81}, //15692 #CJK UNIFIED IDEOGRAPH + {0xEFD7, 0x60C5}, //15693 #CJK UNIFIED IDEOGRAPH + {0xEFD8, 0x633A}, //15694 #CJK UNIFIED IDEOGRAPH + {0xEFD9, 0x653F}, //15695 #CJK UNIFIED IDEOGRAPH + {0xEFDA, 0x6574}, //15696 #CJK UNIFIED IDEOGRAPH + {0xEFDB, 0x65CC}, //15697 #CJK UNIFIED IDEOGRAPH + {0xEFDC, 0x6676}, //15698 #CJK UNIFIED IDEOGRAPH + {0xEFDD, 0x6678}, //15699 #CJK UNIFIED IDEOGRAPH + {0xEFDE, 0x67FE}, //15700 #CJK UNIFIED IDEOGRAPH + {0xEFDF, 0x6968}, //15701 #CJK UNIFIED IDEOGRAPH + {0xEFE0, 0x6A89}, //15702 #CJK UNIFIED IDEOGRAPH + {0xEFE1, 0x6B63}, //15703 #CJK UNIFIED IDEOGRAPH + {0xEFE2, 0x6C40}, //15704 #CJK UNIFIED IDEOGRAPH + {0xEFE3, 0x6DC0}, //15705 #CJK UNIFIED IDEOGRAPH + {0xEFE4, 0x6DE8}, //15706 #CJK UNIFIED IDEOGRAPH + {0xEFE5, 0x6E1F}, //15707 #CJK UNIFIED IDEOGRAPH + {0xEFE6, 0x6E5E}, //15708 #CJK UNIFIED IDEOGRAPH + {0xEFE7, 0x701E}, //15709 #CJK UNIFIED IDEOGRAPH + {0xEFE8, 0x70A1}, //15710 #CJK UNIFIED IDEOGRAPH + {0xEFE9, 0x738E}, //15711 #CJK UNIFIED IDEOGRAPH + {0xEFEA, 0x73FD}, //15712 #CJK UNIFIED IDEOGRAPH + {0xEFEB, 0x753A}, //15713 #CJK UNIFIED IDEOGRAPH + {0xEFEC, 0x775B}, //15714 #CJK UNIFIED IDEOGRAPH + {0xEFED, 0x7887}, //15715 #CJK UNIFIED IDEOGRAPH + {0xEFEE, 0x798E}, //15716 #CJK UNIFIED IDEOGRAPH + {0xEFEF, 0x7A0B}, //15717 #CJK UNIFIED IDEOGRAPH + {0xEFF0, 0x7A7D}, //15718 #CJK UNIFIED IDEOGRAPH + {0xEFF1, 0x7CBE}, //15719 #CJK UNIFIED IDEOGRAPH + {0xEFF2, 0x7D8E}, //15720 #CJK UNIFIED IDEOGRAPH + {0xEFF3, 0x8247}, //15721 #CJK UNIFIED IDEOGRAPH + {0xEFF4, 0x8A02}, //15722 #CJK UNIFIED IDEOGRAPH + {0xEFF5, 0x8AEA}, //15723 #CJK UNIFIED IDEOGRAPH + {0xEFF6, 0x8C9E}, //15724 #CJK UNIFIED IDEOGRAPH + {0xEFF7, 0x912D}, //15725 #CJK UNIFIED IDEOGRAPH + {0xEFF8, 0x914A}, //15726 #CJK UNIFIED IDEOGRAPH + {0xEFF9, 0x91D8}, //15727 #CJK UNIFIED IDEOGRAPH + {0xEFFA, 0x9266}, //15728 #CJK UNIFIED IDEOGRAPH + {0xEFFB, 0x92CC}, //15729 #CJK UNIFIED IDEOGRAPH + {0xEFFC, 0x9320}, //15730 #CJK UNIFIED IDEOGRAPH + {0xEFFD, 0x9706}, //15731 #CJK UNIFIED IDEOGRAPH + {0xEFFE, 0x9756}, //15732 #CJK UNIFIED IDEOGRAPH + {0xF0A1, 0x975C}, //15733 #CJK UNIFIED IDEOGRAPH + {0xF0A2, 0x9802}, //15734 #CJK UNIFIED IDEOGRAPH + {0xF0A3, 0x9F0E}, //15735 #CJK UNIFIED IDEOGRAPH + {0xF0A4, 0x5236}, //15736 #CJK UNIFIED IDEOGRAPH + {0xF0A5, 0x5291}, //15737 #CJK UNIFIED IDEOGRAPH + {0xF0A6, 0x557C}, //15738 #CJK UNIFIED IDEOGRAPH + {0xF0A7, 0x5824}, //15739 #CJK UNIFIED IDEOGRAPH + {0xF0A8, 0x5E1D}, //15740 #CJK UNIFIED IDEOGRAPH + {0xF0A9, 0x5F1F}, //15741 #CJK UNIFIED IDEOGRAPH + {0xF0AA, 0x608C}, //15742 #CJK UNIFIED IDEOGRAPH + {0xF0AB, 0x63D0}, //15743 #CJK UNIFIED IDEOGRAPH + {0xF0AC, 0x68AF}, //15744 #CJK UNIFIED IDEOGRAPH + {0xF0AD, 0x6FDF}, //15745 #CJK UNIFIED IDEOGRAPH + {0xF0AE, 0x796D}, //15746 #CJK UNIFIED IDEOGRAPH + {0xF0AF, 0x7B2C}, //15747 #CJK UNIFIED IDEOGRAPH + {0xF0B0, 0x81CD}, //15748 #CJK UNIFIED IDEOGRAPH + {0xF0B1, 0x85BA}, //15749 #CJK UNIFIED IDEOGRAPH + {0xF0B2, 0x88FD}, //15750 #CJK UNIFIED IDEOGRAPH + {0xF0B3, 0x8AF8}, //15751 #CJK UNIFIED IDEOGRAPH + {0xF0B4, 0x8E44}, //15752 #CJK UNIFIED IDEOGRAPH + {0xF0B5, 0x918D}, //15753 #CJK UNIFIED IDEOGRAPH + {0xF0B6, 0x9664}, //15754 #CJK UNIFIED IDEOGRAPH + {0xF0B7, 0x969B}, //15755 #CJK UNIFIED IDEOGRAPH + {0xF0B8, 0x973D}, //15756 #CJK UNIFIED IDEOGRAPH + {0xF0B9, 0x984C}, //15757 #CJK UNIFIED IDEOGRAPH + {0xF0BA, 0x9F4A}, //15758 #CJK UNIFIED IDEOGRAPH + {0xF0BB, 0x4FCE}, //15759 #CJK UNIFIED IDEOGRAPH + {0xF0BC, 0x5146}, //15760 #CJK UNIFIED IDEOGRAPH + {0xF0BD, 0x51CB}, //15761 #CJK UNIFIED IDEOGRAPH + {0xF0BE, 0x52A9}, //15762 #CJK UNIFIED IDEOGRAPH + {0xF0BF, 0x5632}, //15763 #CJK UNIFIED IDEOGRAPH + {0xF0C0, 0x5F14}, //15764 #CJK UNIFIED IDEOGRAPH + {0xF0C1, 0x5F6B}, //15765 #CJK UNIFIED IDEOGRAPH + {0xF0C2, 0x63AA}, //15766 #CJK UNIFIED IDEOGRAPH + {0xF0C3, 0x64CD}, //15767 #CJK UNIFIED IDEOGRAPH + {0xF0C4, 0x65E9}, //15768 #CJK UNIFIED IDEOGRAPH + {0xF0C5, 0x6641}, //15769 #CJK UNIFIED IDEOGRAPH + {0xF0C6, 0x66FA}, //15770 #CJK UNIFIED IDEOGRAPH + {0xF0C7, 0x66F9}, //15771 #CJK UNIFIED IDEOGRAPH + {0xF0C8, 0x671D}, //15772 #CJK UNIFIED IDEOGRAPH + {0xF0C9, 0x689D}, //15773 #CJK UNIFIED IDEOGRAPH + {0xF0CA, 0x68D7}, //15774 #CJK UNIFIED IDEOGRAPH + {0xF0CB, 0x69FD}, //15775 #CJK UNIFIED IDEOGRAPH + {0xF0CC, 0x6F15}, //15776 #CJK UNIFIED IDEOGRAPH + {0xF0CD, 0x6F6E}, //15777 #CJK UNIFIED IDEOGRAPH + {0xF0CE, 0x7167}, //15778 #CJK UNIFIED IDEOGRAPH + {0xF0CF, 0x71E5}, //15779 #CJK UNIFIED IDEOGRAPH + {0xF0D0, 0x722A}, //15780 #CJK UNIFIED IDEOGRAPH + {0xF0D1, 0x74AA}, //15781 #CJK UNIFIED IDEOGRAPH + {0xF0D2, 0x773A}, //15782 #CJK UNIFIED IDEOGRAPH + {0xF0D3, 0x7956}, //15783 #CJK UNIFIED IDEOGRAPH + {0xF0D4, 0x795A}, //15784 #CJK UNIFIED IDEOGRAPH + {0xF0D5, 0x79DF}, //15785 #CJK UNIFIED IDEOGRAPH + {0xF0D6, 0x7A20}, //15786 #CJK UNIFIED IDEOGRAPH + {0xF0D7, 0x7A95}, //15787 #CJK UNIFIED IDEOGRAPH + {0xF0D8, 0x7C97}, //15788 #CJK UNIFIED IDEOGRAPH + {0xF0D9, 0x7CDF}, //15789 #CJK UNIFIED IDEOGRAPH + {0xF0DA, 0x7D44}, //15790 #CJK UNIFIED IDEOGRAPH + {0xF0DB, 0x7E70}, //15791 #CJK UNIFIED IDEOGRAPH + {0xF0DC, 0x8087}, //15792 #CJK UNIFIED IDEOGRAPH + {0xF0DD, 0x85FB}, //15793 #CJK UNIFIED IDEOGRAPH + {0xF0DE, 0x86A4}, //15794 #CJK UNIFIED IDEOGRAPH + {0xF0DF, 0x8A54}, //15795 #CJK UNIFIED IDEOGRAPH + {0xF0E0, 0x8ABF}, //15796 #CJK UNIFIED IDEOGRAPH + {0xF0E1, 0x8D99}, //15797 #CJK UNIFIED IDEOGRAPH + {0xF0E2, 0x8E81}, //15798 #CJK UNIFIED IDEOGRAPH + {0xF0E3, 0x9020}, //15799 #CJK UNIFIED IDEOGRAPH + {0xF0E4, 0x906D}, //15800 #CJK UNIFIED IDEOGRAPH + {0xF0E5, 0x91E3}, //15801 #CJK UNIFIED IDEOGRAPH + {0xF0E6, 0x963B}, //15802 #CJK UNIFIED IDEOGRAPH + {0xF0E7, 0x96D5}, //15803 #CJK UNIFIED IDEOGRAPH + {0xF0E8, 0x9CE5}, //15804 #CJK UNIFIED IDEOGRAPH + {0xF0E9, 0x65CF}, //15805 #CJK UNIFIED IDEOGRAPH + {0xF0EA, 0x7C07}, //15806 #CJK UNIFIED IDEOGRAPH + {0xF0EB, 0x8DB3}, //15807 #CJK UNIFIED IDEOGRAPH + {0xF0EC, 0x93C3}, //15808 #CJK UNIFIED IDEOGRAPH + {0xF0ED, 0x5B58}, //15809 #CJK UNIFIED IDEOGRAPH + {0xF0EE, 0x5C0A}, //15810 #CJK UNIFIED IDEOGRAPH + {0xF0EF, 0x5352}, //15811 #CJK UNIFIED IDEOGRAPH + {0xF0F0, 0x62D9}, //15812 #CJK UNIFIED IDEOGRAPH + {0xF0F1, 0x731D}, //15813 #CJK UNIFIED IDEOGRAPH + {0xF0F2, 0x5027}, //15814 #CJK UNIFIED IDEOGRAPH + {0xF0F3, 0x5B97}, //15815 #CJK UNIFIED IDEOGRAPH + {0xF0F4, 0x5F9E}, //15816 #CJK UNIFIED IDEOGRAPH + {0xF0F5, 0x60B0}, //15817 #CJK UNIFIED IDEOGRAPH + {0xF0F6, 0x616B}, //15818 #CJK UNIFIED IDEOGRAPH + {0xF0F7, 0x68D5}, //15819 #CJK UNIFIED IDEOGRAPH + {0xF0F8, 0x6DD9}, //15820 #CJK UNIFIED IDEOGRAPH + {0xF0F9, 0x742E}, //15821 #CJK UNIFIED IDEOGRAPH + {0xF0FA, 0x7A2E}, //15822 #CJK UNIFIED IDEOGRAPH + {0xF0FB, 0x7D42}, //15823 #CJK UNIFIED IDEOGRAPH + {0xF0FC, 0x7D9C}, //15824 #CJK UNIFIED IDEOGRAPH + {0xF0FD, 0x7E31}, //15825 #CJK UNIFIED IDEOGRAPH + {0xF0FE, 0x816B}, //15826 #CJK UNIFIED IDEOGRAPH + {0xF1A1, 0x8E2A}, //15827 #CJK UNIFIED IDEOGRAPH + {0xF1A2, 0x8E35}, //15828 #CJK UNIFIED IDEOGRAPH + {0xF1A3, 0x937E}, //15829 #CJK UNIFIED IDEOGRAPH + {0xF1A4, 0x9418}, //15830 #CJK UNIFIED IDEOGRAPH + {0xF1A5, 0x4F50}, //15831 #CJK UNIFIED IDEOGRAPH + {0xF1A6, 0x5750}, //15832 #CJK UNIFIED IDEOGRAPH + {0xF1A7, 0x5DE6}, //15833 #CJK UNIFIED IDEOGRAPH + {0xF1A8, 0x5EA7}, //15834 #CJK UNIFIED IDEOGRAPH + {0xF1A9, 0x632B}, //15835 #CJK UNIFIED IDEOGRAPH + {0xF1AA, 0x7F6A}, //15836 #CJK UNIFIED IDEOGRAPH + {0xF1AB, 0x4E3B}, //15837 #CJK UNIFIED IDEOGRAPH + {0xF1AC, 0x4F4F}, //15838 #CJK UNIFIED IDEOGRAPH + {0xF1AD, 0x4F8F}, //15839 #CJK UNIFIED IDEOGRAPH + {0xF1AE, 0x505A}, //15840 #CJK UNIFIED IDEOGRAPH + {0xF1AF, 0x59DD}, //15841 #CJK UNIFIED IDEOGRAPH + {0xF1B0, 0x80C4}, //15842 #CJK UNIFIED IDEOGRAPH + {0xF1B1, 0x546A}, //15843 #CJK UNIFIED IDEOGRAPH + {0xF1B2, 0x5468}, //15844 #CJK UNIFIED IDEOGRAPH + {0xF1B3, 0x55FE}, //15845 #CJK UNIFIED IDEOGRAPH + {0xF1B4, 0x594F}, //15846 #CJK UNIFIED IDEOGRAPH + {0xF1B5, 0x5B99}, //15847 #CJK UNIFIED IDEOGRAPH + {0xF1B6, 0x5DDE}, //15848 #CJK UNIFIED IDEOGRAPH + {0xF1B7, 0x5EDA}, //15849 #CJK UNIFIED IDEOGRAPH + {0xF1B8, 0x665D}, //15850 #CJK UNIFIED IDEOGRAPH + {0xF1B9, 0x6731}, //15851 #CJK UNIFIED IDEOGRAPH + {0xF1BA, 0x67F1}, //15852 #CJK UNIFIED IDEOGRAPH + {0xF1BB, 0x682A}, //15853 #CJK UNIFIED IDEOGRAPH + {0xF1BC, 0x6CE8}, //15854 #CJK UNIFIED IDEOGRAPH + {0xF1BD, 0x6D32}, //15855 #CJK UNIFIED IDEOGRAPH + {0xF1BE, 0x6E4A}, //15856 #CJK UNIFIED IDEOGRAPH + {0xF1BF, 0x6F8D}, //15857 #CJK UNIFIED IDEOGRAPH + {0xF1C0, 0x70B7}, //15858 #CJK UNIFIED IDEOGRAPH + {0xF1C1, 0x73E0}, //15859 #CJK UNIFIED IDEOGRAPH + {0xF1C2, 0x7587}, //15860 #CJK UNIFIED IDEOGRAPH + {0xF1C3, 0x7C4C}, //15861 #CJK UNIFIED IDEOGRAPH + {0xF1C4, 0x7D02}, //15862 #CJK UNIFIED IDEOGRAPH + {0xF1C5, 0x7D2C}, //15863 #CJK UNIFIED IDEOGRAPH + {0xF1C6, 0x7DA2}, //15864 #CJK UNIFIED IDEOGRAPH + {0xF1C7, 0x821F}, //15865 #CJK UNIFIED IDEOGRAPH + {0xF1C8, 0x86DB}, //15866 #CJK UNIFIED IDEOGRAPH + {0xF1C9, 0x8A3B}, //15867 #CJK UNIFIED IDEOGRAPH + {0xF1CA, 0x8A85}, //15868 #CJK UNIFIED IDEOGRAPH + {0xF1CB, 0x8D70}, //15869 #CJK UNIFIED IDEOGRAPH + {0xF1CC, 0x8E8A}, //15870 #CJK UNIFIED IDEOGRAPH + {0xF1CD, 0x8F33}, //15871 #CJK UNIFIED IDEOGRAPH + {0xF1CE, 0x9031}, //15872 #CJK UNIFIED IDEOGRAPH + {0xF1CF, 0x914E}, //15873 #CJK UNIFIED IDEOGRAPH + {0xF1D0, 0x9152}, //15874 #CJK UNIFIED IDEOGRAPH + {0xF1D1, 0x9444}, //15875 #CJK UNIFIED IDEOGRAPH + {0xF1D2, 0x99D0}, //15876 #CJK UNIFIED IDEOGRAPH + {0xF1D3, 0x7AF9}, //15877 #CJK UNIFIED IDEOGRAPH + {0xF1D4, 0x7CA5}, //15878 #CJK UNIFIED IDEOGRAPH + {0xF1D5, 0x4FCA}, //15879 #CJK UNIFIED IDEOGRAPH + {0xF1D6, 0x5101}, //15880 #CJK UNIFIED IDEOGRAPH + {0xF1D7, 0x51C6}, //15881 #CJK UNIFIED IDEOGRAPH + {0xF1D8, 0x57C8}, //15882 #CJK UNIFIED IDEOGRAPH + {0xF1D9, 0x5BEF}, //15883 #CJK UNIFIED IDEOGRAPH + {0xF1DA, 0x5CFB}, //15884 #CJK UNIFIED IDEOGRAPH + {0xF1DB, 0x6659}, //15885 #CJK UNIFIED IDEOGRAPH + {0xF1DC, 0x6A3D}, //15886 #CJK UNIFIED IDEOGRAPH + {0xF1DD, 0x6D5A}, //15887 #CJK UNIFIED IDEOGRAPH + {0xF1DE, 0x6E96}, //15888 #CJK UNIFIED IDEOGRAPH + {0xF1DF, 0x6FEC}, //15889 #CJK UNIFIED IDEOGRAPH + {0xF1E0, 0x710C}, //15890 #CJK UNIFIED IDEOGRAPH + {0xF1E1, 0x756F}, //15891 #CJK UNIFIED IDEOGRAPH + {0xF1E2, 0x7AE3}, //15892 #CJK UNIFIED IDEOGRAPH + {0xF1E3, 0x8822}, //15893 #CJK UNIFIED IDEOGRAPH + {0xF1E4, 0x9021}, //15894 #CJK UNIFIED IDEOGRAPH + {0xF1E5, 0x9075}, //15895 #CJK UNIFIED IDEOGRAPH + {0xF1E6, 0x96CB}, //15896 #CJK UNIFIED IDEOGRAPH + {0xF1E7, 0x99FF}, //15897 #CJK UNIFIED IDEOGRAPH + {0xF1E8, 0x8301}, //15898 #CJK UNIFIED IDEOGRAPH + {0xF1E9, 0x4E2D}, //15899 #CJK UNIFIED IDEOGRAPH + {0xF1EA, 0x4EF2}, //15900 #CJK UNIFIED IDEOGRAPH + {0xF1EB, 0x8846}, //15901 #CJK UNIFIED IDEOGRAPH + {0xF1EC, 0x91CD}, //15902 #CJK UNIFIED IDEOGRAPH + {0xF1ED, 0x537D}, //15903 #CJK UNIFIED IDEOGRAPH + {0xF1EE, 0x6ADB}, //15904 #CJK UNIFIED IDEOGRAPH + {0xF1EF, 0x696B}, //15905 #CJK UNIFIED IDEOGRAPH + {0xF1F0, 0x6C41}, //15906 #CJK UNIFIED IDEOGRAPH + {0xF1F1, 0x847A}, //15907 #CJK UNIFIED IDEOGRAPH + {0xF1F2, 0x589E}, //15908 #CJK UNIFIED IDEOGRAPH + {0xF1F3, 0x618E}, //15909 #CJK UNIFIED IDEOGRAPH + {0xF1F4, 0x66FE}, //15910 #CJK UNIFIED IDEOGRAPH + {0xF1F5, 0x62EF}, //15911 #CJK UNIFIED IDEOGRAPH + {0xF1F6, 0x70DD}, //15912 #CJK UNIFIED IDEOGRAPH + {0xF1F7, 0x7511}, //15913 #CJK UNIFIED IDEOGRAPH + {0xF1F8, 0x75C7}, //15914 #CJK UNIFIED IDEOGRAPH + {0xF1F9, 0x7E52}, //15915 #CJK UNIFIED IDEOGRAPH + {0xF1FA, 0x84B8}, //15916 #CJK UNIFIED IDEOGRAPH + {0xF1FB, 0x8B49}, //15917 #CJK UNIFIED IDEOGRAPH + {0xF1FC, 0x8D08}, //15918 #CJK UNIFIED IDEOGRAPH + {0xF1FD, 0x4E4B}, //15919 #CJK UNIFIED IDEOGRAPH + {0xF1FE, 0x53EA}, //15920 #CJK UNIFIED IDEOGRAPH + {0xF2A1, 0x54AB}, //15921 #CJK UNIFIED IDEOGRAPH + {0xF2A2, 0x5730}, //15922 #CJK UNIFIED IDEOGRAPH + {0xF2A3, 0x5740}, //15923 #CJK UNIFIED IDEOGRAPH + {0xF2A4, 0x5FD7}, //15924 #CJK UNIFIED IDEOGRAPH + {0xF2A5, 0x6301}, //15925 #CJK UNIFIED IDEOGRAPH + {0xF2A6, 0x6307}, //15926 #CJK UNIFIED IDEOGRAPH + {0xF2A7, 0x646F}, //15927 #CJK UNIFIED IDEOGRAPH + {0xF2A8, 0x652F}, //15928 #CJK UNIFIED IDEOGRAPH + {0xF2A9, 0x65E8}, //15929 #CJK UNIFIED IDEOGRAPH + {0xF2AA, 0x667A}, //15930 #CJK UNIFIED IDEOGRAPH + {0xF2AB, 0x679D}, //15931 #CJK UNIFIED IDEOGRAPH + {0xF2AC, 0x67B3}, //15932 #CJK UNIFIED IDEOGRAPH + {0xF2AD, 0x6B62}, //15933 #CJK UNIFIED IDEOGRAPH + {0xF2AE, 0x6C60}, //15934 #CJK UNIFIED IDEOGRAPH + {0xF2AF, 0x6C9A}, //15935 #CJK UNIFIED IDEOGRAPH + {0xF2B0, 0x6F2C}, //15936 #CJK UNIFIED IDEOGRAPH + {0xF2B1, 0x77E5}, //15937 #CJK UNIFIED IDEOGRAPH + {0xF2B2, 0x7825}, //15938 #CJK UNIFIED IDEOGRAPH + {0xF2B3, 0x7949}, //15939 #CJK UNIFIED IDEOGRAPH + {0xF2B4, 0x7957}, //15940 #CJK UNIFIED IDEOGRAPH + {0xF2B5, 0x7D19}, //15941 #CJK UNIFIED IDEOGRAPH + {0xF2B6, 0x80A2}, //15942 #CJK UNIFIED IDEOGRAPH + {0xF2B7, 0x8102}, //15943 #CJK UNIFIED IDEOGRAPH + {0xF2B8, 0x81F3}, //15944 #CJK UNIFIED IDEOGRAPH + {0xF2B9, 0x829D}, //15945 #CJK UNIFIED IDEOGRAPH + {0xF2BA, 0x82B7}, //15946 #CJK UNIFIED IDEOGRAPH + {0xF2BB, 0x8718}, //15947 #CJK UNIFIED IDEOGRAPH + {0xF2BC, 0x8A8C}, //15948 #CJK UNIFIED IDEOGRAPH + {0xF2BD, 0xF9FC}, //15949 #CJK COMPATIBILITY IDEOGRAPH + {0xF2BE, 0x8D04}, //15950 #CJK UNIFIED IDEOGRAPH + {0xF2BF, 0x8DBE}, //15951 #CJK UNIFIED IDEOGRAPH + {0xF2C0, 0x9072}, //15952 #CJK UNIFIED IDEOGRAPH + {0xF2C1, 0x76F4}, //15953 #CJK UNIFIED IDEOGRAPH + {0xF2C2, 0x7A19}, //15954 #CJK UNIFIED IDEOGRAPH + {0xF2C3, 0x7A37}, //15955 #CJK UNIFIED IDEOGRAPH + {0xF2C4, 0x7E54}, //15956 #CJK UNIFIED IDEOGRAPH + {0xF2C5, 0x8077}, //15957 #CJK UNIFIED IDEOGRAPH + {0xF2C6, 0x5507}, //15958 #CJK UNIFIED IDEOGRAPH + {0xF2C7, 0x55D4}, //15959 #CJK UNIFIED IDEOGRAPH + {0xF2C8, 0x5875}, //15960 #CJK UNIFIED IDEOGRAPH + {0xF2C9, 0x632F}, //15961 #CJK UNIFIED IDEOGRAPH + {0xF2CA, 0x6422}, //15962 #CJK UNIFIED IDEOGRAPH + {0xF2CB, 0x6649}, //15963 #CJK UNIFIED IDEOGRAPH + {0xF2CC, 0x664B}, //15964 #CJK UNIFIED IDEOGRAPH + {0xF2CD, 0x686D}, //15965 #CJK UNIFIED IDEOGRAPH + {0xF2CE, 0x699B}, //15966 #CJK UNIFIED IDEOGRAPH + {0xF2CF, 0x6B84}, //15967 #CJK UNIFIED IDEOGRAPH + {0xF2D0, 0x6D25}, //15968 #CJK UNIFIED IDEOGRAPH + {0xF2D1, 0x6EB1}, //15969 #CJK UNIFIED IDEOGRAPH + {0xF2D2, 0x73CD}, //15970 #CJK UNIFIED IDEOGRAPH + {0xF2D3, 0x7468}, //15971 #CJK UNIFIED IDEOGRAPH + {0xF2D4, 0x74A1}, //15972 #CJK UNIFIED IDEOGRAPH + {0xF2D5, 0x755B}, //15973 #CJK UNIFIED IDEOGRAPH + {0xF2D6, 0x75B9}, //15974 #CJK UNIFIED IDEOGRAPH + {0xF2D7, 0x76E1}, //15975 #CJK UNIFIED IDEOGRAPH + {0xF2D8, 0x771E}, //15976 #CJK UNIFIED IDEOGRAPH + {0xF2D9, 0x778B}, //15977 #CJK UNIFIED IDEOGRAPH + {0xF2DA, 0x79E6}, //15978 #CJK UNIFIED IDEOGRAPH + {0xF2DB, 0x7E09}, //15979 #CJK UNIFIED IDEOGRAPH + {0xF2DC, 0x7E1D}, //15980 #CJK UNIFIED IDEOGRAPH + {0xF2DD, 0x81FB}, //15981 #CJK UNIFIED IDEOGRAPH + {0xF2DE, 0x852F}, //15982 #CJK UNIFIED IDEOGRAPH + {0xF2DF, 0x8897}, //15983 #CJK UNIFIED IDEOGRAPH + {0xF2E0, 0x8A3A}, //15984 #CJK UNIFIED IDEOGRAPH + {0xF2E1, 0x8CD1}, //15985 #CJK UNIFIED IDEOGRAPH + {0xF2E2, 0x8EEB}, //15986 #CJK UNIFIED IDEOGRAPH + {0xF2E3, 0x8FB0}, //15987 #CJK UNIFIED IDEOGRAPH + {0xF2E4, 0x9032}, //15988 #CJK UNIFIED IDEOGRAPH + {0xF2E5, 0x93AD}, //15989 #CJK UNIFIED IDEOGRAPH + {0xF2E6, 0x9663}, //15990 #CJK UNIFIED IDEOGRAPH + {0xF2E7, 0x9673}, //15991 #CJK UNIFIED IDEOGRAPH + {0xF2E8, 0x9707}, //15992 #CJK UNIFIED IDEOGRAPH + {0xF2E9, 0x4F84}, //15993 #CJK UNIFIED IDEOGRAPH + {0xF2EA, 0x53F1}, //15994 #CJK UNIFIED IDEOGRAPH + {0xF2EB, 0x59EA}, //15995 #CJK UNIFIED IDEOGRAPH + {0xF2EC, 0x5AC9}, //15996 #CJK UNIFIED IDEOGRAPH + {0xF2ED, 0x5E19}, //15997 #CJK UNIFIED IDEOGRAPH + {0xF2EE, 0x684E}, //15998 #CJK UNIFIED IDEOGRAPH + {0xF2EF, 0x74C6}, //15999 #CJK UNIFIED IDEOGRAPH + {0xF2F0, 0x75BE}, //16000 #CJK UNIFIED IDEOGRAPH + {0xF2F1, 0x79E9}, //16001 #CJK UNIFIED IDEOGRAPH + {0xF2F2, 0x7A92}, //16002 #CJK UNIFIED IDEOGRAPH + {0xF2F3, 0x81A3}, //16003 #CJK UNIFIED IDEOGRAPH + {0xF2F4, 0x86ED}, //16004 #CJK UNIFIED IDEOGRAPH + {0xF2F5, 0x8CEA}, //16005 #CJK UNIFIED IDEOGRAPH + {0xF2F6, 0x8DCC}, //16006 #CJK UNIFIED IDEOGRAPH + {0xF2F7, 0x8FED}, //16007 #CJK UNIFIED IDEOGRAPH + {0xF2F8, 0x659F}, //16008 #CJK UNIFIED IDEOGRAPH + {0xF2F9, 0x6715}, //16009 #CJK UNIFIED IDEOGRAPH + {0xF2FA, 0xF9FD}, //16010 #CJK COMPATIBILITY IDEOGRAPH + {0xF2FB, 0x57F7}, //16011 #CJK UNIFIED IDEOGRAPH + {0xF2FC, 0x6F57}, //16012 #CJK UNIFIED IDEOGRAPH + {0xF2FD, 0x7DDD}, //16013 #CJK UNIFIED IDEOGRAPH + {0xF2FE, 0x8F2F}, //16014 #CJK UNIFIED IDEOGRAPH + {0xF3A1, 0x93F6}, //16015 #CJK UNIFIED IDEOGRAPH + {0xF3A2, 0x96C6}, //16016 #CJK UNIFIED IDEOGRAPH + {0xF3A3, 0x5FB5}, //16017 #CJK UNIFIED IDEOGRAPH + {0xF3A4, 0x61F2}, //16018 #CJK UNIFIED IDEOGRAPH + {0xF3A5, 0x6F84}, //16019 #CJK UNIFIED IDEOGRAPH + {0xF3A6, 0x4E14}, //16020 #CJK UNIFIED IDEOGRAPH + {0xF3A7, 0x4F98}, //16021 #CJK UNIFIED IDEOGRAPH + {0xF3A8, 0x501F}, //16022 #CJK UNIFIED IDEOGRAPH + {0xF3A9, 0x53C9}, //16023 #CJK UNIFIED IDEOGRAPH + {0xF3AA, 0x55DF}, //16024 #CJK UNIFIED IDEOGRAPH + {0xF3AB, 0x5D6F}, //16025 #CJK UNIFIED IDEOGRAPH + {0xF3AC, 0x5DEE}, //16026 #CJK UNIFIED IDEOGRAPH + {0xF3AD, 0x6B21}, //16027 #CJK UNIFIED IDEOGRAPH + {0xF3AE, 0x6B64}, //16028 #CJK UNIFIED IDEOGRAPH + {0xF3AF, 0x78CB}, //16029 #CJK UNIFIED IDEOGRAPH + {0xF3B0, 0x7B9A}, //16030 #CJK UNIFIED IDEOGRAPH + {0xF3B1, 0xF9FE}, //16031 #CJK COMPATIBILITY IDEOGRAPH + {0xF3B2, 0x8E49}, //16032 #CJK UNIFIED IDEOGRAPH + {0xF3B3, 0x8ECA}, //16033 #CJK UNIFIED IDEOGRAPH + {0xF3B4, 0x906E}, //16034 #CJK UNIFIED IDEOGRAPH + {0xF3B5, 0x6349}, //16035 #CJK UNIFIED IDEOGRAPH + {0xF3B6, 0x643E}, //16036 #CJK UNIFIED IDEOGRAPH + {0xF3B7, 0x7740}, //16037 #CJK UNIFIED IDEOGRAPH + {0xF3B8, 0x7A84}, //16038 #CJK UNIFIED IDEOGRAPH + {0xF3B9, 0x932F}, //16039 #CJK UNIFIED IDEOGRAPH + {0xF3BA, 0x947F}, //16040 #CJK UNIFIED IDEOGRAPH + {0xF3BB, 0x9F6A}, //16041 #CJK UNIFIED IDEOGRAPH + {0xF3BC, 0x64B0}, //16042 #CJK UNIFIED IDEOGRAPH + {0xF3BD, 0x6FAF}, //16043 #CJK UNIFIED IDEOGRAPH + {0xF3BE, 0x71E6}, //16044 #CJK UNIFIED IDEOGRAPH + {0xF3BF, 0x74A8}, //16045 #CJK UNIFIED IDEOGRAPH + {0xF3C0, 0x74DA}, //16046 #CJK UNIFIED IDEOGRAPH + {0xF3C1, 0x7AC4}, //16047 #CJK UNIFIED IDEOGRAPH + {0xF3C2, 0x7C12}, //16048 #CJK UNIFIED IDEOGRAPH + {0xF3C3, 0x7E82}, //16049 #CJK UNIFIED IDEOGRAPH + {0xF3C4, 0x7CB2}, //16050 #CJK UNIFIED IDEOGRAPH + {0xF3C5, 0x7E98}, //16051 #CJK UNIFIED IDEOGRAPH + {0xF3C6, 0x8B9A}, //16052 #CJK UNIFIED IDEOGRAPH + {0xF3C7, 0x8D0A}, //16053 #CJK UNIFIED IDEOGRAPH + {0xF3C8, 0x947D}, //16054 #CJK UNIFIED IDEOGRAPH + {0xF3C9, 0x9910}, //16055 #CJK UNIFIED IDEOGRAPH + {0xF3CA, 0x994C}, //16056 #CJK UNIFIED IDEOGRAPH + {0xF3CB, 0x5239}, //16057 #CJK UNIFIED IDEOGRAPH + {0xF3CC, 0x5BDF}, //16058 #CJK UNIFIED IDEOGRAPH + {0xF3CD, 0x64E6}, //16059 #CJK UNIFIED IDEOGRAPH + {0xF3CE, 0x672D}, //16060 #CJK UNIFIED IDEOGRAPH + {0xF3CF, 0x7D2E}, //16061 #CJK UNIFIED IDEOGRAPH + {0xF3D0, 0x50ED}, //16062 #CJK UNIFIED IDEOGRAPH + {0xF3D1, 0x53C3}, //16063 #CJK UNIFIED IDEOGRAPH + {0xF3D2, 0x5879}, //16064 #CJK UNIFIED IDEOGRAPH + {0xF3D3, 0x6158}, //16065 #CJK UNIFIED IDEOGRAPH + {0xF3D4, 0x6159}, //16066 #CJK UNIFIED IDEOGRAPH + {0xF3D5, 0x61FA}, //16067 #CJK UNIFIED IDEOGRAPH + {0xF3D6, 0x65AC}, //16068 #CJK UNIFIED IDEOGRAPH + {0xF3D7, 0x7AD9}, //16069 #CJK UNIFIED IDEOGRAPH + {0xF3D8, 0x8B92}, //16070 #CJK UNIFIED IDEOGRAPH + {0xF3D9, 0x8B96}, //16071 #CJK UNIFIED IDEOGRAPH + {0xF3DA, 0x5009}, //16072 #CJK UNIFIED IDEOGRAPH + {0xF3DB, 0x5021}, //16073 #CJK UNIFIED IDEOGRAPH + {0xF3DC, 0x5275}, //16074 #CJK UNIFIED IDEOGRAPH + {0xF3DD, 0x5531}, //16075 #CJK UNIFIED IDEOGRAPH + {0xF3DE, 0x5A3C}, //16076 #CJK UNIFIED IDEOGRAPH + {0xF3DF, 0x5EE0}, //16077 #CJK UNIFIED IDEOGRAPH + {0xF3E0, 0x5F70}, //16078 #CJK UNIFIED IDEOGRAPH + {0xF3E1, 0x6134}, //16079 #CJK UNIFIED IDEOGRAPH + {0xF3E2, 0x655E}, //16080 #CJK UNIFIED IDEOGRAPH + {0xF3E3, 0x660C}, //16081 #CJK UNIFIED IDEOGRAPH + {0xF3E4, 0x6636}, //16082 #CJK UNIFIED IDEOGRAPH + {0xF3E5, 0x66A2}, //16083 #CJK UNIFIED IDEOGRAPH + {0xF3E6, 0x69CD}, //16084 #CJK UNIFIED IDEOGRAPH + {0xF3E7, 0x6EC4}, //16085 #CJK UNIFIED IDEOGRAPH + {0xF3E8, 0x6F32}, //16086 #CJK UNIFIED IDEOGRAPH + {0xF3E9, 0x7316}, //16087 #CJK UNIFIED IDEOGRAPH + {0xF3EA, 0x7621}, //16088 #CJK UNIFIED IDEOGRAPH + {0xF3EB, 0x7A93}, //16089 #CJK UNIFIED IDEOGRAPH + {0xF3EC, 0x8139}, //16090 #CJK UNIFIED IDEOGRAPH + {0xF3ED, 0x8259}, //16091 #CJK UNIFIED IDEOGRAPH + {0xF3EE, 0x83D6}, //16092 #CJK UNIFIED IDEOGRAPH + {0xF3EF, 0x84BC}, //16093 #CJK UNIFIED IDEOGRAPH + {0xF3F0, 0x50B5}, //16094 #CJK UNIFIED IDEOGRAPH + {0xF3F1, 0x57F0}, //16095 #CJK UNIFIED IDEOGRAPH + {0xF3F2, 0x5BC0}, //16096 #CJK UNIFIED IDEOGRAPH + {0xF3F3, 0x5BE8}, //16097 #CJK UNIFIED IDEOGRAPH + {0xF3F4, 0x5F69}, //16098 #CJK UNIFIED IDEOGRAPH + {0xF3F5, 0x63A1}, //16099 #CJK UNIFIED IDEOGRAPH + {0xF3F6, 0x7826}, //16100 #CJK UNIFIED IDEOGRAPH + {0xF3F7, 0x7DB5}, //16101 #CJK UNIFIED IDEOGRAPH + {0xF3F8, 0x83DC}, //16102 #CJK UNIFIED IDEOGRAPH + {0xF3F9, 0x8521}, //16103 #CJK UNIFIED IDEOGRAPH + {0xF3FA, 0x91C7}, //16104 #CJK UNIFIED IDEOGRAPH + {0xF3FB, 0x91F5}, //16105 #CJK UNIFIED IDEOGRAPH + {0xF3FC, 0x518A}, //16106 #CJK UNIFIED IDEOGRAPH + {0xF3FD, 0x67F5}, //16107 #CJK UNIFIED IDEOGRAPH + {0xF3FE, 0x7B56}, //16108 #CJK UNIFIED IDEOGRAPH + {0xF4A1, 0x8CAC}, //16109 #CJK UNIFIED IDEOGRAPH + {0xF4A2, 0x51C4}, //16110 #CJK UNIFIED IDEOGRAPH + {0xF4A3, 0x59BB}, //16111 #CJK UNIFIED IDEOGRAPH + {0xF4A4, 0x60BD}, //16112 #CJK UNIFIED IDEOGRAPH + {0xF4A5, 0x8655}, //16113 #CJK UNIFIED IDEOGRAPH + {0xF4A6, 0x501C}, //16114 #CJK UNIFIED IDEOGRAPH + {0xF4A7, 0xF9FF}, //16115 #CJK COMPATIBILITY IDEOGRAPH + {0xF4A8, 0x5254}, //16116 #CJK UNIFIED IDEOGRAPH + {0xF4A9, 0x5C3A}, //16117 #CJK UNIFIED IDEOGRAPH + {0xF4AA, 0x617D}, //16118 #CJK UNIFIED IDEOGRAPH + {0xF4AB, 0x621A}, //16119 #CJK UNIFIED IDEOGRAPH + {0xF4AC, 0x62D3}, //16120 #CJK UNIFIED IDEOGRAPH + {0xF4AD, 0x64F2}, //16121 #CJK UNIFIED IDEOGRAPH + {0xF4AE, 0x65A5}, //16122 #CJK UNIFIED IDEOGRAPH + {0xF4AF, 0x6ECC}, //16123 #CJK UNIFIED IDEOGRAPH + {0xF4B0, 0x7620}, //16124 #CJK UNIFIED IDEOGRAPH + {0xF4B1, 0x810A}, //16125 #CJK UNIFIED IDEOGRAPH + {0xF4B2, 0x8E60}, //16126 #CJK UNIFIED IDEOGRAPH + {0xF4B3, 0x965F}, //16127 #CJK UNIFIED IDEOGRAPH + {0xF4B4, 0x96BB}, //16128 #CJK UNIFIED IDEOGRAPH + {0xF4B5, 0x4EDF}, //16129 #CJK UNIFIED IDEOGRAPH + {0xF4B6, 0x5343}, //16130 #CJK UNIFIED IDEOGRAPH + {0xF4B7, 0x5598}, //16131 #CJK UNIFIED IDEOGRAPH + {0xF4B8, 0x5929}, //16132 #CJK UNIFIED IDEOGRAPH + {0xF4B9, 0x5DDD}, //16133 #CJK UNIFIED IDEOGRAPH + {0xF4BA, 0x64C5}, //16134 #CJK UNIFIED IDEOGRAPH + {0xF4BB, 0x6CC9}, //16135 #CJK UNIFIED IDEOGRAPH + {0xF4BC, 0x6DFA}, //16136 #CJK UNIFIED IDEOGRAPH + {0xF4BD, 0x7394}, //16137 #CJK UNIFIED IDEOGRAPH + {0xF4BE, 0x7A7F}, //16138 #CJK UNIFIED IDEOGRAPH + {0xF4BF, 0x821B}, //16139 #CJK UNIFIED IDEOGRAPH + {0xF4C0, 0x85A6}, //16140 #CJK UNIFIED IDEOGRAPH + {0xF4C1, 0x8CE4}, //16141 #CJK UNIFIED IDEOGRAPH + {0xF4C2, 0x8E10}, //16142 #CJK UNIFIED IDEOGRAPH + {0xF4C3, 0x9077}, //16143 #CJK UNIFIED IDEOGRAPH + {0xF4C4, 0x91E7}, //16144 #CJK UNIFIED IDEOGRAPH + {0xF4C5, 0x95E1}, //16145 #CJK UNIFIED IDEOGRAPH + {0xF4C6, 0x9621}, //16146 #CJK UNIFIED IDEOGRAPH + {0xF4C7, 0x97C6}, //16147 #CJK UNIFIED IDEOGRAPH + {0xF4C8, 0x51F8}, //16148 #CJK UNIFIED IDEOGRAPH + {0xF4C9, 0x54F2}, //16149 #CJK UNIFIED IDEOGRAPH + {0xF4CA, 0x5586}, //16150 #CJK UNIFIED IDEOGRAPH + {0xF4CB, 0x5FB9}, //16151 #CJK UNIFIED IDEOGRAPH + {0xF4CC, 0x64A4}, //16152 #CJK UNIFIED IDEOGRAPH + {0xF4CD, 0x6F88}, //16153 #CJK UNIFIED IDEOGRAPH + {0xF4CE, 0x7DB4}, //16154 #CJK UNIFIED IDEOGRAPH + {0xF4CF, 0x8F1F}, //16155 #CJK UNIFIED IDEOGRAPH + {0xF4D0, 0x8F4D}, //16156 #CJK UNIFIED IDEOGRAPH + {0xF4D1, 0x9435}, //16157 #CJK UNIFIED IDEOGRAPH + {0xF4D2, 0x50C9}, //16158 #CJK UNIFIED IDEOGRAPH + {0xF4D3, 0x5C16}, //16159 #CJK UNIFIED IDEOGRAPH + {0xF4D4, 0x6CBE}, //16160 #CJK UNIFIED IDEOGRAPH + {0xF4D5, 0x6DFB}, //16161 #CJK UNIFIED IDEOGRAPH + {0xF4D6, 0x751B}, //16162 #CJK UNIFIED IDEOGRAPH + {0xF4D7, 0x77BB}, //16163 #CJK UNIFIED IDEOGRAPH + {0xF4D8, 0x7C3D}, //16164 #CJK UNIFIED IDEOGRAPH + {0xF4D9, 0x7C64}, //16165 #CJK UNIFIED IDEOGRAPH + {0xF4DA, 0x8A79}, //16166 #CJK UNIFIED IDEOGRAPH + {0xF4DB, 0x8AC2}, //16167 #CJK UNIFIED IDEOGRAPH + {0xF4DC, 0x581E}, //16168 #CJK UNIFIED IDEOGRAPH + {0xF4DD, 0x59BE}, //16169 #CJK UNIFIED IDEOGRAPH + {0xF4DE, 0x5E16}, //16170 #CJK UNIFIED IDEOGRAPH + {0xF4DF, 0x6377}, //16171 #CJK UNIFIED IDEOGRAPH + {0xF4E0, 0x7252}, //16172 #CJK UNIFIED IDEOGRAPH + {0xF4E1, 0x758A}, //16173 #CJK UNIFIED IDEOGRAPH + {0xF4E2, 0x776B}, //16174 #CJK UNIFIED IDEOGRAPH + {0xF4E3, 0x8ADC}, //16175 #CJK UNIFIED IDEOGRAPH + {0xF4E4, 0x8CBC}, //16176 #CJK UNIFIED IDEOGRAPH + {0xF4E5, 0x8F12}, //16177 #CJK UNIFIED IDEOGRAPH + {0xF4E6, 0x5EF3}, //16178 #CJK UNIFIED IDEOGRAPH + {0xF4E7, 0x6674}, //16179 #CJK UNIFIED IDEOGRAPH + {0xF4E8, 0x6DF8}, //16180 #CJK UNIFIED IDEOGRAPH + {0xF4E9, 0x807D}, //16181 #CJK UNIFIED IDEOGRAPH + {0xF4EA, 0x83C1}, //16182 #CJK UNIFIED IDEOGRAPH + {0xF4EB, 0x8ACB}, //16183 #CJK UNIFIED IDEOGRAPH + {0xF4EC, 0x9751}, //16184 #CJK UNIFIED IDEOGRAPH + {0xF4ED, 0x9BD6}, //16185 #CJK UNIFIED IDEOGRAPH + {0xF4EE, 0xFA00}, //16186 #CJK COMPATIBILITY IDEOGRAPH + {0xF4EF, 0x5243}, //16187 #CJK UNIFIED IDEOGRAPH + {0xF4F0, 0x66FF}, //16188 #CJK UNIFIED IDEOGRAPH + {0xF4F1, 0x6D95}, //16189 #CJK UNIFIED IDEOGRAPH + {0xF4F2, 0x6EEF}, //16190 #CJK UNIFIED IDEOGRAPH + {0xF4F3, 0x7DE0}, //16191 #CJK UNIFIED IDEOGRAPH + {0xF4F4, 0x8AE6}, //16192 #CJK UNIFIED IDEOGRAPH + {0xF4F5, 0x902E}, //16193 #CJK UNIFIED IDEOGRAPH + {0xF4F6, 0x905E}, //16194 #CJK UNIFIED IDEOGRAPH + {0xF4F7, 0x9AD4}, //16195 #CJK UNIFIED IDEOGRAPH + {0xF4F8, 0x521D}, //16196 #CJK UNIFIED IDEOGRAPH + {0xF4F9, 0x527F}, //16197 #CJK UNIFIED IDEOGRAPH + {0xF4FA, 0x54E8}, //16198 #CJK UNIFIED IDEOGRAPH + {0xF4FB, 0x6194}, //16199 #CJK UNIFIED IDEOGRAPH + {0xF4FC, 0x6284}, //16200 #CJK UNIFIED IDEOGRAPH + {0xF4FD, 0x62DB}, //16201 #CJK UNIFIED IDEOGRAPH + {0xF4FE, 0x68A2}, //16202 #CJK UNIFIED IDEOGRAPH + {0xF5A1, 0x6912}, //16203 #CJK UNIFIED IDEOGRAPH + {0xF5A2, 0x695A}, //16204 #CJK UNIFIED IDEOGRAPH + {0xF5A3, 0x6A35}, //16205 #CJK UNIFIED IDEOGRAPH + {0xF5A4, 0x7092}, //16206 #CJK UNIFIED IDEOGRAPH + {0xF5A5, 0x7126}, //16207 #CJK UNIFIED IDEOGRAPH + {0xF5A6, 0x785D}, //16208 #CJK UNIFIED IDEOGRAPH + {0xF5A7, 0x7901}, //16209 #CJK UNIFIED IDEOGRAPH + {0xF5A8, 0x790E}, //16210 #CJK UNIFIED IDEOGRAPH + {0xF5A9, 0x79D2}, //16211 #CJK UNIFIED IDEOGRAPH + {0xF5AA, 0x7A0D}, //16212 #CJK UNIFIED IDEOGRAPH + {0xF5AB, 0x8096}, //16213 #CJK UNIFIED IDEOGRAPH + {0xF5AC, 0x8278}, //16214 #CJK UNIFIED IDEOGRAPH + {0xF5AD, 0x82D5}, //16215 #CJK UNIFIED IDEOGRAPH + {0xF5AE, 0x8349}, //16216 #CJK UNIFIED IDEOGRAPH + {0xF5AF, 0x8549}, //16217 #CJK UNIFIED IDEOGRAPH + {0xF5B0, 0x8C82}, //16218 #CJK UNIFIED IDEOGRAPH + {0xF5B1, 0x8D85}, //16219 #CJK UNIFIED IDEOGRAPH + {0xF5B2, 0x9162}, //16220 #CJK UNIFIED IDEOGRAPH + {0xF5B3, 0x918B}, //16221 #CJK UNIFIED IDEOGRAPH + {0xF5B4, 0x91AE}, //16222 #CJK UNIFIED IDEOGRAPH + {0xF5B5, 0x4FC3}, //16223 #CJK UNIFIED IDEOGRAPH + {0xF5B6, 0x56D1}, //16224 #CJK UNIFIED IDEOGRAPH + {0xF5B7, 0x71ED}, //16225 #CJK UNIFIED IDEOGRAPH + {0xF5B8, 0x77D7}, //16226 #CJK UNIFIED IDEOGRAPH + {0xF5B9, 0x8700}, //16227 #CJK UNIFIED IDEOGRAPH + {0xF5BA, 0x89F8}, //16228 #CJK UNIFIED IDEOGRAPH + {0xF5BB, 0x5BF8}, //16229 #CJK UNIFIED IDEOGRAPH + {0xF5BC, 0x5FD6}, //16230 #CJK UNIFIED IDEOGRAPH + {0xF5BD, 0x6751}, //16231 #CJK UNIFIED IDEOGRAPH + {0xF5BE, 0x90A8}, //16232 #CJK UNIFIED IDEOGRAPH + {0xF5BF, 0x53E2}, //16233 #CJK UNIFIED IDEOGRAPH + {0xF5C0, 0x585A}, //16234 #CJK UNIFIED IDEOGRAPH + {0xF5C1, 0x5BF5}, //16235 #CJK UNIFIED IDEOGRAPH + {0xF5C2, 0x60A4}, //16236 #CJK UNIFIED IDEOGRAPH + {0xF5C3, 0x6181}, //16237 #CJK UNIFIED IDEOGRAPH + {0xF5C4, 0x6460}, //16238 #CJK UNIFIED IDEOGRAPH + {0xF5C5, 0x7E3D}, //16239 #CJK UNIFIED IDEOGRAPH + {0xF5C6, 0x8070}, //16240 #CJK UNIFIED IDEOGRAPH + {0xF5C7, 0x8525}, //16241 #CJK UNIFIED IDEOGRAPH + {0xF5C8, 0x9283}, //16242 #CJK UNIFIED IDEOGRAPH + {0xF5C9, 0x64AE}, //16243 #CJK UNIFIED IDEOGRAPH + {0xF5CA, 0x50AC}, //16244 #CJK UNIFIED IDEOGRAPH + {0xF5CB, 0x5D14}, //16245 #CJK UNIFIED IDEOGRAPH + {0xF5CC, 0x6700}, //16246 #CJK UNIFIED IDEOGRAPH + {0xF5CD, 0x589C}, //16247 #CJK UNIFIED IDEOGRAPH + {0xF5CE, 0x62BD}, //16248 #CJK UNIFIED IDEOGRAPH + {0xF5CF, 0x63A8}, //16249 #CJK UNIFIED IDEOGRAPH + {0xF5D0, 0x690E}, //16250 #CJK UNIFIED IDEOGRAPH + {0xF5D1, 0x6978}, //16251 #CJK UNIFIED IDEOGRAPH + {0xF5D2, 0x6A1E}, //16252 #CJK UNIFIED IDEOGRAPH + {0xF5D3, 0x6E6B}, //16253 #CJK UNIFIED IDEOGRAPH + {0xF5D4, 0x76BA}, //16254 #CJK UNIFIED IDEOGRAPH + {0xF5D5, 0x79CB}, //16255 #CJK UNIFIED IDEOGRAPH + {0xF5D6, 0x82BB}, //16256 #CJK UNIFIED IDEOGRAPH + {0xF5D7, 0x8429}, //16257 #CJK UNIFIED IDEOGRAPH + {0xF5D8, 0x8ACF}, //16258 #CJK UNIFIED IDEOGRAPH + {0xF5D9, 0x8DA8}, //16259 #CJK UNIFIED IDEOGRAPH + {0xF5DA, 0x8FFD}, //16260 #CJK UNIFIED IDEOGRAPH + {0xF5DB, 0x9112}, //16261 #CJK UNIFIED IDEOGRAPH + {0xF5DC, 0x914B}, //16262 #CJK UNIFIED IDEOGRAPH + {0xF5DD, 0x919C}, //16263 #CJK UNIFIED IDEOGRAPH + {0xF5DE, 0x9310}, //16264 #CJK UNIFIED IDEOGRAPH + {0xF5DF, 0x9318}, //16265 #CJK UNIFIED IDEOGRAPH + {0xF5E0, 0x939A}, //16266 #CJK UNIFIED IDEOGRAPH + {0xF5E1, 0x96DB}, //16267 #CJK UNIFIED IDEOGRAPH + {0xF5E2, 0x9A36}, //16268 #CJK UNIFIED IDEOGRAPH + {0xF5E3, 0x9C0D}, //16269 #CJK UNIFIED IDEOGRAPH + {0xF5E4, 0x4E11}, //16270 #CJK UNIFIED IDEOGRAPH + {0xF5E5, 0x755C}, //16271 #CJK UNIFIED IDEOGRAPH + {0xF5E6, 0x795D}, //16272 #CJK UNIFIED IDEOGRAPH + {0xF5E7, 0x7AFA}, //16273 #CJK UNIFIED IDEOGRAPH + {0xF5E8, 0x7B51}, //16274 #CJK UNIFIED IDEOGRAPH + {0xF5E9, 0x7BC9}, //16275 #CJK UNIFIED IDEOGRAPH + {0xF5EA, 0x7E2E}, //16276 #CJK UNIFIED IDEOGRAPH + {0xF5EB, 0x84C4}, //16277 #CJK UNIFIED IDEOGRAPH + {0xF5EC, 0x8E59}, //16278 #CJK UNIFIED IDEOGRAPH + {0xF5ED, 0x8E74}, //16279 #CJK UNIFIED IDEOGRAPH + {0xF5EE, 0x8EF8}, //16280 #CJK UNIFIED IDEOGRAPH + {0xF5EF, 0x9010}, //16281 #CJK UNIFIED IDEOGRAPH + {0xF5F0, 0x6625}, //16282 #CJK UNIFIED IDEOGRAPH + {0xF5F1, 0x693F}, //16283 #CJK UNIFIED IDEOGRAPH + {0xF5F2, 0x7443}, //16284 #CJK UNIFIED IDEOGRAPH + {0xF5F3, 0x51FA}, //16285 #CJK UNIFIED IDEOGRAPH + {0xF5F4, 0x672E}, //16286 #CJK UNIFIED IDEOGRAPH + {0xF5F5, 0x9EDC}, //16287 #CJK UNIFIED IDEOGRAPH + {0xF5F6, 0x5145}, //16288 #CJK UNIFIED IDEOGRAPH + {0xF5F7, 0x5FE0}, //16289 #CJK UNIFIED IDEOGRAPH + {0xF5F8, 0x6C96}, //16290 #CJK UNIFIED IDEOGRAPH + {0xF5F9, 0x87F2}, //16291 #CJK UNIFIED IDEOGRAPH + {0xF5FA, 0x885D}, //16292 #CJK UNIFIED IDEOGRAPH + {0xF5FB, 0x8877}, //16293 #CJK UNIFIED IDEOGRAPH + {0xF5FC, 0x60B4}, //16294 #CJK UNIFIED IDEOGRAPH + {0xF5FD, 0x81B5}, //16295 #CJK UNIFIED IDEOGRAPH + {0xF5FE, 0x8403}, //16296 #CJK UNIFIED IDEOGRAPH + {0xF6A1, 0x8D05}, //16297 #CJK UNIFIED IDEOGRAPH + {0xF6A2, 0x53D6}, //16298 #CJK UNIFIED IDEOGRAPH + {0xF6A3, 0x5439}, //16299 #CJK UNIFIED IDEOGRAPH + {0xF6A4, 0x5634}, //16300 #CJK UNIFIED IDEOGRAPH + {0xF6A5, 0x5A36}, //16301 #CJK UNIFIED IDEOGRAPH + {0xF6A6, 0x5C31}, //16302 #CJK UNIFIED IDEOGRAPH + {0xF6A7, 0x708A}, //16303 #CJK UNIFIED IDEOGRAPH + {0xF6A8, 0x7FE0}, //16304 #CJK UNIFIED IDEOGRAPH + {0xF6A9, 0x805A}, //16305 #CJK UNIFIED IDEOGRAPH + {0xF6AA, 0x8106}, //16306 #CJK UNIFIED IDEOGRAPH + {0xF6AB, 0x81ED}, //16307 #CJK UNIFIED IDEOGRAPH + {0xF6AC, 0x8DA3}, //16308 #CJK UNIFIED IDEOGRAPH + {0xF6AD, 0x9189}, //16309 #CJK UNIFIED IDEOGRAPH + {0xF6AE, 0x9A5F}, //16310 #CJK UNIFIED IDEOGRAPH + {0xF6AF, 0x9DF2}, //16311 #CJK UNIFIED IDEOGRAPH + {0xF6B0, 0x5074}, //16312 #CJK UNIFIED IDEOGRAPH + {0xF6B1, 0x4EC4}, //16313 #CJK UNIFIED IDEOGRAPH + {0xF6B2, 0x53A0}, //16314 #CJK UNIFIED IDEOGRAPH + {0xF6B3, 0x60FB}, //16315 #CJK UNIFIED IDEOGRAPH + {0xF6B4, 0x6E2C}, //16316 #CJK UNIFIED IDEOGRAPH + {0xF6B5, 0x5C64}, //16317 #CJK UNIFIED IDEOGRAPH + {0xF6B6, 0x4F88}, //16318 #CJK UNIFIED IDEOGRAPH + {0xF6B7, 0x5024}, //16319 #CJK UNIFIED IDEOGRAPH + {0xF6B8, 0x55E4}, //16320 #CJK UNIFIED IDEOGRAPH + {0xF6B9, 0x5CD9}, //16321 #CJK UNIFIED IDEOGRAPH + {0xF6BA, 0x5E5F}, //16322 #CJK UNIFIED IDEOGRAPH + {0xF6BB, 0x6065}, //16323 #CJK UNIFIED IDEOGRAPH + {0xF6BC, 0x6894}, //16324 #CJK UNIFIED IDEOGRAPH + {0xF6BD, 0x6CBB}, //16325 #CJK UNIFIED IDEOGRAPH + {0xF6BE, 0x6DC4}, //16326 #CJK UNIFIED IDEOGRAPH + {0xF6BF, 0x71BE}, //16327 #CJK UNIFIED IDEOGRAPH + {0xF6C0, 0x75D4}, //16328 #CJK UNIFIED IDEOGRAPH + {0xF6C1, 0x75F4}, //16329 #CJK UNIFIED IDEOGRAPH + {0xF6C2, 0x7661}, //16330 #CJK UNIFIED IDEOGRAPH + {0xF6C3, 0x7A1A}, //16331 #CJK UNIFIED IDEOGRAPH + {0xF6C4, 0x7A49}, //16332 #CJK UNIFIED IDEOGRAPH + {0xF6C5, 0x7DC7}, //16333 #CJK UNIFIED IDEOGRAPH + {0xF6C6, 0x7DFB}, //16334 #CJK UNIFIED IDEOGRAPH + {0xF6C7, 0x7F6E}, //16335 #CJK UNIFIED IDEOGRAPH + {0xF6C8, 0x81F4}, //16336 #CJK UNIFIED IDEOGRAPH + {0xF6C9, 0x86A9}, //16337 #CJK UNIFIED IDEOGRAPH + {0xF6CA, 0x8F1C}, //16338 #CJK UNIFIED IDEOGRAPH + {0xF6CB, 0x96C9}, //16339 #CJK UNIFIED IDEOGRAPH + {0xF6CC, 0x99B3}, //16340 #CJK UNIFIED IDEOGRAPH + {0xF6CD, 0x9F52}, //16341 #CJK UNIFIED IDEOGRAPH + {0xF6CE, 0x5247}, //16342 #CJK UNIFIED IDEOGRAPH + {0xF6CF, 0x52C5}, //16343 #CJK UNIFIED IDEOGRAPH + {0xF6D0, 0x98ED}, //16344 #CJK UNIFIED IDEOGRAPH + {0xF6D1, 0x89AA}, //16345 #CJK UNIFIED IDEOGRAPH + {0xF6D2, 0x4E03}, //16346 #CJK UNIFIED IDEOGRAPH + {0xF6D3, 0x67D2}, //16347 #CJK UNIFIED IDEOGRAPH + {0xF6D4, 0x6F06}, //16348 #CJK UNIFIED IDEOGRAPH + {0xF6D5, 0x4FB5}, //16349 #CJK UNIFIED IDEOGRAPH + {0xF6D6, 0x5BE2}, //16350 #CJK UNIFIED IDEOGRAPH + {0xF6D7, 0x6795}, //16351 #CJK UNIFIED IDEOGRAPH + {0xF6D8, 0x6C88}, //16352 #CJK UNIFIED IDEOGRAPH + {0xF6D9, 0x6D78}, //16353 #CJK UNIFIED IDEOGRAPH + {0xF6DA, 0x741B}, //16354 #CJK UNIFIED IDEOGRAPH + {0xF6DB, 0x7827}, //16355 #CJK UNIFIED IDEOGRAPH + {0xF6DC, 0x91DD}, //16356 #CJK UNIFIED IDEOGRAPH + {0xF6DD, 0x937C}, //16357 #CJK UNIFIED IDEOGRAPH + {0xF6DE, 0x87C4}, //16358 #CJK UNIFIED IDEOGRAPH + {0xF6DF, 0x79E4}, //16359 #CJK UNIFIED IDEOGRAPH + {0xF6E0, 0x7A31}, //16360 #CJK UNIFIED IDEOGRAPH + {0xF6E1, 0x5FEB}, //16361 #CJK UNIFIED IDEOGRAPH + {0xF6E2, 0x4ED6}, //16362 #CJK UNIFIED IDEOGRAPH + {0xF6E3, 0x54A4}, //16363 #CJK UNIFIED IDEOGRAPH + {0xF6E4, 0x553E}, //16364 #CJK UNIFIED IDEOGRAPH + {0xF6E5, 0x58AE}, //16365 #CJK UNIFIED IDEOGRAPH + {0xF6E6, 0x59A5}, //16366 #CJK UNIFIED IDEOGRAPH + {0xF6E7, 0x60F0}, //16367 #CJK UNIFIED IDEOGRAPH + {0xF6E8, 0x6253}, //16368 #CJK UNIFIED IDEOGRAPH + {0xF6E9, 0x62D6}, //16369 #CJK UNIFIED IDEOGRAPH + {0xF6EA, 0x6736}, //16370 #CJK UNIFIED IDEOGRAPH + {0xF6EB, 0x6955}, //16371 #CJK UNIFIED IDEOGRAPH + {0xF6EC, 0x8235}, //16372 #CJK UNIFIED IDEOGRAPH + {0xF6ED, 0x9640}, //16373 #CJK UNIFIED IDEOGRAPH + {0xF6EE, 0x99B1}, //16374 #CJK UNIFIED IDEOGRAPH + {0xF6EF, 0x99DD}, //16375 #CJK UNIFIED IDEOGRAPH + {0xF6F0, 0x502C}, //16376 #CJK UNIFIED IDEOGRAPH + {0xF6F1, 0x5353}, //16377 #CJK UNIFIED IDEOGRAPH + {0xF6F2, 0x5544}, //16378 #CJK UNIFIED IDEOGRAPH + {0xF6F3, 0x577C}, //16379 #CJK UNIFIED IDEOGRAPH + {0xF6F4, 0xFA01}, //16380 #CJK COMPATIBILITY IDEOGRAPH + {0xF6F5, 0x6258}, //16381 #CJK UNIFIED IDEOGRAPH + {0xF6F6, 0xFA02}, //16382 #CJK COMPATIBILITY IDEOGRAPH + {0xF6F7, 0x64E2}, //16383 #CJK UNIFIED IDEOGRAPH + {0xF6F8, 0x666B}, //16384 #CJK UNIFIED IDEOGRAPH + {0xF6F9, 0x67DD}, //16385 #CJK UNIFIED IDEOGRAPH + {0xF6FA, 0x6FC1}, //16386 #CJK UNIFIED IDEOGRAPH + {0xF6FB, 0x6FEF}, //16387 #CJK UNIFIED IDEOGRAPH + {0xF6FC, 0x7422}, //16388 #CJK UNIFIED IDEOGRAPH + {0xF6FD, 0x7438}, //16389 #CJK UNIFIED IDEOGRAPH + {0xF6FE, 0x8A17}, //16390 #CJK UNIFIED IDEOGRAPH + {0xF7A1, 0x9438}, //16391 #CJK UNIFIED IDEOGRAPH + {0xF7A2, 0x5451}, //16392 #CJK UNIFIED IDEOGRAPH + {0xF7A3, 0x5606}, //16393 #CJK UNIFIED IDEOGRAPH + {0xF7A4, 0x5766}, //16394 #CJK UNIFIED IDEOGRAPH + {0xF7A5, 0x5F48}, //16395 #CJK UNIFIED IDEOGRAPH + {0xF7A6, 0x619A}, //16396 #CJK UNIFIED IDEOGRAPH + {0xF7A7, 0x6B4E}, //16397 #CJK UNIFIED IDEOGRAPH + {0xF7A8, 0x7058}, //16398 #CJK UNIFIED IDEOGRAPH + {0xF7A9, 0x70AD}, //16399 #CJK UNIFIED IDEOGRAPH + {0xF7AA, 0x7DBB}, //16400 #CJK UNIFIED IDEOGRAPH + {0xF7AB, 0x8A95}, //16401 #CJK UNIFIED IDEOGRAPH + {0xF7AC, 0x596A}, //16402 #CJK UNIFIED IDEOGRAPH + {0xF7AD, 0x812B}, //16403 #CJK UNIFIED IDEOGRAPH + {0xF7AE, 0x63A2}, //16404 #CJK UNIFIED IDEOGRAPH + {0xF7AF, 0x7708}, //16405 #CJK UNIFIED IDEOGRAPH + {0xF7B0, 0x803D}, //16406 #CJK UNIFIED IDEOGRAPH + {0xF7B1, 0x8CAA}, //16407 #CJK UNIFIED IDEOGRAPH + {0xF7B2, 0x5854}, //16408 #CJK UNIFIED IDEOGRAPH + {0xF7B3, 0x642D}, //16409 #CJK UNIFIED IDEOGRAPH + {0xF7B4, 0x69BB}, //16410 #CJK UNIFIED IDEOGRAPH + {0xF7B5, 0x5B95}, //16411 #CJK UNIFIED IDEOGRAPH + {0xF7B6, 0x5E11}, //16412 #CJK UNIFIED IDEOGRAPH + {0xF7B7, 0x6E6F}, //16413 #CJK UNIFIED IDEOGRAPH + {0xF7B8, 0xFA03}, //16414 #CJK COMPATIBILITY IDEOGRAPH + {0xF7B9, 0x8569}, //16415 #CJK UNIFIED IDEOGRAPH + {0xF7BA, 0x514C}, //16416 #CJK UNIFIED IDEOGRAPH + {0xF7BB, 0x53F0}, //16417 #CJK UNIFIED IDEOGRAPH + {0xF7BC, 0x592A}, //16418 #CJK UNIFIED IDEOGRAPH + {0xF7BD, 0x6020}, //16419 #CJK UNIFIED IDEOGRAPH + {0xF7BE, 0x614B}, //16420 #CJK UNIFIED IDEOGRAPH + {0xF7BF, 0x6B86}, //16421 #CJK UNIFIED IDEOGRAPH + {0xF7C0, 0x6C70}, //16422 #CJK UNIFIED IDEOGRAPH + {0xF7C1, 0x6CF0}, //16423 #CJK UNIFIED IDEOGRAPH + {0xF7C2, 0x7B1E}, //16424 #CJK UNIFIED IDEOGRAPH + {0xF7C3, 0x80CE}, //16425 #CJK UNIFIED IDEOGRAPH + {0xF7C4, 0x82D4}, //16426 #CJK UNIFIED IDEOGRAPH + {0xF7C5, 0x8DC6}, //16427 #CJK UNIFIED IDEOGRAPH + {0xF7C6, 0x90B0}, //16428 #CJK UNIFIED IDEOGRAPH + {0xF7C7, 0x98B1}, //16429 #CJK UNIFIED IDEOGRAPH + {0xF7C8, 0xFA04}, //16430 #CJK COMPATIBILITY IDEOGRAPH + {0xF7C9, 0x64C7}, //16431 #CJK UNIFIED IDEOGRAPH + {0xF7CA, 0x6FA4}, //16432 #CJK UNIFIED IDEOGRAPH + {0xF7CB, 0x6491}, //16433 #CJK UNIFIED IDEOGRAPH + {0xF7CC, 0x6504}, //16434 #CJK UNIFIED IDEOGRAPH + {0xF7CD, 0x514E}, //16435 #CJK UNIFIED IDEOGRAPH + {0xF7CE, 0x5410}, //16436 #CJK UNIFIED IDEOGRAPH + {0xF7CF, 0x571F}, //16437 #CJK UNIFIED IDEOGRAPH + {0xF7D0, 0x8A0E}, //16438 #CJK UNIFIED IDEOGRAPH + {0xF7D1, 0x615F}, //16439 #CJK UNIFIED IDEOGRAPH + {0xF7D2, 0x6876}, //16440 #CJK UNIFIED IDEOGRAPH + {0xF7D3, 0xFA05}, //16441 #CJK COMPATIBILITY IDEOGRAPH + {0xF7D4, 0x75DB}, //16442 #CJK UNIFIED IDEOGRAPH + {0xF7D5, 0x7B52}, //16443 #CJK UNIFIED IDEOGRAPH + {0xF7D6, 0x7D71}, //16444 #CJK UNIFIED IDEOGRAPH + {0xF7D7, 0x901A}, //16445 #CJK UNIFIED IDEOGRAPH + {0xF7D8, 0x5806}, //16446 #CJK UNIFIED IDEOGRAPH + {0xF7D9, 0x69CC}, //16447 #CJK UNIFIED IDEOGRAPH + {0xF7DA, 0x817F}, //16448 #CJK UNIFIED IDEOGRAPH + {0xF7DB, 0x892A}, //16449 #CJK UNIFIED IDEOGRAPH + {0xF7DC, 0x9000}, //16450 #CJK UNIFIED IDEOGRAPH + {0xF7DD, 0x9839}, //16451 #CJK UNIFIED IDEOGRAPH + {0xF7DE, 0x5078}, //16452 #CJK UNIFIED IDEOGRAPH + {0xF7DF, 0x5957}, //16453 #CJK UNIFIED IDEOGRAPH + {0xF7E0, 0x59AC}, //16454 #CJK UNIFIED IDEOGRAPH + {0xF7E1, 0x6295}, //16455 #CJK UNIFIED IDEOGRAPH + {0xF7E2, 0x900F}, //16456 #CJK UNIFIED IDEOGRAPH + {0xF7E3, 0x9B2A}, //16457 #CJK UNIFIED IDEOGRAPH + {0xF7E4, 0x615D}, //16458 #CJK UNIFIED IDEOGRAPH + {0xF7E5, 0x7279}, //16459 #CJK UNIFIED IDEOGRAPH + {0xF7E6, 0x95D6}, //16460 #CJK UNIFIED IDEOGRAPH + {0xF7E7, 0x5761}, //16461 #CJK UNIFIED IDEOGRAPH + {0xF7E8, 0x5A46}, //16462 #CJK UNIFIED IDEOGRAPH + {0xF7E9, 0x5DF4}, //16463 #CJK UNIFIED IDEOGRAPH + {0xF7EA, 0x628A}, //16464 #CJK UNIFIED IDEOGRAPH + {0xF7EB, 0x64AD}, //16465 #CJK UNIFIED IDEOGRAPH + {0xF7EC, 0x64FA}, //16466 #CJK UNIFIED IDEOGRAPH + {0xF7ED, 0x6777}, //16467 #CJK UNIFIED IDEOGRAPH + {0xF7EE, 0x6CE2}, //16468 #CJK UNIFIED IDEOGRAPH + {0xF7EF, 0x6D3E}, //16469 #CJK UNIFIED IDEOGRAPH + {0xF7F0, 0x722C}, //16470 #CJK UNIFIED IDEOGRAPH + {0xF7F1, 0x7436}, //16471 #CJK UNIFIED IDEOGRAPH + {0xF7F2, 0x7834}, //16472 #CJK UNIFIED IDEOGRAPH + {0xF7F3, 0x7F77}, //16473 #CJK UNIFIED IDEOGRAPH + {0xF7F4, 0x82AD}, //16474 #CJK UNIFIED IDEOGRAPH + {0xF7F5, 0x8DDB}, //16475 #CJK UNIFIED IDEOGRAPH + {0xF7F6, 0x9817}, //16476 #CJK UNIFIED IDEOGRAPH + {0xF7F7, 0x5224}, //16477 #CJK UNIFIED IDEOGRAPH + {0xF7F8, 0x5742}, //16478 #CJK UNIFIED IDEOGRAPH + {0xF7F9, 0x677F}, //16479 #CJK UNIFIED IDEOGRAPH + {0xF7FA, 0x7248}, //16480 #CJK UNIFIED IDEOGRAPH + {0xF7FB, 0x74E3}, //16481 #CJK UNIFIED IDEOGRAPH + {0xF7FC, 0x8CA9}, //16482 #CJK UNIFIED IDEOGRAPH + {0xF7FD, 0x8FA6}, //16483 #CJK UNIFIED IDEOGRAPH + {0xF7FE, 0x9211}, //16484 #CJK UNIFIED IDEOGRAPH + {0xF8A1, 0x962A}, //16485 #CJK UNIFIED IDEOGRAPH + {0xF8A2, 0x516B}, //16486 #CJK UNIFIED IDEOGRAPH + {0xF8A3, 0x53ED}, //16487 #CJK UNIFIED IDEOGRAPH + {0xF8A4, 0x634C}, //16488 #CJK UNIFIED IDEOGRAPH + {0xF8A5, 0x4F69}, //16489 #CJK UNIFIED IDEOGRAPH + {0xF8A6, 0x5504}, //16490 #CJK UNIFIED IDEOGRAPH + {0xF8A7, 0x6096}, //16491 #CJK UNIFIED IDEOGRAPH + {0xF8A8, 0x6557}, //16492 #CJK UNIFIED IDEOGRAPH + {0xF8A9, 0x6C9B}, //16493 #CJK UNIFIED IDEOGRAPH + {0xF8AA, 0x6D7F}, //16494 #CJK UNIFIED IDEOGRAPH + {0xF8AB, 0x724C}, //16495 #CJK UNIFIED IDEOGRAPH + {0xF8AC, 0x72FD}, //16496 #CJK UNIFIED IDEOGRAPH + {0xF8AD, 0x7A17}, //16497 #CJK UNIFIED IDEOGRAPH + {0xF8AE, 0x8987}, //16498 #CJK UNIFIED IDEOGRAPH + {0xF8AF, 0x8C9D}, //16499 #CJK UNIFIED IDEOGRAPH + {0xF8B0, 0x5F6D}, //16500 #CJK UNIFIED IDEOGRAPH + {0xF8B1, 0x6F8E}, //16501 #CJK UNIFIED IDEOGRAPH + {0xF8B2, 0x70F9}, //16502 #CJK UNIFIED IDEOGRAPH + {0xF8B3, 0x81A8}, //16503 #CJK UNIFIED IDEOGRAPH + {0xF8B4, 0x610E}, //16504 #CJK UNIFIED IDEOGRAPH + {0xF8B5, 0x4FBF}, //16505 #CJK UNIFIED IDEOGRAPH + {0xF8B6, 0x504F}, //16506 #CJK UNIFIED IDEOGRAPH + {0xF8B7, 0x6241}, //16507 #CJK UNIFIED IDEOGRAPH + {0xF8B8, 0x7247}, //16508 #CJK UNIFIED IDEOGRAPH + {0xF8B9, 0x7BC7}, //16509 #CJK UNIFIED IDEOGRAPH + {0xF8BA, 0x7DE8}, //16510 #CJK UNIFIED IDEOGRAPH + {0xF8BB, 0x7FE9}, //16511 #CJK UNIFIED IDEOGRAPH + {0xF8BC, 0x904D}, //16512 #CJK UNIFIED IDEOGRAPH + {0xF8BD, 0x97AD}, //16513 #CJK UNIFIED IDEOGRAPH + {0xF8BE, 0x9A19}, //16514 #CJK UNIFIED IDEOGRAPH + {0xF8BF, 0x8CB6}, //16515 #CJK UNIFIED IDEOGRAPH + {0xF8C0, 0x576A}, //16516 #CJK UNIFIED IDEOGRAPH + {0xF8C1, 0x5E73}, //16517 #CJK UNIFIED IDEOGRAPH + {0xF8C2, 0x67B0}, //16518 #CJK UNIFIED IDEOGRAPH + {0xF8C3, 0x840D}, //16519 #CJK UNIFIED IDEOGRAPH + {0xF8C4, 0x8A55}, //16520 #CJK UNIFIED IDEOGRAPH + {0xF8C5, 0x5420}, //16521 #CJK UNIFIED IDEOGRAPH + {0xF8C6, 0x5B16}, //16522 #CJK UNIFIED IDEOGRAPH + {0xF8C7, 0x5E63}, //16523 #CJK UNIFIED IDEOGRAPH + {0xF8C8, 0x5EE2}, //16524 #CJK UNIFIED IDEOGRAPH + {0xF8C9, 0x5F0A}, //16525 #CJK UNIFIED IDEOGRAPH + {0xF8CA, 0x6583}, //16526 #CJK UNIFIED IDEOGRAPH + {0xF8CB, 0x80BA}, //16527 #CJK UNIFIED IDEOGRAPH + {0xF8CC, 0x853D}, //16528 #CJK UNIFIED IDEOGRAPH + {0xF8CD, 0x9589}, //16529 #CJK UNIFIED IDEOGRAPH + {0xF8CE, 0x965B}, //16530 #CJK UNIFIED IDEOGRAPH + {0xF8CF, 0x4F48}, //16531 #CJK UNIFIED IDEOGRAPH + {0xF8D0, 0x5305}, //16532 #CJK UNIFIED IDEOGRAPH + {0xF8D1, 0x530D}, //16533 #CJK UNIFIED IDEOGRAPH + {0xF8D2, 0x530F}, //16534 #CJK UNIFIED IDEOGRAPH + {0xF8D3, 0x5486}, //16535 #CJK UNIFIED IDEOGRAPH + {0xF8D4, 0x54FA}, //16536 #CJK UNIFIED IDEOGRAPH + {0xF8D5, 0x5703}, //16537 #CJK UNIFIED IDEOGRAPH + {0xF8D6, 0x5E03}, //16538 #CJK UNIFIED IDEOGRAPH + {0xF8D7, 0x6016}, //16539 #CJK UNIFIED IDEOGRAPH + {0xF8D8, 0x629B}, //16540 #CJK UNIFIED IDEOGRAPH + {0xF8D9, 0x62B1}, //16541 #CJK UNIFIED IDEOGRAPH + {0xF8DA, 0x6355}, //16542 #CJK UNIFIED IDEOGRAPH + {0xF8DB, 0xFA06}, //16543 #CJK COMPATIBILITY IDEOGRAPH + {0xF8DC, 0x6CE1}, //16544 #CJK UNIFIED IDEOGRAPH + {0xF8DD, 0x6D66}, //16545 #CJK UNIFIED IDEOGRAPH + {0xF8DE, 0x75B1}, //16546 #CJK UNIFIED IDEOGRAPH + {0xF8DF, 0x7832}, //16547 #CJK UNIFIED IDEOGRAPH + {0xF8E0, 0x80DE}, //16548 #CJK UNIFIED IDEOGRAPH + {0xF8E1, 0x812F}, //16549 #CJK UNIFIED IDEOGRAPH + {0xF8E2, 0x82DE}, //16550 #CJK UNIFIED IDEOGRAPH + {0xF8E3, 0x8461}, //16551 #CJK UNIFIED IDEOGRAPH + {0xF8E4, 0x84B2}, //16552 #CJK UNIFIED IDEOGRAPH + {0xF8E5, 0x888D}, //16553 #CJK UNIFIED IDEOGRAPH + {0xF8E6, 0x8912}, //16554 #CJK UNIFIED IDEOGRAPH + {0xF8E7, 0x900B}, //16555 #CJK UNIFIED IDEOGRAPH + {0xF8E8, 0x92EA}, //16556 #CJK UNIFIED IDEOGRAPH + {0xF8E9, 0x98FD}, //16557 #CJK UNIFIED IDEOGRAPH + {0xF8EA, 0x9B91}, //16558 #CJK UNIFIED IDEOGRAPH + {0xF8EB, 0x5E45}, //16559 #CJK UNIFIED IDEOGRAPH + {0xF8EC, 0x66B4}, //16560 #CJK UNIFIED IDEOGRAPH + {0xF8ED, 0x66DD}, //16561 #CJK UNIFIED IDEOGRAPH + {0xF8EE, 0x7011}, //16562 #CJK UNIFIED IDEOGRAPH + {0xF8EF, 0x7206}, //16563 #CJK UNIFIED IDEOGRAPH + {0xF8F0, 0xFA07}, //16564 #CJK COMPATIBILITY IDEOGRAPH + {0xF8F1, 0x4FF5}, //16565 #CJK UNIFIED IDEOGRAPH + {0xF8F2, 0x527D}, //16566 #CJK UNIFIED IDEOGRAPH + {0xF8F3, 0x5F6A}, //16567 #CJK UNIFIED IDEOGRAPH + {0xF8F4, 0x6153}, //16568 #CJK UNIFIED IDEOGRAPH + {0xF8F5, 0x6753}, //16569 #CJK UNIFIED IDEOGRAPH + {0xF8F6, 0x6A19}, //16570 #CJK UNIFIED IDEOGRAPH + {0xF8F7, 0x6F02}, //16571 #CJK UNIFIED IDEOGRAPH + {0xF8F8, 0x74E2}, //16572 #CJK UNIFIED IDEOGRAPH + {0xF8F9, 0x7968}, //16573 #CJK UNIFIED IDEOGRAPH + {0xF8FA, 0x8868}, //16574 #CJK UNIFIED IDEOGRAPH + {0xF8FB, 0x8C79}, //16575 #CJK UNIFIED IDEOGRAPH + {0xF8FC, 0x98C7}, //16576 #CJK UNIFIED IDEOGRAPH + {0xF8FD, 0x98C4}, //16577 #CJK UNIFIED IDEOGRAPH + {0xF8FE, 0x9A43}, //16578 #CJK UNIFIED IDEOGRAPH + {0xF9A1, 0x54C1}, //16579 #CJK UNIFIED IDEOGRAPH + {0xF9A2, 0x7A1F}, //16580 #CJK UNIFIED IDEOGRAPH + {0xF9A3, 0x6953}, //16581 #CJK UNIFIED IDEOGRAPH + {0xF9A4, 0x8AF7}, //16582 #CJK UNIFIED IDEOGRAPH + {0xF9A5, 0x8C4A}, //16583 #CJK UNIFIED IDEOGRAPH + {0xF9A6, 0x98A8}, //16584 #CJK UNIFIED IDEOGRAPH + {0xF9A7, 0x99AE}, //16585 #CJK UNIFIED IDEOGRAPH + {0xF9A8, 0x5F7C}, //16586 #CJK UNIFIED IDEOGRAPH + {0xF9A9, 0x62AB}, //16587 #CJK UNIFIED IDEOGRAPH + {0xF9AA, 0x75B2}, //16588 #CJK UNIFIED IDEOGRAPH + {0xF9AB, 0x76AE}, //16589 #CJK UNIFIED IDEOGRAPH + {0xF9AC, 0x88AB}, //16590 #CJK UNIFIED IDEOGRAPH + {0xF9AD, 0x907F}, //16591 #CJK UNIFIED IDEOGRAPH + {0xF9AE, 0x9642}, //16592 #CJK UNIFIED IDEOGRAPH + {0xF9AF, 0x5339}, //16593 #CJK UNIFIED IDEOGRAPH + {0xF9B0, 0x5F3C}, //16594 #CJK UNIFIED IDEOGRAPH + {0xF9B1, 0x5FC5}, //16595 #CJK UNIFIED IDEOGRAPH + {0xF9B2, 0x6CCC}, //16596 #CJK UNIFIED IDEOGRAPH + {0xF9B3, 0x73CC}, //16597 #CJK UNIFIED IDEOGRAPH + {0xF9B4, 0x7562}, //16598 #CJK UNIFIED IDEOGRAPH + {0xF9B5, 0x758B}, //16599 #CJK UNIFIED IDEOGRAPH + {0xF9B6, 0x7B46}, //16600 #CJK UNIFIED IDEOGRAPH + {0xF9B7, 0x82FE}, //16601 #CJK UNIFIED IDEOGRAPH + {0xF9B8, 0x999D}, //16602 #CJK UNIFIED IDEOGRAPH + {0xF9B9, 0x4E4F}, //16603 #CJK UNIFIED IDEOGRAPH + {0xF9BA, 0x903C}, //16604 #CJK UNIFIED IDEOGRAPH + {0xF9BB, 0x4E0B}, //16605 #CJK UNIFIED IDEOGRAPH + {0xF9BC, 0x4F55}, //16606 #CJK UNIFIED IDEOGRAPH + {0xF9BD, 0x53A6}, //16607 #CJK UNIFIED IDEOGRAPH + {0xF9BE, 0x590F}, //16608 #CJK UNIFIED IDEOGRAPH + {0xF9BF, 0x5EC8}, //16609 #CJK UNIFIED IDEOGRAPH + {0xF9C0, 0x6630}, //16610 #CJK UNIFIED IDEOGRAPH + {0xF9C1, 0x6CB3}, //16611 #CJK UNIFIED IDEOGRAPH + {0xF9C2, 0x7455}, //16612 #CJK UNIFIED IDEOGRAPH + {0xF9C3, 0x8377}, //16613 #CJK UNIFIED IDEOGRAPH + {0xF9C4, 0x8766}, //16614 #CJK UNIFIED IDEOGRAPH + {0xF9C5, 0x8CC0}, //16615 #CJK UNIFIED IDEOGRAPH + {0xF9C6, 0x9050}, //16616 #CJK UNIFIED IDEOGRAPH + {0xF9C7, 0x971E}, //16617 #CJK UNIFIED IDEOGRAPH + {0xF9C8, 0x9C15}, //16618 #CJK UNIFIED IDEOGRAPH + {0xF9C9, 0x58D1}, //16619 #CJK UNIFIED IDEOGRAPH + {0xF9CA, 0x5B78}, //16620 #CJK UNIFIED IDEOGRAPH + {0xF9CB, 0x8650}, //16621 #CJK UNIFIED IDEOGRAPH + {0xF9CC, 0x8B14}, //16622 #CJK UNIFIED IDEOGRAPH + {0xF9CD, 0x9DB4}, //16623 #CJK UNIFIED IDEOGRAPH + {0xF9CE, 0x5BD2}, //16624 #CJK UNIFIED IDEOGRAPH + {0xF9CF, 0x6068}, //16625 #CJK UNIFIED IDEOGRAPH + {0xF9D0, 0x608D}, //16626 #CJK UNIFIED IDEOGRAPH + {0xF9D1, 0x65F1}, //16627 #CJK UNIFIED IDEOGRAPH + {0xF9D2, 0x6C57}, //16628 #CJK UNIFIED IDEOGRAPH + {0xF9D3, 0x6F22}, //16629 #CJK UNIFIED IDEOGRAPH + {0xF9D4, 0x6FA3}, //16630 #CJK UNIFIED IDEOGRAPH + {0xF9D5, 0x701A}, //16631 #CJK UNIFIED IDEOGRAPH + {0xF9D6, 0x7F55}, //16632 #CJK UNIFIED IDEOGRAPH + {0xF9D7, 0x7FF0}, //16633 #CJK UNIFIED IDEOGRAPH + {0xF9D8, 0x9591}, //16634 #CJK UNIFIED IDEOGRAPH + {0xF9D9, 0x9592}, //16635 #CJK UNIFIED IDEOGRAPH + {0xF9DA, 0x9650}, //16636 #CJK UNIFIED IDEOGRAPH + {0xF9DB, 0x97D3}, //16637 #CJK UNIFIED IDEOGRAPH + {0xF9DC, 0x5272}, //16638 #CJK UNIFIED IDEOGRAPH + {0xF9DD, 0x8F44}, //16639 #CJK UNIFIED IDEOGRAPH + {0xF9DE, 0x51FD}, //16640 #CJK UNIFIED IDEOGRAPH + {0xF9DF, 0x542B}, //16641 #CJK UNIFIED IDEOGRAPH + {0xF9E0, 0x54B8}, //16642 #CJK UNIFIED IDEOGRAPH + {0xF9E1, 0x5563}, //16643 #CJK UNIFIED IDEOGRAPH + {0xF9E2, 0x558A}, //16644 #CJK UNIFIED IDEOGRAPH + {0xF9E3, 0x6ABB}, //16645 #CJK UNIFIED IDEOGRAPH + {0xF9E4, 0x6DB5}, //16646 #CJK UNIFIED IDEOGRAPH + {0xF9E5, 0x7DD8}, //16647 #CJK UNIFIED IDEOGRAPH + {0xF9E6, 0x8266}, //16648 #CJK UNIFIED IDEOGRAPH + {0xF9E7, 0x929C}, //16649 #CJK UNIFIED IDEOGRAPH + {0xF9E8, 0x9677}, //16650 #CJK UNIFIED IDEOGRAPH + {0xF9E9, 0x9E79}, //16651 #CJK UNIFIED IDEOGRAPH + {0xF9EA, 0x5408}, //16652 #CJK UNIFIED IDEOGRAPH + {0xF9EB, 0x54C8}, //16653 #CJK UNIFIED IDEOGRAPH + {0xF9EC, 0x76D2}, //16654 #CJK UNIFIED IDEOGRAPH + {0xF9ED, 0x86E4}, //16655 #CJK UNIFIED IDEOGRAPH + {0xF9EE, 0x95A4}, //16656 #CJK UNIFIED IDEOGRAPH + {0xF9EF, 0x95D4}, //16657 #CJK UNIFIED IDEOGRAPH + {0xF9F0, 0x965C}, //16658 #CJK UNIFIED IDEOGRAPH + {0xF9F1, 0x4EA2}, //16659 #CJK UNIFIED IDEOGRAPH + {0xF9F2, 0x4F09}, //16660 #CJK UNIFIED IDEOGRAPH + {0xF9F3, 0x59EE}, //16661 #CJK UNIFIED IDEOGRAPH + {0xF9F4, 0x5AE6}, //16662 #CJK UNIFIED IDEOGRAPH + {0xF9F5, 0x5DF7}, //16663 #CJK UNIFIED IDEOGRAPH + {0xF9F6, 0x6052}, //16664 #CJK UNIFIED IDEOGRAPH + {0xF9F7, 0x6297}, //16665 #CJK UNIFIED IDEOGRAPH + {0xF9F8, 0x676D}, //16666 #CJK UNIFIED IDEOGRAPH + {0xF9F9, 0x6841}, //16667 #CJK UNIFIED IDEOGRAPH + {0xF9FA, 0x6C86}, //16668 #CJK UNIFIED IDEOGRAPH + {0xF9FB, 0x6E2F}, //16669 #CJK UNIFIED IDEOGRAPH + {0xF9FC, 0x7F38}, //16670 #CJK UNIFIED IDEOGRAPH + {0xF9FD, 0x809B}, //16671 #CJK UNIFIED IDEOGRAPH + {0xF9FE, 0x822A}, //16672 #CJK UNIFIED IDEOGRAPH + {0xFAA1, 0xFA08}, //16673 #CJK COMPATIBILITY IDEOGRAPH + {0xFAA2, 0xFA09}, //16674 #CJK COMPATIBILITY IDEOGRAPH + {0xFAA3, 0x9805}, //16675 #CJK UNIFIED IDEOGRAPH + {0xFAA4, 0x4EA5}, //16676 #CJK UNIFIED IDEOGRAPH + {0xFAA5, 0x5055}, //16677 #CJK UNIFIED IDEOGRAPH + {0xFAA6, 0x54B3}, //16678 #CJK UNIFIED IDEOGRAPH + {0xFAA7, 0x5793}, //16679 #CJK UNIFIED IDEOGRAPH + {0xFAA8, 0x595A}, //16680 #CJK UNIFIED IDEOGRAPH + {0xFAA9, 0x5B69}, //16681 #CJK UNIFIED IDEOGRAPH + {0xFAAA, 0x5BB3}, //16682 #CJK UNIFIED IDEOGRAPH + {0xFAAB, 0x61C8}, //16683 #CJK UNIFIED IDEOGRAPH + {0xFAAC, 0x6977}, //16684 #CJK UNIFIED IDEOGRAPH + {0xFAAD, 0x6D77}, //16685 #CJK UNIFIED IDEOGRAPH + {0xFAAE, 0x7023}, //16686 #CJK UNIFIED IDEOGRAPH + {0xFAAF, 0x87F9}, //16687 #CJK UNIFIED IDEOGRAPH + {0xFAB0, 0x89E3}, //16688 #CJK UNIFIED IDEOGRAPH + {0xFAB1, 0x8A72}, //16689 #CJK UNIFIED IDEOGRAPH + {0xFAB2, 0x8AE7}, //16690 #CJK UNIFIED IDEOGRAPH + {0xFAB3, 0x9082}, //16691 #CJK UNIFIED IDEOGRAPH + {0xFAB4, 0x99ED}, //16692 #CJK UNIFIED IDEOGRAPH + {0xFAB5, 0x9AB8}, //16693 #CJK UNIFIED IDEOGRAPH + {0xFAB6, 0x52BE}, //16694 #CJK UNIFIED IDEOGRAPH + {0xFAB7, 0x6838}, //16695 #CJK UNIFIED IDEOGRAPH + {0xFAB8, 0x5016}, //16696 #CJK UNIFIED IDEOGRAPH + {0xFAB9, 0x5E78}, //16697 #CJK UNIFIED IDEOGRAPH + {0xFABA, 0x674F}, //16698 #CJK UNIFIED IDEOGRAPH + {0xFABB, 0x8347}, //16699 #CJK UNIFIED IDEOGRAPH + {0xFABC, 0x884C}, //16700 #CJK UNIFIED IDEOGRAPH + {0xFABD, 0x4EAB}, //16701 #CJK UNIFIED IDEOGRAPH + {0xFABE, 0x5411}, //16702 #CJK UNIFIED IDEOGRAPH + {0xFABF, 0x56AE}, //16703 #CJK UNIFIED IDEOGRAPH + {0xFAC0, 0x73E6}, //16704 #CJK UNIFIED IDEOGRAPH + {0xFAC1, 0x9115}, //16705 #CJK UNIFIED IDEOGRAPH + {0xFAC2, 0x97FF}, //16706 #CJK UNIFIED IDEOGRAPH + {0xFAC3, 0x9909}, //16707 #CJK UNIFIED IDEOGRAPH + {0xFAC4, 0x9957}, //16708 #CJK UNIFIED IDEOGRAPH + {0xFAC5, 0x9999}, //16709 #CJK UNIFIED IDEOGRAPH + {0xFAC6, 0x5653}, //16710 #CJK UNIFIED IDEOGRAPH + {0xFAC7, 0x589F}, //16711 #CJK UNIFIED IDEOGRAPH + {0xFAC8, 0x865B}, //16712 #CJK UNIFIED IDEOGRAPH + {0xFAC9, 0x8A31}, //16713 #CJK UNIFIED IDEOGRAPH + {0xFACA, 0x61B2}, //16714 #CJK UNIFIED IDEOGRAPH + {0xFACB, 0x6AF6}, //16715 #CJK UNIFIED IDEOGRAPH + {0xFACC, 0x737B}, //16716 #CJK UNIFIED IDEOGRAPH + {0xFACD, 0x8ED2}, //16717 #CJK UNIFIED IDEOGRAPH + {0xFACE, 0x6B47}, //16718 #CJK UNIFIED IDEOGRAPH + {0xFACF, 0x96AA}, //16719 #CJK UNIFIED IDEOGRAPH + {0xFAD0, 0x9A57}, //16720 #CJK UNIFIED IDEOGRAPH + {0xFAD1, 0x5955}, //16721 #CJK UNIFIED IDEOGRAPH + {0xFAD2, 0x7200}, //16722 #CJK UNIFIED IDEOGRAPH + {0xFAD3, 0x8D6B}, //16723 #CJK UNIFIED IDEOGRAPH + {0xFAD4, 0x9769}, //16724 #CJK UNIFIED IDEOGRAPH + {0xFAD5, 0x4FD4}, //16725 #CJK UNIFIED IDEOGRAPH + {0xFAD6, 0x5CF4}, //16726 #CJK UNIFIED IDEOGRAPH + {0xFAD7, 0x5F26}, //16727 #CJK UNIFIED IDEOGRAPH + {0xFAD8, 0x61F8}, //16728 #CJK UNIFIED IDEOGRAPH + {0xFAD9, 0x665B}, //16729 #CJK UNIFIED IDEOGRAPH + {0xFADA, 0x6CEB}, //16730 #CJK UNIFIED IDEOGRAPH + {0xFADB, 0x70AB}, //16731 #CJK UNIFIED IDEOGRAPH + {0xFADC, 0x7384}, //16732 #CJK UNIFIED IDEOGRAPH + {0xFADD, 0x73B9}, //16733 #CJK UNIFIED IDEOGRAPH + {0xFADE, 0x73FE}, //16734 #CJK UNIFIED IDEOGRAPH + {0xFADF, 0x7729}, //16735 #CJK UNIFIED IDEOGRAPH + {0xFAE0, 0x774D}, //16736 #CJK UNIFIED IDEOGRAPH + {0xFAE1, 0x7D43}, //16737 #CJK UNIFIED IDEOGRAPH + {0xFAE2, 0x7D62}, //16738 #CJK UNIFIED IDEOGRAPH + {0xFAE3, 0x7E23}, //16739 #CJK UNIFIED IDEOGRAPH + {0xFAE4, 0x8237}, //16740 #CJK UNIFIED IDEOGRAPH + {0xFAE5, 0x8852}, //16741 #CJK UNIFIED IDEOGRAPH + {0xFAE6, 0xFA0A}, //16742 #CJK COMPATIBILITY IDEOGRAPH + {0xFAE7, 0x8CE2}, //16743 #CJK UNIFIED IDEOGRAPH + {0xFAE8, 0x9249}, //16744 #CJK UNIFIED IDEOGRAPH + {0xFAE9, 0x986F}, //16745 #CJK UNIFIED IDEOGRAPH + {0xFAEA, 0x5B51}, //16746 #CJK UNIFIED IDEOGRAPH + {0xFAEB, 0x7A74}, //16747 #CJK UNIFIED IDEOGRAPH + {0xFAEC, 0x8840}, //16748 #CJK UNIFIED IDEOGRAPH + {0xFAED, 0x9801}, //16749 #CJK UNIFIED IDEOGRAPH + {0xFAEE, 0x5ACC}, //16750 #CJK UNIFIED IDEOGRAPH + {0xFAEF, 0x4FE0}, //16751 #CJK UNIFIED IDEOGRAPH + {0xFAF0, 0x5354}, //16752 #CJK UNIFIED IDEOGRAPH + {0xFAF1, 0x593E}, //16753 #CJK UNIFIED IDEOGRAPH + {0xFAF2, 0x5CFD}, //16754 #CJK UNIFIED IDEOGRAPH + {0xFAF3, 0x633E}, //16755 #CJK UNIFIED IDEOGRAPH + {0xFAF4, 0x6D79}, //16756 #CJK UNIFIED IDEOGRAPH + {0xFAF5, 0x72F9}, //16757 #CJK UNIFIED IDEOGRAPH + {0xFAF6, 0x8105}, //16758 #CJK UNIFIED IDEOGRAPH + {0xFAF7, 0x8107}, //16759 #CJK UNIFIED IDEOGRAPH + {0xFAF8, 0x83A2}, //16760 #CJK UNIFIED IDEOGRAPH + {0xFAF9, 0x92CF}, //16761 #CJK UNIFIED IDEOGRAPH + {0xFAFA, 0x9830}, //16762 #CJK UNIFIED IDEOGRAPH + {0xFAFB, 0x4EA8}, //16763 #CJK UNIFIED IDEOGRAPH + {0xFAFC, 0x5144}, //16764 #CJK UNIFIED IDEOGRAPH + {0xFAFD, 0x5211}, //16765 #CJK UNIFIED IDEOGRAPH + {0xFAFE, 0x578B}, //16766 #CJK UNIFIED IDEOGRAPH + {0xFBA1, 0x5F62}, //16767 #CJK UNIFIED IDEOGRAPH + {0xFBA2, 0x6CC2}, //16768 #CJK UNIFIED IDEOGRAPH + {0xFBA3, 0x6ECE}, //16769 #CJK UNIFIED IDEOGRAPH + {0xFBA4, 0x7005}, //16770 #CJK UNIFIED IDEOGRAPH + {0xFBA5, 0x7050}, //16771 #CJK UNIFIED IDEOGRAPH + {0xFBA6, 0x70AF}, //16772 #CJK UNIFIED IDEOGRAPH + {0xFBA7, 0x7192}, //16773 #CJK UNIFIED IDEOGRAPH + {0xFBA8, 0x73E9}, //16774 #CJK UNIFIED IDEOGRAPH + {0xFBA9, 0x7469}, //16775 #CJK UNIFIED IDEOGRAPH + {0xFBAA, 0x834A}, //16776 #CJK UNIFIED IDEOGRAPH + {0xFBAB, 0x87A2}, //16777 #CJK UNIFIED IDEOGRAPH + {0xFBAC, 0x8861}, //16778 #CJK UNIFIED IDEOGRAPH + {0xFBAD, 0x9008}, //16779 #CJK UNIFIED IDEOGRAPH + {0xFBAE, 0x90A2}, //16780 #CJK UNIFIED IDEOGRAPH + {0xFBAF, 0x93A3}, //16781 #CJK UNIFIED IDEOGRAPH + {0xFBB0, 0x99A8}, //16782 #CJK UNIFIED IDEOGRAPH + {0xFBB1, 0x516E}, //16783 #CJK UNIFIED IDEOGRAPH + {0xFBB2, 0x5F57}, //16784 #CJK UNIFIED IDEOGRAPH + {0xFBB3, 0x60E0}, //16785 #CJK UNIFIED IDEOGRAPH + {0xFBB4, 0x6167}, //16786 #CJK UNIFIED IDEOGRAPH + {0xFBB5, 0x66B3}, //16787 #CJK UNIFIED IDEOGRAPH + {0xFBB6, 0x8559}, //16788 #CJK UNIFIED IDEOGRAPH + {0xFBB7, 0x8E4A}, //16789 #CJK UNIFIED IDEOGRAPH + {0xFBB8, 0x91AF}, //16790 #CJK UNIFIED IDEOGRAPH + {0xFBB9, 0x978B}, //16791 #CJK UNIFIED IDEOGRAPH + {0xFBBA, 0x4E4E}, //16792 #CJK UNIFIED IDEOGRAPH + {0xFBBB, 0x4E92}, //16793 #CJK UNIFIED IDEOGRAPH + {0xFBBC, 0x547C}, //16794 #CJK UNIFIED IDEOGRAPH + {0xFBBD, 0x58D5}, //16795 #CJK UNIFIED IDEOGRAPH + {0xFBBE, 0x58FA}, //16796 #CJK UNIFIED IDEOGRAPH + {0xFBBF, 0x597D}, //16797 #CJK UNIFIED IDEOGRAPH + {0xFBC0, 0x5CB5}, //16798 #CJK UNIFIED IDEOGRAPH + {0xFBC1, 0x5F27}, //16799 #CJK UNIFIED IDEOGRAPH + {0xFBC2, 0x6236}, //16800 #CJK UNIFIED IDEOGRAPH + {0xFBC3, 0x6248}, //16801 #CJK UNIFIED IDEOGRAPH + {0xFBC4, 0x660A}, //16802 #CJK UNIFIED IDEOGRAPH + {0xFBC5, 0x6667}, //16803 #CJK UNIFIED IDEOGRAPH + {0xFBC6, 0x6BEB}, //16804 #CJK UNIFIED IDEOGRAPH + {0xFBC7, 0x6D69}, //16805 #CJK UNIFIED IDEOGRAPH + {0xFBC8, 0x6DCF}, //16806 #CJK UNIFIED IDEOGRAPH + {0xFBC9, 0x6E56}, //16807 #CJK UNIFIED IDEOGRAPH + {0xFBCA, 0x6EF8}, //16808 #CJK UNIFIED IDEOGRAPH + {0xFBCB, 0x6F94}, //16809 #CJK UNIFIED IDEOGRAPH + {0xFBCC, 0x6FE0}, //16810 #CJK UNIFIED IDEOGRAPH + {0xFBCD, 0x6FE9}, //16811 #CJK UNIFIED IDEOGRAPH + {0xFBCE, 0x705D}, //16812 #CJK UNIFIED IDEOGRAPH + {0xFBCF, 0x72D0}, //16813 #CJK UNIFIED IDEOGRAPH + {0xFBD0, 0x7425}, //16814 #CJK UNIFIED IDEOGRAPH + {0xFBD1, 0x745A}, //16815 #CJK UNIFIED IDEOGRAPH + {0xFBD2, 0x74E0}, //16816 #CJK UNIFIED IDEOGRAPH + {0xFBD3, 0x7693}, //16817 #CJK UNIFIED IDEOGRAPH + {0xFBD4, 0x795C}, //16818 #CJK UNIFIED IDEOGRAPH + {0xFBD5, 0x7CCA}, //16819 #CJK UNIFIED IDEOGRAPH + {0xFBD6, 0x7E1E}, //16820 #CJK UNIFIED IDEOGRAPH + {0xFBD7, 0x80E1}, //16821 #CJK UNIFIED IDEOGRAPH + {0xFBD8, 0x82A6}, //16822 #CJK UNIFIED IDEOGRAPH + {0xFBD9, 0x846B}, //16823 #CJK UNIFIED IDEOGRAPH + {0xFBDA, 0x84BF}, //16824 #CJK UNIFIED IDEOGRAPH + {0xFBDB, 0x864E}, //16825 #CJK UNIFIED IDEOGRAPH + {0xFBDC, 0x865F}, //16826 #CJK UNIFIED IDEOGRAPH + {0xFBDD, 0x8774}, //16827 #CJK UNIFIED IDEOGRAPH + {0xFBDE, 0x8B77}, //16828 #CJK UNIFIED IDEOGRAPH + {0xFBDF, 0x8C6A}, //16829 #CJK UNIFIED IDEOGRAPH + {0xFBE0, 0x93AC}, //16830 #CJK UNIFIED IDEOGRAPH + {0xFBE1, 0x9800}, //16831 #CJK UNIFIED IDEOGRAPH + {0xFBE2, 0x9865}, //16832 #CJK UNIFIED IDEOGRAPH + {0xFBE3, 0x60D1}, //16833 #CJK UNIFIED IDEOGRAPH + {0xFBE4, 0x6216}, //16834 #CJK UNIFIED IDEOGRAPH + {0xFBE5, 0x9177}, //16835 #CJK UNIFIED IDEOGRAPH + {0xFBE6, 0x5A5A}, //16836 #CJK UNIFIED IDEOGRAPH + {0xFBE7, 0x660F}, //16837 #CJK UNIFIED IDEOGRAPH + {0xFBE8, 0x6DF7}, //16838 #CJK UNIFIED IDEOGRAPH + {0xFBE9, 0x6E3E}, //16839 #CJK UNIFIED IDEOGRAPH + {0xFBEA, 0x743F}, //16840 #CJK UNIFIED IDEOGRAPH + {0xFBEB, 0x9B42}, //16841 #CJK UNIFIED IDEOGRAPH + {0xFBEC, 0x5FFD}, //16842 #CJK UNIFIED IDEOGRAPH + {0xFBED, 0x60DA}, //16843 #CJK UNIFIED IDEOGRAPH + {0xFBEE, 0x7B0F}, //16844 #CJK UNIFIED IDEOGRAPH + {0xFBEF, 0x54C4}, //16845 #CJK UNIFIED IDEOGRAPH + {0xFBF0, 0x5F18}, //16846 #CJK UNIFIED IDEOGRAPH + {0xFBF1, 0x6C5E}, //16847 #CJK UNIFIED IDEOGRAPH + {0xFBF2, 0x6CD3}, //16848 #CJK UNIFIED IDEOGRAPH + {0xFBF3, 0x6D2A}, //16849 #CJK UNIFIED IDEOGRAPH + {0xFBF4, 0x70D8}, //16850 #CJK UNIFIED IDEOGRAPH + {0xFBF5, 0x7D05}, //16851 #CJK UNIFIED IDEOGRAPH + {0xFBF6, 0x8679}, //16852 #CJK UNIFIED IDEOGRAPH + {0xFBF7, 0x8A0C}, //16853 #CJK UNIFIED IDEOGRAPH + {0xFBF8, 0x9D3B}, //16854 #CJK UNIFIED IDEOGRAPH + {0xFBF9, 0x5316}, //16855 #CJK UNIFIED IDEOGRAPH + {0xFBFA, 0x548C}, //16856 #CJK UNIFIED IDEOGRAPH + {0xFBFB, 0x5B05}, //16857 #CJK UNIFIED IDEOGRAPH + {0xFBFC, 0x6A3A}, //16858 #CJK UNIFIED IDEOGRAPH + {0xFBFD, 0x706B}, //16859 #CJK UNIFIED IDEOGRAPH + {0xFBFE, 0x7575}, //16860 #CJK UNIFIED IDEOGRAPH + {0xFCA1, 0x798D}, //16861 #CJK UNIFIED IDEOGRAPH + {0xFCA2, 0x79BE}, //16862 #CJK UNIFIED IDEOGRAPH + {0xFCA3, 0x82B1}, //16863 #CJK UNIFIED IDEOGRAPH + {0xFCA4, 0x83EF}, //16864 #CJK UNIFIED IDEOGRAPH + {0xFCA5, 0x8A71}, //16865 #CJK UNIFIED IDEOGRAPH + {0xFCA6, 0x8B41}, //16866 #CJK UNIFIED IDEOGRAPH + {0xFCA7, 0x8CA8}, //16867 #CJK UNIFIED IDEOGRAPH + {0xFCA8, 0x9774}, //16868 #CJK UNIFIED IDEOGRAPH + {0xFCA9, 0xFA0B}, //16869 #CJK COMPATIBILITY IDEOGRAPH + {0xFCAA, 0x64F4}, //16870 #CJK UNIFIED IDEOGRAPH + {0xFCAB, 0x652B}, //16871 #CJK UNIFIED IDEOGRAPH + {0xFCAC, 0x78BA}, //16872 #CJK UNIFIED IDEOGRAPH + {0xFCAD, 0x78BB}, //16873 #CJK UNIFIED IDEOGRAPH + {0xFCAE, 0x7A6B}, //16874 #CJK UNIFIED IDEOGRAPH + {0xFCAF, 0x4E38}, //16875 #CJK UNIFIED IDEOGRAPH + {0xFCB0, 0x559A}, //16876 #CJK UNIFIED IDEOGRAPH + {0xFCB1, 0x5950}, //16877 #CJK UNIFIED IDEOGRAPH + {0xFCB2, 0x5BA6}, //16878 #CJK UNIFIED IDEOGRAPH + {0xFCB3, 0x5E7B}, //16879 #CJK UNIFIED IDEOGRAPH + {0xFCB4, 0x60A3}, //16880 #CJK UNIFIED IDEOGRAPH + {0xFCB5, 0x63DB}, //16881 #CJK UNIFIED IDEOGRAPH + {0xFCB6, 0x6B61}, //16882 #CJK UNIFIED IDEOGRAPH + {0xFCB7, 0x6665}, //16883 #CJK UNIFIED IDEOGRAPH + {0xFCB8, 0x6853}, //16884 #CJK UNIFIED IDEOGRAPH + {0xFCB9, 0x6E19}, //16885 #CJK UNIFIED IDEOGRAPH + {0xFCBA, 0x7165}, //16886 #CJK UNIFIED IDEOGRAPH + {0xFCBB, 0x74B0}, //16887 #CJK UNIFIED IDEOGRAPH + {0xFCBC, 0x7D08}, //16888 #CJK UNIFIED IDEOGRAPH + {0xFCBD, 0x9084}, //16889 #CJK UNIFIED IDEOGRAPH + {0xFCBE, 0x9A69}, //16890 #CJK UNIFIED IDEOGRAPH + {0xFCBF, 0x9C25}, //16891 #CJK UNIFIED IDEOGRAPH + {0xFCC0, 0x6D3B}, //16892 #CJK UNIFIED IDEOGRAPH + {0xFCC1, 0x6ED1}, //16893 #CJK UNIFIED IDEOGRAPH + {0xFCC2, 0x733E}, //16894 #CJK UNIFIED IDEOGRAPH + {0xFCC3, 0x8C41}, //16895 #CJK UNIFIED IDEOGRAPH + {0xFCC4, 0x95CA}, //16896 #CJK UNIFIED IDEOGRAPH + {0xFCC5, 0x51F0}, //16897 #CJK UNIFIED IDEOGRAPH + {0xFCC6, 0x5E4C}, //16898 #CJK UNIFIED IDEOGRAPH + {0xFCC7, 0x5FA8}, //16899 #CJK UNIFIED IDEOGRAPH + {0xFCC8, 0x604D}, //16900 #CJK UNIFIED IDEOGRAPH + {0xFCC9, 0x60F6}, //16901 #CJK UNIFIED IDEOGRAPH + {0xFCCA, 0x6130}, //16902 #CJK UNIFIED IDEOGRAPH + {0xFCCB, 0x614C}, //16903 #CJK UNIFIED IDEOGRAPH + {0xFCCC, 0x6643}, //16904 #CJK UNIFIED IDEOGRAPH + {0xFCCD, 0x6644}, //16905 #CJK UNIFIED IDEOGRAPH + {0xFCCE, 0x69A5}, //16906 #CJK UNIFIED IDEOGRAPH + {0xFCCF, 0x6CC1}, //16907 #CJK UNIFIED IDEOGRAPH + {0xFCD0, 0x6E5F}, //16908 #CJK UNIFIED IDEOGRAPH + {0xFCD1, 0x6EC9}, //16909 #CJK UNIFIED IDEOGRAPH + {0xFCD2, 0x6F62}, //16910 #CJK UNIFIED IDEOGRAPH + {0xFCD3, 0x714C}, //16911 #CJK UNIFIED IDEOGRAPH + {0xFCD4, 0x749C}, //16912 #CJK UNIFIED IDEOGRAPH + {0xFCD5, 0x7687}, //16913 #CJK UNIFIED IDEOGRAPH + {0xFCD6, 0x7BC1}, //16914 #CJK UNIFIED IDEOGRAPH + {0xFCD7, 0x7C27}, //16915 #CJK UNIFIED IDEOGRAPH + {0xFCD8, 0x8352}, //16916 #CJK UNIFIED IDEOGRAPH + {0xFCD9, 0x8757}, //16917 #CJK UNIFIED IDEOGRAPH + {0xFCDA, 0x9051}, //16918 #CJK UNIFIED IDEOGRAPH + {0xFCDB, 0x968D}, //16919 #CJK UNIFIED IDEOGRAPH + {0xFCDC, 0x9EC3}, //16920 #CJK UNIFIED IDEOGRAPH + {0xFCDD, 0x532F}, //16921 #CJK UNIFIED IDEOGRAPH + {0xFCDE, 0x56DE}, //16922 #CJK UNIFIED IDEOGRAPH + {0xFCDF, 0x5EFB}, //16923 #CJK UNIFIED IDEOGRAPH + {0xFCE0, 0x5F8A}, //16924 #CJK UNIFIED IDEOGRAPH + {0xFCE1, 0x6062}, //16925 #CJK UNIFIED IDEOGRAPH + {0xFCE2, 0x6094}, //16926 #CJK UNIFIED IDEOGRAPH + {0xFCE3, 0x61F7}, //16927 #CJK UNIFIED IDEOGRAPH + {0xFCE4, 0x6666}, //16928 #CJK UNIFIED IDEOGRAPH + {0xFCE5, 0x6703}, //16929 #CJK UNIFIED IDEOGRAPH + {0xFCE6, 0x6A9C}, //16930 #CJK UNIFIED IDEOGRAPH + {0xFCE7, 0x6DEE}, //16931 #CJK UNIFIED IDEOGRAPH + {0xFCE8, 0x6FAE}, //16932 #CJK UNIFIED IDEOGRAPH + {0xFCE9, 0x7070}, //16933 #CJK UNIFIED IDEOGRAPH + {0xFCEA, 0x736A}, //16934 #CJK UNIFIED IDEOGRAPH + {0xFCEB, 0x7E6A}, //16935 #CJK UNIFIED IDEOGRAPH + {0xFCEC, 0x81BE}, //16936 #CJK UNIFIED IDEOGRAPH + {0xFCED, 0x8334}, //16937 #CJK UNIFIED IDEOGRAPH + {0xFCEE, 0x86D4}, //16938 #CJK UNIFIED IDEOGRAPH + {0xFCEF, 0x8AA8}, //16939 #CJK UNIFIED IDEOGRAPH + {0xFCF0, 0x8CC4}, //16940 #CJK UNIFIED IDEOGRAPH + {0xFCF1, 0x5283}, //16941 #CJK UNIFIED IDEOGRAPH + {0xFCF2, 0x7372}, //16942 #CJK UNIFIED IDEOGRAPH + {0xFCF3, 0x5B96}, //16943 #CJK UNIFIED IDEOGRAPH + {0xFCF4, 0x6A6B}, //16944 #CJK UNIFIED IDEOGRAPH + {0xFCF5, 0x9404}, //16945 #CJK UNIFIED IDEOGRAPH + {0xFCF6, 0x54EE}, //16946 #CJK UNIFIED IDEOGRAPH + {0xFCF7, 0x5686}, //16947 #CJK UNIFIED IDEOGRAPH + {0xFCF8, 0x5B5D}, //16948 #CJK UNIFIED IDEOGRAPH + {0xFCF9, 0x6548}, //16949 #CJK UNIFIED IDEOGRAPH + {0xFCFA, 0x6585}, //16950 #CJK UNIFIED IDEOGRAPH + {0xFCFB, 0x66C9}, //16951 #CJK UNIFIED IDEOGRAPH + {0xFCFC, 0x689F}, //16952 #CJK UNIFIED IDEOGRAPH + {0xFCFD, 0x6D8D}, //16953 #CJK UNIFIED IDEOGRAPH + {0xFCFE, 0x6DC6}, //16954 #CJK UNIFIED IDEOGRAPH + {0xFDA1, 0x723B}, //16955 #CJK UNIFIED IDEOGRAPH + {0xFDA2, 0x80B4}, //16956 #CJK UNIFIED IDEOGRAPH + {0xFDA3, 0x9175}, //16957 #CJK UNIFIED IDEOGRAPH + {0xFDA4, 0x9A4D}, //16958 #CJK UNIFIED IDEOGRAPH + {0xFDA5, 0x4FAF}, //16959 #CJK UNIFIED IDEOGRAPH + {0xFDA6, 0x5019}, //16960 #CJK UNIFIED IDEOGRAPH + {0xFDA7, 0x539A}, //16961 #CJK UNIFIED IDEOGRAPH + {0xFDA8, 0x540E}, //16962 #CJK UNIFIED IDEOGRAPH + {0xFDA9, 0x543C}, //16963 #CJK UNIFIED IDEOGRAPH + {0xFDAA, 0x5589}, //16964 #CJK UNIFIED IDEOGRAPH + {0xFDAB, 0x55C5}, //16965 #CJK UNIFIED IDEOGRAPH + {0xFDAC, 0x5E3F}, //16966 #CJK UNIFIED IDEOGRAPH + {0xFDAD, 0x5F8C}, //16967 #CJK UNIFIED IDEOGRAPH + {0xFDAE, 0x673D}, //16968 #CJK UNIFIED IDEOGRAPH + {0xFDAF, 0x7166}, //16969 #CJK UNIFIED IDEOGRAPH + {0xFDB0, 0x73DD}, //16970 #CJK UNIFIED IDEOGRAPH + {0xFDB1, 0x9005}, //16971 #CJK UNIFIED IDEOGRAPH + {0xFDB2, 0x52DB}, //16972 #CJK UNIFIED IDEOGRAPH + {0xFDB3, 0x52F3}, //16973 #CJK UNIFIED IDEOGRAPH + {0xFDB4, 0x5864}, //16974 #CJK UNIFIED IDEOGRAPH + {0xFDB5, 0x58CE}, //16975 #CJK UNIFIED IDEOGRAPH + {0xFDB6, 0x7104}, //16976 #CJK UNIFIED IDEOGRAPH + {0xFDB7, 0x718F}, //16977 #CJK UNIFIED IDEOGRAPH + {0xFDB8, 0x71FB}, //16978 #CJK UNIFIED IDEOGRAPH + {0xFDB9, 0x85B0}, //16979 #CJK UNIFIED IDEOGRAPH + {0xFDBA, 0x8A13}, //16980 #CJK UNIFIED IDEOGRAPH + {0xFDBB, 0x6688}, //16981 #CJK UNIFIED IDEOGRAPH + {0xFDBC, 0x85A8}, //16982 #CJK UNIFIED IDEOGRAPH + {0xFDBD, 0x55A7}, //16983 #CJK UNIFIED IDEOGRAPH + {0xFDBE, 0x6684}, //16984 #CJK UNIFIED IDEOGRAPH + {0xFDBF, 0x714A}, //16985 #CJK UNIFIED IDEOGRAPH + {0xFDC0, 0x8431}, //16986 #CJK UNIFIED IDEOGRAPH + {0xFDC1, 0x5349}, //16987 #CJK UNIFIED IDEOGRAPH + {0xFDC2, 0x5599}, //16988 #CJK UNIFIED IDEOGRAPH + {0xFDC3, 0x6BC1}, //16989 #CJK UNIFIED IDEOGRAPH + {0xFDC4, 0x5F59}, //16990 #CJK UNIFIED IDEOGRAPH + {0xFDC5, 0x5FBD}, //16991 #CJK UNIFIED IDEOGRAPH + {0xFDC6, 0x63EE}, //16992 #CJK UNIFIED IDEOGRAPH + {0xFDC7, 0x6689}, //16993 #CJK UNIFIED IDEOGRAPH + {0xFDC8, 0x7147}, //16994 #CJK UNIFIED IDEOGRAPH + {0xFDC9, 0x8AF1}, //16995 #CJK UNIFIED IDEOGRAPH + {0xFDCA, 0x8F1D}, //16996 #CJK UNIFIED IDEOGRAPH + {0xFDCB, 0x9EBE}, //16997 #CJK UNIFIED IDEOGRAPH + {0xFDCC, 0x4F11}, //16998 #CJK UNIFIED IDEOGRAPH + {0xFDCD, 0x643A}, //16999 #CJK UNIFIED IDEOGRAPH + {0xFDCE, 0x70CB}, //17000 #CJK UNIFIED IDEOGRAPH + {0xFDCF, 0x7566}, //17001 #CJK UNIFIED IDEOGRAPH + {0xFDD0, 0x8667}, //17002 #CJK UNIFIED IDEOGRAPH + {0xFDD1, 0x6064}, //17003 #CJK UNIFIED IDEOGRAPH + {0xFDD2, 0x8B4E}, //17004 #CJK UNIFIED IDEOGRAPH + {0xFDD3, 0x9DF8}, //17005 #CJK UNIFIED IDEOGRAPH + {0xFDD4, 0x5147}, //17006 #CJK UNIFIED IDEOGRAPH + {0xFDD5, 0x51F6}, //17007 #CJK UNIFIED IDEOGRAPH + {0xFDD6, 0x5308}, //17008 #CJK UNIFIED IDEOGRAPH + {0xFDD7, 0x6D36}, //17009 #CJK UNIFIED IDEOGRAPH + {0xFDD8, 0x80F8}, //17010 #CJK UNIFIED IDEOGRAPH + {0xFDD9, 0x9ED1}, //17011 #CJK UNIFIED IDEOGRAPH + {0xFDDA, 0x6615}, //17012 #CJK UNIFIED IDEOGRAPH + {0xFDDB, 0x6B23}, //17013 #CJK UNIFIED IDEOGRAPH + {0xFDDC, 0x7098}, //17014 #CJK UNIFIED IDEOGRAPH + {0xFDDD, 0x75D5}, //17015 #CJK UNIFIED IDEOGRAPH + {0xFDDE, 0x5403}, //17016 #CJK UNIFIED IDEOGRAPH + {0xFDDF, 0x5C79}, //17017 #CJK UNIFIED IDEOGRAPH + {0xFDE0, 0x7D07}, //17018 #CJK UNIFIED IDEOGRAPH + {0xFDE1, 0x8A16}, //17019 #CJK UNIFIED IDEOGRAPH + {0xFDE2, 0x6B20}, //17020 #CJK UNIFIED IDEOGRAPH + {0xFDE3, 0x6B3D}, //17021 #CJK UNIFIED IDEOGRAPH + {0xFDE4, 0x6B46}, //17022 #CJK UNIFIED IDEOGRAPH + {0xFDE5, 0x5438}, //17023 #CJK UNIFIED IDEOGRAPH + {0xFDE6, 0x6070}, //17024 #CJK UNIFIED IDEOGRAPH + {0xFDE7, 0x6D3D}, //17025 #CJK UNIFIED IDEOGRAPH + {0xFDE8, 0x7FD5}, //17026 #CJK UNIFIED IDEOGRAPH + {0xFDE9, 0x8208}, //17027 #CJK UNIFIED IDEOGRAPH + {0xFDEA, 0x50D6}, //17028 #CJK UNIFIED IDEOGRAPH + {0xFDEB, 0x51DE}, //17029 #CJK UNIFIED IDEOGRAPH + {0xFDEC, 0x559C}, //17030 #CJK UNIFIED IDEOGRAPH + {0xFDED, 0x566B}, //17031 #CJK UNIFIED IDEOGRAPH + {0xFDEE, 0x56CD}, //17032 #CJK UNIFIED IDEOGRAPH + {0xFDEF, 0x59EC}, //17033 #CJK UNIFIED IDEOGRAPH + {0xFDF0, 0x5B09}, //17034 #CJK UNIFIED IDEOGRAPH + {0xFDF1, 0x5E0C}, //17035 #CJK UNIFIED IDEOGRAPH + {0xFDF2, 0x6199}, //17036 #CJK UNIFIED IDEOGRAPH + {0xFDF3, 0x6198}, //17037 #CJK UNIFIED IDEOGRAPH + {0xFDF4, 0x6231}, //17038 #CJK UNIFIED IDEOGRAPH + {0xFDF5, 0x665E}, //17039 #CJK UNIFIED IDEOGRAPH + {0xFDF6, 0x66E6}, //17040 #CJK UNIFIED IDEOGRAPH + {0xFDF7, 0x7199}, //17041 #CJK UNIFIED IDEOGRAPH + {0xFDF8, 0x71B9}, //17042 #CJK UNIFIED IDEOGRAPH + {0xFDF9, 0x71BA}, //17043 #CJK UNIFIED IDEOGRAPH + {0xFDFA, 0x72A7}, //17044 #CJK UNIFIED IDEOGRAPH + {0xFDFB, 0x79A7}, //17045 #CJK UNIFIED IDEOGRAPH + {0xFDFC, 0x7A00}, //17046 #CJK UNIFIED IDEOGRAPH + {0xFDFD, 0x7FB2}, //17047 #CJK UNIFIED IDEOGRAPH + {0xFDFE, 0x8A70}, //17048 #CJK UNIFIED IDEOGRAPH +}; + +#endif // DRW_CPTABLE949_H diff --git a/extlib/libdxfrw/intern/drw_cptable950.h b/extlib/libdxfrw/intern/drw_cptable950.h new file mode 100644 index 0000000..2afb89d --- /dev/null +++ b/extlib/libdxfrw/intern/drw_cptable950.h @@ -0,0 +1,13654 @@ +#ifndef DRW_CPTABLE950_H +#define DRW_CPTABLE950_H + +//Chinese (Taiwan, Hong Kong SAR) + +//first entry in this table are 0x80 +#define CPOFFSET950 0x80 +#define CPLENGHT950 13503 +#define NOTFOUND950 0x003F + +//Table 950 one byte +static const int DRW_Table950[1] = { +}; + +//Table 950 lead byte +//pairs of start/end in DRW_DoubleTable950 +static const int DRW_LeadTable950[] = { + 0, //1#DBCS LEAD BYTE 0x81, empty + 0, //2#DBCS LEAD BYTE 0x82, empty + 0, //3#DBCS LEAD BYTE 0x83, empty + 0, //4#DBCS LEAD BYTE 0x84, empty + 0, //5#DBCS LEAD BYTE 0x85, empty + 0, //6#DBCS LEAD BYTE 0x86, empty + 0, //7#DBCS LEAD BYTE 0x87, empty + 0, //8#DBCS LEAD BYTE 0x88, empty + 0, //9#DBCS LEAD BYTE 0x89, empty + 0, //10#DBCS LEAD BYTE 0x8A, empty + 0, //11#DBCS LEAD BYTE 0x8B, empty + 0, //12#DBCS LEAD BYTE 0x8C, empty + 0, //13#DBCS LEAD BYTE 0x8D, empty + 0, //14#DBCS LEAD BYTE 0x8E, empty + 0, //15#DBCS LEAD BYTE 0x8F, empty + 0, //16#DBCS LEAD BYTE 0x90, empty + 0, //17#DBCS LEAD BYTE 0x91, empty + 0, //18#DBCS LEAD BYTE 0x92, empty + 0, //19#DBCS LEAD BYTE 0x93, empty + 0, //20#DBCS LEAD BYTE 0x94, empty + 0, //21#DBCS LEAD BYTE 0x95, empty + 0, //22#DBCS LEAD BYTE 0x96, empty + 0, //23#DBCS LEAD BYTE 0x97, empty + 0, //24#DBCS LEAD BYTE 0x98, empty + 0, //25#DBCS LEAD BYTE 0x99, empty + 0, //26#DBCS LEAD BYTE 0x9A, empty + 0, //27#DBCS LEAD BYTE 0x9B, empty + 0, //28#DBCS LEAD BYTE 0x9C, empty + 0, //29#DBCS LEAD BYTE 0x9D, empty + 0, //30#DBCS LEAD BYTE 0x9E, empty + 0, //31#DBCS LEAD BYTE 0x9F, empty + 0, //32#DBCS LEAD BYTE 0xA0, empty + 0, //33#DBCS LEAD BYTE 0xA1 + 157, //34#DBCS LEAD BYTE 0xA2 + 314, //35#DBCS LEAD BYTE 0xA3 + 409, //36#DBCS LEAD BYTE 0xA4 + 566, //37#DBCS LEAD BYTE 0xA5 + 723, //38#DBCS LEAD BYTE 0xA6 + 880, //39#DBCS LEAD BYTE 0xA7 + 1037, //40#DBCS LEAD BYTE 0xA8 + 1194, //41#DBCS LEAD BYTE 0xA9 + 1351, //42#DBCS LEAD BYTE 0xAA + 1508, //43#DBCS LEAD BYTE 0xAB + 1665, //44#DBCS LEAD BYTE 0xAC + 1822, //45#DBCS LEAD BYTE 0xAD + 1979, //46#DBCS LEAD BYTE 0xAE + 2136, //47#DBCS LEAD BYTE 0xAF + 2293, //48#DBCS LEAD BYTE 0xB0 + 2450, //49#DBCS LEAD BYTE 0xB1 + 2607, //50#DBCS LEAD BYTE 0xB2 + 2764, //51#DBCS LEAD BYTE 0xB3 + 2921, //52#DBCS LEAD BYTE 0xB4 + 3078, //53#DBCS LEAD BYTE 0xB5 + 3235, //54#DBCS LEAD BYTE 0xB6 + 3392, //55#DBCS LEAD BYTE 0xB7 + 3549, //56#DBCS LEAD BYTE 0xB8 + 3706, //57#DBCS LEAD BYTE 0xB9 + 3863, //58#DBCS LEAD BYTE 0xBA + 4020, //59#DBCS LEAD BYTE 0xBB + 4177, //60#DBCS LEAD BYTE 0xBC + 4334, //61#DBCS LEAD BYTE 0xBD + 4491, //62#DBCS LEAD BYTE 0xBE + 4648, //63#DBCS LEAD BYTE 0xBF + 4805, //64#DBCS LEAD BYTE 0xC0 + 4962, //65#DBCS LEAD BYTE 0xC1 + 5119, //66#DBCS LEAD BYTE 0xC2 + 5276, //67#DBCS LEAD BYTE 0xC3 + 5443, //68#DBCS LEAD BYTE 0xC4 + 5590, //69#DBCS LEAD BYTE 0xC5 + 5747, //70#DBCS LEAD BYTE 0xC6 + 5810, //71#DBCS LEAD BYTE 0xC7, empty + 5810, //72#DBCS LEAD BYTE 0xC8, empty + 5810, //73#DBCS LEAD BYTE 0xC9 + 5967, //74#DBCS LEAD BYTE 0xCA + 6124, //75#DBCS LEAD BYTE 0xCB + 6281, //76#DBCS LEAD BYTE 0xCC + 6438, //77#DBCS LEAD BYTE 0xCD + 6595, //78#DBCS LEAD BYTE 0xCE + 6752, //79#DBCS LEAD BYTE 0xCF + 6909, //80#DBCS LEAD BYTE 0xD0 + 7066, //81#DBCS LEAD BYTE 0xD1 + 7223, //82#DBCS LEAD BYTE 0xD2 + 7380, //83#DBCS LEAD BYTE 0xD3 + 7537, //84#DBCS LEAD BYTE 0xD4 + 7694, //85#DBCS LEAD BYTE 0xD5 + 7851, //86#DBCS LEAD BYTE 0xD6 + 8008, //87#DBCS LEAD BYTE 0xD7 + 8165, //88#DBCS LEAD BYTE 0xD8 + 8322, //89#DBCS LEAD BYTE 0xD9 + 8479, //90#DBCS LEAD BYTE 0xDA + 8636, //91#DBCS LEAD BYTE 0xDB + 8793, //92#DBCS LEAD BYTE 0xDC + 8950, //93#DBCS LEAD BYTE 0xDD + 9107, //94#DBCS LEAD BYTE 0xDE + 9264, //95#DBCS LEAD BYTE 0xDF + 9421, //96#DBCS LEAD BYTE 0xE0 + 9578, //97#DBCS LEAD BYTE 0xE1 + 9735, //98#DBCS LEAD BYTE 0xE2 + 9892, //99#DBCS LEAD BYTE 0xE3 + 10049, //100#DBCS LEAD BYTE 0xE4 + 10206, //101#DBCS LEAD BYTE 0xE5 + 10363, //102#DBCS LEAD BYTE 0xE6 + 10520, //103#DBCS LEAD BYTE 0xE7 + 10677, //104#DBCS LEAD BYTE 0xE8 + 10834, //105#DBCS LEAD BYTE 0xE9 + 10991, //106#DBCS LEAD BYTE 0xEA + 11148, //107#DBCS LEAD BYTE 0xEB + 11305, //108#DBCS LEAD BYTE 0xEC + 11462, //109#DBCS LEAD BYTE 0xED + 11619, //110#DBCS LEAD BYTE 0xEE + 11776, //111#DBCS LEAD BYTE 0xEF + 11933, //112#DBCS LEAD BYTE 0xF0 + 12090, //113#DBCS LEAD BYTE 0xF1 + 12247, //114#DBCS LEAD BYTE 0xF2 + 12404, //115#DBCS LEAD BYTE 0xF3 + 12561, //116#DBCS LEAD BYTE 0xF4 + 12718, //117#DBCS LEAD BYTE 0xF5 + 12875, //118#DBCS LEAD BYTE 0xF6 + 13032, //119#DBCS LEAD BYTE 0xF7 + 13189, //120#DBCS LEAD BYTE 0xF8 + 13346, //121#DBCS LEAD BYTE 0xF9 + 13502, //122#DBCS LEAD BYTE 0xFA, empty + 13502, //123#DBCS LEAD BYTE 0xFB, empty + 13502, //124#DBCS LEAD BYTE 0xFC, empty + 13502, //125#DBCS LEAD BYTE 0xFD, empty + 13502, //126#DBCS LEAD BYTE 0xFE, empty + 13502, //127#UNDEFINED 0xFF, END OF TABLE +}; + +//Table 950 tail byte +static const int DRW_DoubleTable950[][2] = { + {0xA140, 0x3000}, //1 #IDEOGRAPHIC SPACE + {0xA141, 0xFF0C}, //2 #FULLWIDTH COMMA + {0xA142, 0x3001}, //3 #IDEOGRAPHIC COMMA + {0xA143, 0x3002}, //4 #IDEOGRAPHIC FULL STOP + {0xA144, 0xFF0E}, //5 #FULLWIDTH FULL STOP + {0xA145, 0x2027}, //6 #HYPHENATION POINT + {0xA146, 0xFF1B}, //7 #FULLWIDTH SEMICOLON + {0xA147, 0xFF1A}, //8 #FULLWIDTH COLON + {0xA148, 0xFF1F}, //9 #FULLWIDTH QUESTION MARK + {0xA149, 0xFF01}, //10 #FULLWIDTH EXCLAMATION MARK + {0xA14A, 0xFE30}, //11 #PRESENTATION FORM FOR VERTICAL TWO DOT LEADER + {0xA14B, 0x2026}, //12 #HORIZONTAL ELLIPSIS + {0xA14C, 0x2025}, //13 #TWO DOT LEADER + {0xA14D, 0xFE50}, //14 #SMALL COMMA + {0xA14E, 0xFE51}, //15 #SMALL IDEOGRAPHIC COMMA + {0xA14F, 0xFE52}, //16 #SMALL FULL STOP + {0xA150, 0x00B7}, //17 #MIDDLE DOT + {0xA151, 0xFE54}, //18 #SMALL SEMICOLON + {0xA152, 0xFE55}, //19 #SMALL COLON + {0xA153, 0xFE56}, //20 #SMALL QUESTION MARK + {0xA154, 0xFE57}, //21 #SMALL EXCLAMATION MARK + {0xA155, 0xFF5C}, //22 #FULLWIDTH VERTICAL LINE + {0xA156, 0x2013}, //23 #EN DASH + {0xA157, 0xFE31}, //24 #PRESENTATION FORM FOR VERTICAL EM DASH + {0xA158, 0x2014}, //25 #EM DASH + {0xA159, 0xFE33}, //26 #PRESENTATION FORM FOR VERTICAL LOW LINE + {0xA15A, 0x2574}, //27 #BOX DRAWINGS LIGHT LEFT + {0xA15B, 0xFE34}, //28 #PRESENTATION FORM FOR VERTICAL WAVY LOW LINE + {0xA15C, 0xFE4F}, //29 #WAVY LOW LINE + {0xA15D, 0xFF08}, //30 #FULLWIDTH LEFT PARENTHESIS + {0xA15E, 0xFF09}, //31 #FULLWIDTH RIGHT PARENTHESIS + {0xA15F, 0xFE35}, //32 #PRESENTATION FORM FOR VERTICAL LEFT PARENTHESIS + {0xA160, 0xFE36}, //33 #PRESENTATION FORM FOR VERTICAL RIGHT PARENTHESIS + {0xA161, 0xFF5B}, //34 #FULLWIDTH LEFT CURLY BRACKET + {0xA162, 0xFF5D}, //35 #FULLWIDTH RIGHT CURLY BRACKET + {0xA163, 0xFE37}, //36 #PRESENTATION FORM FOR VERTICAL LEFT CURLY BRACKET + {0xA164, 0xFE38}, //37 #PRESENTATION FORM FOR VERTICAL RIGHT CURLY BRACKET + {0xA165, 0x3014}, //38 #LEFT TORTOISE SHELL BRACKET + {0xA166, 0x3015}, //39 #RIGHT TORTOISE SHELL BRACKET + {0xA167, 0xFE39}, //40 #PRESENTATION FORM FOR VERTICAL LEFT TORTOISE SHELL BRACKET + {0xA168, 0xFE3A}, //41 #PRESENTATION FORM FOR VERTICAL RIGHT TORTOISE SHELL BRACKET + {0xA169, 0x3010}, //42 #LEFT BLACK LENTICULAR BRACKET + {0xA16A, 0x3011}, //43 #RIGHT BLACK LENTICULAR BRACKET + {0xA16B, 0xFE3B}, //44 #PRESENTATION FORM FOR VERTICAL LEFT BLACK LENTICULAR BRACKET + {0xA16C, 0xFE3C}, //45 #PRESENTATION FORM FOR VERTICAL RIGHT BLACK LENTICULAR BRACKET + {0xA16D, 0x300A}, //46 #LEFT DOUBLE ANGLE BRACKET + {0xA16E, 0x300B}, //47 #RIGHT DOUBLE ANGLE BRACKET + {0xA16F, 0xFE3D}, //48 #PRESENTATION FORM FOR VERTICAL LEFT DOUBLE ANGLE BRACKET + {0xA170, 0xFE3E}, //49 #PRESENTATION FORM FOR VERTICAL RIGHT DOUBLE ANGLE BRACKET + {0xA171, 0x3008}, //50 #LEFT ANGLE BRACKET + {0xA172, 0x3009}, //51 #RIGHT ANGLE BRACKET + {0xA173, 0xFE3F}, //52 #PRESENTATION FORM FOR VERTICAL LEFT ANGLE BRACKET + {0xA174, 0xFE40}, //53 #PRESENTATION FORM FOR VERTICAL RIGHT ANGLE BRACKET + {0xA175, 0x300C}, //54 #LEFT CORNER BRACKET + {0xA176, 0x300D}, //55 #RIGHT CORNER BRACKET + {0xA177, 0xFE41}, //56 #PRESENTATION FORM FOR VERTICAL LEFT CORNER BRACKET + {0xA178, 0xFE42}, //57 #PRESENTATION FORM FOR VERTICAL RIGHT CORNER BRACKET + {0xA179, 0x300E}, //58 #LEFT WHITE CORNER BRACKET + {0xA17A, 0x300F}, //59 #RIGHT WHITE CORNER BRACKET + {0xA17B, 0xFE43}, //60 #PRESENTATION FORM FOR VERTICAL LEFT WHITE CORNER BRACKET + {0xA17C, 0xFE44}, //61 #PRESENTATION FORM FOR VERTICAL RIGHT WHITE CORNER BRACKET + {0xA17D, 0xFE59}, //62 #SMALL LEFT PARENTHESIS + {0xA17E, 0xFE5A}, //63 #SMALL RIGHT PARENTHESIS + {0xA1A1, 0xFE5B}, //64 #SMALL LEFT CURLY BRACKET + {0xA1A2, 0xFE5C}, //65 #SMALL RIGHT CURLY BRACKET + {0xA1A3, 0xFE5D}, //66 #SMALL LEFT TORTOISE SHELL BRACKET + {0xA1A4, 0xFE5E}, //67 #SMALL RIGHT TORTOISE SHELL BRACKET + {0xA1A5, 0x2018}, //68 #LEFT SINGLE QUOTATION MARK + {0xA1A6, 0x2019}, //69 #RIGHT SINGLE QUOTATION MARK + {0xA1A7, 0x201C}, //70 #LEFT DOUBLE QUOTATION MARK + {0xA1A8, 0x201D}, //71 #RIGHT DOUBLE QUOTATION MARK + {0xA1A9, 0x301D}, //72 #REVERSED DOUBLE PRIME QUOTATION MARK + {0xA1AA, 0x301E}, //73 #DOUBLE PRIME QUOTATION MARK + {0xA1AB, 0x2035}, //74 #REVERSED PRIME + {0xA1AC, 0x2032}, //75 #PRIME + {0xA1AD, 0xFF03}, //76 #FULLWIDTH NUMBER SIGN + {0xA1AE, 0xFF06}, //77 #FULLWIDTH AMPERSAND + {0xA1AF, 0xFF0A}, //78 #FULLWIDTH ASTERISK + {0xA1B0, 0x203B}, //79 #REFERENCE MARK + {0xA1B1, 0x00A7}, //80 #SECTION SIGN + {0xA1B2, 0x3003}, //81 #DITTO MARK + {0xA1B3, 0x25CB}, //82 #WHITE CIRCLE + {0xA1B4, 0x25CF}, //83 #BLACK CIRCLE + {0xA1B5, 0x25B3}, //84 #WHITE UP-POINTING TRIANGLE + {0xA1B6, 0x25B2}, //85 #BLACK UP-POINTING TRIANGLE + {0xA1B7, 0x25CE}, //86 #BULLSEYE + {0xA1B8, 0x2606}, //87 #WHITE STAR + {0xA1B9, 0x2605}, //88 #BLACK STAR + {0xA1BA, 0x25C7}, //89 #WHITE DIAMOND + {0xA1BB, 0x25C6}, //90 #BLACK DIAMOND + {0xA1BC, 0x25A1}, //91 #WHITE SQUARE + {0xA1BD, 0x25A0}, //92 #BLACK SQUARE + {0xA1BE, 0x25BD}, //93 #WHITE DOWN-POINTING TRIANGLE + {0xA1BF, 0x25BC}, //94 #BLACK DOWN-POINTING TRIANGLE + {0xA1C0, 0x32A3}, //95 #CIRCLED IDEOGRAPH CORRECT + {0xA1C1, 0x2105}, //96 #CARE OF + {0xA1C2, 0x00AF}, //97 #MACRON + {0xA1C3, 0xFFE3}, //98 #FULLWIDTH MACRON + {0xA1C4, 0xFF3F}, //99 #FULLWIDTH LOW LINE + {0xA1C5, 0x02CD}, //100 #MODIFIER LETTER LOW MACRON + {0xA1C6, 0xFE49}, //101 #DASHED OVERLINE + {0xA1C7, 0xFE4A}, //102 #CENTRELINE OVERLINE + {0xA1C8, 0xFE4D}, //103 #DASHED LOW LINE + {0xA1C9, 0xFE4E}, //104 #CENTRELINE LOW LINE + {0xA1CA, 0xFE4B}, //105 #WAVY OVERLINE + {0xA1CB, 0xFE4C}, //106 #DOUBLE WAVY OVERLINE + {0xA1CC, 0xFE5F}, //107 #SMALL NUMBER SIGN + {0xA1CD, 0xFE60}, //108 #SMALL AMPERSAND + {0xA1CE, 0xFE61}, //109 #SMALL ASTERISK + {0xA1CF, 0xFF0B}, //110 #FULLWIDTH PLUS SIGN + {0xA1D0, 0xFF0D}, //111 #FULLWIDTH HYPHEN-MINUS + {0xA1D1, 0x00D7}, //112 #MULTIPLICATION SIGN + {0xA1D2, 0x00F7}, //113 #DIVISION SIGN + {0xA1D3, 0x00B1}, //114 #PLUS-MINUS SIGN + {0xA1D4, 0x221A}, //115 #SQUARE ROOT + {0xA1D5, 0xFF1C}, //116 #FULLWIDTH LESS-THAN SIGN + {0xA1D6, 0xFF1E}, //117 #FULLWIDTH GREATER-THAN SIGN + {0xA1D7, 0xFF1D}, //118 #FULLWIDTH EQUALS SIGN + {0xA1D8, 0x2266}, //119 #LESS-THAN OVER EQUAL TO + {0xA1D9, 0x2267}, //120 #GREATER-THAN OVER EQUAL TO + {0xA1DA, 0x2260}, //121 #NOT EQUAL TO + {0xA1DB, 0x221E}, //122 #INFINITY + {0xA1DC, 0x2252}, //123 #APPROXIMATELY EQUAL TO OR THE IMAGE OF + {0xA1DD, 0x2261}, //124 #IDENTICAL TO + {0xA1DE, 0xFE62}, //125 #SMALL PLUS SIGN + {0xA1DF, 0xFE63}, //126 #SMALL HYPHEN-MINUS + {0xA1E0, 0xFE64}, //127 #SMALL LESS-THAN SIGN + {0xA1E1, 0xFE65}, //128 #SMALL GREATER-THAN SIGN + {0xA1E2, 0xFE66}, //129 #SMALL EQUALS SIGN + {0xA1E3, 0xFF5E}, //130 #FULLWIDTH TILDE + {0xA1E4, 0x2229}, //131 #INTERSECTION + {0xA1E5, 0x222A}, //132 #UNION + {0xA1E6, 0x22A5}, //133 #UP TACK + {0xA1E7, 0x2220}, //134 #ANGLE + {0xA1E8, 0x221F}, //135 #RIGHT ANGLE + {0xA1E9, 0x22BF}, //136 #RIGHT TRIANGLE + {0xA1EA, 0x33D2}, //137 #SQUARE LOG + {0xA1EB, 0x33D1}, //138 #SQUARE LN + {0xA1EC, 0x222B}, //139 #INTEGRAL + {0xA1ED, 0x222E}, //140 #CONTOUR INTEGRAL + {0xA1EE, 0x2235}, //141 #BECAUSE + {0xA1EF, 0x2234}, //142 #THEREFORE + {0xA1F0, 0x2640}, //143 #FEMALE SIGN + {0xA1F1, 0x2642}, //144 #MALE SIGN + {0xA1F2, 0x2295}, //145 #CIRCLED PLUS + {0xA1F3, 0x2299}, //146 #CIRCLED DOT OPERATOR + {0xA1F4, 0x2191}, //147 #UPWARDS ARROW + {0xA1F5, 0x2193}, //148 #DOWNWARDS ARROW + {0xA1F6, 0x2190}, //149 #LEFTWARDS ARROW + {0xA1F7, 0x2192}, //150 #RIGHTWARDS ARROW + {0xA1F8, 0x2196}, //151 #NORTH WEST ARROW + {0xA1F9, 0x2197}, //152 #NORTH EAST ARROW + {0xA1FA, 0x2199}, //153 #SOUTH WEST ARROW + {0xA1FB, 0x2198}, //154 #SOUTH EAST ARROW + {0xA1FC, 0x2225}, //155 #PARALLEL TO + {0xA1FD, 0x2223}, //156 #DIVIDES + {0xA1FE, 0xFF0F}, //157 #FULLWIDTH SOLIDUS + {0xA240, 0xFF3C}, //158 #FULLWIDTH REVERSE SOLIDUS + {0xA241, 0x2215}, //159 #DIVISION SLASH + {0xA242, 0xFE68}, //160 #SMALL REVERSE SOLIDUS + {0xA243, 0xFF04}, //161 #FULLWIDTH DOLLAR SIGN + {0xA244, 0xFFE5}, //162 #FULLWIDTH YEN SIGN + {0xA245, 0x3012}, //163 #POSTAL MARK + {0xA246, 0xFFE0}, //164 #FULLWIDTH CENT SIGN + {0xA247, 0xFFE1}, //165 #FULLWIDTH POUND SIGN + {0xA248, 0xFF05}, //166 #FULLWIDTH PERCENT SIGN + {0xA249, 0xFF20}, //167 #FULLWIDTH COMMERCIAL AT + {0xA24A, 0x2103}, //168 #DEGREE CELSIUS + {0xA24B, 0x2109}, //169 #DEGREE FAHRENHEIT + {0xA24C, 0xFE69}, //170 #SMALL DOLLAR SIGN + {0xA24D, 0xFE6A}, //171 #SMALL PERCENT SIGN + {0xA24E, 0xFE6B}, //172 #SMALL COMMERCIAL AT + {0xA24F, 0x33D5}, //173 #SQUARE MIL + {0xA250, 0x339C}, //174 #SQUARE MM + {0xA251, 0x339D}, //175 #SQUARE CM + {0xA252, 0x339E}, //176 #SQUARE KM + {0xA253, 0x33CE}, //177 #SQUARE KM CAPITAL + {0xA254, 0x33A1}, //178 #SQUARE M SQUARED + {0xA255, 0x338E}, //179 #SQUARE MG + {0xA256, 0x338F}, //180 #SQUARE KG + {0xA257, 0x33C4}, //181 #SQUARE CC + {0xA258, 0x00B0}, //182 #DEGREE SIGN + {0xA259, 0x5159}, //183 #CJK UNIFIED IDEOGRAPH + {0xA25A, 0x515B}, //184 #CJK UNIFIED IDEOGRAPH + {0xA25B, 0x515E}, //185 #CJK UNIFIED IDEOGRAPH + {0xA25C, 0x515D}, //186 #CJK UNIFIED IDEOGRAPH + {0xA25D, 0x5161}, //187 #CJK UNIFIED IDEOGRAPH + {0xA25E, 0x5163}, //188 #CJK UNIFIED IDEOGRAPH + {0xA25F, 0x55E7}, //189 #CJK UNIFIED IDEOGRAPH + {0xA260, 0x74E9}, //190 #CJK UNIFIED IDEOGRAPH + {0xA261, 0x7CCE}, //191 #CJK UNIFIED IDEOGRAPH + {0xA262, 0x2581}, //192 #LOWER ONE EIGHTH BLOCK + {0xA263, 0x2582}, //193 #LOWER ONE QUARTER BLOCK + {0xA264, 0x2583}, //194 #LOWER THREE EIGHTHS BLOCK + {0xA265, 0x2584}, //195 #LOWER HALF BLOCK + {0xA266, 0x2585}, //196 #LOWER FIVE EIGHTHS BLOCK + {0xA267, 0x2586}, //197 #LOWER THREE QUARTERS BLOCK + {0xA268, 0x2587}, //198 #LOWER SEVEN EIGHTHS BLOCK + {0xA269, 0x2588}, //199 #FULL BLOCK + {0xA26A, 0x258F}, //200 #LEFT ONE EIGHTH BLOCK + {0xA26B, 0x258E}, //201 #LEFT ONE QUARTER BLOCK + {0xA26C, 0x258D}, //202 #LEFT THREE EIGHTHS BLOCK + {0xA26D, 0x258C}, //203 #LEFT HALF BLOCK + {0xA26E, 0x258B}, //204 #LEFT FIVE EIGHTHS BLOCK + {0xA26F, 0x258A}, //205 #LEFT THREE QUARTERS BLOCK + {0xA270, 0x2589}, //206 #LEFT SEVEN EIGHTHS BLOCK + {0xA271, 0x253C}, //207 #BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + {0xA272, 0x2534}, //208 #BOX DRAWINGS LIGHT UP AND HORIZONTAL + {0xA273, 0x252C}, //209 #BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + {0xA274, 0x2524}, //210 #BOX DRAWINGS LIGHT VERTICAL AND LEFT + {0xA275, 0x251C}, //211 #BOX DRAWINGS LIGHT VERTICAL AND RIGHT + {0xA276, 0x2594}, //212 #UPPER ONE EIGHTH BLOCK + {0xA277, 0x2500}, //213 #BOX DRAWINGS LIGHT HORIZONTAL + {0xA278, 0x2502}, //214 #BOX DRAWINGS LIGHT VERTICAL + {0xA279, 0x2595}, //215 #RIGHT ONE EIGHTH BLOCK + {0xA27A, 0x250C}, //216 #BOX DRAWINGS LIGHT DOWN AND RIGHT + {0xA27B, 0x2510}, //217 #BOX DRAWINGS LIGHT DOWN AND LEFT + {0xA27C, 0x2514}, //218 #BOX DRAWINGS LIGHT UP AND RIGHT + {0xA27D, 0x2518}, //219 #BOX DRAWINGS LIGHT UP AND LEFT + {0xA27E, 0x256D}, //220 #BOX DRAWINGS LIGHT ARC DOWN AND RIGHT + {0xA2A1, 0x256E}, //221 #BOX DRAWINGS LIGHT ARC DOWN AND LEFT + {0xA2A2, 0x2570}, //222 #BOX DRAWINGS LIGHT ARC UP AND RIGHT + {0xA2A3, 0x256F}, //223 #BOX DRAWINGS LIGHT ARC UP AND LEFT + {0xA2A4, 0x2550}, //224 #BOX DRAWINGS DOUBLE HORIZONTAL + {0xA2A5, 0x255E}, //225 #BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE + {0xA2A6, 0x256A}, //226 #BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE + {0xA2A7, 0x2561}, //227 #BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE + {0xA2A8, 0x25E2}, //228 #BLACK LOWER RIGHT TRIANGLE + {0xA2A9, 0x25E3}, //229 #BLACK LOWER LEFT TRIANGLE + {0xA2AA, 0x25E5}, //230 #BLACK UPPER RIGHT TRIANGLE + {0xA2AB, 0x25E4}, //231 #BLACK UPPER LEFT TRIANGLE + {0xA2AC, 0x2571}, //232 #BOX DRAWINGS LIGHT DIAGONAL UPPER RIGHT TO LOWER LEFT + {0xA2AD, 0x2572}, //233 #BOX DRAWINGS LIGHT DIAGONAL UPPER LEFT TO LOWER RIGHT + {0xA2AE, 0x2573}, //234 #BOX DRAWINGS LIGHT DIAGONAL CROSS + {0xA2AF, 0xFF10}, //235 #FULLWIDTH DIGIT ZERO + {0xA2B0, 0xFF11}, //236 #FULLWIDTH DIGIT ONE + {0xA2B1, 0xFF12}, //237 #FULLWIDTH DIGIT TWO + {0xA2B2, 0xFF13}, //238 #FULLWIDTH DIGIT THREE + {0xA2B3, 0xFF14}, //239 #FULLWIDTH DIGIT FOUR + {0xA2B4, 0xFF15}, //240 #FULLWIDTH DIGIT FIVE + {0xA2B5, 0xFF16}, //241 #FULLWIDTH DIGIT SIX + {0xA2B6, 0xFF17}, //242 #FULLWIDTH DIGIT SEVEN + {0xA2B7, 0xFF18}, //243 #FULLWIDTH DIGIT EIGHT + {0xA2B8, 0xFF19}, //244 #FULLWIDTH DIGIT NINE + {0xA2B9, 0x2160}, //245 #ROMAN NUMERAL ONE + {0xA2BA, 0x2161}, //246 #ROMAN NUMERAL TWO + {0xA2BB, 0x2162}, //247 #ROMAN NUMERAL THREE + {0xA2BC, 0x2163}, //248 #ROMAN NUMERAL FOUR + {0xA2BD, 0x2164}, //249 #ROMAN NUMERAL FIVE + {0xA2BE, 0x2165}, //250 #ROMAN NUMERAL SIX + {0xA2BF, 0x2166}, //251 #ROMAN NUMERAL SEVEN + {0xA2C0, 0x2167}, //252 #ROMAN NUMERAL EIGHT + {0xA2C1, 0x2168}, //253 #ROMAN NUMERAL NINE + {0xA2C2, 0x2169}, //254 #ROMAN NUMERAL TEN + {0xA2C3, 0x3021}, //255 #HANGZHOU NUMERAL ONE + {0xA2C4, 0x3022}, //256 #HANGZHOU NUMERAL TWO + {0xA2C5, 0x3023}, //257 #HANGZHOU NUMERAL THREE + {0xA2C6, 0x3024}, //258 #HANGZHOU NUMERAL FOUR + {0xA2C7, 0x3025}, //259 #HANGZHOU NUMERAL FIVE + {0xA2C8, 0x3026}, //260 #HANGZHOU NUMERAL SIX + {0xA2C9, 0x3027}, //261 #HANGZHOU NUMERAL SEVEN + {0xA2CA, 0x3028}, //262 #HANGZHOU NUMERAL EIGHT + {0xA2CB, 0x3029}, //263 #HANGZHOU NUMERAL NINE + {0xA2CC, 0x5341}, //264 #CJK UNIFIED IDEOGRAPH + {0xA2CD, 0x5344}, //265 #CJK UNIFIED IDEOGRAPH + {0xA2CE, 0x5345}, //266 #CJK UNIFIED IDEOGRAPH + {0xA2CF, 0xFF21}, //267 #FULLWIDTH LATIN CAPITAL LETTER A + {0xA2D0, 0xFF22}, //268 #FULLWIDTH LATIN CAPITAL LETTER B + {0xA2D1, 0xFF23}, //269 #FULLWIDTH LATIN CAPITAL LETTER C + {0xA2D2, 0xFF24}, //270 #FULLWIDTH LATIN CAPITAL LETTER D + {0xA2D3, 0xFF25}, //271 #FULLWIDTH LATIN CAPITAL LETTER E + {0xA2D4, 0xFF26}, //272 #FULLWIDTH LATIN CAPITAL LETTER F + {0xA2D5, 0xFF27}, //273 #FULLWIDTH LATIN CAPITAL LETTER G + {0xA2D6, 0xFF28}, //274 #FULLWIDTH LATIN CAPITAL LETTER H + {0xA2D7, 0xFF29}, //275 #FULLWIDTH LATIN CAPITAL LETTER I + {0xA2D8, 0xFF2A}, //276 #FULLWIDTH LATIN CAPITAL LETTER J + {0xA2D9, 0xFF2B}, //277 #FULLWIDTH LATIN CAPITAL LETTER K + {0xA2DA, 0xFF2C}, //278 #FULLWIDTH LATIN CAPITAL LETTER L + {0xA2DB, 0xFF2D}, //279 #FULLWIDTH LATIN CAPITAL LETTER M + {0xA2DC, 0xFF2E}, //280 #FULLWIDTH LATIN CAPITAL LETTER N + {0xA2DD, 0xFF2F}, //281 #FULLWIDTH LATIN CAPITAL LETTER O + {0xA2DE, 0xFF30}, //282 #FULLWIDTH LATIN CAPITAL LETTER P + {0xA2DF, 0xFF31}, //283 #FULLWIDTH LATIN CAPITAL LETTER Q + {0xA2E0, 0xFF32}, //284 #FULLWIDTH LATIN CAPITAL LETTER R + {0xA2E1, 0xFF33}, //285 #FULLWIDTH LATIN CAPITAL LETTER S + {0xA2E2, 0xFF34}, //286 #FULLWIDTH LATIN CAPITAL LETTER T + {0xA2E3, 0xFF35}, //287 #FULLWIDTH LATIN CAPITAL LETTER U + {0xA2E4, 0xFF36}, //288 #FULLWIDTH LATIN CAPITAL LETTER V + {0xA2E5, 0xFF37}, //289 #FULLWIDTH LATIN CAPITAL LETTER W + {0xA2E6, 0xFF38}, //290 #FULLWIDTH LATIN CAPITAL LETTER X + {0xA2E7, 0xFF39}, //291 #FULLWIDTH LATIN CAPITAL LETTER Y + {0xA2E8, 0xFF3A}, //292 #FULLWIDTH LATIN CAPITAL LETTER Z + {0xA2E9, 0xFF41}, //293 #FULLWIDTH LATIN SMALL LETTER A + {0xA2EA, 0xFF42}, //294 #FULLWIDTH LATIN SMALL LETTER B + {0xA2EB, 0xFF43}, //295 #FULLWIDTH LATIN SMALL LETTER C + {0xA2EC, 0xFF44}, //296 #FULLWIDTH LATIN SMALL LETTER D + {0xA2ED, 0xFF45}, //297 #FULLWIDTH LATIN SMALL LETTER E + {0xA2EE, 0xFF46}, //298 #FULLWIDTH LATIN SMALL LETTER F + {0xA2EF, 0xFF47}, //299 #FULLWIDTH LATIN SMALL LETTER G + {0xA2F0, 0xFF48}, //300 #FULLWIDTH LATIN SMALL LETTER H + {0xA2F1, 0xFF49}, //301 #FULLWIDTH LATIN SMALL LETTER I + {0xA2F2, 0xFF4A}, //302 #FULLWIDTH LATIN SMALL LETTER J + {0xA2F3, 0xFF4B}, //303 #FULLWIDTH LATIN SMALL LETTER K + {0xA2F4, 0xFF4C}, //304 #FULLWIDTH LATIN SMALL LETTER L + {0xA2F5, 0xFF4D}, //305 #FULLWIDTH LATIN SMALL LETTER M + {0xA2F6, 0xFF4E}, //306 #FULLWIDTH LATIN SMALL LETTER N + {0xA2F7, 0xFF4F}, //307 #FULLWIDTH LATIN SMALL LETTER O + {0xA2F8, 0xFF50}, //308 #FULLWIDTH LATIN SMALL LETTER P + {0xA2F9, 0xFF51}, //309 #FULLWIDTH LATIN SMALL LETTER Q + {0xA2FA, 0xFF52}, //310 #FULLWIDTH LATIN SMALL LETTER R + {0xA2FB, 0xFF53}, //311 #FULLWIDTH LATIN SMALL LETTER S + {0xA2FC, 0xFF54}, //312 #FULLWIDTH LATIN SMALL LETTER T + {0xA2FD, 0xFF55}, //313 #FULLWIDTH LATIN SMALL LETTER U + {0xA2FE, 0xFF56}, //314 #FULLWIDTH LATIN SMALL LETTER V + {0xA340, 0xFF57}, //315 #FULLWIDTH LATIN SMALL LETTER W + {0xA341, 0xFF58}, //316 #FULLWIDTH LATIN SMALL LETTER X + {0xA342, 0xFF59}, //317 #FULLWIDTH LATIN SMALL LETTER Y + {0xA343, 0xFF5A}, //318 #FULLWIDTH LATIN SMALL LETTER Z + {0xA344, 0x0391}, //319 #GREEK CAPITAL LETTER ALPHA + {0xA345, 0x0392}, //320 #GREEK CAPITAL LETTER BETA + {0xA346, 0x0393}, //321 #GREEK CAPITAL LETTER GAMMA + {0xA347, 0x0394}, //322 #GREEK CAPITAL LETTER DELTA + {0xA348, 0x0395}, //323 #GREEK CAPITAL LETTER EPSILON + {0xA349, 0x0396}, //324 #GREEK CAPITAL LETTER ZETA + {0xA34A, 0x0397}, //325 #GREEK CAPITAL LETTER ETA + {0xA34B, 0x0398}, //326 #GREEK CAPITAL LETTER THETA + {0xA34C, 0x0399}, //327 #GREEK CAPITAL LETTER IOTA + {0xA34D, 0x039A}, //328 #GREEK CAPITAL LETTER KAPPA + {0xA34E, 0x039B}, //329 #GREEK CAPITAL LETTER LAMDA + {0xA34F, 0x039C}, //330 #GREEK CAPITAL LETTER MU + {0xA350, 0x039D}, //331 #GREEK CAPITAL LETTER NU + {0xA351, 0x039E}, //332 #GREEK CAPITAL LETTER XI + {0xA352, 0x039F}, //333 #GREEK CAPITAL LETTER OMICRON + {0xA353, 0x03A0}, //334 #GREEK CAPITAL LETTER PI + {0xA354, 0x03A1}, //335 #GREEK CAPITAL LETTER RHO + {0xA355, 0x03A3}, //336 #GREEK CAPITAL LETTER SIGMA + {0xA356, 0x03A4}, //337 #GREEK CAPITAL LETTER TAU + {0xA357, 0x03A5}, //338 #GREEK CAPITAL LETTER UPSILON + {0xA358, 0x03A6}, //339 #GREEK CAPITAL LETTER PHI + {0xA359, 0x03A7}, //340 #GREEK CAPITAL LETTER CHI + {0xA35A, 0x03A8}, //341 #GREEK CAPITAL LETTER PSI + {0xA35B, 0x03A9}, //342 #GREEK CAPITAL LETTER OMEGA + {0xA35C, 0x03B1}, //343 #GREEK SMALL LETTER ALPHA + {0xA35D, 0x03B2}, //344 #GREEK SMALL LETTER BETA + {0xA35E, 0x03B3}, //345 #GREEK SMALL LETTER GAMMA + {0xA35F, 0x03B4}, //346 #GREEK SMALL LETTER DELTA + {0xA360, 0x03B5}, //347 #GREEK SMALL LETTER EPSILON + {0xA361, 0x03B6}, //348 #GREEK SMALL LETTER ZETA + {0xA362, 0x03B7}, //349 #GREEK SMALL LETTER ETA + {0xA363, 0x03B8}, //350 #GREEK SMALL LETTER THETA + {0xA364, 0x03B9}, //351 #GREEK SMALL LETTER IOTA + {0xA365, 0x03BA}, //352 #GREEK SMALL LETTER KAPPA + {0xA366, 0x03BB}, //353 #GREEK SMALL LETTER LAMDA + {0xA367, 0x03BC}, //354 #GREEK SMALL LETTER MU + {0xA368, 0x03BD}, //355 #GREEK SMALL LETTER NU + {0xA369, 0x03BE}, //356 #GREEK SMALL LETTER XI + {0xA36A, 0x03BF}, //357 #GREEK SMALL LETTER OMICRON + {0xA36B, 0x03C0}, //358 #GREEK SMALL LETTER PI + {0xA36C, 0x03C1}, //359 #GREEK SMALL LETTER RHO + {0xA36D, 0x03C3}, //360 #GREEK SMALL LETTER SIGMA + {0xA36E, 0x03C4}, //361 #GREEK SMALL LETTER TAU + {0xA36F, 0x03C5}, //362 #GREEK SMALL LETTER UPSILON + {0xA370, 0x03C6}, //363 #GREEK SMALL LETTER PHI + {0xA371, 0x03C7}, //364 #GREEK SMALL LETTER CHI + {0xA372, 0x03C8}, //365 #GREEK SMALL LETTER PSI + {0xA373, 0x03C9}, //366 #GREEK SMALL LETTER OMEGA + {0xA374, 0x3105}, //367 #BOPOMOFO LETTER B + {0xA375, 0x3106}, //368 #BOPOMOFO LETTER P + {0xA376, 0x3107}, //369 #BOPOMOFO LETTER M + {0xA377, 0x3108}, //370 #BOPOMOFO LETTER F + {0xA378, 0x3109}, //371 #BOPOMOFO LETTER D + {0xA379, 0x310A}, //372 #BOPOMOFO LETTER T + {0xA37A, 0x310B}, //373 #BOPOMOFO LETTER N + {0xA37B, 0x310C}, //374 #BOPOMOFO LETTER L + {0xA37C, 0x310D}, //375 #BOPOMOFO LETTER G + {0xA37D, 0x310E}, //376 #BOPOMOFO LETTER K + {0xA37E, 0x310F}, //377 #BOPOMOFO LETTER H + {0xA3A1, 0x3110}, //378 #BOPOMOFO LETTER J + {0xA3A2, 0x3111}, //379 #BOPOMOFO LETTER Q + {0xA3A3, 0x3112}, //380 #BOPOMOFO LETTER X + {0xA3A4, 0x3113}, //381 #BOPOMOFO LETTER ZH + {0xA3A5, 0x3114}, //382 #BOPOMOFO LETTER CH + {0xA3A6, 0x3115}, //383 #BOPOMOFO LETTER SH + {0xA3A7, 0x3116}, //384 #BOPOMOFO LETTER R + {0xA3A8, 0x3117}, //385 #BOPOMOFO LETTER Z + {0xA3A9, 0x3118}, //386 #BOPOMOFO LETTER C + {0xA3AA, 0x3119}, //387 #BOPOMOFO LETTER S + {0xA3AB, 0x311A}, //388 #BOPOMOFO LETTER A + {0xA3AC, 0x311B}, //389 #BOPOMOFO LETTER O + {0xA3AD, 0x311C}, //390 #BOPOMOFO LETTER E + {0xA3AE, 0x311D}, //391 #BOPOMOFO LETTER EH + {0xA3AF, 0x311E}, //392 #BOPOMOFO LETTER AI + {0xA3B0, 0x311F}, //393 #BOPOMOFO LETTER EI + {0xA3B1, 0x3120}, //394 #BOPOMOFO LETTER AU + {0xA3B2, 0x3121}, //395 #BOPOMOFO LETTER OU + {0xA3B3, 0x3122}, //396 #BOPOMOFO LETTER AN + {0xA3B4, 0x3123}, //397 #BOPOMOFO LETTER EN + {0xA3B5, 0x3124}, //398 #BOPOMOFO LETTER ANG + {0xA3B6, 0x3125}, //399 #BOPOMOFO LETTER ENG + {0xA3B7, 0x3126}, //400 #BOPOMOFO LETTER ER + {0xA3B8, 0x3127}, //401 #BOPOMOFO LETTER I + {0xA3B9, 0x3128}, //402 #BOPOMOFO LETTER U + {0xA3BA, 0x3129}, //403 #BOPOMOFO LETTER IU + {0xA3BB, 0x02D9}, //404 #DOT ABOVE + {0xA3BC, 0x02C9}, //405 #MODIFIER LETTER MACRON + {0xA3BD, 0x02CA}, //406 #MODIFIER LETTER ACUTE ACCENT + {0xA3BE, 0x02C7}, //407 #CARON + {0xA3BF, 0x02CB}, //408 #MODIFIER LETTER GRAVE ACCENT + {0xA3E1, 0x20AC}, //409 #EURO SIGN + {0xA440, 0x4E00}, //410 #CJK UNIFIED IDEOGRAPH + {0xA441, 0x4E59}, //411 #CJK UNIFIED IDEOGRAPH + {0xA442, 0x4E01}, //412 #CJK UNIFIED IDEOGRAPH + {0xA443, 0x4E03}, //413 #CJK UNIFIED IDEOGRAPH + {0xA444, 0x4E43}, //414 #CJK UNIFIED IDEOGRAPH + {0xA445, 0x4E5D}, //415 #CJK UNIFIED IDEOGRAPH + {0xA446, 0x4E86}, //416 #CJK UNIFIED IDEOGRAPH + {0xA447, 0x4E8C}, //417 #CJK UNIFIED IDEOGRAPH + {0xA448, 0x4EBA}, //418 #CJK UNIFIED IDEOGRAPH + {0xA449, 0x513F}, //419 #CJK UNIFIED IDEOGRAPH + {0xA44A, 0x5165}, //420 #CJK UNIFIED IDEOGRAPH + {0xA44B, 0x516B}, //421 #CJK UNIFIED IDEOGRAPH + {0xA44C, 0x51E0}, //422 #CJK UNIFIED IDEOGRAPH + {0xA44D, 0x5200}, //423 #CJK UNIFIED IDEOGRAPH + {0xA44E, 0x5201}, //424 #CJK UNIFIED IDEOGRAPH + {0xA44F, 0x529B}, //425 #CJK UNIFIED IDEOGRAPH + {0xA450, 0x5315}, //426 #CJK UNIFIED IDEOGRAPH + {0xA451, 0x5341}, //427 #CJK UNIFIED IDEOGRAPH + {0xA452, 0x535C}, //428 #CJK UNIFIED IDEOGRAPH + {0xA453, 0x53C8}, //429 #CJK UNIFIED IDEOGRAPH + {0xA454, 0x4E09}, //430 #CJK UNIFIED IDEOGRAPH + {0xA455, 0x4E0B}, //431 #CJK UNIFIED IDEOGRAPH + {0xA456, 0x4E08}, //432 #CJK UNIFIED IDEOGRAPH + {0xA457, 0x4E0A}, //433 #CJK UNIFIED IDEOGRAPH + {0xA458, 0x4E2B}, //434 #CJK UNIFIED IDEOGRAPH + {0xA459, 0x4E38}, //435 #CJK UNIFIED IDEOGRAPH + {0xA45A, 0x51E1}, //436 #CJK UNIFIED IDEOGRAPH + {0xA45B, 0x4E45}, //437 #CJK UNIFIED IDEOGRAPH + {0xA45C, 0x4E48}, //438 #CJK UNIFIED IDEOGRAPH + {0xA45D, 0x4E5F}, //439 #CJK UNIFIED IDEOGRAPH + {0xA45E, 0x4E5E}, //440 #CJK UNIFIED IDEOGRAPH + {0xA45F, 0x4E8E}, //441 #CJK UNIFIED IDEOGRAPH + {0xA460, 0x4EA1}, //442 #CJK UNIFIED IDEOGRAPH + {0xA461, 0x5140}, //443 #CJK UNIFIED IDEOGRAPH + {0xA462, 0x5203}, //444 #CJK UNIFIED IDEOGRAPH + {0xA463, 0x52FA}, //445 #CJK UNIFIED IDEOGRAPH + {0xA464, 0x5343}, //446 #CJK UNIFIED IDEOGRAPH + {0xA465, 0x53C9}, //447 #CJK UNIFIED IDEOGRAPH + {0xA466, 0x53E3}, //448 #CJK UNIFIED IDEOGRAPH + {0xA467, 0x571F}, //449 #CJK UNIFIED IDEOGRAPH + {0xA468, 0x58EB}, //450 #CJK UNIFIED IDEOGRAPH + {0xA469, 0x5915}, //451 #CJK UNIFIED IDEOGRAPH + {0xA46A, 0x5927}, //452 #CJK UNIFIED IDEOGRAPH + {0xA46B, 0x5973}, //453 #CJK UNIFIED IDEOGRAPH + {0xA46C, 0x5B50}, //454 #CJK UNIFIED IDEOGRAPH + {0xA46D, 0x5B51}, //455 #CJK UNIFIED IDEOGRAPH + {0xA46E, 0x5B53}, //456 #CJK UNIFIED IDEOGRAPH + {0xA46F, 0x5BF8}, //457 #CJK UNIFIED IDEOGRAPH + {0xA470, 0x5C0F}, //458 #CJK UNIFIED IDEOGRAPH + {0xA471, 0x5C22}, //459 #CJK UNIFIED IDEOGRAPH + {0xA472, 0x5C38}, //460 #CJK UNIFIED IDEOGRAPH + {0xA473, 0x5C71}, //461 #CJK UNIFIED IDEOGRAPH + {0xA474, 0x5DDD}, //462 #CJK UNIFIED IDEOGRAPH + {0xA475, 0x5DE5}, //463 #CJK UNIFIED IDEOGRAPH + {0xA476, 0x5DF1}, //464 #CJK UNIFIED IDEOGRAPH + {0xA477, 0x5DF2}, //465 #CJK UNIFIED IDEOGRAPH + {0xA478, 0x5DF3}, //466 #CJK UNIFIED IDEOGRAPH + {0xA479, 0x5DFE}, //467 #CJK UNIFIED IDEOGRAPH + {0xA47A, 0x5E72}, //468 #CJK UNIFIED IDEOGRAPH + {0xA47B, 0x5EFE}, //469 #CJK UNIFIED IDEOGRAPH + {0xA47C, 0x5F0B}, //470 #CJK UNIFIED IDEOGRAPH + {0xA47D, 0x5F13}, //471 #CJK UNIFIED IDEOGRAPH + {0xA47E, 0x624D}, //472 #CJK UNIFIED IDEOGRAPH + {0xA4A1, 0x4E11}, //473 #CJK UNIFIED IDEOGRAPH + {0xA4A2, 0x4E10}, //474 #CJK UNIFIED IDEOGRAPH + {0xA4A3, 0x4E0D}, //475 #CJK UNIFIED IDEOGRAPH + {0xA4A4, 0x4E2D}, //476 #CJK UNIFIED IDEOGRAPH + {0xA4A5, 0x4E30}, //477 #CJK UNIFIED IDEOGRAPH + {0xA4A6, 0x4E39}, //478 #CJK UNIFIED IDEOGRAPH + {0xA4A7, 0x4E4B}, //479 #CJK UNIFIED IDEOGRAPH + {0xA4A8, 0x5C39}, //480 #CJK UNIFIED IDEOGRAPH + {0xA4A9, 0x4E88}, //481 #CJK UNIFIED IDEOGRAPH + {0xA4AA, 0x4E91}, //482 #CJK UNIFIED IDEOGRAPH + {0xA4AB, 0x4E95}, //483 #CJK UNIFIED IDEOGRAPH + {0xA4AC, 0x4E92}, //484 #CJK UNIFIED IDEOGRAPH + {0xA4AD, 0x4E94}, //485 #CJK UNIFIED IDEOGRAPH + {0xA4AE, 0x4EA2}, //486 #CJK UNIFIED IDEOGRAPH + {0xA4AF, 0x4EC1}, //487 #CJK UNIFIED IDEOGRAPH + {0xA4B0, 0x4EC0}, //488 #CJK UNIFIED IDEOGRAPH + {0xA4B1, 0x4EC3}, //489 #CJK UNIFIED IDEOGRAPH + {0xA4B2, 0x4EC6}, //490 #CJK UNIFIED IDEOGRAPH + {0xA4B3, 0x4EC7}, //491 #CJK UNIFIED IDEOGRAPH + {0xA4B4, 0x4ECD}, //492 #CJK UNIFIED IDEOGRAPH + {0xA4B5, 0x4ECA}, //493 #CJK UNIFIED IDEOGRAPH + {0xA4B6, 0x4ECB}, //494 #CJK UNIFIED IDEOGRAPH + {0xA4B7, 0x4EC4}, //495 #CJK UNIFIED IDEOGRAPH + {0xA4B8, 0x5143}, //496 #CJK UNIFIED IDEOGRAPH + {0xA4B9, 0x5141}, //497 #CJK UNIFIED IDEOGRAPH + {0xA4BA, 0x5167}, //498 #CJK UNIFIED IDEOGRAPH + {0xA4BB, 0x516D}, //499 #CJK UNIFIED IDEOGRAPH + {0xA4BC, 0x516E}, //500 #CJK UNIFIED IDEOGRAPH + {0xA4BD, 0x516C}, //501 #CJK UNIFIED IDEOGRAPH + {0xA4BE, 0x5197}, //502 #CJK UNIFIED IDEOGRAPH + {0xA4BF, 0x51F6}, //503 #CJK UNIFIED IDEOGRAPH + {0xA4C0, 0x5206}, //504 #CJK UNIFIED IDEOGRAPH + {0xA4C1, 0x5207}, //505 #CJK UNIFIED IDEOGRAPH + {0xA4C2, 0x5208}, //506 #CJK UNIFIED IDEOGRAPH + {0xA4C3, 0x52FB}, //507 #CJK UNIFIED IDEOGRAPH + {0xA4C4, 0x52FE}, //508 #CJK UNIFIED IDEOGRAPH + {0xA4C5, 0x52FF}, //509 #CJK UNIFIED IDEOGRAPH + {0xA4C6, 0x5316}, //510 #CJK UNIFIED IDEOGRAPH + {0xA4C7, 0x5339}, //511 #CJK UNIFIED IDEOGRAPH + {0xA4C8, 0x5348}, //512 #CJK UNIFIED IDEOGRAPH + {0xA4C9, 0x5347}, //513 #CJK UNIFIED IDEOGRAPH + {0xA4CA, 0x5345}, //514 #CJK UNIFIED IDEOGRAPH + {0xA4CB, 0x535E}, //515 #CJK UNIFIED IDEOGRAPH + {0xA4CC, 0x5384}, //516 #CJK UNIFIED IDEOGRAPH + {0xA4CD, 0x53CB}, //517 #CJK UNIFIED IDEOGRAPH + {0xA4CE, 0x53CA}, //518 #CJK UNIFIED IDEOGRAPH + {0xA4CF, 0x53CD}, //519 #CJK UNIFIED IDEOGRAPH + {0xA4D0, 0x58EC}, //520 #CJK UNIFIED IDEOGRAPH + {0xA4D1, 0x5929}, //521 #CJK UNIFIED IDEOGRAPH + {0xA4D2, 0x592B}, //522 #CJK UNIFIED IDEOGRAPH + {0xA4D3, 0x592A}, //523 #CJK UNIFIED IDEOGRAPH + {0xA4D4, 0x592D}, //524 #CJK UNIFIED IDEOGRAPH + {0xA4D5, 0x5B54}, //525 #CJK UNIFIED IDEOGRAPH + {0xA4D6, 0x5C11}, //526 #CJK UNIFIED IDEOGRAPH + {0xA4D7, 0x5C24}, //527 #CJK UNIFIED IDEOGRAPH + {0xA4D8, 0x5C3A}, //528 #CJK UNIFIED IDEOGRAPH + {0xA4D9, 0x5C6F}, //529 #CJK UNIFIED IDEOGRAPH + {0xA4DA, 0x5DF4}, //530 #CJK UNIFIED IDEOGRAPH + {0xA4DB, 0x5E7B}, //531 #CJK UNIFIED IDEOGRAPH + {0xA4DC, 0x5EFF}, //532 #CJK UNIFIED IDEOGRAPH + {0xA4DD, 0x5F14}, //533 #CJK UNIFIED IDEOGRAPH + {0xA4DE, 0x5F15}, //534 #CJK UNIFIED IDEOGRAPH + {0xA4DF, 0x5FC3}, //535 #CJK UNIFIED IDEOGRAPH + {0xA4E0, 0x6208}, //536 #CJK UNIFIED IDEOGRAPH + {0xA4E1, 0x6236}, //537 #CJK UNIFIED IDEOGRAPH + {0xA4E2, 0x624B}, //538 #CJK UNIFIED IDEOGRAPH + {0xA4E3, 0x624E}, //539 #CJK UNIFIED IDEOGRAPH + {0xA4E4, 0x652F}, //540 #CJK UNIFIED IDEOGRAPH + {0xA4E5, 0x6587}, //541 #CJK UNIFIED IDEOGRAPH + {0xA4E6, 0x6597}, //542 #CJK UNIFIED IDEOGRAPH + {0xA4E7, 0x65A4}, //543 #CJK UNIFIED IDEOGRAPH + {0xA4E8, 0x65B9}, //544 #CJK UNIFIED IDEOGRAPH + {0xA4E9, 0x65E5}, //545 #CJK UNIFIED IDEOGRAPH + {0xA4EA, 0x66F0}, //546 #CJK UNIFIED IDEOGRAPH + {0xA4EB, 0x6708}, //547 #CJK UNIFIED IDEOGRAPH + {0xA4EC, 0x6728}, //548 #CJK UNIFIED IDEOGRAPH + {0xA4ED, 0x6B20}, //549 #CJK UNIFIED IDEOGRAPH + {0xA4EE, 0x6B62}, //550 #CJK UNIFIED IDEOGRAPH + {0xA4EF, 0x6B79}, //551 #CJK UNIFIED IDEOGRAPH + {0xA4F0, 0x6BCB}, //552 #CJK UNIFIED IDEOGRAPH + {0xA4F1, 0x6BD4}, //553 #CJK UNIFIED IDEOGRAPH + {0xA4F2, 0x6BDB}, //554 #CJK UNIFIED IDEOGRAPH + {0xA4F3, 0x6C0F}, //555 #CJK UNIFIED IDEOGRAPH + {0xA4F4, 0x6C34}, //556 #CJK UNIFIED IDEOGRAPH + {0xA4F5, 0x706B}, //557 #CJK UNIFIED IDEOGRAPH + {0xA4F6, 0x722A}, //558 #CJK UNIFIED IDEOGRAPH + {0xA4F7, 0x7236}, //559 #CJK UNIFIED IDEOGRAPH + {0xA4F8, 0x723B}, //560 #CJK UNIFIED IDEOGRAPH + {0xA4F9, 0x7247}, //561 #CJK UNIFIED IDEOGRAPH + {0xA4FA, 0x7259}, //562 #CJK UNIFIED IDEOGRAPH + {0xA4FB, 0x725B}, //563 #CJK UNIFIED IDEOGRAPH + {0xA4FC, 0x72AC}, //564 #CJK UNIFIED IDEOGRAPH + {0xA4FD, 0x738B}, //565 #CJK UNIFIED IDEOGRAPH + {0xA4FE, 0x4E19}, //566 #CJK UNIFIED IDEOGRAPH + {0xA540, 0x4E16}, //567 #CJK UNIFIED IDEOGRAPH + {0xA541, 0x4E15}, //568 #CJK UNIFIED IDEOGRAPH + {0xA542, 0x4E14}, //569 #CJK UNIFIED IDEOGRAPH + {0xA543, 0x4E18}, //570 #CJK UNIFIED IDEOGRAPH + {0xA544, 0x4E3B}, //571 #CJK UNIFIED IDEOGRAPH + {0xA545, 0x4E4D}, //572 #CJK UNIFIED IDEOGRAPH + {0xA546, 0x4E4F}, //573 #CJK UNIFIED IDEOGRAPH + {0xA547, 0x4E4E}, //574 #CJK UNIFIED IDEOGRAPH + {0xA548, 0x4EE5}, //575 #CJK UNIFIED IDEOGRAPH + {0xA549, 0x4ED8}, //576 #CJK UNIFIED IDEOGRAPH + {0xA54A, 0x4ED4}, //577 #CJK UNIFIED IDEOGRAPH + {0xA54B, 0x4ED5}, //578 #CJK UNIFIED IDEOGRAPH + {0xA54C, 0x4ED6}, //579 #CJK UNIFIED IDEOGRAPH + {0xA54D, 0x4ED7}, //580 #CJK UNIFIED IDEOGRAPH + {0xA54E, 0x4EE3}, //581 #CJK UNIFIED IDEOGRAPH + {0xA54F, 0x4EE4}, //582 #CJK UNIFIED IDEOGRAPH + {0xA550, 0x4ED9}, //583 #CJK UNIFIED IDEOGRAPH + {0xA551, 0x4EDE}, //584 #CJK UNIFIED IDEOGRAPH + {0xA552, 0x5145}, //585 #CJK UNIFIED IDEOGRAPH + {0xA553, 0x5144}, //586 #CJK UNIFIED IDEOGRAPH + {0xA554, 0x5189}, //587 #CJK UNIFIED IDEOGRAPH + {0xA555, 0x518A}, //588 #CJK UNIFIED IDEOGRAPH + {0xA556, 0x51AC}, //589 #CJK UNIFIED IDEOGRAPH + {0xA557, 0x51F9}, //590 #CJK UNIFIED IDEOGRAPH + {0xA558, 0x51FA}, //591 #CJK UNIFIED IDEOGRAPH + {0xA559, 0x51F8}, //592 #CJK UNIFIED IDEOGRAPH + {0xA55A, 0x520A}, //593 #CJK UNIFIED IDEOGRAPH + {0xA55B, 0x52A0}, //594 #CJK UNIFIED IDEOGRAPH + {0xA55C, 0x529F}, //595 #CJK UNIFIED IDEOGRAPH + {0xA55D, 0x5305}, //596 #CJK UNIFIED IDEOGRAPH + {0xA55E, 0x5306}, //597 #CJK UNIFIED IDEOGRAPH + {0xA55F, 0x5317}, //598 #CJK UNIFIED IDEOGRAPH + {0xA560, 0x531D}, //599 #CJK UNIFIED IDEOGRAPH + {0xA561, 0x4EDF}, //600 #CJK UNIFIED IDEOGRAPH + {0xA562, 0x534A}, //601 #CJK UNIFIED IDEOGRAPH + {0xA563, 0x5349}, //602 #CJK UNIFIED IDEOGRAPH + {0xA564, 0x5361}, //603 #CJK UNIFIED IDEOGRAPH + {0xA565, 0x5360}, //604 #CJK UNIFIED IDEOGRAPH + {0xA566, 0x536F}, //605 #CJK UNIFIED IDEOGRAPH + {0xA567, 0x536E}, //606 #CJK UNIFIED IDEOGRAPH + {0xA568, 0x53BB}, //607 #CJK UNIFIED IDEOGRAPH + {0xA569, 0x53EF}, //608 #CJK UNIFIED IDEOGRAPH + {0xA56A, 0x53E4}, //609 #CJK UNIFIED IDEOGRAPH + {0xA56B, 0x53F3}, //610 #CJK UNIFIED IDEOGRAPH + {0xA56C, 0x53EC}, //611 #CJK UNIFIED IDEOGRAPH + {0xA56D, 0x53EE}, //612 #CJK UNIFIED IDEOGRAPH + {0xA56E, 0x53E9}, //613 #CJK UNIFIED IDEOGRAPH + {0xA56F, 0x53E8}, //614 #CJK UNIFIED IDEOGRAPH + {0xA570, 0x53FC}, //615 #CJK UNIFIED IDEOGRAPH + {0xA571, 0x53F8}, //616 #CJK UNIFIED IDEOGRAPH + {0xA572, 0x53F5}, //617 #CJK UNIFIED IDEOGRAPH + {0xA573, 0x53EB}, //618 #CJK UNIFIED IDEOGRAPH + {0xA574, 0x53E6}, //619 #CJK UNIFIED IDEOGRAPH + {0xA575, 0x53EA}, //620 #CJK UNIFIED IDEOGRAPH + {0xA576, 0x53F2}, //621 #CJK UNIFIED IDEOGRAPH + {0xA577, 0x53F1}, //622 #CJK UNIFIED IDEOGRAPH + {0xA578, 0x53F0}, //623 #CJK UNIFIED IDEOGRAPH + {0xA579, 0x53E5}, //624 #CJK UNIFIED IDEOGRAPH + {0xA57A, 0x53ED}, //625 #CJK UNIFIED IDEOGRAPH + {0xA57B, 0x53FB}, //626 #CJK UNIFIED IDEOGRAPH + {0xA57C, 0x56DB}, //627 #CJK UNIFIED IDEOGRAPH + {0xA57D, 0x56DA}, //628 #CJK UNIFIED IDEOGRAPH + {0xA57E, 0x5916}, //629 #CJK UNIFIED IDEOGRAPH + {0xA5A1, 0x592E}, //630 #CJK UNIFIED IDEOGRAPH + {0xA5A2, 0x5931}, //631 #CJK UNIFIED IDEOGRAPH + {0xA5A3, 0x5974}, //632 #CJK UNIFIED IDEOGRAPH + {0xA5A4, 0x5976}, //633 #CJK UNIFIED IDEOGRAPH + {0xA5A5, 0x5B55}, //634 #CJK UNIFIED IDEOGRAPH + {0xA5A6, 0x5B83}, //635 #CJK UNIFIED IDEOGRAPH + {0xA5A7, 0x5C3C}, //636 #CJK UNIFIED IDEOGRAPH + {0xA5A8, 0x5DE8}, //637 #CJK UNIFIED IDEOGRAPH + {0xA5A9, 0x5DE7}, //638 #CJK UNIFIED IDEOGRAPH + {0xA5AA, 0x5DE6}, //639 #CJK UNIFIED IDEOGRAPH + {0xA5AB, 0x5E02}, //640 #CJK UNIFIED IDEOGRAPH + {0xA5AC, 0x5E03}, //641 #CJK UNIFIED IDEOGRAPH + {0xA5AD, 0x5E73}, //642 #CJK UNIFIED IDEOGRAPH + {0xA5AE, 0x5E7C}, //643 #CJK UNIFIED IDEOGRAPH + {0xA5AF, 0x5F01}, //644 #CJK UNIFIED IDEOGRAPH + {0xA5B0, 0x5F18}, //645 #CJK UNIFIED IDEOGRAPH + {0xA5B1, 0x5F17}, //646 #CJK UNIFIED IDEOGRAPH + {0xA5B2, 0x5FC5}, //647 #CJK UNIFIED IDEOGRAPH + {0xA5B3, 0x620A}, //648 #CJK UNIFIED IDEOGRAPH + {0xA5B4, 0x6253}, //649 #CJK UNIFIED IDEOGRAPH + {0xA5B5, 0x6254}, //650 #CJK UNIFIED IDEOGRAPH + {0xA5B6, 0x6252}, //651 #CJK UNIFIED IDEOGRAPH + {0xA5B7, 0x6251}, //652 #CJK UNIFIED IDEOGRAPH + {0xA5B8, 0x65A5}, //653 #CJK UNIFIED IDEOGRAPH + {0xA5B9, 0x65E6}, //654 #CJK UNIFIED IDEOGRAPH + {0xA5BA, 0x672E}, //655 #CJK UNIFIED IDEOGRAPH + {0xA5BB, 0x672C}, //656 #CJK UNIFIED IDEOGRAPH + {0xA5BC, 0x672A}, //657 #CJK UNIFIED IDEOGRAPH + {0xA5BD, 0x672B}, //658 #CJK UNIFIED IDEOGRAPH + {0xA5BE, 0x672D}, //659 #CJK UNIFIED IDEOGRAPH + {0xA5BF, 0x6B63}, //660 #CJK UNIFIED IDEOGRAPH + {0xA5C0, 0x6BCD}, //661 #CJK UNIFIED IDEOGRAPH + {0xA5C1, 0x6C11}, //662 #CJK UNIFIED IDEOGRAPH + {0xA5C2, 0x6C10}, //663 #CJK UNIFIED IDEOGRAPH + {0xA5C3, 0x6C38}, //664 #CJK UNIFIED IDEOGRAPH + {0xA5C4, 0x6C41}, //665 #CJK UNIFIED IDEOGRAPH + {0xA5C5, 0x6C40}, //666 #CJK UNIFIED IDEOGRAPH + {0xA5C6, 0x6C3E}, //667 #CJK UNIFIED IDEOGRAPH + {0xA5C7, 0x72AF}, //668 #CJK UNIFIED IDEOGRAPH + {0xA5C8, 0x7384}, //669 #CJK UNIFIED IDEOGRAPH + {0xA5C9, 0x7389}, //670 #CJK UNIFIED IDEOGRAPH + {0xA5CA, 0x74DC}, //671 #CJK UNIFIED IDEOGRAPH + {0xA5CB, 0x74E6}, //672 #CJK UNIFIED IDEOGRAPH + {0xA5CC, 0x7518}, //673 #CJK UNIFIED IDEOGRAPH + {0xA5CD, 0x751F}, //674 #CJK UNIFIED IDEOGRAPH + {0xA5CE, 0x7528}, //675 #CJK UNIFIED IDEOGRAPH + {0xA5CF, 0x7529}, //676 #CJK UNIFIED IDEOGRAPH + {0xA5D0, 0x7530}, //677 #CJK UNIFIED IDEOGRAPH + {0xA5D1, 0x7531}, //678 #CJK UNIFIED IDEOGRAPH + {0xA5D2, 0x7532}, //679 #CJK UNIFIED IDEOGRAPH + {0xA5D3, 0x7533}, //680 #CJK UNIFIED IDEOGRAPH + {0xA5D4, 0x758B}, //681 #CJK UNIFIED IDEOGRAPH + {0xA5D5, 0x767D}, //682 #CJK UNIFIED IDEOGRAPH + {0xA5D6, 0x76AE}, //683 #CJK UNIFIED IDEOGRAPH + {0xA5D7, 0x76BF}, //684 #CJK UNIFIED IDEOGRAPH + {0xA5D8, 0x76EE}, //685 #CJK UNIFIED IDEOGRAPH + {0xA5D9, 0x77DB}, //686 #CJK UNIFIED IDEOGRAPH + {0xA5DA, 0x77E2}, //687 #CJK UNIFIED IDEOGRAPH + {0xA5DB, 0x77F3}, //688 #CJK UNIFIED IDEOGRAPH + {0xA5DC, 0x793A}, //689 #CJK UNIFIED IDEOGRAPH + {0xA5DD, 0x79BE}, //690 #CJK UNIFIED IDEOGRAPH + {0xA5DE, 0x7A74}, //691 #CJK UNIFIED IDEOGRAPH + {0xA5DF, 0x7ACB}, //692 #CJK UNIFIED IDEOGRAPH + {0xA5E0, 0x4E1E}, //693 #CJK UNIFIED IDEOGRAPH + {0xA5E1, 0x4E1F}, //694 #CJK UNIFIED IDEOGRAPH + {0xA5E2, 0x4E52}, //695 #CJK UNIFIED IDEOGRAPH + {0xA5E3, 0x4E53}, //696 #CJK UNIFIED IDEOGRAPH + {0xA5E4, 0x4E69}, //697 #CJK UNIFIED IDEOGRAPH + {0xA5E5, 0x4E99}, //698 #CJK UNIFIED IDEOGRAPH + {0xA5E6, 0x4EA4}, //699 #CJK UNIFIED IDEOGRAPH + {0xA5E7, 0x4EA6}, //700 #CJK UNIFIED IDEOGRAPH + {0xA5E8, 0x4EA5}, //701 #CJK UNIFIED IDEOGRAPH + {0xA5E9, 0x4EFF}, //702 #CJK UNIFIED IDEOGRAPH + {0xA5EA, 0x4F09}, //703 #CJK UNIFIED IDEOGRAPH + {0xA5EB, 0x4F19}, //704 #CJK UNIFIED IDEOGRAPH + {0xA5EC, 0x4F0A}, //705 #CJK UNIFIED IDEOGRAPH + {0xA5ED, 0x4F15}, //706 #CJK UNIFIED IDEOGRAPH + {0xA5EE, 0x4F0D}, //707 #CJK UNIFIED IDEOGRAPH + {0xA5EF, 0x4F10}, //708 #CJK UNIFIED IDEOGRAPH + {0xA5F0, 0x4F11}, //709 #CJK UNIFIED IDEOGRAPH + {0xA5F1, 0x4F0F}, //710 #CJK UNIFIED IDEOGRAPH + {0xA5F2, 0x4EF2}, //711 #CJK UNIFIED IDEOGRAPH + {0xA5F3, 0x4EF6}, //712 #CJK UNIFIED IDEOGRAPH + {0xA5F4, 0x4EFB}, //713 #CJK UNIFIED IDEOGRAPH + {0xA5F5, 0x4EF0}, //714 #CJK UNIFIED IDEOGRAPH + {0xA5F6, 0x4EF3}, //715 #CJK UNIFIED IDEOGRAPH + {0xA5F7, 0x4EFD}, //716 #CJK UNIFIED IDEOGRAPH + {0xA5F8, 0x4F01}, //717 #CJK UNIFIED IDEOGRAPH + {0xA5F9, 0x4F0B}, //718 #CJK UNIFIED IDEOGRAPH + {0xA5FA, 0x5149}, //719 #CJK UNIFIED IDEOGRAPH + {0xA5FB, 0x5147}, //720 #CJK UNIFIED IDEOGRAPH + {0xA5FC, 0x5146}, //721 #CJK UNIFIED IDEOGRAPH + {0xA5FD, 0x5148}, //722 #CJK UNIFIED IDEOGRAPH + {0xA5FE, 0x5168}, //723 #CJK UNIFIED IDEOGRAPH + {0xA640, 0x5171}, //724 #CJK UNIFIED IDEOGRAPH + {0xA641, 0x518D}, //725 #CJK UNIFIED IDEOGRAPH + {0xA642, 0x51B0}, //726 #CJK UNIFIED IDEOGRAPH + {0xA643, 0x5217}, //727 #CJK UNIFIED IDEOGRAPH + {0xA644, 0x5211}, //728 #CJK UNIFIED IDEOGRAPH + {0xA645, 0x5212}, //729 #CJK UNIFIED IDEOGRAPH + {0xA646, 0x520E}, //730 #CJK UNIFIED IDEOGRAPH + {0xA647, 0x5216}, //731 #CJK UNIFIED IDEOGRAPH + {0xA648, 0x52A3}, //732 #CJK UNIFIED IDEOGRAPH + {0xA649, 0x5308}, //733 #CJK UNIFIED IDEOGRAPH + {0xA64A, 0x5321}, //734 #CJK UNIFIED IDEOGRAPH + {0xA64B, 0x5320}, //735 #CJK UNIFIED IDEOGRAPH + {0xA64C, 0x5370}, //736 #CJK UNIFIED IDEOGRAPH + {0xA64D, 0x5371}, //737 #CJK UNIFIED IDEOGRAPH + {0xA64E, 0x5409}, //738 #CJK UNIFIED IDEOGRAPH + {0xA64F, 0x540F}, //739 #CJK UNIFIED IDEOGRAPH + {0xA650, 0x540C}, //740 #CJK UNIFIED IDEOGRAPH + {0xA651, 0x540A}, //741 #CJK UNIFIED IDEOGRAPH + {0xA652, 0x5410}, //742 #CJK UNIFIED IDEOGRAPH + {0xA653, 0x5401}, //743 #CJK UNIFIED IDEOGRAPH + {0xA654, 0x540B}, //744 #CJK UNIFIED IDEOGRAPH + {0xA655, 0x5404}, //745 #CJK UNIFIED IDEOGRAPH + {0xA656, 0x5411}, //746 #CJK UNIFIED IDEOGRAPH + {0xA657, 0x540D}, //747 #CJK UNIFIED IDEOGRAPH + {0xA658, 0x5408}, //748 #CJK UNIFIED IDEOGRAPH + {0xA659, 0x5403}, //749 #CJK UNIFIED IDEOGRAPH + {0xA65A, 0x540E}, //750 #CJK UNIFIED IDEOGRAPH + {0xA65B, 0x5406}, //751 #CJK UNIFIED IDEOGRAPH + {0xA65C, 0x5412}, //752 #CJK UNIFIED IDEOGRAPH + {0xA65D, 0x56E0}, //753 #CJK UNIFIED IDEOGRAPH + {0xA65E, 0x56DE}, //754 #CJK UNIFIED IDEOGRAPH + {0xA65F, 0x56DD}, //755 #CJK UNIFIED IDEOGRAPH + {0xA660, 0x5733}, //756 #CJK UNIFIED IDEOGRAPH + {0xA661, 0x5730}, //757 #CJK UNIFIED IDEOGRAPH + {0xA662, 0x5728}, //758 #CJK UNIFIED IDEOGRAPH + {0xA663, 0x572D}, //759 #CJK UNIFIED IDEOGRAPH + {0xA664, 0x572C}, //760 #CJK UNIFIED IDEOGRAPH + {0xA665, 0x572F}, //761 #CJK UNIFIED IDEOGRAPH + {0xA666, 0x5729}, //762 #CJK UNIFIED IDEOGRAPH + {0xA667, 0x5919}, //763 #CJK UNIFIED IDEOGRAPH + {0xA668, 0x591A}, //764 #CJK UNIFIED IDEOGRAPH + {0xA669, 0x5937}, //765 #CJK UNIFIED IDEOGRAPH + {0xA66A, 0x5938}, //766 #CJK UNIFIED IDEOGRAPH + {0xA66B, 0x5984}, //767 #CJK UNIFIED IDEOGRAPH + {0xA66C, 0x5978}, //768 #CJK UNIFIED IDEOGRAPH + {0xA66D, 0x5983}, //769 #CJK UNIFIED IDEOGRAPH + {0xA66E, 0x597D}, //770 #CJK UNIFIED IDEOGRAPH + {0xA66F, 0x5979}, //771 #CJK UNIFIED IDEOGRAPH + {0xA670, 0x5982}, //772 #CJK UNIFIED IDEOGRAPH + {0xA671, 0x5981}, //773 #CJK UNIFIED IDEOGRAPH + {0xA672, 0x5B57}, //774 #CJK UNIFIED IDEOGRAPH + {0xA673, 0x5B58}, //775 #CJK UNIFIED IDEOGRAPH + {0xA674, 0x5B87}, //776 #CJK UNIFIED IDEOGRAPH + {0xA675, 0x5B88}, //777 #CJK UNIFIED IDEOGRAPH + {0xA676, 0x5B85}, //778 #CJK UNIFIED IDEOGRAPH + {0xA677, 0x5B89}, //779 #CJK UNIFIED IDEOGRAPH + {0xA678, 0x5BFA}, //780 #CJK UNIFIED IDEOGRAPH + {0xA679, 0x5C16}, //781 #CJK UNIFIED IDEOGRAPH + {0xA67A, 0x5C79}, //782 #CJK UNIFIED IDEOGRAPH + {0xA67B, 0x5DDE}, //783 #CJK UNIFIED IDEOGRAPH + {0xA67C, 0x5E06}, //784 #CJK UNIFIED IDEOGRAPH + {0xA67D, 0x5E76}, //785 #CJK UNIFIED IDEOGRAPH + {0xA67E, 0x5E74}, //786 #CJK UNIFIED IDEOGRAPH + {0xA6A1, 0x5F0F}, //787 #CJK UNIFIED IDEOGRAPH + {0xA6A2, 0x5F1B}, //788 #CJK UNIFIED IDEOGRAPH + {0xA6A3, 0x5FD9}, //789 #CJK UNIFIED IDEOGRAPH + {0xA6A4, 0x5FD6}, //790 #CJK UNIFIED IDEOGRAPH + {0xA6A5, 0x620E}, //791 #CJK UNIFIED IDEOGRAPH + {0xA6A6, 0x620C}, //792 #CJK UNIFIED IDEOGRAPH + {0xA6A7, 0x620D}, //793 #CJK UNIFIED IDEOGRAPH + {0xA6A8, 0x6210}, //794 #CJK UNIFIED IDEOGRAPH + {0xA6A9, 0x6263}, //795 #CJK UNIFIED IDEOGRAPH + {0xA6AA, 0x625B}, //796 #CJK UNIFIED IDEOGRAPH + {0xA6AB, 0x6258}, //797 #CJK UNIFIED IDEOGRAPH + {0xA6AC, 0x6536}, //798 #CJK UNIFIED IDEOGRAPH + {0xA6AD, 0x65E9}, //799 #CJK UNIFIED IDEOGRAPH + {0xA6AE, 0x65E8}, //800 #CJK UNIFIED IDEOGRAPH + {0xA6AF, 0x65EC}, //801 #CJK UNIFIED IDEOGRAPH + {0xA6B0, 0x65ED}, //802 #CJK UNIFIED IDEOGRAPH + {0xA6B1, 0x66F2}, //803 #CJK UNIFIED IDEOGRAPH + {0xA6B2, 0x66F3}, //804 #CJK UNIFIED IDEOGRAPH + {0xA6B3, 0x6709}, //805 #CJK UNIFIED IDEOGRAPH + {0xA6B4, 0x673D}, //806 #CJK UNIFIED IDEOGRAPH + {0xA6B5, 0x6734}, //807 #CJK UNIFIED IDEOGRAPH + {0xA6B6, 0x6731}, //808 #CJK UNIFIED IDEOGRAPH + {0xA6B7, 0x6735}, //809 #CJK UNIFIED IDEOGRAPH + {0xA6B8, 0x6B21}, //810 #CJK UNIFIED IDEOGRAPH + {0xA6B9, 0x6B64}, //811 #CJK UNIFIED IDEOGRAPH + {0xA6BA, 0x6B7B}, //812 #CJK UNIFIED IDEOGRAPH + {0xA6BB, 0x6C16}, //813 #CJK UNIFIED IDEOGRAPH + {0xA6BC, 0x6C5D}, //814 #CJK UNIFIED IDEOGRAPH + {0xA6BD, 0x6C57}, //815 #CJK UNIFIED IDEOGRAPH + {0xA6BE, 0x6C59}, //816 #CJK UNIFIED IDEOGRAPH + {0xA6BF, 0x6C5F}, //817 #CJK UNIFIED IDEOGRAPH + {0xA6C0, 0x6C60}, //818 #CJK UNIFIED IDEOGRAPH + {0xA6C1, 0x6C50}, //819 #CJK UNIFIED IDEOGRAPH + {0xA6C2, 0x6C55}, //820 #CJK UNIFIED IDEOGRAPH + {0xA6C3, 0x6C61}, //821 #CJK UNIFIED IDEOGRAPH + {0xA6C4, 0x6C5B}, //822 #CJK UNIFIED IDEOGRAPH + {0xA6C5, 0x6C4D}, //823 #CJK UNIFIED IDEOGRAPH + {0xA6C6, 0x6C4E}, //824 #CJK UNIFIED IDEOGRAPH + {0xA6C7, 0x7070}, //825 #CJK UNIFIED IDEOGRAPH + {0xA6C8, 0x725F}, //826 #CJK UNIFIED IDEOGRAPH + {0xA6C9, 0x725D}, //827 #CJK UNIFIED IDEOGRAPH + {0xA6CA, 0x767E}, //828 #CJK UNIFIED IDEOGRAPH + {0xA6CB, 0x7AF9}, //829 #CJK UNIFIED IDEOGRAPH + {0xA6CC, 0x7C73}, //830 #CJK UNIFIED IDEOGRAPH + {0xA6CD, 0x7CF8}, //831 #CJK UNIFIED IDEOGRAPH + {0xA6CE, 0x7F36}, //832 #CJK UNIFIED IDEOGRAPH + {0xA6CF, 0x7F8A}, //833 #CJK UNIFIED IDEOGRAPH + {0xA6D0, 0x7FBD}, //834 #CJK UNIFIED IDEOGRAPH + {0xA6D1, 0x8001}, //835 #CJK UNIFIED IDEOGRAPH + {0xA6D2, 0x8003}, //836 #CJK UNIFIED IDEOGRAPH + {0xA6D3, 0x800C}, //837 #CJK UNIFIED IDEOGRAPH + {0xA6D4, 0x8012}, //838 #CJK UNIFIED IDEOGRAPH + {0xA6D5, 0x8033}, //839 #CJK UNIFIED IDEOGRAPH + {0xA6D6, 0x807F}, //840 #CJK UNIFIED IDEOGRAPH + {0xA6D7, 0x8089}, //841 #CJK UNIFIED IDEOGRAPH + {0xA6D8, 0x808B}, //842 #CJK UNIFIED IDEOGRAPH + {0xA6D9, 0x808C}, //843 #CJK UNIFIED IDEOGRAPH + {0xA6DA, 0x81E3}, //844 #CJK UNIFIED IDEOGRAPH + {0xA6DB, 0x81EA}, //845 #CJK UNIFIED IDEOGRAPH + {0xA6DC, 0x81F3}, //846 #CJK UNIFIED IDEOGRAPH + {0xA6DD, 0x81FC}, //847 #CJK UNIFIED IDEOGRAPH + {0xA6DE, 0x820C}, //848 #CJK UNIFIED IDEOGRAPH + {0xA6DF, 0x821B}, //849 #CJK UNIFIED IDEOGRAPH + {0xA6E0, 0x821F}, //850 #CJK UNIFIED IDEOGRAPH + {0xA6E1, 0x826E}, //851 #CJK UNIFIED IDEOGRAPH + {0xA6E2, 0x8272}, //852 #CJK UNIFIED IDEOGRAPH + {0xA6E3, 0x827E}, //853 #CJK UNIFIED IDEOGRAPH + {0xA6E4, 0x866B}, //854 #CJK UNIFIED IDEOGRAPH + {0xA6E5, 0x8840}, //855 #CJK UNIFIED IDEOGRAPH + {0xA6E6, 0x884C}, //856 #CJK UNIFIED IDEOGRAPH + {0xA6E7, 0x8863}, //857 #CJK UNIFIED IDEOGRAPH + {0xA6E8, 0x897F}, //858 #CJK UNIFIED IDEOGRAPH + {0xA6E9, 0x9621}, //859 #CJK UNIFIED IDEOGRAPH + {0xA6EA, 0x4E32}, //860 #CJK UNIFIED IDEOGRAPH + {0xA6EB, 0x4EA8}, //861 #CJK UNIFIED IDEOGRAPH + {0xA6EC, 0x4F4D}, //862 #CJK UNIFIED IDEOGRAPH + {0xA6ED, 0x4F4F}, //863 #CJK UNIFIED IDEOGRAPH + {0xA6EE, 0x4F47}, //864 #CJK UNIFIED IDEOGRAPH + {0xA6EF, 0x4F57}, //865 #CJK UNIFIED IDEOGRAPH + {0xA6F0, 0x4F5E}, //866 #CJK UNIFIED IDEOGRAPH + {0xA6F1, 0x4F34}, //867 #CJK UNIFIED IDEOGRAPH + {0xA6F2, 0x4F5B}, //868 #CJK UNIFIED IDEOGRAPH + {0xA6F3, 0x4F55}, //869 #CJK UNIFIED IDEOGRAPH + {0xA6F4, 0x4F30}, //870 #CJK UNIFIED IDEOGRAPH + {0xA6F5, 0x4F50}, //871 #CJK UNIFIED IDEOGRAPH + {0xA6F6, 0x4F51}, //872 #CJK UNIFIED IDEOGRAPH + {0xA6F7, 0x4F3D}, //873 #CJK UNIFIED IDEOGRAPH + {0xA6F8, 0x4F3A}, //874 #CJK UNIFIED IDEOGRAPH + {0xA6F9, 0x4F38}, //875 #CJK UNIFIED IDEOGRAPH + {0xA6FA, 0x4F43}, //876 #CJK UNIFIED IDEOGRAPH + {0xA6FB, 0x4F54}, //877 #CJK UNIFIED IDEOGRAPH + {0xA6FC, 0x4F3C}, //878 #CJK UNIFIED IDEOGRAPH + {0xA6FD, 0x4F46}, //879 #CJK UNIFIED IDEOGRAPH + {0xA6FE, 0x4F63}, //880 #CJK UNIFIED IDEOGRAPH + {0xA740, 0x4F5C}, //881 #CJK UNIFIED IDEOGRAPH + {0xA741, 0x4F60}, //882 #CJK UNIFIED IDEOGRAPH + {0xA742, 0x4F2F}, //883 #CJK UNIFIED IDEOGRAPH + {0xA743, 0x4F4E}, //884 #CJK UNIFIED IDEOGRAPH + {0xA744, 0x4F36}, //885 #CJK UNIFIED IDEOGRAPH + {0xA745, 0x4F59}, //886 #CJK UNIFIED IDEOGRAPH + {0xA746, 0x4F5D}, //887 #CJK UNIFIED IDEOGRAPH + {0xA747, 0x4F48}, //888 #CJK UNIFIED IDEOGRAPH + {0xA748, 0x4F5A}, //889 #CJK UNIFIED IDEOGRAPH + {0xA749, 0x514C}, //890 #CJK UNIFIED IDEOGRAPH + {0xA74A, 0x514B}, //891 #CJK UNIFIED IDEOGRAPH + {0xA74B, 0x514D}, //892 #CJK UNIFIED IDEOGRAPH + {0xA74C, 0x5175}, //893 #CJK UNIFIED IDEOGRAPH + {0xA74D, 0x51B6}, //894 #CJK UNIFIED IDEOGRAPH + {0xA74E, 0x51B7}, //895 #CJK UNIFIED IDEOGRAPH + {0xA74F, 0x5225}, //896 #CJK UNIFIED IDEOGRAPH + {0xA750, 0x5224}, //897 #CJK UNIFIED IDEOGRAPH + {0xA751, 0x5229}, //898 #CJK UNIFIED IDEOGRAPH + {0xA752, 0x522A}, //899 #CJK UNIFIED IDEOGRAPH + {0xA753, 0x5228}, //900 #CJK UNIFIED IDEOGRAPH + {0xA754, 0x52AB}, //901 #CJK UNIFIED IDEOGRAPH + {0xA755, 0x52A9}, //902 #CJK UNIFIED IDEOGRAPH + {0xA756, 0x52AA}, //903 #CJK UNIFIED IDEOGRAPH + {0xA757, 0x52AC}, //904 #CJK UNIFIED IDEOGRAPH + {0xA758, 0x5323}, //905 #CJK UNIFIED IDEOGRAPH + {0xA759, 0x5373}, //906 #CJK UNIFIED IDEOGRAPH + {0xA75A, 0x5375}, //907 #CJK UNIFIED IDEOGRAPH + {0xA75B, 0x541D}, //908 #CJK UNIFIED IDEOGRAPH + {0xA75C, 0x542D}, //909 #CJK UNIFIED IDEOGRAPH + {0xA75D, 0x541E}, //910 #CJK UNIFIED IDEOGRAPH + {0xA75E, 0x543E}, //911 #CJK UNIFIED IDEOGRAPH + {0xA75F, 0x5426}, //912 #CJK UNIFIED IDEOGRAPH + {0xA760, 0x544E}, //913 #CJK UNIFIED IDEOGRAPH + {0xA761, 0x5427}, //914 #CJK UNIFIED IDEOGRAPH + {0xA762, 0x5446}, //915 #CJK UNIFIED IDEOGRAPH + {0xA763, 0x5443}, //916 #CJK UNIFIED IDEOGRAPH + {0xA764, 0x5433}, //917 #CJK UNIFIED IDEOGRAPH + {0xA765, 0x5448}, //918 #CJK UNIFIED IDEOGRAPH + {0xA766, 0x5442}, //919 #CJK UNIFIED IDEOGRAPH + {0xA767, 0x541B}, //920 #CJK UNIFIED IDEOGRAPH + {0xA768, 0x5429}, //921 #CJK UNIFIED IDEOGRAPH + {0xA769, 0x544A}, //922 #CJK UNIFIED IDEOGRAPH + {0xA76A, 0x5439}, //923 #CJK UNIFIED IDEOGRAPH + {0xA76B, 0x543B}, //924 #CJK UNIFIED IDEOGRAPH + {0xA76C, 0x5438}, //925 #CJK UNIFIED IDEOGRAPH + {0xA76D, 0x542E}, //926 #CJK UNIFIED IDEOGRAPH + {0xA76E, 0x5435}, //927 #CJK UNIFIED IDEOGRAPH + {0xA76F, 0x5436}, //928 #CJK UNIFIED IDEOGRAPH + {0xA770, 0x5420}, //929 #CJK UNIFIED IDEOGRAPH + {0xA771, 0x543C}, //930 #CJK UNIFIED IDEOGRAPH + {0xA772, 0x5440}, //931 #CJK UNIFIED IDEOGRAPH + {0xA773, 0x5431}, //932 #CJK UNIFIED IDEOGRAPH + {0xA774, 0x542B}, //933 #CJK UNIFIED IDEOGRAPH + {0xA775, 0x541F}, //934 #CJK UNIFIED IDEOGRAPH + {0xA776, 0x542C}, //935 #CJK UNIFIED IDEOGRAPH + {0xA777, 0x56EA}, //936 #CJK UNIFIED IDEOGRAPH + {0xA778, 0x56F0}, //937 #CJK UNIFIED IDEOGRAPH + {0xA779, 0x56E4}, //938 #CJK UNIFIED IDEOGRAPH + {0xA77A, 0x56EB}, //939 #CJK UNIFIED IDEOGRAPH + {0xA77B, 0x574A}, //940 #CJK UNIFIED IDEOGRAPH + {0xA77C, 0x5751}, //941 #CJK UNIFIED IDEOGRAPH + {0xA77D, 0x5740}, //942 #CJK UNIFIED IDEOGRAPH + {0xA77E, 0x574D}, //943 #CJK UNIFIED IDEOGRAPH + {0xA7A1, 0x5747}, //944 #CJK UNIFIED IDEOGRAPH + {0xA7A2, 0x574E}, //945 #CJK UNIFIED IDEOGRAPH + {0xA7A3, 0x573E}, //946 #CJK UNIFIED IDEOGRAPH + {0xA7A4, 0x5750}, //947 #CJK UNIFIED IDEOGRAPH + {0xA7A5, 0x574F}, //948 #CJK UNIFIED IDEOGRAPH + {0xA7A6, 0x573B}, //949 #CJK UNIFIED IDEOGRAPH + {0xA7A7, 0x58EF}, //950 #CJK UNIFIED IDEOGRAPH + {0xA7A8, 0x593E}, //951 #CJK UNIFIED IDEOGRAPH + {0xA7A9, 0x599D}, //952 #CJK UNIFIED IDEOGRAPH + {0xA7AA, 0x5992}, //953 #CJK UNIFIED IDEOGRAPH + {0xA7AB, 0x59A8}, //954 #CJK UNIFIED IDEOGRAPH + {0xA7AC, 0x599E}, //955 #CJK UNIFIED IDEOGRAPH + {0xA7AD, 0x59A3}, //956 #CJK UNIFIED IDEOGRAPH + {0xA7AE, 0x5999}, //957 #CJK UNIFIED IDEOGRAPH + {0xA7AF, 0x5996}, //958 #CJK UNIFIED IDEOGRAPH + {0xA7B0, 0x598D}, //959 #CJK UNIFIED IDEOGRAPH + {0xA7B1, 0x59A4}, //960 #CJK UNIFIED IDEOGRAPH + {0xA7B2, 0x5993}, //961 #CJK UNIFIED IDEOGRAPH + {0xA7B3, 0x598A}, //962 #CJK UNIFIED IDEOGRAPH + {0xA7B4, 0x59A5}, //963 #CJK UNIFIED IDEOGRAPH + {0xA7B5, 0x5B5D}, //964 #CJK UNIFIED IDEOGRAPH + {0xA7B6, 0x5B5C}, //965 #CJK UNIFIED IDEOGRAPH + {0xA7B7, 0x5B5A}, //966 #CJK UNIFIED IDEOGRAPH + {0xA7B8, 0x5B5B}, //967 #CJK UNIFIED IDEOGRAPH + {0xA7B9, 0x5B8C}, //968 #CJK UNIFIED IDEOGRAPH + {0xA7BA, 0x5B8B}, //969 #CJK UNIFIED IDEOGRAPH + {0xA7BB, 0x5B8F}, //970 #CJK UNIFIED IDEOGRAPH + {0xA7BC, 0x5C2C}, //971 #CJK UNIFIED IDEOGRAPH + {0xA7BD, 0x5C40}, //972 #CJK UNIFIED IDEOGRAPH + {0xA7BE, 0x5C41}, //973 #CJK UNIFIED IDEOGRAPH + {0xA7BF, 0x5C3F}, //974 #CJK UNIFIED IDEOGRAPH + {0xA7C0, 0x5C3E}, //975 #CJK UNIFIED IDEOGRAPH + {0xA7C1, 0x5C90}, //976 #CJK UNIFIED IDEOGRAPH + {0xA7C2, 0x5C91}, //977 #CJK UNIFIED IDEOGRAPH + {0xA7C3, 0x5C94}, //978 #CJK UNIFIED IDEOGRAPH + {0xA7C4, 0x5C8C}, //979 #CJK UNIFIED IDEOGRAPH + {0xA7C5, 0x5DEB}, //980 #CJK UNIFIED IDEOGRAPH + {0xA7C6, 0x5E0C}, //981 #CJK UNIFIED IDEOGRAPH + {0xA7C7, 0x5E8F}, //982 #CJK UNIFIED IDEOGRAPH + {0xA7C8, 0x5E87}, //983 #CJK UNIFIED IDEOGRAPH + {0xA7C9, 0x5E8A}, //984 #CJK UNIFIED IDEOGRAPH + {0xA7CA, 0x5EF7}, //985 #CJK UNIFIED IDEOGRAPH + {0xA7CB, 0x5F04}, //986 #CJK UNIFIED IDEOGRAPH + {0xA7CC, 0x5F1F}, //987 #CJK UNIFIED IDEOGRAPH + {0xA7CD, 0x5F64}, //988 #CJK UNIFIED IDEOGRAPH + {0xA7CE, 0x5F62}, //989 #CJK UNIFIED IDEOGRAPH + {0xA7CF, 0x5F77}, //990 #CJK UNIFIED IDEOGRAPH + {0xA7D0, 0x5F79}, //991 #CJK UNIFIED IDEOGRAPH + {0xA7D1, 0x5FD8}, //992 #CJK UNIFIED IDEOGRAPH + {0xA7D2, 0x5FCC}, //993 #CJK UNIFIED IDEOGRAPH + {0xA7D3, 0x5FD7}, //994 #CJK UNIFIED IDEOGRAPH + {0xA7D4, 0x5FCD}, //995 #CJK UNIFIED IDEOGRAPH + {0xA7D5, 0x5FF1}, //996 #CJK UNIFIED IDEOGRAPH + {0xA7D6, 0x5FEB}, //997 #CJK UNIFIED IDEOGRAPH + {0xA7D7, 0x5FF8}, //998 #CJK UNIFIED IDEOGRAPH + {0xA7D8, 0x5FEA}, //999 #CJK UNIFIED IDEOGRAPH + {0xA7D9, 0x6212}, //1000 #CJK UNIFIED IDEOGRAPH + {0xA7DA, 0x6211}, //1001 #CJK UNIFIED IDEOGRAPH + {0xA7DB, 0x6284}, //1002 #CJK UNIFIED IDEOGRAPH + {0xA7DC, 0x6297}, //1003 #CJK UNIFIED IDEOGRAPH + {0xA7DD, 0x6296}, //1004 #CJK UNIFIED IDEOGRAPH + {0xA7DE, 0x6280}, //1005 #CJK UNIFIED IDEOGRAPH + {0xA7DF, 0x6276}, //1006 #CJK UNIFIED IDEOGRAPH + {0xA7E0, 0x6289}, //1007 #CJK UNIFIED IDEOGRAPH + {0xA7E1, 0x626D}, //1008 #CJK UNIFIED IDEOGRAPH + {0xA7E2, 0x628A}, //1009 #CJK UNIFIED IDEOGRAPH + {0xA7E3, 0x627C}, //1010 #CJK UNIFIED IDEOGRAPH + {0xA7E4, 0x627E}, //1011 #CJK UNIFIED IDEOGRAPH + {0xA7E5, 0x6279}, //1012 #CJK UNIFIED IDEOGRAPH + {0xA7E6, 0x6273}, //1013 #CJK UNIFIED IDEOGRAPH + {0xA7E7, 0x6292}, //1014 #CJK UNIFIED IDEOGRAPH + {0xA7E8, 0x626F}, //1015 #CJK UNIFIED IDEOGRAPH + {0xA7E9, 0x6298}, //1016 #CJK UNIFIED IDEOGRAPH + {0xA7EA, 0x626E}, //1017 #CJK UNIFIED IDEOGRAPH + {0xA7EB, 0x6295}, //1018 #CJK UNIFIED IDEOGRAPH + {0xA7EC, 0x6293}, //1019 #CJK UNIFIED IDEOGRAPH + {0xA7ED, 0x6291}, //1020 #CJK UNIFIED IDEOGRAPH + {0xA7EE, 0x6286}, //1021 #CJK UNIFIED IDEOGRAPH + {0xA7EF, 0x6539}, //1022 #CJK UNIFIED IDEOGRAPH + {0xA7F0, 0x653B}, //1023 #CJK UNIFIED IDEOGRAPH + {0xA7F1, 0x6538}, //1024 #CJK UNIFIED IDEOGRAPH + {0xA7F2, 0x65F1}, //1025 #CJK UNIFIED IDEOGRAPH + {0xA7F3, 0x66F4}, //1026 #CJK UNIFIED IDEOGRAPH + {0xA7F4, 0x675F}, //1027 #CJK UNIFIED IDEOGRAPH + {0xA7F5, 0x674E}, //1028 #CJK UNIFIED IDEOGRAPH + {0xA7F6, 0x674F}, //1029 #CJK UNIFIED IDEOGRAPH + {0xA7F7, 0x6750}, //1030 #CJK UNIFIED IDEOGRAPH + {0xA7F8, 0x6751}, //1031 #CJK UNIFIED IDEOGRAPH + {0xA7F9, 0x675C}, //1032 #CJK UNIFIED IDEOGRAPH + {0xA7FA, 0x6756}, //1033 #CJK UNIFIED IDEOGRAPH + {0xA7FB, 0x675E}, //1034 #CJK UNIFIED IDEOGRAPH + {0xA7FC, 0x6749}, //1035 #CJK UNIFIED IDEOGRAPH + {0xA7FD, 0x6746}, //1036 #CJK UNIFIED IDEOGRAPH + {0xA7FE, 0x6760}, //1037 #CJK UNIFIED IDEOGRAPH + {0xA840, 0x6753}, //1038 #CJK UNIFIED IDEOGRAPH + {0xA841, 0x6757}, //1039 #CJK UNIFIED IDEOGRAPH + {0xA842, 0x6B65}, //1040 #CJK UNIFIED IDEOGRAPH + {0xA843, 0x6BCF}, //1041 #CJK UNIFIED IDEOGRAPH + {0xA844, 0x6C42}, //1042 #CJK UNIFIED IDEOGRAPH + {0xA845, 0x6C5E}, //1043 #CJK UNIFIED IDEOGRAPH + {0xA846, 0x6C99}, //1044 #CJK UNIFIED IDEOGRAPH + {0xA847, 0x6C81}, //1045 #CJK UNIFIED IDEOGRAPH + {0xA848, 0x6C88}, //1046 #CJK UNIFIED IDEOGRAPH + {0xA849, 0x6C89}, //1047 #CJK UNIFIED IDEOGRAPH + {0xA84A, 0x6C85}, //1048 #CJK UNIFIED IDEOGRAPH + {0xA84B, 0x6C9B}, //1049 #CJK UNIFIED IDEOGRAPH + {0xA84C, 0x6C6A}, //1050 #CJK UNIFIED IDEOGRAPH + {0xA84D, 0x6C7A}, //1051 #CJK UNIFIED IDEOGRAPH + {0xA84E, 0x6C90}, //1052 #CJK UNIFIED IDEOGRAPH + {0xA84F, 0x6C70}, //1053 #CJK UNIFIED IDEOGRAPH + {0xA850, 0x6C8C}, //1054 #CJK UNIFIED IDEOGRAPH + {0xA851, 0x6C68}, //1055 #CJK UNIFIED IDEOGRAPH + {0xA852, 0x6C96}, //1056 #CJK UNIFIED IDEOGRAPH + {0xA853, 0x6C92}, //1057 #CJK UNIFIED IDEOGRAPH + {0xA854, 0x6C7D}, //1058 #CJK UNIFIED IDEOGRAPH + {0xA855, 0x6C83}, //1059 #CJK UNIFIED IDEOGRAPH + {0xA856, 0x6C72}, //1060 #CJK UNIFIED IDEOGRAPH + {0xA857, 0x6C7E}, //1061 #CJK UNIFIED IDEOGRAPH + {0xA858, 0x6C74}, //1062 #CJK UNIFIED IDEOGRAPH + {0xA859, 0x6C86}, //1063 #CJK UNIFIED IDEOGRAPH + {0xA85A, 0x6C76}, //1064 #CJK UNIFIED IDEOGRAPH + {0xA85B, 0x6C8D}, //1065 #CJK UNIFIED IDEOGRAPH + {0xA85C, 0x6C94}, //1066 #CJK UNIFIED IDEOGRAPH + {0xA85D, 0x6C98}, //1067 #CJK UNIFIED IDEOGRAPH + {0xA85E, 0x6C82}, //1068 #CJK UNIFIED IDEOGRAPH + {0xA85F, 0x7076}, //1069 #CJK UNIFIED IDEOGRAPH + {0xA860, 0x707C}, //1070 #CJK UNIFIED IDEOGRAPH + {0xA861, 0x707D}, //1071 #CJK UNIFIED IDEOGRAPH + {0xA862, 0x7078}, //1072 #CJK UNIFIED IDEOGRAPH + {0xA863, 0x7262}, //1073 #CJK UNIFIED IDEOGRAPH + {0xA864, 0x7261}, //1074 #CJK UNIFIED IDEOGRAPH + {0xA865, 0x7260}, //1075 #CJK UNIFIED IDEOGRAPH + {0xA866, 0x72C4}, //1076 #CJK UNIFIED IDEOGRAPH + {0xA867, 0x72C2}, //1077 #CJK UNIFIED IDEOGRAPH + {0xA868, 0x7396}, //1078 #CJK UNIFIED IDEOGRAPH + {0xA869, 0x752C}, //1079 #CJK UNIFIED IDEOGRAPH + {0xA86A, 0x752B}, //1080 #CJK UNIFIED IDEOGRAPH + {0xA86B, 0x7537}, //1081 #CJK UNIFIED IDEOGRAPH + {0xA86C, 0x7538}, //1082 #CJK UNIFIED IDEOGRAPH + {0xA86D, 0x7682}, //1083 #CJK UNIFIED IDEOGRAPH + {0xA86E, 0x76EF}, //1084 #CJK UNIFIED IDEOGRAPH + {0xA86F, 0x77E3}, //1085 #CJK UNIFIED IDEOGRAPH + {0xA870, 0x79C1}, //1086 #CJK UNIFIED IDEOGRAPH + {0xA871, 0x79C0}, //1087 #CJK UNIFIED IDEOGRAPH + {0xA872, 0x79BF}, //1088 #CJK UNIFIED IDEOGRAPH + {0xA873, 0x7A76}, //1089 #CJK UNIFIED IDEOGRAPH + {0xA874, 0x7CFB}, //1090 #CJK UNIFIED IDEOGRAPH + {0xA875, 0x7F55}, //1091 #CJK UNIFIED IDEOGRAPH + {0xA876, 0x8096}, //1092 #CJK UNIFIED IDEOGRAPH + {0xA877, 0x8093}, //1093 #CJK UNIFIED IDEOGRAPH + {0xA878, 0x809D}, //1094 #CJK UNIFIED IDEOGRAPH + {0xA879, 0x8098}, //1095 #CJK UNIFIED IDEOGRAPH + {0xA87A, 0x809B}, //1096 #CJK UNIFIED IDEOGRAPH + {0xA87B, 0x809A}, //1097 #CJK UNIFIED IDEOGRAPH + {0xA87C, 0x80B2}, //1098 #CJK UNIFIED IDEOGRAPH + {0xA87D, 0x826F}, //1099 #CJK UNIFIED IDEOGRAPH + {0xA87E, 0x8292}, //1100 #CJK UNIFIED IDEOGRAPH + {0xA8A1, 0x828B}, //1101 #CJK UNIFIED IDEOGRAPH + {0xA8A2, 0x828D}, //1102 #CJK UNIFIED IDEOGRAPH + {0xA8A3, 0x898B}, //1103 #CJK UNIFIED IDEOGRAPH + {0xA8A4, 0x89D2}, //1104 #CJK UNIFIED IDEOGRAPH + {0xA8A5, 0x8A00}, //1105 #CJK UNIFIED IDEOGRAPH + {0xA8A6, 0x8C37}, //1106 #CJK UNIFIED IDEOGRAPH + {0xA8A7, 0x8C46}, //1107 #CJK UNIFIED IDEOGRAPH + {0xA8A8, 0x8C55}, //1108 #CJK UNIFIED IDEOGRAPH + {0xA8A9, 0x8C9D}, //1109 #CJK UNIFIED IDEOGRAPH + {0xA8AA, 0x8D64}, //1110 #CJK UNIFIED IDEOGRAPH + {0xA8AB, 0x8D70}, //1111 #CJK UNIFIED IDEOGRAPH + {0xA8AC, 0x8DB3}, //1112 #CJK UNIFIED IDEOGRAPH + {0xA8AD, 0x8EAB}, //1113 #CJK UNIFIED IDEOGRAPH + {0xA8AE, 0x8ECA}, //1114 #CJK UNIFIED IDEOGRAPH + {0xA8AF, 0x8F9B}, //1115 #CJK UNIFIED IDEOGRAPH + {0xA8B0, 0x8FB0}, //1116 #CJK UNIFIED IDEOGRAPH + {0xA8B1, 0x8FC2}, //1117 #CJK UNIFIED IDEOGRAPH + {0xA8B2, 0x8FC6}, //1118 #CJK UNIFIED IDEOGRAPH + {0xA8B3, 0x8FC5}, //1119 #CJK UNIFIED IDEOGRAPH + {0xA8B4, 0x8FC4}, //1120 #CJK UNIFIED IDEOGRAPH + {0xA8B5, 0x5DE1}, //1121 #CJK UNIFIED IDEOGRAPH + {0xA8B6, 0x9091}, //1122 #CJK UNIFIED IDEOGRAPH + {0xA8B7, 0x90A2}, //1123 #CJK UNIFIED IDEOGRAPH + {0xA8B8, 0x90AA}, //1124 #CJK UNIFIED IDEOGRAPH + {0xA8B9, 0x90A6}, //1125 #CJK UNIFIED IDEOGRAPH + {0xA8BA, 0x90A3}, //1126 #CJK UNIFIED IDEOGRAPH + {0xA8BB, 0x9149}, //1127 #CJK UNIFIED IDEOGRAPH + {0xA8BC, 0x91C6}, //1128 #CJK UNIFIED IDEOGRAPH + {0xA8BD, 0x91CC}, //1129 #CJK UNIFIED IDEOGRAPH + {0xA8BE, 0x9632}, //1130 #CJK UNIFIED IDEOGRAPH + {0xA8BF, 0x962E}, //1131 #CJK UNIFIED IDEOGRAPH + {0xA8C0, 0x9631}, //1132 #CJK UNIFIED IDEOGRAPH + {0xA8C1, 0x962A}, //1133 #CJK UNIFIED IDEOGRAPH + {0xA8C2, 0x962C}, //1134 #CJK UNIFIED IDEOGRAPH + {0xA8C3, 0x4E26}, //1135 #CJK UNIFIED IDEOGRAPH + {0xA8C4, 0x4E56}, //1136 #CJK UNIFIED IDEOGRAPH + {0xA8C5, 0x4E73}, //1137 #CJK UNIFIED IDEOGRAPH + {0xA8C6, 0x4E8B}, //1138 #CJK UNIFIED IDEOGRAPH + {0xA8C7, 0x4E9B}, //1139 #CJK UNIFIED IDEOGRAPH + {0xA8C8, 0x4E9E}, //1140 #CJK UNIFIED IDEOGRAPH + {0xA8C9, 0x4EAB}, //1141 #CJK UNIFIED IDEOGRAPH + {0xA8CA, 0x4EAC}, //1142 #CJK UNIFIED IDEOGRAPH + {0xA8CB, 0x4F6F}, //1143 #CJK UNIFIED IDEOGRAPH + {0xA8CC, 0x4F9D}, //1144 #CJK UNIFIED IDEOGRAPH + {0xA8CD, 0x4F8D}, //1145 #CJK UNIFIED IDEOGRAPH + {0xA8CE, 0x4F73}, //1146 #CJK UNIFIED IDEOGRAPH + {0xA8CF, 0x4F7F}, //1147 #CJK UNIFIED IDEOGRAPH + {0xA8D0, 0x4F6C}, //1148 #CJK UNIFIED IDEOGRAPH + {0xA8D1, 0x4F9B}, //1149 #CJK UNIFIED IDEOGRAPH + {0xA8D2, 0x4F8B}, //1150 #CJK UNIFIED IDEOGRAPH + {0xA8D3, 0x4F86}, //1151 #CJK UNIFIED IDEOGRAPH + {0xA8D4, 0x4F83}, //1152 #CJK UNIFIED IDEOGRAPH + {0xA8D5, 0x4F70}, //1153 #CJK UNIFIED IDEOGRAPH + {0xA8D6, 0x4F75}, //1154 #CJK UNIFIED IDEOGRAPH + {0xA8D7, 0x4F88}, //1155 #CJK UNIFIED IDEOGRAPH + {0xA8D8, 0x4F69}, //1156 #CJK UNIFIED IDEOGRAPH + {0xA8D9, 0x4F7B}, //1157 #CJK UNIFIED IDEOGRAPH + {0xA8DA, 0x4F96}, //1158 #CJK UNIFIED IDEOGRAPH + {0xA8DB, 0x4F7E}, //1159 #CJK UNIFIED IDEOGRAPH + {0xA8DC, 0x4F8F}, //1160 #CJK UNIFIED IDEOGRAPH + {0xA8DD, 0x4F91}, //1161 #CJK UNIFIED IDEOGRAPH + {0xA8DE, 0x4F7A}, //1162 #CJK UNIFIED IDEOGRAPH + {0xA8DF, 0x5154}, //1163 #CJK UNIFIED IDEOGRAPH + {0xA8E0, 0x5152}, //1164 #CJK UNIFIED IDEOGRAPH + {0xA8E1, 0x5155}, //1165 #CJK UNIFIED IDEOGRAPH + {0xA8E2, 0x5169}, //1166 #CJK UNIFIED IDEOGRAPH + {0xA8E3, 0x5177}, //1167 #CJK UNIFIED IDEOGRAPH + {0xA8E4, 0x5176}, //1168 #CJK UNIFIED IDEOGRAPH + {0xA8E5, 0x5178}, //1169 #CJK UNIFIED IDEOGRAPH + {0xA8E6, 0x51BD}, //1170 #CJK UNIFIED IDEOGRAPH + {0xA8E7, 0x51FD}, //1171 #CJK UNIFIED IDEOGRAPH + {0xA8E8, 0x523B}, //1172 #CJK UNIFIED IDEOGRAPH + {0xA8E9, 0x5238}, //1173 #CJK UNIFIED IDEOGRAPH + {0xA8EA, 0x5237}, //1174 #CJK UNIFIED IDEOGRAPH + {0xA8EB, 0x523A}, //1175 #CJK UNIFIED IDEOGRAPH + {0xA8EC, 0x5230}, //1176 #CJK UNIFIED IDEOGRAPH + {0xA8ED, 0x522E}, //1177 #CJK UNIFIED IDEOGRAPH + {0xA8EE, 0x5236}, //1178 #CJK UNIFIED IDEOGRAPH + {0xA8EF, 0x5241}, //1179 #CJK UNIFIED IDEOGRAPH + {0xA8F0, 0x52BE}, //1180 #CJK UNIFIED IDEOGRAPH + {0xA8F1, 0x52BB}, //1181 #CJK UNIFIED IDEOGRAPH + {0xA8F2, 0x5352}, //1182 #CJK UNIFIED IDEOGRAPH + {0xA8F3, 0x5354}, //1183 #CJK UNIFIED IDEOGRAPH + {0xA8F4, 0x5353}, //1184 #CJK UNIFIED IDEOGRAPH + {0xA8F5, 0x5351}, //1185 #CJK UNIFIED IDEOGRAPH + {0xA8F6, 0x5366}, //1186 #CJK UNIFIED IDEOGRAPH + {0xA8F7, 0x5377}, //1187 #CJK UNIFIED IDEOGRAPH + {0xA8F8, 0x5378}, //1188 #CJK UNIFIED IDEOGRAPH + {0xA8F9, 0x5379}, //1189 #CJK UNIFIED IDEOGRAPH + {0xA8FA, 0x53D6}, //1190 #CJK UNIFIED IDEOGRAPH + {0xA8FB, 0x53D4}, //1191 #CJK UNIFIED IDEOGRAPH + {0xA8FC, 0x53D7}, //1192 #CJK UNIFIED IDEOGRAPH + {0xA8FD, 0x5473}, //1193 #CJK UNIFIED IDEOGRAPH + {0xA8FE, 0x5475}, //1194 #CJK UNIFIED IDEOGRAPH + {0xA940, 0x5496}, //1195 #CJK UNIFIED IDEOGRAPH + {0xA941, 0x5478}, //1196 #CJK UNIFIED IDEOGRAPH + {0xA942, 0x5495}, //1197 #CJK UNIFIED IDEOGRAPH + {0xA943, 0x5480}, //1198 #CJK UNIFIED IDEOGRAPH + {0xA944, 0x547B}, //1199 #CJK UNIFIED IDEOGRAPH + {0xA945, 0x5477}, //1200 #CJK UNIFIED IDEOGRAPH + {0xA946, 0x5484}, //1201 #CJK UNIFIED IDEOGRAPH + {0xA947, 0x5492}, //1202 #CJK UNIFIED IDEOGRAPH + {0xA948, 0x5486}, //1203 #CJK UNIFIED IDEOGRAPH + {0xA949, 0x547C}, //1204 #CJK UNIFIED IDEOGRAPH + {0xA94A, 0x5490}, //1205 #CJK UNIFIED IDEOGRAPH + {0xA94B, 0x5471}, //1206 #CJK UNIFIED IDEOGRAPH + {0xA94C, 0x5476}, //1207 #CJK UNIFIED IDEOGRAPH + {0xA94D, 0x548C}, //1208 #CJK UNIFIED IDEOGRAPH + {0xA94E, 0x549A}, //1209 #CJK UNIFIED IDEOGRAPH + {0xA94F, 0x5462}, //1210 #CJK UNIFIED IDEOGRAPH + {0xA950, 0x5468}, //1211 #CJK UNIFIED IDEOGRAPH + {0xA951, 0x548B}, //1212 #CJK UNIFIED IDEOGRAPH + {0xA952, 0x547D}, //1213 #CJK UNIFIED IDEOGRAPH + {0xA953, 0x548E}, //1214 #CJK UNIFIED IDEOGRAPH + {0xA954, 0x56FA}, //1215 #CJK UNIFIED IDEOGRAPH + {0xA955, 0x5783}, //1216 #CJK UNIFIED IDEOGRAPH + {0xA956, 0x5777}, //1217 #CJK UNIFIED IDEOGRAPH + {0xA957, 0x576A}, //1218 #CJK UNIFIED IDEOGRAPH + {0xA958, 0x5769}, //1219 #CJK UNIFIED IDEOGRAPH + {0xA959, 0x5761}, //1220 #CJK UNIFIED IDEOGRAPH + {0xA95A, 0x5766}, //1221 #CJK UNIFIED IDEOGRAPH + {0xA95B, 0x5764}, //1222 #CJK UNIFIED IDEOGRAPH + {0xA95C, 0x577C}, //1223 #CJK UNIFIED IDEOGRAPH + {0xA95D, 0x591C}, //1224 #CJK UNIFIED IDEOGRAPH + {0xA95E, 0x5949}, //1225 #CJK UNIFIED IDEOGRAPH + {0xA95F, 0x5947}, //1226 #CJK UNIFIED IDEOGRAPH + {0xA960, 0x5948}, //1227 #CJK UNIFIED IDEOGRAPH + {0xA961, 0x5944}, //1228 #CJK UNIFIED IDEOGRAPH + {0xA962, 0x5954}, //1229 #CJK UNIFIED IDEOGRAPH + {0xA963, 0x59BE}, //1230 #CJK UNIFIED IDEOGRAPH + {0xA964, 0x59BB}, //1231 #CJK UNIFIED IDEOGRAPH + {0xA965, 0x59D4}, //1232 #CJK UNIFIED IDEOGRAPH + {0xA966, 0x59B9}, //1233 #CJK UNIFIED IDEOGRAPH + {0xA967, 0x59AE}, //1234 #CJK UNIFIED IDEOGRAPH + {0xA968, 0x59D1}, //1235 #CJK UNIFIED IDEOGRAPH + {0xA969, 0x59C6}, //1236 #CJK UNIFIED IDEOGRAPH + {0xA96A, 0x59D0}, //1237 #CJK UNIFIED IDEOGRAPH + {0xA96B, 0x59CD}, //1238 #CJK UNIFIED IDEOGRAPH + {0xA96C, 0x59CB}, //1239 #CJK UNIFIED IDEOGRAPH + {0xA96D, 0x59D3}, //1240 #CJK UNIFIED IDEOGRAPH + {0xA96E, 0x59CA}, //1241 #CJK UNIFIED IDEOGRAPH + {0xA96F, 0x59AF}, //1242 #CJK UNIFIED IDEOGRAPH + {0xA970, 0x59B3}, //1243 #CJK UNIFIED IDEOGRAPH + {0xA971, 0x59D2}, //1244 #CJK UNIFIED IDEOGRAPH + {0xA972, 0x59C5}, //1245 #CJK UNIFIED IDEOGRAPH + {0xA973, 0x5B5F}, //1246 #CJK UNIFIED IDEOGRAPH + {0xA974, 0x5B64}, //1247 #CJK UNIFIED IDEOGRAPH + {0xA975, 0x5B63}, //1248 #CJK UNIFIED IDEOGRAPH + {0xA976, 0x5B97}, //1249 #CJK UNIFIED IDEOGRAPH + {0xA977, 0x5B9A}, //1250 #CJK UNIFIED IDEOGRAPH + {0xA978, 0x5B98}, //1251 #CJK UNIFIED IDEOGRAPH + {0xA979, 0x5B9C}, //1252 #CJK UNIFIED IDEOGRAPH + {0xA97A, 0x5B99}, //1253 #CJK UNIFIED IDEOGRAPH + {0xA97B, 0x5B9B}, //1254 #CJK UNIFIED IDEOGRAPH + {0xA97C, 0x5C1A}, //1255 #CJK UNIFIED IDEOGRAPH + {0xA97D, 0x5C48}, //1256 #CJK UNIFIED IDEOGRAPH + {0xA97E, 0x5C45}, //1257 #CJK UNIFIED IDEOGRAPH + {0xA9A1, 0x5C46}, //1258 #CJK UNIFIED IDEOGRAPH + {0xA9A2, 0x5CB7}, //1259 #CJK UNIFIED IDEOGRAPH + {0xA9A3, 0x5CA1}, //1260 #CJK UNIFIED IDEOGRAPH + {0xA9A4, 0x5CB8}, //1261 #CJK UNIFIED IDEOGRAPH + {0xA9A5, 0x5CA9}, //1262 #CJK UNIFIED IDEOGRAPH + {0xA9A6, 0x5CAB}, //1263 #CJK UNIFIED IDEOGRAPH + {0xA9A7, 0x5CB1}, //1264 #CJK UNIFIED IDEOGRAPH + {0xA9A8, 0x5CB3}, //1265 #CJK UNIFIED IDEOGRAPH + {0xA9A9, 0x5E18}, //1266 #CJK UNIFIED IDEOGRAPH + {0xA9AA, 0x5E1A}, //1267 #CJK UNIFIED IDEOGRAPH + {0xA9AB, 0x5E16}, //1268 #CJK UNIFIED IDEOGRAPH + {0xA9AC, 0x5E15}, //1269 #CJK UNIFIED IDEOGRAPH + {0xA9AD, 0x5E1B}, //1270 #CJK UNIFIED IDEOGRAPH + {0xA9AE, 0x5E11}, //1271 #CJK UNIFIED IDEOGRAPH + {0xA9AF, 0x5E78}, //1272 #CJK UNIFIED IDEOGRAPH + {0xA9B0, 0x5E9A}, //1273 #CJK UNIFIED IDEOGRAPH + {0xA9B1, 0x5E97}, //1274 #CJK UNIFIED IDEOGRAPH + {0xA9B2, 0x5E9C}, //1275 #CJK UNIFIED IDEOGRAPH + {0xA9B3, 0x5E95}, //1276 #CJK UNIFIED IDEOGRAPH + {0xA9B4, 0x5E96}, //1277 #CJK UNIFIED IDEOGRAPH + {0xA9B5, 0x5EF6}, //1278 #CJK UNIFIED IDEOGRAPH + {0xA9B6, 0x5F26}, //1279 #CJK UNIFIED IDEOGRAPH + {0xA9B7, 0x5F27}, //1280 #CJK UNIFIED IDEOGRAPH + {0xA9B8, 0x5F29}, //1281 #CJK UNIFIED IDEOGRAPH + {0xA9B9, 0x5F80}, //1282 #CJK UNIFIED IDEOGRAPH + {0xA9BA, 0x5F81}, //1283 #CJK UNIFIED IDEOGRAPH + {0xA9BB, 0x5F7F}, //1284 #CJK UNIFIED IDEOGRAPH + {0xA9BC, 0x5F7C}, //1285 #CJK UNIFIED IDEOGRAPH + {0xA9BD, 0x5FDD}, //1286 #CJK UNIFIED IDEOGRAPH + {0xA9BE, 0x5FE0}, //1287 #CJK UNIFIED IDEOGRAPH + {0xA9BF, 0x5FFD}, //1288 #CJK UNIFIED IDEOGRAPH + {0xA9C0, 0x5FF5}, //1289 #CJK UNIFIED IDEOGRAPH + {0xA9C1, 0x5FFF}, //1290 #CJK UNIFIED IDEOGRAPH + {0xA9C2, 0x600F}, //1291 #CJK UNIFIED IDEOGRAPH + {0xA9C3, 0x6014}, //1292 #CJK UNIFIED IDEOGRAPH + {0xA9C4, 0x602F}, //1293 #CJK UNIFIED IDEOGRAPH + {0xA9C5, 0x6035}, //1294 #CJK UNIFIED IDEOGRAPH + {0xA9C6, 0x6016}, //1295 #CJK UNIFIED IDEOGRAPH + {0xA9C7, 0x602A}, //1296 #CJK UNIFIED IDEOGRAPH + {0xA9C8, 0x6015}, //1297 #CJK UNIFIED IDEOGRAPH + {0xA9C9, 0x6021}, //1298 #CJK UNIFIED IDEOGRAPH + {0xA9CA, 0x6027}, //1299 #CJK UNIFIED IDEOGRAPH + {0xA9CB, 0x6029}, //1300 #CJK UNIFIED IDEOGRAPH + {0xA9CC, 0x602B}, //1301 #CJK UNIFIED IDEOGRAPH + {0xA9CD, 0x601B}, //1302 #CJK UNIFIED IDEOGRAPH + {0xA9CE, 0x6216}, //1303 #CJK UNIFIED IDEOGRAPH + {0xA9CF, 0x6215}, //1304 #CJK UNIFIED IDEOGRAPH + {0xA9D0, 0x623F}, //1305 #CJK UNIFIED IDEOGRAPH + {0xA9D1, 0x623E}, //1306 #CJK UNIFIED IDEOGRAPH + {0xA9D2, 0x6240}, //1307 #CJK UNIFIED IDEOGRAPH + {0xA9D3, 0x627F}, //1308 #CJK UNIFIED IDEOGRAPH + {0xA9D4, 0x62C9}, //1309 #CJK UNIFIED IDEOGRAPH + {0xA9D5, 0x62CC}, //1310 #CJK UNIFIED IDEOGRAPH + {0xA9D6, 0x62C4}, //1311 #CJK UNIFIED IDEOGRAPH + {0xA9D7, 0x62BF}, //1312 #CJK UNIFIED IDEOGRAPH + {0xA9D8, 0x62C2}, //1313 #CJK UNIFIED IDEOGRAPH + {0xA9D9, 0x62B9}, //1314 #CJK UNIFIED IDEOGRAPH + {0xA9DA, 0x62D2}, //1315 #CJK UNIFIED IDEOGRAPH + {0xA9DB, 0x62DB}, //1316 #CJK UNIFIED IDEOGRAPH + {0xA9DC, 0x62AB}, //1317 #CJK UNIFIED IDEOGRAPH + {0xA9DD, 0x62D3}, //1318 #CJK UNIFIED IDEOGRAPH + {0xA9DE, 0x62D4}, //1319 #CJK UNIFIED IDEOGRAPH + {0xA9DF, 0x62CB}, //1320 #CJK UNIFIED IDEOGRAPH + {0xA9E0, 0x62C8}, //1321 #CJK UNIFIED IDEOGRAPH + {0xA9E1, 0x62A8}, //1322 #CJK UNIFIED IDEOGRAPH + {0xA9E2, 0x62BD}, //1323 #CJK UNIFIED IDEOGRAPH + {0xA9E3, 0x62BC}, //1324 #CJK UNIFIED IDEOGRAPH + {0xA9E4, 0x62D0}, //1325 #CJK UNIFIED IDEOGRAPH + {0xA9E5, 0x62D9}, //1326 #CJK UNIFIED IDEOGRAPH + {0xA9E6, 0x62C7}, //1327 #CJK UNIFIED IDEOGRAPH + {0xA9E7, 0x62CD}, //1328 #CJK UNIFIED IDEOGRAPH + {0xA9E8, 0x62B5}, //1329 #CJK UNIFIED IDEOGRAPH + {0xA9E9, 0x62DA}, //1330 #CJK UNIFIED IDEOGRAPH + {0xA9EA, 0x62B1}, //1331 #CJK UNIFIED IDEOGRAPH + {0xA9EB, 0x62D8}, //1332 #CJK UNIFIED IDEOGRAPH + {0xA9EC, 0x62D6}, //1333 #CJK UNIFIED IDEOGRAPH + {0xA9ED, 0x62D7}, //1334 #CJK UNIFIED IDEOGRAPH + {0xA9EE, 0x62C6}, //1335 #CJK UNIFIED IDEOGRAPH + {0xA9EF, 0x62AC}, //1336 #CJK UNIFIED IDEOGRAPH + {0xA9F0, 0x62CE}, //1337 #CJK UNIFIED IDEOGRAPH + {0xA9F1, 0x653E}, //1338 #CJK UNIFIED IDEOGRAPH + {0xA9F2, 0x65A7}, //1339 #CJK UNIFIED IDEOGRAPH + {0xA9F3, 0x65BC}, //1340 #CJK UNIFIED IDEOGRAPH + {0xA9F4, 0x65FA}, //1341 #CJK UNIFIED IDEOGRAPH + {0xA9F5, 0x6614}, //1342 #CJK UNIFIED IDEOGRAPH + {0xA9F6, 0x6613}, //1343 #CJK UNIFIED IDEOGRAPH + {0xA9F7, 0x660C}, //1344 #CJK UNIFIED IDEOGRAPH + {0xA9F8, 0x6606}, //1345 #CJK UNIFIED IDEOGRAPH + {0xA9F9, 0x6602}, //1346 #CJK UNIFIED IDEOGRAPH + {0xA9FA, 0x660E}, //1347 #CJK UNIFIED IDEOGRAPH + {0xA9FB, 0x6600}, //1348 #CJK UNIFIED IDEOGRAPH + {0xA9FC, 0x660F}, //1349 #CJK UNIFIED IDEOGRAPH + {0xA9FD, 0x6615}, //1350 #CJK UNIFIED IDEOGRAPH + {0xA9FE, 0x660A}, //1351 #CJK UNIFIED IDEOGRAPH + {0xAA40, 0x6607}, //1352 #CJK UNIFIED IDEOGRAPH + {0xAA41, 0x670D}, //1353 #CJK UNIFIED IDEOGRAPH + {0xAA42, 0x670B}, //1354 #CJK UNIFIED IDEOGRAPH + {0xAA43, 0x676D}, //1355 #CJK UNIFIED IDEOGRAPH + {0xAA44, 0x678B}, //1356 #CJK UNIFIED IDEOGRAPH + {0xAA45, 0x6795}, //1357 #CJK UNIFIED IDEOGRAPH + {0xAA46, 0x6771}, //1358 #CJK UNIFIED IDEOGRAPH + {0xAA47, 0x679C}, //1359 #CJK UNIFIED IDEOGRAPH + {0xAA48, 0x6773}, //1360 #CJK UNIFIED IDEOGRAPH + {0xAA49, 0x6777}, //1361 #CJK UNIFIED IDEOGRAPH + {0xAA4A, 0x6787}, //1362 #CJK UNIFIED IDEOGRAPH + {0xAA4B, 0x679D}, //1363 #CJK UNIFIED IDEOGRAPH + {0xAA4C, 0x6797}, //1364 #CJK UNIFIED IDEOGRAPH + {0xAA4D, 0x676F}, //1365 #CJK UNIFIED IDEOGRAPH + {0xAA4E, 0x6770}, //1366 #CJK UNIFIED IDEOGRAPH + {0xAA4F, 0x677F}, //1367 #CJK UNIFIED IDEOGRAPH + {0xAA50, 0x6789}, //1368 #CJK UNIFIED IDEOGRAPH + {0xAA51, 0x677E}, //1369 #CJK UNIFIED IDEOGRAPH + {0xAA52, 0x6790}, //1370 #CJK UNIFIED IDEOGRAPH + {0xAA53, 0x6775}, //1371 #CJK UNIFIED IDEOGRAPH + {0xAA54, 0x679A}, //1372 #CJK UNIFIED IDEOGRAPH + {0xAA55, 0x6793}, //1373 #CJK UNIFIED IDEOGRAPH + {0xAA56, 0x677C}, //1374 #CJK UNIFIED IDEOGRAPH + {0xAA57, 0x676A}, //1375 #CJK UNIFIED IDEOGRAPH + {0xAA58, 0x6772}, //1376 #CJK UNIFIED IDEOGRAPH + {0xAA59, 0x6B23}, //1377 #CJK UNIFIED IDEOGRAPH + {0xAA5A, 0x6B66}, //1378 #CJK UNIFIED IDEOGRAPH + {0xAA5B, 0x6B67}, //1379 #CJK UNIFIED IDEOGRAPH + {0xAA5C, 0x6B7F}, //1380 #CJK UNIFIED IDEOGRAPH + {0xAA5D, 0x6C13}, //1381 #CJK UNIFIED IDEOGRAPH + {0xAA5E, 0x6C1B}, //1382 #CJK UNIFIED IDEOGRAPH + {0xAA5F, 0x6CE3}, //1383 #CJK UNIFIED IDEOGRAPH + {0xAA60, 0x6CE8}, //1384 #CJK UNIFIED IDEOGRAPH + {0xAA61, 0x6CF3}, //1385 #CJK UNIFIED IDEOGRAPH + {0xAA62, 0x6CB1}, //1386 #CJK UNIFIED IDEOGRAPH + {0xAA63, 0x6CCC}, //1387 #CJK UNIFIED IDEOGRAPH + {0xAA64, 0x6CE5}, //1388 #CJK UNIFIED IDEOGRAPH + {0xAA65, 0x6CB3}, //1389 #CJK UNIFIED IDEOGRAPH + {0xAA66, 0x6CBD}, //1390 #CJK UNIFIED IDEOGRAPH + {0xAA67, 0x6CBE}, //1391 #CJK UNIFIED IDEOGRAPH + {0xAA68, 0x6CBC}, //1392 #CJK UNIFIED IDEOGRAPH + {0xAA69, 0x6CE2}, //1393 #CJK UNIFIED IDEOGRAPH + {0xAA6A, 0x6CAB}, //1394 #CJK UNIFIED IDEOGRAPH + {0xAA6B, 0x6CD5}, //1395 #CJK UNIFIED IDEOGRAPH + {0xAA6C, 0x6CD3}, //1396 #CJK UNIFIED IDEOGRAPH + {0xAA6D, 0x6CB8}, //1397 #CJK UNIFIED IDEOGRAPH + {0xAA6E, 0x6CC4}, //1398 #CJK UNIFIED IDEOGRAPH + {0xAA6F, 0x6CB9}, //1399 #CJK UNIFIED IDEOGRAPH + {0xAA70, 0x6CC1}, //1400 #CJK UNIFIED IDEOGRAPH + {0xAA71, 0x6CAE}, //1401 #CJK UNIFIED IDEOGRAPH + {0xAA72, 0x6CD7}, //1402 #CJK UNIFIED IDEOGRAPH + {0xAA73, 0x6CC5}, //1403 #CJK UNIFIED IDEOGRAPH + {0xAA74, 0x6CF1}, //1404 #CJK UNIFIED IDEOGRAPH + {0xAA75, 0x6CBF}, //1405 #CJK UNIFIED IDEOGRAPH + {0xAA76, 0x6CBB}, //1406 #CJK UNIFIED IDEOGRAPH + {0xAA77, 0x6CE1}, //1407 #CJK UNIFIED IDEOGRAPH + {0xAA78, 0x6CDB}, //1408 #CJK UNIFIED IDEOGRAPH + {0xAA79, 0x6CCA}, //1409 #CJK UNIFIED IDEOGRAPH + {0xAA7A, 0x6CAC}, //1410 #CJK UNIFIED IDEOGRAPH + {0xAA7B, 0x6CEF}, //1411 #CJK UNIFIED IDEOGRAPH + {0xAA7C, 0x6CDC}, //1412 #CJK UNIFIED IDEOGRAPH + {0xAA7D, 0x6CD6}, //1413 #CJK UNIFIED IDEOGRAPH + {0xAA7E, 0x6CE0}, //1414 #CJK UNIFIED IDEOGRAPH + {0xAAA1, 0x7095}, //1415 #CJK UNIFIED IDEOGRAPH + {0xAAA2, 0x708E}, //1416 #CJK UNIFIED IDEOGRAPH + {0xAAA3, 0x7092}, //1417 #CJK UNIFIED IDEOGRAPH + {0xAAA4, 0x708A}, //1418 #CJK UNIFIED IDEOGRAPH + {0xAAA5, 0x7099}, //1419 #CJK UNIFIED IDEOGRAPH + {0xAAA6, 0x722C}, //1420 #CJK UNIFIED IDEOGRAPH + {0xAAA7, 0x722D}, //1421 #CJK UNIFIED IDEOGRAPH + {0xAAA8, 0x7238}, //1422 #CJK UNIFIED IDEOGRAPH + {0xAAA9, 0x7248}, //1423 #CJK UNIFIED IDEOGRAPH + {0xAAAA, 0x7267}, //1424 #CJK UNIFIED IDEOGRAPH + {0xAAAB, 0x7269}, //1425 #CJK UNIFIED IDEOGRAPH + {0xAAAC, 0x72C0}, //1426 #CJK UNIFIED IDEOGRAPH + {0xAAAD, 0x72CE}, //1427 #CJK UNIFIED IDEOGRAPH + {0xAAAE, 0x72D9}, //1428 #CJK UNIFIED IDEOGRAPH + {0xAAAF, 0x72D7}, //1429 #CJK UNIFIED IDEOGRAPH + {0xAAB0, 0x72D0}, //1430 #CJK UNIFIED IDEOGRAPH + {0xAAB1, 0x73A9}, //1431 #CJK UNIFIED IDEOGRAPH + {0xAAB2, 0x73A8}, //1432 #CJK UNIFIED IDEOGRAPH + {0xAAB3, 0x739F}, //1433 #CJK UNIFIED IDEOGRAPH + {0xAAB4, 0x73AB}, //1434 #CJK UNIFIED IDEOGRAPH + {0xAAB5, 0x73A5}, //1435 #CJK UNIFIED IDEOGRAPH + {0xAAB6, 0x753D}, //1436 #CJK UNIFIED IDEOGRAPH + {0xAAB7, 0x759D}, //1437 #CJK UNIFIED IDEOGRAPH + {0xAAB8, 0x7599}, //1438 #CJK UNIFIED IDEOGRAPH + {0xAAB9, 0x759A}, //1439 #CJK UNIFIED IDEOGRAPH + {0xAABA, 0x7684}, //1440 #CJK UNIFIED IDEOGRAPH + {0xAABB, 0x76C2}, //1441 #CJK UNIFIED IDEOGRAPH + {0xAABC, 0x76F2}, //1442 #CJK UNIFIED IDEOGRAPH + {0xAABD, 0x76F4}, //1443 #CJK UNIFIED IDEOGRAPH + {0xAABE, 0x77E5}, //1444 #CJK UNIFIED IDEOGRAPH + {0xAABF, 0x77FD}, //1445 #CJK UNIFIED IDEOGRAPH + {0xAAC0, 0x793E}, //1446 #CJK UNIFIED IDEOGRAPH + {0xAAC1, 0x7940}, //1447 #CJK UNIFIED IDEOGRAPH + {0xAAC2, 0x7941}, //1448 #CJK UNIFIED IDEOGRAPH + {0xAAC3, 0x79C9}, //1449 #CJK UNIFIED IDEOGRAPH + {0xAAC4, 0x79C8}, //1450 #CJK UNIFIED IDEOGRAPH + {0xAAC5, 0x7A7A}, //1451 #CJK UNIFIED IDEOGRAPH + {0xAAC6, 0x7A79}, //1452 #CJK UNIFIED IDEOGRAPH + {0xAAC7, 0x7AFA}, //1453 #CJK UNIFIED IDEOGRAPH + {0xAAC8, 0x7CFE}, //1454 #CJK UNIFIED IDEOGRAPH + {0xAAC9, 0x7F54}, //1455 #CJK UNIFIED IDEOGRAPH + {0xAACA, 0x7F8C}, //1456 #CJK UNIFIED IDEOGRAPH + {0xAACB, 0x7F8B}, //1457 #CJK UNIFIED IDEOGRAPH + {0xAACC, 0x8005}, //1458 #CJK UNIFIED IDEOGRAPH + {0xAACD, 0x80BA}, //1459 #CJK UNIFIED IDEOGRAPH + {0xAACE, 0x80A5}, //1460 #CJK UNIFIED IDEOGRAPH + {0xAACF, 0x80A2}, //1461 #CJK UNIFIED IDEOGRAPH + {0xAAD0, 0x80B1}, //1462 #CJK UNIFIED IDEOGRAPH + {0xAAD1, 0x80A1}, //1463 #CJK UNIFIED IDEOGRAPH + {0xAAD2, 0x80AB}, //1464 #CJK UNIFIED IDEOGRAPH + {0xAAD3, 0x80A9}, //1465 #CJK UNIFIED IDEOGRAPH + {0xAAD4, 0x80B4}, //1466 #CJK UNIFIED IDEOGRAPH + {0xAAD5, 0x80AA}, //1467 #CJK UNIFIED IDEOGRAPH + {0xAAD6, 0x80AF}, //1468 #CJK UNIFIED IDEOGRAPH + {0xAAD7, 0x81E5}, //1469 #CJK UNIFIED IDEOGRAPH + {0xAAD8, 0x81FE}, //1470 #CJK UNIFIED IDEOGRAPH + {0xAAD9, 0x820D}, //1471 #CJK UNIFIED IDEOGRAPH + {0xAADA, 0x82B3}, //1472 #CJK UNIFIED IDEOGRAPH + {0xAADB, 0x829D}, //1473 #CJK UNIFIED IDEOGRAPH + {0xAADC, 0x8299}, //1474 #CJK UNIFIED IDEOGRAPH + {0xAADD, 0x82AD}, //1475 #CJK UNIFIED IDEOGRAPH + {0xAADE, 0x82BD}, //1476 #CJK UNIFIED IDEOGRAPH + {0xAADF, 0x829F}, //1477 #CJK UNIFIED IDEOGRAPH + {0xAAE0, 0x82B9}, //1478 #CJK UNIFIED IDEOGRAPH + {0xAAE1, 0x82B1}, //1479 #CJK UNIFIED IDEOGRAPH + {0xAAE2, 0x82AC}, //1480 #CJK UNIFIED IDEOGRAPH + {0xAAE3, 0x82A5}, //1481 #CJK UNIFIED IDEOGRAPH + {0xAAE4, 0x82AF}, //1482 #CJK UNIFIED IDEOGRAPH + {0xAAE5, 0x82B8}, //1483 #CJK UNIFIED IDEOGRAPH + {0xAAE6, 0x82A3}, //1484 #CJK UNIFIED IDEOGRAPH + {0xAAE7, 0x82B0}, //1485 #CJK UNIFIED IDEOGRAPH + {0xAAE8, 0x82BE}, //1486 #CJK UNIFIED IDEOGRAPH + {0xAAE9, 0x82B7}, //1487 #CJK UNIFIED IDEOGRAPH + {0xAAEA, 0x864E}, //1488 #CJK UNIFIED IDEOGRAPH + {0xAAEB, 0x8671}, //1489 #CJK UNIFIED IDEOGRAPH + {0xAAEC, 0x521D}, //1490 #CJK UNIFIED IDEOGRAPH + {0xAAED, 0x8868}, //1491 #CJK UNIFIED IDEOGRAPH + {0xAAEE, 0x8ECB}, //1492 #CJK UNIFIED IDEOGRAPH + {0xAAEF, 0x8FCE}, //1493 #CJK UNIFIED IDEOGRAPH + {0xAAF0, 0x8FD4}, //1494 #CJK UNIFIED IDEOGRAPH + {0xAAF1, 0x8FD1}, //1495 #CJK UNIFIED IDEOGRAPH + {0xAAF2, 0x90B5}, //1496 #CJK UNIFIED IDEOGRAPH + {0xAAF3, 0x90B8}, //1497 #CJK UNIFIED IDEOGRAPH + {0xAAF4, 0x90B1}, //1498 #CJK UNIFIED IDEOGRAPH + {0xAAF5, 0x90B6}, //1499 #CJK UNIFIED IDEOGRAPH + {0xAAF6, 0x91C7}, //1500 #CJK UNIFIED IDEOGRAPH + {0xAAF7, 0x91D1}, //1501 #CJK UNIFIED IDEOGRAPH + {0xAAF8, 0x9577}, //1502 #CJK UNIFIED IDEOGRAPH + {0xAAF9, 0x9580}, //1503 #CJK UNIFIED IDEOGRAPH + {0xAAFA, 0x961C}, //1504 #CJK UNIFIED IDEOGRAPH + {0xAAFB, 0x9640}, //1505 #CJK UNIFIED IDEOGRAPH + {0xAAFC, 0x963F}, //1506 #CJK UNIFIED IDEOGRAPH + {0xAAFD, 0x963B}, //1507 #CJK UNIFIED IDEOGRAPH + {0xAAFE, 0x9644}, //1508 #CJK UNIFIED IDEOGRAPH + {0xAB40, 0x9642}, //1509 #CJK UNIFIED IDEOGRAPH + {0xAB41, 0x96B9}, //1510 #CJK UNIFIED IDEOGRAPH + {0xAB42, 0x96E8}, //1511 #CJK UNIFIED IDEOGRAPH + {0xAB43, 0x9752}, //1512 #CJK UNIFIED IDEOGRAPH + {0xAB44, 0x975E}, //1513 #CJK UNIFIED IDEOGRAPH + {0xAB45, 0x4E9F}, //1514 #CJK UNIFIED IDEOGRAPH + {0xAB46, 0x4EAD}, //1515 #CJK UNIFIED IDEOGRAPH + {0xAB47, 0x4EAE}, //1516 #CJK UNIFIED IDEOGRAPH + {0xAB48, 0x4FE1}, //1517 #CJK UNIFIED IDEOGRAPH + {0xAB49, 0x4FB5}, //1518 #CJK UNIFIED IDEOGRAPH + {0xAB4A, 0x4FAF}, //1519 #CJK UNIFIED IDEOGRAPH + {0xAB4B, 0x4FBF}, //1520 #CJK UNIFIED IDEOGRAPH + {0xAB4C, 0x4FE0}, //1521 #CJK UNIFIED IDEOGRAPH + {0xAB4D, 0x4FD1}, //1522 #CJK UNIFIED IDEOGRAPH + {0xAB4E, 0x4FCF}, //1523 #CJK UNIFIED IDEOGRAPH + {0xAB4F, 0x4FDD}, //1524 #CJK UNIFIED IDEOGRAPH + {0xAB50, 0x4FC3}, //1525 #CJK UNIFIED IDEOGRAPH + {0xAB51, 0x4FB6}, //1526 #CJK UNIFIED IDEOGRAPH + {0xAB52, 0x4FD8}, //1527 #CJK UNIFIED IDEOGRAPH + {0xAB53, 0x4FDF}, //1528 #CJK UNIFIED IDEOGRAPH + {0xAB54, 0x4FCA}, //1529 #CJK UNIFIED IDEOGRAPH + {0xAB55, 0x4FD7}, //1530 #CJK UNIFIED IDEOGRAPH + {0xAB56, 0x4FAE}, //1531 #CJK UNIFIED IDEOGRAPH + {0xAB57, 0x4FD0}, //1532 #CJK UNIFIED IDEOGRAPH + {0xAB58, 0x4FC4}, //1533 #CJK UNIFIED IDEOGRAPH + {0xAB59, 0x4FC2}, //1534 #CJK UNIFIED IDEOGRAPH + {0xAB5A, 0x4FDA}, //1535 #CJK UNIFIED IDEOGRAPH + {0xAB5B, 0x4FCE}, //1536 #CJK UNIFIED IDEOGRAPH + {0xAB5C, 0x4FDE}, //1537 #CJK UNIFIED IDEOGRAPH + {0xAB5D, 0x4FB7}, //1538 #CJK UNIFIED IDEOGRAPH + {0xAB5E, 0x5157}, //1539 #CJK UNIFIED IDEOGRAPH + {0xAB5F, 0x5192}, //1540 #CJK UNIFIED IDEOGRAPH + {0xAB60, 0x5191}, //1541 #CJK UNIFIED IDEOGRAPH + {0xAB61, 0x51A0}, //1542 #CJK UNIFIED IDEOGRAPH + {0xAB62, 0x524E}, //1543 #CJK UNIFIED IDEOGRAPH + {0xAB63, 0x5243}, //1544 #CJK UNIFIED IDEOGRAPH + {0xAB64, 0x524A}, //1545 #CJK UNIFIED IDEOGRAPH + {0xAB65, 0x524D}, //1546 #CJK UNIFIED IDEOGRAPH + {0xAB66, 0x524C}, //1547 #CJK UNIFIED IDEOGRAPH + {0xAB67, 0x524B}, //1548 #CJK UNIFIED IDEOGRAPH + {0xAB68, 0x5247}, //1549 #CJK UNIFIED IDEOGRAPH + {0xAB69, 0x52C7}, //1550 #CJK UNIFIED IDEOGRAPH + {0xAB6A, 0x52C9}, //1551 #CJK UNIFIED IDEOGRAPH + {0xAB6B, 0x52C3}, //1552 #CJK UNIFIED IDEOGRAPH + {0xAB6C, 0x52C1}, //1553 #CJK UNIFIED IDEOGRAPH + {0xAB6D, 0x530D}, //1554 #CJK UNIFIED IDEOGRAPH + {0xAB6E, 0x5357}, //1555 #CJK UNIFIED IDEOGRAPH + {0xAB6F, 0x537B}, //1556 #CJK UNIFIED IDEOGRAPH + {0xAB70, 0x539A}, //1557 #CJK UNIFIED IDEOGRAPH + {0xAB71, 0x53DB}, //1558 #CJK UNIFIED IDEOGRAPH + {0xAB72, 0x54AC}, //1559 #CJK UNIFIED IDEOGRAPH + {0xAB73, 0x54C0}, //1560 #CJK UNIFIED IDEOGRAPH + {0xAB74, 0x54A8}, //1561 #CJK UNIFIED IDEOGRAPH + {0xAB75, 0x54CE}, //1562 #CJK UNIFIED IDEOGRAPH + {0xAB76, 0x54C9}, //1563 #CJK UNIFIED IDEOGRAPH + {0xAB77, 0x54B8}, //1564 #CJK UNIFIED IDEOGRAPH + {0xAB78, 0x54A6}, //1565 #CJK UNIFIED IDEOGRAPH + {0xAB79, 0x54B3}, //1566 #CJK UNIFIED IDEOGRAPH + {0xAB7A, 0x54C7}, //1567 #CJK UNIFIED IDEOGRAPH + {0xAB7B, 0x54C2}, //1568 #CJK UNIFIED IDEOGRAPH + {0xAB7C, 0x54BD}, //1569 #CJK UNIFIED IDEOGRAPH + {0xAB7D, 0x54AA}, //1570 #CJK UNIFIED IDEOGRAPH + {0xAB7E, 0x54C1}, //1571 #CJK UNIFIED IDEOGRAPH + {0xABA1, 0x54C4}, //1572 #CJK UNIFIED IDEOGRAPH + {0xABA2, 0x54C8}, //1573 #CJK UNIFIED IDEOGRAPH + {0xABA3, 0x54AF}, //1574 #CJK UNIFIED IDEOGRAPH + {0xABA4, 0x54AB}, //1575 #CJK UNIFIED IDEOGRAPH + {0xABA5, 0x54B1}, //1576 #CJK UNIFIED IDEOGRAPH + {0xABA6, 0x54BB}, //1577 #CJK UNIFIED IDEOGRAPH + {0xABA7, 0x54A9}, //1578 #CJK UNIFIED IDEOGRAPH + {0xABA8, 0x54A7}, //1579 #CJK UNIFIED IDEOGRAPH + {0xABA9, 0x54BF}, //1580 #CJK UNIFIED IDEOGRAPH + {0xABAA, 0x56FF}, //1581 #CJK UNIFIED IDEOGRAPH + {0xABAB, 0x5782}, //1582 #CJK UNIFIED IDEOGRAPH + {0xABAC, 0x578B}, //1583 #CJK UNIFIED IDEOGRAPH + {0xABAD, 0x57A0}, //1584 #CJK UNIFIED IDEOGRAPH + {0xABAE, 0x57A3}, //1585 #CJK UNIFIED IDEOGRAPH + {0xABAF, 0x57A2}, //1586 #CJK UNIFIED IDEOGRAPH + {0xABB0, 0x57CE}, //1587 #CJK UNIFIED IDEOGRAPH + {0xABB1, 0x57AE}, //1588 #CJK UNIFIED IDEOGRAPH + {0xABB2, 0x5793}, //1589 #CJK UNIFIED IDEOGRAPH + {0xABB3, 0x5955}, //1590 #CJK UNIFIED IDEOGRAPH + {0xABB4, 0x5951}, //1591 #CJK UNIFIED IDEOGRAPH + {0xABB5, 0x594F}, //1592 #CJK UNIFIED IDEOGRAPH + {0xABB6, 0x594E}, //1593 #CJK UNIFIED IDEOGRAPH + {0xABB7, 0x5950}, //1594 #CJK UNIFIED IDEOGRAPH + {0xABB8, 0x59DC}, //1595 #CJK UNIFIED IDEOGRAPH + {0xABB9, 0x59D8}, //1596 #CJK UNIFIED IDEOGRAPH + {0xABBA, 0x59FF}, //1597 #CJK UNIFIED IDEOGRAPH + {0xABBB, 0x59E3}, //1598 #CJK UNIFIED IDEOGRAPH + {0xABBC, 0x59E8}, //1599 #CJK UNIFIED IDEOGRAPH + {0xABBD, 0x5A03}, //1600 #CJK UNIFIED IDEOGRAPH + {0xABBE, 0x59E5}, //1601 #CJK UNIFIED IDEOGRAPH + {0xABBF, 0x59EA}, //1602 #CJK UNIFIED IDEOGRAPH + {0xABC0, 0x59DA}, //1603 #CJK UNIFIED IDEOGRAPH + {0xABC1, 0x59E6}, //1604 #CJK UNIFIED IDEOGRAPH + {0xABC2, 0x5A01}, //1605 #CJK UNIFIED IDEOGRAPH + {0xABC3, 0x59FB}, //1606 #CJK UNIFIED IDEOGRAPH + {0xABC4, 0x5B69}, //1607 #CJK UNIFIED IDEOGRAPH + {0xABC5, 0x5BA3}, //1608 #CJK UNIFIED IDEOGRAPH + {0xABC6, 0x5BA6}, //1609 #CJK UNIFIED IDEOGRAPH + {0xABC7, 0x5BA4}, //1610 #CJK UNIFIED IDEOGRAPH + {0xABC8, 0x5BA2}, //1611 #CJK UNIFIED IDEOGRAPH + {0xABC9, 0x5BA5}, //1612 #CJK UNIFIED IDEOGRAPH + {0xABCA, 0x5C01}, //1613 #CJK UNIFIED IDEOGRAPH + {0xABCB, 0x5C4E}, //1614 #CJK UNIFIED IDEOGRAPH + {0xABCC, 0x5C4F}, //1615 #CJK UNIFIED IDEOGRAPH + {0xABCD, 0x5C4D}, //1616 #CJK UNIFIED IDEOGRAPH + {0xABCE, 0x5C4B}, //1617 #CJK UNIFIED IDEOGRAPH + {0xABCF, 0x5CD9}, //1618 #CJK UNIFIED IDEOGRAPH + {0xABD0, 0x5CD2}, //1619 #CJK UNIFIED IDEOGRAPH + {0xABD1, 0x5DF7}, //1620 #CJK UNIFIED IDEOGRAPH + {0xABD2, 0x5E1D}, //1621 #CJK UNIFIED IDEOGRAPH + {0xABD3, 0x5E25}, //1622 #CJK UNIFIED IDEOGRAPH + {0xABD4, 0x5E1F}, //1623 #CJK UNIFIED IDEOGRAPH + {0xABD5, 0x5E7D}, //1624 #CJK UNIFIED IDEOGRAPH + {0xABD6, 0x5EA0}, //1625 #CJK UNIFIED IDEOGRAPH + {0xABD7, 0x5EA6}, //1626 #CJK UNIFIED IDEOGRAPH + {0xABD8, 0x5EFA}, //1627 #CJK UNIFIED IDEOGRAPH + {0xABD9, 0x5F08}, //1628 #CJK UNIFIED IDEOGRAPH + {0xABDA, 0x5F2D}, //1629 #CJK UNIFIED IDEOGRAPH + {0xABDB, 0x5F65}, //1630 #CJK UNIFIED IDEOGRAPH + {0xABDC, 0x5F88}, //1631 #CJK UNIFIED IDEOGRAPH + {0xABDD, 0x5F85}, //1632 #CJK UNIFIED IDEOGRAPH + {0xABDE, 0x5F8A}, //1633 #CJK UNIFIED IDEOGRAPH + {0xABDF, 0x5F8B}, //1634 #CJK UNIFIED IDEOGRAPH + {0xABE0, 0x5F87}, //1635 #CJK UNIFIED IDEOGRAPH + {0xABE1, 0x5F8C}, //1636 #CJK UNIFIED IDEOGRAPH + {0xABE2, 0x5F89}, //1637 #CJK UNIFIED IDEOGRAPH + {0xABE3, 0x6012}, //1638 #CJK UNIFIED IDEOGRAPH + {0xABE4, 0x601D}, //1639 #CJK UNIFIED IDEOGRAPH + {0xABE5, 0x6020}, //1640 #CJK UNIFIED IDEOGRAPH + {0xABE6, 0x6025}, //1641 #CJK UNIFIED IDEOGRAPH + {0xABE7, 0x600E}, //1642 #CJK UNIFIED IDEOGRAPH + {0xABE8, 0x6028}, //1643 #CJK UNIFIED IDEOGRAPH + {0xABE9, 0x604D}, //1644 #CJK UNIFIED IDEOGRAPH + {0xABEA, 0x6070}, //1645 #CJK UNIFIED IDEOGRAPH + {0xABEB, 0x6068}, //1646 #CJK UNIFIED IDEOGRAPH + {0xABEC, 0x6062}, //1647 #CJK UNIFIED IDEOGRAPH + {0xABED, 0x6046}, //1648 #CJK UNIFIED IDEOGRAPH + {0xABEE, 0x6043}, //1649 #CJK UNIFIED IDEOGRAPH + {0xABEF, 0x606C}, //1650 #CJK UNIFIED IDEOGRAPH + {0xABF0, 0x606B}, //1651 #CJK UNIFIED IDEOGRAPH + {0xABF1, 0x606A}, //1652 #CJK UNIFIED IDEOGRAPH + {0xABF2, 0x6064}, //1653 #CJK UNIFIED IDEOGRAPH + {0xABF3, 0x6241}, //1654 #CJK UNIFIED IDEOGRAPH + {0xABF4, 0x62DC}, //1655 #CJK UNIFIED IDEOGRAPH + {0xABF5, 0x6316}, //1656 #CJK UNIFIED IDEOGRAPH + {0xABF6, 0x6309}, //1657 #CJK UNIFIED IDEOGRAPH + {0xABF7, 0x62FC}, //1658 #CJK UNIFIED IDEOGRAPH + {0xABF8, 0x62ED}, //1659 #CJK UNIFIED IDEOGRAPH + {0xABF9, 0x6301}, //1660 #CJK UNIFIED IDEOGRAPH + {0xABFA, 0x62EE}, //1661 #CJK UNIFIED IDEOGRAPH + {0xABFB, 0x62FD}, //1662 #CJK UNIFIED IDEOGRAPH + {0xABFC, 0x6307}, //1663 #CJK UNIFIED IDEOGRAPH + {0xABFD, 0x62F1}, //1664 #CJK UNIFIED IDEOGRAPH + {0xABFE, 0x62F7}, //1665 #CJK UNIFIED IDEOGRAPH + {0xAC40, 0x62EF}, //1666 #CJK UNIFIED IDEOGRAPH + {0xAC41, 0x62EC}, //1667 #CJK UNIFIED IDEOGRAPH + {0xAC42, 0x62FE}, //1668 #CJK UNIFIED IDEOGRAPH + {0xAC43, 0x62F4}, //1669 #CJK UNIFIED IDEOGRAPH + {0xAC44, 0x6311}, //1670 #CJK UNIFIED IDEOGRAPH + {0xAC45, 0x6302}, //1671 #CJK UNIFIED IDEOGRAPH + {0xAC46, 0x653F}, //1672 #CJK UNIFIED IDEOGRAPH + {0xAC47, 0x6545}, //1673 #CJK UNIFIED IDEOGRAPH + {0xAC48, 0x65AB}, //1674 #CJK UNIFIED IDEOGRAPH + {0xAC49, 0x65BD}, //1675 #CJK UNIFIED IDEOGRAPH + {0xAC4A, 0x65E2}, //1676 #CJK UNIFIED IDEOGRAPH + {0xAC4B, 0x6625}, //1677 #CJK UNIFIED IDEOGRAPH + {0xAC4C, 0x662D}, //1678 #CJK UNIFIED IDEOGRAPH + {0xAC4D, 0x6620}, //1679 #CJK UNIFIED IDEOGRAPH + {0xAC4E, 0x6627}, //1680 #CJK UNIFIED IDEOGRAPH + {0xAC4F, 0x662F}, //1681 #CJK UNIFIED IDEOGRAPH + {0xAC50, 0x661F}, //1682 #CJK UNIFIED IDEOGRAPH + {0xAC51, 0x6628}, //1683 #CJK UNIFIED IDEOGRAPH + {0xAC52, 0x6631}, //1684 #CJK UNIFIED IDEOGRAPH + {0xAC53, 0x6624}, //1685 #CJK UNIFIED IDEOGRAPH + {0xAC54, 0x66F7}, //1686 #CJK UNIFIED IDEOGRAPH + {0xAC55, 0x67FF}, //1687 #CJK UNIFIED IDEOGRAPH + {0xAC56, 0x67D3}, //1688 #CJK UNIFIED IDEOGRAPH + {0xAC57, 0x67F1}, //1689 #CJK UNIFIED IDEOGRAPH + {0xAC58, 0x67D4}, //1690 #CJK UNIFIED IDEOGRAPH + {0xAC59, 0x67D0}, //1691 #CJK UNIFIED IDEOGRAPH + {0xAC5A, 0x67EC}, //1692 #CJK UNIFIED IDEOGRAPH + {0xAC5B, 0x67B6}, //1693 #CJK UNIFIED IDEOGRAPH + {0xAC5C, 0x67AF}, //1694 #CJK UNIFIED IDEOGRAPH + {0xAC5D, 0x67F5}, //1695 #CJK UNIFIED IDEOGRAPH + {0xAC5E, 0x67E9}, //1696 #CJK UNIFIED IDEOGRAPH + {0xAC5F, 0x67EF}, //1697 #CJK UNIFIED IDEOGRAPH + {0xAC60, 0x67C4}, //1698 #CJK UNIFIED IDEOGRAPH + {0xAC61, 0x67D1}, //1699 #CJK UNIFIED IDEOGRAPH + {0xAC62, 0x67B4}, //1700 #CJK UNIFIED IDEOGRAPH + {0xAC63, 0x67DA}, //1701 #CJK UNIFIED IDEOGRAPH + {0xAC64, 0x67E5}, //1702 #CJK UNIFIED IDEOGRAPH + {0xAC65, 0x67B8}, //1703 #CJK UNIFIED IDEOGRAPH + {0xAC66, 0x67CF}, //1704 #CJK UNIFIED IDEOGRAPH + {0xAC67, 0x67DE}, //1705 #CJK UNIFIED IDEOGRAPH + {0xAC68, 0x67F3}, //1706 #CJK UNIFIED IDEOGRAPH + {0xAC69, 0x67B0}, //1707 #CJK UNIFIED IDEOGRAPH + {0xAC6A, 0x67D9}, //1708 #CJK UNIFIED IDEOGRAPH + {0xAC6B, 0x67E2}, //1709 #CJK UNIFIED IDEOGRAPH + {0xAC6C, 0x67DD}, //1710 #CJK UNIFIED IDEOGRAPH + {0xAC6D, 0x67D2}, //1711 #CJK UNIFIED IDEOGRAPH + {0xAC6E, 0x6B6A}, //1712 #CJK UNIFIED IDEOGRAPH + {0xAC6F, 0x6B83}, //1713 #CJK UNIFIED IDEOGRAPH + {0xAC70, 0x6B86}, //1714 #CJK UNIFIED IDEOGRAPH + {0xAC71, 0x6BB5}, //1715 #CJK UNIFIED IDEOGRAPH + {0xAC72, 0x6BD2}, //1716 #CJK UNIFIED IDEOGRAPH + {0xAC73, 0x6BD7}, //1717 #CJK UNIFIED IDEOGRAPH + {0xAC74, 0x6C1F}, //1718 #CJK UNIFIED IDEOGRAPH + {0xAC75, 0x6CC9}, //1719 #CJK UNIFIED IDEOGRAPH + {0xAC76, 0x6D0B}, //1720 #CJK UNIFIED IDEOGRAPH + {0xAC77, 0x6D32}, //1721 #CJK UNIFIED IDEOGRAPH + {0xAC78, 0x6D2A}, //1722 #CJK UNIFIED IDEOGRAPH + {0xAC79, 0x6D41}, //1723 #CJK UNIFIED IDEOGRAPH + {0xAC7A, 0x6D25}, //1724 #CJK UNIFIED IDEOGRAPH + {0xAC7B, 0x6D0C}, //1725 #CJK UNIFIED IDEOGRAPH + {0xAC7C, 0x6D31}, //1726 #CJK UNIFIED IDEOGRAPH + {0xAC7D, 0x6D1E}, //1727 #CJK UNIFIED IDEOGRAPH + {0xAC7E, 0x6D17}, //1728 #CJK UNIFIED IDEOGRAPH + {0xACA1, 0x6D3B}, //1729 #CJK UNIFIED IDEOGRAPH + {0xACA2, 0x6D3D}, //1730 #CJK UNIFIED IDEOGRAPH + {0xACA3, 0x6D3E}, //1731 #CJK UNIFIED IDEOGRAPH + {0xACA4, 0x6D36}, //1732 #CJK UNIFIED IDEOGRAPH + {0xACA5, 0x6D1B}, //1733 #CJK UNIFIED IDEOGRAPH + {0xACA6, 0x6CF5}, //1734 #CJK UNIFIED IDEOGRAPH + {0xACA7, 0x6D39}, //1735 #CJK UNIFIED IDEOGRAPH + {0xACA8, 0x6D27}, //1736 #CJK UNIFIED IDEOGRAPH + {0xACA9, 0x6D38}, //1737 #CJK UNIFIED IDEOGRAPH + {0xACAA, 0x6D29}, //1738 #CJK UNIFIED IDEOGRAPH + {0xACAB, 0x6D2E}, //1739 #CJK UNIFIED IDEOGRAPH + {0xACAC, 0x6D35}, //1740 #CJK UNIFIED IDEOGRAPH + {0xACAD, 0x6D0E}, //1741 #CJK UNIFIED IDEOGRAPH + {0xACAE, 0x6D2B}, //1742 #CJK UNIFIED IDEOGRAPH + {0xACAF, 0x70AB}, //1743 #CJK UNIFIED IDEOGRAPH + {0xACB0, 0x70BA}, //1744 #CJK UNIFIED IDEOGRAPH + {0xACB1, 0x70B3}, //1745 #CJK UNIFIED IDEOGRAPH + {0xACB2, 0x70AC}, //1746 #CJK UNIFIED IDEOGRAPH + {0xACB3, 0x70AF}, //1747 #CJK UNIFIED IDEOGRAPH + {0xACB4, 0x70AD}, //1748 #CJK UNIFIED IDEOGRAPH + {0xACB5, 0x70B8}, //1749 #CJK UNIFIED IDEOGRAPH + {0xACB6, 0x70AE}, //1750 #CJK UNIFIED IDEOGRAPH + {0xACB7, 0x70A4}, //1751 #CJK UNIFIED IDEOGRAPH + {0xACB8, 0x7230}, //1752 #CJK UNIFIED IDEOGRAPH + {0xACB9, 0x7272}, //1753 #CJK UNIFIED IDEOGRAPH + {0xACBA, 0x726F}, //1754 #CJK UNIFIED IDEOGRAPH + {0xACBB, 0x7274}, //1755 #CJK UNIFIED IDEOGRAPH + {0xACBC, 0x72E9}, //1756 #CJK UNIFIED IDEOGRAPH + {0xACBD, 0x72E0}, //1757 #CJK UNIFIED IDEOGRAPH + {0xACBE, 0x72E1}, //1758 #CJK UNIFIED IDEOGRAPH + {0xACBF, 0x73B7}, //1759 #CJK UNIFIED IDEOGRAPH + {0xACC0, 0x73CA}, //1760 #CJK UNIFIED IDEOGRAPH + {0xACC1, 0x73BB}, //1761 #CJK UNIFIED IDEOGRAPH + {0xACC2, 0x73B2}, //1762 #CJK UNIFIED IDEOGRAPH + {0xACC3, 0x73CD}, //1763 #CJK UNIFIED IDEOGRAPH + {0xACC4, 0x73C0}, //1764 #CJK UNIFIED IDEOGRAPH + {0xACC5, 0x73B3}, //1765 #CJK UNIFIED IDEOGRAPH + {0xACC6, 0x751A}, //1766 #CJK UNIFIED IDEOGRAPH + {0xACC7, 0x752D}, //1767 #CJK UNIFIED IDEOGRAPH + {0xACC8, 0x754F}, //1768 #CJK UNIFIED IDEOGRAPH + {0xACC9, 0x754C}, //1769 #CJK UNIFIED IDEOGRAPH + {0xACCA, 0x754E}, //1770 #CJK UNIFIED IDEOGRAPH + {0xACCB, 0x754B}, //1771 #CJK UNIFIED IDEOGRAPH + {0xACCC, 0x75AB}, //1772 #CJK UNIFIED IDEOGRAPH + {0xACCD, 0x75A4}, //1773 #CJK UNIFIED IDEOGRAPH + {0xACCE, 0x75A5}, //1774 #CJK UNIFIED IDEOGRAPH + {0xACCF, 0x75A2}, //1775 #CJK UNIFIED IDEOGRAPH + {0xACD0, 0x75A3}, //1776 #CJK UNIFIED IDEOGRAPH + {0xACD1, 0x7678}, //1777 #CJK UNIFIED IDEOGRAPH + {0xACD2, 0x7686}, //1778 #CJK UNIFIED IDEOGRAPH + {0xACD3, 0x7687}, //1779 #CJK UNIFIED IDEOGRAPH + {0xACD4, 0x7688}, //1780 #CJK UNIFIED IDEOGRAPH + {0xACD5, 0x76C8}, //1781 #CJK UNIFIED IDEOGRAPH + {0xACD6, 0x76C6}, //1782 #CJK UNIFIED IDEOGRAPH + {0xACD7, 0x76C3}, //1783 #CJK UNIFIED IDEOGRAPH + {0xACD8, 0x76C5}, //1784 #CJK UNIFIED IDEOGRAPH + {0xACD9, 0x7701}, //1785 #CJK UNIFIED IDEOGRAPH + {0xACDA, 0x76F9}, //1786 #CJK UNIFIED IDEOGRAPH + {0xACDB, 0x76F8}, //1787 #CJK UNIFIED IDEOGRAPH + {0xACDC, 0x7709}, //1788 #CJK UNIFIED IDEOGRAPH + {0xACDD, 0x770B}, //1789 #CJK UNIFIED IDEOGRAPH + {0xACDE, 0x76FE}, //1790 #CJK UNIFIED IDEOGRAPH + {0xACDF, 0x76FC}, //1791 #CJK UNIFIED IDEOGRAPH + {0xACE0, 0x7707}, //1792 #CJK UNIFIED IDEOGRAPH + {0xACE1, 0x77DC}, //1793 #CJK UNIFIED IDEOGRAPH + {0xACE2, 0x7802}, //1794 #CJK UNIFIED IDEOGRAPH + {0xACE3, 0x7814}, //1795 #CJK UNIFIED IDEOGRAPH + {0xACE4, 0x780C}, //1796 #CJK UNIFIED IDEOGRAPH + {0xACE5, 0x780D}, //1797 #CJK UNIFIED IDEOGRAPH + {0xACE6, 0x7946}, //1798 #CJK UNIFIED IDEOGRAPH + {0xACE7, 0x7949}, //1799 #CJK UNIFIED IDEOGRAPH + {0xACE8, 0x7948}, //1800 #CJK UNIFIED IDEOGRAPH + {0xACE9, 0x7947}, //1801 #CJK UNIFIED IDEOGRAPH + {0xACEA, 0x79B9}, //1802 #CJK UNIFIED IDEOGRAPH + {0xACEB, 0x79BA}, //1803 #CJK UNIFIED IDEOGRAPH + {0xACEC, 0x79D1}, //1804 #CJK UNIFIED IDEOGRAPH + {0xACED, 0x79D2}, //1805 #CJK UNIFIED IDEOGRAPH + {0xACEE, 0x79CB}, //1806 #CJK UNIFIED IDEOGRAPH + {0xACEF, 0x7A7F}, //1807 #CJK UNIFIED IDEOGRAPH + {0xACF0, 0x7A81}, //1808 #CJK UNIFIED IDEOGRAPH + {0xACF1, 0x7AFF}, //1809 #CJK UNIFIED IDEOGRAPH + {0xACF2, 0x7AFD}, //1810 #CJK UNIFIED IDEOGRAPH + {0xACF3, 0x7C7D}, //1811 #CJK UNIFIED IDEOGRAPH + {0xACF4, 0x7D02}, //1812 #CJK UNIFIED IDEOGRAPH + {0xACF5, 0x7D05}, //1813 #CJK UNIFIED IDEOGRAPH + {0xACF6, 0x7D00}, //1814 #CJK UNIFIED IDEOGRAPH + {0xACF7, 0x7D09}, //1815 #CJK UNIFIED IDEOGRAPH + {0xACF8, 0x7D07}, //1816 #CJK UNIFIED IDEOGRAPH + {0xACF9, 0x7D04}, //1817 #CJK UNIFIED IDEOGRAPH + {0xACFA, 0x7D06}, //1818 #CJK UNIFIED IDEOGRAPH + {0xACFB, 0x7F38}, //1819 #CJK UNIFIED IDEOGRAPH + {0xACFC, 0x7F8E}, //1820 #CJK UNIFIED IDEOGRAPH + {0xACFD, 0x7FBF}, //1821 #CJK UNIFIED IDEOGRAPH + {0xACFE, 0x8004}, //1822 #CJK UNIFIED IDEOGRAPH + {0xAD40, 0x8010}, //1823 #CJK UNIFIED IDEOGRAPH + {0xAD41, 0x800D}, //1824 #CJK UNIFIED IDEOGRAPH + {0xAD42, 0x8011}, //1825 #CJK UNIFIED IDEOGRAPH + {0xAD43, 0x8036}, //1826 #CJK UNIFIED IDEOGRAPH + {0xAD44, 0x80D6}, //1827 #CJK UNIFIED IDEOGRAPH + {0xAD45, 0x80E5}, //1828 #CJK UNIFIED IDEOGRAPH + {0xAD46, 0x80DA}, //1829 #CJK UNIFIED IDEOGRAPH + {0xAD47, 0x80C3}, //1830 #CJK UNIFIED IDEOGRAPH + {0xAD48, 0x80C4}, //1831 #CJK UNIFIED IDEOGRAPH + {0xAD49, 0x80CC}, //1832 #CJK UNIFIED IDEOGRAPH + {0xAD4A, 0x80E1}, //1833 #CJK UNIFIED IDEOGRAPH + {0xAD4B, 0x80DB}, //1834 #CJK UNIFIED IDEOGRAPH + {0xAD4C, 0x80CE}, //1835 #CJK UNIFIED IDEOGRAPH + {0xAD4D, 0x80DE}, //1836 #CJK UNIFIED IDEOGRAPH + {0xAD4E, 0x80E4}, //1837 #CJK UNIFIED IDEOGRAPH + {0xAD4F, 0x80DD}, //1838 #CJK UNIFIED IDEOGRAPH + {0xAD50, 0x81F4}, //1839 #CJK UNIFIED IDEOGRAPH + {0xAD51, 0x8222}, //1840 #CJK UNIFIED IDEOGRAPH + {0xAD52, 0x82E7}, //1841 #CJK UNIFIED IDEOGRAPH + {0xAD53, 0x8303}, //1842 #CJK UNIFIED IDEOGRAPH + {0xAD54, 0x8305}, //1843 #CJK UNIFIED IDEOGRAPH + {0xAD55, 0x82E3}, //1844 #CJK UNIFIED IDEOGRAPH + {0xAD56, 0x82DB}, //1845 #CJK UNIFIED IDEOGRAPH + {0xAD57, 0x82E6}, //1846 #CJK UNIFIED IDEOGRAPH + {0xAD58, 0x8304}, //1847 #CJK UNIFIED IDEOGRAPH + {0xAD59, 0x82E5}, //1848 #CJK UNIFIED IDEOGRAPH + {0xAD5A, 0x8302}, //1849 #CJK UNIFIED IDEOGRAPH + {0xAD5B, 0x8309}, //1850 #CJK UNIFIED IDEOGRAPH + {0xAD5C, 0x82D2}, //1851 #CJK UNIFIED IDEOGRAPH + {0xAD5D, 0x82D7}, //1852 #CJK UNIFIED IDEOGRAPH + {0xAD5E, 0x82F1}, //1853 #CJK UNIFIED IDEOGRAPH + {0xAD5F, 0x8301}, //1854 #CJK UNIFIED IDEOGRAPH + {0xAD60, 0x82DC}, //1855 #CJK UNIFIED IDEOGRAPH + {0xAD61, 0x82D4}, //1856 #CJK UNIFIED IDEOGRAPH + {0xAD62, 0x82D1}, //1857 #CJK UNIFIED IDEOGRAPH + {0xAD63, 0x82DE}, //1858 #CJK UNIFIED IDEOGRAPH + {0xAD64, 0x82D3}, //1859 #CJK UNIFIED IDEOGRAPH + {0xAD65, 0x82DF}, //1860 #CJK UNIFIED IDEOGRAPH + {0xAD66, 0x82EF}, //1861 #CJK UNIFIED IDEOGRAPH + {0xAD67, 0x8306}, //1862 #CJK UNIFIED IDEOGRAPH + {0xAD68, 0x8650}, //1863 #CJK UNIFIED IDEOGRAPH + {0xAD69, 0x8679}, //1864 #CJK UNIFIED IDEOGRAPH + {0xAD6A, 0x867B}, //1865 #CJK UNIFIED IDEOGRAPH + {0xAD6B, 0x867A}, //1866 #CJK UNIFIED IDEOGRAPH + {0xAD6C, 0x884D}, //1867 #CJK UNIFIED IDEOGRAPH + {0xAD6D, 0x886B}, //1868 #CJK UNIFIED IDEOGRAPH + {0xAD6E, 0x8981}, //1869 #CJK UNIFIED IDEOGRAPH + {0xAD6F, 0x89D4}, //1870 #CJK UNIFIED IDEOGRAPH + {0xAD70, 0x8A08}, //1871 #CJK UNIFIED IDEOGRAPH + {0xAD71, 0x8A02}, //1872 #CJK UNIFIED IDEOGRAPH + {0xAD72, 0x8A03}, //1873 #CJK UNIFIED IDEOGRAPH + {0xAD73, 0x8C9E}, //1874 #CJK UNIFIED IDEOGRAPH + {0xAD74, 0x8CA0}, //1875 #CJK UNIFIED IDEOGRAPH + {0xAD75, 0x8D74}, //1876 #CJK UNIFIED IDEOGRAPH + {0xAD76, 0x8D73}, //1877 #CJK UNIFIED IDEOGRAPH + {0xAD77, 0x8DB4}, //1878 #CJK UNIFIED IDEOGRAPH + {0xAD78, 0x8ECD}, //1879 #CJK UNIFIED IDEOGRAPH + {0xAD79, 0x8ECC}, //1880 #CJK UNIFIED IDEOGRAPH + {0xAD7A, 0x8FF0}, //1881 #CJK UNIFIED IDEOGRAPH + {0xAD7B, 0x8FE6}, //1882 #CJK UNIFIED IDEOGRAPH + {0xAD7C, 0x8FE2}, //1883 #CJK UNIFIED IDEOGRAPH + {0xAD7D, 0x8FEA}, //1884 #CJK UNIFIED IDEOGRAPH + {0xAD7E, 0x8FE5}, //1885 #CJK UNIFIED IDEOGRAPH + {0xADA1, 0x8FED}, //1886 #CJK UNIFIED IDEOGRAPH + {0xADA2, 0x8FEB}, //1887 #CJK UNIFIED IDEOGRAPH + {0xADA3, 0x8FE4}, //1888 #CJK UNIFIED IDEOGRAPH + {0xADA4, 0x8FE8}, //1889 #CJK UNIFIED IDEOGRAPH + {0xADA5, 0x90CA}, //1890 #CJK UNIFIED IDEOGRAPH + {0xADA6, 0x90CE}, //1891 #CJK UNIFIED IDEOGRAPH + {0xADA7, 0x90C1}, //1892 #CJK UNIFIED IDEOGRAPH + {0xADA8, 0x90C3}, //1893 #CJK UNIFIED IDEOGRAPH + {0xADA9, 0x914B}, //1894 #CJK UNIFIED IDEOGRAPH + {0xADAA, 0x914A}, //1895 #CJK UNIFIED IDEOGRAPH + {0xADAB, 0x91CD}, //1896 #CJK UNIFIED IDEOGRAPH + {0xADAC, 0x9582}, //1897 #CJK UNIFIED IDEOGRAPH + {0xADAD, 0x9650}, //1898 #CJK UNIFIED IDEOGRAPH + {0xADAE, 0x964B}, //1899 #CJK UNIFIED IDEOGRAPH + {0xADAF, 0x964C}, //1900 #CJK UNIFIED IDEOGRAPH + {0xADB0, 0x964D}, //1901 #CJK UNIFIED IDEOGRAPH + {0xADB1, 0x9762}, //1902 #CJK UNIFIED IDEOGRAPH + {0xADB2, 0x9769}, //1903 #CJK UNIFIED IDEOGRAPH + {0xADB3, 0x97CB}, //1904 #CJK UNIFIED IDEOGRAPH + {0xADB4, 0x97ED}, //1905 #CJK UNIFIED IDEOGRAPH + {0xADB5, 0x97F3}, //1906 #CJK UNIFIED IDEOGRAPH + {0xADB6, 0x9801}, //1907 #CJK UNIFIED IDEOGRAPH + {0xADB7, 0x98A8}, //1908 #CJK UNIFIED IDEOGRAPH + {0xADB8, 0x98DB}, //1909 #CJK UNIFIED IDEOGRAPH + {0xADB9, 0x98DF}, //1910 #CJK UNIFIED IDEOGRAPH + {0xADBA, 0x9996}, //1911 #CJK UNIFIED IDEOGRAPH + {0xADBB, 0x9999}, //1912 #CJK UNIFIED IDEOGRAPH + {0xADBC, 0x4E58}, //1913 #CJK UNIFIED IDEOGRAPH + {0xADBD, 0x4EB3}, //1914 #CJK UNIFIED IDEOGRAPH + {0xADBE, 0x500C}, //1915 #CJK UNIFIED IDEOGRAPH + {0xADBF, 0x500D}, //1916 #CJK UNIFIED IDEOGRAPH + {0xADC0, 0x5023}, //1917 #CJK UNIFIED IDEOGRAPH + {0xADC1, 0x4FEF}, //1918 #CJK UNIFIED IDEOGRAPH + {0xADC2, 0x5026}, //1919 #CJK UNIFIED IDEOGRAPH + {0xADC3, 0x5025}, //1920 #CJK UNIFIED IDEOGRAPH + {0xADC4, 0x4FF8}, //1921 #CJK UNIFIED IDEOGRAPH + {0xADC5, 0x5029}, //1922 #CJK UNIFIED IDEOGRAPH + {0xADC6, 0x5016}, //1923 #CJK UNIFIED IDEOGRAPH + {0xADC7, 0x5006}, //1924 #CJK UNIFIED IDEOGRAPH + {0xADC8, 0x503C}, //1925 #CJK UNIFIED IDEOGRAPH + {0xADC9, 0x501F}, //1926 #CJK UNIFIED IDEOGRAPH + {0xADCA, 0x501A}, //1927 #CJK UNIFIED IDEOGRAPH + {0xADCB, 0x5012}, //1928 #CJK UNIFIED IDEOGRAPH + {0xADCC, 0x5011}, //1929 #CJK UNIFIED IDEOGRAPH + {0xADCD, 0x4FFA}, //1930 #CJK UNIFIED IDEOGRAPH + {0xADCE, 0x5000}, //1931 #CJK UNIFIED IDEOGRAPH + {0xADCF, 0x5014}, //1932 #CJK UNIFIED IDEOGRAPH + {0xADD0, 0x5028}, //1933 #CJK UNIFIED IDEOGRAPH + {0xADD1, 0x4FF1}, //1934 #CJK UNIFIED IDEOGRAPH + {0xADD2, 0x5021}, //1935 #CJK UNIFIED IDEOGRAPH + {0xADD3, 0x500B}, //1936 #CJK UNIFIED IDEOGRAPH + {0xADD4, 0x5019}, //1937 #CJK UNIFIED IDEOGRAPH + {0xADD5, 0x5018}, //1938 #CJK UNIFIED IDEOGRAPH + {0xADD6, 0x4FF3}, //1939 #CJK UNIFIED IDEOGRAPH + {0xADD7, 0x4FEE}, //1940 #CJK UNIFIED IDEOGRAPH + {0xADD8, 0x502D}, //1941 #CJK UNIFIED IDEOGRAPH + {0xADD9, 0x502A}, //1942 #CJK UNIFIED IDEOGRAPH + {0xADDA, 0x4FFE}, //1943 #CJK UNIFIED IDEOGRAPH + {0xADDB, 0x502B}, //1944 #CJK UNIFIED IDEOGRAPH + {0xADDC, 0x5009}, //1945 #CJK UNIFIED IDEOGRAPH + {0xADDD, 0x517C}, //1946 #CJK UNIFIED IDEOGRAPH + {0xADDE, 0x51A4}, //1947 #CJK UNIFIED IDEOGRAPH + {0xADDF, 0x51A5}, //1948 #CJK UNIFIED IDEOGRAPH + {0xADE0, 0x51A2}, //1949 #CJK UNIFIED IDEOGRAPH + {0xADE1, 0x51CD}, //1950 #CJK UNIFIED IDEOGRAPH + {0xADE2, 0x51CC}, //1951 #CJK UNIFIED IDEOGRAPH + {0xADE3, 0x51C6}, //1952 #CJK UNIFIED IDEOGRAPH + {0xADE4, 0x51CB}, //1953 #CJK UNIFIED IDEOGRAPH + {0xADE5, 0x5256}, //1954 #CJK UNIFIED IDEOGRAPH + {0xADE6, 0x525C}, //1955 #CJK UNIFIED IDEOGRAPH + {0xADE7, 0x5254}, //1956 #CJK UNIFIED IDEOGRAPH + {0xADE8, 0x525B}, //1957 #CJK UNIFIED IDEOGRAPH + {0xADE9, 0x525D}, //1958 #CJK UNIFIED IDEOGRAPH + {0xADEA, 0x532A}, //1959 #CJK UNIFIED IDEOGRAPH + {0xADEB, 0x537F}, //1960 #CJK UNIFIED IDEOGRAPH + {0xADEC, 0x539F}, //1961 #CJK UNIFIED IDEOGRAPH + {0xADED, 0x539D}, //1962 #CJK UNIFIED IDEOGRAPH + {0xADEE, 0x53DF}, //1963 #CJK UNIFIED IDEOGRAPH + {0xADEF, 0x54E8}, //1964 #CJK UNIFIED IDEOGRAPH + {0xADF0, 0x5510}, //1965 #CJK UNIFIED IDEOGRAPH + {0xADF1, 0x5501}, //1966 #CJK UNIFIED IDEOGRAPH + {0xADF2, 0x5537}, //1967 #CJK UNIFIED IDEOGRAPH + {0xADF3, 0x54FC}, //1968 #CJK UNIFIED IDEOGRAPH + {0xADF4, 0x54E5}, //1969 #CJK UNIFIED IDEOGRAPH + {0xADF5, 0x54F2}, //1970 #CJK UNIFIED IDEOGRAPH + {0xADF6, 0x5506}, //1971 #CJK UNIFIED IDEOGRAPH + {0xADF7, 0x54FA}, //1972 #CJK UNIFIED IDEOGRAPH + {0xADF8, 0x5514}, //1973 #CJK UNIFIED IDEOGRAPH + {0xADF9, 0x54E9}, //1974 #CJK UNIFIED IDEOGRAPH + {0xADFA, 0x54ED}, //1975 #CJK UNIFIED IDEOGRAPH + {0xADFB, 0x54E1}, //1976 #CJK UNIFIED IDEOGRAPH + {0xADFC, 0x5509}, //1977 #CJK UNIFIED IDEOGRAPH + {0xADFD, 0x54EE}, //1978 #CJK UNIFIED IDEOGRAPH + {0xADFE, 0x54EA}, //1979 #CJK UNIFIED IDEOGRAPH + {0xAE40, 0x54E6}, //1980 #CJK UNIFIED IDEOGRAPH + {0xAE41, 0x5527}, //1981 #CJK UNIFIED IDEOGRAPH + {0xAE42, 0x5507}, //1982 #CJK UNIFIED IDEOGRAPH + {0xAE43, 0x54FD}, //1983 #CJK UNIFIED IDEOGRAPH + {0xAE44, 0x550F}, //1984 #CJK UNIFIED IDEOGRAPH + {0xAE45, 0x5703}, //1985 #CJK UNIFIED IDEOGRAPH + {0xAE46, 0x5704}, //1986 #CJK UNIFIED IDEOGRAPH + {0xAE47, 0x57C2}, //1987 #CJK UNIFIED IDEOGRAPH + {0xAE48, 0x57D4}, //1988 #CJK UNIFIED IDEOGRAPH + {0xAE49, 0x57CB}, //1989 #CJK UNIFIED IDEOGRAPH + {0xAE4A, 0x57C3}, //1990 #CJK UNIFIED IDEOGRAPH + {0xAE4B, 0x5809}, //1991 #CJK UNIFIED IDEOGRAPH + {0xAE4C, 0x590F}, //1992 #CJK UNIFIED IDEOGRAPH + {0xAE4D, 0x5957}, //1993 #CJK UNIFIED IDEOGRAPH + {0xAE4E, 0x5958}, //1994 #CJK UNIFIED IDEOGRAPH + {0xAE4F, 0x595A}, //1995 #CJK UNIFIED IDEOGRAPH + {0xAE50, 0x5A11}, //1996 #CJK UNIFIED IDEOGRAPH + {0xAE51, 0x5A18}, //1997 #CJK UNIFIED IDEOGRAPH + {0xAE52, 0x5A1C}, //1998 #CJK UNIFIED IDEOGRAPH + {0xAE53, 0x5A1F}, //1999 #CJK UNIFIED IDEOGRAPH + {0xAE54, 0x5A1B}, //2000 #CJK UNIFIED IDEOGRAPH + {0xAE55, 0x5A13}, //2001 #CJK UNIFIED IDEOGRAPH + {0xAE56, 0x59EC}, //2002 #CJK UNIFIED IDEOGRAPH + {0xAE57, 0x5A20}, //2003 #CJK UNIFIED IDEOGRAPH + {0xAE58, 0x5A23}, //2004 #CJK UNIFIED IDEOGRAPH + {0xAE59, 0x5A29}, //2005 #CJK UNIFIED IDEOGRAPH + {0xAE5A, 0x5A25}, //2006 #CJK UNIFIED IDEOGRAPH + {0xAE5B, 0x5A0C}, //2007 #CJK UNIFIED IDEOGRAPH + {0xAE5C, 0x5A09}, //2008 #CJK UNIFIED IDEOGRAPH + {0xAE5D, 0x5B6B}, //2009 #CJK UNIFIED IDEOGRAPH + {0xAE5E, 0x5C58}, //2010 #CJK UNIFIED IDEOGRAPH + {0xAE5F, 0x5BB0}, //2011 #CJK UNIFIED IDEOGRAPH + {0xAE60, 0x5BB3}, //2012 #CJK UNIFIED IDEOGRAPH + {0xAE61, 0x5BB6}, //2013 #CJK UNIFIED IDEOGRAPH + {0xAE62, 0x5BB4}, //2014 #CJK UNIFIED IDEOGRAPH + {0xAE63, 0x5BAE}, //2015 #CJK UNIFIED IDEOGRAPH + {0xAE64, 0x5BB5}, //2016 #CJK UNIFIED IDEOGRAPH + {0xAE65, 0x5BB9}, //2017 #CJK UNIFIED IDEOGRAPH + {0xAE66, 0x5BB8}, //2018 #CJK UNIFIED IDEOGRAPH + {0xAE67, 0x5C04}, //2019 #CJK UNIFIED IDEOGRAPH + {0xAE68, 0x5C51}, //2020 #CJK UNIFIED IDEOGRAPH + {0xAE69, 0x5C55}, //2021 #CJK UNIFIED IDEOGRAPH + {0xAE6A, 0x5C50}, //2022 #CJK UNIFIED IDEOGRAPH + {0xAE6B, 0x5CED}, //2023 #CJK UNIFIED IDEOGRAPH + {0xAE6C, 0x5CFD}, //2024 #CJK UNIFIED IDEOGRAPH + {0xAE6D, 0x5CFB}, //2025 #CJK UNIFIED IDEOGRAPH + {0xAE6E, 0x5CEA}, //2026 #CJK UNIFIED IDEOGRAPH + {0xAE6F, 0x5CE8}, //2027 #CJK UNIFIED IDEOGRAPH + {0xAE70, 0x5CF0}, //2028 #CJK UNIFIED IDEOGRAPH + {0xAE71, 0x5CF6}, //2029 #CJK UNIFIED IDEOGRAPH + {0xAE72, 0x5D01}, //2030 #CJK UNIFIED IDEOGRAPH + {0xAE73, 0x5CF4}, //2031 #CJK UNIFIED IDEOGRAPH + {0xAE74, 0x5DEE}, //2032 #CJK UNIFIED IDEOGRAPH + {0xAE75, 0x5E2D}, //2033 #CJK UNIFIED IDEOGRAPH + {0xAE76, 0x5E2B}, //2034 #CJK UNIFIED IDEOGRAPH + {0xAE77, 0x5EAB}, //2035 #CJK UNIFIED IDEOGRAPH + {0xAE78, 0x5EAD}, //2036 #CJK UNIFIED IDEOGRAPH + {0xAE79, 0x5EA7}, //2037 #CJK UNIFIED IDEOGRAPH + {0xAE7A, 0x5F31}, //2038 #CJK UNIFIED IDEOGRAPH + {0xAE7B, 0x5F92}, //2039 #CJK UNIFIED IDEOGRAPH + {0xAE7C, 0x5F91}, //2040 #CJK UNIFIED IDEOGRAPH + {0xAE7D, 0x5F90}, //2041 #CJK UNIFIED IDEOGRAPH + {0xAE7E, 0x6059}, //2042 #CJK UNIFIED IDEOGRAPH + {0xAEA1, 0x6063}, //2043 #CJK UNIFIED IDEOGRAPH + {0xAEA2, 0x6065}, //2044 #CJK UNIFIED IDEOGRAPH + {0xAEA3, 0x6050}, //2045 #CJK UNIFIED IDEOGRAPH + {0xAEA4, 0x6055}, //2046 #CJK UNIFIED IDEOGRAPH + {0xAEA5, 0x606D}, //2047 #CJK UNIFIED IDEOGRAPH + {0xAEA6, 0x6069}, //2048 #CJK UNIFIED IDEOGRAPH + {0xAEA7, 0x606F}, //2049 #CJK UNIFIED IDEOGRAPH + {0xAEA8, 0x6084}, //2050 #CJK UNIFIED IDEOGRAPH + {0xAEA9, 0x609F}, //2051 #CJK UNIFIED IDEOGRAPH + {0xAEAA, 0x609A}, //2052 #CJK UNIFIED IDEOGRAPH + {0xAEAB, 0x608D}, //2053 #CJK UNIFIED IDEOGRAPH + {0xAEAC, 0x6094}, //2054 #CJK UNIFIED IDEOGRAPH + {0xAEAD, 0x608C}, //2055 #CJK UNIFIED IDEOGRAPH + {0xAEAE, 0x6085}, //2056 #CJK UNIFIED IDEOGRAPH + {0xAEAF, 0x6096}, //2057 #CJK UNIFIED IDEOGRAPH + {0xAEB0, 0x6247}, //2058 #CJK UNIFIED IDEOGRAPH + {0xAEB1, 0x62F3}, //2059 #CJK UNIFIED IDEOGRAPH + {0xAEB2, 0x6308}, //2060 #CJK UNIFIED IDEOGRAPH + {0xAEB3, 0x62FF}, //2061 #CJK UNIFIED IDEOGRAPH + {0xAEB4, 0x634E}, //2062 #CJK UNIFIED IDEOGRAPH + {0xAEB5, 0x633E}, //2063 #CJK UNIFIED IDEOGRAPH + {0xAEB6, 0x632F}, //2064 #CJK UNIFIED IDEOGRAPH + {0xAEB7, 0x6355}, //2065 #CJK UNIFIED IDEOGRAPH + {0xAEB8, 0x6342}, //2066 #CJK UNIFIED IDEOGRAPH + {0xAEB9, 0x6346}, //2067 #CJK UNIFIED IDEOGRAPH + {0xAEBA, 0x634F}, //2068 #CJK UNIFIED IDEOGRAPH + {0xAEBB, 0x6349}, //2069 #CJK UNIFIED IDEOGRAPH + {0xAEBC, 0x633A}, //2070 #CJK UNIFIED IDEOGRAPH + {0xAEBD, 0x6350}, //2071 #CJK UNIFIED IDEOGRAPH + {0xAEBE, 0x633D}, //2072 #CJK UNIFIED IDEOGRAPH + {0xAEBF, 0x632A}, //2073 #CJK UNIFIED IDEOGRAPH + {0xAEC0, 0x632B}, //2074 #CJK UNIFIED IDEOGRAPH + {0xAEC1, 0x6328}, //2075 #CJK UNIFIED IDEOGRAPH + {0xAEC2, 0x634D}, //2076 #CJK UNIFIED IDEOGRAPH + {0xAEC3, 0x634C}, //2077 #CJK UNIFIED IDEOGRAPH + {0xAEC4, 0x6548}, //2078 #CJK UNIFIED IDEOGRAPH + {0xAEC5, 0x6549}, //2079 #CJK UNIFIED IDEOGRAPH + {0xAEC6, 0x6599}, //2080 #CJK UNIFIED IDEOGRAPH + {0xAEC7, 0x65C1}, //2081 #CJK UNIFIED IDEOGRAPH + {0xAEC8, 0x65C5}, //2082 #CJK UNIFIED IDEOGRAPH + {0xAEC9, 0x6642}, //2083 #CJK UNIFIED IDEOGRAPH + {0xAECA, 0x6649}, //2084 #CJK UNIFIED IDEOGRAPH + {0xAECB, 0x664F}, //2085 #CJK UNIFIED IDEOGRAPH + {0xAECC, 0x6643}, //2086 #CJK UNIFIED IDEOGRAPH + {0xAECD, 0x6652}, //2087 #CJK UNIFIED IDEOGRAPH + {0xAECE, 0x664C}, //2088 #CJK UNIFIED IDEOGRAPH + {0xAECF, 0x6645}, //2089 #CJK UNIFIED IDEOGRAPH + {0xAED0, 0x6641}, //2090 #CJK UNIFIED IDEOGRAPH + {0xAED1, 0x66F8}, //2091 #CJK UNIFIED IDEOGRAPH + {0xAED2, 0x6714}, //2092 #CJK UNIFIED IDEOGRAPH + {0xAED3, 0x6715}, //2093 #CJK UNIFIED IDEOGRAPH + {0xAED4, 0x6717}, //2094 #CJK UNIFIED IDEOGRAPH + {0xAED5, 0x6821}, //2095 #CJK UNIFIED IDEOGRAPH + {0xAED6, 0x6838}, //2096 #CJK UNIFIED IDEOGRAPH + {0xAED7, 0x6848}, //2097 #CJK UNIFIED IDEOGRAPH + {0xAED8, 0x6846}, //2098 #CJK UNIFIED IDEOGRAPH + {0xAED9, 0x6853}, //2099 #CJK UNIFIED IDEOGRAPH + {0xAEDA, 0x6839}, //2100 #CJK UNIFIED IDEOGRAPH + {0xAEDB, 0x6842}, //2101 #CJK UNIFIED IDEOGRAPH + {0xAEDC, 0x6854}, //2102 #CJK UNIFIED IDEOGRAPH + {0xAEDD, 0x6829}, //2103 #CJK UNIFIED IDEOGRAPH + {0xAEDE, 0x68B3}, //2104 #CJK UNIFIED IDEOGRAPH + {0xAEDF, 0x6817}, //2105 #CJK UNIFIED IDEOGRAPH + {0xAEE0, 0x684C}, //2106 #CJK UNIFIED IDEOGRAPH + {0xAEE1, 0x6851}, //2107 #CJK UNIFIED IDEOGRAPH + {0xAEE2, 0x683D}, //2108 #CJK UNIFIED IDEOGRAPH + {0xAEE3, 0x67F4}, //2109 #CJK UNIFIED IDEOGRAPH + {0xAEE4, 0x6850}, //2110 #CJK UNIFIED IDEOGRAPH + {0xAEE5, 0x6840}, //2111 #CJK UNIFIED IDEOGRAPH + {0xAEE6, 0x683C}, //2112 #CJK UNIFIED IDEOGRAPH + {0xAEE7, 0x6843}, //2113 #CJK UNIFIED IDEOGRAPH + {0xAEE8, 0x682A}, //2114 #CJK UNIFIED IDEOGRAPH + {0xAEE9, 0x6845}, //2115 #CJK UNIFIED IDEOGRAPH + {0xAEEA, 0x6813}, //2116 #CJK UNIFIED IDEOGRAPH + {0xAEEB, 0x6818}, //2117 #CJK UNIFIED IDEOGRAPH + {0xAEEC, 0x6841}, //2118 #CJK UNIFIED IDEOGRAPH + {0xAEED, 0x6B8A}, //2119 #CJK UNIFIED IDEOGRAPH + {0xAEEE, 0x6B89}, //2120 #CJK UNIFIED IDEOGRAPH + {0xAEEF, 0x6BB7}, //2121 #CJK UNIFIED IDEOGRAPH + {0xAEF0, 0x6C23}, //2122 #CJK UNIFIED IDEOGRAPH + {0xAEF1, 0x6C27}, //2123 #CJK UNIFIED IDEOGRAPH + {0xAEF2, 0x6C28}, //2124 #CJK UNIFIED IDEOGRAPH + {0xAEF3, 0x6C26}, //2125 #CJK UNIFIED IDEOGRAPH + {0xAEF4, 0x6C24}, //2126 #CJK UNIFIED IDEOGRAPH + {0xAEF5, 0x6CF0}, //2127 #CJK UNIFIED IDEOGRAPH + {0xAEF6, 0x6D6A}, //2128 #CJK UNIFIED IDEOGRAPH + {0xAEF7, 0x6D95}, //2129 #CJK UNIFIED IDEOGRAPH + {0xAEF8, 0x6D88}, //2130 #CJK UNIFIED IDEOGRAPH + {0xAEF9, 0x6D87}, //2131 #CJK UNIFIED IDEOGRAPH + {0xAEFA, 0x6D66}, //2132 #CJK UNIFIED IDEOGRAPH + {0xAEFB, 0x6D78}, //2133 #CJK UNIFIED IDEOGRAPH + {0xAEFC, 0x6D77}, //2134 #CJK UNIFIED IDEOGRAPH + {0xAEFD, 0x6D59}, //2135 #CJK UNIFIED IDEOGRAPH + {0xAEFE, 0x6D93}, //2136 #CJK UNIFIED IDEOGRAPH + {0xAF40, 0x6D6C}, //2137 #CJK UNIFIED IDEOGRAPH + {0xAF41, 0x6D89}, //2138 #CJK UNIFIED IDEOGRAPH + {0xAF42, 0x6D6E}, //2139 #CJK UNIFIED IDEOGRAPH + {0xAF43, 0x6D5A}, //2140 #CJK UNIFIED IDEOGRAPH + {0xAF44, 0x6D74}, //2141 #CJK UNIFIED IDEOGRAPH + {0xAF45, 0x6D69}, //2142 #CJK UNIFIED IDEOGRAPH + {0xAF46, 0x6D8C}, //2143 #CJK UNIFIED IDEOGRAPH + {0xAF47, 0x6D8A}, //2144 #CJK UNIFIED IDEOGRAPH + {0xAF48, 0x6D79}, //2145 #CJK UNIFIED IDEOGRAPH + {0xAF49, 0x6D85}, //2146 #CJK UNIFIED IDEOGRAPH + {0xAF4A, 0x6D65}, //2147 #CJK UNIFIED IDEOGRAPH + {0xAF4B, 0x6D94}, //2148 #CJK UNIFIED IDEOGRAPH + {0xAF4C, 0x70CA}, //2149 #CJK UNIFIED IDEOGRAPH + {0xAF4D, 0x70D8}, //2150 #CJK UNIFIED IDEOGRAPH + {0xAF4E, 0x70E4}, //2151 #CJK UNIFIED IDEOGRAPH + {0xAF4F, 0x70D9}, //2152 #CJK UNIFIED IDEOGRAPH + {0xAF50, 0x70C8}, //2153 #CJK UNIFIED IDEOGRAPH + {0xAF51, 0x70CF}, //2154 #CJK UNIFIED IDEOGRAPH + {0xAF52, 0x7239}, //2155 #CJK UNIFIED IDEOGRAPH + {0xAF53, 0x7279}, //2156 #CJK UNIFIED IDEOGRAPH + {0xAF54, 0x72FC}, //2157 #CJK UNIFIED IDEOGRAPH + {0xAF55, 0x72F9}, //2158 #CJK UNIFIED IDEOGRAPH + {0xAF56, 0x72FD}, //2159 #CJK UNIFIED IDEOGRAPH + {0xAF57, 0x72F8}, //2160 #CJK UNIFIED IDEOGRAPH + {0xAF58, 0x72F7}, //2161 #CJK UNIFIED IDEOGRAPH + {0xAF59, 0x7386}, //2162 #CJK UNIFIED IDEOGRAPH + {0xAF5A, 0x73ED}, //2163 #CJK UNIFIED IDEOGRAPH + {0xAF5B, 0x7409}, //2164 #CJK UNIFIED IDEOGRAPH + {0xAF5C, 0x73EE}, //2165 #CJK UNIFIED IDEOGRAPH + {0xAF5D, 0x73E0}, //2166 #CJK UNIFIED IDEOGRAPH + {0xAF5E, 0x73EA}, //2167 #CJK UNIFIED IDEOGRAPH + {0xAF5F, 0x73DE}, //2168 #CJK UNIFIED IDEOGRAPH + {0xAF60, 0x7554}, //2169 #CJK UNIFIED IDEOGRAPH + {0xAF61, 0x755D}, //2170 #CJK UNIFIED IDEOGRAPH + {0xAF62, 0x755C}, //2171 #CJK UNIFIED IDEOGRAPH + {0xAF63, 0x755A}, //2172 #CJK UNIFIED IDEOGRAPH + {0xAF64, 0x7559}, //2173 #CJK UNIFIED IDEOGRAPH + {0xAF65, 0x75BE}, //2174 #CJK UNIFIED IDEOGRAPH + {0xAF66, 0x75C5}, //2175 #CJK UNIFIED IDEOGRAPH + {0xAF67, 0x75C7}, //2176 #CJK UNIFIED IDEOGRAPH + {0xAF68, 0x75B2}, //2177 #CJK UNIFIED IDEOGRAPH + {0xAF69, 0x75B3}, //2178 #CJK UNIFIED IDEOGRAPH + {0xAF6A, 0x75BD}, //2179 #CJK UNIFIED IDEOGRAPH + {0xAF6B, 0x75BC}, //2180 #CJK UNIFIED IDEOGRAPH + {0xAF6C, 0x75B9}, //2181 #CJK UNIFIED IDEOGRAPH + {0xAF6D, 0x75C2}, //2182 #CJK UNIFIED IDEOGRAPH + {0xAF6E, 0x75B8}, //2183 #CJK UNIFIED IDEOGRAPH + {0xAF6F, 0x768B}, //2184 #CJK UNIFIED IDEOGRAPH + {0xAF70, 0x76B0}, //2185 #CJK UNIFIED IDEOGRAPH + {0xAF71, 0x76CA}, //2186 #CJK UNIFIED IDEOGRAPH + {0xAF72, 0x76CD}, //2187 #CJK UNIFIED IDEOGRAPH + {0xAF73, 0x76CE}, //2188 #CJK UNIFIED IDEOGRAPH + {0xAF74, 0x7729}, //2189 #CJK UNIFIED IDEOGRAPH + {0xAF75, 0x771F}, //2190 #CJK UNIFIED IDEOGRAPH + {0xAF76, 0x7720}, //2191 #CJK UNIFIED IDEOGRAPH + {0xAF77, 0x7728}, //2192 #CJK UNIFIED IDEOGRAPH + {0xAF78, 0x77E9}, //2193 #CJK UNIFIED IDEOGRAPH + {0xAF79, 0x7830}, //2194 #CJK UNIFIED IDEOGRAPH + {0xAF7A, 0x7827}, //2195 #CJK UNIFIED IDEOGRAPH + {0xAF7B, 0x7838}, //2196 #CJK UNIFIED IDEOGRAPH + {0xAF7C, 0x781D}, //2197 #CJK UNIFIED IDEOGRAPH + {0xAF7D, 0x7834}, //2198 #CJK UNIFIED IDEOGRAPH + {0xAF7E, 0x7837}, //2199 #CJK UNIFIED IDEOGRAPH + {0xAFA1, 0x7825}, //2200 #CJK UNIFIED IDEOGRAPH + {0xAFA2, 0x782D}, //2201 #CJK UNIFIED IDEOGRAPH + {0xAFA3, 0x7820}, //2202 #CJK UNIFIED IDEOGRAPH + {0xAFA4, 0x781F}, //2203 #CJK UNIFIED IDEOGRAPH + {0xAFA5, 0x7832}, //2204 #CJK UNIFIED IDEOGRAPH + {0xAFA6, 0x7955}, //2205 #CJK UNIFIED IDEOGRAPH + {0xAFA7, 0x7950}, //2206 #CJK UNIFIED IDEOGRAPH + {0xAFA8, 0x7960}, //2207 #CJK UNIFIED IDEOGRAPH + {0xAFA9, 0x795F}, //2208 #CJK UNIFIED IDEOGRAPH + {0xAFAA, 0x7956}, //2209 #CJK UNIFIED IDEOGRAPH + {0xAFAB, 0x795E}, //2210 #CJK UNIFIED IDEOGRAPH + {0xAFAC, 0x795D}, //2211 #CJK UNIFIED IDEOGRAPH + {0xAFAD, 0x7957}, //2212 #CJK UNIFIED IDEOGRAPH + {0xAFAE, 0x795A}, //2213 #CJK UNIFIED IDEOGRAPH + {0xAFAF, 0x79E4}, //2214 #CJK UNIFIED IDEOGRAPH + {0xAFB0, 0x79E3}, //2215 #CJK UNIFIED IDEOGRAPH + {0xAFB1, 0x79E7}, //2216 #CJK UNIFIED IDEOGRAPH + {0xAFB2, 0x79DF}, //2217 #CJK UNIFIED IDEOGRAPH + {0xAFB3, 0x79E6}, //2218 #CJK UNIFIED IDEOGRAPH + {0xAFB4, 0x79E9}, //2219 #CJK UNIFIED IDEOGRAPH + {0xAFB5, 0x79D8}, //2220 #CJK UNIFIED IDEOGRAPH + {0xAFB6, 0x7A84}, //2221 #CJK UNIFIED IDEOGRAPH + {0xAFB7, 0x7A88}, //2222 #CJK UNIFIED IDEOGRAPH + {0xAFB8, 0x7AD9}, //2223 #CJK UNIFIED IDEOGRAPH + {0xAFB9, 0x7B06}, //2224 #CJK UNIFIED IDEOGRAPH + {0xAFBA, 0x7B11}, //2225 #CJK UNIFIED IDEOGRAPH + {0xAFBB, 0x7C89}, //2226 #CJK UNIFIED IDEOGRAPH + {0xAFBC, 0x7D21}, //2227 #CJK UNIFIED IDEOGRAPH + {0xAFBD, 0x7D17}, //2228 #CJK UNIFIED IDEOGRAPH + {0xAFBE, 0x7D0B}, //2229 #CJK UNIFIED IDEOGRAPH + {0xAFBF, 0x7D0A}, //2230 #CJK UNIFIED IDEOGRAPH + {0xAFC0, 0x7D20}, //2231 #CJK UNIFIED IDEOGRAPH + {0xAFC1, 0x7D22}, //2232 #CJK UNIFIED IDEOGRAPH + {0xAFC2, 0x7D14}, //2233 #CJK UNIFIED IDEOGRAPH + {0xAFC3, 0x7D10}, //2234 #CJK UNIFIED IDEOGRAPH + {0xAFC4, 0x7D15}, //2235 #CJK UNIFIED IDEOGRAPH + {0xAFC5, 0x7D1A}, //2236 #CJK UNIFIED IDEOGRAPH + {0xAFC6, 0x7D1C}, //2237 #CJK UNIFIED IDEOGRAPH + {0xAFC7, 0x7D0D}, //2238 #CJK UNIFIED IDEOGRAPH + {0xAFC8, 0x7D19}, //2239 #CJK UNIFIED IDEOGRAPH + {0xAFC9, 0x7D1B}, //2240 #CJK UNIFIED IDEOGRAPH + {0xAFCA, 0x7F3A}, //2241 #CJK UNIFIED IDEOGRAPH + {0xAFCB, 0x7F5F}, //2242 #CJK UNIFIED IDEOGRAPH + {0xAFCC, 0x7F94}, //2243 #CJK UNIFIED IDEOGRAPH + {0xAFCD, 0x7FC5}, //2244 #CJK UNIFIED IDEOGRAPH + {0xAFCE, 0x7FC1}, //2245 #CJK UNIFIED IDEOGRAPH + {0xAFCF, 0x8006}, //2246 #CJK UNIFIED IDEOGRAPH + {0xAFD0, 0x8018}, //2247 #CJK UNIFIED IDEOGRAPH + {0xAFD1, 0x8015}, //2248 #CJK UNIFIED IDEOGRAPH + {0xAFD2, 0x8019}, //2249 #CJK UNIFIED IDEOGRAPH + {0xAFD3, 0x8017}, //2250 #CJK UNIFIED IDEOGRAPH + {0xAFD4, 0x803D}, //2251 #CJK UNIFIED IDEOGRAPH + {0xAFD5, 0x803F}, //2252 #CJK UNIFIED IDEOGRAPH + {0xAFD6, 0x80F1}, //2253 #CJK UNIFIED IDEOGRAPH + {0xAFD7, 0x8102}, //2254 #CJK UNIFIED IDEOGRAPH + {0xAFD8, 0x80F0}, //2255 #CJK UNIFIED IDEOGRAPH + {0xAFD9, 0x8105}, //2256 #CJK UNIFIED IDEOGRAPH + {0xAFDA, 0x80ED}, //2257 #CJK UNIFIED IDEOGRAPH + {0xAFDB, 0x80F4}, //2258 #CJK UNIFIED IDEOGRAPH + {0xAFDC, 0x8106}, //2259 #CJK UNIFIED IDEOGRAPH + {0xAFDD, 0x80F8}, //2260 #CJK UNIFIED IDEOGRAPH + {0xAFDE, 0x80F3}, //2261 #CJK UNIFIED IDEOGRAPH + {0xAFDF, 0x8108}, //2262 #CJK UNIFIED IDEOGRAPH + {0xAFE0, 0x80FD}, //2263 #CJK UNIFIED IDEOGRAPH + {0xAFE1, 0x810A}, //2264 #CJK UNIFIED IDEOGRAPH + {0xAFE2, 0x80FC}, //2265 #CJK UNIFIED IDEOGRAPH + {0xAFE3, 0x80EF}, //2266 #CJK UNIFIED IDEOGRAPH + {0xAFE4, 0x81ED}, //2267 #CJK UNIFIED IDEOGRAPH + {0xAFE5, 0x81EC}, //2268 #CJK UNIFIED IDEOGRAPH + {0xAFE6, 0x8200}, //2269 #CJK UNIFIED IDEOGRAPH + {0xAFE7, 0x8210}, //2270 #CJK UNIFIED IDEOGRAPH + {0xAFE8, 0x822A}, //2271 #CJK UNIFIED IDEOGRAPH + {0xAFE9, 0x822B}, //2272 #CJK UNIFIED IDEOGRAPH + {0xAFEA, 0x8228}, //2273 #CJK UNIFIED IDEOGRAPH + {0xAFEB, 0x822C}, //2274 #CJK UNIFIED IDEOGRAPH + {0xAFEC, 0x82BB}, //2275 #CJK UNIFIED IDEOGRAPH + {0xAFED, 0x832B}, //2276 #CJK UNIFIED IDEOGRAPH + {0xAFEE, 0x8352}, //2277 #CJK UNIFIED IDEOGRAPH + {0xAFEF, 0x8354}, //2278 #CJK UNIFIED IDEOGRAPH + {0xAFF0, 0x834A}, //2279 #CJK UNIFIED IDEOGRAPH + {0xAFF1, 0x8338}, //2280 #CJK UNIFIED IDEOGRAPH + {0xAFF2, 0x8350}, //2281 #CJK UNIFIED IDEOGRAPH + {0xAFF3, 0x8349}, //2282 #CJK UNIFIED IDEOGRAPH + {0xAFF4, 0x8335}, //2283 #CJK UNIFIED IDEOGRAPH + {0xAFF5, 0x8334}, //2284 #CJK UNIFIED IDEOGRAPH + {0xAFF6, 0x834F}, //2285 #CJK UNIFIED IDEOGRAPH + {0xAFF7, 0x8332}, //2286 #CJK UNIFIED IDEOGRAPH + {0xAFF8, 0x8339}, //2287 #CJK UNIFIED IDEOGRAPH + {0xAFF9, 0x8336}, //2288 #CJK UNIFIED IDEOGRAPH + {0xAFFA, 0x8317}, //2289 #CJK UNIFIED IDEOGRAPH + {0xAFFB, 0x8340}, //2290 #CJK UNIFIED IDEOGRAPH + {0xAFFC, 0x8331}, //2291 #CJK UNIFIED IDEOGRAPH + {0xAFFD, 0x8328}, //2292 #CJK UNIFIED IDEOGRAPH + {0xAFFE, 0x8343}, //2293 #CJK UNIFIED IDEOGRAPH + {0xB040, 0x8654}, //2294 #CJK UNIFIED IDEOGRAPH + {0xB041, 0x868A}, //2295 #CJK UNIFIED IDEOGRAPH + {0xB042, 0x86AA}, //2296 #CJK UNIFIED IDEOGRAPH + {0xB043, 0x8693}, //2297 #CJK UNIFIED IDEOGRAPH + {0xB044, 0x86A4}, //2298 #CJK UNIFIED IDEOGRAPH + {0xB045, 0x86A9}, //2299 #CJK UNIFIED IDEOGRAPH + {0xB046, 0x868C}, //2300 #CJK UNIFIED IDEOGRAPH + {0xB047, 0x86A3}, //2301 #CJK UNIFIED IDEOGRAPH + {0xB048, 0x869C}, //2302 #CJK UNIFIED IDEOGRAPH + {0xB049, 0x8870}, //2303 #CJK UNIFIED IDEOGRAPH + {0xB04A, 0x8877}, //2304 #CJK UNIFIED IDEOGRAPH + {0xB04B, 0x8881}, //2305 #CJK UNIFIED IDEOGRAPH + {0xB04C, 0x8882}, //2306 #CJK UNIFIED IDEOGRAPH + {0xB04D, 0x887D}, //2307 #CJK UNIFIED IDEOGRAPH + {0xB04E, 0x8879}, //2308 #CJK UNIFIED IDEOGRAPH + {0xB04F, 0x8A18}, //2309 #CJK UNIFIED IDEOGRAPH + {0xB050, 0x8A10}, //2310 #CJK UNIFIED IDEOGRAPH + {0xB051, 0x8A0E}, //2311 #CJK UNIFIED IDEOGRAPH + {0xB052, 0x8A0C}, //2312 #CJK UNIFIED IDEOGRAPH + {0xB053, 0x8A15}, //2313 #CJK UNIFIED IDEOGRAPH + {0xB054, 0x8A0A}, //2314 #CJK UNIFIED IDEOGRAPH + {0xB055, 0x8A17}, //2315 #CJK UNIFIED IDEOGRAPH + {0xB056, 0x8A13}, //2316 #CJK UNIFIED IDEOGRAPH + {0xB057, 0x8A16}, //2317 #CJK UNIFIED IDEOGRAPH + {0xB058, 0x8A0F}, //2318 #CJK UNIFIED IDEOGRAPH + {0xB059, 0x8A11}, //2319 #CJK UNIFIED IDEOGRAPH + {0xB05A, 0x8C48}, //2320 #CJK UNIFIED IDEOGRAPH + {0xB05B, 0x8C7A}, //2321 #CJK UNIFIED IDEOGRAPH + {0xB05C, 0x8C79}, //2322 #CJK UNIFIED IDEOGRAPH + {0xB05D, 0x8CA1}, //2323 #CJK UNIFIED IDEOGRAPH + {0xB05E, 0x8CA2}, //2324 #CJK UNIFIED IDEOGRAPH + {0xB05F, 0x8D77}, //2325 #CJK UNIFIED IDEOGRAPH + {0xB060, 0x8EAC}, //2326 #CJK UNIFIED IDEOGRAPH + {0xB061, 0x8ED2}, //2327 #CJK UNIFIED IDEOGRAPH + {0xB062, 0x8ED4}, //2328 #CJK UNIFIED IDEOGRAPH + {0xB063, 0x8ECF}, //2329 #CJK UNIFIED IDEOGRAPH + {0xB064, 0x8FB1}, //2330 #CJK UNIFIED IDEOGRAPH + {0xB065, 0x9001}, //2331 #CJK UNIFIED IDEOGRAPH + {0xB066, 0x9006}, //2332 #CJK UNIFIED IDEOGRAPH + {0xB067, 0x8FF7}, //2333 #CJK UNIFIED IDEOGRAPH + {0xB068, 0x9000}, //2334 #CJK UNIFIED IDEOGRAPH + {0xB069, 0x8FFA}, //2335 #CJK UNIFIED IDEOGRAPH + {0xB06A, 0x8FF4}, //2336 #CJK UNIFIED IDEOGRAPH + {0xB06B, 0x9003}, //2337 #CJK UNIFIED IDEOGRAPH + {0xB06C, 0x8FFD}, //2338 #CJK UNIFIED IDEOGRAPH + {0xB06D, 0x9005}, //2339 #CJK UNIFIED IDEOGRAPH + {0xB06E, 0x8FF8}, //2340 #CJK UNIFIED IDEOGRAPH + {0xB06F, 0x9095}, //2341 #CJK UNIFIED IDEOGRAPH + {0xB070, 0x90E1}, //2342 #CJK UNIFIED IDEOGRAPH + {0xB071, 0x90DD}, //2343 #CJK UNIFIED IDEOGRAPH + {0xB072, 0x90E2}, //2344 #CJK UNIFIED IDEOGRAPH + {0xB073, 0x9152}, //2345 #CJK UNIFIED IDEOGRAPH + {0xB074, 0x914D}, //2346 #CJK UNIFIED IDEOGRAPH + {0xB075, 0x914C}, //2347 #CJK UNIFIED IDEOGRAPH + {0xB076, 0x91D8}, //2348 #CJK UNIFIED IDEOGRAPH + {0xB077, 0x91DD}, //2349 #CJK UNIFIED IDEOGRAPH + {0xB078, 0x91D7}, //2350 #CJK UNIFIED IDEOGRAPH + {0xB079, 0x91DC}, //2351 #CJK UNIFIED IDEOGRAPH + {0xB07A, 0x91D9}, //2352 #CJK UNIFIED IDEOGRAPH + {0xB07B, 0x9583}, //2353 #CJK UNIFIED IDEOGRAPH + {0xB07C, 0x9662}, //2354 #CJK UNIFIED IDEOGRAPH + {0xB07D, 0x9663}, //2355 #CJK UNIFIED IDEOGRAPH + {0xB07E, 0x9661}, //2356 #CJK UNIFIED IDEOGRAPH + {0xB0A1, 0x965B}, //2357 #CJK UNIFIED IDEOGRAPH + {0xB0A2, 0x965D}, //2358 #CJK UNIFIED IDEOGRAPH + {0xB0A3, 0x9664}, //2359 #CJK UNIFIED IDEOGRAPH + {0xB0A4, 0x9658}, //2360 #CJK UNIFIED IDEOGRAPH + {0xB0A5, 0x965E}, //2361 #CJK UNIFIED IDEOGRAPH + {0xB0A6, 0x96BB}, //2362 #CJK UNIFIED IDEOGRAPH + {0xB0A7, 0x98E2}, //2363 #CJK UNIFIED IDEOGRAPH + {0xB0A8, 0x99AC}, //2364 #CJK UNIFIED IDEOGRAPH + {0xB0A9, 0x9AA8}, //2365 #CJK UNIFIED IDEOGRAPH + {0xB0AA, 0x9AD8}, //2366 #CJK UNIFIED IDEOGRAPH + {0xB0AB, 0x9B25}, //2367 #CJK UNIFIED IDEOGRAPH + {0xB0AC, 0x9B32}, //2368 #CJK UNIFIED IDEOGRAPH + {0xB0AD, 0x9B3C}, //2369 #CJK UNIFIED IDEOGRAPH + {0xB0AE, 0x4E7E}, //2370 #CJK UNIFIED IDEOGRAPH + {0xB0AF, 0x507A}, //2371 #CJK UNIFIED IDEOGRAPH + {0xB0B0, 0x507D}, //2372 #CJK UNIFIED IDEOGRAPH + {0xB0B1, 0x505C}, //2373 #CJK UNIFIED IDEOGRAPH + {0xB0B2, 0x5047}, //2374 #CJK UNIFIED IDEOGRAPH + {0xB0B3, 0x5043}, //2375 #CJK UNIFIED IDEOGRAPH + {0xB0B4, 0x504C}, //2376 #CJK UNIFIED IDEOGRAPH + {0xB0B5, 0x505A}, //2377 #CJK UNIFIED IDEOGRAPH + {0xB0B6, 0x5049}, //2378 #CJK UNIFIED IDEOGRAPH + {0xB0B7, 0x5065}, //2379 #CJK UNIFIED IDEOGRAPH + {0xB0B8, 0x5076}, //2380 #CJK UNIFIED IDEOGRAPH + {0xB0B9, 0x504E}, //2381 #CJK UNIFIED IDEOGRAPH + {0xB0BA, 0x5055}, //2382 #CJK UNIFIED IDEOGRAPH + {0xB0BB, 0x5075}, //2383 #CJK UNIFIED IDEOGRAPH + {0xB0BC, 0x5074}, //2384 #CJK UNIFIED IDEOGRAPH + {0xB0BD, 0x5077}, //2385 #CJK UNIFIED IDEOGRAPH + {0xB0BE, 0x504F}, //2386 #CJK UNIFIED IDEOGRAPH + {0xB0BF, 0x500F}, //2387 #CJK UNIFIED IDEOGRAPH + {0xB0C0, 0x506F}, //2388 #CJK UNIFIED IDEOGRAPH + {0xB0C1, 0x506D}, //2389 #CJK UNIFIED IDEOGRAPH + {0xB0C2, 0x515C}, //2390 #CJK UNIFIED IDEOGRAPH + {0xB0C3, 0x5195}, //2391 #CJK UNIFIED IDEOGRAPH + {0xB0C4, 0x51F0}, //2392 #CJK UNIFIED IDEOGRAPH + {0xB0C5, 0x526A}, //2393 #CJK UNIFIED IDEOGRAPH + {0xB0C6, 0x526F}, //2394 #CJK UNIFIED IDEOGRAPH + {0xB0C7, 0x52D2}, //2395 #CJK UNIFIED IDEOGRAPH + {0xB0C8, 0x52D9}, //2396 #CJK UNIFIED IDEOGRAPH + {0xB0C9, 0x52D8}, //2397 #CJK UNIFIED IDEOGRAPH + {0xB0CA, 0x52D5}, //2398 #CJK UNIFIED IDEOGRAPH + {0xB0CB, 0x5310}, //2399 #CJK UNIFIED IDEOGRAPH + {0xB0CC, 0x530F}, //2400 #CJK UNIFIED IDEOGRAPH + {0xB0CD, 0x5319}, //2401 #CJK UNIFIED IDEOGRAPH + {0xB0CE, 0x533F}, //2402 #CJK UNIFIED IDEOGRAPH + {0xB0CF, 0x5340}, //2403 #CJK UNIFIED IDEOGRAPH + {0xB0D0, 0x533E}, //2404 #CJK UNIFIED IDEOGRAPH + {0xB0D1, 0x53C3}, //2405 #CJK UNIFIED IDEOGRAPH + {0xB0D2, 0x66FC}, //2406 #CJK UNIFIED IDEOGRAPH + {0xB0D3, 0x5546}, //2407 #CJK UNIFIED IDEOGRAPH + {0xB0D4, 0x556A}, //2408 #CJK UNIFIED IDEOGRAPH + {0xB0D5, 0x5566}, //2409 #CJK UNIFIED IDEOGRAPH + {0xB0D6, 0x5544}, //2410 #CJK UNIFIED IDEOGRAPH + {0xB0D7, 0x555E}, //2411 #CJK UNIFIED IDEOGRAPH + {0xB0D8, 0x5561}, //2412 #CJK UNIFIED IDEOGRAPH + {0xB0D9, 0x5543}, //2413 #CJK UNIFIED IDEOGRAPH + {0xB0DA, 0x554A}, //2414 #CJK UNIFIED IDEOGRAPH + {0xB0DB, 0x5531}, //2415 #CJK UNIFIED IDEOGRAPH + {0xB0DC, 0x5556}, //2416 #CJK UNIFIED IDEOGRAPH + {0xB0DD, 0x554F}, //2417 #CJK UNIFIED IDEOGRAPH + {0xB0DE, 0x5555}, //2418 #CJK UNIFIED IDEOGRAPH + {0xB0DF, 0x552F}, //2419 #CJK UNIFIED IDEOGRAPH + {0xB0E0, 0x5564}, //2420 #CJK UNIFIED IDEOGRAPH + {0xB0E1, 0x5538}, //2421 #CJK UNIFIED IDEOGRAPH + {0xB0E2, 0x552E}, //2422 #CJK UNIFIED IDEOGRAPH + {0xB0E3, 0x555C}, //2423 #CJK UNIFIED IDEOGRAPH + {0xB0E4, 0x552C}, //2424 #CJK UNIFIED IDEOGRAPH + {0xB0E5, 0x5563}, //2425 #CJK UNIFIED IDEOGRAPH + {0xB0E6, 0x5533}, //2426 #CJK UNIFIED IDEOGRAPH + {0xB0E7, 0x5541}, //2427 #CJK UNIFIED IDEOGRAPH + {0xB0E8, 0x5557}, //2428 #CJK UNIFIED IDEOGRAPH + {0xB0E9, 0x5708}, //2429 #CJK UNIFIED IDEOGRAPH + {0xB0EA, 0x570B}, //2430 #CJK UNIFIED IDEOGRAPH + {0xB0EB, 0x5709}, //2431 #CJK UNIFIED IDEOGRAPH + {0xB0EC, 0x57DF}, //2432 #CJK UNIFIED IDEOGRAPH + {0xB0ED, 0x5805}, //2433 #CJK UNIFIED IDEOGRAPH + {0xB0EE, 0x580A}, //2434 #CJK UNIFIED IDEOGRAPH + {0xB0EF, 0x5806}, //2435 #CJK UNIFIED IDEOGRAPH + {0xB0F0, 0x57E0}, //2436 #CJK UNIFIED IDEOGRAPH + {0xB0F1, 0x57E4}, //2437 #CJK UNIFIED IDEOGRAPH + {0xB0F2, 0x57FA}, //2438 #CJK UNIFIED IDEOGRAPH + {0xB0F3, 0x5802}, //2439 #CJK UNIFIED IDEOGRAPH + {0xB0F4, 0x5835}, //2440 #CJK UNIFIED IDEOGRAPH + {0xB0F5, 0x57F7}, //2441 #CJK UNIFIED IDEOGRAPH + {0xB0F6, 0x57F9}, //2442 #CJK UNIFIED IDEOGRAPH + {0xB0F7, 0x5920}, //2443 #CJK UNIFIED IDEOGRAPH + {0xB0F8, 0x5962}, //2444 #CJK UNIFIED IDEOGRAPH + {0xB0F9, 0x5A36}, //2445 #CJK UNIFIED IDEOGRAPH + {0xB0FA, 0x5A41}, //2446 #CJK UNIFIED IDEOGRAPH + {0xB0FB, 0x5A49}, //2447 #CJK UNIFIED IDEOGRAPH + {0xB0FC, 0x5A66}, //2448 #CJK UNIFIED IDEOGRAPH + {0xB0FD, 0x5A6A}, //2449 #CJK UNIFIED IDEOGRAPH + {0xB0FE, 0x5A40}, //2450 #CJK UNIFIED IDEOGRAPH + {0xB140, 0x5A3C}, //2451 #CJK UNIFIED IDEOGRAPH + {0xB141, 0x5A62}, //2452 #CJK UNIFIED IDEOGRAPH + {0xB142, 0x5A5A}, //2453 #CJK UNIFIED IDEOGRAPH + {0xB143, 0x5A46}, //2454 #CJK UNIFIED IDEOGRAPH + {0xB144, 0x5A4A}, //2455 #CJK UNIFIED IDEOGRAPH + {0xB145, 0x5B70}, //2456 #CJK UNIFIED IDEOGRAPH + {0xB146, 0x5BC7}, //2457 #CJK UNIFIED IDEOGRAPH + {0xB147, 0x5BC5}, //2458 #CJK UNIFIED IDEOGRAPH + {0xB148, 0x5BC4}, //2459 #CJK UNIFIED IDEOGRAPH + {0xB149, 0x5BC2}, //2460 #CJK UNIFIED IDEOGRAPH + {0xB14A, 0x5BBF}, //2461 #CJK UNIFIED IDEOGRAPH + {0xB14B, 0x5BC6}, //2462 #CJK UNIFIED IDEOGRAPH + {0xB14C, 0x5C09}, //2463 #CJK UNIFIED IDEOGRAPH + {0xB14D, 0x5C08}, //2464 #CJK UNIFIED IDEOGRAPH + {0xB14E, 0x5C07}, //2465 #CJK UNIFIED IDEOGRAPH + {0xB14F, 0x5C60}, //2466 #CJK UNIFIED IDEOGRAPH + {0xB150, 0x5C5C}, //2467 #CJK UNIFIED IDEOGRAPH + {0xB151, 0x5C5D}, //2468 #CJK UNIFIED IDEOGRAPH + {0xB152, 0x5D07}, //2469 #CJK UNIFIED IDEOGRAPH + {0xB153, 0x5D06}, //2470 #CJK UNIFIED IDEOGRAPH + {0xB154, 0x5D0E}, //2471 #CJK UNIFIED IDEOGRAPH + {0xB155, 0x5D1B}, //2472 #CJK UNIFIED IDEOGRAPH + {0xB156, 0x5D16}, //2473 #CJK UNIFIED IDEOGRAPH + {0xB157, 0x5D22}, //2474 #CJK UNIFIED IDEOGRAPH + {0xB158, 0x5D11}, //2475 #CJK UNIFIED IDEOGRAPH + {0xB159, 0x5D29}, //2476 #CJK UNIFIED IDEOGRAPH + {0xB15A, 0x5D14}, //2477 #CJK UNIFIED IDEOGRAPH + {0xB15B, 0x5D19}, //2478 #CJK UNIFIED IDEOGRAPH + {0xB15C, 0x5D24}, //2479 #CJK UNIFIED IDEOGRAPH + {0xB15D, 0x5D27}, //2480 #CJK UNIFIED IDEOGRAPH + {0xB15E, 0x5D17}, //2481 #CJK UNIFIED IDEOGRAPH + {0xB15F, 0x5DE2}, //2482 #CJK UNIFIED IDEOGRAPH + {0xB160, 0x5E38}, //2483 #CJK UNIFIED IDEOGRAPH + {0xB161, 0x5E36}, //2484 #CJK UNIFIED IDEOGRAPH + {0xB162, 0x5E33}, //2485 #CJK UNIFIED IDEOGRAPH + {0xB163, 0x5E37}, //2486 #CJK UNIFIED IDEOGRAPH + {0xB164, 0x5EB7}, //2487 #CJK UNIFIED IDEOGRAPH + {0xB165, 0x5EB8}, //2488 #CJK UNIFIED IDEOGRAPH + {0xB166, 0x5EB6}, //2489 #CJK UNIFIED IDEOGRAPH + {0xB167, 0x5EB5}, //2490 #CJK UNIFIED IDEOGRAPH + {0xB168, 0x5EBE}, //2491 #CJK UNIFIED IDEOGRAPH + {0xB169, 0x5F35}, //2492 #CJK UNIFIED IDEOGRAPH + {0xB16A, 0x5F37}, //2493 #CJK UNIFIED IDEOGRAPH + {0xB16B, 0x5F57}, //2494 #CJK UNIFIED IDEOGRAPH + {0xB16C, 0x5F6C}, //2495 #CJK UNIFIED IDEOGRAPH + {0xB16D, 0x5F69}, //2496 #CJK UNIFIED IDEOGRAPH + {0xB16E, 0x5F6B}, //2497 #CJK UNIFIED IDEOGRAPH + {0xB16F, 0x5F97}, //2498 #CJK UNIFIED IDEOGRAPH + {0xB170, 0x5F99}, //2499 #CJK UNIFIED IDEOGRAPH + {0xB171, 0x5F9E}, //2500 #CJK UNIFIED IDEOGRAPH + {0xB172, 0x5F98}, //2501 #CJK UNIFIED IDEOGRAPH + {0xB173, 0x5FA1}, //2502 #CJK UNIFIED IDEOGRAPH + {0xB174, 0x5FA0}, //2503 #CJK UNIFIED IDEOGRAPH + {0xB175, 0x5F9C}, //2504 #CJK UNIFIED IDEOGRAPH + {0xB176, 0x607F}, //2505 #CJK UNIFIED IDEOGRAPH + {0xB177, 0x60A3}, //2506 #CJK UNIFIED IDEOGRAPH + {0xB178, 0x6089}, //2507 #CJK UNIFIED IDEOGRAPH + {0xB179, 0x60A0}, //2508 #CJK UNIFIED IDEOGRAPH + {0xB17A, 0x60A8}, //2509 #CJK UNIFIED IDEOGRAPH + {0xB17B, 0x60CB}, //2510 #CJK UNIFIED IDEOGRAPH + {0xB17C, 0x60B4}, //2511 #CJK UNIFIED IDEOGRAPH + {0xB17D, 0x60E6}, //2512 #CJK UNIFIED IDEOGRAPH + {0xB17E, 0x60BD}, //2513 #CJK UNIFIED IDEOGRAPH + {0xB1A1, 0x60C5}, //2514 #CJK UNIFIED IDEOGRAPH + {0xB1A2, 0x60BB}, //2515 #CJK UNIFIED IDEOGRAPH + {0xB1A3, 0x60B5}, //2516 #CJK UNIFIED IDEOGRAPH + {0xB1A4, 0x60DC}, //2517 #CJK UNIFIED IDEOGRAPH + {0xB1A5, 0x60BC}, //2518 #CJK UNIFIED IDEOGRAPH + {0xB1A6, 0x60D8}, //2519 #CJK UNIFIED IDEOGRAPH + {0xB1A7, 0x60D5}, //2520 #CJK UNIFIED IDEOGRAPH + {0xB1A8, 0x60C6}, //2521 #CJK UNIFIED IDEOGRAPH + {0xB1A9, 0x60DF}, //2522 #CJK UNIFIED IDEOGRAPH + {0xB1AA, 0x60B8}, //2523 #CJK UNIFIED IDEOGRAPH + {0xB1AB, 0x60DA}, //2524 #CJK UNIFIED IDEOGRAPH + {0xB1AC, 0x60C7}, //2525 #CJK UNIFIED IDEOGRAPH + {0xB1AD, 0x621A}, //2526 #CJK UNIFIED IDEOGRAPH + {0xB1AE, 0x621B}, //2527 #CJK UNIFIED IDEOGRAPH + {0xB1AF, 0x6248}, //2528 #CJK UNIFIED IDEOGRAPH + {0xB1B0, 0x63A0}, //2529 #CJK UNIFIED IDEOGRAPH + {0xB1B1, 0x63A7}, //2530 #CJK UNIFIED IDEOGRAPH + {0xB1B2, 0x6372}, //2531 #CJK UNIFIED IDEOGRAPH + {0xB1B3, 0x6396}, //2532 #CJK UNIFIED IDEOGRAPH + {0xB1B4, 0x63A2}, //2533 #CJK UNIFIED IDEOGRAPH + {0xB1B5, 0x63A5}, //2534 #CJK UNIFIED IDEOGRAPH + {0xB1B6, 0x6377}, //2535 #CJK UNIFIED IDEOGRAPH + {0xB1B7, 0x6367}, //2536 #CJK UNIFIED IDEOGRAPH + {0xB1B8, 0x6398}, //2537 #CJK UNIFIED IDEOGRAPH + {0xB1B9, 0x63AA}, //2538 #CJK UNIFIED IDEOGRAPH + {0xB1BA, 0x6371}, //2539 #CJK UNIFIED IDEOGRAPH + {0xB1BB, 0x63A9}, //2540 #CJK UNIFIED IDEOGRAPH + {0xB1BC, 0x6389}, //2541 #CJK UNIFIED IDEOGRAPH + {0xB1BD, 0x6383}, //2542 #CJK UNIFIED IDEOGRAPH + {0xB1BE, 0x639B}, //2543 #CJK UNIFIED IDEOGRAPH + {0xB1BF, 0x636B}, //2544 #CJK UNIFIED IDEOGRAPH + {0xB1C0, 0x63A8}, //2545 #CJK UNIFIED IDEOGRAPH + {0xB1C1, 0x6384}, //2546 #CJK UNIFIED IDEOGRAPH + {0xB1C2, 0x6388}, //2547 #CJK UNIFIED IDEOGRAPH + {0xB1C3, 0x6399}, //2548 #CJK UNIFIED IDEOGRAPH + {0xB1C4, 0x63A1}, //2549 #CJK UNIFIED IDEOGRAPH + {0xB1C5, 0x63AC}, //2550 #CJK UNIFIED IDEOGRAPH + {0xB1C6, 0x6392}, //2551 #CJK UNIFIED IDEOGRAPH + {0xB1C7, 0x638F}, //2552 #CJK UNIFIED IDEOGRAPH + {0xB1C8, 0x6380}, //2553 #CJK UNIFIED IDEOGRAPH + {0xB1C9, 0x637B}, //2554 #CJK UNIFIED IDEOGRAPH + {0xB1CA, 0x6369}, //2555 #CJK UNIFIED IDEOGRAPH + {0xB1CB, 0x6368}, //2556 #CJK UNIFIED IDEOGRAPH + {0xB1CC, 0x637A}, //2557 #CJK UNIFIED IDEOGRAPH + {0xB1CD, 0x655D}, //2558 #CJK UNIFIED IDEOGRAPH + {0xB1CE, 0x6556}, //2559 #CJK UNIFIED IDEOGRAPH + {0xB1CF, 0x6551}, //2560 #CJK UNIFIED IDEOGRAPH + {0xB1D0, 0x6559}, //2561 #CJK UNIFIED IDEOGRAPH + {0xB1D1, 0x6557}, //2562 #CJK UNIFIED IDEOGRAPH + {0xB1D2, 0x555F}, //2563 #CJK UNIFIED IDEOGRAPH + {0xB1D3, 0x654F}, //2564 #CJK UNIFIED IDEOGRAPH + {0xB1D4, 0x6558}, //2565 #CJK UNIFIED IDEOGRAPH + {0xB1D5, 0x6555}, //2566 #CJK UNIFIED IDEOGRAPH + {0xB1D6, 0x6554}, //2567 #CJK UNIFIED IDEOGRAPH + {0xB1D7, 0x659C}, //2568 #CJK UNIFIED IDEOGRAPH + {0xB1D8, 0x659B}, //2569 #CJK UNIFIED IDEOGRAPH + {0xB1D9, 0x65AC}, //2570 #CJK UNIFIED IDEOGRAPH + {0xB1DA, 0x65CF}, //2571 #CJK UNIFIED IDEOGRAPH + {0xB1DB, 0x65CB}, //2572 #CJK UNIFIED IDEOGRAPH + {0xB1DC, 0x65CC}, //2573 #CJK UNIFIED IDEOGRAPH + {0xB1DD, 0x65CE}, //2574 #CJK UNIFIED IDEOGRAPH + {0xB1DE, 0x665D}, //2575 #CJK UNIFIED IDEOGRAPH + {0xB1DF, 0x665A}, //2576 #CJK UNIFIED IDEOGRAPH + {0xB1E0, 0x6664}, //2577 #CJK UNIFIED IDEOGRAPH + {0xB1E1, 0x6668}, //2578 #CJK UNIFIED IDEOGRAPH + {0xB1E2, 0x6666}, //2579 #CJK UNIFIED IDEOGRAPH + {0xB1E3, 0x665E}, //2580 #CJK UNIFIED IDEOGRAPH + {0xB1E4, 0x66F9}, //2581 #CJK UNIFIED IDEOGRAPH + {0xB1E5, 0x52D7}, //2582 #CJK UNIFIED IDEOGRAPH + {0xB1E6, 0x671B}, //2583 #CJK UNIFIED IDEOGRAPH + {0xB1E7, 0x6881}, //2584 #CJK UNIFIED IDEOGRAPH + {0xB1E8, 0x68AF}, //2585 #CJK UNIFIED IDEOGRAPH + {0xB1E9, 0x68A2}, //2586 #CJK UNIFIED IDEOGRAPH + {0xB1EA, 0x6893}, //2587 #CJK UNIFIED IDEOGRAPH + {0xB1EB, 0x68B5}, //2588 #CJK UNIFIED IDEOGRAPH + {0xB1EC, 0x687F}, //2589 #CJK UNIFIED IDEOGRAPH + {0xB1ED, 0x6876}, //2590 #CJK UNIFIED IDEOGRAPH + {0xB1EE, 0x68B1}, //2591 #CJK UNIFIED IDEOGRAPH + {0xB1EF, 0x68A7}, //2592 #CJK UNIFIED IDEOGRAPH + {0xB1F0, 0x6897}, //2593 #CJK UNIFIED IDEOGRAPH + {0xB1F1, 0x68B0}, //2594 #CJK UNIFIED IDEOGRAPH + {0xB1F2, 0x6883}, //2595 #CJK UNIFIED IDEOGRAPH + {0xB1F3, 0x68C4}, //2596 #CJK UNIFIED IDEOGRAPH + {0xB1F4, 0x68AD}, //2597 #CJK UNIFIED IDEOGRAPH + {0xB1F5, 0x6886}, //2598 #CJK UNIFIED IDEOGRAPH + {0xB1F6, 0x6885}, //2599 #CJK UNIFIED IDEOGRAPH + {0xB1F7, 0x6894}, //2600 #CJK UNIFIED IDEOGRAPH + {0xB1F8, 0x689D}, //2601 #CJK UNIFIED IDEOGRAPH + {0xB1F9, 0x68A8}, //2602 #CJK UNIFIED IDEOGRAPH + {0xB1FA, 0x689F}, //2603 #CJK UNIFIED IDEOGRAPH + {0xB1FB, 0x68A1}, //2604 #CJK UNIFIED IDEOGRAPH + {0xB1FC, 0x6882}, //2605 #CJK UNIFIED IDEOGRAPH + {0xB1FD, 0x6B32}, //2606 #CJK UNIFIED IDEOGRAPH + {0xB1FE, 0x6BBA}, //2607 #CJK UNIFIED IDEOGRAPH + {0xB240, 0x6BEB}, //2608 #CJK UNIFIED IDEOGRAPH + {0xB241, 0x6BEC}, //2609 #CJK UNIFIED IDEOGRAPH + {0xB242, 0x6C2B}, //2610 #CJK UNIFIED IDEOGRAPH + {0xB243, 0x6D8E}, //2611 #CJK UNIFIED IDEOGRAPH + {0xB244, 0x6DBC}, //2612 #CJK UNIFIED IDEOGRAPH + {0xB245, 0x6DF3}, //2613 #CJK UNIFIED IDEOGRAPH + {0xB246, 0x6DD9}, //2614 #CJK UNIFIED IDEOGRAPH + {0xB247, 0x6DB2}, //2615 #CJK UNIFIED IDEOGRAPH + {0xB248, 0x6DE1}, //2616 #CJK UNIFIED IDEOGRAPH + {0xB249, 0x6DCC}, //2617 #CJK UNIFIED IDEOGRAPH + {0xB24A, 0x6DE4}, //2618 #CJK UNIFIED IDEOGRAPH + {0xB24B, 0x6DFB}, //2619 #CJK UNIFIED IDEOGRAPH + {0xB24C, 0x6DFA}, //2620 #CJK UNIFIED IDEOGRAPH + {0xB24D, 0x6E05}, //2621 #CJK UNIFIED IDEOGRAPH + {0xB24E, 0x6DC7}, //2622 #CJK UNIFIED IDEOGRAPH + {0xB24F, 0x6DCB}, //2623 #CJK UNIFIED IDEOGRAPH + {0xB250, 0x6DAF}, //2624 #CJK UNIFIED IDEOGRAPH + {0xB251, 0x6DD1}, //2625 #CJK UNIFIED IDEOGRAPH + {0xB252, 0x6DAE}, //2626 #CJK UNIFIED IDEOGRAPH + {0xB253, 0x6DDE}, //2627 #CJK UNIFIED IDEOGRAPH + {0xB254, 0x6DF9}, //2628 #CJK UNIFIED IDEOGRAPH + {0xB255, 0x6DB8}, //2629 #CJK UNIFIED IDEOGRAPH + {0xB256, 0x6DF7}, //2630 #CJK UNIFIED IDEOGRAPH + {0xB257, 0x6DF5}, //2631 #CJK UNIFIED IDEOGRAPH + {0xB258, 0x6DC5}, //2632 #CJK UNIFIED IDEOGRAPH + {0xB259, 0x6DD2}, //2633 #CJK UNIFIED IDEOGRAPH + {0xB25A, 0x6E1A}, //2634 #CJK UNIFIED IDEOGRAPH + {0xB25B, 0x6DB5}, //2635 #CJK UNIFIED IDEOGRAPH + {0xB25C, 0x6DDA}, //2636 #CJK UNIFIED IDEOGRAPH + {0xB25D, 0x6DEB}, //2637 #CJK UNIFIED IDEOGRAPH + {0xB25E, 0x6DD8}, //2638 #CJK UNIFIED IDEOGRAPH + {0xB25F, 0x6DEA}, //2639 #CJK UNIFIED IDEOGRAPH + {0xB260, 0x6DF1}, //2640 #CJK UNIFIED IDEOGRAPH + {0xB261, 0x6DEE}, //2641 #CJK UNIFIED IDEOGRAPH + {0xB262, 0x6DE8}, //2642 #CJK UNIFIED IDEOGRAPH + {0xB263, 0x6DC6}, //2643 #CJK UNIFIED IDEOGRAPH + {0xB264, 0x6DC4}, //2644 #CJK UNIFIED IDEOGRAPH + {0xB265, 0x6DAA}, //2645 #CJK UNIFIED IDEOGRAPH + {0xB266, 0x6DEC}, //2646 #CJK UNIFIED IDEOGRAPH + {0xB267, 0x6DBF}, //2647 #CJK UNIFIED IDEOGRAPH + {0xB268, 0x6DE6}, //2648 #CJK UNIFIED IDEOGRAPH + {0xB269, 0x70F9}, //2649 #CJK UNIFIED IDEOGRAPH + {0xB26A, 0x7109}, //2650 #CJK UNIFIED IDEOGRAPH + {0xB26B, 0x710A}, //2651 #CJK UNIFIED IDEOGRAPH + {0xB26C, 0x70FD}, //2652 #CJK UNIFIED IDEOGRAPH + {0xB26D, 0x70EF}, //2653 #CJK UNIFIED IDEOGRAPH + {0xB26E, 0x723D}, //2654 #CJK UNIFIED IDEOGRAPH + {0xB26F, 0x727D}, //2655 #CJK UNIFIED IDEOGRAPH + {0xB270, 0x7281}, //2656 #CJK UNIFIED IDEOGRAPH + {0xB271, 0x731C}, //2657 #CJK UNIFIED IDEOGRAPH + {0xB272, 0x731B}, //2658 #CJK UNIFIED IDEOGRAPH + {0xB273, 0x7316}, //2659 #CJK UNIFIED IDEOGRAPH + {0xB274, 0x7313}, //2660 #CJK UNIFIED IDEOGRAPH + {0xB275, 0x7319}, //2661 #CJK UNIFIED IDEOGRAPH + {0xB276, 0x7387}, //2662 #CJK UNIFIED IDEOGRAPH + {0xB277, 0x7405}, //2663 #CJK UNIFIED IDEOGRAPH + {0xB278, 0x740A}, //2664 #CJK UNIFIED IDEOGRAPH + {0xB279, 0x7403}, //2665 #CJK UNIFIED IDEOGRAPH + {0xB27A, 0x7406}, //2666 #CJK UNIFIED IDEOGRAPH + {0xB27B, 0x73FE}, //2667 #CJK UNIFIED IDEOGRAPH + {0xB27C, 0x740D}, //2668 #CJK UNIFIED IDEOGRAPH + {0xB27D, 0x74E0}, //2669 #CJK UNIFIED IDEOGRAPH + {0xB27E, 0x74F6}, //2670 #CJK UNIFIED IDEOGRAPH + {0xB2A1, 0x74F7}, //2671 #CJK UNIFIED IDEOGRAPH + {0xB2A2, 0x751C}, //2672 #CJK UNIFIED IDEOGRAPH + {0xB2A3, 0x7522}, //2673 #CJK UNIFIED IDEOGRAPH + {0xB2A4, 0x7565}, //2674 #CJK UNIFIED IDEOGRAPH + {0xB2A5, 0x7566}, //2675 #CJK UNIFIED IDEOGRAPH + {0xB2A6, 0x7562}, //2676 #CJK UNIFIED IDEOGRAPH + {0xB2A7, 0x7570}, //2677 #CJK UNIFIED IDEOGRAPH + {0xB2A8, 0x758F}, //2678 #CJK UNIFIED IDEOGRAPH + {0xB2A9, 0x75D4}, //2679 #CJK UNIFIED IDEOGRAPH + {0xB2AA, 0x75D5}, //2680 #CJK UNIFIED IDEOGRAPH + {0xB2AB, 0x75B5}, //2681 #CJK UNIFIED IDEOGRAPH + {0xB2AC, 0x75CA}, //2682 #CJK UNIFIED IDEOGRAPH + {0xB2AD, 0x75CD}, //2683 #CJK UNIFIED IDEOGRAPH + {0xB2AE, 0x768E}, //2684 #CJK UNIFIED IDEOGRAPH + {0xB2AF, 0x76D4}, //2685 #CJK UNIFIED IDEOGRAPH + {0xB2B0, 0x76D2}, //2686 #CJK UNIFIED IDEOGRAPH + {0xB2B1, 0x76DB}, //2687 #CJK UNIFIED IDEOGRAPH + {0xB2B2, 0x7737}, //2688 #CJK UNIFIED IDEOGRAPH + {0xB2B3, 0x773E}, //2689 #CJK UNIFIED IDEOGRAPH + {0xB2B4, 0x773C}, //2690 #CJK UNIFIED IDEOGRAPH + {0xB2B5, 0x7736}, //2691 #CJK UNIFIED IDEOGRAPH + {0xB2B6, 0x7738}, //2692 #CJK UNIFIED IDEOGRAPH + {0xB2B7, 0x773A}, //2693 #CJK UNIFIED IDEOGRAPH + {0xB2B8, 0x786B}, //2694 #CJK UNIFIED IDEOGRAPH + {0xB2B9, 0x7843}, //2695 #CJK UNIFIED IDEOGRAPH + {0xB2BA, 0x784E}, //2696 #CJK UNIFIED IDEOGRAPH + {0xB2BB, 0x7965}, //2697 #CJK UNIFIED IDEOGRAPH + {0xB2BC, 0x7968}, //2698 #CJK UNIFIED IDEOGRAPH + {0xB2BD, 0x796D}, //2699 #CJK UNIFIED IDEOGRAPH + {0xB2BE, 0x79FB}, //2700 #CJK UNIFIED IDEOGRAPH + {0xB2BF, 0x7A92}, //2701 #CJK UNIFIED IDEOGRAPH + {0xB2C0, 0x7A95}, //2702 #CJK UNIFIED IDEOGRAPH + {0xB2C1, 0x7B20}, //2703 #CJK UNIFIED IDEOGRAPH + {0xB2C2, 0x7B28}, //2704 #CJK UNIFIED IDEOGRAPH + {0xB2C3, 0x7B1B}, //2705 #CJK UNIFIED IDEOGRAPH + {0xB2C4, 0x7B2C}, //2706 #CJK UNIFIED IDEOGRAPH + {0xB2C5, 0x7B26}, //2707 #CJK UNIFIED IDEOGRAPH + {0xB2C6, 0x7B19}, //2708 #CJK UNIFIED IDEOGRAPH + {0xB2C7, 0x7B1E}, //2709 #CJK UNIFIED IDEOGRAPH + {0xB2C8, 0x7B2E}, //2710 #CJK UNIFIED IDEOGRAPH + {0xB2C9, 0x7C92}, //2711 #CJK UNIFIED IDEOGRAPH + {0xB2CA, 0x7C97}, //2712 #CJK UNIFIED IDEOGRAPH + {0xB2CB, 0x7C95}, //2713 #CJK UNIFIED IDEOGRAPH + {0xB2CC, 0x7D46}, //2714 #CJK UNIFIED IDEOGRAPH + {0xB2CD, 0x7D43}, //2715 #CJK UNIFIED IDEOGRAPH + {0xB2CE, 0x7D71}, //2716 #CJK UNIFIED IDEOGRAPH + {0xB2CF, 0x7D2E}, //2717 #CJK UNIFIED IDEOGRAPH + {0xB2D0, 0x7D39}, //2718 #CJK UNIFIED IDEOGRAPH + {0xB2D1, 0x7D3C}, //2719 #CJK UNIFIED IDEOGRAPH + {0xB2D2, 0x7D40}, //2720 #CJK UNIFIED IDEOGRAPH + {0xB2D3, 0x7D30}, //2721 #CJK UNIFIED IDEOGRAPH + {0xB2D4, 0x7D33}, //2722 #CJK UNIFIED IDEOGRAPH + {0xB2D5, 0x7D44}, //2723 #CJK UNIFIED IDEOGRAPH + {0xB2D6, 0x7D2F}, //2724 #CJK UNIFIED IDEOGRAPH + {0xB2D7, 0x7D42}, //2725 #CJK UNIFIED IDEOGRAPH + {0xB2D8, 0x7D32}, //2726 #CJK UNIFIED IDEOGRAPH + {0xB2D9, 0x7D31}, //2727 #CJK UNIFIED IDEOGRAPH + {0xB2DA, 0x7F3D}, //2728 #CJK UNIFIED IDEOGRAPH + {0xB2DB, 0x7F9E}, //2729 #CJK UNIFIED IDEOGRAPH + {0xB2DC, 0x7F9A}, //2730 #CJK UNIFIED IDEOGRAPH + {0xB2DD, 0x7FCC}, //2731 #CJK UNIFIED IDEOGRAPH + {0xB2DE, 0x7FCE}, //2732 #CJK UNIFIED IDEOGRAPH + {0xB2DF, 0x7FD2}, //2733 #CJK UNIFIED IDEOGRAPH + {0xB2E0, 0x801C}, //2734 #CJK UNIFIED IDEOGRAPH + {0xB2E1, 0x804A}, //2735 #CJK UNIFIED IDEOGRAPH + {0xB2E2, 0x8046}, //2736 #CJK UNIFIED IDEOGRAPH + {0xB2E3, 0x812F}, //2737 #CJK UNIFIED IDEOGRAPH + {0xB2E4, 0x8116}, //2738 #CJK UNIFIED IDEOGRAPH + {0xB2E5, 0x8123}, //2739 #CJK UNIFIED IDEOGRAPH + {0xB2E6, 0x812B}, //2740 #CJK UNIFIED IDEOGRAPH + {0xB2E7, 0x8129}, //2741 #CJK UNIFIED IDEOGRAPH + {0xB2E8, 0x8130}, //2742 #CJK UNIFIED IDEOGRAPH + {0xB2E9, 0x8124}, //2743 #CJK UNIFIED IDEOGRAPH + {0xB2EA, 0x8202}, //2744 #CJK UNIFIED IDEOGRAPH + {0xB2EB, 0x8235}, //2745 #CJK UNIFIED IDEOGRAPH + {0xB2EC, 0x8237}, //2746 #CJK UNIFIED IDEOGRAPH + {0xB2ED, 0x8236}, //2747 #CJK UNIFIED IDEOGRAPH + {0xB2EE, 0x8239}, //2748 #CJK UNIFIED IDEOGRAPH + {0xB2EF, 0x838E}, //2749 #CJK UNIFIED IDEOGRAPH + {0xB2F0, 0x839E}, //2750 #CJK UNIFIED IDEOGRAPH + {0xB2F1, 0x8398}, //2751 #CJK UNIFIED IDEOGRAPH + {0xB2F2, 0x8378}, //2752 #CJK UNIFIED IDEOGRAPH + {0xB2F3, 0x83A2}, //2753 #CJK UNIFIED IDEOGRAPH + {0xB2F4, 0x8396}, //2754 #CJK UNIFIED IDEOGRAPH + {0xB2F5, 0x83BD}, //2755 #CJK UNIFIED IDEOGRAPH + {0xB2F6, 0x83AB}, //2756 #CJK UNIFIED IDEOGRAPH + {0xB2F7, 0x8392}, //2757 #CJK UNIFIED IDEOGRAPH + {0xB2F8, 0x838A}, //2758 #CJK UNIFIED IDEOGRAPH + {0xB2F9, 0x8393}, //2759 #CJK UNIFIED IDEOGRAPH + {0xB2FA, 0x8389}, //2760 #CJK UNIFIED IDEOGRAPH + {0xB2FB, 0x83A0}, //2761 #CJK UNIFIED IDEOGRAPH + {0xB2FC, 0x8377}, //2762 #CJK UNIFIED IDEOGRAPH + {0xB2FD, 0x837B}, //2763 #CJK UNIFIED IDEOGRAPH + {0xB2FE, 0x837C}, //2764 #CJK UNIFIED IDEOGRAPH + {0xB340, 0x8386}, //2765 #CJK UNIFIED IDEOGRAPH + {0xB341, 0x83A7}, //2766 #CJK UNIFIED IDEOGRAPH + {0xB342, 0x8655}, //2767 #CJK UNIFIED IDEOGRAPH + {0xB343, 0x5F6A}, //2768 #CJK UNIFIED IDEOGRAPH + {0xB344, 0x86C7}, //2769 #CJK UNIFIED IDEOGRAPH + {0xB345, 0x86C0}, //2770 #CJK UNIFIED IDEOGRAPH + {0xB346, 0x86B6}, //2771 #CJK UNIFIED IDEOGRAPH + {0xB347, 0x86C4}, //2772 #CJK UNIFIED IDEOGRAPH + {0xB348, 0x86B5}, //2773 #CJK UNIFIED IDEOGRAPH + {0xB349, 0x86C6}, //2774 #CJK UNIFIED IDEOGRAPH + {0xB34A, 0x86CB}, //2775 #CJK UNIFIED IDEOGRAPH + {0xB34B, 0x86B1}, //2776 #CJK UNIFIED IDEOGRAPH + {0xB34C, 0x86AF}, //2777 #CJK UNIFIED IDEOGRAPH + {0xB34D, 0x86C9}, //2778 #CJK UNIFIED IDEOGRAPH + {0xB34E, 0x8853}, //2779 #CJK UNIFIED IDEOGRAPH + {0xB34F, 0x889E}, //2780 #CJK UNIFIED IDEOGRAPH + {0xB350, 0x8888}, //2781 #CJK UNIFIED IDEOGRAPH + {0xB351, 0x88AB}, //2782 #CJK UNIFIED IDEOGRAPH + {0xB352, 0x8892}, //2783 #CJK UNIFIED IDEOGRAPH + {0xB353, 0x8896}, //2784 #CJK UNIFIED IDEOGRAPH + {0xB354, 0x888D}, //2785 #CJK UNIFIED IDEOGRAPH + {0xB355, 0x888B}, //2786 #CJK UNIFIED IDEOGRAPH + {0xB356, 0x8993}, //2787 #CJK UNIFIED IDEOGRAPH + {0xB357, 0x898F}, //2788 #CJK UNIFIED IDEOGRAPH + {0xB358, 0x8A2A}, //2789 #CJK UNIFIED IDEOGRAPH + {0xB359, 0x8A1D}, //2790 #CJK UNIFIED IDEOGRAPH + {0xB35A, 0x8A23}, //2791 #CJK UNIFIED IDEOGRAPH + {0xB35B, 0x8A25}, //2792 #CJK UNIFIED IDEOGRAPH + {0xB35C, 0x8A31}, //2793 #CJK UNIFIED IDEOGRAPH + {0xB35D, 0x8A2D}, //2794 #CJK UNIFIED IDEOGRAPH + {0xB35E, 0x8A1F}, //2795 #CJK UNIFIED IDEOGRAPH + {0xB35F, 0x8A1B}, //2796 #CJK UNIFIED IDEOGRAPH + {0xB360, 0x8A22}, //2797 #CJK UNIFIED IDEOGRAPH + {0xB361, 0x8C49}, //2798 #CJK UNIFIED IDEOGRAPH + {0xB362, 0x8C5A}, //2799 #CJK UNIFIED IDEOGRAPH + {0xB363, 0x8CA9}, //2800 #CJK UNIFIED IDEOGRAPH + {0xB364, 0x8CAC}, //2801 #CJK UNIFIED IDEOGRAPH + {0xB365, 0x8CAB}, //2802 #CJK UNIFIED IDEOGRAPH + {0xB366, 0x8CA8}, //2803 #CJK UNIFIED IDEOGRAPH + {0xB367, 0x8CAA}, //2804 #CJK UNIFIED IDEOGRAPH + {0xB368, 0x8CA7}, //2805 #CJK UNIFIED IDEOGRAPH + {0xB369, 0x8D67}, //2806 #CJK UNIFIED IDEOGRAPH + {0xB36A, 0x8D66}, //2807 #CJK UNIFIED IDEOGRAPH + {0xB36B, 0x8DBE}, //2808 #CJK UNIFIED IDEOGRAPH + {0xB36C, 0x8DBA}, //2809 #CJK UNIFIED IDEOGRAPH + {0xB36D, 0x8EDB}, //2810 #CJK UNIFIED IDEOGRAPH + {0xB36E, 0x8EDF}, //2811 #CJK UNIFIED IDEOGRAPH + {0xB36F, 0x9019}, //2812 #CJK UNIFIED IDEOGRAPH + {0xB370, 0x900D}, //2813 #CJK UNIFIED IDEOGRAPH + {0xB371, 0x901A}, //2814 #CJK UNIFIED IDEOGRAPH + {0xB372, 0x9017}, //2815 #CJK UNIFIED IDEOGRAPH + {0xB373, 0x9023}, //2816 #CJK UNIFIED IDEOGRAPH + {0xB374, 0x901F}, //2817 #CJK UNIFIED IDEOGRAPH + {0xB375, 0x901D}, //2818 #CJK UNIFIED IDEOGRAPH + {0xB376, 0x9010}, //2819 #CJK UNIFIED IDEOGRAPH + {0xB377, 0x9015}, //2820 #CJK UNIFIED IDEOGRAPH + {0xB378, 0x901E}, //2821 #CJK UNIFIED IDEOGRAPH + {0xB379, 0x9020}, //2822 #CJK UNIFIED IDEOGRAPH + {0xB37A, 0x900F}, //2823 #CJK UNIFIED IDEOGRAPH + {0xB37B, 0x9022}, //2824 #CJK UNIFIED IDEOGRAPH + {0xB37C, 0x9016}, //2825 #CJK UNIFIED IDEOGRAPH + {0xB37D, 0x901B}, //2826 #CJK UNIFIED IDEOGRAPH + {0xB37E, 0x9014}, //2827 #CJK UNIFIED IDEOGRAPH + {0xB3A1, 0x90E8}, //2828 #CJK UNIFIED IDEOGRAPH + {0xB3A2, 0x90ED}, //2829 #CJK UNIFIED IDEOGRAPH + {0xB3A3, 0x90FD}, //2830 #CJK UNIFIED IDEOGRAPH + {0xB3A4, 0x9157}, //2831 #CJK UNIFIED IDEOGRAPH + {0xB3A5, 0x91CE}, //2832 #CJK UNIFIED IDEOGRAPH + {0xB3A6, 0x91F5}, //2833 #CJK UNIFIED IDEOGRAPH + {0xB3A7, 0x91E6}, //2834 #CJK UNIFIED IDEOGRAPH + {0xB3A8, 0x91E3}, //2835 #CJK UNIFIED IDEOGRAPH + {0xB3A9, 0x91E7}, //2836 #CJK UNIFIED IDEOGRAPH + {0xB3AA, 0x91ED}, //2837 #CJK UNIFIED IDEOGRAPH + {0xB3AB, 0x91E9}, //2838 #CJK UNIFIED IDEOGRAPH + {0xB3AC, 0x9589}, //2839 #CJK UNIFIED IDEOGRAPH + {0xB3AD, 0x966A}, //2840 #CJK UNIFIED IDEOGRAPH + {0xB3AE, 0x9675}, //2841 #CJK UNIFIED IDEOGRAPH + {0xB3AF, 0x9673}, //2842 #CJK UNIFIED IDEOGRAPH + {0xB3B0, 0x9678}, //2843 #CJK UNIFIED IDEOGRAPH + {0xB3B1, 0x9670}, //2844 #CJK UNIFIED IDEOGRAPH + {0xB3B2, 0x9674}, //2845 #CJK UNIFIED IDEOGRAPH + {0xB3B3, 0x9676}, //2846 #CJK UNIFIED IDEOGRAPH + {0xB3B4, 0x9677}, //2847 #CJK UNIFIED IDEOGRAPH + {0xB3B5, 0x966C}, //2848 #CJK UNIFIED IDEOGRAPH + {0xB3B6, 0x96C0}, //2849 #CJK UNIFIED IDEOGRAPH + {0xB3B7, 0x96EA}, //2850 #CJK UNIFIED IDEOGRAPH + {0xB3B8, 0x96E9}, //2851 #CJK UNIFIED IDEOGRAPH + {0xB3B9, 0x7AE0}, //2852 #CJK UNIFIED IDEOGRAPH + {0xB3BA, 0x7ADF}, //2853 #CJK UNIFIED IDEOGRAPH + {0xB3BB, 0x9802}, //2854 #CJK UNIFIED IDEOGRAPH + {0xB3BC, 0x9803}, //2855 #CJK UNIFIED IDEOGRAPH + {0xB3BD, 0x9B5A}, //2856 #CJK UNIFIED IDEOGRAPH + {0xB3BE, 0x9CE5}, //2857 #CJK UNIFIED IDEOGRAPH + {0xB3BF, 0x9E75}, //2858 #CJK UNIFIED IDEOGRAPH + {0xB3C0, 0x9E7F}, //2859 #CJK UNIFIED IDEOGRAPH + {0xB3C1, 0x9EA5}, //2860 #CJK UNIFIED IDEOGRAPH + {0xB3C2, 0x9EBB}, //2861 #CJK UNIFIED IDEOGRAPH + {0xB3C3, 0x50A2}, //2862 #CJK UNIFIED IDEOGRAPH + {0xB3C4, 0x508D}, //2863 #CJK UNIFIED IDEOGRAPH + {0xB3C5, 0x5085}, //2864 #CJK UNIFIED IDEOGRAPH + {0xB3C6, 0x5099}, //2865 #CJK UNIFIED IDEOGRAPH + {0xB3C7, 0x5091}, //2866 #CJK UNIFIED IDEOGRAPH + {0xB3C8, 0x5080}, //2867 #CJK UNIFIED IDEOGRAPH + {0xB3C9, 0x5096}, //2868 #CJK UNIFIED IDEOGRAPH + {0xB3CA, 0x5098}, //2869 #CJK UNIFIED IDEOGRAPH + {0xB3CB, 0x509A}, //2870 #CJK UNIFIED IDEOGRAPH + {0xB3CC, 0x6700}, //2871 #CJK UNIFIED IDEOGRAPH + {0xB3CD, 0x51F1}, //2872 #CJK UNIFIED IDEOGRAPH + {0xB3CE, 0x5272}, //2873 #CJK UNIFIED IDEOGRAPH + {0xB3CF, 0x5274}, //2874 #CJK UNIFIED IDEOGRAPH + {0xB3D0, 0x5275}, //2875 #CJK UNIFIED IDEOGRAPH + {0xB3D1, 0x5269}, //2876 #CJK UNIFIED IDEOGRAPH + {0xB3D2, 0x52DE}, //2877 #CJK UNIFIED IDEOGRAPH + {0xB3D3, 0x52DD}, //2878 #CJK UNIFIED IDEOGRAPH + {0xB3D4, 0x52DB}, //2879 #CJK UNIFIED IDEOGRAPH + {0xB3D5, 0x535A}, //2880 #CJK UNIFIED IDEOGRAPH + {0xB3D6, 0x53A5}, //2881 #CJK UNIFIED IDEOGRAPH + {0xB3D7, 0x557B}, //2882 #CJK UNIFIED IDEOGRAPH + {0xB3D8, 0x5580}, //2883 #CJK UNIFIED IDEOGRAPH + {0xB3D9, 0x55A7}, //2884 #CJK UNIFIED IDEOGRAPH + {0xB3DA, 0x557C}, //2885 #CJK UNIFIED IDEOGRAPH + {0xB3DB, 0x558A}, //2886 #CJK UNIFIED IDEOGRAPH + {0xB3DC, 0x559D}, //2887 #CJK UNIFIED IDEOGRAPH + {0xB3DD, 0x5598}, //2888 #CJK UNIFIED IDEOGRAPH + {0xB3DE, 0x5582}, //2889 #CJK UNIFIED IDEOGRAPH + {0xB3DF, 0x559C}, //2890 #CJK UNIFIED IDEOGRAPH + {0xB3E0, 0x55AA}, //2891 #CJK UNIFIED IDEOGRAPH + {0xB3E1, 0x5594}, //2892 #CJK UNIFIED IDEOGRAPH + {0xB3E2, 0x5587}, //2893 #CJK UNIFIED IDEOGRAPH + {0xB3E3, 0x558B}, //2894 #CJK UNIFIED IDEOGRAPH + {0xB3E4, 0x5583}, //2895 #CJK UNIFIED IDEOGRAPH + {0xB3E5, 0x55B3}, //2896 #CJK UNIFIED IDEOGRAPH + {0xB3E6, 0x55AE}, //2897 #CJK UNIFIED IDEOGRAPH + {0xB3E7, 0x559F}, //2898 #CJK UNIFIED IDEOGRAPH + {0xB3E8, 0x553E}, //2899 #CJK UNIFIED IDEOGRAPH + {0xB3E9, 0x55B2}, //2900 #CJK UNIFIED IDEOGRAPH + {0xB3EA, 0x559A}, //2901 #CJK UNIFIED IDEOGRAPH + {0xB3EB, 0x55BB}, //2902 #CJK UNIFIED IDEOGRAPH + {0xB3EC, 0x55AC}, //2903 #CJK UNIFIED IDEOGRAPH + {0xB3ED, 0x55B1}, //2904 #CJK UNIFIED IDEOGRAPH + {0xB3EE, 0x557E}, //2905 #CJK UNIFIED IDEOGRAPH + {0xB3EF, 0x5589}, //2906 #CJK UNIFIED IDEOGRAPH + {0xB3F0, 0x55AB}, //2907 #CJK UNIFIED IDEOGRAPH + {0xB3F1, 0x5599}, //2908 #CJK UNIFIED IDEOGRAPH + {0xB3F2, 0x570D}, //2909 #CJK UNIFIED IDEOGRAPH + {0xB3F3, 0x582F}, //2910 #CJK UNIFIED IDEOGRAPH + {0xB3F4, 0x582A}, //2911 #CJK UNIFIED IDEOGRAPH + {0xB3F5, 0x5834}, //2912 #CJK UNIFIED IDEOGRAPH + {0xB3F6, 0x5824}, //2913 #CJK UNIFIED IDEOGRAPH + {0xB3F7, 0x5830}, //2914 #CJK UNIFIED IDEOGRAPH + {0xB3F8, 0x5831}, //2915 #CJK UNIFIED IDEOGRAPH + {0xB3F9, 0x5821}, //2916 #CJK UNIFIED IDEOGRAPH + {0xB3FA, 0x581D}, //2917 #CJK UNIFIED IDEOGRAPH + {0xB3FB, 0x5820}, //2918 #CJK UNIFIED IDEOGRAPH + {0xB3FC, 0x58F9}, //2919 #CJK UNIFIED IDEOGRAPH + {0xB3FD, 0x58FA}, //2920 #CJK UNIFIED IDEOGRAPH + {0xB3FE, 0x5960}, //2921 #CJK UNIFIED IDEOGRAPH + {0xB440, 0x5A77}, //2922 #CJK UNIFIED IDEOGRAPH + {0xB441, 0x5A9A}, //2923 #CJK UNIFIED IDEOGRAPH + {0xB442, 0x5A7F}, //2924 #CJK UNIFIED IDEOGRAPH + {0xB443, 0x5A92}, //2925 #CJK UNIFIED IDEOGRAPH + {0xB444, 0x5A9B}, //2926 #CJK UNIFIED IDEOGRAPH + {0xB445, 0x5AA7}, //2927 #CJK UNIFIED IDEOGRAPH + {0xB446, 0x5B73}, //2928 #CJK UNIFIED IDEOGRAPH + {0xB447, 0x5B71}, //2929 #CJK UNIFIED IDEOGRAPH + {0xB448, 0x5BD2}, //2930 #CJK UNIFIED IDEOGRAPH + {0xB449, 0x5BCC}, //2931 #CJK UNIFIED IDEOGRAPH + {0xB44A, 0x5BD3}, //2932 #CJK UNIFIED IDEOGRAPH + {0xB44B, 0x5BD0}, //2933 #CJK UNIFIED IDEOGRAPH + {0xB44C, 0x5C0A}, //2934 #CJK UNIFIED IDEOGRAPH + {0xB44D, 0x5C0B}, //2935 #CJK UNIFIED IDEOGRAPH + {0xB44E, 0x5C31}, //2936 #CJK UNIFIED IDEOGRAPH + {0xB44F, 0x5D4C}, //2937 #CJK UNIFIED IDEOGRAPH + {0xB450, 0x5D50}, //2938 #CJK UNIFIED IDEOGRAPH + {0xB451, 0x5D34}, //2939 #CJK UNIFIED IDEOGRAPH + {0xB452, 0x5D47}, //2940 #CJK UNIFIED IDEOGRAPH + {0xB453, 0x5DFD}, //2941 #CJK UNIFIED IDEOGRAPH + {0xB454, 0x5E45}, //2942 #CJK UNIFIED IDEOGRAPH + {0xB455, 0x5E3D}, //2943 #CJK UNIFIED IDEOGRAPH + {0xB456, 0x5E40}, //2944 #CJK UNIFIED IDEOGRAPH + {0xB457, 0x5E43}, //2945 #CJK UNIFIED IDEOGRAPH + {0xB458, 0x5E7E}, //2946 #CJK UNIFIED IDEOGRAPH + {0xB459, 0x5ECA}, //2947 #CJK UNIFIED IDEOGRAPH + {0xB45A, 0x5EC1}, //2948 #CJK UNIFIED IDEOGRAPH + {0xB45B, 0x5EC2}, //2949 #CJK UNIFIED IDEOGRAPH + {0xB45C, 0x5EC4}, //2950 #CJK UNIFIED IDEOGRAPH + {0xB45D, 0x5F3C}, //2951 #CJK UNIFIED IDEOGRAPH + {0xB45E, 0x5F6D}, //2952 #CJK UNIFIED IDEOGRAPH + {0xB45F, 0x5FA9}, //2953 #CJK UNIFIED IDEOGRAPH + {0xB460, 0x5FAA}, //2954 #CJK UNIFIED IDEOGRAPH + {0xB461, 0x5FA8}, //2955 #CJK UNIFIED IDEOGRAPH + {0xB462, 0x60D1}, //2956 #CJK UNIFIED IDEOGRAPH + {0xB463, 0x60E1}, //2957 #CJK UNIFIED IDEOGRAPH + {0xB464, 0x60B2}, //2958 #CJK UNIFIED IDEOGRAPH + {0xB465, 0x60B6}, //2959 #CJK UNIFIED IDEOGRAPH + {0xB466, 0x60E0}, //2960 #CJK UNIFIED IDEOGRAPH + {0xB467, 0x611C}, //2961 #CJK UNIFIED IDEOGRAPH + {0xB468, 0x6123}, //2962 #CJK UNIFIED IDEOGRAPH + {0xB469, 0x60FA}, //2963 #CJK UNIFIED IDEOGRAPH + {0xB46A, 0x6115}, //2964 #CJK UNIFIED IDEOGRAPH + {0xB46B, 0x60F0}, //2965 #CJK UNIFIED IDEOGRAPH + {0xB46C, 0x60FB}, //2966 #CJK UNIFIED IDEOGRAPH + {0xB46D, 0x60F4}, //2967 #CJK UNIFIED IDEOGRAPH + {0xB46E, 0x6168}, //2968 #CJK UNIFIED IDEOGRAPH + {0xB46F, 0x60F1}, //2969 #CJK UNIFIED IDEOGRAPH + {0xB470, 0x610E}, //2970 #CJK UNIFIED IDEOGRAPH + {0xB471, 0x60F6}, //2971 #CJK UNIFIED IDEOGRAPH + {0xB472, 0x6109}, //2972 #CJK UNIFIED IDEOGRAPH + {0xB473, 0x6100}, //2973 #CJK UNIFIED IDEOGRAPH + {0xB474, 0x6112}, //2974 #CJK UNIFIED IDEOGRAPH + {0xB475, 0x621F}, //2975 #CJK UNIFIED IDEOGRAPH + {0xB476, 0x6249}, //2976 #CJK UNIFIED IDEOGRAPH + {0xB477, 0x63A3}, //2977 #CJK UNIFIED IDEOGRAPH + {0xB478, 0x638C}, //2978 #CJK UNIFIED IDEOGRAPH + {0xB479, 0x63CF}, //2979 #CJK UNIFIED IDEOGRAPH + {0xB47A, 0x63C0}, //2980 #CJK UNIFIED IDEOGRAPH + {0xB47B, 0x63E9}, //2981 #CJK UNIFIED IDEOGRAPH + {0xB47C, 0x63C9}, //2982 #CJK UNIFIED IDEOGRAPH + {0xB47D, 0x63C6}, //2983 #CJK UNIFIED IDEOGRAPH + {0xB47E, 0x63CD}, //2984 #CJK UNIFIED IDEOGRAPH + {0xB4A1, 0x63D2}, //2985 #CJK UNIFIED IDEOGRAPH + {0xB4A2, 0x63E3}, //2986 #CJK UNIFIED IDEOGRAPH + {0xB4A3, 0x63D0}, //2987 #CJK UNIFIED IDEOGRAPH + {0xB4A4, 0x63E1}, //2988 #CJK UNIFIED IDEOGRAPH + {0xB4A5, 0x63D6}, //2989 #CJK UNIFIED IDEOGRAPH + {0xB4A6, 0x63ED}, //2990 #CJK UNIFIED IDEOGRAPH + {0xB4A7, 0x63EE}, //2991 #CJK UNIFIED IDEOGRAPH + {0xB4A8, 0x6376}, //2992 #CJK UNIFIED IDEOGRAPH + {0xB4A9, 0x63F4}, //2993 #CJK UNIFIED IDEOGRAPH + {0xB4AA, 0x63EA}, //2994 #CJK UNIFIED IDEOGRAPH + {0xB4AB, 0x63DB}, //2995 #CJK UNIFIED IDEOGRAPH + {0xB4AC, 0x6452}, //2996 #CJK UNIFIED IDEOGRAPH + {0xB4AD, 0x63DA}, //2997 #CJK UNIFIED IDEOGRAPH + {0xB4AE, 0x63F9}, //2998 #CJK UNIFIED IDEOGRAPH + {0xB4AF, 0x655E}, //2999 #CJK UNIFIED IDEOGRAPH + {0xB4B0, 0x6566}, //3000 #CJK UNIFIED IDEOGRAPH + {0xB4B1, 0x6562}, //3001 #CJK UNIFIED IDEOGRAPH + {0xB4B2, 0x6563}, //3002 #CJK UNIFIED IDEOGRAPH + {0xB4B3, 0x6591}, //3003 #CJK UNIFIED IDEOGRAPH + {0xB4B4, 0x6590}, //3004 #CJK UNIFIED IDEOGRAPH + {0xB4B5, 0x65AF}, //3005 #CJK UNIFIED IDEOGRAPH + {0xB4B6, 0x666E}, //3006 #CJK UNIFIED IDEOGRAPH + {0xB4B7, 0x6670}, //3007 #CJK UNIFIED IDEOGRAPH + {0xB4B8, 0x6674}, //3008 #CJK UNIFIED IDEOGRAPH + {0xB4B9, 0x6676}, //3009 #CJK UNIFIED IDEOGRAPH + {0xB4BA, 0x666F}, //3010 #CJK UNIFIED IDEOGRAPH + {0xB4BB, 0x6691}, //3011 #CJK UNIFIED IDEOGRAPH + {0xB4BC, 0x667A}, //3012 #CJK UNIFIED IDEOGRAPH + {0xB4BD, 0x667E}, //3013 #CJK UNIFIED IDEOGRAPH + {0xB4BE, 0x6677}, //3014 #CJK UNIFIED IDEOGRAPH + {0xB4BF, 0x66FE}, //3015 #CJK UNIFIED IDEOGRAPH + {0xB4C0, 0x66FF}, //3016 #CJK UNIFIED IDEOGRAPH + {0xB4C1, 0x671F}, //3017 #CJK UNIFIED IDEOGRAPH + {0xB4C2, 0x671D}, //3018 #CJK UNIFIED IDEOGRAPH + {0xB4C3, 0x68FA}, //3019 #CJK UNIFIED IDEOGRAPH + {0xB4C4, 0x68D5}, //3020 #CJK UNIFIED IDEOGRAPH + {0xB4C5, 0x68E0}, //3021 #CJK UNIFIED IDEOGRAPH + {0xB4C6, 0x68D8}, //3022 #CJK UNIFIED IDEOGRAPH + {0xB4C7, 0x68D7}, //3023 #CJK UNIFIED IDEOGRAPH + {0xB4C8, 0x6905}, //3024 #CJK UNIFIED IDEOGRAPH + {0xB4C9, 0x68DF}, //3025 #CJK UNIFIED IDEOGRAPH + {0xB4CA, 0x68F5}, //3026 #CJK UNIFIED IDEOGRAPH + {0xB4CB, 0x68EE}, //3027 #CJK UNIFIED IDEOGRAPH + {0xB4CC, 0x68E7}, //3028 #CJK UNIFIED IDEOGRAPH + {0xB4CD, 0x68F9}, //3029 #CJK UNIFIED IDEOGRAPH + {0xB4CE, 0x68D2}, //3030 #CJK UNIFIED IDEOGRAPH + {0xB4CF, 0x68F2}, //3031 #CJK UNIFIED IDEOGRAPH + {0xB4D0, 0x68E3}, //3032 #CJK UNIFIED IDEOGRAPH + {0xB4D1, 0x68CB}, //3033 #CJK UNIFIED IDEOGRAPH + {0xB4D2, 0x68CD}, //3034 #CJK UNIFIED IDEOGRAPH + {0xB4D3, 0x690D}, //3035 #CJK UNIFIED IDEOGRAPH + {0xB4D4, 0x6912}, //3036 #CJK UNIFIED IDEOGRAPH + {0xB4D5, 0x690E}, //3037 #CJK UNIFIED IDEOGRAPH + {0xB4D6, 0x68C9}, //3038 #CJK UNIFIED IDEOGRAPH + {0xB4D7, 0x68DA}, //3039 #CJK UNIFIED IDEOGRAPH + {0xB4D8, 0x696E}, //3040 #CJK UNIFIED IDEOGRAPH + {0xB4D9, 0x68FB}, //3041 #CJK UNIFIED IDEOGRAPH + {0xB4DA, 0x6B3E}, //3042 #CJK UNIFIED IDEOGRAPH + {0xB4DB, 0x6B3A}, //3043 #CJK UNIFIED IDEOGRAPH + {0xB4DC, 0x6B3D}, //3044 #CJK UNIFIED IDEOGRAPH + {0xB4DD, 0x6B98}, //3045 #CJK UNIFIED IDEOGRAPH + {0xB4DE, 0x6B96}, //3046 #CJK UNIFIED IDEOGRAPH + {0xB4DF, 0x6BBC}, //3047 #CJK UNIFIED IDEOGRAPH + {0xB4E0, 0x6BEF}, //3048 #CJK UNIFIED IDEOGRAPH + {0xB4E1, 0x6C2E}, //3049 #CJK UNIFIED IDEOGRAPH + {0xB4E2, 0x6C2F}, //3050 #CJK UNIFIED IDEOGRAPH + {0xB4E3, 0x6C2C}, //3051 #CJK UNIFIED IDEOGRAPH + {0xB4E4, 0x6E2F}, //3052 #CJK UNIFIED IDEOGRAPH + {0xB4E5, 0x6E38}, //3053 #CJK UNIFIED IDEOGRAPH + {0xB4E6, 0x6E54}, //3054 #CJK UNIFIED IDEOGRAPH + {0xB4E7, 0x6E21}, //3055 #CJK UNIFIED IDEOGRAPH + {0xB4E8, 0x6E32}, //3056 #CJK UNIFIED IDEOGRAPH + {0xB4E9, 0x6E67}, //3057 #CJK UNIFIED IDEOGRAPH + {0xB4EA, 0x6E4A}, //3058 #CJK UNIFIED IDEOGRAPH + {0xB4EB, 0x6E20}, //3059 #CJK UNIFIED IDEOGRAPH + {0xB4EC, 0x6E25}, //3060 #CJK UNIFIED IDEOGRAPH + {0xB4ED, 0x6E23}, //3061 #CJK UNIFIED IDEOGRAPH + {0xB4EE, 0x6E1B}, //3062 #CJK UNIFIED IDEOGRAPH + {0xB4EF, 0x6E5B}, //3063 #CJK UNIFIED IDEOGRAPH + {0xB4F0, 0x6E58}, //3064 #CJK UNIFIED IDEOGRAPH + {0xB4F1, 0x6E24}, //3065 #CJK UNIFIED IDEOGRAPH + {0xB4F2, 0x6E56}, //3066 #CJK UNIFIED IDEOGRAPH + {0xB4F3, 0x6E6E}, //3067 #CJK UNIFIED IDEOGRAPH + {0xB4F4, 0x6E2D}, //3068 #CJK UNIFIED IDEOGRAPH + {0xB4F5, 0x6E26}, //3069 #CJK UNIFIED IDEOGRAPH + {0xB4F6, 0x6E6F}, //3070 #CJK UNIFIED IDEOGRAPH + {0xB4F7, 0x6E34}, //3071 #CJK UNIFIED IDEOGRAPH + {0xB4F8, 0x6E4D}, //3072 #CJK UNIFIED IDEOGRAPH + {0xB4F9, 0x6E3A}, //3073 #CJK UNIFIED IDEOGRAPH + {0xB4FA, 0x6E2C}, //3074 #CJK UNIFIED IDEOGRAPH + {0xB4FB, 0x6E43}, //3075 #CJK UNIFIED IDEOGRAPH + {0xB4FC, 0x6E1D}, //3076 #CJK UNIFIED IDEOGRAPH + {0xB4FD, 0x6E3E}, //3077 #CJK UNIFIED IDEOGRAPH + {0xB4FE, 0x6ECB}, //3078 #CJK UNIFIED IDEOGRAPH + {0xB540, 0x6E89}, //3079 #CJK UNIFIED IDEOGRAPH + {0xB541, 0x6E19}, //3080 #CJK UNIFIED IDEOGRAPH + {0xB542, 0x6E4E}, //3081 #CJK UNIFIED IDEOGRAPH + {0xB543, 0x6E63}, //3082 #CJK UNIFIED IDEOGRAPH + {0xB544, 0x6E44}, //3083 #CJK UNIFIED IDEOGRAPH + {0xB545, 0x6E72}, //3084 #CJK UNIFIED IDEOGRAPH + {0xB546, 0x6E69}, //3085 #CJK UNIFIED IDEOGRAPH + {0xB547, 0x6E5F}, //3086 #CJK UNIFIED IDEOGRAPH + {0xB548, 0x7119}, //3087 #CJK UNIFIED IDEOGRAPH + {0xB549, 0x711A}, //3088 #CJK UNIFIED IDEOGRAPH + {0xB54A, 0x7126}, //3089 #CJK UNIFIED IDEOGRAPH + {0xB54B, 0x7130}, //3090 #CJK UNIFIED IDEOGRAPH + {0xB54C, 0x7121}, //3091 #CJK UNIFIED IDEOGRAPH + {0xB54D, 0x7136}, //3092 #CJK UNIFIED IDEOGRAPH + {0xB54E, 0x716E}, //3093 #CJK UNIFIED IDEOGRAPH + {0xB54F, 0x711C}, //3094 #CJK UNIFIED IDEOGRAPH + {0xB550, 0x724C}, //3095 #CJK UNIFIED IDEOGRAPH + {0xB551, 0x7284}, //3096 #CJK UNIFIED IDEOGRAPH + {0xB552, 0x7280}, //3097 #CJK UNIFIED IDEOGRAPH + {0xB553, 0x7336}, //3098 #CJK UNIFIED IDEOGRAPH + {0xB554, 0x7325}, //3099 #CJK UNIFIED IDEOGRAPH + {0xB555, 0x7334}, //3100 #CJK UNIFIED IDEOGRAPH + {0xB556, 0x7329}, //3101 #CJK UNIFIED IDEOGRAPH + {0xB557, 0x743A}, //3102 #CJK UNIFIED IDEOGRAPH + {0xB558, 0x742A}, //3103 #CJK UNIFIED IDEOGRAPH + {0xB559, 0x7433}, //3104 #CJK UNIFIED IDEOGRAPH + {0xB55A, 0x7422}, //3105 #CJK UNIFIED IDEOGRAPH + {0xB55B, 0x7425}, //3106 #CJK UNIFIED IDEOGRAPH + {0xB55C, 0x7435}, //3107 #CJK UNIFIED IDEOGRAPH + {0xB55D, 0x7436}, //3108 #CJK UNIFIED IDEOGRAPH + {0xB55E, 0x7434}, //3109 #CJK UNIFIED IDEOGRAPH + {0xB55F, 0x742F}, //3110 #CJK UNIFIED IDEOGRAPH + {0xB560, 0x741B}, //3111 #CJK UNIFIED IDEOGRAPH + {0xB561, 0x7426}, //3112 #CJK UNIFIED IDEOGRAPH + {0xB562, 0x7428}, //3113 #CJK UNIFIED IDEOGRAPH + {0xB563, 0x7525}, //3114 #CJK UNIFIED IDEOGRAPH + {0xB564, 0x7526}, //3115 #CJK UNIFIED IDEOGRAPH + {0xB565, 0x756B}, //3116 #CJK UNIFIED IDEOGRAPH + {0xB566, 0x756A}, //3117 #CJK UNIFIED IDEOGRAPH + {0xB567, 0x75E2}, //3118 #CJK UNIFIED IDEOGRAPH + {0xB568, 0x75DB}, //3119 #CJK UNIFIED IDEOGRAPH + {0xB569, 0x75E3}, //3120 #CJK UNIFIED IDEOGRAPH + {0xB56A, 0x75D9}, //3121 #CJK UNIFIED IDEOGRAPH + {0xB56B, 0x75D8}, //3122 #CJK UNIFIED IDEOGRAPH + {0xB56C, 0x75DE}, //3123 #CJK UNIFIED IDEOGRAPH + {0xB56D, 0x75E0}, //3124 #CJK UNIFIED IDEOGRAPH + {0xB56E, 0x767B}, //3125 #CJK UNIFIED IDEOGRAPH + {0xB56F, 0x767C}, //3126 #CJK UNIFIED IDEOGRAPH + {0xB570, 0x7696}, //3127 #CJK UNIFIED IDEOGRAPH + {0xB571, 0x7693}, //3128 #CJK UNIFIED IDEOGRAPH + {0xB572, 0x76B4}, //3129 #CJK UNIFIED IDEOGRAPH + {0xB573, 0x76DC}, //3130 #CJK UNIFIED IDEOGRAPH + {0xB574, 0x774F}, //3131 #CJK UNIFIED IDEOGRAPH + {0xB575, 0x77ED}, //3132 #CJK UNIFIED IDEOGRAPH + {0xB576, 0x785D}, //3133 #CJK UNIFIED IDEOGRAPH + {0xB577, 0x786C}, //3134 #CJK UNIFIED IDEOGRAPH + {0xB578, 0x786F}, //3135 #CJK UNIFIED IDEOGRAPH + {0xB579, 0x7A0D}, //3136 #CJK UNIFIED IDEOGRAPH + {0xB57A, 0x7A08}, //3137 #CJK UNIFIED IDEOGRAPH + {0xB57B, 0x7A0B}, //3138 #CJK UNIFIED IDEOGRAPH + {0xB57C, 0x7A05}, //3139 #CJK UNIFIED IDEOGRAPH + {0xB57D, 0x7A00}, //3140 #CJK UNIFIED IDEOGRAPH + {0xB57E, 0x7A98}, //3141 #CJK UNIFIED IDEOGRAPH + {0xB5A1, 0x7A97}, //3142 #CJK UNIFIED IDEOGRAPH + {0xB5A2, 0x7A96}, //3143 #CJK UNIFIED IDEOGRAPH + {0xB5A3, 0x7AE5}, //3144 #CJK UNIFIED IDEOGRAPH + {0xB5A4, 0x7AE3}, //3145 #CJK UNIFIED IDEOGRAPH + {0xB5A5, 0x7B49}, //3146 #CJK UNIFIED IDEOGRAPH + {0xB5A6, 0x7B56}, //3147 #CJK UNIFIED IDEOGRAPH + {0xB5A7, 0x7B46}, //3148 #CJK UNIFIED IDEOGRAPH + {0xB5A8, 0x7B50}, //3149 #CJK UNIFIED IDEOGRAPH + {0xB5A9, 0x7B52}, //3150 #CJK UNIFIED IDEOGRAPH + {0xB5AA, 0x7B54}, //3151 #CJK UNIFIED IDEOGRAPH + {0xB5AB, 0x7B4D}, //3152 #CJK UNIFIED IDEOGRAPH + {0xB5AC, 0x7B4B}, //3153 #CJK UNIFIED IDEOGRAPH + {0xB5AD, 0x7B4F}, //3154 #CJK UNIFIED IDEOGRAPH + {0xB5AE, 0x7B51}, //3155 #CJK UNIFIED IDEOGRAPH + {0xB5AF, 0x7C9F}, //3156 #CJK UNIFIED IDEOGRAPH + {0xB5B0, 0x7CA5}, //3157 #CJK UNIFIED IDEOGRAPH + {0xB5B1, 0x7D5E}, //3158 #CJK UNIFIED IDEOGRAPH + {0xB5B2, 0x7D50}, //3159 #CJK UNIFIED IDEOGRAPH + {0xB5B3, 0x7D68}, //3160 #CJK UNIFIED IDEOGRAPH + {0xB5B4, 0x7D55}, //3161 #CJK UNIFIED IDEOGRAPH + {0xB5B5, 0x7D2B}, //3162 #CJK UNIFIED IDEOGRAPH + {0xB5B6, 0x7D6E}, //3163 #CJK UNIFIED IDEOGRAPH + {0xB5B7, 0x7D72}, //3164 #CJK UNIFIED IDEOGRAPH + {0xB5B8, 0x7D61}, //3165 #CJK UNIFIED IDEOGRAPH + {0xB5B9, 0x7D66}, //3166 #CJK UNIFIED IDEOGRAPH + {0xB5BA, 0x7D62}, //3167 #CJK UNIFIED IDEOGRAPH + {0xB5BB, 0x7D70}, //3168 #CJK UNIFIED IDEOGRAPH + {0xB5BC, 0x7D73}, //3169 #CJK UNIFIED IDEOGRAPH + {0xB5BD, 0x5584}, //3170 #CJK UNIFIED IDEOGRAPH + {0xB5BE, 0x7FD4}, //3171 #CJK UNIFIED IDEOGRAPH + {0xB5BF, 0x7FD5}, //3172 #CJK UNIFIED IDEOGRAPH + {0xB5C0, 0x800B}, //3173 #CJK UNIFIED IDEOGRAPH + {0xB5C1, 0x8052}, //3174 #CJK UNIFIED IDEOGRAPH + {0xB5C2, 0x8085}, //3175 #CJK UNIFIED IDEOGRAPH + {0xB5C3, 0x8155}, //3176 #CJK UNIFIED IDEOGRAPH + {0xB5C4, 0x8154}, //3177 #CJK UNIFIED IDEOGRAPH + {0xB5C5, 0x814B}, //3178 #CJK UNIFIED IDEOGRAPH + {0xB5C6, 0x8151}, //3179 #CJK UNIFIED IDEOGRAPH + {0xB5C7, 0x814E}, //3180 #CJK UNIFIED IDEOGRAPH + {0xB5C8, 0x8139}, //3181 #CJK UNIFIED IDEOGRAPH + {0xB5C9, 0x8146}, //3182 #CJK UNIFIED IDEOGRAPH + {0xB5CA, 0x813E}, //3183 #CJK UNIFIED IDEOGRAPH + {0xB5CB, 0x814C}, //3184 #CJK UNIFIED IDEOGRAPH + {0xB5CC, 0x8153}, //3185 #CJK UNIFIED IDEOGRAPH + {0xB5CD, 0x8174}, //3186 #CJK UNIFIED IDEOGRAPH + {0xB5CE, 0x8212}, //3187 #CJK UNIFIED IDEOGRAPH + {0xB5CF, 0x821C}, //3188 #CJK UNIFIED IDEOGRAPH + {0xB5D0, 0x83E9}, //3189 #CJK UNIFIED IDEOGRAPH + {0xB5D1, 0x8403}, //3190 #CJK UNIFIED IDEOGRAPH + {0xB5D2, 0x83F8}, //3191 #CJK UNIFIED IDEOGRAPH + {0xB5D3, 0x840D}, //3192 #CJK UNIFIED IDEOGRAPH + {0xB5D4, 0x83E0}, //3193 #CJK UNIFIED IDEOGRAPH + {0xB5D5, 0x83C5}, //3194 #CJK UNIFIED IDEOGRAPH + {0xB5D6, 0x840B}, //3195 #CJK UNIFIED IDEOGRAPH + {0xB5D7, 0x83C1}, //3196 #CJK UNIFIED IDEOGRAPH + {0xB5D8, 0x83EF}, //3197 #CJK UNIFIED IDEOGRAPH + {0xB5D9, 0x83F1}, //3198 #CJK UNIFIED IDEOGRAPH + {0xB5DA, 0x83F4}, //3199 #CJK UNIFIED IDEOGRAPH + {0xB5DB, 0x8457}, //3200 #CJK UNIFIED IDEOGRAPH + {0xB5DC, 0x840A}, //3201 #CJK UNIFIED IDEOGRAPH + {0xB5DD, 0x83F0}, //3202 #CJK UNIFIED IDEOGRAPH + {0xB5DE, 0x840C}, //3203 #CJK UNIFIED IDEOGRAPH + {0xB5DF, 0x83CC}, //3204 #CJK UNIFIED IDEOGRAPH + {0xB5E0, 0x83FD}, //3205 #CJK UNIFIED IDEOGRAPH + {0xB5E1, 0x83F2}, //3206 #CJK UNIFIED IDEOGRAPH + {0xB5E2, 0x83CA}, //3207 #CJK UNIFIED IDEOGRAPH + {0xB5E3, 0x8438}, //3208 #CJK UNIFIED IDEOGRAPH + {0xB5E4, 0x840E}, //3209 #CJK UNIFIED IDEOGRAPH + {0xB5E5, 0x8404}, //3210 #CJK UNIFIED IDEOGRAPH + {0xB5E6, 0x83DC}, //3211 #CJK UNIFIED IDEOGRAPH + {0xB5E7, 0x8407}, //3212 #CJK UNIFIED IDEOGRAPH + {0xB5E8, 0x83D4}, //3213 #CJK UNIFIED IDEOGRAPH + {0xB5E9, 0x83DF}, //3214 #CJK UNIFIED IDEOGRAPH + {0xB5EA, 0x865B}, //3215 #CJK UNIFIED IDEOGRAPH + {0xB5EB, 0x86DF}, //3216 #CJK UNIFIED IDEOGRAPH + {0xB5EC, 0x86D9}, //3217 #CJK UNIFIED IDEOGRAPH + {0xB5ED, 0x86ED}, //3218 #CJK UNIFIED IDEOGRAPH + {0xB5EE, 0x86D4}, //3219 #CJK UNIFIED IDEOGRAPH + {0xB5EF, 0x86DB}, //3220 #CJK UNIFIED IDEOGRAPH + {0xB5F0, 0x86E4}, //3221 #CJK UNIFIED IDEOGRAPH + {0xB5F1, 0x86D0}, //3222 #CJK UNIFIED IDEOGRAPH + {0xB5F2, 0x86DE}, //3223 #CJK UNIFIED IDEOGRAPH + {0xB5F3, 0x8857}, //3224 #CJK UNIFIED IDEOGRAPH + {0xB5F4, 0x88C1}, //3225 #CJK UNIFIED IDEOGRAPH + {0xB5F5, 0x88C2}, //3226 #CJK UNIFIED IDEOGRAPH + {0xB5F6, 0x88B1}, //3227 #CJK UNIFIED IDEOGRAPH + {0xB5F7, 0x8983}, //3228 #CJK UNIFIED IDEOGRAPH + {0xB5F8, 0x8996}, //3229 #CJK UNIFIED IDEOGRAPH + {0xB5F9, 0x8A3B}, //3230 #CJK UNIFIED IDEOGRAPH + {0xB5FA, 0x8A60}, //3231 #CJK UNIFIED IDEOGRAPH + {0xB5FB, 0x8A55}, //3232 #CJK UNIFIED IDEOGRAPH + {0xB5FC, 0x8A5E}, //3233 #CJK UNIFIED IDEOGRAPH + {0xB5FD, 0x8A3C}, //3234 #CJK UNIFIED IDEOGRAPH + {0xB5FE, 0x8A41}, //3235 #CJK UNIFIED IDEOGRAPH + {0xB640, 0x8A54}, //3236 #CJK UNIFIED IDEOGRAPH + {0xB641, 0x8A5B}, //3237 #CJK UNIFIED IDEOGRAPH + {0xB642, 0x8A50}, //3238 #CJK UNIFIED IDEOGRAPH + {0xB643, 0x8A46}, //3239 #CJK UNIFIED IDEOGRAPH + {0xB644, 0x8A34}, //3240 #CJK UNIFIED IDEOGRAPH + {0xB645, 0x8A3A}, //3241 #CJK UNIFIED IDEOGRAPH + {0xB646, 0x8A36}, //3242 #CJK UNIFIED IDEOGRAPH + {0xB647, 0x8A56}, //3243 #CJK UNIFIED IDEOGRAPH + {0xB648, 0x8C61}, //3244 #CJK UNIFIED IDEOGRAPH + {0xB649, 0x8C82}, //3245 #CJK UNIFIED IDEOGRAPH + {0xB64A, 0x8CAF}, //3246 #CJK UNIFIED IDEOGRAPH + {0xB64B, 0x8CBC}, //3247 #CJK UNIFIED IDEOGRAPH + {0xB64C, 0x8CB3}, //3248 #CJK UNIFIED IDEOGRAPH + {0xB64D, 0x8CBD}, //3249 #CJK UNIFIED IDEOGRAPH + {0xB64E, 0x8CC1}, //3250 #CJK UNIFIED IDEOGRAPH + {0xB64F, 0x8CBB}, //3251 #CJK UNIFIED IDEOGRAPH + {0xB650, 0x8CC0}, //3252 #CJK UNIFIED IDEOGRAPH + {0xB651, 0x8CB4}, //3253 #CJK UNIFIED IDEOGRAPH + {0xB652, 0x8CB7}, //3254 #CJK UNIFIED IDEOGRAPH + {0xB653, 0x8CB6}, //3255 #CJK UNIFIED IDEOGRAPH + {0xB654, 0x8CBF}, //3256 #CJK UNIFIED IDEOGRAPH + {0xB655, 0x8CB8}, //3257 #CJK UNIFIED IDEOGRAPH + {0xB656, 0x8D8A}, //3258 #CJK UNIFIED IDEOGRAPH + {0xB657, 0x8D85}, //3259 #CJK UNIFIED IDEOGRAPH + {0xB658, 0x8D81}, //3260 #CJK UNIFIED IDEOGRAPH + {0xB659, 0x8DCE}, //3261 #CJK UNIFIED IDEOGRAPH + {0xB65A, 0x8DDD}, //3262 #CJK UNIFIED IDEOGRAPH + {0xB65B, 0x8DCB}, //3263 #CJK UNIFIED IDEOGRAPH + {0xB65C, 0x8DDA}, //3264 #CJK UNIFIED IDEOGRAPH + {0xB65D, 0x8DD1}, //3265 #CJK UNIFIED IDEOGRAPH + {0xB65E, 0x8DCC}, //3266 #CJK UNIFIED IDEOGRAPH + {0xB65F, 0x8DDB}, //3267 #CJK UNIFIED IDEOGRAPH + {0xB660, 0x8DC6}, //3268 #CJK UNIFIED IDEOGRAPH + {0xB661, 0x8EFB}, //3269 #CJK UNIFIED IDEOGRAPH + {0xB662, 0x8EF8}, //3270 #CJK UNIFIED IDEOGRAPH + {0xB663, 0x8EFC}, //3271 #CJK UNIFIED IDEOGRAPH + {0xB664, 0x8F9C}, //3272 #CJK UNIFIED IDEOGRAPH + {0xB665, 0x902E}, //3273 #CJK UNIFIED IDEOGRAPH + {0xB666, 0x9035}, //3274 #CJK UNIFIED IDEOGRAPH + {0xB667, 0x9031}, //3275 #CJK UNIFIED IDEOGRAPH + {0xB668, 0x9038}, //3276 #CJK UNIFIED IDEOGRAPH + {0xB669, 0x9032}, //3277 #CJK UNIFIED IDEOGRAPH + {0xB66A, 0x9036}, //3278 #CJK UNIFIED IDEOGRAPH + {0xB66B, 0x9102}, //3279 #CJK UNIFIED IDEOGRAPH + {0xB66C, 0x90F5}, //3280 #CJK UNIFIED IDEOGRAPH + {0xB66D, 0x9109}, //3281 #CJK UNIFIED IDEOGRAPH + {0xB66E, 0x90FE}, //3282 #CJK UNIFIED IDEOGRAPH + {0xB66F, 0x9163}, //3283 #CJK UNIFIED IDEOGRAPH + {0xB670, 0x9165}, //3284 #CJK UNIFIED IDEOGRAPH + {0xB671, 0x91CF}, //3285 #CJK UNIFIED IDEOGRAPH + {0xB672, 0x9214}, //3286 #CJK UNIFIED IDEOGRAPH + {0xB673, 0x9215}, //3287 #CJK UNIFIED IDEOGRAPH + {0xB674, 0x9223}, //3288 #CJK UNIFIED IDEOGRAPH + {0xB675, 0x9209}, //3289 #CJK UNIFIED IDEOGRAPH + {0xB676, 0x921E}, //3290 #CJK UNIFIED IDEOGRAPH + {0xB677, 0x920D}, //3291 #CJK UNIFIED IDEOGRAPH + {0xB678, 0x9210}, //3292 #CJK UNIFIED IDEOGRAPH + {0xB679, 0x9207}, //3293 #CJK UNIFIED IDEOGRAPH + {0xB67A, 0x9211}, //3294 #CJK UNIFIED IDEOGRAPH + {0xB67B, 0x9594}, //3295 #CJK UNIFIED IDEOGRAPH + {0xB67C, 0x958F}, //3296 #CJK UNIFIED IDEOGRAPH + {0xB67D, 0x958B}, //3297 #CJK UNIFIED IDEOGRAPH + {0xB67E, 0x9591}, //3298 #CJK UNIFIED IDEOGRAPH + {0xB6A1, 0x9593}, //3299 #CJK UNIFIED IDEOGRAPH + {0xB6A2, 0x9592}, //3300 #CJK UNIFIED IDEOGRAPH + {0xB6A3, 0x958E}, //3301 #CJK UNIFIED IDEOGRAPH + {0xB6A4, 0x968A}, //3302 #CJK UNIFIED IDEOGRAPH + {0xB6A5, 0x968E}, //3303 #CJK UNIFIED IDEOGRAPH + {0xB6A6, 0x968B}, //3304 #CJK UNIFIED IDEOGRAPH + {0xB6A7, 0x967D}, //3305 #CJK UNIFIED IDEOGRAPH + {0xB6A8, 0x9685}, //3306 #CJK UNIFIED IDEOGRAPH + {0xB6A9, 0x9686}, //3307 #CJK UNIFIED IDEOGRAPH + {0xB6AA, 0x968D}, //3308 #CJK UNIFIED IDEOGRAPH + {0xB6AB, 0x9672}, //3309 #CJK UNIFIED IDEOGRAPH + {0xB6AC, 0x9684}, //3310 #CJK UNIFIED IDEOGRAPH + {0xB6AD, 0x96C1}, //3311 #CJK UNIFIED IDEOGRAPH + {0xB6AE, 0x96C5}, //3312 #CJK UNIFIED IDEOGRAPH + {0xB6AF, 0x96C4}, //3313 #CJK UNIFIED IDEOGRAPH + {0xB6B0, 0x96C6}, //3314 #CJK UNIFIED IDEOGRAPH + {0xB6B1, 0x96C7}, //3315 #CJK UNIFIED IDEOGRAPH + {0xB6B2, 0x96EF}, //3316 #CJK UNIFIED IDEOGRAPH + {0xB6B3, 0x96F2}, //3317 #CJK UNIFIED IDEOGRAPH + {0xB6B4, 0x97CC}, //3318 #CJK UNIFIED IDEOGRAPH + {0xB6B5, 0x9805}, //3319 #CJK UNIFIED IDEOGRAPH + {0xB6B6, 0x9806}, //3320 #CJK UNIFIED IDEOGRAPH + {0xB6B7, 0x9808}, //3321 #CJK UNIFIED IDEOGRAPH + {0xB6B8, 0x98E7}, //3322 #CJK UNIFIED IDEOGRAPH + {0xB6B9, 0x98EA}, //3323 #CJK UNIFIED IDEOGRAPH + {0xB6BA, 0x98EF}, //3324 #CJK UNIFIED IDEOGRAPH + {0xB6BB, 0x98E9}, //3325 #CJK UNIFIED IDEOGRAPH + {0xB6BC, 0x98F2}, //3326 #CJK UNIFIED IDEOGRAPH + {0xB6BD, 0x98ED}, //3327 #CJK UNIFIED IDEOGRAPH + {0xB6BE, 0x99AE}, //3328 #CJK UNIFIED IDEOGRAPH + {0xB6BF, 0x99AD}, //3329 #CJK UNIFIED IDEOGRAPH + {0xB6C0, 0x9EC3}, //3330 #CJK UNIFIED IDEOGRAPH + {0xB6C1, 0x9ECD}, //3331 #CJK UNIFIED IDEOGRAPH + {0xB6C2, 0x9ED1}, //3332 #CJK UNIFIED IDEOGRAPH + {0xB6C3, 0x4E82}, //3333 #CJK UNIFIED IDEOGRAPH + {0xB6C4, 0x50AD}, //3334 #CJK UNIFIED IDEOGRAPH + {0xB6C5, 0x50B5}, //3335 #CJK UNIFIED IDEOGRAPH + {0xB6C6, 0x50B2}, //3336 #CJK UNIFIED IDEOGRAPH + {0xB6C7, 0x50B3}, //3337 #CJK UNIFIED IDEOGRAPH + {0xB6C8, 0x50C5}, //3338 #CJK UNIFIED IDEOGRAPH + {0xB6C9, 0x50BE}, //3339 #CJK UNIFIED IDEOGRAPH + {0xB6CA, 0x50AC}, //3340 #CJK UNIFIED IDEOGRAPH + {0xB6CB, 0x50B7}, //3341 #CJK UNIFIED IDEOGRAPH + {0xB6CC, 0x50BB}, //3342 #CJK UNIFIED IDEOGRAPH + {0xB6CD, 0x50AF}, //3343 #CJK UNIFIED IDEOGRAPH + {0xB6CE, 0x50C7}, //3344 #CJK UNIFIED IDEOGRAPH + {0xB6CF, 0x527F}, //3345 #CJK UNIFIED IDEOGRAPH + {0xB6D0, 0x5277}, //3346 #CJK UNIFIED IDEOGRAPH + {0xB6D1, 0x527D}, //3347 #CJK UNIFIED IDEOGRAPH + {0xB6D2, 0x52DF}, //3348 #CJK UNIFIED IDEOGRAPH + {0xB6D3, 0x52E6}, //3349 #CJK UNIFIED IDEOGRAPH + {0xB6D4, 0x52E4}, //3350 #CJK UNIFIED IDEOGRAPH + {0xB6D5, 0x52E2}, //3351 #CJK UNIFIED IDEOGRAPH + {0xB6D6, 0x52E3}, //3352 #CJK UNIFIED IDEOGRAPH + {0xB6D7, 0x532F}, //3353 #CJK UNIFIED IDEOGRAPH + {0xB6D8, 0x55DF}, //3354 #CJK UNIFIED IDEOGRAPH + {0xB6D9, 0x55E8}, //3355 #CJK UNIFIED IDEOGRAPH + {0xB6DA, 0x55D3}, //3356 #CJK UNIFIED IDEOGRAPH + {0xB6DB, 0x55E6}, //3357 #CJK UNIFIED IDEOGRAPH + {0xB6DC, 0x55CE}, //3358 #CJK UNIFIED IDEOGRAPH + {0xB6DD, 0x55DC}, //3359 #CJK UNIFIED IDEOGRAPH + {0xB6DE, 0x55C7}, //3360 #CJK UNIFIED IDEOGRAPH + {0xB6DF, 0x55D1}, //3361 #CJK UNIFIED IDEOGRAPH + {0xB6E0, 0x55E3}, //3362 #CJK UNIFIED IDEOGRAPH + {0xB6E1, 0x55E4}, //3363 #CJK UNIFIED IDEOGRAPH + {0xB6E2, 0x55EF}, //3364 #CJK UNIFIED IDEOGRAPH + {0xB6E3, 0x55DA}, //3365 #CJK UNIFIED IDEOGRAPH + {0xB6E4, 0x55E1}, //3366 #CJK UNIFIED IDEOGRAPH + {0xB6E5, 0x55C5}, //3367 #CJK UNIFIED IDEOGRAPH + {0xB6E6, 0x55C6}, //3368 #CJK UNIFIED IDEOGRAPH + {0xB6E7, 0x55E5}, //3369 #CJK UNIFIED IDEOGRAPH + {0xB6E8, 0x55C9}, //3370 #CJK UNIFIED IDEOGRAPH + {0xB6E9, 0x5712}, //3371 #CJK UNIFIED IDEOGRAPH + {0xB6EA, 0x5713}, //3372 #CJK UNIFIED IDEOGRAPH + {0xB6EB, 0x585E}, //3373 #CJK UNIFIED IDEOGRAPH + {0xB6EC, 0x5851}, //3374 #CJK UNIFIED IDEOGRAPH + {0xB6ED, 0x5858}, //3375 #CJK UNIFIED IDEOGRAPH + {0xB6EE, 0x5857}, //3376 #CJK UNIFIED IDEOGRAPH + {0xB6EF, 0x585A}, //3377 #CJK UNIFIED IDEOGRAPH + {0xB6F0, 0x5854}, //3378 #CJK UNIFIED IDEOGRAPH + {0xB6F1, 0x586B}, //3379 #CJK UNIFIED IDEOGRAPH + {0xB6F2, 0x584C}, //3380 #CJK UNIFIED IDEOGRAPH + {0xB6F3, 0x586D}, //3381 #CJK UNIFIED IDEOGRAPH + {0xB6F4, 0x584A}, //3382 #CJK UNIFIED IDEOGRAPH + {0xB6F5, 0x5862}, //3383 #CJK UNIFIED IDEOGRAPH + {0xB6F6, 0x5852}, //3384 #CJK UNIFIED IDEOGRAPH + {0xB6F7, 0x584B}, //3385 #CJK UNIFIED IDEOGRAPH + {0xB6F8, 0x5967}, //3386 #CJK UNIFIED IDEOGRAPH + {0xB6F9, 0x5AC1}, //3387 #CJK UNIFIED IDEOGRAPH + {0xB6FA, 0x5AC9}, //3388 #CJK UNIFIED IDEOGRAPH + {0xB6FB, 0x5ACC}, //3389 #CJK UNIFIED IDEOGRAPH + {0xB6FC, 0x5ABE}, //3390 #CJK UNIFIED IDEOGRAPH + {0xB6FD, 0x5ABD}, //3391 #CJK UNIFIED IDEOGRAPH + {0xB6FE, 0x5ABC}, //3392 #CJK UNIFIED IDEOGRAPH + {0xB740, 0x5AB3}, //3393 #CJK UNIFIED IDEOGRAPH + {0xB741, 0x5AC2}, //3394 #CJK UNIFIED IDEOGRAPH + {0xB742, 0x5AB2}, //3395 #CJK UNIFIED IDEOGRAPH + {0xB743, 0x5D69}, //3396 #CJK UNIFIED IDEOGRAPH + {0xB744, 0x5D6F}, //3397 #CJK UNIFIED IDEOGRAPH + {0xB745, 0x5E4C}, //3398 #CJK UNIFIED IDEOGRAPH + {0xB746, 0x5E79}, //3399 #CJK UNIFIED IDEOGRAPH + {0xB747, 0x5EC9}, //3400 #CJK UNIFIED IDEOGRAPH + {0xB748, 0x5EC8}, //3401 #CJK UNIFIED IDEOGRAPH + {0xB749, 0x5F12}, //3402 #CJK UNIFIED IDEOGRAPH + {0xB74A, 0x5F59}, //3403 #CJK UNIFIED IDEOGRAPH + {0xB74B, 0x5FAC}, //3404 #CJK UNIFIED IDEOGRAPH + {0xB74C, 0x5FAE}, //3405 #CJK UNIFIED IDEOGRAPH + {0xB74D, 0x611A}, //3406 #CJK UNIFIED IDEOGRAPH + {0xB74E, 0x610F}, //3407 #CJK UNIFIED IDEOGRAPH + {0xB74F, 0x6148}, //3408 #CJK UNIFIED IDEOGRAPH + {0xB750, 0x611F}, //3409 #CJK UNIFIED IDEOGRAPH + {0xB751, 0x60F3}, //3410 #CJK UNIFIED IDEOGRAPH + {0xB752, 0x611B}, //3411 #CJK UNIFIED IDEOGRAPH + {0xB753, 0x60F9}, //3412 #CJK UNIFIED IDEOGRAPH + {0xB754, 0x6101}, //3413 #CJK UNIFIED IDEOGRAPH + {0xB755, 0x6108}, //3414 #CJK UNIFIED IDEOGRAPH + {0xB756, 0x614E}, //3415 #CJK UNIFIED IDEOGRAPH + {0xB757, 0x614C}, //3416 #CJK UNIFIED IDEOGRAPH + {0xB758, 0x6144}, //3417 #CJK UNIFIED IDEOGRAPH + {0xB759, 0x614D}, //3418 #CJK UNIFIED IDEOGRAPH + {0xB75A, 0x613E}, //3419 #CJK UNIFIED IDEOGRAPH + {0xB75B, 0x6134}, //3420 #CJK UNIFIED IDEOGRAPH + {0xB75C, 0x6127}, //3421 #CJK UNIFIED IDEOGRAPH + {0xB75D, 0x610D}, //3422 #CJK UNIFIED IDEOGRAPH + {0xB75E, 0x6106}, //3423 #CJK UNIFIED IDEOGRAPH + {0xB75F, 0x6137}, //3424 #CJK UNIFIED IDEOGRAPH + {0xB760, 0x6221}, //3425 #CJK UNIFIED IDEOGRAPH + {0xB761, 0x6222}, //3426 #CJK UNIFIED IDEOGRAPH + {0xB762, 0x6413}, //3427 #CJK UNIFIED IDEOGRAPH + {0xB763, 0x643E}, //3428 #CJK UNIFIED IDEOGRAPH + {0xB764, 0x641E}, //3429 #CJK UNIFIED IDEOGRAPH + {0xB765, 0x642A}, //3430 #CJK UNIFIED IDEOGRAPH + {0xB766, 0x642D}, //3431 #CJK UNIFIED IDEOGRAPH + {0xB767, 0x643D}, //3432 #CJK UNIFIED IDEOGRAPH + {0xB768, 0x642C}, //3433 #CJK UNIFIED IDEOGRAPH + {0xB769, 0x640F}, //3434 #CJK UNIFIED IDEOGRAPH + {0xB76A, 0x641C}, //3435 #CJK UNIFIED IDEOGRAPH + {0xB76B, 0x6414}, //3436 #CJK UNIFIED IDEOGRAPH + {0xB76C, 0x640D}, //3437 #CJK UNIFIED IDEOGRAPH + {0xB76D, 0x6436}, //3438 #CJK UNIFIED IDEOGRAPH + {0xB76E, 0x6416}, //3439 #CJK UNIFIED IDEOGRAPH + {0xB76F, 0x6417}, //3440 #CJK UNIFIED IDEOGRAPH + {0xB770, 0x6406}, //3441 #CJK UNIFIED IDEOGRAPH + {0xB771, 0x656C}, //3442 #CJK UNIFIED IDEOGRAPH + {0xB772, 0x659F}, //3443 #CJK UNIFIED IDEOGRAPH + {0xB773, 0x65B0}, //3444 #CJK UNIFIED IDEOGRAPH + {0xB774, 0x6697}, //3445 #CJK UNIFIED IDEOGRAPH + {0xB775, 0x6689}, //3446 #CJK UNIFIED IDEOGRAPH + {0xB776, 0x6687}, //3447 #CJK UNIFIED IDEOGRAPH + {0xB777, 0x6688}, //3448 #CJK UNIFIED IDEOGRAPH + {0xB778, 0x6696}, //3449 #CJK UNIFIED IDEOGRAPH + {0xB779, 0x6684}, //3450 #CJK UNIFIED IDEOGRAPH + {0xB77A, 0x6698}, //3451 #CJK UNIFIED IDEOGRAPH + {0xB77B, 0x668D}, //3452 #CJK UNIFIED IDEOGRAPH + {0xB77C, 0x6703}, //3453 #CJK UNIFIED IDEOGRAPH + {0xB77D, 0x6994}, //3454 #CJK UNIFIED IDEOGRAPH + {0xB77E, 0x696D}, //3455 #CJK UNIFIED IDEOGRAPH + {0xB7A1, 0x695A}, //3456 #CJK UNIFIED IDEOGRAPH + {0xB7A2, 0x6977}, //3457 #CJK UNIFIED IDEOGRAPH + {0xB7A3, 0x6960}, //3458 #CJK UNIFIED IDEOGRAPH + {0xB7A4, 0x6954}, //3459 #CJK UNIFIED IDEOGRAPH + {0xB7A5, 0x6975}, //3460 #CJK UNIFIED IDEOGRAPH + {0xB7A6, 0x6930}, //3461 #CJK UNIFIED IDEOGRAPH + {0xB7A7, 0x6982}, //3462 #CJK UNIFIED IDEOGRAPH + {0xB7A8, 0x694A}, //3463 #CJK UNIFIED IDEOGRAPH + {0xB7A9, 0x6968}, //3464 #CJK UNIFIED IDEOGRAPH + {0xB7AA, 0x696B}, //3465 #CJK UNIFIED IDEOGRAPH + {0xB7AB, 0x695E}, //3466 #CJK UNIFIED IDEOGRAPH + {0xB7AC, 0x6953}, //3467 #CJK UNIFIED IDEOGRAPH + {0xB7AD, 0x6979}, //3468 #CJK UNIFIED IDEOGRAPH + {0xB7AE, 0x6986}, //3469 #CJK UNIFIED IDEOGRAPH + {0xB7AF, 0x695D}, //3470 #CJK UNIFIED IDEOGRAPH + {0xB7B0, 0x6963}, //3471 #CJK UNIFIED IDEOGRAPH + {0xB7B1, 0x695B}, //3472 #CJK UNIFIED IDEOGRAPH + {0xB7B2, 0x6B47}, //3473 #CJK UNIFIED IDEOGRAPH + {0xB7B3, 0x6B72}, //3474 #CJK UNIFIED IDEOGRAPH + {0xB7B4, 0x6BC0}, //3475 #CJK UNIFIED IDEOGRAPH + {0xB7B5, 0x6BBF}, //3476 #CJK UNIFIED IDEOGRAPH + {0xB7B6, 0x6BD3}, //3477 #CJK UNIFIED IDEOGRAPH + {0xB7B7, 0x6BFD}, //3478 #CJK UNIFIED IDEOGRAPH + {0xB7B8, 0x6EA2}, //3479 #CJK UNIFIED IDEOGRAPH + {0xB7B9, 0x6EAF}, //3480 #CJK UNIFIED IDEOGRAPH + {0xB7BA, 0x6ED3}, //3481 #CJK UNIFIED IDEOGRAPH + {0xB7BB, 0x6EB6}, //3482 #CJK UNIFIED IDEOGRAPH + {0xB7BC, 0x6EC2}, //3483 #CJK UNIFIED IDEOGRAPH + {0xB7BD, 0x6E90}, //3484 #CJK UNIFIED IDEOGRAPH + {0xB7BE, 0x6E9D}, //3485 #CJK UNIFIED IDEOGRAPH + {0xB7BF, 0x6EC7}, //3486 #CJK UNIFIED IDEOGRAPH + {0xB7C0, 0x6EC5}, //3487 #CJK UNIFIED IDEOGRAPH + {0xB7C1, 0x6EA5}, //3488 #CJK UNIFIED IDEOGRAPH + {0xB7C2, 0x6E98}, //3489 #CJK UNIFIED IDEOGRAPH + {0xB7C3, 0x6EBC}, //3490 #CJK UNIFIED IDEOGRAPH + {0xB7C4, 0x6EBA}, //3491 #CJK UNIFIED IDEOGRAPH + {0xB7C5, 0x6EAB}, //3492 #CJK UNIFIED IDEOGRAPH + {0xB7C6, 0x6ED1}, //3493 #CJK UNIFIED IDEOGRAPH + {0xB7C7, 0x6E96}, //3494 #CJK UNIFIED IDEOGRAPH + {0xB7C8, 0x6E9C}, //3495 #CJK UNIFIED IDEOGRAPH + {0xB7C9, 0x6EC4}, //3496 #CJK UNIFIED IDEOGRAPH + {0xB7CA, 0x6ED4}, //3497 #CJK UNIFIED IDEOGRAPH + {0xB7CB, 0x6EAA}, //3498 #CJK UNIFIED IDEOGRAPH + {0xB7CC, 0x6EA7}, //3499 #CJK UNIFIED IDEOGRAPH + {0xB7CD, 0x6EB4}, //3500 #CJK UNIFIED IDEOGRAPH + {0xB7CE, 0x714E}, //3501 #CJK UNIFIED IDEOGRAPH + {0xB7CF, 0x7159}, //3502 #CJK UNIFIED IDEOGRAPH + {0xB7D0, 0x7169}, //3503 #CJK UNIFIED IDEOGRAPH + {0xB7D1, 0x7164}, //3504 #CJK UNIFIED IDEOGRAPH + {0xB7D2, 0x7149}, //3505 #CJK UNIFIED IDEOGRAPH + {0xB7D3, 0x7167}, //3506 #CJK UNIFIED IDEOGRAPH + {0xB7D4, 0x715C}, //3507 #CJK UNIFIED IDEOGRAPH + {0xB7D5, 0x716C}, //3508 #CJK UNIFIED IDEOGRAPH + {0xB7D6, 0x7166}, //3509 #CJK UNIFIED IDEOGRAPH + {0xB7D7, 0x714C}, //3510 #CJK UNIFIED IDEOGRAPH + {0xB7D8, 0x7165}, //3511 #CJK UNIFIED IDEOGRAPH + {0xB7D9, 0x715E}, //3512 #CJK UNIFIED IDEOGRAPH + {0xB7DA, 0x7146}, //3513 #CJK UNIFIED IDEOGRAPH + {0xB7DB, 0x7168}, //3514 #CJK UNIFIED IDEOGRAPH + {0xB7DC, 0x7156}, //3515 #CJK UNIFIED IDEOGRAPH + {0xB7DD, 0x723A}, //3516 #CJK UNIFIED IDEOGRAPH + {0xB7DE, 0x7252}, //3517 #CJK UNIFIED IDEOGRAPH + {0xB7DF, 0x7337}, //3518 #CJK UNIFIED IDEOGRAPH + {0xB7E0, 0x7345}, //3519 #CJK UNIFIED IDEOGRAPH + {0xB7E1, 0x733F}, //3520 #CJK UNIFIED IDEOGRAPH + {0xB7E2, 0x733E}, //3521 #CJK UNIFIED IDEOGRAPH + {0xB7E3, 0x746F}, //3522 #CJK UNIFIED IDEOGRAPH + {0xB7E4, 0x745A}, //3523 #CJK UNIFIED IDEOGRAPH + {0xB7E5, 0x7455}, //3524 #CJK UNIFIED IDEOGRAPH + {0xB7E6, 0x745F}, //3525 #CJK UNIFIED IDEOGRAPH + {0xB7E7, 0x745E}, //3526 #CJK UNIFIED IDEOGRAPH + {0xB7E8, 0x7441}, //3527 #CJK UNIFIED IDEOGRAPH + {0xB7E9, 0x743F}, //3528 #CJK UNIFIED IDEOGRAPH + {0xB7EA, 0x7459}, //3529 #CJK UNIFIED IDEOGRAPH + {0xB7EB, 0x745B}, //3530 #CJK UNIFIED IDEOGRAPH + {0xB7EC, 0x745C}, //3531 #CJK UNIFIED IDEOGRAPH + {0xB7ED, 0x7576}, //3532 #CJK UNIFIED IDEOGRAPH + {0xB7EE, 0x7578}, //3533 #CJK UNIFIED IDEOGRAPH + {0xB7EF, 0x7600}, //3534 #CJK UNIFIED IDEOGRAPH + {0xB7F0, 0x75F0}, //3535 #CJK UNIFIED IDEOGRAPH + {0xB7F1, 0x7601}, //3536 #CJK UNIFIED IDEOGRAPH + {0xB7F2, 0x75F2}, //3537 #CJK UNIFIED IDEOGRAPH + {0xB7F3, 0x75F1}, //3538 #CJK UNIFIED IDEOGRAPH + {0xB7F4, 0x75FA}, //3539 #CJK UNIFIED IDEOGRAPH + {0xB7F5, 0x75FF}, //3540 #CJK UNIFIED IDEOGRAPH + {0xB7F6, 0x75F4}, //3541 #CJK UNIFIED IDEOGRAPH + {0xB7F7, 0x75F3}, //3542 #CJK UNIFIED IDEOGRAPH + {0xB7F8, 0x76DE}, //3543 #CJK UNIFIED IDEOGRAPH + {0xB7F9, 0x76DF}, //3544 #CJK UNIFIED IDEOGRAPH + {0xB7FA, 0x775B}, //3545 #CJK UNIFIED IDEOGRAPH + {0xB7FB, 0x776B}, //3546 #CJK UNIFIED IDEOGRAPH + {0xB7FC, 0x7766}, //3547 #CJK UNIFIED IDEOGRAPH + {0xB7FD, 0x775E}, //3548 #CJK UNIFIED IDEOGRAPH + {0xB7FE, 0x7763}, //3549 #CJK UNIFIED IDEOGRAPH + {0xB840, 0x7779}, //3550 #CJK UNIFIED IDEOGRAPH + {0xB841, 0x776A}, //3551 #CJK UNIFIED IDEOGRAPH + {0xB842, 0x776C}, //3552 #CJK UNIFIED IDEOGRAPH + {0xB843, 0x775C}, //3553 #CJK UNIFIED IDEOGRAPH + {0xB844, 0x7765}, //3554 #CJK UNIFIED IDEOGRAPH + {0xB845, 0x7768}, //3555 #CJK UNIFIED IDEOGRAPH + {0xB846, 0x7762}, //3556 #CJK UNIFIED IDEOGRAPH + {0xB847, 0x77EE}, //3557 #CJK UNIFIED IDEOGRAPH + {0xB848, 0x788E}, //3558 #CJK UNIFIED IDEOGRAPH + {0xB849, 0x78B0}, //3559 #CJK UNIFIED IDEOGRAPH + {0xB84A, 0x7897}, //3560 #CJK UNIFIED IDEOGRAPH + {0xB84B, 0x7898}, //3561 #CJK UNIFIED IDEOGRAPH + {0xB84C, 0x788C}, //3562 #CJK UNIFIED IDEOGRAPH + {0xB84D, 0x7889}, //3563 #CJK UNIFIED IDEOGRAPH + {0xB84E, 0x787C}, //3564 #CJK UNIFIED IDEOGRAPH + {0xB84F, 0x7891}, //3565 #CJK UNIFIED IDEOGRAPH + {0xB850, 0x7893}, //3566 #CJK UNIFIED IDEOGRAPH + {0xB851, 0x787F}, //3567 #CJK UNIFIED IDEOGRAPH + {0xB852, 0x797A}, //3568 #CJK UNIFIED IDEOGRAPH + {0xB853, 0x797F}, //3569 #CJK UNIFIED IDEOGRAPH + {0xB854, 0x7981}, //3570 #CJK UNIFIED IDEOGRAPH + {0xB855, 0x842C}, //3571 #CJK UNIFIED IDEOGRAPH + {0xB856, 0x79BD}, //3572 #CJK UNIFIED IDEOGRAPH + {0xB857, 0x7A1C}, //3573 #CJK UNIFIED IDEOGRAPH + {0xB858, 0x7A1A}, //3574 #CJK UNIFIED IDEOGRAPH + {0xB859, 0x7A20}, //3575 #CJK UNIFIED IDEOGRAPH + {0xB85A, 0x7A14}, //3576 #CJK UNIFIED IDEOGRAPH + {0xB85B, 0x7A1F}, //3577 #CJK UNIFIED IDEOGRAPH + {0xB85C, 0x7A1E}, //3578 #CJK UNIFIED IDEOGRAPH + {0xB85D, 0x7A9F}, //3579 #CJK UNIFIED IDEOGRAPH + {0xB85E, 0x7AA0}, //3580 #CJK UNIFIED IDEOGRAPH + {0xB85F, 0x7B77}, //3581 #CJK UNIFIED IDEOGRAPH + {0xB860, 0x7BC0}, //3582 #CJK UNIFIED IDEOGRAPH + {0xB861, 0x7B60}, //3583 #CJK UNIFIED IDEOGRAPH + {0xB862, 0x7B6E}, //3584 #CJK UNIFIED IDEOGRAPH + {0xB863, 0x7B67}, //3585 #CJK UNIFIED IDEOGRAPH + {0xB864, 0x7CB1}, //3586 #CJK UNIFIED IDEOGRAPH + {0xB865, 0x7CB3}, //3587 #CJK UNIFIED IDEOGRAPH + {0xB866, 0x7CB5}, //3588 #CJK UNIFIED IDEOGRAPH + {0xB867, 0x7D93}, //3589 #CJK UNIFIED IDEOGRAPH + {0xB868, 0x7D79}, //3590 #CJK UNIFIED IDEOGRAPH + {0xB869, 0x7D91}, //3591 #CJK UNIFIED IDEOGRAPH + {0xB86A, 0x7D81}, //3592 #CJK UNIFIED IDEOGRAPH + {0xB86B, 0x7D8F}, //3593 #CJK UNIFIED IDEOGRAPH + {0xB86C, 0x7D5B}, //3594 #CJK UNIFIED IDEOGRAPH + {0xB86D, 0x7F6E}, //3595 #CJK UNIFIED IDEOGRAPH + {0xB86E, 0x7F69}, //3596 #CJK UNIFIED IDEOGRAPH + {0xB86F, 0x7F6A}, //3597 #CJK UNIFIED IDEOGRAPH + {0xB870, 0x7F72}, //3598 #CJK UNIFIED IDEOGRAPH + {0xB871, 0x7FA9}, //3599 #CJK UNIFIED IDEOGRAPH + {0xB872, 0x7FA8}, //3600 #CJK UNIFIED IDEOGRAPH + {0xB873, 0x7FA4}, //3601 #CJK UNIFIED IDEOGRAPH + {0xB874, 0x8056}, //3602 #CJK UNIFIED IDEOGRAPH + {0xB875, 0x8058}, //3603 #CJK UNIFIED IDEOGRAPH + {0xB876, 0x8086}, //3604 #CJK UNIFIED IDEOGRAPH + {0xB877, 0x8084}, //3605 #CJK UNIFIED IDEOGRAPH + {0xB878, 0x8171}, //3606 #CJK UNIFIED IDEOGRAPH + {0xB879, 0x8170}, //3607 #CJK UNIFIED IDEOGRAPH + {0xB87A, 0x8178}, //3608 #CJK UNIFIED IDEOGRAPH + {0xB87B, 0x8165}, //3609 #CJK UNIFIED IDEOGRAPH + {0xB87C, 0x816E}, //3610 #CJK UNIFIED IDEOGRAPH + {0xB87D, 0x8173}, //3611 #CJK UNIFIED IDEOGRAPH + {0xB87E, 0x816B}, //3612 #CJK UNIFIED IDEOGRAPH + {0xB8A1, 0x8179}, //3613 #CJK UNIFIED IDEOGRAPH + {0xB8A2, 0x817A}, //3614 #CJK UNIFIED IDEOGRAPH + {0xB8A3, 0x8166}, //3615 #CJK UNIFIED IDEOGRAPH + {0xB8A4, 0x8205}, //3616 #CJK UNIFIED IDEOGRAPH + {0xB8A5, 0x8247}, //3617 #CJK UNIFIED IDEOGRAPH + {0xB8A6, 0x8482}, //3618 #CJK UNIFIED IDEOGRAPH + {0xB8A7, 0x8477}, //3619 #CJK UNIFIED IDEOGRAPH + {0xB8A8, 0x843D}, //3620 #CJK UNIFIED IDEOGRAPH + {0xB8A9, 0x8431}, //3621 #CJK UNIFIED IDEOGRAPH + {0xB8AA, 0x8475}, //3622 #CJK UNIFIED IDEOGRAPH + {0xB8AB, 0x8466}, //3623 #CJK UNIFIED IDEOGRAPH + {0xB8AC, 0x846B}, //3624 #CJK UNIFIED IDEOGRAPH + {0xB8AD, 0x8449}, //3625 #CJK UNIFIED IDEOGRAPH + {0xB8AE, 0x846C}, //3626 #CJK UNIFIED IDEOGRAPH + {0xB8AF, 0x845B}, //3627 #CJK UNIFIED IDEOGRAPH + {0xB8B0, 0x843C}, //3628 #CJK UNIFIED IDEOGRAPH + {0xB8B1, 0x8435}, //3629 #CJK UNIFIED IDEOGRAPH + {0xB8B2, 0x8461}, //3630 #CJK UNIFIED IDEOGRAPH + {0xB8B3, 0x8463}, //3631 #CJK UNIFIED IDEOGRAPH + {0xB8B4, 0x8469}, //3632 #CJK UNIFIED IDEOGRAPH + {0xB8B5, 0x846D}, //3633 #CJK UNIFIED IDEOGRAPH + {0xB8B6, 0x8446}, //3634 #CJK UNIFIED IDEOGRAPH + {0xB8B7, 0x865E}, //3635 #CJK UNIFIED IDEOGRAPH + {0xB8B8, 0x865C}, //3636 #CJK UNIFIED IDEOGRAPH + {0xB8B9, 0x865F}, //3637 #CJK UNIFIED IDEOGRAPH + {0xB8BA, 0x86F9}, //3638 #CJK UNIFIED IDEOGRAPH + {0xB8BB, 0x8713}, //3639 #CJK UNIFIED IDEOGRAPH + {0xB8BC, 0x8708}, //3640 #CJK UNIFIED IDEOGRAPH + {0xB8BD, 0x8707}, //3641 #CJK UNIFIED IDEOGRAPH + {0xB8BE, 0x8700}, //3642 #CJK UNIFIED IDEOGRAPH + {0xB8BF, 0x86FE}, //3643 #CJK UNIFIED IDEOGRAPH + {0xB8C0, 0x86FB}, //3644 #CJK UNIFIED IDEOGRAPH + {0xB8C1, 0x8702}, //3645 #CJK UNIFIED IDEOGRAPH + {0xB8C2, 0x8703}, //3646 #CJK UNIFIED IDEOGRAPH + {0xB8C3, 0x8706}, //3647 #CJK UNIFIED IDEOGRAPH + {0xB8C4, 0x870A}, //3648 #CJK UNIFIED IDEOGRAPH + {0xB8C5, 0x8859}, //3649 #CJK UNIFIED IDEOGRAPH + {0xB8C6, 0x88DF}, //3650 #CJK UNIFIED IDEOGRAPH + {0xB8C7, 0x88D4}, //3651 #CJK UNIFIED IDEOGRAPH + {0xB8C8, 0x88D9}, //3652 #CJK UNIFIED IDEOGRAPH + {0xB8C9, 0x88DC}, //3653 #CJK UNIFIED IDEOGRAPH + {0xB8CA, 0x88D8}, //3654 #CJK UNIFIED IDEOGRAPH + {0xB8CB, 0x88DD}, //3655 #CJK UNIFIED IDEOGRAPH + {0xB8CC, 0x88E1}, //3656 #CJK UNIFIED IDEOGRAPH + {0xB8CD, 0x88CA}, //3657 #CJK UNIFIED IDEOGRAPH + {0xB8CE, 0x88D5}, //3658 #CJK UNIFIED IDEOGRAPH + {0xB8CF, 0x88D2}, //3659 #CJK UNIFIED IDEOGRAPH + {0xB8D0, 0x899C}, //3660 #CJK UNIFIED IDEOGRAPH + {0xB8D1, 0x89E3}, //3661 #CJK UNIFIED IDEOGRAPH + {0xB8D2, 0x8A6B}, //3662 #CJK UNIFIED IDEOGRAPH + {0xB8D3, 0x8A72}, //3663 #CJK UNIFIED IDEOGRAPH + {0xB8D4, 0x8A73}, //3664 #CJK UNIFIED IDEOGRAPH + {0xB8D5, 0x8A66}, //3665 #CJK UNIFIED IDEOGRAPH + {0xB8D6, 0x8A69}, //3666 #CJK UNIFIED IDEOGRAPH + {0xB8D7, 0x8A70}, //3667 #CJK UNIFIED IDEOGRAPH + {0xB8D8, 0x8A87}, //3668 #CJK UNIFIED IDEOGRAPH + {0xB8D9, 0x8A7C}, //3669 #CJK UNIFIED IDEOGRAPH + {0xB8DA, 0x8A63}, //3670 #CJK UNIFIED IDEOGRAPH + {0xB8DB, 0x8AA0}, //3671 #CJK UNIFIED IDEOGRAPH + {0xB8DC, 0x8A71}, //3672 #CJK UNIFIED IDEOGRAPH + {0xB8DD, 0x8A85}, //3673 #CJK UNIFIED IDEOGRAPH + {0xB8DE, 0x8A6D}, //3674 #CJK UNIFIED IDEOGRAPH + {0xB8DF, 0x8A62}, //3675 #CJK UNIFIED IDEOGRAPH + {0xB8E0, 0x8A6E}, //3676 #CJK UNIFIED IDEOGRAPH + {0xB8E1, 0x8A6C}, //3677 #CJK UNIFIED IDEOGRAPH + {0xB8E2, 0x8A79}, //3678 #CJK UNIFIED IDEOGRAPH + {0xB8E3, 0x8A7B}, //3679 #CJK UNIFIED IDEOGRAPH + {0xB8E4, 0x8A3E}, //3680 #CJK UNIFIED IDEOGRAPH + {0xB8E5, 0x8A68}, //3681 #CJK UNIFIED IDEOGRAPH + {0xB8E6, 0x8C62}, //3682 #CJK UNIFIED IDEOGRAPH + {0xB8E7, 0x8C8A}, //3683 #CJK UNIFIED IDEOGRAPH + {0xB8E8, 0x8C89}, //3684 #CJK UNIFIED IDEOGRAPH + {0xB8E9, 0x8CCA}, //3685 #CJK UNIFIED IDEOGRAPH + {0xB8EA, 0x8CC7}, //3686 #CJK UNIFIED IDEOGRAPH + {0xB8EB, 0x8CC8}, //3687 #CJK UNIFIED IDEOGRAPH + {0xB8EC, 0x8CC4}, //3688 #CJK UNIFIED IDEOGRAPH + {0xB8ED, 0x8CB2}, //3689 #CJK UNIFIED IDEOGRAPH + {0xB8EE, 0x8CC3}, //3690 #CJK UNIFIED IDEOGRAPH + {0xB8EF, 0x8CC2}, //3691 #CJK UNIFIED IDEOGRAPH + {0xB8F0, 0x8CC5}, //3692 #CJK UNIFIED IDEOGRAPH + {0xB8F1, 0x8DE1}, //3693 #CJK UNIFIED IDEOGRAPH + {0xB8F2, 0x8DDF}, //3694 #CJK UNIFIED IDEOGRAPH + {0xB8F3, 0x8DE8}, //3695 #CJK UNIFIED IDEOGRAPH + {0xB8F4, 0x8DEF}, //3696 #CJK UNIFIED IDEOGRAPH + {0xB8F5, 0x8DF3}, //3697 #CJK UNIFIED IDEOGRAPH + {0xB8F6, 0x8DFA}, //3698 #CJK UNIFIED IDEOGRAPH + {0xB8F7, 0x8DEA}, //3699 #CJK UNIFIED IDEOGRAPH + {0xB8F8, 0x8DE4}, //3700 #CJK UNIFIED IDEOGRAPH + {0xB8F9, 0x8DE6}, //3701 #CJK UNIFIED IDEOGRAPH + {0xB8FA, 0x8EB2}, //3702 #CJK UNIFIED IDEOGRAPH + {0xB8FB, 0x8F03}, //3703 #CJK UNIFIED IDEOGRAPH + {0xB8FC, 0x8F09}, //3704 #CJK UNIFIED IDEOGRAPH + {0xB8FD, 0x8EFE}, //3705 #CJK UNIFIED IDEOGRAPH + {0xB8FE, 0x8F0A}, //3706 #CJK UNIFIED IDEOGRAPH + {0xB940, 0x8F9F}, //3707 #CJK UNIFIED IDEOGRAPH + {0xB941, 0x8FB2}, //3708 #CJK UNIFIED IDEOGRAPH + {0xB942, 0x904B}, //3709 #CJK UNIFIED IDEOGRAPH + {0xB943, 0x904A}, //3710 #CJK UNIFIED IDEOGRAPH + {0xB944, 0x9053}, //3711 #CJK UNIFIED IDEOGRAPH + {0xB945, 0x9042}, //3712 #CJK UNIFIED IDEOGRAPH + {0xB946, 0x9054}, //3713 #CJK UNIFIED IDEOGRAPH + {0xB947, 0x903C}, //3714 #CJK UNIFIED IDEOGRAPH + {0xB948, 0x9055}, //3715 #CJK UNIFIED IDEOGRAPH + {0xB949, 0x9050}, //3716 #CJK UNIFIED IDEOGRAPH + {0xB94A, 0x9047}, //3717 #CJK UNIFIED IDEOGRAPH + {0xB94B, 0x904F}, //3718 #CJK UNIFIED IDEOGRAPH + {0xB94C, 0x904E}, //3719 #CJK UNIFIED IDEOGRAPH + {0xB94D, 0x904D}, //3720 #CJK UNIFIED IDEOGRAPH + {0xB94E, 0x9051}, //3721 #CJK UNIFIED IDEOGRAPH + {0xB94F, 0x903E}, //3722 #CJK UNIFIED IDEOGRAPH + {0xB950, 0x9041}, //3723 #CJK UNIFIED IDEOGRAPH + {0xB951, 0x9112}, //3724 #CJK UNIFIED IDEOGRAPH + {0xB952, 0x9117}, //3725 #CJK UNIFIED IDEOGRAPH + {0xB953, 0x916C}, //3726 #CJK UNIFIED IDEOGRAPH + {0xB954, 0x916A}, //3727 #CJK UNIFIED IDEOGRAPH + {0xB955, 0x9169}, //3728 #CJK UNIFIED IDEOGRAPH + {0xB956, 0x91C9}, //3729 #CJK UNIFIED IDEOGRAPH + {0xB957, 0x9237}, //3730 #CJK UNIFIED IDEOGRAPH + {0xB958, 0x9257}, //3731 #CJK UNIFIED IDEOGRAPH + {0xB959, 0x9238}, //3732 #CJK UNIFIED IDEOGRAPH + {0xB95A, 0x923D}, //3733 #CJK UNIFIED IDEOGRAPH + {0xB95B, 0x9240}, //3734 #CJK UNIFIED IDEOGRAPH + {0xB95C, 0x923E}, //3735 #CJK UNIFIED IDEOGRAPH + {0xB95D, 0x925B}, //3736 #CJK UNIFIED IDEOGRAPH + {0xB95E, 0x924B}, //3737 #CJK UNIFIED IDEOGRAPH + {0xB95F, 0x9264}, //3738 #CJK UNIFIED IDEOGRAPH + {0xB960, 0x9251}, //3739 #CJK UNIFIED IDEOGRAPH + {0xB961, 0x9234}, //3740 #CJK UNIFIED IDEOGRAPH + {0xB962, 0x9249}, //3741 #CJK UNIFIED IDEOGRAPH + {0xB963, 0x924D}, //3742 #CJK UNIFIED IDEOGRAPH + {0xB964, 0x9245}, //3743 #CJK UNIFIED IDEOGRAPH + {0xB965, 0x9239}, //3744 #CJK UNIFIED IDEOGRAPH + {0xB966, 0x923F}, //3745 #CJK UNIFIED IDEOGRAPH + {0xB967, 0x925A}, //3746 #CJK UNIFIED IDEOGRAPH + {0xB968, 0x9598}, //3747 #CJK UNIFIED IDEOGRAPH + {0xB969, 0x9698}, //3748 #CJK UNIFIED IDEOGRAPH + {0xB96A, 0x9694}, //3749 #CJK UNIFIED IDEOGRAPH + {0xB96B, 0x9695}, //3750 #CJK UNIFIED IDEOGRAPH + {0xB96C, 0x96CD}, //3751 #CJK UNIFIED IDEOGRAPH + {0xB96D, 0x96CB}, //3752 #CJK UNIFIED IDEOGRAPH + {0xB96E, 0x96C9}, //3753 #CJK UNIFIED IDEOGRAPH + {0xB96F, 0x96CA}, //3754 #CJK UNIFIED IDEOGRAPH + {0xB970, 0x96F7}, //3755 #CJK UNIFIED IDEOGRAPH + {0xB971, 0x96FB}, //3756 #CJK UNIFIED IDEOGRAPH + {0xB972, 0x96F9}, //3757 #CJK UNIFIED IDEOGRAPH + {0xB973, 0x96F6}, //3758 #CJK UNIFIED IDEOGRAPH + {0xB974, 0x9756}, //3759 #CJK UNIFIED IDEOGRAPH + {0xB975, 0x9774}, //3760 #CJK UNIFIED IDEOGRAPH + {0xB976, 0x9776}, //3761 #CJK UNIFIED IDEOGRAPH + {0xB977, 0x9810}, //3762 #CJK UNIFIED IDEOGRAPH + {0xB978, 0x9811}, //3763 #CJK UNIFIED IDEOGRAPH + {0xB979, 0x9813}, //3764 #CJK UNIFIED IDEOGRAPH + {0xB97A, 0x980A}, //3765 #CJK UNIFIED IDEOGRAPH + {0xB97B, 0x9812}, //3766 #CJK UNIFIED IDEOGRAPH + {0xB97C, 0x980C}, //3767 #CJK UNIFIED IDEOGRAPH + {0xB97D, 0x98FC}, //3768 #CJK UNIFIED IDEOGRAPH + {0xB97E, 0x98F4}, //3769 #CJK UNIFIED IDEOGRAPH + {0xB9A1, 0x98FD}, //3770 #CJK UNIFIED IDEOGRAPH + {0xB9A2, 0x98FE}, //3771 #CJK UNIFIED IDEOGRAPH + {0xB9A3, 0x99B3}, //3772 #CJK UNIFIED IDEOGRAPH + {0xB9A4, 0x99B1}, //3773 #CJK UNIFIED IDEOGRAPH + {0xB9A5, 0x99B4}, //3774 #CJK UNIFIED IDEOGRAPH + {0xB9A6, 0x9AE1}, //3775 #CJK UNIFIED IDEOGRAPH + {0xB9A7, 0x9CE9}, //3776 #CJK UNIFIED IDEOGRAPH + {0xB9A8, 0x9E82}, //3777 #CJK UNIFIED IDEOGRAPH + {0xB9A9, 0x9F0E}, //3778 #CJK UNIFIED IDEOGRAPH + {0xB9AA, 0x9F13}, //3779 #CJK UNIFIED IDEOGRAPH + {0xB9AB, 0x9F20}, //3780 #CJK UNIFIED IDEOGRAPH + {0xB9AC, 0x50E7}, //3781 #CJK UNIFIED IDEOGRAPH + {0xB9AD, 0x50EE}, //3782 #CJK UNIFIED IDEOGRAPH + {0xB9AE, 0x50E5}, //3783 #CJK UNIFIED IDEOGRAPH + {0xB9AF, 0x50D6}, //3784 #CJK UNIFIED IDEOGRAPH + {0xB9B0, 0x50ED}, //3785 #CJK UNIFIED IDEOGRAPH + {0xB9B1, 0x50DA}, //3786 #CJK UNIFIED IDEOGRAPH + {0xB9B2, 0x50D5}, //3787 #CJK UNIFIED IDEOGRAPH + {0xB9B3, 0x50CF}, //3788 #CJK UNIFIED IDEOGRAPH + {0xB9B4, 0x50D1}, //3789 #CJK UNIFIED IDEOGRAPH + {0xB9B5, 0x50F1}, //3790 #CJK UNIFIED IDEOGRAPH + {0xB9B6, 0x50CE}, //3791 #CJK UNIFIED IDEOGRAPH + {0xB9B7, 0x50E9}, //3792 #CJK UNIFIED IDEOGRAPH + {0xB9B8, 0x5162}, //3793 #CJK UNIFIED IDEOGRAPH + {0xB9B9, 0x51F3}, //3794 #CJK UNIFIED IDEOGRAPH + {0xB9BA, 0x5283}, //3795 #CJK UNIFIED IDEOGRAPH + {0xB9BB, 0x5282}, //3796 #CJK UNIFIED IDEOGRAPH + {0xB9BC, 0x5331}, //3797 #CJK UNIFIED IDEOGRAPH + {0xB9BD, 0x53AD}, //3798 #CJK UNIFIED IDEOGRAPH + {0xB9BE, 0x55FE}, //3799 #CJK UNIFIED IDEOGRAPH + {0xB9BF, 0x5600}, //3800 #CJK UNIFIED IDEOGRAPH + {0xB9C0, 0x561B}, //3801 #CJK UNIFIED IDEOGRAPH + {0xB9C1, 0x5617}, //3802 #CJK UNIFIED IDEOGRAPH + {0xB9C2, 0x55FD}, //3803 #CJK UNIFIED IDEOGRAPH + {0xB9C3, 0x5614}, //3804 #CJK UNIFIED IDEOGRAPH + {0xB9C4, 0x5606}, //3805 #CJK UNIFIED IDEOGRAPH + {0xB9C5, 0x5609}, //3806 #CJK UNIFIED IDEOGRAPH + {0xB9C6, 0x560D}, //3807 #CJK UNIFIED IDEOGRAPH + {0xB9C7, 0x560E}, //3808 #CJK UNIFIED IDEOGRAPH + {0xB9C8, 0x55F7}, //3809 #CJK UNIFIED IDEOGRAPH + {0xB9C9, 0x5616}, //3810 #CJK UNIFIED IDEOGRAPH + {0xB9CA, 0x561F}, //3811 #CJK UNIFIED IDEOGRAPH + {0xB9CB, 0x5608}, //3812 #CJK UNIFIED IDEOGRAPH + {0xB9CC, 0x5610}, //3813 #CJK UNIFIED IDEOGRAPH + {0xB9CD, 0x55F6}, //3814 #CJK UNIFIED IDEOGRAPH + {0xB9CE, 0x5718}, //3815 #CJK UNIFIED IDEOGRAPH + {0xB9CF, 0x5716}, //3816 #CJK UNIFIED IDEOGRAPH + {0xB9D0, 0x5875}, //3817 #CJK UNIFIED IDEOGRAPH + {0xB9D1, 0x587E}, //3818 #CJK UNIFIED IDEOGRAPH + {0xB9D2, 0x5883}, //3819 #CJK UNIFIED IDEOGRAPH + {0xB9D3, 0x5893}, //3820 #CJK UNIFIED IDEOGRAPH + {0xB9D4, 0x588A}, //3821 #CJK UNIFIED IDEOGRAPH + {0xB9D5, 0x5879}, //3822 #CJK UNIFIED IDEOGRAPH + {0xB9D6, 0x5885}, //3823 #CJK UNIFIED IDEOGRAPH + {0xB9D7, 0x587D}, //3824 #CJK UNIFIED IDEOGRAPH + {0xB9D8, 0x58FD}, //3825 #CJK UNIFIED IDEOGRAPH + {0xB9D9, 0x5925}, //3826 #CJK UNIFIED IDEOGRAPH + {0xB9DA, 0x5922}, //3827 #CJK UNIFIED IDEOGRAPH + {0xB9DB, 0x5924}, //3828 #CJK UNIFIED IDEOGRAPH + {0xB9DC, 0x596A}, //3829 #CJK UNIFIED IDEOGRAPH + {0xB9DD, 0x5969}, //3830 #CJK UNIFIED IDEOGRAPH + {0xB9DE, 0x5AE1}, //3831 #CJK UNIFIED IDEOGRAPH + {0xB9DF, 0x5AE6}, //3832 #CJK UNIFIED IDEOGRAPH + {0xB9E0, 0x5AE9}, //3833 #CJK UNIFIED IDEOGRAPH + {0xB9E1, 0x5AD7}, //3834 #CJK UNIFIED IDEOGRAPH + {0xB9E2, 0x5AD6}, //3835 #CJK UNIFIED IDEOGRAPH + {0xB9E3, 0x5AD8}, //3836 #CJK UNIFIED IDEOGRAPH + {0xB9E4, 0x5AE3}, //3837 #CJK UNIFIED IDEOGRAPH + {0xB9E5, 0x5B75}, //3838 #CJK UNIFIED IDEOGRAPH + {0xB9E6, 0x5BDE}, //3839 #CJK UNIFIED IDEOGRAPH + {0xB9E7, 0x5BE7}, //3840 #CJK UNIFIED IDEOGRAPH + {0xB9E8, 0x5BE1}, //3841 #CJK UNIFIED IDEOGRAPH + {0xB9E9, 0x5BE5}, //3842 #CJK UNIFIED IDEOGRAPH + {0xB9EA, 0x5BE6}, //3843 #CJK UNIFIED IDEOGRAPH + {0xB9EB, 0x5BE8}, //3844 #CJK UNIFIED IDEOGRAPH + {0xB9EC, 0x5BE2}, //3845 #CJK UNIFIED IDEOGRAPH + {0xB9ED, 0x5BE4}, //3846 #CJK UNIFIED IDEOGRAPH + {0xB9EE, 0x5BDF}, //3847 #CJK UNIFIED IDEOGRAPH + {0xB9EF, 0x5C0D}, //3848 #CJK UNIFIED IDEOGRAPH + {0xB9F0, 0x5C62}, //3849 #CJK UNIFIED IDEOGRAPH + {0xB9F1, 0x5D84}, //3850 #CJK UNIFIED IDEOGRAPH + {0xB9F2, 0x5D87}, //3851 #CJK UNIFIED IDEOGRAPH + {0xB9F3, 0x5E5B}, //3852 #CJK UNIFIED IDEOGRAPH + {0xB9F4, 0x5E63}, //3853 #CJK UNIFIED IDEOGRAPH + {0xB9F5, 0x5E55}, //3854 #CJK UNIFIED IDEOGRAPH + {0xB9F6, 0x5E57}, //3855 #CJK UNIFIED IDEOGRAPH + {0xB9F7, 0x5E54}, //3856 #CJK UNIFIED IDEOGRAPH + {0xB9F8, 0x5ED3}, //3857 #CJK UNIFIED IDEOGRAPH + {0xB9F9, 0x5ED6}, //3858 #CJK UNIFIED IDEOGRAPH + {0xB9FA, 0x5F0A}, //3859 #CJK UNIFIED IDEOGRAPH + {0xB9FB, 0x5F46}, //3860 #CJK UNIFIED IDEOGRAPH + {0xB9FC, 0x5F70}, //3861 #CJK UNIFIED IDEOGRAPH + {0xB9FD, 0x5FB9}, //3862 #CJK UNIFIED IDEOGRAPH + {0xB9FE, 0x6147}, //3863 #CJK UNIFIED IDEOGRAPH + {0xBA40, 0x613F}, //3864 #CJK UNIFIED IDEOGRAPH + {0xBA41, 0x614B}, //3865 #CJK UNIFIED IDEOGRAPH + {0xBA42, 0x6177}, //3866 #CJK UNIFIED IDEOGRAPH + {0xBA43, 0x6162}, //3867 #CJK UNIFIED IDEOGRAPH + {0xBA44, 0x6163}, //3868 #CJK UNIFIED IDEOGRAPH + {0xBA45, 0x615F}, //3869 #CJK UNIFIED IDEOGRAPH + {0xBA46, 0x615A}, //3870 #CJK UNIFIED IDEOGRAPH + {0xBA47, 0x6158}, //3871 #CJK UNIFIED IDEOGRAPH + {0xBA48, 0x6175}, //3872 #CJK UNIFIED IDEOGRAPH + {0xBA49, 0x622A}, //3873 #CJK UNIFIED IDEOGRAPH + {0xBA4A, 0x6487}, //3874 #CJK UNIFIED IDEOGRAPH + {0xBA4B, 0x6458}, //3875 #CJK UNIFIED IDEOGRAPH + {0xBA4C, 0x6454}, //3876 #CJK UNIFIED IDEOGRAPH + {0xBA4D, 0x64A4}, //3877 #CJK UNIFIED IDEOGRAPH + {0xBA4E, 0x6478}, //3878 #CJK UNIFIED IDEOGRAPH + {0xBA4F, 0x645F}, //3879 #CJK UNIFIED IDEOGRAPH + {0xBA50, 0x647A}, //3880 #CJK UNIFIED IDEOGRAPH + {0xBA51, 0x6451}, //3881 #CJK UNIFIED IDEOGRAPH + {0xBA52, 0x6467}, //3882 #CJK UNIFIED IDEOGRAPH + {0xBA53, 0x6434}, //3883 #CJK UNIFIED IDEOGRAPH + {0xBA54, 0x646D}, //3884 #CJK UNIFIED IDEOGRAPH + {0xBA55, 0x647B}, //3885 #CJK UNIFIED IDEOGRAPH + {0xBA56, 0x6572}, //3886 #CJK UNIFIED IDEOGRAPH + {0xBA57, 0x65A1}, //3887 #CJK UNIFIED IDEOGRAPH + {0xBA58, 0x65D7}, //3888 #CJK UNIFIED IDEOGRAPH + {0xBA59, 0x65D6}, //3889 #CJK UNIFIED IDEOGRAPH + {0xBA5A, 0x66A2}, //3890 #CJK UNIFIED IDEOGRAPH + {0xBA5B, 0x66A8}, //3891 #CJK UNIFIED IDEOGRAPH + {0xBA5C, 0x669D}, //3892 #CJK UNIFIED IDEOGRAPH + {0xBA5D, 0x699C}, //3893 #CJK UNIFIED IDEOGRAPH + {0xBA5E, 0x69A8}, //3894 #CJK UNIFIED IDEOGRAPH + {0xBA5F, 0x6995}, //3895 #CJK UNIFIED IDEOGRAPH + {0xBA60, 0x69C1}, //3896 #CJK UNIFIED IDEOGRAPH + {0xBA61, 0x69AE}, //3897 #CJK UNIFIED IDEOGRAPH + {0xBA62, 0x69D3}, //3898 #CJK UNIFIED IDEOGRAPH + {0xBA63, 0x69CB}, //3899 #CJK UNIFIED IDEOGRAPH + {0xBA64, 0x699B}, //3900 #CJK UNIFIED IDEOGRAPH + {0xBA65, 0x69B7}, //3901 #CJK UNIFIED IDEOGRAPH + {0xBA66, 0x69BB}, //3902 #CJK UNIFIED IDEOGRAPH + {0xBA67, 0x69AB}, //3903 #CJK UNIFIED IDEOGRAPH + {0xBA68, 0x69B4}, //3904 #CJK UNIFIED IDEOGRAPH + {0xBA69, 0x69D0}, //3905 #CJK UNIFIED IDEOGRAPH + {0xBA6A, 0x69CD}, //3906 #CJK UNIFIED IDEOGRAPH + {0xBA6B, 0x69AD}, //3907 #CJK UNIFIED IDEOGRAPH + {0xBA6C, 0x69CC}, //3908 #CJK UNIFIED IDEOGRAPH + {0xBA6D, 0x69A6}, //3909 #CJK UNIFIED IDEOGRAPH + {0xBA6E, 0x69C3}, //3910 #CJK UNIFIED IDEOGRAPH + {0xBA6F, 0x69A3}, //3911 #CJK UNIFIED IDEOGRAPH + {0xBA70, 0x6B49}, //3912 #CJK UNIFIED IDEOGRAPH + {0xBA71, 0x6B4C}, //3913 #CJK UNIFIED IDEOGRAPH + {0xBA72, 0x6C33}, //3914 #CJK UNIFIED IDEOGRAPH + {0xBA73, 0x6F33}, //3915 #CJK UNIFIED IDEOGRAPH + {0xBA74, 0x6F14}, //3916 #CJK UNIFIED IDEOGRAPH + {0xBA75, 0x6EFE}, //3917 #CJK UNIFIED IDEOGRAPH + {0xBA76, 0x6F13}, //3918 #CJK UNIFIED IDEOGRAPH + {0xBA77, 0x6EF4}, //3919 #CJK UNIFIED IDEOGRAPH + {0xBA78, 0x6F29}, //3920 #CJK UNIFIED IDEOGRAPH + {0xBA79, 0x6F3E}, //3921 #CJK UNIFIED IDEOGRAPH + {0xBA7A, 0x6F20}, //3922 #CJK UNIFIED IDEOGRAPH + {0xBA7B, 0x6F2C}, //3923 #CJK UNIFIED IDEOGRAPH + {0xBA7C, 0x6F0F}, //3924 #CJK UNIFIED IDEOGRAPH + {0xBA7D, 0x6F02}, //3925 #CJK UNIFIED IDEOGRAPH + {0xBA7E, 0x6F22}, //3926 #CJK UNIFIED IDEOGRAPH + {0xBAA1, 0x6EFF}, //3927 #CJK UNIFIED IDEOGRAPH + {0xBAA2, 0x6EEF}, //3928 #CJK UNIFIED IDEOGRAPH + {0xBAA3, 0x6F06}, //3929 #CJK UNIFIED IDEOGRAPH + {0xBAA4, 0x6F31}, //3930 #CJK UNIFIED IDEOGRAPH + {0xBAA5, 0x6F38}, //3931 #CJK UNIFIED IDEOGRAPH + {0xBAA6, 0x6F32}, //3932 #CJK UNIFIED IDEOGRAPH + {0xBAA7, 0x6F23}, //3933 #CJK UNIFIED IDEOGRAPH + {0xBAA8, 0x6F15}, //3934 #CJK UNIFIED IDEOGRAPH + {0xBAA9, 0x6F2B}, //3935 #CJK UNIFIED IDEOGRAPH + {0xBAAA, 0x6F2F}, //3936 #CJK UNIFIED IDEOGRAPH + {0xBAAB, 0x6F88}, //3937 #CJK UNIFIED IDEOGRAPH + {0xBAAC, 0x6F2A}, //3938 #CJK UNIFIED IDEOGRAPH + {0xBAAD, 0x6EEC}, //3939 #CJK UNIFIED IDEOGRAPH + {0xBAAE, 0x6F01}, //3940 #CJK UNIFIED IDEOGRAPH + {0xBAAF, 0x6EF2}, //3941 #CJK UNIFIED IDEOGRAPH + {0xBAB0, 0x6ECC}, //3942 #CJK UNIFIED IDEOGRAPH + {0xBAB1, 0x6EF7}, //3943 #CJK UNIFIED IDEOGRAPH + {0xBAB2, 0x7194}, //3944 #CJK UNIFIED IDEOGRAPH + {0xBAB3, 0x7199}, //3945 #CJK UNIFIED IDEOGRAPH + {0xBAB4, 0x717D}, //3946 #CJK UNIFIED IDEOGRAPH + {0xBAB5, 0x718A}, //3947 #CJK UNIFIED IDEOGRAPH + {0xBAB6, 0x7184}, //3948 #CJK UNIFIED IDEOGRAPH + {0xBAB7, 0x7192}, //3949 #CJK UNIFIED IDEOGRAPH + {0xBAB8, 0x723E}, //3950 #CJK UNIFIED IDEOGRAPH + {0xBAB9, 0x7292}, //3951 #CJK UNIFIED IDEOGRAPH + {0xBABA, 0x7296}, //3952 #CJK UNIFIED IDEOGRAPH + {0xBABB, 0x7344}, //3953 #CJK UNIFIED IDEOGRAPH + {0xBABC, 0x7350}, //3954 #CJK UNIFIED IDEOGRAPH + {0xBABD, 0x7464}, //3955 #CJK UNIFIED IDEOGRAPH + {0xBABE, 0x7463}, //3956 #CJK UNIFIED IDEOGRAPH + {0xBABF, 0x746A}, //3957 #CJK UNIFIED IDEOGRAPH + {0xBAC0, 0x7470}, //3958 #CJK UNIFIED IDEOGRAPH + {0xBAC1, 0x746D}, //3959 #CJK UNIFIED IDEOGRAPH + {0xBAC2, 0x7504}, //3960 #CJK UNIFIED IDEOGRAPH + {0xBAC3, 0x7591}, //3961 #CJK UNIFIED IDEOGRAPH + {0xBAC4, 0x7627}, //3962 #CJK UNIFIED IDEOGRAPH + {0xBAC5, 0x760D}, //3963 #CJK UNIFIED IDEOGRAPH + {0xBAC6, 0x760B}, //3964 #CJK UNIFIED IDEOGRAPH + {0xBAC7, 0x7609}, //3965 #CJK UNIFIED IDEOGRAPH + {0xBAC8, 0x7613}, //3966 #CJK UNIFIED IDEOGRAPH + {0xBAC9, 0x76E1}, //3967 #CJK UNIFIED IDEOGRAPH + {0xBACA, 0x76E3}, //3968 #CJK UNIFIED IDEOGRAPH + {0xBACB, 0x7784}, //3969 #CJK UNIFIED IDEOGRAPH + {0xBACC, 0x777D}, //3970 #CJK UNIFIED IDEOGRAPH + {0xBACD, 0x777F}, //3971 #CJK UNIFIED IDEOGRAPH + {0xBACE, 0x7761}, //3972 #CJK UNIFIED IDEOGRAPH + {0xBACF, 0x78C1}, //3973 #CJK UNIFIED IDEOGRAPH + {0xBAD0, 0x789F}, //3974 #CJK UNIFIED IDEOGRAPH + {0xBAD1, 0x78A7}, //3975 #CJK UNIFIED IDEOGRAPH + {0xBAD2, 0x78B3}, //3976 #CJK UNIFIED IDEOGRAPH + {0xBAD3, 0x78A9}, //3977 #CJK UNIFIED IDEOGRAPH + {0xBAD4, 0x78A3}, //3978 #CJK UNIFIED IDEOGRAPH + {0xBAD5, 0x798E}, //3979 #CJK UNIFIED IDEOGRAPH + {0xBAD6, 0x798F}, //3980 #CJK UNIFIED IDEOGRAPH + {0xBAD7, 0x798D}, //3981 #CJK UNIFIED IDEOGRAPH + {0xBAD8, 0x7A2E}, //3982 #CJK UNIFIED IDEOGRAPH + {0xBAD9, 0x7A31}, //3983 #CJK UNIFIED IDEOGRAPH + {0xBADA, 0x7AAA}, //3984 #CJK UNIFIED IDEOGRAPH + {0xBADB, 0x7AA9}, //3985 #CJK UNIFIED IDEOGRAPH + {0xBADC, 0x7AED}, //3986 #CJK UNIFIED IDEOGRAPH + {0xBADD, 0x7AEF}, //3987 #CJK UNIFIED IDEOGRAPH + {0xBADE, 0x7BA1}, //3988 #CJK UNIFIED IDEOGRAPH + {0xBADF, 0x7B95}, //3989 #CJK UNIFIED IDEOGRAPH + {0xBAE0, 0x7B8B}, //3990 #CJK UNIFIED IDEOGRAPH + {0xBAE1, 0x7B75}, //3991 #CJK UNIFIED IDEOGRAPH + {0xBAE2, 0x7B97}, //3992 #CJK UNIFIED IDEOGRAPH + {0xBAE3, 0x7B9D}, //3993 #CJK UNIFIED IDEOGRAPH + {0xBAE4, 0x7B94}, //3994 #CJK UNIFIED IDEOGRAPH + {0xBAE5, 0x7B8F}, //3995 #CJK UNIFIED IDEOGRAPH + {0xBAE6, 0x7BB8}, //3996 #CJK UNIFIED IDEOGRAPH + {0xBAE7, 0x7B87}, //3997 #CJK UNIFIED IDEOGRAPH + {0xBAE8, 0x7B84}, //3998 #CJK UNIFIED IDEOGRAPH + {0xBAE9, 0x7CB9}, //3999 #CJK UNIFIED IDEOGRAPH + {0xBAEA, 0x7CBD}, //4000 #CJK UNIFIED IDEOGRAPH + {0xBAEB, 0x7CBE}, //4001 #CJK UNIFIED IDEOGRAPH + {0xBAEC, 0x7DBB}, //4002 #CJK UNIFIED IDEOGRAPH + {0xBAED, 0x7DB0}, //4003 #CJK UNIFIED IDEOGRAPH + {0xBAEE, 0x7D9C}, //4004 #CJK UNIFIED IDEOGRAPH + {0xBAEF, 0x7DBD}, //4005 #CJK UNIFIED IDEOGRAPH + {0xBAF0, 0x7DBE}, //4006 #CJK UNIFIED IDEOGRAPH + {0xBAF1, 0x7DA0}, //4007 #CJK UNIFIED IDEOGRAPH + {0xBAF2, 0x7DCA}, //4008 #CJK UNIFIED IDEOGRAPH + {0xBAF3, 0x7DB4}, //4009 #CJK UNIFIED IDEOGRAPH + {0xBAF4, 0x7DB2}, //4010 #CJK UNIFIED IDEOGRAPH + {0xBAF5, 0x7DB1}, //4011 #CJK UNIFIED IDEOGRAPH + {0xBAF6, 0x7DBA}, //4012 #CJK UNIFIED IDEOGRAPH + {0xBAF7, 0x7DA2}, //4013 #CJK UNIFIED IDEOGRAPH + {0xBAF8, 0x7DBF}, //4014 #CJK UNIFIED IDEOGRAPH + {0xBAF9, 0x7DB5}, //4015 #CJK UNIFIED IDEOGRAPH + {0xBAFA, 0x7DB8}, //4016 #CJK UNIFIED IDEOGRAPH + {0xBAFB, 0x7DAD}, //4017 #CJK UNIFIED IDEOGRAPH + {0xBAFC, 0x7DD2}, //4018 #CJK UNIFIED IDEOGRAPH + {0xBAFD, 0x7DC7}, //4019 #CJK UNIFIED IDEOGRAPH + {0xBAFE, 0x7DAC}, //4020 #CJK UNIFIED IDEOGRAPH + {0xBB40, 0x7F70}, //4021 #CJK UNIFIED IDEOGRAPH + {0xBB41, 0x7FE0}, //4022 #CJK UNIFIED IDEOGRAPH + {0xBB42, 0x7FE1}, //4023 #CJK UNIFIED IDEOGRAPH + {0xBB43, 0x7FDF}, //4024 #CJK UNIFIED IDEOGRAPH + {0xBB44, 0x805E}, //4025 #CJK UNIFIED IDEOGRAPH + {0xBB45, 0x805A}, //4026 #CJK UNIFIED IDEOGRAPH + {0xBB46, 0x8087}, //4027 #CJK UNIFIED IDEOGRAPH + {0xBB47, 0x8150}, //4028 #CJK UNIFIED IDEOGRAPH + {0xBB48, 0x8180}, //4029 #CJK UNIFIED IDEOGRAPH + {0xBB49, 0x818F}, //4030 #CJK UNIFIED IDEOGRAPH + {0xBB4A, 0x8188}, //4031 #CJK UNIFIED IDEOGRAPH + {0xBB4B, 0x818A}, //4032 #CJK UNIFIED IDEOGRAPH + {0xBB4C, 0x817F}, //4033 #CJK UNIFIED IDEOGRAPH + {0xBB4D, 0x8182}, //4034 #CJK UNIFIED IDEOGRAPH + {0xBB4E, 0x81E7}, //4035 #CJK UNIFIED IDEOGRAPH + {0xBB4F, 0x81FA}, //4036 #CJK UNIFIED IDEOGRAPH + {0xBB50, 0x8207}, //4037 #CJK UNIFIED IDEOGRAPH + {0xBB51, 0x8214}, //4038 #CJK UNIFIED IDEOGRAPH + {0xBB52, 0x821E}, //4039 #CJK UNIFIED IDEOGRAPH + {0xBB53, 0x824B}, //4040 #CJK UNIFIED IDEOGRAPH + {0xBB54, 0x84C9}, //4041 #CJK UNIFIED IDEOGRAPH + {0xBB55, 0x84BF}, //4042 #CJK UNIFIED IDEOGRAPH + {0xBB56, 0x84C6}, //4043 #CJK UNIFIED IDEOGRAPH + {0xBB57, 0x84C4}, //4044 #CJK UNIFIED IDEOGRAPH + {0xBB58, 0x8499}, //4045 #CJK UNIFIED IDEOGRAPH + {0xBB59, 0x849E}, //4046 #CJK UNIFIED IDEOGRAPH + {0xBB5A, 0x84B2}, //4047 #CJK UNIFIED IDEOGRAPH + {0xBB5B, 0x849C}, //4048 #CJK UNIFIED IDEOGRAPH + {0xBB5C, 0x84CB}, //4049 #CJK UNIFIED IDEOGRAPH + {0xBB5D, 0x84B8}, //4050 #CJK UNIFIED IDEOGRAPH + {0xBB5E, 0x84C0}, //4051 #CJK UNIFIED IDEOGRAPH + {0xBB5F, 0x84D3}, //4052 #CJK UNIFIED IDEOGRAPH + {0xBB60, 0x8490}, //4053 #CJK UNIFIED IDEOGRAPH + {0xBB61, 0x84BC}, //4054 #CJK UNIFIED IDEOGRAPH + {0xBB62, 0x84D1}, //4055 #CJK UNIFIED IDEOGRAPH + {0xBB63, 0x84CA}, //4056 #CJK UNIFIED IDEOGRAPH + {0xBB64, 0x873F}, //4057 #CJK UNIFIED IDEOGRAPH + {0xBB65, 0x871C}, //4058 #CJK UNIFIED IDEOGRAPH + {0xBB66, 0x873B}, //4059 #CJK UNIFIED IDEOGRAPH + {0xBB67, 0x8722}, //4060 #CJK UNIFIED IDEOGRAPH + {0xBB68, 0x8725}, //4061 #CJK UNIFIED IDEOGRAPH + {0xBB69, 0x8734}, //4062 #CJK UNIFIED IDEOGRAPH + {0xBB6A, 0x8718}, //4063 #CJK UNIFIED IDEOGRAPH + {0xBB6B, 0x8755}, //4064 #CJK UNIFIED IDEOGRAPH + {0xBB6C, 0x8737}, //4065 #CJK UNIFIED IDEOGRAPH + {0xBB6D, 0x8729}, //4066 #CJK UNIFIED IDEOGRAPH + {0xBB6E, 0x88F3}, //4067 #CJK UNIFIED IDEOGRAPH + {0xBB6F, 0x8902}, //4068 #CJK UNIFIED IDEOGRAPH + {0xBB70, 0x88F4}, //4069 #CJK UNIFIED IDEOGRAPH + {0xBB71, 0x88F9}, //4070 #CJK UNIFIED IDEOGRAPH + {0xBB72, 0x88F8}, //4071 #CJK UNIFIED IDEOGRAPH + {0xBB73, 0x88FD}, //4072 #CJK UNIFIED IDEOGRAPH + {0xBB74, 0x88E8}, //4073 #CJK UNIFIED IDEOGRAPH + {0xBB75, 0x891A}, //4074 #CJK UNIFIED IDEOGRAPH + {0xBB76, 0x88EF}, //4075 #CJK UNIFIED IDEOGRAPH + {0xBB77, 0x8AA6}, //4076 #CJK UNIFIED IDEOGRAPH + {0xBB78, 0x8A8C}, //4077 #CJK UNIFIED IDEOGRAPH + {0xBB79, 0x8A9E}, //4078 #CJK UNIFIED IDEOGRAPH + {0xBB7A, 0x8AA3}, //4079 #CJK UNIFIED IDEOGRAPH + {0xBB7B, 0x8A8D}, //4080 #CJK UNIFIED IDEOGRAPH + {0xBB7C, 0x8AA1}, //4081 #CJK UNIFIED IDEOGRAPH + {0xBB7D, 0x8A93}, //4082 #CJK UNIFIED IDEOGRAPH + {0xBB7E, 0x8AA4}, //4083 #CJK UNIFIED IDEOGRAPH + {0xBBA1, 0x8AAA}, //4084 #CJK UNIFIED IDEOGRAPH + {0xBBA2, 0x8AA5}, //4085 #CJK UNIFIED IDEOGRAPH + {0xBBA3, 0x8AA8}, //4086 #CJK UNIFIED IDEOGRAPH + {0xBBA4, 0x8A98}, //4087 #CJK UNIFIED IDEOGRAPH + {0xBBA5, 0x8A91}, //4088 #CJK UNIFIED IDEOGRAPH + {0xBBA6, 0x8A9A}, //4089 #CJK UNIFIED IDEOGRAPH + {0xBBA7, 0x8AA7}, //4090 #CJK UNIFIED IDEOGRAPH + {0xBBA8, 0x8C6A}, //4091 #CJK UNIFIED IDEOGRAPH + {0xBBA9, 0x8C8D}, //4092 #CJK UNIFIED IDEOGRAPH + {0xBBAA, 0x8C8C}, //4093 #CJK UNIFIED IDEOGRAPH + {0xBBAB, 0x8CD3}, //4094 #CJK UNIFIED IDEOGRAPH + {0xBBAC, 0x8CD1}, //4095 #CJK UNIFIED IDEOGRAPH + {0xBBAD, 0x8CD2}, //4096 #CJK UNIFIED IDEOGRAPH + {0xBBAE, 0x8D6B}, //4097 #CJK UNIFIED IDEOGRAPH + {0xBBAF, 0x8D99}, //4098 #CJK UNIFIED IDEOGRAPH + {0xBBB0, 0x8D95}, //4099 #CJK UNIFIED IDEOGRAPH + {0xBBB1, 0x8DFC}, //4100 #CJK UNIFIED IDEOGRAPH + {0xBBB2, 0x8F14}, //4101 #CJK UNIFIED IDEOGRAPH + {0xBBB3, 0x8F12}, //4102 #CJK UNIFIED IDEOGRAPH + {0xBBB4, 0x8F15}, //4103 #CJK UNIFIED IDEOGRAPH + {0xBBB5, 0x8F13}, //4104 #CJK UNIFIED IDEOGRAPH + {0xBBB6, 0x8FA3}, //4105 #CJK UNIFIED IDEOGRAPH + {0xBBB7, 0x9060}, //4106 #CJK UNIFIED IDEOGRAPH + {0xBBB8, 0x9058}, //4107 #CJK UNIFIED IDEOGRAPH + {0xBBB9, 0x905C}, //4108 #CJK UNIFIED IDEOGRAPH + {0xBBBA, 0x9063}, //4109 #CJK UNIFIED IDEOGRAPH + {0xBBBB, 0x9059}, //4110 #CJK UNIFIED IDEOGRAPH + {0xBBBC, 0x905E}, //4111 #CJK UNIFIED IDEOGRAPH + {0xBBBD, 0x9062}, //4112 #CJK UNIFIED IDEOGRAPH + {0xBBBE, 0x905D}, //4113 #CJK UNIFIED IDEOGRAPH + {0xBBBF, 0x905B}, //4114 #CJK UNIFIED IDEOGRAPH + {0xBBC0, 0x9119}, //4115 #CJK UNIFIED IDEOGRAPH + {0xBBC1, 0x9118}, //4116 #CJK UNIFIED IDEOGRAPH + {0xBBC2, 0x911E}, //4117 #CJK UNIFIED IDEOGRAPH + {0xBBC3, 0x9175}, //4118 #CJK UNIFIED IDEOGRAPH + {0xBBC4, 0x9178}, //4119 #CJK UNIFIED IDEOGRAPH + {0xBBC5, 0x9177}, //4120 #CJK UNIFIED IDEOGRAPH + {0xBBC6, 0x9174}, //4121 #CJK UNIFIED IDEOGRAPH + {0xBBC7, 0x9278}, //4122 #CJK UNIFIED IDEOGRAPH + {0xBBC8, 0x9280}, //4123 #CJK UNIFIED IDEOGRAPH + {0xBBC9, 0x9285}, //4124 #CJK UNIFIED IDEOGRAPH + {0xBBCA, 0x9298}, //4125 #CJK UNIFIED IDEOGRAPH + {0xBBCB, 0x9296}, //4126 #CJK UNIFIED IDEOGRAPH + {0xBBCC, 0x927B}, //4127 #CJK UNIFIED IDEOGRAPH + {0xBBCD, 0x9293}, //4128 #CJK UNIFIED IDEOGRAPH + {0xBBCE, 0x929C}, //4129 #CJK UNIFIED IDEOGRAPH + {0xBBCF, 0x92A8}, //4130 #CJK UNIFIED IDEOGRAPH + {0xBBD0, 0x927C}, //4131 #CJK UNIFIED IDEOGRAPH + {0xBBD1, 0x9291}, //4132 #CJK UNIFIED IDEOGRAPH + {0xBBD2, 0x95A1}, //4133 #CJK UNIFIED IDEOGRAPH + {0xBBD3, 0x95A8}, //4134 #CJK UNIFIED IDEOGRAPH + {0xBBD4, 0x95A9}, //4135 #CJK UNIFIED IDEOGRAPH + {0xBBD5, 0x95A3}, //4136 #CJK UNIFIED IDEOGRAPH + {0xBBD6, 0x95A5}, //4137 #CJK UNIFIED IDEOGRAPH + {0xBBD7, 0x95A4}, //4138 #CJK UNIFIED IDEOGRAPH + {0xBBD8, 0x9699}, //4139 #CJK UNIFIED IDEOGRAPH + {0xBBD9, 0x969C}, //4140 #CJK UNIFIED IDEOGRAPH + {0xBBDA, 0x969B}, //4141 #CJK UNIFIED IDEOGRAPH + {0xBBDB, 0x96CC}, //4142 #CJK UNIFIED IDEOGRAPH + {0xBBDC, 0x96D2}, //4143 #CJK UNIFIED IDEOGRAPH + {0xBBDD, 0x9700}, //4144 #CJK UNIFIED IDEOGRAPH + {0xBBDE, 0x977C}, //4145 #CJK UNIFIED IDEOGRAPH + {0xBBDF, 0x9785}, //4146 #CJK UNIFIED IDEOGRAPH + {0xBBE0, 0x97F6}, //4147 #CJK UNIFIED IDEOGRAPH + {0xBBE1, 0x9817}, //4148 #CJK UNIFIED IDEOGRAPH + {0xBBE2, 0x9818}, //4149 #CJK UNIFIED IDEOGRAPH + {0xBBE3, 0x98AF}, //4150 #CJK UNIFIED IDEOGRAPH + {0xBBE4, 0x98B1}, //4151 #CJK UNIFIED IDEOGRAPH + {0xBBE5, 0x9903}, //4152 #CJK UNIFIED IDEOGRAPH + {0xBBE6, 0x9905}, //4153 #CJK UNIFIED IDEOGRAPH + {0xBBE7, 0x990C}, //4154 #CJK UNIFIED IDEOGRAPH + {0xBBE8, 0x9909}, //4155 #CJK UNIFIED IDEOGRAPH + {0xBBE9, 0x99C1}, //4156 #CJK UNIFIED IDEOGRAPH + {0xBBEA, 0x9AAF}, //4157 #CJK UNIFIED IDEOGRAPH + {0xBBEB, 0x9AB0}, //4158 #CJK UNIFIED IDEOGRAPH + {0xBBEC, 0x9AE6}, //4159 #CJK UNIFIED IDEOGRAPH + {0xBBED, 0x9B41}, //4160 #CJK UNIFIED IDEOGRAPH + {0xBBEE, 0x9B42}, //4161 #CJK UNIFIED IDEOGRAPH + {0xBBEF, 0x9CF4}, //4162 #CJK UNIFIED IDEOGRAPH + {0xBBF0, 0x9CF6}, //4163 #CJK UNIFIED IDEOGRAPH + {0xBBF1, 0x9CF3}, //4164 #CJK UNIFIED IDEOGRAPH + {0xBBF2, 0x9EBC}, //4165 #CJK UNIFIED IDEOGRAPH + {0xBBF3, 0x9F3B}, //4166 #CJK UNIFIED IDEOGRAPH + {0xBBF4, 0x9F4A}, //4167 #CJK UNIFIED IDEOGRAPH + {0xBBF5, 0x5104}, //4168 #CJK UNIFIED IDEOGRAPH + {0xBBF6, 0x5100}, //4169 #CJK UNIFIED IDEOGRAPH + {0xBBF7, 0x50FB}, //4170 #CJK UNIFIED IDEOGRAPH + {0xBBF8, 0x50F5}, //4171 #CJK UNIFIED IDEOGRAPH + {0xBBF9, 0x50F9}, //4172 #CJK UNIFIED IDEOGRAPH + {0xBBFA, 0x5102}, //4173 #CJK UNIFIED IDEOGRAPH + {0xBBFB, 0x5108}, //4174 #CJK UNIFIED IDEOGRAPH + {0xBBFC, 0x5109}, //4175 #CJK UNIFIED IDEOGRAPH + {0xBBFD, 0x5105}, //4176 #CJK UNIFIED IDEOGRAPH + {0xBBFE, 0x51DC}, //4177 #CJK UNIFIED IDEOGRAPH + {0xBC40, 0x5287}, //4178 #CJK UNIFIED IDEOGRAPH + {0xBC41, 0x5288}, //4179 #CJK UNIFIED IDEOGRAPH + {0xBC42, 0x5289}, //4180 #CJK UNIFIED IDEOGRAPH + {0xBC43, 0x528D}, //4181 #CJK UNIFIED IDEOGRAPH + {0xBC44, 0x528A}, //4182 #CJK UNIFIED IDEOGRAPH + {0xBC45, 0x52F0}, //4183 #CJK UNIFIED IDEOGRAPH + {0xBC46, 0x53B2}, //4184 #CJK UNIFIED IDEOGRAPH + {0xBC47, 0x562E}, //4185 #CJK UNIFIED IDEOGRAPH + {0xBC48, 0x563B}, //4186 #CJK UNIFIED IDEOGRAPH + {0xBC49, 0x5639}, //4187 #CJK UNIFIED IDEOGRAPH + {0xBC4A, 0x5632}, //4188 #CJK UNIFIED IDEOGRAPH + {0xBC4B, 0x563F}, //4189 #CJK UNIFIED IDEOGRAPH + {0xBC4C, 0x5634}, //4190 #CJK UNIFIED IDEOGRAPH + {0xBC4D, 0x5629}, //4191 #CJK UNIFIED IDEOGRAPH + {0xBC4E, 0x5653}, //4192 #CJK UNIFIED IDEOGRAPH + {0xBC4F, 0x564E}, //4193 #CJK UNIFIED IDEOGRAPH + {0xBC50, 0x5657}, //4194 #CJK UNIFIED IDEOGRAPH + {0xBC51, 0x5674}, //4195 #CJK UNIFIED IDEOGRAPH + {0xBC52, 0x5636}, //4196 #CJK UNIFIED IDEOGRAPH + {0xBC53, 0x562F}, //4197 #CJK UNIFIED IDEOGRAPH + {0xBC54, 0x5630}, //4198 #CJK UNIFIED IDEOGRAPH + {0xBC55, 0x5880}, //4199 #CJK UNIFIED IDEOGRAPH + {0xBC56, 0x589F}, //4200 #CJK UNIFIED IDEOGRAPH + {0xBC57, 0x589E}, //4201 #CJK UNIFIED IDEOGRAPH + {0xBC58, 0x58B3}, //4202 #CJK UNIFIED IDEOGRAPH + {0xBC59, 0x589C}, //4203 #CJK UNIFIED IDEOGRAPH + {0xBC5A, 0x58AE}, //4204 #CJK UNIFIED IDEOGRAPH + {0xBC5B, 0x58A9}, //4205 #CJK UNIFIED IDEOGRAPH + {0xBC5C, 0x58A6}, //4206 #CJK UNIFIED IDEOGRAPH + {0xBC5D, 0x596D}, //4207 #CJK UNIFIED IDEOGRAPH + {0xBC5E, 0x5B09}, //4208 #CJK UNIFIED IDEOGRAPH + {0xBC5F, 0x5AFB}, //4209 #CJK UNIFIED IDEOGRAPH + {0xBC60, 0x5B0B}, //4210 #CJK UNIFIED IDEOGRAPH + {0xBC61, 0x5AF5}, //4211 #CJK UNIFIED IDEOGRAPH + {0xBC62, 0x5B0C}, //4212 #CJK UNIFIED IDEOGRAPH + {0xBC63, 0x5B08}, //4213 #CJK UNIFIED IDEOGRAPH + {0xBC64, 0x5BEE}, //4214 #CJK UNIFIED IDEOGRAPH + {0xBC65, 0x5BEC}, //4215 #CJK UNIFIED IDEOGRAPH + {0xBC66, 0x5BE9}, //4216 #CJK UNIFIED IDEOGRAPH + {0xBC67, 0x5BEB}, //4217 #CJK UNIFIED IDEOGRAPH + {0xBC68, 0x5C64}, //4218 #CJK UNIFIED IDEOGRAPH + {0xBC69, 0x5C65}, //4219 #CJK UNIFIED IDEOGRAPH + {0xBC6A, 0x5D9D}, //4220 #CJK UNIFIED IDEOGRAPH + {0xBC6B, 0x5D94}, //4221 #CJK UNIFIED IDEOGRAPH + {0xBC6C, 0x5E62}, //4222 #CJK UNIFIED IDEOGRAPH + {0xBC6D, 0x5E5F}, //4223 #CJK UNIFIED IDEOGRAPH + {0xBC6E, 0x5E61}, //4224 #CJK UNIFIED IDEOGRAPH + {0xBC6F, 0x5EE2}, //4225 #CJK UNIFIED IDEOGRAPH + {0xBC70, 0x5EDA}, //4226 #CJK UNIFIED IDEOGRAPH + {0xBC71, 0x5EDF}, //4227 #CJK UNIFIED IDEOGRAPH + {0xBC72, 0x5EDD}, //4228 #CJK UNIFIED IDEOGRAPH + {0xBC73, 0x5EE3}, //4229 #CJK UNIFIED IDEOGRAPH + {0xBC74, 0x5EE0}, //4230 #CJK UNIFIED IDEOGRAPH + {0xBC75, 0x5F48}, //4231 #CJK UNIFIED IDEOGRAPH + {0xBC76, 0x5F71}, //4232 #CJK UNIFIED IDEOGRAPH + {0xBC77, 0x5FB7}, //4233 #CJK UNIFIED IDEOGRAPH + {0xBC78, 0x5FB5}, //4234 #CJK UNIFIED IDEOGRAPH + {0xBC79, 0x6176}, //4235 #CJK UNIFIED IDEOGRAPH + {0xBC7A, 0x6167}, //4236 #CJK UNIFIED IDEOGRAPH + {0xBC7B, 0x616E}, //4237 #CJK UNIFIED IDEOGRAPH + {0xBC7C, 0x615D}, //4238 #CJK UNIFIED IDEOGRAPH + {0xBC7D, 0x6155}, //4239 #CJK UNIFIED IDEOGRAPH + {0xBC7E, 0x6182}, //4240 #CJK UNIFIED IDEOGRAPH + {0xBCA1, 0x617C}, //4241 #CJK UNIFIED IDEOGRAPH + {0xBCA2, 0x6170}, //4242 #CJK UNIFIED IDEOGRAPH + {0xBCA3, 0x616B}, //4243 #CJK UNIFIED IDEOGRAPH + {0xBCA4, 0x617E}, //4244 #CJK UNIFIED IDEOGRAPH + {0xBCA5, 0x61A7}, //4245 #CJK UNIFIED IDEOGRAPH + {0xBCA6, 0x6190}, //4246 #CJK UNIFIED IDEOGRAPH + {0xBCA7, 0x61AB}, //4247 #CJK UNIFIED IDEOGRAPH + {0xBCA8, 0x618E}, //4248 #CJK UNIFIED IDEOGRAPH + {0xBCA9, 0x61AC}, //4249 #CJK UNIFIED IDEOGRAPH + {0xBCAA, 0x619A}, //4250 #CJK UNIFIED IDEOGRAPH + {0xBCAB, 0x61A4}, //4251 #CJK UNIFIED IDEOGRAPH + {0xBCAC, 0x6194}, //4252 #CJK UNIFIED IDEOGRAPH + {0xBCAD, 0x61AE}, //4253 #CJK UNIFIED IDEOGRAPH + {0xBCAE, 0x622E}, //4254 #CJK UNIFIED IDEOGRAPH + {0xBCAF, 0x6469}, //4255 #CJK UNIFIED IDEOGRAPH + {0xBCB0, 0x646F}, //4256 #CJK UNIFIED IDEOGRAPH + {0xBCB1, 0x6479}, //4257 #CJK UNIFIED IDEOGRAPH + {0xBCB2, 0x649E}, //4258 #CJK UNIFIED IDEOGRAPH + {0xBCB3, 0x64B2}, //4259 #CJK UNIFIED IDEOGRAPH + {0xBCB4, 0x6488}, //4260 #CJK UNIFIED IDEOGRAPH + {0xBCB5, 0x6490}, //4261 #CJK UNIFIED IDEOGRAPH + {0xBCB6, 0x64B0}, //4262 #CJK UNIFIED IDEOGRAPH + {0xBCB7, 0x64A5}, //4263 #CJK UNIFIED IDEOGRAPH + {0xBCB8, 0x6493}, //4264 #CJK UNIFIED IDEOGRAPH + {0xBCB9, 0x6495}, //4265 #CJK UNIFIED IDEOGRAPH + {0xBCBA, 0x64A9}, //4266 #CJK UNIFIED IDEOGRAPH + {0xBCBB, 0x6492}, //4267 #CJK UNIFIED IDEOGRAPH + {0xBCBC, 0x64AE}, //4268 #CJK UNIFIED IDEOGRAPH + {0xBCBD, 0x64AD}, //4269 #CJK UNIFIED IDEOGRAPH + {0xBCBE, 0x64AB}, //4270 #CJK UNIFIED IDEOGRAPH + {0xBCBF, 0x649A}, //4271 #CJK UNIFIED IDEOGRAPH + {0xBCC0, 0x64AC}, //4272 #CJK UNIFIED IDEOGRAPH + {0xBCC1, 0x6499}, //4273 #CJK UNIFIED IDEOGRAPH + {0xBCC2, 0x64A2}, //4274 #CJK UNIFIED IDEOGRAPH + {0xBCC3, 0x64B3}, //4275 #CJK UNIFIED IDEOGRAPH + {0xBCC4, 0x6575}, //4276 #CJK UNIFIED IDEOGRAPH + {0xBCC5, 0x6577}, //4277 #CJK UNIFIED IDEOGRAPH + {0xBCC6, 0x6578}, //4278 #CJK UNIFIED IDEOGRAPH + {0xBCC7, 0x66AE}, //4279 #CJK UNIFIED IDEOGRAPH + {0xBCC8, 0x66AB}, //4280 #CJK UNIFIED IDEOGRAPH + {0xBCC9, 0x66B4}, //4281 #CJK UNIFIED IDEOGRAPH + {0xBCCA, 0x66B1}, //4282 #CJK UNIFIED IDEOGRAPH + {0xBCCB, 0x6A23}, //4283 #CJK UNIFIED IDEOGRAPH + {0xBCCC, 0x6A1F}, //4284 #CJK UNIFIED IDEOGRAPH + {0xBCCD, 0x69E8}, //4285 #CJK UNIFIED IDEOGRAPH + {0xBCCE, 0x6A01}, //4286 #CJK UNIFIED IDEOGRAPH + {0xBCCF, 0x6A1E}, //4287 #CJK UNIFIED IDEOGRAPH + {0xBCD0, 0x6A19}, //4288 #CJK UNIFIED IDEOGRAPH + {0xBCD1, 0x69FD}, //4289 #CJK UNIFIED IDEOGRAPH + {0xBCD2, 0x6A21}, //4290 #CJK UNIFIED IDEOGRAPH + {0xBCD3, 0x6A13}, //4291 #CJK UNIFIED IDEOGRAPH + {0xBCD4, 0x6A0A}, //4292 #CJK UNIFIED IDEOGRAPH + {0xBCD5, 0x69F3}, //4293 #CJK UNIFIED IDEOGRAPH + {0xBCD6, 0x6A02}, //4294 #CJK UNIFIED IDEOGRAPH + {0xBCD7, 0x6A05}, //4295 #CJK UNIFIED IDEOGRAPH + {0xBCD8, 0x69ED}, //4296 #CJK UNIFIED IDEOGRAPH + {0xBCD9, 0x6A11}, //4297 #CJK UNIFIED IDEOGRAPH + {0xBCDA, 0x6B50}, //4298 #CJK UNIFIED IDEOGRAPH + {0xBCDB, 0x6B4E}, //4299 #CJK UNIFIED IDEOGRAPH + {0xBCDC, 0x6BA4}, //4300 #CJK UNIFIED IDEOGRAPH + {0xBCDD, 0x6BC5}, //4301 #CJK UNIFIED IDEOGRAPH + {0xBCDE, 0x6BC6}, //4302 #CJK UNIFIED IDEOGRAPH + {0xBCDF, 0x6F3F}, //4303 #CJK UNIFIED IDEOGRAPH + {0xBCE0, 0x6F7C}, //4304 #CJK UNIFIED IDEOGRAPH + {0xBCE1, 0x6F84}, //4305 #CJK UNIFIED IDEOGRAPH + {0xBCE2, 0x6F51}, //4306 #CJK UNIFIED IDEOGRAPH + {0xBCE3, 0x6F66}, //4307 #CJK UNIFIED IDEOGRAPH + {0xBCE4, 0x6F54}, //4308 #CJK UNIFIED IDEOGRAPH + {0xBCE5, 0x6F86}, //4309 #CJK UNIFIED IDEOGRAPH + {0xBCE6, 0x6F6D}, //4310 #CJK UNIFIED IDEOGRAPH + {0xBCE7, 0x6F5B}, //4311 #CJK UNIFIED IDEOGRAPH + {0xBCE8, 0x6F78}, //4312 #CJK UNIFIED IDEOGRAPH + {0xBCE9, 0x6F6E}, //4313 #CJK UNIFIED IDEOGRAPH + {0xBCEA, 0x6F8E}, //4314 #CJK UNIFIED IDEOGRAPH + {0xBCEB, 0x6F7A}, //4315 #CJK UNIFIED IDEOGRAPH + {0xBCEC, 0x6F70}, //4316 #CJK UNIFIED IDEOGRAPH + {0xBCED, 0x6F64}, //4317 #CJK UNIFIED IDEOGRAPH + {0xBCEE, 0x6F97}, //4318 #CJK UNIFIED IDEOGRAPH + {0xBCEF, 0x6F58}, //4319 #CJK UNIFIED IDEOGRAPH + {0xBCF0, 0x6ED5}, //4320 #CJK UNIFIED IDEOGRAPH + {0xBCF1, 0x6F6F}, //4321 #CJK UNIFIED IDEOGRAPH + {0xBCF2, 0x6F60}, //4322 #CJK UNIFIED IDEOGRAPH + {0xBCF3, 0x6F5F}, //4323 #CJK UNIFIED IDEOGRAPH + {0xBCF4, 0x719F}, //4324 #CJK UNIFIED IDEOGRAPH + {0xBCF5, 0x71AC}, //4325 #CJK UNIFIED IDEOGRAPH + {0xBCF6, 0x71B1}, //4326 #CJK UNIFIED IDEOGRAPH + {0xBCF7, 0x71A8}, //4327 #CJK UNIFIED IDEOGRAPH + {0xBCF8, 0x7256}, //4328 #CJK UNIFIED IDEOGRAPH + {0xBCF9, 0x729B}, //4329 #CJK UNIFIED IDEOGRAPH + {0xBCFA, 0x734E}, //4330 #CJK UNIFIED IDEOGRAPH + {0xBCFB, 0x7357}, //4331 #CJK UNIFIED IDEOGRAPH + {0xBCFC, 0x7469}, //4332 #CJK UNIFIED IDEOGRAPH + {0xBCFD, 0x748B}, //4333 #CJK UNIFIED IDEOGRAPH + {0xBCFE, 0x7483}, //4334 #CJK UNIFIED IDEOGRAPH + {0xBD40, 0x747E}, //4335 #CJK UNIFIED IDEOGRAPH + {0xBD41, 0x7480}, //4336 #CJK UNIFIED IDEOGRAPH + {0xBD42, 0x757F}, //4337 #CJK UNIFIED IDEOGRAPH + {0xBD43, 0x7620}, //4338 #CJK UNIFIED IDEOGRAPH + {0xBD44, 0x7629}, //4339 #CJK UNIFIED IDEOGRAPH + {0xBD45, 0x761F}, //4340 #CJK UNIFIED IDEOGRAPH + {0xBD46, 0x7624}, //4341 #CJK UNIFIED IDEOGRAPH + {0xBD47, 0x7626}, //4342 #CJK UNIFIED IDEOGRAPH + {0xBD48, 0x7621}, //4343 #CJK UNIFIED IDEOGRAPH + {0xBD49, 0x7622}, //4344 #CJK UNIFIED IDEOGRAPH + {0xBD4A, 0x769A}, //4345 #CJK UNIFIED IDEOGRAPH + {0xBD4B, 0x76BA}, //4346 #CJK UNIFIED IDEOGRAPH + {0xBD4C, 0x76E4}, //4347 #CJK UNIFIED IDEOGRAPH + {0xBD4D, 0x778E}, //4348 #CJK UNIFIED IDEOGRAPH + {0xBD4E, 0x7787}, //4349 #CJK UNIFIED IDEOGRAPH + {0xBD4F, 0x778C}, //4350 #CJK UNIFIED IDEOGRAPH + {0xBD50, 0x7791}, //4351 #CJK UNIFIED IDEOGRAPH + {0xBD51, 0x778B}, //4352 #CJK UNIFIED IDEOGRAPH + {0xBD52, 0x78CB}, //4353 #CJK UNIFIED IDEOGRAPH + {0xBD53, 0x78C5}, //4354 #CJK UNIFIED IDEOGRAPH + {0xBD54, 0x78BA}, //4355 #CJK UNIFIED IDEOGRAPH + {0xBD55, 0x78CA}, //4356 #CJK UNIFIED IDEOGRAPH + {0xBD56, 0x78BE}, //4357 #CJK UNIFIED IDEOGRAPH + {0xBD57, 0x78D5}, //4358 #CJK UNIFIED IDEOGRAPH + {0xBD58, 0x78BC}, //4359 #CJK UNIFIED IDEOGRAPH + {0xBD59, 0x78D0}, //4360 #CJK UNIFIED IDEOGRAPH + {0xBD5A, 0x7A3F}, //4361 #CJK UNIFIED IDEOGRAPH + {0xBD5B, 0x7A3C}, //4362 #CJK UNIFIED IDEOGRAPH + {0xBD5C, 0x7A40}, //4363 #CJK UNIFIED IDEOGRAPH + {0xBD5D, 0x7A3D}, //4364 #CJK UNIFIED IDEOGRAPH + {0xBD5E, 0x7A37}, //4365 #CJK UNIFIED IDEOGRAPH + {0xBD5F, 0x7A3B}, //4366 #CJK UNIFIED IDEOGRAPH + {0xBD60, 0x7AAF}, //4367 #CJK UNIFIED IDEOGRAPH + {0xBD61, 0x7AAE}, //4368 #CJK UNIFIED IDEOGRAPH + {0xBD62, 0x7BAD}, //4369 #CJK UNIFIED IDEOGRAPH + {0xBD63, 0x7BB1}, //4370 #CJK UNIFIED IDEOGRAPH + {0xBD64, 0x7BC4}, //4371 #CJK UNIFIED IDEOGRAPH + {0xBD65, 0x7BB4}, //4372 #CJK UNIFIED IDEOGRAPH + {0xBD66, 0x7BC6}, //4373 #CJK UNIFIED IDEOGRAPH + {0xBD67, 0x7BC7}, //4374 #CJK UNIFIED IDEOGRAPH + {0xBD68, 0x7BC1}, //4375 #CJK UNIFIED IDEOGRAPH + {0xBD69, 0x7BA0}, //4376 #CJK UNIFIED IDEOGRAPH + {0xBD6A, 0x7BCC}, //4377 #CJK UNIFIED IDEOGRAPH + {0xBD6B, 0x7CCA}, //4378 #CJK UNIFIED IDEOGRAPH + {0xBD6C, 0x7DE0}, //4379 #CJK UNIFIED IDEOGRAPH + {0xBD6D, 0x7DF4}, //4380 #CJK UNIFIED IDEOGRAPH + {0xBD6E, 0x7DEF}, //4381 #CJK UNIFIED IDEOGRAPH + {0xBD6F, 0x7DFB}, //4382 #CJK UNIFIED IDEOGRAPH + {0xBD70, 0x7DD8}, //4383 #CJK UNIFIED IDEOGRAPH + {0xBD71, 0x7DEC}, //4384 #CJK UNIFIED IDEOGRAPH + {0xBD72, 0x7DDD}, //4385 #CJK UNIFIED IDEOGRAPH + {0xBD73, 0x7DE8}, //4386 #CJK UNIFIED IDEOGRAPH + {0xBD74, 0x7DE3}, //4387 #CJK UNIFIED IDEOGRAPH + {0xBD75, 0x7DDA}, //4388 #CJK UNIFIED IDEOGRAPH + {0xBD76, 0x7DDE}, //4389 #CJK UNIFIED IDEOGRAPH + {0xBD77, 0x7DE9}, //4390 #CJK UNIFIED IDEOGRAPH + {0xBD78, 0x7D9E}, //4391 #CJK UNIFIED IDEOGRAPH + {0xBD79, 0x7DD9}, //4392 #CJK UNIFIED IDEOGRAPH + {0xBD7A, 0x7DF2}, //4393 #CJK UNIFIED IDEOGRAPH + {0xBD7B, 0x7DF9}, //4394 #CJK UNIFIED IDEOGRAPH + {0xBD7C, 0x7F75}, //4395 #CJK UNIFIED IDEOGRAPH + {0xBD7D, 0x7F77}, //4396 #CJK UNIFIED IDEOGRAPH + {0xBD7E, 0x7FAF}, //4397 #CJK UNIFIED IDEOGRAPH + {0xBDA1, 0x7FE9}, //4398 #CJK UNIFIED IDEOGRAPH + {0xBDA2, 0x8026}, //4399 #CJK UNIFIED IDEOGRAPH + {0xBDA3, 0x819B}, //4400 #CJK UNIFIED IDEOGRAPH + {0xBDA4, 0x819C}, //4401 #CJK UNIFIED IDEOGRAPH + {0xBDA5, 0x819D}, //4402 #CJK UNIFIED IDEOGRAPH + {0xBDA6, 0x81A0}, //4403 #CJK UNIFIED IDEOGRAPH + {0xBDA7, 0x819A}, //4404 #CJK UNIFIED IDEOGRAPH + {0xBDA8, 0x8198}, //4405 #CJK UNIFIED IDEOGRAPH + {0xBDA9, 0x8517}, //4406 #CJK UNIFIED IDEOGRAPH + {0xBDAA, 0x853D}, //4407 #CJK UNIFIED IDEOGRAPH + {0xBDAB, 0x851A}, //4408 #CJK UNIFIED IDEOGRAPH + {0xBDAC, 0x84EE}, //4409 #CJK UNIFIED IDEOGRAPH + {0xBDAD, 0x852C}, //4410 #CJK UNIFIED IDEOGRAPH + {0xBDAE, 0x852D}, //4411 #CJK UNIFIED IDEOGRAPH + {0xBDAF, 0x8513}, //4412 #CJK UNIFIED IDEOGRAPH + {0xBDB0, 0x8511}, //4413 #CJK UNIFIED IDEOGRAPH + {0xBDB1, 0x8523}, //4414 #CJK UNIFIED IDEOGRAPH + {0xBDB2, 0x8521}, //4415 #CJK UNIFIED IDEOGRAPH + {0xBDB3, 0x8514}, //4416 #CJK UNIFIED IDEOGRAPH + {0xBDB4, 0x84EC}, //4417 #CJK UNIFIED IDEOGRAPH + {0xBDB5, 0x8525}, //4418 #CJK UNIFIED IDEOGRAPH + {0xBDB6, 0x84FF}, //4419 #CJK UNIFIED IDEOGRAPH + {0xBDB7, 0x8506}, //4420 #CJK UNIFIED IDEOGRAPH + {0xBDB8, 0x8782}, //4421 #CJK UNIFIED IDEOGRAPH + {0xBDB9, 0x8774}, //4422 #CJK UNIFIED IDEOGRAPH + {0xBDBA, 0x8776}, //4423 #CJK UNIFIED IDEOGRAPH + {0xBDBB, 0x8760}, //4424 #CJK UNIFIED IDEOGRAPH + {0xBDBC, 0x8766}, //4425 #CJK UNIFIED IDEOGRAPH + {0xBDBD, 0x8778}, //4426 #CJK UNIFIED IDEOGRAPH + {0xBDBE, 0x8768}, //4427 #CJK UNIFIED IDEOGRAPH + {0xBDBF, 0x8759}, //4428 #CJK UNIFIED IDEOGRAPH + {0xBDC0, 0x8757}, //4429 #CJK UNIFIED IDEOGRAPH + {0xBDC1, 0x874C}, //4430 #CJK UNIFIED IDEOGRAPH + {0xBDC2, 0x8753}, //4431 #CJK UNIFIED IDEOGRAPH + {0xBDC3, 0x885B}, //4432 #CJK UNIFIED IDEOGRAPH + {0xBDC4, 0x885D}, //4433 #CJK UNIFIED IDEOGRAPH + {0xBDC5, 0x8910}, //4434 #CJK UNIFIED IDEOGRAPH + {0xBDC6, 0x8907}, //4435 #CJK UNIFIED IDEOGRAPH + {0xBDC7, 0x8912}, //4436 #CJK UNIFIED IDEOGRAPH + {0xBDC8, 0x8913}, //4437 #CJK UNIFIED IDEOGRAPH + {0xBDC9, 0x8915}, //4438 #CJK UNIFIED IDEOGRAPH + {0xBDCA, 0x890A}, //4439 #CJK UNIFIED IDEOGRAPH + {0xBDCB, 0x8ABC}, //4440 #CJK UNIFIED IDEOGRAPH + {0xBDCC, 0x8AD2}, //4441 #CJK UNIFIED IDEOGRAPH + {0xBDCD, 0x8AC7}, //4442 #CJK UNIFIED IDEOGRAPH + {0xBDCE, 0x8AC4}, //4443 #CJK UNIFIED IDEOGRAPH + {0xBDCF, 0x8A95}, //4444 #CJK UNIFIED IDEOGRAPH + {0xBDD0, 0x8ACB}, //4445 #CJK UNIFIED IDEOGRAPH + {0xBDD1, 0x8AF8}, //4446 #CJK UNIFIED IDEOGRAPH + {0xBDD2, 0x8AB2}, //4447 #CJK UNIFIED IDEOGRAPH + {0xBDD3, 0x8AC9}, //4448 #CJK UNIFIED IDEOGRAPH + {0xBDD4, 0x8AC2}, //4449 #CJK UNIFIED IDEOGRAPH + {0xBDD5, 0x8ABF}, //4450 #CJK UNIFIED IDEOGRAPH + {0xBDD6, 0x8AB0}, //4451 #CJK UNIFIED IDEOGRAPH + {0xBDD7, 0x8AD6}, //4452 #CJK UNIFIED IDEOGRAPH + {0xBDD8, 0x8ACD}, //4453 #CJK UNIFIED IDEOGRAPH + {0xBDD9, 0x8AB6}, //4454 #CJK UNIFIED IDEOGRAPH + {0xBDDA, 0x8AB9}, //4455 #CJK UNIFIED IDEOGRAPH + {0xBDDB, 0x8ADB}, //4456 #CJK UNIFIED IDEOGRAPH + {0xBDDC, 0x8C4C}, //4457 #CJK UNIFIED IDEOGRAPH + {0xBDDD, 0x8C4E}, //4458 #CJK UNIFIED IDEOGRAPH + {0xBDDE, 0x8C6C}, //4459 #CJK UNIFIED IDEOGRAPH + {0xBDDF, 0x8CE0}, //4460 #CJK UNIFIED IDEOGRAPH + {0xBDE0, 0x8CDE}, //4461 #CJK UNIFIED IDEOGRAPH + {0xBDE1, 0x8CE6}, //4462 #CJK UNIFIED IDEOGRAPH + {0xBDE2, 0x8CE4}, //4463 #CJK UNIFIED IDEOGRAPH + {0xBDE3, 0x8CEC}, //4464 #CJK UNIFIED IDEOGRAPH + {0xBDE4, 0x8CED}, //4465 #CJK UNIFIED IDEOGRAPH + {0xBDE5, 0x8CE2}, //4466 #CJK UNIFIED IDEOGRAPH + {0xBDE6, 0x8CE3}, //4467 #CJK UNIFIED IDEOGRAPH + {0xBDE7, 0x8CDC}, //4468 #CJK UNIFIED IDEOGRAPH + {0xBDE8, 0x8CEA}, //4469 #CJK UNIFIED IDEOGRAPH + {0xBDE9, 0x8CE1}, //4470 #CJK UNIFIED IDEOGRAPH + {0xBDEA, 0x8D6D}, //4471 #CJK UNIFIED IDEOGRAPH + {0xBDEB, 0x8D9F}, //4472 #CJK UNIFIED IDEOGRAPH + {0xBDEC, 0x8DA3}, //4473 #CJK UNIFIED IDEOGRAPH + {0xBDED, 0x8E2B}, //4474 #CJK UNIFIED IDEOGRAPH + {0xBDEE, 0x8E10}, //4475 #CJK UNIFIED IDEOGRAPH + {0xBDEF, 0x8E1D}, //4476 #CJK UNIFIED IDEOGRAPH + {0xBDF0, 0x8E22}, //4477 #CJK UNIFIED IDEOGRAPH + {0xBDF1, 0x8E0F}, //4478 #CJK UNIFIED IDEOGRAPH + {0xBDF2, 0x8E29}, //4479 #CJK UNIFIED IDEOGRAPH + {0xBDF3, 0x8E1F}, //4480 #CJK UNIFIED IDEOGRAPH + {0xBDF4, 0x8E21}, //4481 #CJK UNIFIED IDEOGRAPH + {0xBDF5, 0x8E1E}, //4482 #CJK UNIFIED IDEOGRAPH + {0xBDF6, 0x8EBA}, //4483 #CJK UNIFIED IDEOGRAPH + {0xBDF7, 0x8F1D}, //4484 #CJK UNIFIED IDEOGRAPH + {0xBDF8, 0x8F1B}, //4485 #CJK UNIFIED IDEOGRAPH + {0xBDF9, 0x8F1F}, //4486 #CJK UNIFIED IDEOGRAPH + {0xBDFA, 0x8F29}, //4487 #CJK UNIFIED IDEOGRAPH + {0xBDFB, 0x8F26}, //4488 #CJK UNIFIED IDEOGRAPH + {0xBDFC, 0x8F2A}, //4489 #CJK UNIFIED IDEOGRAPH + {0xBDFD, 0x8F1C}, //4490 #CJK UNIFIED IDEOGRAPH + {0xBDFE, 0x8F1E}, //4491 #CJK UNIFIED IDEOGRAPH + {0xBE40, 0x8F25}, //4492 #CJK UNIFIED IDEOGRAPH + {0xBE41, 0x9069}, //4493 #CJK UNIFIED IDEOGRAPH + {0xBE42, 0x906E}, //4494 #CJK UNIFIED IDEOGRAPH + {0xBE43, 0x9068}, //4495 #CJK UNIFIED IDEOGRAPH + {0xBE44, 0x906D}, //4496 #CJK UNIFIED IDEOGRAPH + {0xBE45, 0x9077}, //4497 #CJK UNIFIED IDEOGRAPH + {0xBE46, 0x9130}, //4498 #CJK UNIFIED IDEOGRAPH + {0xBE47, 0x912D}, //4499 #CJK UNIFIED IDEOGRAPH + {0xBE48, 0x9127}, //4500 #CJK UNIFIED IDEOGRAPH + {0xBE49, 0x9131}, //4501 #CJK UNIFIED IDEOGRAPH + {0xBE4A, 0x9187}, //4502 #CJK UNIFIED IDEOGRAPH + {0xBE4B, 0x9189}, //4503 #CJK UNIFIED IDEOGRAPH + {0xBE4C, 0x918B}, //4504 #CJK UNIFIED IDEOGRAPH + {0xBE4D, 0x9183}, //4505 #CJK UNIFIED IDEOGRAPH + {0xBE4E, 0x92C5}, //4506 #CJK UNIFIED IDEOGRAPH + {0xBE4F, 0x92BB}, //4507 #CJK UNIFIED IDEOGRAPH + {0xBE50, 0x92B7}, //4508 #CJK UNIFIED IDEOGRAPH + {0xBE51, 0x92EA}, //4509 #CJK UNIFIED IDEOGRAPH + {0xBE52, 0x92AC}, //4510 #CJK UNIFIED IDEOGRAPH + {0xBE53, 0x92E4}, //4511 #CJK UNIFIED IDEOGRAPH + {0xBE54, 0x92C1}, //4512 #CJK UNIFIED IDEOGRAPH + {0xBE55, 0x92B3}, //4513 #CJK UNIFIED IDEOGRAPH + {0xBE56, 0x92BC}, //4514 #CJK UNIFIED IDEOGRAPH + {0xBE57, 0x92D2}, //4515 #CJK UNIFIED IDEOGRAPH + {0xBE58, 0x92C7}, //4516 #CJK UNIFIED IDEOGRAPH + {0xBE59, 0x92F0}, //4517 #CJK UNIFIED IDEOGRAPH + {0xBE5A, 0x92B2}, //4518 #CJK UNIFIED IDEOGRAPH + {0xBE5B, 0x95AD}, //4519 #CJK UNIFIED IDEOGRAPH + {0xBE5C, 0x95B1}, //4520 #CJK UNIFIED IDEOGRAPH + {0xBE5D, 0x9704}, //4521 #CJK UNIFIED IDEOGRAPH + {0xBE5E, 0x9706}, //4522 #CJK UNIFIED IDEOGRAPH + {0xBE5F, 0x9707}, //4523 #CJK UNIFIED IDEOGRAPH + {0xBE60, 0x9709}, //4524 #CJK UNIFIED IDEOGRAPH + {0xBE61, 0x9760}, //4525 #CJK UNIFIED IDEOGRAPH + {0xBE62, 0x978D}, //4526 #CJK UNIFIED IDEOGRAPH + {0xBE63, 0x978B}, //4527 #CJK UNIFIED IDEOGRAPH + {0xBE64, 0x978F}, //4528 #CJK UNIFIED IDEOGRAPH + {0xBE65, 0x9821}, //4529 #CJK UNIFIED IDEOGRAPH + {0xBE66, 0x982B}, //4530 #CJK UNIFIED IDEOGRAPH + {0xBE67, 0x981C}, //4531 #CJK UNIFIED IDEOGRAPH + {0xBE68, 0x98B3}, //4532 #CJK UNIFIED IDEOGRAPH + {0xBE69, 0x990A}, //4533 #CJK UNIFIED IDEOGRAPH + {0xBE6A, 0x9913}, //4534 #CJK UNIFIED IDEOGRAPH + {0xBE6B, 0x9912}, //4535 #CJK UNIFIED IDEOGRAPH + {0xBE6C, 0x9918}, //4536 #CJK UNIFIED IDEOGRAPH + {0xBE6D, 0x99DD}, //4537 #CJK UNIFIED IDEOGRAPH + {0xBE6E, 0x99D0}, //4538 #CJK UNIFIED IDEOGRAPH + {0xBE6F, 0x99DF}, //4539 #CJK UNIFIED IDEOGRAPH + {0xBE70, 0x99DB}, //4540 #CJK UNIFIED IDEOGRAPH + {0xBE71, 0x99D1}, //4541 #CJK UNIFIED IDEOGRAPH + {0xBE72, 0x99D5}, //4542 #CJK UNIFIED IDEOGRAPH + {0xBE73, 0x99D2}, //4543 #CJK UNIFIED IDEOGRAPH + {0xBE74, 0x99D9}, //4544 #CJK UNIFIED IDEOGRAPH + {0xBE75, 0x9AB7}, //4545 #CJK UNIFIED IDEOGRAPH + {0xBE76, 0x9AEE}, //4546 #CJK UNIFIED IDEOGRAPH + {0xBE77, 0x9AEF}, //4547 #CJK UNIFIED IDEOGRAPH + {0xBE78, 0x9B27}, //4548 #CJK UNIFIED IDEOGRAPH + {0xBE79, 0x9B45}, //4549 #CJK UNIFIED IDEOGRAPH + {0xBE7A, 0x9B44}, //4550 #CJK UNIFIED IDEOGRAPH + {0xBE7B, 0x9B77}, //4551 #CJK UNIFIED IDEOGRAPH + {0xBE7C, 0x9B6F}, //4552 #CJK UNIFIED IDEOGRAPH + {0xBE7D, 0x9D06}, //4553 #CJK UNIFIED IDEOGRAPH + {0xBE7E, 0x9D09}, //4554 #CJK UNIFIED IDEOGRAPH + {0xBEA1, 0x9D03}, //4555 #CJK UNIFIED IDEOGRAPH + {0xBEA2, 0x9EA9}, //4556 #CJK UNIFIED IDEOGRAPH + {0xBEA3, 0x9EBE}, //4557 #CJK UNIFIED IDEOGRAPH + {0xBEA4, 0x9ECE}, //4558 #CJK UNIFIED IDEOGRAPH + {0xBEA5, 0x58A8}, //4559 #CJK UNIFIED IDEOGRAPH + {0xBEA6, 0x9F52}, //4560 #CJK UNIFIED IDEOGRAPH + {0xBEA7, 0x5112}, //4561 #CJK UNIFIED IDEOGRAPH + {0xBEA8, 0x5118}, //4562 #CJK UNIFIED IDEOGRAPH + {0xBEA9, 0x5114}, //4563 #CJK UNIFIED IDEOGRAPH + {0xBEAA, 0x5110}, //4564 #CJK UNIFIED IDEOGRAPH + {0xBEAB, 0x5115}, //4565 #CJK UNIFIED IDEOGRAPH + {0xBEAC, 0x5180}, //4566 #CJK UNIFIED IDEOGRAPH + {0xBEAD, 0x51AA}, //4567 #CJK UNIFIED IDEOGRAPH + {0xBEAE, 0x51DD}, //4568 #CJK UNIFIED IDEOGRAPH + {0xBEAF, 0x5291}, //4569 #CJK UNIFIED IDEOGRAPH + {0xBEB0, 0x5293}, //4570 #CJK UNIFIED IDEOGRAPH + {0xBEB1, 0x52F3}, //4571 #CJK UNIFIED IDEOGRAPH + {0xBEB2, 0x5659}, //4572 #CJK UNIFIED IDEOGRAPH + {0xBEB3, 0x566B}, //4573 #CJK UNIFIED IDEOGRAPH + {0xBEB4, 0x5679}, //4574 #CJK UNIFIED IDEOGRAPH + {0xBEB5, 0x5669}, //4575 #CJK UNIFIED IDEOGRAPH + {0xBEB6, 0x5664}, //4576 #CJK UNIFIED IDEOGRAPH + {0xBEB7, 0x5678}, //4577 #CJK UNIFIED IDEOGRAPH + {0xBEB8, 0x566A}, //4578 #CJK UNIFIED IDEOGRAPH + {0xBEB9, 0x5668}, //4579 #CJK UNIFIED IDEOGRAPH + {0xBEBA, 0x5665}, //4580 #CJK UNIFIED IDEOGRAPH + {0xBEBB, 0x5671}, //4581 #CJK UNIFIED IDEOGRAPH + {0xBEBC, 0x566F}, //4582 #CJK UNIFIED IDEOGRAPH + {0xBEBD, 0x566C}, //4583 #CJK UNIFIED IDEOGRAPH + {0xBEBE, 0x5662}, //4584 #CJK UNIFIED IDEOGRAPH + {0xBEBF, 0x5676}, //4585 #CJK UNIFIED IDEOGRAPH + {0xBEC0, 0x58C1}, //4586 #CJK UNIFIED IDEOGRAPH + {0xBEC1, 0x58BE}, //4587 #CJK UNIFIED IDEOGRAPH + {0xBEC2, 0x58C7}, //4588 #CJK UNIFIED IDEOGRAPH + {0xBEC3, 0x58C5}, //4589 #CJK UNIFIED IDEOGRAPH + {0xBEC4, 0x596E}, //4590 #CJK UNIFIED IDEOGRAPH + {0xBEC5, 0x5B1D}, //4591 #CJK UNIFIED IDEOGRAPH + {0xBEC6, 0x5B34}, //4592 #CJK UNIFIED IDEOGRAPH + {0xBEC7, 0x5B78}, //4593 #CJK UNIFIED IDEOGRAPH + {0xBEC8, 0x5BF0}, //4594 #CJK UNIFIED IDEOGRAPH + {0xBEC9, 0x5C0E}, //4595 #CJK UNIFIED IDEOGRAPH + {0xBECA, 0x5F4A}, //4596 #CJK UNIFIED IDEOGRAPH + {0xBECB, 0x61B2}, //4597 #CJK UNIFIED IDEOGRAPH + {0xBECC, 0x6191}, //4598 #CJK UNIFIED IDEOGRAPH + {0xBECD, 0x61A9}, //4599 #CJK UNIFIED IDEOGRAPH + {0xBECE, 0x618A}, //4600 #CJK UNIFIED IDEOGRAPH + {0xBECF, 0x61CD}, //4601 #CJK UNIFIED IDEOGRAPH + {0xBED0, 0x61B6}, //4602 #CJK UNIFIED IDEOGRAPH + {0xBED1, 0x61BE}, //4603 #CJK UNIFIED IDEOGRAPH + {0xBED2, 0x61CA}, //4604 #CJK UNIFIED IDEOGRAPH + {0xBED3, 0x61C8}, //4605 #CJK UNIFIED IDEOGRAPH + {0xBED4, 0x6230}, //4606 #CJK UNIFIED IDEOGRAPH + {0xBED5, 0x64C5}, //4607 #CJK UNIFIED IDEOGRAPH + {0xBED6, 0x64C1}, //4608 #CJK UNIFIED IDEOGRAPH + {0xBED7, 0x64CB}, //4609 #CJK UNIFIED IDEOGRAPH + {0xBED8, 0x64BB}, //4610 #CJK UNIFIED IDEOGRAPH + {0xBED9, 0x64BC}, //4611 #CJK UNIFIED IDEOGRAPH + {0xBEDA, 0x64DA}, //4612 #CJK UNIFIED IDEOGRAPH + {0xBEDB, 0x64C4}, //4613 #CJK UNIFIED IDEOGRAPH + {0xBEDC, 0x64C7}, //4614 #CJK UNIFIED IDEOGRAPH + {0xBEDD, 0x64C2}, //4615 #CJK UNIFIED IDEOGRAPH + {0xBEDE, 0x64CD}, //4616 #CJK UNIFIED IDEOGRAPH + {0xBEDF, 0x64BF}, //4617 #CJK UNIFIED IDEOGRAPH + {0xBEE0, 0x64D2}, //4618 #CJK UNIFIED IDEOGRAPH + {0xBEE1, 0x64D4}, //4619 #CJK UNIFIED IDEOGRAPH + {0xBEE2, 0x64BE}, //4620 #CJK UNIFIED IDEOGRAPH + {0xBEE3, 0x6574}, //4621 #CJK UNIFIED IDEOGRAPH + {0xBEE4, 0x66C6}, //4622 #CJK UNIFIED IDEOGRAPH + {0xBEE5, 0x66C9}, //4623 #CJK UNIFIED IDEOGRAPH + {0xBEE6, 0x66B9}, //4624 #CJK UNIFIED IDEOGRAPH + {0xBEE7, 0x66C4}, //4625 #CJK UNIFIED IDEOGRAPH + {0xBEE8, 0x66C7}, //4626 #CJK UNIFIED IDEOGRAPH + {0xBEE9, 0x66B8}, //4627 #CJK UNIFIED IDEOGRAPH + {0xBEEA, 0x6A3D}, //4628 #CJK UNIFIED IDEOGRAPH + {0xBEEB, 0x6A38}, //4629 #CJK UNIFIED IDEOGRAPH + {0xBEEC, 0x6A3A}, //4630 #CJK UNIFIED IDEOGRAPH + {0xBEED, 0x6A59}, //4631 #CJK UNIFIED IDEOGRAPH + {0xBEEE, 0x6A6B}, //4632 #CJK UNIFIED IDEOGRAPH + {0xBEEF, 0x6A58}, //4633 #CJK UNIFIED IDEOGRAPH + {0xBEF0, 0x6A39}, //4634 #CJK UNIFIED IDEOGRAPH + {0xBEF1, 0x6A44}, //4635 #CJK UNIFIED IDEOGRAPH + {0xBEF2, 0x6A62}, //4636 #CJK UNIFIED IDEOGRAPH + {0xBEF3, 0x6A61}, //4637 #CJK UNIFIED IDEOGRAPH + {0xBEF4, 0x6A4B}, //4638 #CJK UNIFIED IDEOGRAPH + {0xBEF5, 0x6A47}, //4639 #CJK UNIFIED IDEOGRAPH + {0xBEF6, 0x6A35}, //4640 #CJK UNIFIED IDEOGRAPH + {0xBEF7, 0x6A5F}, //4641 #CJK UNIFIED IDEOGRAPH + {0xBEF8, 0x6A48}, //4642 #CJK UNIFIED IDEOGRAPH + {0xBEF9, 0x6B59}, //4643 #CJK UNIFIED IDEOGRAPH + {0xBEFA, 0x6B77}, //4644 #CJK UNIFIED IDEOGRAPH + {0xBEFB, 0x6C05}, //4645 #CJK UNIFIED IDEOGRAPH + {0xBEFC, 0x6FC2}, //4646 #CJK UNIFIED IDEOGRAPH + {0xBEFD, 0x6FB1}, //4647 #CJK UNIFIED IDEOGRAPH + {0xBEFE, 0x6FA1}, //4648 #CJK UNIFIED IDEOGRAPH + {0xBF40, 0x6FC3}, //4649 #CJK UNIFIED IDEOGRAPH + {0xBF41, 0x6FA4}, //4650 #CJK UNIFIED IDEOGRAPH + {0xBF42, 0x6FC1}, //4651 #CJK UNIFIED IDEOGRAPH + {0xBF43, 0x6FA7}, //4652 #CJK UNIFIED IDEOGRAPH + {0xBF44, 0x6FB3}, //4653 #CJK UNIFIED IDEOGRAPH + {0xBF45, 0x6FC0}, //4654 #CJK UNIFIED IDEOGRAPH + {0xBF46, 0x6FB9}, //4655 #CJK UNIFIED IDEOGRAPH + {0xBF47, 0x6FB6}, //4656 #CJK UNIFIED IDEOGRAPH + {0xBF48, 0x6FA6}, //4657 #CJK UNIFIED IDEOGRAPH + {0xBF49, 0x6FA0}, //4658 #CJK UNIFIED IDEOGRAPH + {0xBF4A, 0x6FB4}, //4659 #CJK UNIFIED IDEOGRAPH + {0xBF4B, 0x71BE}, //4660 #CJK UNIFIED IDEOGRAPH + {0xBF4C, 0x71C9}, //4661 #CJK UNIFIED IDEOGRAPH + {0xBF4D, 0x71D0}, //4662 #CJK UNIFIED IDEOGRAPH + {0xBF4E, 0x71D2}, //4663 #CJK UNIFIED IDEOGRAPH + {0xBF4F, 0x71C8}, //4664 #CJK UNIFIED IDEOGRAPH + {0xBF50, 0x71D5}, //4665 #CJK UNIFIED IDEOGRAPH + {0xBF51, 0x71B9}, //4666 #CJK UNIFIED IDEOGRAPH + {0xBF52, 0x71CE}, //4667 #CJK UNIFIED IDEOGRAPH + {0xBF53, 0x71D9}, //4668 #CJK UNIFIED IDEOGRAPH + {0xBF54, 0x71DC}, //4669 #CJK UNIFIED IDEOGRAPH + {0xBF55, 0x71C3}, //4670 #CJK UNIFIED IDEOGRAPH + {0xBF56, 0x71C4}, //4671 #CJK UNIFIED IDEOGRAPH + {0xBF57, 0x7368}, //4672 #CJK UNIFIED IDEOGRAPH + {0xBF58, 0x749C}, //4673 #CJK UNIFIED IDEOGRAPH + {0xBF59, 0x74A3}, //4674 #CJK UNIFIED IDEOGRAPH + {0xBF5A, 0x7498}, //4675 #CJK UNIFIED IDEOGRAPH + {0xBF5B, 0x749F}, //4676 #CJK UNIFIED IDEOGRAPH + {0xBF5C, 0x749E}, //4677 #CJK UNIFIED IDEOGRAPH + {0xBF5D, 0x74E2}, //4678 #CJK UNIFIED IDEOGRAPH + {0xBF5E, 0x750C}, //4679 #CJK UNIFIED IDEOGRAPH + {0xBF5F, 0x750D}, //4680 #CJK UNIFIED IDEOGRAPH + {0xBF60, 0x7634}, //4681 #CJK UNIFIED IDEOGRAPH + {0xBF61, 0x7638}, //4682 #CJK UNIFIED IDEOGRAPH + {0xBF62, 0x763A}, //4683 #CJK UNIFIED IDEOGRAPH + {0xBF63, 0x76E7}, //4684 #CJK UNIFIED IDEOGRAPH + {0xBF64, 0x76E5}, //4685 #CJK UNIFIED IDEOGRAPH + {0xBF65, 0x77A0}, //4686 #CJK UNIFIED IDEOGRAPH + {0xBF66, 0x779E}, //4687 #CJK UNIFIED IDEOGRAPH + {0xBF67, 0x779F}, //4688 #CJK UNIFIED IDEOGRAPH + {0xBF68, 0x77A5}, //4689 #CJK UNIFIED IDEOGRAPH + {0xBF69, 0x78E8}, //4690 #CJK UNIFIED IDEOGRAPH + {0xBF6A, 0x78DA}, //4691 #CJK UNIFIED IDEOGRAPH + {0xBF6B, 0x78EC}, //4692 #CJK UNIFIED IDEOGRAPH + {0xBF6C, 0x78E7}, //4693 #CJK UNIFIED IDEOGRAPH + {0xBF6D, 0x79A6}, //4694 #CJK UNIFIED IDEOGRAPH + {0xBF6E, 0x7A4D}, //4695 #CJK UNIFIED IDEOGRAPH + {0xBF6F, 0x7A4E}, //4696 #CJK UNIFIED IDEOGRAPH + {0xBF70, 0x7A46}, //4697 #CJK UNIFIED IDEOGRAPH + {0xBF71, 0x7A4C}, //4698 #CJK UNIFIED IDEOGRAPH + {0xBF72, 0x7A4B}, //4699 #CJK UNIFIED IDEOGRAPH + {0xBF73, 0x7ABA}, //4700 #CJK UNIFIED IDEOGRAPH + {0xBF74, 0x7BD9}, //4701 #CJK UNIFIED IDEOGRAPH + {0xBF75, 0x7C11}, //4702 #CJK UNIFIED IDEOGRAPH + {0xBF76, 0x7BC9}, //4703 #CJK UNIFIED IDEOGRAPH + {0xBF77, 0x7BE4}, //4704 #CJK UNIFIED IDEOGRAPH + {0xBF78, 0x7BDB}, //4705 #CJK UNIFIED IDEOGRAPH + {0xBF79, 0x7BE1}, //4706 #CJK UNIFIED IDEOGRAPH + {0xBF7A, 0x7BE9}, //4707 #CJK UNIFIED IDEOGRAPH + {0xBF7B, 0x7BE6}, //4708 #CJK UNIFIED IDEOGRAPH + {0xBF7C, 0x7CD5}, //4709 #CJK UNIFIED IDEOGRAPH + {0xBF7D, 0x7CD6}, //4710 #CJK UNIFIED IDEOGRAPH + {0xBF7E, 0x7E0A}, //4711 #CJK UNIFIED IDEOGRAPH + {0xBFA1, 0x7E11}, //4712 #CJK UNIFIED IDEOGRAPH + {0xBFA2, 0x7E08}, //4713 #CJK UNIFIED IDEOGRAPH + {0xBFA3, 0x7E1B}, //4714 #CJK UNIFIED IDEOGRAPH + {0xBFA4, 0x7E23}, //4715 #CJK UNIFIED IDEOGRAPH + {0xBFA5, 0x7E1E}, //4716 #CJK UNIFIED IDEOGRAPH + {0xBFA6, 0x7E1D}, //4717 #CJK UNIFIED IDEOGRAPH + {0xBFA7, 0x7E09}, //4718 #CJK UNIFIED IDEOGRAPH + {0xBFA8, 0x7E10}, //4719 #CJK UNIFIED IDEOGRAPH + {0xBFA9, 0x7F79}, //4720 #CJK UNIFIED IDEOGRAPH + {0xBFAA, 0x7FB2}, //4721 #CJK UNIFIED IDEOGRAPH + {0xBFAB, 0x7FF0}, //4722 #CJK UNIFIED IDEOGRAPH + {0xBFAC, 0x7FF1}, //4723 #CJK UNIFIED IDEOGRAPH + {0xBFAD, 0x7FEE}, //4724 #CJK UNIFIED IDEOGRAPH + {0xBFAE, 0x8028}, //4725 #CJK UNIFIED IDEOGRAPH + {0xBFAF, 0x81B3}, //4726 #CJK UNIFIED IDEOGRAPH + {0xBFB0, 0x81A9}, //4727 #CJK UNIFIED IDEOGRAPH + {0xBFB1, 0x81A8}, //4728 #CJK UNIFIED IDEOGRAPH + {0xBFB2, 0x81FB}, //4729 #CJK UNIFIED IDEOGRAPH + {0xBFB3, 0x8208}, //4730 #CJK UNIFIED IDEOGRAPH + {0xBFB4, 0x8258}, //4731 #CJK UNIFIED IDEOGRAPH + {0xBFB5, 0x8259}, //4732 #CJK UNIFIED IDEOGRAPH + {0xBFB6, 0x854A}, //4733 #CJK UNIFIED IDEOGRAPH + {0xBFB7, 0x8559}, //4734 #CJK UNIFIED IDEOGRAPH + {0xBFB8, 0x8548}, //4735 #CJK UNIFIED IDEOGRAPH + {0xBFB9, 0x8568}, //4736 #CJK UNIFIED IDEOGRAPH + {0xBFBA, 0x8569}, //4737 #CJK UNIFIED IDEOGRAPH + {0xBFBB, 0x8543}, //4738 #CJK UNIFIED IDEOGRAPH + {0xBFBC, 0x8549}, //4739 #CJK UNIFIED IDEOGRAPH + {0xBFBD, 0x856D}, //4740 #CJK UNIFIED IDEOGRAPH + {0xBFBE, 0x856A}, //4741 #CJK UNIFIED IDEOGRAPH + {0xBFBF, 0x855E}, //4742 #CJK UNIFIED IDEOGRAPH + {0xBFC0, 0x8783}, //4743 #CJK UNIFIED IDEOGRAPH + {0xBFC1, 0x879F}, //4744 #CJK UNIFIED IDEOGRAPH + {0xBFC2, 0x879E}, //4745 #CJK UNIFIED IDEOGRAPH + {0xBFC3, 0x87A2}, //4746 #CJK UNIFIED IDEOGRAPH + {0xBFC4, 0x878D}, //4747 #CJK UNIFIED IDEOGRAPH + {0xBFC5, 0x8861}, //4748 #CJK UNIFIED IDEOGRAPH + {0xBFC6, 0x892A}, //4749 #CJK UNIFIED IDEOGRAPH + {0xBFC7, 0x8932}, //4750 #CJK UNIFIED IDEOGRAPH + {0xBFC8, 0x8925}, //4751 #CJK UNIFIED IDEOGRAPH + {0xBFC9, 0x892B}, //4752 #CJK UNIFIED IDEOGRAPH + {0xBFCA, 0x8921}, //4753 #CJK UNIFIED IDEOGRAPH + {0xBFCB, 0x89AA}, //4754 #CJK UNIFIED IDEOGRAPH + {0xBFCC, 0x89A6}, //4755 #CJK UNIFIED IDEOGRAPH + {0xBFCD, 0x8AE6}, //4756 #CJK UNIFIED IDEOGRAPH + {0xBFCE, 0x8AFA}, //4757 #CJK UNIFIED IDEOGRAPH + {0xBFCF, 0x8AEB}, //4758 #CJK UNIFIED IDEOGRAPH + {0xBFD0, 0x8AF1}, //4759 #CJK UNIFIED IDEOGRAPH + {0xBFD1, 0x8B00}, //4760 #CJK UNIFIED IDEOGRAPH + {0xBFD2, 0x8ADC}, //4761 #CJK UNIFIED IDEOGRAPH + {0xBFD3, 0x8AE7}, //4762 #CJK UNIFIED IDEOGRAPH + {0xBFD4, 0x8AEE}, //4763 #CJK UNIFIED IDEOGRAPH + {0xBFD5, 0x8AFE}, //4764 #CJK UNIFIED IDEOGRAPH + {0xBFD6, 0x8B01}, //4765 #CJK UNIFIED IDEOGRAPH + {0xBFD7, 0x8B02}, //4766 #CJK UNIFIED IDEOGRAPH + {0xBFD8, 0x8AF7}, //4767 #CJK UNIFIED IDEOGRAPH + {0xBFD9, 0x8AED}, //4768 #CJK UNIFIED IDEOGRAPH + {0xBFDA, 0x8AF3}, //4769 #CJK UNIFIED IDEOGRAPH + {0xBFDB, 0x8AF6}, //4770 #CJK UNIFIED IDEOGRAPH + {0xBFDC, 0x8AFC}, //4771 #CJK UNIFIED IDEOGRAPH + {0xBFDD, 0x8C6B}, //4772 #CJK UNIFIED IDEOGRAPH + {0xBFDE, 0x8C6D}, //4773 #CJK UNIFIED IDEOGRAPH + {0xBFDF, 0x8C93}, //4774 #CJK UNIFIED IDEOGRAPH + {0xBFE0, 0x8CF4}, //4775 #CJK UNIFIED IDEOGRAPH + {0xBFE1, 0x8E44}, //4776 #CJK UNIFIED IDEOGRAPH + {0xBFE2, 0x8E31}, //4777 #CJK UNIFIED IDEOGRAPH + {0xBFE3, 0x8E34}, //4778 #CJK UNIFIED IDEOGRAPH + {0xBFE4, 0x8E42}, //4779 #CJK UNIFIED IDEOGRAPH + {0xBFE5, 0x8E39}, //4780 #CJK UNIFIED IDEOGRAPH + {0xBFE6, 0x8E35}, //4781 #CJK UNIFIED IDEOGRAPH + {0xBFE7, 0x8F3B}, //4782 #CJK UNIFIED IDEOGRAPH + {0xBFE8, 0x8F2F}, //4783 #CJK UNIFIED IDEOGRAPH + {0xBFE9, 0x8F38}, //4784 #CJK UNIFIED IDEOGRAPH + {0xBFEA, 0x8F33}, //4785 #CJK UNIFIED IDEOGRAPH + {0xBFEB, 0x8FA8}, //4786 #CJK UNIFIED IDEOGRAPH + {0xBFEC, 0x8FA6}, //4787 #CJK UNIFIED IDEOGRAPH + {0xBFED, 0x9075}, //4788 #CJK UNIFIED IDEOGRAPH + {0xBFEE, 0x9074}, //4789 #CJK UNIFIED IDEOGRAPH + {0xBFEF, 0x9078}, //4790 #CJK UNIFIED IDEOGRAPH + {0xBFF0, 0x9072}, //4791 #CJK UNIFIED IDEOGRAPH + {0xBFF1, 0x907C}, //4792 #CJK UNIFIED IDEOGRAPH + {0xBFF2, 0x907A}, //4793 #CJK UNIFIED IDEOGRAPH + {0xBFF3, 0x9134}, //4794 #CJK UNIFIED IDEOGRAPH + {0xBFF4, 0x9192}, //4795 #CJK UNIFIED IDEOGRAPH + {0xBFF5, 0x9320}, //4796 #CJK UNIFIED IDEOGRAPH + {0xBFF6, 0x9336}, //4797 #CJK UNIFIED IDEOGRAPH + {0xBFF7, 0x92F8}, //4798 #CJK UNIFIED IDEOGRAPH + {0xBFF8, 0x9333}, //4799 #CJK UNIFIED IDEOGRAPH + {0xBFF9, 0x932F}, //4800 #CJK UNIFIED IDEOGRAPH + {0xBFFA, 0x9322}, //4801 #CJK UNIFIED IDEOGRAPH + {0xBFFB, 0x92FC}, //4802 #CJK UNIFIED IDEOGRAPH + {0xBFFC, 0x932B}, //4803 #CJK UNIFIED IDEOGRAPH + {0xBFFD, 0x9304}, //4804 #CJK UNIFIED IDEOGRAPH + {0xBFFE, 0x931A}, //4805 #CJK UNIFIED IDEOGRAPH + {0xC040, 0x9310}, //4806 #CJK UNIFIED IDEOGRAPH + {0xC041, 0x9326}, //4807 #CJK UNIFIED IDEOGRAPH + {0xC042, 0x9321}, //4808 #CJK UNIFIED IDEOGRAPH + {0xC043, 0x9315}, //4809 #CJK UNIFIED IDEOGRAPH + {0xC044, 0x932E}, //4810 #CJK UNIFIED IDEOGRAPH + {0xC045, 0x9319}, //4811 #CJK UNIFIED IDEOGRAPH + {0xC046, 0x95BB}, //4812 #CJK UNIFIED IDEOGRAPH + {0xC047, 0x96A7}, //4813 #CJK UNIFIED IDEOGRAPH + {0xC048, 0x96A8}, //4814 #CJK UNIFIED IDEOGRAPH + {0xC049, 0x96AA}, //4815 #CJK UNIFIED IDEOGRAPH + {0xC04A, 0x96D5}, //4816 #CJK UNIFIED IDEOGRAPH + {0xC04B, 0x970E}, //4817 #CJK UNIFIED IDEOGRAPH + {0xC04C, 0x9711}, //4818 #CJK UNIFIED IDEOGRAPH + {0xC04D, 0x9716}, //4819 #CJK UNIFIED IDEOGRAPH + {0xC04E, 0x970D}, //4820 #CJK UNIFIED IDEOGRAPH + {0xC04F, 0x9713}, //4821 #CJK UNIFIED IDEOGRAPH + {0xC050, 0x970F}, //4822 #CJK UNIFIED IDEOGRAPH + {0xC051, 0x975B}, //4823 #CJK UNIFIED IDEOGRAPH + {0xC052, 0x975C}, //4824 #CJK UNIFIED IDEOGRAPH + {0xC053, 0x9766}, //4825 #CJK UNIFIED IDEOGRAPH + {0xC054, 0x9798}, //4826 #CJK UNIFIED IDEOGRAPH + {0xC055, 0x9830}, //4827 #CJK UNIFIED IDEOGRAPH + {0xC056, 0x9838}, //4828 #CJK UNIFIED IDEOGRAPH + {0xC057, 0x983B}, //4829 #CJK UNIFIED IDEOGRAPH + {0xC058, 0x9837}, //4830 #CJK UNIFIED IDEOGRAPH + {0xC059, 0x982D}, //4831 #CJK UNIFIED IDEOGRAPH + {0xC05A, 0x9839}, //4832 #CJK UNIFIED IDEOGRAPH + {0xC05B, 0x9824}, //4833 #CJK UNIFIED IDEOGRAPH + {0xC05C, 0x9910}, //4834 #CJK UNIFIED IDEOGRAPH + {0xC05D, 0x9928}, //4835 #CJK UNIFIED IDEOGRAPH + {0xC05E, 0x991E}, //4836 #CJK UNIFIED IDEOGRAPH + {0xC05F, 0x991B}, //4837 #CJK UNIFIED IDEOGRAPH + {0xC060, 0x9921}, //4838 #CJK UNIFIED IDEOGRAPH + {0xC061, 0x991A}, //4839 #CJK UNIFIED IDEOGRAPH + {0xC062, 0x99ED}, //4840 #CJK UNIFIED IDEOGRAPH + {0xC063, 0x99E2}, //4841 #CJK UNIFIED IDEOGRAPH + {0xC064, 0x99F1}, //4842 #CJK UNIFIED IDEOGRAPH + {0xC065, 0x9AB8}, //4843 #CJK UNIFIED IDEOGRAPH + {0xC066, 0x9ABC}, //4844 #CJK UNIFIED IDEOGRAPH + {0xC067, 0x9AFB}, //4845 #CJK UNIFIED IDEOGRAPH + {0xC068, 0x9AED}, //4846 #CJK UNIFIED IDEOGRAPH + {0xC069, 0x9B28}, //4847 #CJK UNIFIED IDEOGRAPH + {0xC06A, 0x9B91}, //4848 #CJK UNIFIED IDEOGRAPH + {0xC06B, 0x9D15}, //4849 #CJK UNIFIED IDEOGRAPH + {0xC06C, 0x9D23}, //4850 #CJK UNIFIED IDEOGRAPH + {0xC06D, 0x9D26}, //4851 #CJK UNIFIED IDEOGRAPH + {0xC06E, 0x9D28}, //4852 #CJK UNIFIED IDEOGRAPH + {0xC06F, 0x9D12}, //4853 #CJK UNIFIED IDEOGRAPH + {0xC070, 0x9D1B}, //4854 #CJK UNIFIED IDEOGRAPH + {0xC071, 0x9ED8}, //4855 #CJK UNIFIED IDEOGRAPH + {0xC072, 0x9ED4}, //4856 #CJK UNIFIED IDEOGRAPH + {0xC073, 0x9F8D}, //4857 #CJK UNIFIED IDEOGRAPH + {0xC074, 0x9F9C}, //4858 #CJK UNIFIED IDEOGRAPH + {0xC075, 0x512A}, //4859 #CJK UNIFIED IDEOGRAPH + {0xC076, 0x511F}, //4860 #CJK UNIFIED IDEOGRAPH + {0xC077, 0x5121}, //4861 #CJK UNIFIED IDEOGRAPH + {0xC078, 0x5132}, //4862 #CJK UNIFIED IDEOGRAPH + {0xC079, 0x52F5}, //4863 #CJK UNIFIED IDEOGRAPH + {0xC07A, 0x568E}, //4864 #CJK UNIFIED IDEOGRAPH + {0xC07B, 0x5680}, //4865 #CJK UNIFIED IDEOGRAPH + {0xC07C, 0x5690}, //4866 #CJK UNIFIED IDEOGRAPH + {0xC07D, 0x5685}, //4867 #CJK UNIFIED IDEOGRAPH + {0xC07E, 0x5687}, //4868 #CJK UNIFIED IDEOGRAPH + {0xC0A1, 0x568F}, //4869 #CJK UNIFIED IDEOGRAPH + {0xC0A2, 0x58D5}, //4870 #CJK UNIFIED IDEOGRAPH + {0xC0A3, 0x58D3}, //4871 #CJK UNIFIED IDEOGRAPH + {0xC0A4, 0x58D1}, //4872 #CJK UNIFIED IDEOGRAPH + {0xC0A5, 0x58CE}, //4873 #CJK UNIFIED IDEOGRAPH + {0xC0A6, 0x5B30}, //4874 #CJK UNIFIED IDEOGRAPH + {0xC0A7, 0x5B2A}, //4875 #CJK UNIFIED IDEOGRAPH + {0xC0A8, 0x5B24}, //4876 #CJK UNIFIED IDEOGRAPH + {0xC0A9, 0x5B7A}, //4877 #CJK UNIFIED IDEOGRAPH + {0xC0AA, 0x5C37}, //4878 #CJK UNIFIED IDEOGRAPH + {0xC0AB, 0x5C68}, //4879 #CJK UNIFIED IDEOGRAPH + {0xC0AC, 0x5DBC}, //4880 #CJK UNIFIED IDEOGRAPH + {0xC0AD, 0x5DBA}, //4881 #CJK UNIFIED IDEOGRAPH + {0xC0AE, 0x5DBD}, //4882 #CJK UNIFIED IDEOGRAPH + {0xC0AF, 0x5DB8}, //4883 #CJK UNIFIED IDEOGRAPH + {0xC0B0, 0x5E6B}, //4884 #CJK UNIFIED IDEOGRAPH + {0xC0B1, 0x5F4C}, //4885 #CJK UNIFIED IDEOGRAPH + {0xC0B2, 0x5FBD}, //4886 #CJK UNIFIED IDEOGRAPH + {0xC0B3, 0x61C9}, //4887 #CJK UNIFIED IDEOGRAPH + {0xC0B4, 0x61C2}, //4888 #CJK UNIFIED IDEOGRAPH + {0xC0B5, 0x61C7}, //4889 #CJK UNIFIED IDEOGRAPH + {0xC0B6, 0x61E6}, //4890 #CJK UNIFIED IDEOGRAPH + {0xC0B7, 0x61CB}, //4891 #CJK UNIFIED IDEOGRAPH + {0xC0B8, 0x6232}, //4892 #CJK UNIFIED IDEOGRAPH + {0xC0B9, 0x6234}, //4893 #CJK UNIFIED IDEOGRAPH + {0xC0BA, 0x64CE}, //4894 #CJK UNIFIED IDEOGRAPH + {0xC0BB, 0x64CA}, //4895 #CJK UNIFIED IDEOGRAPH + {0xC0BC, 0x64D8}, //4896 #CJK UNIFIED IDEOGRAPH + {0xC0BD, 0x64E0}, //4897 #CJK UNIFIED IDEOGRAPH + {0xC0BE, 0x64F0}, //4898 #CJK UNIFIED IDEOGRAPH + {0xC0BF, 0x64E6}, //4899 #CJK UNIFIED IDEOGRAPH + {0xC0C0, 0x64EC}, //4900 #CJK UNIFIED IDEOGRAPH + {0xC0C1, 0x64F1}, //4901 #CJK UNIFIED IDEOGRAPH + {0xC0C2, 0x64E2}, //4902 #CJK UNIFIED IDEOGRAPH + {0xC0C3, 0x64ED}, //4903 #CJK UNIFIED IDEOGRAPH + {0xC0C4, 0x6582}, //4904 #CJK UNIFIED IDEOGRAPH + {0xC0C5, 0x6583}, //4905 #CJK UNIFIED IDEOGRAPH + {0xC0C6, 0x66D9}, //4906 #CJK UNIFIED IDEOGRAPH + {0xC0C7, 0x66D6}, //4907 #CJK UNIFIED IDEOGRAPH + {0xC0C8, 0x6A80}, //4908 #CJK UNIFIED IDEOGRAPH + {0xC0C9, 0x6A94}, //4909 #CJK UNIFIED IDEOGRAPH + {0xC0CA, 0x6A84}, //4910 #CJK UNIFIED IDEOGRAPH + {0xC0CB, 0x6AA2}, //4911 #CJK UNIFIED IDEOGRAPH + {0xC0CC, 0x6A9C}, //4912 #CJK UNIFIED IDEOGRAPH + {0xC0CD, 0x6ADB}, //4913 #CJK UNIFIED IDEOGRAPH + {0xC0CE, 0x6AA3}, //4914 #CJK UNIFIED IDEOGRAPH + {0xC0CF, 0x6A7E}, //4915 #CJK UNIFIED IDEOGRAPH + {0xC0D0, 0x6A97}, //4916 #CJK UNIFIED IDEOGRAPH + {0xC0D1, 0x6A90}, //4917 #CJK UNIFIED IDEOGRAPH + {0xC0D2, 0x6AA0}, //4918 #CJK UNIFIED IDEOGRAPH + {0xC0D3, 0x6B5C}, //4919 #CJK UNIFIED IDEOGRAPH + {0xC0D4, 0x6BAE}, //4920 #CJK UNIFIED IDEOGRAPH + {0xC0D5, 0x6BDA}, //4921 #CJK UNIFIED IDEOGRAPH + {0xC0D6, 0x6C08}, //4922 #CJK UNIFIED IDEOGRAPH + {0xC0D7, 0x6FD8}, //4923 #CJK UNIFIED IDEOGRAPH + {0xC0D8, 0x6FF1}, //4924 #CJK UNIFIED IDEOGRAPH + {0xC0D9, 0x6FDF}, //4925 #CJK UNIFIED IDEOGRAPH + {0xC0DA, 0x6FE0}, //4926 #CJK UNIFIED IDEOGRAPH + {0xC0DB, 0x6FDB}, //4927 #CJK UNIFIED IDEOGRAPH + {0xC0DC, 0x6FE4}, //4928 #CJK UNIFIED IDEOGRAPH + {0xC0DD, 0x6FEB}, //4929 #CJK UNIFIED IDEOGRAPH + {0xC0DE, 0x6FEF}, //4930 #CJK UNIFIED IDEOGRAPH + {0xC0DF, 0x6F80}, //4931 #CJK UNIFIED IDEOGRAPH + {0xC0E0, 0x6FEC}, //4932 #CJK UNIFIED IDEOGRAPH + {0xC0E1, 0x6FE1}, //4933 #CJK UNIFIED IDEOGRAPH + {0xC0E2, 0x6FE9}, //4934 #CJK UNIFIED IDEOGRAPH + {0xC0E3, 0x6FD5}, //4935 #CJK UNIFIED IDEOGRAPH + {0xC0E4, 0x6FEE}, //4936 #CJK UNIFIED IDEOGRAPH + {0xC0E5, 0x6FF0}, //4937 #CJK UNIFIED IDEOGRAPH + {0xC0E6, 0x71E7}, //4938 #CJK UNIFIED IDEOGRAPH + {0xC0E7, 0x71DF}, //4939 #CJK UNIFIED IDEOGRAPH + {0xC0E8, 0x71EE}, //4940 #CJK UNIFIED IDEOGRAPH + {0xC0E9, 0x71E6}, //4941 #CJK UNIFIED IDEOGRAPH + {0xC0EA, 0x71E5}, //4942 #CJK UNIFIED IDEOGRAPH + {0xC0EB, 0x71ED}, //4943 #CJK UNIFIED IDEOGRAPH + {0xC0EC, 0x71EC}, //4944 #CJK UNIFIED IDEOGRAPH + {0xC0ED, 0x71F4}, //4945 #CJK UNIFIED IDEOGRAPH + {0xC0EE, 0x71E0}, //4946 #CJK UNIFIED IDEOGRAPH + {0xC0EF, 0x7235}, //4947 #CJK UNIFIED IDEOGRAPH + {0xC0F0, 0x7246}, //4948 #CJK UNIFIED IDEOGRAPH + {0xC0F1, 0x7370}, //4949 #CJK UNIFIED IDEOGRAPH + {0xC0F2, 0x7372}, //4950 #CJK UNIFIED IDEOGRAPH + {0xC0F3, 0x74A9}, //4951 #CJK UNIFIED IDEOGRAPH + {0xC0F4, 0x74B0}, //4952 #CJK UNIFIED IDEOGRAPH + {0xC0F5, 0x74A6}, //4953 #CJK UNIFIED IDEOGRAPH + {0xC0F6, 0x74A8}, //4954 #CJK UNIFIED IDEOGRAPH + {0xC0F7, 0x7646}, //4955 #CJK UNIFIED IDEOGRAPH + {0xC0F8, 0x7642}, //4956 #CJK UNIFIED IDEOGRAPH + {0xC0F9, 0x764C}, //4957 #CJK UNIFIED IDEOGRAPH + {0xC0FA, 0x76EA}, //4958 #CJK UNIFIED IDEOGRAPH + {0xC0FB, 0x77B3}, //4959 #CJK UNIFIED IDEOGRAPH + {0xC0FC, 0x77AA}, //4960 #CJK UNIFIED IDEOGRAPH + {0xC0FD, 0x77B0}, //4961 #CJK UNIFIED IDEOGRAPH + {0xC0FE, 0x77AC}, //4962 #CJK UNIFIED IDEOGRAPH + {0xC140, 0x77A7}, //4963 #CJK UNIFIED IDEOGRAPH + {0xC141, 0x77AD}, //4964 #CJK UNIFIED IDEOGRAPH + {0xC142, 0x77EF}, //4965 #CJK UNIFIED IDEOGRAPH + {0xC143, 0x78F7}, //4966 #CJK UNIFIED IDEOGRAPH + {0xC144, 0x78FA}, //4967 #CJK UNIFIED IDEOGRAPH + {0xC145, 0x78F4}, //4968 #CJK UNIFIED IDEOGRAPH + {0xC146, 0x78EF}, //4969 #CJK UNIFIED IDEOGRAPH + {0xC147, 0x7901}, //4970 #CJK UNIFIED IDEOGRAPH + {0xC148, 0x79A7}, //4971 #CJK UNIFIED IDEOGRAPH + {0xC149, 0x79AA}, //4972 #CJK UNIFIED IDEOGRAPH + {0xC14A, 0x7A57}, //4973 #CJK UNIFIED IDEOGRAPH + {0xC14B, 0x7ABF}, //4974 #CJK UNIFIED IDEOGRAPH + {0xC14C, 0x7C07}, //4975 #CJK UNIFIED IDEOGRAPH + {0xC14D, 0x7C0D}, //4976 #CJK UNIFIED IDEOGRAPH + {0xC14E, 0x7BFE}, //4977 #CJK UNIFIED IDEOGRAPH + {0xC14F, 0x7BF7}, //4978 #CJK UNIFIED IDEOGRAPH + {0xC150, 0x7C0C}, //4979 #CJK UNIFIED IDEOGRAPH + {0xC151, 0x7BE0}, //4980 #CJK UNIFIED IDEOGRAPH + {0xC152, 0x7CE0}, //4981 #CJK UNIFIED IDEOGRAPH + {0xC153, 0x7CDC}, //4982 #CJK UNIFIED IDEOGRAPH + {0xC154, 0x7CDE}, //4983 #CJK UNIFIED IDEOGRAPH + {0xC155, 0x7CE2}, //4984 #CJK UNIFIED IDEOGRAPH + {0xC156, 0x7CDF}, //4985 #CJK UNIFIED IDEOGRAPH + {0xC157, 0x7CD9}, //4986 #CJK UNIFIED IDEOGRAPH + {0xC158, 0x7CDD}, //4987 #CJK UNIFIED IDEOGRAPH + {0xC159, 0x7E2E}, //4988 #CJK UNIFIED IDEOGRAPH + {0xC15A, 0x7E3E}, //4989 #CJK UNIFIED IDEOGRAPH + {0xC15B, 0x7E46}, //4990 #CJK UNIFIED IDEOGRAPH + {0xC15C, 0x7E37}, //4991 #CJK UNIFIED IDEOGRAPH + {0xC15D, 0x7E32}, //4992 #CJK UNIFIED IDEOGRAPH + {0xC15E, 0x7E43}, //4993 #CJK UNIFIED IDEOGRAPH + {0xC15F, 0x7E2B}, //4994 #CJK UNIFIED IDEOGRAPH + {0xC160, 0x7E3D}, //4995 #CJK UNIFIED IDEOGRAPH + {0xC161, 0x7E31}, //4996 #CJK UNIFIED IDEOGRAPH + {0xC162, 0x7E45}, //4997 #CJK UNIFIED IDEOGRAPH + {0xC163, 0x7E41}, //4998 #CJK UNIFIED IDEOGRAPH + {0xC164, 0x7E34}, //4999 #CJK UNIFIED IDEOGRAPH + {0xC165, 0x7E39}, //5000 #CJK UNIFIED IDEOGRAPH + {0xC166, 0x7E48}, //5001 #CJK UNIFIED IDEOGRAPH + {0xC167, 0x7E35}, //5002 #CJK UNIFIED IDEOGRAPH + {0xC168, 0x7E3F}, //5003 #CJK UNIFIED IDEOGRAPH + {0xC169, 0x7E2F}, //5004 #CJK UNIFIED IDEOGRAPH + {0xC16A, 0x7F44}, //5005 #CJK UNIFIED IDEOGRAPH + {0xC16B, 0x7FF3}, //5006 #CJK UNIFIED IDEOGRAPH + {0xC16C, 0x7FFC}, //5007 #CJK UNIFIED IDEOGRAPH + {0xC16D, 0x8071}, //5008 #CJK UNIFIED IDEOGRAPH + {0xC16E, 0x8072}, //5009 #CJK UNIFIED IDEOGRAPH + {0xC16F, 0x8070}, //5010 #CJK UNIFIED IDEOGRAPH + {0xC170, 0x806F}, //5011 #CJK UNIFIED IDEOGRAPH + {0xC171, 0x8073}, //5012 #CJK UNIFIED IDEOGRAPH + {0xC172, 0x81C6}, //5013 #CJK UNIFIED IDEOGRAPH + {0xC173, 0x81C3}, //5014 #CJK UNIFIED IDEOGRAPH + {0xC174, 0x81BA}, //5015 #CJK UNIFIED IDEOGRAPH + {0xC175, 0x81C2}, //5016 #CJK UNIFIED IDEOGRAPH + {0xC176, 0x81C0}, //5017 #CJK UNIFIED IDEOGRAPH + {0xC177, 0x81BF}, //5018 #CJK UNIFIED IDEOGRAPH + {0xC178, 0x81BD}, //5019 #CJK UNIFIED IDEOGRAPH + {0xC179, 0x81C9}, //5020 #CJK UNIFIED IDEOGRAPH + {0xC17A, 0x81BE}, //5021 #CJK UNIFIED IDEOGRAPH + {0xC17B, 0x81E8}, //5022 #CJK UNIFIED IDEOGRAPH + {0xC17C, 0x8209}, //5023 #CJK UNIFIED IDEOGRAPH + {0xC17D, 0x8271}, //5024 #CJK UNIFIED IDEOGRAPH + {0xC17E, 0x85AA}, //5025 #CJK UNIFIED IDEOGRAPH + {0xC1A1, 0x8584}, //5026 #CJK UNIFIED IDEOGRAPH + {0xC1A2, 0x857E}, //5027 #CJK UNIFIED IDEOGRAPH + {0xC1A3, 0x859C}, //5028 #CJK UNIFIED IDEOGRAPH + {0xC1A4, 0x8591}, //5029 #CJK UNIFIED IDEOGRAPH + {0xC1A5, 0x8594}, //5030 #CJK UNIFIED IDEOGRAPH + {0xC1A6, 0x85AF}, //5031 #CJK UNIFIED IDEOGRAPH + {0xC1A7, 0x859B}, //5032 #CJK UNIFIED IDEOGRAPH + {0xC1A8, 0x8587}, //5033 #CJK UNIFIED IDEOGRAPH + {0xC1A9, 0x85A8}, //5034 #CJK UNIFIED IDEOGRAPH + {0xC1AA, 0x858A}, //5035 #CJK UNIFIED IDEOGRAPH + {0xC1AB, 0x8667}, //5036 #CJK UNIFIED IDEOGRAPH + {0xC1AC, 0x87C0}, //5037 #CJK UNIFIED IDEOGRAPH + {0xC1AD, 0x87D1}, //5038 #CJK UNIFIED IDEOGRAPH + {0xC1AE, 0x87B3}, //5039 #CJK UNIFIED IDEOGRAPH + {0xC1AF, 0x87D2}, //5040 #CJK UNIFIED IDEOGRAPH + {0xC1B0, 0x87C6}, //5041 #CJK UNIFIED IDEOGRAPH + {0xC1B1, 0x87AB}, //5042 #CJK UNIFIED IDEOGRAPH + {0xC1B2, 0x87BB}, //5043 #CJK UNIFIED IDEOGRAPH + {0xC1B3, 0x87BA}, //5044 #CJK UNIFIED IDEOGRAPH + {0xC1B4, 0x87C8}, //5045 #CJK UNIFIED IDEOGRAPH + {0xC1B5, 0x87CB}, //5046 #CJK UNIFIED IDEOGRAPH + {0xC1B6, 0x893B}, //5047 #CJK UNIFIED IDEOGRAPH + {0xC1B7, 0x8936}, //5048 #CJK UNIFIED IDEOGRAPH + {0xC1B8, 0x8944}, //5049 #CJK UNIFIED IDEOGRAPH + {0xC1B9, 0x8938}, //5050 #CJK UNIFIED IDEOGRAPH + {0xC1BA, 0x893D}, //5051 #CJK UNIFIED IDEOGRAPH + {0xC1BB, 0x89AC}, //5052 #CJK UNIFIED IDEOGRAPH + {0xC1BC, 0x8B0E}, //5053 #CJK UNIFIED IDEOGRAPH + {0xC1BD, 0x8B17}, //5054 #CJK UNIFIED IDEOGRAPH + {0xC1BE, 0x8B19}, //5055 #CJK UNIFIED IDEOGRAPH + {0xC1BF, 0x8B1B}, //5056 #CJK UNIFIED IDEOGRAPH + {0xC1C0, 0x8B0A}, //5057 #CJK UNIFIED IDEOGRAPH + {0xC1C1, 0x8B20}, //5058 #CJK UNIFIED IDEOGRAPH + {0xC1C2, 0x8B1D}, //5059 #CJK UNIFIED IDEOGRAPH + {0xC1C3, 0x8B04}, //5060 #CJK UNIFIED IDEOGRAPH + {0xC1C4, 0x8B10}, //5061 #CJK UNIFIED IDEOGRAPH + {0xC1C5, 0x8C41}, //5062 #CJK UNIFIED IDEOGRAPH + {0xC1C6, 0x8C3F}, //5063 #CJK UNIFIED IDEOGRAPH + {0xC1C7, 0x8C73}, //5064 #CJK UNIFIED IDEOGRAPH + {0xC1C8, 0x8CFA}, //5065 #CJK UNIFIED IDEOGRAPH + {0xC1C9, 0x8CFD}, //5066 #CJK UNIFIED IDEOGRAPH + {0xC1CA, 0x8CFC}, //5067 #CJK UNIFIED IDEOGRAPH + {0xC1CB, 0x8CF8}, //5068 #CJK UNIFIED IDEOGRAPH + {0xC1CC, 0x8CFB}, //5069 #CJK UNIFIED IDEOGRAPH + {0xC1CD, 0x8DA8}, //5070 #CJK UNIFIED IDEOGRAPH + {0xC1CE, 0x8E49}, //5071 #CJK UNIFIED IDEOGRAPH + {0xC1CF, 0x8E4B}, //5072 #CJK UNIFIED IDEOGRAPH + {0xC1D0, 0x8E48}, //5073 #CJK UNIFIED IDEOGRAPH + {0xC1D1, 0x8E4A}, //5074 #CJK UNIFIED IDEOGRAPH + {0xC1D2, 0x8F44}, //5075 #CJK UNIFIED IDEOGRAPH + {0xC1D3, 0x8F3E}, //5076 #CJK UNIFIED IDEOGRAPH + {0xC1D4, 0x8F42}, //5077 #CJK UNIFIED IDEOGRAPH + {0xC1D5, 0x8F45}, //5078 #CJK UNIFIED IDEOGRAPH + {0xC1D6, 0x8F3F}, //5079 #CJK UNIFIED IDEOGRAPH + {0xC1D7, 0x907F}, //5080 #CJK UNIFIED IDEOGRAPH + {0xC1D8, 0x907D}, //5081 #CJK UNIFIED IDEOGRAPH + {0xC1D9, 0x9084}, //5082 #CJK UNIFIED IDEOGRAPH + {0xC1DA, 0x9081}, //5083 #CJK UNIFIED IDEOGRAPH + {0xC1DB, 0x9082}, //5084 #CJK UNIFIED IDEOGRAPH + {0xC1DC, 0x9080}, //5085 #CJK UNIFIED IDEOGRAPH + {0xC1DD, 0x9139}, //5086 #CJK UNIFIED IDEOGRAPH + {0xC1DE, 0x91A3}, //5087 #CJK UNIFIED IDEOGRAPH + {0xC1DF, 0x919E}, //5088 #CJK UNIFIED IDEOGRAPH + {0xC1E0, 0x919C}, //5089 #CJK UNIFIED IDEOGRAPH + {0xC1E1, 0x934D}, //5090 #CJK UNIFIED IDEOGRAPH + {0xC1E2, 0x9382}, //5091 #CJK UNIFIED IDEOGRAPH + {0xC1E3, 0x9328}, //5092 #CJK UNIFIED IDEOGRAPH + {0xC1E4, 0x9375}, //5093 #CJK UNIFIED IDEOGRAPH + {0xC1E5, 0x934A}, //5094 #CJK UNIFIED IDEOGRAPH + {0xC1E6, 0x9365}, //5095 #CJK UNIFIED IDEOGRAPH + {0xC1E7, 0x934B}, //5096 #CJK UNIFIED IDEOGRAPH + {0xC1E8, 0x9318}, //5097 #CJK UNIFIED IDEOGRAPH + {0xC1E9, 0x937E}, //5098 #CJK UNIFIED IDEOGRAPH + {0xC1EA, 0x936C}, //5099 #CJK UNIFIED IDEOGRAPH + {0xC1EB, 0x935B}, //5100 #CJK UNIFIED IDEOGRAPH + {0xC1EC, 0x9370}, //5101 #CJK UNIFIED IDEOGRAPH + {0xC1ED, 0x935A}, //5102 #CJK UNIFIED IDEOGRAPH + {0xC1EE, 0x9354}, //5103 #CJK UNIFIED IDEOGRAPH + {0xC1EF, 0x95CA}, //5104 #CJK UNIFIED IDEOGRAPH + {0xC1F0, 0x95CB}, //5105 #CJK UNIFIED IDEOGRAPH + {0xC1F1, 0x95CC}, //5106 #CJK UNIFIED IDEOGRAPH + {0xC1F2, 0x95C8}, //5107 #CJK UNIFIED IDEOGRAPH + {0xC1F3, 0x95C6}, //5108 #CJK UNIFIED IDEOGRAPH + {0xC1F4, 0x96B1}, //5109 #CJK UNIFIED IDEOGRAPH + {0xC1F5, 0x96B8}, //5110 #CJK UNIFIED IDEOGRAPH + {0xC1F6, 0x96D6}, //5111 #CJK UNIFIED IDEOGRAPH + {0xC1F7, 0x971C}, //5112 #CJK UNIFIED IDEOGRAPH + {0xC1F8, 0x971E}, //5113 #CJK UNIFIED IDEOGRAPH + {0xC1F9, 0x97A0}, //5114 #CJK UNIFIED IDEOGRAPH + {0xC1FA, 0x97D3}, //5115 #CJK UNIFIED IDEOGRAPH + {0xC1FB, 0x9846}, //5116 #CJK UNIFIED IDEOGRAPH + {0xC1FC, 0x98B6}, //5117 #CJK UNIFIED IDEOGRAPH + {0xC1FD, 0x9935}, //5118 #CJK UNIFIED IDEOGRAPH + {0xC1FE, 0x9A01}, //5119 #CJK UNIFIED IDEOGRAPH + {0xC240, 0x99FF}, //5120 #CJK UNIFIED IDEOGRAPH + {0xC241, 0x9BAE}, //5121 #CJK UNIFIED IDEOGRAPH + {0xC242, 0x9BAB}, //5122 #CJK UNIFIED IDEOGRAPH + {0xC243, 0x9BAA}, //5123 #CJK UNIFIED IDEOGRAPH + {0xC244, 0x9BAD}, //5124 #CJK UNIFIED IDEOGRAPH + {0xC245, 0x9D3B}, //5125 #CJK UNIFIED IDEOGRAPH + {0xC246, 0x9D3F}, //5126 #CJK UNIFIED IDEOGRAPH + {0xC247, 0x9E8B}, //5127 #CJK UNIFIED IDEOGRAPH + {0xC248, 0x9ECF}, //5128 #CJK UNIFIED IDEOGRAPH + {0xC249, 0x9EDE}, //5129 #CJK UNIFIED IDEOGRAPH + {0xC24A, 0x9EDC}, //5130 #CJK UNIFIED IDEOGRAPH + {0xC24B, 0x9EDD}, //5131 #CJK UNIFIED IDEOGRAPH + {0xC24C, 0x9EDB}, //5132 #CJK UNIFIED IDEOGRAPH + {0xC24D, 0x9F3E}, //5133 #CJK UNIFIED IDEOGRAPH + {0xC24E, 0x9F4B}, //5134 #CJK UNIFIED IDEOGRAPH + {0xC24F, 0x53E2}, //5135 #CJK UNIFIED IDEOGRAPH + {0xC250, 0x5695}, //5136 #CJK UNIFIED IDEOGRAPH + {0xC251, 0x56AE}, //5137 #CJK UNIFIED IDEOGRAPH + {0xC252, 0x58D9}, //5138 #CJK UNIFIED IDEOGRAPH + {0xC253, 0x58D8}, //5139 #CJK UNIFIED IDEOGRAPH + {0xC254, 0x5B38}, //5140 #CJK UNIFIED IDEOGRAPH + {0xC255, 0x5F5D}, //5141 #CJK UNIFIED IDEOGRAPH + {0xC256, 0x61E3}, //5142 #CJK UNIFIED IDEOGRAPH + {0xC257, 0x6233}, //5143 #CJK UNIFIED IDEOGRAPH + {0xC258, 0x64F4}, //5144 #CJK UNIFIED IDEOGRAPH + {0xC259, 0x64F2}, //5145 #CJK UNIFIED IDEOGRAPH + {0xC25A, 0x64FE}, //5146 #CJK UNIFIED IDEOGRAPH + {0xC25B, 0x6506}, //5147 #CJK UNIFIED IDEOGRAPH + {0xC25C, 0x64FA}, //5148 #CJK UNIFIED IDEOGRAPH + {0xC25D, 0x64FB}, //5149 #CJK UNIFIED IDEOGRAPH + {0xC25E, 0x64F7}, //5150 #CJK UNIFIED IDEOGRAPH + {0xC25F, 0x65B7}, //5151 #CJK UNIFIED IDEOGRAPH + {0xC260, 0x66DC}, //5152 #CJK UNIFIED IDEOGRAPH + {0xC261, 0x6726}, //5153 #CJK UNIFIED IDEOGRAPH + {0xC262, 0x6AB3}, //5154 #CJK UNIFIED IDEOGRAPH + {0xC263, 0x6AAC}, //5155 #CJK UNIFIED IDEOGRAPH + {0xC264, 0x6AC3}, //5156 #CJK UNIFIED IDEOGRAPH + {0xC265, 0x6ABB}, //5157 #CJK UNIFIED IDEOGRAPH + {0xC266, 0x6AB8}, //5158 #CJK UNIFIED IDEOGRAPH + {0xC267, 0x6AC2}, //5159 #CJK UNIFIED IDEOGRAPH + {0xC268, 0x6AAE}, //5160 #CJK UNIFIED IDEOGRAPH + {0xC269, 0x6AAF}, //5161 #CJK UNIFIED IDEOGRAPH + {0xC26A, 0x6B5F}, //5162 #CJK UNIFIED IDEOGRAPH + {0xC26B, 0x6B78}, //5163 #CJK UNIFIED IDEOGRAPH + {0xC26C, 0x6BAF}, //5164 #CJK UNIFIED IDEOGRAPH + {0xC26D, 0x7009}, //5165 #CJK UNIFIED IDEOGRAPH + {0xC26E, 0x700B}, //5166 #CJK UNIFIED IDEOGRAPH + {0xC26F, 0x6FFE}, //5167 #CJK UNIFIED IDEOGRAPH + {0xC270, 0x7006}, //5168 #CJK UNIFIED IDEOGRAPH + {0xC271, 0x6FFA}, //5169 #CJK UNIFIED IDEOGRAPH + {0xC272, 0x7011}, //5170 #CJK UNIFIED IDEOGRAPH + {0xC273, 0x700F}, //5171 #CJK UNIFIED IDEOGRAPH + {0xC274, 0x71FB}, //5172 #CJK UNIFIED IDEOGRAPH + {0xC275, 0x71FC}, //5173 #CJK UNIFIED IDEOGRAPH + {0xC276, 0x71FE}, //5174 #CJK UNIFIED IDEOGRAPH + {0xC277, 0x71F8}, //5175 #CJK UNIFIED IDEOGRAPH + {0xC278, 0x7377}, //5176 #CJK UNIFIED IDEOGRAPH + {0xC279, 0x7375}, //5177 #CJK UNIFIED IDEOGRAPH + {0xC27A, 0x74A7}, //5178 #CJK UNIFIED IDEOGRAPH + {0xC27B, 0x74BF}, //5179 #CJK UNIFIED IDEOGRAPH + {0xC27C, 0x7515}, //5180 #CJK UNIFIED IDEOGRAPH + {0xC27D, 0x7656}, //5181 #CJK UNIFIED IDEOGRAPH + {0xC27E, 0x7658}, //5182 #CJK UNIFIED IDEOGRAPH + {0xC2A1, 0x7652}, //5183 #CJK UNIFIED IDEOGRAPH + {0xC2A2, 0x77BD}, //5184 #CJK UNIFIED IDEOGRAPH + {0xC2A3, 0x77BF}, //5185 #CJK UNIFIED IDEOGRAPH + {0xC2A4, 0x77BB}, //5186 #CJK UNIFIED IDEOGRAPH + {0xC2A5, 0x77BC}, //5187 #CJK UNIFIED IDEOGRAPH + {0xC2A6, 0x790E}, //5188 #CJK UNIFIED IDEOGRAPH + {0xC2A7, 0x79AE}, //5189 #CJK UNIFIED IDEOGRAPH + {0xC2A8, 0x7A61}, //5190 #CJK UNIFIED IDEOGRAPH + {0xC2A9, 0x7A62}, //5191 #CJK UNIFIED IDEOGRAPH + {0xC2AA, 0x7A60}, //5192 #CJK UNIFIED IDEOGRAPH + {0xC2AB, 0x7AC4}, //5193 #CJK UNIFIED IDEOGRAPH + {0xC2AC, 0x7AC5}, //5194 #CJK UNIFIED IDEOGRAPH + {0xC2AD, 0x7C2B}, //5195 #CJK UNIFIED IDEOGRAPH + {0xC2AE, 0x7C27}, //5196 #CJK UNIFIED IDEOGRAPH + {0xC2AF, 0x7C2A}, //5197 #CJK UNIFIED IDEOGRAPH + {0xC2B0, 0x7C1E}, //5198 #CJK UNIFIED IDEOGRAPH + {0xC2B1, 0x7C23}, //5199 #CJK UNIFIED IDEOGRAPH + {0xC2B2, 0x7C21}, //5200 #CJK UNIFIED IDEOGRAPH + {0xC2B3, 0x7CE7}, //5201 #CJK UNIFIED IDEOGRAPH + {0xC2B4, 0x7E54}, //5202 #CJK UNIFIED IDEOGRAPH + {0xC2B5, 0x7E55}, //5203 #CJK UNIFIED IDEOGRAPH + {0xC2B6, 0x7E5E}, //5204 #CJK UNIFIED IDEOGRAPH + {0xC2B7, 0x7E5A}, //5205 #CJK UNIFIED IDEOGRAPH + {0xC2B8, 0x7E61}, //5206 #CJK UNIFIED IDEOGRAPH + {0xC2B9, 0x7E52}, //5207 #CJK UNIFIED IDEOGRAPH + {0xC2BA, 0x7E59}, //5208 #CJK UNIFIED IDEOGRAPH + {0xC2BB, 0x7F48}, //5209 #CJK UNIFIED IDEOGRAPH + {0xC2BC, 0x7FF9}, //5210 #CJK UNIFIED IDEOGRAPH + {0xC2BD, 0x7FFB}, //5211 #CJK UNIFIED IDEOGRAPH + {0xC2BE, 0x8077}, //5212 #CJK UNIFIED IDEOGRAPH + {0xC2BF, 0x8076}, //5213 #CJK UNIFIED IDEOGRAPH + {0xC2C0, 0x81CD}, //5214 #CJK UNIFIED IDEOGRAPH + {0xC2C1, 0x81CF}, //5215 #CJK UNIFIED IDEOGRAPH + {0xC2C2, 0x820A}, //5216 #CJK UNIFIED IDEOGRAPH + {0xC2C3, 0x85CF}, //5217 #CJK UNIFIED IDEOGRAPH + {0xC2C4, 0x85A9}, //5218 #CJK UNIFIED IDEOGRAPH + {0xC2C5, 0x85CD}, //5219 #CJK UNIFIED IDEOGRAPH + {0xC2C6, 0x85D0}, //5220 #CJK UNIFIED IDEOGRAPH + {0xC2C7, 0x85C9}, //5221 #CJK UNIFIED IDEOGRAPH + {0xC2C8, 0x85B0}, //5222 #CJK UNIFIED IDEOGRAPH + {0xC2C9, 0x85BA}, //5223 #CJK UNIFIED IDEOGRAPH + {0xC2CA, 0x85B9}, //5224 #CJK UNIFIED IDEOGRAPH + {0xC2CB, 0x85A6}, //5225 #CJK UNIFIED IDEOGRAPH + {0xC2CC, 0x87EF}, //5226 #CJK UNIFIED IDEOGRAPH + {0xC2CD, 0x87EC}, //5227 #CJK UNIFIED IDEOGRAPH + {0xC2CE, 0x87F2}, //5228 #CJK UNIFIED IDEOGRAPH + {0xC2CF, 0x87E0}, //5229 #CJK UNIFIED IDEOGRAPH + {0xC2D0, 0x8986}, //5230 #CJK UNIFIED IDEOGRAPH + {0xC2D1, 0x89B2}, //5231 #CJK UNIFIED IDEOGRAPH + {0xC2D2, 0x89F4}, //5232 #CJK UNIFIED IDEOGRAPH + {0xC2D3, 0x8B28}, //5233 #CJK UNIFIED IDEOGRAPH + {0xC2D4, 0x8B39}, //5234 #CJK UNIFIED IDEOGRAPH + {0xC2D5, 0x8B2C}, //5235 #CJK UNIFIED IDEOGRAPH + {0xC2D6, 0x8B2B}, //5236 #CJK UNIFIED IDEOGRAPH + {0xC2D7, 0x8C50}, //5237 #CJK UNIFIED IDEOGRAPH + {0xC2D8, 0x8D05}, //5238 #CJK UNIFIED IDEOGRAPH + {0xC2D9, 0x8E59}, //5239 #CJK UNIFIED IDEOGRAPH + {0xC2DA, 0x8E63}, //5240 #CJK UNIFIED IDEOGRAPH + {0xC2DB, 0x8E66}, //5241 #CJK UNIFIED IDEOGRAPH + {0xC2DC, 0x8E64}, //5242 #CJK UNIFIED IDEOGRAPH + {0xC2DD, 0x8E5F}, //5243 #CJK UNIFIED IDEOGRAPH + {0xC2DE, 0x8E55}, //5244 #CJK UNIFIED IDEOGRAPH + {0xC2DF, 0x8EC0}, //5245 #CJK UNIFIED IDEOGRAPH + {0xC2E0, 0x8F49}, //5246 #CJK UNIFIED IDEOGRAPH + {0xC2E1, 0x8F4D}, //5247 #CJK UNIFIED IDEOGRAPH + {0xC2E2, 0x9087}, //5248 #CJK UNIFIED IDEOGRAPH + {0xC2E3, 0x9083}, //5249 #CJK UNIFIED IDEOGRAPH + {0xC2E4, 0x9088}, //5250 #CJK UNIFIED IDEOGRAPH + {0xC2E5, 0x91AB}, //5251 #CJK UNIFIED IDEOGRAPH + {0xC2E6, 0x91AC}, //5252 #CJK UNIFIED IDEOGRAPH + {0xC2E7, 0x91D0}, //5253 #CJK UNIFIED IDEOGRAPH + {0xC2E8, 0x9394}, //5254 #CJK UNIFIED IDEOGRAPH + {0xC2E9, 0x938A}, //5255 #CJK UNIFIED IDEOGRAPH + {0xC2EA, 0x9396}, //5256 #CJK UNIFIED IDEOGRAPH + {0xC2EB, 0x93A2}, //5257 #CJK UNIFIED IDEOGRAPH + {0xC2EC, 0x93B3}, //5258 #CJK UNIFIED IDEOGRAPH + {0xC2ED, 0x93AE}, //5259 #CJK UNIFIED IDEOGRAPH + {0xC2EE, 0x93AC}, //5260 #CJK UNIFIED IDEOGRAPH + {0xC2EF, 0x93B0}, //5261 #CJK UNIFIED IDEOGRAPH + {0xC2F0, 0x9398}, //5262 #CJK UNIFIED IDEOGRAPH + {0xC2F1, 0x939A}, //5263 #CJK UNIFIED IDEOGRAPH + {0xC2F2, 0x9397}, //5264 #CJK UNIFIED IDEOGRAPH + {0xC2F3, 0x95D4}, //5265 #CJK UNIFIED IDEOGRAPH + {0xC2F4, 0x95D6}, //5266 #CJK UNIFIED IDEOGRAPH + {0xC2F5, 0x95D0}, //5267 #CJK UNIFIED IDEOGRAPH + {0xC2F6, 0x95D5}, //5268 #CJK UNIFIED IDEOGRAPH + {0xC2F7, 0x96E2}, //5269 #CJK UNIFIED IDEOGRAPH + {0xC2F8, 0x96DC}, //5270 #CJK UNIFIED IDEOGRAPH + {0xC2F9, 0x96D9}, //5271 #CJK UNIFIED IDEOGRAPH + {0xC2FA, 0x96DB}, //5272 #CJK UNIFIED IDEOGRAPH + {0xC2FB, 0x96DE}, //5273 #CJK UNIFIED IDEOGRAPH + {0xC2FC, 0x9724}, //5274 #CJK UNIFIED IDEOGRAPH + {0xC2FD, 0x97A3}, //5275 #CJK UNIFIED IDEOGRAPH + {0xC2FE, 0x97A6}, //5276 #CJK UNIFIED IDEOGRAPH + {0xC340, 0x97AD}, //5277 #CJK UNIFIED IDEOGRAPH + {0xC341, 0x97F9}, //5278 #CJK UNIFIED IDEOGRAPH + {0xC342, 0x984D}, //5279 #CJK UNIFIED IDEOGRAPH + {0xC343, 0x984F}, //5280 #CJK UNIFIED IDEOGRAPH + {0xC344, 0x984C}, //5281 #CJK UNIFIED IDEOGRAPH + {0xC345, 0x984E}, //5282 #CJK UNIFIED IDEOGRAPH + {0xC346, 0x9853}, //5283 #CJK UNIFIED IDEOGRAPH + {0xC347, 0x98BA}, //5284 #CJK UNIFIED IDEOGRAPH + {0xC348, 0x993E}, //5285 #CJK UNIFIED IDEOGRAPH + {0xC349, 0x993F}, //5286 #CJK UNIFIED IDEOGRAPH + {0xC34A, 0x993D}, //5287 #CJK UNIFIED IDEOGRAPH + {0xC34B, 0x992E}, //5288 #CJK UNIFIED IDEOGRAPH + {0xC34C, 0x99A5}, //5289 #CJK UNIFIED IDEOGRAPH + {0xC34D, 0x9A0E}, //5290 #CJK UNIFIED IDEOGRAPH + {0xC34E, 0x9AC1}, //5291 #CJK UNIFIED IDEOGRAPH + {0xC34F, 0x9B03}, //5292 #CJK UNIFIED IDEOGRAPH + {0xC350, 0x9B06}, //5293 #CJK UNIFIED IDEOGRAPH + {0xC351, 0x9B4F}, //5294 #CJK UNIFIED IDEOGRAPH + {0xC352, 0x9B4E}, //5295 #CJK UNIFIED IDEOGRAPH + {0xC353, 0x9B4D}, //5296 #CJK UNIFIED IDEOGRAPH + {0xC354, 0x9BCA}, //5297 #CJK UNIFIED IDEOGRAPH + {0xC355, 0x9BC9}, //5298 #CJK UNIFIED IDEOGRAPH + {0xC356, 0x9BFD}, //5299 #CJK UNIFIED IDEOGRAPH + {0xC357, 0x9BC8}, //5300 #CJK UNIFIED IDEOGRAPH + {0xC358, 0x9BC0}, //5301 #CJK UNIFIED IDEOGRAPH + {0xC359, 0x9D51}, //5302 #CJK UNIFIED IDEOGRAPH + {0xC35A, 0x9D5D}, //5303 #CJK UNIFIED IDEOGRAPH + {0xC35B, 0x9D60}, //5304 #CJK UNIFIED IDEOGRAPH + {0xC35C, 0x9EE0}, //5305 #CJK UNIFIED IDEOGRAPH + {0xC35D, 0x9F15}, //5306 #CJK UNIFIED IDEOGRAPH + {0xC35E, 0x9F2C}, //5307 #CJK UNIFIED IDEOGRAPH + {0xC35F, 0x5133}, //5308 #CJK UNIFIED IDEOGRAPH + {0xC360, 0x56A5}, //5309 #CJK UNIFIED IDEOGRAPH + {0xC361, 0x58DE}, //5310 #CJK UNIFIED IDEOGRAPH + {0xC362, 0x58DF}, //5311 #CJK UNIFIED IDEOGRAPH + {0xC363, 0x58E2}, //5312 #CJK UNIFIED IDEOGRAPH + {0xC364, 0x5BF5}, //5313 #CJK UNIFIED IDEOGRAPH + {0xC365, 0x9F90}, //5314 #CJK UNIFIED IDEOGRAPH + {0xC366, 0x5EEC}, //5315 #CJK UNIFIED IDEOGRAPH + {0xC367, 0x61F2}, //5316 #CJK UNIFIED IDEOGRAPH + {0xC368, 0x61F7}, //5317 #CJK UNIFIED IDEOGRAPH + {0xC369, 0x61F6}, //5318 #CJK UNIFIED IDEOGRAPH + {0xC36A, 0x61F5}, //5319 #CJK UNIFIED IDEOGRAPH + {0xC36B, 0x6500}, //5320 #CJK UNIFIED IDEOGRAPH + {0xC36C, 0x650F}, //5321 #CJK UNIFIED IDEOGRAPH + {0xC36D, 0x66E0}, //5322 #CJK UNIFIED IDEOGRAPH + {0xC36E, 0x66DD}, //5323 #CJK UNIFIED IDEOGRAPH + {0xC36F, 0x6AE5}, //5324 #CJK UNIFIED IDEOGRAPH + {0xC370, 0x6ADD}, //5325 #CJK UNIFIED IDEOGRAPH + {0xC371, 0x6ADA}, //5326 #CJK UNIFIED IDEOGRAPH + {0xC372, 0x6AD3}, //5327 #CJK UNIFIED IDEOGRAPH + {0xC373, 0x701B}, //5328 #CJK UNIFIED IDEOGRAPH + {0xC374, 0x701F}, //5329 #CJK UNIFIED IDEOGRAPH + {0xC375, 0x7028}, //5330 #CJK UNIFIED IDEOGRAPH + {0xC376, 0x701A}, //5331 #CJK UNIFIED IDEOGRAPH + {0xC377, 0x701D}, //5332 #CJK UNIFIED IDEOGRAPH + {0xC378, 0x7015}, //5333 #CJK UNIFIED IDEOGRAPH + {0xC379, 0x7018}, //5334 #CJK UNIFIED IDEOGRAPH + {0xC37A, 0x7206}, //5335 #CJK UNIFIED IDEOGRAPH + {0xC37B, 0x720D}, //5336 #CJK UNIFIED IDEOGRAPH + {0xC37C, 0x7258}, //5337 #CJK UNIFIED IDEOGRAPH + {0xC37D, 0x72A2}, //5338 #CJK UNIFIED IDEOGRAPH + {0xC37E, 0x7378}, //5339 #CJK UNIFIED IDEOGRAPH + {0xC3A1, 0x737A}, //5340 #CJK UNIFIED IDEOGRAPH + {0xC3A2, 0x74BD}, //5341 #CJK UNIFIED IDEOGRAPH + {0xC3A3, 0x74CA}, //5342 #CJK UNIFIED IDEOGRAPH + {0xC3A4, 0x74E3}, //5343 #CJK UNIFIED IDEOGRAPH + {0xC3A5, 0x7587}, //5344 #CJK UNIFIED IDEOGRAPH + {0xC3A6, 0x7586}, //5345 #CJK UNIFIED IDEOGRAPH + {0xC3A7, 0x765F}, //5346 #CJK UNIFIED IDEOGRAPH + {0xC3A8, 0x7661}, //5347 #CJK UNIFIED IDEOGRAPH + {0xC3A9, 0x77C7}, //5348 #CJK UNIFIED IDEOGRAPH + {0xC3AA, 0x7919}, //5349 #CJK UNIFIED IDEOGRAPH + {0xC3AB, 0x79B1}, //5350 #CJK UNIFIED IDEOGRAPH + {0xC3AC, 0x7A6B}, //5351 #CJK UNIFIED IDEOGRAPH + {0xC3AD, 0x7A69}, //5352 #CJK UNIFIED IDEOGRAPH + {0xC3AE, 0x7C3E}, //5353 #CJK UNIFIED IDEOGRAPH + {0xC3AF, 0x7C3F}, //5354 #CJK UNIFIED IDEOGRAPH + {0xC3B0, 0x7C38}, //5355 #CJK UNIFIED IDEOGRAPH + {0xC3B1, 0x7C3D}, //5356 #CJK UNIFIED IDEOGRAPH + {0xC3B2, 0x7C37}, //5357 #CJK UNIFIED IDEOGRAPH + {0xC3B3, 0x7C40}, //5358 #CJK UNIFIED IDEOGRAPH + {0xC3B4, 0x7E6B}, //5359 #CJK UNIFIED IDEOGRAPH + {0xC3B5, 0x7E6D}, //5360 #CJK UNIFIED IDEOGRAPH + {0xC3B6, 0x7E79}, //5361 #CJK UNIFIED IDEOGRAPH + {0xC3B7, 0x7E69}, //5362 #CJK UNIFIED IDEOGRAPH + {0xC3B8, 0x7E6A}, //5363 #CJK UNIFIED IDEOGRAPH + {0xC3B9, 0x7F85}, //5364 #CJK UNIFIED IDEOGRAPH + {0xC3BA, 0x7E73}, //5365 #CJK UNIFIED IDEOGRAPH + {0xC3BB, 0x7FB6}, //5366 #CJK UNIFIED IDEOGRAPH + {0xC3BC, 0x7FB9}, //5367 #CJK UNIFIED IDEOGRAPH + {0xC3BD, 0x7FB8}, //5368 #CJK UNIFIED IDEOGRAPH + {0xC3BE, 0x81D8}, //5369 #CJK UNIFIED IDEOGRAPH + {0xC3BF, 0x85E9}, //5370 #CJK UNIFIED IDEOGRAPH + {0xC3C0, 0x85DD}, //5371 #CJK UNIFIED IDEOGRAPH + {0xC3C1, 0x85EA}, //5372 #CJK UNIFIED IDEOGRAPH + {0xC3C2, 0x85D5}, //5373 #CJK UNIFIED IDEOGRAPH + {0xC3C3, 0x85E4}, //5374 #CJK UNIFIED IDEOGRAPH + {0xC3C4, 0x85E5}, //5375 #CJK UNIFIED IDEOGRAPH + {0xC3C5, 0x85F7}, //5376 #CJK UNIFIED IDEOGRAPH + {0xC3C6, 0x87FB}, //5377 #CJK UNIFIED IDEOGRAPH + {0xC3C7, 0x8805}, //5378 #CJK UNIFIED IDEOGRAPH + {0xC3C8, 0x880D}, //5379 #CJK UNIFIED IDEOGRAPH + {0xC3C9, 0x87F9}, //5380 #CJK UNIFIED IDEOGRAPH + {0xC3CA, 0x87FE}, //5381 #CJK UNIFIED IDEOGRAPH + {0xC3CB, 0x8960}, //5382 #CJK UNIFIED IDEOGRAPH + {0xC3CC, 0x895F}, //5383 #CJK UNIFIED IDEOGRAPH + {0xC3CD, 0x8956}, //5384 #CJK UNIFIED IDEOGRAPH + {0xC3CE, 0x895E}, //5385 #CJK UNIFIED IDEOGRAPH + {0xC3CF, 0x8B41}, //5386 #CJK UNIFIED IDEOGRAPH + {0xC3D0, 0x8B5C}, //5387 #CJK UNIFIED IDEOGRAPH + {0xC3D1, 0x8B58}, //5388 #CJK UNIFIED IDEOGRAPH + {0xC3D2, 0x8B49}, //5389 #CJK UNIFIED IDEOGRAPH + {0xC3D3, 0x8B5A}, //5390 #CJK UNIFIED IDEOGRAPH + {0xC3D4, 0x8B4E}, //5391 #CJK UNIFIED IDEOGRAPH + {0xC3D5, 0x8B4F}, //5392 #CJK UNIFIED IDEOGRAPH + {0xC3D6, 0x8B46}, //5393 #CJK UNIFIED IDEOGRAPH + {0xC3D7, 0x8B59}, //5394 #CJK UNIFIED IDEOGRAPH + {0xC3D8, 0x8D08}, //5395 #CJK UNIFIED IDEOGRAPH + {0xC3D9, 0x8D0A}, //5396 #CJK UNIFIED IDEOGRAPH + {0xC3DA, 0x8E7C}, //5397 #CJK UNIFIED IDEOGRAPH + {0xC3DB, 0x8E72}, //5398 #CJK UNIFIED IDEOGRAPH + {0xC3DC, 0x8E87}, //5399 #CJK UNIFIED IDEOGRAPH + {0xC3DD, 0x8E76}, //5400 #CJK UNIFIED IDEOGRAPH + {0xC3DE, 0x8E6C}, //5401 #CJK UNIFIED IDEOGRAPH + {0xC3DF, 0x8E7A}, //5402 #CJK UNIFIED IDEOGRAPH + {0xC3E0, 0x8E74}, //5403 #CJK UNIFIED IDEOGRAPH + {0xC3E1, 0x8F54}, //5404 #CJK UNIFIED IDEOGRAPH + {0xC3E2, 0x8F4E}, //5405 #CJK UNIFIED IDEOGRAPH + {0xC3E3, 0x8FAD}, //5406 #CJK UNIFIED IDEOGRAPH + {0xC3E4, 0x908A}, //5407 #CJK UNIFIED IDEOGRAPH + {0xC3E5, 0x908B}, //5408 #CJK UNIFIED IDEOGRAPH + {0xC3E6, 0x91B1}, //5409 #CJK UNIFIED IDEOGRAPH + {0xC3E7, 0x91AE}, //5410 #CJK UNIFIED IDEOGRAPH + {0xC3E8, 0x93E1}, //5411 #CJK UNIFIED IDEOGRAPH + {0xC3E9, 0x93D1}, //5412 #CJK UNIFIED IDEOGRAPH + {0xC3EA, 0x93DF}, //5413 #CJK UNIFIED IDEOGRAPH + {0xC3EB, 0x93C3}, //5414 #CJK UNIFIED IDEOGRAPH + {0xC3EC, 0x93C8}, //5415 #CJK UNIFIED IDEOGRAPH + {0xC3ED, 0x93DC}, //5416 #CJK UNIFIED IDEOGRAPH + {0xC3EE, 0x93DD}, //5417 #CJK UNIFIED IDEOGRAPH + {0xC3EF, 0x93D6}, //5418 #CJK UNIFIED IDEOGRAPH + {0xC3F0, 0x93E2}, //5419 #CJK UNIFIED IDEOGRAPH + {0xC3F1, 0x93CD}, //5420 #CJK UNIFIED IDEOGRAPH + {0xC3F2, 0x93D8}, //5421 #CJK UNIFIED IDEOGRAPH + {0xC3F3, 0x93E4}, //5422 #CJK UNIFIED IDEOGRAPH + {0xC3F4, 0x93D7}, //5423 #CJK UNIFIED IDEOGRAPH + {0xC3F5, 0x93E8}, //5424 #CJK UNIFIED IDEOGRAPH + {0xC3F6, 0x95DC}, //5425 #CJK UNIFIED IDEOGRAPH + {0xC3F7, 0x96B4}, //5426 #CJK UNIFIED IDEOGRAPH + {0xC3F8, 0x96E3}, //5427 #CJK UNIFIED IDEOGRAPH + {0xC3F9, 0x972A}, //5428 #CJK UNIFIED IDEOGRAPH + {0xC3FA, 0x9727}, //5429 #CJK UNIFIED IDEOGRAPH + {0xC3FB, 0x9761}, //5430 #CJK UNIFIED IDEOGRAPH + {0xC3FC, 0x97DC}, //5431 #CJK UNIFIED IDEOGRAPH + {0xC3FD, 0x97FB}, //5432 #CJK UNIFIED IDEOGRAPH + {0xC3FE, 0x985E}, //5433 #CJK UNIFIED IDEOGRAPH + {0xC440, 0x9858}, //5434 #CJK UNIFIED IDEOGRAPH + {0xC441, 0x985B}, //5435 #CJK UNIFIED IDEOGRAPH + {0xC442, 0x98BC}, //5436 #CJK UNIFIED IDEOGRAPH + {0xC443, 0x9945}, //5437 #CJK UNIFIED IDEOGRAPH + {0xC444, 0x9949}, //5438 #CJK UNIFIED IDEOGRAPH + {0xC445, 0x9A16}, //5439 #CJK UNIFIED IDEOGRAPH + {0xC446, 0x9A19}, //5440 #CJK UNIFIED IDEOGRAPH + {0xC447, 0x9B0D}, //5441 #CJK UNIFIED IDEOGRAPH + {0xC448, 0x9BE8}, //5442 #CJK UNIFIED IDEOGRAPH + {0xC449, 0x9BE7}, //5443 #CJK UNIFIED IDEOGRAPH + {0xC44A, 0x9BD6}, //5444 #CJK UNIFIED IDEOGRAPH + {0xC44B, 0x9BDB}, //5445 #CJK UNIFIED IDEOGRAPH + {0xC44C, 0x9D89}, //5446 #CJK UNIFIED IDEOGRAPH + {0xC44D, 0x9D61}, //5447 #CJK UNIFIED IDEOGRAPH + {0xC44E, 0x9D72}, //5448 #CJK UNIFIED IDEOGRAPH + {0xC44F, 0x9D6A}, //5449 #CJK UNIFIED IDEOGRAPH + {0xC450, 0x9D6C}, //5450 #CJK UNIFIED IDEOGRAPH + {0xC451, 0x9E92}, //5451 #CJK UNIFIED IDEOGRAPH + {0xC452, 0x9E97}, //5452 #CJK UNIFIED IDEOGRAPH + {0xC453, 0x9E93}, //5453 #CJK UNIFIED IDEOGRAPH + {0xC454, 0x9EB4}, //5454 #CJK UNIFIED IDEOGRAPH + {0xC455, 0x52F8}, //5455 #CJK UNIFIED IDEOGRAPH + {0xC456, 0x56A8}, //5456 #CJK UNIFIED IDEOGRAPH + {0xC457, 0x56B7}, //5457 #CJK UNIFIED IDEOGRAPH + {0xC458, 0x56B6}, //5458 #CJK UNIFIED IDEOGRAPH + {0xC459, 0x56B4}, //5459 #CJK UNIFIED IDEOGRAPH + {0xC45A, 0x56BC}, //5460 #CJK UNIFIED IDEOGRAPH + {0xC45B, 0x58E4}, //5461 #CJK UNIFIED IDEOGRAPH + {0xC45C, 0x5B40}, //5462 #CJK UNIFIED IDEOGRAPH + {0xC45D, 0x5B43}, //5463 #CJK UNIFIED IDEOGRAPH + {0xC45E, 0x5B7D}, //5464 #CJK UNIFIED IDEOGRAPH + {0xC45F, 0x5BF6}, //5465 #CJK UNIFIED IDEOGRAPH + {0xC460, 0x5DC9}, //5466 #CJK UNIFIED IDEOGRAPH + {0xC461, 0x61F8}, //5467 #CJK UNIFIED IDEOGRAPH + {0xC462, 0x61FA}, //5468 #CJK UNIFIED IDEOGRAPH + {0xC463, 0x6518}, //5469 #CJK UNIFIED IDEOGRAPH + {0xC464, 0x6514}, //5470 #CJK UNIFIED IDEOGRAPH + {0xC465, 0x6519}, //5471 #CJK UNIFIED IDEOGRAPH + {0xC466, 0x66E6}, //5472 #CJK UNIFIED IDEOGRAPH + {0xC467, 0x6727}, //5473 #CJK UNIFIED IDEOGRAPH + {0xC468, 0x6AEC}, //5474 #CJK UNIFIED IDEOGRAPH + {0xC469, 0x703E}, //5475 #CJK UNIFIED IDEOGRAPH + {0xC46A, 0x7030}, //5476 #CJK UNIFIED IDEOGRAPH + {0xC46B, 0x7032}, //5477 #CJK UNIFIED IDEOGRAPH + {0xC46C, 0x7210}, //5478 #CJK UNIFIED IDEOGRAPH + {0xC46D, 0x737B}, //5479 #CJK UNIFIED IDEOGRAPH + {0xC46E, 0x74CF}, //5480 #CJK UNIFIED IDEOGRAPH + {0xC46F, 0x7662}, //5481 #CJK UNIFIED IDEOGRAPH + {0xC470, 0x7665}, //5482 #CJK UNIFIED IDEOGRAPH + {0xC471, 0x7926}, //5483 #CJK UNIFIED IDEOGRAPH + {0xC472, 0x792A}, //5484 #CJK UNIFIED IDEOGRAPH + {0xC473, 0x792C}, //5485 #CJK UNIFIED IDEOGRAPH + {0xC474, 0x792B}, //5486 #CJK UNIFIED IDEOGRAPH + {0xC475, 0x7AC7}, //5487 #CJK UNIFIED IDEOGRAPH + {0xC476, 0x7AF6}, //5488 #CJK UNIFIED IDEOGRAPH + {0xC477, 0x7C4C}, //5489 #CJK UNIFIED IDEOGRAPH + {0xC478, 0x7C43}, //5490 #CJK UNIFIED IDEOGRAPH + {0xC479, 0x7C4D}, //5491 #CJK UNIFIED IDEOGRAPH + {0xC47A, 0x7CEF}, //5492 #CJK UNIFIED IDEOGRAPH + {0xC47B, 0x7CF0}, //5493 #CJK UNIFIED IDEOGRAPH + {0xC47C, 0x8FAE}, //5494 #CJK UNIFIED IDEOGRAPH + {0xC47D, 0x7E7D}, //5495 #CJK UNIFIED IDEOGRAPH + {0xC47E, 0x7E7C}, //5496 #CJK UNIFIED IDEOGRAPH + {0xC4A1, 0x7E82}, //5497 #CJK UNIFIED IDEOGRAPH + {0xC4A2, 0x7F4C}, //5498 #CJK UNIFIED IDEOGRAPH + {0xC4A3, 0x8000}, //5499 #CJK UNIFIED IDEOGRAPH + {0xC4A4, 0x81DA}, //5500 #CJK UNIFIED IDEOGRAPH + {0xC4A5, 0x8266}, //5501 #CJK UNIFIED IDEOGRAPH + {0xC4A6, 0x85FB}, //5502 #CJK UNIFIED IDEOGRAPH + {0xC4A7, 0x85F9}, //5503 #CJK UNIFIED IDEOGRAPH + {0xC4A8, 0x8611}, //5504 #CJK UNIFIED IDEOGRAPH + {0xC4A9, 0x85FA}, //5505 #CJK UNIFIED IDEOGRAPH + {0xC4AA, 0x8606}, //5506 #CJK UNIFIED IDEOGRAPH + {0xC4AB, 0x860B}, //5507 #CJK UNIFIED IDEOGRAPH + {0xC4AC, 0x8607}, //5508 #CJK UNIFIED IDEOGRAPH + {0xC4AD, 0x860A}, //5509 #CJK UNIFIED IDEOGRAPH + {0xC4AE, 0x8814}, //5510 #CJK UNIFIED IDEOGRAPH + {0xC4AF, 0x8815}, //5511 #CJK UNIFIED IDEOGRAPH + {0xC4B0, 0x8964}, //5512 #CJK UNIFIED IDEOGRAPH + {0xC4B1, 0x89BA}, //5513 #CJK UNIFIED IDEOGRAPH + {0xC4B2, 0x89F8}, //5514 #CJK UNIFIED IDEOGRAPH + {0xC4B3, 0x8B70}, //5515 #CJK UNIFIED IDEOGRAPH + {0xC4B4, 0x8B6C}, //5516 #CJK UNIFIED IDEOGRAPH + {0xC4B5, 0x8B66}, //5517 #CJK UNIFIED IDEOGRAPH + {0xC4B6, 0x8B6F}, //5518 #CJK UNIFIED IDEOGRAPH + {0xC4B7, 0x8B5F}, //5519 #CJK UNIFIED IDEOGRAPH + {0xC4B8, 0x8B6B}, //5520 #CJK UNIFIED IDEOGRAPH + {0xC4B9, 0x8D0F}, //5521 #CJK UNIFIED IDEOGRAPH + {0xC4BA, 0x8D0D}, //5522 #CJK UNIFIED IDEOGRAPH + {0xC4BB, 0x8E89}, //5523 #CJK UNIFIED IDEOGRAPH + {0xC4BC, 0x8E81}, //5524 #CJK UNIFIED IDEOGRAPH + {0xC4BD, 0x8E85}, //5525 #CJK UNIFIED IDEOGRAPH + {0xC4BE, 0x8E82}, //5526 #CJK UNIFIED IDEOGRAPH + {0xC4BF, 0x91B4}, //5527 #CJK UNIFIED IDEOGRAPH + {0xC4C0, 0x91CB}, //5528 #CJK UNIFIED IDEOGRAPH + {0xC4C1, 0x9418}, //5529 #CJK UNIFIED IDEOGRAPH + {0xC4C2, 0x9403}, //5530 #CJK UNIFIED IDEOGRAPH + {0xC4C3, 0x93FD}, //5531 #CJK UNIFIED IDEOGRAPH + {0xC4C4, 0x95E1}, //5532 #CJK UNIFIED IDEOGRAPH + {0xC4C5, 0x9730}, //5533 #CJK UNIFIED IDEOGRAPH + {0xC4C6, 0x98C4}, //5534 #CJK UNIFIED IDEOGRAPH + {0xC4C7, 0x9952}, //5535 #CJK UNIFIED IDEOGRAPH + {0xC4C8, 0x9951}, //5536 #CJK UNIFIED IDEOGRAPH + {0xC4C9, 0x99A8}, //5537 #CJK UNIFIED IDEOGRAPH + {0xC4CA, 0x9A2B}, //5538 #CJK UNIFIED IDEOGRAPH + {0xC4CB, 0x9A30}, //5539 #CJK UNIFIED IDEOGRAPH + {0xC4CC, 0x9A37}, //5540 #CJK UNIFIED IDEOGRAPH + {0xC4CD, 0x9A35}, //5541 #CJK UNIFIED IDEOGRAPH + {0xC4CE, 0x9C13}, //5542 #CJK UNIFIED IDEOGRAPH + {0xC4CF, 0x9C0D}, //5543 #CJK UNIFIED IDEOGRAPH + {0xC4D0, 0x9E79}, //5544 #CJK UNIFIED IDEOGRAPH + {0xC4D1, 0x9EB5}, //5545 #CJK UNIFIED IDEOGRAPH + {0xC4D2, 0x9EE8}, //5546 #CJK UNIFIED IDEOGRAPH + {0xC4D3, 0x9F2F}, //5547 #CJK UNIFIED IDEOGRAPH + {0xC4D4, 0x9F5F}, //5548 #CJK UNIFIED IDEOGRAPH + {0xC4D5, 0x9F63}, //5549 #CJK UNIFIED IDEOGRAPH + {0xC4D6, 0x9F61}, //5550 #CJK UNIFIED IDEOGRAPH + {0xC4D7, 0x5137}, //5551 #CJK UNIFIED IDEOGRAPH + {0xC4D8, 0x5138}, //5552 #CJK UNIFIED IDEOGRAPH + {0xC4D9, 0x56C1}, //5553 #CJK UNIFIED IDEOGRAPH + {0xC4DA, 0x56C0}, //5554 #CJK UNIFIED IDEOGRAPH + {0xC4DB, 0x56C2}, //5555 #CJK UNIFIED IDEOGRAPH + {0xC4DC, 0x5914}, //5556 #CJK UNIFIED IDEOGRAPH + {0xC4DD, 0x5C6C}, //5557 #CJK UNIFIED IDEOGRAPH + {0xC4DE, 0x5DCD}, //5558 #CJK UNIFIED IDEOGRAPH + {0xC4DF, 0x61FC}, //5559 #CJK UNIFIED IDEOGRAPH + {0xC4E0, 0x61FE}, //5560 #CJK UNIFIED IDEOGRAPH + {0xC4E1, 0x651D}, //5561 #CJK UNIFIED IDEOGRAPH + {0xC4E2, 0x651C}, //5562 #CJK UNIFIED IDEOGRAPH + {0xC4E3, 0x6595}, //5563 #CJK UNIFIED IDEOGRAPH + {0xC4E4, 0x66E9}, //5564 #CJK UNIFIED IDEOGRAPH + {0xC4E5, 0x6AFB}, //5565 #CJK UNIFIED IDEOGRAPH + {0xC4E6, 0x6B04}, //5566 #CJK UNIFIED IDEOGRAPH + {0xC4E7, 0x6AFA}, //5567 #CJK UNIFIED IDEOGRAPH + {0xC4E8, 0x6BB2}, //5568 #CJK UNIFIED IDEOGRAPH + {0xC4E9, 0x704C}, //5569 #CJK UNIFIED IDEOGRAPH + {0xC4EA, 0x721B}, //5570 #CJK UNIFIED IDEOGRAPH + {0xC4EB, 0x72A7}, //5571 #CJK UNIFIED IDEOGRAPH + {0xC4EC, 0x74D6}, //5572 #CJK UNIFIED IDEOGRAPH + {0xC4ED, 0x74D4}, //5573 #CJK UNIFIED IDEOGRAPH + {0xC4EE, 0x7669}, //5574 #CJK UNIFIED IDEOGRAPH + {0xC4EF, 0x77D3}, //5575 #CJK UNIFIED IDEOGRAPH + {0xC4F0, 0x7C50}, //5576 #CJK UNIFIED IDEOGRAPH + {0xC4F1, 0x7E8F}, //5577 #CJK UNIFIED IDEOGRAPH + {0xC4F2, 0x7E8C}, //5578 #CJK UNIFIED IDEOGRAPH + {0xC4F3, 0x7FBC}, //5579 #CJK UNIFIED IDEOGRAPH + {0xC4F4, 0x8617}, //5580 #CJK UNIFIED IDEOGRAPH + {0xC4F5, 0x862D}, //5581 #CJK UNIFIED IDEOGRAPH + {0xC4F6, 0x861A}, //5582 #CJK UNIFIED IDEOGRAPH + {0xC4F7, 0x8823}, //5583 #CJK UNIFIED IDEOGRAPH + {0xC4F8, 0x8822}, //5584 #CJK UNIFIED IDEOGRAPH + {0xC4F9, 0x8821}, //5585 #CJK UNIFIED IDEOGRAPH + {0xC4FA, 0x881F}, //5586 #CJK UNIFIED IDEOGRAPH + {0xC4FB, 0x896A}, //5587 #CJK UNIFIED IDEOGRAPH + {0xC4FC, 0x896C}, //5588 #CJK UNIFIED IDEOGRAPH + {0xC4FD, 0x89BD}, //5589 #CJK UNIFIED IDEOGRAPH + {0xC4FE, 0x8B74}, //5590 #CJK UNIFIED IDEOGRAPH + {0xC540, 0x8B77}, //5591 #CJK UNIFIED IDEOGRAPH + {0xC541, 0x8B7D}, //5592 #CJK UNIFIED IDEOGRAPH + {0xC542, 0x8D13}, //5593 #CJK UNIFIED IDEOGRAPH + {0xC543, 0x8E8A}, //5594 #CJK UNIFIED IDEOGRAPH + {0xC544, 0x8E8D}, //5595 #CJK UNIFIED IDEOGRAPH + {0xC545, 0x8E8B}, //5596 #CJK UNIFIED IDEOGRAPH + {0xC546, 0x8F5F}, //5597 #CJK UNIFIED IDEOGRAPH + {0xC547, 0x8FAF}, //5598 #CJK UNIFIED IDEOGRAPH + {0xC548, 0x91BA}, //5599 #CJK UNIFIED IDEOGRAPH + {0xC549, 0x942E}, //5600 #CJK UNIFIED IDEOGRAPH + {0xC54A, 0x9433}, //5601 #CJK UNIFIED IDEOGRAPH + {0xC54B, 0x9435}, //5602 #CJK UNIFIED IDEOGRAPH + {0xC54C, 0x943A}, //5603 #CJK UNIFIED IDEOGRAPH + {0xC54D, 0x9438}, //5604 #CJK UNIFIED IDEOGRAPH + {0xC54E, 0x9432}, //5605 #CJK UNIFIED IDEOGRAPH + {0xC54F, 0x942B}, //5606 #CJK UNIFIED IDEOGRAPH + {0xC550, 0x95E2}, //5607 #CJK UNIFIED IDEOGRAPH + {0xC551, 0x9738}, //5608 #CJK UNIFIED IDEOGRAPH + {0xC552, 0x9739}, //5609 #CJK UNIFIED IDEOGRAPH + {0xC553, 0x9732}, //5610 #CJK UNIFIED IDEOGRAPH + {0xC554, 0x97FF}, //5611 #CJK UNIFIED IDEOGRAPH + {0xC555, 0x9867}, //5612 #CJK UNIFIED IDEOGRAPH + {0xC556, 0x9865}, //5613 #CJK UNIFIED IDEOGRAPH + {0xC557, 0x9957}, //5614 #CJK UNIFIED IDEOGRAPH + {0xC558, 0x9A45}, //5615 #CJK UNIFIED IDEOGRAPH + {0xC559, 0x9A43}, //5616 #CJK UNIFIED IDEOGRAPH + {0xC55A, 0x9A40}, //5617 #CJK UNIFIED IDEOGRAPH + {0xC55B, 0x9A3E}, //5618 #CJK UNIFIED IDEOGRAPH + {0xC55C, 0x9ACF}, //5619 #CJK UNIFIED IDEOGRAPH + {0xC55D, 0x9B54}, //5620 #CJK UNIFIED IDEOGRAPH + {0xC55E, 0x9B51}, //5621 #CJK UNIFIED IDEOGRAPH + {0xC55F, 0x9C2D}, //5622 #CJK UNIFIED IDEOGRAPH + {0xC560, 0x9C25}, //5623 #CJK UNIFIED IDEOGRAPH + {0xC561, 0x9DAF}, //5624 #CJK UNIFIED IDEOGRAPH + {0xC562, 0x9DB4}, //5625 #CJK UNIFIED IDEOGRAPH + {0xC563, 0x9DC2}, //5626 #CJK UNIFIED IDEOGRAPH + {0xC564, 0x9DB8}, //5627 #CJK UNIFIED IDEOGRAPH + {0xC565, 0x9E9D}, //5628 #CJK UNIFIED IDEOGRAPH + {0xC566, 0x9EEF}, //5629 #CJK UNIFIED IDEOGRAPH + {0xC567, 0x9F19}, //5630 #CJK UNIFIED IDEOGRAPH + {0xC568, 0x9F5C}, //5631 #CJK UNIFIED IDEOGRAPH + {0xC569, 0x9F66}, //5632 #CJK UNIFIED IDEOGRAPH + {0xC56A, 0x9F67}, //5633 #CJK UNIFIED IDEOGRAPH + {0xC56B, 0x513C}, //5634 #CJK UNIFIED IDEOGRAPH + {0xC56C, 0x513B}, //5635 #CJK UNIFIED IDEOGRAPH + {0xC56D, 0x56C8}, //5636 #CJK UNIFIED IDEOGRAPH + {0xC56E, 0x56CA}, //5637 #CJK UNIFIED IDEOGRAPH + {0xC56F, 0x56C9}, //5638 #CJK UNIFIED IDEOGRAPH + {0xC570, 0x5B7F}, //5639 #CJK UNIFIED IDEOGRAPH + {0xC571, 0x5DD4}, //5640 #CJK UNIFIED IDEOGRAPH + {0xC572, 0x5DD2}, //5641 #CJK UNIFIED IDEOGRAPH + {0xC573, 0x5F4E}, //5642 #CJK UNIFIED IDEOGRAPH + {0xC574, 0x61FF}, //5643 #CJK UNIFIED IDEOGRAPH + {0xC575, 0x6524}, //5644 #CJK UNIFIED IDEOGRAPH + {0xC576, 0x6B0A}, //5645 #CJK UNIFIED IDEOGRAPH + {0xC577, 0x6B61}, //5646 #CJK UNIFIED IDEOGRAPH + {0xC578, 0x7051}, //5647 #CJK UNIFIED IDEOGRAPH + {0xC579, 0x7058}, //5648 #CJK UNIFIED IDEOGRAPH + {0xC57A, 0x7380}, //5649 #CJK UNIFIED IDEOGRAPH + {0xC57B, 0x74E4}, //5650 #CJK UNIFIED IDEOGRAPH + {0xC57C, 0x758A}, //5651 #CJK UNIFIED IDEOGRAPH + {0xC57D, 0x766E}, //5652 #CJK UNIFIED IDEOGRAPH + {0xC57E, 0x766C}, //5653 #CJK UNIFIED IDEOGRAPH + {0xC5A1, 0x79B3}, //5654 #CJK UNIFIED IDEOGRAPH + {0xC5A2, 0x7C60}, //5655 #CJK UNIFIED IDEOGRAPH + {0xC5A3, 0x7C5F}, //5656 #CJK UNIFIED IDEOGRAPH + {0xC5A4, 0x807E}, //5657 #CJK UNIFIED IDEOGRAPH + {0xC5A5, 0x807D}, //5658 #CJK UNIFIED IDEOGRAPH + {0xC5A6, 0x81DF}, //5659 #CJK UNIFIED IDEOGRAPH + {0xC5A7, 0x8972}, //5660 #CJK UNIFIED IDEOGRAPH + {0xC5A8, 0x896F}, //5661 #CJK UNIFIED IDEOGRAPH + {0xC5A9, 0x89FC}, //5662 #CJK UNIFIED IDEOGRAPH + {0xC5AA, 0x8B80}, //5663 #CJK UNIFIED IDEOGRAPH + {0xC5AB, 0x8D16}, //5664 #CJK UNIFIED IDEOGRAPH + {0xC5AC, 0x8D17}, //5665 #CJK UNIFIED IDEOGRAPH + {0xC5AD, 0x8E91}, //5666 #CJK UNIFIED IDEOGRAPH + {0xC5AE, 0x8E93}, //5667 #CJK UNIFIED IDEOGRAPH + {0xC5AF, 0x8F61}, //5668 #CJK UNIFIED IDEOGRAPH + {0xC5B0, 0x9148}, //5669 #CJK UNIFIED IDEOGRAPH + {0xC5B1, 0x9444}, //5670 #CJK UNIFIED IDEOGRAPH + {0xC5B2, 0x9451}, //5671 #CJK UNIFIED IDEOGRAPH + {0xC5B3, 0x9452}, //5672 #CJK UNIFIED IDEOGRAPH + {0xC5B4, 0x973D}, //5673 #CJK UNIFIED IDEOGRAPH + {0xC5B5, 0x973E}, //5674 #CJK UNIFIED IDEOGRAPH + {0xC5B6, 0x97C3}, //5675 #CJK UNIFIED IDEOGRAPH + {0xC5B7, 0x97C1}, //5676 #CJK UNIFIED IDEOGRAPH + {0xC5B8, 0x986B}, //5677 #CJK UNIFIED IDEOGRAPH + {0xC5B9, 0x9955}, //5678 #CJK UNIFIED IDEOGRAPH + {0xC5BA, 0x9A55}, //5679 #CJK UNIFIED IDEOGRAPH + {0xC5BB, 0x9A4D}, //5680 #CJK UNIFIED IDEOGRAPH + {0xC5BC, 0x9AD2}, //5681 #CJK UNIFIED IDEOGRAPH + {0xC5BD, 0x9B1A}, //5682 #CJK UNIFIED IDEOGRAPH + {0xC5BE, 0x9C49}, //5683 #CJK UNIFIED IDEOGRAPH + {0xC5BF, 0x9C31}, //5684 #CJK UNIFIED IDEOGRAPH + {0xC5C0, 0x9C3E}, //5685 #CJK UNIFIED IDEOGRAPH + {0xC5C1, 0x9C3B}, //5686 #CJK UNIFIED IDEOGRAPH + {0xC5C2, 0x9DD3}, //5687 #CJK UNIFIED IDEOGRAPH + {0xC5C3, 0x9DD7}, //5688 #CJK UNIFIED IDEOGRAPH + {0xC5C4, 0x9F34}, //5689 #CJK UNIFIED IDEOGRAPH + {0xC5C5, 0x9F6C}, //5690 #CJK UNIFIED IDEOGRAPH + {0xC5C6, 0x9F6A}, //5691 #CJK UNIFIED IDEOGRAPH + {0xC5C7, 0x9F94}, //5692 #CJK UNIFIED IDEOGRAPH + {0xC5C8, 0x56CC}, //5693 #CJK UNIFIED IDEOGRAPH + {0xC5C9, 0x5DD6}, //5694 #CJK UNIFIED IDEOGRAPH + {0xC5CA, 0x6200}, //5695 #CJK UNIFIED IDEOGRAPH + {0xC5CB, 0x6523}, //5696 #CJK UNIFIED IDEOGRAPH + {0xC5CC, 0x652B}, //5697 #CJK UNIFIED IDEOGRAPH + {0xC5CD, 0x652A}, //5698 #CJK UNIFIED IDEOGRAPH + {0xC5CE, 0x66EC}, //5699 #CJK UNIFIED IDEOGRAPH + {0xC5CF, 0x6B10}, //5700 #CJK UNIFIED IDEOGRAPH + {0xC5D0, 0x74DA}, //5701 #CJK UNIFIED IDEOGRAPH + {0xC5D1, 0x7ACA}, //5702 #CJK UNIFIED IDEOGRAPH + {0xC5D2, 0x7C64}, //5703 #CJK UNIFIED IDEOGRAPH + {0xC5D3, 0x7C63}, //5704 #CJK UNIFIED IDEOGRAPH + {0xC5D4, 0x7C65}, //5705 #CJK UNIFIED IDEOGRAPH + {0xC5D5, 0x7E93}, //5706 #CJK UNIFIED IDEOGRAPH + {0xC5D6, 0x7E96}, //5707 #CJK UNIFIED IDEOGRAPH + {0xC5D7, 0x7E94}, //5708 #CJK UNIFIED IDEOGRAPH + {0xC5D8, 0x81E2}, //5709 #CJK UNIFIED IDEOGRAPH + {0xC5D9, 0x8638}, //5710 #CJK UNIFIED IDEOGRAPH + {0xC5DA, 0x863F}, //5711 #CJK UNIFIED IDEOGRAPH + {0xC5DB, 0x8831}, //5712 #CJK UNIFIED IDEOGRAPH + {0xC5DC, 0x8B8A}, //5713 #CJK UNIFIED IDEOGRAPH + {0xC5DD, 0x9090}, //5714 #CJK UNIFIED IDEOGRAPH + {0xC5DE, 0x908F}, //5715 #CJK UNIFIED IDEOGRAPH + {0xC5DF, 0x9463}, //5716 #CJK UNIFIED IDEOGRAPH + {0xC5E0, 0x9460}, //5717 #CJK UNIFIED IDEOGRAPH + {0xC5E1, 0x9464}, //5718 #CJK UNIFIED IDEOGRAPH + {0xC5E2, 0x9768}, //5719 #CJK UNIFIED IDEOGRAPH + {0xC5E3, 0x986F}, //5720 #CJK UNIFIED IDEOGRAPH + {0xC5E4, 0x995C}, //5721 #CJK UNIFIED IDEOGRAPH + {0xC5E5, 0x9A5A}, //5722 #CJK UNIFIED IDEOGRAPH + {0xC5E6, 0x9A5B}, //5723 #CJK UNIFIED IDEOGRAPH + {0xC5E7, 0x9A57}, //5724 #CJK UNIFIED IDEOGRAPH + {0xC5E8, 0x9AD3}, //5725 #CJK UNIFIED IDEOGRAPH + {0xC5E9, 0x9AD4}, //5726 #CJK UNIFIED IDEOGRAPH + {0xC5EA, 0x9AD1}, //5727 #CJK UNIFIED IDEOGRAPH + {0xC5EB, 0x9C54}, //5728 #CJK UNIFIED IDEOGRAPH + {0xC5EC, 0x9C57}, //5729 #CJK UNIFIED IDEOGRAPH + {0xC5ED, 0x9C56}, //5730 #CJK UNIFIED IDEOGRAPH + {0xC5EE, 0x9DE5}, //5731 #CJK UNIFIED IDEOGRAPH + {0xC5EF, 0x9E9F}, //5732 #CJK UNIFIED IDEOGRAPH + {0xC5F0, 0x9EF4}, //5733 #CJK UNIFIED IDEOGRAPH + {0xC5F1, 0x56D1}, //5734 #CJK UNIFIED IDEOGRAPH + {0xC5F2, 0x58E9}, //5735 #CJK UNIFIED IDEOGRAPH + {0xC5F3, 0x652C}, //5736 #CJK UNIFIED IDEOGRAPH + {0xC5F4, 0x705E}, //5737 #CJK UNIFIED IDEOGRAPH + {0xC5F5, 0x7671}, //5738 #CJK UNIFIED IDEOGRAPH + {0xC5F6, 0x7672}, //5739 #CJK UNIFIED IDEOGRAPH + {0xC5F7, 0x77D7}, //5740 #CJK UNIFIED IDEOGRAPH + {0xC5F8, 0x7F50}, //5741 #CJK UNIFIED IDEOGRAPH + {0xC5F9, 0x7F88}, //5742 #CJK UNIFIED IDEOGRAPH + {0xC5FA, 0x8836}, //5743 #CJK UNIFIED IDEOGRAPH + {0xC5FB, 0x8839}, //5744 #CJK UNIFIED IDEOGRAPH + {0xC5FC, 0x8862}, //5745 #CJK UNIFIED IDEOGRAPH + {0xC5FD, 0x8B93}, //5746 #CJK UNIFIED IDEOGRAPH + {0xC5FE, 0x8B92}, //5747 #CJK UNIFIED IDEOGRAPH + {0xC640, 0x8B96}, //5748 #CJK UNIFIED IDEOGRAPH + {0xC641, 0x8277}, //5749 #CJK UNIFIED IDEOGRAPH + {0xC642, 0x8D1B}, //5750 #CJK UNIFIED IDEOGRAPH + {0xC643, 0x91C0}, //5751 #CJK UNIFIED IDEOGRAPH + {0xC644, 0x946A}, //5752 #CJK UNIFIED IDEOGRAPH + {0xC645, 0x9742}, //5753 #CJK UNIFIED IDEOGRAPH + {0xC646, 0x9748}, //5754 #CJK UNIFIED IDEOGRAPH + {0xC647, 0x9744}, //5755 #CJK UNIFIED IDEOGRAPH + {0xC648, 0x97C6}, //5756 #CJK UNIFIED IDEOGRAPH + {0xC649, 0x9870}, //5757 #CJK UNIFIED IDEOGRAPH + {0xC64A, 0x9A5F}, //5758 #CJK UNIFIED IDEOGRAPH + {0xC64B, 0x9B22}, //5759 #CJK UNIFIED IDEOGRAPH + {0xC64C, 0x9B58}, //5760 #CJK UNIFIED IDEOGRAPH + {0xC64D, 0x9C5F}, //5761 #CJK UNIFIED IDEOGRAPH + {0xC64E, 0x9DF9}, //5762 #CJK UNIFIED IDEOGRAPH + {0xC64F, 0x9DFA}, //5763 #CJK UNIFIED IDEOGRAPH + {0xC650, 0x9E7C}, //5764 #CJK UNIFIED IDEOGRAPH + {0xC651, 0x9E7D}, //5765 #CJK UNIFIED IDEOGRAPH + {0xC652, 0x9F07}, //5766 #CJK UNIFIED IDEOGRAPH + {0xC653, 0x9F77}, //5767 #CJK UNIFIED IDEOGRAPH + {0xC654, 0x9F72}, //5768 #CJK UNIFIED IDEOGRAPH + {0xC655, 0x5EF3}, //5769 #CJK UNIFIED IDEOGRAPH + {0xC656, 0x6B16}, //5770 #CJK UNIFIED IDEOGRAPH + {0xC657, 0x7063}, //5771 #CJK UNIFIED IDEOGRAPH + {0xC658, 0x7C6C}, //5772 #CJK UNIFIED IDEOGRAPH + {0xC659, 0x7C6E}, //5773 #CJK UNIFIED IDEOGRAPH + {0xC65A, 0x883B}, //5774 #CJK UNIFIED IDEOGRAPH + {0xC65B, 0x89C0}, //5775 #CJK UNIFIED IDEOGRAPH + {0xC65C, 0x8EA1}, //5776 #CJK UNIFIED IDEOGRAPH + {0xC65D, 0x91C1}, //5777 #CJK UNIFIED IDEOGRAPH + {0xC65E, 0x9472}, //5778 #CJK UNIFIED IDEOGRAPH + {0xC65F, 0x9470}, //5779 #CJK UNIFIED IDEOGRAPH + {0xC660, 0x9871}, //5780 #CJK UNIFIED IDEOGRAPH + {0xC661, 0x995E}, //5781 #CJK UNIFIED IDEOGRAPH + {0xC662, 0x9AD6}, //5782 #CJK UNIFIED IDEOGRAPH + {0xC663, 0x9B23}, //5783 #CJK UNIFIED IDEOGRAPH + {0xC664, 0x9ECC}, //5784 #CJK UNIFIED IDEOGRAPH + {0xC665, 0x7064}, //5785 #CJK UNIFIED IDEOGRAPH + {0xC666, 0x77DA}, //5786 #CJK UNIFIED IDEOGRAPH + {0xC667, 0x8B9A}, //5787 #CJK UNIFIED IDEOGRAPH + {0xC668, 0x9477}, //5788 #CJK UNIFIED IDEOGRAPH + {0xC669, 0x97C9}, //5789 #CJK UNIFIED IDEOGRAPH + {0xC66A, 0x9A62}, //5790 #CJK UNIFIED IDEOGRAPH + {0xC66B, 0x9A65}, //5791 #CJK UNIFIED IDEOGRAPH + {0xC66C, 0x7E9C}, //5792 #CJK UNIFIED IDEOGRAPH + {0xC66D, 0x8B9C}, //5793 #CJK UNIFIED IDEOGRAPH + {0xC66E, 0x8EAA}, //5794 #CJK UNIFIED IDEOGRAPH + {0xC66F, 0x91C5}, //5795 #CJK UNIFIED IDEOGRAPH + {0xC670, 0x947D}, //5796 #CJK UNIFIED IDEOGRAPH + {0xC671, 0x947E}, //5797 #CJK UNIFIED IDEOGRAPH + {0xC672, 0x947C}, //5798 #CJK UNIFIED IDEOGRAPH + {0xC673, 0x9C77}, //5799 #CJK UNIFIED IDEOGRAPH + {0xC674, 0x9C78}, //5800 #CJK UNIFIED IDEOGRAPH + {0xC675, 0x9EF7}, //5801 #CJK UNIFIED IDEOGRAPH + {0xC676, 0x8C54}, //5802 #CJK UNIFIED IDEOGRAPH + {0xC677, 0x947F}, //5803 #CJK UNIFIED IDEOGRAPH + {0xC678, 0x9E1A}, //5804 #CJK UNIFIED IDEOGRAPH + {0xC679, 0x7228}, //5805 #CJK UNIFIED IDEOGRAPH + {0xC67A, 0x9A6A}, //5806 #CJK UNIFIED IDEOGRAPH + {0xC67B, 0x9B31}, //5807 #CJK UNIFIED IDEOGRAPH + {0xC67C, 0x9E1B}, //5808 #CJK UNIFIED IDEOGRAPH + {0xC67D, 0x9E1E}, //5809 #CJK UNIFIED IDEOGRAPH + {0xC67E, 0x7C72}, //5810 #CJK UNIFIED IDEOGRAPH + {0xC940, 0x4E42}, //5811 #CJK UNIFIED IDEOGRAPH + {0xC941, 0x4E5C}, //5812 #CJK UNIFIED IDEOGRAPH + {0xC942, 0x51F5}, //5813 #CJK UNIFIED IDEOGRAPH + {0xC943, 0x531A}, //5814 #CJK UNIFIED IDEOGRAPH + {0xC944, 0x5382}, //5815 #CJK UNIFIED IDEOGRAPH + {0xC945, 0x4E07}, //5816 #CJK UNIFIED IDEOGRAPH + {0xC946, 0x4E0C}, //5817 #CJK UNIFIED IDEOGRAPH + {0xC947, 0x4E47}, //5818 #CJK UNIFIED IDEOGRAPH + {0xC948, 0x4E8D}, //5819 #CJK UNIFIED IDEOGRAPH + {0xC949, 0x56D7}, //5820 #CJK UNIFIED IDEOGRAPH + {0xC94A, 0xFA0C}, //5821 #CJK COMPATIBILITY IDEOGRAPH + {0xC94B, 0x5C6E}, //5822 #CJK UNIFIED IDEOGRAPH + {0xC94C, 0x5F73}, //5823 #CJK UNIFIED IDEOGRAPH + {0xC94D, 0x4E0F}, //5824 #CJK UNIFIED IDEOGRAPH + {0xC94E, 0x5187}, //5825 #CJK UNIFIED IDEOGRAPH + {0xC94F, 0x4E0E}, //5826 #CJK UNIFIED IDEOGRAPH + {0xC950, 0x4E2E}, //5827 #CJK UNIFIED IDEOGRAPH + {0xC951, 0x4E93}, //5828 #CJK UNIFIED IDEOGRAPH + {0xC952, 0x4EC2}, //5829 #CJK UNIFIED IDEOGRAPH + {0xC953, 0x4EC9}, //5830 #CJK UNIFIED IDEOGRAPH + {0xC954, 0x4EC8}, //5831 #CJK UNIFIED IDEOGRAPH + {0xC955, 0x5198}, //5832 #CJK UNIFIED IDEOGRAPH + {0xC956, 0x52FC}, //5833 #CJK UNIFIED IDEOGRAPH + {0xC957, 0x536C}, //5834 #CJK UNIFIED IDEOGRAPH + {0xC958, 0x53B9}, //5835 #CJK UNIFIED IDEOGRAPH + {0xC959, 0x5720}, //5836 #CJK UNIFIED IDEOGRAPH + {0xC95A, 0x5903}, //5837 #CJK UNIFIED IDEOGRAPH + {0xC95B, 0x592C}, //5838 #CJK UNIFIED IDEOGRAPH + {0xC95C, 0x5C10}, //5839 #CJK UNIFIED IDEOGRAPH + {0xC95D, 0x5DFF}, //5840 #CJK UNIFIED IDEOGRAPH + {0xC95E, 0x65E1}, //5841 #CJK UNIFIED IDEOGRAPH + {0xC95F, 0x6BB3}, //5842 #CJK UNIFIED IDEOGRAPH + {0xC960, 0x6BCC}, //5843 #CJK UNIFIED IDEOGRAPH + {0xC961, 0x6C14}, //5844 #CJK UNIFIED IDEOGRAPH + {0xC962, 0x723F}, //5845 #CJK UNIFIED IDEOGRAPH + {0xC963, 0x4E31}, //5846 #CJK UNIFIED IDEOGRAPH + {0xC964, 0x4E3C}, //5847 #CJK UNIFIED IDEOGRAPH + {0xC965, 0x4EE8}, //5848 #CJK UNIFIED IDEOGRAPH + {0xC966, 0x4EDC}, //5849 #CJK UNIFIED IDEOGRAPH + {0xC967, 0x4EE9}, //5850 #CJK UNIFIED IDEOGRAPH + {0xC968, 0x4EE1}, //5851 #CJK UNIFIED IDEOGRAPH + {0xC969, 0x4EDD}, //5852 #CJK UNIFIED IDEOGRAPH + {0xC96A, 0x4EDA}, //5853 #CJK UNIFIED IDEOGRAPH + {0xC96B, 0x520C}, //5854 #CJK UNIFIED IDEOGRAPH + {0xC96C, 0x531C}, //5855 #CJK UNIFIED IDEOGRAPH + {0xC96D, 0x534C}, //5856 #CJK UNIFIED IDEOGRAPH + {0xC96E, 0x5722}, //5857 #CJK UNIFIED IDEOGRAPH + {0xC96F, 0x5723}, //5858 #CJK UNIFIED IDEOGRAPH + {0xC970, 0x5917}, //5859 #CJK UNIFIED IDEOGRAPH + {0xC971, 0x592F}, //5860 #CJK UNIFIED IDEOGRAPH + {0xC972, 0x5B81}, //5861 #CJK UNIFIED IDEOGRAPH + {0xC973, 0x5B84}, //5862 #CJK UNIFIED IDEOGRAPH + {0xC974, 0x5C12}, //5863 #CJK UNIFIED IDEOGRAPH + {0xC975, 0x5C3B}, //5864 #CJK UNIFIED IDEOGRAPH + {0xC976, 0x5C74}, //5865 #CJK UNIFIED IDEOGRAPH + {0xC977, 0x5C73}, //5866 #CJK UNIFIED IDEOGRAPH + {0xC978, 0x5E04}, //5867 #CJK UNIFIED IDEOGRAPH + {0xC979, 0x5E80}, //5868 #CJK UNIFIED IDEOGRAPH + {0xC97A, 0x5E82}, //5869 #CJK UNIFIED IDEOGRAPH + {0xC97B, 0x5FC9}, //5870 #CJK UNIFIED IDEOGRAPH + {0xC97C, 0x6209}, //5871 #CJK UNIFIED IDEOGRAPH + {0xC97D, 0x6250}, //5872 #CJK UNIFIED IDEOGRAPH + {0xC97E, 0x6C15}, //5873 #CJK UNIFIED IDEOGRAPH + {0xC9A1, 0x6C36}, //5874 #CJK UNIFIED IDEOGRAPH + {0xC9A2, 0x6C43}, //5875 #CJK UNIFIED IDEOGRAPH + {0xC9A3, 0x6C3F}, //5876 #CJK UNIFIED IDEOGRAPH + {0xC9A4, 0x6C3B}, //5877 #CJK UNIFIED IDEOGRAPH + {0xC9A5, 0x72AE}, //5878 #CJK UNIFIED IDEOGRAPH + {0xC9A6, 0x72B0}, //5879 #CJK UNIFIED IDEOGRAPH + {0xC9A7, 0x738A}, //5880 #CJK UNIFIED IDEOGRAPH + {0xC9A8, 0x79B8}, //5881 #CJK UNIFIED IDEOGRAPH + {0xC9A9, 0x808A}, //5882 #CJK UNIFIED IDEOGRAPH + {0xC9AA, 0x961E}, //5883 #CJK UNIFIED IDEOGRAPH + {0xC9AB, 0x4F0E}, //5884 #CJK UNIFIED IDEOGRAPH + {0xC9AC, 0x4F18}, //5885 #CJK UNIFIED IDEOGRAPH + {0xC9AD, 0x4F2C}, //5886 #CJK UNIFIED IDEOGRAPH + {0xC9AE, 0x4EF5}, //5887 #CJK UNIFIED IDEOGRAPH + {0xC9AF, 0x4F14}, //5888 #CJK UNIFIED IDEOGRAPH + {0xC9B0, 0x4EF1}, //5889 #CJK UNIFIED IDEOGRAPH + {0xC9B1, 0x4F00}, //5890 #CJK UNIFIED IDEOGRAPH + {0xC9B2, 0x4EF7}, //5891 #CJK UNIFIED IDEOGRAPH + {0xC9B3, 0x4F08}, //5892 #CJK UNIFIED IDEOGRAPH + {0xC9B4, 0x4F1D}, //5893 #CJK UNIFIED IDEOGRAPH + {0xC9B5, 0x4F02}, //5894 #CJK UNIFIED IDEOGRAPH + {0xC9B6, 0x4F05}, //5895 #CJK UNIFIED IDEOGRAPH + {0xC9B7, 0x4F22}, //5896 #CJK UNIFIED IDEOGRAPH + {0xC9B8, 0x4F13}, //5897 #CJK UNIFIED IDEOGRAPH + {0xC9B9, 0x4F04}, //5898 #CJK UNIFIED IDEOGRAPH + {0xC9BA, 0x4EF4}, //5899 #CJK UNIFIED IDEOGRAPH + {0xC9BB, 0x4F12}, //5900 #CJK UNIFIED IDEOGRAPH + {0xC9BC, 0x51B1}, //5901 #CJK UNIFIED IDEOGRAPH + {0xC9BD, 0x5213}, //5902 #CJK UNIFIED IDEOGRAPH + {0xC9BE, 0x5209}, //5903 #CJK UNIFIED IDEOGRAPH + {0xC9BF, 0x5210}, //5904 #CJK UNIFIED IDEOGRAPH + {0xC9C0, 0x52A6}, //5905 #CJK UNIFIED IDEOGRAPH + {0xC9C1, 0x5322}, //5906 #CJK UNIFIED IDEOGRAPH + {0xC9C2, 0x531F}, //5907 #CJK UNIFIED IDEOGRAPH + {0xC9C3, 0x534D}, //5908 #CJK UNIFIED IDEOGRAPH + {0xC9C4, 0x538A}, //5909 #CJK UNIFIED IDEOGRAPH + {0xC9C5, 0x5407}, //5910 #CJK UNIFIED IDEOGRAPH + {0xC9C6, 0x56E1}, //5911 #CJK UNIFIED IDEOGRAPH + {0xC9C7, 0x56DF}, //5912 #CJK UNIFIED IDEOGRAPH + {0xC9C8, 0x572E}, //5913 #CJK UNIFIED IDEOGRAPH + {0xC9C9, 0x572A}, //5914 #CJK UNIFIED IDEOGRAPH + {0xC9CA, 0x5734}, //5915 #CJK UNIFIED IDEOGRAPH + {0xC9CB, 0x593C}, //5916 #CJK UNIFIED IDEOGRAPH + {0xC9CC, 0x5980}, //5917 #CJK UNIFIED IDEOGRAPH + {0xC9CD, 0x597C}, //5918 #CJK UNIFIED IDEOGRAPH + {0xC9CE, 0x5985}, //5919 #CJK UNIFIED IDEOGRAPH + {0xC9CF, 0x597B}, //5920 #CJK UNIFIED IDEOGRAPH + {0xC9D0, 0x597E}, //5921 #CJK UNIFIED IDEOGRAPH + {0xC9D1, 0x5977}, //5922 #CJK UNIFIED IDEOGRAPH + {0xC9D2, 0x597F}, //5923 #CJK UNIFIED IDEOGRAPH + {0xC9D3, 0x5B56}, //5924 #CJK UNIFIED IDEOGRAPH + {0xC9D4, 0x5C15}, //5925 #CJK UNIFIED IDEOGRAPH + {0xC9D5, 0x5C25}, //5926 #CJK UNIFIED IDEOGRAPH + {0xC9D6, 0x5C7C}, //5927 #CJK UNIFIED IDEOGRAPH + {0xC9D7, 0x5C7A}, //5928 #CJK UNIFIED IDEOGRAPH + {0xC9D8, 0x5C7B}, //5929 #CJK UNIFIED IDEOGRAPH + {0xC9D9, 0x5C7E}, //5930 #CJK UNIFIED IDEOGRAPH + {0xC9DA, 0x5DDF}, //5931 #CJK UNIFIED IDEOGRAPH + {0xC9DB, 0x5E75}, //5932 #CJK UNIFIED IDEOGRAPH + {0xC9DC, 0x5E84}, //5933 #CJK UNIFIED IDEOGRAPH + {0xC9DD, 0x5F02}, //5934 #CJK UNIFIED IDEOGRAPH + {0xC9DE, 0x5F1A}, //5935 #CJK UNIFIED IDEOGRAPH + {0xC9DF, 0x5F74}, //5936 #CJK UNIFIED IDEOGRAPH + {0xC9E0, 0x5FD5}, //5937 #CJK UNIFIED IDEOGRAPH + {0xC9E1, 0x5FD4}, //5938 #CJK UNIFIED IDEOGRAPH + {0xC9E2, 0x5FCF}, //5939 #CJK UNIFIED IDEOGRAPH + {0xC9E3, 0x625C}, //5940 #CJK UNIFIED IDEOGRAPH + {0xC9E4, 0x625E}, //5941 #CJK UNIFIED IDEOGRAPH + {0xC9E5, 0x6264}, //5942 #CJK UNIFIED IDEOGRAPH + {0xC9E6, 0x6261}, //5943 #CJK UNIFIED IDEOGRAPH + {0xC9E7, 0x6266}, //5944 #CJK UNIFIED IDEOGRAPH + {0xC9E8, 0x6262}, //5945 #CJK UNIFIED IDEOGRAPH + {0xC9E9, 0x6259}, //5946 #CJK UNIFIED IDEOGRAPH + {0xC9EA, 0x6260}, //5947 #CJK UNIFIED IDEOGRAPH + {0xC9EB, 0x625A}, //5948 #CJK UNIFIED IDEOGRAPH + {0xC9EC, 0x6265}, //5949 #CJK UNIFIED IDEOGRAPH + {0xC9ED, 0x65EF}, //5950 #CJK UNIFIED IDEOGRAPH + {0xC9EE, 0x65EE}, //5951 #CJK UNIFIED IDEOGRAPH + {0xC9EF, 0x673E}, //5952 #CJK UNIFIED IDEOGRAPH + {0xC9F0, 0x6739}, //5953 #CJK UNIFIED IDEOGRAPH + {0xC9F1, 0x6738}, //5954 #CJK UNIFIED IDEOGRAPH + {0xC9F2, 0x673B}, //5955 #CJK UNIFIED IDEOGRAPH + {0xC9F3, 0x673A}, //5956 #CJK UNIFIED IDEOGRAPH + {0xC9F4, 0x673F}, //5957 #CJK UNIFIED IDEOGRAPH + {0xC9F5, 0x673C}, //5958 #CJK UNIFIED IDEOGRAPH + {0xC9F6, 0x6733}, //5959 #CJK UNIFIED IDEOGRAPH + {0xC9F7, 0x6C18}, //5960 #CJK UNIFIED IDEOGRAPH + {0xC9F8, 0x6C46}, //5961 #CJK UNIFIED IDEOGRAPH + {0xC9F9, 0x6C52}, //5962 #CJK UNIFIED IDEOGRAPH + {0xC9FA, 0x6C5C}, //5963 #CJK UNIFIED IDEOGRAPH + {0xC9FB, 0x6C4F}, //5964 #CJK UNIFIED IDEOGRAPH + {0xC9FC, 0x6C4A}, //5965 #CJK UNIFIED IDEOGRAPH + {0xC9FD, 0x6C54}, //5966 #CJK UNIFIED IDEOGRAPH + {0xC9FE, 0x6C4B}, //5967 #CJK UNIFIED IDEOGRAPH + {0xCA40, 0x6C4C}, //5968 #CJK UNIFIED IDEOGRAPH + {0xCA41, 0x7071}, //5969 #CJK UNIFIED IDEOGRAPH + {0xCA42, 0x725E}, //5970 #CJK UNIFIED IDEOGRAPH + {0xCA43, 0x72B4}, //5971 #CJK UNIFIED IDEOGRAPH + {0xCA44, 0x72B5}, //5972 #CJK UNIFIED IDEOGRAPH + {0xCA45, 0x738E}, //5973 #CJK UNIFIED IDEOGRAPH + {0xCA46, 0x752A}, //5974 #CJK UNIFIED IDEOGRAPH + {0xCA47, 0x767F}, //5975 #CJK UNIFIED IDEOGRAPH + {0xCA48, 0x7A75}, //5976 #CJK UNIFIED IDEOGRAPH + {0xCA49, 0x7F51}, //5977 #CJK UNIFIED IDEOGRAPH + {0xCA4A, 0x8278}, //5978 #CJK UNIFIED IDEOGRAPH + {0xCA4B, 0x827C}, //5979 #CJK UNIFIED IDEOGRAPH + {0xCA4C, 0x8280}, //5980 #CJK UNIFIED IDEOGRAPH + {0xCA4D, 0x827D}, //5981 #CJK UNIFIED IDEOGRAPH + {0xCA4E, 0x827F}, //5982 #CJK UNIFIED IDEOGRAPH + {0xCA4F, 0x864D}, //5983 #CJK UNIFIED IDEOGRAPH + {0xCA50, 0x897E}, //5984 #CJK UNIFIED IDEOGRAPH + {0xCA51, 0x9099}, //5985 #CJK UNIFIED IDEOGRAPH + {0xCA52, 0x9097}, //5986 #CJK UNIFIED IDEOGRAPH + {0xCA53, 0x9098}, //5987 #CJK UNIFIED IDEOGRAPH + {0xCA54, 0x909B}, //5988 #CJK UNIFIED IDEOGRAPH + {0xCA55, 0x9094}, //5989 #CJK UNIFIED IDEOGRAPH + {0xCA56, 0x9622}, //5990 #CJK UNIFIED IDEOGRAPH + {0xCA57, 0x9624}, //5991 #CJK UNIFIED IDEOGRAPH + {0xCA58, 0x9620}, //5992 #CJK UNIFIED IDEOGRAPH + {0xCA59, 0x9623}, //5993 #CJK UNIFIED IDEOGRAPH + {0xCA5A, 0x4F56}, //5994 #CJK UNIFIED IDEOGRAPH + {0xCA5B, 0x4F3B}, //5995 #CJK UNIFIED IDEOGRAPH + {0xCA5C, 0x4F62}, //5996 #CJK UNIFIED IDEOGRAPH + {0xCA5D, 0x4F49}, //5997 #CJK UNIFIED IDEOGRAPH + {0xCA5E, 0x4F53}, //5998 #CJK UNIFIED IDEOGRAPH + {0xCA5F, 0x4F64}, //5999 #CJK UNIFIED IDEOGRAPH + {0xCA60, 0x4F3E}, //6000 #CJK UNIFIED IDEOGRAPH + {0xCA61, 0x4F67}, //6001 #CJK UNIFIED IDEOGRAPH + {0xCA62, 0x4F52}, //6002 #CJK UNIFIED IDEOGRAPH + {0xCA63, 0x4F5F}, //6003 #CJK UNIFIED IDEOGRAPH + {0xCA64, 0x4F41}, //6004 #CJK UNIFIED IDEOGRAPH + {0xCA65, 0x4F58}, //6005 #CJK UNIFIED IDEOGRAPH + {0xCA66, 0x4F2D}, //6006 #CJK UNIFIED IDEOGRAPH + {0xCA67, 0x4F33}, //6007 #CJK UNIFIED IDEOGRAPH + {0xCA68, 0x4F3F}, //6008 #CJK UNIFIED IDEOGRAPH + {0xCA69, 0x4F61}, //6009 #CJK UNIFIED IDEOGRAPH + {0xCA6A, 0x518F}, //6010 #CJK UNIFIED IDEOGRAPH + {0xCA6B, 0x51B9}, //6011 #CJK UNIFIED IDEOGRAPH + {0xCA6C, 0x521C}, //6012 #CJK UNIFIED IDEOGRAPH + {0xCA6D, 0x521E}, //6013 #CJK UNIFIED IDEOGRAPH + {0xCA6E, 0x5221}, //6014 #CJK UNIFIED IDEOGRAPH + {0xCA6F, 0x52AD}, //6015 #CJK UNIFIED IDEOGRAPH + {0xCA70, 0x52AE}, //6016 #CJK UNIFIED IDEOGRAPH + {0xCA71, 0x5309}, //6017 #CJK UNIFIED IDEOGRAPH + {0xCA72, 0x5363}, //6018 #CJK UNIFIED IDEOGRAPH + {0xCA73, 0x5372}, //6019 #CJK UNIFIED IDEOGRAPH + {0xCA74, 0x538E}, //6020 #CJK UNIFIED IDEOGRAPH + {0xCA75, 0x538F}, //6021 #CJK UNIFIED IDEOGRAPH + {0xCA76, 0x5430}, //6022 #CJK UNIFIED IDEOGRAPH + {0xCA77, 0x5437}, //6023 #CJK UNIFIED IDEOGRAPH + {0xCA78, 0x542A}, //6024 #CJK UNIFIED IDEOGRAPH + {0xCA79, 0x5454}, //6025 #CJK UNIFIED IDEOGRAPH + {0xCA7A, 0x5445}, //6026 #CJK UNIFIED IDEOGRAPH + {0xCA7B, 0x5419}, //6027 #CJK UNIFIED IDEOGRAPH + {0xCA7C, 0x541C}, //6028 #CJK UNIFIED IDEOGRAPH + {0xCA7D, 0x5425}, //6029 #CJK UNIFIED IDEOGRAPH + {0xCA7E, 0x5418}, //6030 #CJK UNIFIED IDEOGRAPH + {0xCAA1, 0x543D}, //6031 #CJK UNIFIED IDEOGRAPH + {0xCAA2, 0x544F}, //6032 #CJK UNIFIED IDEOGRAPH + {0xCAA3, 0x5441}, //6033 #CJK UNIFIED IDEOGRAPH + {0xCAA4, 0x5428}, //6034 #CJK UNIFIED IDEOGRAPH + {0xCAA5, 0x5424}, //6035 #CJK UNIFIED IDEOGRAPH + {0xCAA6, 0x5447}, //6036 #CJK UNIFIED IDEOGRAPH + {0xCAA7, 0x56EE}, //6037 #CJK UNIFIED IDEOGRAPH + {0xCAA8, 0x56E7}, //6038 #CJK UNIFIED IDEOGRAPH + {0xCAA9, 0x56E5}, //6039 #CJK UNIFIED IDEOGRAPH + {0xCAAA, 0x5741}, //6040 #CJK UNIFIED IDEOGRAPH + {0xCAAB, 0x5745}, //6041 #CJK UNIFIED IDEOGRAPH + {0xCAAC, 0x574C}, //6042 #CJK UNIFIED IDEOGRAPH + {0xCAAD, 0x5749}, //6043 #CJK UNIFIED IDEOGRAPH + {0xCAAE, 0x574B}, //6044 #CJK UNIFIED IDEOGRAPH + {0xCAAF, 0x5752}, //6045 #CJK UNIFIED IDEOGRAPH + {0xCAB0, 0x5906}, //6046 #CJK UNIFIED IDEOGRAPH + {0xCAB1, 0x5940}, //6047 #CJK UNIFIED IDEOGRAPH + {0xCAB2, 0x59A6}, //6048 #CJK UNIFIED IDEOGRAPH + {0xCAB3, 0x5998}, //6049 #CJK UNIFIED IDEOGRAPH + {0xCAB4, 0x59A0}, //6050 #CJK UNIFIED IDEOGRAPH + {0xCAB5, 0x5997}, //6051 #CJK UNIFIED IDEOGRAPH + {0xCAB6, 0x598E}, //6052 #CJK UNIFIED IDEOGRAPH + {0xCAB7, 0x59A2}, //6053 #CJK UNIFIED IDEOGRAPH + {0xCAB8, 0x5990}, //6054 #CJK UNIFIED IDEOGRAPH + {0xCAB9, 0x598F}, //6055 #CJK UNIFIED IDEOGRAPH + {0xCABA, 0x59A7}, //6056 #CJK UNIFIED IDEOGRAPH + {0xCABB, 0x59A1}, //6057 #CJK UNIFIED IDEOGRAPH + {0xCABC, 0x5B8E}, //6058 #CJK UNIFIED IDEOGRAPH + {0xCABD, 0x5B92}, //6059 #CJK UNIFIED IDEOGRAPH + {0xCABE, 0x5C28}, //6060 #CJK UNIFIED IDEOGRAPH + {0xCABF, 0x5C2A}, //6061 #CJK UNIFIED IDEOGRAPH + {0xCAC0, 0x5C8D}, //6062 #CJK UNIFIED IDEOGRAPH + {0xCAC1, 0x5C8F}, //6063 #CJK UNIFIED IDEOGRAPH + {0xCAC2, 0x5C88}, //6064 #CJK UNIFIED IDEOGRAPH + {0xCAC3, 0x5C8B}, //6065 #CJK UNIFIED IDEOGRAPH + {0xCAC4, 0x5C89}, //6066 #CJK UNIFIED IDEOGRAPH + {0xCAC5, 0x5C92}, //6067 #CJK UNIFIED IDEOGRAPH + {0xCAC6, 0x5C8A}, //6068 #CJK UNIFIED IDEOGRAPH + {0xCAC7, 0x5C86}, //6069 #CJK UNIFIED IDEOGRAPH + {0xCAC8, 0x5C93}, //6070 #CJK UNIFIED IDEOGRAPH + {0xCAC9, 0x5C95}, //6071 #CJK UNIFIED IDEOGRAPH + {0xCACA, 0x5DE0}, //6072 #CJK UNIFIED IDEOGRAPH + {0xCACB, 0x5E0A}, //6073 #CJK UNIFIED IDEOGRAPH + {0xCACC, 0x5E0E}, //6074 #CJK UNIFIED IDEOGRAPH + {0xCACD, 0x5E8B}, //6075 #CJK UNIFIED IDEOGRAPH + {0xCACE, 0x5E89}, //6076 #CJK UNIFIED IDEOGRAPH + {0xCACF, 0x5E8C}, //6077 #CJK UNIFIED IDEOGRAPH + {0xCAD0, 0x5E88}, //6078 #CJK UNIFIED IDEOGRAPH + {0xCAD1, 0x5E8D}, //6079 #CJK UNIFIED IDEOGRAPH + {0xCAD2, 0x5F05}, //6080 #CJK UNIFIED IDEOGRAPH + {0xCAD3, 0x5F1D}, //6081 #CJK UNIFIED IDEOGRAPH + {0xCAD4, 0x5F78}, //6082 #CJK UNIFIED IDEOGRAPH + {0xCAD5, 0x5F76}, //6083 #CJK UNIFIED IDEOGRAPH + {0xCAD6, 0x5FD2}, //6084 #CJK UNIFIED IDEOGRAPH + {0xCAD7, 0x5FD1}, //6085 #CJK UNIFIED IDEOGRAPH + {0xCAD8, 0x5FD0}, //6086 #CJK UNIFIED IDEOGRAPH + {0xCAD9, 0x5FED}, //6087 #CJK UNIFIED IDEOGRAPH + {0xCADA, 0x5FE8}, //6088 #CJK UNIFIED IDEOGRAPH + {0xCADB, 0x5FEE}, //6089 #CJK UNIFIED IDEOGRAPH + {0xCADC, 0x5FF3}, //6090 #CJK UNIFIED IDEOGRAPH + {0xCADD, 0x5FE1}, //6091 #CJK UNIFIED IDEOGRAPH + {0xCADE, 0x5FE4}, //6092 #CJK UNIFIED IDEOGRAPH + {0xCADF, 0x5FE3}, //6093 #CJK UNIFIED IDEOGRAPH + {0xCAE0, 0x5FFA}, //6094 #CJK UNIFIED IDEOGRAPH + {0xCAE1, 0x5FEF}, //6095 #CJK UNIFIED IDEOGRAPH + {0xCAE2, 0x5FF7}, //6096 #CJK UNIFIED IDEOGRAPH + {0xCAE3, 0x5FFB}, //6097 #CJK UNIFIED IDEOGRAPH + {0xCAE4, 0x6000}, //6098 #CJK UNIFIED IDEOGRAPH + {0xCAE5, 0x5FF4}, //6099 #CJK UNIFIED IDEOGRAPH + {0xCAE6, 0x623A}, //6100 #CJK UNIFIED IDEOGRAPH + {0xCAE7, 0x6283}, //6101 #CJK UNIFIED IDEOGRAPH + {0xCAE8, 0x628C}, //6102 #CJK UNIFIED IDEOGRAPH + {0xCAE9, 0x628E}, //6103 #CJK UNIFIED IDEOGRAPH + {0xCAEA, 0x628F}, //6104 #CJK UNIFIED IDEOGRAPH + {0xCAEB, 0x6294}, //6105 #CJK UNIFIED IDEOGRAPH + {0xCAEC, 0x6287}, //6106 #CJK UNIFIED IDEOGRAPH + {0xCAED, 0x6271}, //6107 #CJK UNIFIED IDEOGRAPH + {0xCAEE, 0x627B}, //6108 #CJK UNIFIED IDEOGRAPH + {0xCAEF, 0x627A}, //6109 #CJK UNIFIED IDEOGRAPH + {0xCAF0, 0x6270}, //6110 #CJK UNIFIED IDEOGRAPH + {0xCAF1, 0x6281}, //6111 #CJK UNIFIED IDEOGRAPH + {0xCAF2, 0x6288}, //6112 #CJK UNIFIED IDEOGRAPH + {0xCAF3, 0x6277}, //6113 #CJK UNIFIED IDEOGRAPH + {0xCAF4, 0x627D}, //6114 #CJK UNIFIED IDEOGRAPH + {0xCAF5, 0x6272}, //6115 #CJK UNIFIED IDEOGRAPH + {0xCAF6, 0x6274}, //6116 #CJK UNIFIED IDEOGRAPH + {0xCAF7, 0x6537}, //6117 #CJK UNIFIED IDEOGRAPH + {0xCAF8, 0x65F0}, //6118 #CJK UNIFIED IDEOGRAPH + {0xCAF9, 0x65F4}, //6119 #CJK UNIFIED IDEOGRAPH + {0xCAFA, 0x65F3}, //6120 #CJK UNIFIED IDEOGRAPH + {0xCAFB, 0x65F2}, //6121 #CJK UNIFIED IDEOGRAPH + {0xCAFC, 0x65F5}, //6122 #CJK UNIFIED IDEOGRAPH + {0xCAFD, 0x6745}, //6123 #CJK UNIFIED IDEOGRAPH + {0xCAFE, 0x6747}, //6124 #CJK UNIFIED IDEOGRAPH + {0xCB40, 0x6759}, //6125 #CJK UNIFIED IDEOGRAPH + {0xCB41, 0x6755}, //6126 #CJK UNIFIED IDEOGRAPH + {0xCB42, 0x674C}, //6127 #CJK UNIFIED IDEOGRAPH + {0xCB43, 0x6748}, //6128 #CJK UNIFIED IDEOGRAPH + {0xCB44, 0x675D}, //6129 #CJK UNIFIED IDEOGRAPH + {0xCB45, 0x674D}, //6130 #CJK UNIFIED IDEOGRAPH + {0xCB46, 0x675A}, //6131 #CJK UNIFIED IDEOGRAPH + {0xCB47, 0x674B}, //6132 #CJK UNIFIED IDEOGRAPH + {0xCB48, 0x6BD0}, //6133 #CJK UNIFIED IDEOGRAPH + {0xCB49, 0x6C19}, //6134 #CJK UNIFIED IDEOGRAPH + {0xCB4A, 0x6C1A}, //6135 #CJK UNIFIED IDEOGRAPH + {0xCB4B, 0x6C78}, //6136 #CJK UNIFIED IDEOGRAPH + {0xCB4C, 0x6C67}, //6137 #CJK UNIFIED IDEOGRAPH + {0xCB4D, 0x6C6B}, //6138 #CJK UNIFIED IDEOGRAPH + {0xCB4E, 0x6C84}, //6139 #CJK UNIFIED IDEOGRAPH + {0xCB4F, 0x6C8B}, //6140 #CJK UNIFIED IDEOGRAPH + {0xCB50, 0x6C8F}, //6141 #CJK UNIFIED IDEOGRAPH + {0xCB51, 0x6C71}, //6142 #CJK UNIFIED IDEOGRAPH + {0xCB52, 0x6C6F}, //6143 #CJK UNIFIED IDEOGRAPH + {0xCB53, 0x6C69}, //6144 #CJK UNIFIED IDEOGRAPH + {0xCB54, 0x6C9A}, //6145 #CJK UNIFIED IDEOGRAPH + {0xCB55, 0x6C6D}, //6146 #CJK UNIFIED IDEOGRAPH + {0xCB56, 0x6C87}, //6147 #CJK UNIFIED IDEOGRAPH + {0xCB57, 0x6C95}, //6148 #CJK UNIFIED IDEOGRAPH + {0xCB58, 0x6C9C}, //6149 #CJK UNIFIED IDEOGRAPH + {0xCB59, 0x6C66}, //6150 #CJK UNIFIED IDEOGRAPH + {0xCB5A, 0x6C73}, //6151 #CJK UNIFIED IDEOGRAPH + {0xCB5B, 0x6C65}, //6152 #CJK UNIFIED IDEOGRAPH + {0xCB5C, 0x6C7B}, //6153 #CJK UNIFIED IDEOGRAPH + {0xCB5D, 0x6C8E}, //6154 #CJK UNIFIED IDEOGRAPH + {0xCB5E, 0x7074}, //6155 #CJK UNIFIED IDEOGRAPH + {0xCB5F, 0x707A}, //6156 #CJK UNIFIED IDEOGRAPH + {0xCB60, 0x7263}, //6157 #CJK UNIFIED IDEOGRAPH + {0xCB61, 0x72BF}, //6158 #CJK UNIFIED IDEOGRAPH + {0xCB62, 0x72BD}, //6159 #CJK UNIFIED IDEOGRAPH + {0xCB63, 0x72C3}, //6160 #CJK UNIFIED IDEOGRAPH + {0xCB64, 0x72C6}, //6161 #CJK UNIFIED IDEOGRAPH + {0xCB65, 0x72C1}, //6162 #CJK UNIFIED IDEOGRAPH + {0xCB66, 0x72BA}, //6163 #CJK UNIFIED IDEOGRAPH + {0xCB67, 0x72C5}, //6164 #CJK UNIFIED IDEOGRAPH + {0xCB68, 0x7395}, //6165 #CJK UNIFIED IDEOGRAPH + {0xCB69, 0x7397}, //6166 #CJK UNIFIED IDEOGRAPH + {0xCB6A, 0x7393}, //6167 #CJK UNIFIED IDEOGRAPH + {0xCB6B, 0x7394}, //6168 #CJK UNIFIED IDEOGRAPH + {0xCB6C, 0x7392}, //6169 #CJK UNIFIED IDEOGRAPH + {0xCB6D, 0x753A}, //6170 #CJK UNIFIED IDEOGRAPH + {0xCB6E, 0x7539}, //6171 #CJK UNIFIED IDEOGRAPH + {0xCB6F, 0x7594}, //6172 #CJK UNIFIED IDEOGRAPH + {0xCB70, 0x7595}, //6173 #CJK UNIFIED IDEOGRAPH + {0xCB71, 0x7681}, //6174 #CJK UNIFIED IDEOGRAPH + {0xCB72, 0x793D}, //6175 #CJK UNIFIED IDEOGRAPH + {0xCB73, 0x8034}, //6176 #CJK UNIFIED IDEOGRAPH + {0xCB74, 0x8095}, //6177 #CJK UNIFIED IDEOGRAPH + {0xCB75, 0x8099}, //6178 #CJK UNIFIED IDEOGRAPH + {0xCB76, 0x8090}, //6179 #CJK UNIFIED IDEOGRAPH + {0xCB77, 0x8092}, //6180 #CJK UNIFIED IDEOGRAPH + {0xCB78, 0x809C}, //6181 #CJK UNIFIED IDEOGRAPH + {0xCB79, 0x8290}, //6182 #CJK UNIFIED IDEOGRAPH + {0xCB7A, 0x828F}, //6183 #CJK UNIFIED IDEOGRAPH + {0xCB7B, 0x8285}, //6184 #CJK UNIFIED IDEOGRAPH + {0xCB7C, 0x828E}, //6185 #CJK UNIFIED IDEOGRAPH + {0xCB7D, 0x8291}, //6186 #CJK UNIFIED IDEOGRAPH + {0xCB7E, 0x8293}, //6187 #CJK UNIFIED IDEOGRAPH + {0xCBA1, 0x828A}, //6188 #CJK UNIFIED IDEOGRAPH + {0xCBA2, 0x8283}, //6189 #CJK UNIFIED IDEOGRAPH + {0xCBA3, 0x8284}, //6190 #CJK UNIFIED IDEOGRAPH + {0xCBA4, 0x8C78}, //6191 #CJK UNIFIED IDEOGRAPH + {0xCBA5, 0x8FC9}, //6192 #CJK UNIFIED IDEOGRAPH + {0xCBA6, 0x8FBF}, //6193 #CJK UNIFIED IDEOGRAPH + {0xCBA7, 0x909F}, //6194 #CJK UNIFIED IDEOGRAPH + {0xCBA8, 0x90A1}, //6195 #CJK UNIFIED IDEOGRAPH + {0xCBA9, 0x90A5}, //6196 #CJK UNIFIED IDEOGRAPH + {0xCBAA, 0x909E}, //6197 #CJK UNIFIED IDEOGRAPH + {0xCBAB, 0x90A7}, //6198 #CJK UNIFIED IDEOGRAPH + {0xCBAC, 0x90A0}, //6199 #CJK UNIFIED IDEOGRAPH + {0xCBAD, 0x9630}, //6200 #CJK UNIFIED IDEOGRAPH + {0xCBAE, 0x9628}, //6201 #CJK UNIFIED IDEOGRAPH + {0xCBAF, 0x962F}, //6202 #CJK UNIFIED IDEOGRAPH + {0xCBB0, 0x962D}, //6203 #CJK UNIFIED IDEOGRAPH + {0xCBB1, 0x4E33}, //6204 #CJK UNIFIED IDEOGRAPH + {0xCBB2, 0x4F98}, //6205 #CJK UNIFIED IDEOGRAPH + {0xCBB3, 0x4F7C}, //6206 #CJK UNIFIED IDEOGRAPH + {0xCBB4, 0x4F85}, //6207 #CJK UNIFIED IDEOGRAPH + {0xCBB5, 0x4F7D}, //6208 #CJK UNIFIED IDEOGRAPH + {0xCBB6, 0x4F80}, //6209 #CJK UNIFIED IDEOGRAPH + {0xCBB7, 0x4F87}, //6210 #CJK UNIFIED IDEOGRAPH + {0xCBB8, 0x4F76}, //6211 #CJK UNIFIED IDEOGRAPH + {0xCBB9, 0x4F74}, //6212 #CJK UNIFIED IDEOGRAPH + {0xCBBA, 0x4F89}, //6213 #CJK UNIFIED IDEOGRAPH + {0xCBBB, 0x4F84}, //6214 #CJK UNIFIED IDEOGRAPH + {0xCBBC, 0x4F77}, //6215 #CJK UNIFIED IDEOGRAPH + {0xCBBD, 0x4F4C}, //6216 #CJK UNIFIED IDEOGRAPH + {0xCBBE, 0x4F97}, //6217 #CJK UNIFIED IDEOGRAPH + {0xCBBF, 0x4F6A}, //6218 #CJK UNIFIED IDEOGRAPH + {0xCBC0, 0x4F9A}, //6219 #CJK UNIFIED IDEOGRAPH + {0xCBC1, 0x4F79}, //6220 #CJK UNIFIED IDEOGRAPH + {0xCBC2, 0x4F81}, //6221 #CJK UNIFIED IDEOGRAPH + {0xCBC3, 0x4F78}, //6222 #CJK UNIFIED IDEOGRAPH + {0xCBC4, 0x4F90}, //6223 #CJK UNIFIED IDEOGRAPH + {0xCBC5, 0x4F9C}, //6224 #CJK UNIFIED IDEOGRAPH + {0xCBC6, 0x4F94}, //6225 #CJK UNIFIED IDEOGRAPH + {0xCBC7, 0x4F9E}, //6226 #CJK UNIFIED IDEOGRAPH + {0xCBC8, 0x4F92}, //6227 #CJK UNIFIED IDEOGRAPH + {0xCBC9, 0x4F82}, //6228 #CJK UNIFIED IDEOGRAPH + {0xCBCA, 0x4F95}, //6229 #CJK UNIFIED IDEOGRAPH + {0xCBCB, 0x4F6B}, //6230 #CJK UNIFIED IDEOGRAPH + {0xCBCC, 0x4F6E}, //6231 #CJK UNIFIED IDEOGRAPH + {0xCBCD, 0x519E}, //6232 #CJK UNIFIED IDEOGRAPH + {0xCBCE, 0x51BC}, //6233 #CJK UNIFIED IDEOGRAPH + {0xCBCF, 0x51BE}, //6234 #CJK UNIFIED IDEOGRAPH + {0xCBD0, 0x5235}, //6235 #CJK UNIFIED IDEOGRAPH + {0xCBD1, 0x5232}, //6236 #CJK UNIFIED IDEOGRAPH + {0xCBD2, 0x5233}, //6237 #CJK UNIFIED IDEOGRAPH + {0xCBD3, 0x5246}, //6238 #CJK UNIFIED IDEOGRAPH + {0xCBD4, 0x5231}, //6239 #CJK UNIFIED IDEOGRAPH + {0xCBD5, 0x52BC}, //6240 #CJK UNIFIED IDEOGRAPH + {0xCBD6, 0x530A}, //6241 #CJK UNIFIED IDEOGRAPH + {0xCBD7, 0x530B}, //6242 #CJK UNIFIED IDEOGRAPH + {0xCBD8, 0x533C}, //6243 #CJK UNIFIED IDEOGRAPH + {0xCBD9, 0x5392}, //6244 #CJK UNIFIED IDEOGRAPH + {0xCBDA, 0x5394}, //6245 #CJK UNIFIED IDEOGRAPH + {0xCBDB, 0x5487}, //6246 #CJK UNIFIED IDEOGRAPH + {0xCBDC, 0x547F}, //6247 #CJK UNIFIED IDEOGRAPH + {0xCBDD, 0x5481}, //6248 #CJK UNIFIED IDEOGRAPH + {0xCBDE, 0x5491}, //6249 #CJK UNIFIED IDEOGRAPH + {0xCBDF, 0x5482}, //6250 #CJK UNIFIED IDEOGRAPH + {0xCBE0, 0x5488}, //6251 #CJK UNIFIED IDEOGRAPH + {0xCBE1, 0x546B}, //6252 #CJK UNIFIED IDEOGRAPH + {0xCBE2, 0x547A}, //6253 #CJK UNIFIED IDEOGRAPH + {0xCBE3, 0x547E}, //6254 #CJK UNIFIED IDEOGRAPH + {0xCBE4, 0x5465}, //6255 #CJK UNIFIED IDEOGRAPH + {0xCBE5, 0x546C}, //6256 #CJK UNIFIED IDEOGRAPH + {0xCBE6, 0x5474}, //6257 #CJK UNIFIED IDEOGRAPH + {0xCBE7, 0x5466}, //6258 #CJK UNIFIED IDEOGRAPH + {0xCBE8, 0x548D}, //6259 #CJK UNIFIED IDEOGRAPH + {0xCBE9, 0x546F}, //6260 #CJK UNIFIED IDEOGRAPH + {0xCBEA, 0x5461}, //6261 #CJK UNIFIED IDEOGRAPH + {0xCBEB, 0x5460}, //6262 #CJK UNIFIED IDEOGRAPH + {0xCBEC, 0x5498}, //6263 #CJK UNIFIED IDEOGRAPH + {0xCBED, 0x5463}, //6264 #CJK UNIFIED IDEOGRAPH + {0xCBEE, 0x5467}, //6265 #CJK UNIFIED IDEOGRAPH + {0xCBEF, 0x5464}, //6266 #CJK UNIFIED IDEOGRAPH + {0xCBF0, 0x56F7}, //6267 #CJK UNIFIED IDEOGRAPH + {0xCBF1, 0x56F9}, //6268 #CJK UNIFIED IDEOGRAPH + {0xCBF2, 0x576F}, //6269 #CJK UNIFIED IDEOGRAPH + {0xCBF3, 0x5772}, //6270 #CJK UNIFIED IDEOGRAPH + {0xCBF4, 0x576D}, //6271 #CJK UNIFIED IDEOGRAPH + {0xCBF5, 0x576B}, //6272 #CJK UNIFIED IDEOGRAPH + {0xCBF6, 0x5771}, //6273 #CJK UNIFIED IDEOGRAPH + {0xCBF7, 0x5770}, //6274 #CJK UNIFIED IDEOGRAPH + {0xCBF8, 0x5776}, //6275 #CJK UNIFIED IDEOGRAPH + {0xCBF9, 0x5780}, //6276 #CJK UNIFIED IDEOGRAPH + {0xCBFA, 0x5775}, //6277 #CJK UNIFIED IDEOGRAPH + {0xCBFB, 0x577B}, //6278 #CJK UNIFIED IDEOGRAPH + {0xCBFC, 0x5773}, //6279 #CJK UNIFIED IDEOGRAPH + {0xCBFD, 0x5774}, //6280 #CJK UNIFIED IDEOGRAPH + {0xCBFE, 0x5762}, //6281 #CJK UNIFIED IDEOGRAPH + {0xCC40, 0x5768}, //6282 #CJK UNIFIED IDEOGRAPH + {0xCC41, 0x577D}, //6283 #CJK UNIFIED IDEOGRAPH + {0xCC42, 0x590C}, //6284 #CJK UNIFIED IDEOGRAPH + {0xCC43, 0x5945}, //6285 #CJK UNIFIED IDEOGRAPH + {0xCC44, 0x59B5}, //6286 #CJK UNIFIED IDEOGRAPH + {0xCC45, 0x59BA}, //6287 #CJK UNIFIED IDEOGRAPH + {0xCC46, 0x59CF}, //6288 #CJK UNIFIED IDEOGRAPH + {0xCC47, 0x59CE}, //6289 #CJK UNIFIED IDEOGRAPH + {0xCC48, 0x59B2}, //6290 #CJK UNIFIED IDEOGRAPH + {0xCC49, 0x59CC}, //6291 #CJK UNIFIED IDEOGRAPH + {0xCC4A, 0x59C1}, //6292 #CJK UNIFIED IDEOGRAPH + {0xCC4B, 0x59B6}, //6293 #CJK UNIFIED IDEOGRAPH + {0xCC4C, 0x59BC}, //6294 #CJK UNIFIED IDEOGRAPH + {0xCC4D, 0x59C3}, //6295 #CJK UNIFIED IDEOGRAPH + {0xCC4E, 0x59D6}, //6296 #CJK UNIFIED IDEOGRAPH + {0xCC4F, 0x59B1}, //6297 #CJK UNIFIED IDEOGRAPH + {0xCC50, 0x59BD}, //6298 #CJK UNIFIED IDEOGRAPH + {0xCC51, 0x59C0}, //6299 #CJK UNIFIED IDEOGRAPH + {0xCC52, 0x59C8}, //6300 #CJK UNIFIED IDEOGRAPH + {0xCC53, 0x59B4}, //6301 #CJK UNIFIED IDEOGRAPH + {0xCC54, 0x59C7}, //6302 #CJK UNIFIED IDEOGRAPH + {0xCC55, 0x5B62}, //6303 #CJK UNIFIED IDEOGRAPH + {0xCC56, 0x5B65}, //6304 #CJK UNIFIED IDEOGRAPH + {0xCC57, 0x5B93}, //6305 #CJK UNIFIED IDEOGRAPH + {0xCC58, 0x5B95}, //6306 #CJK UNIFIED IDEOGRAPH + {0xCC59, 0x5C44}, //6307 #CJK UNIFIED IDEOGRAPH + {0xCC5A, 0x5C47}, //6308 #CJK UNIFIED IDEOGRAPH + {0xCC5B, 0x5CAE}, //6309 #CJK UNIFIED IDEOGRAPH + {0xCC5C, 0x5CA4}, //6310 #CJK UNIFIED IDEOGRAPH + {0xCC5D, 0x5CA0}, //6311 #CJK UNIFIED IDEOGRAPH + {0xCC5E, 0x5CB5}, //6312 #CJK UNIFIED IDEOGRAPH + {0xCC5F, 0x5CAF}, //6313 #CJK UNIFIED IDEOGRAPH + {0xCC60, 0x5CA8}, //6314 #CJK UNIFIED IDEOGRAPH + {0xCC61, 0x5CAC}, //6315 #CJK UNIFIED IDEOGRAPH + {0xCC62, 0x5C9F}, //6316 #CJK UNIFIED IDEOGRAPH + {0xCC63, 0x5CA3}, //6317 #CJK UNIFIED IDEOGRAPH + {0xCC64, 0x5CAD}, //6318 #CJK UNIFIED IDEOGRAPH + {0xCC65, 0x5CA2}, //6319 #CJK UNIFIED IDEOGRAPH + {0xCC66, 0x5CAA}, //6320 #CJK UNIFIED IDEOGRAPH + {0xCC67, 0x5CA7}, //6321 #CJK UNIFIED IDEOGRAPH + {0xCC68, 0x5C9D}, //6322 #CJK UNIFIED IDEOGRAPH + {0xCC69, 0x5CA5}, //6323 #CJK UNIFIED IDEOGRAPH + {0xCC6A, 0x5CB6}, //6324 #CJK UNIFIED IDEOGRAPH + {0xCC6B, 0x5CB0}, //6325 #CJK UNIFIED IDEOGRAPH + {0xCC6C, 0x5CA6}, //6326 #CJK UNIFIED IDEOGRAPH + {0xCC6D, 0x5E17}, //6327 #CJK UNIFIED IDEOGRAPH + {0xCC6E, 0x5E14}, //6328 #CJK UNIFIED IDEOGRAPH + {0xCC6F, 0x5E19}, //6329 #CJK UNIFIED IDEOGRAPH + {0xCC70, 0x5F28}, //6330 #CJK UNIFIED IDEOGRAPH + {0xCC71, 0x5F22}, //6331 #CJK UNIFIED IDEOGRAPH + {0xCC72, 0x5F23}, //6332 #CJK UNIFIED IDEOGRAPH + {0xCC73, 0x5F24}, //6333 #CJK UNIFIED IDEOGRAPH + {0xCC74, 0x5F54}, //6334 #CJK UNIFIED IDEOGRAPH + {0xCC75, 0x5F82}, //6335 #CJK UNIFIED IDEOGRAPH + {0xCC76, 0x5F7E}, //6336 #CJK UNIFIED IDEOGRAPH + {0xCC77, 0x5F7D}, //6337 #CJK UNIFIED IDEOGRAPH + {0xCC78, 0x5FDE}, //6338 #CJK UNIFIED IDEOGRAPH + {0xCC79, 0x5FE5}, //6339 #CJK UNIFIED IDEOGRAPH + {0xCC7A, 0x602D}, //6340 #CJK UNIFIED IDEOGRAPH + {0xCC7B, 0x6026}, //6341 #CJK UNIFIED IDEOGRAPH + {0xCC7C, 0x6019}, //6342 #CJK UNIFIED IDEOGRAPH + {0xCC7D, 0x6032}, //6343 #CJK UNIFIED IDEOGRAPH + {0xCC7E, 0x600B}, //6344 #CJK UNIFIED IDEOGRAPH + {0xCCA1, 0x6034}, //6345 #CJK UNIFIED IDEOGRAPH + {0xCCA2, 0x600A}, //6346 #CJK UNIFIED IDEOGRAPH + {0xCCA3, 0x6017}, //6347 #CJK UNIFIED IDEOGRAPH + {0xCCA4, 0x6033}, //6348 #CJK UNIFIED IDEOGRAPH + {0xCCA5, 0x601A}, //6349 #CJK UNIFIED IDEOGRAPH + {0xCCA6, 0x601E}, //6350 #CJK UNIFIED IDEOGRAPH + {0xCCA7, 0x602C}, //6351 #CJK UNIFIED IDEOGRAPH + {0xCCA8, 0x6022}, //6352 #CJK UNIFIED IDEOGRAPH + {0xCCA9, 0x600D}, //6353 #CJK UNIFIED IDEOGRAPH + {0xCCAA, 0x6010}, //6354 #CJK UNIFIED IDEOGRAPH + {0xCCAB, 0x602E}, //6355 #CJK UNIFIED IDEOGRAPH + {0xCCAC, 0x6013}, //6356 #CJK UNIFIED IDEOGRAPH + {0xCCAD, 0x6011}, //6357 #CJK UNIFIED IDEOGRAPH + {0xCCAE, 0x600C}, //6358 #CJK UNIFIED IDEOGRAPH + {0xCCAF, 0x6009}, //6359 #CJK UNIFIED IDEOGRAPH + {0xCCB0, 0x601C}, //6360 #CJK UNIFIED IDEOGRAPH + {0xCCB1, 0x6214}, //6361 #CJK UNIFIED IDEOGRAPH + {0xCCB2, 0x623D}, //6362 #CJK UNIFIED IDEOGRAPH + {0xCCB3, 0x62AD}, //6363 #CJK UNIFIED IDEOGRAPH + {0xCCB4, 0x62B4}, //6364 #CJK UNIFIED IDEOGRAPH + {0xCCB5, 0x62D1}, //6365 #CJK UNIFIED IDEOGRAPH + {0xCCB6, 0x62BE}, //6366 #CJK UNIFIED IDEOGRAPH + {0xCCB7, 0x62AA}, //6367 #CJK UNIFIED IDEOGRAPH + {0xCCB8, 0x62B6}, //6368 #CJK UNIFIED IDEOGRAPH + {0xCCB9, 0x62CA}, //6369 #CJK UNIFIED IDEOGRAPH + {0xCCBA, 0x62AE}, //6370 #CJK UNIFIED IDEOGRAPH + {0xCCBB, 0x62B3}, //6371 #CJK UNIFIED IDEOGRAPH + {0xCCBC, 0x62AF}, //6372 #CJK UNIFIED IDEOGRAPH + {0xCCBD, 0x62BB}, //6373 #CJK UNIFIED IDEOGRAPH + {0xCCBE, 0x62A9}, //6374 #CJK UNIFIED IDEOGRAPH + {0xCCBF, 0x62B0}, //6375 #CJK UNIFIED IDEOGRAPH + {0xCCC0, 0x62B8}, //6376 #CJK UNIFIED IDEOGRAPH + {0xCCC1, 0x653D}, //6377 #CJK UNIFIED IDEOGRAPH + {0xCCC2, 0x65A8}, //6378 #CJK UNIFIED IDEOGRAPH + {0xCCC3, 0x65BB}, //6379 #CJK UNIFIED IDEOGRAPH + {0xCCC4, 0x6609}, //6380 #CJK UNIFIED IDEOGRAPH + {0xCCC5, 0x65FC}, //6381 #CJK UNIFIED IDEOGRAPH + {0xCCC6, 0x6604}, //6382 #CJK UNIFIED IDEOGRAPH + {0xCCC7, 0x6612}, //6383 #CJK UNIFIED IDEOGRAPH + {0xCCC8, 0x6608}, //6384 #CJK UNIFIED IDEOGRAPH + {0xCCC9, 0x65FB}, //6385 #CJK UNIFIED IDEOGRAPH + {0xCCCA, 0x6603}, //6386 #CJK UNIFIED IDEOGRAPH + {0xCCCB, 0x660B}, //6387 #CJK UNIFIED IDEOGRAPH + {0xCCCC, 0x660D}, //6388 #CJK UNIFIED IDEOGRAPH + {0xCCCD, 0x6605}, //6389 #CJK UNIFIED IDEOGRAPH + {0xCCCE, 0x65FD}, //6390 #CJK UNIFIED IDEOGRAPH + {0xCCCF, 0x6611}, //6391 #CJK UNIFIED IDEOGRAPH + {0xCCD0, 0x6610}, //6392 #CJK UNIFIED IDEOGRAPH + {0xCCD1, 0x66F6}, //6393 #CJK UNIFIED IDEOGRAPH + {0xCCD2, 0x670A}, //6394 #CJK UNIFIED IDEOGRAPH + {0xCCD3, 0x6785}, //6395 #CJK UNIFIED IDEOGRAPH + {0xCCD4, 0x676C}, //6396 #CJK UNIFIED IDEOGRAPH + {0xCCD5, 0x678E}, //6397 #CJK UNIFIED IDEOGRAPH + {0xCCD6, 0x6792}, //6398 #CJK UNIFIED IDEOGRAPH + {0xCCD7, 0x6776}, //6399 #CJK UNIFIED IDEOGRAPH + {0xCCD8, 0x677B}, //6400 #CJK UNIFIED IDEOGRAPH + {0xCCD9, 0x6798}, //6401 #CJK UNIFIED IDEOGRAPH + {0xCCDA, 0x6786}, //6402 #CJK UNIFIED IDEOGRAPH + {0xCCDB, 0x6784}, //6403 #CJK UNIFIED IDEOGRAPH + {0xCCDC, 0x6774}, //6404 #CJK UNIFIED IDEOGRAPH + {0xCCDD, 0x678D}, //6405 #CJK UNIFIED IDEOGRAPH + {0xCCDE, 0x678C}, //6406 #CJK UNIFIED IDEOGRAPH + {0xCCDF, 0x677A}, //6407 #CJK UNIFIED IDEOGRAPH + {0xCCE0, 0x679F}, //6408 #CJK UNIFIED IDEOGRAPH + {0xCCE1, 0x6791}, //6409 #CJK UNIFIED IDEOGRAPH + {0xCCE2, 0x6799}, //6410 #CJK UNIFIED IDEOGRAPH + {0xCCE3, 0x6783}, //6411 #CJK UNIFIED IDEOGRAPH + {0xCCE4, 0x677D}, //6412 #CJK UNIFIED IDEOGRAPH + {0xCCE5, 0x6781}, //6413 #CJK UNIFIED IDEOGRAPH + {0xCCE6, 0x6778}, //6414 #CJK UNIFIED IDEOGRAPH + {0xCCE7, 0x6779}, //6415 #CJK UNIFIED IDEOGRAPH + {0xCCE8, 0x6794}, //6416 #CJK UNIFIED IDEOGRAPH + {0xCCE9, 0x6B25}, //6417 #CJK UNIFIED IDEOGRAPH + {0xCCEA, 0x6B80}, //6418 #CJK UNIFIED IDEOGRAPH + {0xCCEB, 0x6B7E}, //6419 #CJK UNIFIED IDEOGRAPH + {0xCCEC, 0x6BDE}, //6420 #CJK UNIFIED IDEOGRAPH + {0xCCED, 0x6C1D}, //6421 #CJK UNIFIED IDEOGRAPH + {0xCCEE, 0x6C93}, //6422 #CJK UNIFIED IDEOGRAPH + {0xCCEF, 0x6CEC}, //6423 #CJK UNIFIED IDEOGRAPH + {0xCCF0, 0x6CEB}, //6424 #CJK UNIFIED IDEOGRAPH + {0xCCF1, 0x6CEE}, //6425 #CJK UNIFIED IDEOGRAPH + {0xCCF2, 0x6CD9}, //6426 #CJK UNIFIED IDEOGRAPH + {0xCCF3, 0x6CB6}, //6427 #CJK UNIFIED IDEOGRAPH + {0xCCF4, 0x6CD4}, //6428 #CJK UNIFIED IDEOGRAPH + {0xCCF5, 0x6CAD}, //6429 #CJK UNIFIED IDEOGRAPH + {0xCCF6, 0x6CE7}, //6430 #CJK UNIFIED IDEOGRAPH + {0xCCF7, 0x6CB7}, //6431 #CJK UNIFIED IDEOGRAPH + {0xCCF8, 0x6CD0}, //6432 #CJK UNIFIED IDEOGRAPH + {0xCCF9, 0x6CC2}, //6433 #CJK UNIFIED IDEOGRAPH + {0xCCFA, 0x6CBA}, //6434 #CJK UNIFIED IDEOGRAPH + {0xCCFB, 0x6CC3}, //6435 #CJK UNIFIED IDEOGRAPH + {0xCCFC, 0x6CC6}, //6436 #CJK UNIFIED IDEOGRAPH + {0xCCFD, 0x6CED}, //6437 #CJK UNIFIED IDEOGRAPH + {0xCCFE, 0x6CF2}, //6438 #CJK UNIFIED IDEOGRAPH + {0xCD40, 0x6CD2}, //6439 #CJK UNIFIED IDEOGRAPH + {0xCD41, 0x6CDD}, //6440 #CJK UNIFIED IDEOGRAPH + {0xCD42, 0x6CB4}, //6441 #CJK UNIFIED IDEOGRAPH + {0xCD43, 0x6C8A}, //6442 #CJK UNIFIED IDEOGRAPH + {0xCD44, 0x6C9D}, //6443 #CJK UNIFIED IDEOGRAPH + {0xCD45, 0x6C80}, //6444 #CJK UNIFIED IDEOGRAPH + {0xCD46, 0x6CDE}, //6445 #CJK UNIFIED IDEOGRAPH + {0xCD47, 0x6CC0}, //6446 #CJK UNIFIED IDEOGRAPH + {0xCD48, 0x6D30}, //6447 #CJK UNIFIED IDEOGRAPH + {0xCD49, 0x6CCD}, //6448 #CJK UNIFIED IDEOGRAPH + {0xCD4A, 0x6CC7}, //6449 #CJK UNIFIED IDEOGRAPH + {0xCD4B, 0x6CB0}, //6450 #CJK UNIFIED IDEOGRAPH + {0xCD4C, 0x6CF9}, //6451 #CJK UNIFIED IDEOGRAPH + {0xCD4D, 0x6CCF}, //6452 #CJK UNIFIED IDEOGRAPH + {0xCD4E, 0x6CE9}, //6453 #CJK UNIFIED IDEOGRAPH + {0xCD4F, 0x6CD1}, //6454 #CJK UNIFIED IDEOGRAPH + {0xCD50, 0x7094}, //6455 #CJK UNIFIED IDEOGRAPH + {0xCD51, 0x7098}, //6456 #CJK UNIFIED IDEOGRAPH + {0xCD52, 0x7085}, //6457 #CJK UNIFIED IDEOGRAPH + {0xCD53, 0x7093}, //6458 #CJK UNIFIED IDEOGRAPH + {0xCD54, 0x7086}, //6459 #CJK UNIFIED IDEOGRAPH + {0xCD55, 0x7084}, //6460 #CJK UNIFIED IDEOGRAPH + {0xCD56, 0x7091}, //6461 #CJK UNIFIED IDEOGRAPH + {0xCD57, 0x7096}, //6462 #CJK UNIFIED IDEOGRAPH + {0xCD58, 0x7082}, //6463 #CJK UNIFIED IDEOGRAPH + {0xCD59, 0x709A}, //6464 #CJK UNIFIED IDEOGRAPH + {0xCD5A, 0x7083}, //6465 #CJK UNIFIED IDEOGRAPH + {0xCD5B, 0x726A}, //6466 #CJK UNIFIED IDEOGRAPH + {0xCD5C, 0x72D6}, //6467 #CJK UNIFIED IDEOGRAPH + {0xCD5D, 0x72CB}, //6468 #CJK UNIFIED IDEOGRAPH + {0xCD5E, 0x72D8}, //6469 #CJK UNIFIED IDEOGRAPH + {0xCD5F, 0x72C9}, //6470 #CJK UNIFIED IDEOGRAPH + {0xCD60, 0x72DC}, //6471 #CJK UNIFIED IDEOGRAPH + {0xCD61, 0x72D2}, //6472 #CJK UNIFIED IDEOGRAPH + {0xCD62, 0x72D4}, //6473 #CJK UNIFIED IDEOGRAPH + {0xCD63, 0x72DA}, //6474 #CJK UNIFIED IDEOGRAPH + {0xCD64, 0x72CC}, //6475 #CJK UNIFIED IDEOGRAPH + {0xCD65, 0x72D1}, //6476 #CJK UNIFIED IDEOGRAPH + {0xCD66, 0x73A4}, //6477 #CJK UNIFIED IDEOGRAPH + {0xCD67, 0x73A1}, //6478 #CJK UNIFIED IDEOGRAPH + {0xCD68, 0x73AD}, //6479 #CJK UNIFIED IDEOGRAPH + {0xCD69, 0x73A6}, //6480 #CJK UNIFIED IDEOGRAPH + {0xCD6A, 0x73A2}, //6481 #CJK UNIFIED IDEOGRAPH + {0xCD6B, 0x73A0}, //6482 #CJK UNIFIED IDEOGRAPH + {0xCD6C, 0x73AC}, //6483 #CJK UNIFIED IDEOGRAPH + {0xCD6D, 0x739D}, //6484 #CJK UNIFIED IDEOGRAPH + {0xCD6E, 0x74DD}, //6485 #CJK UNIFIED IDEOGRAPH + {0xCD6F, 0x74E8}, //6486 #CJK UNIFIED IDEOGRAPH + {0xCD70, 0x753F}, //6487 #CJK UNIFIED IDEOGRAPH + {0xCD71, 0x7540}, //6488 #CJK UNIFIED IDEOGRAPH + {0xCD72, 0x753E}, //6489 #CJK UNIFIED IDEOGRAPH + {0xCD73, 0x758C}, //6490 #CJK UNIFIED IDEOGRAPH + {0xCD74, 0x7598}, //6491 #CJK UNIFIED IDEOGRAPH + {0xCD75, 0x76AF}, //6492 #CJK UNIFIED IDEOGRAPH + {0xCD76, 0x76F3}, //6493 #CJK UNIFIED IDEOGRAPH + {0xCD77, 0x76F1}, //6494 #CJK UNIFIED IDEOGRAPH + {0xCD78, 0x76F0}, //6495 #CJK UNIFIED IDEOGRAPH + {0xCD79, 0x76F5}, //6496 #CJK UNIFIED IDEOGRAPH + {0xCD7A, 0x77F8}, //6497 #CJK UNIFIED IDEOGRAPH + {0xCD7B, 0x77FC}, //6498 #CJK UNIFIED IDEOGRAPH + {0xCD7C, 0x77F9}, //6499 #CJK UNIFIED IDEOGRAPH + {0xCD7D, 0x77FB}, //6500 #CJK UNIFIED IDEOGRAPH + {0xCD7E, 0x77FA}, //6501 #CJK UNIFIED IDEOGRAPH + {0xCDA1, 0x77F7}, //6502 #CJK UNIFIED IDEOGRAPH + {0xCDA2, 0x7942}, //6503 #CJK UNIFIED IDEOGRAPH + {0xCDA3, 0x793F}, //6504 #CJK UNIFIED IDEOGRAPH + {0xCDA4, 0x79C5}, //6505 #CJK UNIFIED IDEOGRAPH + {0xCDA5, 0x7A78}, //6506 #CJK UNIFIED IDEOGRAPH + {0xCDA6, 0x7A7B}, //6507 #CJK UNIFIED IDEOGRAPH + {0xCDA7, 0x7AFB}, //6508 #CJK UNIFIED IDEOGRAPH + {0xCDA8, 0x7C75}, //6509 #CJK UNIFIED IDEOGRAPH + {0xCDA9, 0x7CFD}, //6510 #CJK UNIFIED IDEOGRAPH + {0xCDAA, 0x8035}, //6511 #CJK UNIFIED IDEOGRAPH + {0xCDAB, 0x808F}, //6512 #CJK UNIFIED IDEOGRAPH + {0xCDAC, 0x80AE}, //6513 #CJK UNIFIED IDEOGRAPH + {0xCDAD, 0x80A3}, //6514 #CJK UNIFIED IDEOGRAPH + {0xCDAE, 0x80B8}, //6515 #CJK UNIFIED IDEOGRAPH + {0xCDAF, 0x80B5}, //6516 #CJK UNIFIED IDEOGRAPH + {0xCDB0, 0x80AD}, //6517 #CJK UNIFIED IDEOGRAPH + {0xCDB1, 0x8220}, //6518 #CJK UNIFIED IDEOGRAPH + {0xCDB2, 0x82A0}, //6519 #CJK UNIFIED IDEOGRAPH + {0xCDB3, 0x82C0}, //6520 #CJK UNIFIED IDEOGRAPH + {0xCDB4, 0x82AB}, //6521 #CJK UNIFIED IDEOGRAPH + {0xCDB5, 0x829A}, //6522 #CJK UNIFIED IDEOGRAPH + {0xCDB6, 0x8298}, //6523 #CJK UNIFIED IDEOGRAPH + {0xCDB7, 0x829B}, //6524 #CJK UNIFIED IDEOGRAPH + {0xCDB8, 0x82B5}, //6525 #CJK UNIFIED IDEOGRAPH + {0xCDB9, 0x82A7}, //6526 #CJK UNIFIED IDEOGRAPH + {0xCDBA, 0x82AE}, //6527 #CJK UNIFIED IDEOGRAPH + {0xCDBB, 0x82BC}, //6528 #CJK UNIFIED IDEOGRAPH + {0xCDBC, 0x829E}, //6529 #CJK UNIFIED IDEOGRAPH + {0xCDBD, 0x82BA}, //6530 #CJK UNIFIED IDEOGRAPH + {0xCDBE, 0x82B4}, //6531 #CJK UNIFIED IDEOGRAPH + {0xCDBF, 0x82A8}, //6532 #CJK UNIFIED IDEOGRAPH + {0xCDC0, 0x82A1}, //6533 #CJK UNIFIED IDEOGRAPH + {0xCDC1, 0x82A9}, //6534 #CJK UNIFIED IDEOGRAPH + {0xCDC2, 0x82C2}, //6535 #CJK UNIFIED IDEOGRAPH + {0xCDC3, 0x82A4}, //6536 #CJK UNIFIED IDEOGRAPH + {0xCDC4, 0x82C3}, //6537 #CJK UNIFIED IDEOGRAPH + {0xCDC5, 0x82B6}, //6538 #CJK UNIFIED IDEOGRAPH + {0xCDC6, 0x82A2}, //6539 #CJK UNIFIED IDEOGRAPH + {0xCDC7, 0x8670}, //6540 #CJK UNIFIED IDEOGRAPH + {0xCDC8, 0x866F}, //6541 #CJK UNIFIED IDEOGRAPH + {0xCDC9, 0x866D}, //6542 #CJK UNIFIED IDEOGRAPH + {0xCDCA, 0x866E}, //6543 #CJK UNIFIED IDEOGRAPH + {0xCDCB, 0x8C56}, //6544 #CJK UNIFIED IDEOGRAPH + {0xCDCC, 0x8FD2}, //6545 #CJK UNIFIED IDEOGRAPH + {0xCDCD, 0x8FCB}, //6546 #CJK UNIFIED IDEOGRAPH + {0xCDCE, 0x8FD3}, //6547 #CJK UNIFIED IDEOGRAPH + {0xCDCF, 0x8FCD}, //6548 #CJK UNIFIED IDEOGRAPH + {0xCDD0, 0x8FD6}, //6549 #CJK UNIFIED IDEOGRAPH + {0xCDD1, 0x8FD5}, //6550 #CJK UNIFIED IDEOGRAPH + {0xCDD2, 0x8FD7}, //6551 #CJK UNIFIED IDEOGRAPH + {0xCDD3, 0x90B2}, //6552 #CJK UNIFIED IDEOGRAPH + {0xCDD4, 0x90B4}, //6553 #CJK UNIFIED IDEOGRAPH + {0xCDD5, 0x90AF}, //6554 #CJK UNIFIED IDEOGRAPH + {0xCDD6, 0x90B3}, //6555 #CJK UNIFIED IDEOGRAPH + {0xCDD7, 0x90B0}, //6556 #CJK UNIFIED IDEOGRAPH + {0xCDD8, 0x9639}, //6557 #CJK UNIFIED IDEOGRAPH + {0xCDD9, 0x963D}, //6558 #CJK UNIFIED IDEOGRAPH + {0xCDDA, 0x963C}, //6559 #CJK UNIFIED IDEOGRAPH + {0xCDDB, 0x963A}, //6560 #CJK UNIFIED IDEOGRAPH + {0xCDDC, 0x9643}, //6561 #CJK UNIFIED IDEOGRAPH + {0xCDDD, 0x4FCD}, //6562 #CJK UNIFIED IDEOGRAPH + {0xCDDE, 0x4FC5}, //6563 #CJK UNIFIED IDEOGRAPH + {0xCDDF, 0x4FD3}, //6564 #CJK UNIFIED IDEOGRAPH + {0xCDE0, 0x4FB2}, //6565 #CJK UNIFIED IDEOGRAPH + {0xCDE1, 0x4FC9}, //6566 #CJK UNIFIED IDEOGRAPH + {0xCDE2, 0x4FCB}, //6567 #CJK UNIFIED IDEOGRAPH + {0xCDE3, 0x4FC1}, //6568 #CJK UNIFIED IDEOGRAPH + {0xCDE4, 0x4FD4}, //6569 #CJK UNIFIED IDEOGRAPH + {0xCDE5, 0x4FDC}, //6570 #CJK UNIFIED IDEOGRAPH + {0xCDE6, 0x4FD9}, //6571 #CJK UNIFIED IDEOGRAPH + {0xCDE7, 0x4FBB}, //6572 #CJK UNIFIED IDEOGRAPH + {0xCDE8, 0x4FB3}, //6573 #CJK UNIFIED IDEOGRAPH + {0xCDE9, 0x4FDB}, //6574 #CJK UNIFIED IDEOGRAPH + {0xCDEA, 0x4FC7}, //6575 #CJK UNIFIED IDEOGRAPH + {0xCDEB, 0x4FD6}, //6576 #CJK UNIFIED IDEOGRAPH + {0xCDEC, 0x4FBA}, //6577 #CJK UNIFIED IDEOGRAPH + {0xCDED, 0x4FC0}, //6578 #CJK UNIFIED IDEOGRAPH + {0xCDEE, 0x4FB9}, //6579 #CJK UNIFIED IDEOGRAPH + {0xCDEF, 0x4FEC}, //6580 #CJK UNIFIED IDEOGRAPH + {0xCDF0, 0x5244}, //6581 #CJK UNIFIED IDEOGRAPH + {0xCDF1, 0x5249}, //6582 #CJK UNIFIED IDEOGRAPH + {0xCDF2, 0x52C0}, //6583 #CJK UNIFIED IDEOGRAPH + {0xCDF3, 0x52C2}, //6584 #CJK UNIFIED IDEOGRAPH + {0xCDF4, 0x533D}, //6585 #CJK UNIFIED IDEOGRAPH + {0xCDF5, 0x537C}, //6586 #CJK UNIFIED IDEOGRAPH + {0xCDF6, 0x5397}, //6587 #CJK UNIFIED IDEOGRAPH + {0xCDF7, 0x5396}, //6588 #CJK UNIFIED IDEOGRAPH + {0xCDF8, 0x5399}, //6589 #CJK UNIFIED IDEOGRAPH + {0xCDF9, 0x5398}, //6590 #CJK UNIFIED IDEOGRAPH + {0xCDFA, 0x54BA}, //6591 #CJK UNIFIED IDEOGRAPH + {0xCDFB, 0x54A1}, //6592 #CJK UNIFIED IDEOGRAPH + {0xCDFC, 0x54AD}, //6593 #CJK UNIFIED IDEOGRAPH + {0xCDFD, 0x54A5}, //6594 #CJK UNIFIED IDEOGRAPH + {0xCDFE, 0x54CF}, //6595 #CJK UNIFIED IDEOGRAPH + {0xCE40, 0x54C3}, //6596 #CJK UNIFIED IDEOGRAPH + {0xCE41, 0x830D}, //6597 #CJK UNIFIED IDEOGRAPH + {0xCE42, 0x54B7}, //6598 #CJK UNIFIED IDEOGRAPH + {0xCE43, 0x54AE}, //6599 #CJK UNIFIED IDEOGRAPH + {0xCE44, 0x54D6}, //6600 #CJK UNIFIED IDEOGRAPH + {0xCE45, 0x54B6}, //6601 #CJK UNIFIED IDEOGRAPH + {0xCE46, 0x54C5}, //6602 #CJK UNIFIED IDEOGRAPH + {0xCE47, 0x54C6}, //6603 #CJK UNIFIED IDEOGRAPH + {0xCE48, 0x54A0}, //6604 #CJK UNIFIED IDEOGRAPH + {0xCE49, 0x5470}, //6605 #CJK UNIFIED IDEOGRAPH + {0xCE4A, 0x54BC}, //6606 #CJK UNIFIED IDEOGRAPH + {0xCE4B, 0x54A2}, //6607 #CJK UNIFIED IDEOGRAPH + {0xCE4C, 0x54BE}, //6608 #CJK UNIFIED IDEOGRAPH + {0xCE4D, 0x5472}, //6609 #CJK UNIFIED IDEOGRAPH + {0xCE4E, 0x54DE}, //6610 #CJK UNIFIED IDEOGRAPH + {0xCE4F, 0x54B0}, //6611 #CJK UNIFIED IDEOGRAPH + {0xCE50, 0x57B5}, //6612 #CJK UNIFIED IDEOGRAPH + {0xCE51, 0x579E}, //6613 #CJK UNIFIED IDEOGRAPH + {0xCE52, 0x579F}, //6614 #CJK UNIFIED IDEOGRAPH + {0xCE53, 0x57A4}, //6615 #CJK UNIFIED IDEOGRAPH + {0xCE54, 0x578C}, //6616 #CJK UNIFIED IDEOGRAPH + {0xCE55, 0x5797}, //6617 #CJK UNIFIED IDEOGRAPH + {0xCE56, 0x579D}, //6618 #CJK UNIFIED IDEOGRAPH + {0xCE57, 0x579B}, //6619 #CJK UNIFIED IDEOGRAPH + {0xCE58, 0x5794}, //6620 #CJK UNIFIED IDEOGRAPH + {0xCE59, 0x5798}, //6621 #CJK UNIFIED IDEOGRAPH + {0xCE5A, 0x578F}, //6622 #CJK UNIFIED IDEOGRAPH + {0xCE5B, 0x5799}, //6623 #CJK UNIFIED IDEOGRAPH + {0xCE5C, 0x57A5}, //6624 #CJK UNIFIED IDEOGRAPH + {0xCE5D, 0x579A}, //6625 #CJK UNIFIED IDEOGRAPH + {0xCE5E, 0x5795}, //6626 #CJK UNIFIED IDEOGRAPH + {0xCE5F, 0x58F4}, //6627 #CJK UNIFIED IDEOGRAPH + {0xCE60, 0x590D}, //6628 #CJK UNIFIED IDEOGRAPH + {0xCE61, 0x5953}, //6629 #CJK UNIFIED IDEOGRAPH + {0xCE62, 0x59E1}, //6630 #CJK UNIFIED IDEOGRAPH + {0xCE63, 0x59DE}, //6631 #CJK UNIFIED IDEOGRAPH + {0xCE64, 0x59EE}, //6632 #CJK UNIFIED IDEOGRAPH + {0xCE65, 0x5A00}, //6633 #CJK UNIFIED IDEOGRAPH + {0xCE66, 0x59F1}, //6634 #CJK UNIFIED IDEOGRAPH + {0xCE67, 0x59DD}, //6635 #CJK UNIFIED IDEOGRAPH + {0xCE68, 0x59FA}, //6636 #CJK UNIFIED IDEOGRAPH + {0xCE69, 0x59FD}, //6637 #CJK UNIFIED IDEOGRAPH + {0xCE6A, 0x59FC}, //6638 #CJK UNIFIED IDEOGRAPH + {0xCE6B, 0x59F6}, //6639 #CJK UNIFIED IDEOGRAPH + {0xCE6C, 0x59E4}, //6640 #CJK UNIFIED IDEOGRAPH + {0xCE6D, 0x59F2}, //6641 #CJK UNIFIED IDEOGRAPH + {0xCE6E, 0x59F7}, //6642 #CJK UNIFIED IDEOGRAPH + {0xCE6F, 0x59DB}, //6643 #CJK UNIFIED IDEOGRAPH + {0xCE70, 0x59E9}, //6644 #CJK UNIFIED IDEOGRAPH + {0xCE71, 0x59F3}, //6645 #CJK UNIFIED IDEOGRAPH + {0xCE72, 0x59F5}, //6646 #CJK UNIFIED IDEOGRAPH + {0xCE73, 0x59E0}, //6647 #CJK UNIFIED IDEOGRAPH + {0xCE74, 0x59FE}, //6648 #CJK UNIFIED IDEOGRAPH + {0xCE75, 0x59F4}, //6649 #CJK UNIFIED IDEOGRAPH + {0xCE76, 0x59ED}, //6650 #CJK UNIFIED IDEOGRAPH + {0xCE77, 0x5BA8}, //6651 #CJK UNIFIED IDEOGRAPH + {0xCE78, 0x5C4C}, //6652 #CJK UNIFIED IDEOGRAPH + {0xCE79, 0x5CD0}, //6653 #CJK UNIFIED IDEOGRAPH + {0xCE7A, 0x5CD8}, //6654 #CJK UNIFIED IDEOGRAPH + {0xCE7B, 0x5CCC}, //6655 #CJK UNIFIED IDEOGRAPH + {0xCE7C, 0x5CD7}, //6656 #CJK UNIFIED IDEOGRAPH + {0xCE7D, 0x5CCB}, //6657 #CJK UNIFIED IDEOGRAPH + {0xCE7E, 0x5CDB}, //6658 #CJK UNIFIED IDEOGRAPH + {0xCEA1, 0x5CDE}, //6659 #CJK UNIFIED IDEOGRAPH + {0xCEA2, 0x5CDA}, //6660 #CJK UNIFIED IDEOGRAPH + {0xCEA3, 0x5CC9}, //6661 #CJK UNIFIED IDEOGRAPH + {0xCEA4, 0x5CC7}, //6662 #CJK UNIFIED IDEOGRAPH + {0xCEA5, 0x5CCA}, //6663 #CJK UNIFIED IDEOGRAPH + {0xCEA6, 0x5CD6}, //6664 #CJK UNIFIED IDEOGRAPH + {0xCEA7, 0x5CD3}, //6665 #CJK UNIFIED IDEOGRAPH + {0xCEA8, 0x5CD4}, //6666 #CJK UNIFIED IDEOGRAPH + {0xCEA9, 0x5CCF}, //6667 #CJK UNIFIED IDEOGRAPH + {0xCEAA, 0x5CC8}, //6668 #CJK UNIFIED IDEOGRAPH + {0xCEAB, 0x5CC6}, //6669 #CJK UNIFIED IDEOGRAPH + {0xCEAC, 0x5CCE}, //6670 #CJK UNIFIED IDEOGRAPH + {0xCEAD, 0x5CDF}, //6671 #CJK UNIFIED IDEOGRAPH + {0xCEAE, 0x5CF8}, //6672 #CJK UNIFIED IDEOGRAPH + {0xCEAF, 0x5DF9}, //6673 #CJK UNIFIED IDEOGRAPH + {0xCEB0, 0x5E21}, //6674 #CJK UNIFIED IDEOGRAPH + {0xCEB1, 0x5E22}, //6675 #CJK UNIFIED IDEOGRAPH + {0xCEB2, 0x5E23}, //6676 #CJK UNIFIED IDEOGRAPH + {0xCEB3, 0x5E20}, //6677 #CJK UNIFIED IDEOGRAPH + {0xCEB4, 0x5E24}, //6678 #CJK UNIFIED IDEOGRAPH + {0xCEB5, 0x5EB0}, //6679 #CJK UNIFIED IDEOGRAPH + {0xCEB6, 0x5EA4}, //6680 #CJK UNIFIED IDEOGRAPH + {0xCEB7, 0x5EA2}, //6681 #CJK UNIFIED IDEOGRAPH + {0xCEB8, 0x5E9B}, //6682 #CJK UNIFIED IDEOGRAPH + {0xCEB9, 0x5EA3}, //6683 #CJK UNIFIED IDEOGRAPH + {0xCEBA, 0x5EA5}, //6684 #CJK UNIFIED IDEOGRAPH + {0xCEBB, 0x5F07}, //6685 #CJK UNIFIED IDEOGRAPH + {0xCEBC, 0x5F2E}, //6686 #CJK UNIFIED IDEOGRAPH + {0xCEBD, 0x5F56}, //6687 #CJK UNIFIED IDEOGRAPH + {0xCEBE, 0x5F86}, //6688 #CJK UNIFIED IDEOGRAPH + {0xCEBF, 0x6037}, //6689 #CJK UNIFIED IDEOGRAPH + {0xCEC0, 0x6039}, //6690 #CJK UNIFIED IDEOGRAPH + {0xCEC1, 0x6054}, //6691 #CJK UNIFIED IDEOGRAPH + {0xCEC2, 0x6072}, //6692 #CJK UNIFIED IDEOGRAPH + {0xCEC3, 0x605E}, //6693 #CJK UNIFIED IDEOGRAPH + {0xCEC4, 0x6045}, //6694 #CJK UNIFIED IDEOGRAPH + {0xCEC5, 0x6053}, //6695 #CJK UNIFIED IDEOGRAPH + {0xCEC6, 0x6047}, //6696 #CJK UNIFIED IDEOGRAPH + {0xCEC7, 0x6049}, //6697 #CJK UNIFIED IDEOGRAPH + {0xCEC8, 0x605B}, //6698 #CJK UNIFIED IDEOGRAPH + {0xCEC9, 0x604C}, //6699 #CJK UNIFIED IDEOGRAPH + {0xCECA, 0x6040}, //6700 #CJK UNIFIED IDEOGRAPH + {0xCECB, 0x6042}, //6701 #CJK UNIFIED IDEOGRAPH + {0xCECC, 0x605F}, //6702 #CJK UNIFIED IDEOGRAPH + {0xCECD, 0x6024}, //6703 #CJK UNIFIED IDEOGRAPH + {0xCECE, 0x6044}, //6704 #CJK UNIFIED IDEOGRAPH + {0xCECF, 0x6058}, //6705 #CJK UNIFIED IDEOGRAPH + {0xCED0, 0x6066}, //6706 #CJK UNIFIED IDEOGRAPH + {0xCED1, 0x606E}, //6707 #CJK UNIFIED IDEOGRAPH + {0xCED2, 0x6242}, //6708 #CJK UNIFIED IDEOGRAPH + {0xCED3, 0x6243}, //6709 #CJK UNIFIED IDEOGRAPH + {0xCED4, 0x62CF}, //6710 #CJK UNIFIED IDEOGRAPH + {0xCED5, 0x630D}, //6711 #CJK UNIFIED IDEOGRAPH + {0xCED6, 0x630B}, //6712 #CJK UNIFIED IDEOGRAPH + {0xCED7, 0x62F5}, //6713 #CJK UNIFIED IDEOGRAPH + {0xCED8, 0x630E}, //6714 #CJK UNIFIED IDEOGRAPH + {0xCED9, 0x6303}, //6715 #CJK UNIFIED IDEOGRAPH + {0xCEDA, 0x62EB}, //6716 #CJK UNIFIED IDEOGRAPH + {0xCEDB, 0x62F9}, //6717 #CJK UNIFIED IDEOGRAPH + {0xCEDC, 0x630F}, //6718 #CJK UNIFIED IDEOGRAPH + {0xCEDD, 0x630C}, //6719 #CJK UNIFIED IDEOGRAPH + {0xCEDE, 0x62F8}, //6720 #CJK UNIFIED IDEOGRAPH + {0xCEDF, 0x62F6}, //6721 #CJK UNIFIED IDEOGRAPH + {0xCEE0, 0x6300}, //6722 #CJK UNIFIED IDEOGRAPH + {0xCEE1, 0x6313}, //6723 #CJK UNIFIED IDEOGRAPH + {0xCEE2, 0x6314}, //6724 #CJK UNIFIED IDEOGRAPH + {0xCEE3, 0x62FA}, //6725 #CJK UNIFIED IDEOGRAPH + {0xCEE4, 0x6315}, //6726 #CJK UNIFIED IDEOGRAPH + {0xCEE5, 0x62FB}, //6727 #CJK UNIFIED IDEOGRAPH + {0xCEE6, 0x62F0}, //6728 #CJK UNIFIED IDEOGRAPH + {0xCEE7, 0x6541}, //6729 #CJK UNIFIED IDEOGRAPH + {0xCEE8, 0x6543}, //6730 #CJK UNIFIED IDEOGRAPH + {0xCEE9, 0x65AA}, //6731 #CJK UNIFIED IDEOGRAPH + {0xCEEA, 0x65BF}, //6732 #CJK UNIFIED IDEOGRAPH + {0xCEEB, 0x6636}, //6733 #CJK UNIFIED IDEOGRAPH + {0xCEEC, 0x6621}, //6734 #CJK UNIFIED IDEOGRAPH + {0xCEED, 0x6632}, //6735 #CJK UNIFIED IDEOGRAPH + {0xCEEE, 0x6635}, //6736 #CJK UNIFIED IDEOGRAPH + {0xCEEF, 0x661C}, //6737 #CJK UNIFIED IDEOGRAPH + {0xCEF0, 0x6626}, //6738 #CJK UNIFIED IDEOGRAPH + {0xCEF1, 0x6622}, //6739 #CJK UNIFIED IDEOGRAPH + {0xCEF2, 0x6633}, //6740 #CJK UNIFIED IDEOGRAPH + {0xCEF3, 0x662B}, //6741 #CJK UNIFIED IDEOGRAPH + {0xCEF4, 0x663A}, //6742 #CJK UNIFIED IDEOGRAPH + {0xCEF5, 0x661D}, //6743 #CJK UNIFIED IDEOGRAPH + {0xCEF6, 0x6634}, //6744 #CJK UNIFIED IDEOGRAPH + {0xCEF7, 0x6639}, //6745 #CJK UNIFIED IDEOGRAPH + {0xCEF8, 0x662E}, //6746 #CJK UNIFIED IDEOGRAPH + {0xCEF9, 0x670F}, //6747 #CJK UNIFIED IDEOGRAPH + {0xCEFA, 0x6710}, //6748 #CJK UNIFIED IDEOGRAPH + {0xCEFB, 0x67C1}, //6749 #CJK UNIFIED IDEOGRAPH + {0xCEFC, 0x67F2}, //6750 #CJK UNIFIED IDEOGRAPH + {0xCEFD, 0x67C8}, //6751 #CJK UNIFIED IDEOGRAPH + {0xCEFE, 0x67BA}, //6752 #CJK UNIFIED IDEOGRAPH + {0xCF40, 0x67DC}, //6753 #CJK UNIFIED IDEOGRAPH + {0xCF41, 0x67BB}, //6754 #CJK UNIFIED IDEOGRAPH + {0xCF42, 0x67F8}, //6755 #CJK UNIFIED IDEOGRAPH + {0xCF43, 0x67D8}, //6756 #CJK UNIFIED IDEOGRAPH + {0xCF44, 0x67C0}, //6757 #CJK UNIFIED IDEOGRAPH + {0xCF45, 0x67B7}, //6758 #CJK UNIFIED IDEOGRAPH + {0xCF46, 0x67C5}, //6759 #CJK UNIFIED IDEOGRAPH + {0xCF47, 0x67EB}, //6760 #CJK UNIFIED IDEOGRAPH + {0xCF48, 0x67E4}, //6761 #CJK UNIFIED IDEOGRAPH + {0xCF49, 0x67DF}, //6762 #CJK UNIFIED IDEOGRAPH + {0xCF4A, 0x67B5}, //6763 #CJK UNIFIED IDEOGRAPH + {0xCF4B, 0x67CD}, //6764 #CJK UNIFIED IDEOGRAPH + {0xCF4C, 0x67B3}, //6765 #CJK UNIFIED IDEOGRAPH + {0xCF4D, 0x67F7}, //6766 #CJK UNIFIED IDEOGRAPH + {0xCF4E, 0x67F6}, //6767 #CJK UNIFIED IDEOGRAPH + {0xCF4F, 0x67EE}, //6768 #CJK UNIFIED IDEOGRAPH + {0xCF50, 0x67E3}, //6769 #CJK UNIFIED IDEOGRAPH + {0xCF51, 0x67C2}, //6770 #CJK UNIFIED IDEOGRAPH + {0xCF52, 0x67B9}, //6771 #CJK UNIFIED IDEOGRAPH + {0xCF53, 0x67CE}, //6772 #CJK UNIFIED IDEOGRAPH + {0xCF54, 0x67E7}, //6773 #CJK UNIFIED IDEOGRAPH + {0xCF55, 0x67F0}, //6774 #CJK UNIFIED IDEOGRAPH + {0xCF56, 0x67B2}, //6775 #CJK UNIFIED IDEOGRAPH + {0xCF57, 0x67FC}, //6776 #CJK UNIFIED IDEOGRAPH + {0xCF58, 0x67C6}, //6777 #CJK UNIFIED IDEOGRAPH + {0xCF59, 0x67ED}, //6778 #CJK UNIFIED IDEOGRAPH + {0xCF5A, 0x67CC}, //6779 #CJK UNIFIED IDEOGRAPH + {0xCF5B, 0x67AE}, //6780 #CJK UNIFIED IDEOGRAPH + {0xCF5C, 0x67E6}, //6781 #CJK UNIFIED IDEOGRAPH + {0xCF5D, 0x67DB}, //6782 #CJK UNIFIED IDEOGRAPH + {0xCF5E, 0x67FA}, //6783 #CJK UNIFIED IDEOGRAPH + {0xCF5F, 0x67C9}, //6784 #CJK UNIFIED IDEOGRAPH + {0xCF60, 0x67CA}, //6785 #CJK UNIFIED IDEOGRAPH + {0xCF61, 0x67C3}, //6786 #CJK UNIFIED IDEOGRAPH + {0xCF62, 0x67EA}, //6787 #CJK UNIFIED IDEOGRAPH + {0xCF63, 0x67CB}, //6788 #CJK UNIFIED IDEOGRAPH + {0xCF64, 0x6B28}, //6789 #CJK UNIFIED IDEOGRAPH + {0xCF65, 0x6B82}, //6790 #CJK UNIFIED IDEOGRAPH + {0xCF66, 0x6B84}, //6791 #CJK UNIFIED IDEOGRAPH + {0xCF67, 0x6BB6}, //6792 #CJK UNIFIED IDEOGRAPH + {0xCF68, 0x6BD6}, //6793 #CJK UNIFIED IDEOGRAPH + {0xCF69, 0x6BD8}, //6794 #CJK UNIFIED IDEOGRAPH + {0xCF6A, 0x6BE0}, //6795 #CJK UNIFIED IDEOGRAPH + {0xCF6B, 0x6C20}, //6796 #CJK UNIFIED IDEOGRAPH + {0xCF6C, 0x6C21}, //6797 #CJK UNIFIED IDEOGRAPH + {0xCF6D, 0x6D28}, //6798 #CJK UNIFIED IDEOGRAPH + {0xCF6E, 0x6D34}, //6799 #CJK UNIFIED IDEOGRAPH + {0xCF6F, 0x6D2D}, //6800 #CJK UNIFIED IDEOGRAPH + {0xCF70, 0x6D1F}, //6801 #CJK UNIFIED IDEOGRAPH + {0xCF71, 0x6D3C}, //6802 #CJK UNIFIED IDEOGRAPH + {0xCF72, 0x6D3F}, //6803 #CJK UNIFIED IDEOGRAPH + {0xCF73, 0x6D12}, //6804 #CJK UNIFIED IDEOGRAPH + {0xCF74, 0x6D0A}, //6805 #CJK UNIFIED IDEOGRAPH + {0xCF75, 0x6CDA}, //6806 #CJK UNIFIED IDEOGRAPH + {0xCF76, 0x6D33}, //6807 #CJK UNIFIED IDEOGRAPH + {0xCF77, 0x6D04}, //6808 #CJK UNIFIED IDEOGRAPH + {0xCF78, 0x6D19}, //6809 #CJK UNIFIED IDEOGRAPH + {0xCF79, 0x6D3A}, //6810 #CJK UNIFIED IDEOGRAPH + {0xCF7A, 0x6D1A}, //6811 #CJK UNIFIED IDEOGRAPH + {0xCF7B, 0x6D11}, //6812 #CJK UNIFIED IDEOGRAPH + {0xCF7C, 0x6D00}, //6813 #CJK UNIFIED IDEOGRAPH + {0xCF7D, 0x6D1D}, //6814 #CJK UNIFIED IDEOGRAPH + {0xCF7E, 0x6D42}, //6815 #CJK UNIFIED IDEOGRAPH + {0xCFA1, 0x6D01}, //6816 #CJK UNIFIED IDEOGRAPH + {0xCFA2, 0x6D18}, //6817 #CJK UNIFIED IDEOGRAPH + {0xCFA3, 0x6D37}, //6818 #CJK UNIFIED IDEOGRAPH + {0xCFA4, 0x6D03}, //6819 #CJK UNIFIED IDEOGRAPH + {0xCFA5, 0x6D0F}, //6820 #CJK UNIFIED IDEOGRAPH + {0xCFA6, 0x6D40}, //6821 #CJK UNIFIED IDEOGRAPH + {0xCFA7, 0x6D07}, //6822 #CJK UNIFIED IDEOGRAPH + {0xCFA8, 0x6D20}, //6823 #CJK UNIFIED IDEOGRAPH + {0xCFA9, 0x6D2C}, //6824 #CJK UNIFIED IDEOGRAPH + {0xCFAA, 0x6D08}, //6825 #CJK UNIFIED IDEOGRAPH + {0xCFAB, 0x6D22}, //6826 #CJK UNIFIED IDEOGRAPH + {0xCFAC, 0x6D09}, //6827 #CJK UNIFIED IDEOGRAPH + {0xCFAD, 0x6D10}, //6828 #CJK UNIFIED IDEOGRAPH + {0xCFAE, 0x70B7}, //6829 #CJK UNIFIED IDEOGRAPH + {0xCFAF, 0x709F}, //6830 #CJK UNIFIED IDEOGRAPH + {0xCFB0, 0x70BE}, //6831 #CJK UNIFIED IDEOGRAPH + {0xCFB1, 0x70B1}, //6832 #CJK UNIFIED IDEOGRAPH + {0xCFB2, 0x70B0}, //6833 #CJK UNIFIED IDEOGRAPH + {0xCFB3, 0x70A1}, //6834 #CJK UNIFIED IDEOGRAPH + {0xCFB4, 0x70B4}, //6835 #CJK UNIFIED IDEOGRAPH + {0xCFB5, 0x70B5}, //6836 #CJK UNIFIED IDEOGRAPH + {0xCFB6, 0x70A9}, //6837 #CJK UNIFIED IDEOGRAPH + {0xCFB7, 0x7241}, //6838 #CJK UNIFIED IDEOGRAPH + {0xCFB8, 0x7249}, //6839 #CJK UNIFIED IDEOGRAPH + {0xCFB9, 0x724A}, //6840 #CJK UNIFIED IDEOGRAPH + {0xCFBA, 0x726C}, //6841 #CJK UNIFIED IDEOGRAPH + {0xCFBB, 0x7270}, //6842 #CJK UNIFIED IDEOGRAPH + {0xCFBC, 0x7273}, //6843 #CJK UNIFIED IDEOGRAPH + {0xCFBD, 0x726E}, //6844 #CJK UNIFIED IDEOGRAPH + {0xCFBE, 0x72CA}, //6845 #CJK UNIFIED IDEOGRAPH + {0xCFBF, 0x72E4}, //6846 #CJK UNIFIED IDEOGRAPH + {0xCFC0, 0x72E8}, //6847 #CJK UNIFIED IDEOGRAPH + {0xCFC1, 0x72EB}, //6848 #CJK UNIFIED IDEOGRAPH + {0xCFC2, 0x72DF}, //6849 #CJK UNIFIED IDEOGRAPH + {0xCFC3, 0x72EA}, //6850 #CJK UNIFIED IDEOGRAPH + {0xCFC4, 0x72E6}, //6851 #CJK UNIFIED IDEOGRAPH + {0xCFC5, 0x72E3}, //6852 #CJK UNIFIED IDEOGRAPH + {0xCFC6, 0x7385}, //6853 #CJK UNIFIED IDEOGRAPH + {0xCFC7, 0x73CC}, //6854 #CJK UNIFIED IDEOGRAPH + {0xCFC8, 0x73C2}, //6855 #CJK UNIFIED IDEOGRAPH + {0xCFC9, 0x73C8}, //6856 #CJK UNIFIED IDEOGRAPH + {0xCFCA, 0x73C5}, //6857 #CJK UNIFIED IDEOGRAPH + {0xCFCB, 0x73B9}, //6858 #CJK UNIFIED IDEOGRAPH + {0xCFCC, 0x73B6}, //6859 #CJK UNIFIED IDEOGRAPH + {0xCFCD, 0x73B5}, //6860 #CJK UNIFIED IDEOGRAPH + {0xCFCE, 0x73B4}, //6861 #CJK UNIFIED IDEOGRAPH + {0xCFCF, 0x73EB}, //6862 #CJK UNIFIED IDEOGRAPH + {0xCFD0, 0x73BF}, //6863 #CJK UNIFIED IDEOGRAPH + {0xCFD1, 0x73C7}, //6864 #CJK UNIFIED IDEOGRAPH + {0xCFD2, 0x73BE}, //6865 #CJK UNIFIED IDEOGRAPH + {0xCFD3, 0x73C3}, //6866 #CJK UNIFIED IDEOGRAPH + {0xCFD4, 0x73C6}, //6867 #CJK UNIFIED IDEOGRAPH + {0xCFD5, 0x73B8}, //6868 #CJK UNIFIED IDEOGRAPH + {0xCFD6, 0x73CB}, //6869 #CJK UNIFIED IDEOGRAPH + {0xCFD7, 0x74EC}, //6870 #CJK UNIFIED IDEOGRAPH + {0xCFD8, 0x74EE}, //6871 #CJK UNIFIED IDEOGRAPH + {0xCFD9, 0x752E}, //6872 #CJK UNIFIED IDEOGRAPH + {0xCFDA, 0x7547}, //6873 #CJK UNIFIED IDEOGRAPH + {0xCFDB, 0x7548}, //6874 #CJK UNIFIED IDEOGRAPH + {0xCFDC, 0x75A7}, //6875 #CJK UNIFIED IDEOGRAPH + {0xCFDD, 0x75AA}, //6876 #CJK UNIFIED IDEOGRAPH + {0xCFDE, 0x7679}, //6877 #CJK UNIFIED IDEOGRAPH + {0xCFDF, 0x76C4}, //6878 #CJK UNIFIED IDEOGRAPH + {0xCFE0, 0x7708}, //6879 #CJK UNIFIED IDEOGRAPH + {0xCFE1, 0x7703}, //6880 #CJK UNIFIED IDEOGRAPH + {0xCFE2, 0x7704}, //6881 #CJK UNIFIED IDEOGRAPH + {0xCFE3, 0x7705}, //6882 #CJK UNIFIED IDEOGRAPH + {0xCFE4, 0x770A}, //6883 #CJK UNIFIED IDEOGRAPH + {0xCFE5, 0x76F7}, //6884 #CJK UNIFIED IDEOGRAPH + {0xCFE6, 0x76FB}, //6885 #CJK UNIFIED IDEOGRAPH + {0xCFE7, 0x76FA}, //6886 #CJK UNIFIED IDEOGRAPH + {0xCFE8, 0x77E7}, //6887 #CJK UNIFIED IDEOGRAPH + {0xCFE9, 0x77E8}, //6888 #CJK UNIFIED IDEOGRAPH + {0xCFEA, 0x7806}, //6889 #CJK UNIFIED IDEOGRAPH + {0xCFEB, 0x7811}, //6890 #CJK UNIFIED IDEOGRAPH + {0xCFEC, 0x7812}, //6891 #CJK UNIFIED IDEOGRAPH + {0xCFED, 0x7805}, //6892 #CJK UNIFIED IDEOGRAPH + {0xCFEE, 0x7810}, //6893 #CJK UNIFIED IDEOGRAPH + {0xCFEF, 0x780F}, //6894 #CJK UNIFIED IDEOGRAPH + {0xCFF0, 0x780E}, //6895 #CJK UNIFIED IDEOGRAPH + {0xCFF1, 0x7809}, //6896 #CJK UNIFIED IDEOGRAPH + {0xCFF2, 0x7803}, //6897 #CJK UNIFIED IDEOGRAPH + {0xCFF3, 0x7813}, //6898 #CJK UNIFIED IDEOGRAPH + {0xCFF4, 0x794A}, //6899 #CJK UNIFIED IDEOGRAPH + {0xCFF5, 0x794C}, //6900 #CJK UNIFIED IDEOGRAPH + {0xCFF6, 0x794B}, //6901 #CJK UNIFIED IDEOGRAPH + {0xCFF7, 0x7945}, //6902 #CJK UNIFIED IDEOGRAPH + {0xCFF8, 0x7944}, //6903 #CJK UNIFIED IDEOGRAPH + {0xCFF9, 0x79D5}, //6904 #CJK UNIFIED IDEOGRAPH + {0xCFFA, 0x79CD}, //6905 #CJK UNIFIED IDEOGRAPH + {0xCFFB, 0x79CF}, //6906 #CJK UNIFIED IDEOGRAPH + {0xCFFC, 0x79D6}, //6907 #CJK UNIFIED IDEOGRAPH + {0xCFFD, 0x79CE}, //6908 #CJK UNIFIED IDEOGRAPH + {0xCFFE, 0x7A80}, //6909 #CJK UNIFIED IDEOGRAPH + {0xD040, 0x7A7E}, //6910 #CJK UNIFIED IDEOGRAPH + {0xD041, 0x7AD1}, //6911 #CJK UNIFIED IDEOGRAPH + {0xD042, 0x7B00}, //6912 #CJK UNIFIED IDEOGRAPH + {0xD043, 0x7B01}, //6913 #CJK UNIFIED IDEOGRAPH + {0xD044, 0x7C7A}, //6914 #CJK UNIFIED IDEOGRAPH + {0xD045, 0x7C78}, //6915 #CJK UNIFIED IDEOGRAPH + {0xD046, 0x7C79}, //6916 #CJK UNIFIED IDEOGRAPH + {0xD047, 0x7C7F}, //6917 #CJK UNIFIED IDEOGRAPH + {0xD048, 0x7C80}, //6918 #CJK UNIFIED IDEOGRAPH + {0xD049, 0x7C81}, //6919 #CJK UNIFIED IDEOGRAPH + {0xD04A, 0x7D03}, //6920 #CJK UNIFIED IDEOGRAPH + {0xD04B, 0x7D08}, //6921 #CJK UNIFIED IDEOGRAPH + {0xD04C, 0x7D01}, //6922 #CJK UNIFIED IDEOGRAPH + {0xD04D, 0x7F58}, //6923 #CJK UNIFIED IDEOGRAPH + {0xD04E, 0x7F91}, //6924 #CJK UNIFIED IDEOGRAPH + {0xD04F, 0x7F8D}, //6925 #CJK UNIFIED IDEOGRAPH + {0xD050, 0x7FBE}, //6926 #CJK UNIFIED IDEOGRAPH + {0xD051, 0x8007}, //6927 #CJK UNIFIED IDEOGRAPH + {0xD052, 0x800E}, //6928 #CJK UNIFIED IDEOGRAPH + {0xD053, 0x800F}, //6929 #CJK UNIFIED IDEOGRAPH + {0xD054, 0x8014}, //6930 #CJK UNIFIED IDEOGRAPH + {0xD055, 0x8037}, //6931 #CJK UNIFIED IDEOGRAPH + {0xD056, 0x80D8}, //6932 #CJK UNIFIED IDEOGRAPH + {0xD057, 0x80C7}, //6933 #CJK UNIFIED IDEOGRAPH + {0xD058, 0x80E0}, //6934 #CJK UNIFIED IDEOGRAPH + {0xD059, 0x80D1}, //6935 #CJK UNIFIED IDEOGRAPH + {0xD05A, 0x80C8}, //6936 #CJK UNIFIED IDEOGRAPH + {0xD05B, 0x80C2}, //6937 #CJK UNIFIED IDEOGRAPH + {0xD05C, 0x80D0}, //6938 #CJK UNIFIED IDEOGRAPH + {0xD05D, 0x80C5}, //6939 #CJK UNIFIED IDEOGRAPH + {0xD05E, 0x80E3}, //6940 #CJK UNIFIED IDEOGRAPH + {0xD05F, 0x80D9}, //6941 #CJK UNIFIED IDEOGRAPH + {0xD060, 0x80DC}, //6942 #CJK UNIFIED IDEOGRAPH + {0xD061, 0x80CA}, //6943 #CJK UNIFIED IDEOGRAPH + {0xD062, 0x80D5}, //6944 #CJK UNIFIED IDEOGRAPH + {0xD063, 0x80C9}, //6945 #CJK UNIFIED IDEOGRAPH + {0xD064, 0x80CF}, //6946 #CJK UNIFIED IDEOGRAPH + {0xD065, 0x80D7}, //6947 #CJK UNIFIED IDEOGRAPH + {0xD066, 0x80E6}, //6948 #CJK UNIFIED IDEOGRAPH + {0xD067, 0x80CD}, //6949 #CJK UNIFIED IDEOGRAPH + {0xD068, 0x81FF}, //6950 #CJK UNIFIED IDEOGRAPH + {0xD069, 0x8221}, //6951 #CJK UNIFIED IDEOGRAPH + {0xD06A, 0x8294}, //6952 #CJK UNIFIED IDEOGRAPH + {0xD06B, 0x82D9}, //6953 #CJK UNIFIED IDEOGRAPH + {0xD06C, 0x82FE}, //6954 #CJK UNIFIED IDEOGRAPH + {0xD06D, 0x82F9}, //6955 #CJK UNIFIED IDEOGRAPH + {0xD06E, 0x8307}, //6956 #CJK UNIFIED IDEOGRAPH + {0xD06F, 0x82E8}, //6957 #CJK UNIFIED IDEOGRAPH + {0xD070, 0x8300}, //6958 #CJK UNIFIED IDEOGRAPH + {0xD071, 0x82D5}, //6959 #CJK UNIFIED IDEOGRAPH + {0xD072, 0x833A}, //6960 #CJK UNIFIED IDEOGRAPH + {0xD073, 0x82EB}, //6961 #CJK UNIFIED IDEOGRAPH + {0xD074, 0x82D6}, //6962 #CJK UNIFIED IDEOGRAPH + {0xD075, 0x82F4}, //6963 #CJK UNIFIED IDEOGRAPH + {0xD076, 0x82EC}, //6964 #CJK UNIFIED IDEOGRAPH + {0xD077, 0x82E1}, //6965 #CJK UNIFIED IDEOGRAPH + {0xD078, 0x82F2}, //6966 #CJK UNIFIED IDEOGRAPH + {0xD079, 0x82F5}, //6967 #CJK UNIFIED IDEOGRAPH + {0xD07A, 0x830C}, //6968 #CJK UNIFIED IDEOGRAPH + {0xD07B, 0x82FB}, //6969 #CJK UNIFIED IDEOGRAPH + {0xD07C, 0x82F6}, //6970 #CJK UNIFIED IDEOGRAPH + {0xD07D, 0x82F0}, //6971 #CJK UNIFIED IDEOGRAPH + {0xD07E, 0x82EA}, //6972 #CJK UNIFIED IDEOGRAPH + {0xD0A1, 0x82E4}, //6973 #CJK UNIFIED IDEOGRAPH + {0xD0A2, 0x82E0}, //6974 #CJK UNIFIED IDEOGRAPH + {0xD0A3, 0x82FA}, //6975 #CJK UNIFIED IDEOGRAPH + {0xD0A4, 0x82F3}, //6976 #CJK UNIFIED IDEOGRAPH + {0xD0A5, 0x82ED}, //6977 #CJK UNIFIED IDEOGRAPH + {0xD0A6, 0x8677}, //6978 #CJK UNIFIED IDEOGRAPH + {0xD0A7, 0x8674}, //6979 #CJK UNIFIED IDEOGRAPH + {0xD0A8, 0x867C}, //6980 #CJK UNIFIED IDEOGRAPH + {0xD0A9, 0x8673}, //6981 #CJK UNIFIED IDEOGRAPH + {0xD0AA, 0x8841}, //6982 #CJK UNIFIED IDEOGRAPH + {0xD0AB, 0x884E}, //6983 #CJK UNIFIED IDEOGRAPH + {0xD0AC, 0x8867}, //6984 #CJK UNIFIED IDEOGRAPH + {0xD0AD, 0x886A}, //6985 #CJK UNIFIED IDEOGRAPH + {0xD0AE, 0x8869}, //6986 #CJK UNIFIED IDEOGRAPH + {0xD0AF, 0x89D3}, //6987 #CJK UNIFIED IDEOGRAPH + {0xD0B0, 0x8A04}, //6988 #CJK UNIFIED IDEOGRAPH + {0xD0B1, 0x8A07}, //6989 #CJK UNIFIED IDEOGRAPH + {0xD0B2, 0x8D72}, //6990 #CJK UNIFIED IDEOGRAPH + {0xD0B3, 0x8FE3}, //6991 #CJK UNIFIED IDEOGRAPH + {0xD0B4, 0x8FE1}, //6992 #CJK UNIFIED IDEOGRAPH + {0xD0B5, 0x8FEE}, //6993 #CJK UNIFIED IDEOGRAPH + {0xD0B6, 0x8FE0}, //6994 #CJK UNIFIED IDEOGRAPH + {0xD0B7, 0x90F1}, //6995 #CJK UNIFIED IDEOGRAPH + {0xD0B8, 0x90BD}, //6996 #CJK UNIFIED IDEOGRAPH + {0xD0B9, 0x90BF}, //6997 #CJK UNIFIED IDEOGRAPH + {0xD0BA, 0x90D5}, //6998 #CJK UNIFIED IDEOGRAPH + {0xD0BB, 0x90C5}, //6999 #CJK UNIFIED IDEOGRAPH + {0xD0BC, 0x90BE}, //7000 #CJK UNIFIED IDEOGRAPH + {0xD0BD, 0x90C7}, //7001 #CJK UNIFIED IDEOGRAPH + {0xD0BE, 0x90CB}, //7002 #CJK UNIFIED IDEOGRAPH + {0xD0BF, 0x90C8}, //7003 #CJK UNIFIED IDEOGRAPH + {0xD0C0, 0x91D4}, //7004 #CJK UNIFIED IDEOGRAPH + {0xD0C1, 0x91D3}, //7005 #CJK UNIFIED IDEOGRAPH + {0xD0C2, 0x9654}, //7006 #CJK UNIFIED IDEOGRAPH + {0xD0C3, 0x964F}, //7007 #CJK UNIFIED IDEOGRAPH + {0xD0C4, 0x9651}, //7008 #CJK UNIFIED IDEOGRAPH + {0xD0C5, 0x9653}, //7009 #CJK UNIFIED IDEOGRAPH + {0xD0C6, 0x964A}, //7010 #CJK UNIFIED IDEOGRAPH + {0xD0C7, 0x964E}, //7011 #CJK UNIFIED IDEOGRAPH + {0xD0C8, 0x501E}, //7012 #CJK UNIFIED IDEOGRAPH + {0xD0C9, 0x5005}, //7013 #CJK UNIFIED IDEOGRAPH + {0xD0CA, 0x5007}, //7014 #CJK UNIFIED IDEOGRAPH + {0xD0CB, 0x5013}, //7015 #CJK UNIFIED IDEOGRAPH + {0xD0CC, 0x5022}, //7016 #CJK UNIFIED IDEOGRAPH + {0xD0CD, 0x5030}, //7017 #CJK UNIFIED IDEOGRAPH + {0xD0CE, 0x501B}, //7018 #CJK UNIFIED IDEOGRAPH + {0xD0CF, 0x4FF5}, //7019 #CJK UNIFIED IDEOGRAPH + {0xD0D0, 0x4FF4}, //7020 #CJK UNIFIED IDEOGRAPH + {0xD0D1, 0x5033}, //7021 #CJK UNIFIED IDEOGRAPH + {0xD0D2, 0x5037}, //7022 #CJK UNIFIED IDEOGRAPH + {0xD0D3, 0x502C}, //7023 #CJK UNIFIED IDEOGRAPH + {0xD0D4, 0x4FF6}, //7024 #CJK UNIFIED IDEOGRAPH + {0xD0D5, 0x4FF7}, //7025 #CJK UNIFIED IDEOGRAPH + {0xD0D6, 0x5017}, //7026 #CJK UNIFIED IDEOGRAPH + {0xD0D7, 0x501C}, //7027 #CJK UNIFIED IDEOGRAPH + {0xD0D8, 0x5020}, //7028 #CJK UNIFIED IDEOGRAPH + {0xD0D9, 0x5027}, //7029 #CJK UNIFIED IDEOGRAPH + {0xD0DA, 0x5035}, //7030 #CJK UNIFIED IDEOGRAPH + {0xD0DB, 0x502F}, //7031 #CJK UNIFIED IDEOGRAPH + {0xD0DC, 0x5031}, //7032 #CJK UNIFIED IDEOGRAPH + {0xD0DD, 0x500E}, //7033 #CJK UNIFIED IDEOGRAPH + {0xD0DE, 0x515A}, //7034 #CJK UNIFIED IDEOGRAPH + {0xD0DF, 0x5194}, //7035 #CJK UNIFIED IDEOGRAPH + {0xD0E0, 0x5193}, //7036 #CJK UNIFIED IDEOGRAPH + {0xD0E1, 0x51CA}, //7037 #CJK UNIFIED IDEOGRAPH + {0xD0E2, 0x51C4}, //7038 #CJK UNIFIED IDEOGRAPH + {0xD0E3, 0x51C5}, //7039 #CJK UNIFIED IDEOGRAPH + {0xD0E4, 0x51C8}, //7040 #CJK UNIFIED IDEOGRAPH + {0xD0E5, 0x51CE}, //7041 #CJK UNIFIED IDEOGRAPH + {0xD0E6, 0x5261}, //7042 #CJK UNIFIED IDEOGRAPH + {0xD0E7, 0x525A}, //7043 #CJK UNIFIED IDEOGRAPH + {0xD0E8, 0x5252}, //7044 #CJK UNIFIED IDEOGRAPH + {0xD0E9, 0x525E}, //7045 #CJK UNIFIED IDEOGRAPH + {0xD0EA, 0x525F}, //7046 #CJK UNIFIED IDEOGRAPH + {0xD0EB, 0x5255}, //7047 #CJK UNIFIED IDEOGRAPH + {0xD0EC, 0x5262}, //7048 #CJK UNIFIED IDEOGRAPH + {0xD0ED, 0x52CD}, //7049 #CJK UNIFIED IDEOGRAPH + {0xD0EE, 0x530E}, //7050 #CJK UNIFIED IDEOGRAPH + {0xD0EF, 0x539E}, //7051 #CJK UNIFIED IDEOGRAPH + {0xD0F0, 0x5526}, //7052 #CJK UNIFIED IDEOGRAPH + {0xD0F1, 0x54E2}, //7053 #CJK UNIFIED IDEOGRAPH + {0xD0F2, 0x5517}, //7054 #CJK UNIFIED IDEOGRAPH + {0xD0F3, 0x5512}, //7055 #CJK UNIFIED IDEOGRAPH + {0xD0F4, 0x54E7}, //7056 #CJK UNIFIED IDEOGRAPH + {0xD0F5, 0x54F3}, //7057 #CJK UNIFIED IDEOGRAPH + {0xD0F6, 0x54E4}, //7058 #CJK UNIFIED IDEOGRAPH + {0xD0F7, 0x551A}, //7059 #CJK UNIFIED IDEOGRAPH + {0xD0F8, 0x54FF}, //7060 #CJK UNIFIED IDEOGRAPH + {0xD0F9, 0x5504}, //7061 #CJK UNIFIED IDEOGRAPH + {0xD0FA, 0x5508}, //7062 #CJK UNIFIED IDEOGRAPH + {0xD0FB, 0x54EB}, //7063 #CJK UNIFIED IDEOGRAPH + {0xD0FC, 0x5511}, //7064 #CJK UNIFIED IDEOGRAPH + {0xD0FD, 0x5505}, //7065 #CJK UNIFIED IDEOGRAPH + {0xD0FE, 0x54F1}, //7066 #CJK UNIFIED IDEOGRAPH + {0xD140, 0x550A}, //7067 #CJK UNIFIED IDEOGRAPH + {0xD141, 0x54FB}, //7068 #CJK UNIFIED IDEOGRAPH + {0xD142, 0x54F7}, //7069 #CJK UNIFIED IDEOGRAPH + {0xD143, 0x54F8}, //7070 #CJK UNIFIED IDEOGRAPH + {0xD144, 0x54E0}, //7071 #CJK UNIFIED IDEOGRAPH + {0xD145, 0x550E}, //7072 #CJK UNIFIED IDEOGRAPH + {0xD146, 0x5503}, //7073 #CJK UNIFIED IDEOGRAPH + {0xD147, 0x550B}, //7074 #CJK UNIFIED IDEOGRAPH + {0xD148, 0x5701}, //7075 #CJK UNIFIED IDEOGRAPH + {0xD149, 0x5702}, //7076 #CJK UNIFIED IDEOGRAPH + {0xD14A, 0x57CC}, //7077 #CJK UNIFIED IDEOGRAPH + {0xD14B, 0x5832}, //7078 #CJK UNIFIED IDEOGRAPH + {0xD14C, 0x57D5}, //7079 #CJK UNIFIED IDEOGRAPH + {0xD14D, 0x57D2}, //7080 #CJK UNIFIED IDEOGRAPH + {0xD14E, 0x57BA}, //7081 #CJK UNIFIED IDEOGRAPH + {0xD14F, 0x57C6}, //7082 #CJK UNIFIED IDEOGRAPH + {0xD150, 0x57BD}, //7083 #CJK UNIFIED IDEOGRAPH + {0xD151, 0x57BC}, //7084 #CJK UNIFIED IDEOGRAPH + {0xD152, 0x57B8}, //7085 #CJK UNIFIED IDEOGRAPH + {0xD153, 0x57B6}, //7086 #CJK UNIFIED IDEOGRAPH + {0xD154, 0x57BF}, //7087 #CJK UNIFIED IDEOGRAPH + {0xD155, 0x57C7}, //7088 #CJK UNIFIED IDEOGRAPH + {0xD156, 0x57D0}, //7089 #CJK UNIFIED IDEOGRAPH + {0xD157, 0x57B9}, //7090 #CJK UNIFIED IDEOGRAPH + {0xD158, 0x57C1}, //7091 #CJK UNIFIED IDEOGRAPH + {0xD159, 0x590E}, //7092 #CJK UNIFIED IDEOGRAPH + {0xD15A, 0x594A}, //7093 #CJK UNIFIED IDEOGRAPH + {0xD15B, 0x5A19}, //7094 #CJK UNIFIED IDEOGRAPH + {0xD15C, 0x5A16}, //7095 #CJK UNIFIED IDEOGRAPH + {0xD15D, 0x5A2D}, //7096 #CJK UNIFIED IDEOGRAPH + {0xD15E, 0x5A2E}, //7097 #CJK UNIFIED IDEOGRAPH + {0xD15F, 0x5A15}, //7098 #CJK UNIFIED IDEOGRAPH + {0xD160, 0x5A0F}, //7099 #CJK UNIFIED IDEOGRAPH + {0xD161, 0x5A17}, //7100 #CJK UNIFIED IDEOGRAPH + {0xD162, 0x5A0A}, //7101 #CJK UNIFIED IDEOGRAPH + {0xD163, 0x5A1E}, //7102 #CJK UNIFIED IDEOGRAPH + {0xD164, 0x5A33}, //7103 #CJK UNIFIED IDEOGRAPH + {0xD165, 0x5B6C}, //7104 #CJK UNIFIED IDEOGRAPH + {0xD166, 0x5BA7}, //7105 #CJK UNIFIED IDEOGRAPH + {0xD167, 0x5BAD}, //7106 #CJK UNIFIED IDEOGRAPH + {0xD168, 0x5BAC}, //7107 #CJK UNIFIED IDEOGRAPH + {0xD169, 0x5C03}, //7108 #CJK UNIFIED IDEOGRAPH + {0xD16A, 0x5C56}, //7109 #CJK UNIFIED IDEOGRAPH + {0xD16B, 0x5C54}, //7110 #CJK UNIFIED IDEOGRAPH + {0xD16C, 0x5CEC}, //7111 #CJK UNIFIED IDEOGRAPH + {0xD16D, 0x5CFF}, //7112 #CJK UNIFIED IDEOGRAPH + {0xD16E, 0x5CEE}, //7113 #CJK UNIFIED IDEOGRAPH + {0xD16F, 0x5CF1}, //7114 #CJK UNIFIED IDEOGRAPH + {0xD170, 0x5CF7}, //7115 #CJK UNIFIED IDEOGRAPH + {0xD171, 0x5D00}, //7116 #CJK UNIFIED IDEOGRAPH + {0xD172, 0x5CF9}, //7117 #CJK UNIFIED IDEOGRAPH + {0xD173, 0x5E29}, //7118 #CJK UNIFIED IDEOGRAPH + {0xD174, 0x5E28}, //7119 #CJK UNIFIED IDEOGRAPH + {0xD175, 0x5EA8}, //7120 #CJK UNIFIED IDEOGRAPH + {0xD176, 0x5EAE}, //7121 #CJK UNIFIED IDEOGRAPH + {0xD177, 0x5EAA}, //7122 #CJK UNIFIED IDEOGRAPH + {0xD178, 0x5EAC}, //7123 #CJK UNIFIED IDEOGRAPH + {0xD179, 0x5F33}, //7124 #CJK UNIFIED IDEOGRAPH + {0xD17A, 0x5F30}, //7125 #CJK UNIFIED IDEOGRAPH + {0xD17B, 0x5F67}, //7126 #CJK UNIFIED IDEOGRAPH + {0xD17C, 0x605D}, //7127 #CJK UNIFIED IDEOGRAPH + {0xD17D, 0x605A}, //7128 #CJK UNIFIED IDEOGRAPH + {0xD17E, 0x6067}, //7129 #CJK UNIFIED IDEOGRAPH + {0xD1A1, 0x6041}, //7130 #CJK UNIFIED IDEOGRAPH + {0xD1A2, 0x60A2}, //7131 #CJK UNIFIED IDEOGRAPH + {0xD1A3, 0x6088}, //7132 #CJK UNIFIED IDEOGRAPH + {0xD1A4, 0x6080}, //7133 #CJK UNIFIED IDEOGRAPH + {0xD1A5, 0x6092}, //7134 #CJK UNIFIED IDEOGRAPH + {0xD1A6, 0x6081}, //7135 #CJK UNIFIED IDEOGRAPH + {0xD1A7, 0x609D}, //7136 #CJK UNIFIED IDEOGRAPH + {0xD1A8, 0x6083}, //7137 #CJK UNIFIED IDEOGRAPH + {0xD1A9, 0x6095}, //7138 #CJK UNIFIED IDEOGRAPH + {0xD1AA, 0x609B}, //7139 #CJK UNIFIED IDEOGRAPH + {0xD1AB, 0x6097}, //7140 #CJK UNIFIED IDEOGRAPH + {0xD1AC, 0x6087}, //7141 #CJK UNIFIED IDEOGRAPH + {0xD1AD, 0x609C}, //7142 #CJK UNIFIED IDEOGRAPH + {0xD1AE, 0x608E}, //7143 #CJK UNIFIED IDEOGRAPH + {0xD1AF, 0x6219}, //7144 #CJK UNIFIED IDEOGRAPH + {0xD1B0, 0x6246}, //7145 #CJK UNIFIED IDEOGRAPH + {0xD1B1, 0x62F2}, //7146 #CJK UNIFIED IDEOGRAPH + {0xD1B2, 0x6310}, //7147 #CJK UNIFIED IDEOGRAPH + {0xD1B3, 0x6356}, //7148 #CJK UNIFIED IDEOGRAPH + {0xD1B4, 0x632C}, //7149 #CJK UNIFIED IDEOGRAPH + {0xD1B5, 0x6344}, //7150 #CJK UNIFIED IDEOGRAPH + {0xD1B6, 0x6345}, //7151 #CJK UNIFIED IDEOGRAPH + {0xD1B7, 0x6336}, //7152 #CJK UNIFIED IDEOGRAPH + {0xD1B8, 0x6343}, //7153 #CJK UNIFIED IDEOGRAPH + {0xD1B9, 0x63E4}, //7154 #CJK UNIFIED IDEOGRAPH + {0xD1BA, 0x6339}, //7155 #CJK UNIFIED IDEOGRAPH + {0xD1BB, 0x634B}, //7156 #CJK UNIFIED IDEOGRAPH + {0xD1BC, 0x634A}, //7157 #CJK UNIFIED IDEOGRAPH + {0xD1BD, 0x633C}, //7158 #CJK UNIFIED IDEOGRAPH + {0xD1BE, 0x6329}, //7159 #CJK UNIFIED IDEOGRAPH + {0xD1BF, 0x6341}, //7160 #CJK UNIFIED IDEOGRAPH + {0xD1C0, 0x6334}, //7161 #CJK UNIFIED IDEOGRAPH + {0xD1C1, 0x6358}, //7162 #CJK UNIFIED IDEOGRAPH + {0xD1C2, 0x6354}, //7163 #CJK UNIFIED IDEOGRAPH + {0xD1C3, 0x6359}, //7164 #CJK UNIFIED IDEOGRAPH + {0xD1C4, 0x632D}, //7165 #CJK UNIFIED IDEOGRAPH + {0xD1C5, 0x6347}, //7166 #CJK UNIFIED IDEOGRAPH + {0xD1C6, 0x6333}, //7167 #CJK UNIFIED IDEOGRAPH + {0xD1C7, 0x635A}, //7168 #CJK UNIFIED IDEOGRAPH + {0xD1C8, 0x6351}, //7169 #CJK UNIFIED IDEOGRAPH + {0xD1C9, 0x6338}, //7170 #CJK UNIFIED IDEOGRAPH + {0xD1CA, 0x6357}, //7171 #CJK UNIFIED IDEOGRAPH + {0xD1CB, 0x6340}, //7172 #CJK UNIFIED IDEOGRAPH + {0xD1CC, 0x6348}, //7173 #CJK UNIFIED IDEOGRAPH + {0xD1CD, 0x654A}, //7174 #CJK UNIFIED IDEOGRAPH + {0xD1CE, 0x6546}, //7175 #CJK UNIFIED IDEOGRAPH + {0xD1CF, 0x65C6}, //7176 #CJK UNIFIED IDEOGRAPH + {0xD1D0, 0x65C3}, //7177 #CJK UNIFIED IDEOGRAPH + {0xD1D1, 0x65C4}, //7178 #CJK UNIFIED IDEOGRAPH + {0xD1D2, 0x65C2}, //7179 #CJK UNIFIED IDEOGRAPH + {0xD1D3, 0x664A}, //7180 #CJK UNIFIED IDEOGRAPH + {0xD1D4, 0x665F}, //7181 #CJK UNIFIED IDEOGRAPH + {0xD1D5, 0x6647}, //7182 #CJK UNIFIED IDEOGRAPH + {0xD1D6, 0x6651}, //7183 #CJK UNIFIED IDEOGRAPH + {0xD1D7, 0x6712}, //7184 #CJK UNIFIED IDEOGRAPH + {0xD1D8, 0x6713}, //7185 #CJK UNIFIED IDEOGRAPH + {0xD1D9, 0x681F}, //7186 #CJK UNIFIED IDEOGRAPH + {0xD1DA, 0x681A}, //7187 #CJK UNIFIED IDEOGRAPH + {0xD1DB, 0x6849}, //7188 #CJK UNIFIED IDEOGRAPH + {0xD1DC, 0x6832}, //7189 #CJK UNIFIED IDEOGRAPH + {0xD1DD, 0x6833}, //7190 #CJK UNIFIED IDEOGRAPH + {0xD1DE, 0x683B}, //7191 #CJK UNIFIED IDEOGRAPH + {0xD1DF, 0x684B}, //7192 #CJK UNIFIED IDEOGRAPH + {0xD1E0, 0x684F}, //7193 #CJK UNIFIED IDEOGRAPH + {0xD1E1, 0x6816}, //7194 #CJK UNIFIED IDEOGRAPH + {0xD1E2, 0x6831}, //7195 #CJK UNIFIED IDEOGRAPH + {0xD1E3, 0x681C}, //7196 #CJK UNIFIED IDEOGRAPH + {0xD1E4, 0x6835}, //7197 #CJK UNIFIED IDEOGRAPH + {0xD1E5, 0x682B}, //7198 #CJK UNIFIED IDEOGRAPH + {0xD1E6, 0x682D}, //7199 #CJK UNIFIED IDEOGRAPH + {0xD1E7, 0x682F}, //7200 #CJK UNIFIED IDEOGRAPH + {0xD1E8, 0x684E}, //7201 #CJK UNIFIED IDEOGRAPH + {0xD1E9, 0x6844}, //7202 #CJK UNIFIED IDEOGRAPH + {0xD1EA, 0x6834}, //7203 #CJK UNIFIED IDEOGRAPH + {0xD1EB, 0x681D}, //7204 #CJK UNIFIED IDEOGRAPH + {0xD1EC, 0x6812}, //7205 #CJK UNIFIED IDEOGRAPH + {0xD1ED, 0x6814}, //7206 #CJK UNIFIED IDEOGRAPH + {0xD1EE, 0x6826}, //7207 #CJK UNIFIED IDEOGRAPH + {0xD1EF, 0x6828}, //7208 #CJK UNIFIED IDEOGRAPH + {0xD1F0, 0x682E}, //7209 #CJK UNIFIED IDEOGRAPH + {0xD1F1, 0x684D}, //7210 #CJK UNIFIED IDEOGRAPH + {0xD1F2, 0x683A}, //7211 #CJK UNIFIED IDEOGRAPH + {0xD1F3, 0x6825}, //7212 #CJK UNIFIED IDEOGRAPH + {0xD1F4, 0x6820}, //7213 #CJK UNIFIED IDEOGRAPH + {0xD1F5, 0x6B2C}, //7214 #CJK UNIFIED IDEOGRAPH + {0xD1F6, 0x6B2F}, //7215 #CJK UNIFIED IDEOGRAPH + {0xD1F7, 0x6B2D}, //7216 #CJK UNIFIED IDEOGRAPH + {0xD1F8, 0x6B31}, //7217 #CJK UNIFIED IDEOGRAPH + {0xD1F9, 0x6B34}, //7218 #CJK UNIFIED IDEOGRAPH + {0xD1FA, 0x6B6D}, //7219 #CJK UNIFIED IDEOGRAPH + {0xD1FB, 0x8082}, //7220 #CJK UNIFIED IDEOGRAPH + {0xD1FC, 0x6B88}, //7221 #CJK UNIFIED IDEOGRAPH + {0xD1FD, 0x6BE6}, //7222 #CJK UNIFIED IDEOGRAPH + {0xD1FE, 0x6BE4}, //7223 #CJK UNIFIED IDEOGRAPH + {0xD240, 0x6BE8}, //7224 #CJK UNIFIED IDEOGRAPH + {0xD241, 0x6BE3}, //7225 #CJK UNIFIED IDEOGRAPH + {0xD242, 0x6BE2}, //7226 #CJK UNIFIED IDEOGRAPH + {0xD243, 0x6BE7}, //7227 #CJK UNIFIED IDEOGRAPH + {0xD244, 0x6C25}, //7228 #CJK UNIFIED IDEOGRAPH + {0xD245, 0x6D7A}, //7229 #CJK UNIFIED IDEOGRAPH + {0xD246, 0x6D63}, //7230 #CJK UNIFIED IDEOGRAPH + {0xD247, 0x6D64}, //7231 #CJK UNIFIED IDEOGRAPH + {0xD248, 0x6D76}, //7232 #CJK UNIFIED IDEOGRAPH + {0xD249, 0x6D0D}, //7233 #CJK UNIFIED IDEOGRAPH + {0xD24A, 0x6D61}, //7234 #CJK UNIFIED IDEOGRAPH + {0xD24B, 0x6D92}, //7235 #CJK UNIFIED IDEOGRAPH + {0xD24C, 0x6D58}, //7236 #CJK UNIFIED IDEOGRAPH + {0xD24D, 0x6D62}, //7237 #CJK UNIFIED IDEOGRAPH + {0xD24E, 0x6D6D}, //7238 #CJK UNIFIED IDEOGRAPH + {0xD24F, 0x6D6F}, //7239 #CJK UNIFIED IDEOGRAPH + {0xD250, 0x6D91}, //7240 #CJK UNIFIED IDEOGRAPH + {0xD251, 0x6D8D}, //7241 #CJK UNIFIED IDEOGRAPH + {0xD252, 0x6DEF}, //7242 #CJK UNIFIED IDEOGRAPH + {0xD253, 0x6D7F}, //7243 #CJK UNIFIED IDEOGRAPH + {0xD254, 0x6D86}, //7244 #CJK UNIFIED IDEOGRAPH + {0xD255, 0x6D5E}, //7245 #CJK UNIFIED IDEOGRAPH + {0xD256, 0x6D67}, //7246 #CJK UNIFIED IDEOGRAPH + {0xD257, 0x6D60}, //7247 #CJK UNIFIED IDEOGRAPH + {0xD258, 0x6D97}, //7248 #CJK UNIFIED IDEOGRAPH + {0xD259, 0x6D70}, //7249 #CJK UNIFIED IDEOGRAPH + {0xD25A, 0x6D7C}, //7250 #CJK UNIFIED IDEOGRAPH + {0xD25B, 0x6D5F}, //7251 #CJK UNIFIED IDEOGRAPH + {0xD25C, 0x6D82}, //7252 #CJK UNIFIED IDEOGRAPH + {0xD25D, 0x6D98}, //7253 #CJK UNIFIED IDEOGRAPH + {0xD25E, 0x6D2F}, //7254 #CJK UNIFIED IDEOGRAPH + {0xD25F, 0x6D68}, //7255 #CJK UNIFIED IDEOGRAPH + {0xD260, 0x6D8B}, //7256 #CJK UNIFIED IDEOGRAPH + {0xD261, 0x6D7E}, //7257 #CJK UNIFIED IDEOGRAPH + {0xD262, 0x6D80}, //7258 #CJK UNIFIED IDEOGRAPH + {0xD263, 0x6D84}, //7259 #CJK UNIFIED IDEOGRAPH + {0xD264, 0x6D16}, //7260 #CJK UNIFIED IDEOGRAPH + {0xD265, 0x6D83}, //7261 #CJK UNIFIED IDEOGRAPH + {0xD266, 0x6D7B}, //7262 #CJK UNIFIED IDEOGRAPH + {0xD267, 0x6D7D}, //7263 #CJK UNIFIED IDEOGRAPH + {0xD268, 0x6D75}, //7264 #CJK UNIFIED IDEOGRAPH + {0xD269, 0x6D90}, //7265 #CJK UNIFIED IDEOGRAPH + {0xD26A, 0x70DC}, //7266 #CJK UNIFIED IDEOGRAPH + {0xD26B, 0x70D3}, //7267 #CJK UNIFIED IDEOGRAPH + {0xD26C, 0x70D1}, //7268 #CJK UNIFIED IDEOGRAPH + {0xD26D, 0x70DD}, //7269 #CJK UNIFIED IDEOGRAPH + {0xD26E, 0x70CB}, //7270 #CJK UNIFIED IDEOGRAPH + {0xD26F, 0x7F39}, //7271 #CJK UNIFIED IDEOGRAPH + {0xD270, 0x70E2}, //7272 #CJK UNIFIED IDEOGRAPH + {0xD271, 0x70D7}, //7273 #CJK UNIFIED IDEOGRAPH + {0xD272, 0x70D2}, //7274 #CJK UNIFIED IDEOGRAPH + {0xD273, 0x70DE}, //7275 #CJK UNIFIED IDEOGRAPH + {0xD274, 0x70E0}, //7276 #CJK UNIFIED IDEOGRAPH + {0xD275, 0x70D4}, //7277 #CJK UNIFIED IDEOGRAPH + {0xD276, 0x70CD}, //7278 #CJK UNIFIED IDEOGRAPH + {0xD277, 0x70C5}, //7279 #CJK UNIFIED IDEOGRAPH + {0xD278, 0x70C6}, //7280 #CJK UNIFIED IDEOGRAPH + {0xD279, 0x70C7}, //7281 #CJK UNIFIED IDEOGRAPH + {0xD27A, 0x70DA}, //7282 #CJK UNIFIED IDEOGRAPH + {0xD27B, 0x70CE}, //7283 #CJK UNIFIED IDEOGRAPH + {0xD27C, 0x70E1}, //7284 #CJK UNIFIED IDEOGRAPH + {0xD27D, 0x7242}, //7285 #CJK UNIFIED IDEOGRAPH + {0xD27E, 0x7278}, //7286 #CJK UNIFIED IDEOGRAPH + {0xD2A1, 0x7277}, //7287 #CJK UNIFIED IDEOGRAPH + {0xD2A2, 0x7276}, //7288 #CJK UNIFIED IDEOGRAPH + {0xD2A3, 0x7300}, //7289 #CJK UNIFIED IDEOGRAPH + {0xD2A4, 0x72FA}, //7290 #CJK UNIFIED IDEOGRAPH + {0xD2A5, 0x72F4}, //7291 #CJK UNIFIED IDEOGRAPH + {0xD2A6, 0x72FE}, //7292 #CJK UNIFIED IDEOGRAPH + {0xD2A7, 0x72F6}, //7293 #CJK UNIFIED IDEOGRAPH + {0xD2A8, 0x72F3}, //7294 #CJK UNIFIED IDEOGRAPH + {0xD2A9, 0x72FB}, //7295 #CJK UNIFIED IDEOGRAPH + {0xD2AA, 0x7301}, //7296 #CJK UNIFIED IDEOGRAPH + {0xD2AB, 0x73D3}, //7297 #CJK UNIFIED IDEOGRAPH + {0xD2AC, 0x73D9}, //7298 #CJK UNIFIED IDEOGRAPH + {0xD2AD, 0x73E5}, //7299 #CJK UNIFIED IDEOGRAPH + {0xD2AE, 0x73D6}, //7300 #CJK UNIFIED IDEOGRAPH + {0xD2AF, 0x73BC}, //7301 #CJK UNIFIED IDEOGRAPH + {0xD2B0, 0x73E7}, //7302 #CJK UNIFIED IDEOGRAPH + {0xD2B1, 0x73E3}, //7303 #CJK UNIFIED IDEOGRAPH + {0xD2B2, 0x73E9}, //7304 #CJK UNIFIED IDEOGRAPH + {0xD2B3, 0x73DC}, //7305 #CJK UNIFIED IDEOGRAPH + {0xD2B4, 0x73D2}, //7306 #CJK UNIFIED IDEOGRAPH + {0xD2B5, 0x73DB}, //7307 #CJK UNIFIED IDEOGRAPH + {0xD2B6, 0x73D4}, //7308 #CJK UNIFIED IDEOGRAPH + {0xD2B7, 0x73DD}, //7309 #CJK UNIFIED IDEOGRAPH + {0xD2B8, 0x73DA}, //7310 #CJK UNIFIED IDEOGRAPH + {0xD2B9, 0x73D7}, //7311 #CJK UNIFIED IDEOGRAPH + {0xD2BA, 0x73D8}, //7312 #CJK UNIFIED IDEOGRAPH + {0xD2BB, 0x73E8}, //7313 #CJK UNIFIED IDEOGRAPH + {0xD2BC, 0x74DE}, //7314 #CJK UNIFIED IDEOGRAPH + {0xD2BD, 0x74DF}, //7315 #CJK UNIFIED IDEOGRAPH + {0xD2BE, 0x74F4}, //7316 #CJK UNIFIED IDEOGRAPH + {0xD2BF, 0x74F5}, //7317 #CJK UNIFIED IDEOGRAPH + {0xD2C0, 0x7521}, //7318 #CJK UNIFIED IDEOGRAPH + {0xD2C1, 0x755B}, //7319 #CJK UNIFIED IDEOGRAPH + {0xD2C2, 0x755F}, //7320 #CJK UNIFIED IDEOGRAPH + {0xD2C3, 0x75B0}, //7321 #CJK UNIFIED IDEOGRAPH + {0xD2C4, 0x75C1}, //7322 #CJK UNIFIED IDEOGRAPH + {0xD2C5, 0x75BB}, //7323 #CJK UNIFIED IDEOGRAPH + {0xD2C6, 0x75C4}, //7324 #CJK UNIFIED IDEOGRAPH + {0xD2C7, 0x75C0}, //7325 #CJK UNIFIED IDEOGRAPH + {0xD2C8, 0x75BF}, //7326 #CJK UNIFIED IDEOGRAPH + {0xD2C9, 0x75B6}, //7327 #CJK UNIFIED IDEOGRAPH + {0xD2CA, 0x75BA}, //7328 #CJK UNIFIED IDEOGRAPH + {0xD2CB, 0x768A}, //7329 #CJK UNIFIED IDEOGRAPH + {0xD2CC, 0x76C9}, //7330 #CJK UNIFIED IDEOGRAPH + {0xD2CD, 0x771D}, //7331 #CJK UNIFIED IDEOGRAPH + {0xD2CE, 0x771B}, //7332 #CJK UNIFIED IDEOGRAPH + {0xD2CF, 0x7710}, //7333 #CJK UNIFIED IDEOGRAPH + {0xD2D0, 0x7713}, //7334 #CJK UNIFIED IDEOGRAPH + {0xD2D1, 0x7712}, //7335 #CJK UNIFIED IDEOGRAPH + {0xD2D2, 0x7723}, //7336 #CJK UNIFIED IDEOGRAPH + {0xD2D3, 0x7711}, //7337 #CJK UNIFIED IDEOGRAPH + {0xD2D4, 0x7715}, //7338 #CJK UNIFIED IDEOGRAPH + {0xD2D5, 0x7719}, //7339 #CJK UNIFIED IDEOGRAPH + {0xD2D6, 0x771A}, //7340 #CJK UNIFIED IDEOGRAPH + {0xD2D7, 0x7722}, //7341 #CJK UNIFIED IDEOGRAPH + {0xD2D8, 0x7727}, //7342 #CJK UNIFIED IDEOGRAPH + {0xD2D9, 0x7823}, //7343 #CJK UNIFIED IDEOGRAPH + {0xD2DA, 0x782C}, //7344 #CJK UNIFIED IDEOGRAPH + {0xD2DB, 0x7822}, //7345 #CJK UNIFIED IDEOGRAPH + {0xD2DC, 0x7835}, //7346 #CJK UNIFIED IDEOGRAPH + {0xD2DD, 0x782F}, //7347 #CJK UNIFIED IDEOGRAPH + {0xD2DE, 0x7828}, //7348 #CJK UNIFIED IDEOGRAPH + {0xD2DF, 0x782E}, //7349 #CJK UNIFIED IDEOGRAPH + {0xD2E0, 0x782B}, //7350 #CJK UNIFIED IDEOGRAPH + {0xD2E1, 0x7821}, //7351 #CJK UNIFIED IDEOGRAPH + {0xD2E2, 0x7829}, //7352 #CJK UNIFIED IDEOGRAPH + {0xD2E3, 0x7833}, //7353 #CJK UNIFIED IDEOGRAPH + {0xD2E4, 0x782A}, //7354 #CJK UNIFIED IDEOGRAPH + {0xD2E5, 0x7831}, //7355 #CJK UNIFIED IDEOGRAPH + {0xD2E6, 0x7954}, //7356 #CJK UNIFIED IDEOGRAPH + {0xD2E7, 0x795B}, //7357 #CJK UNIFIED IDEOGRAPH + {0xD2E8, 0x794F}, //7358 #CJK UNIFIED IDEOGRAPH + {0xD2E9, 0x795C}, //7359 #CJK UNIFIED IDEOGRAPH + {0xD2EA, 0x7953}, //7360 #CJK UNIFIED IDEOGRAPH + {0xD2EB, 0x7952}, //7361 #CJK UNIFIED IDEOGRAPH + {0xD2EC, 0x7951}, //7362 #CJK UNIFIED IDEOGRAPH + {0xD2ED, 0x79EB}, //7363 #CJK UNIFIED IDEOGRAPH + {0xD2EE, 0x79EC}, //7364 #CJK UNIFIED IDEOGRAPH + {0xD2EF, 0x79E0}, //7365 #CJK UNIFIED IDEOGRAPH + {0xD2F0, 0x79EE}, //7366 #CJK UNIFIED IDEOGRAPH + {0xD2F1, 0x79ED}, //7367 #CJK UNIFIED IDEOGRAPH + {0xD2F2, 0x79EA}, //7368 #CJK UNIFIED IDEOGRAPH + {0xD2F3, 0x79DC}, //7369 #CJK UNIFIED IDEOGRAPH + {0xD2F4, 0x79DE}, //7370 #CJK UNIFIED IDEOGRAPH + {0xD2F5, 0x79DD}, //7371 #CJK UNIFIED IDEOGRAPH + {0xD2F6, 0x7A86}, //7372 #CJK UNIFIED IDEOGRAPH + {0xD2F7, 0x7A89}, //7373 #CJK UNIFIED IDEOGRAPH + {0xD2F8, 0x7A85}, //7374 #CJK UNIFIED IDEOGRAPH + {0xD2F9, 0x7A8B}, //7375 #CJK UNIFIED IDEOGRAPH + {0xD2FA, 0x7A8C}, //7376 #CJK UNIFIED IDEOGRAPH + {0xD2FB, 0x7A8A}, //7377 #CJK UNIFIED IDEOGRAPH + {0xD2FC, 0x7A87}, //7378 #CJK UNIFIED IDEOGRAPH + {0xD2FD, 0x7AD8}, //7379 #CJK UNIFIED IDEOGRAPH + {0xD2FE, 0x7B10}, //7380 #CJK UNIFIED IDEOGRAPH + {0xD340, 0x7B04}, //7381 #CJK UNIFIED IDEOGRAPH + {0xD341, 0x7B13}, //7382 #CJK UNIFIED IDEOGRAPH + {0xD342, 0x7B05}, //7383 #CJK UNIFIED IDEOGRAPH + {0xD343, 0x7B0F}, //7384 #CJK UNIFIED IDEOGRAPH + {0xD344, 0x7B08}, //7385 #CJK UNIFIED IDEOGRAPH + {0xD345, 0x7B0A}, //7386 #CJK UNIFIED IDEOGRAPH + {0xD346, 0x7B0E}, //7387 #CJK UNIFIED IDEOGRAPH + {0xD347, 0x7B09}, //7388 #CJK UNIFIED IDEOGRAPH + {0xD348, 0x7B12}, //7389 #CJK UNIFIED IDEOGRAPH + {0xD349, 0x7C84}, //7390 #CJK UNIFIED IDEOGRAPH + {0xD34A, 0x7C91}, //7391 #CJK UNIFIED IDEOGRAPH + {0xD34B, 0x7C8A}, //7392 #CJK UNIFIED IDEOGRAPH + {0xD34C, 0x7C8C}, //7393 #CJK UNIFIED IDEOGRAPH + {0xD34D, 0x7C88}, //7394 #CJK UNIFIED IDEOGRAPH + {0xD34E, 0x7C8D}, //7395 #CJK UNIFIED IDEOGRAPH + {0xD34F, 0x7C85}, //7396 #CJK UNIFIED IDEOGRAPH + {0xD350, 0x7D1E}, //7397 #CJK UNIFIED IDEOGRAPH + {0xD351, 0x7D1D}, //7398 #CJK UNIFIED IDEOGRAPH + {0xD352, 0x7D11}, //7399 #CJK UNIFIED IDEOGRAPH + {0xD353, 0x7D0E}, //7400 #CJK UNIFIED IDEOGRAPH + {0xD354, 0x7D18}, //7401 #CJK UNIFIED IDEOGRAPH + {0xD355, 0x7D16}, //7402 #CJK UNIFIED IDEOGRAPH + {0xD356, 0x7D13}, //7403 #CJK UNIFIED IDEOGRAPH + {0xD357, 0x7D1F}, //7404 #CJK UNIFIED IDEOGRAPH + {0xD358, 0x7D12}, //7405 #CJK UNIFIED IDEOGRAPH + {0xD359, 0x7D0F}, //7406 #CJK UNIFIED IDEOGRAPH + {0xD35A, 0x7D0C}, //7407 #CJK UNIFIED IDEOGRAPH + {0xD35B, 0x7F5C}, //7408 #CJK UNIFIED IDEOGRAPH + {0xD35C, 0x7F61}, //7409 #CJK UNIFIED IDEOGRAPH + {0xD35D, 0x7F5E}, //7410 #CJK UNIFIED IDEOGRAPH + {0xD35E, 0x7F60}, //7411 #CJK UNIFIED IDEOGRAPH + {0xD35F, 0x7F5D}, //7412 #CJK UNIFIED IDEOGRAPH + {0xD360, 0x7F5B}, //7413 #CJK UNIFIED IDEOGRAPH + {0xD361, 0x7F96}, //7414 #CJK UNIFIED IDEOGRAPH + {0xD362, 0x7F92}, //7415 #CJK UNIFIED IDEOGRAPH + {0xD363, 0x7FC3}, //7416 #CJK UNIFIED IDEOGRAPH + {0xD364, 0x7FC2}, //7417 #CJK UNIFIED IDEOGRAPH + {0xD365, 0x7FC0}, //7418 #CJK UNIFIED IDEOGRAPH + {0xD366, 0x8016}, //7419 #CJK UNIFIED IDEOGRAPH + {0xD367, 0x803E}, //7420 #CJK UNIFIED IDEOGRAPH + {0xD368, 0x8039}, //7421 #CJK UNIFIED IDEOGRAPH + {0xD369, 0x80FA}, //7422 #CJK UNIFIED IDEOGRAPH + {0xD36A, 0x80F2}, //7423 #CJK UNIFIED IDEOGRAPH + {0xD36B, 0x80F9}, //7424 #CJK UNIFIED IDEOGRAPH + {0xD36C, 0x80F5}, //7425 #CJK UNIFIED IDEOGRAPH + {0xD36D, 0x8101}, //7426 #CJK UNIFIED IDEOGRAPH + {0xD36E, 0x80FB}, //7427 #CJK UNIFIED IDEOGRAPH + {0xD36F, 0x8100}, //7428 #CJK UNIFIED IDEOGRAPH + {0xD370, 0x8201}, //7429 #CJK UNIFIED IDEOGRAPH + {0xD371, 0x822F}, //7430 #CJK UNIFIED IDEOGRAPH + {0xD372, 0x8225}, //7431 #CJK UNIFIED IDEOGRAPH + {0xD373, 0x8333}, //7432 #CJK UNIFIED IDEOGRAPH + {0xD374, 0x832D}, //7433 #CJK UNIFIED IDEOGRAPH + {0xD375, 0x8344}, //7434 #CJK UNIFIED IDEOGRAPH + {0xD376, 0x8319}, //7435 #CJK UNIFIED IDEOGRAPH + {0xD377, 0x8351}, //7436 #CJK UNIFIED IDEOGRAPH + {0xD378, 0x8325}, //7437 #CJK UNIFIED IDEOGRAPH + {0xD379, 0x8356}, //7438 #CJK UNIFIED IDEOGRAPH + {0xD37A, 0x833F}, //7439 #CJK UNIFIED IDEOGRAPH + {0xD37B, 0x8341}, //7440 #CJK UNIFIED IDEOGRAPH + {0xD37C, 0x8326}, //7441 #CJK UNIFIED IDEOGRAPH + {0xD37D, 0x831C}, //7442 #CJK UNIFIED IDEOGRAPH + {0xD37E, 0x8322}, //7443 #CJK UNIFIED IDEOGRAPH + {0xD3A1, 0x8342}, //7444 #CJK UNIFIED IDEOGRAPH + {0xD3A2, 0x834E}, //7445 #CJK UNIFIED IDEOGRAPH + {0xD3A3, 0x831B}, //7446 #CJK UNIFIED IDEOGRAPH + {0xD3A4, 0x832A}, //7447 #CJK UNIFIED IDEOGRAPH + {0xD3A5, 0x8308}, //7448 #CJK UNIFIED IDEOGRAPH + {0xD3A6, 0x833C}, //7449 #CJK UNIFIED IDEOGRAPH + {0xD3A7, 0x834D}, //7450 #CJK UNIFIED IDEOGRAPH + {0xD3A8, 0x8316}, //7451 #CJK UNIFIED IDEOGRAPH + {0xD3A9, 0x8324}, //7452 #CJK UNIFIED IDEOGRAPH + {0xD3AA, 0x8320}, //7453 #CJK UNIFIED IDEOGRAPH + {0xD3AB, 0x8337}, //7454 #CJK UNIFIED IDEOGRAPH + {0xD3AC, 0x832F}, //7455 #CJK UNIFIED IDEOGRAPH + {0xD3AD, 0x8329}, //7456 #CJK UNIFIED IDEOGRAPH + {0xD3AE, 0x8347}, //7457 #CJK UNIFIED IDEOGRAPH + {0xD3AF, 0x8345}, //7458 #CJK UNIFIED IDEOGRAPH + {0xD3B0, 0x834C}, //7459 #CJK UNIFIED IDEOGRAPH + {0xD3B1, 0x8353}, //7460 #CJK UNIFIED IDEOGRAPH + {0xD3B2, 0x831E}, //7461 #CJK UNIFIED IDEOGRAPH + {0xD3B3, 0x832C}, //7462 #CJK UNIFIED IDEOGRAPH + {0xD3B4, 0x834B}, //7463 #CJK UNIFIED IDEOGRAPH + {0xD3B5, 0x8327}, //7464 #CJK UNIFIED IDEOGRAPH + {0xD3B6, 0x8348}, //7465 #CJK UNIFIED IDEOGRAPH + {0xD3B7, 0x8653}, //7466 #CJK UNIFIED IDEOGRAPH + {0xD3B8, 0x8652}, //7467 #CJK UNIFIED IDEOGRAPH + {0xD3B9, 0x86A2}, //7468 #CJK UNIFIED IDEOGRAPH + {0xD3BA, 0x86A8}, //7469 #CJK UNIFIED IDEOGRAPH + {0xD3BB, 0x8696}, //7470 #CJK UNIFIED IDEOGRAPH + {0xD3BC, 0x868D}, //7471 #CJK UNIFIED IDEOGRAPH + {0xD3BD, 0x8691}, //7472 #CJK UNIFIED IDEOGRAPH + {0xD3BE, 0x869E}, //7473 #CJK UNIFIED IDEOGRAPH + {0xD3BF, 0x8687}, //7474 #CJK UNIFIED IDEOGRAPH + {0xD3C0, 0x8697}, //7475 #CJK UNIFIED IDEOGRAPH + {0xD3C1, 0x8686}, //7476 #CJK UNIFIED IDEOGRAPH + {0xD3C2, 0x868B}, //7477 #CJK UNIFIED IDEOGRAPH + {0xD3C3, 0x869A}, //7478 #CJK UNIFIED IDEOGRAPH + {0xD3C4, 0x8685}, //7479 #CJK UNIFIED IDEOGRAPH + {0xD3C5, 0x86A5}, //7480 #CJK UNIFIED IDEOGRAPH + {0xD3C6, 0x8699}, //7481 #CJK UNIFIED IDEOGRAPH + {0xD3C7, 0x86A1}, //7482 #CJK UNIFIED IDEOGRAPH + {0xD3C8, 0x86A7}, //7483 #CJK UNIFIED IDEOGRAPH + {0xD3C9, 0x8695}, //7484 #CJK UNIFIED IDEOGRAPH + {0xD3CA, 0x8698}, //7485 #CJK UNIFIED IDEOGRAPH + {0xD3CB, 0x868E}, //7486 #CJK UNIFIED IDEOGRAPH + {0xD3CC, 0x869D}, //7487 #CJK UNIFIED IDEOGRAPH + {0xD3CD, 0x8690}, //7488 #CJK UNIFIED IDEOGRAPH + {0xD3CE, 0x8694}, //7489 #CJK UNIFIED IDEOGRAPH + {0xD3CF, 0x8843}, //7490 #CJK UNIFIED IDEOGRAPH + {0xD3D0, 0x8844}, //7491 #CJK UNIFIED IDEOGRAPH + {0xD3D1, 0x886D}, //7492 #CJK UNIFIED IDEOGRAPH + {0xD3D2, 0x8875}, //7493 #CJK UNIFIED IDEOGRAPH + {0xD3D3, 0x8876}, //7494 #CJK UNIFIED IDEOGRAPH + {0xD3D4, 0x8872}, //7495 #CJK UNIFIED IDEOGRAPH + {0xD3D5, 0x8880}, //7496 #CJK UNIFIED IDEOGRAPH + {0xD3D6, 0x8871}, //7497 #CJK UNIFIED IDEOGRAPH + {0xD3D7, 0x887F}, //7498 #CJK UNIFIED IDEOGRAPH + {0xD3D8, 0x886F}, //7499 #CJK UNIFIED IDEOGRAPH + {0xD3D9, 0x8883}, //7500 #CJK UNIFIED IDEOGRAPH + {0xD3DA, 0x887E}, //7501 #CJK UNIFIED IDEOGRAPH + {0xD3DB, 0x8874}, //7502 #CJK UNIFIED IDEOGRAPH + {0xD3DC, 0x887C}, //7503 #CJK UNIFIED IDEOGRAPH + {0xD3DD, 0x8A12}, //7504 #CJK UNIFIED IDEOGRAPH + {0xD3DE, 0x8C47}, //7505 #CJK UNIFIED IDEOGRAPH + {0xD3DF, 0x8C57}, //7506 #CJK UNIFIED IDEOGRAPH + {0xD3E0, 0x8C7B}, //7507 #CJK UNIFIED IDEOGRAPH + {0xD3E1, 0x8CA4}, //7508 #CJK UNIFIED IDEOGRAPH + {0xD3E2, 0x8CA3}, //7509 #CJK UNIFIED IDEOGRAPH + {0xD3E3, 0x8D76}, //7510 #CJK UNIFIED IDEOGRAPH + {0xD3E4, 0x8D78}, //7511 #CJK UNIFIED IDEOGRAPH + {0xD3E5, 0x8DB5}, //7512 #CJK UNIFIED IDEOGRAPH + {0xD3E6, 0x8DB7}, //7513 #CJK UNIFIED IDEOGRAPH + {0xD3E7, 0x8DB6}, //7514 #CJK UNIFIED IDEOGRAPH + {0xD3E8, 0x8ED1}, //7515 #CJK UNIFIED IDEOGRAPH + {0xD3E9, 0x8ED3}, //7516 #CJK UNIFIED IDEOGRAPH + {0xD3EA, 0x8FFE}, //7517 #CJK UNIFIED IDEOGRAPH + {0xD3EB, 0x8FF5}, //7518 #CJK UNIFIED IDEOGRAPH + {0xD3EC, 0x9002}, //7519 #CJK UNIFIED IDEOGRAPH + {0xD3ED, 0x8FFF}, //7520 #CJK UNIFIED IDEOGRAPH + {0xD3EE, 0x8FFB}, //7521 #CJK UNIFIED IDEOGRAPH + {0xD3EF, 0x9004}, //7522 #CJK UNIFIED IDEOGRAPH + {0xD3F0, 0x8FFC}, //7523 #CJK UNIFIED IDEOGRAPH + {0xD3F1, 0x8FF6}, //7524 #CJK UNIFIED IDEOGRAPH + {0xD3F2, 0x90D6}, //7525 #CJK UNIFIED IDEOGRAPH + {0xD3F3, 0x90E0}, //7526 #CJK UNIFIED IDEOGRAPH + {0xD3F4, 0x90D9}, //7527 #CJK UNIFIED IDEOGRAPH + {0xD3F5, 0x90DA}, //7528 #CJK UNIFIED IDEOGRAPH + {0xD3F6, 0x90E3}, //7529 #CJK UNIFIED IDEOGRAPH + {0xD3F7, 0x90DF}, //7530 #CJK UNIFIED IDEOGRAPH + {0xD3F8, 0x90E5}, //7531 #CJK UNIFIED IDEOGRAPH + {0xD3F9, 0x90D8}, //7532 #CJK UNIFIED IDEOGRAPH + {0xD3FA, 0x90DB}, //7533 #CJK UNIFIED IDEOGRAPH + {0xD3FB, 0x90D7}, //7534 #CJK UNIFIED IDEOGRAPH + {0xD3FC, 0x90DC}, //7535 #CJK UNIFIED IDEOGRAPH + {0xD3FD, 0x90E4}, //7536 #CJK UNIFIED IDEOGRAPH + {0xD3FE, 0x9150}, //7537 #CJK UNIFIED IDEOGRAPH + {0xD440, 0x914E}, //7538 #CJK UNIFIED IDEOGRAPH + {0xD441, 0x914F}, //7539 #CJK UNIFIED IDEOGRAPH + {0xD442, 0x91D5}, //7540 #CJK UNIFIED IDEOGRAPH + {0xD443, 0x91E2}, //7541 #CJK UNIFIED IDEOGRAPH + {0xD444, 0x91DA}, //7542 #CJK UNIFIED IDEOGRAPH + {0xD445, 0x965C}, //7543 #CJK UNIFIED IDEOGRAPH + {0xD446, 0x965F}, //7544 #CJK UNIFIED IDEOGRAPH + {0xD447, 0x96BC}, //7545 #CJK UNIFIED IDEOGRAPH + {0xD448, 0x98E3}, //7546 #CJK UNIFIED IDEOGRAPH + {0xD449, 0x9ADF}, //7547 #CJK UNIFIED IDEOGRAPH + {0xD44A, 0x9B2F}, //7548 #CJK UNIFIED IDEOGRAPH + {0xD44B, 0x4E7F}, //7549 #CJK UNIFIED IDEOGRAPH + {0xD44C, 0x5070}, //7550 #CJK UNIFIED IDEOGRAPH + {0xD44D, 0x506A}, //7551 #CJK UNIFIED IDEOGRAPH + {0xD44E, 0x5061}, //7552 #CJK UNIFIED IDEOGRAPH + {0xD44F, 0x505E}, //7553 #CJK UNIFIED IDEOGRAPH + {0xD450, 0x5060}, //7554 #CJK UNIFIED IDEOGRAPH + {0xD451, 0x5053}, //7555 #CJK UNIFIED IDEOGRAPH + {0xD452, 0x504B}, //7556 #CJK UNIFIED IDEOGRAPH + {0xD453, 0x505D}, //7557 #CJK UNIFIED IDEOGRAPH + {0xD454, 0x5072}, //7558 #CJK UNIFIED IDEOGRAPH + {0xD455, 0x5048}, //7559 #CJK UNIFIED IDEOGRAPH + {0xD456, 0x504D}, //7560 #CJK UNIFIED IDEOGRAPH + {0xD457, 0x5041}, //7561 #CJK UNIFIED IDEOGRAPH + {0xD458, 0x505B}, //7562 #CJK UNIFIED IDEOGRAPH + {0xD459, 0x504A}, //7563 #CJK UNIFIED IDEOGRAPH + {0xD45A, 0x5062}, //7564 #CJK UNIFIED IDEOGRAPH + {0xD45B, 0x5015}, //7565 #CJK UNIFIED IDEOGRAPH + {0xD45C, 0x5045}, //7566 #CJK UNIFIED IDEOGRAPH + {0xD45D, 0x505F}, //7567 #CJK UNIFIED IDEOGRAPH + {0xD45E, 0x5069}, //7568 #CJK UNIFIED IDEOGRAPH + {0xD45F, 0x506B}, //7569 #CJK UNIFIED IDEOGRAPH + {0xD460, 0x5063}, //7570 #CJK UNIFIED IDEOGRAPH + {0xD461, 0x5064}, //7571 #CJK UNIFIED IDEOGRAPH + {0xD462, 0x5046}, //7572 #CJK UNIFIED IDEOGRAPH + {0xD463, 0x5040}, //7573 #CJK UNIFIED IDEOGRAPH + {0xD464, 0x506E}, //7574 #CJK UNIFIED IDEOGRAPH + {0xD465, 0x5073}, //7575 #CJK UNIFIED IDEOGRAPH + {0xD466, 0x5057}, //7576 #CJK UNIFIED IDEOGRAPH + {0xD467, 0x5051}, //7577 #CJK UNIFIED IDEOGRAPH + {0xD468, 0x51D0}, //7578 #CJK UNIFIED IDEOGRAPH + {0xD469, 0x526B}, //7579 #CJK UNIFIED IDEOGRAPH + {0xD46A, 0x526D}, //7580 #CJK UNIFIED IDEOGRAPH + {0xD46B, 0x526C}, //7581 #CJK UNIFIED IDEOGRAPH + {0xD46C, 0x526E}, //7582 #CJK UNIFIED IDEOGRAPH + {0xD46D, 0x52D6}, //7583 #CJK UNIFIED IDEOGRAPH + {0xD46E, 0x52D3}, //7584 #CJK UNIFIED IDEOGRAPH + {0xD46F, 0x532D}, //7585 #CJK UNIFIED IDEOGRAPH + {0xD470, 0x539C}, //7586 #CJK UNIFIED IDEOGRAPH + {0xD471, 0x5575}, //7587 #CJK UNIFIED IDEOGRAPH + {0xD472, 0x5576}, //7588 #CJK UNIFIED IDEOGRAPH + {0xD473, 0x553C}, //7589 #CJK UNIFIED IDEOGRAPH + {0xD474, 0x554D}, //7590 #CJK UNIFIED IDEOGRAPH + {0xD475, 0x5550}, //7591 #CJK UNIFIED IDEOGRAPH + {0xD476, 0x5534}, //7592 #CJK UNIFIED IDEOGRAPH + {0xD477, 0x552A}, //7593 #CJK UNIFIED IDEOGRAPH + {0xD478, 0x5551}, //7594 #CJK UNIFIED IDEOGRAPH + {0xD479, 0x5562}, //7595 #CJK UNIFIED IDEOGRAPH + {0xD47A, 0x5536}, //7596 #CJK UNIFIED IDEOGRAPH + {0xD47B, 0x5535}, //7597 #CJK UNIFIED IDEOGRAPH + {0xD47C, 0x5530}, //7598 #CJK UNIFIED IDEOGRAPH + {0xD47D, 0x5552}, //7599 #CJK UNIFIED IDEOGRAPH + {0xD47E, 0x5545}, //7600 #CJK UNIFIED IDEOGRAPH + {0xD4A1, 0x550C}, //7601 #CJK UNIFIED IDEOGRAPH + {0xD4A2, 0x5532}, //7602 #CJK UNIFIED IDEOGRAPH + {0xD4A3, 0x5565}, //7603 #CJK UNIFIED IDEOGRAPH + {0xD4A4, 0x554E}, //7604 #CJK UNIFIED IDEOGRAPH + {0xD4A5, 0x5539}, //7605 #CJK UNIFIED IDEOGRAPH + {0xD4A6, 0x5548}, //7606 #CJK UNIFIED IDEOGRAPH + {0xD4A7, 0x552D}, //7607 #CJK UNIFIED IDEOGRAPH + {0xD4A8, 0x553B}, //7608 #CJK UNIFIED IDEOGRAPH + {0xD4A9, 0x5540}, //7609 #CJK UNIFIED IDEOGRAPH + {0xD4AA, 0x554B}, //7610 #CJK UNIFIED IDEOGRAPH + {0xD4AB, 0x570A}, //7611 #CJK UNIFIED IDEOGRAPH + {0xD4AC, 0x5707}, //7612 #CJK UNIFIED IDEOGRAPH + {0xD4AD, 0x57FB}, //7613 #CJK UNIFIED IDEOGRAPH + {0xD4AE, 0x5814}, //7614 #CJK UNIFIED IDEOGRAPH + {0xD4AF, 0x57E2}, //7615 #CJK UNIFIED IDEOGRAPH + {0xD4B0, 0x57F6}, //7616 #CJK UNIFIED IDEOGRAPH + {0xD4B1, 0x57DC}, //7617 #CJK UNIFIED IDEOGRAPH + {0xD4B2, 0x57F4}, //7618 #CJK UNIFIED IDEOGRAPH + {0xD4B3, 0x5800}, //7619 #CJK UNIFIED IDEOGRAPH + {0xD4B4, 0x57ED}, //7620 #CJK UNIFIED IDEOGRAPH + {0xD4B5, 0x57FD}, //7621 #CJK UNIFIED IDEOGRAPH + {0xD4B6, 0x5808}, //7622 #CJK UNIFIED IDEOGRAPH + {0xD4B7, 0x57F8}, //7623 #CJK UNIFIED IDEOGRAPH + {0xD4B8, 0x580B}, //7624 #CJK UNIFIED IDEOGRAPH + {0xD4B9, 0x57F3}, //7625 #CJK UNIFIED IDEOGRAPH + {0xD4BA, 0x57CF}, //7626 #CJK UNIFIED IDEOGRAPH + {0xD4BB, 0x5807}, //7627 #CJK UNIFIED IDEOGRAPH + {0xD4BC, 0x57EE}, //7628 #CJK UNIFIED IDEOGRAPH + {0xD4BD, 0x57E3}, //7629 #CJK UNIFIED IDEOGRAPH + {0xD4BE, 0x57F2}, //7630 #CJK UNIFIED IDEOGRAPH + {0xD4BF, 0x57E5}, //7631 #CJK UNIFIED IDEOGRAPH + {0xD4C0, 0x57EC}, //7632 #CJK UNIFIED IDEOGRAPH + {0xD4C1, 0x57E1}, //7633 #CJK UNIFIED IDEOGRAPH + {0xD4C2, 0x580E}, //7634 #CJK UNIFIED IDEOGRAPH + {0xD4C3, 0x57FC}, //7635 #CJK UNIFIED IDEOGRAPH + {0xD4C4, 0x5810}, //7636 #CJK UNIFIED IDEOGRAPH + {0xD4C5, 0x57E7}, //7637 #CJK UNIFIED IDEOGRAPH + {0xD4C6, 0x5801}, //7638 #CJK UNIFIED IDEOGRAPH + {0xD4C7, 0x580C}, //7639 #CJK UNIFIED IDEOGRAPH + {0xD4C8, 0x57F1}, //7640 #CJK UNIFIED IDEOGRAPH + {0xD4C9, 0x57E9}, //7641 #CJK UNIFIED IDEOGRAPH + {0xD4CA, 0x57F0}, //7642 #CJK UNIFIED IDEOGRAPH + {0xD4CB, 0x580D}, //7643 #CJK UNIFIED IDEOGRAPH + {0xD4CC, 0x5804}, //7644 #CJK UNIFIED IDEOGRAPH + {0xD4CD, 0x595C}, //7645 #CJK UNIFIED IDEOGRAPH + {0xD4CE, 0x5A60}, //7646 #CJK UNIFIED IDEOGRAPH + {0xD4CF, 0x5A58}, //7647 #CJK UNIFIED IDEOGRAPH + {0xD4D0, 0x5A55}, //7648 #CJK UNIFIED IDEOGRAPH + {0xD4D1, 0x5A67}, //7649 #CJK UNIFIED IDEOGRAPH + {0xD4D2, 0x5A5E}, //7650 #CJK UNIFIED IDEOGRAPH + {0xD4D3, 0x5A38}, //7651 #CJK UNIFIED IDEOGRAPH + {0xD4D4, 0x5A35}, //7652 #CJK UNIFIED IDEOGRAPH + {0xD4D5, 0x5A6D}, //7653 #CJK UNIFIED IDEOGRAPH + {0xD4D6, 0x5A50}, //7654 #CJK UNIFIED IDEOGRAPH + {0xD4D7, 0x5A5F}, //7655 #CJK UNIFIED IDEOGRAPH + {0xD4D8, 0x5A65}, //7656 #CJK UNIFIED IDEOGRAPH + {0xD4D9, 0x5A6C}, //7657 #CJK UNIFIED IDEOGRAPH + {0xD4DA, 0x5A53}, //7658 #CJK UNIFIED IDEOGRAPH + {0xD4DB, 0x5A64}, //7659 #CJK UNIFIED IDEOGRAPH + {0xD4DC, 0x5A57}, //7660 #CJK UNIFIED IDEOGRAPH + {0xD4DD, 0x5A43}, //7661 #CJK UNIFIED IDEOGRAPH + {0xD4DE, 0x5A5D}, //7662 #CJK UNIFIED IDEOGRAPH + {0xD4DF, 0x5A52}, //7663 #CJK UNIFIED IDEOGRAPH + {0xD4E0, 0x5A44}, //7664 #CJK UNIFIED IDEOGRAPH + {0xD4E1, 0x5A5B}, //7665 #CJK UNIFIED IDEOGRAPH + {0xD4E2, 0x5A48}, //7666 #CJK UNIFIED IDEOGRAPH + {0xD4E3, 0x5A8E}, //7667 #CJK UNIFIED IDEOGRAPH + {0xD4E4, 0x5A3E}, //7668 #CJK UNIFIED IDEOGRAPH + {0xD4E5, 0x5A4D}, //7669 #CJK UNIFIED IDEOGRAPH + {0xD4E6, 0x5A39}, //7670 #CJK UNIFIED IDEOGRAPH + {0xD4E7, 0x5A4C}, //7671 #CJK UNIFIED IDEOGRAPH + {0xD4E8, 0x5A70}, //7672 #CJK UNIFIED IDEOGRAPH + {0xD4E9, 0x5A69}, //7673 #CJK UNIFIED IDEOGRAPH + {0xD4EA, 0x5A47}, //7674 #CJK UNIFIED IDEOGRAPH + {0xD4EB, 0x5A51}, //7675 #CJK UNIFIED IDEOGRAPH + {0xD4EC, 0x5A56}, //7676 #CJK UNIFIED IDEOGRAPH + {0xD4ED, 0x5A42}, //7677 #CJK UNIFIED IDEOGRAPH + {0xD4EE, 0x5A5C}, //7678 #CJK UNIFIED IDEOGRAPH + {0xD4EF, 0x5B72}, //7679 #CJK UNIFIED IDEOGRAPH + {0xD4F0, 0x5B6E}, //7680 #CJK UNIFIED IDEOGRAPH + {0xD4F1, 0x5BC1}, //7681 #CJK UNIFIED IDEOGRAPH + {0xD4F2, 0x5BC0}, //7682 #CJK UNIFIED IDEOGRAPH + {0xD4F3, 0x5C59}, //7683 #CJK UNIFIED IDEOGRAPH + {0xD4F4, 0x5D1E}, //7684 #CJK UNIFIED IDEOGRAPH + {0xD4F5, 0x5D0B}, //7685 #CJK UNIFIED IDEOGRAPH + {0xD4F6, 0x5D1D}, //7686 #CJK UNIFIED IDEOGRAPH + {0xD4F7, 0x5D1A}, //7687 #CJK UNIFIED IDEOGRAPH + {0xD4F8, 0x5D20}, //7688 #CJK UNIFIED IDEOGRAPH + {0xD4F9, 0x5D0C}, //7689 #CJK UNIFIED IDEOGRAPH + {0xD4FA, 0x5D28}, //7690 #CJK UNIFIED IDEOGRAPH + {0xD4FB, 0x5D0D}, //7691 #CJK UNIFIED IDEOGRAPH + {0xD4FC, 0x5D26}, //7692 #CJK UNIFIED IDEOGRAPH + {0xD4FD, 0x5D25}, //7693 #CJK UNIFIED IDEOGRAPH + {0xD4FE, 0x5D0F}, //7694 #CJK UNIFIED IDEOGRAPH + {0xD540, 0x5D30}, //7695 #CJK UNIFIED IDEOGRAPH + {0xD541, 0x5D12}, //7696 #CJK UNIFIED IDEOGRAPH + {0xD542, 0x5D23}, //7697 #CJK UNIFIED IDEOGRAPH + {0xD543, 0x5D1F}, //7698 #CJK UNIFIED IDEOGRAPH + {0xD544, 0x5D2E}, //7699 #CJK UNIFIED IDEOGRAPH + {0xD545, 0x5E3E}, //7700 #CJK UNIFIED IDEOGRAPH + {0xD546, 0x5E34}, //7701 #CJK UNIFIED IDEOGRAPH + {0xD547, 0x5EB1}, //7702 #CJK UNIFIED IDEOGRAPH + {0xD548, 0x5EB4}, //7703 #CJK UNIFIED IDEOGRAPH + {0xD549, 0x5EB9}, //7704 #CJK UNIFIED IDEOGRAPH + {0xD54A, 0x5EB2}, //7705 #CJK UNIFIED IDEOGRAPH + {0xD54B, 0x5EB3}, //7706 #CJK UNIFIED IDEOGRAPH + {0xD54C, 0x5F36}, //7707 #CJK UNIFIED IDEOGRAPH + {0xD54D, 0x5F38}, //7708 #CJK UNIFIED IDEOGRAPH + {0xD54E, 0x5F9B}, //7709 #CJK UNIFIED IDEOGRAPH + {0xD54F, 0x5F96}, //7710 #CJK UNIFIED IDEOGRAPH + {0xD550, 0x5F9F}, //7711 #CJK UNIFIED IDEOGRAPH + {0xD551, 0x608A}, //7712 #CJK UNIFIED IDEOGRAPH + {0xD552, 0x6090}, //7713 #CJK UNIFIED IDEOGRAPH + {0xD553, 0x6086}, //7714 #CJK UNIFIED IDEOGRAPH + {0xD554, 0x60BE}, //7715 #CJK UNIFIED IDEOGRAPH + {0xD555, 0x60B0}, //7716 #CJK UNIFIED IDEOGRAPH + {0xD556, 0x60BA}, //7717 #CJK UNIFIED IDEOGRAPH + {0xD557, 0x60D3}, //7718 #CJK UNIFIED IDEOGRAPH + {0xD558, 0x60D4}, //7719 #CJK UNIFIED IDEOGRAPH + {0xD559, 0x60CF}, //7720 #CJK UNIFIED IDEOGRAPH + {0xD55A, 0x60E4}, //7721 #CJK UNIFIED IDEOGRAPH + {0xD55B, 0x60D9}, //7722 #CJK UNIFIED IDEOGRAPH + {0xD55C, 0x60DD}, //7723 #CJK UNIFIED IDEOGRAPH + {0xD55D, 0x60C8}, //7724 #CJK UNIFIED IDEOGRAPH + {0xD55E, 0x60B1}, //7725 #CJK UNIFIED IDEOGRAPH + {0xD55F, 0x60DB}, //7726 #CJK UNIFIED IDEOGRAPH + {0xD560, 0x60B7}, //7727 #CJK UNIFIED IDEOGRAPH + {0xD561, 0x60CA}, //7728 #CJK UNIFIED IDEOGRAPH + {0xD562, 0x60BF}, //7729 #CJK UNIFIED IDEOGRAPH + {0xD563, 0x60C3}, //7730 #CJK UNIFIED IDEOGRAPH + {0xD564, 0x60CD}, //7731 #CJK UNIFIED IDEOGRAPH + {0xD565, 0x60C0}, //7732 #CJK UNIFIED IDEOGRAPH + {0xD566, 0x6332}, //7733 #CJK UNIFIED IDEOGRAPH + {0xD567, 0x6365}, //7734 #CJK UNIFIED IDEOGRAPH + {0xD568, 0x638A}, //7735 #CJK UNIFIED IDEOGRAPH + {0xD569, 0x6382}, //7736 #CJK UNIFIED IDEOGRAPH + {0xD56A, 0x637D}, //7737 #CJK UNIFIED IDEOGRAPH + {0xD56B, 0x63BD}, //7738 #CJK UNIFIED IDEOGRAPH + {0xD56C, 0x639E}, //7739 #CJK UNIFIED IDEOGRAPH + {0xD56D, 0x63AD}, //7740 #CJK UNIFIED IDEOGRAPH + {0xD56E, 0x639D}, //7741 #CJK UNIFIED IDEOGRAPH + {0xD56F, 0x6397}, //7742 #CJK UNIFIED IDEOGRAPH + {0xD570, 0x63AB}, //7743 #CJK UNIFIED IDEOGRAPH + {0xD571, 0x638E}, //7744 #CJK UNIFIED IDEOGRAPH + {0xD572, 0x636F}, //7745 #CJK UNIFIED IDEOGRAPH + {0xD573, 0x6387}, //7746 #CJK UNIFIED IDEOGRAPH + {0xD574, 0x6390}, //7747 #CJK UNIFIED IDEOGRAPH + {0xD575, 0x636E}, //7748 #CJK UNIFIED IDEOGRAPH + {0xD576, 0x63AF}, //7749 #CJK UNIFIED IDEOGRAPH + {0xD577, 0x6375}, //7750 #CJK UNIFIED IDEOGRAPH + {0xD578, 0x639C}, //7751 #CJK UNIFIED IDEOGRAPH + {0xD579, 0x636D}, //7752 #CJK UNIFIED IDEOGRAPH + {0xD57A, 0x63AE}, //7753 #CJK UNIFIED IDEOGRAPH + {0xD57B, 0x637C}, //7754 #CJK UNIFIED IDEOGRAPH + {0xD57C, 0x63A4}, //7755 #CJK UNIFIED IDEOGRAPH + {0xD57D, 0x633B}, //7756 #CJK UNIFIED IDEOGRAPH + {0xD57E, 0x639F}, //7757 #CJK UNIFIED IDEOGRAPH + {0xD5A1, 0x6378}, //7758 #CJK UNIFIED IDEOGRAPH + {0xD5A2, 0x6385}, //7759 #CJK UNIFIED IDEOGRAPH + {0xD5A3, 0x6381}, //7760 #CJK UNIFIED IDEOGRAPH + {0xD5A4, 0x6391}, //7761 #CJK UNIFIED IDEOGRAPH + {0xD5A5, 0x638D}, //7762 #CJK UNIFIED IDEOGRAPH + {0xD5A6, 0x6370}, //7763 #CJK UNIFIED IDEOGRAPH + {0xD5A7, 0x6553}, //7764 #CJK UNIFIED IDEOGRAPH + {0xD5A8, 0x65CD}, //7765 #CJK UNIFIED IDEOGRAPH + {0xD5A9, 0x6665}, //7766 #CJK UNIFIED IDEOGRAPH + {0xD5AA, 0x6661}, //7767 #CJK UNIFIED IDEOGRAPH + {0xD5AB, 0x665B}, //7768 #CJK UNIFIED IDEOGRAPH + {0xD5AC, 0x6659}, //7769 #CJK UNIFIED IDEOGRAPH + {0xD5AD, 0x665C}, //7770 #CJK UNIFIED IDEOGRAPH + {0xD5AE, 0x6662}, //7771 #CJK UNIFIED IDEOGRAPH + {0xD5AF, 0x6718}, //7772 #CJK UNIFIED IDEOGRAPH + {0xD5B0, 0x6879}, //7773 #CJK UNIFIED IDEOGRAPH + {0xD5B1, 0x6887}, //7774 #CJK UNIFIED IDEOGRAPH + {0xD5B2, 0x6890}, //7775 #CJK UNIFIED IDEOGRAPH + {0xD5B3, 0x689C}, //7776 #CJK UNIFIED IDEOGRAPH + {0xD5B4, 0x686D}, //7777 #CJK UNIFIED IDEOGRAPH + {0xD5B5, 0x686E}, //7778 #CJK UNIFIED IDEOGRAPH + {0xD5B6, 0x68AE}, //7779 #CJK UNIFIED IDEOGRAPH + {0xD5B7, 0x68AB}, //7780 #CJK UNIFIED IDEOGRAPH + {0xD5B8, 0x6956}, //7781 #CJK UNIFIED IDEOGRAPH + {0xD5B9, 0x686F}, //7782 #CJK UNIFIED IDEOGRAPH + {0xD5BA, 0x68A3}, //7783 #CJK UNIFIED IDEOGRAPH + {0xD5BB, 0x68AC}, //7784 #CJK UNIFIED IDEOGRAPH + {0xD5BC, 0x68A9}, //7785 #CJK UNIFIED IDEOGRAPH + {0xD5BD, 0x6875}, //7786 #CJK UNIFIED IDEOGRAPH + {0xD5BE, 0x6874}, //7787 #CJK UNIFIED IDEOGRAPH + {0xD5BF, 0x68B2}, //7788 #CJK UNIFIED IDEOGRAPH + {0xD5C0, 0x688F}, //7789 #CJK UNIFIED IDEOGRAPH + {0xD5C1, 0x6877}, //7790 #CJK UNIFIED IDEOGRAPH + {0xD5C2, 0x6892}, //7791 #CJK UNIFIED IDEOGRAPH + {0xD5C3, 0x687C}, //7792 #CJK UNIFIED IDEOGRAPH + {0xD5C4, 0x686B}, //7793 #CJK UNIFIED IDEOGRAPH + {0xD5C5, 0x6872}, //7794 #CJK UNIFIED IDEOGRAPH + {0xD5C6, 0x68AA}, //7795 #CJK UNIFIED IDEOGRAPH + {0xD5C7, 0x6880}, //7796 #CJK UNIFIED IDEOGRAPH + {0xD5C8, 0x6871}, //7797 #CJK UNIFIED IDEOGRAPH + {0xD5C9, 0x687E}, //7798 #CJK UNIFIED IDEOGRAPH + {0xD5CA, 0x689B}, //7799 #CJK UNIFIED IDEOGRAPH + {0xD5CB, 0x6896}, //7800 #CJK UNIFIED IDEOGRAPH + {0xD5CC, 0x688B}, //7801 #CJK UNIFIED IDEOGRAPH + {0xD5CD, 0x68A0}, //7802 #CJK UNIFIED IDEOGRAPH + {0xD5CE, 0x6889}, //7803 #CJK UNIFIED IDEOGRAPH + {0xD5CF, 0x68A4}, //7804 #CJK UNIFIED IDEOGRAPH + {0xD5D0, 0x6878}, //7805 #CJK UNIFIED IDEOGRAPH + {0xD5D1, 0x687B}, //7806 #CJK UNIFIED IDEOGRAPH + {0xD5D2, 0x6891}, //7807 #CJK UNIFIED IDEOGRAPH + {0xD5D3, 0x688C}, //7808 #CJK UNIFIED IDEOGRAPH + {0xD5D4, 0x688A}, //7809 #CJK UNIFIED IDEOGRAPH + {0xD5D5, 0x687D}, //7810 #CJK UNIFIED IDEOGRAPH + {0xD5D6, 0x6B36}, //7811 #CJK UNIFIED IDEOGRAPH + {0xD5D7, 0x6B33}, //7812 #CJK UNIFIED IDEOGRAPH + {0xD5D8, 0x6B37}, //7813 #CJK UNIFIED IDEOGRAPH + {0xD5D9, 0x6B38}, //7814 #CJK UNIFIED IDEOGRAPH + {0xD5DA, 0x6B91}, //7815 #CJK UNIFIED IDEOGRAPH + {0xD5DB, 0x6B8F}, //7816 #CJK UNIFIED IDEOGRAPH + {0xD5DC, 0x6B8D}, //7817 #CJK UNIFIED IDEOGRAPH + {0xD5DD, 0x6B8E}, //7818 #CJK UNIFIED IDEOGRAPH + {0xD5DE, 0x6B8C}, //7819 #CJK UNIFIED IDEOGRAPH + {0xD5DF, 0x6C2A}, //7820 #CJK UNIFIED IDEOGRAPH + {0xD5E0, 0x6DC0}, //7821 #CJK UNIFIED IDEOGRAPH + {0xD5E1, 0x6DAB}, //7822 #CJK UNIFIED IDEOGRAPH + {0xD5E2, 0x6DB4}, //7823 #CJK UNIFIED IDEOGRAPH + {0xD5E3, 0x6DB3}, //7824 #CJK UNIFIED IDEOGRAPH + {0xD5E4, 0x6E74}, //7825 #CJK UNIFIED IDEOGRAPH + {0xD5E5, 0x6DAC}, //7826 #CJK UNIFIED IDEOGRAPH + {0xD5E6, 0x6DE9}, //7827 #CJK UNIFIED IDEOGRAPH + {0xD5E7, 0x6DE2}, //7828 #CJK UNIFIED IDEOGRAPH + {0xD5E8, 0x6DB7}, //7829 #CJK UNIFIED IDEOGRAPH + {0xD5E9, 0x6DF6}, //7830 #CJK UNIFIED IDEOGRAPH + {0xD5EA, 0x6DD4}, //7831 #CJK UNIFIED IDEOGRAPH + {0xD5EB, 0x6E00}, //7832 #CJK UNIFIED IDEOGRAPH + {0xD5EC, 0x6DC8}, //7833 #CJK UNIFIED IDEOGRAPH + {0xD5ED, 0x6DE0}, //7834 #CJK UNIFIED IDEOGRAPH + {0xD5EE, 0x6DDF}, //7835 #CJK UNIFIED IDEOGRAPH + {0xD5EF, 0x6DD6}, //7836 #CJK UNIFIED IDEOGRAPH + {0xD5F0, 0x6DBE}, //7837 #CJK UNIFIED IDEOGRAPH + {0xD5F1, 0x6DE5}, //7838 #CJK UNIFIED IDEOGRAPH + {0xD5F2, 0x6DDC}, //7839 #CJK UNIFIED IDEOGRAPH + {0xD5F3, 0x6DDD}, //7840 #CJK UNIFIED IDEOGRAPH + {0xD5F4, 0x6DDB}, //7841 #CJK UNIFIED IDEOGRAPH + {0xD5F5, 0x6DF4}, //7842 #CJK UNIFIED IDEOGRAPH + {0xD5F6, 0x6DCA}, //7843 #CJK UNIFIED IDEOGRAPH + {0xD5F7, 0x6DBD}, //7844 #CJK UNIFIED IDEOGRAPH + {0xD5F8, 0x6DED}, //7845 #CJK UNIFIED IDEOGRAPH + {0xD5F9, 0x6DF0}, //7846 #CJK UNIFIED IDEOGRAPH + {0xD5FA, 0x6DBA}, //7847 #CJK UNIFIED IDEOGRAPH + {0xD5FB, 0x6DD5}, //7848 #CJK UNIFIED IDEOGRAPH + {0xD5FC, 0x6DC2}, //7849 #CJK UNIFIED IDEOGRAPH + {0xD5FD, 0x6DCF}, //7850 #CJK UNIFIED IDEOGRAPH + {0xD5FE, 0x6DC9}, //7851 #CJK UNIFIED IDEOGRAPH + {0xD640, 0x6DD0}, //7852 #CJK UNIFIED IDEOGRAPH + {0xD641, 0x6DF2}, //7853 #CJK UNIFIED IDEOGRAPH + {0xD642, 0x6DD3}, //7854 #CJK UNIFIED IDEOGRAPH + {0xD643, 0x6DFD}, //7855 #CJK UNIFIED IDEOGRAPH + {0xD644, 0x6DD7}, //7856 #CJK UNIFIED IDEOGRAPH + {0xD645, 0x6DCD}, //7857 #CJK UNIFIED IDEOGRAPH + {0xD646, 0x6DE3}, //7858 #CJK UNIFIED IDEOGRAPH + {0xD647, 0x6DBB}, //7859 #CJK UNIFIED IDEOGRAPH + {0xD648, 0x70FA}, //7860 #CJK UNIFIED IDEOGRAPH + {0xD649, 0x710D}, //7861 #CJK UNIFIED IDEOGRAPH + {0xD64A, 0x70F7}, //7862 #CJK UNIFIED IDEOGRAPH + {0xD64B, 0x7117}, //7863 #CJK UNIFIED IDEOGRAPH + {0xD64C, 0x70F4}, //7864 #CJK UNIFIED IDEOGRAPH + {0xD64D, 0x710C}, //7865 #CJK UNIFIED IDEOGRAPH + {0xD64E, 0x70F0}, //7866 #CJK UNIFIED IDEOGRAPH + {0xD64F, 0x7104}, //7867 #CJK UNIFIED IDEOGRAPH + {0xD650, 0x70F3}, //7868 #CJK UNIFIED IDEOGRAPH + {0xD651, 0x7110}, //7869 #CJK UNIFIED IDEOGRAPH + {0xD652, 0x70FC}, //7870 #CJK UNIFIED IDEOGRAPH + {0xD653, 0x70FF}, //7871 #CJK UNIFIED IDEOGRAPH + {0xD654, 0x7106}, //7872 #CJK UNIFIED IDEOGRAPH + {0xD655, 0x7113}, //7873 #CJK UNIFIED IDEOGRAPH + {0xD656, 0x7100}, //7874 #CJK UNIFIED IDEOGRAPH + {0xD657, 0x70F8}, //7875 #CJK UNIFIED IDEOGRAPH + {0xD658, 0x70F6}, //7876 #CJK UNIFIED IDEOGRAPH + {0xD659, 0x710B}, //7877 #CJK UNIFIED IDEOGRAPH + {0xD65A, 0x7102}, //7878 #CJK UNIFIED IDEOGRAPH + {0xD65B, 0x710E}, //7879 #CJK UNIFIED IDEOGRAPH + {0xD65C, 0x727E}, //7880 #CJK UNIFIED IDEOGRAPH + {0xD65D, 0x727B}, //7881 #CJK UNIFIED IDEOGRAPH + {0xD65E, 0x727C}, //7882 #CJK UNIFIED IDEOGRAPH + {0xD65F, 0x727F}, //7883 #CJK UNIFIED IDEOGRAPH + {0xD660, 0x731D}, //7884 #CJK UNIFIED IDEOGRAPH + {0xD661, 0x7317}, //7885 #CJK UNIFIED IDEOGRAPH + {0xD662, 0x7307}, //7886 #CJK UNIFIED IDEOGRAPH + {0xD663, 0x7311}, //7887 #CJK UNIFIED IDEOGRAPH + {0xD664, 0x7318}, //7888 #CJK UNIFIED IDEOGRAPH + {0xD665, 0x730A}, //7889 #CJK UNIFIED IDEOGRAPH + {0xD666, 0x7308}, //7890 #CJK UNIFIED IDEOGRAPH + {0xD667, 0x72FF}, //7891 #CJK UNIFIED IDEOGRAPH + {0xD668, 0x730F}, //7892 #CJK UNIFIED IDEOGRAPH + {0xD669, 0x731E}, //7893 #CJK UNIFIED IDEOGRAPH + {0xD66A, 0x7388}, //7894 #CJK UNIFIED IDEOGRAPH + {0xD66B, 0x73F6}, //7895 #CJK UNIFIED IDEOGRAPH + {0xD66C, 0x73F8}, //7896 #CJK UNIFIED IDEOGRAPH + {0xD66D, 0x73F5}, //7897 #CJK UNIFIED IDEOGRAPH + {0xD66E, 0x7404}, //7898 #CJK UNIFIED IDEOGRAPH + {0xD66F, 0x7401}, //7899 #CJK UNIFIED IDEOGRAPH + {0xD670, 0x73FD}, //7900 #CJK UNIFIED IDEOGRAPH + {0xD671, 0x7407}, //7901 #CJK UNIFIED IDEOGRAPH + {0xD672, 0x7400}, //7902 #CJK UNIFIED IDEOGRAPH + {0xD673, 0x73FA}, //7903 #CJK UNIFIED IDEOGRAPH + {0xD674, 0x73FC}, //7904 #CJK UNIFIED IDEOGRAPH + {0xD675, 0x73FF}, //7905 #CJK UNIFIED IDEOGRAPH + {0xD676, 0x740C}, //7906 #CJK UNIFIED IDEOGRAPH + {0xD677, 0x740B}, //7907 #CJK UNIFIED IDEOGRAPH + {0xD678, 0x73F4}, //7908 #CJK UNIFIED IDEOGRAPH + {0xD679, 0x7408}, //7909 #CJK UNIFIED IDEOGRAPH + {0xD67A, 0x7564}, //7910 #CJK UNIFIED IDEOGRAPH + {0xD67B, 0x7563}, //7911 #CJK UNIFIED IDEOGRAPH + {0xD67C, 0x75CE}, //7912 #CJK UNIFIED IDEOGRAPH + {0xD67D, 0x75D2}, //7913 #CJK UNIFIED IDEOGRAPH + {0xD67E, 0x75CF}, //7914 #CJK UNIFIED IDEOGRAPH + {0xD6A1, 0x75CB}, //7915 #CJK UNIFIED IDEOGRAPH + {0xD6A2, 0x75CC}, //7916 #CJK UNIFIED IDEOGRAPH + {0xD6A3, 0x75D1}, //7917 #CJK UNIFIED IDEOGRAPH + {0xD6A4, 0x75D0}, //7918 #CJK UNIFIED IDEOGRAPH + {0xD6A5, 0x768F}, //7919 #CJK UNIFIED IDEOGRAPH + {0xD6A6, 0x7689}, //7920 #CJK UNIFIED IDEOGRAPH + {0xD6A7, 0x76D3}, //7921 #CJK UNIFIED IDEOGRAPH + {0xD6A8, 0x7739}, //7922 #CJK UNIFIED IDEOGRAPH + {0xD6A9, 0x772F}, //7923 #CJK UNIFIED IDEOGRAPH + {0xD6AA, 0x772D}, //7924 #CJK UNIFIED IDEOGRAPH + {0xD6AB, 0x7731}, //7925 #CJK UNIFIED IDEOGRAPH + {0xD6AC, 0x7732}, //7926 #CJK UNIFIED IDEOGRAPH + {0xD6AD, 0x7734}, //7927 #CJK UNIFIED IDEOGRAPH + {0xD6AE, 0x7733}, //7928 #CJK UNIFIED IDEOGRAPH + {0xD6AF, 0x773D}, //7929 #CJK UNIFIED IDEOGRAPH + {0xD6B0, 0x7725}, //7930 #CJK UNIFIED IDEOGRAPH + {0xD6B1, 0x773B}, //7931 #CJK UNIFIED IDEOGRAPH + {0xD6B2, 0x7735}, //7932 #CJK UNIFIED IDEOGRAPH + {0xD6B3, 0x7848}, //7933 #CJK UNIFIED IDEOGRAPH + {0xD6B4, 0x7852}, //7934 #CJK UNIFIED IDEOGRAPH + {0xD6B5, 0x7849}, //7935 #CJK UNIFIED IDEOGRAPH + {0xD6B6, 0x784D}, //7936 #CJK UNIFIED IDEOGRAPH + {0xD6B7, 0x784A}, //7937 #CJK UNIFIED IDEOGRAPH + {0xD6B8, 0x784C}, //7938 #CJK UNIFIED IDEOGRAPH + {0xD6B9, 0x7826}, //7939 #CJK UNIFIED IDEOGRAPH + {0xD6BA, 0x7845}, //7940 #CJK UNIFIED IDEOGRAPH + {0xD6BB, 0x7850}, //7941 #CJK UNIFIED IDEOGRAPH + {0xD6BC, 0x7964}, //7942 #CJK UNIFIED IDEOGRAPH + {0xD6BD, 0x7967}, //7943 #CJK UNIFIED IDEOGRAPH + {0xD6BE, 0x7969}, //7944 #CJK UNIFIED IDEOGRAPH + {0xD6BF, 0x796A}, //7945 #CJK UNIFIED IDEOGRAPH + {0xD6C0, 0x7963}, //7946 #CJK UNIFIED IDEOGRAPH + {0xD6C1, 0x796B}, //7947 #CJK UNIFIED IDEOGRAPH + {0xD6C2, 0x7961}, //7948 #CJK UNIFIED IDEOGRAPH + {0xD6C3, 0x79BB}, //7949 #CJK UNIFIED IDEOGRAPH + {0xD6C4, 0x79FA}, //7950 #CJK UNIFIED IDEOGRAPH + {0xD6C5, 0x79F8}, //7951 #CJK UNIFIED IDEOGRAPH + {0xD6C6, 0x79F6}, //7952 #CJK UNIFIED IDEOGRAPH + {0xD6C7, 0x79F7}, //7953 #CJK UNIFIED IDEOGRAPH + {0xD6C8, 0x7A8F}, //7954 #CJK UNIFIED IDEOGRAPH + {0xD6C9, 0x7A94}, //7955 #CJK UNIFIED IDEOGRAPH + {0xD6CA, 0x7A90}, //7956 #CJK UNIFIED IDEOGRAPH + {0xD6CB, 0x7B35}, //7957 #CJK UNIFIED IDEOGRAPH + {0xD6CC, 0x7B47}, //7958 #CJK UNIFIED IDEOGRAPH + {0xD6CD, 0x7B34}, //7959 #CJK UNIFIED IDEOGRAPH + {0xD6CE, 0x7B25}, //7960 #CJK UNIFIED IDEOGRAPH + {0xD6CF, 0x7B30}, //7961 #CJK UNIFIED IDEOGRAPH + {0xD6D0, 0x7B22}, //7962 #CJK UNIFIED IDEOGRAPH + {0xD6D1, 0x7B24}, //7963 #CJK UNIFIED IDEOGRAPH + {0xD6D2, 0x7B33}, //7964 #CJK UNIFIED IDEOGRAPH + {0xD6D3, 0x7B18}, //7965 #CJK UNIFIED IDEOGRAPH + {0xD6D4, 0x7B2A}, //7966 #CJK UNIFIED IDEOGRAPH + {0xD6D5, 0x7B1D}, //7967 #CJK UNIFIED IDEOGRAPH + {0xD6D6, 0x7B31}, //7968 #CJK UNIFIED IDEOGRAPH + {0xD6D7, 0x7B2B}, //7969 #CJK UNIFIED IDEOGRAPH + {0xD6D8, 0x7B2D}, //7970 #CJK UNIFIED IDEOGRAPH + {0xD6D9, 0x7B2F}, //7971 #CJK UNIFIED IDEOGRAPH + {0xD6DA, 0x7B32}, //7972 #CJK UNIFIED IDEOGRAPH + {0xD6DB, 0x7B38}, //7973 #CJK UNIFIED IDEOGRAPH + {0xD6DC, 0x7B1A}, //7974 #CJK UNIFIED IDEOGRAPH + {0xD6DD, 0x7B23}, //7975 #CJK UNIFIED IDEOGRAPH + {0xD6DE, 0x7C94}, //7976 #CJK UNIFIED IDEOGRAPH + {0xD6DF, 0x7C98}, //7977 #CJK UNIFIED IDEOGRAPH + {0xD6E0, 0x7C96}, //7978 #CJK UNIFIED IDEOGRAPH + {0xD6E1, 0x7CA3}, //7979 #CJK UNIFIED IDEOGRAPH + {0xD6E2, 0x7D35}, //7980 #CJK UNIFIED IDEOGRAPH + {0xD6E3, 0x7D3D}, //7981 #CJK UNIFIED IDEOGRAPH + {0xD6E4, 0x7D38}, //7982 #CJK UNIFIED IDEOGRAPH + {0xD6E5, 0x7D36}, //7983 #CJK UNIFIED IDEOGRAPH + {0xD6E6, 0x7D3A}, //7984 #CJK UNIFIED IDEOGRAPH + {0xD6E7, 0x7D45}, //7985 #CJK UNIFIED IDEOGRAPH + {0xD6E8, 0x7D2C}, //7986 #CJK UNIFIED IDEOGRAPH + {0xD6E9, 0x7D29}, //7987 #CJK UNIFIED IDEOGRAPH + {0xD6EA, 0x7D41}, //7988 #CJK UNIFIED IDEOGRAPH + {0xD6EB, 0x7D47}, //7989 #CJK UNIFIED IDEOGRAPH + {0xD6EC, 0x7D3E}, //7990 #CJK UNIFIED IDEOGRAPH + {0xD6ED, 0x7D3F}, //7991 #CJK UNIFIED IDEOGRAPH + {0xD6EE, 0x7D4A}, //7992 #CJK UNIFIED IDEOGRAPH + {0xD6EF, 0x7D3B}, //7993 #CJK UNIFIED IDEOGRAPH + {0xD6F0, 0x7D28}, //7994 #CJK UNIFIED IDEOGRAPH + {0xD6F1, 0x7F63}, //7995 #CJK UNIFIED IDEOGRAPH + {0xD6F2, 0x7F95}, //7996 #CJK UNIFIED IDEOGRAPH + {0xD6F3, 0x7F9C}, //7997 #CJK UNIFIED IDEOGRAPH + {0xD6F4, 0x7F9D}, //7998 #CJK UNIFIED IDEOGRAPH + {0xD6F5, 0x7F9B}, //7999 #CJK UNIFIED IDEOGRAPH + {0xD6F6, 0x7FCA}, //8000 #CJK UNIFIED IDEOGRAPH + {0xD6F7, 0x7FCB}, //8001 #CJK UNIFIED IDEOGRAPH + {0xD6F8, 0x7FCD}, //8002 #CJK UNIFIED IDEOGRAPH + {0xD6F9, 0x7FD0}, //8003 #CJK UNIFIED IDEOGRAPH + {0xD6FA, 0x7FD1}, //8004 #CJK UNIFIED IDEOGRAPH + {0xD6FB, 0x7FC7}, //8005 #CJK UNIFIED IDEOGRAPH + {0xD6FC, 0x7FCF}, //8006 #CJK UNIFIED IDEOGRAPH + {0xD6FD, 0x7FC9}, //8007 #CJK UNIFIED IDEOGRAPH + {0xD6FE, 0x801F}, //8008 #CJK UNIFIED IDEOGRAPH + {0xD740, 0x801E}, //8009 #CJK UNIFIED IDEOGRAPH + {0xD741, 0x801B}, //8010 #CJK UNIFIED IDEOGRAPH + {0xD742, 0x8047}, //8011 #CJK UNIFIED IDEOGRAPH + {0xD743, 0x8043}, //8012 #CJK UNIFIED IDEOGRAPH + {0xD744, 0x8048}, //8013 #CJK UNIFIED IDEOGRAPH + {0xD745, 0x8118}, //8014 #CJK UNIFIED IDEOGRAPH + {0xD746, 0x8125}, //8015 #CJK UNIFIED IDEOGRAPH + {0xD747, 0x8119}, //8016 #CJK UNIFIED IDEOGRAPH + {0xD748, 0x811B}, //8017 #CJK UNIFIED IDEOGRAPH + {0xD749, 0x812D}, //8018 #CJK UNIFIED IDEOGRAPH + {0xD74A, 0x811F}, //8019 #CJK UNIFIED IDEOGRAPH + {0xD74B, 0x812C}, //8020 #CJK UNIFIED IDEOGRAPH + {0xD74C, 0x811E}, //8021 #CJK UNIFIED IDEOGRAPH + {0xD74D, 0x8121}, //8022 #CJK UNIFIED IDEOGRAPH + {0xD74E, 0x8115}, //8023 #CJK UNIFIED IDEOGRAPH + {0xD74F, 0x8127}, //8024 #CJK UNIFIED IDEOGRAPH + {0xD750, 0x811D}, //8025 #CJK UNIFIED IDEOGRAPH + {0xD751, 0x8122}, //8026 #CJK UNIFIED IDEOGRAPH + {0xD752, 0x8211}, //8027 #CJK UNIFIED IDEOGRAPH + {0xD753, 0x8238}, //8028 #CJK UNIFIED IDEOGRAPH + {0xD754, 0x8233}, //8029 #CJK UNIFIED IDEOGRAPH + {0xD755, 0x823A}, //8030 #CJK UNIFIED IDEOGRAPH + {0xD756, 0x8234}, //8031 #CJK UNIFIED IDEOGRAPH + {0xD757, 0x8232}, //8032 #CJK UNIFIED IDEOGRAPH + {0xD758, 0x8274}, //8033 #CJK UNIFIED IDEOGRAPH + {0xD759, 0x8390}, //8034 #CJK UNIFIED IDEOGRAPH + {0xD75A, 0x83A3}, //8035 #CJK UNIFIED IDEOGRAPH + {0xD75B, 0x83A8}, //8036 #CJK UNIFIED IDEOGRAPH + {0xD75C, 0x838D}, //8037 #CJK UNIFIED IDEOGRAPH + {0xD75D, 0x837A}, //8038 #CJK UNIFIED IDEOGRAPH + {0xD75E, 0x8373}, //8039 #CJK UNIFIED IDEOGRAPH + {0xD75F, 0x83A4}, //8040 #CJK UNIFIED IDEOGRAPH + {0xD760, 0x8374}, //8041 #CJK UNIFIED IDEOGRAPH + {0xD761, 0x838F}, //8042 #CJK UNIFIED IDEOGRAPH + {0xD762, 0x8381}, //8043 #CJK UNIFIED IDEOGRAPH + {0xD763, 0x8395}, //8044 #CJK UNIFIED IDEOGRAPH + {0xD764, 0x8399}, //8045 #CJK UNIFIED IDEOGRAPH + {0xD765, 0x8375}, //8046 #CJK UNIFIED IDEOGRAPH + {0xD766, 0x8394}, //8047 #CJK UNIFIED IDEOGRAPH + {0xD767, 0x83A9}, //8048 #CJK UNIFIED IDEOGRAPH + {0xD768, 0x837D}, //8049 #CJK UNIFIED IDEOGRAPH + {0xD769, 0x8383}, //8050 #CJK UNIFIED IDEOGRAPH + {0xD76A, 0x838C}, //8051 #CJK UNIFIED IDEOGRAPH + {0xD76B, 0x839D}, //8052 #CJK UNIFIED IDEOGRAPH + {0xD76C, 0x839B}, //8053 #CJK UNIFIED IDEOGRAPH + {0xD76D, 0x83AA}, //8054 #CJK UNIFIED IDEOGRAPH + {0xD76E, 0x838B}, //8055 #CJK UNIFIED IDEOGRAPH + {0xD76F, 0x837E}, //8056 #CJK UNIFIED IDEOGRAPH + {0xD770, 0x83A5}, //8057 #CJK UNIFIED IDEOGRAPH + {0xD771, 0x83AF}, //8058 #CJK UNIFIED IDEOGRAPH + {0xD772, 0x8388}, //8059 #CJK UNIFIED IDEOGRAPH + {0xD773, 0x8397}, //8060 #CJK UNIFIED IDEOGRAPH + {0xD774, 0x83B0}, //8061 #CJK UNIFIED IDEOGRAPH + {0xD775, 0x837F}, //8062 #CJK UNIFIED IDEOGRAPH + {0xD776, 0x83A6}, //8063 #CJK UNIFIED IDEOGRAPH + {0xD777, 0x8387}, //8064 #CJK UNIFIED IDEOGRAPH + {0xD778, 0x83AE}, //8065 #CJK UNIFIED IDEOGRAPH + {0xD779, 0x8376}, //8066 #CJK UNIFIED IDEOGRAPH + {0xD77A, 0x839A}, //8067 #CJK UNIFIED IDEOGRAPH + {0xD77B, 0x8659}, //8068 #CJK UNIFIED IDEOGRAPH + {0xD77C, 0x8656}, //8069 #CJK UNIFIED IDEOGRAPH + {0xD77D, 0x86BF}, //8070 #CJK UNIFIED IDEOGRAPH + {0xD77E, 0x86B7}, //8071 #CJK UNIFIED IDEOGRAPH + {0xD7A1, 0x86C2}, //8072 #CJK UNIFIED IDEOGRAPH + {0xD7A2, 0x86C1}, //8073 #CJK UNIFIED IDEOGRAPH + {0xD7A3, 0x86C5}, //8074 #CJK UNIFIED IDEOGRAPH + {0xD7A4, 0x86BA}, //8075 #CJK UNIFIED IDEOGRAPH + {0xD7A5, 0x86B0}, //8076 #CJK UNIFIED IDEOGRAPH + {0xD7A6, 0x86C8}, //8077 #CJK UNIFIED IDEOGRAPH + {0xD7A7, 0x86B9}, //8078 #CJK UNIFIED IDEOGRAPH + {0xD7A8, 0x86B3}, //8079 #CJK UNIFIED IDEOGRAPH + {0xD7A9, 0x86B8}, //8080 #CJK UNIFIED IDEOGRAPH + {0xD7AA, 0x86CC}, //8081 #CJK UNIFIED IDEOGRAPH + {0xD7AB, 0x86B4}, //8082 #CJK UNIFIED IDEOGRAPH + {0xD7AC, 0x86BB}, //8083 #CJK UNIFIED IDEOGRAPH + {0xD7AD, 0x86BC}, //8084 #CJK UNIFIED IDEOGRAPH + {0xD7AE, 0x86C3}, //8085 #CJK UNIFIED IDEOGRAPH + {0xD7AF, 0x86BD}, //8086 #CJK UNIFIED IDEOGRAPH + {0xD7B0, 0x86BE}, //8087 #CJK UNIFIED IDEOGRAPH + {0xD7B1, 0x8852}, //8088 #CJK UNIFIED IDEOGRAPH + {0xD7B2, 0x8889}, //8089 #CJK UNIFIED IDEOGRAPH + {0xD7B3, 0x8895}, //8090 #CJK UNIFIED IDEOGRAPH + {0xD7B4, 0x88A8}, //8091 #CJK UNIFIED IDEOGRAPH + {0xD7B5, 0x88A2}, //8092 #CJK UNIFIED IDEOGRAPH + {0xD7B6, 0x88AA}, //8093 #CJK UNIFIED IDEOGRAPH + {0xD7B7, 0x889A}, //8094 #CJK UNIFIED IDEOGRAPH + {0xD7B8, 0x8891}, //8095 #CJK UNIFIED IDEOGRAPH + {0xD7B9, 0x88A1}, //8096 #CJK UNIFIED IDEOGRAPH + {0xD7BA, 0x889F}, //8097 #CJK UNIFIED IDEOGRAPH + {0xD7BB, 0x8898}, //8098 #CJK UNIFIED IDEOGRAPH + {0xD7BC, 0x88A7}, //8099 #CJK UNIFIED IDEOGRAPH + {0xD7BD, 0x8899}, //8100 #CJK UNIFIED IDEOGRAPH + {0xD7BE, 0x889B}, //8101 #CJK UNIFIED IDEOGRAPH + {0xD7BF, 0x8897}, //8102 #CJK UNIFIED IDEOGRAPH + {0xD7C0, 0x88A4}, //8103 #CJK UNIFIED IDEOGRAPH + {0xD7C1, 0x88AC}, //8104 #CJK UNIFIED IDEOGRAPH + {0xD7C2, 0x888C}, //8105 #CJK UNIFIED IDEOGRAPH + {0xD7C3, 0x8893}, //8106 #CJK UNIFIED IDEOGRAPH + {0xD7C4, 0x888E}, //8107 #CJK UNIFIED IDEOGRAPH + {0xD7C5, 0x8982}, //8108 #CJK UNIFIED IDEOGRAPH + {0xD7C6, 0x89D6}, //8109 #CJK UNIFIED IDEOGRAPH + {0xD7C7, 0x89D9}, //8110 #CJK UNIFIED IDEOGRAPH + {0xD7C8, 0x89D5}, //8111 #CJK UNIFIED IDEOGRAPH + {0xD7C9, 0x8A30}, //8112 #CJK UNIFIED IDEOGRAPH + {0xD7CA, 0x8A27}, //8113 #CJK UNIFIED IDEOGRAPH + {0xD7CB, 0x8A2C}, //8114 #CJK UNIFIED IDEOGRAPH + {0xD7CC, 0x8A1E}, //8115 #CJK UNIFIED IDEOGRAPH + {0xD7CD, 0x8C39}, //8116 #CJK UNIFIED IDEOGRAPH + {0xD7CE, 0x8C3B}, //8117 #CJK UNIFIED IDEOGRAPH + {0xD7CF, 0x8C5C}, //8118 #CJK UNIFIED IDEOGRAPH + {0xD7D0, 0x8C5D}, //8119 #CJK UNIFIED IDEOGRAPH + {0xD7D1, 0x8C7D}, //8120 #CJK UNIFIED IDEOGRAPH + {0xD7D2, 0x8CA5}, //8121 #CJK UNIFIED IDEOGRAPH + {0xD7D3, 0x8D7D}, //8122 #CJK UNIFIED IDEOGRAPH + {0xD7D4, 0x8D7B}, //8123 #CJK UNIFIED IDEOGRAPH + {0xD7D5, 0x8D79}, //8124 #CJK UNIFIED IDEOGRAPH + {0xD7D6, 0x8DBC}, //8125 #CJK UNIFIED IDEOGRAPH + {0xD7D7, 0x8DC2}, //8126 #CJK UNIFIED IDEOGRAPH + {0xD7D8, 0x8DB9}, //8127 #CJK UNIFIED IDEOGRAPH + {0xD7D9, 0x8DBF}, //8128 #CJK UNIFIED IDEOGRAPH + {0xD7DA, 0x8DC1}, //8129 #CJK UNIFIED IDEOGRAPH + {0xD7DB, 0x8ED8}, //8130 #CJK UNIFIED IDEOGRAPH + {0xD7DC, 0x8EDE}, //8131 #CJK UNIFIED IDEOGRAPH + {0xD7DD, 0x8EDD}, //8132 #CJK UNIFIED IDEOGRAPH + {0xD7DE, 0x8EDC}, //8133 #CJK UNIFIED IDEOGRAPH + {0xD7DF, 0x8ED7}, //8134 #CJK UNIFIED IDEOGRAPH + {0xD7E0, 0x8EE0}, //8135 #CJK UNIFIED IDEOGRAPH + {0xD7E1, 0x8EE1}, //8136 #CJK UNIFIED IDEOGRAPH + {0xD7E2, 0x9024}, //8137 #CJK UNIFIED IDEOGRAPH + {0xD7E3, 0x900B}, //8138 #CJK UNIFIED IDEOGRAPH + {0xD7E4, 0x9011}, //8139 #CJK UNIFIED IDEOGRAPH + {0xD7E5, 0x901C}, //8140 #CJK UNIFIED IDEOGRAPH + {0xD7E6, 0x900C}, //8141 #CJK UNIFIED IDEOGRAPH + {0xD7E7, 0x9021}, //8142 #CJK UNIFIED IDEOGRAPH + {0xD7E8, 0x90EF}, //8143 #CJK UNIFIED IDEOGRAPH + {0xD7E9, 0x90EA}, //8144 #CJK UNIFIED IDEOGRAPH + {0xD7EA, 0x90F0}, //8145 #CJK UNIFIED IDEOGRAPH + {0xD7EB, 0x90F4}, //8146 #CJK UNIFIED IDEOGRAPH + {0xD7EC, 0x90F2}, //8147 #CJK UNIFIED IDEOGRAPH + {0xD7ED, 0x90F3}, //8148 #CJK UNIFIED IDEOGRAPH + {0xD7EE, 0x90D4}, //8149 #CJK UNIFIED IDEOGRAPH + {0xD7EF, 0x90EB}, //8150 #CJK UNIFIED IDEOGRAPH + {0xD7F0, 0x90EC}, //8151 #CJK UNIFIED IDEOGRAPH + {0xD7F1, 0x90E9}, //8152 #CJK UNIFIED IDEOGRAPH + {0xD7F2, 0x9156}, //8153 #CJK UNIFIED IDEOGRAPH + {0xD7F3, 0x9158}, //8154 #CJK UNIFIED IDEOGRAPH + {0xD7F4, 0x915A}, //8155 #CJK UNIFIED IDEOGRAPH + {0xD7F5, 0x9153}, //8156 #CJK UNIFIED IDEOGRAPH + {0xD7F6, 0x9155}, //8157 #CJK UNIFIED IDEOGRAPH + {0xD7F7, 0x91EC}, //8158 #CJK UNIFIED IDEOGRAPH + {0xD7F8, 0x91F4}, //8159 #CJK UNIFIED IDEOGRAPH + {0xD7F9, 0x91F1}, //8160 #CJK UNIFIED IDEOGRAPH + {0xD7FA, 0x91F3}, //8161 #CJK UNIFIED IDEOGRAPH + {0xD7FB, 0x91F8}, //8162 #CJK UNIFIED IDEOGRAPH + {0xD7FC, 0x91E4}, //8163 #CJK UNIFIED IDEOGRAPH + {0xD7FD, 0x91F9}, //8164 #CJK UNIFIED IDEOGRAPH + {0xD7FE, 0x91EA}, //8165 #CJK UNIFIED IDEOGRAPH + {0xD840, 0x91EB}, //8166 #CJK UNIFIED IDEOGRAPH + {0xD841, 0x91F7}, //8167 #CJK UNIFIED IDEOGRAPH + {0xD842, 0x91E8}, //8168 #CJK UNIFIED IDEOGRAPH + {0xD843, 0x91EE}, //8169 #CJK UNIFIED IDEOGRAPH + {0xD844, 0x957A}, //8170 #CJK UNIFIED IDEOGRAPH + {0xD845, 0x9586}, //8171 #CJK UNIFIED IDEOGRAPH + {0xD846, 0x9588}, //8172 #CJK UNIFIED IDEOGRAPH + {0xD847, 0x967C}, //8173 #CJK UNIFIED IDEOGRAPH + {0xD848, 0x966D}, //8174 #CJK UNIFIED IDEOGRAPH + {0xD849, 0x966B}, //8175 #CJK UNIFIED IDEOGRAPH + {0xD84A, 0x9671}, //8176 #CJK UNIFIED IDEOGRAPH + {0xD84B, 0x966F}, //8177 #CJK UNIFIED IDEOGRAPH + {0xD84C, 0x96BF}, //8178 #CJK UNIFIED IDEOGRAPH + {0xD84D, 0x976A}, //8179 #CJK UNIFIED IDEOGRAPH + {0xD84E, 0x9804}, //8180 #CJK UNIFIED IDEOGRAPH + {0xD84F, 0x98E5}, //8181 #CJK UNIFIED IDEOGRAPH + {0xD850, 0x9997}, //8182 #CJK UNIFIED IDEOGRAPH + {0xD851, 0x509B}, //8183 #CJK UNIFIED IDEOGRAPH + {0xD852, 0x5095}, //8184 #CJK UNIFIED IDEOGRAPH + {0xD853, 0x5094}, //8185 #CJK UNIFIED IDEOGRAPH + {0xD854, 0x509E}, //8186 #CJK UNIFIED IDEOGRAPH + {0xD855, 0x508B}, //8187 #CJK UNIFIED IDEOGRAPH + {0xD856, 0x50A3}, //8188 #CJK UNIFIED IDEOGRAPH + {0xD857, 0x5083}, //8189 #CJK UNIFIED IDEOGRAPH + {0xD858, 0x508C}, //8190 #CJK UNIFIED IDEOGRAPH + {0xD859, 0x508E}, //8191 #CJK UNIFIED IDEOGRAPH + {0xD85A, 0x509D}, //8192 #CJK UNIFIED IDEOGRAPH + {0xD85B, 0x5068}, //8193 #CJK UNIFIED IDEOGRAPH + {0xD85C, 0x509C}, //8194 #CJK UNIFIED IDEOGRAPH + {0xD85D, 0x5092}, //8195 #CJK UNIFIED IDEOGRAPH + {0xD85E, 0x5082}, //8196 #CJK UNIFIED IDEOGRAPH + {0xD85F, 0x5087}, //8197 #CJK UNIFIED IDEOGRAPH + {0xD860, 0x515F}, //8198 #CJK UNIFIED IDEOGRAPH + {0xD861, 0x51D4}, //8199 #CJK UNIFIED IDEOGRAPH + {0xD862, 0x5312}, //8200 #CJK UNIFIED IDEOGRAPH + {0xD863, 0x5311}, //8201 #CJK UNIFIED IDEOGRAPH + {0xD864, 0x53A4}, //8202 #CJK UNIFIED IDEOGRAPH + {0xD865, 0x53A7}, //8203 #CJK UNIFIED IDEOGRAPH + {0xD866, 0x5591}, //8204 #CJK UNIFIED IDEOGRAPH + {0xD867, 0x55A8}, //8205 #CJK UNIFIED IDEOGRAPH + {0xD868, 0x55A5}, //8206 #CJK UNIFIED IDEOGRAPH + {0xD869, 0x55AD}, //8207 #CJK UNIFIED IDEOGRAPH + {0xD86A, 0x5577}, //8208 #CJK UNIFIED IDEOGRAPH + {0xD86B, 0x5645}, //8209 #CJK UNIFIED IDEOGRAPH + {0xD86C, 0x55A2}, //8210 #CJK UNIFIED IDEOGRAPH + {0xD86D, 0x5593}, //8211 #CJK UNIFIED IDEOGRAPH + {0xD86E, 0x5588}, //8212 #CJK UNIFIED IDEOGRAPH + {0xD86F, 0x558F}, //8213 #CJK UNIFIED IDEOGRAPH + {0xD870, 0x55B5}, //8214 #CJK UNIFIED IDEOGRAPH + {0xD871, 0x5581}, //8215 #CJK UNIFIED IDEOGRAPH + {0xD872, 0x55A3}, //8216 #CJK UNIFIED IDEOGRAPH + {0xD873, 0x5592}, //8217 #CJK UNIFIED IDEOGRAPH + {0xD874, 0x55A4}, //8218 #CJK UNIFIED IDEOGRAPH + {0xD875, 0x557D}, //8219 #CJK UNIFIED IDEOGRAPH + {0xD876, 0x558C}, //8220 #CJK UNIFIED IDEOGRAPH + {0xD877, 0x55A6}, //8221 #CJK UNIFIED IDEOGRAPH + {0xD878, 0x557F}, //8222 #CJK UNIFIED IDEOGRAPH + {0xD879, 0x5595}, //8223 #CJK UNIFIED IDEOGRAPH + {0xD87A, 0x55A1}, //8224 #CJK UNIFIED IDEOGRAPH + {0xD87B, 0x558E}, //8225 #CJK UNIFIED IDEOGRAPH + {0xD87C, 0x570C}, //8226 #CJK UNIFIED IDEOGRAPH + {0xD87D, 0x5829}, //8227 #CJK UNIFIED IDEOGRAPH + {0xD87E, 0x5837}, //8228 #CJK UNIFIED IDEOGRAPH + {0xD8A1, 0x5819}, //8229 #CJK UNIFIED IDEOGRAPH + {0xD8A2, 0x581E}, //8230 #CJK UNIFIED IDEOGRAPH + {0xD8A3, 0x5827}, //8231 #CJK UNIFIED IDEOGRAPH + {0xD8A4, 0x5823}, //8232 #CJK UNIFIED IDEOGRAPH + {0xD8A5, 0x5828}, //8233 #CJK UNIFIED IDEOGRAPH + {0xD8A6, 0x57F5}, //8234 #CJK UNIFIED IDEOGRAPH + {0xD8A7, 0x5848}, //8235 #CJK UNIFIED IDEOGRAPH + {0xD8A8, 0x5825}, //8236 #CJK UNIFIED IDEOGRAPH + {0xD8A9, 0x581C}, //8237 #CJK UNIFIED IDEOGRAPH + {0xD8AA, 0x581B}, //8238 #CJK UNIFIED IDEOGRAPH + {0xD8AB, 0x5833}, //8239 #CJK UNIFIED IDEOGRAPH + {0xD8AC, 0x583F}, //8240 #CJK UNIFIED IDEOGRAPH + {0xD8AD, 0x5836}, //8241 #CJK UNIFIED IDEOGRAPH + {0xD8AE, 0x582E}, //8242 #CJK UNIFIED IDEOGRAPH + {0xD8AF, 0x5839}, //8243 #CJK UNIFIED IDEOGRAPH + {0xD8B0, 0x5838}, //8244 #CJK UNIFIED IDEOGRAPH + {0xD8B1, 0x582D}, //8245 #CJK UNIFIED IDEOGRAPH + {0xD8B2, 0x582C}, //8246 #CJK UNIFIED IDEOGRAPH + {0xD8B3, 0x583B}, //8247 #CJK UNIFIED IDEOGRAPH + {0xD8B4, 0x5961}, //8248 #CJK UNIFIED IDEOGRAPH + {0xD8B5, 0x5AAF}, //8249 #CJK UNIFIED IDEOGRAPH + {0xD8B6, 0x5A94}, //8250 #CJK UNIFIED IDEOGRAPH + {0xD8B7, 0x5A9F}, //8251 #CJK UNIFIED IDEOGRAPH + {0xD8B8, 0x5A7A}, //8252 #CJK UNIFIED IDEOGRAPH + {0xD8B9, 0x5AA2}, //8253 #CJK UNIFIED IDEOGRAPH + {0xD8BA, 0x5A9E}, //8254 #CJK UNIFIED IDEOGRAPH + {0xD8BB, 0x5A78}, //8255 #CJK UNIFIED IDEOGRAPH + {0xD8BC, 0x5AA6}, //8256 #CJK UNIFIED IDEOGRAPH + {0xD8BD, 0x5A7C}, //8257 #CJK UNIFIED IDEOGRAPH + {0xD8BE, 0x5AA5}, //8258 #CJK UNIFIED IDEOGRAPH + {0xD8BF, 0x5AAC}, //8259 #CJK UNIFIED IDEOGRAPH + {0xD8C0, 0x5A95}, //8260 #CJK UNIFIED IDEOGRAPH + {0xD8C1, 0x5AAE}, //8261 #CJK UNIFIED IDEOGRAPH + {0xD8C2, 0x5A37}, //8262 #CJK UNIFIED IDEOGRAPH + {0xD8C3, 0x5A84}, //8263 #CJK UNIFIED IDEOGRAPH + {0xD8C4, 0x5A8A}, //8264 #CJK UNIFIED IDEOGRAPH + {0xD8C5, 0x5A97}, //8265 #CJK UNIFIED IDEOGRAPH + {0xD8C6, 0x5A83}, //8266 #CJK UNIFIED IDEOGRAPH + {0xD8C7, 0x5A8B}, //8267 #CJK UNIFIED IDEOGRAPH + {0xD8C8, 0x5AA9}, //8268 #CJK UNIFIED IDEOGRAPH + {0xD8C9, 0x5A7B}, //8269 #CJK UNIFIED IDEOGRAPH + {0xD8CA, 0x5A7D}, //8270 #CJK UNIFIED IDEOGRAPH + {0xD8CB, 0x5A8C}, //8271 #CJK UNIFIED IDEOGRAPH + {0xD8CC, 0x5A9C}, //8272 #CJK UNIFIED IDEOGRAPH + {0xD8CD, 0x5A8F}, //8273 #CJK UNIFIED IDEOGRAPH + {0xD8CE, 0x5A93}, //8274 #CJK UNIFIED IDEOGRAPH + {0xD8CF, 0x5A9D}, //8275 #CJK UNIFIED IDEOGRAPH + {0xD8D0, 0x5BEA}, //8276 #CJK UNIFIED IDEOGRAPH + {0xD8D1, 0x5BCD}, //8277 #CJK UNIFIED IDEOGRAPH + {0xD8D2, 0x5BCB}, //8278 #CJK UNIFIED IDEOGRAPH + {0xD8D3, 0x5BD4}, //8279 #CJK UNIFIED IDEOGRAPH + {0xD8D4, 0x5BD1}, //8280 #CJK UNIFIED IDEOGRAPH + {0xD8D5, 0x5BCA}, //8281 #CJK UNIFIED IDEOGRAPH + {0xD8D6, 0x5BCE}, //8282 #CJK UNIFIED IDEOGRAPH + {0xD8D7, 0x5C0C}, //8283 #CJK UNIFIED IDEOGRAPH + {0xD8D8, 0x5C30}, //8284 #CJK UNIFIED IDEOGRAPH + {0xD8D9, 0x5D37}, //8285 #CJK UNIFIED IDEOGRAPH + {0xD8DA, 0x5D43}, //8286 #CJK UNIFIED IDEOGRAPH + {0xD8DB, 0x5D6B}, //8287 #CJK UNIFIED IDEOGRAPH + {0xD8DC, 0x5D41}, //8288 #CJK UNIFIED IDEOGRAPH + {0xD8DD, 0x5D4B}, //8289 #CJK UNIFIED IDEOGRAPH + {0xD8DE, 0x5D3F}, //8290 #CJK UNIFIED IDEOGRAPH + {0xD8DF, 0x5D35}, //8291 #CJK UNIFIED IDEOGRAPH + {0xD8E0, 0x5D51}, //8292 #CJK UNIFIED IDEOGRAPH + {0xD8E1, 0x5D4E}, //8293 #CJK UNIFIED IDEOGRAPH + {0xD8E2, 0x5D55}, //8294 #CJK UNIFIED IDEOGRAPH + {0xD8E3, 0x5D33}, //8295 #CJK UNIFIED IDEOGRAPH + {0xD8E4, 0x5D3A}, //8296 #CJK UNIFIED IDEOGRAPH + {0xD8E5, 0x5D52}, //8297 #CJK UNIFIED IDEOGRAPH + {0xD8E6, 0x5D3D}, //8298 #CJK UNIFIED IDEOGRAPH + {0xD8E7, 0x5D31}, //8299 #CJK UNIFIED IDEOGRAPH + {0xD8E8, 0x5D59}, //8300 #CJK UNIFIED IDEOGRAPH + {0xD8E9, 0x5D42}, //8301 #CJK UNIFIED IDEOGRAPH + {0xD8EA, 0x5D39}, //8302 #CJK UNIFIED IDEOGRAPH + {0xD8EB, 0x5D49}, //8303 #CJK UNIFIED IDEOGRAPH + {0xD8EC, 0x5D38}, //8304 #CJK UNIFIED IDEOGRAPH + {0xD8ED, 0x5D3C}, //8305 #CJK UNIFIED IDEOGRAPH + {0xD8EE, 0x5D32}, //8306 #CJK UNIFIED IDEOGRAPH + {0xD8EF, 0x5D36}, //8307 #CJK UNIFIED IDEOGRAPH + {0xD8F0, 0x5D40}, //8308 #CJK UNIFIED IDEOGRAPH + {0xD8F1, 0x5D45}, //8309 #CJK UNIFIED IDEOGRAPH + {0xD8F2, 0x5E44}, //8310 #CJK UNIFIED IDEOGRAPH + {0xD8F3, 0x5E41}, //8311 #CJK UNIFIED IDEOGRAPH + {0xD8F4, 0x5F58}, //8312 #CJK UNIFIED IDEOGRAPH + {0xD8F5, 0x5FA6}, //8313 #CJK UNIFIED IDEOGRAPH + {0xD8F6, 0x5FA5}, //8314 #CJK UNIFIED IDEOGRAPH + {0xD8F7, 0x5FAB}, //8315 #CJK UNIFIED IDEOGRAPH + {0xD8F8, 0x60C9}, //8316 #CJK UNIFIED IDEOGRAPH + {0xD8F9, 0x60B9}, //8317 #CJK UNIFIED IDEOGRAPH + {0xD8FA, 0x60CC}, //8318 #CJK UNIFIED IDEOGRAPH + {0xD8FB, 0x60E2}, //8319 #CJK UNIFIED IDEOGRAPH + {0xD8FC, 0x60CE}, //8320 #CJK UNIFIED IDEOGRAPH + {0xD8FD, 0x60C4}, //8321 #CJK UNIFIED IDEOGRAPH + {0xD8FE, 0x6114}, //8322 #CJK UNIFIED IDEOGRAPH + {0xD940, 0x60F2}, //8323 #CJK UNIFIED IDEOGRAPH + {0xD941, 0x610A}, //8324 #CJK UNIFIED IDEOGRAPH + {0xD942, 0x6116}, //8325 #CJK UNIFIED IDEOGRAPH + {0xD943, 0x6105}, //8326 #CJK UNIFIED IDEOGRAPH + {0xD944, 0x60F5}, //8327 #CJK UNIFIED IDEOGRAPH + {0xD945, 0x6113}, //8328 #CJK UNIFIED IDEOGRAPH + {0xD946, 0x60F8}, //8329 #CJK UNIFIED IDEOGRAPH + {0xD947, 0x60FC}, //8330 #CJK UNIFIED IDEOGRAPH + {0xD948, 0x60FE}, //8331 #CJK UNIFIED IDEOGRAPH + {0xD949, 0x60C1}, //8332 #CJK UNIFIED IDEOGRAPH + {0xD94A, 0x6103}, //8333 #CJK UNIFIED IDEOGRAPH + {0xD94B, 0x6118}, //8334 #CJK UNIFIED IDEOGRAPH + {0xD94C, 0x611D}, //8335 #CJK UNIFIED IDEOGRAPH + {0xD94D, 0x6110}, //8336 #CJK UNIFIED IDEOGRAPH + {0xD94E, 0x60FF}, //8337 #CJK UNIFIED IDEOGRAPH + {0xD94F, 0x6104}, //8338 #CJK UNIFIED IDEOGRAPH + {0xD950, 0x610B}, //8339 #CJK UNIFIED IDEOGRAPH + {0xD951, 0x624A}, //8340 #CJK UNIFIED IDEOGRAPH + {0xD952, 0x6394}, //8341 #CJK UNIFIED IDEOGRAPH + {0xD953, 0x63B1}, //8342 #CJK UNIFIED IDEOGRAPH + {0xD954, 0x63B0}, //8343 #CJK UNIFIED IDEOGRAPH + {0xD955, 0x63CE}, //8344 #CJK UNIFIED IDEOGRAPH + {0xD956, 0x63E5}, //8345 #CJK UNIFIED IDEOGRAPH + {0xD957, 0x63E8}, //8346 #CJK UNIFIED IDEOGRAPH + {0xD958, 0x63EF}, //8347 #CJK UNIFIED IDEOGRAPH + {0xD959, 0x63C3}, //8348 #CJK UNIFIED IDEOGRAPH + {0xD95A, 0x649D}, //8349 #CJK UNIFIED IDEOGRAPH + {0xD95B, 0x63F3}, //8350 #CJK UNIFIED IDEOGRAPH + {0xD95C, 0x63CA}, //8351 #CJK UNIFIED IDEOGRAPH + {0xD95D, 0x63E0}, //8352 #CJK UNIFIED IDEOGRAPH + {0xD95E, 0x63F6}, //8353 #CJK UNIFIED IDEOGRAPH + {0xD95F, 0x63D5}, //8354 #CJK UNIFIED IDEOGRAPH + {0xD960, 0x63F2}, //8355 #CJK UNIFIED IDEOGRAPH + {0xD961, 0x63F5}, //8356 #CJK UNIFIED IDEOGRAPH + {0xD962, 0x6461}, //8357 #CJK UNIFIED IDEOGRAPH + {0xD963, 0x63DF}, //8358 #CJK UNIFIED IDEOGRAPH + {0xD964, 0x63BE}, //8359 #CJK UNIFIED IDEOGRAPH + {0xD965, 0x63DD}, //8360 #CJK UNIFIED IDEOGRAPH + {0xD966, 0x63DC}, //8361 #CJK UNIFIED IDEOGRAPH + {0xD967, 0x63C4}, //8362 #CJK UNIFIED IDEOGRAPH + {0xD968, 0x63D8}, //8363 #CJK UNIFIED IDEOGRAPH + {0xD969, 0x63D3}, //8364 #CJK UNIFIED IDEOGRAPH + {0xD96A, 0x63C2}, //8365 #CJK UNIFIED IDEOGRAPH + {0xD96B, 0x63C7}, //8366 #CJK UNIFIED IDEOGRAPH + {0xD96C, 0x63CC}, //8367 #CJK UNIFIED IDEOGRAPH + {0xD96D, 0x63CB}, //8368 #CJK UNIFIED IDEOGRAPH + {0xD96E, 0x63C8}, //8369 #CJK UNIFIED IDEOGRAPH + {0xD96F, 0x63F0}, //8370 #CJK UNIFIED IDEOGRAPH + {0xD970, 0x63D7}, //8371 #CJK UNIFIED IDEOGRAPH + {0xD971, 0x63D9}, //8372 #CJK UNIFIED IDEOGRAPH + {0xD972, 0x6532}, //8373 #CJK UNIFIED IDEOGRAPH + {0xD973, 0x6567}, //8374 #CJK UNIFIED IDEOGRAPH + {0xD974, 0x656A}, //8375 #CJK UNIFIED IDEOGRAPH + {0xD975, 0x6564}, //8376 #CJK UNIFIED IDEOGRAPH + {0xD976, 0x655C}, //8377 #CJK UNIFIED IDEOGRAPH + {0xD977, 0x6568}, //8378 #CJK UNIFIED IDEOGRAPH + {0xD978, 0x6565}, //8379 #CJK UNIFIED IDEOGRAPH + {0xD979, 0x658C}, //8380 #CJK UNIFIED IDEOGRAPH + {0xD97A, 0x659D}, //8381 #CJK UNIFIED IDEOGRAPH + {0xD97B, 0x659E}, //8382 #CJK UNIFIED IDEOGRAPH + {0xD97C, 0x65AE}, //8383 #CJK UNIFIED IDEOGRAPH + {0xD97D, 0x65D0}, //8384 #CJK UNIFIED IDEOGRAPH + {0xD97E, 0x65D2}, //8385 #CJK UNIFIED IDEOGRAPH + {0xD9A1, 0x667C}, //8386 #CJK UNIFIED IDEOGRAPH + {0xD9A2, 0x666C}, //8387 #CJK UNIFIED IDEOGRAPH + {0xD9A3, 0x667B}, //8388 #CJK UNIFIED IDEOGRAPH + {0xD9A4, 0x6680}, //8389 #CJK UNIFIED IDEOGRAPH + {0xD9A5, 0x6671}, //8390 #CJK UNIFIED IDEOGRAPH + {0xD9A6, 0x6679}, //8391 #CJK UNIFIED IDEOGRAPH + {0xD9A7, 0x666A}, //8392 #CJK UNIFIED IDEOGRAPH + {0xD9A8, 0x6672}, //8393 #CJK UNIFIED IDEOGRAPH + {0xD9A9, 0x6701}, //8394 #CJK UNIFIED IDEOGRAPH + {0xD9AA, 0x690C}, //8395 #CJK UNIFIED IDEOGRAPH + {0xD9AB, 0x68D3}, //8396 #CJK UNIFIED IDEOGRAPH + {0xD9AC, 0x6904}, //8397 #CJK UNIFIED IDEOGRAPH + {0xD9AD, 0x68DC}, //8398 #CJK UNIFIED IDEOGRAPH + {0xD9AE, 0x692A}, //8399 #CJK UNIFIED IDEOGRAPH + {0xD9AF, 0x68EC}, //8400 #CJK UNIFIED IDEOGRAPH + {0xD9B0, 0x68EA}, //8401 #CJK UNIFIED IDEOGRAPH + {0xD9B1, 0x68F1}, //8402 #CJK UNIFIED IDEOGRAPH + {0xD9B2, 0x690F}, //8403 #CJK UNIFIED IDEOGRAPH + {0xD9B3, 0x68D6}, //8404 #CJK UNIFIED IDEOGRAPH + {0xD9B4, 0x68F7}, //8405 #CJK UNIFIED IDEOGRAPH + {0xD9B5, 0x68EB}, //8406 #CJK UNIFIED IDEOGRAPH + {0xD9B6, 0x68E4}, //8407 #CJK UNIFIED IDEOGRAPH + {0xD9B7, 0x68F6}, //8408 #CJK UNIFIED IDEOGRAPH + {0xD9B8, 0x6913}, //8409 #CJK UNIFIED IDEOGRAPH + {0xD9B9, 0x6910}, //8410 #CJK UNIFIED IDEOGRAPH + {0xD9BA, 0x68F3}, //8411 #CJK UNIFIED IDEOGRAPH + {0xD9BB, 0x68E1}, //8412 #CJK UNIFIED IDEOGRAPH + {0xD9BC, 0x6907}, //8413 #CJK UNIFIED IDEOGRAPH + {0xD9BD, 0x68CC}, //8414 #CJK UNIFIED IDEOGRAPH + {0xD9BE, 0x6908}, //8415 #CJK UNIFIED IDEOGRAPH + {0xD9BF, 0x6970}, //8416 #CJK UNIFIED IDEOGRAPH + {0xD9C0, 0x68B4}, //8417 #CJK UNIFIED IDEOGRAPH + {0xD9C1, 0x6911}, //8418 #CJK UNIFIED IDEOGRAPH + {0xD9C2, 0x68EF}, //8419 #CJK UNIFIED IDEOGRAPH + {0xD9C3, 0x68C6}, //8420 #CJK UNIFIED IDEOGRAPH + {0xD9C4, 0x6914}, //8421 #CJK UNIFIED IDEOGRAPH + {0xD9C5, 0x68F8}, //8422 #CJK UNIFIED IDEOGRAPH + {0xD9C6, 0x68D0}, //8423 #CJK UNIFIED IDEOGRAPH + {0xD9C7, 0x68FD}, //8424 #CJK UNIFIED IDEOGRAPH + {0xD9C8, 0x68FC}, //8425 #CJK UNIFIED IDEOGRAPH + {0xD9C9, 0x68E8}, //8426 #CJK UNIFIED IDEOGRAPH + {0xD9CA, 0x690B}, //8427 #CJK UNIFIED IDEOGRAPH + {0xD9CB, 0x690A}, //8428 #CJK UNIFIED IDEOGRAPH + {0xD9CC, 0x6917}, //8429 #CJK UNIFIED IDEOGRAPH + {0xD9CD, 0x68CE}, //8430 #CJK UNIFIED IDEOGRAPH + {0xD9CE, 0x68C8}, //8431 #CJK UNIFIED IDEOGRAPH + {0xD9CF, 0x68DD}, //8432 #CJK UNIFIED IDEOGRAPH + {0xD9D0, 0x68DE}, //8433 #CJK UNIFIED IDEOGRAPH + {0xD9D1, 0x68E6}, //8434 #CJK UNIFIED IDEOGRAPH + {0xD9D2, 0x68F4}, //8435 #CJK UNIFIED IDEOGRAPH + {0xD9D3, 0x68D1}, //8436 #CJK UNIFIED IDEOGRAPH + {0xD9D4, 0x6906}, //8437 #CJK UNIFIED IDEOGRAPH + {0xD9D5, 0x68D4}, //8438 #CJK UNIFIED IDEOGRAPH + {0xD9D6, 0x68E9}, //8439 #CJK UNIFIED IDEOGRAPH + {0xD9D7, 0x6915}, //8440 #CJK UNIFIED IDEOGRAPH + {0xD9D8, 0x6925}, //8441 #CJK UNIFIED IDEOGRAPH + {0xD9D9, 0x68C7}, //8442 #CJK UNIFIED IDEOGRAPH + {0xD9DA, 0x6B39}, //8443 #CJK UNIFIED IDEOGRAPH + {0xD9DB, 0x6B3B}, //8444 #CJK UNIFIED IDEOGRAPH + {0xD9DC, 0x6B3F}, //8445 #CJK UNIFIED IDEOGRAPH + {0xD9DD, 0x6B3C}, //8446 #CJK UNIFIED IDEOGRAPH + {0xD9DE, 0x6B94}, //8447 #CJK UNIFIED IDEOGRAPH + {0xD9DF, 0x6B97}, //8448 #CJK UNIFIED IDEOGRAPH + {0xD9E0, 0x6B99}, //8449 #CJK UNIFIED IDEOGRAPH + {0xD9E1, 0x6B95}, //8450 #CJK UNIFIED IDEOGRAPH + {0xD9E2, 0x6BBD}, //8451 #CJK UNIFIED IDEOGRAPH + {0xD9E3, 0x6BF0}, //8452 #CJK UNIFIED IDEOGRAPH + {0xD9E4, 0x6BF2}, //8453 #CJK UNIFIED IDEOGRAPH + {0xD9E5, 0x6BF3}, //8454 #CJK UNIFIED IDEOGRAPH + {0xD9E6, 0x6C30}, //8455 #CJK UNIFIED IDEOGRAPH + {0xD9E7, 0x6DFC}, //8456 #CJK UNIFIED IDEOGRAPH + {0xD9E8, 0x6E46}, //8457 #CJK UNIFIED IDEOGRAPH + {0xD9E9, 0x6E47}, //8458 #CJK UNIFIED IDEOGRAPH + {0xD9EA, 0x6E1F}, //8459 #CJK UNIFIED IDEOGRAPH + {0xD9EB, 0x6E49}, //8460 #CJK UNIFIED IDEOGRAPH + {0xD9EC, 0x6E88}, //8461 #CJK UNIFIED IDEOGRAPH + {0xD9ED, 0x6E3C}, //8462 #CJK UNIFIED IDEOGRAPH + {0xD9EE, 0x6E3D}, //8463 #CJK UNIFIED IDEOGRAPH + {0xD9EF, 0x6E45}, //8464 #CJK UNIFIED IDEOGRAPH + {0xD9F0, 0x6E62}, //8465 #CJK UNIFIED IDEOGRAPH + {0xD9F1, 0x6E2B}, //8466 #CJK UNIFIED IDEOGRAPH + {0xD9F2, 0x6E3F}, //8467 #CJK UNIFIED IDEOGRAPH + {0xD9F3, 0x6E41}, //8468 #CJK UNIFIED IDEOGRAPH + {0xD9F4, 0x6E5D}, //8469 #CJK UNIFIED IDEOGRAPH + {0xD9F5, 0x6E73}, //8470 #CJK UNIFIED IDEOGRAPH + {0xD9F6, 0x6E1C}, //8471 #CJK UNIFIED IDEOGRAPH + {0xD9F7, 0x6E33}, //8472 #CJK UNIFIED IDEOGRAPH + {0xD9F8, 0x6E4B}, //8473 #CJK UNIFIED IDEOGRAPH + {0xD9F9, 0x6E40}, //8474 #CJK UNIFIED IDEOGRAPH + {0xD9FA, 0x6E51}, //8475 #CJK UNIFIED IDEOGRAPH + {0xD9FB, 0x6E3B}, //8476 #CJK UNIFIED IDEOGRAPH + {0xD9FC, 0x6E03}, //8477 #CJK UNIFIED IDEOGRAPH + {0xD9FD, 0x6E2E}, //8478 #CJK UNIFIED IDEOGRAPH + {0xD9FE, 0x6E5E}, //8479 #CJK UNIFIED IDEOGRAPH + {0xDA40, 0x6E68}, //8480 #CJK UNIFIED IDEOGRAPH + {0xDA41, 0x6E5C}, //8481 #CJK UNIFIED IDEOGRAPH + {0xDA42, 0x6E61}, //8482 #CJK UNIFIED IDEOGRAPH + {0xDA43, 0x6E31}, //8483 #CJK UNIFIED IDEOGRAPH + {0xDA44, 0x6E28}, //8484 #CJK UNIFIED IDEOGRAPH + {0xDA45, 0x6E60}, //8485 #CJK UNIFIED IDEOGRAPH + {0xDA46, 0x6E71}, //8486 #CJK UNIFIED IDEOGRAPH + {0xDA47, 0x6E6B}, //8487 #CJK UNIFIED IDEOGRAPH + {0xDA48, 0x6E39}, //8488 #CJK UNIFIED IDEOGRAPH + {0xDA49, 0x6E22}, //8489 #CJK UNIFIED IDEOGRAPH + {0xDA4A, 0x6E30}, //8490 #CJK UNIFIED IDEOGRAPH + {0xDA4B, 0x6E53}, //8491 #CJK UNIFIED IDEOGRAPH + {0xDA4C, 0x6E65}, //8492 #CJK UNIFIED IDEOGRAPH + {0xDA4D, 0x6E27}, //8493 #CJK UNIFIED IDEOGRAPH + {0xDA4E, 0x6E78}, //8494 #CJK UNIFIED IDEOGRAPH + {0xDA4F, 0x6E64}, //8495 #CJK UNIFIED IDEOGRAPH + {0xDA50, 0x6E77}, //8496 #CJK UNIFIED IDEOGRAPH + {0xDA51, 0x6E55}, //8497 #CJK UNIFIED IDEOGRAPH + {0xDA52, 0x6E79}, //8498 #CJK UNIFIED IDEOGRAPH + {0xDA53, 0x6E52}, //8499 #CJK UNIFIED IDEOGRAPH + {0xDA54, 0x6E66}, //8500 #CJK UNIFIED IDEOGRAPH + {0xDA55, 0x6E35}, //8501 #CJK UNIFIED IDEOGRAPH + {0xDA56, 0x6E36}, //8502 #CJK UNIFIED IDEOGRAPH + {0xDA57, 0x6E5A}, //8503 #CJK UNIFIED IDEOGRAPH + {0xDA58, 0x7120}, //8504 #CJK UNIFIED IDEOGRAPH + {0xDA59, 0x711E}, //8505 #CJK UNIFIED IDEOGRAPH + {0xDA5A, 0x712F}, //8506 #CJK UNIFIED IDEOGRAPH + {0xDA5B, 0x70FB}, //8507 #CJK UNIFIED IDEOGRAPH + {0xDA5C, 0x712E}, //8508 #CJK UNIFIED IDEOGRAPH + {0xDA5D, 0x7131}, //8509 #CJK UNIFIED IDEOGRAPH + {0xDA5E, 0x7123}, //8510 #CJK UNIFIED IDEOGRAPH + {0xDA5F, 0x7125}, //8511 #CJK UNIFIED IDEOGRAPH + {0xDA60, 0x7122}, //8512 #CJK UNIFIED IDEOGRAPH + {0xDA61, 0x7132}, //8513 #CJK UNIFIED IDEOGRAPH + {0xDA62, 0x711F}, //8514 #CJK UNIFIED IDEOGRAPH + {0xDA63, 0x7128}, //8515 #CJK UNIFIED IDEOGRAPH + {0xDA64, 0x713A}, //8516 #CJK UNIFIED IDEOGRAPH + {0xDA65, 0x711B}, //8517 #CJK UNIFIED IDEOGRAPH + {0xDA66, 0x724B}, //8518 #CJK UNIFIED IDEOGRAPH + {0xDA67, 0x725A}, //8519 #CJK UNIFIED IDEOGRAPH + {0xDA68, 0x7288}, //8520 #CJK UNIFIED IDEOGRAPH + {0xDA69, 0x7289}, //8521 #CJK UNIFIED IDEOGRAPH + {0xDA6A, 0x7286}, //8522 #CJK UNIFIED IDEOGRAPH + {0xDA6B, 0x7285}, //8523 #CJK UNIFIED IDEOGRAPH + {0xDA6C, 0x728B}, //8524 #CJK UNIFIED IDEOGRAPH + {0xDA6D, 0x7312}, //8525 #CJK UNIFIED IDEOGRAPH + {0xDA6E, 0x730B}, //8526 #CJK UNIFIED IDEOGRAPH + {0xDA6F, 0x7330}, //8527 #CJK UNIFIED IDEOGRAPH + {0xDA70, 0x7322}, //8528 #CJK UNIFIED IDEOGRAPH + {0xDA71, 0x7331}, //8529 #CJK UNIFIED IDEOGRAPH + {0xDA72, 0x7333}, //8530 #CJK UNIFIED IDEOGRAPH + {0xDA73, 0x7327}, //8531 #CJK UNIFIED IDEOGRAPH + {0xDA74, 0x7332}, //8532 #CJK UNIFIED IDEOGRAPH + {0xDA75, 0x732D}, //8533 #CJK UNIFIED IDEOGRAPH + {0xDA76, 0x7326}, //8534 #CJK UNIFIED IDEOGRAPH + {0xDA77, 0x7323}, //8535 #CJK UNIFIED IDEOGRAPH + {0xDA78, 0x7335}, //8536 #CJK UNIFIED IDEOGRAPH + {0xDA79, 0x730C}, //8537 #CJK UNIFIED IDEOGRAPH + {0xDA7A, 0x742E}, //8538 #CJK UNIFIED IDEOGRAPH + {0xDA7B, 0x742C}, //8539 #CJK UNIFIED IDEOGRAPH + {0xDA7C, 0x7430}, //8540 #CJK UNIFIED IDEOGRAPH + {0xDA7D, 0x742B}, //8541 #CJK UNIFIED IDEOGRAPH + {0xDA7E, 0x7416}, //8542 #CJK UNIFIED IDEOGRAPH + {0xDAA1, 0x741A}, //8543 #CJK UNIFIED IDEOGRAPH + {0xDAA2, 0x7421}, //8544 #CJK UNIFIED IDEOGRAPH + {0xDAA3, 0x742D}, //8545 #CJK UNIFIED IDEOGRAPH + {0xDAA4, 0x7431}, //8546 #CJK UNIFIED IDEOGRAPH + {0xDAA5, 0x7424}, //8547 #CJK UNIFIED IDEOGRAPH + {0xDAA6, 0x7423}, //8548 #CJK UNIFIED IDEOGRAPH + {0xDAA7, 0x741D}, //8549 #CJK UNIFIED IDEOGRAPH + {0xDAA8, 0x7429}, //8550 #CJK UNIFIED IDEOGRAPH + {0xDAA9, 0x7420}, //8551 #CJK UNIFIED IDEOGRAPH + {0xDAAA, 0x7432}, //8552 #CJK UNIFIED IDEOGRAPH + {0xDAAB, 0x74FB}, //8553 #CJK UNIFIED IDEOGRAPH + {0xDAAC, 0x752F}, //8554 #CJK UNIFIED IDEOGRAPH + {0xDAAD, 0x756F}, //8555 #CJK UNIFIED IDEOGRAPH + {0xDAAE, 0x756C}, //8556 #CJK UNIFIED IDEOGRAPH + {0xDAAF, 0x75E7}, //8557 #CJK UNIFIED IDEOGRAPH + {0xDAB0, 0x75DA}, //8558 #CJK UNIFIED IDEOGRAPH + {0xDAB1, 0x75E1}, //8559 #CJK UNIFIED IDEOGRAPH + {0xDAB2, 0x75E6}, //8560 #CJK UNIFIED IDEOGRAPH + {0xDAB3, 0x75DD}, //8561 #CJK UNIFIED IDEOGRAPH + {0xDAB4, 0x75DF}, //8562 #CJK UNIFIED IDEOGRAPH + {0xDAB5, 0x75E4}, //8563 #CJK UNIFIED IDEOGRAPH + {0xDAB6, 0x75D7}, //8564 #CJK UNIFIED IDEOGRAPH + {0xDAB7, 0x7695}, //8565 #CJK UNIFIED IDEOGRAPH + {0xDAB8, 0x7692}, //8566 #CJK UNIFIED IDEOGRAPH + {0xDAB9, 0x76DA}, //8567 #CJK UNIFIED IDEOGRAPH + {0xDABA, 0x7746}, //8568 #CJK UNIFIED IDEOGRAPH + {0xDABB, 0x7747}, //8569 #CJK UNIFIED IDEOGRAPH + {0xDABC, 0x7744}, //8570 #CJK UNIFIED IDEOGRAPH + {0xDABD, 0x774D}, //8571 #CJK UNIFIED IDEOGRAPH + {0xDABE, 0x7745}, //8572 #CJK UNIFIED IDEOGRAPH + {0xDABF, 0x774A}, //8573 #CJK UNIFIED IDEOGRAPH + {0xDAC0, 0x774E}, //8574 #CJK UNIFIED IDEOGRAPH + {0xDAC1, 0x774B}, //8575 #CJK UNIFIED IDEOGRAPH + {0xDAC2, 0x774C}, //8576 #CJK UNIFIED IDEOGRAPH + {0xDAC3, 0x77DE}, //8577 #CJK UNIFIED IDEOGRAPH + {0xDAC4, 0x77EC}, //8578 #CJK UNIFIED IDEOGRAPH + {0xDAC5, 0x7860}, //8579 #CJK UNIFIED IDEOGRAPH + {0xDAC6, 0x7864}, //8580 #CJK UNIFIED IDEOGRAPH + {0xDAC7, 0x7865}, //8581 #CJK UNIFIED IDEOGRAPH + {0xDAC8, 0x785C}, //8582 #CJK UNIFIED IDEOGRAPH + {0xDAC9, 0x786D}, //8583 #CJK UNIFIED IDEOGRAPH + {0xDACA, 0x7871}, //8584 #CJK UNIFIED IDEOGRAPH + {0xDACB, 0x786A}, //8585 #CJK UNIFIED IDEOGRAPH + {0xDACC, 0x786E}, //8586 #CJK UNIFIED IDEOGRAPH + {0xDACD, 0x7870}, //8587 #CJK UNIFIED IDEOGRAPH + {0xDACE, 0x7869}, //8588 #CJK UNIFIED IDEOGRAPH + {0xDACF, 0x7868}, //8589 #CJK UNIFIED IDEOGRAPH + {0xDAD0, 0x785E}, //8590 #CJK UNIFIED IDEOGRAPH + {0xDAD1, 0x7862}, //8591 #CJK UNIFIED IDEOGRAPH + {0xDAD2, 0x7974}, //8592 #CJK UNIFIED IDEOGRAPH + {0xDAD3, 0x7973}, //8593 #CJK UNIFIED IDEOGRAPH + {0xDAD4, 0x7972}, //8594 #CJK UNIFIED IDEOGRAPH + {0xDAD5, 0x7970}, //8595 #CJK UNIFIED IDEOGRAPH + {0xDAD6, 0x7A02}, //8596 #CJK UNIFIED IDEOGRAPH + {0xDAD7, 0x7A0A}, //8597 #CJK UNIFIED IDEOGRAPH + {0xDAD8, 0x7A03}, //8598 #CJK UNIFIED IDEOGRAPH + {0xDAD9, 0x7A0C}, //8599 #CJK UNIFIED IDEOGRAPH + {0xDADA, 0x7A04}, //8600 #CJK UNIFIED IDEOGRAPH + {0xDADB, 0x7A99}, //8601 #CJK UNIFIED IDEOGRAPH + {0xDADC, 0x7AE6}, //8602 #CJK UNIFIED IDEOGRAPH + {0xDADD, 0x7AE4}, //8603 #CJK UNIFIED IDEOGRAPH + {0xDADE, 0x7B4A}, //8604 #CJK UNIFIED IDEOGRAPH + {0xDADF, 0x7B3B}, //8605 #CJK UNIFIED IDEOGRAPH + {0xDAE0, 0x7B44}, //8606 #CJK UNIFIED IDEOGRAPH + {0xDAE1, 0x7B48}, //8607 #CJK UNIFIED IDEOGRAPH + {0xDAE2, 0x7B4C}, //8608 #CJK UNIFIED IDEOGRAPH + {0xDAE3, 0x7B4E}, //8609 #CJK UNIFIED IDEOGRAPH + {0xDAE4, 0x7B40}, //8610 #CJK UNIFIED IDEOGRAPH + {0xDAE5, 0x7B58}, //8611 #CJK UNIFIED IDEOGRAPH + {0xDAE6, 0x7B45}, //8612 #CJK UNIFIED IDEOGRAPH + {0xDAE7, 0x7CA2}, //8613 #CJK UNIFIED IDEOGRAPH + {0xDAE8, 0x7C9E}, //8614 #CJK UNIFIED IDEOGRAPH + {0xDAE9, 0x7CA8}, //8615 #CJK UNIFIED IDEOGRAPH + {0xDAEA, 0x7CA1}, //8616 #CJK UNIFIED IDEOGRAPH + {0xDAEB, 0x7D58}, //8617 #CJK UNIFIED IDEOGRAPH + {0xDAEC, 0x7D6F}, //8618 #CJK UNIFIED IDEOGRAPH + {0xDAED, 0x7D63}, //8619 #CJK UNIFIED IDEOGRAPH + {0xDAEE, 0x7D53}, //8620 #CJK UNIFIED IDEOGRAPH + {0xDAEF, 0x7D56}, //8621 #CJK UNIFIED IDEOGRAPH + {0xDAF0, 0x7D67}, //8622 #CJK UNIFIED IDEOGRAPH + {0xDAF1, 0x7D6A}, //8623 #CJK UNIFIED IDEOGRAPH + {0xDAF2, 0x7D4F}, //8624 #CJK UNIFIED IDEOGRAPH + {0xDAF3, 0x7D6D}, //8625 #CJK UNIFIED IDEOGRAPH + {0xDAF4, 0x7D5C}, //8626 #CJK UNIFIED IDEOGRAPH + {0xDAF5, 0x7D6B}, //8627 #CJK UNIFIED IDEOGRAPH + {0xDAF6, 0x7D52}, //8628 #CJK UNIFIED IDEOGRAPH + {0xDAF7, 0x7D54}, //8629 #CJK UNIFIED IDEOGRAPH + {0xDAF8, 0x7D69}, //8630 #CJK UNIFIED IDEOGRAPH + {0xDAF9, 0x7D51}, //8631 #CJK UNIFIED IDEOGRAPH + {0xDAFA, 0x7D5F}, //8632 #CJK UNIFIED IDEOGRAPH + {0xDAFB, 0x7D4E}, //8633 #CJK UNIFIED IDEOGRAPH + {0xDAFC, 0x7F3E}, //8634 #CJK UNIFIED IDEOGRAPH + {0xDAFD, 0x7F3F}, //8635 #CJK UNIFIED IDEOGRAPH + {0xDAFE, 0x7F65}, //8636 #CJK UNIFIED IDEOGRAPH + {0xDB40, 0x7F66}, //8637 #CJK UNIFIED IDEOGRAPH + {0xDB41, 0x7FA2}, //8638 #CJK UNIFIED IDEOGRAPH + {0xDB42, 0x7FA0}, //8639 #CJK UNIFIED IDEOGRAPH + {0xDB43, 0x7FA1}, //8640 #CJK UNIFIED IDEOGRAPH + {0xDB44, 0x7FD7}, //8641 #CJK UNIFIED IDEOGRAPH + {0xDB45, 0x8051}, //8642 #CJK UNIFIED IDEOGRAPH + {0xDB46, 0x804F}, //8643 #CJK UNIFIED IDEOGRAPH + {0xDB47, 0x8050}, //8644 #CJK UNIFIED IDEOGRAPH + {0xDB48, 0x80FE}, //8645 #CJK UNIFIED IDEOGRAPH + {0xDB49, 0x80D4}, //8646 #CJK UNIFIED IDEOGRAPH + {0xDB4A, 0x8143}, //8647 #CJK UNIFIED IDEOGRAPH + {0xDB4B, 0x814A}, //8648 #CJK UNIFIED IDEOGRAPH + {0xDB4C, 0x8152}, //8649 #CJK UNIFIED IDEOGRAPH + {0xDB4D, 0x814F}, //8650 #CJK UNIFIED IDEOGRAPH + {0xDB4E, 0x8147}, //8651 #CJK UNIFIED IDEOGRAPH + {0xDB4F, 0x813D}, //8652 #CJK UNIFIED IDEOGRAPH + {0xDB50, 0x814D}, //8653 #CJK UNIFIED IDEOGRAPH + {0xDB51, 0x813A}, //8654 #CJK UNIFIED IDEOGRAPH + {0xDB52, 0x81E6}, //8655 #CJK UNIFIED IDEOGRAPH + {0xDB53, 0x81EE}, //8656 #CJK UNIFIED IDEOGRAPH + {0xDB54, 0x81F7}, //8657 #CJK UNIFIED IDEOGRAPH + {0xDB55, 0x81F8}, //8658 #CJK UNIFIED IDEOGRAPH + {0xDB56, 0x81F9}, //8659 #CJK UNIFIED IDEOGRAPH + {0xDB57, 0x8204}, //8660 #CJK UNIFIED IDEOGRAPH + {0xDB58, 0x823C}, //8661 #CJK UNIFIED IDEOGRAPH + {0xDB59, 0x823D}, //8662 #CJK UNIFIED IDEOGRAPH + {0xDB5A, 0x823F}, //8663 #CJK UNIFIED IDEOGRAPH + {0xDB5B, 0x8275}, //8664 #CJK UNIFIED IDEOGRAPH + {0xDB5C, 0x833B}, //8665 #CJK UNIFIED IDEOGRAPH + {0xDB5D, 0x83CF}, //8666 #CJK UNIFIED IDEOGRAPH + {0xDB5E, 0x83F9}, //8667 #CJK UNIFIED IDEOGRAPH + {0xDB5F, 0x8423}, //8668 #CJK UNIFIED IDEOGRAPH + {0xDB60, 0x83C0}, //8669 #CJK UNIFIED IDEOGRAPH + {0xDB61, 0x83E8}, //8670 #CJK UNIFIED IDEOGRAPH + {0xDB62, 0x8412}, //8671 #CJK UNIFIED IDEOGRAPH + {0xDB63, 0x83E7}, //8672 #CJK UNIFIED IDEOGRAPH + {0xDB64, 0x83E4}, //8673 #CJK UNIFIED IDEOGRAPH + {0xDB65, 0x83FC}, //8674 #CJK UNIFIED IDEOGRAPH + {0xDB66, 0x83F6}, //8675 #CJK UNIFIED IDEOGRAPH + {0xDB67, 0x8410}, //8676 #CJK UNIFIED IDEOGRAPH + {0xDB68, 0x83C6}, //8677 #CJK UNIFIED IDEOGRAPH + {0xDB69, 0x83C8}, //8678 #CJK UNIFIED IDEOGRAPH + {0xDB6A, 0x83EB}, //8679 #CJK UNIFIED IDEOGRAPH + {0xDB6B, 0x83E3}, //8680 #CJK UNIFIED IDEOGRAPH + {0xDB6C, 0x83BF}, //8681 #CJK UNIFIED IDEOGRAPH + {0xDB6D, 0x8401}, //8682 #CJK UNIFIED IDEOGRAPH + {0xDB6E, 0x83DD}, //8683 #CJK UNIFIED IDEOGRAPH + {0xDB6F, 0x83E5}, //8684 #CJK UNIFIED IDEOGRAPH + {0xDB70, 0x83D8}, //8685 #CJK UNIFIED IDEOGRAPH + {0xDB71, 0x83FF}, //8686 #CJK UNIFIED IDEOGRAPH + {0xDB72, 0x83E1}, //8687 #CJK UNIFIED IDEOGRAPH + {0xDB73, 0x83CB}, //8688 #CJK UNIFIED IDEOGRAPH + {0xDB74, 0x83CE}, //8689 #CJK UNIFIED IDEOGRAPH + {0xDB75, 0x83D6}, //8690 #CJK UNIFIED IDEOGRAPH + {0xDB76, 0x83F5}, //8691 #CJK UNIFIED IDEOGRAPH + {0xDB77, 0x83C9}, //8692 #CJK UNIFIED IDEOGRAPH + {0xDB78, 0x8409}, //8693 #CJK UNIFIED IDEOGRAPH + {0xDB79, 0x840F}, //8694 #CJK UNIFIED IDEOGRAPH + {0xDB7A, 0x83DE}, //8695 #CJK UNIFIED IDEOGRAPH + {0xDB7B, 0x8411}, //8696 #CJK UNIFIED IDEOGRAPH + {0xDB7C, 0x8406}, //8697 #CJK UNIFIED IDEOGRAPH + {0xDB7D, 0x83C2}, //8698 #CJK UNIFIED IDEOGRAPH + {0xDB7E, 0x83F3}, //8699 #CJK UNIFIED IDEOGRAPH + {0xDBA1, 0x83D5}, //8700 #CJK UNIFIED IDEOGRAPH + {0xDBA2, 0x83FA}, //8701 #CJK UNIFIED IDEOGRAPH + {0xDBA3, 0x83C7}, //8702 #CJK UNIFIED IDEOGRAPH + {0xDBA4, 0x83D1}, //8703 #CJK UNIFIED IDEOGRAPH + {0xDBA5, 0x83EA}, //8704 #CJK UNIFIED IDEOGRAPH + {0xDBA6, 0x8413}, //8705 #CJK UNIFIED IDEOGRAPH + {0xDBA7, 0x83C3}, //8706 #CJK UNIFIED IDEOGRAPH + {0xDBA8, 0x83EC}, //8707 #CJK UNIFIED IDEOGRAPH + {0xDBA9, 0x83EE}, //8708 #CJK UNIFIED IDEOGRAPH + {0xDBAA, 0x83C4}, //8709 #CJK UNIFIED IDEOGRAPH + {0xDBAB, 0x83FB}, //8710 #CJK UNIFIED IDEOGRAPH + {0xDBAC, 0x83D7}, //8711 #CJK UNIFIED IDEOGRAPH + {0xDBAD, 0x83E2}, //8712 #CJK UNIFIED IDEOGRAPH + {0xDBAE, 0x841B}, //8713 #CJK UNIFIED IDEOGRAPH + {0xDBAF, 0x83DB}, //8714 #CJK UNIFIED IDEOGRAPH + {0xDBB0, 0x83FE}, //8715 #CJK UNIFIED IDEOGRAPH + {0xDBB1, 0x86D8}, //8716 #CJK UNIFIED IDEOGRAPH + {0xDBB2, 0x86E2}, //8717 #CJK UNIFIED IDEOGRAPH + {0xDBB3, 0x86E6}, //8718 #CJK UNIFIED IDEOGRAPH + {0xDBB4, 0x86D3}, //8719 #CJK UNIFIED IDEOGRAPH + {0xDBB5, 0x86E3}, //8720 #CJK UNIFIED IDEOGRAPH + {0xDBB6, 0x86DA}, //8721 #CJK UNIFIED IDEOGRAPH + {0xDBB7, 0x86EA}, //8722 #CJK UNIFIED IDEOGRAPH + {0xDBB8, 0x86DD}, //8723 #CJK UNIFIED IDEOGRAPH + {0xDBB9, 0x86EB}, //8724 #CJK UNIFIED IDEOGRAPH + {0xDBBA, 0x86DC}, //8725 #CJK UNIFIED IDEOGRAPH + {0xDBBB, 0x86EC}, //8726 #CJK UNIFIED IDEOGRAPH + {0xDBBC, 0x86E9}, //8727 #CJK UNIFIED IDEOGRAPH + {0xDBBD, 0x86D7}, //8728 #CJK UNIFIED IDEOGRAPH + {0xDBBE, 0x86E8}, //8729 #CJK UNIFIED IDEOGRAPH + {0xDBBF, 0x86D1}, //8730 #CJK UNIFIED IDEOGRAPH + {0xDBC0, 0x8848}, //8731 #CJK UNIFIED IDEOGRAPH + {0xDBC1, 0x8856}, //8732 #CJK UNIFIED IDEOGRAPH + {0xDBC2, 0x8855}, //8733 #CJK UNIFIED IDEOGRAPH + {0xDBC3, 0x88BA}, //8734 #CJK UNIFIED IDEOGRAPH + {0xDBC4, 0x88D7}, //8735 #CJK UNIFIED IDEOGRAPH + {0xDBC5, 0x88B9}, //8736 #CJK UNIFIED IDEOGRAPH + {0xDBC6, 0x88B8}, //8737 #CJK UNIFIED IDEOGRAPH + {0xDBC7, 0x88C0}, //8738 #CJK UNIFIED IDEOGRAPH + {0xDBC8, 0x88BE}, //8739 #CJK UNIFIED IDEOGRAPH + {0xDBC9, 0x88B6}, //8740 #CJK UNIFIED IDEOGRAPH + {0xDBCA, 0x88BC}, //8741 #CJK UNIFIED IDEOGRAPH + {0xDBCB, 0x88B7}, //8742 #CJK UNIFIED IDEOGRAPH + {0xDBCC, 0x88BD}, //8743 #CJK UNIFIED IDEOGRAPH + {0xDBCD, 0x88B2}, //8744 #CJK UNIFIED IDEOGRAPH + {0xDBCE, 0x8901}, //8745 #CJK UNIFIED IDEOGRAPH + {0xDBCF, 0x88C9}, //8746 #CJK UNIFIED IDEOGRAPH + {0xDBD0, 0x8995}, //8747 #CJK UNIFIED IDEOGRAPH + {0xDBD1, 0x8998}, //8748 #CJK UNIFIED IDEOGRAPH + {0xDBD2, 0x8997}, //8749 #CJK UNIFIED IDEOGRAPH + {0xDBD3, 0x89DD}, //8750 #CJK UNIFIED IDEOGRAPH + {0xDBD4, 0x89DA}, //8751 #CJK UNIFIED IDEOGRAPH + {0xDBD5, 0x89DB}, //8752 #CJK UNIFIED IDEOGRAPH + {0xDBD6, 0x8A4E}, //8753 #CJK UNIFIED IDEOGRAPH + {0xDBD7, 0x8A4D}, //8754 #CJK UNIFIED IDEOGRAPH + {0xDBD8, 0x8A39}, //8755 #CJK UNIFIED IDEOGRAPH + {0xDBD9, 0x8A59}, //8756 #CJK UNIFIED IDEOGRAPH + {0xDBDA, 0x8A40}, //8757 #CJK UNIFIED IDEOGRAPH + {0xDBDB, 0x8A57}, //8758 #CJK UNIFIED IDEOGRAPH + {0xDBDC, 0x8A58}, //8759 #CJK UNIFIED IDEOGRAPH + {0xDBDD, 0x8A44}, //8760 #CJK UNIFIED IDEOGRAPH + {0xDBDE, 0x8A45}, //8761 #CJK UNIFIED IDEOGRAPH + {0xDBDF, 0x8A52}, //8762 #CJK UNIFIED IDEOGRAPH + {0xDBE0, 0x8A48}, //8763 #CJK UNIFIED IDEOGRAPH + {0xDBE1, 0x8A51}, //8764 #CJK UNIFIED IDEOGRAPH + {0xDBE2, 0x8A4A}, //8765 #CJK UNIFIED IDEOGRAPH + {0xDBE3, 0x8A4C}, //8766 #CJK UNIFIED IDEOGRAPH + {0xDBE4, 0x8A4F}, //8767 #CJK UNIFIED IDEOGRAPH + {0xDBE5, 0x8C5F}, //8768 #CJK UNIFIED IDEOGRAPH + {0xDBE6, 0x8C81}, //8769 #CJK UNIFIED IDEOGRAPH + {0xDBE7, 0x8C80}, //8770 #CJK UNIFIED IDEOGRAPH + {0xDBE8, 0x8CBA}, //8771 #CJK UNIFIED IDEOGRAPH + {0xDBE9, 0x8CBE}, //8772 #CJK UNIFIED IDEOGRAPH + {0xDBEA, 0x8CB0}, //8773 #CJK UNIFIED IDEOGRAPH + {0xDBEB, 0x8CB9}, //8774 #CJK UNIFIED IDEOGRAPH + {0xDBEC, 0x8CB5}, //8775 #CJK UNIFIED IDEOGRAPH + {0xDBED, 0x8D84}, //8776 #CJK UNIFIED IDEOGRAPH + {0xDBEE, 0x8D80}, //8777 #CJK UNIFIED IDEOGRAPH + {0xDBEF, 0x8D89}, //8778 #CJK UNIFIED IDEOGRAPH + {0xDBF0, 0x8DD8}, //8779 #CJK UNIFIED IDEOGRAPH + {0xDBF1, 0x8DD3}, //8780 #CJK UNIFIED IDEOGRAPH + {0xDBF2, 0x8DCD}, //8781 #CJK UNIFIED IDEOGRAPH + {0xDBF3, 0x8DC7}, //8782 #CJK UNIFIED IDEOGRAPH + {0xDBF4, 0x8DD6}, //8783 #CJK UNIFIED IDEOGRAPH + {0xDBF5, 0x8DDC}, //8784 #CJK UNIFIED IDEOGRAPH + {0xDBF6, 0x8DCF}, //8785 #CJK UNIFIED IDEOGRAPH + {0xDBF7, 0x8DD5}, //8786 #CJK UNIFIED IDEOGRAPH + {0xDBF8, 0x8DD9}, //8787 #CJK UNIFIED IDEOGRAPH + {0xDBF9, 0x8DC8}, //8788 #CJK UNIFIED IDEOGRAPH + {0xDBFA, 0x8DD7}, //8789 #CJK UNIFIED IDEOGRAPH + {0xDBFB, 0x8DC5}, //8790 #CJK UNIFIED IDEOGRAPH + {0xDBFC, 0x8EEF}, //8791 #CJK UNIFIED IDEOGRAPH + {0xDBFD, 0x8EF7}, //8792 #CJK UNIFIED IDEOGRAPH + {0xDBFE, 0x8EFA}, //8793 #CJK UNIFIED IDEOGRAPH + {0xDC40, 0x8EF9}, //8794 #CJK UNIFIED IDEOGRAPH + {0xDC41, 0x8EE6}, //8795 #CJK UNIFIED IDEOGRAPH + {0xDC42, 0x8EEE}, //8796 #CJK UNIFIED IDEOGRAPH + {0xDC43, 0x8EE5}, //8797 #CJK UNIFIED IDEOGRAPH + {0xDC44, 0x8EF5}, //8798 #CJK UNIFIED IDEOGRAPH + {0xDC45, 0x8EE7}, //8799 #CJK UNIFIED IDEOGRAPH + {0xDC46, 0x8EE8}, //8800 #CJK UNIFIED IDEOGRAPH + {0xDC47, 0x8EF6}, //8801 #CJK UNIFIED IDEOGRAPH + {0xDC48, 0x8EEB}, //8802 #CJK UNIFIED IDEOGRAPH + {0xDC49, 0x8EF1}, //8803 #CJK UNIFIED IDEOGRAPH + {0xDC4A, 0x8EEC}, //8804 #CJK UNIFIED IDEOGRAPH + {0xDC4B, 0x8EF4}, //8805 #CJK UNIFIED IDEOGRAPH + {0xDC4C, 0x8EE9}, //8806 #CJK UNIFIED IDEOGRAPH + {0xDC4D, 0x902D}, //8807 #CJK UNIFIED IDEOGRAPH + {0xDC4E, 0x9034}, //8808 #CJK UNIFIED IDEOGRAPH + {0xDC4F, 0x902F}, //8809 #CJK UNIFIED IDEOGRAPH + {0xDC50, 0x9106}, //8810 #CJK UNIFIED IDEOGRAPH + {0xDC51, 0x912C}, //8811 #CJK UNIFIED IDEOGRAPH + {0xDC52, 0x9104}, //8812 #CJK UNIFIED IDEOGRAPH + {0xDC53, 0x90FF}, //8813 #CJK UNIFIED IDEOGRAPH + {0xDC54, 0x90FC}, //8814 #CJK UNIFIED IDEOGRAPH + {0xDC55, 0x9108}, //8815 #CJK UNIFIED IDEOGRAPH + {0xDC56, 0x90F9}, //8816 #CJK UNIFIED IDEOGRAPH + {0xDC57, 0x90FB}, //8817 #CJK UNIFIED IDEOGRAPH + {0xDC58, 0x9101}, //8818 #CJK UNIFIED IDEOGRAPH + {0xDC59, 0x9100}, //8819 #CJK UNIFIED IDEOGRAPH + {0xDC5A, 0x9107}, //8820 #CJK UNIFIED IDEOGRAPH + {0xDC5B, 0x9105}, //8821 #CJK UNIFIED IDEOGRAPH + {0xDC5C, 0x9103}, //8822 #CJK UNIFIED IDEOGRAPH + {0xDC5D, 0x9161}, //8823 #CJK UNIFIED IDEOGRAPH + {0xDC5E, 0x9164}, //8824 #CJK UNIFIED IDEOGRAPH + {0xDC5F, 0x915F}, //8825 #CJK UNIFIED IDEOGRAPH + {0xDC60, 0x9162}, //8826 #CJK UNIFIED IDEOGRAPH + {0xDC61, 0x9160}, //8827 #CJK UNIFIED IDEOGRAPH + {0xDC62, 0x9201}, //8828 #CJK UNIFIED IDEOGRAPH + {0xDC63, 0x920A}, //8829 #CJK UNIFIED IDEOGRAPH + {0xDC64, 0x9225}, //8830 #CJK UNIFIED IDEOGRAPH + {0xDC65, 0x9203}, //8831 #CJK UNIFIED IDEOGRAPH + {0xDC66, 0x921A}, //8832 #CJK UNIFIED IDEOGRAPH + {0xDC67, 0x9226}, //8833 #CJK UNIFIED IDEOGRAPH + {0xDC68, 0x920F}, //8834 #CJK UNIFIED IDEOGRAPH + {0xDC69, 0x920C}, //8835 #CJK UNIFIED IDEOGRAPH + {0xDC6A, 0x9200}, //8836 #CJK UNIFIED IDEOGRAPH + {0xDC6B, 0x9212}, //8837 #CJK UNIFIED IDEOGRAPH + {0xDC6C, 0x91FF}, //8838 #CJK UNIFIED IDEOGRAPH + {0xDC6D, 0x91FD}, //8839 #CJK UNIFIED IDEOGRAPH + {0xDC6E, 0x9206}, //8840 #CJK UNIFIED IDEOGRAPH + {0xDC6F, 0x9204}, //8841 #CJK UNIFIED IDEOGRAPH + {0xDC70, 0x9227}, //8842 #CJK UNIFIED IDEOGRAPH + {0xDC71, 0x9202}, //8843 #CJK UNIFIED IDEOGRAPH + {0xDC72, 0x921C}, //8844 #CJK UNIFIED IDEOGRAPH + {0xDC73, 0x9224}, //8845 #CJK UNIFIED IDEOGRAPH + {0xDC74, 0x9219}, //8846 #CJK UNIFIED IDEOGRAPH + {0xDC75, 0x9217}, //8847 #CJK UNIFIED IDEOGRAPH + {0xDC76, 0x9205}, //8848 #CJK UNIFIED IDEOGRAPH + {0xDC77, 0x9216}, //8849 #CJK UNIFIED IDEOGRAPH + {0xDC78, 0x957B}, //8850 #CJK UNIFIED IDEOGRAPH + {0xDC79, 0x958D}, //8851 #CJK UNIFIED IDEOGRAPH + {0xDC7A, 0x958C}, //8852 #CJK UNIFIED IDEOGRAPH + {0xDC7B, 0x9590}, //8853 #CJK UNIFIED IDEOGRAPH + {0xDC7C, 0x9687}, //8854 #CJK UNIFIED IDEOGRAPH + {0xDC7D, 0x967E}, //8855 #CJK UNIFIED IDEOGRAPH + {0xDC7E, 0x9688}, //8856 #CJK UNIFIED IDEOGRAPH + {0xDCA1, 0x9689}, //8857 #CJK UNIFIED IDEOGRAPH + {0xDCA2, 0x9683}, //8858 #CJK UNIFIED IDEOGRAPH + {0xDCA3, 0x9680}, //8859 #CJK UNIFIED IDEOGRAPH + {0xDCA4, 0x96C2}, //8860 #CJK UNIFIED IDEOGRAPH + {0xDCA5, 0x96C8}, //8861 #CJK UNIFIED IDEOGRAPH + {0xDCA6, 0x96C3}, //8862 #CJK UNIFIED IDEOGRAPH + {0xDCA7, 0x96F1}, //8863 #CJK UNIFIED IDEOGRAPH + {0xDCA8, 0x96F0}, //8864 #CJK UNIFIED IDEOGRAPH + {0xDCA9, 0x976C}, //8865 #CJK UNIFIED IDEOGRAPH + {0xDCAA, 0x9770}, //8866 #CJK UNIFIED IDEOGRAPH + {0xDCAB, 0x976E}, //8867 #CJK UNIFIED IDEOGRAPH + {0xDCAC, 0x9807}, //8868 #CJK UNIFIED IDEOGRAPH + {0xDCAD, 0x98A9}, //8869 #CJK UNIFIED IDEOGRAPH + {0xDCAE, 0x98EB}, //8870 #CJK UNIFIED IDEOGRAPH + {0xDCAF, 0x9CE6}, //8871 #CJK UNIFIED IDEOGRAPH + {0xDCB0, 0x9EF9}, //8872 #CJK UNIFIED IDEOGRAPH + {0xDCB1, 0x4E83}, //8873 #CJK UNIFIED IDEOGRAPH + {0xDCB2, 0x4E84}, //8874 #CJK UNIFIED IDEOGRAPH + {0xDCB3, 0x4EB6}, //8875 #CJK UNIFIED IDEOGRAPH + {0xDCB4, 0x50BD}, //8876 #CJK UNIFIED IDEOGRAPH + {0xDCB5, 0x50BF}, //8877 #CJK UNIFIED IDEOGRAPH + {0xDCB6, 0x50C6}, //8878 #CJK UNIFIED IDEOGRAPH + {0xDCB7, 0x50AE}, //8879 #CJK UNIFIED IDEOGRAPH + {0xDCB8, 0x50C4}, //8880 #CJK UNIFIED IDEOGRAPH + {0xDCB9, 0x50CA}, //8881 #CJK UNIFIED IDEOGRAPH + {0xDCBA, 0x50B4}, //8882 #CJK UNIFIED IDEOGRAPH + {0xDCBB, 0x50C8}, //8883 #CJK UNIFIED IDEOGRAPH + {0xDCBC, 0x50C2}, //8884 #CJK UNIFIED IDEOGRAPH + {0xDCBD, 0x50B0}, //8885 #CJK UNIFIED IDEOGRAPH + {0xDCBE, 0x50C1}, //8886 #CJK UNIFIED IDEOGRAPH + {0xDCBF, 0x50BA}, //8887 #CJK UNIFIED IDEOGRAPH + {0xDCC0, 0x50B1}, //8888 #CJK UNIFIED IDEOGRAPH + {0xDCC1, 0x50CB}, //8889 #CJK UNIFIED IDEOGRAPH + {0xDCC2, 0x50C9}, //8890 #CJK UNIFIED IDEOGRAPH + {0xDCC3, 0x50B6}, //8891 #CJK UNIFIED IDEOGRAPH + {0xDCC4, 0x50B8}, //8892 #CJK UNIFIED IDEOGRAPH + {0xDCC5, 0x51D7}, //8893 #CJK UNIFIED IDEOGRAPH + {0xDCC6, 0x527A}, //8894 #CJK UNIFIED IDEOGRAPH + {0xDCC7, 0x5278}, //8895 #CJK UNIFIED IDEOGRAPH + {0xDCC8, 0x527B}, //8896 #CJK UNIFIED IDEOGRAPH + {0xDCC9, 0x527C}, //8897 #CJK UNIFIED IDEOGRAPH + {0xDCCA, 0x55C3}, //8898 #CJK UNIFIED IDEOGRAPH + {0xDCCB, 0x55DB}, //8899 #CJK UNIFIED IDEOGRAPH + {0xDCCC, 0x55CC}, //8900 #CJK UNIFIED IDEOGRAPH + {0xDCCD, 0x55D0}, //8901 #CJK UNIFIED IDEOGRAPH + {0xDCCE, 0x55CB}, //8902 #CJK UNIFIED IDEOGRAPH + {0xDCCF, 0x55CA}, //8903 #CJK UNIFIED IDEOGRAPH + {0xDCD0, 0x55DD}, //8904 #CJK UNIFIED IDEOGRAPH + {0xDCD1, 0x55C0}, //8905 #CJK UNIFIED IDEOGRAPH + {0xDCD2, 0x55D4}, //8906 #CJK UNIFIED IDEOGRAPH + {0xDCD3, 0x55C4}, //8907 #CJK UNIFIED IDEOGRAPH + {0xDCD4, 0x55E9}, //8908 #CJK UNIFIED IDEOGRAPH + {0xDCD5, 0x55BF}, //8909 #CJK UNIFIED IDEOGRAPH + {0xDCD6, 0x55D2}, //8910 #CJK UNIFIED IDEOGRAPH + {0xDCD7, 0x558D}, //8911 #CJK UNIFIED IDEOGRAPH + {0xDCD8, 0x55CF}, //8912 #CJK UNIFIED IDEOGRAPH + {0xDCD9, 0x55D5}, //8913 #CJK UNIFIED IDEOGRAPH + {0xDCDA, 0x55E2}, //8914 #CJK UNIFIED IDEOGRAPH + {0xDCDB, 0x55D6}, //8915 #CJK UNIFIED IDEOGRAPH + {0xDCDC, 0x55C8}, //8916 #CJK UNIFIED IDEOGRAPH + {0xDCDD, 0x55F2}, //8917 #CJK UNIFIED IDEOGRAPH + {0xDCDE, 0x55CD}, //8918 #CJK UNIFIED IDEOGRAPH + {0xDCDF, 0x55D9}, //8919 #CJK UNIFIED IDEOGRAPH + {0xDCE0, 0x55C2}, //8920 #CJK UNIFIED IDEOGRAPH + {0xDCE1, 0x5714}, //8921 #CJK UNIFIED IDEOGRAPH + {0xDCE2, 0x5853}, //8922 #CJK UNIFIED IDEOGRAPH + {0xDCE3, 0x5868}, //8923 #CJK UNIFIED IDEOGRAPH + {0xDCE4, 0x5864}, //8924 #CJK UNIFIED IDEOGRAPH + {0xDCE5, 0x584F}, //8925 #CJK UNIFIED IDEOGRAPH + {0xDCE6, 0x584D}, //8926 #CJK UNIFIED IDEOGRAPH + {0xDCE7, 0x5849}, //8927 #CJK UNIFIED IDEOGRAPH + {0xDCE8, 0x586F}, //8928 #CJK UNIFIED IDEOGRAPH + {0xDCE9, 0x5855}, //8929 #CJK UNIFIED IDEOGRAPH + {0xDCEA, 0x584E}, //8930 #CJK UNIFIED IDEOGRAPH + {0xDCEB, 0x585D}, //8931 #CJK UNIFIED IDEOGRAPH + {0xDCEC, 0x5859}, //8932 #CJK UNIFIED IDEOGRAPH + {0xDCED, 0x5865}, //8933 #CJK UNIFIED IDEOGRAPH + {0xDCEE, 0x585B}, //8934 #CJK UNIFIED IDEOGRAPH + {0xDCEF, 0x583D}, //8935 #CJK UNIFIED IDEOGRAPH + {0xDCF0, 0x5863}, //8936 #CJK UNIFIED IDEOGRAPH + {0xDCF1, 0x5871}, //8937 #CJK UNIFIED IDEOGRAPH + {0xDCF2, 0x58FC}, //8938 #CJK UNIFIED IDEOGRAPH + {0xDCF3, 0x5AC7}, //8939 #CJK UNIFIED IDEOGRAPH + {0xDCF4, 0x5AC4}, //8940 #CJK UNIFIED IDEOGRAPH + {0xDCF5, 0x5ACB}, //8941 #CJK UNIFIED IDEOGRAPH + {0xDCF6, 0x5ABA}, //8942 #CJK UNIFIED IDEOGRAPH + {0xDCF7, 0x5AB8}, //8943 #CJK UNIFIED IDEOGRAPH + {0xDCF8, 0x5AB1}, //8944 #CJK UNIFIED IDEOGRAPH + {0xDCF9, 0x5AB5}, //8945 #CJK UNIFIED IDEOGRAPH + {0xDCFA, 0x5AB0}, //8946 #CJK UNIFIED IDEOGRAPH + {0xDCFB, 0x5ABF}, //8947 #CJK UNIFIED IDEOGRAPH + {0xDCFC, 0x5AC8}, //8948 #CJK UNIFIED IDEOGRAPH + {0xDCFD, 0x5ABB}, //8949 #CJK UNIFIED IDEOGRAPH + {0xDCFE, 0x5AC6}, //8950 #CJK UNIFIED IDEOGRAPH + {0xDD40, 0x5AB7}, //8951 #CJK UNIFIED IDEOGRAPH + {0xDD41, 0x5AC0}, //8952 #CJK UNIFIED IDEOGRAPH + {0xDD42, 0x5ACA}, //8953 #CJK UNIFIED IDEOGRAPH + {0xDD43, 0x5AB4}, //8954 #CJK UNIFIED IDEOGRAPH + {0xDD44, 0x5AB6}, //8955 #CJK UNIFIED IDEOGRAPH + {0xDD45, 0x5ACD}, //8956 #CJK UNIFIED IDEOGRAPH + {0xDD46, 0x5AB9}, //8957 #CJK UNIFIED IDEOGRAPH + {0xDD47, 0x5A90}, //8958 #CJK UNIFIED IDEOGRAPH + {0xDD48, 0x5BD6}, //8959 #CJK UNIFIED IDEOGRAPH + {0xDD49, 0x5BD8}, //8960 #CJK UNIFIED IDEOGRAPH + {0xDD4A, 0x5BD9}, //8961 #CJK UNIFIED IDEOGRAPH + {0xDD4B, 0x5C1F}, //8962 #CJK UNIFIED IDEOGRAPH + {0xDD4C, 0x5C33}, //8963 #CJK UNIFIED IDEOGRAPH + {0xDD4D, 0x5D71}, //8964 #CJK UNIFIED IDEOGRAPH + {0xDD4E, 0x5D63}, //8965 #CJK UNIFIED IDEOGRAPH + {0xDD4F, 0x5D4A}, //8966 #CJK UNIFIED IDEOGRAPH + {0xDD50, 0x5D65}, //8967 #CJK UNIFIED IDEOGRAPH + {0xDD51, 0x5D72}, //8968 #CJK UNIFIED IDEOGRAPH + {0xDD52, 0x5D6C}, //8969 #CJK UNIFIED IDEOGRAPH + {0xDD53, 0x5D5E}, //8970 #CJK UNIFIED IDEOGRAPH + {0xDD54, 0x5D68}, //8971 #CJK UNIFIED IDEOGRAPH + {0xDD55, 0x5D67}, //8972 #CJK UNIFIED IDEOGRAPH + {0xDD56, 0x5D62}, //8973 #CJK UNIFIED IDEOGRAPH + {0xDD57, 0x5DF0}, //8974 #CJK UNIFIED IDEOGRAPH + {0xDD58, 0x5E4F}, //8975 #CJK UNIFIED IDEOGRAPH + {0xDD59, 0x5E4E}, //8976 #CJK UNIFIED IDEOGRAPH + {0xDD5A, 0x5E4A}, //8977 #CJK UNIFIED IDEOGRAPH + {0xDD5B, 0x5E4D}, //8978 #CJK UNIFIED IDEOGRAPH + {0xDD5C, 0x5E4B}, //8979 #CJK UNIFIED IDEOGRAPH + {0xDD5D, 0x5EC5}, //8980 #CJK UNIFIED IDEOGRAPH + {0xDD5E, 0x5ECC}, //8981 #CJK UNIFIED IDEOGRAPH + {0xDD5F, 0x5EC6}, //8982 #CJK UNIFIED IDEOGRAPH + {0xDD60, 0x5ECB}, //8983 #CJK UNIFIED IDEOGRAPH + {0xDD61, 0x5EC7}, //8984 #CJK UNIFIED IDEOGRAPH + {0xDD62, 0x5F40}, //8985 #CJK UNIFIED IDEOGRAPH + {0xDD63, 0x5FAF}, //8986 #CJK UNIFIED IDEOGRAPH + {0xDD64, 0x5FAD}, //8987 #CJK UNIFIED IDEOGRAPH + {0xDD65, 0x60F7}, //8988 #CJK UNIFIED IDEOGRAPH + {0xDD66, 0x6149}, //8989 #CJK UNIFIED IDEOGRAPH + {0xDD67, 0x614A}, //8990 #CJK UNIFIED IDEOGRAPH + {0xDD68, 0x612B}, //8991 #CJK UNIFIED IDEOGRAPH + {0xDD69, 0x6145}, //8992 #CJK UNIFIED IDEOGRAPH + {0xDD6A, 0x6136}, //8993 #CJK UNIFIED IDEOGRAPH + {0xDD6B, 0x6132}, //8994 #CJK UNIFIED IDEOGRAPH + {0xDD6C, 0x612E}, //8995 #CJK UNIFIED IDEOGRAPH + {0xDD6D, 0x6146}, //8996 #CJK UNIFIED IDEOGRAPH + {0xDD6E, 0x612F}, //8997 #CJK UNIFIED IDEOGRAPH + {0xDD6F, 0x614F}, //8998 #CJK UNIFIED IDEOGRAPH + {0xDD70, 0x6129}, //8999 #CJK UNIFIED IDEOGRAPH + {0xDD71, 0x6140}, //9000 #CJK UNIFIED IDEOGRAPH + {0xDD72, 0x6220}, //9001 #CJK UNIFIED IDEOGRAPH + {0xDD73, 0x9168}, //9002 #CJK UNIFIED IDEOGRAPH + {0xDD74, 0x6223}, //9003 #CJK UNIFIED IDEOGRAPH + {0xDD75, 0x6225}, //9004 #CJK UNIFIED IDEOGRAPH + {0xDD76, 0x6224}, //9005 #CJK UNIFIED IDEOGRAPH + {0xDD77, 0x63C5}, //9006 #CJK UNIFIED IDEOGRAPH + {0xDD78, 0x63F1}, //9007 #CJK UNIFIED IDEOGRAPH + {0xDD79, 0x63EB}, //9008 #CJK UNIFIED IDEOGRAPH + {0xDD7A, 0x6410}, //9009 #CJK UNIFIED IDEOGRAPH + {0xDD7B, 0x6412}, //9010 #CJK UNIFIED IDEOGRAPH + {0xDD7C, 0x6409}, //9011 #CJK UNIFIED IDEOGRAPH + {0xDD7D, 0x6420}, //9012 #CJK UNIFIED IDEOGRAPH + {0xDD7E, 0x6424}, //9013 #CJK UNIFIED IDEOGRAPH + {0xDDA1, 0x6433}, //9014 #CJK UNIFIED IDEOGRAPH + {0xDDA2, 0x6443}, //9015 #CJK UNIFIED IDEOGRAPH + {0xDDA3, 0x641F}, //9016 #CJK UNIFIED IDEOGRAPH + {0xDDA4, 0x6415}, //9017 #CJK UNIFIED IDEOGRAPH + {0xDDA5, 0x6418}, //9018 #CJK UNIFIED IDEOGRAPH + {0xDDA6, 0x6439}, //9019 #CJK UNIFIED IDEOGRAPH + {0xDDA7, 0x6437}, //9020 #CJK UNIFIED IDEOGRAPH + {0xDDA8, 0x6422}, //9021 #CJK UNIFIED IDEOGRAPH + {0xDDA9, 0x6423}, //9022 #CJK UNIFIED IDEOGRAPH + {0xDDAA, 0x640C}, //9023 #CJK UNIFIED IDEOGRAPH + {0xDDAB, 0x6426}, //9024 #CJK UNIFIED IDEOGRAPH + {0xDDAC, 0x6430}, //9025 #CJK UNIFIED IDEOGRAPH + {0xDDAD, 0x6428}, //9026 #CJK UNIFIED IDEOGRAPH + {0xDDAE, 0x6441}, //9027 #CJK UNIFIED IDEOGRAPH + {0xDDAF, 0x6435}, //9028 #CJK UNIFIED IDEOGRAPH + {0xDDB0, 0x642F}, //9029 #CJK UNIFIED IDEOGRAPH + {0xDDB1, 0x640A}, //9030 #CJK UNIFIED IDEOGRAPH + {0xDDB2, 0x641A}, //9031 #CJK UNIFIED IDEOGRAPH + {0xDDB3, 0x6440}, //9032 #CJK UNIFIED IDEOGRAPH + {0xDDB4, 0x6425}, //9033 #CJK UNIFIED IDEOGRAPH + {0xDDB5, 0x6427}, //9034 #CJK UNIFIED IDEOGRAPH + {0xDDB6, 0x640B}, //9035 #CJK UNIFIED IDEOGRAPH + {0xDDB7, 0x63E7}, //9036 #CJK UNIFIED IDEOGRAPH + {0xDDB8, 0x641B}, //9037 #CJK UNIFIED IDEOGRAPH + {0xDDB9, 0x642E}, //9038 #CJK UNIFIED IDEOGRAPH + {0xDDBA, 0x6421}, //9039 #CJK UNIFIED IDEOGRAPH + {0xDDBB, 0x640E}, //9040 #CJK UNIFIED IDEOGRAPH + {0xDDBC, 0x656F}, //9041 #CJK UNIFIED IDEOGRAPH + {0xDDBD, 0x6592}, //9042 #CJK UNIFIED IDEOGRAPH + {0xDDBE, 0x65D3}, //9043 #CJK UNIFIED IDEOGRAPH + {0xDDBF, 0x6686}, //9044 #CJK UNIFIED IDEOGRAPH + {0xDDC0, 0x668C}, //9045 #CJK UNIFIED IDEOGRAPH + {0xDDC1, 0x6695}, //9046 #CJK UNIFIED IDEOGRAPH + {0xDDC2, 0x6690}, //9047 #CJK UNIFIED IDEOGRAPH + {0xDDC3, 0x668B}, //9048 #CJK UNIFIED IDEOGRAPH + {0xDDC4, 0x668A}, //9049 #CJK UNIFIED IDEOGRAPH + {0xDDC5, 0x6699}, //9050 #CJK UNIFIED IDEOGRAPH + {0xDDC6, 0x6694}, //9051 #CJK UNIFIED IDEOGRAPH + {0xDDC7, 0x6678}, //9052 #CJK UNIFIED IDEOGRAPH + {0xDDC8, 0x6720}, //9053 #CJK UNIFIED IDEOGRAPH + {0xDDC9, 0x6966}, //9054 #CJK UNIFIED IDEOGRAPH + {0xDDCA, 0x695F}, //9055 #CJK UNIFIED IDEOGRAPH + {0xDDCB, 0x6938}, //9056 #CJK UNIFIED IDEOGRAPH + {0xDDCC, 0x694E}, //9057 #CJK UNIFIED IDEOGRAPH + {0xDDCD, 0x6962}, //9058 #CJK UNIFIED IDEOGRAPH + {0xDDCE, 0x6971}, //9059 #CJK UNIFIED IDEOGRAPH + {0xDDCF, 0x693F}, //9060 #CJK UNIFIED IDEOGRAPH + {0xDDD0, 0x6945}, //9061 #CJK UNIFIED IDEOGRAPH + {0xDDD1, 0x696A}, //9062 #CJK UNIFIED IDEOGRAPH + {0xDDD2, 0x6939}, //9063 #CJK UNIFIED IDEOGRAPH + {0xDDD3, 0x6942}, //9064 #CJK UNIFIED IDEOGRAPH + {0xDDD4, 0x6957}, //9065 #CJK UNIFIED IDEOGRAPH + {0xDDD5, 0x6959}, //9066 #CJK UNIFIED IDEOGRAPH + {0xDDD6, 0x697A}, //9067 #CJK UNIFIED IDEOGRAPH + {0xDDD7, 0x6948}, //9068 #CJK UNIFIED IDEOGRAPH + {0xDDD8, 0x6949}, //9069 #CJK UNIFIED IDEOGRAPH + {0xDDD9, 0x6935}, //9070 #CJK UNIFIED IDEOGRAPH + {0xDDDA, 0x696C}, //9071 #CJK UNIFIED IDEOGRAPH + {0xDDDB, 0x6933}, //9072 #CJK UNIFIED IDEOGRAPH + {0xDDDC, 0x693D}, //9073 #CJK UNIFIED IDEOGRAPH + {0xDDDD, 0x6965}, //9074 #CJK UNIFIED IDEOGRAPH + {0xDDDE, 0x68F0}, //9075 #CJK UNIFIED IDEOGRAPH + {0xDDDF, 0x6978}, //9076 #CJK UNIFIED IDEOGRAPH + {0xDDE0, 0x6934}, //9077 #CJK UNIFIED IDEOGRAPH + {0xDDE1, 0x6969}, //9078 #CJK UNIFIED IDEOGRAPH + {0xDDE2, 0x6940}, //9079 #CJK UNIFIED IDEOGRAPH + {0xDDE3, 0x696F}, //9080 #CJK UNIFIED IDEOGRAPH + {0xDDE4, 0x6944}, //9081 #CJK UNIFIED IDEOGRAPH + {0xDDE5, 0x6976}, //9082 #CJK UNIFIED IDEOGRAPH + {0xDDE6, 0x6958}, //9083 #CJK UNIFIED IDEOGRAPH + {0xDDE7, 0x6941}, //9084 #CJK UNIFIED IDEOGRAPH + {0xDDE8, 0x6974}, //9085 #CJK UNIFIED IDEOGRAPH + {0xDDE9, 0x694C}, //9086 #CJK UNIFIED IDEOGRAPH + {0xDDEA, 0x693B}, //9087 #CJK UNIFIED IDEOGRAPH + {0xDDEB, 0x694B}, //9088 #CJK UNIFIED IDEOGRAPH + {0xDDEC, 0x6937}, //9089 #CJK UNIFIED IDEOGRAPH + {0xDDED, 0x695C}, //9090 #CJK UNIFIED IDEOGRAPH + {0xDDEE, 0x694F}, //9091 #CJK UNIFIED IDEOGRAPH + {0xDDEF, 0x6951}, //9092 #CJK UNIFIED IDEOGRAPH + {0xDDF0, 0x6932}, //9093 #CJK UNIFIED IDEOGRAPH + {0xDDF1, 0x6952}, //9094 #CJK UNIFIED IDEOGRAPH + {0xDDF2, 0x692F}, //9095 #CJK UNIFIED IDEOGRAPH + {0xDDF3, 0x697B}, //9096 #CJK UNIFIED IDEOGRAPH + {0xDDF4, 0x693C}, //9097 #CJK UNIFIED IDEOGRAPH + {0xDDF5, 0x6B46}, //9098 #CJK UNIFIED IDEOGRAPH + {0xDDF6, 0x6B45}, //9099 #CJK UNIFIED IDEOGRAPH + {0xDDF7, 0x6B43}, //9100 #CJK UNIFIED IDEOGRAPH + {0xDDF8, 0x6B42}, //9101 #CJK UNIFIED IDEOGRAPH + {0xDDF9, 0x6B48}, //9102 #CJK UNIFIED IDEOGRAPH + {0xDDFA, 0x6B41}, //9103 #CJK UNIFIED IDEOGRAPH + {0xDDFB, 0x6B9B}, //9104 #CJK UNIFIED IDEOGRAPH + {0xDDFC, 0xFA0D}, //9105 #CJK COMPATIBILITY IDEOGRAPH + {0xDDFD, 0x6BFB}, //9106 #CJK UNIFIED IDEOGRAPH + {0xDDFE, 0x6BFC}, //9107 #CJK UNIFIED IDEOGRAPH + {0xDE40, 0x6BF9}, //9108 #CJK UNIFIED IDEOGRAPH + {0xDE41, 0x6BF7}, //9109 #CJK UNIFIED IDEOGRAPH + {0xDE42, 0x6BF8}, //9110 #CJK UNIFIED IDEOGRAPH + {0xDE43, 0x6E9B}, //9111 #CJK UNIFIED IDEOGRAPH + {0xDE44, 0x6ED6}, //9112 #CJK UNIFIED IDEOGRAPH + {0xDE45, 0x6EC8}, //9113 #CJK UNIFIED IDEOGRAPH + {0xDE46, 0x6E8F}, //9114 #CJK UNIFIED IDEOGRAPH + {0xDE47, 0x6EC0}, //9115 #CJK UNIFIED IDEOGRAPH + {0xDE48, 0x6E9F}, //9116 #CJK UNIFIED IDEOGRAPH + {0xDE49, 0x6E93}, //9117 #CJK UNIFIED IDEOGRAPH + {0xDE4A, 0x6E94}, //9118 #CJK UNIFIED IDEOGRAPH + {0xDE4B, 0x6EA0}, //9119 #CJK UNIFIED IDEOGRAPH + {0xDE4C, 0x6EB1}, //9120 #CJK UNIFIED IDEOGRAPH + {0xDE4D, 0x6EB9}, //9121 #CJK UNIFIED IDEOGRAPH + {0xDE4E, 0x6EC6}, //9122 #CJK UNIFIED IDEOGRAPH + {0xDE4F, 0x6ED2}, //9123 #CJK UNIFIED IDEOGRAPH + {0xDE50, 0x6EBD}, //9124 #CJK UNIFIED IDEOGRAPH + {0xDE51, 0x6EC1}, //9125 #CJK UNIFIED IDEOGRAPH + {0xDE52, 0x6E9E}, //9126 #CJK UNIFIED IDEOGRAPH + {0xDE53, 0x6EC9}, //9127 #CJK UNIFIED IDEOGRAPH + {0xDE54, 0x6EB7}, //9128 #CJK UNIFIED IDEOGRAPH + {0xDE55, 0x6EB0}, //9129 #CJK UNIFIED IDEOGRAPH + {0xDE56, 0x6ECD}, //9130 #CJK UNIFIED IDEOGRAPH + {0xDE57, 0x6EA6}, //9131 #CJK UNIFIED IDEOGRAPH + {0xDE58, 0x6ECF}, //9132 #CJK UNIFIED IDEOGRAPH + {0xDE59, 0x6EB2}, //9133 #CJK UNIFIED IDEOGRAPH + {0xDE5A, 0x6EBE}, //9134 #CJK UNIFIED IDEOGRAPH + {0xDE5B, 0x6EC3}, //9135 #CJK UNIFIED IDEOGRAPH + {0xDE5C, 0x6EDC}, //9136 #CJK UNIFIED IDEOGRAPH + {0xDE5D, 0x6ED8}, //9137 #CJK UNIFIED IDEOGRAPH + {0xDE5E, 0x6E99}, //9138 #CJK UNIFIED IDEOGRAPH + {0xDE5F, 0x6E92}, //9139 #CJK UNIFIED IDEOGRAPH + {0xDE60, 0x6E8E}, //9140 #CJK UNIFIED IDEOGRAPH + {0xDE61, 0x6E8D}, //9141 #CJK UNIFIED IDEOGRAPH + {0xDE62, 0x6EA4}, //9142 #CJK UNIFIED IDEOGRAPH + {0xDE63, 0x6EA1}, //9143 #CJK UNIFIED IDEOGRAPH + {0xDE64, 0x6EBF}, //9144 #CJK UNIFIED IDEOGRAPH + {0xDE65, 0x6EB3}, //9145 #CJK UNIFIED IDEOGRAPH + {0xDE66, 0x6ED0}, //9146 #CJK UNIFIED IDEOGRAPH + {0xDE67, 0x6ECA}, //9147 #CJK UNIFIED IDEOGRAPH + {0xDE68, 0x6E97}, //9148 #CJK UNIFIED IDEOGRAPH + {0xDE69, 0x6EAE}, //9149 #CJK UNIFIED IDEOGRAPH + {0xDE6A, 0x6EA3}, //9150 #CJK UNIFIED IDEOGRAPH + {0xDE6B, 0x7147}, //9151 #CJK UNIFIED IDEOGRAPH + {0xDE6C, 0x7154}, //9152 #CJK UNIFIED IDEOGRAPH + {0xDE6D, 0x7152}, //9153 #CJK UNIFIED IDEOGRAPH + {0xDE6E, 0x7163}, //9154 #CJK UNIFIED IDEOGRAPH + {0xDE6F, 0x7160}, //9155 #CJK UNIFIED IDEOGRAPH + {0xDE70, 0x7141}, //9156 #CJK UNIFIED IDEOGRAPH + {0xDE71, 0x715D}, //9157 #CJK UNIFIED IDEOGRAPH + {0xDE72, 0x7162}, //9158 #CJK UNIFIED IDEOGRAPH + {0xDE73, 0x7172}, //9159 #CJK UNIFIED IDEOGRAPH + {0xDE74, 0x7178}, //9160 #CJK UNIFIED IDEOGRAPH + {0xDE75, 0x716A}, //9161 #CJK UNIFIED IDEOGRAPH + {0xDE76, 0x7161}, //9162 #CJK UNIFIED IDEOGRAPH + {0xDE77, 0x7142}, //9163 #CJK UNIFIED IDEOGRAPH + {0xDE78, 0x7158}, //9164 #CJK UNIFIED IDEOGRAPH + {0xDE79, 0x7143}, //9165 #CJK UNIFIED IDEOGRAPH + {0xDE7A, 0x714B}, //9166 #CJK UNIFIED IDEOGRAPH + {0xDE7B, 0x7170}, //9167 #CJK UNIFIED IDEOGRAPH + {0xDE7C, 0x715F}, //9168 #CJK UNIFIED IDEOGRAPH + {0xDE7D, 0x7150}, //9169 #CJK UNIFIED IDEOGRAPH + {0xDE7E, 0x7153}, //9170 #CJK UNIFIED IDEOGRAPH + {0xDEA1, 0x7144}, //9171 #CJK UNIFIED IDEOGRAPH + {0xDEA2, 0x714D}, //9172 #CJK UNIFIED IDEOGRAPH + {0xDEA3, 0x715A}, //9173 #CJK UNIFIED IDEOGRAPH + {0xDEA4, 0x724F}, //9174 #CJK UNIFIED IDEOGRAPH + {0xDEA5, 0x728D}, //9175 #CJK UNIFIED IDEOGRAPH + {0xDEA6, 0x728C}, //9176 #CJK UNIFIED IDEOGRAPH + {0xDEA7, 0x7291}, //9177 #CJK UNIFIED IDEOGRAPH + {0xDEA8, 0x7290}, //9178 #CJK UNIFIED IDEOGRAPH + {0xDEA9, 0x728E}, //9179 #CJK UNIFIED IDEOGRAPH + {0xDEAA, 0x733C}, //9180 #CJK UNIFIED IDEOGRAPH + {0xDEAB, 0x7342}, //9181 #CJK UNIFIED IDEOGRAPH + {0xDEAC, 0x733B}, //9182 #CJK UNIFIED IDEOGRAPH + {0xDEAD, 0x733A}, //9183 #CJK UNIFIED IDEOGRAPH + {0xDEAE, 0x7340}, //9184 #CJK UNIFIED IDEOGRAPH + {0xDEAF, 0x734A}, //9185 #CJK UNIFIED IDEOGRAPH + {0xDEB0, 0x7349}, //9186 #CJK UNIFIED IDEOGRAPH + {0xDEB1, 0x7444}, //9187 #CJK UNIFIED IDEOGRAPH + {0xDEB2, 0x744A}, //9188 #CJK UNIFIED IDEOGRAPH + {0xDEB3, 0x744B}, //9189 #CJK UNIFIED IDEOGRAPH + {0xDEB4, 0x7452}, //9190 #CJK UNIFIED IDEOGRAPH + {0xDEB5, 0x7451}, //9191 #CJK UNIFIED IDEOGRAPH + {0xDEB6, 0x7457}, //9192 #CJK UNIFIED IDEOGRAPH + {0xDEB7, 0x7440}, //9193 #CJK UNIFIED IDEOGRAPH + {0xDEB8, 0x744F}, //9194 #CJK UNIFIED IDEOGRAPH + {0xDEB9, 0x7450}, //9195 #CJK UNIFIED IDEOGRAPH + {0xDEBA, 0x744E}, //9196 #CJK UNIFIED IDEOGRAPH + {0xDEBB, 0x7442}, //9197 #CJK UNIFIED IDEOGRAPH + {0xDEBC, 0x7446}, //9198 #CJK UNIFIED IDEOGRAPH + {0xDEBD, 0x744D}, //9199 #CJK UNIFIED IDEOGRAPH + {0xDEBE, 0x7454}, //9200 #CJK UNIFIED IDEOGRAPH + {0xDEBF, 0x74E1}, //9201 #CJK UNIFIED IDEOGRAPH + {0xDEC0, 0x74FF}, //9202 #CJK UNIFIED IDEOGRAPH + {0xDEC1, 0x74FE}, //9203 #CJK UNIFIED IDEOGRAPH + {0xDEC2, 0x74FD}, //9204 #CJK UNIFIED IDEOGRAPH + {0xDEC3, 0x751D}, //9205 #CJK UNIFIED IDEOGRAPH + {0xDEC4, 0x7579}, //9206 #CJK UNIFIED IDEOGRAPH + {0xDEC5, 0x7577}, //9207 #CJK UNIFIED IDEOGRAPH + {0xDEC6, 0x6983}, //9208 #CJK UNIFIED IDEOGRAPH + {0xDEC7, 0x75EF}, //9209 #CJK UNIFIED IDEOGRAPH + {0xDEC8, 0x760F}, //9210 #CJK UNIFIED IDEOGRAPH + {0xDEC9, 0x7603}, //9211 #CJK UNIFIED IDEOGRAPH + {0xDECA, 0x75F7}, //9212 #CJK UNIFIED IDEOGRAPH + {0xDECB, 0x75FE}, //9213 #CJK UNIFIED IDEOGRAPH + {0xDECC, 0x75FC}, //9214 #CJK UNIFIED IDEOGRAPH + {0xDECD, 0x75F9}, //9215 #CJK UNIFIED IDEOGRAPH + {0xDECE, 0x75F8}, //9216 #CJK UNIFIED IDEOGRAPH + {0xDECF, 0x7610}, //9217 #CJK UNIFIED IDEOGRAPH + {0xDED0, 0x75FB}, //9218 #CJK UNIFIED IDEOGRAPH + {0xDED1, 0x75F6}, //9219 #CJK UNIFIED IDEOGRAPH + {0xDED2, 0x75ED}, //9220 #CJK UNIFIED IDEOGRAPH + {0xDED3, 0x75F5}, //9221 #CJK UNIFIED IDEOGRAPH + {0xDED4, 0x75FD}, //9222 #CJK UNIFIED IDEOGRAPH + {0xDED5, 0x7699}, //9223 #CJK UNIFIED IDEOGRAPH + {0xDED6, 0x76B5}, //9224 #CJK UNIFIED IDEOGRAPH + {0xDED7, 0x76DD}, //9225 #CJK UNIFIED IDEOGRAPH + {0xDED8, 0x7755}, //9226 #CJK UNIFIED IDEOGRAPH + {0xDED9, 0x775F}, //9227 #CJK UNIFIED IDEOGRAPH + {0xDEDA, 0x7760}, //9228 #CJK UNIFIED IDEOGRAPH + {0xDEDB, 0x7752}, //9229 #CJK UNIFIED IDEOGRAPH + {0xDEDC, 0x7756}, //9230 #CJK UNIFIED IDEOGRAPH + {0xDEDD, 0x775A}, //9231 #CJK UNIFIED IDEOGRAPH + {0xDEDE, 0x7769}, //9232 #CJK UNIFIED IDEOGRAPH + {0xDEDF, 0x7767}, //9233 #CJK UNIFIED IDEOGRAPH + {0xDEE0, 0x7754}, //9234 #CJK UNIFIED IDEOGRAPH + {0xDEE1, 0x7759}, //9235 #CJK UNIFIED IDEOGRAPH + {0xDEE2, 0x776D}, //9236 #CJK UNIFIED IDEOGRAPH + {0xDEE3, 0x77E0}, //9237 #CJK UNIFIED IDEOGRAPH + {0xDEE4, 0x7887}, //9238 #CJK UNIFIED IDEOGRAPH + {0xDEE5, 0x789A}, //9239 #CJK UNIFIED IDEOGRAPH + {0xDEE6, 0x7894}, //9240 #CJK UNIFIED IDEOGRAPH + {0xDEE7, 0x788F}, //9241 #CJK UNIFIED IDEOGRAPH + {0xDEE8, 0x7884}, //9242 #CJK UNIFIED IDEOGRAPH + {0xDEE9, 0x7895}, //9243 #CJK UNIFIED IDEOGRAPH + {0xDEEA, 0x7885}, //9244 #CJK UNIFIED IDEOGRAPH + {0xDEEB, 0x7886}, //9245 #CJK UNIFIED IDEOGRAPH + {0xDEEC, 0x78A1}, //9246 #CJK UNIFIED IDEOGRAPH + {0xDEED, 0x7883}, //9247 #CJK UNIFIED IDEOGRAPH + {0xDEEE, 0x7879}, //9248 #CJK UNIFIED IDEOGRAPH + {0xDEEF, 0x7899}, //9249 #CJK UNIFIED IDEOGRAPH + {0xDEF0, 0x7880}, //9250 #CJK UNIFIED IDEOGRAPH + {0xDEF1, 0x7896}, //9251 #CJK UNIFIED IDEOGRAPH + {0xDEF2, 0x787B}, //9252 #CJK UNIFIED IDEOGRAPH + {0xDEF3, 0x797C}, //9253 #CJK UNIFIED IDEOGRAPH + {0xDEF4, 0x7982}, //9254 #CJK UNIFIED IDEOGRAPH + {0xDEF5, 0x797D}, //9255 #CJK UNIFIED IDEOGRAPH + {0xDEF6, 0x7979}, //9256 #CJK UNIFIED IDEOGRAPH + {0xDEF7, 0x7A11}, //9257 #CJK UNIFIED IDEOGRAPH + {0xDEF8, 0x7A18}, //9258 #CJK UNIFIED IDEOGRAPH + {0xDEF9, 0x7A19}, //9259 #CJK UNIFIED IDEOGRAPH + {0xDEFA, 0x7A12}, //9260 #CJK UNIFIED IDEOGRAPH + {0xDEFB, 0x7A17}, //9261 #CJK UNIFIED IDEOGRAPH + {0xDEFC, 0x7A15}, //9262 #CJK UNIFIED IDEOGRAPH + {0xDEFD, 0x7A22}, //9263 #CJK UNIFIED IDEOGRAPH + {0xDEFE, 0x7A13}, //9264 #CJK UNIFIED IDEOGRAPH + {0xDF40, 0x7A1B}, //9265 #CJK UNIFIED IDEOGRAPH + {0xDF41, 0x7A10}, //9266 #CJK UNIFIED IDEOGRAPH + {0xDF42, 0x7AA3}, //9267 #CJK UNIFIED IDEOGRAPH + {0xDF43, 0x7AA2}, //9268 #CJK UNIFIED IDEOGRAPH + {0xDF44, 0x7A9E}, //9269 #CJK UNIFIED IDEOGRAPH + {0xDF45, 0x7AEB}, //9270 #CJK UNIFIED IDEOGRAPH + {0xDF46, 0x7B66}, //9271 #CJK UNIFIED IDEOGRAPH + {0xDF47, 0x7B64}, //9272 #CJK UNIFIED IDEOGRAPH + {0xDF48, 0x7B6D}, //9273 #CJK UNIFIED IDEOGRAPH + {0xDF49, 0x7B74}, //9274 #CJK UNIFIED IDEOGRAPH + {0xDF4A, 0x7B69}, //9275 #CJK UNIFIED IDEOGRAPH + {0xDF4B, 0x7B72}, //9276 #CJK UNIFIED IDEOGRAPH + {0xDF4C, 0x7B65}, //9277 #CJK UNIFIED IDEOGRAPH + {0xDF4D, 0x7B73}, //9278 #CJK UNIFIED IDEOGRAPH + {0xDF4E, 0x7B71}, //9279 #CJK UNIFIED IDEOGRAPH + {0xDF4F, 0x7B70}, //9280 #CJK UNIFIED IDEOGRAPH + {0xDF50, 0x7B61}, //9281 #CJK UNIFIED IDEOGRAPH + {0xDF51, 0x7B78}, //9282 #CJK UNIFIED IDEOGRAPH + {0xDF52, 0x7B76}, //9283 #CJK UNIFIED IDEOGRAPH + {0xDF53, 0x7B63}, //9284 #CJK UNIFIED IDEOGRAPH + {0xDF54, 0x7CB2}, //9285 #CJK UNIFIED IDEOGRAPH + {0xDF55, 0x7CB4}, //9286 #CJK UNIFIED IDEOGRAPH + {0xDF56, 0x7CAF}, //9287 #CJK UNIFIED IDEOGRAPH + {0xDF57, 0x7D88}, //9288 #CJK UNIFIED IDEOGRAPH + {0xDF58, 0x7D86}, //9289 #CJK UNIFIED IDEOGRAPH + {0xDF59, 0x7D80}, //9290 #CJK UNIFIED IDEOGRAPH + {0xDF5A, 0x7D8D}, //9291 #CJK UNIFIED IDEOGRAPH + {0xDF5B, 0x7D7F}, //9292 #CJK UNIFIED IDEOGRAPH + {0xDF5C, 0x7D85}, //9293 #CJK UNIFIED IDEOGRAPH + {0xDF5D, 0x7D7A}, //9294 #CJK UNIFIED IDEOGRAPH + {0xDF5E, 0x7D8E}, //9295 #CJK UNIFIED IDEOGRAPH + {0xDF5F, 0x7D7B}, //9296 #CJK UNIFIED IDEOGRAPH + {0xDF60, 0x7D83}, //9297 #CJK UNIFIED IDEOGRAPH + {0xDF61, 0x7D7C}, //9298 #CJK UNIFIED IDEOGRAPH + {0xDF62, 0x7D8C}, //9299 #CJK UNIFIED IDEOGRAPH + {0xDF63, 0x7D94}, //9300 #CJK UNIFIED IDEOGRAPH + {0xDF64, 0x7D84}, //9301 #CJK UNIFIED IDEOGRAPH + {0xDF65, 0x7D7D}, //9302 #CJK UNIFIED IDEOGRAPH + {0xDF66, 0x7D92}, //9303 #CJK UNIFIED IDEOGRAPH + {0xDF67, 0x7F6D}, //9304 #CJK UNIFIED IDEOGRAPH + {0xDF68, 0x7F6B}, //9305 #CJK UNIFIED IDEOGRAPH + {0xDF69, 0x7F67}, //9306 #CJK UNIFIED IDEOGRAPH + {0xDF6A, 0x7F68}, //9307 #CJK UNIFIED IDEOGRAPH + {0xDF6B, 0x7F6C}, //9308 #CJK UNIFIED IDEOGRAPH + {0xDF6C, 0x7FA6}, //9309 #CJK UNIFIED IDEOGRAPH + {0xDF6D, 0x7FA5}, //9310 #CJK UNIFIED IDEOGRAPH + {0xDF6E, 0x7FA7}, //9311 #CJK UNIFIED IDEOGRAPH + {0xDF6F, 0x7FDB}, //9312 #CJK UNIFIED IDEOGRAPH + {0xDF70, 0x7FDC}, //9313 #CJK UNIFIED IDEOGRAPH + {0xDF71, 0x8021}, //9314 #CJK UNIFIED IDEOGRAPH + {0xDF72, 0x8164}, //9315 #CJK UNIFIED IDEOGRAPH + {0xDF73, 0x8160}, //9316 #CJK UNIFIED IDEOGRAPH + {0xDF74, 0x8177}, //9317 #CJK UNIFIED IDEOGRAPH + {0xDF75, 0x815C}, //9318 #CJK UNIFIED IDEOGRAPH + {0xDF76, 0x8169}, //9319 #CJK UNIFIED IDEOGRAPH + {0xDF77, 0x815B}, //9320 #CJK UNIFIED IDEOGRAPH + {0xDF78, 0x8162}, //9321 #CJK UNIFIED IDEOGRAPH + {0xDF79, 0x8172}, //9322 #CJK UNIFIED IDEOGRAPH + {0xDF7A, 0x6721}, //9323 #CJK UNIFIED IDEOGRAPH + {0xDF7B, 0x815E}, //9324 #CJK UNIFIED IDEOGRAPH + {0xDF7C, 0x8176}, //9325 #CJK UNIFIED IDEOGRAPH + {0xDF7D, 0x8167}, //9326 #CJK UNIFIED IDEOGRAPH + {0xDF7E, 0x816F}, //9327 #CJK UNIFIED IDEOGRAPH + {0xDFA1, 0x8144}, //9328 #CJK UNIFIED IDEOGRAPH + {0xDFA2, 0x8161}, //9329 #CJK UNIFIED IDEOGRAPH + {0xDFA3, 0x821D}, //9330 #CJK UNIFIED IDEOGRAPH + {0xDFA4, 0x8249}, //9331 #CJK UNIFIED IDEOGRAPH + {0xDFA5, 0x8244}, //9332 #CJK UNIFIED IDEOGRAPH + {0xDFA6, 0x8240}, //9333 #CJK UNIFIED IDEOGRAPH + {0xDFA7, 0x8242}, //9334 #CJK UNIFIED IDEOGRAPH + {0xDFA8, 0x8245}, //9335 #CJK UNIFIED IDEOGRAPH + {0xDFA9, 0x84F1}, //9336 #CJK UNIFIED IDEOGRAPH + {0xDFAA, 0x843F}, //9337 #CJK UNIFIED IDEOGRAPH + {0xDFAB, 0x8456}, //9338 #CJK UNIFIED IDEOGRAPH + {0xDFAC, 0x8476}, //9339 #CJK UNIFIED IDEOGRAPH + {0xDFAD, 0x8479}, //9340 #CJK UNIFIED IDEOGRAPH + {0xDFAE, 0x848F}, //9341 #CJK UNIFIED IDEOGRAPH + {0xDFAF, 0x848D}, //9342 #CJK UNIFIED IDEOGRAPH + {0xDFB0, 0x8465}, //9343 #CJK UNIFIED IDEOGRAPH + {0xDFB1, 0x8451}, //9344 #CJK UNIFIED IDEOGRAPH + {0xDFB2, 0x8440}, //9345 #CJK UNIFIED IDEOGRAPH + {0xDFB3, 0x8486}, //9346 #CJK UNIFIED IDEOGRAPH + {0xDFB4, 0x8467}, //9347 #CJK UNIFIED IDEOGRAPH + {0xDFB5, 0x8430}, //9348 #CJK UNIFIED IDEOGRAPH + {0xDFB6, 0x844D}, //9349 #CJK UNIFIED IDEOGRAPH + {0xDFB7, 0x847D}, //9350 #CJK UNIFIED IDEOGRAPH + {0xDFB8, 0x845A}, //9351 #CJK UNIFIED IDEOGRAPH + {0xDFB9, 0x8459}, //9352 #CJK UNIFIED IDEOGRAPH + {0xDFBA, 0x8474}, //9353 #CJK UNIFIED IDEOGRAPH + {0xDFBB, 0x8473}, //9354 #CJK UNIFIED IDEOGRAPH + {0xDFBC, 0x845D}, //9355 #CJK UNIFIED IDEOGRAPH + {0xDFBD, 0x8507}, //9356 #CJK UNIFIED IDEOGRAPH + {0xDFBE, 0x845E}, //9357 #CJK UNIFIED IDEOGRAPH + {0xDFBF, 0x8437}, //9358 #CJK UNIFIED IDEOGRAPH + {0xDFC0, 0x843A}, //9359 #CJK UNIFIED IDEOGRAPH + {0xDFC1, 0x8434}, //9360 #CJK UNIFIED IDEOGRAPH + {0xDFC2, 0x847A}, //9361 #CJK UNIFIED IDEOGRAPH + {0xDFC3, 0x8443}, //9362 #CJK UNIFIED IDEOGRAPH + {0xDFC4, 0x8478}, //9363 #CJK UNIFIED IDEOGRAPH + {0xDFC5, 0x8432}, //9364 #CJK UNIFIED IDEOGRAPH + {0xDFC6, 0x8445}, //9365 #CJK UNIFIED IDEOGRAPH + {0xDFC7, 0x8429}, //9366 #CJK UNIFIED IDEOGRAPH + {0xDFC8, 0x83D9}, //9367 #CJK UNIFIED IDEOGRAPH + {0xDFC9, 0x844B}, //9368 #CJK UNIFIED IDEOGRAPH + {0xDFCA, 0x842F}, //9369 #CJK UNIFIED IDEOGRAPH + {0xDFCB, 0x8442}, //9370 #CJK UNIFIED IDEOGRAPH + {0xDFCC, 0x842D}, //9371 #CJK UNIFIED IDEOGRAPH + {0xDFCD, 0x845F}, //9372 #CJK UNIFIED IDEOGRAPH + {0xDFCE, 0x8470}, //9373 #CJK UNIFIED IDEOGRAPH + {0xDFCF, 0x8439}, //9374 #CJK UNIFIED IDEOGRAPH + {0xDFD0, 0x844E}, //9375 #CJK UNIFIED IDEOGRAPH + {0xDFD1, 0x844C}, //9376 #CJK UNIFIED IDEOGRAPH + {0xDFD2, 0x8452}, //9377 #CJK UNIFIED IDEOGRAPH + {0xDFD3, 0x846F}, //9378 #CJK UNIFIED IDEOGRAPH + {0xDFD4, 0x84C5}, //9379 #CJK UNIFIED IDEOGRAPH + {0xDFD5, 0x848E}, //9380 #CJK UNIFIED IDEOGRAPH + {0xDFD6, 0x843B}, //9381 #CJK UNIFIED IDEOGRAPH + {0xDFD7, 0x8447}, //9382 #CJK UNIFIED IDEOGRAPH + {0xDFD8, 0x8436}, //9383 #CJK UNIFIED IDEOGRAPH + {0xDFD9, 0x8433}, //9384 #CJK UNIFIED IDEOGRAPH + {0xDFDA, 0x8468}, //9385 #CJK UNIFIED IDEOGRAPH + {0xDFDB, 0x847E}, //9386 #CJK UNIFIED IDEOGRAPH + {0xDFDC, 0x8444}, //9387 #CJK UNIFIED IDEOGRAPH + {0xDFDD, 0x842B}, //9388 #CJK UNIFIED IDEOGRAPH + {0xDFDE, 0x8460}, //9389 #CJK UNIFIED IDEOGRAPH + {0xDFDF, 0x8454}, //9390 #CJK UNIFIED IDEOGRAPH + {0xDFE0, 0x846E}, //9391 #CJK UNIFIED IDEOGRAPH + {0xDFE1, 0x8450}, //9392 #CJK UNIFIED IDEOGRAPH + {0xDFE2, 0x870B}, //9393 #CJK UNIFIED IDEOGRAPH + {0xDFE3, 0x8704}, //9394 #CJK UNIFIED IDEOGRAPH + {0xDFE4, 0x86F7}, //9395 #CJK UNIFIED IDEOGRAPH + {0xDFE5, 0x870C}, //9396 #CJK UNIFIED IDEOGRAPH + {0xDFE6, 0x86FA}, //9397 #CJK UNIFIED IDEOGRAPH + {0xDFE7, 0x86D6}, //9398 #CJK UNIFIED IDEOGRAPH + {0xDFE8, 0x86F5}, //9399 #CJK UNIFIED IDEOGRAPH + {0xDFE9, 0x874D}, //9400 #CJK UNIFIED IDEOGRAPH + {0xDFEA, 0x86F8}, //9401 #CJK UNIFIED IDEOGRAPH + {0xDFEB, 0x870E}, //9402 #CJK UNIFIED IDEOGRAPH + {0xDFEC, 0x8709}, //9403 #CJK UNIFIED IDEOGRAPH + {0xDFED, 0x8701}, //9404 #CJK UNIFIED IDEOGRAPH + {0xDFEE, 0x86F6}, //9405 #CJK UNIFIED IDEOGRAPH + {0xDFEF, 0x870D}, //9406 #CJK UNIFIED IDEOGRAPH + {0xDFF0, 0x8705}, //9407 #CJK UNIFIED IDEOGRAPH + {0xDFF1, 0x88D6}, //9408 #CJK UNIFIED IDEOGRAPH + {0xDFF2, 0x88CB}, //9409 #CJK UNIFIED IDEOGRAPH + {0xDFF3, 0x88CD}, //9410 #CJK UNIFIED IDEOGRAPH + {0xDFF4, 0x88CE}, //9411 #CJK UNIFIED IDEOGRAPH + {0xDFF5, 0x88DE}, //9412 #CJK UNIFIED IDEOGRAPH + {0xDFF6, 0x88DB}, //9413 #CJK UNIFIED IDEOGRAPH + {0xDFF7, 0x88DA}, //9414 #CJK UNIFIED IDEOGRAPH + {0xDFF8, 0x88CC}, //9415 #CJK UNIFIED IDEOGRAPH + {0xDFF9, 0x88D0}, //9416 #CJK UNIFIED IDEOGRAPH + {0xDFFA, 0x8985}, //9417 #CJK UNIFIED IDEOGRAPH + {0xDFFB, 0x899B}, //9418 #CJK UNIFIED IDEOGRAPH + {0xDFFC, 0x89DF}, //9419 #CJK UNIFIED IDEOGRAPH + {0xDFFD, 0x89E5}, //9420 #CJK UNIFIED IDEOGRAPH + {0xDFFE, 0x89E4}, //9421 #CJK UNIFIED IDEOGRAPH + {0xE040, 0x89E1}, //9422 #CJK UNIFIED IDEOGRAPH + {0xE041, 0x89E0}, //9423 #CJK UNIFIED IDEOGRAPH + {0xE042, 0x89E2}, //9424 #CJK UNIFIED IDEOGRAPH + {0xE043, 0x89DC}, //9425 #CJK UNIFIED IDEOGRAPH + {0xE044, 0x89E6}, //9426 #CJK UNIFIED IDEOGRAPH + {0xE045, 0x8A76}, //9427 #CJK UNIFIED IDEOGRAPH + {0xE046, 0x8A86}, //9428 #CJK UNIFIED IDEOGRAPH + {0xE047, 0x8A7F}, //9429 #CJK UNIFIED IDEOGRAPH + {0xE048, 0x8A61}, //9430 #CJK UNIFIED IDEOGRAPH + {0xE049, 0x8A3F}, //9431 #CJK UNIFIED IDEOGRAPH + {0xE04A, 0x8A77}, //9432 #CJK UNIFIED IDEOGRAPH + {0xE04B, 0x8A82}, //9433 #CJK UNIFIED IDEOGRAPH + {0xE04C, 0x8A84}, //9434 #CJK UNIFIED IDEOGRAPH + {0xE04D, 0x8A75}, //9435 #CJK UNIFIED IDEOGRAPH + {0xE04E, 0x8A83}, //9436 #CJK UNIFIED IDEOGRAPH + {0xE04F, 0x8A81}, //9437 #CJK UNIFIED IDEOGRAPH + {0xE050, 0x8A74}, //9438 #CJK UNIFIED IDEOGRAPH + {0xE051, 0x8A7A}, //9439 #CJK UNIFIED IDEOGRAPH + {0xE052, 0x8C3C}, //9440 #CJK UNIFIED IDEOGRAPH + {0xE053, 0x8C4B}, //9441 #CJK UNIFIED IDEOGRAPH + {0xE054, 0x8C4A}, //9442 #CJK UNIFIED IDEOGRAPH + {0xE055, 0x8C65}, //9443 #CJK UNIFIED IDEOGRAPH + {0xE056, 0x8C64}, //9444 #CJK UNIFIED IDEOGRAPH + {0xE057, 0x8C66}, //9445 #CJK UNIFIED IDEOGRAPH + {0xE058, 0x8C86}, //9446 #CJK UNIFIED IDEOGRAPH + {0xE059, 0x8C84}, //9447 #CJK UNIFIED IDEOGRAPH + {0xE05A, 0x8C85}, //9448 #CJK UNIFIED IDEOGRAPH + {0xE05B, 0x8CCC}, //9449 #CJK UNIFIED IDEOGRAPH + {0xE05C, 0x8D68}, //9450 #CJK UNIFIED IDEOGRAPH + {0xE05D, 0x8D69}, //9451 #CJK UNIFIED IDEOGRAPH + {0xE05E, 0x8D91}, //9452 #CJK UNIFIED IDEOGRAPH + {0xE05F, 0x8D8C}, //9453 #CJK UNIFIED IDEOGRAPH + {0xE060, 0x8D8E}, //9454 #CJK UNIFIED IDEOGRAPH + {0xE061, 0x8D8F}, //9455 #CJK UNIFIED IDEOGRAPH + {0xE062, 0x8D8D}, //9456 #CJK UNIFIED IDEOGRAPH + {0xE063, 0x8D93}, //9457 #CJK UNIFIED IDEOGRAPH + {0xE064, 0x8D94}, //9458 #CJK UNIFIED IDEOGRAPH + {0xE065, 0x8D90}, //9459 #CJK UNIFIED IDEOGRAPH + {0xE066, 0x8D92}, //9460 #CJK UNIFIED IDEOGRAPH + {0xE067, 0x8DF0}, //9461 #CJK UNIFIED IDEOGRAPH + {0xE068, 0x8DE0}, //9462 #CJK UNIFIED IDEOGRAPH + {0xE069, 0x8DEC}, //9463 #CJK UNIFIED IDEOGRAPH + {0xE06A, 0x8DF1}, //9464 #CJK UNIFIED IDEOGRAPH + {0xE06B, 0x8DEE}, //9465 #CJK UNIFIED IDEOGRAPH + {0xE06C, 0x8DD0}, //9466 #CJK UNIFIED IDEOGRAPH + {0xE06D, 0x8DE9}, //9467 #CJK UNIFIED IDEOGRAPH + {0xE06E, 0x8DE3}, //9468 #CJK UNIFIED IDEOGRAPH + {0xE06F, 0x8DE2}, //9469 #CJK UNIFIED IDEOGRAPH + {0xE070, 0x8DE7}, //9470 #CJK UNIFIED IDEOGRAPH + {0xE071, 0x8DF2}, //9471 #CJK UNIFIED IDEOGRAPH + {0xE072, 0x8DEB}, //9472 #CJK UNIFIED IDEOGRAPH + {0xE073, 0x8DF4}, //9473 #CJK UNIFIED IDEOGRAPH + {0xE074, 0x8F06}, //9474 #CJK UNIFIED IDEOGRAPH + {0xE075, 0x8EFF}, //9475 #CJK UNIFIED IDEOGRAPH + {0xE076, 0x8F01}, //9476 #CJK UNIFIED IDEOGRAPH + {0xE077, 0x8F00}, //9477 #CJK UNIFIED IDEOGRAPH + {0xE078, 0x8F05}, //9478 #CJK UNIFIED IDEOGRAPH + {0xE079, 0x8F07}, //9479 #CJK UNIFIED IDEOGRAPH + {0xE07A, 0x8F08}, //9480 #CJK UNIFIED IDEOGRAPH + {0xE07B, 0x8F02}, //9481 #CJK UNIFIED IDEOGRAPH + {0xE07C, 0x8F0B}, //9482 #CJK UNIFIED IDEOGRAPH + {0xE07D, 0x9052}, //9483 #CJK UNIFIED IDEOGRAPH + {0xE07E, 0x903F}, //9484 #CJK UNIFIED IDEOGRAPH + {0xE0A1, 0x9044}, //9485 #CJK UNIFIED IDEOGRAPH + {0xE0A2, 0x9049}, //9486 #CJK UNIFIED IDEOGRAPH + {0xE0A3, 0x903D}, //9487 #CJK UNIFIED IDEOGRAPH + {0xE0A4, 0x9110}, //9488 #CJK UNIFIED IDEOGRAPH + {0xE0A5, 0x910D}, //9489 #CJK UNIFIED IDEOGRAPH + {0xE0A6, 0x910F}, //9490 #CJK UNIFIED IDEOGRAPH + {0xE0A7, 0x9111}, //9491 #CJK UNIFIED IDEOGRAPH + {0xE0A8, 0x9116}, //9492 #CJK UNIFIED IDEOGRAPH + {0xE0A9, 0x9114}, //9493 #CJK UNIFIED IDEOGRAPH + {0xE0AA, 0x910B}, //9494 #CJK UNIFIED IDEOGRAPH + {0xE0AB, 0x910E}, //9495 #CJK UNIFIED IDEOGRAPH + {0xE0AC, 0x916E}, //9496 #CJK UNIFIED IDEOGRAPH + {0xE0AD, 0x916F}, //9497 #CJK UNIFIED IDEOGRAPH + {0xE0AE, 0x9248}, //9498 #CJK UNIFIED IDEOGRAPH + {0xE0AF, 0x9252}, //9499 #CJK UNIFIED IDEOGRAPH + {0xE0B0, 0x9230}, //9500 #CJK UNIFIED IDEOGRAPH + {0xE0B1, 0x923A}, //9501 #CJK UNIFIED IDEOGRAPH + {0xE0B2, 0x9266}, //9502 #CJK UNIFIED IDEOGRAPH + {0xE0B3, 0x9233}, //9503 #CJK UNIFIED IDEOGRAPH + {0xE0B4, 0x9265}, //9504 #CJK UNIFIED IDEOGRAPH + {0xE0B5, 0x925E}, //9505 #CJK UNIFIED IDEOGRAPH + {0xE0B6, 0x9283}, //9506 #CJK UNIFIED IDEOGRAPH + {0xE0B7, 0x922E}, //9507 #CJK UNIFIED IDEOGRAPH + {0xE0B8, 0x924A}, //9508 #CJK UNIFIED IDEOGRAPH + {0xE0B9, 0x9246}, //9509 #CJK UNIFIED IDEOGRAPH + {0xE0BA, 0x926D}, //9510 #CJK UNIFIED IDEOGRAPH + {0xE0BB, 0x926C}, //9511 #CJK UNIFIED IDEOGRAPH + {0xE0BC, 0x924F}, //9512 #CJK UNIFIED IDEOGRAPH + {0xE0BD, 0x9260}, //9513 #CJK UNIFIED IDEOGRAPH + {0xE0BE, 0x9267}, //9514 #CJK UNIFIED IDEOGRAPH + {0xE0BF, 0x926F}, //9515 #CJK UNIFIED IDEOGRAPH + {0xE0C0, 0x9236}, //9516 #CJK UNIFIED IDEOGRAPH + {0xE0C1, 0x9261}, //9517 #CJK UNIFIED IDEOGRAPH + {0xE0C2, 0x9270}, //9518 #CJK UNIFIED IDEOGRAPH + {0xE0C3, 0x9231}, //9519 #CJK UNIFIED IDEOGRAPH + {0xE0C4, 0x9254}, //9520 #CJK UNIFIED IDEOGRAPH + {0xE0C5, 0x9263}, //9521 #CJK UNIFIED IDEOGRAPH + {0xE0C6, 0x9250}, //9522 #CJK UNIFIED IDEOGRAPH + {0xE0C7, 0x9272}, //9523 #CJK UNIFIED IDEOGRAPH + {0xE0C8, 0x924E}, //9524 #CJK UNIFIED IDEOGRAPH + {0xE0C9, 0x9253}, //9525 #CJK UNIFIED IDEOGRAPH + {0xE0CA, 0x924C}, //9526 #CJK UNIFIED IDEOGRAPH + {0xE0CB, 0x9256}, //9527 #CJK UNIFIED IDEOGRAPH + {0xE0CC, 0x9232}, //9528 #CJK UNIFIED IDEOGRAPH + {0xE0CD, 0x959F}, //9529 #CJK UNIFIED IDEOGRAPH + {0xE0CE, 0x959C}, //9530 #CJK UNIFIED IDEOGRAPH + {0xE0CF, 0x959E}, //9531 #CJK UNIFIED IDEOGRAPH + {0xE0D0, 0x959B}, //9532 #CJK UNIFIED IDEOGRAPH + {0xE0D1, 0x9692}, //9533 #CJK UNIFIED IDEOGRAPH + {0xE0D2, 0x9693}, //9534 #CJK UNIFIED IDEOGRAPH + {0xE0D3, 0x9691}, //9535 #CJK UNIFIED IDEOGRAPH + {0xE0D4, 0x9697}, //9536 #CJK UNIFIED IDEOGRAPH + {0xE0D5, 0x96CE}, //9537 #CJK UNIFIED IDEOGRAPH + {0xE0D6, 0x96FA}, //9538 #CJK UNIFIED IDEOGRAPH + {0xE0D7, 0x96FD}, //9539 #CJK UNIFIED IDEOGRAPH + {0xE0D8, 0x96F8}, //9540 #CJK UNIFIED IDEOGRAPH + {0xE0D9, 0x96F5}, //9541 #CJK UNIFIED IDEOGRAPH + {0xE0DA, 0x9773}, //9542 #CJK UNIFIED IDEOGRAPH + {0xE0DB, 0x9777}, //9543 #CJK UNIFIED IDEOGRAPH + {0xE0DC, 0x9778}, //9544 #CJK UNIFIED IDEOGRAPH + {0xE0DD, 0x9772}, //9545 #CJK UNIFIED IDEOGRAPH + {0xE0DE, 0x980F}, //9546 #CJK UNIFIED IDEOGRAPH + {0xE0DF, 0x980D}, //9547 #CJK UNIFIED IDEOGRAPH + {0xE0E0, 0x980E}, //9548 #CJK UNIFIED IDEOGRAPH + {0xE0E1, 0x98AC}, //9549 #CJK UNIFIED IDEOGRAPH + {0xE0E2, 0x98F6}, //9550 #CJK UNIFIED IDEOGRAPH + {0xE0E3, 0x98F9}, //9551 #CJK UNIFIED IDEOGRAPH + {0xE0E4, 0x99AF}, //9552 #CJK UNIFIED IDEOGRAPH + {0xE0E5, 0x99B2}, //9553 #CJK UNIFIED IDEOGRAPH + {0xE0E6, 0x99B0}, //9554 #CJK UNIFIED IDEOGRAPH + {0xE0E7, 0x99B5}, //9555 #CJK UNIFIED IDEOGRAPH + {0xE0E8, 0x9AAD}, //9556 #CJK UNIFIED IDEOGRAPH + {0xE0E9, 0x9AAB}, //9557 #CJK UNIFIED IDEOGRAPH + {0xE0EA, 0x9B5B}, //9558 #CJK UNIFIED IDEOGRAPH + {0xE0EB, 0x9CEA}, //9559 #CJK UNIFIED IDEOGRAPH + {0xE0EC, 0x9CED}, //9560 #CJK UNIFIED IDEOGRAPH + {0xE0ED, 0x9CE7}, //9561 #CJK UNIFIED IDEOGRAPH + {0xE0EE, 0x9E80}, //9562 #CJK UNIFIED IDEOGRAPH + {0xE0EF, 0x9EFD}, //9563 #CJK UNIFIED IDEOGRAPH + {0xE0F0, 0x50E6}, //9564 #CJK UNIFIED IDEOGRAPH + {0xE0F1, 0x50D4}, //9565 #CJK UNIFIED IDEOGRAPH + {0xE0F2, 0x50D7}, //9566 #CJK UNIFIED IDEOGRAPH + {0xE0F3, 0x50E8}, //9567 #CJK UNIFIED IDEOGRAPH + {0xE0F4, 0x50F3}, //9568 #CJK UNIFIED IDEOGRAPH + {0xE0F5, 0x50DB}, //9569 #CJK UNIFIED IDEOGRAPH + {0xE0F6, 0x50EA}, //9570 #CJK UNIFIED IDEOGRAPH + {0xE0F7, 0x50DD}, //9571 #CJK UNIFIED IDEOGRAPH + {0xE0F8, 0x50E4}, //9572 #CJK UNIFIED IDEOGRAPH + {0xE0F9, 0x50D3}, //9573 #CJK UNIFIED IDEOGRAPH + {0xE0FA, 0x50EC}, //9574 #CJK UNIFIED IDEOGRAPH + {0xE0FB, 0x50F0}, //9575 #CJK UNIFIED IDEOGRAPH + {0xE0FC, 0x50EF}, //9576 #CJK UNIFIED IDEOGRAPH + {0xE0FD, 0x50E3}, //9577 #CJK UNIFIED IDEOGRAPH + {0xE0FE, 0x50E0}, //9578 #CJK UNIFIED IDEOGRAPH + {0xE140, 0x51D8}, //9579 #CJK UNIFIED IDEOGRAPH + {0xE141, 0x5280}, //9580 #CJK UNIFIED IDEOGRAPH + {0xE142, 0x5281}, //9581 #CJK UNIFIED IDEOGRAPH + {0xE143, 0x52E9}, //9582 #CJK UNIFIED IDEOGRAPH + {0xE144, 0x52EB}, //9583 #CJK UNIFIED IDEOGRAPH + {0xE145, 0x5330}, //9584 #CJK UNIFIED IDEOGRAPH + {0xE146, 0x53AC}, //9585 #CJK UNIFIED IDEOGRAPH + {0xE147, 0x5627}, //9586 #CJK UNIFIED IDEOGRAPH + {0xE148, 0x5615}, //9587 #CJK UNIFIED IDEOGRAPH + {0xE149, 0x560C}, //9588 #CJK UNIFIED IDEOGRAPH + {0xE14A, 0x5612}, //9589 #CJK UNIFIED IDEOGRAPH + {0xE14B, 0x55FC}, //9590 #CJK UNIFIED IDEOGRAPH + {0xE14C, 0x560F}, //9591 #CJK UNIFIED IDEOGRAPH + {0xE14D, 0x561C}, //9592 #CJK UNIFIED IDEOGRAPH + {0xE14E, 0x5601}, //9593 #CJK UNIFIED IDEOGRAPH + {0xE14F, 0x5613}, //9594 #CJK UNIFIED IDEOGRAPH + {0xE150, 0x5602}, //9595 #CJK UNIFIED IDEOGRAPH + {0xE151, 0x55FA}, //9596 #CJK UNIFIED IDEOGRAPH + {0xE152, 0x561D}, //9597 #CJK UNIFIED IDEOGRAPH + {0xE153, 0x5604}, //9598 #CJK UNIFIED IDEOGRAPH + {0xE154, 0x55FF}, //9599 #CJK UNIFIED IDEOGRAPH + {0xE155, 0x55F9}, //9600 #CJK UNIFIED IDEOGRAPH + {0xE156, 0x5889}, //9601 #CJK UNIFIED IDEOGRAPH + {0xE157, 0x587C}, //9602 #CJK UNIFIED IDEOGRAPH + {0xE158, 0x5890}, //9603 #CJK UNIFIED IDEOGRAPH + {0xE159, 0x5898}, //9604 #CJK UNIFIED IDEOGRAPH + {0xE15A, 0x5886}, //9605 #CJK UNIFIED IDEOGRAPH + {0xE15B, 0x5881}, //9606 #CJK UNIFIED IDEOGRAPH + {0xE15C, 0x587F}, //9607 #CJK UNIFIED IDEOGRAPH + {0xE15D, 0x5874}, //9608 #CJK UNIFIED IDEOGRAPH + {0xE15E, 0x588B}, //9609 #CJK UNIFIED IDEOGRAPH + {0xE15F, 0x587A}, //9610 #CJK UNIFIED IDEOGRAPH + {0xE160, 0x5887}, //9611 #CJK UNIFIED IDEOGRAPH + {0xE161, 0x5891}, //9612 #CJK UNIFIED IDEOGRAPH + {0xE162, 0x588E}, //9613 #CJK UNIFIED IDEOGRAPH + {0xE163, 0x5876}, //9614 #CJK UNIFIED IDEOGRAPH + {0xE164, 0x5882}, //9615 #CJK UNIFIED IDEOGRAPH + {0xE165, 0x5888}, //9616 #CJK UNIFIED IDEOGRAPH + {0xE166, 0x587B}, //9617 #CJK UNIFIED IDEOGRAPH + {0xE167, 0x5894}, //9618 #CJK UNIFIED IDEOGRAPH + {0xE168, 0x588F}, //9619 #CJK UNIFIED IDEOGRAPH + {0xE169, 0x58FE}, //9620 #CJK UNIFIED IDEOGRAPH + {0xE16A, 0x596B}, //9621 #CJK UNIFIED IDEOGRAPH + {0xE16B, 0x5ADC}, //9622 #CJK UNIFIED IDEOGRAPH + {0xE16C, 0x5AEE}, //9623 #CJK UNIFIED IDEOGRAPH + {0xE16D, 0x5AE5}, //9624 #CJK UNIFIED IDEOGRAPH + {0xE16E, 0x5AD5}, //9625 #CJK UNIFIED IDEOGRAPH + {0xE16F, 0x5AEA}, //9626 #CJK UNIFIED IDEOGRAPH + {0xE170, 0x5ADA}, //9627 #CJK UNIFIED IDEOGRAPH + {0xE171, 0x5AED}, //9628 #CJK UNIFIED IDEOGRAPH + {0xE172, 0x5AEB}, //9629 #CJK UNIFIED IDEOGRAPH + {0xE173, 0x5AF3}, //9630 #CJK UNIFIED IDEOGRAPH + {0xE174, 0x5AE2}, //9631 #CJK UNIFIED IDEOGRAPH + {0xE175, 0x5AE0}, //9632 #CJK UNIFIED IDEOGRAPH + {0xE176, 0x5ADB}, //9633 #CJK UNIFIED IDEOGRAPH + {0xE177, 0x5AEC}, //9634 #CJK UNIFIED IDEOGRAPH + {0xE178, 0x5ADE}, //9635 #CJK UNIFIED IDEOGRAPH + {0xE179, 0x5ADD}, //9636 #CJK UNIFIED IDEOGRAPH + {0xE17A, 0x5AD9}, //9637 #CJK UNIFIED IDEOGRAPH + {0xE17B, 0x5AE8}, //9638 #CJK UNIFIED IDEOGRAPH + {0xE17C, 0x5ADF}, //9639 #CJK UNIFIED IDEOGRAPH + {0xE17D, 0x5B77}, //9640 #CJK UNIFIED IDEOGRAPH + {0xE17E, 0x5BE0}, //9641 #CJK UNIFIED IDEOGRAPH + {0xE1A1, 0x5BE3}, //9642 #CJK UNIFIED IDEOGRAPH + {0xE1A2, 0x5C63}, //9643 #CJK UNIFIED IDEOGRAPH + {0xE1A3, 0x5D82}, //9644 #CJK UNIFIED IDEOGRAPH + {0xE1A4, 0x5D80}, //9645 #CJK UNIFIED IDEOGRAPH + {0xE1A5, 0x5D7D}, //9646 #CJK UNIFIED IDEOGRAPH + {0xE1A6, 0x5D86}, //9647 #CJK UNIFIED IDEOGRAPH + {0xE1A7, 0x5D7A}, //9648 #CJK UNIFIED IDEOGRAPH + {0xE1A8, 0x5D81}, //9649 #CJK UNIFIED IDEOGRAPH + {0xE1A9, 0x5D77}, //9650 #CJK UNIFIED IDEOGRAPH + {0xE1AA, 0x5D8A}, //9651 #CJK UNIFIED IDEOGRAPH + {0xE1AB, 0x5D89}, //9652 #CJK UNIFIED IDEOGRAPH + {0xE1AC, 0x5D88}, //9653 #CJK UNIFIED IDEOGRAPH + {0xE1AD, 0x5D7E}, //9654 #CJK UNIFIED IDEOGRAPH + {0xE1AE, 0x5D7C}, //9655 #CJK UNIFIED IDEOGRAPH + {0xE1AF, 0x5D8D}, //9656 #CJK UNIFIED IDEOGRAPH + {0xE1B0, 0x5D79}, //9657 #CJK UNIFIED IDEOGRAPH + {0xE1B1, 0x5D7F}, //9658 #CJK UNIFIED IDEOGRAPH + {0xE1B2, 0x5E58}, //9659 #CJK UNIFIED IDEOGRAPH + {0xE1B3, 0x5E59}, //9660 #CJK UNIFIED IDEOGRAPH + {0xE1B4, 0x5E53}, //9661 #CJK UNIFIED IDEOGRAPH + {0xE1B5, 0x5ED8}, //9662 #CJK UNIFIED IDEOGRAPH + {0xE1B6, 0x5ED1}, //9663 #CJK UNIFIED IDEOGRAPH + {0xE1B7, 0x5ED7}, //9664 #CJK UNIFIED IDEOGRAPH + {0xE1B8, 0x5ECE}, //9665 #CJK UNIFIED IDEOGRAPH + {0xE1B9, 0x5EDC}, //9666 #CJK UNIFIED IDEOGRAPH + {0xE1BA, 0x5ED5}, //9667 #CJK UNIFIED IDEOGRAPH + {0xE1BB, 0x5ED9}, //9668 #CJK UNIFIED IDEOGRAPH + {0xE1BC, 0x5ED2}, //9669 #CJK UNIFIED IDEOGRAPH + {0xE1BD, 0x5ED4}, //9670 #CJK UNIFIED IDEOGRAPH + {0xE1BE, 0x5F44}, //9671 #CJK UNIFIED IDEOGRAPH + {0xE1BF, 0x5F43}, //9672 #CJK UNIFIED IDEOGRAPH + {0xE1C0, 0x5F6F}, //9673 #CJK UNIFIED IDEOGRAPH + {0xE1C1, 0x5FB6}, //9674 #CJK UNIFIED IDEOGRAPH + {0xE1C2, 0x612C}, //9675 #CJK UNIFIED IDEOGRAPH + {0xE1C3, 0x6128}, //9676 #CJK UNIFIED IDEOGRAPH + {0xE1C4, 0x6141}, //9677 #CJK UNIFIED IDEOGRAPH + {0xE1C5, 0x615E}, //9678 #CJK UNIFIED IDEOGRAPH + {0xE1C6, 0x6171}, //9679 #CJK UNIFIED IDEOGRAPH + {0xE1C7, 0x6173}, //9680 #CJK UNIFIED IDEOGRAPH + {0xE1C8, 0x6152}, //9681 #CJK UNIFIED IDEOGRAPH + {0xE1C9, 0x6153}, //9682 #CJK UNIFIED IDEOGRAPH + {0xE1CA, 0x6172}, //9683 #CJK UNIFIED IDEOGRAPH + {0xE1CB, 0x616C}, //9684 #CJK UNIFIED IDEOGRAPH + {0xE1CC, 0x6180}, //9685 #CJK UNIFIED IDEOGRAPH + {0xE1CD, 0x6174}, //9686 #CJK UNIFIED IDEOGRAPH + {0xE1CE, 0x6154}, //9687 #CJK UNIFIED IDEOGRAPH + {0xE1CF, 0x617A}, //9688 #CJK UNIFIED IDEOGRAPH + {0xE1D0, 0x615B}, //9689 #CJK UNIFIED IDEOGRAPH + {0xE1D1, 0x6165}, //9690 #CJK UNIFIED IDEOGRAPH + {0xE1D2, 0x613B}, //9691 #CJK UNIFIED IDEOGRAPH + {0xE1D3, 0x616A}, //9692 #CJK UNIFIED IDEOGRAPH + {0xE1D4, 0x6161}, //9693 #CJK UNIFIED IDEOGRAPH + {0xE1D5, 0x6156}, //9694 #CJK UNIFIED IDEOGRAPH + {0xE1D6, 0x6229}, //9695 #CJK UNIFIED IDEOGRAPH + {0xE1D7, 0x6227}, //9696 #CJK UNIFIED IDEOGRAPH + {0xE1D8, 0x622B}, //9697 #CJK UNIFIED IDEOGRAPH + {0xE1D9, 0x642B}, //9698 #CJK UNIFIED IDEOGRAPH + {0xE1DA, 0x644D}, //9699 #CJK UNIFIED IDEOGRAPH + {0xE1DB, 0x645B}, //9700 #CJK UNIFIED IDEOGRAPH + {0xE1DC, 0x645D}, //9701 #CJK UNIFIED IDEOGRAPH + {0xE1DD, 0x6474}, //9702 #CJK UNIFIED IDEOGRAPH + {0xE1DE, 0x6476}, //9703 #CJK UNIFIED IDEOGRAPH + {0xE1DF, 0x6472}, //9704 #CJK UNIFIED IDEOGRAPH + {0xE1E0, 0x6473}, //9705 #CJK UNIFIED IDEOGRAPH + {0xE1E1, 0x647D}, //9706 #CJK UNIFIED IDEOGRAPH + {0xE1E2, 0x6475}, //9707 #CJK UNIFIED IDEOGRAPH + {0xE1E3, 0x6466}, //9708 #CJK UNIFIED IDEOGRAPH + {0xE1E4, 0x64A6}, //9709 #CJK UNIFIED IDEOGRAPH + {0xE1E5, 0x644E}, //9710 #CJK UNIFIED IDEOGRAPH + {0xE1E6, 0x6482}, //9711 #CJK UNIFIED IDEOGRAPH + {0xE1E7, 0x645E}, //9712 #CJK UNIFIED IDEOGRAPH + {0xE1E8, 0x645C}, //9713 #CJK UNIFIED IDEOGRAPH + {0xE1E9, 0x644B}, //9714 #CJK UNIFIED IDEOGRAPH + {0xE1EA, 0x6453}, //9715 #CJK UNIFIED IDEOGRAPH + {0xE1EB, 0x6460}, //9716 #CJK UNIFIED IDEOGRAPH + {0xE1EC, 0x6450}, //9717 #CJK UNIFIED IDEOGRAPH + {0xE1ED, 0x647F}, //9718 #CJK UNIFIED IDEOGRAPH + {0xE1EE, 0x643F}, //9719 #CJK UNIFIED IDEOGRAPH + {0xE1EF, 0x646C}, //9720 #CJK UNIFIED IDEOGRAPH + {0xE1F0, 0x646B}, //9721 #CJK UNIFIED IDEOGRAPH + {0xE1F1, 0x6459}, //9722 #CJK UNIFIED IDEOGRAPH + {0xE1F2, 0x6465}, //9723 #CJK UNIFIED IDEOGRAPH + {0xE1F3, 0x6477}, //9724 #CJK UNIFIED IDEOGRAPH + {0xE1F4, 0x6573}, //9725 #CJK UNIFIED IDEOGRAPH + {0xE1F5, 0x65A0}, //9726 #CJK UNIFIED IDEOGRAPH + {0xE1F6, 0x66A1}, //9727 #CJK UNIFIED IDEOGRAPH + {0xE1F7, 0x66A0}, //9728 #CJK UNIFIED IDEOGRAPH + {0xE1F8, 0x669F}, //9729 #CJK UNIFIED IDEOGRAPH + {0xE1F9, 0x6705}, //9730 #CJK UNIFIED IDEOGRAPH + {0xE1FA, 0x6704}, //9731 #CJK UNIFIED IDEOGRAPH + {0xE1FB, 0x6722}, //9732 #CJK UNIFIED IDEOGRAPH + {0xE1FC, 0x69B1}, //9733 #CJK UNIFIED IDEOGRAPH + {0xE1FD, 0x69B6}, //9734 #CJK UNIFIED IDEOGRAPH + {0xE1FE, 0x69C9}, //9735 #CJK UNIFIED IDEOGRAPH + {0xE240, 0x69A0}, //9736 #CJK UNIFIED IDEOGRAPH + {0xE241, 0x69CE}, //9737 #CJK UNIFIED IDEOGRAPH + {0xE242, 0x6996}, //9738 #CJK UNIFIED IDEOGRAPH + {0xE243, 0x69B0}, //9739 #CJK UNIFIED IDEOGRAPH + {0xE244, 0x69AC}, //9740 #CJK UNIFIED IDEOGRAPH + {0xE245, 0x69BC}, //9741 #CJK UNIFIED IDEOGRAPH + {0xE246, 0x6991}, //9742 #CJK UNIFIED IDEOGRAPH + {0xE247, 0x6999}, //9743 #CJK UNIFIED IDEOGRAPH + {0xE248, 0x698E}, //9744 #CJK UNIFIED IDEOGRAPH + {0xE249, 0x69A7}, //9745 #CJK UNIFIED IDEOGRAPH + {0xE24A, 0x698D}, //9746 #CJK UNIFIED IDEOGRAPH + {0xE24B, 0x69A9}, //9747 #CJK UNIFIED IDEOGRAPH + {0xE24C, 0x69BE}, //9748 #CJK UNIFIED IDEOGRAPH + {0xE24D, 0x69AF}, //9749 #CJK UNIFIED IDEOGRAPH + {0xE24E, 0x69BF}, //9750 #CJK UNIFIED IDEOGRAPH + {0xE24F, 0x69C4}, //9751 #CJK UNIFIED IDEOGRAPH + {0xE250, 0x69BD}, //9752 #CJK UNIFIED IDEOGRAPH + {0xE251, 0x69A4}, //9753 #CJK UNIFIED IDEOGRAPH + {0xE252, 0x69D4}, //9754 #CJK UNIFIED IDEOGRAPH + {0xE253, 0x69B9}, //9755 #CJK UNIFIED IDEOGRAPH + {0xE254, 0x69CA}, //9756 #CJK UNIFIED IDEOGRAPH + {0xE255, 0x699A}, //9757 #CJK UNIFIED IDEOGRAPH + {0xE256, 0x69CF}, //9758 #CJK UNIFIED IDEOGRAPH + {0xE257, 0x69B3}, //9759 #CJK UNIFIED IDEOGRAPH + {0xE258, 0x6993}, //9760 #CJK UNIFIED IDEOGRAPH + {0xE259, 0x69AA}, //9761 #CJK UNIFIED IDEOGRAPH + {0xE25A, 0x69A1}, //9762 #CJK UNIFIED IDEOGRAPH + {0xE25B, 0x699E}, //9763 #CJK UNIFIED IDEOGRAPH + {0xE25C, 0x69D9}, //9764 #CJK UNIFIED IDEOGRAPH + {0xE25D, 0x6997}, //9765 #CJK UNIFIED IDEOGRAPH + {0xE25E, 0x6990}, //9766 #CJK UNIFIED IDEOGRAPH + {0xE25F, 0x69C2}, //9767 #CJK UNIFIED IDEOGRAPH + {0xE260, 0x69B5}, //9768 #CJK UNIFIED IDEOGRAPH + {0xE261, 0x69A5}, //9769 #CJK UNIFIED IDEOGRAPH + {0xE262, 0x69C6}, //9770 #CJK UNIFIED IDEOGRAPH + {0xE263, 0x6B4A}, //9771 #CJK UNIFIED IDEOGRAPH + {0xE264, 0x6B4D}, //9772 #CJK UNIFIED IDEOGRAPH + {0xE265, 0x6B4B}, //9773 #CJK UNIFIED IDEOGRAPH + {0xE266, 0x6B9E}, //9774 #CJK UNIFIED IDEOGRAPH + {0xE267, 0x6B9F}, //9775 #CJK UNIFIED IDEOGRAPH + {0xE268, 0x6BA0}, //9776 #CJK UNIFIED IDEOGRAPH + {0xE269, 0x6BC3}, //9777 #CJK UNIFIED IDEOGRAPH + {0xE26A, 0x6BC4}, //9778 #CJK UNIFIED IDEOGRAPH + {0xE26B, 0x6BFE}, //9779 #CJK UNIFIED IDEOGRAPH + {0xE26C, 0x6ECE}, //9780 #CJK UNIFIED IDEOGRAPH + {0xE26D, 0x6EF5}, //9781 #CJK UNIFIED IDEOGRAPH + {0xE26E, 0x6EF1}, //9782 #CJK UNIFIED IDEOGRAPH + {0xE26F, 0x6F03}, //9783 #CJK UNIFIED IDEOGRAPH + {0xE270, 0x6F25}, //9784 #CJK UNIFIED IDEOGRAPH + {0xE271, 0x6EF8}, //9785 #CJK UNIFIED IDEOGRAPH + {0xE272, 0x6F37}, //9786 #CJK UNIFIED IDEOGRAPH + {0xE273, 0x6EFB}, //9787 #CJK UNIFIED IDEOGRAPH + {0xE274, 0x6F2E}, //9788 #CJK UNIFIED IDEOGRAPH + {0xE275, 0x6F09}, //9789 #CJK UNIFIED IDEOGRAPH + {0xE276, 0x6F4E}, //9790 #CJK UNIFIED IDEOGRAPH + {0xE277, 0x6F19}, //9791 #CJK UNIFIED IDEOGRAPH + {0xE278, 0x6F1A}, //9792 #CJK UNIFIED IDEOGRAPH + {0xE279, 0x6F27}, //9793 #CJK UNIFIED IDEOGRAPH + {0xE27A, 0x6F18}, //9794 #CJK UNIFIED IDEOGRAPH + {0xE27B, 0x6F3B}, //9795 #CJK UNIFIED IDEOGRAPH + {0xE27C, 0x6F12}, //9796 #CJK UNIFIED IDEOGRAPH + {0xE27D, 0x6EED}, //9797 #CJK UNIFIED IDEOGRAPH + {0xE27E, 0x6F0A}, //9798 #CJK UNIFIED IDEOGRAPH + {0xE2A1, 0x6F36}, //9799 #CJK UNIFIED IDEOGRAPH + {0xE2A2, 0x6F73}, //9800 #CJK UNIFIED IDEOGRAPH + {0xE2A3, 0x6EF9}, //9801 #CJK UNIFIED IDEOGRAPH + {0xE2A4, 0x6EEE}, //9802 #CJK UNIFIED IDEOGRAPH + {0xE2A5, 0x6F2D}, //9803 #CJK UNIFIED IDEOGRAPH + {0xE2A6, 0x6F40}, //9804 #CJK UNIFIED IDEOGRAPH + {0xE2A7, 0x6F30}, //9805 #CJK UNIFIED IDEOGRAPH + {0xE2A8, 0x6F3C}, //9806 #CJK UNIFIED IDEOGRAPH + {0xE2A9, 0x6F35}, //9807 #CJK UNIFIED IDEOGRAPH + {0xE2AA, 0x6EEB}, //9808 #CJK UNIFIED IDEOGRAPH + {0xE2AB, 0x6F07}, //9809 #CJK UNIFIED IDEOGRAPH + {0xE2AC, 0x6F0E}, //9810 #CJK UNIFIED IDEOGRAPH + {0xE2AD, 0x6F43}, //9811 #CJK UNIFIED IDEOGRAPH + {0xE2AE, 0x6F05}, //9812 #CJK UNIFIED IDEOGRAPH + {0xE2AF, 0x6EFD}, //9813 #CJK UNIFIED IDEOGRAPH + {0xE2B0, 0x6EF6}, //9814 #CJK UNIFIED IDEOGRAPH + {0xE2B1, 0x6F39}, //9815 #CJK UNIFIED IDEOGRAPH + {0xE2B2, 0x6F1C}, //9816 #CJK UNIFIED IDEOGRAPH + {0xE2B3, 0x6EFC}, //9817 #CJK UNIFIED IDEOGRAPH + {0xE2B4, 0x6F3A}, //9818 #CJK UNIFIED IDEOGRAPH + {0xE2B5, 0x6F1F}, //9819 #CJK UNIFIED IDEOGRAPH + {0xE2B6, 0x6F0D}, //9820 #CJK UNIFIED IDEOGRAPH + {0xE2B7, 0x6F1E}, //9821 #CJK UNIFIED IDEOGRAPH + {0xE2B8, 0x6F08}, //9822 #CJK UNIFIED IDEOGRAPH + {0xE2B9, 0x6F21}, //9823 #CJK UNIFIED IDEOGRAPH + {0xE2BA, 0x7187}, //9824 #CJK UNIFIED IDEOGRAPH + {0xE2BB, 0x7190}, //9825 #CJK UNIFIED IDEOGRAPH + {0xE2BC, 0x7189}, //9826 #CJK UNIFIED IDEOGRAPH + {0xE2BD, 0x7180}, //9827 #CJK UNIFIED IDEOGRAPH + {0xE2BE, 0x7185}, //9828 #CJK UNIFIED IDEOGRAPH + {0xE2BF, 0x7182}, //9829 #CJK UNIFIED IDEOGRAPH + {0xE2C0, 0x718F}, //9830 #CJK UNIFIED IDEOGRAPH + {0xE2C1, 0x717B}, //9831 #CJK UNIFIED IDEOGRAPH + {0xE2C2, 0x7186}, //9832 #CJK UNIFIED IDEOGRAPH + {0xE2C3, 0x7181}, //9833 #CJK UNIFIED IDEOGRAPH + {0xE2C4, 0x7197}, //9834 #CJK UNIFIED IDEOGRAPH + {0xE2C5, 0x7244}, //9835 #CJK UNIFIED IDEOGRAPH + {0xE2C6, 0x7253}, //9836 #CJK UNIFIED IDEOGRAPH + {0xE2C7, 0x7297}, //9837 #CJK UNIFIED IDEOGRAPH + {0xE2C8, 0x7295}, //9838 #CJK UNIFIED IDEOGRAPH + {0xE2C9, 0x7293}, //9839 #CJK UNIFIED IDEOGRAPH + {0xE2CA, 0x7343}, //9840 #CJK UNIFIED IDEOGRAPH + {0xE2CB, 0x734D}, //9841 #CJK UNIFIED IDEOGRAPH + {0xE2CC, 0x7351}, //9842 #CJK UNIFIED IDEOGRAPH + {0xE2CD, 0x734C}, //9843 #CJK UNIFIED IDEOGRAPH + {0xE2CE, 0x7462}, //9844 #CJK UNIFIED IDEOGRAPH + {0xE2CF, 0x7473}, //9845 #CJK UNIFIED IDEOGRAPH + {0xE2D0, 0x7471}, //9846 #CJK UNIFIED IDEOGRAPH + {0xE2D1, 0x7475}, //9847 #CJK UNIFIED IDEOGRAPH + {0xE2D2, 0x7472}, //9848 #CJK UNIFIED IDEOGRAPH + {0xE2D3, 0x7467}, //9849 #CJK UNIFIED IDEOGRAPH + {0xE2D4, 0x746E}, //9850 #CJK UNIFIED IDEOGRAPH + {0xE2D5, 0x7500}, //9851 #CJK UNIFIED IDEOGRAPH + {0xE2D6, 0x7502}, //9852 #CJK UNIFIED IDEOGRAPH + {0xE2D7, 0x7503}, //9853 #CJK UNIFIED IDEOGRAPH + {0xE2D8, 0x757D}, //9854 #CJK UNIFIED IDEOGRAPH + {0xE2D9, 0x7590}, //9855 #CJK UNIFIED IDEOGRAPH + {0xE2DA, 0x7616}, //9856 #CJK UNIFIED IDEOGRAPH + {0xE2DB, 0x7608}, //9857 #CJK UNIFIED IDEOGRAPH + {0xE2DC, 0x760C}, //9858 #CJK UNIFIED IDEOGRAPH + {0xE2DD, 0x7615}, //9859 #CJK UNIFIED IDEOGRAPH + {0xE2DE, 0x7611}, //9860 #CJK UNIFIED IDEOGRAPH + {0xE2DF, 0x760A}, //9861 #CJK UNIFIED IDEOGRAPH + {0xE2E0, 0x7614}, //9862 #CJK UNIFIED IDEOGRAPH + {0xE2E1, 0x76B8}, //9863 #CJK UNIFIED IDEOGRAPH + {0xE2E2, 0x7781}, //9864 #CJK UNIFIED IDEOGRAPH + {0xE2E3, 0x777C}, //9865 #CJK UNIFIED IDEOGRAPH + {0xE2E4, 0x7785}, //9866 #CJK UNIFIED IDEOGRAPH + {0xE2E5, 0x7782}, //9867 #CJK UNIFIED IDEOGRAPH + {0xE2E6, 0x776E}, //9868 #CJK UNIFIED IDEOGRAPH + {0xE2E7, 0x7780}, //9869 #CJK UNIFIED IDEOGRAPH + {0xE2E8, 0x776F}, //9870 #CJK UNIFIED IDEOGRAPH + {0xE2E9, 0x777E}, //9871 #CJK UNIFIED IDEOGRAPH + {0xE2EA, 0x7783}, //9872 #CJK UNIFIED IDEOGRAPH + {0xE2EB, 0x78B2}, //9873 #CJK UNIFIED IDEOGRAPH + {0xE2EC, 0x78AA}, //9874 #CJK UNIFIED IDEOGRAPH + {0xE2ED, 0x78B4}, //9875 #CJK UNIFIED IDEOGRAPH + {0xE2EE, 0x78AD}, //9876 #CJK UNIFIED IDEOGRAPH + {0xE2EF, 0x78A8}, //9877 #CJK UNIFIED IDEOGRAPH + {0xE2F0, 0x787E}, //9878 #CJK UNIFIED IDEOGRAPH + {0xE2F1, 0x78AB}, //9879 #CJK UNIFIED IDEOGRAPH + {0xE2F2, 0x789E}, //9880 #CJK UNIFIED IDEOGRAPH + {0xE2F3, 0x78A5}, //9881 #CJK UNIFIED IDEOGRAPH + {0xE2F4, 0x78A0}, //9882 #CJK UNIFIED IDEOGRAPH + {0xE2F5, 0x78AC}, //9883 #CJK UNIFIED IDEOGRAPH + {0xE2F6, 0x78A2}, //9884 #CJK UNIFIED IDEOGRAPH + {0xE2F7, 0x78A4}, //9885 #CJK UNIFIED IDEOGRAPH + {0xE2F8, 0x7998}, //9886 #CJK UNIFIED IDEOGRAPH + {0xE2F9, 0x798A}, //9887 #CJK UNIFIED IDEOGRAPH + {0xE2FA, 0x798B}, //9888 #CJK UNIFIED IDEOGRAPH + {0xE2FB, 0x7996}, //9889 #CJK UNIFIED IDEOGRAPH + {0xE2FC, 0x7995}, //9890 #CJK UNIFIED IDEOGRAPH + {0xE2FD, 0x7994}, //9891 #CJK UNIFIED IDEOGRAPH + {0xE2FE, 0x7993}, //9892 #CJK UNIFIED IDEOGRAPH + {0xE340, 0x7997}, //9893 #CJK UNIFIED IDEOGRAPH + {0xE341, 0x7988}, //9894 #CJK UNIFIED IDEOGRAPH + {0xE342, 0x7992}, //9895 #CJK UNIFIED IDEOGRAPH + {0xE343, 0x7990}, //9896 #CJK UNIFIED IDEOGRAPH + {0xE344, 0x7A2B}, //9897 #CJK UNIFIED IDEOGRAPH + {0xE345, 0x7A4A}, //9898 #CJK UNIFIED IDEOGRAPH + {0xE346, 0x7A30}, //9899 #CJK UNIFIED IDEOGRAPH + {0xE347, 0x7A2F}, //9900 #CJK UNIFIED IDEOGRAPH + {0xE348, 0x7A28}, //9901 #CJK UNIFIED IDEOGRAPH + {0xE349, 0x7A26}, //9902 #CJK UNIFIED IDEOGRAPH + {0xE34A, 0x7AA8}, //9903 #CJK UNIFIED IDEOGRAPH + {0xE34B, 0x7AAB}, //9904 #CJK UNIFIED IDEOGRAPH + {0xE34C, 0x7AAC}, //9905 #CJK UNIFIED IDEOGRAPH + {0xE34D, 0x7AEE}, //9906 #CJK UNIFIED IDEOGRAPH + {0xE34E, 0x7B88}, //9907 #CJK UNIFIED IDEOGRAPH + {0xE34F, 0x7B9C}, //9908 #CJK UNIFIED IDEOGRAPH + {0xE350, 0x7B8A}, //9909 #CJK UNIFIED IDEOGRAPH + {0xE351, 0x7B91}, //9910 #CJK UNIFIED IDEOGRAPH + {0xE352, 0x7B90}, //9911 #CJK UNIFIED IDEOGRAPH + {0xE353, 0x7B96}, //9912 #CJK UNIFIED IDEOGRAPH + {0xE354, 0x7B8D}, //9913 #CJK UNIFIED IDEOGRAPH + {0xE355, 0x7B8C}, //9914 #CJK UNIFIED IDEOGRAPH + {0xE356, 0x7B9B}, //9915 #CJK UNIFIED IDEOGRAPH + {0xE357, 0x7B8E}, //9916 #CJK UNIFIED IDEOGRAPH + {0xE358, 0x7B85}, //9917 #CJK UNIFIED IDEOGRAPH + {0xE359, 0x7B98}, //9918 #CJK UNIFIED IDEOGRAPH + {0xE35A, 0x5284}, //9919 #CJK UNIFIED IDEOGRAPH + {0xE35B, 0x7B99}, //9920 #CJK UNIFIED IDEOGRAPH + {0xE35C, 0x7BA4}, //9921 #CJK UNIFIED IDEOGRAPH + {0xE35D, 0x7B82}, //9922 #CJK UNIFIED IDEOGRAPH + {0xE35E, 0x7CBB}, //9923 #CJK UNIFIED IDEOGRAPH + {0xE35F, 0x7CBF}, //9924 #CJK UNIFIED IDEOGRAPH + {0xE360, 0x7CBC}, //9925 #CJK UNIFIED IDEOGRAPH + {0xE361, 0x7CBA}, //9926 #CJK UNIFIED IDEOGRAPH + {0xE362, 0x7DA7}, //9927 #CJK UNIFIED IDEOGRAPH + {0xE363, 0x7DB7}, //9928 #CJK UNIFIED IDEOGRAPH + {0xE364, 0x7DC2}, //9929 #CJK UNIFIED IDEOGRAPH + {0xE365, 0x7DA3}, //9930 #CJK UNIFIED IDEOGRAPH + {0xE366, 0x7DAA}, //9931 #CJK UNIFIED IDEOGRAPH + {0xE367, 0x7DC1}, //9932 #CJK UNIFIED IDEOGRAPH + {0xE368, 0x7DC0}, //9933 #CJK UNIFIED IDEOGRAPH + {0xE369, 0x7DC5}, //9934 #CJK UNIFIED IDEOGRAPH + {0xE36A, 0x7D9D}, //9935 #CJK UNIFIED IDEOGRAPH + {0xE36B, 0x7DCE}, //9936 #CJK UNIFIED IDEOGRAPH + {0xE36C, 0x7DC4}, //9937 #CJK UNIFIED IDEOGRAPH + {0xE36D, 0x7DC6}, //9938 #CJK UNIFIED IDEOGRAPH + {0xE36E, 0x7DCB}, //9939 #CJK UNIFIED IDEOGRAPH + {0xE36F, 0x7DCC}, //9940 #CJK UNIFIED IDEOGRAPH + {0xE370, 0x7DAF}, //9941 #CJK UNIFIED IDEOGRAPH + {0xE371, 0x7DB9}, //9942 #CJK UNIFIED IDEOGRAPH + {0xE372, 0x7D96}, //9943 #CJK UNIFIED IDEOGRAPH + {0xE373, 0x7DBC}, //9944 #CJK UNIFIED IDEOGRAPH + {0xE374, 0x7D9F}, //9945 #CJK UNIFIED IDEOGRAPH + {0xE375, 0x7DA6}, //9946 #CJK UNIFIED IDEOGRAPH + {0xE376, 0x7DAE}, //9947 #CJK UNIFIED IDEOGRAPH + {0xE377, 0x7DA9}, //9948 #CJK UNIFIED IDEOGRAPH + {0xE378, 0x7DA1}, //9949 #CJK UNIFIED IDEOGRAPH + {0xE379, 0x7DC9}, //9950 #CJK UNIFIED IDEOGRAPH + {0xE37A, 0x7F73}, //9951 #CJK UNIFIED IDEOGRAPH + {0xE37B, 0x7FE2}, //9952 #CJK UNIFIED IDEOGRAPH + {0xE37C, 0x7FE3}, //9953 #CJK UNIFIED IDEOGRAPH + {0xE37D, 0x7FE5}, //9954 #CJK UNIFIED IDEOGRAPH + {0xE37E, 0x7FDE}, //9955 #CJK UNIFIED IDEOGRAPH + {0xE3A1, 0x8024}, //9956 #CJK UNIFIED IDEOGRAPH + {0xE3A2, 0x805D}, //9957 #CJK UNIFIED IDEOGRAPH + {0xE3A3, 0x805C}, //9958 #CJK UNIFIED IDEOGRAPH + {0xE3A4, 0x8189}, //9959 #CJK UNIFIED IDEOGRAPH + {0xE3A5, 0x8186}, //9960 #CJK UNIFIED IDEOGRAPH + {0xE3A6, 0x8183}, //9961 #CJK UNIFIED IDEOGRAPH + {0xE3A7, 0x8187}, //9962 #CJK UNIFIED IDEOGRAPH + {0xE3A8, 0x818D}, //9963 #CJK UNIFIED IDEOGRAPH + {0xE3A9, 0x818C}, //9964 #CJK UNIFIED IDEOGRAPH + {0xE3AA, 0x818B}, //9965 #CJK UNIFIED IDEOGRAPH + {0xE3AB, 0x8215}, //9966 #CJK UNIFIED IDEOGRAPH + {0xE3AC, 0x8497}, //9967 #CJK UNIFIED IDEOGRAPH + {0xE3AD, 0x84A4}, //9968 #CJK UNIFIED IDEOGRAPH + {0xE3AE, 0x84A1}, //9969 #CJK UNIFIED IDEOGRAPH + {0xE3AF, 0x849F}, //9970 #CJK UNIFIED IDEOGRAPH + {0xE3B0, 0x84BA}, //9971 #CJK UNIFIED IDEOGRAPH + {0xE3B1, 0x84CE}, //9972 #CJK UNIFIED IDEOGRAPH + {0xE3B2, 0x84C2}, //9973 #CJK UNIFIED IDEOGRAPH + {0xE3B3, 0x84AC}, //9974 #CJK UNIFIED IDEOGRAPH + {0xE3B4, 0x84AE}, //9975 #CJK UNIFIED IDEOGRAPH + {0xE3B5, 0x84AB}, //9976 #CJK UNIFIED IDEOGRAPH + {0xE3B6, 0x84B9}, //9977 #CJK UNIFIED IDEOGRAPH + {0xE3B7, 0x84B4}, //9978 #CJK UNIFIED IDEOGRAPH + {0xE3B8, 0x84C1}, //9979 #CJK UNIFIED IDEOGRAPH + {0xE3B9, 0x84CD}, //9980 #CJK UNIFIED IDEOGRAPH + {0xE3BA, 0x84AA}, //9981 #CJK UNIFIED IDEOGRAPH + {0xE3BB, 0x849A}, //9982 #CJK UNIFIED IDEOGRAPH + {0xE3BC, 0x84B1}, //9983 #CJK UNIFIED IDEOGRAPH + {0xE3BD, 0x84D0}, //9984 #CJK UNIFIED IDEOGRAPH + {0xE3BE, 0x849D}, //9985 #CJK UNIFIED IDEOGRAPH + {0xE3BF, 0x84A7}, //9986 #CJK UNIFIED IDEOGRAPH + {0xE3C0, 0x84BB}, //9987 #CJK UNIFIED IDEOGRAPH + {0xE3C1, 0x84A2}, //9988 #CJK UNIFIED IDEOGRAPH + {0xE3C2, 0x8494}, //9989 #CJK UNIFIED IDEOGRAPH + {0xE3C3, 0x84C7}, //9990 #CJK UNIFIED IDEOGRAPH + {0xE3C4, 0x84CC}, //9991 #CJK UNIFIED IDEOGRAPH + {0xE3C5, 0x849B}, //9992 #CJK UNIFIED IDEOGRAPH + {0xE3C6, 0x84A9}, //9993 #CJK UNIFIED IDEOGRAPH + {0xE3C7, 0x84AF}, //9994 #CJK UNIFIED IDEOGRAPH + {0xE3C8, 0x84A8}, //9995 #CJK UNIFIED IDEOGRAPH + {0xE3C9, 0x84D6}, //9996 #CJK UNIFIED IDEOGRAPH + {0xE3CA, 0x8498}, //9997 #CJK UNIFIED IDEOGRAPH + {0xE3CB, 0x84B6}, //9998 #CJK UNIFIED IDEOGRAPH + {0xE3CC, 0x84CF}, //9999 #CJK UNIFIED IDEOGRAPH + {0xE3CD, 0x84A0}, //10000 #CJK UNIFIED IDEOGRAPH + {0xE3CE, 0x84D7}, //10001 #CJK UNIFIED IDEOGRAPH + {0xE3CF, 0x84D4}, //10002 #CJK UNIFIED IDEOGRAPH + {0xE3D0, 0x84D2}, //10003 #CJK UNIFIED IDEOGRAPH + {0xE3D1, 0x84DB}, //10004 #CJK UNIFIED IDEOGRAPH + {0xE3D2, 0x84B0}, //10005 #CJK UNIFIED IDEOGRAPH + {0xE3D3, 0x8491}, //10006 #CJK UNIFIED IDEOGRAPH + {0xE3D4, 0x8661}, //10007 #CJK UNIFIED IDEOGRAPH + {0xE3D5, 0x8733}, //10008 #CJK UNIFIED IDEOGRAPH + {0xE3D6, 0x8723}, //10009 #CJK UNIFIED IDEOGRAPH + {0xE3D7, 0x8728}, //10010 #CJK UNIFIED IDEOGRAPH + {0xE3D8, 0x876B}, //10011 #CJK UNIFIED IDEOGRAPH + {0xE3D9, 0x8740}, //10012 #CJK UNIFIED IDEOGRAPH + {0xE3DA, 0x872E}, //10013 #CJK UNIFIED IDEOGRAPH + {0xE3DB, 0x871E}, //10014 #CJK UNIFIED IDEOGRAPH + {0xE3DC, 0x8721}, //10015 #CJK UNIFIED IDEOGRAPH + {0xE3DD, 0x8719}, //10016 #CJK UNIFIED IDEOGRAPH + {0xE3DE, 0x871B}, //10017 #CJK UNIFIED IDEOGRAPH + {0xE3DF, 0x8743}, //10018 #CJK UNIFIED IDEOGRAPH + {0xE3E0, 0x872C}, //10019 #CJK UNIFIED IDEOGRAPH + {0xE3E1, 0x8741}, //10020 #CJK UNIFIED IDEOGRAPH + {0xE3E2, 0x873E}, //10021 #CJK UNIFIED IDEOGRAPH + {0xE3E3, 0x8746}, //10022 #CJK UNIFIED IDEOGRAPH + {0xE3E4, 0x8720}, //10023 #CJK UNIFIED IDEOGRAPH + {0xE3E5, 0x8732}, //10024 #CJK UNIFIED IDEOGRAPH + {0xE3E6, 0x872A}, //10025 #CJK UNIFIED IDEOGRAPH + {0xE3E7, 0x872D}, //10026 #CJK UNIFIED IDEOGRAPH + {0xE3E8, 0x873C}, //10027 #CJK UNIFIED IDEOGRAPH + {0xE3E9, 0x8712}, //10028 #CJK UNIFIED IDEOGRAPH + {0xE3EA, 0x873A}, //10029 #CJK UNIFIED IDEOGRAPH + {0xE3EB, 0x8731}, //10030 #CJK UNIFIED IDEOGRAPH + {0xE3EC, 0x8735}, //10031 #CJK UNIFIED IDEOGRAPH + {0xE3ED, 0x8742}, //10032 #CJK UNIFIED IDEOGRAPH + {0xE3EE, 0x8726}, //10033 #CJK UNIFIED IDEOGRAPH + {0xE3EF, 0x8727}, //10034 #CJK UNIFIED IDEOGRAPH + {0xE3F0, 0x8738}, //10035 #CJK UNIFIED IDEOGRAPH + {0xE3F1, 0x8724}, //10036 #CJK UNIFIED IDEOGRAPH + {0xE3F2, 0x871A}, //10037 #CJK UNIFIED IDEOGRAPH + {0xE3F3, 0x8730}, //10038 #CJK UNIFIED IDEOGRAPH + {0xE3F4, 0x8711}, //10039 #CJK UNIFIED IDEOGRAPH + {0xE3F5, 0x88F7}, //10040 #CJK UNIFIED IDEOGRAPH + {0xE3F6, 0x88E7}, //10041 #CJK UNIFIED IDEOGRAPH + {0xE3F7, 0x88F1}, //10042 #CJK UNIFIED IDEOGRAPH + {0xE3F8, 0x88F2}, //10043 #CJK UNIFIED IDEOGRAPH + {0xE3F9, 0x88FA}, //10044 #CJK UNIFIED IDEOGRAPH + {0xE3FA, 0x88FE}, //10045 #CJK UNIFIED IDEOGRAPH + {0xE3FB, 0x88EE}, //10046 #CJK UNIFIED IDEOGRAPH + {0xE3FC, 0x88FC}, //10047 #CJK UNIFIED IDEOGRAPH + {0xE3FD, 0x88F6}, //10048 #CJK UNIFIED IDEOGRAPH + {0xE3FE, 0x88FB}, //10049 #CJK UNIFIED IDEOGRAPH + {0xE440, 0x88F0}, //10050 #CJK UNIFIED IDEOGRAPH + {0xE441, 0x88EC}, //10051 #CJK UNIFIED IDEOGRAPH + {0xE442, 0x88EB}, //10052 #CJK UNIFIED IDEOGRAPH + {0xE443, 0x899D}, //10053 #CJK UNIFIED IDEOGRAPH + {0xE444, 0x89A1}, //10054 #CJK UNIFIED IDEOGRAPH + {0xE445, 0x899F}, //10055 #CJK UNIFIED IDEOGRAPH + {0xE446, 0x899E}, //10056 #CJK UNIFIED IDEOGRAPH + {0xE447, 0x89E9}, //10057 #CJK UNIFIED IDEOGRAPH + {0xE448, 0x89EB}, //10058 #CJK UNIFIED IDEOGRAPH + {0xE449, 0x89E8}, //10059 #CJK UNIFIED IDEOGRAPH + {0xE44A, 0x8AAB}, //10060 #CJK UNIFIED IDEOGRAPH + {0xE44B, 0x8A99}, //10061 #CJK UNIFIED IDEOGRAPH + {0xE44C, 0x8A8B}, //10062 #CJK UNIFIED IDEOGRAPH + {0xE44D, 0x8A92}, //10063 #CJK UNIFIED IDEOGRAPH + {0xE44E, 0x8A8F}, //10064 #CJK UNIFIED IDEOGRAPH + {0xE44F, 0x8A96}, //10065 #CJK UNIFIED IDEOGRAPH + {0xE450, 0x8C3D}, //10066 #CJK UNIFIED IDEOGRAPH + {0xE451, 0x8C68}, //10067 #CJK UNIFIED IDEOGRAPH + {0xE452, 0x8C69}, //10068 #CJK UNIFIED IDEOGRAPH + {0xE453, 0x8CD5}, //10069 #CJK UNIFIED IDEOGRAPH + {0xE454, 0x8CCF}, //10070 #CJK UNIFIED IDEOGRAPH + {0xE455, 0x8CD7}, //10071 #CJK UNIFIED IDEOGRAPH + {0xE456, 0x8D96}, //10072 #CJK UNIFIED IDEOGRAPH + {0xE457, 0x8E09}, //10073 #CJK UNIFIED IDEOGRAPH + {0xE458, 0x8E02}, //10074 #CJK UNIFIED IDEOGRAPH + {0xE459, 0x8DFF}, //10075 #CJK UNIFIED IDEOGRAPH + {0xE45A, 0x8E0D}, //10076 #CJK UNIFIED IDEOGRAPH + {0xE45B, 0x8DFD}, //10077 #CJK UNIFIED IDEOGRAPH + {0xE45C, 0x8E0A}, //10078 #CJK UNIFIED IDEOGRAPH + {0xE45D, 0x8E03}, //10079 #CJK UNIFIED IDEOGRAPH + {0xE45E, 0x8E07}, //10080 #CJK UNIFIED IDEOGRAPH + {0xE45F, 0x8E06}, //10081 #CJK UNIFIED IDEOGRAPH + {0xE460, 0x8E05}, //10082 #CJK UNIFIED IDEOGRAPH + {0xE461, 0x8DFE}, //10083 #CJK UNIFIED IDEOGRAPH + {0xE462, 0x8E00}, //10084 #CJK UNIFIED IDEOGRAPH + {0xE463, 0x8E04}, //10085 #CJK UNIFIED IDEOGRAPH + {0xE464, 0x8F10}, //10086 #CJK UNIFIED IDEOGRAPH + {0xE465, 0x8F11}, //10087 #CJK UNIFIED IDEOGRAPH + {0xE466, 0x8F0E}, //10088 #CJK UNIFIED IDEOGRAPH + {0xE467, 0x8F0D}, //10089 #CJK UNIFIED IDEOGRAPH + {0xE468, 0x9123}, //10090 #CJK UNIFIED IDEOGRAPH + {0xE469, 0x911C}, //10091 #CJK UNIFIED IDEOGRAPH + {0xE46A, 0x9120}, //10092 #CJK UNIFIED IDEOGRAPH + {0xE46B, 0x9122}, //10093 #CJK UNIFIED IDEOGRAPH + {0xE46C, 0x911F}, //10094 #CJK UNIFIED IDEOGRAPH + {0xE46D, 0x911D}, //10095 #CJK UNIFIED IDEOGRAPH + {0xE46E, 0x911A}, //10096 #CJK UNIFIED IDEOGRAPH + {0xE46F, 0x9124}, //10097 #CJK UNIFIED IDEOGRAPH + {0xE470, 0x9121}, //10098 #CJK UNIFIED IDEOGRAPH + {0xE471, 0x911B}, //10099 #CJK UNIFIED IDEOGRAPH + {0xE472, 0x917A}, //10100 #CJK UNIFIED IDEOGRAPH + {0xE473, 0x9172}, //10101 #CJK UNIFIED IDEOGRAPH + {0xE474, 0x9179}, //10102 #CJK UNIFIED IDEOGRAPH + {0xE475, 0x9173}, //10103 #CJK UNIFIED IDEOGRAPH + {0xE476, 0x92A5}, //10104 #CJK UNIFIED IDEOGRAPH + {0xE477, 0x92A4}, //10105 #CJK UNIFIED IDEOGRAPH + {0xE478, 0x9276}, //10106 #CJK UNIFIED IDEOGRAPH + {0xE479, 0x929B}, //10107 #CJK UNIFIED IDEOGRAPH + {0xE47A, 0x927A}, //10108 #CJK UNIFIED IDEOGRAPH + {0xE47B, 0x92A0}, //10109 #CJK UNIFIED IDEOGRAPH + {0xE47C, 0x9294}, //10110 #CJK UNIFIED IDEOGRAPH + {0xE47D, 0x92AA}, //10111 #CJK UNIFIED IDEOGRAPH + {0xE47E, 0x928D}, //10112 #CJK UNIFIED IDEOGRAPH + {0xE4A1, 0x92A6}, //10113 #CJK UNIFIED IDEOGRAPH + {0xE4A2, 0x929A}, //10114 #CJK UNIFIED IDEOGRAPH + {0xE4A3, 0x92AB}, //10115 #CJK UNIFIED IDEOGRAPH + {0xE4A4, 0x9279}, //10116 #CJK UNIFIED IDEOGRAPH + {0xE4A5, 0x9297}, //10117 #CJK UNIFIED IDEOGRAPH + {0xE4A6, 0x927F}, //10118 #CJK UNIFIED IDEOGRAPH + {0xE4A7, 0x92A3}, //10119 #CJK UNIFIED IDEOGRAPH + {0xE4A8, 0x92EE}, //10120 #CJK UNIFIED IDEOGRAPH + {0xE4A9, 0x928E}, //10121 #CJK UNIFIED IDEOGRAPH + {0xE4AA, 0x9282}, //10122 #CJK UNIFIED IDEOGRAPH + {0xE4AB, 0x9295}, //10123 #CJK UNIFIED IDEOGRAPH + {0xE4AC, 0x92A2}, //10124 #CJK UNIFIED IDEOGRAPH + {0xE4AD, 0x927D}, //10125 #CJK UNIFIED IDEOGRAPH + {0xE4AE, 0x9288}, //10126 #CJK UNIFIED IDEOGRAPH + {0xE4AF, 0x92A1}, //10127 #CJK UNIFIED IDEOGRAPH + {0xE4B0, 0x928A}, //10128 #CJK UNIFIED IDEOGRAPH + {0xE4B1, 0x9286}, //10129 #CJK UNIFIED IDEOGRAPH + {0xE4B2, 0x928C}, //10130 #CJK UNIFIED IDEOGRAPH + {0xE4B3, 0x9299}, //10131 #CJK UNIFIED IDEOGRAPH + {0xE4B4, 0x92A7}, //10132 #CJK UNIFIED IDEOGRAPH + {0xE4B5, 0x927E}, //10133 #CJK UNIFIED IDEOGRAPH + {0xE4B6, 0x9287}, //10134 #CJK UNIFIED IDEOGRAPH + {0xE4B7, 0x92A9}, //10135 #CJK UNIFIED IDEOGRAPH + {0xE4B8, 0x929D}, //10136 #CJK UNIFIED IDEOGRAPH + {0xE4B9, 0x928B}, //10137 #CJK UNIFIED IDEOGRAPH + {0xE4BA, 0x922D}, //10138 #CJK UNIFIED IDEOGRAPH + {0xE4BB, 0x969E}, //10139 #CJK UNIFIED IDEOGRAPH + {0xE4BC, 0x96A1}, //10140 #CJK UNIFIED IDEOGRAPH + {0xE4BD, 0x96FF}, //10141 #CJK UNIFIED IDEOGRAPH + {0xE4BE, 0x9758}, //10142 #CJK UNIFIED IDEOGRAPH + {0xE4BF, 0x977D}, //10143 #CJK UNIFIED IDEOGRAPH + {0xE4C0, 0x977A}, //10144 #CJK UNIFIED IDEOGRAPH + {0xE4C1, 0x977E}, //10145 #CJK UNIFIED IDEOGRAPH + {0xE4C2, 0x9783}, //10146 #CJK UNIFIED IDEOGRAPH + {0xE4C3, 0x9780}, //10147 #CJK UNIFIED IDEOGRAPH + {0xE4C4, 0x9782}, //10148 #CJK UNIFIED IDEOGRAPH + {0xE4C5, 0x977B}, //10149 #CJK UNIFIED IDEOGRAPH + {0xE4C6, 0x9784}, //10150 #CJK UNIFIED IDEOGRAPH + {0xE4C7, 0x9781}, //10151 #CJK UNIFIED IDEOGRAPH + {0xE4C8, 0x977F}, //10152 #CJK UNIFIED IDEOGRAPH + {0xE4C9, 0x97CE}, //10153 #CJK UNIFIED IDEOGRAPH + {0xE4CA, 0x97CD}, //10154 #CJK UNIFIED IDEOGRAPH + {0xE4CB, 0x9816}, //10155 #CJK UNIFIED IDEOGRAPH + {0xE4CC, 0x98AD}, //10156 #CJK UNIFIED IDEOGRAPH + {0xE4CD, 0x98AE}, //10157 #CJK UNIFIED IDEOGRAPH + {0xE4CE, 0x9902}, //10158 #CJK UNIFIED IDEOGRAPH + {0xE4CF, 0x9900}, //10159 #CJK UNIFIED IDEOGRAPH + {0xE4D0, 0x9907}, //10160 #CJK UNIFIED IDEOGRAPH + {0xE4D1, 0x999D}, //10161 #CJK UNIFIED IDEOGRAPH + {0xE4D2, 0x999C}, //10162 #CJK UNIFIED IDEOGRAPH + {0xE4D3, 0x99C3}, //10163 #CJK UNIFIED IDEOGRAPH + {0xE4D4, 0x99B9}, //10164 #CJK UNIFIED IDEOGRAPH + {0xE4D5, 0x99BB}, //10165 #CJK UNIFIED IDEOGRAPH + {0xE4D6, 0x99BA}, //10166 #CJK UNIFIED IDEOGRAPH + {0xE4D7, 0x99C2}, //10167 #CJK UNIFIED IDEOGRAPH + {0xE4D8, 0x99BD}, //10168 #CJK UNIFIED IDEOGRAPH + {0xE4D9, 0x99C7}, //10169 #CJK UNIFIED IDEOGRAPH + {0xE4DA, 0x9AB1}, //10170 #CJK UNIFIED IDEOGRAPH + {0xE4DB, 0x9AE3}, //10171 #CJK UNIFIED IDEOGRAPH + {0xE4DC, 0x9AE7}, //10172 #CJK UNIFIED IDEOGRAPH + {0xE4DD, 0x9B3E}, //10173 #CJK UNIFIED IDEOGRAPH + {0xE4DE, 0x9B3F}, //10174 #CJK UNIFIED IDEOGRAPH + {0xE4DF, 0x9B60}, //10175 #CJK UNIFIED IDEOGRAPH + {0xE4E0, 0x9B61}, //10176 #CJK UNIFIED IDEOGRAPH + {0xE4E1, 0x9B5F}, //10177 #CJK UNIFIED IDEOGRAPH + {0xE4E2, 0x9CF1}, //10178 #CJK UNIFIED IDEOGRAPH + {0xE4E3, 0x9CF2}, //10179 #CJK UNIFIED IDEOGRAPH + {0xE4E4, 0x9CF5}, //10180 #CJK UNIFIED IDEOGRAPH + {0xE4E5, 0x9EA7}, //10181 #CJK UNIFIED IDEOGRAPH + {0xE4E6, 0x50FF}, //10182 #CJK UNIFIED IDEOGRAPH + {0xE4E7, 0x5103}, //10183 #CJK UNIFIED IDEOGRAPH + {0xE4E8, 0x5130}, //10184 #CJK UNIFIED IDEOGRAPH + {0xE4E9, 0x50F8}, //10185 #CJK UNIFIED IDEOGRAPH + {0xE4EA, 0x5106}, //10186 #CJK UNIFIED IDEOGRAPH + {0xE4EB, 0x5107}, //10187 #CJK UNIFIED IDEOGRAPH + {0xE4EC, 0x50F6}, //10188 #CJK UNIFIED IDEOGRAPH + {0xE4ED, 0x50FE}, //10189 #CJK UNIFIED IDEOGRAPH + {0xE4EE, 0x510B}, //10190 #CJK UNIFIED IDEOGRAPH + {0xE4EF, 0x510C}, //10191 #CJK UNIFIED IDEOGRAPH + {0xE4F0, 0x50FD}, //10192 #CJK UNIFIED IDEOGRAPH + {0xE4F1, 0x510A}, //10193 #CJK UNIFIED IDEOGRAPH + {0xE4F2, 0x528B}, //10194 #CJK UNIFIED IDEOGRAPH + {0xE4F3, 0x528C}, //10195 #CJK UNIFIED IDEOGRAPH + {0xE4F4, 0x52F1}, //10196 #CJK UNIFIED IDEOGRAPH + {0xE4F5, 0x52EF}, //10197 #CJK UNIFIED IDEOGRAPH + {0xE4F6, 0x5648}, //10198 #CJK UNIFIED IDEOGRAPH + {0xE4F7, 0x5642}, //10199 #CJK UNIFIED IDEOGRAPH + {0xE4F8, 0x564C}, //10200 #CJK UNIFIED IDEOGRAPH + {0xE4F9, 0x5635}, //10201 #CJK UNIFIED IDEOGRAPH + {0xE4FA, 0x5641}, //10202 #CJK UNIFIED IDEOGRAPH + {0xE4FB, 0x564A}, //10203 #CJK UNIFIED IDEOGRAPH + {0xE4FC, 0x5649}, //10204 #CJK UNIFIED IDEOGRAPH + {0xE4FD, 0x5646}, //10205 #CJK UNIFIED IDEOGRAPH + {0xE4FE, 0x5658}, //10206 #CJK UNIFIED IDEOGRAPH + {0xE540, 0x565A}, //10207 #CJK UNIFIED IDEOGRAPH + {0xE541, 0x5640}, //10208 #CJK UNIFIED IDEOGRAPH + {0xE542, 0x5633}, //10209 #CJK UNIFIED IDEOGRAPH + {0xE543, 0x563D}, //10210 #CJK UNIFIED IDEOGRAPH + {0xE544, 0x562C}, //10211 #CJK UNIFIED IDEOGRAPH + {0xE545, 0x563E}, //10212 #CJK UNIFIED IDEOGRAPH + {0xE546, 0x5638}, //10213 #CJK UNIFIED IDEOGRAPH + {0xE547, 0x562A}, //10214 #CJK UNIFIED IDEOGRAPH + {0xE548, 0x563A}, //10215 #CJK UNIFIED IDEOGRAPH + {0xE549, 0x571A}, //10216 #CJK UNIFIED IDEOGRAPH + {0xE54A, 0x58AB}, //10217 #CJK UNIFIED IDEOGRAPH + {0xE54B, 0x589D}, //10218 #CJK UNIFIED IDEOGRAPH + {0xE54C, 0x58B1}, //10219 #CJK UNIFIED IDEOGRAPH + {0xE54D, 0x58A0}, //10220 #CJK UNIFIED IDEOGRAPH + {0xE54E, 0x58A3}, //10221 #CJK UNIFIED IDEOGRAPH + {0xE54F, 0x58AF}, //10222 #CJK UNIFIED IDEOGRAPH + {0xE550, 0x58AC}, //10223 #CJK UNIFIED IDEOGRAPH + {0xE551, 0x58A5}, //10224 #CJK UNIFIED IDEOGRAPH + {0xE552, 0x58A1}, //10225 #CJK UNIFIED IDEOGRAPH + {0xE553, 0x58FF}, //10226 #CJK UNIFIED IDEOGRAPH + {0xE554, 0x5AFF}, //10227 #CJK UNIFIED IDEOGRAPH + {0xE555, 0x5AF4}, //10228 #CJK UNIFIED IDEOGRAPH + {0xE556, 0x5AFD}, //10229 #CJK UNIFIED IDEOGRAPH + {0xE557, 0x5AF7}, //10230 #CJK UNIFIED IDEOGRAPH + {0xE558, 0x5AF6}, //10231 #CJK UNIFIED IDEOGRAPH + {0xE559, 0x5B03}, //10232 #CJK UNIFIED IDEOGRAPH + {0xE55A, 0x5AF8}, //10233 #CJK UNIFIED IDEOGRAPH + {0xE55B, 0x5B02}, //10234 #CJK UNIFIED IDEOGRAPH + {0xE55C, 0x5AF9}, //10235 #CJK UNIFIED IDEOGRAPH + {0xE55D, 0x5B01}, //10236 #CJK UNIFIED IDEOGRAPH + {0xE55E, 0x5B07}, //10237 #CJK UNIFIED IDEOGRAPH + {0xE55F, 0x5B05}, //10238 #CJK UNIFIED IDEOGRAPH + {0xE560, 0x5B0F}, //10239 #CJK UNIFIED IDEOGRAPH + {0xE561, 0x5C67}, //10240 #CJK UNIFIED IDEOGRAPH + {0xE562, 0x5D99}, //10241 #CJK UNIFIED IDEOGRAPH + {0xE563, 0x5D97}, //10242 #CJK UNIFIED IDEOGRAPH + {0xE564, 0x5D9F}, //10243 #CJK UNIFIED IDEOGRAPH + {0xE565, 0x5D92}, //10244 #CJK UNIFIED IDEOGRAPH + {0xE566, 0x5DA2}, //10245 #CJK UNIFIED IDEOGRAPH + {0xE567, 0x5D93}, //10246 #CJK UNIFIED IDEOGRAPH + {0xE568, 0x5D95}, //10247 #CJK UNIFIED IDEOGRAPH + {0xE569, 0x5DA0}, //10248 #CJK UNIFIED IDEOGRAPH + {0xE56A, 0x5D9C}, //10249 #CJK UNIFIED IDEOGRAPH + {0xE56B, 0x5DA1}, //10250 #CJK UNIFIED IDEOGRAPH + {0xE56C, 0x5D9A}, //10251 #CJK UNIFIED IDEOGRAPH + {0xE56D, 0x5D9E}, //10252 #CJK UNIFIED IDEOGRAPH + {0xE56E, 0x5E69}, //10253 #CJK UNIFIED IDEOGRAPH + {0xE56F, 0x5E5D}, //10254 #CJK UNIFIED IDEOGRAPH + {0xE570, 0x5E60}, //10255 #CJK UNIFIED IDEOGRAPH + {0xE571, 0x5E5C}, //10256 #CJK UNIFIED IDEOGRAPH + {0xE572, 0x7DF3}, //10257 #CJK UNIFIED IDEOGRAPH + {0xE573, 0x5EDB}, //10258 #CJK UNIFIED IDEOGRAPH + {0xE574, 0x5EDE}, //10259 #CJK UNIFIED IDEOGRAPH + {0xE575, 0x5EE1}, //10260 #CJK UNIFIED IDEOGRAPH + {0xE576, 0x5F49}, //10261 #CJK UNIFIED IDEOGRAPH + {0xE577, 0x5FB2}, //10262 #CJK UNIFIED IDEOGRAPH + {0xE578, 0x618B}, //10263 #CJK UNIFIED IDEOGRAPH + {0xE579, 0x6183}, //10264 #CJK UNIFIED IDEOGRAPH + {0xE57A, 0x6179}, //10265 #CJK UNIFIED IDEOGRAPH + {0xE57B, 0x61B1}, //10266 #CJK UNIFIED IDEOGRAPH + {0xE57C, 0x61B0}, //10267 #CJK UNIFIED IDEOGRAPH + {0xE57D, 0x61A2}, //10268 #CJK UNIFIED IDEOGRAPH + {0xE57E, 0x6189}, //10269 #CJK UNIFIED IDEOGRAPH + {0xE5A1, 0x619B}, //10270 #CJK UNIFIED IDEOGRAPH + {0xE5A2, 0x6193}, //10271 #CJK UNIFIED IDEOGRAPH + {0xE5A3, 0x61AF}, //10272 #CJK UNIFIED IDEOGRAPH + {0xE5A4, 0x61AD}, //10273 #CJK UNIFIED IDEOGRAPH + {0xE5A5, 0x619F}, //10274 #CJK UNIFIED IDEOGRAPH + {0xE5A6, 0x6192}, //10275 #CJK UNIFIED IDEOGRAPH + {0xE5A7, 0x61AA}, //10276 #CJK UNIFIED IDEOGRAPH + {0xE5A8, 0x61A1}, //10277 #CJK UNIFIED IDEOGRAPH + {0xE5A9, 0x618D}, //10278 #CJK UNIFIED IDEOGRAPH + {0xE5AA, 0x6166}, //10279 #CJK UNIFIED IDEOGRAPH + {0xE5AB, 0x61B3}, //10280 #CJK UNIFIED IDEOGRAPH + {0xE5AC, 0x622D}, //10281 #CJK UNIFIED IDEOGRAPH + {0xE5AD, 0x646E}, //10282 #CJK UNIFIED IDEOGRAPH + {0xE5AE, 0x6470}, //10283 #CJK UNIFIED IDEOGRAPH + {0xE5AF, 0x6496}, //10284 #CJK UNIFIED IDEOGRAPH + {0xE5B0, 0x64A0}, //10285 #CJK UNIFIED IDEOGRAPH + {0xE5B1, 0x6485}, //10286 #CJK UNIFIED IDEOGRAPH + {0xE5B2, 0x6497}, //10287 #CJK UNIFIED IDEOGRAPH + {0xE5B3, 0x649C}, //10288 #CJK UNIFIED IDEOGRAPH + {0xE5B4, 0x648F}, //10289 #CJK UNIFIED IDEOGRAPH + {0xE5B5, 0x648B}, //10290 #CJK UNIFIED IDEOGRAPH + {0xE5B6, 0x648A}, //10291 #CJK UNIFIED IDEOGRAPH + {0xE5B7, 0x648C}, //10292 #CJK UNIFIED IDEOGRAPH + {0xE5B8, 0x64A3}, //10293 #CJK UNIFIED IDEOGRAPH + {0xE5B9, 0x649F}, //10294 #CJK UNIFIED IDEOGRAPH + {0xE5BA, 0x6468}, //10295 #CJK UNIFIED IDEOGRAPH + {0xE5BB, 0x64B1}, //10296 #CJK UNIFIED IDEOGRAPH + {0xE5BC, 0x6498}, //10297 #CJK UNIFIED IDEOGRAPH + {0xE5BD, 0x6576}, //10298 #CJK UNIFIED IDEOGRAPH + {0xE5BE, 0x657A}, //10299 #CJK UNIFIED IDEOGRAPH + {0xE5BF, 0x6579}, //10300 #CJK UNIFIED IDEOGRAPH + {0xE5C0, 0x657B}, //10301 #CJK UNIFIED IDEOGRAPH + {0xE5C1, 0x65B2}, //10302 #CJK UNIFIED IDEOGRAPH + {0xE5C2, 0x65B3}, //10303 #CJK UNIFIED IDEOGRAPH + {0xE5C3, 0x66B5}, //10304 #CJK UNIFIED IDEOGRAPH + {0xE5C4, 0x66B0}, //10305 #CJK UNIFIED IDEOGRAPH + {0xE5C5, 0x66A9}, //10306 #CJK UNIFIED IDEOGRAPH + {0xE5C6, 0x66B2}, //10307 #CJK UNIFIED IDEOGRAPH + {0xE5C7, 0x66B7}, //10308 #CJK UNIFIED IDEOGRAPH + {0xE5C8, 0x66AA}, //10309 #CJK UNIFIED IDEOGRAPH + {0xE5C9, 0x66AF}, //10310 #CJK UNIFIED IDEOGRAPH + {0xE5CA, 0x6A00}, //10311 #CJK UNIFIED IDEOGRAPH + {0xE5CB, 0x6A06}, //10312 #CJK UNIFIED IDEOGRAPH + {0xE5CC, 0x6A17}, //10313 #CJK UNIFIED IDEOGRAPH + {0xE5CD, 0x69E5}, //10314 #CJK UNIFIED IDEOGRAPH + {0xE5CE, 0x69F8}, //10315 #CJK UNIFIED IDEOGRAPH + {0xE5CF, 0x6A15}, //10316 #CJK UNIFIED IDEOGRAPH + {0xE5D0, 0x69F1}, //10317 #CJK UNIFIED IDEOGRAPH + {0xE5D1, 0x69E4}, //10318 #CJK UNIFIED IDEOGRAPH + {0xE5D2, 0x6A20}, //10319 #CJK UNIFIED IDEOGRAPH + {0xE5D3, 0x69FF}, //10320 #CJK UNIFIED IDEOGRAPH + {0xE5D4, 0x69EC}, //10321 #CJK UNIFIED IDEOGRAPH + {0xE5D5, 0x69E2}, //10322 #CJK UNIFIED IDEOGRAPH + {0xE5D6, 0x6A1B}, //10323 #CJK UNIFIED IDEOGRAPH + {0xE5D7, 0x6A1D}, //10324 #CJK UNIFIED IDEOGRAPH + {0xE5D8, 0x69FE}, //10325 #CJK UNIFIED IDEOGRAPH + {0xE5D9, 0x6A27}, //10326 #CJK UNIFIED IDEOGRAPH + {0xE5DA, 0x69F2}, //10327 #CJK UNIFIED IDEOGRAPH + {0xE5DB, 0x69EE}, //10328 #CJK UNIFIED IDEOGRAPH + {0xE5DC, 0x6A14}, //10329 #CJK UNIFIED IDEOGRAPH + {0xE5DD, 0x69F7}, //10330 #CJK UNIFIED IDEOGRAPH + {0xE5DE, 0x69E7}, //10331 #CJK UNIFIED IDEOGRAPH + {0xE5DF, 0x6A40}, //10332 #CJK UNIFIED IDEOGRAPH + {0xE5E0, 0x6A08}, //10333 #CJK UNIFIED IDEOGRAPH + {0xE5E1, 0x69E6}, //10334 #CJK UNIFIED IDEOGRAPH + {0xE5E2, 0x69FB}, //10335 #CJK UNIFIED IDEOGRAPH + {0xE5E3, 0x6A0D}, //10336 #CJK UNIFIED IDEOGRAPH + {0xE5E4, 0x69FC}, //10337 #CJK UNIFIED IDEOGRAPH + {0xE5E5, 0x69EB}, //10338 #CJK UNIFIED IDEOGRAPH + {0xE5E6, 0x6A09}, //10339 #CJK UNIFIED IDEOGRAPH + {0xE5E7, 0x6A04}, //10340 #CJK UNIFIED IDEOGRAPH + {0xE5E8, 0x6A18}, //10341 #CJK UNIFIED IDEOGRAPH + {0xE5E9, 0x6A25}, //10342 #CJK UNIFIED IDEOGRAPH + {0xE5EA, 0x6A0F}, //10343 #CJK UNIFIED IDEOGRAPH + {0xE5EB, 0x69F6}, //10344 #CJK UNIFIED IDEOGRAPH + {0xE5EC, 0x6A26}, //10345 #CJK UNIFIED IDEOGRAPH + {0xE5ED, 0x6A07}, //10346 #CJK UNIFIED IDEOGRAPH + {0xE5EE, 0x69F4}, //10347 #CJK UNIFIED IDEOGRAPH + {0xE5EF, 0x6A16}, //10348 #CJK UNIFIED IDEOGRAPH + {0xE5F0, 0x6B51}, //10349 #CJK UNIFIED IDEOGRAPH + {0xE5F1, 0x6BA5}, //10350 #CJK UNIFIED IDEOGRAPH + {0xE5F2, 0x6BA3}, //10351 #CJK UNIFIED IDEOGRAPH + {0xE5F3, 0x6BA2}, //10352 #CJK UNIFIED IDEOGRAPH + {0xE5F4, 0x6BA6}, //10353 #CJK UNIFIED IDEOGRAPH + {0xE5F5, 0x6C01}, //10354 #CJK UNIFIED IDEOGRAPH + {0xE5F6, 0x6C00}, //10355 #CJK UNIFIED IDEOGRAPH + {0xE5F7, 0x6BFF}, //10356 #CJK UNIFIED IDEOGRAPH + {0xE5F8, 0x6C02}, //10357 #CJK UNIFIED IDEOGRAPH + {0xE5F9, 0x6F41}, //10358 #CJK UNIFIED IDEOGRAPH + {0xE5FA, 0x6F26}, //10359 #CJK UNIFIED IDEOGRAPH + {0xE5FB, 0x6F7E}, //10360 #CJK UNIFIED IDEOGRAPH + {0xE5FC, 0x6F87}, //10361 #CJK UNIFIED IDEOGRAPH + {0xE5FD, 0x6FC6}, //10362 #CJK UNIFIED IDEOGRAPH + {0xE5FE, 0x6F92}, //10363 #CJK UNIFIED IDEOGRAPH + {0xE640, 0x6F8D}, //10364 #CJK UNIFIED IDEOGRAPH + {0xE641, 0x6F89}, //10365 #CJK UNIFIED IDEOGRAPH + {0xE642, 0x6F8C}, //10366 #CJK UNIFIED IDEOGRAPH + {0xE643, 0x6F62}, //10367 #CJK UNIFIED IDEOGRAPH + {0xE644, 0x6F4F}, //10368 #CJK UNIFIED IDEOGRAPH + {0xE645, 0x6F85}, //10369 #CJK UNIFIED IDEOGRAPH + {0xE646, 0x6F5A}, //10370 #CJK UNIFIED IDEOGRAPH + {0xE647, 0x6F96}, //10371 #CJK UNIFIED IDEOGRAPH + {0xE648, 0x6F76}, //10372 #CJK UNIFIED IDEOGRAPH + {0xE649, 0x6F6C}, //10373 #CJK UNIFIED IDEOGRAPH + {0xE64A, 0x6F82}, //10374 #CJK UNIFIED IDEOGRAPH + {0xE64B, 0x6F55}, //10375 #CJK UNIFIED IDEOGRAPH + {0xE64C, 0x6F72}, //10376 #CJK UNIFIED IDEOGRAPH + {0xE64D, 0x6F52}, //10377 #CJK UNIFIED IDEOGRAPH + {0xE64E, 0x6F50}, //10378 #CJK UNIFIED IDEOGRAPH + {0xE64F, 0x6F57}, //10379 #CJK UNIFIED IDEOGRAPH + {0xE650, 0x6F94}, //10380 #CJK UNIFIED IDEOGRAPH + {0xE651, 0x6F93}, //10381 #CJK UNIFIED IDEOGRAPH + {0xE652, 0x6F5D}, //10382 #CJK UNIFIED IDEOGRAPH + {0xE653, 0x6F00}, //10383 #CJK UNIFIED IDEOGRAPH + {0xE654, 0x6F61}, //10384 #CJK UNIFIED IDEOGRAPH + {0xE655, 0x6F6B}, //10385 #CJK UNIFIED IDEOGRAPH + {0xE656, 0x6F7D}, //10386 #CJK UNIFIED IDEOGRAPH + {0xE657, 0x6F67}, //10387 #CJK UNIFIED IDEOGRAPH + {0xE658, 0x6F90}, //10388 #CJK UNIFIED IDEOGRAPH + {0xE659, 0x6F53}, //10389 #CJK UNIFIED IDEOGRAPH + {0xE65A, 0x6F8B}, //10390 #CJK UNIFIED IDEOGRAPH + {0xE65B, 0x6F69}, //10391 #CJK UNIFIED IDEOGRAPH + {0xE65C, 0x6F7F}, //10392 #CJK UNIFIED IDEOGRAPH + {0xE65D, 0x6F95}, //10393 #CJK UNIFIED IDEOGRAPH + {0xE65E, 0x6F63}, //10394 #CJK UNIFIED IDEOGRAPH + {0xE65F, 0x6F77}, //10395 #CJK UNIFIED IDEOGRAPH + {0xE660, 0x6F6A}, //10396 #CJK UNIFIED IDEOGRAPH + {0xE661, 0x6F7B}, //10397 #CJK UNIFIED IDEOGRAPH + {0xE662, 0x71B2}, //10398 #CJK UNIFIED IDEOGRAPH + {0xE663, 0x71AF}, //10399 #CJK UNIFIED IDEOGRAPH + {0xE664, 0x719B}, //10400 #CJK UNIFIED IDEOGRAPH + {0xE665, 0x71B0}, //10401 #CJK UNIFIED IDEOGRAPH + {0xE666, 0x71A0}, //10402 #CJK UNIFIED IDEOGRAPH + {0xE667, 0x719A}, //10403 #CJK UNIFIED IDEOGRAPH + {0xE668, 0x71A9}, //10404 #CJK UNIFIED IDEOGRAPH + {0xE669, 0x71B5}, //10405 #CJK UNIFIED IDEOGRAPH + {0xE66A, 0x719D}, //10406 #CJK UNIFIED IDEOGRAPH + {0xE66B, 0x71A5}, //10407 #CJK UNIFIED IDEOGRAPH + {0xE66C, 0x719E}, //10408 #CJK UNIFIED IDEOGRAPH + {0xE66D, 0x71A4}, //10409 #CJK UNIFIED IDEOGRAPH + {0xE66E, 0x71A1}, //10410 #CJK UNIFIED IDEOGRAPH + {0xE66F, 0x71AA}, //10411 #CJK UNIFIED IDEOGRAPH + {0xE670, 0x719C}, //10412 #CJK UNIFIED IDEOGRAPH + {0xE671, 0x71A7}, //10413 #CJK UNIFIED IDEOGRAPH + {0xE672, 0x71B3}, //10414 #CJK UNIFIED IDEOGRAPH + {0xE673, 0x7298}, //10415 #CJK UNIFIED IDEOGRAPH + {0xE674, 0x729A}, //10416 #CJK UNIFIED IDEOGRAPH + {0xE675, 0x7358}, //10417 #CJK UNIFIED IDEOGRAPH + {0xE676, 0x7352}, //10418 #CJK UNIFIED IDEOGRAPH + {0xE677, 0x735E}, //10419 #CJK UNIFIED IDEOGRAPH + {0xE678, 0x735F}, //10420 #CJK UNIFIED IDEOGRAPH + {0xE679, 0x7360}, //10421 #CJK UNIFIED IDEOGRAPH + {0xE67A, 0x735D}, //10422 #CJK UNIFIED IDEOGRAPH + {0xE67B, 0x735B}, //10423 #CJK UNIFIED IDEOGRAPH + {0xE67C, 0x7361}, //10424 #CJK UNIFIED IDEOGRAPH + {0xE67D, 0x735A}, //10425 #CJK UNIFIED IDEOGRAPH + {0xE67E, 0x7359}, //10426 #CJK UNIFIED IDEOGRAPH + {0xE6A1, 0x7362}, //10427 #CJK UNIFIED IDEOGRAPH + {0xE6A2, 0x7487}, //10428 #CJK UNIFIED IDEOGRAPH + {0xE6A3, 0x7489}, //10429 #CJK UNIFIED IDEOGRAPH + {0xE6A4, 0x748A}, //10430 #CJK UNIFIED IDEOGRAPH + {0xE6A5, 0x7486}, //10431 #CJK UNIFIED IDEOGRAPH + {0xE6A6, 0x7481}, //10432 #CJK UNIFIED IDEOGRAPH + {0xE6A7, 0x747D}, //10433 #CJK UNIFIED IDEOGRAPH + {0xE6A8, 0x7485}, //10434 #CJK UNIFIED IDEOGRAPH + {0xE6A9, 0x7488}, //10435 #CJK UNIFIED IDEOGRAPH + {0xE6AA, 0x747C}, //10436 #CJK UNIFIED IDEOGRAPH + {0xE6AB, 0x7479}, //10437 #CJK UNIFIED IDEOGRAPH + {0xE6AC, 0x7508}, //10438 #CJK UNIFIED IDEOGRAPH + {0xE6AD, 0x7507}, //10439 #CJK UNIFIED IDEOGRAPH + {0xE6AE, 0x757E}, //10440 #CJK UNIFIED IDEOGRAPH + {0xE6AF, 0x7625}, //10441 #CJK UNIFIED IDEOGRAPH + {0xE6B0, 0x761E}, //10442 #CJK UNIFIED IDEOGRAPH + {0xE6B1, 0x7619}, //10443 #CJK UNIFIED IDEOGRAPH + {0xE6B2, 0x761D}, //10444 #CJK UNIFIED IDEOGRAPH + {0xE6B3, 0x761C}, //10445 #CJK UNIFIED IDEOGRAPH + {0xE6B4, 0x7623}, //10446 #CJK UNIFIED IDEOGRAPH + {0xE6B5, 0x761A}, //10447 #CJK UNIFIED IDEOGRAPH + {0xE6B6, 0x7628}, //10448 #CJK UNIFIED IDEOGRAPH + {0xE6B7, 0x761B}, //10449 #CJK UNIFIED IDEOGRAPH + {0xE6B8, 0x769C}, //10450 #CJK UNIFIED IDEOGRAPH + {0xE6B9, 0x769D}, //10451 #CJK UNIFIED IDEOGRAPH + {0xE6BA, 0x769E}, //10452 #CJK UNIFIED IDEOGRAPH + {0xE6BB, 0x769B}, //10453 #CJK UNIFIED IDEOGRAPH + {0xE6BC, 0x778D}, //10454 #CJK UNIFIED IDEOGRAPH + {0xE6BD, 0x778F}, //10455 #CJK UNIFIED IDEOGRAPH + {0xE6BE, 0x7789}, //10456 #CJK UNIFIED IDEOGRAPH + {0xE6BF, 0x7788}, //10457 #CJK UNIFIED IDEOGRAPH + {0xE6C0, 0x78CD}, //10458 #CJK UNIFIED IDEOGRAPH + {0xE6C1, 0x78BB}, //10459 #CJK UNIFIED IDEOGRAPH + {0xE6C2, 0x78CF}, //10460 #CJK UNIFIED IDEOGRAPH + {0xE6C3, 0x78CC}, //10461 #CJK UNIFIED IDEOGRAPH + {0xE6C4, 0x78D1}, //10462 #CJK UNIFIED IDEOGRAPH + {0xE6C5, 0x78CE}, //10463 #CJK UNIFIED IDEOGRAPH + {0xE6C6, 0x78D4}, //10464 #CJK UNIFIED IDEOGRAPH + {0xE6C7, 0x78C8}, //10465 #CJK UNIFIED IDEOGRAPH + {0xE6C8, 0x78C3}, //10466 #CJK UNIFIED IDEOGRAPH + {0xE6C9, 0x78C4}, //10467 #CJK UNIFIED IDEOGRAPH + {0xE6CA, 0x78C9}, //10468 #CJK UNIFIED IDEOGRAPH + {0xE6CB, 0x799A}, //10469 #CJK UNIFIED IDEOGRAPH + {0xE6CC, 0x79A1}, //10470 #CJK UNIFIED IDEOGRAPH + {0xE6CD, 0x79A0}, //10471 #CJK UNIFIED IDEOGRAPH + {0xE6CE, 0x799C}, //10472 #CJK UNIFIED IDEOGRAPH + {0xE6CF, 0x79A2}, //10473 #CJK UNIFIED IDEOGRAPH + {0xE6D0, 0x799B}, //10474 #CJK UNIFIED IDEOGRAPH + {0xE6D1, 0x6B76}, //10475 #CJK UNIFIED IDEOGRAPH + {0xE6D2, 0x7A39}, //10476 #CJK UNIFIED IDEOGRAPH + {0xE6D3, 0x7AB2}, //10477 #CJK UNIFIED IDEOGRAPH + {0xE6D4, 0x7AB4}, //10478 #CJK UNIFIED IDEOGRAPH + {0xE6D5, 0x7AB3}, //10479 #CJK UNIFIED IDEOGRAPH + {0xE6D6, 0x7BB7}, //10480 #CJK UNIFIED IDEOGRAPH + {0xE6D7, 0x7BCB}, //10481 #CJK UNIFIED IDEOGRAPH + {0xE6D8, 0x7BBE}, //10482 #CJK UNIFIED IDEOGRAPH + {0xE6D9, 0x7BAC}, //10483 #CJK UNIFIED IDEOGRAPH + {0xE6DA, 0x7BCE}, //10484 #CJK UNIFIED IDEOGRAPH + {0xE6DB, 0x7BAF}, //10485 #CJK UNIFIED IDEOGRAPH + {0xE6DC, 0x7BB9}, //10486 #CJK UNIFIED IDEOGRAPH + {0xE6DD, 0x7BCA}, //10487 #CJK UNIFIED IDEOGRAPH + {0xE6DE, 0x7BB5}, //10488 #CJK UNIFIED IDEOGRAPH + {0xE6DF, 0x7CC5}, //10489 #CJK UNIFIED IDEOGRAPH + {0xE6E0, 0x7CC8}, //10490 #CJK UNIFIED IDEOGRAPH + {0xE6E1, 0x7CCC}, //10491 #CJK UNIFIED IDEOGRAPH + {0xE6E2, 0x7CCB}, //10492 #CJK UNIFIED IDEOGRAPH + {0xE6E3, 0x7DF7}, //10493 #CJK UNIFIED IDEOGRAPH + {0xE6E4, 0x7DDB}, //10494 #CJK UNIFIED IDEOGRAPH + {0xE6E5, 0x7DEA}, //10495 #CJK UNIFIED IDEOGRAPH + {0xE6E6, 0x7DE7}, //10496 #CJK UNIFIED IDEOGRAPH + {0xE6E7, 0x7DD7}, //10497 #CJK UNIFIED IDEOGRAPH + {0xE6E8, 0x7DE1}, //10498 #CJK UNIFIED IDEOGRAPH + {0xE6E9, 0x7E03}, //10499 #CJK UNIFIED IDEOGRAPH + {0xE6EA, 0x7DFA}, //10500 #CJK UNIFIED IDEOGRAPH + {0xE6EB, 0x7DE6}, //10501 #CJK UNIFIED IDEOGRAPH + {0xE6EC, 0x7DF6}, //10502 #CJK UNIFIED IDEOGRAPH + {0xE6ED, 0x7DF1}, //10503 #CJK UNIFIED IDEOGRAPH + {0xE6EE, 0x7DF0}, //10504 #CJK UNIFIED IDEOGRAPH + {0xE6EF, 0x7DEE}, //10505 #CJK UNIFIED IDEOGRAPH + {0xE6F0, 0x7DDF}, //10506 #CJK UNIFIED IDEOGRAPH + {0xE6F1, 0x7F76}, //10507 #CJK UNIFIED IDEOGRAPH + {0xE6F2, 0x7FAC}, //10508 #CJK UNIFIED IDEOGRAPH + {0xE6F3, 0x7FB0}, //10509 #CJK UNIFIED IDEOGRAPH + {0xE6F4, 0x7FAD}, //10510 #CJK UNIFIED IDEOGRAPH + {0xE6F5, 0x7FED}, //10511 #CJK UNIFIED IDEOGRAPH + {0xE6F6, 0x7FEB}, //10512 #CJK UNIFIED IDEOGRAPH + {0xE6F7, 0x7FEA}, //10513 #CJK UNIFIED IDEOGRAPH + {0xE6F8, 0x7FEC}, //10514 #CJK UNIFIED IDEOGRAPH + {0xE6F9, 0x7FE6}, //10515 #CJK UNIFIED IDEOGRAPH + {0xE6FA, 0x7FE8}, //10516 #CJK UNIFIED IDEOGRAPH + {0xE6FB, 0x8064}, //10517 #CJK UNIFIED IDEOGRAPH + {0xE6FC, 0x8067}, //10518 #CJK UNIFIED IDEOGRAPH + {0xE6FD, 0x81A3}, //10519 #CJK UNIFIED IDEOGRAPH + {0xE6FE, 0x819F}, //10520 #CJK UNIFIED IDEOGRAPH + {0xE740, 0x819E}, //10521 #CJK UNIFIED IDEOGRAPH + {0xE741, 0x8195}, //10522 #CJK UNIFIED IDEOGRAPH + {0xE742, 0x81A2}, //10523 #CJK UNIFIED IDEOGRAPH + {0xE743, 0x8199}, //10524 #CJK UNIFIED IDEOGRAPH + {0xE744, 0x8197}, //10525 #CJK UNIFIED IDEOGRAPH + {0xE745, 0x8216}, //10526 #CJK UNIFIED IDEOGRAPH + {0xE746, 0x824F}, //10527 #CJK UNIFIED IDEOGRAPH + {0xE747, 0x8253}, //10528 #CJK UNIFIED IDEOGRAPH + {0xE748, 0x8252}, //10529 #CJK UNIFIED IDEOGRAPH + {0xE749, 0x8250}, //10530 #CJK UNIFIED IDEOGRAPH + {0xE74A, 0x824E}, //10531 #CJK UNIFIED IDEOGRAPH + {0xE74B, 0x8251}, //10532 #CJK UNIFIED IDEOGRAPH + {0xE74C, 0x8524}, //10533 #CJK UNIFIED IDEOGRAPH + {0xE74D, 0x853B}, //10534 #CJK UNIFIED IDEOGRAPH + {0xE74E, 0x850F}, //10535 #CJK UNIFIED IDEOGRAPH + {0xE74F, 0x8500}, //10536 #CJK UNIFIED IDEOGRAPH + {0xE750, 0x8529}, //10537 #CJK UNIFIED IDEOGRAPH + {0xE751, 0x850E}, //10538 #CJK UNIFIED IDEOGRAPH + {0xE752, 0x8509}, //10539 #CJK UNIFIED IDEOGRAPH + {0xE753, 0x850D}, //10540 #CJK UNIFIED IDEOGRAPH + {0xE754, 0x851F}, //10541 #CJK UNIFIED IDEOGRAPH + {0xE755, 0x850A}, //10542 #CJK UNIFIED IDEOGRAPH + {0xE756, 0x8527}, //10543 #CJK UNIFIED IDEOGRAPH + {0xE757, 0x851C}, //10544 #CJK UNIFIED IDEOGRAPH + {0xE758, 0x84FB}, //10545 #CJK UNIFIED IDEOGRAPH + {0xE759, 0x852B}, //10546 #CJK UNIFIED IDEOGRAPH + {0xE75A, 0x84FA}, //10547 #CJK UNIFIED IDEOGRAPH + {0xE75B, 0x8508}, //10548 #CJK UNIFIED IDEOGRAPH + {0xE75C, 0x850C}, //10549 #CJK UNIFIED IDEOGRAPH + {0xE75D, 0x84F4}, //10550 #CJK UNIFIED IDEOGRAPH + {0xE75E, 0x852A}, //10551 #CJK UNIFIED IDEOGRAPH + {0xE75F, 0x84F2}, //10552 #CJK UNIFIED IDEOGRAPH + {0xE760, 0x8515}, //10553 #CJK UNIFIED IDEOGRAPH + {0xE761, 0x84F7}, //10554 #CJK UNIFIED IDEOGRAPH + {0xE762, 0x84EB}, //10555 #CJK UNIFIED IDEOGRAPH + {0xE763, 0x84F3}, //10556 #CJK UNIFIED IDEOGRAPH + {0xE764, 0x84FC}, //10557 #CJK UNIFIED IDEOGRAPH + {0xE765, 0x8512}, //10558 #CJK UNIFIED IDEOGRAPH + {0xE766, 0x84EA}, //10559 #CJK UNIFIED IDEOGRAPH + {0xE767, 0x84E9}, //10560 #CJK UNIFIED IDEOGRAPH + {0xE768, 0x8516}, //10561 #CJK UNIFIED IDEOGRAPH + {0xE769, 0x84FE}, //10562 #CJK UNIFIED IDEOGRAPH + {0xE76A, 0x8528}, //10563 #CJK UNIFIED IDEOGRAPH + {0xE76B, 0x851D}, //10564 #CJK UNIFIED IDEOGRAPH + {0xE76C, 0x852E}, //10565 #CJK UNIFIED IDEOGRAPH + {0xE76D, 0x8502}, //10566 #CJK UNIFIED IDEOGRAPH + {0xE76E, 0x84FD}, //10567 #CJK UNIFIED IDEOGRAPH + {0xE76F, 0x851E}, //10568 #CJK UNIFIED IDEOGRAPH + {0xE770, 0x84F6}, //10569 #CJK UNIFIED IDEOGRAPH + {0xE771, 0x8531}, //10570 #CJK UNIFIED IDEOGRAPH + {0xE772, 0x8526}, //10571 #CJK UNIFIED IDEOGRAPH + {0xE773, 0x84E7}, //10572 #CJK UNIFIED IDEOGRAPH + {0xE774, 0x84E8}, //10573 #CJK UNIFIED IDEOGRAPH + {0xE775, 0x84F0}, //10574 #CJK UNIFIED IDEOGRAPH + {0xE776, 0x84EF}, //10575 #CJK UNIFIED IDEOGRAPH + {0xE777, 0x84F9}, //10576 #CJK UNIFIED IDEOGRAPH + {0xE778, 0x8518}, //10577 #CJK UNIFIED IDEOGRAPH + {0xE779, 0x8520}, //10578 #CJK UNIFIED IDEOGRAPH + {0xE77A, 0x8530}, //10579 #CJK UNIFIED IDEOGRAPH + {0xE77B, 0x850B}, //10580 #CJK UNIFIED IDEOGRAPH + {0xE77C, 0x8519}, //10581 #CJK UNIFIED IDEOGRAPH + {0xE77D, 0x852F}, //10582 #CJK UNIFIED IDEOGRAPH + {0xE77E, 0x8662}, //10583 #CJK UNIFIED IDEOGRAPH + {0xE7A1, 0x8756}, //10584 #CJK UNIFIED IDEOGRAPH + {0xE7A2, 0x8763}, //10585 #CJK UNIFIED IDEOGRAPH + {0xE7A3, 0x8764}, //10586 #CJK UNIFIED IDEOGRAPH + {0xE7A4, 0x8777}, //10587 #CJK UNIFIED IDEOGRAPH + {0xE7A5, 0x87E1}, //10588 #CJK UNIFIED IDEOGRAPH + {0xE7A6, 0x8773}, //10589 #CJK UNIFIED IDEOGRAPH + {0xE7A7, 0x8758}, //10590 #CJK UNIFIED IDEOGRAPH + {0xE7A8, 0x8754}, //10591 #CJK UNIFIED IDEOGRAPH + {0xE7A9, 0x875B}, //10592 #CJK UNIFIED IDEOGRAPH + {0xE7AA, 0x8752}, //10593 #CJK UNIFIED IDEOGRAPH + {0xE7AB, 0x8761}, //10594 #CJK UNIFIED IDEOGRAPH + {0xE7AC, 0x875A}, //10595 #CJK UNIFIED IDEOGRAPH + {0xE7AD, 0x8751}, //10596 #CJK UNIFIED IDEOGRAPH + {0xE7AE, 0x875E}, //10597 #CJK UNIFIED IDEOGRAPH + {0xE7AF, 0x876D}, //10598 #CJK UNIFIED IDEOGRAPH + {0xE7B0, 0x876A}, //10599 #CJK UNIFIED IDEOGRAPH + {0xE7B1, 0x8750}, //10600 #CJK UNIFIED IDEOGRAPH + {0xE7B2, 0x874E}, //10601 #CJK UNIFIED IDEOGRAPH + {0xE7B3, 0x875F}, //10602 #CJK UNIFIED IDEOGRAPH + {0xE7B4, 0x875D}, //10603 #CJK UNIFIED IDEOGRAPH + {0xE7B5, 0x876F}, //10604 #CJK UNIFIED IDEOGRAPH + {0xE7B6, 0x876C}, //10605 #CJK UNIFIED IDEOGRAPH + {0xE7B7, 0x877A}, //10606 #CJK UNIFIED IDEOGRAPH + {0xE7B8, 0x876E}, //10607 #CJK UNIFIED IDEOGRAPH + {0xE7B9, 0x875C}, //10608 #CJK UNIFIED IDEOGRAPH + {0xE7BA, 0x8765}, //10609 #CJK UNIFIED IDEOGRAPH + {0xE7BB, 0x874F}, //10610 #CJK UNIFIED IDEOGRAPH + {0xE7BC, 0x877B}, //10611 #CJK UNIFIED IDEOGRAPH + {0xE7BD, 0x8775}, //10612 #CJK UNIFIED IDEOGRAPH + {0xE7BE, 0x8762}, //10613 #CJK UNIFIED IDEOGRAPH + {0xE7BF, 0x8767}, //10614 #CJK UNIFIED IDEOGRAPH + {0xE7C0, 0x8769}, //10615 #CJK UNIFIED IDEOGRAPH + {0xE7C1, 0x885A}, //10616 #CJK UNIFIED IDEOGRAPH + {0xE7C2, 0x8905}, //10617 #CJK UNIFIED IDEOGRAPH + {0xE7C3, 0x890C}, //10618 #CJK UNIFIED IDEOGRAPH + {0xE7C4, 0x8914}, //10619 #CJK UNIFIED IDEOGRAPH + {0xE7C5, 0x890B}, //10620 #CJK UNIFIED IDEOGRAPH + {0xE7C6, 0x8917}, //10621 #CJK UNIFIED IDEOGRAPH + {0xE7C7, 0x8918}, //10622 #CJK UNIFIED IDEOGRAPH + {0xE7C8, 0x8919}, //10623 #CJK UNIFIED IDEOGRAPH + {0xE7C9, 0x8906}, //10624 #CJK UNIFIED IDEOGRAPH + {0xE7CA, 0x8916}, //10625 #CJK UNIFIED IDEOGRAPH + {0xE7CB, 0x8911}, //10626 #CJK UNIFIED IDEOGRAPH + {0xE7CC, 0x890E}, //10627 #CJK UNIFIED IDEOGRAPH + {0xE7CD, 0x8909}, //10628 #CJK UNIFIED IDEOGRAPH + {0xE7CE, 0x89A2}, //10629 #CJK UNIFIED IDEOGRAPH + {0xE7CF, 0x89A4}, //10630 #CJK UNIFIED IDEOGRAPH + {0xE7D0, 0x89A3}, //10631 #CJK UNIFIED IDEOGRAPH + {0xE7D1, 0x89ED}, //10632 #CJK UNIFIED IDEOGRAPH + {0xE7D2, 0x89F0}, //10633 #CJK UNIFIED IDEOGRAPH + {0xE7D3, 0x89EC}, //10634 #CJK UNIFIED IDEOGRAPH + {0xE7D4, 0x8ACF}, //10635 #CJK UNIFIED IDEOGRAPH + {0xE7D5, 0x8AC6}, //10636 #CJK UNIFIED IDEOGRAPH + {0xE7D6, 0x8AB8}, //10637 #CJK UNIFIED IDEOGRAPH + {0xE7D7, 0x8AD3}, //10638 #CJK UNIFIED IDEOGRAPH + {0xE7D8, 0x8AD1}, //10639 #CJK UNIFIED IDEOGRAPH + {0xE7D9, 0x8AD4}, //10640 #CJK UNIFIED IDEOGRAPH + {0xE7DA, 0x8AD5}, //10641 #CJK UNIFIED IDEOGRAPH + {0xE7DB, 0x8ABB}, //10642 #CJK UNIFIED IDEOGRAPH + {0xE7DC, 0x8AD7}, //10643 #CJK UNIFIED IDEOGRAPH + {0xE7DD, 0x8ABE}, //10644 #CJK UNIFIED IDEOGRAPH + {0xE7DE, 0x8AC0}, //10645 #CJK UNIFIED IDEOGRAPH + {0xE7DF, 0x8AC5}, //10646 #CJK UNIFIED IDEOGRAPH + {0xE7E0, 0x8AD8}, //10647 #CJK UNIFIED IDEOGRAPH + {0xE7E1, 0x8AC3}, //10648 #CJK UNIFIED IDEOGRAPH + {0xE7E2, 0x8ABA}, //10649 #CJK UNIFIED IDEOGRAPH + {0xE7E3, 0x8ABD}, //10650 #CJK UNIFIED IDEOGRAPH + {0xE7E4, 0x8AD9}, //10651 #CJK UNIFIED IDEOGRAPH + {0xE7E5, 0x8C3E}, //10652 #CJK UNIFIED IDEOGRAPH + {0xE7E6, 0x8C4D}, //10653 #CJK UNIFIED IDEOGRAPH + {0xE7E7, 0x8C8F}, //10654 #CJK UNIFIED IDEOGRAPH + {0xE7E8, 0x8CE5}, //10655 #CJK UNIFIED IDEOGRAPH + {0xE7E9, 0x8CDF}, //10656 #CJK UNIFIED IDEOGRAPH + {0xE7EA, 0x8CD9}, //10657 #CJK UNIFIED IDEOGRAPH + {0xE7EB, 0x8CE8}, //10658 #CJK UNIFIED IDEOGRAPH + {0xE7EC, 0x8CDA}, //10659 #CJK UNIFIED IDEOGRAPH + {0xE7ED, 0x8CDD}, //10660 #CJK UNIFIED IDEOGRAPH + {0xE7EE, 0x8CE7}, //10661 #CJK UNIFIED IDEOGRAPH + {0xE7EF, 0x8DA0}, //10662 #CJK UNIFIED IDEOGRAPH + {0xE7F0, 0x8D9C}, //10663 #CJK UNIFIED IDEOGRAPH + {0xE7F1, 0x8DA1}, //10664 #CJK UNIFIED IDEOGRAPH + {0xE7F2, 0x8D9B}, //10665 #CJK UNIFIED IDEOGRAPH + {0xE7F3, 0x8E20}, //10666 #CJK UNIFIED IDEOGRAPH + {0xE7F4, 0x8E23}, //10667 #CJK UNIFIED IDEOGRAPH + {0xE7F5, 0x8E25}, //10668 #CJK UNIFIED IDEOGRAPH + {0xE7F6, 0x8E24}, //10669 #CJK UNIFIED IDEOGRAPH + {0xE7F7, 0x8E2E}, //10670 #CJK UNIFIED IDEOGRAPH + {0xE7F8, 0x8E15}, //10671 #CJK UNIFIED IDEOGRAPH + {0xE7F9, 0x8E1B}, //10672 #CJK UNIFIED IDEOGRAPH + {0xE7FA, 0x8E16}, //10673 #CJK UNIFIED IDEOGRAPH + {0xE7FB, 0x8E11}, //10674 #CJK UNIFIED IDEOGRAPH + {0xE7FC, 0x8E19}, //10675 #CJK UNIFIED IDEOGRAPH + {0xE7FD, 0x8E26}, //10676 #CJK UNIFIED IDEOGRAPH + {0xE7FE, 0x8E27}, //10677 #CJK UNIFIED IDEOGRAPH + {0xE840, 0x8E14}, //10678 #CJK UNIFIED IDEOGRAPH + {0xE841, 0x8E12}, //10679 #CJK UNIFIED IDEOGRAPH + {0xE842, 0x8E18}, //10680 #CJK UNIFIED IDEOGRAPH + {0xE843, 0x8E13}, //10681 #CJK UNIFIED IDEOGRAPH + {0xE844, 0x8E1C}, //10682 #CJK UNIFIED IDEOGRAPH + {0xE845, 0x8E17}, //10683 #CJK UNIFIED IDEOGRAPH + {0xE846, 0x8E1A}, //10684 #CJK UNIFIED IDEOGRAPH + {0xE847, 0x8F2C}, //10685 #CJK UNIFIED IDEOGRAPH + {0xE848, 0x8F24}, //10686 #CJK UNIFIED IDEOGRAPH + {0xE849, 0x8F18}, //10687 #CJK UNIFIED IDEOGRAPH + {0xE84A, 0x8F1A}, //10688 #CJK UNIFIED IDEOGRAPH + {0xE84B, 0x8F20}, //10689 #CJK UNIFIED IDEOGRAPH + {0xE84C, 0x8F23}, //10690 #CJK UNIFIED IDEOGRAPH + {0xE84D, 0x8F16}, //10691 #CJK UNIFIED IDEOGRAPH + {0xE84E, 0x8F17}, //10692 #CJK UNIFIED IDEOGRAPH + {0xE84F, 0x9073}, //10693 #CJK UNIFIED IDEOGRAPH + {0xE850, 0x9070}, //10694 #CJK UNIFIED IDEOGRAPH + {0xE851, 0x906F}, //10695 #CJK UNIFIED IDEOGRAPH + {0xE852, 0x9067}, //10696 #CJK UNIFIED IDEOGRAPH + {0xE853, 0x906B}, //10697 #CJK UNIFIED IDEOGRAPH + {0xE854, 0x912F}, //10698 #CJK UNIFIED IDEOGRAPH + {0xE855, 0x912B}, //10699 #CJK UNIFIED IDEOGRAPH + {0xE856, 0x9129}, //10700 #CJK UNIFIED IDEOGRAPH + {0xE857, 0x912A}, //10701 #CJK UNIFIED IDEOGRAPH + {0xE858, 0x9132}, //10702 #CJK UNIFIED IDEOGRAPH + {0xE859, 0x9126}, //10703 #CJK UNIFIED IDEOGRAPH + {0xE85A, 0x912E}, //10704 #CJK UNIFIED IDEOGRAPH + {0xE85B, 0x9185}, //10705 #CJK UNIFIED IDEOGRAPH + {0xE85C, 0x9186}, //10706 #CJK UNIFIED IDEOGRAPH + {0xE85D, 0x918A}, //10707 #CJK UNIFIED IDEOGRAPH + {0xE85E, 0x9181}, //10708 #CJK UNIFIED IDEOGRAPH + {0xE85F, 0x9182}, //10709 #CJK UNIFIED IDEOGRAPH + {0xE860, 0x9184}, //10710 #CJK UNIFIED IDEOGRAPH + {0xE861, 0x9180}, //10711 #CJK UNIFIED IDEOGRAPH + {0xE862, 0x92D0}, //10712 #CJK UNIFIED IDEOGRAPH + {0xE863, 0x92C3}, //10713 #CJK UNIFIED IDEOGRAPH + {0xE864, 0x92C4}, //10714 #CJK UNIFIED IDEOGRAPH + {0xE865, 0x92C0}, //10715 #CJK UNIFIED IDEOGRAPH + {0xE866, 0x92D9}, //10716 #CJK UNIFIED IDEOGRAPH + {0xE867, 0x92B6}, //10717 #CJK UNIFIED IDEOGRAPH + {0xE868, 0x92CF}, //10718 #CJK UNIFIED IDEOGRAPH + {0xE869, 0x92F1}, //10719 #CJK UNIFIED IDEOGRAPH + {0xE86A, 0x92DF}, //10720 #CJK UNIFIED IDEOGRAPH + {0xE86B, 0x92D8}, //10721 #CJK UNIFIED IDEOGRAPH + {0xE86C, 0x92E9}, //10722 #CJK UNIFIED IDEOGRAPH + {0xE86D, 0x92D7}, //10723 #CJK UNIFIED IDEOGRAPH + {0xE86E, 0x92DD}, //10724 #CJK UNIFIED IDEOGRAPH + {0xE86F, 0x92CC}, //10725 #CJK UNIFIED IDEOGRAPH + {0xE870, 0x92EF}, //10726 #CJK UNIFIED IDEOGRAPH + {0xE871, 0x92C2}, //10727 #CJK UNIFIED IDEOGRAPH + {0xE872, 0x92E8}, //10728 #CJK UNIFIED IDEOGRAPH + {0xE873, 0x92CA}, //10729 #CJK UNIFIED IDEOGRAPH + {0xE874, 0x92C8}, //10730 #CJK UNIFIED IDEOGRAPH + {0xE875, 0x92CE}, //10731 #CJK UNIFIED IDEOGRAPH + {0xE876, 0x92E6}, //10732 #CJK UNIFIED IDEOGRAPH + {0xE877, 0x92CD}, //10733 #CJK UNIFIED IDEOGRAPH + {0xE878, 0x92D5}, //10734 #CJK UNIFIED IDEOGRAPH + {0xE879, 0x92C9}, //10735 #CJK UNIFIED IDEOGRAPH + {0xE87A, 0x92E0}, //10736 #CJK UNIFIED IDEOGRAPH + {0xE87B, 0x92DE}, //10737 #CJK UNIFIED IDEOGRAPH + {0xE87C, 0x92E7}, //10738 #CJK UNIFIED IDEOGRAPH + {0xE87D, 0x92D1}, //10739 #CJK UNIFIED IDEOGRAPH + {0xE87E, 0x92D3}, //10740 #CJK UNIFIED IDEOGRAPH + {0xE8A1, 0x92B5}, //10741 #CJK UNIFIED IDEOGRAPH + {0xE8A2, 0x92E1}, //10742 #CJK UNIFIED IDEOGRAPH + {0xE8A3, 0x92C6}, //10743 #CJK UNIFIED IDEOGRAPH + {0xE8A4, 0x92B4}, //10744 #CJK UNIFIED IDEOGRAPH + {0xE8A5, 0x957C}, //10745 #CJK UNIFIED IDEOGRAPH + {0xE8A6, 0x95AC}, //10746 #CJK UNIFIED IDEOGRAPH + {0xE8A7, 0x95AB}, //10747 #CJK UNIFIED IDEOGRAPH + {0xE8A8, 0x95AE}, //10748 #CJK UNIFIED IDEOGRAPH + {0xE8A9, 0x95B0}, //10749 #CJK UNIFIED IDEOGRAPH + {0xE8AA, 0x96A4}, //10750 #CJK UNIFIED IDEOGRAPH + {0xE8AB, 0x96A2}, //10751 #CJK UNIFIED IDEOGRAPH + {0xE8AC, 0x96D3}, //10752 #CJK UNIFIED IDEOGRAPH + {0xE8AD, 0x9705}, //10753 #CJK UNIFIED IDEOGRAPH + {0xE8AE, 0x9708}, //10754 #CJK UNIFIED IDEOGRAPH + {0xE8AF, 0x9702}, //10755 #CJK UNIFIED IDEOGRAPH + {0xE8B0, 0x975A}, //10756 #CJK UNIFIED IDEOGRAPH + {0xE8B1, 0x978A}, //10757 #CJK UNIFIED IDEOGRAPH + {0xE8B2, 0x978E}, //10758 #CJK UNIFIED IDEOGRAPH + {0xE8B3, 0x9788}, //10759 #CJK UNIFIED IDEOGRAPH + {0xE8B4, 0x97D0}, //10760 #CJK UNIFIED IDEOGRAPH + {0xE8B5, 0x97CF}, //10761 #CJK UNIFIED IDEOGRAPH + {0xE8B6, 0x981E}, //10762 #CJK UNIFIED IDEOGRAPH + {0xE8B7, 0x981D}, //10763 #CJK UNIFIED IDEOGRAPH + {0xE8B8, 0x9826}, //10764 #CJK UNIFIED IDEOGRAPH + {0xE8B9, 0x9829}, //10765 #CJK UNIFIED IDEOGRAPH + {0xE8BA, 0x9828}, //10766 #CJK UNIFIED IDEOGRAPH + {0xE8BB, 0x9820}, //10767 #CJK UNIFIED IDEOGRAPH + {0xE8BC, 0x981B}, //10768 #CJK UNIFIED IDEOGRAPH + {0xE8BD, 0x9827}, //10769 #CJK UNIFIED IDEOGRAPH + {0xE8BE, 0x98B2}, //10770 #CJK UNIFIED IDEOGRAPH + {0xE8BF, 0x9908}, //10771 #CJK UNIFIED IDEOGRAPH + {0xE8C0, 0x98FA}, //10772 #CJK UNIFIED IDEOGRAPH + {0xE8C1, 0x9911}, //10773 #CJK UNIFIED IDEOGRAPH + {0xE8C2, 0x9914}, //10774 #CJK UNIFIED IDEOGRAPH + {0xE8C3, 0x9916}, //10775 #CJK UNIFIED IDEOGRAPH + {0xE8C4, 0x9917}, //10776 #CJK UNIFIED IDEOGRAPH + {0xE8C5, 0x9915}, //10777 #CJK UNIFIED IDEOGRAPH + {0xE8C6, 0x99DC}, //10778 #CJK UNIFIED IDEOGRAPH + {0xE8C7, 0x99CD}, //10779 #CJK UNIFIED IDEOGRAPH + {0xE8C8, 0x99CF}, //10780 #CJK UNIFIED IDEOGRAPH + {0xE8C9, 0x99D3}, //10781 #CJK UNIFIED IDEOGRAPH + {0xE8CA, 0x99D4}, //10782 #CJK UNIFIED IDEOGRAPH + {0xE8CB, 0x99CE}, //10783 #CJK UNIFIED IDEOGRAPH + {0xE8CC, 0x99C9}, //10784 #CJK UNIFIED IDEOGRAPH + {0xE8CD, 0x99D6}, //10785 #CJK UNIFIED IDEOGRAPH + {0xE8CE, 0x99D8}, //10786 #CJK UNIFIED IDEOGRAPH + {0xE8CF, 0x99CB}, //10787 #CJK UNIFIED IDEOGRAPH + {0xE8D0, 0x99D7}, //10788 #CJK UNIFIED IDEOGRAPH + {0xE8D1, 0x99CC}, //10789 #CJK UNIFIED IDEOGRAPH + {0xE8D2, 0x9AB3}, //10790 #CJK UNIFIED IDEOGRAPH + {0xE8D3, 0x9AEC}, //10791 #CJK UNIFIED IDEOGRAPH + {0xE8D4, 0x9AEB}, //10792 #CJK UNIFIED IDEOGRAPH + {0xE8D5, 0x9AF3}, //10793 #CJK UNIFIED IDEOGRAPH + {0xE8D6, 0x9AF2}, //10794 #CJK UNIFIED IDEOGRAPH + {0xE8D7, 0x9AF1}, //10795 #CJK UNIFIED IDEOGRAPH + {0xE8D8, 0x9B46}, //10796 #CJK UNIFIED IDEOGRAPH + {0xE8D9, 0x9B43}, //10797 #CJK UNIFIED IDEOGRAPH + {0xE8DA, 0x9B67}, //10798 #CJK UNIFIED IDEOGRAPH + {0xE8DB, 0x9B74}, //10799 #CJK UNIFIED IDEOGRAPH + {0xE8DC, 0x9B71}, //10800 #CJK UNIFIED IDEOGRAPH + {0xE8DD, 0x9B66}, //10801 #CJK UNIFIED IDEOGRAPH + {0xE8DE, 0x9B76}, //10802 #CJK UNIFIED IDEOGRAPH + {0xE8DF, 0x9B75}, //10803 #CJK UNIFIED IDEOGRAPH + {0xE8E0, 0x9B70}, //10804 #CJK UNIFIED IDEOGRAPH + {0xE8E1, 0x9B68}, //10805 #CJK UNIFIED IDEOGRAPH + {0xE8E2, 0x9B64}, //10806 #CJK UNIFIED IDEOGRAPH + {0xE8E3, 0x9B6C}, //10807 #CJK UNIFIED IDEOGRAPH + {0xE8E4, 0x9CFC}, //10808 #CJK UNIFIED IDEOGRAPH + {0xE8E5, 0x9CFA}, //10809 #CJK UNIFIED IDEOGRAPH + {0xE8E6, 0x9CFD}, //10810 #CJK UNIFIED IDEOGRAPH + {0xE8E7, 0x9CFF}, //10811 #CJK UNIFIED IDEOGRAPH + {0xE8E8, 0x9CF7}, //10812 #CJK UNIFIED IDEOGRAPH + {0xE8E9, 0x9D07}, //10813 #CJK UNIFIED IDEOGRAPH + {0xE8EA, 0x9D00}, //10814 #CJK UNIFIED IDEOGRAPH + {0xE8EB, 0x9CF9}, //10815 #CJK UNIFIED IDEOGRAPH + {0xE8EC, 0x9CFB}, //10816 #CJK UNIFIED IDEOGRAPH + {0xE8ED, 0x9D08}, //10817 #CJK UNIFIED IDEOGRAPH + {0xE8EE, 0x9D05}, //10818 #CJK UNIFIED IDEOGRAPH + {0xE8EF, 0x9D04}, //10819 #CJK UNIFIED IDEOGRAPH + {0xE8F0, 0x9E83}, //10820 #CJK UNIFIED IDEOGRAPH + {0xE8F1, 0x9ED3}, //10821 #CJK UNIFIED IDEOGRAPH + {0xE8F2, 0x9F0F}, //10822 #CJK UNIFIED IDEOGRAPH + {0xE8F3, 0x9F10}, //10823 #CJK UNIFIED IDEOGRAPH + {0xE8F4, 0x511C}, //10824 #CJK UNIFIED IDEOGRAPH + {0xE8F5, 0x5113}, //10825 #CJK UNIFIED IDEOGRAPH + {0xE8F6, 0x5117}, //10826 #CJK UNIFIED IDEOGRAPH + {0xE8F7, 0x511A}, //10827 #CJK UNIFIED IDEOGRAPH + {0xE8F8, 0x5111}, //10828 #CJK UNIFIED IDEOGRAPH + {0xE8F9, 0x51DE}, //10829 #CJK UNIFIED IDEOGRAPH + {0xE8FA, 0x5334}, //10830 #CJK UNIFIED IDEOGRAPH + {0xE8FB, 0x53E1}, //10831 #CJK UNIFIED IDEOGRAPH + {0xE8FC, 0x5670}, //10832 #CJK UNIFIED IDEOGRAPH + {0xE8FD, 0x5660}, //10833 #CJK UNIFIED IDEOGRAPH + {0xE8FE, 0x566E}, //10834 #CJK UNIFIED IDEOGRAPH + {0xE940, 0x5673}, //10835 #CJK UNIFIED IDEOGRAPH + {0xE941, 0x5666}, //10836 #CJK UNIFIED IDEOGRAPH + {0xE942, 0x5663}, //10837 #CJK UNIFIED IDEOGRAPH + {0xE943, 0x566D}, //10838 #CJK UNIFIED IDEOGRAPH + {0xE944, 0x5672}, //10839 #CJK UNIFIED IDEOGRAPH + {0xE945, 0x565E}, //10840 #CJK UNIFIED IDEOGRAPH + {0xE946, 0x5677}, //10841 #CJK UNIFIED IDEOGRAPH + {0xE947, 0x571C}, //10842 #CJK UNIFIED IDEOGRAPH + {0xE948, 0x571B}, //10843 #CJK UNIFIED IDEOGRAPH + {0xE949, 0x58C8}, //10844 #CJK UNIFIED IDEOGRAPH + {0xE94A, 0x58BD}, //10845 #CJK UNIFIED IDEOGRAPH + {0xE94B, 0x58C9}, //10846 #CJK UNIFIED IDEOGRAPH + {0xE94C, 0x58BF}, //10847 #CJK UNIFIED IDEOGRAPH + {0xE94D, 0x58BA}, //10848 #CJK UNIFIED IDEOGRAPH + {0xE94E, 0x58C2}, //10849 #CJK UNIFIED IDEOGRAPH + {0xE94F, 0x58BC}, //10850 #CJK UNIFIED IDEOGRAPH + {0xE950, 0x58C6}, //10851 #CJK UNIFIED IDEOGRAPH + {0xE951, 0x5B17}, //10852 #CJK UNIFIED IDEOGRAPH + {0xE952, 0x5B19}, //10853 #CJK UNIFIED IDEOGRAPH + {0xE953, 0x5B1B}, //10854 #CJK UNIFIED IDEOGRAPH + {0xE954, 0x5B21}, //10855 #CJK UNIFIED IDEOGRAPH + {0xE955, 0x5B14}, //10856 #CJK UNIFIED IDEOGRAPH + {0xE956, 0x5B13}, //10857 #CJK UNIFIED IDEOGRAPH + {0xE957, 0x5B10}, //10858 #CJK UNIFIED IDEOGRAPH + {0xE958, 0x5B16}, //10859 #CJK UNIFIED IDEOGRAPH + {0xE959, 0x5B28}, //10860 #CJK UNIFIED IDEOGRAPH + {0xE95A, 0x5B1A}, //10861 #CJK UNIFIED IDEOGRAPH + {0xE95B, 0x5B20}, //10862 #CJK UNIFIED IDEOGRAPH + {0xE95C, 0x5B1E}, //10863 #CJK UNIFIED IDEOGRAPH + {0xE95D, 0x5BEF}, //10864 #CJK UNIFIED IDEOGRAPH + {0xE95E, 0x5DAC}, //10865 #CJK UNIFIED IDEOGRAPH + {0xE95F, 0x5DB1}, //10866 #CJK UNIFIED IDEOGRAPH + {0xE960, 0x5DA9}, //10867 #CJK UNIFIED IDEOGRAPH + {0xE961, 0x5DA7}, //10868 #CJK UNIFIED IDEOGRAPH + {0xE962, 0x5DB5}, //10869 #CJK UNIFIED IDEOGRAPH + {0xE963, 0x5DB0}, //10870 #CJK UNIFIED IDEOGRAPH + {0xE964, 0x5DAE}, //10871 #CJK UNIFIED IDEOGRAPH + {0xE965, 0x5DAA}, //10872 #CJK UNIFIED IDEOGRAPH + {0xE966, 0x5DA8}, //10873 #CJK UNIFIED IDEOGRAPH + {0xE967, 0x5DB2}, //10874 #CJK UNIFIED IDEOGRAPH + {0xE968, 0x5DAD}, //10875 #CJK UNIFIED IDEOGRAPH + {0xE969, 0x5DAF}, //10876 #CJK UNIFIED IDEOGRAPH + {0xE96A, 0x5DB4}, //10877 #CJK UNIFIED IDEOGRAPH + {0xE96B, 0x5E67}, //10878 #CJK UNIFIED IDEOGRAPH + {0xE96C, 0x5E68}, //10879 #CJK UNIFIED IDEOGRAPH + {0xE96D, 0x5E66}, //10880 #CJK UNIFIED IDEOGRAPH + {0xE96E, 0x5E6F}, //10881 #CJK UNIFIED IDEOGRAPH + {0xE96F, 0x5EE9}, //10882 #CJK UNIFIED IDEOGRAPH + {0xE970, 0x5EE7}, //10883 #CJK UNIFIED IDEOGRAPH + {0xE971, 0x5EE6}, //10884 #CJK UNIFIED IDEOGRAPH + {0xE972, 0x5EE8}, //10885 #CJK UNIFIED IDEOGRAPH + {0xE973, 0x5EE5}, //10886 #CJK UNIFIED IDEOGRAPH + {0xE974, 0x5F4B}, //10887 #CJK UNIFIED IDEOGRAPH + {0xE975, 0x5FBC}, //10888 #CJK UNIFIED IDEOGRAPH + {0xE976, 0x619D}, //10889 #CJK UNIFIED IDEOGRAPH + {0xE977, 0x61A8}, //10890 #CJK UNIFIED IDEOGRAPH + {0xE978, 0x6196}, //10891 #CJK UNIFIED IDEOGRAPH + {0xE979, 0x61C5}, //10892 #CJK UNIFIED IDEOGRAPH + {0xE97A, 0x61B4}, //10893 #CJK UNIFIED IDEOGRAPH + {0xE97B, 0x61C6}, //10894 #CJK UNIFIED IDEOGRAPH + {0xE97C, 0x61C1}, //10895 #CJK UNIFIED IDEOGRAPH + {0xE97D, 0x61CC}, //10896 #CJK UNIFIED IDEOGRAPH + {0xE97E, 0x61BA}, //10897 #CJK UNIFIED IDEOGRAPH + {0xE9A1, 0x61BF}, //10898 #CJK UNIFIED IDEOGRAPH + {0xE9A2, 0x61B8}, //10899 #CJK UNIFIED IDEOGRAPH + {0xE9A3, 0x618C}, //10900 #CJK UNIFIED IDEOGRAPH + {0xE9A4, 0x64D7}, //10901 #CJK UNIFIED IDEOGRAPH + {0xE9A5, 0x64D6}, //10902 #CJK UNIFIED IDEOGRAPH + {0xE9A6, 0x64D0}, //10903 #CJK UNIFIED IDEOGRAPH + {0xE9A7, 0x64CF}, //10904 #CJK UNIFIED IDEOGRAPH + {0xE9A8, 0x64C9}, //10905 #CJK UNIFIED IDEOGRAPH + {0xE9A9, 0x64BD}, //10906 #CJK UNIFIED IDEOGRAPH + {0xE9AA, 0x6489}, //10907 #CJK UNIFIED IDEOGRAPH + {0xE9AB, 0x64C3}, //10908 #CJK UNIFIED IDEOGRAPH + {0xE9AC, 0x64DB}, //10909 #CJK UNIFIED IDEOGRAPH + {0xE9AD, 0x64F3}, //10910 #CJK UNIFIED IDEOGRAPH + {0xE9AE, 0x64D9}, //10911 #CJK UNIFIED IDEOGRAPH + {0xE9AF, 0x6533}, //10912 #CJK UNIFIED IDEOGRAPH + {0xE9B0, 0x657F}, //10913 #CJK UNIFIED IDEOGRAPH + {0xE9B1, 0x657C}, //10914 #CJK UNIFIED IDEOGRAPH + {0xE9B2, 0x65A2}, //10915 #CJK UNIFIED IDEOGRAPH + {0xE9B3, 0x66C8}, //10916 #CJK UNIFIED IDEOGRAPH + {0xE9B4, 0x66BE}, //10917 #CJK UNIFIED IDEOGRAPH + {0xE9B5, 0x66C0}, //10918 #CJK UNIFIED IDEOGRAPH + {0xE9B6, 0x66CA}, //10919 #CJK UNIFIED IDEOGRAPH + {0xE9B7, 0x66CB}, //10920 #CJK UNIFIED IDEOGRAPH + {0xE9B8, 0x66CF}, //10921 #CJK UNIFIED IDEOGRAPH + {0xE9B9, 0x66BD}, //10922 #CJK UNIFIED IDEOGRAPH + {0xE9BA, 0x66BB}, //10923 #CJK UNIFIED IDEOGRAPH + {0xE9BB, 0x66BA}, //10924 #CJK UNIFIED IDEOGRAPH + {0xE9BC, 0x66CC}, //10925 #CJK UNIFIED IDEOGRAPH + {0xE9BD, 0x6723}, //10926 #CJK UNIFIED IDEOGRAPH + {0xE9BE, 0x6A34}, //10927 #CJK UNIFIED IDEOGRAPH + {0xE9BF, 0x6A66}, //10928 #CJK UNIFIED IDEOGRAPH + {0xE9C0, 0x6A49}, //10929 #CJK UNIFIED IDEOGRAPH + {0xE9C1, 0x6A67}, //10930 #CJK UNIFIED IDEOGRAPH + {0xE9C2, 0x6A32}, //10931 #CJK UNIFIED IDEOGRAPH + {0xE9C3, 0x6A68}, //10932 #CJK UNIFIED IDEOGRAPH + {0xE9C4, 0x6A3E}, //10933 #CJK UNIFIED IDEOGRAPH + {0xE9C5, 0x6A5D}, //10934 #CJK UNIFIED IDEOGRAPH + {0xE9C6, 0x6A6D}, //10935 #CJK UNIFIED IDEOGRAPH + {0xE9C7, 0x6A76}, //10936 #CJK UNIFIED IDEOGRAPH + {0xE9C8, 0x6A5B}, //10937 #CJK UNIFIED IDEOGRAPH + {0xE9C9, 0x6A51}, //10938 #CJK UNIFIED IDEOGRAPH + {0xE9CA, 0x6A28}, //10939 #CJK UNIFIED IDEOGRAPH + {0xE9CB, 0x6A5A}, //10940 #CJK UNIFIED IDEOGRAPH + {0xE9CC, 0x6A3B}, //10941 #CJK UNIFIED IDEOGRAPH + {0xE9CD, 0x6A3F}, //10942 #CJK UNIFIED IDEOGRAPH + {0xE9CE, 0x6A41}, //10943 #CJK UNIFIED IDEOGRAPH + {0xE9CF, 0x6A6A}, //10944 #CJK UNIFIED IDEOGRAPH + {0xE9D0, 0x6A64}, //10945 #CJK UNIFIED IDEOGRAPH + {0xE9D1, 0x6A50}, //10946 #CJK UNIFIED IDEOGRAPH + {0xE9D2, 0x6A4F}, //10947 #CJK UNIFIED IDEOGRAPH + {0xE9D3, 0x6A54}, //10948 #CJK UNIFIED IDEOGRAPH + {0xE9D4, 0x6A6F}, //10949 #CJK UNIFIED IDEOGRAPH + {0xE9D5, 0x6A69}, //10950 #CJK UNIFIED IDEOGRAPH + {0xE9D6, 0x6A60}, //10951 #CJK UNIFIED IDEOGRAPH + {0xE9D7, 0x6A3C}, //10952 #CJK UNIFIED IDEOGRAPH + {0xE9D8, 0x6A5E}, //10953 #CJK UNIFIED IDEOGRAPH + {0xE9D9, 0x6A56}, //10954 #CJK UNIFIED IDEOGRAPH + {0xE9DA, 0x6A55}, //10955 #CJK UNIFIED IDEOGRAPH + {0xE9DB, 0x6A4D}, //10956 #CJK UNIFIED IDEOGRAPH + {0xE9DC, 0x6A4E}, //10957 #CJK UNIFIED IDEOGRAPH + {0xE9DD, 0x6A46}, //10958 #CJK UNIFIED IDEOGRAPH + {0xE9DE, 0x6B55}, //10959 #CJK UNIFIED IDEOGRAPH + {0xE9DF, 0x6B54}, //10960 #CJK UNIFIED IDEOGRAPH + {0xE9E0, 0x6B56}, //10961 #CJK UNIFIED IDEOGRAPH + {0xE9E1, 0x6BA7}, //10962 #CJK UNIFIED IDEOGRAPH + {0xE9E2, 0x6BAA}, //10963 #CJK UNIFIED IDEOGRAPH + {0xE9E3, 0x6BAB}, //10964 #CJK UNIFIED IDEOGRAPH + {0xE9E4, 0x6BC8}, //10965 #CJK UNIFIED IDEOGRAPH + {0xE9E5, 0x6BC7}, //10966 #CJK UNIFIED IDEOGRAPH + {0xE9E6, 0x6C04}, //10967 #CJK UNIFIED IDEOGRAPH + {0xE9E7, 0x6C03}, //10968 #CJK UNIFIED IDEOGRAPH + {0xE9E8, 0x6C06}, //10969 #CJK UNIFIED IDEOGRAPH + {0xE9E9, 0x6FAD}, //10970 #CJK UNIFIED IDEOGRAPH + {0xE9EA, 0x6FCB}, //10971 #CJK UNIFIED IDEOGRAPH + {0xE9EB, 0x6FA3}, //10972 #CJK UNIFIED IDEOGRAPH + {0xE9EC, 0x6FC7}, //10973 #CJK UNIFIED IDEOGRAPH + {0xE9ED, 0x6FBC}, //10974 #CJK UNIFIED IDEOGRAPH + {0xE9EE, 0x6FCE}, //10975 #CJK UNIFIED IDEOGRAPH + {0xE9EF, 0x6FC8}, //10976 #CJK UNIFIED IDEOGRAPH + {0xE9F0, 0x6F5E}, //10977 #CJK UNIFIED IDEOGRAPH + {0xE9F1, 0x6FC4}, //10978 #CJK UNIFIED IDEOGRAPH + {0xE9F2, 0x6FBD}, //10979 #CJK UNIFIED IDEOGRAPH + {0xE9F3, 0x6F9E}, //10980 #CJK UNIFIED IDEOGRAPH + {0xE9F4, 0x6FCA}, //10981 #CJK UNIFIED IDEOGRAPH + {0xE9F5, 0x6FA8}, //10982 #CJK UNIFIED IDEOGRAPH + {0xE9F6, 0x7004}, //10983 #CJK UNIFIED IDEOGRAPH + {0xE9F7, 0x6FA5}, //10984 #CJK UNIFIED IDEOGRAPH + {0xE9F8, 0x6FAE}, //10985 #CJK UNIFIED IDEOGRAPH + {0xE9F9, 0x6FBA}, //10986 #CJK UNIFIED IDEOGRAPH + {0xE9FA, 0x6FAC}, //10987 #CJK UNIFIED IDEOGRAPH + {0xE9FB, 0x6FAA}, //10988 #CJK UNIFIED IDEOGRAPH + {0xE9FC, 0x6FCF}, //10989 #CJK UNIFIED IDEOGRAPH + {0xE9FD, 0x6FBF}, //10990 #CJK UNIFIED IDEOGRAPH + {0xE9FE, 0x6FB8}, //10991 #CJK UNIFIED IDEOGRAPH + {0xEA40, 0x6FA2}, //10992 #CJK UNIFIED IDEOGRAPH + {0xEA41, 0x6FC9}, //10993 #CJK UNIFIED IDEOGRAPH + {0xEA42, 0x6FAB}, //10994 #CJK UNIFIED IDEOGRAPH + {0xEA43, 0x6FCD}, //10995 #CJK UNIFIED IDEOGRAPH + {0xEA44, 0x6FAF}, //10996 #CJK UNIFIED IDEOGRAPH + {0xEA45, 0x6FB2}, //10997 #CJK UNIFIED IDEOGRAPH + {0xEA46, 0x6FB0}, //10998 #CJK UNIFIED IDEOGRAPH + {0xEA47, 0x71C5}, //10999 #CJK UNIFIED IDEOGRAPH + {0xEA48, 0x71C2}, //11000 #CJK UNIFIED IDEOGRAPH + {0xEA49, 0x71BF}, //11001 #CJK UNIFIED IDEOGRAPH + {0xEA4A, 0x71B8}, //11002 #CJK UNIFIED IDEOGRAPH + {0xEA4B, 0x71D6}, //11003 #CJK UNIFIED IDEOGRAPH + {0xEA4C, 0x71C0}, //11004 #CJK UNIFIED IDEOGRAPH + {0xEA4D, 0x71C1}, //11005 #CJK UNIFIED IDEOGRAPH + {0xEA4E, 0x71CB}, //11006 #CJK UNIFIED IDEOGRAPH + {0xEA4F, 0x71D4}, //11007 #CJK UNIFIED IDEOGRAPH + {0xEA50, 0x71CA}, //11008 #CJK UNIFIED IDEOGRAPH + {0xEA51, 0x71C7}, //11009 #CJK UNIFIED IDEOGRAPH + {0xEA52, 0x71CF}, //11010 #CJK UNIFIED IDEOGRAPH + {0xEA53, 0x71BD}, //11011 #CJK UNIFIED IDEOGRAPH + {0xEA54, 0x71D8}, //11012 #CJK UNIFIED IDEOGRAPH + {0xEA55, 0x71BC}, //11013 #CJK UNIFIED IDEOGRAPH + {0xEA56, 0x71C6}, //11014 #CJK UNIFIED IDEOGRAPH + {0xEA57, 0x71DA}, //11015 #CJK UNIFIED IDEOGRAPH + {0xEA58, 0x71DB}, //11016 #CJK UNIFIED IDEOGRAPH + {0xEA59, 0x729D}, //11017 #CJK UNIFIED IDEOGRAPH + {0xEA5A, 0x729E}, //11018 #CJK UNIFIED IDEOGRAPH + {0xEA5B, 0x7369}, //11019 #CJK UNIFIED IDEOGRAPH + {0xEA5C, 0x7366}, //11020 #CJK UNIFIED IDEOGRAPH + {0xEA5D, 0x7367}, //11021 #CJK UNIFIED IDEOGRAPH + {0xEA5E, 0x736C}, //11022 #CJK UNIFIED IDEOGRAPH + {0xEA5F, 0x7365}, //11023 #CJK UNIFIED IDEOGRAPH + {0xEA60, 0x736B}, //11024 #CJK UNIFIED IDEOGRAPH + {0xEA61, 0x736A}, //11025 #CJK UNIFIED IDEOGRAPH + {0xEA62, 0x747F}, //11026 #CJK UNIFIED IDEOGRAPH + {0xEA63, 0x749A}, //11027 #CJK UNIFIED IDEOGRAPH + {0xEA64, 0x74A0}, //11028 #CJK UNIFIED IDEOGRAPH + {0xEA65, 0x7494}, //11029 #CJK UNIFIED IDEOGRAPH + {0xEA66, 0x7492}, //11030 #CJK UNIFIED IDEOGRAPH + {0xEA67, 0x7495}, //11031 #CJK UNIFIED IDEOGRAPH + {0xEA68, 0x74A1}, //11032 #CJK UNIFIED IDEOGRAPH + {0xEA69, 0x750B}, //11033 #CJK UNIFIED IDEOGRAPH + {0xEA6A, 0x7580}, //11034 #CJK UNIFIED IDEOGRAPH + {0xEA6B, 0x762F}, //11035 #CJK UNIFIED IDEOGRAPH + {0xEA6C, 0x762D}, //11036 #CJK UNIFIED IDEOGRAPH + {0xEA6D, 0x7631}, //11037 #CJK UNIFIED IDEOGRAPH + {0xEA6E, 0x763D}, //11038 #CJK UNIFIED IDEOGRAPH + {0xEA6F, 0x7633}, //11039 #CJK UNIFIED IDEOGRAPH + {0xEA70, 0x763C}, //11040 #CJK UNIFIED IDEOGRAPH + {0xEA71, 0x7635}, //11041 #CJK UNIFIED IDEOGRAPH + {0xEA72, 0x7632}, //11042 #CJK UNIFIED IDEOGRAPH + {0xEA73, 0x7630}, //11043 #CJK UNIFIED IDEOGRAPH + {0xEA74, 0x76BB}, //11044 #CJK UNIFIED IDEOGRAPH + {0xEA75, 0x76E6}, //11045 #CJK UNIFIED IDEOGRAPH + {0xEA76, 0x779A}, //11046 #CJK UNIFIED IDEOGRAPH + {0xEA77, 0x779D}, //11047 #CJK UNIFIED IDEOGRAPH + {0xEA78, 0x77A1}, //11048 #CJK UNIFIED IDEOGRAPH + {0xEA79, 0x779C}, //11049 #CJK UNIFIED IDEOGRAPH + {0xEA7A, 0x779B}, //11050 #CJK UNIFIED IDEOGRAPH + {0xEA7B, 0x77A2}, //11051 #CJK UNIFIED IDEOGRAPH + {0xEA7C, 0x77A3}, //11052 #CJK UNIFIED IDEOGRAPH + {0xEA7D, 0x7795}, //11053 #CJK UNIFIED IDEOGRAPH + {0xEA7E, 0x7799}, //11054 #CJK UNIFIED IDEOGRAPH + {0xEAA1, 0x7797}, //11055 #CJK UNIFIED IDEOGRAPH + {0xEAA2, 0x78DD}, //11056 #CJK UNIFIED IDEOGRAPH + {0xEAA3, 0x78E9}, //11057 #CJK UNIFIED IDEOGRAPH + {0xEAA4, 0x78E5}, //11058 #CJK UNIFIED IDEOGRAPH + {0xEAA5, 0x78EA}, //11059 #CJK UNIFIED IDEOGRAPH + {0xEAA6, 0x78DE}, //11060 #CJK UNIFIED IDEOGRAPH + {0xEAA7, 0x78E3}, //11061 #CJK UNIFIED IDEOGRAPH + {0xEAA8, 0x78DB}, //11062 #CJK UNIFIED IDEOGRAPH + {0xEAA9, 0x78E1}, //11063 #CJK UNIFIED IDEOGRAPH + {0xEAAA, 0x78E2}, //11064 #CJK UNIFIED IDEOGRAPH + {0xEAAB, 0x78ED}, //11065 #CJK UNIFIED IDEOGRAPH + {0xEAAC, 0x78DF}, //11066 #CJK UNIFIED IDEOGRAPH + {0xEAAD, 0x78E0}, //11067 #CJK UNIFIED IDEOGRAPH + {0xEAAE, 0x79A4}, //11068 #CJK UNIFIED IDEOGRAPH + {0xEAAF, 0x7A44}, //11069 #CJK UNIFIED IDEOGRAPH + {0xEAB0, 0x7A48}, //11070 #CJK UNIFIED IDEOGRAPH + {0xEAB1, 0x7A47}, //11071 #CJK UNIFIED IDEOGRAPH + {0xEAB2, 0x7AB6}, //11072 #CJK UNIFIED IDEOGRAPH + {0xEAB3, 0x7AB8}, //11073 #CJK UNIFIED IDEOGRAPH + {0xEAB4, 0x7AB5}, //11074 #CJK UNIFIED IDEOGRAPH + {0xEAB5, 0x7AB1}, //11075 #CJK UNIFIED IDEOGRAPH + {0xEAB6, 0x7AB7}, //11076 #CJK UNIFIED IDEOGRAPH + {0xEAB7, 0x7BDE}, //11077 #CJK UNIFIED IDEOGRAPH + {0xEAB8, 0x7BE3}, //11078 #CJK UNIFIED IDEOGRAPH + {0xEAB9, 0x7BE7}, //11079 #CJK UNIFIED IDEOGRAPH + {0xEABA, 0x7BDD}, //11080 #CJK UNIFIED IDEOGRAPH + {0xEABB, 0x7BD5}, //11081 #CJK UNIFIED IDEOGRAPH + {0xEABC, 0x7BE5}, //11082 #CJK UNIFIED IDEOGRAPH + {0xEABD, 0x7BDA}, //11083 #CJK UNIFIED IDEOGRAPH + {0xEABE, 0x7BE8}, //11084 #CJK UNIFIED IDEOGRAPH + {0xEABF, 0x7BF9}, //11085 #CJK UNIFIED IDEOGRAPH + {0xEAC0, 0x7BD4}, //11086 #CJK UNIFIED IDEOGRAPH + {0xEAC1, 0x7BEA}, //11087 #CJK UNIFIED IDEOGRAPH + {0xEAC2, 0x7BE2}, //11088 #CJK UNIFIED IDEOGRAPH + {0xEAC3, 0x7BDC}, //11089 #CJK UNIFIED IDEOGRAPH + {0xEAC4, 0x7BEB}, //11090 #CJK UNIFIED IDEOGRAPH + {0xEAC5, 0x7BD8}, //11091 #CJK UNIFIED IDEOGRAPH + {0xEAC6, 0x7BDF}, //11092 #CJK UNIFIED IDEOGRAPH + {0xEAC7, 0x7CD2}, //11093 #CJK UNIFIED IDEOGRAPH + {0xEAC8, 0x7CD4}, //11094 #CJK UNIFIED IDEOGRAPH + {0xEAC9, 0x7CD7}, //11095 #CJK UNIFIED IDEOGRAPH + {0xEACA, 0x7CD0}, //11096 #CJK UNIFIED IDEOGRAPH + {0xEACB, 0x7CD1}, //11097 #CJK UNIFIED IDEOGRAPH + {0xEACC, 0x7E12}, //11098 #CJK UNIFIED IDEOGRAPH + {0xEACD, 0x7E21}, //11099 #CJK UNIFIED IDEOGRAPH + {0xEACE, 0x7E17}, //11100 #CJK UNIFIED IDEOGRAPH + {0xEACF, 0x7E0C}, //11101 #CJK UNIFIED IDEOGRAPH + {0xEAD0, 0x7E1F}, //11102 #CJK UNIFIED IDEOGRAPH + {0xEAD1, 0x7E20}, //11103 #CJK UNIFIED IDEOGRAPH + {0xEAD2, 0x7E13}, //11104 #CJK UNIFIED IDEOGRAPH + {0xEAD3, 0x7E0E}, //11105 #CJK UNIFIED IDEOGRAPH + {0xEAD4, 0x7E1C}, //11106 #CJK UNIFIED IDEOGRAPH + {0xEAD5, 0x7E15}, //11107 #CJK UNIFIED IDEOGRAPH + {0xEAD6, 0x7E1A}, //11108 #CJK UNIFIED IDEOGRAPH + {0xEAD7, 0x7E22}, //11109 #CJK UNIFIED IDEOGRAPH + {0xEAD8, 0x7E0B}, //11110 #CJK UNIFIED IDEOGRAPH + {0xEAD9, 0x7E0F}, //11111 #CJK UNIFIED IDEOGRAPH + {0xEADA, 0x7E16}, //11112 #CJK UNIFIED IDEOGRAPH + {0xEADB, 0x7E0D}, //11113 #CJK UNIFIED IDEOGRAPH + {0xEADC, 0x7E14}, //11114 #CJK UNIFIED IDEOGRAPH + {0xEADD, 0x7E25}, //11115 #CJK UNIFIED IDEOGRAPH + {0xEADE, 0x7E24}, //11116 #CJK UNIFIED IDEOGRAPH + {0xEADF, 0x7F43}, //11117 #CJK UNIFIED IDEOGRAPH + {0xEAE0, 0x7F7B}, //11118 #CJK UNIFIED IDEOGRAPH + {0xEAE1, 0x7F7C}, //11119 #CJK UNIFIED IDEOGRAPH + {0xEAE2, 0x7F7A}, //11120 #CJK UNIFIED IDEOGRAPH + {0xEAE3, 0x7FB1}, //11121 #CJK UNIFIED IDEOGRAPH + {0xEAE4, 0x7FEF}, //11122 #CJK UNIFIED IDEOGRAPH + {0xEAE5, 0x802A}, //11123 #CJK UNIFIED IDEOGRAPH + {0xEAE6, 0x8029}, //11124 #CJK UNIFIED IDEOGRAPH + {0xEAE7, 0x806C}, //11125 #CJK UNIFIED IDEOGRAPH + {0xEAE8, 0x81B1}, //11126 #CJK UNIFIED IDEOGRAPH + {0xEAE9, 0x81A6}, //11127 #CJK UNIFIED IDEOGRAPH + {0xEAEA, 0x81AE}, //11128 #CJK UNIFIED IDEOGRAPH + {0xEAEB, 0x81B9}, //11129 #CJK UNIFIED IDEOGRAPH + {0xEAEC, 0x81B5}, //11130 #CJK UNIFIED IDEOGRAPH + {0xEAED, 0x81AB}, //11131 #CJK UNIFIED IDEOGRAPH + {0xEAEE, 0x81B0}, //11132 #CJK UNIFIED IDEOGRAPH + {0xEAEF, 0x81AC}, //11133 #CJK UNIFIED IDEOGRAPH + {0xEAF0, 0x81B4}, //11134 #CJK UNIFIED IDEOGRAPH + {0xEAF1, 0x81B2}, //11135 #CJK UNIFIED IDEOGRAPH + {0xEAF2, 0x81B7}, //11136 #CJK UNIFIED IDEOGRAPH + {0xEAF3, 0x81A7}, //11137 #CJK UNIFIED IDEOGRAPH + {0xEAF4, 0x81F2}, //11138 #CJK UNIFIED IDEOGRAPH + {0xEAF5, 0x8255}, //11139 #CJK UNIFIED IDEOGRAPH + {0xEAF6, 0x8256}, //11140 #CJK UNIFIED IDEOGRAPH + {0xEAF7, 0x8257}, //11141 #CJK UNIFIED IDEOGRAPH + {0xEAF8, 0x8556}, //11142 #CJK UNIFIED IDEOGRAPH + {0xEAF9, 0x8545}, //11143 #CJK UNIFIED IDEOGRAPH + {0xEAFA, 0x856B}, //11144 #CJK UNIFIED IDEOGRAPH + {0xEAFB, 0x854D}, //11145 #CJK UNIFIED IDEOGRAPH + {0xEAFC, 0x8553}, //11146 #CJK UNIFIED IDEOGRAPH + {0xEAFD, 0x8561}, //11147 #CJK UNIFIED IDEOGRAPH + {0xEAFE, 0x8558}, //11148 #CJK UNIFIED IDEOGRAPH + {0xEB40, 0x8540}, //11149 #CJK UNIFIED IDEOGRAPH + {0xEB41, 0x8546}, //11150 #CJK UNIFIED IDEOGRAPH + {0xEB42, 0x8564}, //11151 #CJK UNIFIED IDEOGRAPH + {0xEB43, 0x8541}, //11152 #CJK UNIFIED IDEOGRAPH + {0xEB44, 0x8562}, //11153 #CJK UNIFIED IDEOGRAPH + {0xEB45, 0x8544}, //11154 #CJK UNIFIED IDEOGRAPH + {0xEB46, 0x8551}, //11155 #CJK UNIFIED IDEOGRAPH + {0xEB47, 0x8547}, //11156 #CJK UNIFIED IDEOGRAPH + {0xEB48, 0x8563}, //11157 #CJK UNIFIED IDEOGRAPH + {0xEB49, 0x853E}, //11158 #CJK UNIFIED IDEOGRAPH + {0xEB4A, 0x855B}, //11159 #CJK UNIFIED IDEOGRAPH + {0xEB4B, 0x8571}, //11160 #CJK UNIFIED IDEOGRAPH + {0xEB4C, 0x854E}, //11161 #CJK UNIFIED IDEOGRAPH + {0xEB4D, 0x856E}, //11162 #CJK UNIFIED IDEOGRAPH + {0xEB4E, 0x8575}, //11163 #CJK UNIFIED IDEOGRAPH + {0xEB4F, 0x8555}, //11164 #CJK UNIFIED IDEOGRAPH + {0xEB50, 0x8567}, //11165 #CJK UNIFIED IDEOGRAPH + {0xEB51, 0x8560}, //11166 #CJK UNIFIED IDEOGRAPH + {0xEB52, 0x858C}, //11167 #CJK UNIFIED IDEOGRAPH + {0xEB53, 0x8566}, //11168 #CJK UNIFIED IDEOGRAPH + {0xEB54, 0x855D}, //11169 #CJK UNIFIED IDEOGRAPH + {0xEB55, 0x8554}, //11170 #CJK UNIFIED IDEOGRAPH + {0xEB56, 0x8565}, //11171 #CJK UNIFIED IDEOGRAPH + {0xEB57, 0x856C}, //11172 #CJK UNIFIED IDEOGRAPH + {0xEB58, 0x8663}, //11173 #CJK UNIFIED IDEOGRAPH + {0xEB59, 0x8665}, //11174 #CJK UNIFIED IDEOGRAPH + {0xEB5A, 0x8664}, //11175 #CJK UNIFIED IDEOGRAPH + {0xEB5B, 0x879B}, //11176 #CJK UNIFIED IDEOGRAPH + {0xEB5C, 0x878F}, //11177 #CJK UNIFIED IDEOGRAPH + {0xEB5D, 0x8797}, //11178 #CJK UNIFIED IDEOGRAPH + {0xEB5E, 0x8793}, //11179 #CJK UNIFIED IDEOGRAPH + {0xEB5F, 0x8792}, //11180 #CJK UNIFIED IDEOGRAPH + {0xEB60, 0x8788}, //11181 #CJK UNIFIED IDEOGRAPH + {0xEB61, 0x8781}, //11182 #CJK UNIFIED IDEOGRAPH + {0xEB62, 0x8796}, //11183 #CJK UNIFIED IDEOGRAPH + {0xEB63, 0x8798}, //11184 #CJK UNIFIED IDEOGRAPH + {0xEB64, 0x8779}, //11185 #CJK UNIFIED IDEOGRAPH + {0xEB65, 0x8787}, //11186 #CJK UNIFIED IDEOGRAPH + {0xEB66, 0x87A3}, //11187 #CJK UNIFIED IDEOGRAPH + {0xEB67, 0x8785}, //11188 #CJK UNIFIED IDEOGRAPH + {0xEB68, 0x8790}, //11189 #CJK UNIFIED IDEOGRAPH + {0xEB69, 0x8791}, //11190 #CJK UNIFIED IDEOGRAPH + {0xEB6A, 0x879D}, //11191 #CJK UNIFIED IDEOGRAPH + {0xEB6B, 0x8784}, //11192 #CJK UNIFIED IDEOGRAPH + {0xEB6C, 0x8794}, //11193 #CJK UNIFIED IDEOGRAPH + {0xEB6D, 0x879C}, //11194 #CJK UNIFIED IDEOGRAPH + {0xEB6E, 0x879A}, //11195 #CJK UNIFIED IDEOGRAPH + {0xEB6F, 0x8789}, //11196 #CJK UNIFIED IDEOGRAPH + {0xEB70, 0x891E}, //11197 #CJK UNIFIED IDEOGRAPH + {0xEB71, 0x8926}, //11198 #CJK UNIFIED IDEOGRAPH + {0xEB72, 0x8930}, //11199 #CJK UNIFIED IDEOGRAPH + {0xEB73, 0x892D}, //11200 #CJK UNIFIED IDEOGRAPH + {0xEB74, 0x892E}, //11201 #CJK UNIFIED IDEOGRAPH + {0xEB75, 0x8927}, //11202 #CJK UNIFIED IDEOGRAPH + {0xEB76, 0x8931}, //11203 #CJK UNIFIED IDEOGRAPH + {0xEB77, 0x8922}, //11204 #CJK UNIFIED IDEOGRAPH + {0xEB78, 0x8929}, //11205 #CJK UNIFIED IDEOGRAPH + {0xEB79, 0x8923}, //11206 #CJK UNIFIED IDEOGRAPH + {0xEB7A, 0x892F}, //11207 #CJK UNIFIED IDEOGRAPH + {0xEB7B, 0x892C}, //11208 #CJK UNIFIED IDEOGRAPH + {0xEB7C, 0x891F}, //11209 #CJK UNIFIED IDEOGRAPH + {0xEB7D, 0x89F1}, //11210 #CJK UNIFIED IDEOGRAPH + {0xEB7E, 0x8AE0}, //11211 #CJK UNIFIED IDEOGRAPH + {0xEBA1, 0x8AE2}, //11212 #CJK UNIFIED IDEOGRAPH + {0xEBA2, 0x8AF2}, //11213 #CJK UNIFIED IDEOGRAPH + {0xEBA3, 0x8AF4}, //11214 #CJK UNIFIED IDEOGRAPH + {0xEBA4, 0x8AF5}, //11215 #CJK UNIFIED IDEOGRAPH + {0xEBA5, 0x8ADD}, //11216 #CJK UNIFIED IDEOGRAPH + {0xEBA6, 0x8B14}, //11217 #CJK UNIFIED IDEOGRAPH + {0xEBA7, 0x8AE4}, //11218 #CJK UNIFIED IDEOGRAPH + {0xEBA8, 0x8ADF}, //11219 #CJK UNIFIED IDEOGRAPH + {0xEBA9, 0x8AF0}, //11220 #CJK UNIFIED IDEOGRAPH + {0xEBAA, 0x8AC8}, //11221 #CJK UNIFIED IDEOGRAPH + {0xEBAB, 0x8ADE}, //11222 #CJK UNIFIED IDEOGRAPH + {0xEBAC, 0x8AE1}, //11223 #CJK UNIFIED IDEOGRAPH + {0xEBAD, 0x8AE8}, //11224 #CJK UNIFIED IDEOGRAPH + {0xEBAE, 0x8AFF}, //11225 #CJK UNIFIED IDEOGRAPH + {0xEBAF, 0x8AEF}, //11226 #CJK UNIFIED IDEOGRAPH + {0xEBB0, 0x8AFB}, //11227 #CJK UNIFIED IDEOGRAPH + {0xEBB1, 0x8C91}, //11228 #CJK UNIFIED IDEOGRAPH + {0xEBB2, 0x8C92}, //11229 #CJK UNIFIED IDEOGRAPH + {0xEBB3, 0x8C90}, //11230 #CJK UNIFIED IDEOGRAPH + {0xEBB4, 0x8CF5}, //11231 #CJK UNIFIED IDEOGRAPH + {0xEBB5, 0x8CEE}, //11232 #CJK UNIFIED IDEOGRAPH + {0xEBB6, 0x8CF1}, //11233 #CJK UNIFIED IDEOGRAPH + {0xEBB7, 0x8CF0}, //11234 #CJK UNIFIED IDEOGRAPH + {0xEBB8, 0x8CF3}, //11235 #CJK UNIFIED IDEOGRAPH + {0xEBB9, 0x8D6C}, //11236 #CJK UNIFIED IDEOGRAPH + {0xEBBA, 0x8D6E}, //11237 #CJK UNIFIED IDEOGRAPH + {0xEBBB, 0x8DA5}, //11238 #CJK UNIFIED IDEOGRAPH + {0xEBBC, 0x8DA7}, //11239 #CJK UNIFIED IDEOGRAPH + {0xEBBD, 0x8E33}, //11240 #CJK UNIFIED IDEOGRAPH + {0xEBBE, 0x8E3E}, //11241 #CJK UNIFIED IDEOGRAPH + {0xEBBF, 0x8E38}, //11242 #CJK UNIFIED IDEOGRAPH + {0xEBC0, 0x8E40}, //11243 #CJK UNIFIED IDEOGRAPH + {0xEBC1, 0x8E45}, //11244 #CJK UNIFIED IDEOGRAPH + {0xEBC2, 0x8E36}, //11245 #CJK UNIFIED IDEOGRAPH + {0xEBC3, 0x8E3C}, //11246 #CJK UNIFIED IDEOGRAPH + {0xEBC4, 0x8E3D}, //11247 #CJK UNIFIED IDEOGRAPH + {0xEBC5, 0x8E41}, //11248 #CJK UNIFIED IDEOGRAPH + {0xEBC6, 0x8E30}, //11249 #CJK UNIFIED IDEOGRAPH + {0xEBC7, 0x8E3F}, //11250 #CJK UNIFIED IDEOGRAPH + {0xEBC8, 0x8EBD}, //11251 #CJK UNIFIED IDEOGRAPH + {0xEBC9, 0x8F36}, //11252 #CJK UNIFIED IDEOGRAPH + {0xEBCA, 0x8F2E}, //11253 #CJK UNIFIED IDEOGRAPH + {0xEBCB, 0x8F35}, //11254 #CJK UNIFIED IDEOGRAPH + {0xEBCC, 0x8F32}, //11255 #CJK UNIFIED IDEOGRAPH + {0xEBCD, 0x8F39}, //11256 #CJK UNIFIED IDEOGRAPH + {0xEBCE, 0x8F37}, //11257 #CJK UNIFIED IDEOGRAPH + {0xEBCF, 0x8F34}, //11258 #CJK UNIFIED IDEOGRAPH + {0xEBD0, 0x9076}, //11259 #CJK UNIFIED IDEOGRAPH + {0xEBD1, 0x9079}, //11260 #CJK UNIFIED IDEOGRAPH + {0xEBD2, 0x907B}, //11261 #CJK UNIFIED IDEOGRAPH + {0xEBD3, 0x9086}, //11262 #CJK UNIFIED IDEOGRAPH + {0xEBD4, 0x90FA}, //11263 #CJK UNIFIED IDEOGRAPH + {0xEBD5, 0x9133}, //11264 #CJK UNIFIED IDEOGRAPH + {0xEBD6, 0x9135}, //11265 #CJK UNIFIED IDEOGRAPH + {0xEBD7, 0x9136}, //11266 #CJK UNIFIED IDEOGRAPH + {0xEBD8, 0x9193}, //11267 #CJK UNIFIED IDEOGRAPH + {0xEBD9, 0x9190}, //11268 #CJK UNIFIED IDEOGRAPH + {0xEBDA, 0x9191}, //11269 #CJK UNIFIED IDEOGRAPH + {0xEBDB, 0x918D}, //11270 #CJK UNIFIED IDEOGRAPH + {0xEBDC, 0x918F}, //11271 #CJK UNIFIED IDEOGRAPH + {0xEBDD, 0x9327}, //11272 #CJK UNIFIED IDEOGRAPH + {0xEBDE, 0x931E}, //11273 #CJK UNIFIED IDEOGRAPH + {0xEBDF, 0x9308}, //11274 #CJK UNIFIED IDEOGRAPH + {0xEBE0, 0x931F}, //11275 #CJK UNIFIED IDEOGRAPH + {0xEBE1, 0x9306}, //11276 #CJK UNIFIED IDEOGRAPH + {0xEBE2, 0x930F}, //11277 #CJK UNIFIED IDEOGRAPH + {0xEBE3, 0x937A}, //11278 #CJK UNIFIED IDEOGRAPH + {0xEBE4, 0x9338}, //11279 #CJK UNIFIED IDEOGRAPH + {0xEBE5, 0x933C}, //11280 #CJK UNIFIED IDEOGRAPH + {0xEBE6, 0x931B}, //11281 #CJK UNIFIED IDEOGRAPH + {0xEBE7, 0x9323}, //11282 #CJK UNIFIED IDEOGRAPH + {0xEBE8, 0x9312}, //11283 #CJK UNIFIED IDEOGRAPH + {0xEBE9, 0x9301}, //11284 #CJK UNIFIED IDEOGRAPH + {0xEBEA, 0x9346}, //11285 #CJK UNIFIED IDEOGRAPH + {0xEBEB, 0x932D}, //11286 #CJK UNIFIED IDEOGRAPH + {0xEBEC, 0x930E}, //11287 #CJK UNIFIED IDEOGRAPH + {0xEBED, 0x930D}, //11288 #CJK UNIFIED IDEOGRAPH + {0xEBEE, 0x92CB}, //11289 #CJK UNIFIED IDEOGRAPH + {0xEBEF, 0x931D}, //11290 #CJK UNIFIED IDEOGRAPH + {0xEBF0, 0x92FA}, //11291 #CJK UNIFIED IDEOGRAPH + {0xEBF1, 0x9325}, //11292 #CJK UNIFIED IDEOGRAPH + {0xEBF2, 0x9313}, //11293 #CJK UNIFIED IDEOGRAPH + {0xEBF3, 0x92F9}, //11294 #CJK UNIFIED IDEOGRAPH + {0xEBF4, 0x92F7}, //11295 #CJK UNIFIED IDEOGRAPH + {0xEBF5, 0x9334}, //11296 #CJK UNIFIED IDEOGRAPH + {0xEBF6, 0x9302}, //11297 #CJK UNIFIED IDEOGRAPH + {0xEBF7, 0x9324}, //11298 #CJK UNIFIED IDEOGRAPH + {0xEBF8, 0x92FF}, //11299 #CJK UNIFIED IDEOGRAPH + {0xEBF9, 0x9329}, //11300 #CJK UNIFIED IDEOGRAPH + {0xEBFA, 0x9339}, //11301 #CJK UNIFIED IDEOGRAPH + {0xEBFB, 0x9335}, //11302 #CJK UNIFIED IDEOGRAPH + {0xEBFC, 0x932A}, //11303 #CJK UNIFIED IDEOGRAPH + {0xEBFD, 0x9314}, //11304 #CJK UNIFIED IDEOGRAPH + {0xEBFE, 0x930C}, //11305 #CJK UNIFIED IDEOGRAPH + {0xEC40, 0x930B}, //11306 #CJK UNIFIED IDEOGRAPH + {0xEC41, 0x92FE}, //11307 #CJK UNIFIED IDEOGRAPH + {0xEC42, 0x9309}, //11308 #CJK UNIFIED IDEOGRAPH + {0xEC43, 0x9300}, //11309 #CJK UNIFIED IDEOGRAPH + {0xEC44, 0x92FB}, //11310 #CJK UNIFIED IDEOGRAPH + {0xEC45, 0x9316}, //11311 #CJK UNIFIED IDEOGRAPH + {0xEC46, 0x95BC}, //11312 #CJK UNIFIED IDEOGRAPH + {0xEC47, 0x95CD}, //11313 #CJK UNIFIED IDEOGRAPH + {0xEC48, 0x95BE}, //11314 #CJK UNIFIED IDEOGRAPH + {0xEC49, 0x95B9}, //11315 #CJK UNIFIED IDEOGRAPH + {0xEC4A, 0x95BA}, //11316 #CJK UNIFIED IDEOGRAPH + {0xEC4B, 0x95B6}, //11317 #CJK UNIFIED IDEOGRAPH + {0xEC4C, 0x95BF}, //11318 #CJK UNIFIED IDEOGRAPH + {0xEC4D, 0x95B5}, //11319 #CJK UNIFIED IDEOGRAPH + {0xEC4E, 0x95BD}, //11320 #CJK UNIFIED IDEOGRAPH + {0xEC4F, 0x96A9}, //11321 #CJK UNIFIED IDEOGRAPH + {0xEC50, 0x96D4}, //11322 #CJK UNIFIED IDEOGRAPH + {0xEC51, 0x970B}, //11323 #CJK UNIFIED IDEOGRAPH + {0xEC52, 0x9712}, //11324 #CJK UNIFIED IDEOGRAPH + {0xEC53, 0x9710}, //11325 #CJK UNIFIED IDEOGRAPH + {0xEC54, 0x9799}, //11326 #CJK UNIFIED IDEOGRAPH + {0xEC55, 0x9797}, //11327 #CJK UNIFIED IDEOGRAPH + {0xEC56, 0x9794}, //11328 #CJK UNIFIED IDEOGRAPH + {0xEC57, 0x97F0}, //11329 #CJK UNIFIED IDEOGRAPH + {0xEC58, 0x97F8}, //11330 #CJK UNIFIED IDEOGRAPH + {0xEC59, 0x9835}, //11331 #CJK UNIFIED IDEOGRAPH + {0xEC5A, 0x982F}, //11332 #CJK UNIFIED IDEOGRAPH + {0xEC5B, 0x9832}, //11333 #CJK UNIFIED IDEOGRAPH + {0xEC5C, 0x9924}, //11334 #CJK UNIFIED IDEOGRAPH + {0xEC5D, 0x991F}, //11335 #CJK UNIFIED IDEOGRAPH + {0xEC5E, 0x9927}, //11336 #CJK UNIFIED IDEOGRAPH + {0xEC5F, 0x9929}, //11337 #CJK UNIFIED IDEOGRAPH + {0xEC60, 0x999E}, //11338 #CJK UNIFIED IDEOGRAPH + {0xEC61, 0x99EE}, //11339 #CJK UNIFIED IDEOGRAPH + {0xEC62, 0x99EC}, //11340 #CJK UNIFIED IDEOGRAPH + {0xEC63, 0x99E5}, //11341 #CJK UNIFIED IDEOGRAPH + {0xEC64, 0x99E4}, //11342 #CJK UNIFIED IDEOGRAPH + {0xEC65, 0x99F0}, //11343 #CJK UNIFIED IDEOGRAPH + {0xEC66, 0x99E3}, //11344 #CJK UNIFIED IDEOGRAPH + {0xEC67, 0x99EA}, //11345 #CJK UNIFIED IDEOGRAPH + {0xEC68, 0x99E9}, //11346 #CJK UNIFIED IDEOGRAPH + {0xEC69, 0x99E7}, //11347 #CJK UNIFIED IDEOGRAPH + {0xEC6A, 0x9AB9}, //11348 #CJK UNIFIED IDEOGRAPH + {0xEC6B, 0x9ABF}, //11349 #CJK UNIFIED IDEOGRAPH + {0xEC6C, 0x9AB4}, //11350 #CJK UNIFIED IDEOGRAPH + {0xEC6D, 0x9ABB}, //11351 #CJK UNIFIED IDEOGRAPH + {0xEC6E, 0x9AF6}, //11352 #CJK UNIFIED IDEOGRAPH + {0xEC6F, 0x9AFA}, //11353 #CJK UNIFIED IDEOGRAPH + {0xEC70, 0x9AF9}, //11354 #CJK UNIFIED IDEOGRAPH + {0xEC71, 0x9AF7}, //11355 #CJK UNIFIED IDEOGRAPH + {0xEC72, 0x9B33}, //11356 #CJK UNIFIED IDEOGRAPH + {0xEC73, 0x9B80}, //11357 #CJK UNIFIED IDEOGRAPH + {0xEC74, 0x9B85}, //11358 #CJK UNIFIED IDEOGRAPH + {0xEC75, 0x9B87}, //11359 #CJK UNIFIED IDEOGRAPH + {0xEC76, 0x9B7C}, //11360 #CJK UNIFIED IDEOGRAPH + {0xEC77, 0x9B7E}, //11361 #CJK UNIFIED IDEOGRAPH + {0xEC78, 0x9B7B}, //11362 #CJK UNIFIED IDEOGRAPH + {0xEC79, 0x9B82}, //11363 #CJK UNIFIED IDEOGRAPH + {0xEC7A, 0x9B93}, //11364 #CJK UNIFIED IDEOGRAPH + {0xEC7B, 0x9B92}, //11365 #CJK UNIFIED IDEOGRAPH + {0xEC7C, 0x9B90}, //11366 #CJK UNIFIED IDEOGRAPH + {0xEC7D, 0x9B7A}, //11367 #CJK UNIFIED IDEOGRAPH + {0xEC7E, 0x9B95}, //11368 #CJK UNIFIED IDEOGRAPH + {0xECA1, 0x9B7D}, //11369 #CJK UNIFIED IDEOGRAPH + {0xECA2, 0x9B88}, //11370 #CJK UNIFIED IDEOGRAPH + {0xECA3, 0x9D25}, //11371 #CJK UNIFIED IDEOGRAPH + {0xECA4, 0x9D17}, //11372 #CJK UNIFIED IDEOGRAPH + {0xECA5, 0x9D20}, //11373 #CJK UNIFIED IDEOGRAPH + {0xECA6, 0x9D1E}, //11374 #CJK UNIFIED IDEOGRAPH + {0xECA7, 0x9D14}, //11375 #CJK UNIFIED IDEOGRAPH + {0xECA8, 0x9D29}, //11376 #CJK UNIFIED IDEOGRAPH + {0xECA9, 0x9D1D}, //11377 #CJK UNIFIED IDEOGRAPH + {0xECAA, 0x9D18}, //11378 #CJK UNIFIED IDEOGRAPH + {0xECAB, 0x9D22}, //11379 #CJK UNIFIED IDEOGRAPH + {0xECAC, 0x9D10}, //11380 #CJK UNIFIED IDEOGRAPH + {0xECAD, 0x9D19}, //11381 #CJK UNIFIED IDEOGRAPH + {0xECAE, 0x9D1F}, //11382 #CJK UNIFIED IDEOGRAPH + {0xECAF, 0x9E88}, //11383 #CJK UNIFIED IDEOGRAPH + {0xECB0, 0x9E86}, //11384 #CJK UNIFIED IDEOGRAPH + {0xECB1, 0x9E87}, //11385 #CJK UNIFIED IDEOGRAPH + {0xECB2, 0x9EAE}, //11386 #CJK UNIFIED IDEOGRAPH + {0xECB3, 0x9EAD}, //11387 #CJK UNIFIED IDEOGRAPH + {0xECB4, 0x9ED5}, //11388 #CJK UNIFIED IDEOGRAPH + {0xECB5, 0x9ED6}, //11389 #CJK UNIFIED IDEOGRAPH + {0xECB6, 0x9EFA}, //11390 #CJK UNIFIED IDEOGRAPH + {0xECB7, 0x9F12}, //11391 #CJK UNIFIED IDEOGRAPH + {0xECB8, 0x9F3D}, //11392 #CJK UNIFIED IDEOGRAPH + {0xECB9, 0x5126}, //11393 #CJK UNIFIED IDEOGRAPH + {0xECBA, 0x5125}, //11394 #CJK UNIFIED IDEOGRAPH + {0xECBB, 0x5122}, //11395 #CJK UNIFIED IDEOGRAPH + {0xECBC, 0x5124}, //11396 #CJK UNIFIED IDEOGRAPH + {0xECBD, 0x5120}, //11397 #CJK UNIFIED IDEOGRAPH + {0xECBE, 0x5129}, //11398 #CJK UNIFIED IDEOGRAPH + {0xECBF, 0x52F4}, //11399 #CJK UNIFIED IDEOGRAPH + {0xECC0, 0x5693}, //11400 #CJK UNIFIED IDEOGRAPH + {0xECC1, 0x568C}, //11401 #CJK UNIFIED IDEOGRAPH + {0xECC2, 0x568D}, //11402 #CJK UNIFIED IDEOGRAPH + {0xECC3, 0x5686}, //11403 #CJK UNIFIED IDEOGRAPH + {0xECC4, 0x5684}, //11404 #CJK UNIFIED IDEOGRAPH + {0xECC5, 0x5683}, //11405 #CJK UNIFIED IDEOGRAPH + {0xECC6, 0x567E}, //11406 #CJK UNIFIED IDEOGRAPH + {0xECC7, 0x5682}, //11407 #CJK UNIFIED IDEOGRAPH + {0xECC8, 0x567F}, //11408 #CJK UNIFIED IDEOGRAPH + {0xECC9, 0x5681}, //11409 #CJK UNIFIED IDEOGRAPH + {0xECCA, 0x58D6}, //11410 #CJK UNIFIED IDEOGRAPH + {0xECCB, 0x58D4}, //11411 #CJK UNIFIED IDEOGRAPH + {0xECCC, 0x58CF}, //11412 #CJK UNIFIED IDEOGRAPH + {0xECCD, 0x58D2}, //11413 #CJK UNIFIED IDEOGRAPH + {0xECCE, 0x5B2D}, //11414 #CJK UNIFIED IDEOGRAPH + {0xECCF, 0x5B25}, //11415 #CJK UNIFIED IDEOGRAPH + {0xECD0, 0x5B32}, //11416 #CJK UNIFIED IDEOGRAPH + {0xECD1, 0x5B23}, //11417 #CJK UNIFIED IDEOGRAPH + {0xECD2, 0x5B2C}, //11418 #CJK UNIFIED IDEOGRAPH + {0xECD3, 0x5B27}, //11419 #CJK UNIFIED IDEOGRAPH + {0xECD4, 0x5B26}, //11420 #CJK UNIFIED IDEOGRAPH + {0xECD5, 0x5B2F}, //11421 #CJK UNIFIED IDEOGRAPH + {0xECD6, 0x5B2E}, //11422 #CJK UNIFIED IDEOGRAPH + {0xECD7, 0x5B7B}, //11423 #CJK UNIFIED IDEOGRAPH + {0xECD8, 0x5BF1}, //11424 #CJK UNIFIED IDEOGRAPH + {0xECD9, 0x5BF2}, //11425 #CJK UNIFIED IDEOGRAPH + {0xECDA, 0x5DB7}, //11426 #CJK UNIFIED IDEOGRAPH + {0xECDB, 0x5E6C}, //11427 #CJK UNIFIED IDEOGRAPH + {0xECDC, 0x5E6A}, //11428 #CJK UNIFIED IDEOGRAPH + {0xECDD, 0x5FBE}, //11429 #CJK UNIFIED IDEOGRAPH + {0xECDE, 0x5FBB}, //11430 #CJK UNIFIED IDEOGRAPH + {0xECDF, 0x61C3}, //11431 #CJK UNIFIED IDEOGRAPH + {0xECE0, 0x61B5}, //11432 #CJK UNIFIED IDEOGRAPH + {0xECE1, 0x61BC}, //11433 #CJK UNIFIED IDEOGRAPH + {0xECE2, 0x61E7}, //11434 #CJK UNIFIED IDEOGRAPH + {0xECE3, 0x61E0}, //11435 #CJK UNIFIED IDEOGRAPH + {0xECE4, 0x61E5}, //11436 #CJK UNIFIED IDEOGRAPH + {0xECE5, 0x61E4}, //11437 #CJK UNIFIED IDEOGRAPH + {0xECE6, 0x61E8}, //11438 #CJK UNIFIED IDEOGRAPH + {0xECE7, 0x61DE}, //11439 #CJK UNIFIED IDEOGRAPH + {0xECE8, 0x64EF}, //11440 #CJK UNIFIED IDEOGRAPH + {0xECE9, 0x64E9}, //11441 #CJK UNIFIED IDEOGRAPH + {0xECEA, 0x64E3}, //11442 #CJK UNIFIED IDEOGRAPH + {0xECEB, 0x64EB}, //11443 #CJK UNIFIED IDEOGRAPH + {0xECEC, 0x64E4}, //11444 #CJK UNIFIED IDEOGRAPH + {0xECED, 0x64E8}, //11445 #CJK UNIFIED IDEOGRAPH + {0xECEE, 0x6581}, //11446 #CJK UNIFIED IDEOGRAPH + {0xECEF, 0x6580}, //11447 #CJK UNIFIED IDEOGRAPH + {0xECF0, 0x65B6}, //11448 #CJK UNIFIED IDEOGRAPH + {0xECF1, 0x65DA}, //11449 #CJK UNIFIED IDEOGRAPH + {0xECF2, 0x66D2}, //11450 #CJK UNIFIED IDEOGRAPH + {0xECF3, 0x6A8D}, //11451 #CJK UNIFIED IDEOGRAPH + {0xECF4, 0x6A96}, //11452 #CJK UNIFIED IDEOGRAPH + {0xECF5, 0x6A81}, //11453 #CJK UNIFIED IDEOGRAPH + {0xECF6, 0x6AA5}, //11454 #CJK UNIFIED IDEOGRAPH + {0xECF7, 0x6A89}, //11455 #CJK UNIFIED IDEOGRAPH + {0xECF8, 0x6A9F}, //11456 #CJK UNIFIED IDEOGRAPH + {0xECF9, 0x6A9B}, //11457 #CJK UNIFIED IDEOGRAPH + {0xECFA, 0x6AA1}, //11458 #CJK UNIFIED IDEOGRAPH + {0xECFB, 0x6A9E}, //11459 #CJK UNIFIED IDEOGRAPH + {0xECFC, 0x6A87}, //11460 #CJK UNIFIED IDEOGRAPH + {0xECFD, 0x6A93}, //11461 #CJK UNIFIED IDEOGRAPH + {0xECFE, 0x6A8E}, //11462 #CJK UNIFIED IDEOGRAPH + {0xED40, 0x6A95}, //11463 #CJK UNIFIED IDEOGRAPH + {0xED41, 0x6A83}, //11464 #CJK UNIFIED IDEOGRAPH + {0xED42, 0x6AA8}, //11465 #CJK UNIFIED IDEOGRAPH + {0xED43, 0x6AA4}, //11466 #CJK UNIFIED IDEOGRAPH + {0xED44, 0x6A91}, //11467 #CJK UNIFIED IDEOGRAPH + {0xED45, 0x6A7F}, //11468 #CJK UNIFIED IDEOGRAPH + {0xED46, 0x6AA6}, //11469 #CJK UNIFIED IDEOGRAPH + {0xED47, 0x6A9A}, //11470 #CJK UNIFIED IDEOGRAPH + {0xED48, 0x6A85}, //11471 #CJK UNIFIED IDEOGRAPH + {0xED49, 0x6A8C}, //11472 #CJK UNIFIED IDEOGRAPH + {0xED4A, 0x6A92}, //11473 #CJK UNIFIED IDEOGRAPH + {0xED4B, 0x6B5B}, //11474 #CJK UNIFIED IDEOGRAPH + {0xED4C, 0x6BAD}, //11475 #CJK UNIFIED IDEOGRAPH + {0xED4D, 0x6C09}, //11476 #CJK UNIFIED IDEOGRAPH + {0xED4E, 0x6FCC}, //11477 #CJK UNIFIED IDEOGRAPH + {0xED4F, 0x6FA9}, //11478 #CJK UNIFIED IDEOGRAPH + {0xED50, 0x6FF4}, //11479 #CJK UNIFIED IDEOGRAPH + {0xED51, 0x6FD4}, //11480 #CJK UNIFIED IDEOGRAPH + {0xED52, 0x6FE3}, //11481 #CJK UNIFIED IDEOGRAPH + {0xED53, 0x6FDC}, //11482 #CJK UNIFIED IDEOGRAPH + {0xED54, 0x6FED}, //11483 #CJK UNIFIED IDEOGRAPH + {0xED55, 0x6FE7}, //11484 #CJK UNIFIED IDEOGRAPH + {0xED56, 0x6FE6}, //11485 #CJK UNIFIED IDEOGRAPH + {0xED57, 0x6FDE}, //11486 #CJK UNIFIED IDEOGRAPH + {0xED58, 0x6FF2}, //11487 #CJK UNIFIED IDEOGRAPH + {0xED59, 0x6FDD}, //11488 #CJK UNIFIED IDEOGRAPH + {0xED5A, 0x6FE2}, //11489 #CJK UNIFIED IDEOGRAPH + {0xED5B, 0x6FE8}, //11490 #CJK UNIFIED IDEOGRAPH + {0xED5C, 0x71E1}, //11491 #CJK UNIFIED IDEOGRAPH + {0xED5D, 0x71F1}, //11492 #CJK UNIFIED IDEOGRAPH + {0xED5E, 0x71E8}, //11493 #CJK UNIFIED IDEOGRAPH + {0xED5F, 0x71F2}, //11494 #CJK UNIFIED IDEOGRAPH + {0xED60, 0x71E4}, //11495 #CJK UNIFIED IDEOGRAPH + {0xED61, 0x71F0}, //11496 #CJK UNIFIED IDEOGRAPH + {0xED62, 0x71E2}, //11497 #CJK UNIFIED IDEOGRAPH + {0xED63, 0x7373}, //11498 #CJK UNIFIED IDEOGRAPH + {0xED64, 0x736E}, //11499 #CJK UNIFIED IDEOGRAPH + {0xED65, 0x736F}, //11500 #CJK UNIFIED IDEOGRAPH + {0xED66, 0x7497}, //11501 #CJK UNIFIED IDEOGRAPH + {0xED67, 0x74B2}, //11502 #CJK UNIFIED IDEOGRAPH + {0xED68, 0x74AB}, //11503 #CJK UNIFIED IDEOGRAPH + {0xED69, 0x7490}, //11504 #CJK UNIFIED IDEOGRAPH + {0xED6A, 0x74AA}, //11505 #CJK UNIFIED IDEOGRAPH + {0xED6B, 0x74AD}, //11506 #CJK UNIFIED IDEOGRAPH + {0xED6C, 0x74B1}, //11507 #CJK UNIFIED IDEOGRAPH + {0xED6D, 0x74A5}, //11508 #CJK UNIFIED IDEOGRAPH + {0xED6E, 0x74AF}, //11509 #CJK UNIFIED IDEOGRAPH + {0xED6F, 0x7510}, //11510 #CJK UNIFIED IDEOGRAPH + {0xED70, 0x7511}, //11511 #CJK UNIFIED IDEOGRAPH + {0xED71, 0x7512}, //11512 #CJK UNIFIED IDEOGRAPH + {0xED72, 0x750F}, //11513 #CJK UNIFIED IDEOGRAPH + {0xED73, 0x7584}, //11514 #CJK UNIFIED IDEOGRAPH + {0xED74, 0x7643}, //11515 #CJK UNIFIED IDEOGRAPH + {0xED75, 0x7648}, //11516 #CJK UNIFIED IDEOGRAPH + {0xED76, 0x7649}, //11517 #CJK UNIFIED IDEOGRAPH + {0xED77, 0x7647}, //11518 #CJK UNIFIED IDEOGRAPH + {0xED78, 0x76A4}, //11519 #CJK UNIFIED IDEOGRAPH + {0xED79, 0x76E9}, //11520 #CJK UNIFIED IDEOGRAPH + {0xED7A, 0x77B5}, //11521 #CJK UNIFIED IDEOGRAPH + {0xED7B, 0x77AB}, //11522 #CJK UNIFIED IDEOGRAPH + {0xED7C, 0x77B2}, //11523 #CJK UNIFIED IDEOGRAPH + {0xED7D, 0x77B7}, //11524 #CJK UNIFIED IDEOGRAPH + {0xED7E, 0x77B6}, //11525 #CJK UNIFIED IDEOGRAPH + {0xEDA1, 0x77B4}, //11526 #CJK UNIFIED IDEOGRAPH + {0xEDA2, 0x77B1}, //11527 #CJK UNIFIED IDEOGRAPH + {0xEDA3, 0x77A8}, //11528 #CJK UNIFIED IDEOGRAPH + {0xEDA4, 0x77F0}, //11529 #CJK UNIFIED IDEOGRAPH + {0xEDA5, 0x78F3}, //11530 #CJK UNIFIED IDEOGRAPH + {0xEDA6, 0x78FD}, //11531 #CJK UNIFIED IDEOGRAPH + {0xEDA7, 0x7902}, //11532 #CJK UNIFIED IDEOGRAPH + {0xEDA8, 0x78FB}, //11533 #CJK UNIFIED IDEOGRAPH + {0xEDA9, 0x78FC}, //11534 #CJK UNIFIED IDEOGRAPH + {0xEDAA, 0x78F2}, //11535 #CJK UNIFIED IDEOGRAPH + {0xEDAB, 0x7905}, //11536 #CJK UNIFIED IDEOGRAPH + {0xEDAC, 0x78F9}, //11537 #CJK UNIFIED IDEOGRAPH + {0xEDAD, 0x78FE}, //11538 #CJK UNIFIED IDEOGRAPH + {0xEDAE, 0x7904}, //11539 #CJK UNIFIED IDEOGRAPH + {0xEDAF, 0x79AB}, //11540 #CJK UNIFIED IDEOGRAPH + {0xEDB0, 0x79A8}, //11541 #CJK UNIFIED IDEOGRAPH + {0xEDB1, 0x7A5C}, //11542 #CJK UNIFIED IDEOGRAPH + {0xEDB2, 0x7A5B}, //11543 #CJK UNIFIED IDEOGRAPH + {0xEDB3, 0x7A56}, //11544 #CJK UNIFIED IDEOGRAPH + {0xEDB4, 0x7A58}, //11545 #CJK UNIFIED IDEOGRAPH + {0xEDB5, 0x7A54}, //11546 #CJK UNIFIED IDEOGRAPH + {0xEDB6, 0x7A5A}, //11547 #CJK UNIFIED IDEOGRAPH + {0xEDB7, 0x7ABE}, //11548 #CJK UNIFIED IDEOGRAPH + {0xEDB8, 0x7AC0}, //11549 #CJK UNIFIED IDEOGRAPH + {0xEDB9, 0x7AC1}, //11550 #CJK UNIFIED IDEOGRAPH + {0xEDBA, 0x7C05}, //11551 #CJK UNIFIED IDEOGRAPH + {0xEDBB, 0x7C0F}, //11552 #CJK UNIFIED IDEOGRAPH + {0xEDBC, 0x7BF2}, //11553 #CJK UNIFIED IDEOGRAPH + {0xEDBD, 0x7C00}, //11554 #CJK UNIFIED IDEOGRAPH + {0xEDBE, 0x7BFF}, //11555 #CJK UNIFIED IDEOGRAPH + {0xEDBF, 0x7BFB}, //11556 #CJK UNIFIED IDEOGRAPH + {0xEDC0, 0x7C0E}, //11557 #CJK UNIFIED IDEOGRAPH + {0xEDC1, 0x7BF4}, //11558 #CJK UNIFIED IDEOGRAPH + {0xEDC2, 0x7C0B}, //11559 #CJK UNIFIED IDEOGRAPH + {0xEDC3, 0x7BF3}, //11560 #CJK UNIFIED IDEOGRAPH + {0xEDC4, 0x7C02}, //11561 #CJK UNIFIED IDEOGRAPH + {0xEDC5, 0x7C09}, //11562 #CJK UNIFIED IDEOGRAPH + {0xEDC6, 0x7C03}, //11563 #CJK UNIFIED IDEOGRAPH + {0xEDC7, 0x7C01}, //11564 #CJK UNIFIED IDEOGRAPH + {0xEDC8, 0x7BF8}, //11565 #CJK UNIFIED IDEOGRAPH + {0xEDC9, 0x7BFD}, //11566 #CJK UNIFIED IDEOGRAPH + {0xEDCA, 0x7C06}, //11567 #CJK UNIFIED IDEOGRAPH + {0xEDCB, 0x7BF0}, //11568 #CJK UNIFIED IDEOGRAPH + {0xEDCC, 0x7BF1}, //11569 #CJK UNIFIED IDEOGRAPH + {0xEDCD, 0x7C10}, //11570 #CJK UNIFIED IDEOGRAPH + {0xEDCE, 0x7C0A}, //11571 #CJK UNIFIED IDEOGRAPH + {0xEDCF, 0x7CE8}, //11572 #CJK UNIFIED IDEOGRAPH + {0xEDD0, 0x7E2D}, //11573 #CJK UNIFIED IDEOGRAPH + {0xEDD1, 0x7E3C}, //11574 #CJK UNIFIED IDEOGRAPH + {0xEDD2, 0x7E42}, //11575 #CJK UNIFIED IDEOGRAPH + {0xEDD3, 0x7E33}, //11576 #CJK UNIFIED IDEOGRAPH + {0xEDD4, 0x9848}, //11577 #CJK UNIFIED IDEOGRAPH + {0xEDD5, 0x7E38}, //11578 #CJK UNIFIED IDEOGRAPH + {0xEDD6, 0x7E2A}, //11579 #CJK UNIFIED IDEOGRAPH + {0xEDD7, 0x7E49}, //11580 #CJK UNIFIED IDEOGRAPH + {0xEDD8, 0x7E40}, //11581 #CJK UNIFIED IDEOGRAPH + {0xEDD9, 0x7E47}, //11582 #CJK UNIFIED IDEOGRAPH + {0xEDDA, 0x7E29}, //11583 #CJK UNIFIED IDEOGRAPH + {0xEDDB, 0x7E4C}, //11584 #CJK UNIFIED IDEOGRAPH + {0xEDDC, 0x7E30}, //11585 #CJK UNIFIED IDEOGRAPH + {0xEDDD, 0x7E3B}, //11586 #CJK UNIFIED IDEOGRAPH + {0xEDDE, 0x7E36}, //11587 #CJK UNIFIED IDEOGRAPH + {0xEDDF, 0x7E44}, //11588 #CJK UNIFIED IDEOGRAPH + {0xEDE0, 0x7E3A}, //11589 #CJK UNIFIED IDEOGRAPH + {0xEDE1, 0x7F45}, //11590 #CJK UNIFIED IDEOGRAPH + {0xEDE2, 0x7F7F}, //11591 #CJK UNIFIED IDEOGRAPH + {0xEDE3, 0x7F7E}, //11592 #CJK UNIFIED IDEOGRAPH + {0xEDE4, 0x7F7D}, //11593 #CJK UNIFIED IDEOGRAPH + {0xEDE5, 0x7FF4}, //11594 #CJK UNIFIED IDEOGRAPH + {0xEDE6, 0x7FF2}, //11595 #CJK UNIFIED IDEOGRAPH + {0xEDE7, 0x802C}, //11596 #CJK UNIFIED IDEOGRAPH + {0xEDE8, 0x81BB}, //11597 #CJK UNIFIED IDEOGRAPH + {0xEDE9, 0x81C4}, //11598 #CJK UNIFIED IDEOGRAPH + {0xEDEA, 0x81CC}, //11599 #CJK UNIFIED IDEOGRAPH + {0xEDEB, 0x81CA}, //11600 #CJK UNIFIED IDEOGRAPH + {0xEDEC, 0x81C5}, //11601 #CJK UNIFIED IDEOGRAPH + {0xEDED, 0x81C7}, //11602 #CJK UNIFIED IDEOGRAPH + {0xEDEE, 0x81BC}, //11603 #CJK UNIFIED IDEOGRAPH + {0xEDEF, 0x81E9}, //11604 #CJK UNIFIED IDEOGRAPH + {0xEDF0, 0x825B}, //11605 #CJK UNIFIED IDEOGRAPH + {0xEDF1, 0x825A}, //11606 #CJK UNIFIED IDEOGRAPH + {0xEDF2, 0x825C}, //11607 #CJK UNIFIED IDEOGRAPH + {0xEDF3, 0x8583}, //11608 #CJK UNIFIED IDEOGRAPH + {0xEDF4, 0x8580}, //11609 #CJK UNIFIED IDEOGRAPH + {0xEDF5, 0x858F}, //11610 #CJK UNIFIED IDEOGRAPH + {0xEDF6, 0x85A7}, //11611 #CJK UNIFIED IDEOGRAPH + {0xEDF7, 0x8595}, //11612 #CJK UNIFIED IDEOGRAPH + {0xEDF8, 0x85A0}, //11613 #CJK UNIFIED IDEOGRAPH + {0xEDF9, 0x858B}, //11614 #CJK UNIFIED IDEOGRAPH + {0xEDFA, 0x85A3}, //11615 #CJK UNIFIED IDEOGRAPH + {0xEDFB, 0x857B}, //11616 #CJK UNIFIED IDEOGRAPH + {0xEDFC, 0x85A4}, //11617 #CJK UNIFIED IDEOGRAPH + {0xEDFD, 0x859A}, //11618 #CJK UNIFIED IDEOGRAPH + {0xEDFE, 0x859E}, //11619 #CJK UNIFIED IDEOGRAPH + {0xEE40, 0x8577}, //11620 #CJK UNIFIED IDEOGRAPH + {0xEE41, 0x857C}, //11621 #CJK UNIFIED IDEOGRAPH + {0xEE42, 0x8589}, //11622 #CJK UNIFIED IDEOGRAPH + {0xEE43, 0x85A1}, //11623 #CJK UNIFIED IDEOGRAPH + {0xEE44, 0x857A}, //11624 #CJK UNIFIED IDEOGRAPH + {0xEE45, 0x8578}, //11625 #CJK UNIFIED IDEOGRAPH + {0xEE46, 0x8557}, //11626 #CJK UNIFIED IDEOGRAPH + {0xEE47, 0x858E}, //11627 #CJK UNIFIED IDEOGRAPH + {0xEE48, 0x8596}, //11628 #CJK UNIFIED IDEOGRAPH + {0xEE49, 0x8586}, //11629 #CJK UNIFIED IDEOGRAPH + {0xEE4A, 0x858D}, //11630 #CJK UNIFIED IDEOGRAPH + {0xEE4B, 0x8599}, //11631 #CJK UNIFIED IDEOGRAPH + {0xEE4C, 0x859D}, //11632 #CJK UNIFIED IDEOGRAPH + {0xEE4D, 0x8581}, //11633 #CJK UNIFIED IDEOGRAPH + {0xEE4E, 0x85A2}, //11634 #CJK UNIFIED IDEOGRAPH + {0xEE4F, 0x8582}, //11635 #CJK UNIFIED IDEOGRAPH + {0xEE50, 0x8588}, //11636 #CJK UNIFIED IDEOGRAPH + {0xEE51, 0x8585}, //11637 #CJK UNIFIED IDEOGRAPH + {0xEE52, 0x8579}, //11638 #CJK UNIFIED IDEOGRAPH + {0xEE53, 0x8576}, //11639 #CJK UNIFIED IDEOGRAPH + {0xEE54, 0x8598}, //11640 #CJK UNIFIED IDEOGRAPH + {0xEE55, 0x8590}, //11641 #CJK UNIFIED IDEOGRAPH + {0xEE56, 0x859F}, //11642 #CJK UNIFIED IDEOGRAPH + {0xEE57, 0x8668}, //11643 #CJK UNIFIED IDEOGRAPH + {0xEE58, 0x87BE}, //11644 #CJK UNIFIED IDEOGRAPH + {0xEE59, 0x87AA}, //11645 #CJK UNIFIED IDEOGRAPH + {0xEE5A, 0x87AD}, //11646 #CJK UNIFIED IDEOGRAPH + {0xEE5B, 0x87C5}, //11647 #CJK UNIFIED IDEOGRAPH + {0xEE5C, 0x87B0}, //11648 #CJK UNIFIED IDEOGRAPH + {0xEE5D, 0x87AC}, //11649 #CJK UNIFIED IDEOGRAPH + {0xEE5E, 0x87B9}, //11650 #CJK UNIFIED IDEOGRAPH + {0xEE5F, 0x87B5}, //11651 #CJK UNIFIED IDEOGRAPH + {0xEE60, 0x87BC}, //11652 #CJK UNIFIED IDEOGRAPH + {0xEE61, 0x87AE}, //11653 #CJK UNIFIED IDEOGRAPH + {0xEE62, 0x87C9}, //11654 #CJK UNIFIED IDEOGRAPH + {0xEE63, 0x87C3}, //11655 #CJK UNIFIED IDEOGRAPH + {0xEE64, 0x87C2}, //11656 #CJK UNIFIED IDEOGRAPH + {0xEE65, 0x87CC}, //11657 #CJK UNIFIED IDEOGRAPH + {0xEE66, 0x87B7}, //11658 #CJK UNIFIED IDEOGRAPH + {0xEE67, 0x87AF}, //11659 #CJK UNIFIED IDEOGRAPH + {0xEE68, 0x87C4}, //11660 #CJK UNIFIED IDEOGRAPH + {0xEE69, 0x87CA}, //11661 #CJK UNIFIED IDEOGRAPH + {0xEE6A, 0x87B4}, //11662 #CJK UNIFIED IDEOGRAPH + {0xEE6B, 0x87B6}, //11663 #CJK UNIFIED IDEOGRAPH + {0xEE6C, 0x87BF}, //11664 #CJK UNIFIED IDEOGRAPH + {0xEE6D, 0x87B8}, //11665 #CJK UNIFIED IDEOGRAPH + {0xEE6E, 0x87BD}, //11666 #CJK UNIFIED IDEOGRAPH + {0xEE6F, 0x87DE}, //11667 #CJK UNIFIED IDEOGRAPH + {0xEE70, 0x87B2}, //11668 #CJK UNIFIED IDEOGRAPH + {0xEE71, 0x8935}, //11669 #CJK UNIFIED IDEOGRAPH + {0xEE72, 0x8933}, //11670 #CJK UNIFIED IDEOGRAPH + {0xEE73, 0x893C}, //11671 #CJK UNIFIED IDEOGRAPH + {0xEE74, 0x893E}, //11672 #CJK UNIFIED IDEOGRAPH + {0xEE75, 0x8941}, //11673 #CJK UNIFIED IDEOGRAPH + {0xEE76, 0x8952}, //11674 #CJK UNIFIED IDEOGRAPH + {0xEE77, 0x8937}, //11675 #CJK UNIFIED IDEOGRAPH + {0xEE78, 0x8942}, //11676 #CJK UNIFIED IDEOGRAPH + {0xEE79, 0x89AD}, //11677 #CJK UNIFIED IDEOGRAPH + {0xEE7A, 0x89AF}, //11678 #CJK UNIFIED IDEOGRAPH + {0xEE7B, 0x89AE}, //11679 #CJK UNIFIED IDEOGRAPH + {0xEE7C, 0x89F2}, //11680 #CJK UNIFIED IDEOGRAPH + {0xEE7D, 0x89F3}, //11681 #CJK UNIFIED IDEOGRAPH + {0xEE7E, 0x8B1E}, //11682 #CJK UNIFIED IDEOGRAPH + {0xEEA1, 0x8B18}, //11683 #CJK UNIFIED IDEOGRAPH + {0xEEA2, 0x8B16}, //11684 #CJK UNIFIED IDEOGRAPH + {0xEEA3, 0x8B11}, //11685 #CJK UNIFIED IDEOGRAPH + {0xEEA4, 0x8B05}, //11686 #CJK UNIFIED IDEOGRAPH + {0xEEA5, 0x8B0B}, //11687 #CJK UNIFIED IDEOGRAPH + {0xEEA6, 0x8B22}, //11688 #CJK UNIFIED IDEOGRAPH + {0xEEA7, 0x8B0F}, //11689 #CJK UNIFIED IDEOGRAPH + {0xEEA8, 0x8B12}, //11690 #CJK UNIFIED IDEOGRAPH + {0xEEA9, 0x8B15}, //11691 #CJK UNIFIED IDEOGRAPH + {0xEEAA, 0x8B07}, //11692 #CJK UNIFIED IDEOGRAPH + {0xEEAB, 0x8B0D}, //11693 #CJK UNIFIED IDEOGRAPH + {0xEEAC, 0x8B08}, //11694 #CJK UNIFIED IDEOGRAPH + {0xEEAD, 0x8B06}, //11695 #CJK UNIFIED IDEOGRAPH + {0xEEAE, 0x8B1C}, //11696 #CJK UNIFIED IDEOGRAPH + {0xEEAF, 0x8B13}, //11697 #CJK UNIFIED IDEOGRAPH + {0xEEB0, 0x8B1A}, //11698 #CJK UNIFIED IDEOGRAPH + {0xEEB1, 0x8C4F}, //11699 #CJK UNIFIED IDEOGRAPH + {0xEEB2, 0x8C70}, //11700 #CJK UNIFIED IDEOGRAPH + {0xEEB3, 0x8C72}, //11701 #CJK UNIFIED IDEOGRAPH + {0xEEB4, 0x8C71}, //11702 #CJK UNIFIED IDEOGRAPH + {0xEEB5, 0x8C6F}, //11703 #CJK UNIFIED IDEOGRAPH + {0xEEB6, 0x8C95}, //11704 #CJK UNIFIED IDEOGRAPH + {0xEEB7, 0x8C94}, //11705 #CJK UNIFIED IDEOGRAPH + {0xEEB8, 0x8CF9}, //11706 #CJK UNIFIED IDEOGRAPH + {0xEEB9, 0x8D6F}, //11707 #CJK UNIFIED IDEOGRAPH + {0xEEBA, 0x8E4E}, //11708 #CJK UNIFIED IDEOGRAPH + {0xEEBB, 0x8E4D}, //11709 #CJK UNIFIED IDEOGRAPH + {0xEEBC, 0x8E53}, //11710 #CJK UNIFIED IDEOGRAPH + {0xEEBD, 0x8E50}, //11711 #CJK UNIFIED IDEOGRAPH + {0xEEBE, 0x8E4C}, //11712 #CJK UNIFIED IDEOGRAPH + {0xEEBF, 0x8E47}, //11713 #CJK UNIFIED IDEOGRAPH + {0xEEC0, 0x8F43}, //11714 #CJK UNIFIED IDEOGRAPH + {0xEEC1, 0x8F40}, //11715 #CJK UNIFIED IDEOGRAPH + {0xEEC2, 0x9085}, //11716 #CJK UNIFIED IDEOGRAPH + {0xEEC3, 0x907E}, //11717 #CJK UNIFIED IDEOGRAPH + {0xEEC4, 0x9138}, //11718 #CJK UNIFIED IDEOGRAPH + {0xEEC5, 0x919A}, //11719 #CJK UNIFIED IDEOGRAPH + {0xEEC6, 0x91A2}, //11720 #CJK UNIFIED IDEOGRAPH + {0xEEC7, 0x919B}, //11721 #CJK UNIFIED IDEOGRAPH + {0xEEC8, 0x9199}, //11722 #CJK UNIFIED IDEOGRAPH + {0xEEC9, 0x919F}, //11723 #CJK UNIFIED IDEOGRAPH + {0xEECA, 0x91A1}, //11724 #CJK UNIFIED IDEOGRAPH + {0xEECB, 0x919D}, //11725 #CJK UNIFIED IDEOGRAPH + {0xEECC, 0x91A0}, //11726 #CJK UNIFIED IDEOGRAPH + {0xEECD, 0x93A1}, //11727 #CJK UNIFIED IDEOGRAPH + {0xEECE, 0x9383}, //11728 #CJK UNIFIED IDEOGRAPH + {0xEECF, 0x93AF}, //11729 #CJK UNIFIED IDEOGRAPH + {0xEED0, 0x9364}, //11730 #CJK UNIFIED IDEOGRAPH + {0xEED1, 0x9356}, //11731 #CJK UNIFIED IDEOGRAPH + {0xEED2, 0x9347}, //11732 #CJK UNIFIED IDEOGRAPH + {0xEED3, 0x937C}, //11733 #CJK UNIFIED IDEOGRAPH + {0xEED4, 0x9358}, //11734 #CJK UNIFIED IDEOGRAPH + {0xEED5, 0x935C}, //11735 #CJK UNIFIED IDEOGRAPH + {0xEED6, 0x9376}, //11736 #CJK UNIFIED IDEOGRAPH + {0xEED7, 0x9349}, //11737 #CJK UNIFIED IDEOGRAPH + {0xEED8, 0x9350}, //11738 #CJK UNIFIED IDEOGRAPH + {0xEED9, 0x9351}, //11739 #CJK UNIFIED IDEOGRAPH + {0xEEDA, 0x9360}, //11740 #CJK UNIFIED IDEOGRAPH + {0xEEDB, 0x936D}, //11741 #CJK UNIFIED IDEOGRAPH + {0xEEDC, 0x938F}, //11742 #CJK UNIFIED IDEOGRAPH + {0xEEDD, 0x934C}, //11743 #CJK UNIFIED IDEOGRAPH + {0xEEDE, 0x936A}, //11744 #CJK UNIFIED IDEOGRAPH + {0xEEDF, 0x9379}, //11745 #CJK UNIFIED IDEOGRAPH + {0xEEE0, 0x9357}, //11746 #CJK UNIFIED IDEOGRAPH + {0xEEE1, 0x9355}, //11747 #CJK UNIFIED IDEOGRAPH + {0xEEE2, 0x9352}, //11748 #CJK UNIFIED IDEOGRAPH + {0xEEE3, 0x934F}, //11749 #CJK UNIFIED IDEOGRAPH + {0xEEE4, 0x9371}, //11750 #CJK UNIFIED IDEOGRAPH + {0xEEE5, 0x9377}, //11751 #CJK UNIFIED IDEOGRAPH + {0xEEE6, 0x937B}, //11752 #CJK UNIFIED IDEOGRAPH + {0xEEE7, 0x9361}, //11753 #CJK UNIFIED IDEOGRAPH + {0xEEE8, 0x935E}, //11754 #CJK UNIFIED IDEOGRAPH + {0xEEE9, 0x9363}, //11755 #CJK UNIFIED IDEOGRAPH + {0xEEEA, 0x9367}, //11756 #CJK UNIFIED IDEOGRAPH + {0xEEEB, 0x9380}, //11757 #CJK UNIFIED IDEOGRAPH + {0xEEEC, 0x934E}, //11758 #CJK UNIFIED IDEOGRAPH + {0xEEED, 0x9359}, //11759 #CJK UNIFIED IDEOGRAPH + {0xEEEE, 0x95C7}, //11760 #CJK UNIFIED IDEOGRAPH + {0xEEEF, 0x95C0}, //11761 #CJK UNIFIED IDEOGRAPH + {0xEEF0, 0x95C9}, //11762 #CJK UNIFIED IDEOGRAPH + {0xEEF1, 0x95C3}, //11763 #CJK UNIFIED IDEOGRAPH + {0xEEF2, 0x95C5}, //11764 #CJK UNIFIED IDEOGRAPH + {0xEEF3, 0x95B7}, //11765 #CJK UNIFIED IDEOGRAPH + {0xEEF4, 0x96AE}, //11766 #CJK UNIFIED IDEOGRAPH + {0xEEF5, 0x96B0}, //11767 #CJK UNIFIED IDEOGRAPH + {0xEEF6, 0x96AC}, //11768 #CJK UNIFIED IDEOGRAPH + {0xEEF7, 0x9720}, //11769 #CJK UNIFIED IDEOGRAPH + {0xEEF8, 0x971F}, //11770 #CJK UNIFIED IDEOGRAPH + {0xEEF9, 0x9718}, //11771 #CJK UNIFIED IDEOGRAPH + {0xEEFA, 0x971D}, //11772 #CJK UNIFIED IDEOGRAPH + {0xEEFB, 0x9719}, //11773 #CJK UNIFIED IDEOGRAPH + {0xEEFC, 0x979A}, //11774 #CJK UNIFIED IDEOGRAPH + {0xEEFD, 0x97A1}, //11775 #CJK UNIFIED IDEOGRAPH + {0xEEFE, 0x979C}, //11776 #CJK UNIFIED IDEOGRAPH + {0xEF40, 0x979E}, //11777 #CJK UNIFIED IDEOGRAPH + {0xEF41, 0x979D}, //11778 #CJK UNIFIED IDEOGRAPH + {0xEF42, 0x97D5}, //11779 #CJK UNIFIED IDEOGRAPH + {0xEF43, 0x97D4}, //11780 #CJK UNIFIED IDEOGRAPH + {0xEF44, 0x97F1}, //11781 #CJK UNIFIED IDEOGRAPH + {0xEF45, 0x9841}, //11782 #CJK UNIFIED IDEOGRAPH + {0xEF46, 0x9844}, //11783 #CJK UNIFIED IDEOGRAPH + {0xEF47, 0x984A}, //11784 #CJK UNIFIED IDEOGRAPH + {0xEF48, 0x9849}, //11785 #CJK UNIFIED IDEOGRAPH + {0xEF49, 0x9845}, //11786 #CJK UNIFIED IDEOGRAPH + {0xEF4A, 0x9843}, //11787 #CJK UNIFIED IDEOGRAPH + {0xEF4B, 0x9925}, //11788 #CJK UNIFIED IDEOGRAPH + {0xEF4C, 0x992B}, //11789 #CJK UNIFIED IDEOGRAPH + {0xEF4D, 0x992C}, //11790 #CJK UNIFIED IDEOGRAPH + {0xEF4E, 0x992A}, //11791 #CJK UNIFIED IDEOGRAPH + {0xEF4F, 0x9933}, //11792 #CJK UNIFIED IDEOGRAPH + {0xEF50, 0x9932}, //11793 #CJK UNIFIED IDEOGRAPH + {0xEF51, 0x992F}, //11794 #CJK UNIFIED IDEOGRAPH + {0xEF52, 0x992D}, //11795 #CJK UNIFIED IDEOGRAPH + {0xEF53, 0x9931}, //11796 #CJK UNIFIED IDEOGRAPH + {0xEF54, 0x9930}, //11797 #CJK UNIFIED IDEOGRAPH + {0xEF55, 0x9998}, //11798 #CJK UNIFIED IDEOGRAPH + {0xEF56, 0x99A3}, //11799 #CJK UNIFIED IDEOGRAPH + {0xEF57, 0x99A1}, //11800 #CJK UNIFIED IDEOGRAPH + {0xEF58, 0x9A02}, //11801 #CJK UNIFIED IDEOGRAPH + {0xEF59, 0x99FA}, //11802 #CJK UNIFIED IDEOGRAPH + {0xEF5A, 0x99F4}, //11803 #CJK UNIFIED IDEOGRAPH + {0xEF5B, 0x99F7}, //11804 #CJK UNIFIED IDEOGRAPH + {0xEF5C, 0x99F9}, //11805 #CJK UNIFIED IDEOGRAPH + {0xEF5D, 0x99F8}, //11806 #CJK UNIFIED IDEOGRAPH + {0xEF5E, 0x99F6}, //11807 #CJK UNIFIED IDEOGRAPH + {0xEF5F, 0x99FB}, //11808 #CJK UNIFIED IDEOGRAPH + {0xEF60, 0x99FD}, //11809 #CJK UNIFIED IDEOGRAPH + {0xEF61, 0x99FE}, //11810 #CJK UNIFIED IDEOGRAPH + {0xEF62, 0x99FC}, //11811 #CJK UNIFIED IDEOGRAPH + {0xEF63, 0x9A03}, //11812 #CJK UNIFIED IDEOGRAPH + {0xEF64, 0x9ABE}, //11813 #CJK UNIFIED IDEOGRAPH + {0xEF65, 0x9AFE}, //11814 #CJK UNIFIED IDEOGRAPH + {0xEF66, 0x9AFD}, //11815 #CJK UNIFIED IDEOGRAPH + {0xEF67, 0x9B01}, //11816 #CJK UNIFIED IDEOGRAPH + {0xEF68, 0x9AFC}, //11817 #CJK UNIFIED IDEOGRAPH + {0xEF69, 0x9B48}, //11818 #CJK UNIFIED IDEOGRAPH + {0xEF6A, 0x9B9A}, //11819 #CJK UNIFIED IDEOGRAPH + {0xEF6B, 0x9BA8}, //11820 #CJK UNIFIED IDEOGRAPH + {0xEF6C, 0x9B9E}, //11821 #CJK UNIFIED IDEOGRAPH + {0xEF6D, 0x9B9B}, //11822 #CJK UNIFIED IDEOGRAPH + {0xEF6E, 0x9BA6}, //11823 #CJK UNIFIED IDEOGRAPH + {0xEF6F, 0x9BA1}, //11824 #CJK UNIFIED IDEOGRAPH + {0xEF70, 0x9BA5}, //11825 #CJK UNIFIED IDEOGRAPH + {0xEF71, 0x9BA4}, //11826 #CJK UNIFIED IDEOGRAPH + {0xEF72, 0x9B86}, //11827 #CJK UNIFIED IDEOGRAPH + {0xEF73, 0x9BA2}, //11828 #CJK UNIFIED IDEOGRAPH + {0xEF74, 0x9BA0}, //11829 #CJK UNIFIED IDEOGRAPH + {0xEF75, 0x9BAF}, //11830 #CJK UNIFIED IDEOGRAPH + {0xEF76, 0x9D33}, //11831 #CJK UNIFIED IDEOGRAPH + {0xEF77, 0x9D41}, //11832 #CJK UNIFIED IDEOGRAPH + {0xEF78, 0x9D67}, //11833 #CJK UNIFIED IDEOGRAPH + {0xEF79, 0x9D36}, //11834 #CJK UNIFIED IDEOGRAPH + {0xEF7A, 0x9D2E}, //11835 #CJK UNIFIED IDEOGRAPH + {0xEF7B, 0x9D2F}, //11836 #CJK UNIFIED IDEOGRAPH + {0xEF7C, 0x9D31}, //11837 #CJK UNIFIED IDEOGRAPH + {0xEF7D, 0x9D38}, //11838 #CJK UNIFIED IDEOGRAPH + {0xEF7E, 0x9D30}, //11839 #CJK UNIFIED IDEOGRAPH + {0xEFA1, 0x9D45}, //11840 #CJK UNIFIED IDEOGRAPH + {0xEFA2, 0x9D42}, //11841 #CJK UNIFIED IDEOGRAPH + {0xEFA3, 0x9D43}, //11842 #CJK UNIFIED IDEOGRAPH + {0xEFA4, 0x9D3E}, //11843 #CJK UNIFIED IDEOGRAPH + {0xEFA5, 0x9D37}, //11844 #CJK UNIFIED IDEOGRAPH + {0xEFA6, 0x9D40}, //11845 #CJK UNIFIED IDEOGRAPH + {0xEFA7, 0x9D3D}, //11846 #CJK UNIFIED IDEOGRAPH + {0xEFA8, 0x7FF5}, //11847 #CJK UNIFIED IDEOGRAPH + {0xEFA9, 0x9D2D}, //11848 #CJK UNIFIED IDEOGRAPH + {0xEFAA, 0x9E8A}, //11849 #CJK UNIFIED IDEOGRAPH + {0xEFAB, 0x9E89}, //11850 #CJK UNIFIED IDEOGRAPH + {0xEFAC, 0x9E8D}, //11851 #CJK UNIFIED IDEOGRAPH + {0xEFAD, 0x9EB0}, //11852 #CJK UNIFIED IDEOGRAPH + {0xEFAE, 0x9EC8}, //11853 #CJK UNIFIED IDEOGRAPH + {0xEFAF, 0x9EDA}, //11854 #CJK UNIFIED IDEOGRAPH + {0xEFB0, 0x9EFB}, //11855 #CJK UNIFIED IDEOGRAPH + {0xEFB1, 0x9EFF}, //11856 #CJK UNIFIED IDEOGRAPH + {0xEFB2, 0x9F24}, //11857 #CJK UNIFIED IDEOGRAPH + {0xEFB3, 0x9F23}, //11858 #CJK UNIFIED IDEOGRAPH + {0xEFB4, 0x9F22}, //11859 #CJK UNIFIED IDEOGRAPH + {0xEFB5, 0x9F54}, //11860 #CJK UNIFIED IDEOGRAPH + {0xEFB6, 0x9FA0}, //11861 #CJK UNIFIED IDEOGRAPH + {0xEFB7, 0x5131}, //11862 #CJK UNIFIED IDEOGRAPH + {0xEFB8, 0x512D}, //11863 #CJK UNIFIED IDEOGRAPH + {0xEFB9, 0x512E}, //11864 #CJK UNIFIED IDEOGRAPH + {0xEFBA, 0x5698}, //11865 #CJK UNIFIED IDEOGRAPH + {0xEFBB, 0x569C}, //11866 #CJK UNIFIED IDEOGRAPH + {0xEFBC, 0x5697}, //11867 #CJK UNIFIED IDEOGRAPH + {0xEFBD, 0x569A}, //11868 #CJK UNIFIED IDEOGRAPH + {0xEFBE, 0x569D}, //11869 #CJK UNIFIED IDEOGRAPH + {0xEFBF, 0x5699}, //11870 #CJK UNIFIED IDEOGRAPH + {0xEFC0, 0x5970}, //11871 #CJK UNIFIED IDEOGRAPH + {0xEFC1, 0x5B3C}, //11872 #CJK UNIFIED IDEOGRAPH + {0xEFC2, 0x5C69}, //11873 #CJK UNIFIED IDEOGRAPH + {0xEFC3, 0x5C6A}, //11874 #CJK UNIFIED IDEOGRAPH + {0xEFC4, 0x5DC0}, //11875 #CJK UNIFIED IDEOGRAPH + {0xEFC5, 0x5E6D}, //11876 #CJK UNIFIED IDEOGRAPH + {0xEFC6, 0x5E6E}, //11877 #CJK UNIFIED IDEOGRAPH + {0xEFC7, 0x61D8}, //11878 #CJK UNIFIED IDEOGRAPH + {0xEFC8, 0x61DF}, //11879 #CJK UNIFIED IDEOGRAPH + {0xEFC9, 0x61ED}, //11880 #CJK UNIFIED IDEOGRAPH + {0xEFCA, 0x61EE}, //11881 #CJK UNIFIED IDEOGRAPH + {0xEFCB, 0x61F1}, //11882 #CJK UNIFIED IDEOGRAPH + {0xEFCC, 0x61EA}, //11883 #CJK UNIFIED IDEOGRAPH + {0xEFCD, 0x61F0}, //11884 #CJK UNIFIED IDEOGRAPH + {0xEFCE, 0x61EB}, //11885 #CJK UNIFIED IDEOGRAPH + {0xEFCF, 0x61D6}, //11886 #CJK UNIFIED IDEOGRAPH + {0xEFD0, 0x61E9}, //11887 #CJK UNIFIED IDEOGRAPH + {0xEFD1, 0x64FF}, //11888 #CJK UNIFIED IDEOGRAPH + {0xEFD2, 0x6504}, //11889 #CJK UNIFIED IDEOGRAPH + {0xEFD3, 0x64FD}, //11890 #CJK UNIFIED IDEOGRAPH + {0xEFD4, 0x64F8}, //11891 #CJK UNIFIED IDEOGRAPH + {0xEFD5, 0x6501}, //11892 #CJK UNIFIED IDEOGRAPH + {0xEFD6, 0x6503}, //11893 #CJK UNIFIED IDEOGRAPH + {0xEFD7, 0x64FC}, //11894 #CJK UNIFIED IDEOGRAPH + {0xEFD8, 0x6594}, //11895 #CJK UNIFIED IDEOGRAPH + {0xEFD9, 0x65DB}, //11896 #CJK UNIFIED IDEOGRAPH + {0xEFDA, 0x66DA}, //11897 #CJK UNIFIED IDEOGRAPH + {0xEFDB, 0x66DB}, //11898 #CJK UNIFIED IDEOGRAPH + {0xEFDC, 0x66D8}, //11899 #CJK UNIFIED IDEOGRAPH + {0xEFDD, 0x6AC5}, //11900 #CJK UNIFIED IDEOGRAPH + {0xEFDE, 0x6AB9}, //11901 #CJK UNIFIED IDEOGRAPH + {0xEFDF, 0x6ABD}, //11902 #CJK UNIFIED IDEOGRAPH + {0xEFE0, 0x6AE1}, //11903 #CJK UNIFIED IDEOGRAPH + {0xEFE1, 0x6AC6}, //11904 #CJK UNIFIED IDEOGRAPH + {0xEFE2, 0x6ABA}, //11905 #CJK UNIFIED IDEOGRAPH + {0xEFE3, 0x6AB6}, //11906 #CJK UNIFIED IDEOGRAPH + {0xEFE4, 0x6AB7}, //11907 #CJK UNIFIED IDEOGRAPH + {0xEFE5, 0x6AC7}, //11908 #CJK UNIFIED IDEOGRAPH + {0xEFE6, 0x6AB4}, //11909 #CJK UNIFIED IDEOGRAPH + {0xEFE7, 0x6AAD}, //11910 #CJK UNIFIED IDEOGRAPH + {0xEFE8, 0x6B5E}, //11911 #CJK UNIFIED IDEOGRAPH + {0xEFE9, 0x6BC9}, //11912 #CJK UNIFIED IDEOGRAPH + {0xEFEA, 0x6C0B}, //11913 #CJK UNIFIED IDEOGRAPH + {0xEFEB, 0x7007}, //11914 #CJK UNIFIED IDEOGRAPH + {0xEFEC, 0x700C}, //11915 #CJK UNIFIED IDEOGRAPH + {0xEFED, 0x700D}, //11916 #CJK UNIFIED IDEOGRAPH + {0xEFEE, 0x7001}, //11917 #CJK UNIFIED IDEOGRAPH + {0xEFEF, 0x7005}, //11918 #CJK UNIFIED IDEOGRAPH + {0xEFF0, 0x7014}, //11919 #CJK UNIFIED IDEOGRAPH + {0xEFF1, 0x700E}, //11920 #CJK UNIFIED IDEOGRAPH + {0xEFF2, 0x6FFF}, //11921 #CJK UNIFIED IDEOGRAPH + {0xEFF3, 0x7000}, //11922 #CJK UNIFIED IDEOGRAPH + {0xEFF4, 0x6FFB}, //11923 #CJK UNIFIED IDEOGRAPH + {0xEFF5, 0x7026}, //11924 #CJK UNIFIED IDEOGRAPH + {0xEFF6, 0x6FFC}, //11925 #CJK UNIFIED IDEOGRAPH + {0xEFF7, 0x6FF7}, //11926 #CJK UNIFIED IDEOGRAPH + {0xEFF8, 0x700A}, //11927 #CJK UNIFIED IDEOGRAPH + {0xEFF9, 0x7201}, //11928 #CJK UNIFIED IDEOGRAPH + {0xEFFA, 0x71FF}, //11929 #CJK UNIFIED IDEOGRAPH + {0xEFFB, 0x71F9}, //11930 #CJK UNIFIED IDEOGRAPH + {0xEFFC, 0x7203}, //11931 #CJK UNIFIED IDEOGRAPH + {0xEFFD, 0x71FD}, //11932 #CJK UNIFIED IDEOGRAPH + {0xEFFE, 0x7376}, //11933 #CJK UNIFIED IDEOGRAPH + {0xF040, 0x74B8}, //11934 #CJK UNIFIED IDEOGRAPH + {0xF041, 0x74C0}, //11935 #CJK UNIFIED IDEOGRAPH + {0xF042, 0x74B5}, //11936 #CJK UNIFIED IDEOGRAPH + {0xF043, 0x74C1}, //11937 #CJK UNIFIED IDEOGRAPH + {0xF044, 0x74BE}, //11938 #CJK UNIFIED IDEOGRAPH + {0xF045, 0x74B6}, //11939 #CJK UNIFIED IDEOGRAPH + {0xF046, 0x74BB}, //11940 #CJK UNIFIED IDEOGRAPH + {0xF047, 0x74C2}, //11941 #CJK UNIFIED IDEOGRAPH + {0xF048, 0x7514}, //11942 #CJK UNIFIED IDEOGRAPH + {0xF049, 0x7513}, //11943 #CJK UNIFIED IDEOGRAPH + {0xF04A, 0x765C}, //11944 #CJK UNIFIED IDEOGRAPH + {0xF04B, 0x7664}, //11945 #CJK UNIFIED IDEOGRAPH + {0xF04C, 0x7659}, //11946 #CJK UNIFIED IDEOGRAPH + {0xF04D, 0x7650}, //11947 #CJK UNIFIED IDEOGRAPH + {0xF04E, 0x7653}, //11948 #CJK UNIFIED IDEOGRAPH + {0xF04F, 0x7657}, //11949 #CJK UNIFIED IDEOGRAPH + {0xF050, 0x765A}, //11950 #CJK UNIFIED IDEOGRAPH + {0xF051, 0x76A6}, //11951 #CJK UNIFIED IDEOGRAPH + {0xF052, 0x76BD}, //11952 #CJK UNIFIED IDEOGRAPH + {0xF053, 0x76EC}, //11953 #CJK UNIFIED IDEOGRAPH + {0xF054, 0x77C2}, //11954 #CJK UNIFIED IDEOGRAPH + {0xF055, 0x77BA}, //11955 #CJK UNIFIED IDEOGRAPH + {0xF056, 0x78FF}, //11956 #CJK UNIFIED IDEOGRAPH + {0xF057, 0x790C}, //11957 #CJK UNIFIED IDEOGRAPH + {0xF058, 0x7913}, //11958 #CJK UNIFIED IDEOGRAPH + {0xF059, 0x7914}, //11959 #CJK UNIFIED IDEOGRAPH + {0xF05A, 0x7909}, //11960 #CJK UNIFIED IDEOGRAPH + {0xF05B, 0x7910}, //11961 #CJK UNIFIED IDEOGRAPH + {0xF05C, 0x7912}, //11962 #CJK UNIFIED IDEOGRAPH + {0xF05D, 0x7911}, //11963 #CJK UNIFIED IDEOGRAPH + {0xF05E, 0x79AD}, //11964 #CJK UNIFIED IDEOGRAPH + {0xF05F, 0x79AC}, //11965 #CJK UNIFIED IDEOGRAPH + {0xF060, 0x7A5F}, //11966 #CJK UNIFIED IDEOGRAPH + {0xF061, 0x7C1C}, //11967 #CJK UNIFIED IDEOGRAPH + {0xF062, 0x7C29}, //11968 #CJK UNIFIED IDEOGRAPH + {0xF063, 0x7C19}, //11969 #CJK UNIFIED IDEOGRAPH + {0xF064, 0x7C20}, //11970 #CJK UNIFIED IDEOGRAPH + {0xF065, 0x7C1F}, //11971 #CJK UNIFIED IDEOGRAPH + {0xF066, 0x7C2D}, //11972 #CJK UNIFIED IDEOGRAPH + {0xF067, 0x7C1D}, //11973 #CJK UNIFIED IDEOGRAPH + {0xF068, 0x7C26}, //11974 #CJK UNIFIED IDEOGRAPH + {0xF069, 0x7C28}, //11975 #CJK UNIFIED IDEOGRAPH + {0xF06A, 0x7C22}, //11976 #CJK UNIFIED IDEOGRAPH + {0xF06B, 0x7C25}, //11977 #CJK UNIFIED IDEOGRAPH + {0xF06C, 0x7C30}, //11978 #CJK UNIFIED IDEOGRAPH + {0xF06D, 0x7E5C}, //11979 #CJK UNIFIED IDEOGRAPH + {0xF06E, 0x7E50}, //11980 #CJK UNIFIED IDEOGRAPH + {0xF06F, 0x7E56}, //11981 #CJK UNIFIED IDEOGRAPH + {0xF070, 0x7E63}, //11982 #CJK UNIFIED IDEOGRAPH + {0xF071, 0x7E58}, //11983 #CJK UNIFIED IDEOGRAPH + {0xF072, 0x7E62}, //11984 #CJK UNIFIED IDEOGRAPH + {0xF073, 0x7E5F}, //11985 #CJK UNIFIED IDEOGRAPH + {0xF074, 0x7E51}, //11986 #CJK UNIFIED IDEOGRAPH + {0xF075, 0x7E60}, //11987 #CJK UNIFIED IDEOGRAPH + {0xF076, 0x7E57}, //11988 #CJK UNIFIED IDEOGRAPH + {0xF077, 0x7E53}, //11989 #CJK UNIFIED IDEOGRAPH + {0xF078, 0x7FB5}, //11990 #CJK UNIFIED IDEOGRAPH + {0xF079, 0x7FB3}, //11991 #CJK UNIFIED IDEOGRAPH + {0xF07A, 0x7FF7}, //11992 #CJK UNIFIED IDEOGRAPH + {0xF07B, 0x7FF8}, //11993 #CJK UNIFIED IDEOGRAPH + {0xF07C, 0x8075}, //11994 #CJK UNIFIED IDEOGRAPH + {0xF07D, 0x81D1}, //11995 #CJK UNIFIED IDEOGRAPH + {0xF07E, 0x81D2}, //11996 #CJK UNIFIED IDEOGRAPH + {0xF0A1, 0x81D0}, //11997 #CJK UNIFIED IDEOGRAPH + {0xF0A2, 0x825F}, //11998 #CJK UNIFIED IDEOGRAPH + {0xF0A3, 0x825E}, //11999 #CJK UNIFIED IDEOGRAPH + {0xF0A4, 0x85B4}, //12000 #CJK UNIFIED IDEOGRAPH + {0xF0A5, 0x85C6}, //12001 #CJK UNIFIED IDEOGRAPH + {0xF0A6, 0x85C0}, //12002 #CJK UNIFIED IDEOGRAPH + {0xF0A7, 0x85C3}, //12003 #CJK UNIFIED IDEOGRAPH + {0xF0A8, 0x85C2}, //12004 #CJK UNIFIED IDEOGRAPH + {0xF0A9, 0x85B3}, //12005 #CJK UNIFIED IDEOGRAPH + {0xF0AA, 0x85B5}, //12006 #CJK UNIFIED IDEOGRAPH + {0xF0AB, 0x85BD}, //12007 #CJK UNIFIED IDEOGRAPH + {0xF0AC, 0x85C7}, //12008 #CJK UNIFIED IDEOGRAPH + {0xF0AD, 0x85C4}, //12009 #CJK UNIFIED IDEOGRAPH + {0xF0AE, 0x85BF}, //12010 #CJK UNIFIED IDEOGRAPH + {0xF0AF, 0x85CB}, //12011 #CJK UNIFIED IDEOGRAPH + {0xF0B0, 0x85CE}, //12012 #CJK UNIFIED IDEOGRAPH + {0xF0B1, 0x85C8}, //12013 #CJK UNIFIED IDEOGRAPH + {0xF0B2, 0x85C5}, //12014 #CJK UNIFIED IDEOGRAPH + {0xF0B3, 0x85B1}, //12015 #CJK UNIFIED IDEOGRAPH + {0xF0B4, 0x85B6}, //12016 #CJK UNIFIED IDEOGRAPH + {0xF0B5, 0x85D2}, //12017 #CJK UNIFIED IDEOGRAPH + {0xF0B6, 0x8624}, //12018 #CJK UNIFIED IDEOGRAPH + {0xF0B7, 0x85B8}, //12019 #CJK UNIFIED IDEOGRAPH + {0xF0B8, 0x85B7}, //12020 #CJK UNIFIED IDEOGRAPH + {0xF0B9, 0x85BE}, //12021 #CJK UNIFIED IDEOGRAPH + {0xF0BA, 0x8669}, //12022 #CJK UNIFIED IDEOGRAPH + {0xF0BB, 0x87E7}, //12023 #CJK UNIFIED IDEOGRAPH + {0xF0BC, 0x87E6}, //12024 #CJK UNIFIED IDEOGRAPH + {0xF0BD, 0x87E2}, //12025 #CJK UNIFIED IDEOGRAPH + {0xF0BE, 0x87DB}, //12026 #CJK UNIFIED IDEOGRAPH + {0xF0BF, 0x87EB}, //12027 #CJK UNIFIED IDEOGRAPH + {0xF0C0, 0x87EA}, //12028 #CJK UNIFIED IDEOGRAPH + {0xF0C1, 0x87E5}, //12029 #CJK UNIFIED IDEOGRAPH + {0xF0C2, 0x87DF}, //12030 #CJK UNIFIED IDEOGRAPH + {0xF0C3, 0x87F3}, //12031 #CJK UNIFIED IDEOGRAPH + {0xF0C4, 0x87E4}, //12032 #CJK UNIFIED IDEOGRAPH + {0xF0C5, 0x87D4}, //12033 #CJK UNIFIED IDEOGRAPH + {0xF0C6, 0x87DC}, //12034 #CJK UNIFIED IDEOGRAPH + {0xF0C7, 0x87D3}, //12035 #CJK UNIFIED IDEOGRAPH + {0xF0C8, 0x87ED}, //12036 #CJK UNIFIED IDEOGRAPH + {0xF0C9, 0x87D8}, //12037 #CJK UNIFIED IDEOGRAPH + {0xF0CA, 0x87E3}, //12038 #CJK UNIFIED IDEOGRAPH + {0xF0CB, 0x87A4}, //12039 #CJK UNIFIED IDEOGRAPH + {0xF0CC, 0x87D7}, //12040 #CJK UNIFIED IDEOGRAPH + {0xF0CD, 0x87D9}, //12041 #CJK UNIFIED IDEOGRAPH + {0xF0CE, 0x8801}, //12042 #CJK UNIFIED IDEOGRAPH + {0xF0CF, 0x87F4}, //12043 #CJK UNIFIED IDEOGRAPH + {0xF0D0, 0x87E8}, //12044 #CJK UNIFIED IDEOGRAPH + {0xF0D1, 0x87DD}, //12045 #CJK UNIFIED IDEOGRAPH + {0xF0D2, 0x8953}, //12046 #CJK UNIFIED IDEOGRAPH + {0xF0D3, 0x894B}, //12047 #CJK UNIFIED IDEOGRAPH + {0xF0D4, 0x894F}, //12048 #CJK UNIFIED IDEOGRAPH + {0xF0D5, 0x894C}, //12049 #CJK UNIFIED IDEOGRAPH + {0xF0D6, 0x8946}, //12050 #CJK UNIFIED IDEOGRAPH + {0xF0D7, 0x8950}, //12051 #CJK UNIFIED IDEOGRAPH + {0xF0D8, 0x8951}, //12052 #CJK UNIFIED IDEOGRAPH + {0xF0D9, 0x8949}, //12053 #CJK UNIFIED IDEOGRAPH + {0xF0DA, 0x8B2A}, //12054 #CJK UNIFIED IDEOGRAPH + {0xF0DB, 0x8B27}, //12055 #CJK UNIFIED IDEOGRAPH + {0xF0DC, 0x8B23}, //12056 #CJK UNIFIED IDEOGRAPH + {0xF0DD, 0x8B33}, //12057 #CJK UNIFIED IDEOGRAPH + {0xF0DE, 0x8B30}, //12058 #CJK UNIFIED IDEOGRAPH + {0xF0DF, 0x8B35}, //12059 #CJK UNIFIED IDEOGRAPH + {0xF0E0, 0x8B47}, //12060 #CJK UNIFIED IDEOGRAPH + {0xF0E1, 0x8B2F}, //12061 #CJK UNIFIED IDEOGRAPH + {0xF0E2, 0x8B3C}, //12062 #CJK UNIFIED IDEOGRAPH + {0xF0E3, 0x8B3E}, //12063 #CJK UNIFIED IDEOGRAPH + {0xF0E4, 0x8B31}, //12064 #CJK UNIFIED IDEOGRAPH + {0xF0E5, 0x8B25}, //12065 #CJK UNIFIED IDEOGRAPH + {0xF0E6, 0x8B37}, //12066 #CJK UNIFIED IDEOGRAPH + {0xF0E7, 0x8B26}, //12067 #CJK UNIFIED IDEOGRAPH + {0xF0E8, 0x8B36}, //12068 #CJK UNIFIED IDEOGRAPH + {0xF0E9, 0x8B2E}, //12069 #CJK UNIFIED IDEOGRAPH + {0xF0EA, 0x8B24}, //12070 #CJK UNIFIED IDEOGRAPH + {0xF0EB, 0x8B3B}, //12071 #CJK UNIFIED IDEOGRAPH + {0xF0EC, 0x8B3D}, //12072 #CJK UNIFIED IDEOGRAPH + {0xF0ED, 0x8B3A}, //12073 #CJK UNIFIED IDEOGRAPH + {0xF0EE, 0x8C42}, //12074 #CJK UNIFIED IDEOGRAPH + {0xF0EF, 0x8C75}, //12075 #CJK UNIFIED IDEOGRAPH + {0xF0F0, 0x8C99}, //12076 #CJK UNIFIED IDEOGRAPH + {0xF0F1, 0x8C98}, //12077 #CJK UNIFIED IDEOGRAPH + {0xF0F2, 0x8C97}, //12078 #CJK UNIFIED IDEOGRAPH + {0xF0F3, 0x8CFE}, //12079 #CJK UNIFIED IDEOGRAPH + {0xF0F4, 0x8D04}, //12080 #CJK UNIFIED IDEOGRAPH + {0xF0F5, 0x8D02}, //12081 #CJK UNIFIED IDEOGRAPH + {0xF0F6, 0x8D00}, //12082 #CJK UNIFIED IDEOGRAPH + {0xF0F7, 0x8E5C}, //12083 #CJK UNIFIED IDEOGRAPH + {0xF0F8, 0x8E62}, //12084 #CJK UNIFIED IDEOGRAPH + {0xF0F9, 0x8E60}, //12085 #CJK UNIFIED IDEOGRAPH + {0xF0FA, 0x8E57}, //12086 #CJK UNIFIED IDEOGRAPH + {0xF0FB, 0x8E56}, //12087 #CJK UNIFIED IDEOGRAPH + {0xF0FC, 0x8E5E}, //12088 #CJK UNIFIED IDEOGRAPH + {0xF0FD, 0x8E65}, //12089 #CJK UNIFIED IDEOGRAPH + {0xF0FE, 0x8E67}, //12090 #CJK UNIFIED IDEOGRAPH + {0xF140, 0x8E5B}, //12091 #CJK UNIFIED IDEOGRAPH + {0xF141, 0x8E5A}, //12092 #CJK UNIFIED IDEOGRAPH + {0xF142, 0x8E61}, //12093 #CJK UNIFIED IDEOGRAPH + {0xF143, 0x8E5D}, //12094 #CJK UNIFIED IDEOGRAPH + {0xF144, 0x8E69}, //12095 #CJK UNIFIED IDEOGRAPH + {0xF145, 0x8E54}, //12096 #CJK UNIFIED IDEOGRAPH + {0xF146, 0x8F46}, //12097 #CJK UNIFIED IDEOGRAPH + {0xF147, 0x8F47}, //12098 #CJK UNIFIED IDEOGRAPH + {0xF148, 0x8F48}, //12099 #CJK UNIFIED IDEOGRAPH + {0xF149, 0x8F4B}, //12100 #CJK UNIFIED IDEOGRAPH + {0xF14A, 0x9128}, //12101 #CJK UNIFIED IDEOGRAPH + {0xF14B, 0x913A}, //12102 #CJK UNIFIED IDEOGRAPH + {0xF14C, 0x913B}, //12103 #CJK UNIFIED IDEOGRAPH + {0xF14D, 0x913E}, //12104 #CJK UNIFIED IDEOGRAPH + {0xF14E, 0x91A8}, //12105 #CJK UNIFIED IDEOGRAPH + {0xF14F, 0x91A5}, //12106 #CJK UNIFIED IDEOGRAPH + {0xF150, 0x91A7}, //12107 #CJK UNIFIED IDEOGRAPH + {0xF151, 0x91AF}, //12108 #CJK UNIFIED IDEOGRAPH + {0xF152, 0x91AA}, //12109 #CJK UNIFIED IDEOGRAPH + {0xF153, 0x93B5}, //12110 #CJK UNIFIED IDEOGRAPH + {0xF154, 0x938C}, //12111 #CJK UNIFIED IDEOGRAPH + {0xF155, 0x9392}, //12112 #CJK UNIFIED IDEOGRAPH + {0xF156, 0x93B7}, //12113 #CJK UNIFIED IDEOGRAPH + {0xF157, 0x939B}, //12114 #CJK UNIFIED IDEOGRAPH + {0xF158, 0x939D}, //12115 #CJK UNIFIED IDEOGRAPH + {0xF159, 0x9389}, //12116 #CJK UNIFIED IDEOGRAPH + {0xF15A, 0x93A7}, //12117 #CJK UNIFIED IDEOGRAPH + {0xF15B, 0x938E}, //12118 #CJK UNIFIED IDEOGRAPH + {0xF15C, 0x93AA}, //12119 #CJK UNIFIED IDEOGRAPH + {0xF15D, 0x939E}, //12120 #CJK UNIFIED IDEOGRAPH + {0xF15E, 0x93A6}, //12121 #CJK UNIFIED IDEOGRAPH + {0xF15F, 0x9395}, //12122 #CJK UNIFIED IDEOGRAPH + {0xF160, 0x9388}, //12123 #CJK UNIFIED IDEOGRAPH + {0xF161, 0x9399}, //12124 #CJK UNIFIED IDEOGRAPH + {0xF162, 0x939F}, //12125 #CJK UNIFIED IDEOGRAPH + {0xF163, 0x938D}, //12126 #CJK UNIFIED IDEOGRAPH + {0xF164, 0x93B1}, //12127 #CJK UNIFIED IDEOGRAPH + {0xF165, 0x9391}, //12128 #CJK UNIFIED IDEOGRAPH + {0xF166, 0x93B2}, //12129 #CJK UNIFIED IDEOGRAPH + {0xF167, 0x93A4}, //12130 #CJK UNIFIED IDEOGRAPH + {0xF168, 0x93A8}, //12131 #CJK UNIFIED IDEOGRAPH + {0xF169, 0x93B4}, //12132 #CJK UNIFIED IDEOGRAPH + {0xF16A, 0x93A3}, //12133 #CJK UNIFIED IDEOGRAPH + {0xF16B, 0x93A5}, //12134 #CJK UNIFIED IDEOGRAPH + {0xF16C, 0x95D2}, //12135 #CJK UNIFIED IDEOGRAPH + {0xF16D, 0x95D3}, //12136 #CJK UNIFIED IDEOGRAPH + {0xF16E, 0x95D1}, //12137 #CJK UNIFIED IDEOGRAPH + {0xF16F, 0x96B3}, //12138 #CJK UNIFIED IDEOGRAPH + {0xF170, 0x96D7}, //12139 #CJK UNIFIED IDEOGRAPH + {0xF171, 0x96DA}, //12140 #CJK UNIFIED IDEOGRAPH + {0xF172, 0x5DC2}, //12141 #CJK UNIFIED IDEOGRAPH + {0xF173, 0x96DF}, //12142 #CJK UNIFIED IDEOGRAPH + {0xF174, 0x96D8}, //12143 #CJK UNIFIED IDEOGRAPH + {0xF175, 0x96DD}, //12144 #CJK UNIFIED IDEOGRAPH + {0xF176, 0x9723}, //12145 #CJK UNIFIED IDEOGRAPH + {0xF177, 0x9722}, //12146 #CJK UNIFIED IDEOGRAPH + {0xF178, 0x9725}, //12147 #CJK UNIFIED IDEOGRAPH + {0xF179, 0x97AC}, //12148 #CJK UNIFIED IDEOGRAPH + {0xF17A, 0x97AE}, //12149 #CJK UNIFIED IDEOGRAPH + {0xF17B, 0x97A8}, //12150 #CJK UNIFIED IDEOGRAPH + {0xF17C, 0x97AB}, //12151 #CJK UNIFIED IDEOGRAPH + {0xF17D, 0x97A4}, //12152 #CJK UNIFIED IDEOGRAPH + {0xF17E, 0x97AA}, //12153 #CJK UNIFIED IDEOGRAPH + {0xF1A1, 0x97A2}, //12154 #CJK UNIFIED IDEOGRAPH + {0xF1A2, 0x97A5}, //12155 #CJK UNIFIED IDEOGRAPH + {0xF1A3, 0x97D7}, //12156 #CJK UNIFIED IDEOGRAPH + {0xF1A4, 0x97D9}, //12157 #CJK UNIFIED IDEOGRAPH + {0xF1A5, 0x97D6}, //12158 #CJK UNIFIED IDEOGRAPH + {0xF1A6, 0x97D8}, //12159 #CJK UNIFIED IDEOGRAPH + {0xF1A7, 0x97FA}, //12160 #CJK UNIFIED IDEOGRAPH + {0xF1A8, 0x9850}, //12161 #CJK UNIFIED IDEOGRAPH + {0xF1A9, 0x9851}, //12162 #CJK UNIFIED IDEOGRAPH + {0xF1AA, 0x9852}, //12163 #CJK UNIFIED IDEOGRAPH + {0xF1AB, 0x98B8}, //12164 #CJK UNIFIED IDEOGRAPH + {0xF1AC, 0x9941}, //12165 #CJK UNIFIED IDEOGRAPH + {0xF1AD, 0x993C}, //12166 #CJK UNIFIED IDEOGRAPH + {0xF1AE, 0x993A}, //12167 #CJK UNIFIED IDEOGRAPH + {0xF1AF, 0x9A0F}, //12168 #CJK UNIFIED IDEOGRAPH + {0xF1B0, 0x9A0B}, //12169 #CJK UNIFIED IDEOGRAPH + {0xF1B1, 0x9A09}, //12170 #CJK UNIFIED IDEOGRAPH + {0xF1B2, 0x9A0D}, //12171 #CJK UNIFIED IDEOGRAPH + {0xF1B3, 0x9A04}, //12172 #CJK UNIFIED IDEOGRAPH + {0xF1B4, 0x9A11}, //12173 #CJK UNIFIED IDEOGRAPH + {0xF1B5, 0x9A0A}, //12174 #CJK UNIFIED IDEOGRAPH + {0xF1B6, 0x9A05}, //12175 #CJK UNIFIED IDEOGRAPH + {0xF1B7, 0x9A07}, //12176 #CJK UNIFIED IDEOGRAPH + {0xF1B8, 0x9A06}, //12177 #CJK UNIFIED IDEOGRAPH + {0xF1B9, 0x9AC0}, //12178 #CJK UNIFIED IDEOGRAPH + {0xF1BA, 0x9ADC}, //12179 #CJK UNIFIED IDEOGRAPH + {0xF1BB, 0x9B08}, //12180 #CJK UNIFIED IDEOGRAPH + {0xF1BC, 0x9B04}, //12181 #CJK UNIFIED IDEOGRAPH + {0xF1BD, 0x9B05}, //12182 #CJK UNIFIED IDEOGRAPH + {0xF1BE, 0x9B29}, //12183 #CJK UNIFIED IDEOGRAPH + {0xF1BF, 0x9B35}, //12184 #CJK UNIFIED IDEOGRAPH + {0xF1C0, 0x9B4A}, //12185 #CJK UNIFIED IDEOGRAPH + {0xF1C1, 0x9B4C}, //12186 #CJK UNIFIED IDEOGRAPH + {0xF1C2, 0x9B4B}, //12187 #CJK UNIFIED IDEOGRAPH + {0xF1C3, 0x9BC7}, //12188 #CJK UNIFIED IDEOGRAPH + {0xF1C4, 0x9BC6}, //12189 #CJK UNIFIED IDEOGRAPH + {0xF1C5, 0x9BC3}, //12190 #CJK UNIFIED IDEOGRAPH + {0xF1C6, 0x9BBF}, //12191 #CJK UNIFIED IDEOGRAPH + {0xF1C7, 0x9BC1}, //12192 #CJK UNIFIED IDEOGRAPH + {0xF1C8, 0x9BB5}, //12193 #CJK UNIFIED IDEOGRAPH + {0xF1C9, 0x9BB8}, //12194 #CJK UNIFIED IDEOGRAPH + {0xF1CA, 0x9BD3}, //12195 #CJK UNIFIED IDEOGRAPH + {0xF1CB, 0x9BB6}, //12196 #CJK UNIFIED IDEOGRAPH + {0xF1CC, 0x9BC4}, //12197 #CJK UNIFIED IDEOGRAPH + {0xF1CD, 0x9BB9}, //12198 #CJK UNIFIED IDEOGRAPH + {0xF1CE, 0x9BBD}, //12199 #CJK UNIFIED IDEOGRAPH + {0xF1CF, 0x9D5C}, //12200 #CJK UNIFIED IDEOGRAPH + {0xF1D0, 0x9D53}, //12201 #CJK UNIFIED IDEOGRAPH + {0xF1D1, 0x9D4F}, //12202 #CJK UNIFIED IDEOGRAPH + {0xF1D2, 0x9D4A}, //12203 #CJK UNIFIED IDEOGRAPH + {0xF1D3, 0x9D5B}, //12204 #CJK UNIFIED IDEOGRAPH + {0xF1D4, 0x9D4B}, //12205 #CJK UNIFIED IDEOGRAPH + {0xF1D5, 0x9D59}, //12206 #CJK UNIFIED IDEOGRAPH + {0xF1D6, 0x9D56}, //12207 #CJK UNIFIED IDEOGRAPH + {0xF1D7, 0x9D4C}, //12208 #CJK UNIFIED IDEOGRAPH + {0xF1D8, 0x9D57}, //12209 #CJK UNIFIED IDEOGRAPH + {0xF1D9, 0x9D52}, //12210 #CJK UNIFIED IDEOGRAPH + {0xF1DA, 0x9D54}, //12211 #CJK UNIFIED IDEOGRAPH + {0xF1DB, 0x9D5F}, //12212 #CJK UNIFIED IDEOGRAPH + {0xF1DC, 0x9D58}, //12213 #CJK UNIFIED IDEOGRAPH + {0xF1DD, 0x9D5A}, //12214 #CJK UNIFIED IDEOGRAPH + {0xF1DE, 0x9E8E}, //12215 #CJK UNIFIED IDEOGRAPH + {0xF1DF, 0x9E8C}, //12216 #CJK UNIFIED IDEOGRAPH + {0xF1E0, 0x9EDF}, //12217 #CJK UNIFIED IDEOGRAPH + {0xF1E1, 0x9F01}, //12218 #CJK UNIFIED IDEOGRAPH + {0xF1E2, 0x9F00}, //12219 #CJK UNIFIED IDEOGRAPH + {0xF1E3, 0x9F16}, //12220 #CJK UNIFIED IDEOGRAPH + {0xF1E4, 0x9F25}, //12221 #CJK UNIFIED IDEOGRAPH + {0xF1E5, 0x9F2B}, //12222 #CJK UNIFIED IDEOGRAPH + {0xF1E6, 0x9F2A}, //12223 #CJK UNIFIED IDEOGRAPH + {0xF1E7, 0x9F29}, //12224 #CJK UNIFIED IDEOGRAPH + {0xF1E8, 0x9F28}, //12225 #CJK UNIFIED IDEOGRAPH + {0xF1E9, 0x9F4C}, //12226 #CJK UNIFIED IDEOGRAPH + {0xF1EA, 0x9F55}, //12227 #CJK UNIFIED IDEOGRAPH + {0xF1EB, 0x5134}, //12228 #CJK UNIFIED IDEOGRAPH + {0xF1EC, 0x5135}, //12229 #CJK UNIFIED IDEOGRAPH + {0xF1ED, 0x5296}, //12230 #CJK UNIFIED IDEOGRAPH + {0xF1EE, 0x52F7}, //12231 #CJK UNIFIED IDEOGRAPH + {0xF1EF, 0x53B4}, //12232 #CJK UNIFIED IDEOGRAPH + {0xF1F0, 0x56AB}, //12233 #CJK UNIFIED IDEOGRAPH + {0xF1F1, 0x56AD}, //12234 #CJK UNIFIED IDEOGRAPH + {0xF1F2, 0x56A6}, //12235 #CJK UNIFIED IDEOGRAPH + {0xF1F3, 0x56A7}, //12236 #CJK UNIFIED IDEOGRAPH + {0xF1F4, 0x56AA}, //12237 #CJK UNIFIED IDEOGRAPH + {0xF1F5, 0x56AC}, //12238 #CJK UNIFIED IDEOGRAPH + {0xF1F6, 0x58DA}, //12239 #CJK UNIFIED IDEOGRAPH + {0xF1F7, 0x58DD}, //12240 #CJK UNIFIED IDEOGRAPH + {0xF1F8, 0x58DB}, //12241 #CJK UNIFIED IDEOGRAPH + {0xF1F9, 0x5912}, //12242 #CJK UNIFIED IDEOGRAPH + {0xF1FA, 0x5B3D}, //12243 #CJK UNIFIED IDEOGRAPH + {0xF1FB, 0x5B3E}, //12244 #CJK UNIFIED IDEOGRAPH + {0xF1FC, 0x5B3F}, //12245 #CJK UNIFIED IDEOGRAPH + {0xF1FD, 0x5DC3}, //12246 #CJK UNIFIED IDEOGRAPH + {0xF1FE, 0x5E70}, //12247 #CJK UNIFIED IDEOGRAPH + {0xF240, 0x5FBF}, //12248 #CJK UNIFIED IDEOGRAPH + {0xF241, 0x61FB}, //12249 #CJK UNIFIED IDEOGRAPH + {0xF242, 0x6507}, //12250 #CJK UNIFIED IDEOGRAPH + {0xF243, 0x6510}, //12251 #CJK UNIFIED IDEOGRAPH + {0xF244, 0x650D}, //12252 #CJK UNIFIED IDEOGRAPH + {0xF245, 0x6509}, //12253 #CJK UNIFIED IDEOGRAPH + {0xF246, 0x650C}, //12254 #CJK UNIFIED IDEOGRAPH + {0xF247, 0x650E}, //12255 #CJK UNIFIED IDEOGRAPH + {0xF248, 0x6584}, //12256 #CJK UNIFIED IDEOGRAPH + {0xF249, 0x65DE}, //12257 #CJK UNIFIED IDEOGRAPH + {0xF24A, 0x65DD}, //12258 #CJK UNIFIED IDEOGRAPH + {0xF24B, 0x66DE}, //12259 #CJK UNIFIED IDEOGRAPH + {0xF24C, 0x6AE7}, //12260 #CJK UNIFIED IDEOGRAPH + {0xF24D, 0x6AE0}, //12261 #CJK UNIFIED IDEOGRAPH + {0xF24E, 0x6ACC}, //12262 #CJK UNIFIED IDEOGRAPH + {0xF24F, 0x6AD1}, //12263 #CJK UNIFIED IDEOGRAPH + {0xF250, 0x6AD9}, //12264 #CJK UNIFIED IDEOGRAPH + {0xF251, 0x6ACB}, //12265 #CJK UNIFIED IDEOGRAPH + {0xF252, 0x6ADF}, //12266 #CJK UNIFIED IDEOGRAPH + {0xF253, 0x6ADC}, //12267 #CJK UNIFIED IDEOGRAPH + {0xF254, 0x6AD0}, //12268 #CJK UNIFIED IDEOGRAPH + {0xF255, 0x6AEB}, //12269 #CJK UNIFIED IDEOGRAPH + {0xF256, 0x6ACF}, //12270 #CJK UNIFIED IDEOGRAPH + {0xF257, 0x6ACD}, //12271 #CJK UNIFIED IDEOGRAPH + {0xF258, 0x6ADE}, //12272 #CJK UNIFIED IDEOGRAPH + {0xF259, 0x6B60}, //12273 #CJK UNIFIED IDEOGRAPH + {0xF25A, 0x6BB0}, //12274 #CJK UNIFIED IDEOGRAPH + {0xF25B, 0x6C0C}, //12275 #CJK UNIFIED IDEOGRAPH + {0xF25C, 0x7019}, //12276 #CJK UNIFIED IDEOGRAPH + {0xF25D, 0x7027}, //12277 #CJK UNIFIED IDEOGRAPH + {0xF25E, 0x7020}, //12278 #CJK UNIFIED IDEOGRAPH + {0xF25F, 0x7016}, //12279 #CJK UNIFIED IDEOGRAPH + {0xF260, 0x702B}, //12280 #CJK UNIFIED IDEOGRAPH + {0xF261, 0x7021}, //12281 #CJK UNIFIED IDEOGRAPH + {0xF262, 0x7022}, //12282 #CJK UNIFIED IDEOGRAPH + {0xF263, 0x7023}, //12283 #CJK UNIFIED IDEOGRAPH + {0xF264, 0x7029}, //12284 #CJK UNIFIED IDEOGRAPH + {0xF265, 0x7017}, //12285 #CJK UNIFIED IDEOGRAPH + {0xF266, 0x7024}, //12286 #CJK UNIFIED IDEOGRAPH + {0xF267, 0x701C}, //12287 #CJK UNIFIED IDEOGRAPH + {0xF268, 0x702A}, //12288 #CJK UNIFIED IDEOGRAPH + {0xF269, 0x720C}, //12289 #CJK UNIFIED IDEOGRAPH + {0xF26A, 0x720A}, //12290 #CJK UNIFIED IDEOGRAPH + {0xF26B, 0x7207}, //12291 #CJK UNIFIED IDEOGRAPH + {0xF26C, 0x7202}, //12292 #CJK UNIFIED IDEOGRAPH + {0xF26D, 0x7205}, //12293 #CJK UNIFIED IDEOGRAPH + {0xF26E, 0x72A5}, //12294 #CJK UNIFIED IDEOGRAPH + {0xF26F, 0x72A6}, //12295 #CJK UNIFIED IDEOGRAPH + {0xF270, 0x72A4}, //12296 #CJK UNIFIED IDEOGRAPH + {0xF271, 0x72A3}, //12297 #CJK UNIFIED IDEOGRAPH + {0xF272, 0x72A1}, //12298 #CJK UNIFIED IDEOGRAPH + {0xF273, 0x74CB}, //12299 #CJK UNIFIED IDEOGRAPH + {0xF274, 0x74C5}, //12300 #CJK UNIFIED IDEOGRAPH + {0xF275, 0x74B7}, //12301 #CJK UNIFIED IDEOGRAPH + {0xF276, 0x74C3}, //12302 #CJK UNIFIED IDEOGRAPH + {0xF277, 0x7516}, //12303 #CJK UNIFIED IDEOGRAPH + {0xF278, 0x7660}, //12304 #CJK UNIFIED IDEOGRAPH + {0xF279, 0x77C9}, //12305 #CJK UNIFIED IDEOGRAPH + {0xF27A, 0x77CA}, //12306 #CJK UNIFIED IDEOGRAPH + {0xF27B, 0x77C4}, //12307 #CJK UNIFIED IDEOGRAPH + {0xF27C, 0x77F1}, //12308 #CJK UNIFIED IDEOGRAPH + {0xF27D, 0x791D}, //12309 #CJK UNIFIED IDEOGRAPH + {0xF27E, 0x791B}, //12310 #CJK UNIFIED IDEOGRAPH + {0xF2A1, 0x7921}, //12311 #CJK UNIFIED IDEOGRAPH + {0xF2A2, 0x791C}, //12312 #CJK UNIFIED IDEOGRAPH + {0xF2A3, 0x7917}, //12313 #CJK UNIFIED IDEOGRAPH + {0xF2A4, 0x791E}, //12314 #CJK UNIFIED IDEOGRAPH + {0xF2A5, 0x79B0}, //12315 #CJK UNIFIED IDEOGRAPH + {0xF2A6, 0x7A67}, //12316 #CJK UNIFIED IDEOGRAPH + {0xF2A7, 0x7A68}, //12317 #CJK UNIFIED IDEOGRAPH + {0xF2A8, 0x7C33}, //12318 #CJK UNIFIED IDEOGRAPH + {0xF2A9, 0x7C3C}, //12319 #CJK UNIFIED IDEOGRAPH + {0xF2AA, 0x7C39}, //12320 #CJK UNIFIED IDEOGRAPH + {0xF2AB, 0x7C2C}, //12321 #CJK UNIFIED IDEOGRAPH + {0xF2AC, 0x7C3B}, //12322 #CJK UNIFIED IDEOGRAPH + {0xF2AD, 0x7CEC}, //12323 #CJK UNIFIED IDEOGRAPH + {0xF2AE, 0x7CEA}, //12324 #CJK UNIFIED IDEOGRAPH + {0xF2AF, 0x7E76}, //12325 #CJK UNIFIED IDEOGRAPH + {0xF2B0, 0x7E75}, //12326 #CJK UNIFIED IDEOGRAPH + {0xF2B1, 0x7E78}, //12327 #CJK UNIFIED IDEOGRAPH + {0xF2B2, 0x7E70}, //12328 #CJK UNIFIED IDEOGRAPH + {0xF2B3, 0x7E77}, //12329 #CJK UNIFIED IDEOGRAPH + {0xF2B4, 0x7E6F}, //12330 #CJK UNIFIED IDEOGRAPH + {0xF2B5, 0x7E7A}, //12331 #CJK UNIFIED IDEOGRAPH + {0xF2B6, 0x7E72}, //12332 #CJK UNIFIED IDEOGRAPH + {0xF2B7, 0x7E74}, //12333 #CJK UNIFIED IDEOGRAPH + {0xF2B8, 0x7E68}, //12334 #CJK UNIFIED IDEOGRAPH + {0xF2B9, 0x7F4B}, //12335 #CJK UNIFIED IDEOGRAPH + {0xF2BA, 0x7F4A}, //12336 #CJK UNIFIED IDEOGRAPH + {0xF2BB, 0x7F83}, //12337 #CJK UNIFIED IDEOGRAPH + {0xF2BC, 0x7F86}, //12338 #CJK UNIFIED IDEOGRAPH + {0xF2BD, 0x7FB7}, //12339 #CJK UNIFIED IDEOGRAPH + {0xF2BE, 0x7FFD}, //12340 #CJK UNIFIED IDEOGRAPH + {0xF2BF, 0x7FFE}, //12341 #CJK UNIFIED IDEOGRAPH + {0xF2C0, 0x8078}, //12342 #CJK UNIFIED IDEOGRAPH + {0xF2C1, 0x81D7}, //12343 #CJK UNIFIED IDEOGRAPH + {0xF2C2, 0x81D5}, //12344 #CJK UNIFIED IDEOGRAPH + {0xF2C3, 0x8264}, //12345 #CJK UNIFIED IDEOGRAPH + {0xF2C4, 0x8261}, //12346 #CJK UNIFIED IDEOGRAPH + {0xF2C5, 0x8263}, //12347 #CJK UNIFIED IDEOGRAPH + {0xF2C6, 0x85EB}, //12348 #CJK UNIFIED IDEOGRAPH + {0xF2C7, 0x85F1}, //12349 #CJK UNIFIED IDEOGRAPH + {0xF2C8, 0x85ED}, //12350 #CJK UNIFIED IDEOGRAPH + {0xF2C9, 0x85D9}, //12351 #CJK UNIFIED IDEOGRAPH + {0xF2CA, 0x85E1}, //12352 #CJK UNIFIED IDEOGRAPH + {0xF2CB, 0x85E8}, //12353 #CJK UNIFIED IDEOGRAPH + {0xF2CC, 0x85DA}, //12354 #CJK UNIFIED IDEOGRAPH + {0xF2CD, 0x85D7}, //12355 #CJK UNIFIED IDEOGRAPH + {0xF2CE, 0x85EC}, //12356 #CJK UNIFIED IDEOGRAPH + {0xF2CF, 0x85F2}, //12357 #CJK UNIFIED IDEOGRAPH + {0xF2D0, 0x85F8}, //12358 #CJK UNIFIED IDEOGRAPH + {0xF2D1, 0x85D8}, //12359 #CJK UNIFIED IDEOGRAPH + {0xF2D2, 0x85DF}, //12360 #CJK UNIFIED IDEOGRAPH + {0xF2D3, 0x85E3}, //12361 #CJK UNIFIED IDEOGRAPH + {0xF2D4, 0x85DC}, //12362 #CJK UNIFIED IDEOGRAPH + {0xF2D5, 0x85D1}, //12363 #CJK UNIFIED IDEOGRAPH + {0xF2D6, 0x85F0}, //12364 #CJK UNIFIED IDEOGRAPH + {0xF2D7, 0x85E6}, //12365 #CJK UNIFIED IDEOGRAPH + {0xF2D8, 0x85EF}, //12366 #CJK UNIFIED IDEOGRAPH + {0xF2D9, 0x85DE}, //12367 #CJK UNIFIED IDEOGRAPH + {0xF2DA, 0x85E2}, //12368 #CJK UNIFIED IDEOGRAPH + {0xF2DB, 0x8800}, //12369 #CJK UNIFIED IDEOGRAPH + {0xF2DC, 0x87FA}, //12370 #CJK UNIFIED IDEOGRAPH + {0xF2DD, 0x8803}, //12371 #CJK UNIFIED IDEOGRAPH + {0xF2DE, 0x87F6}, //12372 #CJK UNIFIED IDEOGRAPH + {0xF2DF, 0x87F7}, //12373 #CJK UNIFIED IDEOGRAPH + {0xF2E0, 0x8809}, //12374 #CJK UNIFIED IDEOGRAPH + {0xF2E1, 0x880C}, //12375 #CJK UNIFIED IDEOGRAPH + {0xF2E2, 0x880B}, //12376 #CJK UNIFIED IDEOGRAPH + {0xF2E3, 0x8806}, //12377 #CJK UNIFIED IDEOGRAPH + {0xF2E4, 0x87FC}, //12378 #CJK UNIFIED IDEOGRAPH + {0xF2E5, 0x8808}, //12379 #CJK UNIFIED IDEOGRAPH + {0xF2E6, 0x87FF}, //12380 #CJK UNIFIED IDEOGRAPH + {0xF2E7, 0x880A}, //12381 #CJK UNIFIED IDEOGRAPH + {0xF2E8, 0x8802}, //12382 #CJK UNIFIED IDEOGRAPH + {0xF2E9, 0x8962}, //12383 #CJK UNIFIED IDEOGRAPH + {0xF2EA, 0x895A}, //12384 #CJK UNIFIED IDEOGRAPH + {0xF2EB, 0x895B}, //12385 #CJK UNIFIED IDEOGRAPH + {0xF2EC, 0x8957}, //12386 #CJK UNIFIED IDEOGRAPH + {0xF2ED, 0x8961}, //12387 #CJK UNIFIED IDEOGRAPH + {0xF2EE, 0x895C}, //12388 #CJK UNIFIED IDEOGRAPH + {0xF2EF, 0x8958}, //12389 #CJK UNIFIED IDEOGRAPH + {0xF2F0, 0x895D}, //12390 #CJK UNIFIED IDEOGRAPH + {0xF2F1, 0x8959}, //12391 #CJK UNIFIED IDEOGRAPH + {0xF2F2, 0x8988}, //12392 #CJK UNIFIED IDEOGRAPH + {0xF2F3, 0x89B7}, //12393 #CJK UNIFIED IDEOGRAPH + {0xF2F4, 0x89B6}, //12394 #CJK UNIFIED IDEOGRAPH + {0xF2F5, 0x89F6}, //12395 #CJK UNIFIED IDEOGRAPH + {0xF2F6, 0x8B50}, //12396 #CJK UNIFIED IDEOGRAPH + {0xF2F7, 0x8B48}, //12397 #CJK UNIFIED IDEOGRAPH + {0xF2F8, 0x8B4A}, //12398 #CJK UNIFIED IDEOGRAPH + {0xF2F9, 0x8B40}, //12399 #CJK UNIFIED IDEOGRAPH + {0xF2FA, 0x8B53}, //12400 #CJK UNIFIED IDEOGRAPH + {0xF2FB, 0x8B56}, //12401 #CJK UNIFIED IDEOGRAPH + {0xF2FC, 0x8B54}, //12402 #CJK UNIFIED IDEOGRAPH + {0xF2FD, 0x8B4B}, //12403 #CJK UNIFIED IDEOGRAPH + {0xF2FE, 0x8B55}, //12404 #CJK UNIFIED IDEOGRAPH + {0xF340, 0x8B51}, //12405 #CJK UNIFIED IDEOGRAPH + {0xF341, 0x8B42}, //12406 #CJK UNIFIED IDEOGRAPH + {0xF342, 0x8B52}, //12407 #CJK UNIFIED IDEOGRAPH + {0xF343, 0x8B57}, //12408 #CJK UNIFIED IDEOGRAPH + {0xF344, 0x8C43}, //12409 #CJK UNIFIED IDEOGRAPH + {0xF345, 0x8C77}, //12410 #CJK UNIFIED IDEOGRAPH + {0xF346, 0x8C76}, //12411 #CJK UNIFIED IDEOGRAPH + {0xF347, 0x8C9A}, //12412 #CJK UNIFIED IDEOGRAPH + {0xF348, 0x8D06}, //12413 #CJK UNIFIED IDEOGRAPH + {0xF349, 0x8D07}, //12414 #CJK UNIFIED IDEOGRAPH + {0xF34A, 0x8D09}, //12415 #CJK UNIFIED IDEOGRAPH + {0xF34B, 0x8DAC}, //12416 #CJK UNIFIED IDEOGRAPH + {0xF34C, 0x8DAA}, //12417 #CJK UNIFIED IDEOGRAPH + {0xF34D, 0x8DAD}, //12418 #CJK UNIFIED IDEOGRAPH + {0xF34E, 0x8DAB}, //12419 #CJK UNIFIED IDEOGRAPH + {0xF34F, 0x8E6D}, //12420 #CJK UNIFIED IDEOGRAPH + {0xF350, 0x8E78}, //12421 #CJK UNIFIED IDEOGRAPH + {0xF351, 0x8E73}, //12422 #CJK UNIFIED IDEOGRAPH + {0xF352, 0x8E6A}, //12423 #CJK UNIFIED IDEOGRAPH + {0xF353, 0x8E6F}, //12424 #CJK UNIFIED IDEOGRAPH + {0xF354, 0x8E7B}, //12425 #CJK UNIFIED IDEOGRAPH + {0xF355, 0x8EC2}, //12426 #CJK UNIFIED IDEOGRAPH + {0xF356, 0x8F52}, //12427 #CJK UNIFIED IDEOGRAPH + {0xF357, 0x8F51}, //12428 #CJK UNIFIED IDEOGRAPH + {0xF358, 0x8F4F}, //12429 #CJK UNIFIED IDEOGRAPH + {0xF359, 0x8F50}, //12430 #CJK UNIFIED IDEOGRAPH + {0xF35A, 0x8F53}, //12431 #CJK UNIFIED IDEOGRAPH + {0xF35B, 0x8FB4}, //12432 #CJK UNIFIED IDEOGRAPH + {0xF35C, 0x9140}, //12433 #CJK UNIFIED IDEOGRAPH + {0xF35D, 0x913F}, //12434 #CJK UNIFIED IDEOGRAPH + {0xF35E, 0x91B0}, //12435 #CJK UNIFIED IDEOGRAPH + {0xF35F, 0x91AD}, //12436 #CJK UNIFIED IDEOGRAPH + {0xF360, 0x93DE}, //12437 #CJK UNIFIED IDEOGRAPH + {0xF361, 0x93C7}, //12438 #CJK UNIFIED IDEOGRAPH + {0xF362, 0x93CF}, //12439 #CJK UNIFIED IDEOGRAPH + {0xF363, 0x93C2}, //12440 #CJK UNIFIED IDEOGRAPH + {0xF364, 0x93DA}, //12441 #CJK UNIFIED IDEOGRAPH + {0xF365, 0x93D0}, //12442 #CJK UNIFIED IDEOGRAPH + {0xF366, 0x93F9}, //12443 #CJK UNIFIED IDEOGRAPH + {0xF367, 0x93EC}, //12444 #CJK UNIFIED IDEOGRAPH + {0xF368, 0x93CC}, //12445 #CJK UNIFIED IDEOGRAPH + {0xF369, 0x93D9}, //12446 #CJK UNIFIED IDEOGRAPH + {0xF36A, 0x93A9}, //12447 #CJK UNIFIED IDEOGRAPH + {0xF36B, 0x93E6}, //12448 #CJK UNIFIED IDEOGRAPH + {0xF36C, 0x93CA}, //12449 #CJK UNIFIED IDEOGRAPH + {0xF36D, 0x93D4}, //12450 #CJK UNIFIED IDEOGRAPH + {0xF36E, 0x93EE}, //12451 #CJK UNIFIED IDEOGRAPH + {0xF36F, 0x93E3}, //12452 #CJK UNIFIED IDEOGRAPH + {0xF370, 0x93D5}, //12453 #CJK UNIFIED IDEOGRAPH + {0xF371, 0x93C4}, //12454 #CJK UNIFIED IDEOGRAPH + {0xF372, 0x93CE}, //12455 #CJK UNIFIED IDEOGRAPH + {0xF373, 0x93C0}, //12456 #CJK UNIFIED IDEOGRAPH + {0xF374, 0x93D2}, //12457 #CJK UNIFIED IDEOGRAPH + {0xF375, 0x93E7}, //12458 #CJK UNIFIED IDEOGRAPH + {0xF376, 0x957D}, //12459 #CJK UNIFIED IDEOGRAPH + {0xF377, 0x95DA}, //12460 #CJK UNIFIED IDEOGRAPH + {0xF378, 0x95DB}, //12461 #CJK UNIFIED IDEOGRAPH + {0xF379, 0x96E1}, //12462 #CJK UNIFIED IDEOGRAPH + {0xF37A, 0x9729}, //12463 #CJK UNIFIED IDEOGRAPH + {0xF37B, 0x972B}, //12464 #CJK UNIFIED IDEOGRAPH + {0xF37C, 0x972C}, //12465 #CJK UNIFIED IDEOGRAPH + {0xF37D, 0x9728}, //12466 #CJK UNIFIED IDEOGRAPH + {0xF37E, 0x9726}, //12467 #CJK UNIFIED IDEOGRAPH + {0xF3A1, 0x97B3}, //12468 #CJK UNIFIED IDEOGRAPH + {0xF3A2, 0x97B7}, //12469 #CJK UNIFIED IDEOGRAPH + {0xF3A3, 0x97B6}, //12470 #CJK UNIFIED IDEOGRAPH + {0xF3A4, 0x97DD}, //12471 #CJK UNIFIED IDEOGRAPH + {0xF3A5, 0x97DE}, //12472 #CJK UNIFIED IDEOGRAPH + {0xF3A6, 0x97DF}, //12473 #CJK UNIFIED IDEOGRAPH + {0xF3A7, 0x985C}, //12474 #CJK UNIFIED IDEOGRAPH + {0xF3A8, 0x9859}, //12475 #CJK UNIFIED IDEOGRAPH + {0xF3A9, 0x985D}, //12476 #CJK UNIFIED IDEOGRAPH + {0xF3AA, 0x9857}, //12477 #CJK UNIFIED IDEOGRAPH + {0xF3AB, 0x98BF}, //12478 #CJK UNIFIED IDEOGRAPH + {0xF3AC, 0x98BD}, //12479 #CJK UNIFIED IDEOGRAPH + {0xF3AD, 0x98BB}, //12480 #CJK UNIFIED IDEOGRAPH + {0xF3AE, 0x98BE}, //12481 #CJK UNIFIED IDEOGRAPH + {0xF3AF, 0x9948}, //12482 #CJK UNIFIED IDEOGRAPH + {0xF3B0, 0x9947}, //12483 #CJK UNIFIED IDEOGRAPH + {0xF3B1, 0x9943}, //12484 #CJK UNIFIED IDEOGRAPH + {0xF3B2, 0x99A6}, //12485 #CJK UNIFIED IDEOGRAPH + {0xF3B3, 0x99A7}, //12486 #CJK UNIFIED IDEOGRAPH + {0xF3B4, 0x9A1A}, //12487 #CJK UNIFIED IDEOGRAPH + {0xF3B5, 0x9A15}, //12488 #CJK UNIFIED IDEOGRAPH + {0xF3B6, 0x9A25}, //12489 #CJK UNIFIED IDEOGRAPH + {0xF3B7, 0x9A1D}, //12490 #CJK UNIFIED IDEOGRAPH + {0xF3B8, 0x9A24}, //12491 #CJK UNIFIED IDEOGRAPH + {0xF3B9, 0x9A1B}, //12492 #CJK UNIFIED IDEOGRAPH + {0xF3BA, 0x9A22}, //12493 #CJK UNIFIED IDEOGRAPH + {0xF3BB, 0x9A20}, //12494 #CJK UNIFIED IDEOGRAPH + {0xF3BC, 0x9A27}, //12495 #CJK UNIFIED IDEOGRAPH + {0xF3BD, 0x9A23}, //12496 #CJK UNIFIED IDEOGRAPH + {0xF3BE, 0x9A1E}, //12497 #CJK UNIFIED IDEOGRAPH + {0xF3BF, 0x9A1C}, //12498 #CJK UNIFIED IDEOGRAPH + {0xF3C0, 0x9A14}, //12499 #CJK UNIFIED IDEOGRAPH + {0xF3C1, 0x9AC2}, //12500 #CJK UNIFIED IDEOGRAPH + {0xF3C2, 0x9B0B}, //12501 #CJK UNIFIED IDEOGRAPH + {0xF3C3, 0x9B0A}, //12502 #CJK UNIFIED IDEOGRAPH + {0xF3C4, 0x9B0E}, //12503 #CJK UNIFIED IDEOGRAPH + {0xF3C5, 0x9B0C}, //12504 #CJK UNIFIED IDEOGRAPH + {0xF3C6, 0x9B37}, //12505 #CJK UNIFIED IDEOGRAPH + {0xF3C7, 0x9BEA}, //12506 #CJK UNIFIED IDEOGRAPH + {0xF3C8, 0x9BEB}, //12507 #CJK UNIFIED IDEOGRAPH + {0xF3C9, 0x9BE0}, //12508 #CJK UNIFIED IDEOGRAPH + {0xF3CA, 0x9BDE}, //12509 #CJK UNIFIED IDEOGRAPH + {0xF3CB, 0x9BE4}, //12510 #CJK UNIFIED IDEOGRAPH + {0xF3CC, 0x9BE6}, //12511 #CJK UNIFIED IDEOGRAPH + {0xF3CD, 0x9BE2}, //12512 #CJK UNIFIED IDEOGRAPH + {0xF3CE, 0x9BF0}, //12513 #CJK UNIFIED IDEOGRAPH + {0xF3CF, 0x9BD4}, //12514 #CJK UNIFIED IDEOGRAPH + {0xF3D0, 0x9BD7}, //12515 #CJK UNIFIED IDEOGRAPH + {0xF3D1, 0x9BEC}, //12516 #CJK UNIFIED IDEOGRAPH + {0xF3D2, 0x9BDC}, //12517 #CJK UNIFIED IDEOGRAPH + {0xF3D3, 0x9BD9}, //12518 #CJK UNIFIED IDEOGRAPH + {0xF3D4, 0x9BE5}, //12519 #CJK UNIFIED IDEOGRAPH + {0xF3D5, 0x9BD5}, //12520 #CJK UNIFIED IDEOGRAPH + {0xF3D6, 0x9BE1}, //12521 #CJK UNIFIED IDEOGRAPH + {0xF3D7, 0x9BDA}, //12522 #CJK UNIFIED IDEOGRAPH + {0xF3D8, 0x9D77}, //12523 #CJK UNIFIED IDEOGRAPH + {0xF3D9, 0x9D81}, //12524 #CJK UNIFIED IDEOGRAPH + {0xF3DA, 0x9D8A}, //12525 #CJK UNIFIED IDEOGRAPH + {0xF3DB, 0x9D84}, //12526 #CJK UNIFIED IDEOGRAPH + {0xF3DC, 0x9D88}, //12527 #CJK UNIFIED IDEOGRAPH + {0xF3DD, 0x9D71}, //12528 #CJK UNIFIED IDEOGRAPH + {0xF3DE, 0x9D80}, //12529 #CJK UNIFIED IDEOGRAPH + {0xF3DF, 0x9D78}, //12530 #CJK UNIFIED IDEOGRAPH + {0xF3E0, 0x9D86}, //12531 #CJK UNIFIED IDEOGRAPH + {0xF3E1, 0x9D8B}, //12532 #CJK UNIFIED IDEOGRAPH + {0xF3E2, 0x9D8C}, //12533 #CJK UNIFIED IDEOGRAPH + {0xF3E3, 0x9D7D}, //12534 #CJK UNIFIED IDEOGRAPH + {0xF3E4, 0x9D6B}, //12535 #CJK UNIFIED IDEOGRAPH + {0xF3E5, 0x9D74}, //12536 #CJK UNIFIED IDEOGRAPH + {0xF3E6, 0x9D75}, //12537 #CJK UNIFIED IDEOGRAPH + {0xF3E7, 0x9D70}, //12538 #CJK UNIFIED IDEOGRAPH + {0xF3E8, 0x9D69}, //12539 #CJK UNIFIED IDEOGRAPH + {0xF3E9, 0x9D85}, //12540 #CJK UNIFIED IDEOGRAPH + {0xF3EA, 0x9D73}, //12541 #CJK UNIFIED IDEOGRAPH + {0xF3EB, 0x9D7B}, //12542 #CJK UNIFIED IDEOGRAPH + {0xF3EC, 0x9D82}, //12543 #CJK UNIFIED IDEOGRAPH + {0xF3ED, 0x9D6F}, //12544 #CJK UNIFIED IDEOGRAPH + {0xF3EE, 0x9D79}, //12545 #CJK UNIFIED IDEOGRAPH + {0xF3EF, 0x9D7F}, //12546 #CJK UNIFIED IDEOGRAPH + {0xF3F0, 0x9D87}, //12547 #CJK UNIFIED IDEOGRAPH + {0xF3F1, 0x9D68}, //12548 #CJK UNIFIED IDEOGRAPH + {0xF3F2, 0x9E94}, //12549 #CJK UNIFIED IDEOGRAPH + {0xF3F3, 0x9E91}, //12550 #CJK UNIFIED IDEOGRAPH + {0xF3F4, 0x9EC0}, //12551 #CJK UNIFIED IDEOGRAPH + {0xF3F5, 0x9EFC}, //12552 #CJK UNIFIED IDEOGRAPH + {0xF3F6, 0x9F2D}, //12553 #CJK UNIFIED IDEOGRAPH + {0xF3F7, 0x9F40}, //12554 #CJK UNIFIED IDEOGRAPH + {0xF3F8, 0x9F41}, //12555 #CJK UNIFIED IDEOGRAPH + {0xF3F9, 0x9F4D}, //12556 #CJK UNIFIED IDEOGRAPH + {0xF3FA, 0x9F56}, //12557 #CJK UNIFIED IDEOGRAPH + {0xF3FB, 0x9F57}, //12558 #CJK UNIFIED IDEOGRAPH + {0xF3FC, 0x9F58}, //12559 #CJK UNIFIED IDEOGRAPH + {0xF3FD, 0x5337}, //12560 #CJK UNIFIED IDEOGRAPH + {0xF3FE, 0x56B2}, //12561 #CJK UNIFIED IDEOGRAPH + {0xF440, 0x56B5}, //12562 #CJK UNIFIED IDEOGRAPH + {0xF441, 0x56B3}, //12563 #CJK UNIFIED IDEOGRAPH + {0xF442, 0x58E3}, //12564 #CJK UNIFIED IDEOGRAPH + {0xF443, 0x5B45}, //12565 #CJK UNIFIED IDEOGRAPH + {0xF444, 0x5DC6}, //12566 #CJK UNIFIED IDEOGRAPH + {0xF445, 0x5DC7}, //12567 #CJK UNIFIED IDEOGRAPH + {0xF446, 0x5EEE}, //12568 #CJK UNIFIED IDEOGRAPH + {0xF447, 0x5EEF}, //12569 #CJK UNIFIED IDEOGRAPH + {0xF448, 0x5FC0}, //12570 #CJK UNIFIED IDEOGRAPH + {0xF449, 0x5FC1}, //12571 #CJK UNIFIED IDEOGRAPH + {0xF44A, 0x61F9}, //12572 #CJK UNIFIED IDEOGRAPH + {0xF44B, 0x6517}, //12573 #CJK UNIFIED IDEOGRAPH + {0xF44C, 0x6516}, //12574 #CJK UNIFIED IDEOGRAPH + {0xF44D, 0x6515}, //12575 #CJK UNIFIED IDEOGRAPH + {0xF44E, 0x6513}, //12576 #CJK UNIFIED IDEOGRAPH + {0xF44F, 0x65DF}, //12577 #CJK UNIFIED IDEOGRAPH + {0xF450, 0x66E8}, //12578 #CJK UNIFIED IDEOGRAPH + {0xF451, 0x66E3}, //12579 #CJK UNIFIED IDEOGRAPH + {0xF452, 0x66E4}, //12580 #CJK UNIFIED IDEOGRAPH + {0xF453, 0x6AF3}, //12581 #CJK UNIFIED IDEOGRAPH + {0xF454, 0x6AF0}, //12582 #CJK UNIFIED IDEOGRAPH + {0xF455, 0x6AEA}, //12583 #CJK UNIFIED IDEOGRAPH + {0xF456, 0x6AE8}, //12584 #CJK UNIFIED IDEOGRAPH + {0xF457, 0x6AF9}, //12585 #CJK UNIFIED IDEOGRAPH + {0xF458, 0x6AF1}, //12586 #CJK UNIFIED IDEOGRAPH + {0xF459, 0x6AEE}, //12587 #CJK UNIFIED IDEOGRAPH + {0xF45A, 0x6AEF}, //12588 #CJK UNIFIED IDEOGRAPH + {0xF45B, 0x703C}, //12589 #CJK UNIFIED IDEOGRAPH + {0xF45C, 0x7035}, //12590 #CJK UNIFIED IDEOGRAPH + {0xF45D, 0x702F}, //12591 #CJK UNIFIED IDEOGRAPH + {0xF45E, 0x7037}, //12592 #CJK UNIFIED IDEOGRAPH + {0xF45F, 0x7034}, //12593 #CJK UNIFIED IDEOGRAPH + {0xF460, 0x7031}, //12594 #CJK UNIFIED IDEOGRAPH + {0xF461, 0x7042}, //12595 #CJK UNIFIED IDEOGRAPH + {0xF462, 0x7038}, //12596 #CJK UNIFIED IDEOGRAPH + {0xF463, 0x703F}, //12597 #CJK UNIFIED IDEOGRAPH + {0xF464, 0x703A}, //12598 #CJK UNIFIED IDEOGRAPH + {0xF465, 0x7039}, //12599 #CJK UNIFIED IDEOGRAPH + {0xF466, 0x7040}, //12600 #CJK UNIFIED IDEOGRAPH + {0xF467, 0x703B}, //12601 #CJK UNIFIED IDEOGRAPH + {0xF468, 0x7033}, //12602 #CJK UNIFIED IDEOGRAPH + {0xF469, 0x7041}, //12603 #CJK UNIFIED IDEOGRAPH + {0xF46A, 0x7213}, //12604 #CJK UNIFIED IDEOGRAPH + {0xF46B, 0x7214}, //12605 #CJK UNIFIED IDEOGRAPH + {0xF46C, 0x72A8}, //12606 #CJK UNIFIED IDEOGRAPH + {0xF46D, 0x737D}, //12607 #CJK UNIFIED IDEOGRAPH + {0xF46E, 0x737C}, //12608 #CJK UNIFIED IDEOGRAPH + {0xF46F, 0x74BA}, //12609 #CJK UNIFIED IDEOGRAPH + {0xF470, 0x76AB}, //12610 #CJK UNIFIED IDEOGRAPH + {0xF471, 0x76AA}, //12611 #CJK UNIFIED IDEOGRAPH + {0xF472, 0x76BE}, //12612 #CJK UNIFIED IDEOGRAPH + {0xF473, 0x76ED}, //12613 #CJK UNIFIED IDEOGRAPH + {0xF474, 0x77CC}, //12614 #CJK UNIFIED IDEOGRAPH + {0xF475, 0x77CE}, //12615 #CJK UNIFIED IDEOGRAPH + {0xF476, 0x77CF}, //12616 #CJK UNIFIED IDEOGRAPH + {0xF477, 0x77CD}, //12617 #CJK UNIFIED IDEOGRAPH + {0xF478, 0x77F2}, //12618 #CJK UNIFIED IDEOGRAPH + {0xF479, 0x7925}, //12619 #CJK UNIFIED IDEOGRAPH + {0xF47A, 0x7923}, //12620 #CJK UNIFIED IDEOGRAPH + {0xF47B, 0x7927}, //12621 #CJK UNIFIED IDEOGRAPH + {0xF47C, 0x7928}, //12622 #CJK UNIFIED IDEOGRAPH + {0xF47D, 0x7924}, //12623 #CJK UNIFIED IDEOGRAPH + {0xF47E, 0x7929}, //12624 #CJK UNIFIED IDEOGRAPH + {0xF4A1, 0x79B2}, //12625 #CJK UNIFIED IDEOGRAPH + {0xF4A2, 0x7A6E}, //12626 #CJK UNIFIED IDEOGRAPH + {0xF4A3, 0x7A6C}, //12627 #CJK UNIFIED IDEOGRAPH + {0xF4A4, 0x7A6D}, //12628 #CJK UNIFIED IDEOGRAPH + {0xF4A5, 0x7AF7}, //12629 #CJK UNIFIED IDEOGRAPH + {0xF4A6, 0x7C49}, //12630 #CJK UNIFIED IDEOGRAPH + {0xF4A7, 0x7C48}, //12631 #CJK UNIFIED IDEOGRAPH + {0xF4A8, 0x7C4A}, //12632 #CJK UNIFIED IDEOGRAPH + {0xF4A9, 0x7C47}, //12633 #CJK UNIFIED IDEOGRAPH + {0xF4AA, 0x7C45}, //12634 #CJK UNIFIED IDEOGRAPH + {0xF4AB, 0x7CEE}, //12635 #CJK UNIFIED IDEOGRAPH + {0xF4AC, 0x7E7B}, //12636 #CJK UNIFIED IDEOGRAPH + {0xF4AD, 0x7E7E}, //12637 #CJK UNIFIED IDEOGRAPH + {0xF4AE, 0x7E81}, //12638 #CJK UNIFIED IDEOGRAPH + {0xF4AF, 0x7E80}, //12639 #CJK UNIFIED IDEOGRAPH + {0xF4B0, 0x7FBA}, //12640 #CJK UNIFIED IDEOGRAPH + {0xF4B1, 0x7FFF}, //12641 #CJK UNIFIED IDEOGRAPH + {0xF4B2, 0x8079}, //12642 #CJK UNIFIED IDEOGRAPH + {0xF4B3, 0x81DB}, //12643 #CJK UNIFIED IDEOGRAPH + {0xF4B4, 0x81D9}, //12644 #CJK UNIFIED IDEOGRAPH + {0xF4B5, 0x820B}, //12645 #CJK UNIFIED IDEOGRAPH + {0xF4B6, 0x8268}, //12646 #CJK UNIFIED IDEOGRAPH + {0xF4B7, 0x8269}, //12647 #CJK UNIFIED IDEOGRAPH + {0xF4B8, 0x8622}, //12648 #CJK UNIFIED IDEOGRAPH + {0xF4B9, 0x85FF}, //12649 #CJK UNIFIED IDEOGRAPH + {0xF4BA, 0x8601}, //12650 #CJK UNIFIED IDEOGRAPH + {0xF4BB, 0x85FE}, //12651 #CJK UNIFIED IDEOGRAPH + {0xF4BC, 0x861B}, //12652 #CJK UNIFIED IDEOGRAPH + {0xF4BD, 0x8600}, //12653 #CJK UNIFIED IDEOGRAPH + {0xF4BE, 0x85F6}, //12654 #CJK UNIFIED IDEOGRAPH + {0xF4BF, 0x8604}, //12655 #CJK UNIFIED IDEOGRAPH + {0xF4C0, 0x8609}, //12656 #CJK UNIFIED IDEOGRAPH + {0xF4C1, 0x8605}, //12657 #CJK UNIFIED IDEOGRAPH + {0xF4C2, 0x860C}, //12658 #CJK UNIFIED IDEOGRAPH + {0xF4C3, 0x85FD}, //12659 #CJK UNIFIED IDEOGRAPH + {0xF4C4, 0x8819}, //12660 #CJK UNIFIED IDEOGRAPH + {0xF4C5, 0x8810}, //12661 #CJK UNIFIED IDEOGRAPH + {0xF4C6, 0x8811}, //12662 #CJK UNIFIED IDEOGRAPH + {0xF4C7, 0x8817}, //12663 #CJK UNIFIED IDEOGRAPH + {0xF4C8, 0x8813}, //12664 #CJK UNIFIED IDEOGRAPH + {0xF4C9, 0x8816}, //12665 #CJK UNIFIED IDEOGRAPH + {0xF4CA, 0x8963}, //12666 #CJK UNIFIED IDEOGRAPH + {0xF4CB, 0x8966}, //12667 #CJK UNIFIED IDEOGRAPH + {0xF4CC, 0x89B9}, //12668 #CJK UNIFIED IDEOGRAPH + {0xF4CD, 0x89F7}, //12669 #CJK UNIFIED IDEOGRAPH + {0xF4CE, 0x8B60}, //12670 #CJK UNIFIED IDEOGRAPH + {0xF4CF, 0x8B6A}, //12671 #CJK UNIFIED IDEOGRAPH + {0xF4D0, 0x8B5D}, //12672 #CJK UNIFIED IDEOGRAPH + {0xF4D1, 0x8B68}, //12673 #CJK UNIFIED IDEOGRAPH + {0xF4D2, 0x8B63}, //12674 #CJK UNIFIED IDEOGRAPH + {0xF4D3, 0x8B65}, //12675 #CJK UNIFIED IDEOGRAPH + {0xF4D4, 0x8B67}, //12676 #CJK UNIFIED IDEOGRAPH + {0xF4D5, 0x8B6D}, //12677 #CJK UNIFIED IDEOGRAPH + {0xF4D6, 0x8DAE}, //12678 #CJK UNIFIED IDEOGRAPH + {0xF4D7, 0x8E86}, //12679 #CJK UNIFIED IDEOGRAPH + {0xF4D8, 0x8E88}, //12680 #CJK UNIFIED IDEOGRAPH + {0xF4D9, 0x8E84}, //12681 #CJK UNIFIED IDEOGRAPH + {0xF4DA, 0x8F59}, //12682 #CJK UNIFIED IDEOGRAPH + {0xF4DB, 0x8F56}, //12683 #CJK UNIFIED IDEOGRAPH + {0xF4DC, 0x8F57}, //12684 #CJK UNIFIED IDEOGRAPH + {0xF4DD, 0x8F55}, //12685 #CJK UNIFIED IDEOGRAPH + {0xF4DE, 0x8F58}, //12686 #CJK UNIFIED IDEOGRAPH + {0xF4DF, 0x8F5A}, //12687 #CJK UNIFIED IDEOGRAPH + {0xF4E0, 0x908D}, //12688 #CJK UNIFIED IDEOGRAPH + {0xF4E1, 0x9143}, //12689 #CJK UNIFIED IDEOGRAPH + {0xF4E2, 0x9141}, //12690 #CJK UNIFIED IDEOGRAPH + {0xF4E3, 0x91B7}, //12691 #CJK UNIFIED IDEOGRAPH + {0xF4E4, 0x91B5}, //12692 #CJK UNIFIED IDEOGRAPH + {0xF4E5, 0x91B2}, //12693 #CJK UNIFIED IDEOGRAPH + {0xF4E6, 0x91B3}, //12694 #CJK UNIFIED IDEOGRAPH + {0xF4E7, 0x940B}, //12695 #CJK UNIFIED IDEOGRAPH + {0xF4E8, 0x9413}, //12696 #CJK UNIFIED IDEOGRAPH + {0xF4E9, 0x93FB}, //12697 #CJK UNIFIED IDEOGRAPH + {0xF4EA, 0x9420}, //12698 #CJK UNIFIED IDEOGRAPH + {0xF4EB, 0x940F}, //12699 #CJK UNIFIED IDEOGRAPH + {0xF4EC, 0x9414}, //12700 #CJK UNIFIED IDEOGRAPH + {0xF4ED, 0x93FE}, //12701 #CJK UNIFIED IDEOGRAPH + {0xF4EE, 0x9415}, //12702 #CJK UNIFIED IDEOGRAPH + {0xF4EF, 0x9410}, //12703 #CJK UNIFIED IDEOGRAPH + {0xF4F0, 0x9428}, //12704 #CJK UNIFIED IDEOGRAPH + {0xF4F1, 0x9419}, //12705 #CJK UNIFIED IDEOGRAPH + {0xF4F2, 0x940D}, //12706 #CJK UNIFIED IDEOGRAPH + {0xF4F3, 0x93F5}, //12707 #CJK UNIFIED IDEOGRAPH + {0xF4F4, 0x9400}, //12708 #CJK UNIFIED IDEOGRAPH + {0xF4F5, 0x93F7}, //12709 #CJK UNIFIED IDEOGRAPH + {0xF4F6, 0x9407}, //12710 #CJK UNIFIED IDEOGRAPH + {0xF4F7, 0x940E}, //12711 #CJK UNIFIED IDEOGRAPH + {0xF4F8, 0x9416}, //12712 #CJK UNIFIED IDEOGRAPH + {0xF4F9, 0x9412}, //12713 #CJK UNIFIED IDEOGRAPH + {0xF4FA, 0x93FA}, //12714 #CJK UNIFIED IDEOGRAPH + {0xF4FB, 0x9409}, //12715 #CJK UNIFIED IDEOGRAPH + {0xF4FC, 0x93F8}, //12716 #CJK UNIFIED IDEOGRAPH + {0xF4FD, 0x940A}, //12717 #CJK UNIFIED IDEOGRAPH + {0xF4FE, 0x93FF}, //12718 #CJK UNIFIED IDEOGRAPH + {0xF540, 0x93FC}, //12719 #CJK UNIFIED IDEOGRAPH + {0xF541, 0x940C}, //12720 #CJK UNIFIED IDEOGRAPH + {0xF542, 0x93F6}, //12721 #CJK UNIFIED IDEOGRAPH + {0xF543, 0x9411}, //12722 #CJK UNIFIED IDEOGRAPH + {0xF544, 0x9406}, //12723 #CJK UNIFIED IDEOGRAPH + {0xF545, 0x95DE}, //12724 #CJK UNIFIED IDEOGRAPH + {0xF546, 0x95E0}, //12725 #CJK UNIFIED IDEOGRAPH + {0xF547, 0x95DF}, //12726 #CJK UNIFIED IDEOGRAPH + {0xF548, 0x972E}, //12727 #CJK UNIFIED IDEOGRAPH + {0xF549, 0x972F}, //12728 #CJK UNIFIED IDEOGRAPH + {0xF54A, 0x97B9}, //12729 #CJK UNIFIED IDEOGRAPH + {0xF54B, 0x97BB}, //12730 #CJK UNIFIED IDEOGRAPH + {0xF54C, 0x97FD}, //12731 #CJK UNIFIED IDEOGRAPH + {0xF54D, 0x97FE}, //12732 #CJK UNIFIED IDEOGRAPH + {0xF54E, 0x9860}, //12733 #CJK UNIFIED IDEOGRAPH + {0xF54F, 0x9862}, //12734 #CJK UNIFIED IDEOGRAPH + {0xF550, 0x9863}, //12735 #CJK UNIFIED IDEOGRAPH + {0xF551, 0x985F}, //12736 #CJK UNIFIED IDEOGRAPH + {0xF552, 0x98C1}, //12737 #CJK UNIFIED IDEOGRAPH + {0xF553, 0x98C2}, //12738 #CJK UNIFIED IDEOGRAPH + {0xF554, 0x9950}, //12739 #CJK UNIFIED IDEOGRAPH + {0xF555, 0x994E}, //12740 #CJK UNIFIED IDEOGRAPH + {0xF556, 0x9959}, //12741 #CJK UNIFIED IDEOGRAPH + {0xF557, 0x994C}, //12742 #CJK UNIFIED IDEOGRAPH + {0xF558, 0x994B}, //12743 #CJK UNIFIED IDEOGRAPH + {0xF559, 0x9953}, //12744 #CJK UNIFIED IDEOGRAPH + {0xF55A, 0x9A32}, //12745 #CJK UNIFIED IDEOGRAPH + {0xF55B, 0x9A34}, //12746 #CJK UNIFIED IDEOGRAPH + {0xF55C, 0x9A31}, //12747 #CJK UNIFIED IDEOGRAPH + {0xF55D, 0x9A2C}, //12748 #CJK UNIFIED IDEOGRAPH + {0xF55E, 0x9A2A}, //12749 #CJK UNIFIED IDEOGRAPH + {0xF55F, 0x9A36}, //12750 #CJK UNIFIED IDEOGRAPH + {0xF560, 0x9A29}, //12751 #CJK UNIFIED IDEOGRAPH + {0xF561, 0x9A2E}, //12752 #CJK UNIFIED IDEOGRAPH + {0xF562, 0x9A38}, //12753 #CJK UNIFIED IDEOGRAPH + {0xF563, 0x9A2D}, //12754 #CJK UNIFIED IDEOGRAPH + {0xF564, 0x9AC7}, //12755 #CJK UNIFIED IDEOGRAPH + {0xF565, 0x9ACA}, //12756 #CJK UNIFIED IDEOGRAPH + {0xF566, 0x9AC6}, //12757 #CJK UNIFIED IDEOGRAPH + {0xF567, 0x9B10}, //12758 #CJK UNIFIED IDEOGRAPH + {0xF568, 0x9B12}, //12759 #CJK UNIFIED IDEOGRAPH + {0xF569, 0x9B11}, //12760 #CJK UNIFIED IDEOGRAPH + {0xF56A, 0x9C0B}, //12761 #CJK UNIFIED IDEOGRAPH + {0xF56B, 0x9C08}, //12762 #CJK UNIFIED IDEOGRAPH + {0xF56C, 0x9BF7}, //12763 #CJK UNIFIED IDEOGRAPH + {0xF56D, 0x9C05}, //12764 #CJK UNIFIED IDEOGRAPH + {0xF56E, 0x9C12}, //12765 #CJK UNIFIED IDEOGRAPH + {0xF56F, 0x9BF8}, //12766 #CJK UNIFIED IDEOGRAPH + {0xF570, 0x9C40}, //12767 #CJK UNIFIED IDEOGRAPH + {0xF571, 0x9C07}, //12768 #CJK UNIFIED IDEOGRAPH + {0xF572, 0x9C0E}, //12769 #CJK UNIFIED IDEOGRAPH + {0xF573, 0x9C06}, //12770 #CJK UNIFIED IDEOGRAPH + {0xF574, 0x9C17}, //12771 #CJK UNIFIED IDEOGRAPH + {0xF575, 0x9C14}, //12772 #CJK UNIFIED IDEOGRAPH + {0xF576, 0x9C09}, //12773 #CJK UNIFIED IDEOGRAPH + {0xF577, 0x9D9F}, //12774 #CJK UNIFIED IDEOGRAPH + {0xF578, 0x9D99}, //12775 #CJK UNIFIED IDEOGRAPH + {0xF579, 0x9DA4}, //12776 #CJK UNIFIED IDEOGRAPH + {0xF57A, 0x9D9D}, //12777 #CJK UNIFIED IDEOGRAPH + {0xF57B, 0x9D92}, //12778 #CJK UNIFIED IDEOGRAPH + {0xF57C, 0x9D98}, //12779 #CJK UNIFIED IDEOGRAPH + {0xF57D, 0x9D90}, //12780 #CJK UNIFIED IDEOGRAPH + {0xF57E, 0x9D9B}, //12781 #CJK UNIFIED IDEOGRAPH + {0xF5A1, 0x9DA0}, //12782 #CJK UNIFIED IDEOGRAPH + {0xF5A2, 0x9D94}, //12783 #CJK UNIFIED IDEOGRAPH + {0xF5A3, 0x9D9C}, //12784 #CJK UNIFIED IDEOGRAPH + {0xF5A4, 0x9DAA}, //12785 #CJK UNIFIED IDEOGRAPH + {0xF5A5, 0x9D97}, //12786 #CJK UNIFIED IDEOGRAPH + {0xF5A6, 0x9DA1}, //12787 #CJK UNIFIED IDEOGRAPH + {0xF5A7, 0x9D9A}, //12788 #CJK UNIFIED IDEOGRAPH + {0xF5A8, 0x9DA2}, //12789 #CJK UNIFIED IDEOGRAPH + {0xF5A9, 0x9DA8}, //12790 #CJK UNIFIED IDEOGRAPH + {0xF5AA, 0x9D9E}, //12791 #CJK UNIFIED IDEOGRAPH + {0xF5AB, 0x9DA3}, //12792 #CJK UNIFIED IDEOGRAPH + {0xF5AC, 0x9DBF}, //12793 #CJK UNIFIED IDEOGRAPH + {0xF5AD, 0x9DA9}, //12794 #CJK UNIFIED IDEOGRAPH + {0xF5AE, 0x9D96}, //12795 #CJK UNIFIED IDEOGRAPH + {0xF5AF, 0x9DA6}, //12796 #CJK UNIFIED IDEOGRAPH + {0xF5B0, 0x9DA7}, //12797 #CJK UNIFIED IDEOGRAPH + {0xF5B1, 0x9E99}, //12798 #CJK UNIFIED IDEOGRAPH + {0xF5B2, 0x9E9B}, //12799 #CJK UNIFIED IDEOGRAPH + {0xF5B3, 0x9E9A}, //12800 #CJK UNIFIED IDEOGRAPH + {0xF5B4, 0x9EE5}, //12801 #CJK UNIFIED IDEOGRAPH + {0xF5B5, 0x9EE4}, //12802 #CJK UNIFIED IDEOGRAPH + {0xF5B6, 0x9EE7}, //12803 #CJK UNIFIED IDEOGRAPH + {0xF5B7, 0x9EE6}, //12804 #CJK UNIFIED IDEOGRAPH + {0xF5B8, 0x9F30}, //12805 #CJK UNIFIED IDEOGRAPH + {0xF5B9, 0x9F2E}, //12806 #CJK UNIFIED IDEOGRAPH + {0xF5BA, 0x9F5B}, //12807 #CJK UNIFIED IDEOGRAPH + {0xF5BB, 0x9F60}, //12808 #CJK UNIFIED IDEOGRAPH + {0xF5BC, 0x9F5E}, //12809 #CJK UNIFIED IDEOGRAPH + {0xF5BD, 0x9F5D}, //12810 #CJK UNIFIED IDEOGRAPH + {0xF5BE, 0x9F59}, //12811 #CJK UNIFIED IDEOGRAPH + {0xF5BF, 0x9F91}, //12812 #CJK UNIFIED IDEOGRAPH + {0xF5C0, 0x513A}, //12813 #CJK UNIFIED IDEOGRAPH + {0xF5C1, 0x5139}, //12814 #CJK UNIFIED IDEOGRAPH + {0xF5C2, 0x5298}, //12815 #CJK UNIFIED IDEOGRAPH + {0xF5C3, 0x5297}, //12816 #CJK UNIFIED IDEOGRAPH + {0xF5C4, 0x56C3}, //12817 #CJK UNIFIED IDEOGRAPH + {0xF5C5, 0x56BD}, //12818 #CJK UNIFIED IDEOGRAPH + {0xF5C6, 0x56BE}, //12819 #CJK UNIFIED IDEOGRAPH + {0xF5C7, 0x5B48}, //12820 #CJK UNIFIED IDEOGRAPH + {0xF5C8, 0x5B47}, //12821 #CJK UNIFIED IDEOGRAPH + {0xF5C9, 0x5DCB}, //12822 #CJK UNIFIED IDEOGRAPH + {0xF5CA, 0x5DCF}, //12823 #CJK UNIFIED IDEOGRAPH + {0xF5CB, 0x5EF1}, //12824 #CJK UNIFIED IDEOGRAPH + {0xF5CC, 0x61FD}, //12825 #CJK UNIFIED IDEOGRAPH + {0xF5CD, 0x651B}, //12826 #CJK UNIFIED IDEOGRAPH + {0xF5CE, 0x6B02}, //12827 #CJK UNIFIED IDEOGRAPH + {0xF5CF, 0x6AFC}, //12828 #CJK UNIFIED IDEOGRAPH + {0xF5D0, 0x6B03}, //12829 #CJK UNIFIED IDEOGRAPH + {0xF5D1, 0x6AF8}, //12830 #CJK UNIFIED IDEOGRAPH + {0xF5D2, 0x6B00}, //12831 #CJK UNIFIED IDEOGRAPH + {0xF5D3, 0x7043}, //12832 #CJK UNIFIED IDEOGRAPH + {0xF5D4, 0x7044}, //12833 #CJK UNIFIED IDEOGRAPH + {0xF5D5, 0x704A}, //12834 #CJK UNIFIED IDEOGRAPH + {0xF5D6, 0x7048}, //12835 #CJK UNIFIED IDEOGRAPH + {0xF5D7, 0x7049}, //12836 #CJK UNIFIED IDEOGRAPH + {0xF5D8, 0x7045}, //12837 #CJK UNIFIED IDEOGRAPH + {0xF5D9, 0x7046}, //12838 #CJK UNIFIED IDEOGRAPH + {0xF5DA, 0x721D}, //12839 #CJK UNIFIED IDEOGRAPH + {0xF5DB, 0x721A}, //12840 #CJK UNIFIED IDEOGRAPH + {0xF5DC, 0x7219}, //12841 #CJK UNIFIED IDEOGRAPH + {0xF5DD, 0x737E}, //12842 #CJK UNIFIED IDEOGRAPH + {0xF5DE, 0x7517}, //12843 #CJK UNIFIED IDEOGRAPH + {0xF5DF, 0x766A}, //12844 #CJK UNIFIED IDEOGRAPH + {0xF5E0, 0x77D0}, //12845 #CJK UNIFIED IDEOGRAPH + {0xF5E1, 0x792D}, //12846 #CJK UNIFIED IDEOGRAPH + {0xF5E2, 0x7931}, //12847 #CJK UNIFIED IDEOGRAPH + {0xF5E3, 0x792F}, //12848 #CJK UNIFIED IDEOGRAPH + {0xF5E4, 0x7C54}, //12849 #CJK UNIFIED IDEOGRAPH + {0xF5E5, 0x7C53}, //12850 #CJK UNIFIED IDEOGRAPH + {0xF5E6, 0x7CF2}, //12851 #CJK UNIFIED IDEOGRAPH + {0xF5E7, 0x7E8A}, //12852 #CJK UNIFIED IDEOGRAPH + {0xF5E8, 0x7E87}, //12853 #CJK UNIFIED IDEOGRAPH + {0xF5E9, 0x7E88}, //12854 #CJK UNIFIED IDEOGRAPH + {0xF5EA, 0x7E8B}, //12855 #CJK UNIFIED IDEOGRAPH + {0xF5EB, 0x7E86}, //12856 #CJK UNIFIED IDEOGRAPH + {0xF5EC, 0x7E8D}, //12857 #CJK UNIFIED IDEOGRAPH + {0xF5ED, 0x7F4D}, //12858 #CJK UNIFIED IDEOGRAPH + {0xF5EE, 0x7FBB}, //12859 #CJK UNIFIED IDEOGRAPH + {0xF5EF, 0x8030}, //12860 #CJK UNIFIED IDEOGRAPH + {0xF5F0, 0x81DD}, //12861 #CJK UNIFIED IDEOGRAPH + {0xF5F1, 0x8618}, //12862 #CJK UNIFIED IDEOGRAPH + {0xF5F2, 0x862A}, //12863 #CJK UNIFIED IDEOGRAPH + {0xF5F3, 0x8626}, //12864 #CJK UNIFIED IDEOGRAPH + {0xF5F4, 0x861F}, //12865 #CJK UNIFIED IDEOGRAPH + {0xF5F5, 0x8623}, //12866 #CJK UNIFIED IDEOGRAPH + {0xF5F6, 0x861C}, //12867 #CJK UNIFIED IDEOGRAPH + {0xF5F7, 0x8619}, //12868 #CJK UNIFIED IDEOGRAPH + {0xF5F8, 0x8627}, //12869 #CJK UNIFIED IDEOGRAPH + {0xF5F9, 0x862E}, //12870 #CJK UNIFIED IDEOGRAPH + {0xF5FA, 0x8621}, //12871 #CJK UNIFIED IDEOGRAPH + {0xF5FB, 0x8620}, //12872 #CJK UNIFIED IDEOGRAPH + {0xF5FC, 0x8629}, //12873 #CJK UNIFIED IDEOGRAPH + {0xF5FD, 0x861E}, //12874 #CJK UNIFIED IDEOGRAPH + {0xF5FE, 0x8625}, //12875 #CJK UNIFIED IDEOGRAPH + {0xF640, 0x8829}, //12876 #CJK UNIFIED IDEOGRAPH + {0xF641, 0x881D}, //12877 #CJK UNIFIED IDEOGRAPH + {0xF642, 0x881B}, //12878 #CJK UNIFIED IDEOGRAPH + {0xF643, 0x8820}, //12879 #CJK UNIFIED IDEOGRAPH + {0xF644, 0x8824}, //12880 #CJK UNIFIED IDEOGRAPH + {0xF645, 0x881C}, //12881 #CJK UNIFIED IDEOGRAPH + {0xF646, 0x882B}, //12882 #CJK UNIFIED IDEOGRAPH + {0xF647, 0x884A}, //12883 #CJK UNIFIED IDEOGRAPH + {0xF648, 0x896D}, //12884 #CJK UNIFIED IDEOGRAPH + {0xF649, 0x8969}, //12885 #CJK UNIFIED IDEOGRAPH + {0xF64A, 0x896E}, //12886 #CJK UNIFIED IDEOGRAPH + {0xF64B, 0x896B}, //12887 #CJK UNIFIED IDEOGRAPH + {0xF64C, 0x89FA}, //12888 #CJK UNIFIED IDEOGRAPH + {0xF64D, 0x8B79}, //12889 #CJK UNIFIED IDEOGRAPH + {0xF64E, 0x8B78}, //12890 #CJK UNIFIED IDEOGRAPH + {0xF64F, 0x8B45}, //12891 #CJK UNIFIED IDEOGRAPH + {0xF650, 0x8B7A}, //12892 #CJK UNIFIED IDEOGRAPH + {0xF651, 0x8B7B}, //12893 #CJK UNIFIED IDEOGRAPH + {0xF652, 0x8D10}, //12894 #CJK UNIFIED IDEOGRAPH + {0xF653, 0x8D14}, //12895 #CJK UNIFIED IDEOGRAPH + {0xF654, 0x8DAF}, //12896 #CJK UNIFIED IDEOGRAPH + {0xF655, 0x8E8E}, //12897 #CJK UNIFIED IDEOGRAPH + {0xF656, 0x8E8C}, //12898 #CJK UNIFIED IDEOGRAPH + {0xF657, 0x8F5E}, //12899 #CJK UNIFIED IDEOGRAPH + {0xF658, 0x8F5B}, //12900 #CJK UNIFIED IDEOGRAPH + {0xF659, 0x8F5D}, //12901 #CJK UNIFIED IDEOGRAPH + {0xF65A, 0x9146}, //12902 #CJK UNIFIED IDEOGRAPH + {0xF65B, 0x9144}, //12903 #CJK UNIFIED IDEOGRAPH + {0xF65C, 0x9145}, //12904 #CJK UNIFIED IDEOGRAPH + {0xF65D, 0x91B9}, //12905 #CJK UNIFIED IDEOGRAPH + {0xF65E, 0x943F}, //12906 #CJK UNIFIED IDEOGRAPH + {0xF65F, 0x943B}, //12907 #CJK UNIFIED IDEOGRAPH + {0xF660, 0x9436}, //12908 #CJK UNIFIED IDEOGRAPH + {0xF661, 0x9429}, //12909 #CJK UNIFIED IDEOGRAPH + {0xF662, 0x943D}, //12910 #CJK UNIFIED IDEOGRAPH + {0xF663, 0x943C}, //12911 #CJK UNIFIED IDEOGRAPH + {0xF664, 0x9430}, //12912 #CJK UNIFIED IDEOGRAPH + {0xF665, 0x9439}, //12913 #CJK UNIFIED IDEOGRAPH + {0xF666, 0x942A}, //12914 #CJK UNIFIED IDEOGRAPH + {0xF667, 0x9437}, //12915 #CJK UNIFIED IDEOGRAPH + {0xF668, 0x942C}, //12916 #CJK UNIFIED IDEOGRAPH + {0xF669, 0x9440}, //12917 #CJK UNIFIED IDEOGRAPH + {0xF66A, 0x9431}, //12918 #CJK UNIFIED IDEOGRAPH + {0xF66B, 0x95E5}, //12919 #CJK UNIFIED IDEOGRAPH + {0xF66C, 0x95E4}, //12920 #CJK UNIFIED IDEOGRAPH + {0xF66D, 0x95E3}, //12921 #CJK UNIFIED IDEOGRAPH + {0xF66E, 0x9735}, //12922 #CJK UNIFIED IDEOGRAPH + {0xF66F, 0x973A}, //12923 #CJK UNIFIED IDEOGRAPH + {0xF670, 0x97BF}, //12924 #CJK UNIFIED IDEOGRAPH + {0xF671, 0x97E1}, //12925 #CJK UNIFIED IDEOGRAPH + {0xF672, 0x9864}, //12926 #CJK UNIFIED IDEOGRAPH + {0xF673, 0x98C9}, //12927 #CJK UNIFIED IDEOGRAPH + {0xF674, 0x98C6}, //12928 #CJK UNIFIED IDEOGRAPH + {0xF675, 0x98C0}, //12929 #CJK UNIFIED IDEOGRAPH + {0xF676, 0x9958}, //12930 #CJK UNIFIED IDEOGRAPH + {0xF677, 0x9956}, //12931 #CJK UNIFIED IDEOGRAPH + {0xF678, 0x9A39}, //12932 #CJK UNIFIED IDEOGRAPH + {0xF679, 0x9A3D}, //12933 #CJK UNIFIED IDEOGRAPH + {0xF67A, 0x9A46}, //12934 #CJK UNIFIED IDEOGRAPH + {0xF67B, 0x9A44}, //12935 #CJK UNIFIED IDEOGRAPH + {0xF67C, 0x9A42}, //12936 #CJK UNIFIED IDEOGRAPH + {0xF67D, 0x9A41}, //12937 #CJK UNIFIED IDEOGRAPH + {0xF67E, 0x9A3A}, //12938 #CJK UNIFIED IDEOGRAPH + {0xF6A1, 0x9A3F}, //12939 #CJK UNIFIED IDEOGRAPH + {0xF6A2, 0x9ACD}, //12940 #CJK UNIFIED IDEOGRAPH + {0xF6A3, 0x9B15}, //12941 #CJK UNIFIED IDEOGRAPH + {0xF6A4, 0x9B17}, //12942 #CJK UNIFIED IDEOGRAPH + {0xF6A5, 0x9B18}, //12943 #CJK UNIFIED IDEOGRAPH + {0xF6A6, 0x9B16}, //12944 #CJK UNIFIED IDEOGRAPH + {0xF6A7, 0x9B3A}, //12945 #CJK UNIFIED IDEOGRAPH + {0xF6A8, 0x9B52}, //12946 #CJK UNIFIED IDEOGRAPH + {0xF6A9, 0x9C2B}, //12947 #CJK UNIFIED IDEOGRAPH + {0xF6AA, 0x9C1D}, //12948 #CJK UNIFIED IDEOGRAPH + {0xF6AB, 0x9C1C}, //12949 #CJK UNIFIED IDEOGRAPH + {0xF6AC, 0x9C2C}, //12950 #CJK UNIFIED IDEOGRAPH + {0xF6AD, 0x9C23}, //12951 #CJK UNIFIED IDEOGRAPH + {0xF6AE, 0x9C28}, //12952 #CJK UNIFIED IDEOGRAPH + {0xF6AF, 0x9C29}, //12953 #CJK UNIFIED IDEOGRAPH + {0xF6B0, 0x9C24}, //12954 #CJK UNIFIED IDEOGRAPH + {0xF6B1, 0x9C21}, //12955 #CJK UNIFIED IDEOGRAPH + {0xF6B2, 0x9DB7}, //12956 #CJK UNIFIED IDEOGRAPH + {0xF6B3, 0x9DB6}, //12957 #CJK UNIFIED IDEOGRAPH + {0xF6B4, 0x9DBC}, //12958 #CJK UNIFIED IDEOGRAPH + {0xF6B5, 0x9DC1}, //12959 #CJK UNIFIED IDEOGRAPH + {0xF6B6, 0x9DC7}, //12960 #CJK UNIFIED IDEOGRAPH + {0xF6B7, 0x9DCA}, //12961 #CJK UNIFIED IDEOGRAPH + {0xF6B8, 0x9DCF}, //12962 #CJK UNIFIED IDEOGRAPH + {0xF6B9, 0x9DBE}, //12963 #CJK UNIFIED IDEOGRAPH + {0xF6BA, 0x9DC5}, //12964 #CJK UNIFIED IDEOGRAPH + {0xF6BB, 0x9DC3}, //12965 #CJK UNIFIED IDEOGRAPH + {0xF6BC, 0x9DBB}, //12966 #CJK UNIFIED IDEOGRAPH + {0xF6BD, 0x9DB5}, //12967 #CJK UNIFIED IDEOGRAPH + {0xF6BE, 0x9DCE}, //12968 #CJK UNIFIED IDEOGRAPH + {0xF6BF, 0x9DB9}, //12969 #CJK UNIFIED IDEOGRAPH + {0xF6C0, 0x9DBA}, //12970 #CJK UNIFIED IDEOGRAPH + {0xF6C1, 0x9DAC}, //12971 #CJK UNIFIED IDEOGRAPH + {0xF6C2, 0x9DC8}, //12972 #CJK UNIFIED IDEOGRAPH + {0xF6C3, 0x9DB1}, //12973 #CJK UNIFIED IDEOGRAPH + {0xF6C4, 0x9DAD}, //12974 #CJK UNIFIED IDEOGRAPH + {0xF6C5, 0x9DCC}, //12975 #CJK UNIFIED IDEOGRAPH + {0xF6C6, 0x9DB3}, //12976 #CJK UNIFIED IDEOGRAPH + {0xF6C7, 0x9DCD}, //12977 #CJK UNIFIED IDEOGRAPH + {0xF6C8, 0x9DB2}, //12978 #CJK UNIFIED IDEOGRAPH + {0xF6C9, 0x9E7A}, //12979 #CJK UNIFIED IDEOGRAPH + {0xF6CA, 0x9E9C}, //12980 #CJK UNIFIED IDEOGRAPH + {0xF6CB, 0x9EEB}, //12981 #CJK UNIFIED IDEOGRAPH + {0xF6CC, 0x9EEE}, //12982 #CJK UNIFIED IDEOGRAPH + {0xF6CD, 0x9EED}, //12983 #CJK UNIFIED IDEOGRAPH + {0xF6CE, 0x9F1B}, //12984 #CJK UNIFIED IDEOGRAPH + {0xF6CF, 0x9F18}, //12985 #CJK UNIFIED IDEOGRAPH + {0xF6D0, 0x9F1A}, //12986 #CJK UNIFIED IDEOGRAPH + {0xF6D1, 0x9F31}, //12987 #CJK UNIFIED IDEOGRAPH + {0xF6D2, 0x9F4E}, //12988 #CJK UNIFIED IDEOGRAPH + {0xF6D3, 0x9F65}, //12989 #CJK UNIFIED IDEOGRAPH + {0xF6D4, 0x9F64}, //12990 #CJK UNIFIED IDEOGRAPH + {0xF6D5, 0x9F92}, //12991 #CJK UNIFIED IDEOGRAPH + {0xF6D6, 0x4EB9}, //12992 #CJK UNIFIED IDEOGRAPH + {0xF6D7, 0x56C6}, //12993 #CJK UNIFIED IDEOGRAPH + {0xF6D8, 0x56C5}, //12994 #CJK UNIFIED IDEOGRAPH + {0xF6D9, 0x56CB}, //12995 #CJK UNIFIED IDEOGRAPH + {0xF6DA, 0x5971}, //12996 #CJK UNIFIED IDEOGRAPH + {0xF6DB, 0x5B4B}, //12997 #CJK UNIFIED IDEOGRAPH + {0xF6DC, 0x5B4C}, //12998 #CJK UNIFIED IDEOGRAPH + {0xF6DD, 0x5DD5}, //12999 #CJK UNIFIED IDEOGRAPH + {0xF6DE, 0x5DD1}, //13000 #CJK UNIFIED IDEOGRAPH + {0xF6DF, 0x5EF2}, //13001 #CJK UNIFIED IDEOGRAPH + {0xF6E0, 0x6521}, //13002 #CJK UNIFIED IDEOGRAPH + {0xF6E1, 0x6520}, //13003 #CJK UNIFIED IDEOGRAPH + {0xF6E2, 0x6526}, //13004 #CJK UNIFIED IDEOGRAPH + {0xF6E3, 0x6522}, //13005 #CJK UNIFIED IDEOGRAPH + {0xF6E4, 0x6B0B}, //13006 #CJK UNIFIED IDEOGRAPH + {0xF6E5, 0x6B08}, //13007 #CJK UNIFIED IDEOGRAPH + {0xF6E6, 0x6B09}, //13008 #CJK UNIFIED IDEOGRAPH + {0xF6E7, 0x6C0D}, //13009 #CJK UNIFIED IDEOGRAPH + {0xF6E8, 0x7055}, //13010 #CJK UNIFIED IDEOGRAPH + {0xF6E9, 0x7056}, //13011 #CJK UNIFIED IDEOGRAPH + {0xF6EA, 0x7057}, //13012 #CJK UNIFIED IDEOGRAPH + {0xF6EB, 0x7052}, //13013 #CJK UNIFIED IDEOGRAPH + {0xF6EC, 0x721E}, //13014 #CJK UNIFIED IDEOGRAPH + {0xF6ED, 0x721F}, //13015 #CJK UNIFIED IDEOGRAPH + {0xF6EE, 0x72A9}, //13016 #CJK UNIFIED IDEOGRAPH + {0xF6EF, 0x737F}, //13017 #CJK UNIFIED IDEOGRAPH + {0xF6F0, 0x74D8}, //13018 #CJK UNIFIED IDEOGRAPH + {0xF6F1, 0x74D5}, //13019 #CJK UNIFIED IDEOGRAPH + {0xF6F2, 0x74D9}, //13020 #CJK UNIFIED IDEOGRAPH + {0xF6F3, 0x74D7}, //13021 #CJK UNIFIED IDEOGRAPH + {0xF6F4, 0x766D}, //13022 #CJK UNIFIED IDEOGRAPH + {0xF6F5, 0x76AD}, //13023 #CJK UNIFIED IDEOGRAPH + {0xF6F6, 0x7935}, //13024 #CJK UNIFIED IDEOGRAPH + {0xF6F7, 0x79B4}, //13025 #CJK UNIFIED IDEOGRAPH + {0xF6F8, 0x7A70}, //13026 #CJK UNIFIED IDEOGRAPH + {0xF6F9, 0x7A71}, //13027 #CJK UNIFIED IDEOGRAPH + {0xF6FA, 0x7C57}, //13028 #CJK UNIFIED IDEOGRAPH + {0xF6FB, 0x7C5C}, //13029 #CJK UNIFIED IDEOGRAPH + {0xF6FC, 0x7C59}, //13030 #CJK UNIFIED IDEOGRAPH + {0xF6FD, 0x7C5B}, //13031 #CJK UNIFIED IDEOGRAPH + {0xF6FE, 0x7C5A}, //13032 #CJK UNIFIED IDEOGRAPH + {0xF740, 0x7CF4}, //13033 #CJK UNIFIED IDEOGRAPH + {0xF741, 0x7CF1}, //13034 #CJK UNIFIED IDEOGRAPH + {0xF742, 0x7E91}, //13035 #CJK UNIFIED IDEOGRAPH + {0xF743, 0x7F4F}, //13036 #CJK UNIFIED IDEOGRAPH + {0xF744, 0x7F87}, //13037 #CJK UNIFIED IDEOGRAPH + {0xF745, 0x81DE}, //13038 #CJK UNIFIED IDEOGRAPH + {0xF746, 0x826B}, //13039 #CJK UNIFIED IDEOGRAPH + {0xF747, 0x8634}, //13040 #CJK UNIFIED IDEOGRAPH + {0xF748, 0x8635}, //13041 #CJK UNIFIED IDEOGRAPH + {0xF749, 0x8633}, //13042 #CJK UNIFIED IDEOGRAPH + {0xF74A, 0x862C}, //13043 #CJK UNIFIED IDEOGRAPH + {0xF74B, 0x8632}, //13044 #CJK UNIFIED IDEOGRAPH + {0xF74C, 0x8636}, //13045 #CJK UNIFIED IDEOGRAPH + {0xF74D, 0x882C}, //13046 #CJK UNIFIED IDEOGRAPH + {0xF74E, 0x8828}, //13047 #CJK UNIFIED IDEOGRAPH + {0xF74F, 0x8826}, //13048 #CJK UNIFIED IDEOGRAPH + {0xF750, 0x882A}, //13049 #CJK UNIFIED IDEOGRAPH + {0xF751, 0x8825}, //13050 #CJK UNIFIED IDEOGRAPH + {0xF752, 0x8971}, //13051 #CJK UNIFIED IDEOGRAPH + {0xF753, 0x89BF}, //13052 #CJK UNIFIED IDEOGRAPH + {0xF754, 0x89BE}, //13053 #CJK UNIFIED IDEOGRAPH + {0xF755, 0x89FB}, //13054 #CJK UNIFIED IDEOGRAPH + {0xF756, 0x8B7E}, //13055 #CJK UNIFIED IDEOGRAPH + {0xF757, 0x8B84}, //13056 #CJK UNIFIED IDEOGRAPH + {0xF758, 0x8B82}, //13057 #CJK UNIFIED IDEOGRAPH + {0xF759, 0x8B86}, //13058 #CJK UNIFIED IDEOGRAPH + {0xF75A, 0x8B85}, //13059 #CJK UNIFIED IDEOGRAPH + {0xF75B, 0x8B7F}, //13060 #CJK UNIFIED IDEOGRAPH + {0xF75C, 0x8D15}, //13061 #CJK UNIFIED IDEOGRAPH + {0xF75D, 0x8E95}, //13062 #CJK UNIFIED IDEOGRAPH + {0xF75E, 0x8E94}, //13063 #CJK UNIFIED IDEOGRAPH + {0xF75F, 0x8E9A}, //13064 #CJK UNIFIED IDEOGRAPH + {0xF760, 0x8E92}, //13065 #CJK UNIFIED IDEOGRAPH + {0xF761, 0x8E90}, //13066 #CJK UNIFIED IDEOGRAPH + {0xF762, 0x8E96}, //13067 #CJK UNIFIED IDEOGRAPH + {0xF763, 0x8E97}, //13068 #CJK UNIFIED IDEOGRAPH + {0xF764, 0x8F60}, //13069 #CJK UNIFIED IDEOGRAPH + {0xF765, 0x8F62}, //13070 #CJK UNIFIED IDEOGRAPH + {0xF766, 0x9147}, //13071 #CJK UNIFIED IDEOGRAPH + {0xF767, 0x944C}, //13072 #CJK UNIFIED IDEOGRAPH + {0xF768, 0x9450}, //13073 #CJK UNIFIED IDEOGRAPH + {0xF769, 0x944A}, //13074 #CJK UNIFIED IDEOGRAPH + {0xF76A, 0x944B}, //13075 #CJK UNIFIED IDEOGRAPH + {0xF76B, 0x944F}, //13076 #CJK UNIFIED IDEOGRAPH + {0xF76C, 0x9447}, //13077 #CJK UNIFIED IDEOGRAPH + {0xF76D, 0x9445}, //13078 #CJK UNIFIED IDEOGRAPH + {0xF76E, 0x9448}, //13079 #CJK UNIFIED IDEOGRAPH + {0xF76F, 0x9449}, //13080 #CJK UNIFIED IDEOGRAPH + {0xF770, 0x9446}, //13081 #CJK UNIFIED IDEOGRAPH + {0xF771, 0x973F}, //13082 #CJK UNIFIED IDEOGRAPH + {0xF772, 0x97E3}, //13083 #CJK UNIFIED IDEOGRAPH + {0xF773, 0x986A}, //13084 #CJK UNIFIED IDEOGRAPH + {0xF774, 0x9869}, //13085 #CJK UNIFIED IDEOGRAPH + {0xF775, 0x98CB}, //13086 #CJK UNIFIED IDEOGRAPH + {0xF776, 0x9954}, //13087 #CJK UNIFIED IDEOGRAPH + {0xF777, 0x995B}, //13088 #CJK UNIFIED IDEOGRAPH + {0xF778, 0x9A4E}, //13089 #CJK UNIFIED IDEOGRAPH + {0xF779, 0x9A53}, //13090 #CJK UNIFIED IDEOGRAPH + {0xF77A, 0x9A54}, //13091 #CJK UNIFIED IDEOGRAPH + {0xF77B, 0x9A4C}, //13092 #CJK UNIFIED IDEOGRAPH + {0xF77C, 0x9A4F}, //13093 #CJK UNIFIED IDEOGRAPH + {0xF77D, 0x9A48}, //13094 #CJK UNIFIED IDEOGRAPH + {0xF77E, 0x9A4A}, //13095 #CJK UNIFIED IDEOGRAPH + {0xF7A1, 0x9A49}, //13096 #CJK UNIFIED IDEOGRAPH + {0xF7A2, 0x9A52}, //13097 #CJK UNIFIED IDEOGRAPH + {0xF7A3, 0x9A50}, //13098 #CJK UNIFIED IDEOGRAPH + {0xF7A4, 0x9AD0}, //13099 #CJK UNIFIED IDEOGRAPH + {0xF7A5, 0x9B19}, //13100 #CJK UNIFIED IDEOGRAPH + {0xF7A6, 0x9B2B}, //13101 #CJK UNIFIED IDEOGRAPH + {0xF7A7, 0x9B3B}, //13102 #CJK UNIFIED IDEOGRAPH + {0xF7A8, 0x9B56}, //13103 #CJK UNIFIED IDEOGRAPH + {0xF7A9, 0x9B55}, //13104 #CJK UNIFIED IDEOGRAPH + {0xF7AA, 0x9C46}, //13105 #CJK UNIFIED IDEOGRAPH + {0xF7AB, 0x9C48}, //13106 #CJK UNIFIED IDEOGRAPH + {0xF7AC, 0x9C3F}, //13107 #CJK UNIFIED IDEOGRAPH + {0xF7AD, 0x9C44}, //13108 #CJK UNIFIED IDEOGRAPH + {0xF7AE, 0x9C39}, //13109 #CJK UNIFIED IDEOGRAPH + {0xF7AF, 0x9C33}, //13110 #CJK UNIFIED IDEOGRAPH + {0xF7B0, 0x9C41}, //13111 #CJK UNIFIED IDEOGRAPH + {0xF7B1, 0x9C3C}, //13112 #CJK UNIFIED IDEOGRAPH + {0xF7B2, 0x9C37}, //13113 #CJK UNIFIED IDEOGRAPH + {0xF7B3, 0x9C34}, //13114 #CJK UNIFIED IDEOGRAPH + {0xF7B4, 0x9C32}, //13115 #CJK UNIFIED IDEOGRAPH + {0xF7B5, 0x9C3D}, //13116 #CJK UNIFIED IDEOGRAPH + {0xF7B6, 0x9C36}, //13117 #CJK UNIFIED IDEOGRAPH + {0xF7B7, 0x9DDB}, //13118 #CJK UNIFIED IDEOGRAPH + {0xF7B8, 0x9DD2}, //13119 #CJK UNIFIED IDEOGRAPH + {0xF7B9, 0x9DDE}, //13120 #CJK UNIFIED IDEOGRAPH + {0xF7BA, 0x9DDA}, //13121 #CJK UNIFIED IDEOGRAPH + {0xF7BB, 0x9DCB}, //13122 #CJK UNIFIED IDEOGRAPH + {0xF7BC, 0x9DD0}, //13123 #CJK UNIFIED IDEOGRAPH + {0xF7BD, 0x9DDC}, //13124 #CJK UNIFIED IDEOGRAPH + {0xF7BE, 0x9DD1}, //13125 #CJK UNIFIED IDEOGRAPH + {0xF7BF, 0x9DDF}, //13126 #CJK UNIFIED IDEOGRAPH + {0xF7C0, 0x9DE9}, //13127 #CJK UNIFIED IDEOGRAPH + {0xF7C1, 0x9DD9}, //13128 #CJK UNIFIED IDEOGRAPH + {0xF7C2, 0x9DD8}, //13129 #CJK UNIFIED IDEOGRAPH + {0xF7C3, 0x9DD6}, //13130 #CJK UNIFIED IDEOGRAPH + {0xF7C4, 0x9DF5}, //13131 #CJK UNIFIED IDEOGRAPH + {0xF7C5, 0x9DD5}, //13132 #CJK UNIFIED IDEOGRAPH + {0xF7C6, 0x9DDD}, //13133 #CJK UNIFIED IDEOGRAPH + {0xF7C7, 0x9EB6}, //13134 #CJK UNIFIED IDEOGRAPH + {0xF7C8, 0x9EF0}, //13135 #CJK UNIFIED IDEOGRAPH + {0xF7C9, 0x9F35}, //13136 #CJK UNIFIED IDEOGRAPH + {0xF7CA, 0x9F33}, //13137 #CJK UNIFIED IDEOGRAPH + {0xF7CB, 0x9F32}, //13138 #CJK UNIFIED IDEOGRAPH + {0xF7CC, 0x9F42}, //13139 #CJK UNIFIED IDEOGRAPH + {0xF7CD, 0x9F6B}, //13140 #CJK UNIFIED IDEOGRAPH + {0xF7CE, 0x9F95}, //13141 #CJK UNIFIED IDEOGRAPH + {0xF7CF, 0x9FA2}, //13142 #CJK UNIFIED IDEOGRAPH + {0xF7D0, 0x513D}, //13143 #CJK UNIFIED IDEOGRAPH + {0xF7D1, 0x5299}, //13144 #CJK UNIFIED IDEOGRAPH + {0xF7D2, 0x58E8}, //13145 #CJK UNIFIED IDEOGRAPH + {0xF7D3, 0x58E7}, //13146 #CJK UNIFIED IDEOGRAPH + {0xF7D4, 0x5972}, //13147 #CJK UNIFIED IDEOGRAPH + {0xF7D5, 0x5B4D}, //13148 #CJK UNIFIED IDEOGRAPH + {0xF7D6, 0x5DD8}, //13149 #CJK UNIFIED IDEOGRAPH + {0xF7D7, 0x882F}, //13150 #CJK UNIFIED IDEOGRAPH + {0xF7D8, 0x5F4F}, //13151 #CJK UNIFIED IDEOGRAPH + {0xF7D9, 0x6201}, //13152 #CJK UNIFIED IDEOGRAPH + {0xF7DA, 0x6203}, //13153 #CJK UNIFIED IDEOGRAPH + {0xF7DB, 0x6204}, //13154 #CJK UNIFIED IDEOGRAPH + {0xF7DC, 0x6529}, //13155 #CJK UNIFIED IDEOGRAPH + {0xF7DD, 0x6525}, //13156 #CJK UNIFIED IDEOGRAPH + {0xF7DE, 0x6596}, //13157 #CJK UNIFIED IDEOGRAPH + {0xF7DF, 0x66EB}, //13158 #CJK UNIFIED IDEOGRAPH + {0xF7E0, 0x6B11}, //13159 #CJK UNIFIED IDEOGRAPH + {0xF7E1, 0x6B12}, //13160 #CJK UNIFIED IDEOGRAPH + {0xF7E2, 0x6B0F}, //13161 #CJK UNIFIED IDEOGRAPH + {0xF7E3, 0x6BCA}, //13162 #CJK UNIFIED IDEOGRAPH + {0xF7E4, 0x705B}, //13163 #CJK UNIFIED IDEOGRAPH + {0xF7E5, 0x705A}, //13164 #CJK UNIFIED IDEOGRAPH + {0xF7E6, 0x7222}, //13165 #CJK UNIFIED IDEOGRAPH + {0xF7E7, 0x7382}, //13166 #CJK UNIFIED IDEOGRAPH + {0xF7E8, 0x7381}, //13167 #CJK UNIFIED IDEOGRAPH + {0xF7E9, 0x7383}, //13168 #CJK UNIFIED IDEOGRAPH + {0xF7EA, 0x7670}, //13169 #CJK UNIFIED IDEOGRAPH + {0xF7EB, 0x77D4}, //13170 #CJK UNIFIED IDEOGRAPH + {0xF7EC, 0x7C67}, //13171 #CJK UNIFIED IDEOGRAPH + {0xF7ED, 0x7C66}, //13172 #CJK UNIFIED IDEOGRAPH + {0xF7EE, 0x7E95}, //13173 #CJK UNIFIED IDEOGRAPH + {0xF7EF, 0x826C}, //13174 #CJK UNIFIED IDEOGRAPH + {0xF7F0, 0x863A}, //13175 #CJK UNIFIED IDEOGRAPH + {0xF7F1, 0x8640}, //13176 #CJK UNIFIED IDEOGRAPH + {0xF7F2, 0x8639}, //13177 #CJK UNIFIED IDEOGRAPH + {0xF7F3, 0x863C}, //13178 #CJK UNIFIED IDEOGRAPH + {0xF7F4, 0x8631}, //13179 #CJK UNIFIED IDEOGRAPH + {0xF7F5, 0x863B}, //13180 #CJK UNIFIED IDEOGRAPH + {0xF7F6, 0x863E}, //13181 #CJK UNIFIED IDEOGRAPH + {0xF7F7, 0x8830}, //13182 #CJK UNIFIED IDEOGRAPH + {0xF7F8, 0x8832}, //13183 #CJK UNIFIED IDEOGRAPH + {0xF7F9, 0x882E}, //13184 #CJK UNIFIED IDEOGRAPH + {0xF7FA, 0x8833}, //13185 #CJK UNIFIED IDEOGRAPH + {0xF7FB, 0x8976}, //13186 #CJK UNIFIED IDEOGRAPH + {0xF7FC, 0x8974}, //13187 #CJK UNIFIED IDEOGRAPH + {0xF7FD, 0x8973}, //13188 #CJK UNIFIED IDEOGRAPH + {0xF7FE, 0x89FE}, //13189 #CJK UNIFIED IDEOGRAPH + {0xF840, 0x8B8C}, //13190 #CJK UNIFIED IDEOGRAPH + {0xF841, 0x8B8E}, //13191 #CJK UNIFIED IDEOGRAPH + {0xF842, 0x8B8B}, //13192 #CJK UNIFIED IDEOGRAPH + {0xF843, 0x8B88}, //13193 #CJK UNIFIED IDEOGRAPH + {0xF844, 0x8C45}, //13194 #CJK UNIFIED IDEOGRAPH + {0xF845, 0x8D19}, //13195 #CJK UNIFIED IDEOGRAPH + {0xF846, 0x8E98}, //13196 #CJK UNIFIED IDEOGRAPH + {0xF847, 0x8F64}, //13197 #CJK UNIFIED IDEOGRAPH + {0xF848, 0x8F63}, //13198 #CJK UNIFIED IDEOGRAPH + {0xF849, 0x91BC}, //13199 #CJK UNIFIED IDEOGRAPH + {0xF84A, 0x9462}, //13200 #CJK UNIFIED IDEOGRAPH + {0xF84B, 0x9455}, //13201 #CJK UNIFIED IDEOGRAPH + {0xF84C, 0x945D}, //13202 #CJK UNIFIED IDEOGRAPH + {0xF84D, 0x9457}, //13203 #CJK UNIFIED IDEOGRAPH + {0xF84E, 0x945E}, //13204 #CJK UNIFIED IDEOGRAPH + {0xF84F, 0x97C4}, //13205 #CJK UNIFIED IDEOGRAPH + {0xF850, 0x97C5}, //13206 #CJK UNIFIED IDEOGRAPH + {0xF851, 0x9800}, //13207 #CJK UNIFIED IDEOGRAPH + {0xF852, 0x9A56}, //13208 #CJK UNIFIED IDEOGRAPH + {0xF853, 0x9A59}, //13209 #CJK UNIFIED IDEOGRAPH + {0xF854, 0x9B1E}, //13210 #CJK UNIFIED IDEOGRAPH + {0xF855, 0x9B1F}, //13211 #CJK UNIFIED IDEOGRAPH + {0xF856, 0x9B20}, //13212 #CJK UNIFIED IDEOGRAPH + {0xF857, 0x9C52}, //13213 #CJK UNIFIED IDEOGRAPH + {0xF858, 0x9C58}, //13214 #CJK UNIFIED IDEOGRAPH + {0xF859, 0x9C50}, //13215 #CJK UNIFIED IDEOGRAPH + {0xF85A, 0x9C4A}, //13216 #CJK UNIFIED IDEOGRAPH + {0xF85B, 0x9C4D}, //13217 #CJK UNIFIED IDEOGRAPH + {0xF85C, 0x9C4B}, //13218 #CJK UNIFIED IDEOGRAPH + {0xF85D, 0x9C55}, //13219 #CJK UNIFIED IDEOGRAPH + {0xF85E, 0x9C59}, //13220 #CJK UNIFIED IDEOGRAPH + {0xF85F, 0x9C4C}, //13221 #CJK UNIFIED IDEOGRAPH + {0xF860, 0x9C4E}, //13222 #CJK UNIFIED IDEOGRAPH + {0xF861, 0x9DFB}, //13223 #CJK UNIFIED IDEOGRAPH + {0xF862, 0x9DF7}, //13224 #CJK UNIFIED IDEOGRAPH + {0xF863, 0x9DEF}, //13225 #CJK UNIFIED IDEOGRAPH + {0xF864, 0x9DE3}, //13226 #CJK UNIFIED IDEOGRAPH + {0xF865, 0x9DEB}, //13227 #CJK UNIFIED IDEOGRAPH + {0xF866, 0x9DF8}, //13228 #CJK UNIFIED IDEOGRAPH + {0xF867, 0x9DE4}, //13229 #CJK UNIFIED IDEOGRAPH + {0xF868, 0x9DF6}, //13230 #CJK UNIFIED IDEOGRAPH + {0xF869, 0x9DE1}, //13231 #CJK UNIFIED IDEOGRAPH + {0xF86A, 0x9DEE}, //13232 #CJK UNIFIED IDEOGRAPH + {0xF86B, 0x9DE6}, //13233 #CJK UNIFIED IDEOGRAPH + {0xF86C, 0x9DF2}, //13234 #CJK UNIFIED IDEOGRAPH + {0xF86D, 0x9DF0}, //13235 #CJK UNIFIED IDEOGRAPH + {0xF86E, 0x9DE2}, //13236 #CJK UNIFIED IDEOGRAPH + {0xF86F, 0x9DEC}, //13237 #CJK UNIFIED IDEOGRAPH + {0xF870, 0x9DF4}, //13238 #CJK UNIFIED IDEOGRAPH + {0xF871, 0x9DF3}, //13239 #CJK UNIFIED IDEOGRAPH + {0xF872, 0x9DE8}, //13240 #CJK UNIFIED IDEOGRAPH + {0xF873, 0x9DED}, //13241 #CJK UNIFIED IDEOGRAPH + {0xF874, 0x9EC2}, //13242 #CJK UNIFIED IDEOGRAPH + {0xF875, 0x9ED0}, //13243 #CJK UNIFIED IDEOGRAPH + {0xF876, 0x9EF2}, //13244 #CJK UNIFIED IDEOGRAPH + {0xF877, 0x9EF3}, //13245 #CJK UNIFIED IDEOGRAPH + {0xF878, 0x9F06}, //13246 #CJK UNIFIED IDEOGRAPH + {0xF879, 0x9F1C}, //13247 #CJK UNIFIED IDEOGRAPH + {0xF87A, 0x9F38}, //13248 #CJK UNIFIED IDEOGRAPH + {0xF87B, 0x9F37}, //13249 #CJK UNIFIED IDEOGRAPH + {0xF87C, 0x9F36}, //13250 #CJK UNIFIED IDEOGRAPH + {0xF87D, 0x9F43}, //13251 #CJK UNIFIED IDEOGRAPH + {0xF87E, 0x9F4F}, //13252 #CJK UNIFIED IDEOGRAPH + {0xF8A1, 0x9F71}, //13253 #CJK UNIFIED IDEOGRAPH + {0xF8A2, 0x9F70}, //13254 #CJK UNIFIED IDEOGRAPH + {0xF8A3, 0x9F6E}, //13255 #CJK UNIFIED IDEOGRAPH + {0xF8A4, 0x9F6F}, //13256 #CJK UNIFIED IDEOGRAPH + {0xF8A5, 0x56D3}, //13257 #CJK UNIFIED IDEOGRAPH + {0xF8A6, 0x56CD}, //13258 #CJK UNIFIED IDEOGRAPH + {0xF8A7, 0x5B4E}, //13259 #CJK UNIFIED IDEOGRAPH + {0xF8A8, 0x5C6D}, //13260 #CJK UNIFIED IDEOGRAPH + {0xF8A9, 0x652D}, //13261 #CJK UNIFIED IDEOGRAPH + {0xF8AA, 0x66ED}, //13262 #CJK UNIFIED IDEOGRAPH + {0xF8AB, 0x66EE}, //13263 #CJK UNIFIED IDEOGRAPH + {0xF8AC, 0x6B13}, //13264 #CJK UNIFIED IDEOGRAPH + {0xF8AD, 0x705F}, //13265 #CJK UNIFIED IDEOGRAPH + {0xF8AE, 0x7061}, //13266 #CJK UNIFIED IDEOGRAPH + {0xF8AF, 0x705D}, //13267 #CJK UNIFIED IDEOGRAPH + {0xF8B0, 0x7060}, //13268 #CJK UNIFIED IDEOGRAPH + {0xF8B1, 0x7223}, //13269 #CJK UNIFIED IDEOGRAPH + {0xF8B2, 0x74DB}, //13270 #CJK UNIFIED IDEOGRAPH + {0xF8B3, 0x74E5}, //13271 #CJK UNIFIED IDEOGRAPH + {0xF8B4, 0x77D5}, //13272 #CJK UNIFIED IDEOGRAPH + {0xF8B5, 0x7938}, //13273 #CJK UNIFIED IDEOGRAPH + {0xF8B6, 0x79B7}, //13274 #CJK UNIFIED IDEOGRAPH + {0xF8B7, 0x79B6}, //13275 #CJK UNIFIED IDEOGRAPH + {0xF8B8, 0x7C6A}, //13276 #CJK UNIFIED IDEOGRAPH + {0xF8B9, 0x7E97}, //13277 #CJK UNIFIED IDEOGRAPH + {0xF8BA, 0x7F89}, //13278 #CJK UNIFIED IDEOGRAPH + {0xF8BB, 0x826D}, //13279 #CJK UNIFIED IDEOGRAPH + {0xF8BC, 0x8643}, //13280 #CJK UNIFIED IDEOGRAPH + {0xF8BD, 0x8838}, //13281 #CJK UNIFIED IDEOGRAPH + {0xF8BE, 0x8837}, //13282 #CJK UNIFIED IDEOGRAPH + {0xF8BF, 0x8835}, //13283 #CJK UNIFIED IDEOGRAPH + {0xF8C0, 0x884B}, //13284 #CJK UNIFIED IDEOGRAPH + {0xF8C1, 0x8B94}, //13285 #CJK UNIFIED IDEOGRAPH + {0xF8C2, 0x8B95}, //13286 #CJK UNIFIED IDEOGRAPH + {0xF8C3, 0x8E9E}, //13287 #CJK UNIFIED IDEOGRAPH + {0xF8C4, 0x8E9F}, //13288 #CJK UNIFIED IDEOGRAPH + {0xF8C5, 0x8EA0}, //13289 #CJK UNIFIED IDEOGRAPH + {0xF8C6, 0x8E9D}, //13290 #CJK UNIFIED IDEOGRAPH + {0xF8C7, 0x91BE}, //13291 #CJK UNIFIED IDEOGRAPH + {0xF8C8, 0x91BD}, //13292 #CJK UNIFIED IDEOGRAPH + {0xF8C9, 0x91C2}, //13293 #CJK UNIFIED IDEOGRAPH + {0xF8CA, 0x946B}, //13294 #CJK UNIFIED IDEOGRAPH + {0xF8CB, 0x9468}, //13295 #CJK UNIFIED IDEOGRAPH + {0xF8CC, 0x9469}, //13296 #CJK UNIFIED IDEOGRAPH + {0xF8CD, 0x96E5}, //13297 #CJK UNIFIED IDEOGRAPH + {0xF8CE, 0x9746}, //13298 #CJK UNIFIED IDEOGRAPH + {0xF8CF, 0x9743}, //13299 #CJK UNIFIED IDEOGRAPH + {0xF8D0, 0x9747}, //13300 #CJK UNIFIED IDEOGRAPH + {0xF8D1, 0x97C7}, //13301 #CJK UNIFIED IDEOGRAPH + {0xF8D2, 0x97E5}, //13302 #CJK UNIFIED IDEOGRAPH + {0xF8D3, 0x9A5E}, //13303 #CJK UNIFIED IDEOGRAPH + {0xF8D4, 0x9AD5}, //13304 #CJK UNIFIED IDEOGRAPH + {0xF8D5, 0x9B59}, //13305 #CJK UNIFIED IDEOGRAPH + {0xF8D6, 0x9C63}, //13306 #CJK UNIFIED IDEOGRAPH + {0xF8D7, 0x9C67}, //13307 #CJK UNIFIED IDEOGRAPH + {0xF8D8, 0x9C66}, //13308 #CJK UNIFIED IDEOGRAPH + {0xF8D9, 0x9C62}, //13309 #CJK UNIFIED IDEOGRAPH + {0xF8DA, 0x9C5E}, //13310 #CJK UNIFIED IDEOGRAPH + {0xF8DB, 0x9C60}, //13311 #CJK UNIFIED IDEOGRAPH + {0xF8DC, 0x9E02}, //13312 #CJK UNIFIED IDEOGRAPH + {0xF8DD, 0x9DFE}, //13313 #CJK UNIFIED IDEOGRAPH + {0xF8DE, 0x9E07}, //13314 #CJK UNIFIED IDEOGRAPH + {0xF8DF, 0x9E03}, //13315 #CJK UNIFIED IDEOGRAPH + {0xF8E0, 0x9E06}, //13316 #CJK UNIFIED IDEOGRAPH + {0xF8E1, 0x9E05}, //13317 #CJK UNIFIED IDEOGRAPH + {0xF8E2, 0x9E00}, //13318 #CJK UNIFIED IDEOGRAPH + {0xF8E3, 0x9E01}, //13319 #CJK UNIFIED IDEOGRAPH + {0xF8E4, 0x9E09}, //13320 #CJK UNIFIED IDEOGRAPH + {0xF8E5, 0x9DFF}, //13321 #CJK UNIFIED IDEOGRAPH + {0xF8E6, 0x9DFD}, //13322 #CJK UNIFIED IDEOGRAPH + {0xF8E7, 0x9E04}, //13323 #CJK UNIFIED IDEOGRAPH + {0xF8E8, 0x9EA0}, //13324 #CJK UNIFIED IDEOGRAPH + {0xF8E9, 0x9F1E}, //13325 #CJK UNIFIED IDEOGRAPH + {0xF8EA, 0x9F46}, //13326 #CJK UNIFIED IDEOGRAPH + {0xF8EB, 0x9F74}, //13327 #CJK UNIFIED IDEOGRAPH + {0xF8EC, 0x9F75}, //13328 #CJK UNIFIED IDEOGRAPH + {0xF8ED, 0x9F76}, //13329 #CJK UNIFIED IDEOGRAPH + {0xF8EE, 0x56D4}, //13330 #CJK UNIFIED IDEOGRAPH + {0xF8EF, 0x652E}, //13331 #CJK UNIFIED IDEOGRAPH + {0xF8F0, 0x65B8}, //13332 #CJK UNIFIED IDEOGRAPH + {0xF8F1, 0x6B18}, //13333 #CJK UNIFIED IDEOGRAPH + {0xF8F2, 0x6B19}, //13334 #CJK UNIFIED IDEOGRAPH + {0xF8F3, 0x6B17}, //13335 #CJK UNIFIED IDEOGRAPH + {0xF8F4, 0x6B1A}, //13336 #CJK UNIFIED IDEOGRAPH + {0xF8F5, 0x7062}, //13337 #CJK UNIFIED IDEOGRAPH + {0xF8F6, 0x7226}, //13338 #CJK UNIFIED IDEOGRAPH + {0xF8F7, 0x72AA}, //13339 #CJK UNIFIED IDEOGRAPH + {0xF8F8, 0x77D8}, //13340 #CJK UNIFIED IDEOGRAPH + {0xF8F9, 0x77D9}, //13341 #CJK UNIFIED IDEOGRAPH + {0xF8FA, 0x7939}, //13342 #CJK UNIFIED IDEOGRAPH + {0xF8FB, 0x7C69}, //13343 #CJK UNIFIED IDEOGRAPH + {0xF8FC, 0x7C6B}, //13344 #CJK UNIFIED IDEOGRAPH + {0xF8FD, 0x7CF6}, //13345 #CJK UNIFIED IDEOGRAPH + {0xF8FE, 0x7E9A}, //13346 #CJK UNIFIED IDEOGRAPH + {0xF940, 0x7E98}, //13347 #CJK UNIFIED IDEOGRAPH + {0xF941, 0x7E9B}, //13348 #CJK UNIFIED IDEOGRAPH + {0xF942, 0x7E99}, //13349 #CJK UNIFIED IDEOGRAPH + {0xF943, 0x81E0}, //13350 #CJK UNIFIED IDEOGRAPH + {0xF944, 0x81E1}, //13351 #CJK UNIFIED IDEOGRAPH + {0xF945, 0x8646}, //13352 #CJK UNIFIED IDEOGRAPH + {0xF946, 0x8647}, //13353 #CJK UNIFIED IDEOGRAPH + {0xF947, 0x8648}, //13354 #CJK UNIFIED IDEOGRAPH + {0xF948, 0x8979}, //13355 #CJK UNIFIED IDEOGRAPH + {0xF949, 0x897A}, //13356 #CJK UNIFIED IDEOGRAPH + {0xF94A, 0x897C}, //13357 #CJK UNIFIED IDEOGRAPH + {0xF94B, 0x897B}, //13358 #CJK UNIFIED IDEOGRAPH + {0xF94C, 0x89FF}, //13359 #CJK UNIFIED IDEOGRAPH + {0xF94D, 0x8B98}, //13360 #CJK UNIFIED IDEOGRAPH + {0xF94E, 0x8B99}, //13361 #CJK UNIFIED IDEOGRAPH + {0xF94F, 0x8EA5}, //13362 #CJK UNIFIED IDEOGRAPH + {0xF950, 0x8EA4}, //13363 #CJK UNIFIED IDEOGRAPH + {0xF951, 0x8EA3}, //13364 #CJK UNIFIED IDEOGRAPH + {0xF952, 0x946E}, //13365 #CJK UNIFIED IDEOGRAPH + {0xF953, 0x946D}, //13366 #CJK UNIFIED IDEOGRAPH + {0xF954, 0x946F}, //13367 #CJK UNIFIED IDEOGRAPH + {0xF955, 0x9471}, //13368 #CJK UNIFIED IDEOGRAPH + {0xF956, 0x9473}, //13369 #CJK UNIFIED IDEOGRAPH + {0xF957, 0x9749}, //13370 #CJK UNIFIED IDEOGRAPH + {0xF958, 0x9872}, //13371 #CJK UNIFIED IDEOGRAPH + {0xF959, 0x995F}, //13372 #CJK UNIFIED IDEOGRAPH + {0xF95A, 0x9C68}, //13373 #CJK UNIFIED IDEOGRAPH + {0xF95B, 0x9C6E}, //13374 #CJK UNIFIED IDEOGRAPH + {0xF95C, 0x9C6D}, //13375 #CJK UNIFIED IDEOGRAPH + {0xF95D, 0x9E0B}, //13376 #CJK UNIFIED IDEOGRAPH + {0xF95E, 0x9E0D}, //13377 #CJK UNIFIED IDEOGRAPH + {0xF95F, 0x9E10}, //13378 #CJK UNIFIED IDEOGRAPH + {0xF960, 0x9E0F}, //13379 #CJK UNIFIED IDEOGRAPH + {0xF961, 0x9E12}, //13380 #CJK UNIFIED IDEOGRAPH + {0xF962, 0x9E11}, //13381 #CJK UNIFIED IDEOGRAPH + {0xF963, 0x9EA1}, //13382 #CJK UNIFIED IDEOGRAPH + {0xF964, 0x9EF5}, //13383 #CJK UNIFIED IDEOGRAPH + {0xF965, 0x9F09}, //13384 #CJK UNIFIED IDEOGRAPH + {0xF966, 0x9F47}, //13385 #CJK UNIFIED IDEOGRAPH + {0xF967, 0x9F78}, //13386 #CJK UNIFIED IDEOGRAPH + {0xF968, 0x9F7B}, //13387 #CJK UNIFIED IDEOGRAPH + {0xF969, 0x9F7A}, //13388 #CJK UNIFIED IDEOGRAPH + {0xF96A, 0x9F79}, //13389 #CJK UNIFIED IDEOGRAPH + {0xF96B, 0x571E}, //13390 #CJK UNIFIED IDEOGRAPH + {0xF96C, 0x7066}, //13391 #CJK UNIFIED IDEOGRAPH + {0xF96D, 0x7C6F}, //13392 #CJK UNIFIED IDEOGRAPH + {0xF96E, 0x883C}, //13393 #CJK UNIFIED IDEOGRAPH + {0xF96F, 0x8DB2}, //13394 #CJK UNIFIED IDEOGRAPH + {0xF970, 0x8EA6}, //13395 #CJK UNIFIED IDEOGRAPH + {0xF971, 0x91C3}, //13396 #CJK UNIFIED IDEOGRAPH + {0xF972, 0x9474}, //13397 #CJK UNIFIED IDEOGRAPH + {0xF973, 0x9478}, //13398 #CJK UNIFIED IDEOGRAPH + {0xF974, 0x9476}, //13399 #CJK UNIFIED IDEOGRAPH + {0xF975, 0x9475}, //13400 #CJK UNIFIED IDEOGRAPH + {0xF976, 0x9A60}, //13401 #CJK UNIFIED IDEOGRAPH + {0xF977, 0x9C74}, //13402 #CJK UNIFIED IDEOGRAPH + {0xF978, 0x9C73}, //13403 #CJK UNIFIED IDEOGRAPH + {0xF979, 0x9C71}, //13404 #CJK UNIFIED IDEOGRAPH + {0xF97A, 0x9C75}, //13405 #CJK UNIFIED IDEOGRAPH + {0xF97B, 0x9E14}, //13406 #CJK UNIFIED IDEOGRAPH + {0xF97C, 0x9E13}, //13407 #CJK UNIFIED IDEOGRAPH + {0xF97D, 0x9EF6}, //13408 #CJK UNIFIED IDEOGRAPH + {0xF97E, 0x9F0A}, //13409 #CJK UNIFIED IDEOGRAPH + {0xF9A1, 0x9FA4}, //13410 #CJK UNIFIED IDEOGRAPH + {0xF9A2, 0x7068}, //13411 #CJK UNIFIED IDEOGRAPH + {0xF9A3, 0x7065}, //13412 #CJK UNIFIED IDEOGRAPH + {0xF9A4, 0x7CF7}, //13413 #CJK UNIFIED IDEOGRAPH + {0xF9A5, 0x866A}, //13414 #CJK UNIFIED IDEOGRAPH + {0xF9A6, 0x883E}, //13415 #CJK UNIFIED IDEOGRAPH + {0xF9A7, 0x883D}, //13416 #CJK UNIFIED IDEOGRAPH + {0xF9A8, 0x883F}, //13417 #CJK UNIFIED IDEOGRAPH + {0xF9A9, 0x8B9E}, //13418 #CJK UNIFIED IDEOGRAPH + {0xF9AA, 0x8C9C}, //13419 #CJK UNIFIED IDEOGRAPH + {0xF9AB, 0x8EA9}, //13420 #CJK UNIFIED IDEOGRAPH + {0xF9AC, 0x8EC9}, //13421 #CJK UNIFIED IDEOGRAPH + {0xF9AD, 0x974B}, //13422 #CJK UNIFIED IDEOGRAPH + {0xF9AE, 0x9873}, //13423 #CJK UNIFIED IDEOGRAPH + {0xF9AF, 0x9874}, //13424 #CJK UNIFIED IDEOGRAPH + {0xF9B0, 0x98CC}, //13425 #CJK UNIFIED IDEOGRAPH + {0xF9B1, 0x9961}, //13426 #CJK UNIFIED IDEOGRAPH + {0xF9B2, 0x99AB}, //13427 #CJK UNIFIED IDEOGRAPH + {0xF9B3, 0x9A64}, //13428 #CJK UNIFIED IDEOGRAPH + {0xF9B4, 0x9A66}, //13429 #CJK UNIFIED IDEOGRAPH + {0xF9B5, 0x9A67}, //13430 #CJK UNIFIED IDEOGRAPH + {0xF9B6, 0x9B24}, //13431 #CJK UNIFIED IDEOGRAPH + {0xF9B7, 0x9E15}, //13432 #CJK UNIFIED IDEOGRAPH + {0xF9B8, 0x9E17}, //13433 #CJK UNIFIED IDEOGRAPH + {0xF9B9, 0x9F48}, //13434 #CJK UNIFIED IDEOGRAPH + {0xF9BA, 0x6207}, //13435 #CJK UNIFIED IDEOGRAPH + {0xF9BB, 0x6B1E}, //13436 #CJK UNIFIED IDEOGRAPH + {0xF9BC, 0x7227}, //13437 #CJK UNIFIED IDEOGRAPH + {0xF9BD, 0x864C}, //13438 #CJK UNIFIED IDEOGRAPH + {0xF9BE, 0x8EA8}, //13439 #CJK UNIFIED IDEOGRAPH + {0xF9BF, 0x9482}, //13440 #CJK UNIFIED IDEOGRAPH + {0xF9C0, 0x9480}, //13441 #CJK UNIFIED IDEOGRAPH + {0xF9C1, 0x9481}, //13442 #CJK UNIFIED IDEOGRAPH + {0xF9C2, 0x9A69}, //13443 #CJK UNIFIED IDEOGRAPH + {0xF9C3, 0x9A68}, //13444 #CJK UNIFIED IDEOGRAPH + {0xF9C4, 0x9B2E}, //13445 #CJK UNIFIED IDEOGRAPH + {0xF9C5, 0x9E19}, //13446 #CJK UNIFIED IDEOGRAPH + {0xF9C6, 0x7229}, //13447 #CJK UNIFIED IDEOGRAPH + {0xF9C7, 0x864B}, //13448 #CJK UNIFIED IDEOGRAPH + {0xF9C8, 0x8B9F}, //13449 #CJK UNIFIED IDEOGRAPH + {0xF9C9, 0x9483}, //13450 #CJK UNIFIED IDEOGRAPH + {0xF9CA, 0x9C79}, //13451 #CJK UNIFIED IDEOGRAPH + {0xF9CB, 0x9EB7}, //13452 #CJK UNIFIED IDEOGRAPH + {0xF9CC, 0x7675}, //13453 #CJK UNIFIED IDEOGRAPH + {0xF9CD, 0x9A6B}, //13454 #CJK UNIFIED IDEOGRAPH + {0xF9CE, 0x9C7A}, //13455 #CJK UNIFIED IDEOGRAPH + {0xF9CF, 0x9E1D}, //13456 #CJK UNIFIED IDEOGRAPH + {0xF9D0, 0x7069}, //13457 #CJK UNIFIED IDEOGRAPH + {0xF9D1, 0x706A}, //13458 #CJK UNIFIED IDEOGRAPH + {0xF9D2, 0x9EA4}, //13459 #CJK UNIFIED IDEOGRAPH + {0xF9D3, 0x9F7E}, //13460 #CJK UNIFIED IDEOGRAPH + {0xF9D4, 0x9F49}, //13461 #CJK UNIFIED IDEOGRAPH + {0xF9D5, 0x9F98}, //13462 #CJK UNIFIED IDEOGRAPH + {0xF9D6, 0x7881}, //13463 #CJK UNIFIED IDEOGRAPH + {0xF9D7, 0x92B9}, //13464 #CJK UNIFIED IDEOGRAPH + {0xF9D8, 0x88CF}, //13465 #CJK UNIFIED IDEOGRAPH + {0xF9D9, 0x58BB}, //13466 #CJK UNIFIED IDEOGRAPH + {0xF9DA, 0x6052}, //13467 #CJK UNIFIED IDEOGRAPH + {0xF9DB, 0x7CA7}, //13468 #CJK UNIFIED IDEOGRAPH + {0xF9DC, 0x5AFA}, //13469 #CJK UNIFIED IDEOGRAPH + {0xF9DD, 0x2554}, //13470 #BOX DRAWINGS DOUBLE DOWN AND RIGHT + {0xF9DE, 0x2566}, //13471 #BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + {0xF9DF, 0x2557}, //13472 #BOX DRAWINGS DOUBLE DOWN AND LEFT + {0xF9E0, 0x2560}, //13473 #BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + {0xF9E1, 0x256C}, //13474 #BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + {0xF9E2, 0x2563}, //13475 #BOX DRAWINGS DOUBLE VERTICAL AND LEFT + {0xF9E3, 0x255A}, //13476 #BOX DRAWINGS DOUBLE UP AND RIGHT + {0xF9E4, 0x2569}, //13477 #BOX DRAWINGS DOUBLE UP AND HORIZONTAL + {0xF9E5, 0x255D}, //13478 #BOX DRAWINGS DOUBLE UP AND LEFT + {0xF9E6, 0x2552}, //13479 #BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE + {0xF9E7, 0x2564}, //13480 #BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE + {0xF9E8, 0x2555}, //13481 #BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE + {0xF9E9, 0x255E}, //13482 #BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE + {0xF9EA, 0x256A}, //13483 #BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE + {0xF9EB, 0x2561}, //13484 #BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE + {0xF9EC, 0x2558}, //13485 #BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE + {0xF9ED, 0x2567}, //13486 #BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE + {0xF9EE, 0x255B}, //13487 #BOX DRAWINGS UP SINGLE AND LEFT DOUBLE + {0xF9EF, 0x2553}, //13488 #BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE + {0xF9F0, 0x2565}, //13489 #BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE + {0xF9F1, 0x2556}, //13490 #BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE + {0xF9F2, 0x255F}, //13491 #BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE + {0xF9F3, 0x256B}, //13492 #BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE + {0xF9F4, 0x2562}, //13493 #BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE + {0xF9F5, 0x2559}, //13494 #BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE + {0xF9F6, 0x2568}, //13495 #BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE + {0xF9F7, 0x255C}, //13496 #BOX DRAWINGS UP DOUBLE AND LEFT SINGLE + {0xF9F8, 0x2551}, //13497 #BOX DRAWINGS DOUBLE VERTICAL + {0xF9F9, 0x2550}, //13498 #BOX DRAWINGS DOUBLE HORIZONTAL + {0xF9FA, 0x256D}, //13499 #BOX DRAWINGS LIGHT ARC DOWN AND RIGHT + {0xF9FB, 0x256E}, //13500 #BOX DRAWINGS LIGHT ARC DOWN AND LEFT + {0xF9FC, 0x2570}, //13501 #BOX DRAWINGS LIGHT ARC UP AND RIGHT + {0xF9FD, 0x256F}, //13502 #BOX DRAWINGS LIGHT ARC UP AND LEFT + {0xF9FE, 0x2593}, //13503 #DARK SHADE +}; + +#endif // DRW_CPTABLE950_H diff --git a/extlib/libdxfrw/intern/drw_cptables.h b/extlib/libdxfrw/intern/drw_cptables.h new file mode 100644 index 0000000..2f7d758 --- /dev/null +++ b/extlib/libdxfrw/intern/drw_cptables.h @@ -0,0 +1,1330 @@ +#ifndef DRW_CPTABLES_H +#define DRW_CPTABLES_H + +//first entry in all tables are 0x80 +#define CPOFFSET 0x80 +#define CPLENGHTCOMMON 128 + +//Table 874 +static const int DRW_Table874[] = { + 0x20AC, //1 #EURO SIGN + 0x00 , //2 #UNDEFINED + 0x00 , //3 #UNDEFINED + 0x00 , //4 #UNDEFINED + 0x00 , //5 #UNDEFINED + 0x2026, //6 #HORIZONTAL ELLIPSIS + 0x00 , //7 #UNDEFINED + 0x00 , //8 #UNDEFINED + 0x00 , //9 #UNDEFINED + 0x00 , //10 #UNDEFINED + 0x00 , //11 #UNDEFINED + 0x00 , //12 #UNDEFINED + 0x00 , //13 #UNDEFINED + 0x00 , //14 #UNDEFINED + 0x00 , //15 #UNDEFINED + 0x00 , //16 #UNDEFINED + 0x00 , //17 #UNDEFINED + 0x2018, //18 #LEFT SINGLE QUOTATION MARK + 0x2019, //19 #RIGHT SINGLE QUOTATION MARK + 0x201C, //20 #LEFT DOUBLE QUOTATION MARK + 0x201D, //21 #RIGHT DOUBLE QUOTATION MARK + 0x2022, //22 #BULLET + 0x2013, //23 #EN DASH + 0x2014, //24 #EM DASH + 0x00 , //25 #UNDEFINED + 0x00 , //26 #UNDEFINED + 0x00 , //27 #UNDEFINED + 0x00 , //28 #UNDEFINED + 0x00 , //29 #UNDEFINED + 0x00 , //30 #UNDEFINED + 0x00 , //31 #UNDEFINED + 0x00 , //32 #UNDEFINED + 0x00A0, //33 #NO-BREAK SPACE + 0x0E01, //34 #THAI CHARACTER KO KAI + 0x0E02, //35 #THAI CHARACTER KHO KHAI + 0x0E03, //36 #THAI CHARACTER KHO KHUAT + 0x0E04, //37 #THAI CHARACTER KHO KHWAI + 0x0E05, //38 #THAI CHARACTER KHO KHON + 0x0E06, //39 #THAI CHARACTER KHO RAKHANG + 0x0E07, //40 #THAI CHARACTER NGO NGU + 0x0E08, //41 #THAI CHARACTER CHO CHAN + 0x0E09, //42 #THAI CHARACTER CHO CHING + 0x0E0A, //43 #THAI CHARACTER CHO CHANG + 0x0E0B, //44 #THAI CHARACTER SO SO + 0x0E0C, //45 #THAI CHARACTER CHO CHOE + 0x0E0D, //46 #THAI CHARACTER YO YING + 0x0E0E, //47 #THAI CHARACTER DO CHADA + 0x0E0F, //48 #THAI CHARACTER TO PATAK + 0x0E10, //49 #THAI CHARACTER THO THAN + 0x0E11, //50 #THAI CHARACTER THO NANGMONTHO + 0x0E12, //51 #THAI CHARACTER THO PHUTHAO + 0x0E13, //52 #THAI CHARACTER NO NEN + 0x0E14, //53 #THAI CHARACTER DO DEK + 0x0E15, //54 #THAI CHARACTER TO TAO + 0x0E16, //55 #THAI CHARACTER THO THUNG + 0x0E17, //56 #THAI CHARACTER THO THAHAN + 0x0E18, //57 #THAI CHARACTER THO THONG + 0x0E19, //58 #THAI CHARACTER NO NU + 0x0E1A, //59 #THAI CHARACTER BO BAIMAI + 0x0E1B, //60 #THAI CHARACTER PO PLA + 0x0E1C, //61 #THAI CHARACTER PHO PHUNG + 0x0E1D, //62 #THAI CHARACTER FO FA + 0x0E1E, //63 #THAI CHARACTER PHO PHAN + 0x0E1F, //64 #THAI CHARACTER FO FAN + 0x0E20, //65 #THAI CHARACTER PHO SAMPHAO + 0x0E21, //66 #THAI CHARACTER MO MA + 0x0E22, //67 #THAI CHARACTER YO YAK + 0x0E23, //68 #THAI CHARACTER RO RUA + 0x0E24, //69 #THAI CHARACTER RU + 0x0E25, //70 #THAI CHARACTER LO LING + 0x0E26, //71 #THAI CHARACTER LU + 0x0E27, //72 #THAI CHARACTER WO WAEN + 0x0E28, //73 #THAI CHARACTER SO SALA + 0x0E29, //74 #THAI CHARACTER SO RUSI + 0x0E2A, //75 #THAI CHARACTER SO SUA + 0x0E2B, //76 #THAI CHARACTER HO HIP + 0x0E2C, //77 #THAI CHARACTER LO CHULA + 0x0E2D, //78 #THAI CHARACTER O ANG + 0x0E2E, //79 #THAI CHARACTER HO NOKHUK + 0x0E2F, //80 #THAI CHARACTER PAIYANNOI + 0x0E30, //81 #THAI CHARACTER SARA A + 0x0E31, //82 #THAI CHARACTER MAI HAN-AKAT + 0x0E32, //83 #THAI CHARACTER SARA AA + 0x0E33, //84 #THAI CHARACTER SARA AM + 0x0E34, //85 #THAI CHARACTER SARA I + 0x0E35, //86 #THAI CHARACTER SARA II + 0x0E36, //87 #THAI CHARACTER SARA UE + 0x0E37, //88 #THAI CHARACTER SARA UEE + 0x0E38, //89 #THAI CHARACTER SARA U + 0x0E39, //90 #THAI CHARACTER SARA UU + 0x0E3A, //91 #THAI CHARACTER PHINTHU + 0x00 , //92 #UNDEFINED + 0x00 , //93 #UNDEFINED + 0x00 , //94 #UNDEFINED + 0x00 , //95 #UNDEFINED + 0x0E3F, //96 #THAI CURRENCY SYMBOL BAHT + 0x0E40, //97 #THAI CHARACTER SARA E + 0x0E41, //98 #THAI CHARACTER SARA AE + 0x0E42, //99 #THAI CHARACTER SARA O + 0x0E43, //100 #THAI CHARACTER SARA AI MAIMUAN + 0x0E44, //101 #THAI CHARACTER SARA AI MAIMALAI + 0x0E45, //102 #THAI CHARACTER LAKKHANGYAO + 0x0E46, //103 #THAI CHARACTER MAIYAMOK + 0x0E47, //104 #THAI CHARACTER MAITAIKHU + 0x0E48, //105 #THAI CHARACTER MAI EK + 0x0E49, //106 #THAI CHARACTER MAI THO + 0x0E4A, //107 #THAI CHARACTER MAI TRI + 0x0E4B, //108 #THAI CHARACTER MAI CHATTAWA + 0x0E4C, //109 #THAI CHARACTER THANTHAKHAT + 0x0E4D, //110 #THAI CHARACTER NIKHAHIT + 0x0E4E, //111 #THAI CHARACTER YAMAKKAN + 0x0E4F, //112 #THAI CHARACTER FONGMAN + 0x0E50, //113 #THAI DIGIT ZERO + 0x0E51, //114 #THAI DIGIT ONE + 0x0E52, //115 #THAI DIGIT TWO + 0x0E53, //116 #THAI DIGIT THREE + 0x0E54, //117 #THAI DIGIT FOUR + 0x0E55, //118 #THAI DIGIT FIVE + 0x0E56, //119 #THAI DIGIT SIX + 0x0E57, //120 #THAI DIGIT SEVEN + 0x0E58, //121 #THAI DIGIT EIGHT + 0x0E59, //122 #THAI DIGIT NINE + 0x0E5A, //123 #THAI CHARACTER ANGKHANKHU + 0x0E5B, //124 #THAI CHARACTER KHOMUT + 0x00 , //125 #UNDEFINED + 0x00 , //126 #UNDEFINED + 0x00 , //127 #UNDEFINED + 0x00 //128 #UNDEFINED +}; + +//Table 1250 +static const int DRW_Table1250[] = { +0x20AC, //1 #EURO SIGN +0x00, //2 #UNDEFINED +0x201A, //3 #SINGLE LOW-9 QUOTATION MARK +0x00, //4 #UNDEFINED +0x201E, //5 #DOUBLE LOW-9 QUOTATION MARK +0x2026, //6 #HORIZONTAL ELLIPSIS +0x2020, //7 #DAGGER +0x2021, //8 #DOUBLE DAGGER +0x00, //9 #UNDEFINED +0x2030, //10 #PER MILLE SIGN +0x0160, //11 #LATIN CAPITAL LETTER S WITH CARON +0x2039, //12 #SINGLE LEFT-POINTING ANGLE QUOTATION MARK +0x015A, //13 #LATIN CAPITAL LETTER S WITH ACUTE +0x0164, //14 #LATIN CAPITAL LETTER T WITH CARON +0x017D, //15 #LATIN CAPITAL LETTER Z WITH CARON +0x0179, //16 #LATIN CAPITAL LETTER Z WITH ACUTE +0x00, //17 #UNDEFINED +0x2018, //18 #LEFT SINGLE QUOTATION MARK +0x2019, //19 #RIGHT SINGLE QUOTATION MARK +0x201C, //20 #LEFT DOUBLE QUOTATION MARK +0x201D, //21 #RIGHT DOUBLE QUOTATION MARK +0x2022, //22 #BULLET +0x2013, //23 #EN DASH +0x2014, //24 #EM DASH +0x00, //25 #UNDEFINED +0x2122, //26 #TRADE MARK SIGN +0x0161, //27 #LATIN SMALL LETTER S WITH CARON +0x203A, //28 #SINGLE RIGHT-POINTING ANGLE QUOTATION MARK +0x015B, //29 #LATIN SMALL LETTER S WITH ACUTE +0x0165, //30 #LATIN SMALL LETTER T WITH CARON +0x017E, //31 #LATIN SMALL LETTER Z WITH CARON +0x017A, //32 #LATIN SMALL LETTER Z WITH ACUTE +0x00A0, //33 #NO-BREAK SPACE +0x02C7, //34 #CARON +0x02D8, //35 #BREVE +0x0141, //36 #LATIN CAPITAL LETTER L WITH STROKE +0x00A4, //37 #CURRENCY SIGN +0x0104, //38 #LATIN CAPITAL LETTER A WITH OGONEK +0x00A6, //39 #BROKEN BAR +0x00A7, //40 #SECTION SIGN +0x00A8, //41 #DIAERESIS +0x00A9, //42 #COPYRIGHT SIGN +0x015E, //43 #LATIN CAPITAL LETTER S WITH CEDILLA +0x00AB, //44 #LEFT-POINTING DOUBLE ANGLE QUOTATION MARK +0x00AC, //45 #NOT SIGN +0x00AD, //46 #SOFT HYPHEN +0x00AE, //47 #REGISTERED SIGN +0x017B, //48 #LATIN CAPITAL LETTER Z WITH DOT ABOVE +0x00B0, //49 #DEGREE SIGN +0x00B1, //50 #PLUS-MINUS SIGN +0x02DB, //51 #OGONEK +0x0142, //52 #LATIN SMALL LETTER L WITH STROKE +0x00B4, //53 #ACUTE ACCENT +0x00B5, //54 #MICRO SIGN +0x00B6, //55 #PILCROW SIGN +0x00B7, //56 #MIDDLE DOT +0x00B8, //57 #CEDILLA +0x0105, //58 #LATIN SMALL LETTER A WITH OGONEK +0x015F, //59 #LATIN SMALL LETTER S WITH CEDILLA +0x00BB, //60 #RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK +0x013D, //61 #LATIN CAPITAL LETTER L WITH CARON +0x02DD, //62 #DOUBLE ACUTE ACCENT +0x013E, //63 #LATIN SMALL LETTER L WITH CARON +0x017C, //64 #LATIN SMALL LETTER Z WITH DOT ABOVE +0x0154, //65 #LATIN CAPITAL LETTER R WITH ACUTE +0x00C1, //66 #LATIN CAPITAL LETTER A WITH ACUTE +0x00C2, //67 #LATIN CAPITAL LETTER A WITH CIRCUMFLEX +0x0102, //68 #LATIN CAPITAL LETTER A WITH BREVE +0x00C4, //69 #LATIN CAPITAL LETTER A WITH DIAERESIS +0x0139, //70 #LATIN CAPITAL LETTER L WITH ACUTE +0x0106, //71 #LATIN CAPITAL LETTER C WITH ACUTE +0x00C7, //72 #LATIN CAPITAL LETTER C WITH CEDILLA +0x010C, //73 #LATIN CAPITAL LETTER C WITH CARON +0x00C9, //74 #LATIN CAPITAL LETTER E WITH ACUTE +0x0118, //75 #LATIN CAPITAL LETTER E WITH OGONEK +0x00CB, //76 #LATIN CAPITAL LETTER E WITH DIAERESIS +0x011A, //77 #LATIN CAPITAL LETTER E WITH CARON +0x00CD, //78 #LATIN CAPITAL LETTER I WITH ACUTE +0x00CE, //79 #LATIN CAPITAL LETTER I WITH CIRCUMFLEX +0x010E, //80 #LATIN CAPITAL LETTER D WITH CARON +0x0110, //81 #LATIN CAPITAL LETTER D WITH STROKE +0x0143, //82 #LATIN CAPITAL LETTER N WITH ACUTE +0x0147, //83 #LATIN CAPITAL LETTER N WITH CARON +0x00D3, //84 #LATIN CAPITAL LETTER O WITH ACUTE +0x00D4, //85 #LATIN CAPITAL LETTER O WITH CIRCUMFLEX +0x0150, //86 #LATIN CAPITAL LETTER O WITH DOUBLE ACUTE +0x00D6, //87 #LATIN CAPITAL LETTER O WITH DIAERESIS +0x00D7, //88 #MULTIPLICATION SIGN +0x0158, //89 #LATIN CAPITAL LETTER R WITH CARON +0x016E, //90 #LATIN CAPITAL LETTER U WITH RING ABOVE +0x00DA, //91 #LATIN CAPITAL LETTER U WITH ACUTE +0x0170, //92 #LATIN CAPITAL LETTER U WITH DOUBLE ACUTE +0x00DC, //93 #LATIN CAPITAL LETTER U WITH DIAERESIS +0x00DD, //94 #LATIN CAPITAL LETTER Y WITH ACUTE +0x0162, //95 #LATIN CAPITAL LETTER T WITH CEDILLA +0x00DF, //96 #LATIN SMALL LETTER SHARP S +0x0155, //97 #LATIN SMALL LETTER R WITH ACUTE +0x00E1, //98 #LATIN SMALL LETTER A WITH ACUTE +0x00E2, //99 #LATIN SMALL LETTER A WITH CIRCUMFLEX +0x0103, //100 #LATIN SMALL LETTER A WITH BREVE +0x00E4, //101 #LATIN SMALL LETTER A WITH DIAERESIS +0x013A, //102 #LATIN SMALL LETTER L WITH ACUTE +0x0107, //103 #LATIN SMALL LETTER C WITH ACUTE +0x00E7, //104 #LATIN SMALL LETTER C WITH CEDILLA +0x010D, //105 #LATIN SMALL LETTER C WITH CARON +0x00E9, //106 #LATIN SMALL LETTER E WITH ACUTE +0x0119, //107 #LATIN SMALL LETTER E WITH OGONEK +0x00EB, //108 #LATIN SMALL LETTER E WITH DIAERESIS +0x011B, //109 #LATIN SMALL LETTER E WITH CARON +0x00ED, //110 #LATIN SMALL LETTER I WITH ACUTE +0x00EE, //111 #LATIN SMALL LETTER I WITH CIRCUMFLEX +0x010F, //112 #LATIN SMALL LETTER D WITH CARON +0x0111, //113 #LATIN SMALL LETTER D WITH STROKE +0x0144, //114 #LATIN SMALL LETTER N WITH ACUTE +0x0148, //115 #LATIN SMALL LETTER N WITH CARON +0x00F3, //116 #LATIN SMALL LETTER O WITH ACUTE +0x00F4, //117 #LATIN SMALL LETTER O WITH CIRCUMFLEX +0x0151, //118 #LATIN SMALL LETTER O WITH DOUBLE ACUTE +0x00F6, //119 #LATIN SMALL LETTER O WITH DIAERESIS +0x00F7, //120 #DIVISION SIGN +0x0159, //121 #LATIN SMALL LETTER R WITH CARON +0x016F, //122 #LATIN SMALL LETTER U WITH RING ABOVE +0x00FA, //123 #LATIN SMALL LETTER U WITH ACUTE +0x0171, //124 #LATIN SMALL LETTER U WITH DOUBLE ACUTE +0x00FC, //125 #LATIN SMALL LETTER U WITH DIAERESIS +0x00FD, //126 #LATIN SMALL LETTER Y WITH ACUTE +0x0163, //127 #LATIN SMALL LETTER T WITH CEDILLA +0x02D9 //128 #DOT ABOVE +}; + + +//Table 1251 +static const int DRW_Table1251[] = { + 0x0402, //1 #CYRILLIC CAPITAL LETTER DJE + 0x0403, //2 #CYRILLIC CAPITAL LETTER GJE + 0x201A, //3 #SINGLE LOW-9 QUOTATION MARK + 0x0453, //4 #CYRILLIC SMALL LETTER GJE + 0x201E, //5 #DOUBLE LOW-9 QUOTATION MARK + 0x2026, //6 #HORIZONTAL ELLIPSIS + 0x2020, //7 #DAGGER + 0x2021, //8 #DOUBLE DAGGER + 0x20AC, //9 #EURO SIGN + 0x2030, //10 #PER MILLE SIGN + 0x0409, //11 #CYRILLIC CAPITAL LETTER LJE + 0x2039, //12 #SINGLE LEFT-POINTING ANGLE QUOTATION MARK + 0x040A, //13 #CYRILLIC CAPITAL LETTER NJE + 0x040C, //14 #CYRILLIC CAPITAL LETTER KJE + 0x040B, //15 #CYRILLIC CAPITAL LETTER TSHE + 0x040F, //16 #CYRILLIC CAPITAL LETTER DZHE + 0x0452, //17 #CYRILLIC SMALL LETTER DJE + 0x2018, //18 #LEFT SINGLE QUOTATION MARK + 0x2019, //19 #RIGHT SINGLE QUOTATION MARK + 0x201C, //20 #LEFT DOUBLE QUOTATION MARK + 0x201D, //21 #RIGHT DOUBLE QUOTATION MARK + 0x2022, //22 #BULLET + 0x2013, //23 #EN DASH + 0x2014, //24 #EM DASH + 0x00, //25 #UNDEFINED + 0x2122, //26 #TRADE MARK SIGN + 0x0459, //27 #CYRILLIC SMALL LETTER LJE + 0x203A, //28 #SINGLE RIGHT-POINTING ANGLE QUOTATION MARK + 0x045A, //29 #CYRILLIC SMALL LETTER NJE + 0x045C, //30 #CYRILLIC SMALL LETTER KJE + 0x045B, //31 #CYRILLIC SMALL LETTER TSHE + 0x045F, //32 #CYRILLIC SMALL LETTER DZHE + 0x00A0, //33 #NO-BREAK SPACE + 0x040E, //34 #CYRILLIC CAPITAL LETTER SHORT U + 0x045E, //35 #CYRILLIC SMALL LETTER SHORT U + 0x0408, //36 #CYRILLIC CAPITAL LETTER JE + 0x00A4, //37 #CURRENCY SIGN + 0x0490, //38 #CYRILLIC CAPITAL LETTER GHE WITH UPTURN + 0x00A6, //39 #BROKEN BAR + 0x00A7, //40 #SECTION SIGN + 0x0401, //41 #CYRILLIC CAPITAL LETTER IO + 0x00A9, //42 #COPYRIGHT SIGN + 0x0404, //43 #CYRILLIC CAPITAL LETTER UKRAINIAN IE + 0x00AB, //44 #LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00AC, //45 #NOT SIGN + 0x00AD, //46 #SOFT HYPHEN + 0x00AE, //47 #REGISTERED SIGN + 0x0407, //48 #CYRILLIC CAPITAL LETTER YI + 0x00B0, //49 #DEGREE SIGN + 0x00B1, //50 #PLUS-MINUS SIGN + 0x0406, //51 #CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I + 0x0456, //52 #CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I + 0x0491, //53 #CYRILLIC SMALL LETTER GHE WITH UPTURN + 0x00B5, //54 #MICRO SIGN + 0x00B6, //55 #PILCROW SIGN + 0x00B7, //56 #MIDDLE DOT + 0x0451, //57 #CYRILLIC SMALL LETTER IO + 0x2116, //58 #NUMERO SIGN + 0x0454, //59 #CYRILLIC SMALL LETTER UKRAINIAN IE + 0x00BB, //60 #RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x0458, //61 #CYRILLIC SMALL LETTER JE + 0x0405, //62 #CYRILLIC CAPITAL LETTER DZE + 0x0455, //63 #CYRILLIC SMALL LETTER DZE + 0x0457, //64 #CYRILLIC SMALL LETTER YI + 0x0410, //65 #CYRILLIC CAPITAL LETTER A + 0x0411, //66 #CYRILLIC CAPITAL LETTER BE + 0x0412, //67 #CYRILLIC CAPITAL LETTER VE + 0x0413, //68 #CYRILLIC CAPITAL LETTER GHE + 0x0414, //69 #CYRILLIC CAPITAL LETTER DE + 0x0415, //70 #CYRILLIC CAPITAL LETTER IE + 0x0416, //71 #CYRILLIC CAPITAL LETTER ZHE + 0x0417, //72 #CYRILLIC CAPITAL LETTER ZE + 0x0418, //73 #CYRILLIC CAPITAL LETTER I + 0x0419, //74 #CYRILLIC CAPITAL LETTER SHORT I + 0x041A, //75 #CYRILLIC CAPITAL LETTER KA + 0x041B, //76 #CYRILLIC CAPITAL LETTER EL + 0x041C, //77 #CYRILLIC CAPITAL LETTER EM + 0x041D, //78 #CYRILLIC CAPITAL LETTER EN + 0x041E, //79 #CYRILLIC CAPITAL LETTER O + 0x041F, //80 #CYRILLIC CAPITAL LETTER PE + 0x0420, //81 #CYRILLIC CAPITAL LETTER ER + 0x0421, //82 #CYRILLIC CAPITAL LETTER ES + 0x0422, //83 #CYRILLIC CAPITAL LETTER TE + 0x0423, //84 #CYRILLIC CAPITAL LETTER U + 0x0424, //85 #CYRILLIC CAPITAL LETTER EF + 0x0425, //86 #CYRILLIC CAPITAL LETTER HA + 0x0426, //87 #CYRILLIC CAPITAL LETTER TSE + 0x0427, //88 #CYRILLIC CAPITAL LETTER CHE + 0x0428, //89 #CYRILLIC CAPITAL LETTER SHA + 0x0429, //90 #CYRILLIC CAPITAL LETTER SHCHA + 0x042A, //91 #CYRILLIC CAPITAL LETTER HARD SIGN + 0x042B, //92 #CYRILLIC CAPITAL LETTER YERU + 0x042C, //93 #CYRILLIC CAPITAL LETTER SOFT SIGN + 0x042D, //94 #CYRILLIC CAPITAL LETTER E + 0x042E, //95 #CYRILLIC CAPITAL LETTER YU + 0x042F, //96 #CYRILLIC CAPITAL LETTER YA + 0x0430, //97 #CYRILLIC SMALL LETTER A + 0x0431, //98 #CYRILLIC SMALL LETTER BE + 0x0432, //99 #CYRILLIC SMALL LETTER VE + 0x0433, //100 #CYRILLIC SMALL LETTER GHE + 0x0434, //101 #CYRILLIC SMALL LETTER DE + 0x0435, //102 #CYRILLIC SMALL LETTER IE + 0x0436, //103 #CYRILLIC SMALL LETTER ZHE + 0x0437, //104 #CYRILLIC SMALL LETTER ZE + 0x0438, //105 #CYRILLIC SMALL LETTER I + 0x0439, //106 #CYRILLIC SMALL LETTER SHORT I + 0x043A, //107 #CYRILLIC SMALL LETTER KA + 0x043B, //108 #CYRILLIC SMALL LETTER EL + 0x043C, //109 #CYRILLIC SMALL LETTER EM + 0x043D, //110 #CYRILLIC SMALL LETTER EN + 0x043E, //111 #CYRILLIC SMALL LETTER O + 0x043F, //112 #CYRILLIC SMALL LETTER PE + 0x0440, //113 #CYRILLIC SMALL LETTER ER + 0x0441, //114 #CYRILLIC SMALL LETTER ES + 0x0442, //115 #CYRILLIC SMALL LETTER TE + 0x0443, //116 #CYRILLIC SMALL LETTER U + 0x0444, //117 #CYRILLIC SMALL LETTER EF + 0x0445, //118 #CYRILLIC SMALL LETTER HA + 0x0446, //119 #CYRILLIC SMALL LETTER TSE + 0x0447, //120 #CYRILLIC SMALL LETTER CHE + 0x0448, //121 #CYRILLIC SMALL LETTER SHA + 0x0449, //122 #CYRILLIC SMALL LETTER SHCHA + 0x044A, //123 #CYRILLIC SMALL LETTER HARD SIGN + 0x044B, //124 #CYRILLIC SMALL LETTER YERU + 0x044C, //125 #CYRILLIC SMALL LETTER SOFT SIGN + 0x044D, //126 #CYRILLIC SMALL LETTER E + 0x044E, //127 #CYRILLIC SMALL LETTER YU + 0x044F //128 #CYRILLIC SMALL LETTER YA +}; + + +//Table 1252 +static const int DRW_Table1252[] = { + 0x20AC, //1 #EURO SIGN + 0x00, //2 #UNDEFINED + 0x201A, //3 #SINGLE LOW-9 QUOTATION MARK + 0x0192, //4 #LATIN SMALL LETTER F WITH HOOK + 0x201E, //5 #DOUBLE LOW-9 QUOTATION MARK + 0x2026, //6 #HORIZONTAL ELLIPSIS + 0x2020, //7 #DAGGER + 0x2021, //8 #DOUBLE DAGGER + 0x02C6, //9 #MODIFIER LETTER CIRCUMFLEX ACCENT + 0x2030, //10 #PER MILLE SIGN + 0x0160, //11 #LATIN CAPITAL LETTER S WITH CARON + 0x2039, //12 #SINGLE LEFT-POINTING ANGLE QUOTATION MARK + 0x0152, //13 #LATIN CAPITAL LIGATURE OE + 0x00, //14 #UNDEFINED + 0x017D, //15 #LATIN CAPITAL LETTER Z WITH CARON + 0x00, //16 #UNDEFINED + 0x00, //17 #UNDEFINED + 0x2018, //18 #LEFT SINGLE QUOTATION MARK + 0x2019, //19 #RIGHT SINGLE QUOTATION MARK + 0x201C, //20 #LEFT DOUBLE QUOTATION MARK + 0x201D, //21 #RIGHT DOUBLE QUOTATION MARK + 0x2022, //22 #BULLET + 0x2013, //23 #EN DASH + 0x2014, //24 #EM DASH + 0x02DC, //25 #SMALL TILDE + 0x2122, //26 #TRADE MARK SIGN + 0x0161, //27 #LATIN SMALL LETTER S WITH CARON + 0x203A, //28 #SINGLE RIGHT-POINTING ANGLE QUOTATION MARK + 0x0153, //29 #LATIN SMALL LIGATURE OE + 0x00, //30 #UNDEFINED + 0x017E, //31 #LATIN SMALL LETTER Z WITH CARON + 0x0178, //32 #LATIN CAPITAL LETTER Y WITH DIAERESIS + 0x00A0, //33 #NO-BREAK SPACE + 0x00A1, //34 #INVERTED EXCLAMATION MARK + 0x00A2, //35 #CENT SIGN + 0x00A3, //36 #POUND SIGN + 0x00A4, //37 #CURRENCY SIGN + 0x00A5, //38 #YEN SIGN + 0x00A6, //39 #BROKEN BAR + 0x00A7, //40 #SECTION SIGN + 0x00A8, //41 #DIAERESIS + 0x00A9, //42 #COPYRIGHT SIGN + 0x00AA, //43 #FEMININE ORDINAL INDICATOR + 0x00AB, //44 #LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00AC, //45 #NOT SIGN + 0x00AD, //46 #SOFT HYPHEN + 0x00AE, //47 #REGISTERED SIGN + 0x00AF, //48 #MACRON + 0x00B0, //49 #DEGREE SIGN + 0x00B1, //50 #PLUS-MINUS SIGN + 0x00B2, //51 #SUPERSCRIPT TWO + 0x00B3, //52 #SUPERSCRIPT THREE + 0x00B4, //53 #ACUTE ACCENT + 0x00B5, //54 #MICRO SIGN + 0x00B6, //55 #PILCROW SIGN + 0x00B7, //56 #MIDDLE DOT + 0x00B8, //57 #CEDILLA + 0x00B9, //58 #SUPERSCRIPT ONE + 0x00BA, //59 #MASCULINE ORDINAL INDICATOR + 0x00BB, //60 #RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00BC, //61 #VULGAR FRACTION ONE QUARTER + 0x00BD, //62 #VULGAR FRACTION ONE HALF + 0x00BE, //63 #VULGAR FRACTION THREE QUARTERS + 0x00BF, //64 #INVERTED QUESTION MARK + 0x00C0, //65 #LATIN CAPITAL LETTER A WITH GRAVE + 0x00C1, //66 #LATIN CAPITAL LETTER A WITH ACUTE + 0x00C2, //67 #LATIN CAPITAL LETTER A WITH CIRCUMFLEX + 0x00C3, //68 #LATIN CAPITAL LETTER A WITH TILDE + 0x00C4, //69 #LATIN CAPITAL LETTER A WITH DIAERESIS + 0x00C5, //70 #LATIN CAPITAL LETTER A WITH RING ABOVE + 0x00C6, //71 #LATIN CAPITAL LETTER AE + 0x00C7, //72 #LATIN CAPITAL LETTER C WITH CEDILLA + 0x00C8, //73 #LATIN CAPITAL LETTER E WITH GRAVE + 0x00C9, //74 #LATIN CAPITAL LETTER E WITH ACUTE + 0x00CA, //75 #LATIN CAPITAL LETTER E WITH CIRCUMFLEX + 0x00CB, //76 #LATIN CAPITAL LETTER E WITH DIAERESIS + 0x00CC, //77 #LATIN CAPITAL LETTER I WITH GRAVE + 0x00CD, //78 #LATIN CAPITAL LETTER I WITH ACUTE + 0x00CE, //79 #LATIN CAPITAL LETTER I WITH CIRCUMFLEX + 0x00CF, //80 #LATIN CAPITAL LETTER I WITH DIAERESIS + 0x00D0, //81 #LATIN CAPITAL LETTER ETH + 0x00D1, //82 #LATIN CAPITAL LETTER N WITH TILDE + 0x00D2, //83 #LATIN CAPITAL LETTER O WITH GRAVE + 0x00D3, //84 #LATIN CAPITAL LETTER O WITH ACUTE + 0x00D4, //85 #LATIN CAPITAL LETTER O WITH CIRCUMFLEX + 0x00D5, //86 #LATIN CAPITAL LETTER O WITH TILDE + 0x00D6, //87 #LATIN CAPITAL LETTER O WITH DIAERESIS + 0x00D7, //88 #MULTIPLICATION SIGN + 0x00D8, //89 #LATIN CAPITAL LETTER O WITH STROKE + 0x00D9, //90 #LATIN CAPITAL LETTER U WITH GRAVE + 0x00DA, //91 #LATIN CAPITAL LETTER U WITH ACUTE + 0x00DB, //92 #LATIN CAPITAL LETTER U WITH CIRCUMFLEX + 0x00DC, //93 #LATIN CAPITAL LETTER U WITH DIAERESIS + 0x00DD, //94 #LATIN CAPITAL LETTER Y WITH ACUTE + 0x00DE, //95 #LATIN CAPITAL LETTER THORN + 0x00DF, //96 #LATIN SMALL LETTER SHARP S + 0x00E0, //97 #LATIN SMALL LETTER A WITH GRAVE + 0x00E1, //98 #LATIN SMALL LETTER A WITH ACUTE + 0x00E2, //99 #LATIN SMALL LETTER A WITH CIRCUMFLEX + 0x00E3, //100 #LATIN SMALL LETTER A WITH TILDE + 0x00E4, //101 #LATIN SMALL LETTER A WITH DIAERESIS + 0x00E5, //102 #LATIN SMALL LETTER A WITH RING ABOVE + 0x00E6, //103 #LATIN SMALL LETTER AE + 0x00E7, //104 #LATIN SMALL LETTER C WITH CEDILLA + 0x00E8, //105 #LATIN SMALL LETTER E WITH GRAVE + 0x00E9, //106 #LATIN SMALL LETTER E WITH ACUTE + 0x00EA, //107 #LATIN SMALL LETTER E WITH CIRCUMFLEX + 0x00EB, //108 #LATIN SMALL LETTER E WITH DIAERESIS + 0x00EC, //109 #LATIN SMALL LETTER I WITH GRAVE + 0x00ED, //110 #LATIN SMALL LETTER I WITH ACUTE + 0x00EE, //111 #LATIN SMALL LETTER I WITH CIRCUMFLEX + 0x00EF, //112 #LATIN SMALL LETTER I WITH DIAERESIS + 0x00F0, //113 #LATIN SMALL LETTER ETH + 0x00F1, //114 #LATIN SMALL LETTER N WITH TILDE + 0x00F2, //115 #LATIN SMALL LETTER O WITH GRAVE + 0x00F3, //116 #LATIN SMALL LETTER O WITH ACUTE + 0x00F4, //117 #LATIN SMALL LETTER O WITH CIRCUMFLEX + 0x00F5, //118 #LATIN SMALL LETTER O WITH TILDE + 0x00F6, //119 #LATIN SMALL LETTER O WITH DIAERESIS + 0x00F7, //120 #DIVISION SIGN + 0x00F8, //121 #LATIN SMALL LETTER O WITH STROKE + 0x00F9, //122 #LATIN SMALL LETTER U WITH GRAVE + 0x00FA, //123 #LATIN SMALL LETTER U WITH ACUTE + 0x00FB, //124 #LATIN SMALL LETTER U WITH CIRCUMFLEX + 0x00FC, //125 #LATIN SMALL LETTER U WITH DIAERESIS + 0x00FD, //126 #LATIN SMALL LETTER Y WITH ACUTE + 0x00FE, //127 #LATIN SMALL LETTER THORN + 0x00FF //128 #LATIN SMALL LETTER Y WITH DIAERESIS +}; + +//Table 1253 +static const int DRW_Table1253[] = { + 0x20AC, //1 #EURO SIGN + 0x00 , //2 #UNDEFINED + 0x201A, //3 #SINGLE LOW-9 QUOTATION MARK + 0x0192, //4 #LATIN SMALL LETTER F WITH HOOK + 0x201E, //5 #DOUBLE LOW-9 QUOTATION MARK + 0x2026, //6 #HORIZONTAL ELLIPSIS + 0x2020, //7 #DAGGER + 0x2021, //8 #DOUBLE DAGGER + 0x00 , //9 #UNDEFINED + 0x2030, //10 #PER MILLE SIGN + 0x00 , //11 #UNDEFINED + 0x2039, //12 #SINGLE LEFT-POINTING ANGLE QUOTATION MARK + 0x00 , //13 #UNDEFINED + 0x00 , //14 #UNDEFINED + 0x00 , //15 #UNDEFINED + 0x00 , //16 #UNDEFINED + 0x00 , //17 #UNDEFINED + 0x2018, //18 #LEFT SINGLE QUOTATION MARK + 0x2019, //19 #RIGHT SINGLE QUOTATION MARK + 0x201C, //20 #LEFT DOUBLE QUOTATION MARK + 0x201D, //21 #RIGHT DOUBLE QUOTATION MARK + 0x2022, //22 #BULLET + 0x2013, //23 #EN DASH + 0x2014, //24 #EM DASH + 0x00 , //25 #UNDEFINED + 0x2122, //26 #TRADE MARK SIGN + 0x00 , //27 #UNDEFINED + 0x203A, //28 #SINGLE RIGHT-POINTING ANGLE QUOTATION MARK + 0x00 , //29 #UNDEFINED + 0x00 , //30 #UNDEFINED + 0x00 , //31 #UNDEFINED + 0x00 , //32 #UNDEFINED + 0x00A0, //33 #NO-BREAK SPACE + 0x0385, //34 #GREEK DIALYTIKA TONOS + 0x0386, //35 #GREEK CAPITAL LETTER ALPHA WITH TONOS + 0x00A3, //36 #POUND SIGN + 0x00A4, //37 #CURRENCY SIGN + 0x00A5, //38 #YEN SIGN + 0x00A6, //39 #BROKEN BAR + 0x00A7, //40 #SECTION SIGN + 0x00A8, //41 #DIAERESIS + 0x00A9, //42 #COPYRIGHT SIGN + 0x00 , //43 #UNDEFINED + 0x00AB, //44 #LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00AC, //45 #NOT SIGN + 0x00AD, //46 #SOFT HYPHEN + 0x00AE, //47 #REGISTERED SIGN + 0x2015, //48 #HORIZONTAL BAR + 0x00B0, //49 #DEGREE SIGN + 0x00B1, //50 #PLUS-MINUS SIGN + 0x00B2, //51 #SUPERSCRIPT TWO + 0x00B3, //52 #SUPERSCRIPT THREE + 0x0384, //53 #GREEK TONOS + 0x00B5, //54 #MICRO SIGN + 0x00B6, //55 #PILCROW SIGN + 0x00B7, //56 #MIDDLE DOT + 0x0388, //57 #GREEK CAPITAL LETTER EPSILON WITH TONOS + 0x0389, //58 #GREEK CAPITAL LETTER ETA WITH TONOS + 0x038A, //59 #GREEK CAPITAL LETTER IOTA WITH TONOS + 0x00BB, //60 #RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x038C, //61 #GREEK CAPITAL LETTER OMICRON WITH TONOS + 0x00BD, //62 #VULGAR FRACTION ONE HALF + 0x038E, //63 #GREEK CAPITAL LETTER UPSILON WITH TONOS + 0x038F, //64 #GREEK CAPITAL LETTER OMEGA WITH TONOS + 0x0390, //65 #GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS + 0x0391, //66 #GREEK CAPITAL LETTER ALPHA + 0x0392, //67 #GREEK CAPITAL LETTER BETA + 0x0393, //68 #GREEK CAPITAL LETTER GAMMA + 0x0394, //69 #GREEK CAPITAL LETTER DELTA + 0x0395, //70 #GREEK CAPITAL LETTER EPSILON + 0x0396, //71 #GREEK CAPITAL LETTER ZETA + 0x0397, //72 #GREEK CAPITAL LETTER ETA + 0x0398, //73 #GREEK CAPITAL LETTER THETA + 0x0399, //74 #GREEK CAPITAL LETTER IOTA + 0x039A, //75 #GREEK CAPITAL LETTER KAPPA + 0x039B, //76 #GREEK CAPITAL LETTER LAMDA + 0x039C, //77 #GREEK CAPITAL LETTER MU + 0x039D, //78 #GREEK CAPITAL LETTER NU + 0x039E, //79 #GREEK CAPITAL LETTER XI + 0x039F, //80 #GREEK CAPITAL LETTER OMICRON + 0x03A0, //81 #GREEK CAPITAL LETTER PI + 0x03A1, //82 #GREEK CAPITAL LETTER RHO + 0x00 , //83 #UNDEFINED + 0x03A3, //84 #GREEK CAPITAL LETTER SIGMA + 0x03A4, //85 #GREEK CAPITAL LETTER TAU + 0x03A5, //86 #GREEK CAPITAL LETTER UPSILON + 0x03A6, //87 #GREEK CAPITAL LETTER PHI + 0x03A7, //88 #GREEK CAPITAL LETTER CHI + 0x03A8, //89 #GREEK CAPITAL LETTER PSI + 0x03A9, //90 #GREEK CAPITAL LETTER OMEGA + 0x03AA, //91 #GREEK CAPITAL LETTER IOTA WITH DIALYTIKA + 0x03AB, //92 #GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA + 0x03AC, //93 #GREEK SMALL LETTER ALPHA WITH TONOS + 0x03AD, //94 #GREEK SMALL LETTER EPSILON WITH TONOS + 0x03AE, //95 #GREEK SMALL LETTER ETA WITH TONOS + 0x03AF, //96 #GREEK SMALL LETTER IOTA WITH TONOS + 0x03B0, //97 #GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS + 0x03B1, //98 #GREEK SMALL LETTER ALPHA + 0x03B2, //99 #GREEK SMALL LETTER BETA + 0x03B3, //100 #GREEK SMALL LETTER GAMMA + 0x03B4, //101 #GREEK SMALL LETTER DELTA + 0x03B5, //102 #GREEK SMALL LETTER EPSILON + 0x03B6, //103 #GREEK SMALL LETTER ZETA + 0x03B7, //104 #GREEK SMALL LETTER ETA + 0x03B8, //105 #GREEK SMALL LETTER THETA + 0x03B9, //106 #GREEK SMALL LETTER IOTA + 0x03BA, //107 #GREEK SMALL LETTER KAPPA + 0x03BB, //108 #GREEK SMALL LETTER LAMDA + 0x03BC, //109 #GREEK SMALL LETTER MU + 0x03BD, //110 #GREEK SMALL LETTER NU + 0x03BE, //111 #GREEK SMALL LETTER XI + 0x03BF, //112 #GREEK SMALL LETTER OMICRON + 0x03C0, //113 #GREEK SMALL LETTER PI + 0x03C1, //114 #GREEK SMALL LETTER RHO + 0x03C2, //115 #GREEK SMALL LETTER FINAL SIGMA + 0x03C3, //116 #GREEK SMALL LETTER SIGMA + 0x03C4, //117 #GREEK SMALL LETTER TAU + 0x03C5, //118 #GREEK SMALL LETTER UPSILON + 0x03C6, //119 #GREEK SMALL LETTER PHI + 0x03C7, //120 #GREEK SMALL LETTER CHI + 0x03C8, //121 #GREEK SMALL LETTER PSI + 0x03C9, //122 #GREEK SMALL LETTER OMEGA + 0x03CA, //123 #GREEK SMALL LETTER IOTA WITH DIALYTIKA + 0x03CB, //124 #GREEK SMALL LETTER UPSILON WITH DIALYTIKA + 0x03CC, //125 #GREEK SMALL LETTER OMICRON WITH TONOS + 0x03CD, //126 #GREEK SMALL LETTER UPSILON WITH TONOS + 0x03CE, //127 #GREEK SMALL LETTER OMEGA WITH TONOS + 0x00 //128 #UNDEFINED +}; + +//Table 1254 +static const int DRW_Table1254[] = { + 0x20AC, //1 #EURO SIGN + 0x00 , //2 #UNDEFINED + 0x201A, //3 #SINGLE LOW-9 QUOTATION MARK + 0x0192, //4 #LATIN SMALL LETTER F WITH HOOK + 0x201E, //5 #DOUBLE LOW-9 QUOTATION MARK + 0x2026, //6 #HORIZONTAL ELLIPSIS + 0x2020, //7 #DAGGER + 0x2021, //8 #DOUBLE DAGGER + 0x02C6, //9 #MODIFIER LETTER CIRCUMFLEX ACCENT + 0x2030, //10 #PER MILLE SIGN + 0x0160, //11 #LATIN CAPITAL LETTER S WITH CARON + 0x2039, //12 #SINGLE LEFT-POINTING ANGLE QUOTATION MARK + 0x0152, //13 #LATIN CAPITAL LIGATURE OE + 0x00 , //14 #UNDEFINED + 0x00 , //15 #UNDEFINED + 0x00 , //16 #UNDEFINED + 0x00 , //17 #UNDEFINED + 0x2018, //18 #LEFT SINGLE QUOTATION MARK + 0x2019, //19 #RIGHT SINGLE QUOTATION MARK + 0x201C, //20 #LEFT DOUBLE QUOTATION MARK + 0x201D, //21 #RIGHT DOUBLE QUOTATION MARK + 0x2022, //22 #BULLET + 0x2013, //23 #EN DASH + 0x2014, //24 #EM DASH + 0x02DC, //25 #SMALL TILDE + 0x2122, //26 #TRADE MARK SIGN + 0x0161, //27 #LATIN SMALL LETTER S WITH CARON + 0x203A, //28 #SINGLE RIGHT-POINTING ANGLE QUOTATION MARK + 0x0153, //29 #LATIN SMALL LIGATURE OE + 0x00 , //30 #UNDEFINED + 0x00 , //31 #UNDEFINED + 0x0178, //32 #LATIN CAPITAL LETTER Y WITH DIAERESIS + 0x00A0, //33 #NO-BREAK SPACE + 0x00A1, //34 #INVERTED EXCLAMATION MARK + 0x00A2, //35 #CENT SIGN + 0x00A3, //36 #POUND SIGN + 0x00A4, //37 #CURRENCY SIGN + 0x00A5, //38 #YEN SIGN + 0x00A6, //39 #BROKEN BAR + 0x00A7, //40 #SECTION SIGN + 0x00A8, //41 #DIAERESIS + 0x00A9, //42 #COPYRIGHT SIGN + 0x00AA, //43 #FEMININE ORDINAL INDICATOR + 0x00AB, //44 #LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00AC, //45 #NOT SIGN + 0x00AD, //46 #SOFT HYPHEN + 0x00AE, //47 #REGISTERED SIGN + 0x00AF, //48 #MACRON + 0x00B0, //49 #DEGREE SIGN + 0x00B1, //50 #PLUS-MINUS SIGN + 0x00B2, //51 #SUPERSCRIPT TWO + 0x00B3, //52 #SUPERSCRIPT THREE + 0x00B4, //53 #ACUTE ACCENT + 0x00B5, //54 #MICRO SIGN + 0x00B6, //55 #PILCROW SIGN + 0x00B7, //56 #MIDDLE DOT + 0x00B8, //57 #CEDILLA + 0x00B9, //58 #SUPERSCRIPT ONE + 0x00BA, //59 #MASCULINE ORDINAL INDICATOR + 0x00BB, //60 #RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00BC, //61 #VULGAR FRACTION ONE QUARTER + 0x00BD, //62 #VULGAR FRACTION ONE HALF + 0x00BE, //63 #VULGAR FRACTION THREE QUARTERS + 0x00BF, //64 #INVERTED QUESTION MARK + 0x00C0, //65 #LATIN CAPITAL LETTER A WITH GRAVE + 0x00C1, //66 #LATIN CAPITAL LETTER A WITH ACUTE + 0x00C2, //67 #LATIN CAPITAL LETTER A WITH CIRCUMFLEX + 0x00C3, //68 #LATIN CAPITAL LETTER A WITH TILDE + 0x00C4, //69 #LATIN CAPITAL LETTER A WITH DIAERESIS + 0x00C5, //70 #LATIN CAPITAL LETTER A WITH RING ABOVE + 0x00C6, //71 #LATIN CAPITAL LETTER AE + 0x00C7, //72 #LATIN CAPITAL LETTER C WITH CEDILLA + 0x00C8, //73 #LATIN CAPITAL LETTER E WITH GRAVE + 0x00C9, //74 #LATIN CAPITAL LETTER E WITH ACUTE + 0x00CA, //75 #LATIN CAPITAL LETTER E WITH CIRCUMFLEX + 0x00CB, //76 #LATIN CAPITAL LETTER E WITH DIAERESIS + 0x00CC, //77 #LATIN CAPITAL LETTER I WITH GRAVE + 0x00CD, //78 #LATIN CAPITAL LETTER I WITH ACUTE + 0x00CE, //79 #LATIN CAPITAL LETTER I WITH CIRCUMFLEX + 0x00CF, //80 #LATIN CAPITAL LETTER I WITH DIAERESIS + 0x011E, //81 #LATIN CAPITAL LETTER G WITH BREVE + 0x00D1, //82 #LATIN CAPITAL LETTER N WITH TILDE + 0x00D2, //83 #LATIN CAPITAL LETTER O WITH GRAVE + 0x00D3, //84 #LATIN CAPITAL LETTER O WITH ACUTE + 0x00D4, //85 #LATIN CAPITAL LETTER O WITH CIRCUMFLEX + 0x00D5, //86 #LATIN CAPITAL LETTER O WITH TILDE + 0x00D6, //87 #LATIN CAPITAL LETTER O WITH DIAERESIS + 0x00D7, //88 #MULTIPLICATION SIGN + 0x00D8, //89 #LATIN CAPITAL LETTER O WITH STROKE + 0x00D9, //90 #LATIN CAPITAL LETTER U WITH GRAVE + 0x00DA, //91 #LATIN CAPITAL LETTER U WITH ACUTE + 0x00DB, //92 #LATIN CAPITAL LETTER U WITH CIRCUMFLEX + 0x00DC, //93 #LATIN CAPITAL LETTER U WITH DIAERESIS + 0x0130, //94 #LATIN CAPITAL LETTER I WITH DOT ABOVE + 0x015E, //95 #LATIN CAPITAL LETTER S WITH CEDILLA + 0x00DF, //96 #LATIN SMALL LETTER SHARP S + 0x00E0, //97 #LATIN SMALL LETTER A WITH GRAVE + 0x00E1, //98 #LATIN SMALL LETTER A WITH ACUTE + 0x00E2, //99 #LATIN SMALL LETTER A WITH CIRCUMFLEX + 0x00E3, //100 #LATIN SMALL LETTER A WITH TILDE + 0x00E4, //101 #LATIN SMALL LETTER A WITH DIAERESIS + 0x00E5, //102 #LATIN SMALL LETTER A WITH RING ABOVE + 0x00E6, //103 #LATIN SMALL LETTER AE + 0x00E7, //104 #LATIN SMALL LETTER C WITH CEDILLA + 0x00E8, //105 #LATIN SMALL LETTER E WITH GRAVE + 0x00E9, //106 #LATIN SMALL LETTER E WITH ACUTE + 0x00EA, //107 #LATIN SMALL LETTER E WITH CIRCUMFLEX + 0x00EB, //108 #LATIN SMALL LETTER E WITH DIAERESIS + 0x00EC, //109 #LATIN SMALL LETTER I WITH GRAVE + 0x00ED, //110 #LATIN SMALL LETTER I WITH ACUTE + 0x00EE, //111 #LATIN SMALL LETTER I WITH CIRCUMFLEX + 0x00EF, //112 #LATIN SMALL LETTER I WITH DIAERESIS + 0x011F, //113 #LATIN SMALL LETTER G WITH BREVE + 0x00F1, //114 #LATIN SMALL LETTER N WITH TILDE + 0x00F2, //115 #LATIN SMALL LETTER O WITH GRAVE + 0x00F3, //116 #LATIN SMALL LETTER O WITH ACUTE + 0x00F4, //117 #LATIN SMALL LETTER O WITH CIRCUMFLEX + 0x00F5, //118 #LATIN SMALL LETTER O WITH TILDE + 0x00F6, //119 #LATIN SMALL LETTER O WITH DIAERESIS + 0x00F7, //120 #DIVISION SIGN + 0x00F8, //121 #LATIN SMALL LETTER O WITH STROKE + 0x00F9, //122 #LATIN SMALL LETTER U WITH GRAVE + 0x00FA, //123 #LATIN SMALL LETTER U WITH ACUTE + 0x00FB, //124 #LATIN SMALL LETTER U WITH CIRCUMFLEX + 0x00FC, //125 #LATIN SMALL LETTER U WITH DIAERESIS + 0x0131, //126 #LATIN SMALL LETTER DOTLESS I + 0x015F, //127 #LATIN SMALL LETTER S WITH CEDILLA + 0x00FF //128 #LATIN SMALL LETTER Y WITH DIAERESIS +}; + +//Table 1255 +static const int DRW_Table1255[] = { + 0x20AC, //1 #EURO SIGN + 0x00 , //2 #UNDEFINED + 0x201A, //3 #SINGLE LOW-9 QUOTATION MARK + 0x0192, //4 #LATIN SMALL LETTER F WITH HOOK + 0x201E, //5 #DOUBLE LOW-9 QUOTATION MARK + 0x2026, //6 #HORIZONTAL ELLIPSIS + 0x2020, //7 #DAGGER + 0x2021, //8 #DOUBLE DAGGER + 0x02C6, //9 #MODIFIER LETTER CIRCUMFLEX ACCENT + 0x2030, //10 #PER MILLE SIGN + 0x00 , //11 #UNDEFINED + 0x2039, //12 #SINGLE LEFT-POINTING ANGLE QUOTATION MARK + 0x00 , //13 #UNDEFINED + 0x00 , //14 #UNDEFINED + 0x00 , //15 #UNDEFINED + 0x00 , //16 #UNDEFINED + 0x00 , //17 #UNDEFINED + 0x2018, //18 #LEFT SINGLE QUOTATION MARK + 0x2019, //19 #RIGHT SINGLE QUOTATION MARK + 0x201C, //20 #LEFT DOUBLE QUOTATION MARK + 0x201D, //21 #RIGHT DOUBLE QUOTATION MARK + 0x2022, //22 #BULLET + 0x2013, //23 #EN DASH + 0x2014, //24 #EM DASH + 0x02DC, //25 #SMALL TILDE + 0x2122, //26 #TRADE MARK SIGN + 0x00 , //27 #UNDEFINED + 0x203A, //28 #SINGLE RIGHT-POINTING ANGLE QUOTATION MARK + 0x00 , //29 #UNDEFINED + 0x00 , //30 #UNDEFINED + 0x00 , //31 #UNDEFINED + 0x00 , //32 #UNDEFINED + 0x00A0, //33 #NO-BREAK SPACE + 0x00A1, //34 #INVERTED EXCLAMATION MARK + 0x00A2, //35 #CENT SIGN + 0x00A3, //36 #POUND SIGN + 0x20AA, //37 #NEW SHEQEL SIGN + 0x00A5, //38 #YEN SIGN + 0x00A6, //39 #BROKEN BAR + 0x00A7, //40 #SECTION SIGN + 0x00A8, //41 #DIAERESIS + 0x00A9, //42 #COPYRIGHT SIGN + 0x00D7, //43 #MULTIPLICATION SIGN + 0x00AB, //44 #LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00AC, //45 #NOT SIGN + 0x00AD, //46 #SOFT HYPHEN + 0x00AE, //47 #REGISTERED SIGN + 0x00AF, //48 #MACRON + 0x00B0, //49 #DEGREE SIGN + 0x00B1, //50 #PLUS-MINUS SIGN + 0x00B2, //51 #SUPERSCRIPT TWO + 0x00B3, //52 #SUPERSCRIPT THREE + 0x00B4, //53 #ACUTE ACCENT + 0x00B5, //54 #MICRO SIGN + 0x00B6, //55 #PILCROW SIGN + 0x00B7, //56 #MIDDLE DOT + 0x00B8, //57 #CEDILLA + 0x00B9, //58 #SUPERSCRIPT ONE + 0x00F7, //59 #DIVISION SIGN + 0x00BB, //60 #RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00BC, //61 #VULGAR FRACTION ONE QUARTER + 0x00BD, //62 #VULGAR FRACTION ONE HALF + 0x00BE, //63 #VULGAR FRACTION THREE QUARTERS + 0x00BF, //64 #INVERTED QUESTION MARK + 0x05B0, //65 #HEBREW POINT SHEVA + 0x05B1, //66 #HEBREW POINT HATAF SEGOL + 0x05B2, //67 #HEBREW POINT HATAF PATAH + 0x05B3, //68 #HEBREW POINT HATAF QAMATS + 0x05B4, //69 #HEBREW POINT HIRIQ + 0x05B5, //70 #HEBREW POINT TSERE + 0x05B6, //71 #HEBREW POINT SEGOL + 0x05B7, //72 #HEBREW POINT PATAH + 0x05B8, //73 #HEBREW POINT QAMATS + 0x05B9, //74 #HEBREW POINT HOLAM + 0x00 , //75 #UNDEFINED + 0x05BB, //76 #HEBREW POINT QUBUTS + 0x05BC, //77 #HEBREW POINT DAGESH OR MAPIQ + 0x05BD, //78 #HEBREW POINT METEG + 0x05BE, //79 #HEBREW PUNCTUATION MAQAF + 0x05BF, //80 #HEBREW POINT RAFE + 0x05C0, //81 #HEBREW PUNCTUATION PASEQ + 0x05C1, //82 #HEBREW POINT SHIN DOT + 0x05C2, //83 #HEBREW POINT SIN DOT + 0x05C3, //84 #HEBREW PUNCTUATION SOF PASUQ + 0x05F0, //85 #HEBREW LIGATURE YIDDISH DOUBLE VAV + 0x05F1, //86 #HEBREW LIGATURE YIDDISH VAV YOD + 0x05F2, //87 #HEBREW LIGATURE YIDDISH DOUBLE YOD + 0x05F3, //88 #HEBREW PUNCTUATION GERESH + 0x05F4, //89 #HEBREW PUNCTUATION GERSHAYIM + 0x00 , //90 #UNDEFINED + 0x00 , //91 #UNDEFINED + 0x00 , //92 #UNDEFINED + 0x00 , //93 #UNDEFINED + 0x00 , //94 #UNDEFINED + 0x00 , //95 #UNDEFINED + 0x00 , //96 #UNDEFINED + 0x05D0, //97 #HEBREW LETTER ALEF + 0x05D1, //98 #HEBREW LETTER BET + 0x05D2, //99 #HEBREW LETTER GIMEL + 0x05D3, //100 #HEBREW LETTER DALET + 0x05D4, //101 #HEBREW LETTER HE + 0x05D5, //102 #HEBREW LETTER VAV + 0x05D6, //103 #HEBREW LETTER ZAYIN + 0x05D7, //104 #HEBREW LETTER HET + 0x05D8, //105 #HEBREW LETTER TET + 0x05D9, //106 #HEBREW LETTER YOD + 0x05DA, //107 #HEBREW LETTER FINAL KAF + 0x05DB, //108 #HEBREW LETTER KAF + 0x05DC, //109 #HEBREW LETTER LAMED + 0x05DD, //110 #HEBREW LETTER FINAL MEM + 0x05DE, //111 #HEBREW LETTER MEM + 0x05DF, //112 #HEBREW LETTER FINAL NUN + 0x05E0, //113 #HEBREW LETTER NUN + 0x05E1, //114 #HEBREW LETTER SAMEKH + 0x05E2, //115 #HEBREW LETTER AYIN + 0x05E3, //116 #HEBREW LETTER FINAL PE + 0x05E4, //117 #HEBREW LETTER PE + 0x05E5, //118 #HEBREW LETTER FINAL TSADI + 0x05E6, //119 #HEBREW LETTER TSADI + 0x05E7, //120 #HEBREW LETTER QOF + 0x05E8, //121 #HEBREW LETTER RESH + 0x05E9, //122 #HEBREW LETTER SHIN + 0x05EA, //123 #HEBREW LETTER TAV + 0x00 , //124 #UNDEFINED + 0x00 , //125 #UNDEFINED + 0x200E, //126 #LEFT-TO-RIGHT MARK + 0x200F, //127 #RIGHT-TO-LEFT MARK + 0x00 //128 #UNDEFINED +}; + +//Table 1256 +static const int DRW_Table1256[] = { + 0x20AC, //1 #EURO SIGN + 0x067E, //2 #ARABIC LETTER PEH + 0x201A, //3 #SINGLE LOW-9 QUOTATION MARK + 0x0192, //4 #LATIN SMALL LETTER F WITH HOOK + 0x201E, //5 #DOUBLE LOW-9 QUOTATION MARK + 0x2026, //6 #HORIZONTAL ELLIPSIS + 0x2020, //7 #DAGGER + 0x2021, //8 #DOUBLE DAGGER + 0x02C6, //9 #MODIFIER LETTER CIRCUMFLEX ACCENT + 0x2030, //10 #PER MILLE SIGN + 0x0679, //11 #ARABIC LETTER TTEH + 0x2039, //12 #SINGLE LEFT-POINTING ANGLE QUOTATION MARK + 0x0152, //13 #LATIN CAPITAL LIGATURE OE + 0x0686, //14 #ARABIC LETTER TCHEH + 0x0698, //15 #ARABIC LETTER JEH + 0x0688, //16 #ARABIC LETTER DDAL + 0x06AF, //17 #ARABIC LETTER GAF + 0x2018, //18 #LEFT SINGLE QUOTATION MARK + 0x2019, //19 #RIGHT SINGLE QUOTATION MARK + 0x201C, //20 #LEFT DOUBLE QUOTATION MARK + 0x201D, //21 #RIGHT DOUBLE QUOTATION MARK + 0x2022, //22 #BULLET + 0x2013, //23 #EN DASH + 0x2014, //24 #EM DASH + 0x06A9, //25 #ARABIC LETTER KEHEH + 0x2122, //26 #TRADE MARK SIGN + 0x0691, //27 #ARABIC LETTER RREH + 0x203A, //28 #SINGLE RIGHT-POINTING ANGLE QUOTATION MARK + 0x0153, //29 #LATIN SMALL LIGATURE OE + 0x200C, //30 #ZERO WIDTH NON-JOINER + 0x200D, //31 #ZERO WIDTH JOINER + 0x06BA, //32 #ARABIC LETTER NOON GHUNNA + 0x00A0, //33 #NO-BREAK SPACE + 0x060C, //34 #ARABIC COMMA + 0x00A2, //35 #CENT SIGN + 0x00A3, //36 #POUND SIGN + 0x00A4, //37 #CURRENCY SIGN + 0x00A5, //38 #YEN SIGN + 0x00A6, //39 #BROKEN BAR + 0x00A7, //40 #SECTION SIGN + 0x00A8, //41 #DIAERESIS + 0x00A9, //42 #COPYRIGHT SIGN + 0x06BE, //43 #ARABIC LETTER HEH DOACHASHMEE + 0x00AB, //44 #LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00AC, //45 #NOT SIGN + 0x00AD, //46 #SOFT HYPHEN + 0x00AE, //47 #REGISTERED SIGN + 0x00AF, //48 #MACRON + 0x00B0, //49 #DEGREE SIGN + 0x00B1, //50 #PLUS-MINUS SIGN + 0x00B2, //51 #SUPERSCRIPT TWO + 0x00B3, //52 #SUPERSCRIPT THREE + 0x00B4, //53 #ACUTE ACCENT + 0x00B5, //54 #MICRO SIGN + 0x00B6, //55 #PILCROW SIGN + 0x00B7, //56 #MIDDLE DOT + 0x00B8, //57 #CEDILLA + 0x00B9, //58 #SUPERSCRIPT ONE + 0x061B, //59 #ARABIC SEMICOLON + 0x00BB, //60 #RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00BC, //61 #VULGAR FRACTION ONE QUARTER + 0x00BD, //62 #VULGAR FRACTION ONE HALF + 0x00BE, //63 #VULGAR FRACTION THREE QUARTERS + 0x061F, //64 #ARABIC QUESTION MARK + 0x06C1, //65 #ARABIC LETTER HEH GOAL + 0x0621, //66 #ARABIC LETTER HAMZA + 0x0622, //67 #ARABIC LETTER ALEF WITH MADDA ABOVE + 0x0623, //68 #ARABIC LETTER ALEF WITH HAMZA ABOVE + 0x0624, //69 #ARABIC LETTER WAW WITH HAMZA ABOVE + 0x0625, //70 #ARABIC LETTER ALEF WITH HAMZA BELOW + 0x0626, //71 #ARABIC LETTER YEH WITH HAMZA ABOVE + 0x0627, //72 #ARABIC LETTER ALEF + 0x0628, //73 #ARABIC LETTER BEH + 0x0629, //74 #ARABIC LETTER TEH MARBUTA + 0x062A, //75 #ARABIC LETTER TEH + 0x062B, //76 #ARABIC LETTER THEH + 0x062C, //77 #ARABIC LETTER JEEM + 0x062D, //78 #ARABIC LETTER HAH + 0x062E, //79 #ARABIC LETTER KHAH + 0x062F, //80 #ARABIC LETTER DAL + 0x0630, //81 #ARABIC LETTER THAL + 0x0631, //82 #ARABIC LETTER REH + 0x0632, //83 #ARABIC LETTER ZAIN + 0x0633, //84 #ARABIC LETTER SEEN + 0x0634, //85 #ARABIC LETTER SHEEN + 0x0635, //86 #ARABIC LETTER SAD + 0x0636, //87 #ARABIC LETTER DAD + 0x00D7, //88 #MULTIPLICATION SIGN + 0x0637, //89 #ARABIC LETTER TAH + 0x0638, //90 #ARABIC LETTER ZAH + 0x0639, //91 #ARABIC LETTER AIN + 0x063A, //92 #ARABIC LETTER GHAIN + 0x0640, //93 #ARABIC TATWEEL + 0x0641, //94 #ARABIC LETTER FEH + 0x0642, //95 #ARABIC LETTER QAF + 0x0643, //96 #ARABIC LETTER KAF + 0x00E0, //97 #LATIN SMALL LETTER A WITH GRAVE + 0x0644, //98 #ARABIC LETTER LAM + 0x00E2, //99 #LATIN SMALL LETTER A WITH CIRCUMFLEX + 0x0645, //100 #ARABIC LETTER MEEM + 0x0646, //101 #ARABIC LETTER NOON + 0x0647, //102 #ARABIC LETTER HEH + 0x0648, //103 #ARABIC LETTER WAW + 0x00E7, //104 #LATIN SMALL LETTER C WITH CEDILLA + 0x00E8, //105 #LATIN SMALL LETTER E WITH GRAVE + 0x00E9, //106 #LATIN SMALL LETTER E WITH ACUTE + 0x00EA, //107 #LATIN SMALL LETTER E WITH CIRCUMFLEX + 0x00EB, //108 #LATIN SMALL LETTER E WITH DIAERESIS + 0x0649, //109 #ARABIC LETTER ALEF MAKSURA + 0x064A, //110 #ARABIC LETTER YEH + 0x00EE, //111 #LATIN SMALL LETTER I WITH CIRCUMFLEX + 0x00EF, //112 #LATIN SMALL LETTER I WITH DIAERESIS + 0x064B, //113 #ARABIC FATHATAN + 0x064C, //114 #ARABIC DAMMATAN + 0x064D, //115 #ARABIC KASRATAN + 0x064E, //116 #ARABIC FATHA + 0x00F4, //117 #LATIN SMALL LETTER O WITH CIRCUMFLEX + 0x064F, //118 #ARABIC DAMMA + 0x0650, //119 #ARABIC KASRA + 0x00F7, //120 #DIVISION SIGN + 0x0651, //121 #ARABIC SHADDA + 0x00F9, //122 #LATIN SMALL LETTER U WITH GRAVE + 0x0652, //123 #ARABIC SUKUN + 0x00FB, //124 #LATIN SMALL LETTER U WITH CIRCUMFLEX + 0x00FC, //125 #LATIN SMALL LETTER U WITH DIAERESIS + 0x200E, //126 #LEFT-TO-RIGHT MARK + 0x200F, //127 #RIGHT-TO-LEFT MARK + 0x06D2 //128 #ARABIC LETTER YEH BARREE +}; + +//Table 1257 +static const int DRW_Table1257[] = { + 0x20AC, //1 #EURO SIGN + 0x00 , //2 #UNDEFINED + 0x201A, //3 #SINGLE LOW-9 QUOTATION MARK + 0x00 , //4 #UNDEFINED + 0x201E, //5 #DOUBLE LOW-9 QUOTATION MARK + 0x2026, //6 #HORIZONTAL ELLIPSIS + 0x2020, //7 #DAGGER + 0x2021, //8 #DOUBLE DAGGER + 0x00 , //9 #UNDEFINED + 0x2030, //10 #PER MILLE SIGN + 0x00 , //11 #UNDEFINED + 0x2039, //12 #SINGLE LEFT-POINTING ANGLE QUOTATION MARK + 0x00 , //13 #UNDEFINED + 0x00A8, //14 #DIAERESIS + 0x02C7, //15 #CARON + 0x00B8, //16 #CEDILLA + 0x00 , //17 #UNDEFINED + 0x2018, //18 #LEFT SINGLE QUOTATION MARK + 0x2019, //19 #RIGHT SINGLE QUOTATION MARK + 0x201C, //20 #LEFT DOUBLE QUOTATION MARK + 0x201D, //21 #RIGHT DOUBLE QUOTATION MARK + 0x2022, //22 #BULLET + 0x2013, //23 #EN DASH + 0x2014, //24 #EM DASH + 0x00 , //25 #UNDEFINED + 0x2122, //26 #TRADE MARK SIGN + 0x00 , //27 #UNDEFINED + 0x203A, //28 #SINGLE RIGHT-POINTING ANGLE QUOTATION MARK + 0x00 , //29 #UNDEFINED + 0x00AF, //30 #MACRON + 0x02DB, //31 #OGONEK + 0x00 , //32 #UNDEFINED + 0x00A0, //33 #NO-BREAK SPACE + 0x00 , //34 #UNDEFINED + 0x00A2, //35 #CENT SIGN + 0x00A3, //36 #POUND SIGN + 0x00A4, //37 #CURRENCY SIGN + 0x00 , //38 #UNDEFINED + 0x00A6, //39 #BROKEN BAR + 0x00A7, //40 #SECTION SIGN + 0x00D8, //41 #LATIN CAPITAL LETTER O WITH STROKE + 0x00A9, //42 #COPYRIGHT SIGN + 0x0156, //43 #LATIN CAPITAL LETTER R WITH CEDILLA + 0x00AB, //44 #LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00AC, //45 #NOT SIGN + 0x00AD, //46 #SOFT HYPHEN + 0x00AE, //47 #REGISTERED SIGN + 0x00C6, //48 #LATIN CAPITAL LETTER AE + 0x00B0, //49 #DEGREE SIGN + 0x00B1, //50 #PLUS-MINUS SIGN + 0x00B2, //51 #SUPERSCRIPT TWO + 0x00B3, //52 #SUPERSCRIPT THREE + 0x00B4, //53 #ACUTE ACCENT + 0x00B5, //54 #MICRO SIGN + 0x00B6, //55 #PILCROW SIGN + 0x00B7, //56 #MIDDLE DOT + 0x00F8, //57 #LATIN SMALL LETTER O WITH STROKE + 0x00B9, //58 #SUPERSCRIPT ONE + 0x0157, //59 #LATIN SMALL LETTER R WITH CEDILLA + 0x00BB, //60 #RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00BC, //61 #VULGAR FRACTION ONE QUARTER + 0x00BD, //62 #VULGAR FRACTION ONE HALF + 0x00BE, //63 #VULGAR FRACTION THREE QUARTERS + 0x00E6, //64 #LATIN SMALL LETTER AE + 0x0104, //65 #LATIN CAPITAL LETTER A WITH OGONEK + 0x012E, //66 #LATIN CAPITAL LETTER I WITH OGONEK + 0x0100, //67 #LATIN CAPITAL LETTER A WITH MACRON + 0x0106, //68 #LATIN CAPITAL LETTER C WITH ACUTE + 0x00C4, //69 #LATIN CAPITAL LETTER A WITH DIAERESIS + 0x00C5, //70 #LATIN CAPITAL LETTER A WITH RING ABOVE + 0x0118, //71 #LATIN CAPITAL LETTER E WITH OGONEK + 0x0112, //72 #LATIN CAPITAL LETTER E WITH MACRON + 0x010C, //73 #LATIN CAPITAL LETTER C WITH CARON + 0x00C9, //74 #LATIN CAPITAL LETTER E WITH ACUTE + 0x0179, //75 #LATIN CAPITAL LETTER Z WITH ACUTE + 0x0116, //76 #LATIN CAPITAL LETTER E WITH DOT ABOVE + 0x0122, //77 #LATIN CAPITAL LETTER G WITH CEDILLA + 0x0136, //78 #LATIN CAPITAL LETTER K WITH CEDILLA + 0x012A, //79 #LATIN CAPITAL LETTER I WITH MACRON + 0x013B, //80 #LATIN CAPITAL LETTER L WITH CEDILLA + 0x0160, //81 #LATIN CAPITAL LETTER S WITH CARON + 0x0143, //82 #LATIN CAPITAL LETTER N WITH ACUTE + 0x0145, //83 #LATIN CAPITAL LETTER N WITH CEDILLA + 0x00D3, //84 #LATIN CAPITAL LETTER O WITH ACUTE + 0x014C, //85 #LATIN CAPITAL LETTER O WITH MACRON + 0x00D5, //86 #LATIN CAPITAL LETTER O WITH TILDE + 0x00D6, //87 #LATIN CAPITAL LETTER O WITH DIAERESIS + 0x00D7, //88 #MULTIPLICATION SIGN + 0x0172, //89 #LATIN CAPITAL LETTER U WITH OGONEK + 0x0141, //90 #LATIN CAPITAL LETTER L WITH STROKE + 0x015A, //91 #LATIN CAPITAL LETTER S WITH ACUTE + 0x016A, //92 #LATIN CAPITAL LETTER U WITH MACRON + 0x00DC, //93 #LATIN CAPITAL LETTER U WITH DIAERESIS + 0x017B, //94 #LATIN CAPITAL LETTER Z WITH DOT ABOVE + 0x017D, //95 #LATIN CAPITAL LETTER Z WITH CARON + 0x00DF, //96 #LATIN SMALL LETTER SHARP S + 0x0105, //97 #LATIN SMALL LETTER A WITH OGONEK + 0x012F, //98 #LATIN SMALL LETTER I WITH OGONEK + 0x0101, //99 #LATIN SMALL LETTER A WITH MACRON + 0x0107, //100 #LATIN SMALL LETTER C WITH ACUTE + 0x00E4, //101 #LATIN SMALL LETTER A WITH DIAERESIS + 0x00E5, //102 #LATIN SMALL LETTER A WITH RING ABOVE + 0x0119, //103 #LATIN SMALL LETTER E WITH OGONEK + 0x0113, //104 #LATIN SMALL LETTER E WITH MACRON + 0x010D, //105 #LATIN SMALL LETTER C WITH CARON + 0x00E9, //106 #LATIN SMALL LETTER E WITH ACUTE + 0x017A, //107 #LATIN SMALL LETTER Z WITH ACUTE + 0x0117, //108 #LATIN SMALL LETTER E WITH DOT ABOVE + 0x0123, //109 #LATIN SMALL LETTER G WITH CEDILLA + 0x0137, //110 #LATIN SMALL LETTER K WITH CEDILLA + 0x012B, //111 #LATIN SMALL LETTER I WITH MACRON + 0x013C, //112 #LATIN SMALL LETTER L WITH CEDILLA + 0x0161, //113 #LATIN SMALL LETTER S WITH CARON + 0x0144, //114 #LATIN SMALL LETTER N WITH ACUTE + 0x0146, //115 #LATIN SMALL LETTER N WITH CEDILLA + 0x00F3, //116 #LATIN SMALL LETTER O WITH ACUTE + 0x014D, //117 #LATIN SMALL LETTER O WITH MACRON + 0x00F5, //118 #LATIN SMALL LETTER O WITH TILDE + 0x00F6, //119 #LATIN SMALL LETTER O WITH DIAERESIS + 0x00F7, //120 #DIVISION SIGN + 0x0173, //121 #LATIN SMALL LETTER U WITH OGONEK + 0x0142, //122 #LATIN SMALL LETTER L WITH STROKE + 0x015B, //123 #LATIN SMALL LETTER S WITH ACUTE + 0x016B, //124 #LATIN SMALL LETTER U WITH MACRON + 0x00FC, //125 #LATIN SMALL LETTER U WITH DIAERESIS + 0x017C, //126 #LATIN SMALL LETTER Z WITH DOT ABOVE + 0x017E, //127 #LATIN SMALL LETTER Z WITH CARON + 0x02D9 //128 #DOT ABOVE +}; + +//Table 1258 +static const int DRW_Table1258[] = { + 0x20AC, //1 #EURO SIGN + 0x00 , //2 #UNDEFINED + 0x201A, //3 #SINGLE LOW-9 QUOTATION MARK + 0x0192, //4 #LATIN SMALL LETTER F WITH HOOK + 0x201E, //5 #DOUBLE LOW-9 QUOTATION MARK + 0x2026, //6 #HORIZONTAL ELLIPSIS + 0x2020, //7 #DAGGER + 0x2021, //8 #DOUBLE DAGGER + 0x02C6, //9 #MODIFIER LETTER CIRCUMFLEX ACCENT + 0x2030, //10 #PER MILLE SIGN + 0x00 , //11 #UNDEFINED + 0x2039, //12 #SINGLE LEFT-POINTING ANGLE QUOTATION MARK + 0x0152, //13 #LATIN CAPITAL LIGATURE OE + 0x00 , //14 #UNDEFINED + 0x00 , //15 #UNDEFINED + 0x00 , //16 #UNDEFINED + 0x00 , //17 #UNDEFINED + 0x2018, //18 #LEFT SINGLE QUOTATION MARK + 0x2019, //19 #RIGHT SINGLE QUOTATION MARK + 0x201C, //20 #LEFT DOUBLE QUOTATION MARK + 0x201D, //21 #RIGHT DOUBLE QUOTATION MARK + 0x2022, //22 #BULLET + 0x2013, //23 #EN DASH + 0x2014, //24 #EM DASH + 0x02DC, //25 #SMALL TILDE + 0x2122, //26 #TRADE MARK SIGN + 0x00 , //27 #UNDEFINED + 0x203A, //28 #SINGLE RIGHT-POINTING ANGLE QUOTATION MARK + 0x0153, //29 #LATIN SMALL LIGATURE OE + 0x00 , //30 #UNDEFINED + 0x00 , //31 #UNDEFINED + 0x0178, //32 #LATIN CAPITAL LETTER Y WITH DIAERESIS + 0x00A0, //33 #NO-BREAK SPACE + 0x00A1, //34 #INVERTED EXCLAMATION MARK + 0x00A2, //35 #CENT SIGN + 0x00A3, //36 #POUND SIGN + 0x00A4, //37 #CURRENCY SIGN + 0x00A5, //38 #YEN SIGN + 0x00A6, //39 #BROKEN BAR + 0x00A7, //40 #SECTION SIGN + 0x00A8, //41 #DIAERESIS + 0x00A9, //42 #COPYRIGHT SIGN + 0x00AA, //43 #FEMININE ORDINAL INDICATOR + 0x00AB, //44 #LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00AC, //45 #NOT SIGN + 0x00AD, //46 #SOFT HYPHEN + 0x00AE, //47 #REGISTERED SIGN + 0x00AF, //48 #MACRON + 0x00B0, //49 #DEGREE SIGN + 0x00B1, //50 #PLUS-MINUS SIGN + 0x00B2, //51 #SUPERSCRIPT TWO + 0x00B3, //52 #SUPERSCRIPT THREE + 0x00B4, //53 #ACUTE ACCENT + 0x00B5, //54 #MICRO SIGN + 0x00B6, //55 #PILCROW SIGN + 0x00B7, //56 #MIDDLE DOT + 0x00B8, //57 #CEDILLA + 0x00B9, //58 #SUPERSCRIPT ONE + 0x00BA, //59 #MASCULINE ORDINAL INDICATOR + 0x00BB, //60 #RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00BC, //61 #VULGAR FRACTION ONE QUARTER + 0x00BD, //62 #VULGAR FRACTION ONE HALF + 0x00BE, //63 #VULGAR FRACTION THREE QUARTERS + 0x00BF, //64 #INVERTED QUESTION MARK + 0x00C0, //65 #LATIN CAPITAL LETTER A WITH GRAVE + 0x00C1, //66 #LATIN CAPITAL LETTER A WITH ACUTE + 0x00C2, //67 #LATIN CAPITAL LETTER A WITH CIRCUMFLEX + 0x0102, //68 #LATIN CAPITAL LETTER A WITH BREVE + 0x00C4, //69 #LATIN CAPITAL LETTER A WITH DIAERESIS + 0x00C5, //70 #LATIN CAPITAL LETTER A WITH RING ABOVE + 0x00C6, //71 #LATIN CAPITAL LETTER AE + 0x00C7, //72 #LATIN CAPITAL LETTER C WITH CEDILLA + 0x00C8, //73 #LATIN CAPITAL LETTER E WITH GRAVE + 0x00C9, //74 #LATIN CAPITAL LETTER E WITH ACUTE + 0x00CA, //75 #LATIN CAPITAL LETTER E WITH CIRCUMFLEX + 0x00CB, //76 #LATIN CAPITAL LETTER E WITH DIAERESIS + 0x0300, //77 #COMBINING GRAVE ACCENT + 0x00CD, //78 #LATIN CAPITAL LETTER I WITH ACUTE + 0x00CE, //79 #LATIN CAPITAL LETTER I WITH CIRCUMFLEX + 0x00CF, //80 #LATIN CAPITAL LETTER I WITH DIAERESIS + 0x0110, //81 #LATIN CAPITAL LETTER D WITH STROKE + 0x00D1, //82 #LATIN CAPITAL LETTER N WITH TILDE + 0x0309, //83 #COMBINING HOOK ABOVE + 0x00D3, //84 #LATIN CAPITAL LETTER O WITH ACUTE + 0x00D4, //85 #LATIN CAPITAL LETTER O WITH CIRCUMFLEX + 0x01A0, //86 #LATIN CAPITAL LETTER O WITH HORN + 0x00D6, //87 #LATIN CAPITAL LETTER O WITH DIAERESIS + 0x00D7, //88 #MULTIPLICATION SIGN + 0x00D8, //89 #LATIN CAPITAL LETTER O WITH STROKE + 0x00D9, //90 #LATIN CAPITAL LETTER U WITH GRAVE + 0x00DA, //91 #LATIN CAPITAL LETTER U WITH ACUTE + 0x00DB, //92 #LATIN CAPITAL LETTER U WITH CIRCUMFLEX + 0x00DC, //93 #LATIN CAPITAL LETTER U WITH DIAERESIS + 0x01AF, //94 #LATIN CAPITAL LETTER U WITH HORN + 0x0303, //95 #COMBINING TILDE + 0x00DF, //96 #LATIN SMALL LETTER SHARP S + 0x00E0, //97 #LATIN SMALL LETTER A WITH GRAVE + 0x00E1, //98 #LATIN SMALL LETTER A WITH ACUTE + 0x00E2, //99 #LATIN SMALL LETTER A WITH CIRCUMFLEX + 0x0103, //100 #LATIN SMALL LETTER A WITH BREVE + 0x00E4, //101 #LATIN SMALL LETTER A WITH DIAERESIS + 0x00E5, //102 #LATIN SMALL LETTER A WITH RING ABOVE + 0x00E6, //103 #LATIN SMALL LETTER AE + 0x00E7, //104 #LATIN SMALL LETTER C WITH CEDILLA + 0x00E8, //105 #LATIN SMALL LETTER E WITH GRAVE + 0x00E9, //106 #LATIN SMALL LETTER E WITH ACUTE + 0x00EA, //107 #LATIN SMALL LETTER E WITH CIRCUMFLEX + 0x00EB, //108 #LATIN SMALL LETTER E WITH DIAERESIS + 0x0301, //109 #COMBINING ACUTE ACCENT + 0x00ED, //110 #LATIN SMALL LETTER I WITH ACUTE + 0x00EE, //111 #LATIN SMALL LETTER I WITH CIRCUMFLEX + 0x00EF, //112 #LATIN SMALL LETTER I WITH DIAERESIS + 0x0111, //113 #LATIN SMALL LETTER D WITH STROKE + 0x00F1, //114 #LATIN SMALL LETTER N WITH TILDE + 0x0323, //115 #COMBINING DOT BELOW + 0x00F3, //116 #LATIN SMALL LETTER O WITH ACUTE + 0x00F4, //117 #LATIN SMALL LETTER O WITH CIRCUMFLEX + 0x01A1, //118 #LATIN SMALL LETTER O WITH HORN + 0x00F6, //119 #LATIN SMALL LETTER O WITH DIAERESIS + 0x00F7, //120 #DIVISION SIGN + 0x00F8, //121 #LATIN SMALL LETTER O WITH STROKE + 0x00F9, //122 #LATIN SMALL LETTER U WITH GRAVE + 0x00FA, //123 #LATIN SMALL LETTER U WITH ACUTE + 0x00FB, //124 #LATIN SMALL LETTER U WITH CIRCUMFLEX + 0x00FC, //125 #LATIN SMALL LETTER U WITH DIAERESIS + 0x01B0, //126 #LATIN SMALL LETTER U WITH HORN + 0x20AB, //127 #DONG SIGN + 0x00FF //128 #LATIN SMALL LETTER Y WITH DIAERESIS +}; + +#endif // DRW_CPTABLES_H diff --git a/extlib/libdxfrw/intern/drw_dbg.cpp b/extlib/libdxfrw/intern/drw_dbg.cpp new file mode 100644 index 0000000..d999edf --- /dev/null +++ b/extlib/libdxfrw/intern/drw_dbg.cpp @@ -0,0 +1,164 @@ +/****************************************************************************** +** libDXFrw - Library to read/write DXF files (ascii & binary) ** +** ** +** Copyright (C) 2011-2015 José F. Soriano, rallazz@gmail.com ** +** ** +** This library is free software, licensed under the terms of the GNU ** +** General Public License as published by the Free Software Foundation, ** +** either version 2 of the License, or (at your option) any later version. ** +** You should have received a copy of the GNU General Public License ** +** along with this program. If not, see . ** +******************************************************************************/ + +#include +#include +#include "drw_dbg.h" + +DRW_dbg *DRW_dbg::instance= NULL; + +/*********private clases*************/ +class print_none { +public: + virtual void printS(std::string s){(void)s;} + virtual void printI(long long int i){(void)i;} + virtual void printUI(long long unsigned int i){(void)i;} + virtual void printD(double d){(void)d;} + virtual void printH(long long int i){(void)i;} + virtual void printB(int i){(void)i;} + virtual void printHL(int c, int s, int h){(void)c;(void)s;(void)h;} + virtual void printPT(double x, double y, double z){(void)x;(void)y;(void)z;} + print_none(){} + virtual ~print_none(){} +}; + +class print_debug : public print_none { +public: + virtual void printS(std::string s); + virtual void printI(long long int i); + virtual void printUI(long long unsigned int i); + virtual void printD(double d); + virtual void printH(long long int i); + virtual void printB(int i); + virtual void printHL(int c, int s, int h); + virtual void printPT(double x, double y, double z); + print_debug(); + virtual ~print_debug(){} +private: + std::ios_base::fmtflags flags; +}; + +/********* debug class *************/ +DRW_dbg *DRW_dbg::getInstance(){ + if (instance == NULL){ + instance = new DRW_dbg; + } + return instance; +} + +DRW_dbg::DRW_dbg(){ + level = NONE; + prClass = new print_none; + flags = std::cerr.flags(); +} + +void DRW_dbg::setLevel(LEVEL lvl){ + level = lvl; + delete prClass; + switch (level){ + case DEBUG: + prClass = new print_debug; + break; + default: + prClass = new print_none; + } +} + +DRW_dbg::LEVEL DRW_dbg::getLevel(){ + return level; +} + +void DRW_dbg::print(std::string s){ + prClass->printS(s); +} + +void DRW_dbg::print(int i){ + prClass->printI(i); +} + +void DRW_dbg::print(unsigned int i){ + prClass->printUI(i); +} + +void DRW_dbg::print(long long int i){ + prClass->printI(i); +} + +void DRW_dbg::print(long unsigned int i){ + prClass->printUI(i); +} + +void DRW_dbg::print(long long unsigned int i){ + prClass->printUI(i); +} + +void DRW_dbg::print(double d){ + prClass->printD(d); +} + +void DRW_dbg::printH(long long int i){ + prClass->printH(i); +} + +void DRW_dbg::printB(int i){ + prClass->printB(i); +} +void DRW_dbg::printHL(int c, int s, int h){ + prClass->printHL(c, s, h); +} + +void DRW_dbg::printPT(double x, double y, double z){ + prClass->printPT(x, y, z); +} + +print_debug::print_debug(){ + flags = std::cerr.flags(); +} + +void print_debug::printS(std::string s){ + std::cerr << s; +} + +void print_debug::printI(long long int i){ + std::cerr << i; +} + +void print_debug::printUI(long long unsigned int i){ + std::cerr << i; +} + +void print_debug::printD(double d){ + std::cerr << std::fixed << d; +} + +void print_debug::printH(long long i){ + std::cerr << "0x" << std::setw(2) << std::setfill('0'); + std::cerr << std::hex << i; + std::cerr.flags(flags); +} + +void print_debug::printB(int i){ + std::cerr << std::setw(8) << std::setfill('0'); + std::cerr << std::setbase(2) << i; + std::cerr.flags(flags); +} + +void print_debug::printHL(int c, int s, int h){ + std::cerr << c << '.' << s << '.'; + std::cerr << "0x" << std::setw(2) << std::setfill('0'); + std::cerr << std::hex << h; + std::cerr.flags(flags); +} + +void print_debug::printPT(double x, double y, double z){ + std::cerr << std::fixed << "x: " << x << ", y: " << y << ", z: "<< z; +} diff --git a/extlib/libdxfrw/intern/drw_dbg.h b/extlib/libdxfrw/intern/drw_dbg.h new file mode 100644 index 0000000..a494c9c --- /dev/null +++ b/extlib/libdxfrw/intern/drw_dbg.h @@ -0,0 +1,61 @@ +/****************************************************************************** +** libDXFrw - Library to read/write DXF files (ascii & binary) ** +** ** +** Copyright (C) 2011-2015 José F. Soriano, rallazz@gmail.com ** +** ** +** This library is free software, licensed under the terms of the GNU ** +** General Public License as published by the Free Software Foundation, ** +** either version 2 of the License, or (at your option) any later version. ** +** You should have received a copy of the GNU General Public License ** +** along with this program. If not, see . ** +******************************************************************************/ + +#ifndef DRW_DBG_H +#define DRW_DBG_H + +#include +#include +//#include + +#define DRW_DBGSL(a) DRW_dbg::getInstance()->setLevel(a) +#define DRW_DBGGL DRW_dbg::getInstance()->getLevel() +#define DRW_DBG(a) DRW_dbg::getInstance()->print(a) +#define DRW_DBGH(a) DRW_dbg::getInstance()->printH(a) +#define DRW_DBGB(a) DRW_dbg::getInstance()->printB(a) +#define DRW_DBGHL(a, b, c) DRW_dbg::getInstance()->printHL(a, b ,c) +#define DRW_DBGPT(a, b, c) DRW_dbg::getInstance()->printPT(a, b, c) + + +class print_none; + +class DRW_dbg { +public: + enum LEVEL { + NONE, + DEBUG + }; + void setLevel(LEVEL lvl); + LEVEL getLevel(); + static DRW_dbg *getInstance(); + void print(std::string s); + void print(int i); + void print(unsigned int i); + void print(long long int i); + void print(long unsigned int i); + void print(long long unsigned int i); + void print(double d); + void printH(long long int i); + void printB(int i); + void printHL(int c, int s, int h); + void printPT(double x, double y, double z); + +private: + DRW_dbg(); + static DRW_dbg *instance; + LEVEL level; + std::ios_base::fmtflags flags; + print_none* prClass; +}; + + +#endif // DRW_DBG_H diff --git a/extlib/libdxfrw/intern/drw_textcodec.cpp b/extlib/libdxfrw/intern/drw_textcodec.cpp new file mode 100644 index 0000000..673c79c --- /dev/null +++ b/extlib/libdxfrw/intern/drw_textcodec.cpp @@ -0,0 +1,535 @@ +#include "drw_textcodec.h" +#include +#include +#include +#include "../drw_base.h" +#include "drw_cptables.h" +#include "drw_cptable932.h" +#include "drw_cptable936.h" +#include "drw_cptable949.h" +#include "drw_cptable950.h" + +DRW_TextCodec::DRW_TextCodec() { + version = DRW::AC1021; + conv = new DRW_Converter(NULL, 0); +} + +DRW_TextCodec::~DRW_TextCodec() { + delete conv; +} + +void DRW_TextCodec::setVersion(int v, bool dxfFormat){ + if (v == DRW::AC1009 || v == DRW::AC1006) { + version = DRW::AC1009; + cp = "ANSI_1252"; + setCodePage(&cp, dxfFormat); + } else if (v == DRW::AC1012 || v == DRW::AC1014 + || v == DRW::AC1015 || v == DRW::AC1018) { + version = DRW::AC1015; +// if (cp.empty()) { //codepage not set, initialize + cp = "ANSI_1252"; + setCodePage(&cp, dxfFormat); +// } + } else { + version = DRW::AC1021; + if (dxfFormat) + cp = "UTF-8";//RLZ: can be UCS2 or UTF-16 16bits per char + else + cp = "UTF-16";//RLZ: can be UCS2 or UTF-16 16bits per char + setCodePage(&cp, dxfFormat); + } +} + +void DRW_TextCodec::setVersion(std::string *v, bool dxfFormat){ + std::string versionStr = *v; + if (versionStr == "AC1009" || versionStr == "AC1006") { + setVersion(DRW::AC1009, dxfFormat); + } else if (versionStr == "AC1012" || versionStr == "AC1014" + || versionStr == "AC1015" || versionStr == "AC1018") { + setVersion(DRW::AC1015, dxfFormat); + } + setVersion(DRW::AC1021, dxfFormat); +} + +void DRW_TextCodec::setCodePage(std::string *c, bool dxfFormat){ + cp = correctCodePage(*c); + delete conv; + if (version == DRW::AC1009 || version == DRW::AC1015) { + if (cp == "ANSI_874") + conv = new DRW_ConvTable(DRW_Table874, CPLENGHTCOMMON); + else if (cp == "ANSI_932") + conv = new DRW_Conv932Table(DRW_Table932, DRW_LeadTable932, + DRW_DoubleTable932, CPLENGHT932); + else if (cp == "ANSI_936") + conv = new DRW_ConvDBCSTable(DRW_Table936, DRW_LeadTable936, + DRW_DoubleTable936, CPLENGHT936); + else if (cp == "ANSI_949") + conv = new DRW_ConvDBCSTable(DRW_Table949, DRW_LeadTable949, + DRW_DoubleTable949, CPLENGHT949); + else if (cp == "ANSI_950") + conv = new DRW_ConvDBCSTable(DRW_Table950, DRW_LeadTable950, + DRW_DoubleTable950, CPLENGHT950); + else if (cp == "ANSI_1250") + conv = new DRW_ConvTable(DRW_Table1250, CPLENGHTCOMMON); + else if (cp == "ANSI_1251") + conv = new DRW_ConvTable(DRW_Table1251, CPLENGHTCOMMON); + else if (cp == "ANSI_1253") + conv = new DRW_ConvTable(DRW_Table1253, CPLENGHTCOMMON); + else if (cp == "ANSI_1254") + conv = new DRW_ConvTable(DRW_Table1254, CPLENGHTCOMMON); + else if (cp == "ANSI_1255") + conv = new DRW_ConvTable(DRW_Table1255, CPLENGHTCOMMON); + else if (cp == "ANSI_1256") + conv = new DRW_ConvTable(DRW_Table1256, CPLENGHTCOMMON); + else if (cp == "ANSI_1257") + conv = new DRW_ConvTable(DRW_Table1257, CPLENGHTCOMMON); + else if (cp == "ANSI_1258") + conv = new DRW_ConvTable(DRW_Table1258, CPLENGHTCOMMON); + else if (cp == "UTF-8") { //DXF older than 2007 are write in win codepages + cp = "ANSI_1252"; + conv = new DRW_Converter(NULL, 0); + } else + conv = new DRW_ConvTable(DRW_Table1252, CPLENGHTCOMMON); + } else { + if (dxfFormat) + conv = new DRW_Converter(NULL, 0);//utf16 to utf8 + else + conv = new DRW_ConvUTF16();//utf16 to utf8 + } +} + +std::string DRW_TextCodec::toUtf8(std::string s) { + return conv->toUtf8(&s); +} + +std::string DRW_TextCodec::fromUtf8(std::string s) { + return conv->fromUtf8(&s); +} + +std::string DRW_Converter::toUtf8(std::string *s) { + std::string result; + int j = 0; + unsigned int i= 0; + for (i=0; i < s->length(); i++) { + unsigned char c = s->at(i); + if (c < 0x80) { //ascii check for /U+???? + if (c == '\\' && i+6 < s->length() && s->at(i+1) == 'U' && s->at(i+2) == '+') { + result += s->substr(j,i-j); + result += encodeText(s->substr(i,7)); + i +=6; + j = i+1; + } + } else if (c < 0xE0 ) {//2 bits + i++; + } else if (c < 0xF0 ) {//3 bits + i +=2; + } else if (c < 0xF8 ) {//4 bits + i +=3; + } + } + result += s->substr(j); + + return result; +} + +std::string DRW_ConvTable::fromUtf8(std::string *s) { + std::string result; + bool notFound; + int code; + + int j = 0; + for (unsigned int i=0; i < s->length(); i++) { + unsigned char c = s->at(i); + if (c > 0x7F) { //need to decode + result += s->substr(j,i-j); + std::string part1 = s->substr(i,4); + int l; + code = decodeNum(part1, &l); + j = i+l; + i = j - 1; + notFound = true; + for (int k=0; ksubstr(j); + + return result; +} + +std::string DRW_ConvTable::toUtf8(std::string *s) { + std::string res; + std::string::iterator it; + for ( it=s->begin() ; it < s->end(); ++it ) { + unsigned char c = *it; + if (c < 0x80) { + //check for \U+ encoded text + if (c == '\\') { + if (it+6 < s->end() && *(it+1) == 'U' && *(it+2) == '+') { + res += encodeText(std::string(it, it+7)); + it +=6; + } else { + res +=c; //no \U+ encoded text write + } + } else + res +=c; //c!='\' ascii char write + } else {//end c < 0x80 + res += encodeNum(table[c-0x80]); //translate from table + } + } //end for + + return res; +} + +std::string DRW_Converter::encodeText(std::string stmp){ + int code; +#if defined(__APPLE__) + int Succeeded = sscanf (&( stmp.substr(3,4)[0]), "%x", &code ); + if ( !Succeeded || Succeeded == EOF ) + code = 0; +#else + std::istringstream sd(stmp.substr(3,4)); + sd >> std::hex >> code; +#endif + return encodeNum(code); +} + +std::string DRW_Converter::decodeText(int c){ + std::string res = "\\U+"; + std::string num; +#if defined(__APPLE__) + std::string str(16, '\0'); + snprintf (&(str[0]), 16, "%04X", c ); + num = str; +#else + std::stringstream ss; + ss << std::uppercase << std::setfill('0') << std::setw(4) << std::hex << c; + ss >> num; +#endif + res += num; + return res; +} + +std::string DRW_Converter::encodeNum(int c){ + unsigned char ret[5]; + if (c < 128) { // 0-7F US-ASCII 7 bits + ret[0] = c; + ret[1] = 0; + } else if (c < 0x800) { //80-07FF 2 bytes + ret[0] = 0xC0 | (c >> 6); + ret[1] = 0x80 | (c & 0x3f); + ret[2] = 0; + } else if (c< 0x10000) { //800-FFFF 3 bytes + ret[0] = 0xe0 | (c >> 12); + ret[1] = 0x80 | ((c >> 6) & 0x3f); + ret[2] = 0x80 | (c & 0x3f); + ret[3] = 0; + } else { //10000-10FFFF 4 bytes + ret[0] = 0xf0 | (c >> 18); + ret[1] = 0x80 | ((c >> 12) & 0x3f); + ret[2] = 0x80 | ((c >> 6) & 0x3f); + ret[3] = 0x80 | (c & 0x3f); + ret[4] = 0; + } + return std::string((char*)ret); +} + +/** 's' is a string with at least 4 bytes lenght +** returned 'b' is byte lenght of encoded char: 2,3 or 4 +**/ +int DRW_Converter::decodeNum(std::string s, int *b){ + int code= 0; + unsigned char c = s.at(0); + if ( (c& 0xE0) == 0xC0) { //2 bytes + code = ( c&0x1F)<<6; + code = (s.at(1) &0x3F) | code; + *b = 2; + } else if ( (c& 0xF0) == 0xE0) { //3 bytes + code = ( c&0x0F)<<12; + code = ((s.at(1) &0x3F)<<6) | code; + code = (s.at(2) &0x3F) | code; + *b = 3; + } else if ( (c& 0xF8) == 0xF0) { //4 bytes + code = ( c&0x07)<<18; + code = ((s.at(1) &0x3F)<<12) | code; + code = ((s.at(2) &0x3F)<<6) | code; + code = (s.at(3) &0x3F) | code; + *b = 4; + } + + return code; +} + + +std::string DRW_ConvDBCSTable::fromUtf8(std::string *s) { + std::string result; + bool notFound; + int code; + + int j = 0; + for (unsigned int i=0; i < s->length(); i++) { + unsigned char c = s->at(i); + if (c > 0x7F) { //need to decode + result += s->substr(j,i-j); + std::string part1 = s->substr(i,4); + int l; + code = decodeNum(part1, &l); + j = i+l; + i = j - 1; + notFound = true; + for (int k=0; k> 8; + d[1] = data & 0xFF; + d[2]= '\0'; + result += d; //translate from table + notFound = false; + break; + } + } + if (notFound) + result += decodeText(code); + } //direct conversion + } + result += s->substr(j); + + return result; +} + +std::string DRW_ConvDBCSTable::toUtf8(std::string *s) { + std::string res; + std::string::iterator it; + for ( it=s->begin() ; it < s->end(); ++it ) { + bool notFound = true; + unsigned char c = *it; + if (c < 0x80) { + notFound = false; + //check for \U+ encoded text + if (c == '\\') { + if (it+6 < s->end() && *(it+1) == 'U' && *(it+2) == '+') { + res += encodeText(std::string(it, it+7)); + it +=6; + } else { + res +=c; //no \U+ encoded text write + } + } else + res +=c; //c!='\' ascii char write + } else if(c == 0x80 ){//1 byte table + notFound = false; + res += encodeNum(0x20AC);//euro sign + } else {//2 bytes + ++it; + int code = (c << 8) | (unsigned char )(*it); + int sta = leadTable[c-0x81]; + int end = leadTable[c-0x80]; + for (int k=sta; klength(); i++) { + unsigned char c = s->at(i); + if (c > 0x7F) { //need to decode + result += s->substr(j,i-j); + std::string part1 = s->substr(i,4); + int l; + code = decodeNum(part1, &l); + j = i+l; + i = j - 1; + notFound = true; + // 1 byte table + if (code > 0xff60 && code < 0xFFA0) { + result += code - CPOFFSET932; //translate from table + notFound = false; + } + if (notFound && ( code<0xF8 || (code>0x390 && code<0x542) || + (code>0x200F && code<0x9FA1) || code>0xF928 )) { + for (int k=0; k> 8; + d[1] = data & 0xFF; + d[2]= '\0'; + result += d; //translate from table + notFound = false; + break; + } + } + } + if (notFound) + result += decodeText(code); + } //direct conversion + } + result += s->substr(j); + + return result; +} + +std::string DRW_Conv932Table::toUtf8(std::string *s) { + std::string res; + std::string::iterator it; + for ( it=s->begin() ; it < s->end(); ++it ) { + bool notFound = true; + unsigned char c = *it; + if (c < 0x80) { + notFound = false; + //check for \U+ encoded text + if (c == '\\') { + if (it+6 < s->end() && *(it+1) == 'U' && *(it+2) == '+') { + res += encodeText(std::string(it, it+7)); + it +=6; + } else { + res +=c; //no \U+ encoded text write + } + } else + res +=c; //c!='\' ascii char write + } else if(c > 0xA0 && c < 0xE0 ){//1 byte table + notFound = false; + res += encodeNum(c + CPOFFSET932); //translate from table + } else {//2 bytes + ++it; + int code = (c << 8) | (unsigned char )(*it); + int sta; + int end=0; + if (c > 0x80 && c < 0xA0) { + sta = DRW_LeadTable932[c-0x81]; + end = DRW_LeadTable932[c-0x80]; + } else if (c > 0xDF && c < 0xFD){ + sta = DRW_LeadTable932[c-0xC1]; + end = DRW_LeadTable932[c-0xC0]; + } + if (end > 0) { + for (int k=sta; kbegin() ; it < s->end(); ++it ) { + unsigned char c1 = *it; + unsigned char c2 = *(++it); + duint16 ch = (c2 <<8) | c1; + res +=encodeNum(ch); + } //end for + + return res; +} + +std::string DRW_TextCodec::correctCodePage(const std::string& s) { + //stringstream cause crash in OS/X, bug#3597944 + std::string cp=s; + transform(cp.begin(), cp.end(), cp.begin(), toupper); + //Latin/Thai + if (cp=="ANSI_874" || cp=="CP874" || cp=="ISO8859-11" || cp=="TIS-620") { + return "ANSI_874"; + //Central Europe and Eastern Europe + } else if (cp=="ANSI_1250" || cp=="CP1250" || cp=="ISO8859-2") { + return "ANSI_1250"; + //Cyrillic script + } else if (cp=="ANSI_1251" || cp=="CP1251" || cp=="ISO8859-5" || cp=="KOI8-R" || + cp=="KOI8-U" || cp=="IBM 866") { + return "ANSI_1251"; + //Western Europe + } else if (cp=="ANSI_1252" || cp=="CP1252" || cp=="LATIN1" || cp=="ISO-8859-1" || + cp=="CP819" || cp=="CSISO" || cp=="IBM819" || cp=="ISO_8859-1" || cp=="APPLE ROMAN" || + cp=="ISO8859-1" || cp=="ISO8859-15" || cp=="ISO-IR-100" || cp=="L1" || cp=="IBM 850") { + return "ANSI_1252"; + //Greek + } else if (cp=="ANSI_1253" || cp=="CP1253" || cp=="iso8859-7") { + return "ANSI_1253"; + //Turkish + } else if (cp=="ANSI_1254" || cp=="CP1254" || cp=="iso8859-9" || cp=="iso8859-3") { + return "ANSI_1254"; + //Hebrew + } else if (cp=="ANSI_1255" || cp=="CP1255" || cp=="iso8859-8") { + return "ANSI_1255"; + //Arabic + } else if (cp=="ANSI_1256" || cp=="CP1256" || cp=="ISO8859-6") { + return "ANSI_1256"; + //Baltic + } else if (cp=="ANSI_1257" || cp=="CP1257" || cp=="ISO8859-4" || cp=="ISO8859-10" || cp=="ISO8859-13") { + return "ANSI_1257"; + //Vietnamese + } else if (cp=="ANSI_1258" || cp=="CP1258") { + return "ANSI_1258"; + + //Japanese + } else if (cp=="ANSI_932" || cp=="SHIFT-JIS" || cp=="SHIFT_JIS" || cp=="CSSHIFTJIS" || + cp=="CSWINDOWS31J" || cp=="MS_KANJI" || cp=="X-MS-CP932" || cp=="X-SJIS" || + cp=="EUCJP" || cp=="EUC-JP" || cp=="CSEUCPKDFMTJAPANESE" || cp=="X-EUC" || + cp=="X-EUC-JP" || cp=="JIS7") { + return "ANSI_932"; + //Chinese PRC GBK (XGB) simplified + } else if (cp=="ANSI_936" || cp=="GBK" || cp=="GB2312" || cp=="CHINESE" || cp=="CN-GB" || + cp=="CSGB2312" || cp=="CSGB231280" || cp=="CSISO58BG231280" || + cp=="GB_2312-80" || cp=="GB231280" || cp=="GB2312-80" || + cp=="ISO-IR-58" || cp=="GB18030") { + return "ANSI_936"; + //Korean + } else if (cp=="ANSI_949" || cp=="EUCKR") { + return "ANSI_949"; + //Chinese Big5 (Taiwan, Hong Kong SAR) + } else if (cp=="ANSI_950" || cp=="BIG5" || cp=="CN-BIG5" || cp=="CSBIG5" || + cp=="X-X-BIG5" || cp=="BIG5-HKSCS") { + return "ANSI_950"; + +//celtic +/* } else if (cp=="ISO8859-14") { + return "ISO8859-14"; + } else if (cp=="TSCII") { + return "TSCII"; //tamil + }*/ + + } else if (cp=="UTF-8" || cp=="UTF8" || cp=="UTF8-BIT") { + return "UTF-8"; + } else if (cp=="UTF-16" || cp=="UTF16" || cp=="UTF16-BIT") { + return "UTF-16"; + } + + return "ANSI_1252"; +} diff --git a/extlib/libdxfrw/intern/drw_textcodec.h b/extlib/libdxfrw/intern/drw_textcodec.h new file mode 100644 index 0000000..0a6d39d --- /dev/null +++ b/extlib/libdxfrw/intern/drw_textcodec.h @@ -0,0 +1,91 @@ +#ifndef DRW_TEXTCODEC_H +#define DRW_TEXTCODEC_H + +#include + +class DRW_Converter; + +class DRW_TextCodec +{ +public: + DRW_TextCodec(); + ~DRW_TextCodec(); + std::string fromUtf8(std::string s); + std::string toUtf8(std::string s); + int getVersion(){return version;} + void setVersion(std::string *v, bool dxfFormat); + void setVersion(int v, bool dxfFormat); + void setCodePage(std::string *c, bool dxfFormat); + void setCodePage(std::string c, bool dxfFormat){setCodePage(&c, dxfFormat);} + std::string getCodePage(){return cp;} + +private: + std::string correctCodePage(const std::string& s); + +private: + int version; + std::string cp; + DRW_Converter *conv; +}; + +class DRW_Converter +{ +public: + DRW_Converter(const int *t, int l){table = t; + cpLenght = l;} + virtual ~DRW_Converter(){} + virtual std::string fromUtf8(std::string *s) {return *s;} + virtual std::string toUtf8(std::string *s); + std::string encodeText(std::string stmp); + std::string decodeText(int c); + std::string encodeNum(int c); + int decodeNum(std::string s, int *b); + const int *table; + int cpLenght; +}; + +class DRW_ConvUTF16 : public DRW_Converter { +public: + DRW_ConvUTF16():DRW_Converter(NULL, 0) {} + virtual std::string fromUtf8(std::string *s); + virtual std::string toUtf8(std::string *s); +}; + +class DRW_ConvTable : public DRW_Converter { +public: + DRW_ConvTable(const int *t, int l):DRW_Converter(t, l) {} + virtual std::string fromUtf8(std::string *s); + virtual std::string toUtf8(std::string *s); +}; + +class DRW_ConvDBCSTable : public DRW_Converter { +public: + DRW_ConvDBCSTable(const int *t, const int *lt, const int dt[][2], int l):DRW_Converter(t, l) { + leadTable = lt; + doubleTable = dt; + } + + virtual std::string fromUtf8(std::string *s); + virtual std::string toUtf8(std::string *s); +private: + const int *leadTable; + const int (*doubleTable)[2]; + +}; + +class DRW_Conv932Table : public DRW_Converter { +public: + DRW_Conv932Table(const int *t, const int *lt, const int dt[][2], int l):DRW_Converter(t, l) { + leadTable = lt; + doubleTable = dt; + } + + virtual std::string fromUtf8(std::string *s); + virtual std::string toUtf8(std::string *s); +private: + const int *leadTable; + const int (*doubleTable)[2]; + +}; + +#endif // DRW_TEXTCODEC_H diff --git a/extlib/libdxfrw/intern/dwgbuffer.cpp b/extlib/libdxfrw/intern/dwgbuffer.cpp new file mode 100644 index 0000000..8bf914f --- /dev/null +++ b/extlib/libdxfrw/intern/dwgbuffer.cpp @@ -0,0 +1,923 @@ +/****************************************************************************** +** libDXFrw - Library to read/write DXF files (ascii & binary) ** +** ** +** Copyright (C) 2011-2015 José F. Soriano, rallazz@gmail.com ** +** ** +** This library is free software, licensed under the terms of the GNU ** +** General Public License as published by the Free Software Foundation, ** +** either version 2 of the License, or (at your option) any later version. ** +** You should have received a copy of the GNU General Public License ** +** along with this program. If not, see . ** +******************************************************************************/ + + +#include "dwgbuffer.h" +#include "../libdwgr.h" +#include "drw_textcodec.h" +#include "drw_dbg.h" +//#include +/*#include +#include +#include +#include "dwgreader.h"*/ +//#include "dxfwriter.h" + + +//#define FIRSTHANDLE 48 + +/*enum sections { + secUnknown, + secHeader, + secTables, + secBlocks, + secEntities, + secObjects +};*/ + +static unsigned int crctable[256]= { +0x0000,0xC0C1,0xC181,0x0140,0xC301,0x03C0,0x0280,0xC241, +0xC601,0x06C0,0x0780,0xC741,0x0500,0xC5C1,0xC481,0x0440, +0xCC01,0x0CC0,0x0D80,0xCD41,0x0F00,0xCFC1,0xCE81,0x0E40, +0x0A00,0xCAC1,0xCB81,0x0B40,0xC901,0x09C0,0x0880,0xC841, +0xD801,0x18C0,0x1980,0xD941,0x1B00,0xDBC1,0xDA81,0x1A40, +0x1E00,0xDEC1,0xDF81,0x1F40,0xDD01,0x1DC0,0x1C80,0xDC41, +0x1400,0xD4C1,0xD581,0x1540,0xD701,0x17C0,0x1680,0xD641, +0xD201,0x12C0,0x1380,0xD341,0x1100,0xD1C1,0xD081,0x1040, +0xF001,0x30C0,0x3180,0xF141,0x3300,0xF3C1,0xF281,0x3240, +0x3600,0xF6C1,0xF781,0x3740,0xF501,0x35C0,0x3480,0xF441, +0x3C00,0xFCC1,0xFD81,0x3D40,0xFF01,0x3FC0,0x3E80,0xFE41, +0xFA01,0x3AC0,0x3B80,0xFB41,0x3900,0xF9C1,0xF881,0x3840, +0x2800,0xE8C1,0xE981,0x2940,0xEB01,0x2BC0,0x2A80,0xEA41, +0xEE01,0x2EC0,0x2F80,0xEF41,0x2D00,0xEDC1,0xEC81,0x2C40, +0xE401,0x24C0,0x2580,0xE541,0x2700,0xE7C1,0xE681,0x2640, +0x2200,0xE2C1,0xE381,0x2340,0xE101,0x21C0,0x2080,0xE041, +0xA001,0x60C0,0x6180,0xA141,0x6300,0xA3C1,0xA281,0x6240, +0x6600,0xA6C1,0xA781,0x6740,0xA501,0x65C0,0x6480,0xA441, +0x6C00,0xACC1,0xAD81,0x6D40,0xAF01,0x6FC0,0x6E80,0xAE41, +0xAA01,0x6AC0,0x6B80,0xAB41,0x6900,0xA9C1,0xA881,0x6840, +0x7800,0xB8C1,0xB981,0x7940,0xBB01,0x7BC0,0x7A80,0xBA41, +0xBE01,0x7EC0,0x7F80,0xBF41,0x7D00,0xBDC1,0xBC81,0x7C40, +0xB401,0x74C0,0x7580,0xB541,0x7700,0xB7C1,0xB681,0x7640, +0x7200,0xB2C1,0xB381,0x7340,0xB101,0x71C0,0x7080,0xB041, +0x5000,0x90C1,0x9181,0x5140,0x9301,0x53C0,0x5280,0x9241, +0x9601,0x56C0,0x5780,0x9741,0x5500,0x95C1,0x9481,0x5440, +0x9C01,0x5CC0,0x5D80,0x9D41,0x5F00,0x9FC1,0x9E81,0x5E40, +0x5A00,0x9AC1,0x9B81,0x5B40,0x9901,0x59C0,0x5880,0x9841, +0x8801,0x48C0,0x4980,0x8941,0x4B00,0x8BC1,0x8A81,0x4A40, +0x4E00,0x8EC1,0x8F81,0x4F40,0x8D01,0x4DC0,0x4C80,0x8C41, +0x4400,0x84C1,0x8581,0x4540,0x8701,0x47C0,0x4680,0x8641, +0x8201,0x42C0,0x4380,0x8341,0x4100,0x81C1,0x8081,0x4040 }; + +static unsigned int crc32Table[256] ={ +0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 0x706af48f, 0xe963a535, 0x9e6495a3, +0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988, 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91, +0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de, 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, +0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9, 0xfa0f3d63, 0x8d080df5, +0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172, 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, +0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59, +0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423, 0xcfba9599, 0xb8bda50f, +0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924, 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, +0x76dc4190, 0x01db7106, 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433, +0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01, +0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, 0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457, +0x65b0d9c6, 0x12b7e950, 0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65, +0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, 0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb, +0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0, 0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9, +0x5005713c, 0x270241aa, 0xbe0b1010, 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f, +0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, 0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad, +0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a, 0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683, +0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8, 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1, +0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb, 0x196c3671, 0x6e6b06e7, +0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc, 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, +0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b, +0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55, 0x316e8eef, 0x4669be79, +0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236, 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, +0xc5ba3bbe, 0xb2bd0b28, 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d, +0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a, 0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713, +0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, 0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, +0x86d3d2d4, 0xf1d4e242, 0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777, +0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, 0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45, +0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2, 0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db, +0xaed16a4a, 0xd9d65adc, 0x40df0b66, 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9, +0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605, 0xcdd70693, 0x54de5729, 0x23d967bf, +0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94, 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d}; + +union typeCast { + char buf[8]; + duint16 i16; + duint32 i32; + duint64 i64; + ddouble64 d64; +}; + +bool dwgFileStream::setPos(duint64 p){ + if (p >= sz) + return false; + + stream->seekg(p); + return stream->good(); +} + +bool dwgFileStream::read(duint8* s, duint64 n){ + stream->read (reinterpret_cast(s),n); + return stream->good(); +} + +bool dwgCharStream::setPos(duint64 p){ + if (p > size()) { + isOk = false; + return false; + } + + pos = p; + return true; +} + +bool dwgCharStream::read(duint8* s, duint64 n){ + if ( n > (sz - pos) ) { + isOk = false; + return false; + } + for (duint64 i=0; isize(); + bitPos = 0; +} + +dwgBuffer::dwgBuffer( const dwgBuffer& org ){ + filestr = org.filestr->clone(); + decoder = org.decoder; + maxSize = filestr->size(); + currByte = org.currByte; + bitPos = org.bitPos; +} + +dwgBuffer& dwgBuffer::operator=( const dwgBuffer& org ){ + filestr = org.filestr->clone(); + decoder = org.decoder; + maxSize = filestr->size(); + currByte = org.currByte; + bitPos = org.bitPos; + return *this; +} + +dwgBuffer::~dwgBuffer(){ + delete filestr; +} + +/**Gets the current byte position in buffer **/ +duint64 dwgBuffer::getPosition(){ + if (bitPos != 0) + return filestr->getPos() -1; + return filestr->getPos(); + } + +/**Sets the buffer position in pos byte, reset the bit position **/ +bool dwgBuffer::setPosition(duint64 pos){ + bitPos = 0; +/* if (pos>=maxSize) + return false;*/ + return filestr->setPos(pos); +// return true; +} + +//RLZ: Fails if ... ??? +void dwgBuffer::setBitPos(duint8 pos){ + if (pos>7) + return; + if (pos != 0 && bitPos == 0){ + duint8 buffer; + filestr->read (&buffer,1); + currByte = buffer; + } + if (pos == 0 && bitPos != 0){//reset current byte + filestr->setPos(filestr->getPos()-1); + } + bitPos = pos; +} + +bool dwgBuffer::moveBitPos(dint32 size){ + if (size == 0) return true; + + dint32 b= size + bitPos; + filestr->setPos(getPosition() + (b >> 3) ); + bitPos = b & 7; + + if (bitPos != 0){ + filestr->read (&currByte,1); + } + return filestr->good(); +} + +/**Reads one Bit returns a char with value 0/1 (B) **/ +duint8 dwgBuffer::getBit(){ + duint8 buffer; + duint8 ret = 0; + if (bitPos == 0){ + filestr->read (&buffer,1); + currByte = buffer; + } + + ret = (currByte >> (7 - bitPos) & 1); + bitPos +=1; + if (bitPos == 8) + bitPos = 0; + + return ret; +} + +/**Reads one Bit returns a bool value 0==false 1==true (B) **/ +bool dwgBuffer::getBoolBit(){ + return (getBit() != 0); +} + +/**Reads two Bits returns a char (BB) **/ +duint8 dwgBuffer::get2Bits(){ + duint8 buffer; + duint8 ret = 0; + if (bitPos == 0){ + filestr->read (&buffer,1); + currByte = buffer; + } + + bitPos +=2; + if (bitPos < 9) + ret = currByte >>(8 - bitPos); + else {//read one bit per byte + ret = currByte << 1; + filestr->read (&buffer,1); + currByte = buffer; + bitPos = 1; + ret = ret | currByte >> 7; + } + if (bitPos == 8) + bitPos = 0; + ret = ret & 3; + return ret; +} + +/**Reads thee Bits returns a char (3B) **/ +//RLZ: todo verify this +duint8 dwgBuffer::get3Bits(){ + duint8 buffer; + duint8 ret = 0; + if (bitPos == 0){ + filestr->read (&buffer,1); + currByte = buffer; + } + + bitPos +=3; + if (bitPos < 9) + ret = currByte >>(8 - bitPos); + else {//read one bit per byte + ret = currByte << 1; + filestr->read (&buffer,1); + currByte = buffer; + bitPos = 1; + ret = ret | currByte >> 7; + } + if (bitPos == 8) + bitPos = 0; + ret = ret & 7; + return ret; +} + +/**Reads tree Bits returns a char (3B) for R24 **/ +//to be written + +/**Reads compresed Short (max. 16 + 2 bits) little-endian order, returns a UNsigned 16 bits (BS) **/ +duint16 dwgBuffer::getBitShort(){ + duint8 b = get2Bits(); + if (b == 0) + return getRawShort16(); + else if (b== 1) + return getRawChar8(); + else if (b == 2) + return 0; + else + return 256; +} +/**Reads compresed Short (max. 16 + 2 bits) little-endian order, returns a signed 16 bits (BS) **/ +dint16 dwgBuffer::getSBitShort(){ + duint8 b = get2Bits(); + if (b == 0) + return (dint16)getRawShort16(); + else if (b== 1) + return (dint16)getRawChar8(); + else if (b == 2) + return 0; + else + return 256; +} + +/**Reads compresed 32 bits Int (max. 32 + 2 bits) little-endian order, returns a signed 32 bits (BL) **/ +//to be written +dint32 dwgBuffer::getBitLong(){ + dint8 b = get2Bits(); + if (b == 0) + return getRawLong32(); + else if (b== 1) + return getRawChar8(); + else //if (b == 2) + return 0; +} + +/**Reads compresed 64 bits Int (max. 56 + 3 bits) little-endian order, returns a unsigned 64 bits (BLL) **/ +duint64 dwgBuffer::getBitLongLong(){ + dint8 b = get3Bits(); + duint64 ret=0; + for (duint8 i=0; iread (buffer,8); + } + double* ret = reinterpret_cast( buffer ); + return *ret; + } + // if (b == 2) + return 0.0; +} + +/**Reads 3 compresed Double (max. 64 + 2 bits) returns a DRW_Coord of floating point double of 64 bits (3BD) **/ +DRW_Coord dwgBuffer::get3BitDouble(){ + DRW_Coord crd; + crd.x = getBitDouble(); + crd.y = getBitDouble(); + crd.z = getBitDouble(); + return crd; +} + +/**Reads raw char 8 bits returns a unsigned char (RC) **/ +duint8 dwgBuffer::getRawChar8(){ + duint8 ret; + duint8 buffer; + filestr->read (&buffer,1); + if (bitPos == 0) + return buffer; + else { + ret = currByte << bitPos; + currByte = buffer; + ret = ret | (currByte >>(8 - bitPos)); + } + return ret; +} + +/**Reads raw short 16 bits little-endian order, returns a unsigned short (RS) **/ +duint16 dwgBuffer::getRawShort16(){ + duint8 buffer[2]; + duint16 ret; + + filestr->read (buffer,2); + if (bitPos == 0) { + /* no offset directly swap bytes for little-endian */ + ret = (buffer[1] << 8) | (buffer[0] & 0x00FF); + } else { + ret = (buffer[0] << 8) | (buffer[1] & 0x00FF); + /* apply offset */ + ret = ret >> (8 - bitPos); + ret = ret | (currByte << (8 + bitPos)); + currByte = buffer[1]; + /* swap bytes for little-endian */ + ret = (ret << 8) | (ret >> 8); + } + return ret; +} + +/**Reads raw double IEEE standard 64 bits returns a double (RD) **/ +double dwgBuffer::getRawDouble(){ + duint8 buffer[8]; + if (bitPos == 0) + filestr->read (buffer,8); + else { + for (int i = 0; i < 8; i++) + buffer[i] = getRawChar8(); + } + double* nOffset = reinterpret_cast( buffer ); + return *nOffset; +} + +/**Reads 2 raw double IEEE standard 64 bits returns a DRW_Coord of floating point double 64 bits (2RD) **/ +DRW_Coord dwgBuffer::get2RawDouble(){ + DRW_Coord crd; + crd.x = getRawDouble(); + crd.y = getRawDouble(); + return crd; +} + + +/**Reads raw int 32 bits little-endian order, returns a unsigned int (RL) **/ +duint32 dwgBuffer::getRawLong32(){ + duint16 tmp1 = getRawShort16(); + duint16 tmp2 = getRawShort16(); + duint32 ret = (tmp2 << 16) | (tmp1 & 0x0000FFFF); + + return ret; +} + +/**Reads raw int 64 bits little-endian order, returns a unsigned long long (RLL) **/ +duint64 dwgBuffer::getRawLong64(){ + duint32 tmp1 = getRawLong32(); + duint64 tmp2 = getRawLong32(); + duint64 ret = (tmp2 << 32) | (tmp1 & 0x00000000FFFFFFFF); + + return ret; +} + +/**Reads modular unsigner int, char based, compresed form, little-endian order, returns a unsigned int (U-MC) **/ +duint32 dwgBuffer::getUModularChar(){ + std::vector buffer; + duint32 result =0; + for (int i=0; i<4;i++){ + duint8 b= getRawChar8(); + buffer.push_back(b & 0x7F); + if (! (b & 0x80)) + break; + } + int offset = 0; + for (unsigned int i=0; i buffer; + dint32 result =0; + for (int i=0; i<4;i++){ + duint8 b= getRawChar8(); + buffer.push_back(b & 0x7F); + if (! (b & 0x80)) + break; + } + dint8 b= buffer.back(); + if (b & 0x40) { + negative = true; + buffer.pop_back(); + buffer.push_back(b & 0x3F); + } + + int offset = 0; + for (unsigned int i=0; i buffer; + dint32 result =0; + for (int i=0; i<2;i++){ + duint16 b= getRawShort16(); + buffer.push_back(b & 0x7FFF); + if (! (b & 0x8000)) + break; + } + + //only positive ? +/* dint8 b= buffer.back(); + if (! (b & 0x40)) { + negative = true; + buffer.pop_back(); + buffer.push_back(b & 0x3F); + }*/ + + int offset = 0; + for (unsigned int i=0; i> 4) & 0x0F; + hl.size = data & 0x0F; + hl.ref=0; + for (int i=0; i< hl.size;i++){ + hl.ref = (hl.ref << 8) | getRawChar8(); + } + return hl; +} + +dwgHandle dwgBuffer::getOffsetHandle(duint32 href){ //H + dwgHandle hl = getHandle(); + + if (hl.code > 5){ + if (hl.code == 0x0C) + hl.ref = href - hl.ref; + else if (hl.code == 0x0A) + hl.ref = href + hl.ref; + else if (hl.code == 0x08) + hl.ref = href - 1; + else if (hl.code == 0x06) + hl.ref = href + 1; +//all are soft pointer reference change to 7 (without offset) + hl.code = 7; + } + return hl; +} + +//internal until 2004 +std::string dwgBuffer::get8bitStr(){ + duint16 textSize = getBitShort(); + if (textSize == 0) + return std::string(); + duint8 *tmpBuffer = new duint8[textSize]; + bool good = getBytes(tmpBuffer, textSize); + if (!good) + return std::string(); + +/* filestr->read (buffer,textSize); + if (!filestr->good()) + return std::string(); + + duint8 tmp; + if (bitPos != 0){ + for (int i=0; i> (8 - bitPos)); + currByte = tmp; + } + }*/ + std::string str(reinterpret_cast(tmpBuffer), textSize); + delete[]tmpBuffer; + + return str; +} + +//internal since 2007 //pending: are 2 bytes null terminated?? +//nullTerm = true if string are 2 bytes null terminated from the stream +std::string dwgBuffer::get16bitStr(duint16 textSize, bool nullTerm){ + if (textSize == 0) + return std::string(); + textSize *=2; + duint16 ts = textSize; + if (nullTerm) + ts += 2; + duint8 *tmpBuffer = new duint8[textSize + 2]; + bool good = getBytes(tmpBuffer, ts); + if (!good) + return std::string(); + if (!nullTerm) { + tmpBuffer[textSize] = '\0'; + tmpBuffer[textSize + 1] = '\0'; + } + std::string str(reinterpret_cast(tmpBuffer), ts); + delete[]tmpBuffer; + + return str; +} + +//T 8 bit text converted from codepage to utf8 +std::string dwgBuffer::getCP8Text(){ + std::string strData; + strData = get8bitStr();//RLZ correct these function + if (decoder == NULL) + return strData; + + return decoder->toUtf8(strData); +} + +//TU unicode 16 bit (UCS) text converted to utf8 +/**Reads 2-bytes char (UCS2, NULL terminated) and convert to std::string (only for Latin-1) + ts= total input size in bytes. +**/ +std::string dwgBuffer::getUCSStr(duint16 ts){ + std::string strData; + if (ts<4) //at least 1 char + return std::string(); + strData = get16bitStr(ts/2, false); + if (decoder == NULL) + return strData; + + return decoder->toUtf8(strData); +} + +//TU unicode 16 bit (UCS) text converted to utf8 +//nullTerm = true if string are 2 bytes null terminated from the stream +std::string dwgBuffer::getUCSText(bool nullTerm){ + std::string strData; + duint16 ts = getBitShort(); + if (ts == 0) + return std::string(); + + strData = get16bitStr(ts, nullTerm); + if (decoder == NULL) + return strData; + + return decoder->toUtf8(strData); +} + +//RLZ: read a T or TU if version is 2007+ +//nullTerm = true if string are 2 bytes null terminated from the stream +std::string dwgBuffer::getVariableText(DRW::Version v, bool nullTerm){//TV + if (v > DRW::AC1018) + return getUCSText(nullTerm); + return getCP8Text(); +} +duint16 dwgBuffer::getObjType(DRW::Version v){//OT + if (v > DRW::AC1021) { + duint8 b = get2Bits(); + if (b == 0) + return getRawChar8(); + else if (b== 1){ + return (getRawChar8() + 0x01F0); + } else //b == 2 + return getRawShort16(); + } + return getBitShort(); +} + +/* Bit Extrusion +* For R2000+, this is a single bit, If the single bit is 1, +* the extrusion value is assumed to be 0,0,1 and no explicit +* extrusion is stored. If the single bit is 0, then it will +* be followed by 3BD. +* For R13-R14 this is 3BD. +*/ +DRW_Coord dwgBuffer::getExtrusion(bool b_R2000_style) { + DRW_Coord ext(0.0,0.0,1.0); + if ( b_R2000_style ) + /* If the bit is one, the extrusion value is assumed to be 0,0,1*/ + if ( getBit() == 1 ) + return ext; + /*R13-R14 or bit == 0*/ + ext.x = getBitDouble(); + ext.y = getBitDouble(); + ext.z = getBitDouble(); + return ext; +} + +/**Reads compresed Double with default (max. 64 + 2 bits) returns a floating point double of 64 bits (DD) **/ +double dwgBuffer::getDefaultDouble(double d){ + dint8 b = get2Bits(); + if (b == 0) + return d; + else if (b == 1){ + duint8 buffer[4]; + char *tmp; + if (bitPos != 0) { + for (int i = 0; i < 4; i++) + buffer[i] = getRawChar8(); + } else { + filestr->read (buffer,4); + } + tmp = reinterpret_cast(&d); + for (int i = 0; i < 4; i++) + tmp[i] = buffer[i]; + double ret = *reinterpret_cast( tmp ); + return ret; + } else if (b == 2){ + duint8 buffer[6]; + char *tmp; + if (bitPos != 0) { + for (int i = 0; i < 6; i++) + buffer[i] = getRawChar8(); + } else { + filestr->read (buffer,6); + } + tmp = reinterpret_cast(&d); + for (int i = 2; i < 6; i++) + tmp[i-2] = buffer[i]; + tmp[4] = buffer[0]; + tmp[5] = buffer[1]; + double ret = *reinterpret_cast( tmp ); + return ret; + } + // if (b == 3) return a full raw double + return getRawDouble(); +} + + +/* BitThickness +* For R13-R14, this is a BD. +* For R2000+, this is a single bit, If the bit is one, +* the thickness value is assumed to be 0.0, if not a BD follow +*/ +double dwgBuffer::getThickness(bool b_R2000_style) { + if ( b_R2000_style ) + /* If the bit is one, the thickness value is assumed to be 0.0.*/ + if ( getBit() == 1 ) + return 0.0; + /*R13-R14 or bit == 0*/ + return getBitDouble(); +} + +/* CmColor (CMC) +* For R15 and earlier call directly BS as ACIS color. +* For R2004+, can be CMC or ENC +* RGB value, first 4bits 0xC0 => ByLayer, 0xC1 => ByBlock, 0xC2 => RGB, 0xC3 => last 4 are ACIS +*/ +duint32 dwgBuffer::getCmColor(DRW::Version v) { + if (v < DRW::AC1018) //2000- + return getSBitShort(); + duint16 idx = getBitShort(); + duint32 rgb = getBitLong(); + duint8 cb = getRawChar8(); + duint8 type = rgb >> 24; + DRW_DBG("\ntype COLOR: "); DRW_DBGH(type); + DRW_DBG("\nindex COLOR: "); DRW_DBGH(idx); + DRW_DBG("\nRGB COLOR: "); DRW_DBGH(rgb); + DRW_DBG("\nbyte COLOR: "); DRW_DBGH(cb); + if (cb&1){ + std::string colorName = getVariableText(v, false); + DRW_DBG("\ncolorName: "); DRW_DBG(colorName); + } + if (cb&2){ + std::string bookName = getVariableText(v, false); + DRW_DBG("\nbookName: "); DRW_DBG(bookName); + } + switch (type) { + case 0xC0: + return 256;//ByLayer + break; + case 0xC1: + return 0;//ByBlock + break; + case 0xC2: + return 256;//RGB RLZ TODO + break; + case 0xC3: + return rgb&0xFF;//ACIS + break; + default: + break; + } + //check cb if strings follows RLZ TODO + return 256; //default return ByLayer +} + +/* EnColor (ENC) +* For R15 and earlier call directly BS as ACIS color. +* For R2004+, can be CMC or ENC +* RGB value, first 4bits 0xC0 => ByLayer, 0xC1 => ByBlock, 0xC2 => RGB, 0xC3 => last 4 are ACIS +*/ +duint32 dwgBuffer::getEnColor(DRW::Version v) { + if (v < DRW::AC1018) //2000- + return getSBitShort(); + duint32 rgb = 0; + duint32 cb = 0; + duint16 idx = getBitShort(); + DRW_DBG("idx reads COLOR: "); DRW_DBGH(idx); + duint16 flags = idx>>8; + idx = idx & 0x1FF; //RLZ: warning this is correct? + DRW_DBG("\nflag COLOR: "); DRW_DBGH(flags); + DRW_DBG(", index COLOR: "); DRW_DBGH(idx); +// if (flags & 0x80) { +// rgb = getBitLong(); +// DRW_DBG("\nRGB COLOR: "); DRW_DBGH(rgb); +// } + if (flags & 0x20) { + cb = getBitLong(); + DRW_DBG("\nTransparency COLOR: "); DRW_DBGH(cb); + } + if (flags & 0x40) + DRW_DBG("\nacdbColor COLOR are present"); + else { + if (flags & 0x80) { + rgb = getBitLong(); + DRW_DBG("\nRGB COLOR: "); DRW_DBGH(rgb); + } + } + +/* if (flags & 0x80) + return getBitLong();*/ + + return idx; //default return ByLayer +} + + +/**Reads raw short 16 bits big-endian order, returns a unsigned short crc & size **/ +duint16 dwgBuffer::getBERawShort16(){ + char buffer[2]; + buffer[0] = getRawChar8(); + buffer[1] = getRawChar8(); + duint16 size = (buffer[0] << 8) | (buffer[1] & 0xFF); + return size; +} + +/* reads "size" bytes and stores in "buf" return false if fail */ +bool dwgBuffer::getBytes(unsigned char *buf, int size){ + duint8 tmp; + filestr->read (buf,size); + if (!filestr->good()) + return false; + + if (bitPos != 0){ + for (int i=0; i> (8 - bitPos)); + currByte = tmp; + } + } + return true; +} + +duint16 dwgBuffer::crc8(duint16 dx,dint32 start,dint32 end){ + int pos = filestr->getPos(); + filestr->setPos(start); + int n = end-start; + duint8 *tmpBuf = new duint8[n]; + duint8 *p = tmpBuf; + filestr->read (tmpBuf,n); + filestr->setPos(pos); + if (!filestr->good()) + return 0; + + duint8 al; + + while (n-- > 0) { + al = (duint8)((*p) ^ ((dint8)(dx & 0xFF))); + dx = (dx>>8) & 0xFF; + dx = dx ^ crctable[al & 0xFF]; + p++; + } + delete[]tmpBuf; + return(dx); +} + +duint32 dwgBuffer::crc32(duint32 seed,dint32 start,dint32 end){ + int pos = filestr->getPos(); + filestr->setPos(start); + int n = end-start; + duint8 *tmpBuf = new duint8[n]; + duint8 *p = tmpBuf; + filestr->read (tmpBuf,n); + filestr->setPos(pos); + if (!filestr->good()) + return 0; + + duint32 invertedCrc = ~seed; + while (n-- > 0) { + duint8 data = *p++; + invertedCrc = (invertedCrc >> 8) ^ crc32Table[(invertedCrc ^ data) & 0xff]; + } + delete[]tmpBuf; + return ~invertedCrc; +} + + +/*std::string dwgBuffer::getBytes(int size){ + char buffer[size]; + char tmp; + filestr->read (buffer,size); + if (!filestr->good()) + return NULL; + + if (bitPos != 0){ + for (int i=0; i<=size;i++){ + tmp = buffer[i]; + buffer[i] = (currByte << bitPos) | (tmp >> (8 - bitPos)); + currByte = tmp; + } + } + std::string st; + for (int i=0; i. ** +******************************************************************************/ + +#ifndef DWGBUFFER_H +#define DWGBUFFER_H + +#include +#include +#include "../drw_base.h" + +class DRW_Coord; +class DRW_TextCodec; + +class dwgBasicStream{ +protected: + dwgBasicStream(){} +public: + virtual ~dwgBasicStream(){} + virtual bool read(duint8* s, duint64 n) = 0; + virtual duint64 size() = 0; + virtual duint64 getPos() = 0; + virtual bool setPos(duint64 p) = 0; + virtual bool good() = 0; + virtual dwgBasicStream* clone() = 0; +}; + +class dwgFileStream: public dwgBasicStream{ +public: + dwgFileStream(std::istream *s){ + stream =s; + stream->seekg (0, std::ios::end); + sz = stream->tellg(); + stream->seekg(0, std::ios_base::beg); + } + virtual ~dwgFileStream(){} + virtual bool read(duint8* s, duint64 n); + virtual duint64 size(){return sz;} + virtual duint64 getPos(){return stream->tellg();} + virtual bool setPos(duint64 p); + virtual bool good(){return stream->good();} + virtual dwgBasicStream* clone(){return new dwgFileStream(stream);} +private: + std::istream *stream; + duint64 sz; +}; + +class dwgCharStream: public dwgBasicStream{ +public: + dwgCharStream(duint8 *buf, int s){ + stream =buf; + sz = s; + pos = 0; + isOk = true; + } + virtual ~dwgCharStream(){} + virtual bool read(duint8* s, duint64 n); + virtual duint64 size(){return sz;} + virtual duint64 getPos(){return pos;} + virtual bool setPos(duint64 p); + virtual bool good(){return isOk;} + virtual dwgBasicStream* clone(){return new dwgCharStream(stream, sz);} +private: + duint8 *stream; + duint64 sz; + duint64 pos; + bool isOk; +}; + +class dwgBuffer { +public: + dwgBuffer(std::istream *stream, DRW_TextCodec *decoder = NULL); + dwgBuffer(duint8 *buf, int size, DRW_TextCodec *decoder= NULL); + dwgBuffer( const dwgBuffer& org ); + dwgBuffer& operator=( const dwgBuffer& org ); + ~dwgBuffer(); + duint64 size(){return filestr->size();} + bool setPosition(duint64 pos); + duint64 getPosition(); + void resetPosition(){setPosition(0); setBitPos(0);} + void setBitPos(duint8 pos); + duint8 getBitPos(){return bitPos;} + bool moveBitPos(dint32 size); + + duint8 getBit(); //B + bool getBoolBit(); //B as bool + duint8 get2Bits(); //BB + duint8 get3Bits(); //3B + duint16 getBitShort(); //BS + dint16 getSBitShort(); //BS + dint32 getBitLong(); //BL + duint64 getBitLongLong(); //BLL (R24) + double getBitDouble(); //BD + //2BD => call BD 2 times + DRW_Coord get3BitDouble(); //3BD + duint8 getRawChar8(); //RC + duint16 getRawShort16(); //RS + double getRawDouble(); //RD + duint32 getRawLong32(); //RL + duint64 getRawLong64(); //RLL + DRW_Coord get2RawDouble(); //2RD + //3RD => call RD 3 times + duint32 getUModularChar(); //UMC, unsigned for offsets in 1015 + dint32 getModularChar(); //MC + dint32 getModularShort(); //MS + dwgHandle getHandle(); //H + dwgHandle getOffsetHandle(duint32 href); //H converted to hard + UTF8STRING getVariableText(DRW::Version v, bool nullTerm = true); //TV => call TU for 2007+ or T for previous versions + UTF8STRING getCP8Text(); //T 8 bit text converted from codepage to utf8 + UTF8STRING getUCSText(bool nullTerm = true); //TU unicode 16 bit (UCS) text converted to utf8 + UTF8STRING getUCSStr(duint16 ts); + + duint16 getObjType(DRW::Version v); //OT + + //X, U, SN, + + DRW_Coord getExtrusion(bool b_R2000_style); //BE + double getDefaultDouble(double d); //DD + double getThickness(bool b_R2000_style);//BT + //3DD + duint32 getCmColor(DRW::Version v); //CMC + duint32 getEnColor(DRW::Version v); //ENC + //TC + + duint16 getBERawShort16(); //RS big-endian order + + bool isGood(){return filestr->good();} + bool getBytes(duint8 *buf, int size); + int numRemainingBytes(){return (maxSize- filestr->getPos());} + + duint16 crc8(duint16 dx,dint32 start,dint32 end); + duint32 crc32(duint32 seed,dint32 start,dint32 end); + +// duint8 getCurrByte(){return currByte;} + DRW_TextCodec *decoder; + +private: + dwgBasicStream *filestr; + int maxSize; + duint8 currByte; + duint8 bitPos; + + UTF8STRING get8bitStr(); + UTF8STRING get16bitStr(duint16 textSize, bool nullTerm = true); +}; + +#endif // DWGBUFFER_H diff --git a/extlib/libdxfrw/intern/dwgreader.cpp b/extlib/libdxfrw/intern/dwgreader.cpp new file mode 100644 index 0000000..da6ac35 --- /dev/null +++ b/extlib/libdxfrw/intern/dwgreader.cpp @@ -0,0 +1,1294 @@ +/****************************************************************************** +** libDXFrw - Library to read/write DXF files (ascii & binary) ** +** ** +** Copyright (C) 2011-2015 José F. Soriano, rallazz@gmail.com ** +** ** +** This library is free software, licensed under the terms of the GNU ** +** General Public License as published by the Free Software Foundation, ** +** either version 2 of the License, or (at your option) any later version. ** +** You should have received a copy of the GNU General Public License ** +** along with this program. If not, see . ** +******************************************************************************/ + +#include +#include +#include +#include +#include +#include "dwgreader.h" +#include "drw_textcodec.h" +#include "drw_dbg.h" + +dwgReader::~dwgReader(){ + for (std::map::iterator it=ltypemap.begin(); it!=ltypemap.end(); ++it) + delete(it->second); + for (std::map::iterator it=layermap.begin(); it!=layermap.end(); ++it) + delete(it->second); + for (std::map::iterator it=blockmap.begin(); it!=blockmap.end(); ++it) + delete(it->second); + for (std::map::iterator it=stylemap.begin(); it!=stylemap.end(); ++it) + delete(it->second); + for (std::map::iterator it=dimstylemap.begin(); it!=dimstylemap.end(); ++it) + delete(it->second); + for (std::map::iterator it=vportmap.begin(); it!=vportmap.end(); ++it) + delete(it->second); + for (std::map::iterator it=classesmap.begin(); it!=classesmap.end(); ++it) + delete(it->second); + for (std::map::iterator it=blockRecordmap.begin(); it!=blockRecordmap.end(); ++it) + delete(it->second); + for (std::map::iterator it=appIdmap.begin(); it!=appIdmap.end(); ++it) + delete(it->second); + + delete fileBuf; +} + +void dwgReader::parseAttribs(DRW_Entity* e){ + if (e != NULL){ + duint32 ltref =e->lTypeH.ref; + duint32 lyref =e->layerH.ref; + std::map::iterator lt_it = ltypemap.find(ltref); + if (lt_it != ltypemap.end()){ + e->lineType = (lt_it->second)->name; + } + std::map::iterator ly_it = layermap.find(lyref); + if (ly_it != layermap.end()){ + e->layer = (ly_it->second)->name; + } + } +} + +std::string dwgReader::findTableName(DRW::TTYPE table, dint32 handle){ + std::string name; + switch (table){ + case DRW::STYLE:{ + std::map::iterator st_it = stylemap.find(handle); + if (st_it != stylemap.end()) + name = (st_it->second)->name; + break;} + case DRW::DIMSTYLE:{ + std::map::iterator ds_it = dimstylemap.find(handle); + if (ds_it != dimstylemap.end()) + name = (ds_it->second)->name; + break;} + case DRW::BLOCK_RECORD:{ //use DRW_Block because name are more correct +// std::map::iterator bk_it = blockmap.find(handle); +// if (bk_it != blockmap.end()) + std::map::iterator bk_it = blockRecordmap.find(handle); + if (bk_it != blockRecordmap.end()) + name = (bk_it->second)->name; + break;} +/* case DRW::VPORT:{ + std::map::iterator vp_it = vportmap.find(handle); + if (vp_it != vportmap.end()) + name = (vp_it->second)->name; + break;}*/ + case DRW::LAYER:{ + std::map::iterator ly_it = layermap.find(handle); + if (ly_it != layermap.end()) + name = (ly_it->second)->name; + break;} + case DRW::LTYPE:{ + std::map::iterator lt_it = ltypemap.find(handle); + if (lt_it != ltypemap.end()) + name = (lt_it->second)->name; + break;} + default: + break; + } + return name; +} + +bool dwgReader::readDwgHeader(DRW_Header& hdr, dwgBuffer *buf, dwgBuffer *hBuf){ + bool ret = hdr.parseDwg(version, buf, hBuf, maintenanceVersion); + //RLZ: copy objectControl handles + return ret; +} + +//RLZ: TODO add check instead print +bool dwgReader::checkSentinel(dwgBuffer *buf, enum secEnum::DWGSection, bool start){ + DRW_UNUSED(start); + for (int i=0; i<16;i++) { + DRW_DBGH(buf->getRawChar8()); DRW_DBG(" "); + } + return true; +} + +/*********** objects map ************************/ +/** Note: object map are split in sections with max size 2035? + * heach section are 2 bytes size + data bytes + 2 bytes crc + * size value are data bytes + 2 and to calculate crc are used + * 2 bytes size + data bytes + * last section are 2 bytes size + 2 bytes crc (size value always 2) +**/ +bool dwgReader::readDwgHandles(dwgBuffer *dbuf, duint32 offset, duint32 size) { + DRW_DBG("\ndwgReader::readDwgHandles\n"); + if (!dbuf->setPosition(offset)) + return false; + + duint32 maxPos = offset + size; + DRW_DBG("\nSection HANDLES offset= "); DRW_DBG(offset); + DRW_DBG("\nSection HANDLES size= "); DRW_DBG(size); + DRW_DBG("\nSection HANDLES maxPos= "); DRW_DBG(maxPos); + + int startPos = offset; + + while (maxPos > dbuf->getPosition()) { + DRW_DBG("\nstart handles section buf->curPosition()= "); DRW_DBG(dbuf->getPosition()); DRW_DBG("\n"); + duint16 size = dbuf->getBERawShort16(); + DRW_DBG("object map section size= "); DRW_DBG(size); DRW_DBG("\n"); + dbuf->setPosition(startPos); + duint8 *tmpByteStr = new duint8[size]; + dbuf->getBytes(tmpByteStr, size); + dwgBuffer buff(tmpByteStr, size, &decoder); + if (size != 2){ + buff.setPosition(2); + int lastHandle = 0; + int lastLoc = 0; + //read data + while(buff.getPosition()< size){ + lastHandle += buff.getUModularChar(); + DRW_DBG("object map lastHandle= "); DRW_DBGH(lastHandle); + lastLoc += buff.getModularChar(); + DRW_DBG(" lastLoc= "); DRW_DBG(lastLoc); DRW_DBG("\n"); + ObjectMap[lastHandle]= objHandle(0, lastHandle, lastLoc); + } + } + //verify crc + duint16 crcCalc = buff.crc8(0xc0c1,0,size); + delete[]tmpByteStr; + duint16 crcRead = dbuf->getBERawShort16(); + DRW_DBG("object map section crc8 read= "); DRW_DBG(crcRead); + DRW_DBG("\nobject map section crc8 calculated= "); DRW_DBG(crcCalc); + DRW_DBG("\nobject section buf->curPosition()= "); DRW_DBG(dbuf->getPosition()); DRW_DBG("\n"); + startPos = dbuf->getPosition(); + } + + bool ret = dbuf->isGood(); + return ret; +} + +/*********** objects ************************/ +/** + * Reads all the object referenced in the object map section of the DWG file + * (using their object file offsets) + */ +bool dwgReader::readDwgTables(DRW_Header& hdr, dwgBuffer *dbuf) { + DRW_DBG("\ndwgReader::readDwgTables start\n"); + bool ret = true; + bool ret2 = true; + objHandle oc; + std::map::iterator mit; + dint16 oType; + duint32 bs = 0; //bit size of handle stream 2010+ + duint8 *tmpByteStr; + + //parse linetypes, start with linetype Control + mit = ObjectMap.find(hdr.linetypeCtrl); + if (mit==ObjectMap.end()) { + DRW_DBG("\nWARNING: LineType control not found\n"); + ret = false; + } else { + DRW_DBG("\n**********Parsing LineType control*******\n"); + oc = mit->second; + ObjectMap.erase(mit); + DRW_ObjControl ltControl; + dbuf->setPosition(oc.loc); + int csize = dbuf->getModularShort(); + if (version > DRW::AC1021) //2010+ + bs = dbuf->getUModularChar(); + else + bs = 0; + tmpByteStr = new duint8[csize]; + dbuf->getBytes(tmpByteStr, csize); + dwgBuffer cbuff(tmpByteStr, csize, &decoder); + //verify if object are correct + oType = cbuff.getObjType(version); + if (oType != 0x38) { + DRW_DBG("\nWARNING: Not LineType control object, found oType "); + DRW_DBG(oType); DRW_DBG(" instead 0x38\n"); + ret = false; + } else { //reset position + cbuff.resetPosition(); + ret2 = ltControl.parseDwg(version, &cbuff, bs); + if(ret) + ret = ret2; + } + delete[]tmpByteStr; + for (std::list::iterator it=ltControl.hadlesList.begin(); it != ltControl.hadlesList.end(); ++it){ + mit = ObjectMap.find(*it); + if (mit==ObjectMap.end()) { + DRW_DBG("\nWARNING: LineType not found\n"); + ret = false; + } else { + oc = mit->second; + ObjectMap.erase(mit); + DRW_DBG("\nLineType Handle= "); DRW_DBGH(oc.handle); DRW_DBG(" loc.: "); DRW_DBG(oc.loc); DRW_DBG("\n"); + DRW_LType *lt = new DRW_LType(); + dbuf->setPosition(oc.loc); + int lsize = dbuf->getModularShort(); + DRW_DBG("LineType size in bytes= "); DRW_DBG(lsize); + if (version > DRW::AC1021) //2010+ + bs = dbuf->getUModularChar(); + else + bs = 0; + tmpByteStr = new duint8[lsize]; + dbuf->getBytes(tmpByteStr, lsize); + dwgBuffer lbuff(tmpByteStr, lsize, &decoder); + ret2 = lt->parseDwg(version, &lbuff, bs); + ltypemap[lt->handle] = lt; + if(ret) + ret = ret2; + delete[]tmpByteStr; + } + } + } + + //parse layers, start with layer Control + mit = ObjectMap.find(hdr.layerCtrl); + if (mit==ObjectMap.end()) { + DRW_DBG("\nWARNING: Layer control not found\n"); + ret = false; + } else { + DRW_DBG("\n**********Parsing Layer control*******\n"); + oc = mit->second; + ObjectMap.erase(mit); + DRW_ObjControl layControl; + dbuf->setPosition(oc.loc); + int size = dbuf->getModularShort(); + if (version > DRW::AC1021) //2010+ + bs = dbuf->getUModularChar(); + else + bs = 0; + tmpByteStr = new duint8[size]; + dbuf->getBytes(tmpByteStr, size); + dwgBuffer buff(tmpByteStr, size, &decoder); + //verify if object are correct + oType = buff.getObjType(version); + if (oType != 0x32) { + DRW_DBG("\nWARNING: Not Layer control object, found oType "); + DRW_DBG(oType); DRW_DBG(" instead 0x32\n"); + ret = false; + } else { //reset position + buff.resetPosition(); + ret2 = layControl.parseDwg(version, &buff, bs); + if(ret) + ret = ret2; + } + delete[]tmpByteStr; + for (std::list::iterator it=layControl.hadlesList.begin(); it != layControl.hadlesList.end(); ++it){ + mit = ObjectMap.find(*it); + if (mit==ObjectMap.end()) { + DRW_DBG("\nWARNING: Layer not found\n"); + ret = false; + } else { + oc = mit->second; + ObjectMap.erase(mit); + DRW_DBG("Layer Handle= "); DRW_DBGH(oc.handle); DRW_DBG(" "); DRW_DBG(oc.loc); DRW_DBG("\n"); + DRW_Layer *la = new DRW_Layer(); + dbuf->setPosition(oc.loc); + int size = dbuf->getModularShort(); + if (version > DRW::AC1021) //2010+ + bs = dbuf->getUModularChar(); + else + bs = 0; + tmpByteStr = new duint8[size]; + dbuf->getBytes(tmpByteStr, size); + dwgBuffer buff(tmpByteStr, size, &decoder); + ret2 = la->parseDwg(version, &buff, bs); + layermap[la->handle] = la; + if(ret) + ret = ret2; + delete[]tmpByteStr; + } + } + } + + //set linetype in layer + for (std::map::iterator it=layermap.begin(); it!=layermap.end(); ++it) { + DRW_Layer *ly = it->second; + duint32 ref =ly->lTypeH.ref; + std::map::iterator lt_it = ltypemap.find(ref); + if (lt_it != ltypemap.end()){ + ly->lineType = (lt_it->second)->name; + } + } + + //parse text styles, start with style Control + mit = ObjectMap.find(hdr.styleCtrl); + if (mit==ObjectMap.end()) { + DRW_DBG("\nWARNING: Style control not found\n"); + ret = false; + } else { + DRW_DBG("\n**********Parsing Style control*******\n"); + oc = mit->second; + ObjectMap.erase(mit); + DRW_ObjControl styControl; + dbuf->setPosition(oc.loc); + int size = dbuf->getModularShort(); + if (version > DRW::AC1021) //2010+ + bs = dbuf->getUModularChar(); + else + bs = 0; + tmpByteStr = new duint8[size]; + dbuf->getBytes(tmpByteStr, size); + dwgBuffer buff(tmpByteStr, size, &decoder); + //verify if object are correct + oType = buff.getObjType(version); + if (oType != 0x34) { + DRW_DBG("\nWARNING: Not Text Style control object, found oType "); + DRW_DBG(oType); DRW_DBG(" instead 0x34\n"); + ret = false; + } else { //reset position + buff.resetPosition(); + ret2 = styControl.parseDwg(version, &buff, bs); + if(ret) + ret = ret2; + } + delete[]tmpByteStr; + for (std::list::iterator it=styControl.hadlesList.begin(); it != styControl.hadlesList.end(); ++it){ + mit = ObjectMap.find(*it); + if (mit==ObjectMap.end()) { + DRW_DBG("\nWARNING: Style not found\n"); + ret = false; + } else { + oc = mit->second; + ObjectMap.erase(mit); + DRW_DBG("Style Handle= "); DRW_DBGH(oc.handle); DRW_DBG(" "); DRW_DBG(oc.loc); DRW_DBG("\n"); + DRW_Textstyle *sty = new DRW_Textstyle(); + dbuf->setPosition(oc.loc); + int size = dbuf->getModularShort(); + if (version > DRW::AC1021) //2010+ + bs = dbuf->getUModularChar(); + else + bs = 0; + tmpByteStr = new duint8[size]; + dbuf->getBytes(tmpByteStr, size); + dwgBuffer buff(tmpByteStr, size, &decoder); + ret2 = sty->parseDwg(version, &buff, bs); + stylemap[sty->handle] = sty; + if(ret) + ret = ret2; + delete[]tmpByteStr; + } + } + } + + //parse dim styles, start with dimstyle Control + mit = ObjectMap.find(hdr.dimstyleCtrl); + if (mit==ObjectMap.end()) { + DRW_DBG("\nWARNING: Dimension Style control not found\n"); + ret = false; + } else { + DRW_DBG("\n**********Parsing Dimension Style control*******\n"); + oc = mit->second; + ObjectMap.erase(mit); + DRW_ObjControl dimstyControl; + dbuf->setPosition(oc.loc); + duint32 size = dbuf->getModularShort(); + if (version > DRW::AC1021) //2010+ + bs = dbuf->getUModularChar(); + else + bs = 0; + tmpByteStr = new duint8[size]; + dbuf->getBytes(tmpByteStr, size); + dwgBuffer buff(tmpByteStr, size, &decoder); + //verify if object are correct + oType = buff.getObjType(version); + if (oType != 0x44) { + DRW_DBG("\nWARNING: Not Dim Style control object, found oType "); + DRW_DBG(oType); DRW_DBG(" instead 0x44\n"); + ret = false; + } else { //reset position + buff.resetPosition(); + ret2 = dimstyControl.parseDwg(version, &buff, bs); + if(ret) + ret = ret2; + } + delete[]tmpByteStr; + for (std::list::iterator it=dimstyControl.hadlesList.begin(); it != dimstyControl.hadlesList.end(); ++it){ + mit = ObjectMap.find(*it); + if (mit==ObjectMap.end()) { + DRW_DBG("\nWARNING: Dimension Style not found\n"); + ret = false; + } else { + oc = mit->second; + ObjectMap.erase(mit); + DRW_DBG("Dimstyle Handle= "); DRW_DBGH(oc.handle); DRW_DBG(" "); DRW_DBG(oc.loc); DRW_DBG("\n"); + DRW_Dimstyle *sty = new DRW_Dimstyle(); + dbuf->setPosition(oc.loc); + int size = dbuf->getModularShort(); + if (version > DRW::AC1021) //2010+ + bs = dbuf->getUModularChar(); + else + bs = 0; + tmpByteStr = new duint8[size]; + dbuf->getBytes(tmpByteStr, size); + dwgBuffer buff(tmpByteStr, size, &decoder); + ret2 = sty->parseDwg(version, &buff, bs); + dimstylemap[sty->handle] = sty; + if(ret) + ret = ret2; + delete[]tmpByteStr; + } + } + } + + //parse vports, start with vports Control + mit = ObjectMap.find(hdr.vportCtrl); + if (mit==ObjectMap.end()) { + DRW_DBG("\nWARNING: vports control not found\n"); + ret = false; + } else { + DRW_DBG("\n**********Parsing vports control*******\n"); + oc = mit->second; + ObjectMap.erase(mit); + DRW_ObjControl vportControl; + dbuf->setPosition(oc.loc); + int size = dbuf->getModularShort(); + if (version > DRW::AC1021) //2010+ + bs = dbuf->getUModularChar(); + else + bs = 0; + tmpByteStr = new duint8[size]; + dbuf->getBytes(tmpByteStr, size); + dwgBuffer buff(tmpByteStr, size, &decoder); + //verify if object are correct + oType = buff.getObjType(version); + if (oType != 0x40) { + DRW_DBG("\nWARNING: Not VPorts control object, found oType: "); + DRW_DBG(oType); DRW_DBG(" instead 0x40\n"); + ret = false; + } else { //reset position + buff.resetPosition(); + ret2 = vportControl.parseDwg(version, &buff, bs); + if(ret) + ret = ret2; + } + delete[]tmpByteStr; + for (std::list::iterator it=vportControl.hadlesList.begin(); it != vportControl.hadlesList.end(); ++it){ + mit = ObjectMap.find(*it); + if (mit==ObjectMap.end()) { + DRW_DBG("\nWARNING: vport not found\n"); + ret = false; + } else { + oc = mit->second; + ObjectMap.erase(mit); + DRW_DBG("Vport Handle= "); DRW_DBGH(oc.handle); DRW_DBG(" "); DRW_DBG(oc.loc); DRW_DBG("\n"); + DRW_Vport *vp = new DRW_Vport(); + dbuf->setPosition(oc.loc); + int size = dbuf->getModularShort(); + if (version > DRW::AC1021) //2010+ + bs = dbuf->getUModularChar(); + else + bs = 0; + tmpByteStr = new duint8[size]; + dbuf->getBytes(tmpByteStr, size); + dwgBuffer buff(tmpByteStr, size, &decoder); + ret2 = vp->parseDwg(version, &buff, bs); + vportmap[vp->handle] = vp; + if(ret) + ret = ret2; + delete[]tmpByteStr; + } + } + } + + //parse Block_records , start with Block_record Control + mit = ObjectMap.find(hdr.blockCtrl); + if (mit==ObjectMap.end()) { + DRW_DBG("\nWARNING: Block_record control not found\n"); + ret = false; + } else { + DRW_DBG("\n**********Parsing Block_record control*******\n"); + oc = mit->second; + ObjectMap.erase(mit); + DRW_ObjControl blockControl; + dbuf->setPosition(oc.loc); + int csize = dbuf->getModularShort(); + if (version > DRW::AC1021) //2010+ + bs = dbuf->getUModularChar(); + else + bs = 0; + tmpByteStr = new duint8[csize]; + dbuf->getBytes(tmpByteStr, csize); + dwgBuffer buff(tmpByteStr, csize, &decoder); + //verify if object are correct + oType = buff.getObjType(version); + if (oType != 0x30) { + DRW_DBG("\nWARNING: Not Block Record control object, found oType "); + DRW_DBG(oType); DRW_DBG(" instead 0x30\n"); + ret = false; + } else { //reset position + buff.resetPosition(); + ret2 = blockControl.parseDwg(version, &buff, bs); + if(ret) + ret = ret2; + } + delete[]tmpByteStr; + for (std::list::iterator it=blockControl.hadlesList.begin(); it != blockControl.hadlesList.end(); ++it){ + mit = ObjectMap.find(*it); + if (mit==ObjectMap.end()) { + DRW_DBG("\nWARNING: block record not found\n"); + ret = false; + } else { + oc = mit->second; + ObjectMap.erase(mit); + DRW_DBG("block record Handle= "); DRW_DBGH(oc.handle); DRW_DBG(" "); DRW_DBG(oc.loc); DRW_DBG("\n"); + DRW_Block_Record *br = new DRW_Block_Record(); + dbuf->setPosition(oc.loc); + int size = dbuf->getModularShort(); + if (version > DRW::AC1021) //2010+ + bs = dbuf->getUModularChar(); + else + bs = 0; + tmpByteStr = new duint8[size]; + dbuf->getBytes(tmpByteStr, size); + dwgBuffer buff(tmpByteStr, size, &decoder); + ret2 = br->parseDwg(version, &buff, bs); + blockRecordmap[br->handle] = br; + if(ret) + ret = ret2; + delete[]tmpByteStr; + } + } + } + + //parse appId , start with appId Control + mit = ObjectMap.find(hdr.appidCtrl); + if (mit==ObjectMap.end()) { + DRW_DBG("\nWARNING: AppId control not found\n"); + ret = false; + } else { + DRW_DBG("\n**********Parsing AppId control*******\n"); + oc = mit->second; + ObjectMap.erase(mit); + DRW_DBG("AppId Control Obj Handle= "); DRW_DBGH(oc.handle); DRW_DBG(" "); DRW_DBG(oc.loc); DRW_DBG("\n"); + DRW_ObjControl appIdControl; + dbuf->setPosition(oc.loc); + int size = dbuf->getModularShort(); + if (version > DRW::AC1021) //2010+ + bs = dbuf->getUModularChar(); + else + bs = 0; + tmpByteStr = new duint8[size]; + dbuf->getBytes(tmpByteStr, size); + dwgBuffer buff(tmpByteStr, size, &decoder); + //verify if object are correct + oType = buff.getObjType(version); + if (oType != 0x42) { + DRW_DBG("\nWARNING: Not AppId control object, found oType "); + DRW_DBG(oType); DRW_DBG(" instead 0x42\n"); + ret = false; + } else { //reset position + buff.resetPosition(); + ret2 = appIdControl.parseDwg(version, &buff, bs); + if(ret) + ret = ret2; + } + delete[]tmpByteStr; + for (std::list::iterator it=appIdControl.hadlesList.begin(); it != appIdControl.hadlesList.end(); ++it){ + mit = ObjectMap.find(*it); + if (mit==ObjectMap.end()) { + DRW_DBG("\nWARNING: AppId not found\n"); + ret = false; + } else { + oc = mit->second; + ObjectMap.erase(mit); + DRW_DBG("AppId Handle= "); DRW_DBGH(oc.handle); DRW_DBG(" "); DRW_DBG(oc.loc); DRW_DBG("\n"); + DRW_AppId *ai = new DRW_AppId(); + dbuf->setPosition(oc.loc); + int size = dbuf->getModularShort(); + if (version > DRW::AC1021) //2010+ + bs = dbuf->getUModularChar(); + else + bs = 0; + tmpByteStr = new duint8[size]; + dbuf->getBytes(tmpByteStr, size); + dwgBuffer buff(tmpByteStr, size, &decoder); + ret2 = ai->parseDwg(version, &buff, bs); + appIdmap[ai->handle] = ai; + if(ret) + ret = ret2; + delete[]tmpByteStr; + } + } + } + + //RLZ: parse remaining object controls, TODO: implement all + if (DRW_DBGGL == DRW_dbg::DEBUG){ + mit = ObjectMap.find(hdr.viewCtrl); + if (mit==ObjectMap.end()) { + DRW_DBG("\nWARNING: View control not found\n"); + ret = false; + } else { + DRW_DBG("\n**********Parsing View control*******\n"); + oc = mit->second; + ObjectMap.erase(mit); + DRW_DBG("View Control Obj Handle= "); DRW_DBGH(oc.handle); DRW_DBG(" "); DRW_DBG(oc.loc); DRW_DBG("\n"); + DRW_ObjControl viewControl; + dbuf->setPosition(oc.loc); + int size = dbuf->getModularShort(); + if (version > DRW::AC1021) //2010+ + bs = dbuf->getUModularChar(); + else + bs = 0; + tmpByteStr = new duint8[size]; + dbuf->getBytes(tmpByteStr, size); + dwgBuffer buff(tmpByteStr, size, &decoder); + //verify if object are correct + oType = buff.getObjType(version); + if (oType != 0x3C) { + DRW_DBG("\nWARNING: Not View control object, found oType "); + DRW_DBG(oType); DRW_DBG(" instead 0x3C\n"); + ret = false; + } else { //reset position + buff.resetPosition(); + ret2 = viewControl.parseDwg(version, &buff, bs); + if(ret) + ret = ret2; + } + delete[]tmpByteStr; + } + + mit = ObjectMap.find(hdr.ucsCtrl); + if (mit==ObjectMap.end()) { + DRW_DBG("\nWARNING: Ucs control not found\n"); + ret = false; + } else { + oc = mit->second; + ObjectMap.erase(mit); + DRW_DBG("\n**********Parsing Ucs control*******\n"); + DRW_DBG("Ucs Control Obj Handle= "); DRW_DBGH(oc.handle); DRW_DBG(" "); DRW_DBG(oc.loc); DRW_DBG("\n"); + DRW_ObjControl ucsControl; + dbuf->setPosition(oc.loc); + int size = dbuf->getModularShort(); + if (version > DRW::AC1021) //2010+ + bs = dbuf->getUModularChar(); + else + bs = 0; + tmpByteStr = new duint8[size]; + dbuf->getBytes(tmpByteStr, size); + dwgBuffer buff(tmpByteStr, size, &decoder); + //verify if object are correct + oType = buff.getObjType(version); + if (oType != 0x3E) { + DRW_DBG("\nWARNING: Not Ucs control object, found oType "); + DRW_DBG(oType); DRW_DBG(" instead 0x3E\n"); + ret = false; + } else { //reset position + buff.resetPosition(); + ret2 = ucsControl.parseDwg(version, &buff, bs); + if(ret) + ret = ret2; + } + delete[]tmpByteStr; + } + + if (version < DRW::AC1018) {//r2000- + mit = ObjectMap.find(hdr.vpEntHeaderCtrl); + if (mit==ObjectMap.end()) { + DRW_DBG("\nWARNING: vpEntHeader control not found\n"); + ret = false; + } else { + DRW_DBG("\n**********Parsing vpEntHeader control*******\n"); + oc = mit->second; + ObjectMap.erase(mit); + DRW_DBG("vpEntHeader Control Obj Handle= "); DRW_DBGH(oc.handle); DRW_DBG(" "); DRW_DBG(oc.loc); DRW_DBG("\n"); + DRW_ObjControl vpEntHeaderCtrl; + dbuf->setPosition(oc.loc); + int size = dbuf->getModularShort(); + if (version > DRW::AC1021) //2010+ + bs = dbuf->getUModularChar(); + else + bs = 0; + tmpByteStr = new duint8[size]; + dbuf->getBytes(tmpByteStr, size); + dwgBuffer buff(tmpByteStr, size, &decoder); + //verify if object are correct + oType = buff.getObjType(version); + if (oType != 0x46) { + DRW_DBG("\nWARNING: Not vpEntHeader control object, found oType "); + DRW_DBG(oType); DRW_DBG(" instead 0x46\n"); + ret = false; + } else { //reset position + buff.resetPosition(); +/* RLZ: writeme ret2 = vpEntHeader.parseDwg(version, &buff, bs); + if(ret) + ret = ret2;*/ + } + delete[]tmpByteStr; + } + } + } + + return ret; +} + +bool dwgReader::readDwgBlocks(DRW_Interface& intfa, dwgBuffer *dbuf){ + bool ret = true; + bool ret2 = true; + duint32 bs =0; + duint8 *tmpByteStr; + std::map::iterator mit; + DRW_DBG("\nobject map total size= "); DRW_DBG(ObjectMap.size()); + + for (std::map::iterator it=blockRecordmap.begin(); it != blockRecordmap.end(); ++it){ + DRW_Block_Record* bkr= it->second; + DRW_DBG("\nParsing Block, record handle= "); DRW_DBGH(it->first); DRW_DBG(" Name= "); DRW_DBG(bkr->name); DRW_DBG("\n"); + DRW_DBG("\nFinding Block, handle= "); DRW_DBGH(bkr->block); DRW_DBG("\n"); + mit = ObjectMap.find(bkr->block); + if (mit==ObjectMap.end()) { + DRW_DBG("\nWARNING: block entity not found\n"); + ret = false; + continue; + } + objHandle oc = mit->second; + ObjectMap.erase(mit); + DRW_DBG("Block Handle= "); DRW_DBGH(oc.handle); DRW_DBG(" Location: "); DRW_DBG(oc.loc); DRW_DBG("\n"); + if ( !(dbuf->setPosition(oc.loc)) ){ + DRW_DBG("Bad Location reading blocks\n"); + ret = false; + continue; + } + int size = dbuf->getModularShort(); + if (version > DRW::AC1021) //2010+ + bs = dbuf->getUModularChar(); + else + bs = 0; + tmpByteStr = new duint8[size]; + dbuf->getBytes(tmpByteStr, size); + dwgBuffer buff(tmpByteStr, size, &decoder); + DRW_Block bk; + ret2 = bk.parseDwg(version, &buff, bs); + delete[]tmpByteStr; + ret = ret && ret2; + parseAttribs(&bk); + //complete block entity with block record data + bk.basePoint = bkr->basePoint; + bk.flags = bkr->flags; + intfa.addBlock(bk); + //and update block record name + bkr->name = bk.name; + + /**read & send block entities**/ + // in dwg code 330 are not set like dxf in ModelSpace & PaperSpace, set it (RLZ: only tested in 2000) + if (bk.parentHandle == DRW::NoHandle) { + // in dwg code 330 are not set like dxf in ModelSpace & PaperSpace, set it + bk.parentHandle= bkr->handle; + //and do not send block entities like dxf + } else { + if (version < DRW::AC1018) { //pre 2004 + duint32 nextH = bkr->firstEH; + while (nextH != 0){ + mit = ObjectMap.find(nextH); + if (mit==ObjectMap.end()) { + nextH = bkr->lastEH;//end while if entity not foud + DRW_DBG("\nWARNING: Entity of block not found\n"); + ret = false; + continue; + } else {//foud entity reads it + oc = mit->second; + ObjectMap.erase(mit); + ret2 = readDwgEntity(dbuf, oc, intfa); + ret = ret && ret2; + } + if (nextH == bkr->lastEH) + nextH = 0; //redundant, but prevent read errors + else + nextH = nextEntLink; + } + } else {//2004+ + for (std::vector::iterator it = bkr->entMap.begin() ; it != bkr->entMap.end(); ++it){ + duint32 nextH = *it; + mit = ObjectMap.find(nextH); + if (mit==ObjectMap.end()) { + DRW_DBG("\nWARNING: Entity of block not found\n"); + ret = false; + continue; + } else {//foud entity reads it + oc = mit->second; + ObjectMap.erase(mit); + DRW_DBG("\nBlocks, parsing entity: "); DRW_DBGH(oc.handle); DRW_DBG(", pos: "); DRW_DBG(oc.loc); DRW_DBG("\n"); + ret2 = readDwgEntity(dbuf, oc, intfa); + ret = ret && ret2; + } + } + }//end 2004+ + } + + //end block entity, really needed to parse a dummy entity?? + mit = ObjectMap.find(bkr->endBlock); + if (mit==ObjectMap.end()) { + DRW_DBG("\nWARNING: end block entity not found\n"); + ret = false; + continue; + } + oc = mit->second; + ObjectMap.erase(mit); + DRW_DBG("End block Handle= "); DRW_DBGH(oc.handle); DRW_DBG(" Location: "); DRW_DBG(oc.loc); DRW_DBG("\n"); + dbuf->setPosition(oc.loc); + size = dbuf->getModularShort(); + if (version > DRW::AC1021) //2010+ + bs = dbuf->getUModularChar(); + else + bs = 0; + tmpByteStr = new duint8[size]; + dbuf->getBytes(tmpByteStr, size); + dwgBuffer buff1(tmpByteStr, size, &decoder); + DRW_Block end; + end.isEnd = true; + ret2 = end.parseDwg(version, &buff1, bs); + delete[]tmpByteStr; + ret = ret && ret2; + if (bk.parentHandle == DRW::NoHandle) bk.parentHandle= bkr->handle; + parseAttribs(&end); + intfa.endBlock(); + } + + return ret; +} + +bool dwgReader::readPlineVertex(DRW_Polyline& pline, dwgBuffer *dbuf){ + bool ret = true; + bool ret2 = true; + objHandle oc; + duint32 bs = 0; + std::map::iterator mit; + + if (version < DRW::AC1018) { //pre 2004 + duint32 nextH = pline.firstEH; + while (nextH != 0){ + mit = ObjectMap.find(nextH); + if (mit==ObjectMap.end()) { + nextH = pline.lastEH;//end while if entity not foud + DRW_DBG("\nWARNING: pline vertex not found\n"); + ret = false; + continue; + } else {//foud entity reads it + oc = mit->second; + ObjectMap.erase(mit); + DRW_Vertex vt; + dbuf->setPosition(oc.loc); + //RLZ: verify if pos is ok + int size = dbuf->getModularShort(); + if (version > DRW::AC1021) {//2010+ + bs = dbuf->getUModularChar(); + } + duint8 *tmpByteStr = new duint8[size]; + dbuf->getBytes(tmpByteStr, size); + dwgBuffer buff(tmpByteStr, size, &decoder); + dint16 oType = buff.getObjType(version); + buff.resetPosition(); + DRW_DBG(" object type= "); DRW_DBG(oType); DRW_DBG("\n"); + ret2 = vt.parseDwg(version, &buff, bs, pline.basePoint.z); + delete[]tmpByteStr; + pline.addVertex(vt); + nextEntLink = vt.nextEntLink; \ + prevEntLink = vt.prevEntLink; + ret = ret && ret2; + } + if (nextH == pline.lastEH) + nextH = 0; //redundant, but prevent read errors + else + nextH = nextEntLink; + } + } else {//2004+ + for (std::list::iterator it = pline.hadlesList.begin() ; it != pline.hadlesList.end(); ++it){ + duint32 nextH = *it; + mit = ObjectMap.find(nextH); + if (mit==ObjectMap.end()) { + DRW_DBG("\nWARNING: Entity of block not found\n"); + ret = false; + continue; + } else {//foud entity reads it + oc = mit->second; + ObjectMap.erase(mit); + DRW_DBG("\nPline vertex, parsing entity: "); DRW_DBGH(oc.handle); DRW_DBG(", pos: "); DRW_DBG(oc.loc); DRW_DBG("\n"); + DRW_Vertex vt; + dbuf->setPosition(oc.loc); + //RLZ: verify if pos is ok + int size = dbuf->getModularShort(); + if (version > DRW::AC1021) {//2010+ + bs = dbuf->getUModularChar(); + } + duint8 *tmpByteStr = new duint8[size]; + dbuf->getBytes(tmpByteStr, size); + dwgBuffer buff(tmpByteStr, size, &decoder); + dint16 oType = buff.getObjType(version); + buff.resetPosition(); + DRW_DBG(" object type= "); DRW_DBG(oType); DRW_DBG("\n"); + ret2 = vt.parseDwg(version, &buff, bs, pline.basePoint.z); + delete[]tmpByteStr; + pline.addVertex(vt); + nextEntLink = vt.nextEntLink; \ + prevEntLink = vt.prevEntLink; + ret = ret && ret2; + } + } + }//end 2004+ + DRW_DBG("\nRemoved SEQEND entity: "); DRW_DBGH(pline.seqEndH.ref);DRW_DBG("\n"); + ObjectMap.erase(pline.seqEndH.ref); + + return ret; +} + +bool dwgReader::readDwgEntities(DRW_Interface& intfa, dwgBuffer *dbuf){ + bool ret = true; + bool ret2 = true; + + DRW_DBG("\nobject map total size= "); DRW_DBG(ObjectMap.size()); + std::map::iterator itB=ObjectMap.begin(); + std::map::iterator itE=ObjectMap.end(); + while (itB != itE){ + ret2 = readDwgEntity(dbuf, itB->second, intfa); + ObjectMap.erase(itB); + itB=ObjectMap.begin(); + if (ret) + ret = ret2; + } + return ret; +} + +/** + * Reads a dwg drawing entity (dwg object entity) given its offset in the file + */ +bool dwgReader::readDwgEntity(dwgBuffer *dbuf, objHandle& obj, DRW_Interface& intfa){ + bool ret = true; + duint32 bs = 0; + +#define ENTRY_PARSE(e) \ + ret = e.parseDwg(version, &buff, bs); \ + parseAttribs(&e); \ + nextEntLink = e.nextEntLink; \ + prevEntLink = e.prevEntLink; + + nextEntLink = prevEntLink = 0;// set to 0 to skip unimplemented entities + dbuf->setPosition(obj.loc); + //verify if position is ok: + if (!dbuf->isGood()){ + DRW_DBG(" Warning: readDwgEntity, bad location\n"); + return false; + } + int size = dbuf->getModularShort(); + if (version > DRW::AC1021) {//2010+ + bs = dbuf->getUModularChar(); + } + duint8 *tmpByteStr = new duint8[size]; + dbuf->getBytes(tmpByteStr, size); + //verify if getBytes is ok: + if (!dbuf->isGood()){ + DRW_DBG(" Warning: readDwgEntity, bad size\n"); + delete[]tmpByteStr; + return false; + } + dwgBuffer buff(tmpByteStr, size, &decoder); + dint16 oType = buff.getObjType(version); + buff.resetPosition(); + + if (oType > 499){ + std::map::iterator it = classesmap.find(oType); + if (it == classesmap.end()){//fail, not found in classes set error + DRW_DBG("Class "); DRW_DBG(oType);DRW_DBG("not found, handle: "); DRW_DBG(obj.handle); DRW_DBG("\n"); + delete[]tmpByteStr; + return false; + } else { + DRW_Class *cl = it->second; + if (cl->dwgType != 0) + oType = cl->dwgType; + } + } + + obj.type = oType; + switch (oType){ + case 17: { + DRW_Arc e; + ENTRY_PARSE(e) + intfa.addArc(e); + break; } + case 18: { + DRW_Circle e; + ENTRY_PARSE(e) + intfa.addCircle(e); + break; } + case 19:{ + DRW_Line e; + ENTRY_PARSE(e) + intfa.addLine(e); + break;} + case 27: { + DRW_Point e; + ENTRY_PARSE(e) + intfa.addPoint(e); + break; } + case 35: { + DRW_Ellipse e; + ENTRY_PARSE(e) + intfa.addEllipse(e); + break; } + case 7: + case 8: {//minsert = 8 + DRW_Insert e; + ENTRY_PARSE(e) + e.name = findTableName(DRW::BLOCK_RECORD, e.blockRecH.ref);//RLZ: find as block or blockrecord (ps & ps0) + intfa.addInsert(e); + break; } + case 77: { + DRW_LWPolyline e; + ENTRY_PARSE(e) + intfa.addLWPolyline(e); + break; } + case 1: { + DRW_Text e; + ENTRY_PARSE(e) + e.style = findTableName(DRW::STYLE, e.styleH.ref); + intfa.addText(e); + break; } + case 44: { + DRW_MText e; + ENTRY_PARSE(e) + e.style = findTableName(DRW::STYLE, e.styleH.ref); + intfa.addMText(e); + break; } + case 28: { + DRW_3Dface e; + ENTRY_PARSE(e) + intfa.add3dFace(e); + break; } + case 20: { + DRW_DimOrdinate e; + ENTRY_PARSE(e) + e.style = findTableName(DRW::DIMSTYLE, e.dimStyleH.ref); + intfa.addDimOrdinate(&e); + break; } + case 21: { + DRW_DimLinear e; + ENTRY_PARSE(e) + e.style = findTableName(DRW::DIMSTYLE, e.dimStyleH.ref); + intfa.addDimLinear(&e); + break; } + case 22: { + DRW_DimAligned e; + ENTRY_PARSE(e) + e.style = findTableName(DRW::DIMSTYLE, e.dimStyleH.ref); + intfa.addDimAlign(&e); + break; } + case 23: { + DRW_DimAngular3p e; + ENTRY_PARSE(e) + e.style = findTableName(DRW::DIMSTYLE, e.dimStyleH.ref); + intfa.addDimAngular3P(&e); + break; } + case 24: { + DRW_DimAngular e; + ENTRY_PARSE(e) + e.style = findTableName(DRW::DIMSTYLE, e.dimStyleH.ref); + intfa.addDimAngular(&e); + break; } + case 25: { + DRW_DimRadial e; + ENTRY_PARSE(e) + e.style = findTableName(DRW::DIMSTYLE, e.dimStyleH.ref); + intfa.addDimRadial(&e); + break; } + case 26: { + DRW_DimDiametric e; + ENTRY_PARSE(e) + e.style = findTableName(DRW::DIMSTYLE, e.dimStyleH.ref); + intfa.addDimDiametric(&e); + break; } + case 45: { + DRW_Leader e; + ENTRY_PARSE(e) + e.style = findTableName(DRW::DIMSTYLE, e.dimStyleH.ref); + intfa.addLeader(&e); + break; } + case 31: { + DRW_Solid e; + ENTRY_PARSE(e) + intfa.addSolid(e); + break; } + case 78: { + DRW_Hatch e; + ENTRY_PARSE(e) + intfa.addHatch(&e); + break; } + case 32: { + DRW_Trace e; + ENTRY_PARSE(e) + intfa.addTrace(e); + break; } + case 34: { + DRW_Viewport e; + ENTRY_PARSE(e) + intfa.addViewport(e); + break; } + case 36: { + DRW_Spline e; + ENTRY_PARSE(e) + intfa.addSpline(&e); + break; } + case 40: { + DRW_Ray e; + ENTRY_PARSE(e) + intfa.addRay(e); + break; } + case 15: // pline 2D + case 16: // pline 3D + case 29: { // pline PFACE + DRW_Polyline e; + ENTRY_PARSE(e) + readPlineVertex(e, dbuf); + intfa.addPolyline(e); + break; } +// case 30: { +// DRW_Polyline e;// MESH (not pline) +// ENTRY_PARSE(e) +// intfa.addRay(e); +// break; } + case 41: { + DRW_Xline e; + ENTRY_PARSE(e) + intfa.addXline(e); + break; } + case 101: { + DRW_Image e; + ENTRY_PARSE(e) + intfa.addImage(&e); + break; } + + default: + //not supported or are object add to remaining map + objObjectMap[obj.handle]= obj; + break; + } + if (!ret){ + DRW_DBG("Warning: Entity type "); DRW_DBG(oType);DRW_DBG("has failed, handle: "); DRW_DBG(obj.handle); DRW_DBG("\n"); + } + delete[]tmpByteStr; + return ret; +} + +bool dwgReader::readDwgObjects(DRW_Interface& intfa, dwgBuffer *dbuf){ + bool ret = true; + bool ret2 = true; + + duint32 i=0; + DRW_DBG("\nentities map total size= "); DRW_DBG(ObjectMap.size()); + DRW_DBG("\nobjects map total size= "); DRW_DBG(objObjectMap.size()); + std::map::iterator itB=objObjectMap.begin(); + std::map::iterator itE=objObjectMap.end(); + while (itB != itE){ + ret2 = readDwgObject(dbuf, itB->second, intfa); + objObjectMap.erase(itB); + itB=objObjectMap.begin(); + if (ret) + ret = ret2; + } + if (DRW_DBGGL == DRW_dbg::DEBUG) { + for (std::map::iterator it=remainingMap.begin(); it != remainingMap.end(); ++it){ + DRW_DBG("\nnum.# "); DRW_DBG(i++); DRW_DBG(" Remaining object Handle, loc, type= "); DRW_DBG(it->first); + DRW_DBG(" "); DRW_DBG(it->second.loc); DRW_DBG(" "); DRW_DBG(it->second.type); + } + DRW_DBG("\n"); + } + return ret; +} + +/** + * Reads a dwg drawing object (dwg object object) given its offset in the file + */ +bool dwgReader::readDwgObject(dwgBuffer *dbuf, objHandle& obj, DRW_Interface& intfa){ + bool ret = true; + duint32 bs = 0; + + dbuf->setPosition(obj.loc); + //verify if position is ok: + if (!dbuf->isGood()){ + DRW_DBG(" Warning: readDwgObject, bad location\n"); + return false; + } + int size = dbuf->getModularShort(); + if (version > DRW::AC1021) {//2010+ + bs = dbuf->getUModularChar(); + } + duint8 *tmpByteStr = new duint8[size]; + dbuf->getBytes(tmpByteStr, size); + //verify if getBytes is ok: + if (!dbuf->isGood()){ + DRW_DBG(" Warning: readDwgObject, bad size\n"); + delete[]tmpByteStr; + return false; + } + dwgBuffer buff(tmpByteStr, size, &decoder); + //oType are set parsing entities + dint16 oType = obj.type; + + switch (oType){ + case 102: { + DRW_ImageDef e; + ret = e.parseDwg(version, &buff, bs); + intfa.linkImage(&e); + break; } + default: + //not supported object or entity add to remaining map for debug + remainingMap[obj.handle]= obj; + break; + } + if (!ret){ + DRW_DBG("Warning: Object type "); DRW_DBG(oType);DRW_DBG("has failed, handle: "); DRW_DBG(obj.handle); DRW_DBG("\n"); + } + delete[]tmpByteStr; + return ret; +} + + + +bool DRW_ObjControl::parseDwg(DRW::Version version, dwgBuffer *buf, duint32 bs){ +int unkData=0; + bool ret = DRW_TableEntry::parseDwg(version, buf, NULL, bs); + DRW_DBG("\n***************************** parsing object control entry *********************************************\n"); + if (!ret) + return ret; + //last parsed is: XDic Missing Flag 2004+ + int numEntries = buf->getBitLong(); + DRW_DBG(" num entries: "); DRW_DBG(numEntries); DRW_DBG("\n"); + DRW_DBG("Remaining bytes: "); DRW_DBG(buf->numRemainingBytes()); DRW_DBG("\n"); + +// if (oType == 68 && version== DRW::AC1015){//V2000 dimstyle seems have one unknown byte hard handle counter?? + if (oType == 68 && version > DRW::AC1014){//dimstyle seems have one unknown byte hard handle counter?? + unkData = buf->getRawChar8(); + DRW_DBG(" unknown v2000 byte: "); DRW_DBG( unkData); DRW_DBG("\n"); + } + if (version > DRW::AC1018){//from v2007+ have a bit for strings follows (ObjControl do not have) + int stringBit = buf->getBit(); + DRW_DBG(" string bit for v2007+: "); DRW_DBG( stringBit); DRW_DBG("\n"); + } + + dwgHandle objectH = buf->getHandle(); + DRW_DBG(" NULL Handle: "); DRW_DBGHL(objectH.code, objectH.size, objectH.ref); DRW_DBG("\n"); + DRW_DBG("Remaining bytes: "); DRW_DBG(buf->numRemainingBytes()); DRW_DBG("\n"); + +// if (oType == 56 && version== DRW::AC1015){//linetype in 2004 seems not have XDicObjH or NULL handle + if (xDictFlag !=1){//linetype in 2004 seems not have XDicObjH or NULL handle + dwgHandle XDicObjH = buf->getHandle(); + DRW_DBG(" XDicObj control Handle: "); DRW_DBGHL(XDicObjH.code, XDicObjH.size, XDicObjH.ref); DRW_DBG("\n"); + DRW_DBG("Remaining bytes: "); DRW_DBG(buf->numRemainingBytes()); DRW_DBG("\n"); + } +//add 2 for modelspace, paperspace blocks & bylayer, byblock linetypes + numEntries = ((oType == 48) || (oType == 56)) ? (numEntries +2) : numEntries; + + for (int i =0; i< numEntries; i++){ + objectH = buf->getOffsetHandle(handle); + if (objectH.ref != 0) //in vports R14 I found some NULL handles + hadlesList.push_back (objectH.ref); + DRW_DBG(" objectH Handle: "); DRW_DBGHL(objectH.code, objectH.size, objectH.ref); DRW_DBG("\n"); + DRW_DBG("Remaining bytes: "); DRW_DBG(buf->numRemainingBytes()); DRW_DBG("\n"); + } + + for (int i =0; i< unkData; i++){ + objectH = buf->getOffsetHandle(handle); + DRW_DBG(" unknown Handle: "); DRW_DBGHL(objectH.code, objectH.size, objectH.ref); DRW_DBG("\n"); + DRW_DBG("Remaining bytes: "); DRW_DBG(buf->numRemainingBytes()); DRW_DBG("\n"); + } + return buf->isGood(); +} diff --git a/extlib/libdxfrw/intern/dwgreader.h b/extlib/libdxfrw/intern/dwgreader.h new file mode 100644 index 0000000..4e88932 --- /dev/null +++ b/extlib/libdxfrw/intern/dwgreader.h @@ -0,0 +1,203 @@ +/****************************************************************************** +** libDXFrw - Library to read/write DXF files (ascii & binary) ** +** ** +** Copyright (C) 2011-2015 José F. Soriano, rallazz@gmail.com ** +** ** +** This library is free software, licensed under the terms of the GNU ** +** General Public License as published by the Free Software Foundation, ** +** either version 2 of the License, or (at your option) any later version. ** +** You should have received a copy of the GNU General Public License ** +** along with this program. If not, see . ** +******************************************************************************/ + +#ifndef DWGREADER_H +#define DWGREADER_H + +#include +#include +#include "drw_textcodec.h" +#include "dwgutil.h" +#include "dwgbuffer.h" +#include "../libdwgr.h" + +class objHandle{ +public: + objHandle(){ handle = type = loc = 0; } + objHandle(duint32 t, duint32 h, duint32 l){ + type = t; + handle = h; + loc = l; + } + duint32 type; + duint32 handle; + duint32 loc; +}; + +//until 2000 = 2000- +//since 2004 except 2007 = 2004+ +// 2007 = 2007 +// pages of section +/* 2000-: No pages, only sections + * 2004+: Id, page number (index) + * size, size of page in file stream + * address, address in file stream + * dataSize, data size for this page + * startOffset, start offset for this page + * cSize, compresed size of data + * uSize, uncompresed size of data + * 2007: page Id, pageCount & pages + * size, size in file + * dataSize + * startOffset, start position in decompresed data stream + * cSize, compresed size of data + * uSize, uncompresed size of data + * address, address in file stream + * */ +class dwgPageInfo { +public: + dwgPageInfo(){} + dwgPageInfo(duint64 i, duint64 ad, duint32 sz){ + Id=i; address=ad; size=sz; + } + ~dwgPageInfo(){} + duint64 Id; + duint64 address; //in file stream, for rd18, rd21 + duint64 size; //in file stream, for rd18, rd21 + duint64 dataSize; //for rd18, rd21 + duint32 startOffset; //for rd18, rd21 + duint64 cSize; //compresed page size, for rd21 + duint64 uSize; //uncompresed page size, for rd21 +}; + +// sections of file +/* 2000-: No pages, only section Id, size & address in file + * 2004+: Id, Section Id + * size, total size of uncompresed data + * pageCount & pages, number of pages in section + * maxSize, max decompressed Size per page + * compresed, (1 = no, 2 = yes, normally 2) + * encrypted, (0 = no, 1 = yes, 2 = unknown) + * name, read & stored but not used + * 2007: same as 2004+ except encoding, saved in compresed field + * */ +class dwgSectionInfo { +public: + dwgSectionInfo(){ + compresed = 1;//1=no, 2=yes + encrypted = 0;//??? + pageCount = 0; + Id=-1; + } + ~dwgSectionInfo(){} + dint32 Id; //section Id, 2000- rd15 rd18 + std::string name; //section name rd18 + duint32 compresed;//is compresed? 1=no, 2=yes rd18, rd21(encoding) + duint32 encrypted;//encrypted (doc: 0=no, 1=yes, 2=unkn) on read: objects 0 and encrypted yes rd18 + std::mappages;//index, size, offset + duint64 size;//size of section, 2000- rd15, rd18, rd21 (data size) + duint64 pageCount; //number of pages (dwgPageInfo) in section rd18, rd21 + duint64 maxSize; //max decompressed size (needed??) rd18 rd21 + duint64 address; //address (seek) , 2000- +}; + + +//! Class to handle dwg obj control entries +/*! +* Class to handle dwg obj control entries +* @author Rallaz +*/ +class DRW_ObjControl : public DRW_TableEntry { +public: + DRW_ObjControl() { reset();} + + void reset(){ + } + bool parseDwg(DRW::Version version, dwgBuffer *buf, duint32 bs=0); + std::listhadlesList; +}; + + +class dwgReader { + friend class dwgR; +public: + dwgReader(std::istream *stream, dwgR *p){ + fileBuf = new dwgBuffer(stream); + parent = p; + decoder.setVersion(DRW::AC1021, false);//default 2007 in utf8(no convert) + decoder.setCodePage("UTF-16", false); +// blockCtrl=0; //RLZ: temporary +// blockCtrl=layerCtrl=styleCtrl=linetypeCtrl=viewCtrl=0; +// ucsCtrl=vportCtrl=appidCtrl=dimstyleCtrl=vpEntHeaderCtrl=0; + nextEntLink = prevEntLink = 0; + maintenanceVersion=0; + } + virtual ~dwgReader(); + +protected: + virtual bool readMetaData() = 0; + virtual bool readPreview(){return false;} + virtual bool readFileHeader() = 0; + virtual bool readDwgHeader(DRW_Header& hdr)=0; + virtual bool readDwgClasses() = 0; + virtual bool readDwgHandles() = 0; + virtual bool readDwgTables(DRW_Header& hdr)=0; + virtual bool readDwgBlocks(DRW_Interface& intfa) = 0; + virtual bool readDwgEntities(DRW_Interface& intfa) = 0; + virtual bool readDwgObjects(DRW_Interface& intfa) = 0; + + virtual bool readDwgEntity(dwgBuffer *dbuf, objHandle& obj, DRW_Interface& intfa); + bool readDwgObject(dwgBuffer *dbuf, objHandle& obj, DRW_Interface& intfa); + void parseAttribs(DRW_Entity* e); + std::string findTableName(DRW::TTYPE table, dint32 handle); + + void setCodePage(std::string *c){decoder.setCodePage(c, false);} + std::string getCodePage(){ return decoder.getCodePage();} + bool readDwgHeader(DRW_Header& hdr, dwgBuffer *buf, dwgBuffer *hBuf); + bool readDwgHandles(dwgBuffer *dbuf, duint32 offset, duint32 size); + bool readDwgTables(DRW_Header& hdr, dwgBuffer *dbuf); + bool checkSentinel(dwgBuffer *buf, enum secEnum::DWGSection, bool start); + + bool readDwgBlocks(DRW_Interface& intfa, dwgBuffer *dbuf); + bool readDwgEntities(DRW_Interface& intfa, dwgBuffer *dbuf); + bool readDwgObjects(DRW_Interface& intfa, dwgBuffer *dbuf); + bool readPlineVertex(DRW_Polyline& pline, dwgBuffer *dbuf); + +public: + std::mapObjectMap; + std::mapobjObjectMap; //stores the ojects & entities not read in readDwgEntities + std::mapremainingMap; //stores the ojects & entities not read in all proces, for debug only + std::map ltypemap; + std::map layermap; + std::map blockmap; + std::map stylemap; + std::map dimstylemap; + std::map vportmap; + std::map blockRecordmap; + std::map appIdmap; +// duint32 currBlock; + duint8 maintenanceVersion; + +protected: + dwgBuffer *fileBuf; + dwgR *parent; + DRW::Version version; + +//seeker (position) for the beginning sentinel of the image data (R13 to R15) + duint32 previewImagePos; + +//sections map + std::mapsections; + std::map classesmap; + +protected: + DRW_TextCodec decoder; + +protected: +// duint32 blockCtrl; + duint32 nextEntLink; + duint32 prevEntLink; +}; + + + +#endif // DWGREADER_H diff --git a/extlib/libdxfrw/intern/dwgreader15.cpp b/extlib/libdxfrw/intern/dwgreader15.cpp new file mode 100644 index 0000000..41bbe9b --- /dev/null +++ b/extlib/libdxfrw/intern/dwgreader15.cpp @@ -0,0 +1,198 @@ +/****************************************************************************** +** libDXFrw - Library to read/write DXF files (ascii & binary) ** +** ** +** Copyright (C) 2011-2015 José F. Soriano, rallazz@gmail.com ** +** ** +** This library is free software, licensed under the terms of the GNU ** +** General Public License as published by the Free Software Foundation, ** +** either version 2 of the License, or (at your option) any later version. ** +** You should have received a copy of the GNU General Public License ** +** along with this program. If not, see . ** +******************************************************************************/ + +#include +#include +#include +#include +#include +#include "drw_dbg.h" +#include "dwgreader15.h" +#include "drw_textcodec.h" +#include "../libdwgr.h" + +bool dwgReader15::readMetaData() { + version = parent->getVersion(); + decoder.setVersion(version, false); + DRW_DBG("dwgReader15::readMetaData\n"); + if (! fileBuf->setPosition(13)) + return false; + previewImagePos = fileBuf->getRawLong32(); + DRW_DBG("previewImagePos (seekerImageData) = "); DRW_DBG(previewImagePos); + /* MEASUREMENT system variable 2 bytes*/ + duint16 meas = fileBuf->getRawShort16(); + DRW_DBG("\nMEASUREMENT (0 = English, 1 = Metric)= "); DRW_DBG(meas); + duint16 cp = fileBuf->getRawShort16(); + DRW_DBG("\ncodepage= "); DRW_DBG(cp); DRW_DBG("\n"); + if (cp == 29) //TODO RLZ: locate wath code page and correct this + decoder.setCodePage("ANSI_1252", false); + if (cp == 30) + decoder.setCodePage("ANSI_1252", false); + return true; +} + +bool dwgReader15::readFileHeader() { + bool ret = true; + DRW_DBG("dwgReader15::readFileHeader\n"); + if (! fileBuf->setPosition(21)) + return false; + duint32 count = fileBuf->getRawLong32(); + DRW_DBG("count records= "); DRW_DBG(count); DRW_DBG("\n"); + + for (unsigned int i = 0; i < count; i++) { + duint8 rec = fileBuf->getRawChar8(); + duint32 address = fileBuf->getRawLong32(); + duint32 size = fileBuf->getRawLong32(); + dwgSectionInfo si; + si.Id = rec; + si.size = size; + si.address = address; + if (rec == 0) { + DRW_DBG("\nSection HEADERS address= "); + DRW_DBG(address); DRW_DBG(" size= "); DRW_DBG(size); + sections[secEnum::HEADER] = si; + } else if (rec == 1) { + DRW_DBG("\nSection CLASSES address= "); + DRW_DBG(address); DRW_DBG(" size= "); DRW_DBG(size); + sections[secEnum::CLASSES] = si; + } else if (rec == 2) { + DRW_DBG("\nSection OBJECTS (handles) address= "); + DRW_DBG(address); DRW_DBG(" size= "); DRW_DBG(size); + sections[secEnum::HANDLES] = si; + } else if (rec == 3) { + DRW_DBG("\nSection UNKNOWN address= "); + DRW_DBG(address); DRW_DBG(" size= "); DRW_DBG(size); + sections[secEnum::UNKNOWNS] = si; + } else if (rec == 4) { + DRW_DBG("\nSection R14DATA (AcDb:Template) address= "); + DRW_DBG(address); DRW_DBG(" size= "); DRW_DBG(size); + sections[secEnum::TEMPLATE] = si; + } else if (rec == 5) { + DRW_DBG("\nSection R14REC5 (AcDb:AuxHeader) address= "); + DRW_DBG(address); DRW_DBG(" size= "); DRW_DBG(size); + sections[secEnum::AUXHEADER] = si; + } else { + std::cerr << "\nUnsupported section number\n"; + } + } + if (! fileBuf->isGood()) + return false; + DRW_DBG("\nposition after read section locator records= "); DRW_DBG(fileBuf->getPosition()); + DRW_DBG(", bit are= "); DRW_DBG(fileBuf->getBitPos()); + duint32 ckcrc = fileBuf->crc8(0,0,fileBuf->getPosition()); + DRW_DBG("\nfile header crc8 0 result= "); DRW_DBG(ckcrc); + switch (count){ + case 3: + ckcrc = ckcrc ^ 0xA598; + break; + case 4: + ckcrc = ckcrc ^ 0x8101; + break; + case 5: + ckcrc = ckcrc ^ 0x3CC4; + break; + case 6: + ckcrc = ckcrc ^ 0x8461; + } + DRW_DBG("\nfile header crc8 xor result= "); DRW_DBG(ckcrc); + DRW_DBG("\nfile header CRC= "); DRW_DBG(fileBuf->getRawShort16()); + DRW_DBG("\nfile header sentinel= "); + checkSentinel(fileBuf, secEnum::FILEHEADER, false); + + DRW_DBG("\nposition after read file header sentinel= "); DRW_DBG(fileBuf->getPosition()); + DRW_DBG(", bit are= "); DRW_DBG(fileBuf->getBitPos()); + + DRW_DBG("\ndwgReader15::readFileHeader END\n"); + return ret; +} + +bool dwgReader15::readDwgHeader(DRW_Header& hdr){ + DRW_DBG("dwgReader15::readDwgHeader\n"); + dwgSectionInfo si = sections[secEnum::HEADER]; + if (si.Id<0)//not found, ends + return false; + if (!fileBuf->setPosition(si.address)) + return false; + duint8 *tmpByteStr = new duint8[si.size]; + fileBuf->getBytes(tmpByteStr, si.size); + dwgBuffer buff(tmpByteStr, si.size, &decoder); + DRW_DBG("Header section sentinel= "); + checkSentinel(&buff, secEnum::HEADER, true); + bool ret = dwgReader::readDwgHeader(hdr, &buff, &buff); + delete[]tmpByteStr; + return ret; +} + + +bool dwgReader15::readDwgClasses(){ + DRW_DBG("\ndwgReader15::readDwgClasses\n"); + dwgSectionInfo si = sections[secEnum::CLASSES]; + if (si.Id<0)//not found, ends + return false; + if (!fileBuf->setPosition(si.address)) + return false; + + DRW_DBG("classes section sentinel= "); + checkSentinel(fileBuf, secEnum::CLASSES, true); + + duint32 size = fileBuf->getRawLong32(); + if (size != (si.size - 38)) { + DRW_DBG("\nWARNING dwgReader15::readDwgClasses size are "); DRW_DBG(size); + DRW_DBG(" and secSize - 38 are "); DRW_DBG(si.size - 38); DRW_DBG("\n"); + } + duint8 *tmpByteStr = new duint8[size]; + fileBuf->getBytes(tmpByteStr, size); + dwgBuffer buff(tmpByteStr, size, &decoder); + size--; //reduce 1 byte instead of check pos + bitPos + while (size > buff.getPosition()) { + DRW_Class *cl = new DRW_Class(); + cl->parseDwg(version, &buff, &buff); + classesmap[cl->classNum] = cl; + } + DRW_DBG("\nCRC: "); DRW_DBGH(fileBuf->getRawShort16()); + DRW_DBG("\nclasses section end sentinel= "); + checkSentinel(fileBuf, secEnum::CLASSES, false); + bool ret = buff.isGood(); + delete[]tmpByteStr; + return ret; +} + +bool dwgReader15::readDwgHandles() { + DRW_DBG("\ndwgReader15::readDwgHandles\n"); + dwgSectionInfo si = sections[secEnum::HANDLES]; + if (si.Id<0)//not found, ends + return false; + + bool ret = dwgReader::readDwgHandles(fileBuf, si.address, si.size); + return ret; +} + +/*********** objects ************************/ +/** + * Reads all the object referenced in the object map section of the DWG file + * (using their object file offsets) + */ +bool dwgReader15::readDwgTables(DRW_Header& hdr) { + bool ret = dwgReader::readDwgTables(hdr, fileBuf); + + return ret; +} + +/** + * Reads all the object referenced in the object map section of the DWG file + * (using their object file offsets) + */ +bool dwgReader15::readDwgBlocks(DRW_Interface& intfa) { + bool ret = true; + ret = dwgReader::readDwgBlocks(intfa, fileBuf); + return ret; +} diff --git a/extlib/libdxfrw/intern/dwgreader15.h b/extlib/libdxfrw/intern/dwgreader15.h new file mode 100644 index 0000000..e3a1f97 --- /dev/null +++ b/extlib/libdxfrw/intern/dwgreader15.h @@ -0,0 +1,47 @@ +/****************************************************************************** +** libDXFrw - Library to read/write DXF files (ascii & binary) ** +** ** +** Copyright (C) 2011-2015 José F. Soriano, rallazz@gmail.com ** +** ** +** This library is free software, licensed under the terms of the GNU ** +** General Public License as published by the Free Software Foundation, ** +** either version 2 of the License, or (at your option) any later version. ** +** You should have received a copy of the GNU General Public License ** +** along with this program. If not, see . ** +******************************************************************************/ + +#ifndef DWGREADER15_H +#define DWGREADER15_H + +#include +#include +#include "drw_textcodec.h" +#include "dwgbuffer.h" +#include "dwgreader.h" + +class dwgReader15 : public dwgReader { +public: + dwgReader15(std::istream *stream, dwgR *p):dwgReader(stream, p){ } + virtual ~dwgReader15() {} + bool readMetaData(); + bool readFileHeader(); + bool readDwgHeader(DRW_Header& hdr); + bool readDwgClasses(); + bool readDwgHandles(); + bool readDwgTables(DRW_Header& hdr); + bool readDwgBlocks(DRW_Interface& intfa); + bool readDwgEntities(DRW_Interface& intfa){ + bool ret = true; + ret = dwgReader::readDwgEntities(intfa, fileBuf); + return ret; + } + bool readDwgObjects(DRW_Interface& intfa){ + bool ret = true; + ret = dwgReader::readDwgObjects(intfa, fileBuf); + return ret; + } +// bool readDwgEntity(objHandle& obj, DRW_Interface& intfa); +}; + + +#endif // DWGREADER15_H diff --git a/extlib/libdxfrw/intern/dwgreader18.cpp b/extlib/libdxfrw/intern/dwgreader18.cpp new file mode 100644 index 0000000..d91b92e --- /dev/null +++ b/extlib/libdxfrw/intern/dwgreader18.cpp @@ -0,0 +1,594 @@ +/****************************************************************************** +** libDXFrw - Library to read/write DXF files (ascii & binary) ** +** ** +** Copyright (C) 2011-2015 José F. Soriano, rallazz@gmail.com ** +** ** +** This library is free software, licensed under the terms of the GNU ** +** General Public License as published by the Free Software Foundation, ** +** either version 2 of the License, or (at your option) any later version. ** +** You should have received a copy of the GNU General Public License ** +** along with this program. If not, see . ** +******************************************************************************/ + +#include +#include +#include +#include +#include +#include "drw_dbg.h" +#include "dwgreader18.h" +#include "dwgutil.h" +#include "drw_textcodec.h" +#include "../libdwgr.h" + +void dwgReader18::genMagicNumber(){ + int size =0x114; + duint8 *tmpMagicStr = new duint8[size]; + duint8 *p = tmpMagicStr; + int rSeed =1; + while (size--) { + rSeed *= 0x343fd; + rSeed += 0x269ec3; + *p++ = static_cast(rSeed >> 0x10); + } + int j = 0; + size =0x114; + for (int i=0; i< size;i++) { + DRW_DBGH(tmpMagicStr[i]); + if (j == 15) { + DRW_DBG("\n"); + j = 0; + } else { + DRW_DBG(", "); + j++; + } + } + delete[]tmpMagicStr; +} + +duint32 dwgReader18::checksum(duint32 seed, duint8* data, duint32 sz){ + duint32 size = sz; + duint32 sum1 = seed & 0xffff; + duint32 sum2 = seed >> 0x10; + while (size != 0) { +// duint32 chunkSize = min(0x15b0, size); + duint32 chunkSize = 0x15b0 < size? 0x15b0:size; + size -= chunkSize; + for (duint32 i = 0; i < chunkSize; i++) { + sum1 += *data++; + sum2 += sum1; + } + sum1 %= 0xFFF1; + sum2 %= 0xFFF1; + } + return (sum2 << 0x10) | (sum1 & 0xffff); +} + + //called: Section page map: 0x41630e3b +void dwgReader18::parseSysPage(duint8 *decompSec, duint32 decompSize){ + DRW_DBG("\nparseSysPage:\n "); + duint32 compSize = fileBuf->getRawLong32(); + DRW_DBG("Compressed size= "); DRW_DBG(compSize); DRW_DBG(", "); DRW_DBGH(compSize); + DRW_DBG("\nCompression type= "); DRW_DBGH(fileBuf->getRawLong32()); + DRW_DBG("\nSection page checksum= "); DRW_DBGH(fileBuf->getRawLong32()); DRW_DBG("\n"); + + duint8 hdrData[20]; + fileBuf->moveBitPos(-160); + fileBuf->getBytes(hdrData, 20); + for (duint8 i= 16; i<20; ++i) + hdrData[i]=0; + duint32 calcsH = checksum(0, hdrData, 20); + DRW_DBG("Calc hdr checksum= "); DRW_DBGH(calcsH); + duint8 *tmpCompSec = new duint8[compSize]; + fileBuf->getBytes(tmpCompSec, compSize); + duint32 calcsD = checksum(calcsH, tmpCompSec, compSize); + DRW_DBG("\nCalc data checksum= "); DRW_DBGH(calcsD); DRW_DBG("\n"); + +#ifdef DRW_DBG_DUMP + for (unsigned int i=0, j=0; i< compSize;i++) { + DRW_DBGH( (unsigned char)compSec[i]); + if (j == 7) { DRW_DBG("\n"); j = 0; + } else { DRW_DBG(", "); j++; } + } DRW_DBG("\n"); +#endif + DRW_DBG("decompresing "); DRW_DBG(compSize); DRW_DBG(" bytes in "); DRW_DBG(decompSize); DRW_DBG(" bytes\n"); + dwgCompressor comp; + comp.decompress18(tmpCompSec, decompSec, compSize, decompSize); +#ifdef DRW_DBG_DUMP + for (unsigned int i=0, j=0; i< decompSize;i++) { + DRW_DBGH( decompSec[i]); + if (j == 7) { DRW_DBG("\n"); j = 0; + } else { DRW_DBG(", "); j++; } + } DRW_DBG("\n"); +#endif + delete[]tmpCompSec; +} + + //called ???: Section map: 0x4163003b +bool dwgReader18::parseDataPage(dwgSectionInfo si/*, duint8 *dData*/){ + DRW_DBG("\nparseDataPage\n "); + objData = new duint8 [si.pageCount * si.maxSize]; + + for (std::map::iterator it=si.pages.begin(); it!=si.pages.end(); ++it){ + dwgPageInfo pi = it->second; + if (!fileBuf->setPosition(pi.address)) + return false; + //decript section header + duint8 hdrData[32]; + fileBuf->getBytes(hdrData, 32); + dwgCompressor::decrypt18Hdr(hdrData, 32, pi.address); + DRW_DBG("Section "); DRW_DBG(si.name); DRW_DBG(" page header=\n"); + for (unsigned int i=0, j=0; i< 32;i++) { + DRW_DBGH( (unsigned char)hdrData[i]); + if (j == 7) { + DRW_DBG("\n"); + j = 0; + } else { + DRW_DBG(", "); + j++; + } + } DRW_DBG("\n"); + + DRW_DBG("\n Page number= "); DRW_DBGH(pi.Id); + DRW_DBG("\n size in file= "); DRW_DBGH(pi.size); + DRW_DBG("\n address in file= "); DRW_DBGH(pi.address); + DRW_DBG("\n Data size= "); DRW_DBGH(pi.dataSize); + DRW_DBG("\n Start offset= "); DRW_DBGH(pi.startOffset); DRW_DBG("\n"); + dwgBuffer bufHdr(hdrData, 32, &decoder); + DRW_DBG(" section page type= "); DRW_DBGH(bufHdr.getRawLong32()); + DRW_DBG("\n section number= "); DRW_DBGH(bufHdr.getRawLong32()); + pi.cSize = bufHdr.getRawLong32(); + DRW_DBG("\n data size (compressed)= "); DRW_DBGH(pi.cSize); DRW_DBG(" dec "); DRW_DBG(pi.cSize); + pi.uSize = bufHdr.getRawLong32(); + DRW_DBG("\n page size (decompressed)= "); DRW_DBGH(pi.uSize); DRW_DBG(" dec "); DRW_DBG(pi.uSize); + DRW_DBG("\n start offset (in decompressed buffer)= "); DRW_DBGH(bufHdr.getRawLong32()); + DRW_DBG("\n unknown= "); DRW_DBGH(bufHdr.getRawLong32()); + DRW_DBG("\n header checksum= "); DRW_DBGH(bufHdr.getRawLong32()); + DRW_DBG("\n data checksum= "); DRW_DBGH(bufHdr.getRawLong32()); DRW_DBG("\n"); + + //get compresed data + duint8 *cData = new duint8[pi.cSize]; + if (!fileBuf->setPosition(pi.address+32)) + return false; + fileBuf->getBytes(cData, pi.cSize); + + //calculate checksum + duint32 calcsD = checksum(0, cData, pi.cSize); + for (duint8 i= 24; i<28; ++i) + hdrData[i]=0; + duint32 calcsH = checksum(calcsD, hdrData, 32); + DRW_DBG("Calc header checksum= "); DRW_DBGH(calcsH); + DRW_DBG("\nCalc data checksum= "); DRW_DBGH(calcsD); DRW_DBG("\n"); + + duint8* oData = objData + pi.startOffset; + pi.uSize = si.maxSize; + DRW_DBG("decompresing "); DRW_DBG(pi.cSize); DRW_DBG(" bytes in "); DRW_DBG(pi.uSize); DRW_DBG(" bytes\n"); + dwgCompressor comp; + comp.decompress18(cData, oData, pi.cSize, pi.uSize); + delete[]cData; + } + return true; +} + +bool dwgReader18::readMetaData() { + version = parent->getVersion(); + decoder.setVersion(version, false); + DRW_DBG("dwgReader18::readMetaData\n"); + if (! fileBuf->setPosition(11)) + return false; + maintenanceVersion = fileBuf->getRawChar8(); + DRW_DBG("maintenance verion= "); DRW_DBGH(maintenanceVersion); + DRW_DBG("\nbyte at 0x0C= "); DRW_DBGH(fileBuf->getRawChar8()); + previewImagePos = fileBuf->getRawLong32(); //+ page header size (0x20). + DRW_DBG("\npreviewImagePos (seekerImageData) = "); DRW_DBG(previewImagePos); + DRW_DBG("\napp Dwg version= "); DRW_DBGH(fileBuf->getRawChar8()); DRW_DBG(", "); + DRW_DBG("\napp maintenance version= "); DRW_DBGH(fileBuf->getRawChar8()); + duint16 cp = fileBuf->getRawShort16(); + DRW_DBG("\ncodepage= "); DRW_DBG(cp); + if (cp == 30) + decoder.setCodePage("ANSI_1252", false); + DRW_DBG("\n3 0x00 bytes(seems 0x00, appDwgV & appMaintV) = "); DRW_DBGH(fileBuf->getRawChar8()); DRW_DBG(", "); + DRW_DBGH(fileBuf->getRawChar8()); DRW_DBG(", "); DRW_DBGH(fileBuf->getRawChar8()); + securityFlags = fileBuf->getRawLong32(); + DRW_DBG("\nsecurity flags= "); DRW_DBG(securityFlags); + // UNKNOWN SECTION 4 bytes + duint32 uk = fileBuf->getRawLong32(); + DRW_DBG("\nUNKNOWN SECTION ( 4 bytes) = "); DRW_DBG(uk); + duint32 sumInfoAddr = fileBuf->getRawLong32(); + DRW_DBG("\nsummary Info Address= "); DRW_DBG(sumInfoAddr); + duint32 vbaAdd = fileBuf->getRawLong32(); + DRW_DBG("\nVBA address= "); DRW_DBGH(vbaAdd); + DRW_DBG("\npos 0x28 are 0x00000080= "); DRW_DBGH(fileBuf->getRawLong32()); + DRW_DBG("\n"); + return true; +} + +bool dwgReader18::readFileHeader() { + + if (! fileBuf->setPosition(0x80)) + return false; + +// genMagicNumber(); DBG("\n"); DBG("\n"); + DRW_DBG("Encripted Header Data=\n"); + duint8 byteStr[0x6C]; + int size =0x6C; + for (int i=0, j=0; i< 0x6C;i++) { + duint8 ch = fileBuf->getRawChar8(); + DRW_DBGH(ch); + if (j == 15) { + DRW_DBG("\n"); + j = 0; + } else { + DRW_DBG(", "); + j++; + } + byteStr[i] = DRW_magicNum18[i] ^ ch; + } + DRW_DBG("\n"); + +// size =0x6C; + DRW_DBG("Decripted Header Data=\n"); + for (int i=0, j = 0; i< size;i++) { + DRW_DBGH( (unsigned char)byteStr[i]); + if (j == 15) { + DRW_DBG("\n"); + j = 0; + } else { + DRW_DBG(", "); + j++; + } + } + dwgBuffer buff(byteStr, 0x6C, &decoder); + std::string name = reinterpret_cast(byteStr); + DRW_DBG("\nFile ID string (AcFssFcAJMB)= "); DRW_DBG(name.c_str()); + //ID string + NULL = 12 + buff.setPosition(12); + DRW_DBG("\n0x00 long= "); DRW_DBGH(buff.getRawLong32()); + DRW_DBG("\n0x6c long= "); DRW_DBGH(buff.getRawLong32()); + DRW_DBG("\n0x04 long= "); DRW_DBGH(buff.getRawLong32()); + DRW_DBG("\nRoot tree node gap= "); DRW_DBGH(buff.getRawLong32()); + DRW_DBG("\nLowermost left tree node gap= "); DRW_DBGH(buff.getRawLong32()); + DRW_DBG("\nLowermost right tree node gap= "); DRW_DBGH(buff.getRawLong32()); + DRW_DBG("\nUnknown long (1)= "); DRW_DBGH(buff.getRawLong32()); + DRW_DBG("\nLast section page Id= "); DRW_DBGH(buff.getRawLong32()); + DRW_DBG("\nLast section page end address 64b= "); DRW_DBGH(buff.getRawLong64()); + DRW_DBG("\nStart of second header data address 64b= "); DRW_DBGH(buff.getRawLong64()); + DRW_DBG("\nGap amount= "); DRW_DBGH(buff.getRawLong32()); + DRW_DBG("\nSection page amount= "); DRW_DBGH(buff.getRawLong32()); + DRW_DBG("\n0x20 long= "); DRW_DBGH(buff.getRawLong32()); + DRW_DBG("\n0x80 long= "); DRW_DBGH(buff.getRawLong32()); + DRW_DBG("\n0x40 long= "); DRW_DBGH(buff.getRawLong32()); + dint32 secPageMapId = buff.getRawLong32(); + DRW_DBG("\nSection Page Map Id= "); DRW_DBGH(secPageMapId); + duint64 secPageMapAddr = buff.getRawLong64()+0x100; + DRW_DBG("\nSection Page Map address 64b= "); DRW_DBGH(secPageMapAddr); + DRW_DBG("\nSection Page Map address 64b dec= "); DRW_DBG(secPageMapAddr); + duint32 secMapId = buff.getRawLong32(); + DRW_DBG("\nSection Map Id= "); DRW_DBGH(secMapId); + DRW_DBG("\nSection page array size= "); DRW_DBGH(buff.getRawLong32()); + DRW_DBG("\nGap array size= "); DRW_DBGH(buff.getRawLong32()); + //TODO: verify CRC + DRW_DBG("\nCRC32= "); DRW_DBGH(buff.getRawLong32()); + for (duint8 i = 0x68; i < 0x6c; ++i) + byteStr[i] = '\0'; +// byteStr[i] = '\0'; + duint32 crcCalc = buff.crc32(0x00,0,0x6C); + DRW_DBG("\nCRC32 calculated= "); DRW_DBGH(crcCalc); + + DRW_DBG("\nEnd Encrypted Data. Reads 0x14 bytes, equal to magic number:\n"); + for (int i=0, j=0; i< 0x14;i++) { + DRW_DBG("magic num: "); DRW_DBGH( (unsigned char)DRW_magicNumEnd18[i]); + DRW_DBG(",read "); DRW_DBGH( (unsigned char)fileBuf->getRawChar8()); + if (j == 3) { + DRW_DBG("\n"); + j = 0; + } else { + DRW_DBG(", "); + j++; + } + } +// At this point are parsed the first 256 bytes + DRW_DBG("\nJump to Section Page Map address: "); DRW_DBGH(secPageMapAddr); + + if (! fileBuf->setPosition(secPageMapAddr)) + return false; + duint32 pageType = fileBuf->getRawLong32(); + DRW_DBG("\nSection page type= "); DRW_DBGH(pageType); + duint32 decompSize = fileBuf->getRawLong32(); + DRW_DBG("\nDecompressed size= "); DRW_DBG(decompSize); DRW_DBG(", "); DRW_DBGH(decompSize); + if (pageType != 0x41630e3b){ + //bad page type, ends + DRW_DBG("Warning, bad page type, was expected 0x41630e3b instead of"); DRW_DBGH(pageType); DRW_DBG("\n"); + return false; + } + duint8 *tmpDecompSec = new duint8[decompSize]; + parseSysPage(tmpDecompSec, decompSize); + +//parses "Section page map" decompresed data + dwgBuffer buff2(tmpDecompSec, decompSize, &decoder); + duint32 address = 0x100; + //stores temporaly info of all pages: + std::mapsectionPageMapTmp; + + for (unsigned int i = 0; i < decompSize;) { + dint32 id = buff2.getRawLong32();//RLZ bad can be +/- + duint32 size = buff2.getRawLong32(); + i += 8; + DRW_DBG("Page num= "); DRW_DBG(id); DRW_DBG(" size= "); DRW_DBGH(size); + DRW_DBG(" address= "); DRW_DBGH(address); DRW_DBG("\n"); + //TODO num can be negative indicating gap +// duint64 ind = id > 0 ? id : -id; + if (id < 0){ + DRW_DBG("Parent= "); DRW_DBG(buff2.getRawLong32()); + DRW_DBG("\nLeft= "); DRW_DBG(buff2.getRawLong32()); + DRW_DBG(", Right= "); DRW_DBG(buff2.getRawLong32()); + DRW_DBG(", 0x00= ");DRW_DBGH(buff2.getRawLong32()); DRW_DBG("\n"); + i += 16; + } + + sectionPageMapTmp[id] = dwgPageInfo(id, address, size); + address += size; + } + delete[]tmpDecompSec; + + DRW_DBG("\n*** dwgReader18: Processing Data Section Map ***\n"); + dwgPageInfo sectionMap = sectionPageMapTmp[secMapId]; + if (!fileBuf->setPosition(sectionMap.address)) + return false; + pageType = fileBuf->getRawLong32(); + DRW_DBG("\nSection page type= "); DRW_DBGH(pageType); + decompSize = fileBuf->getRawLong32(); + DRW_DBG("\nDecompressed size= "); DRW_DBG(decompSize); DRW_DBG(", "); DRW_DBGH(decompSize); + if (pageType != 0x4163003b){ + //bad page type, ends + DRW_DBG("Warning, bad page type, was expected 0x4163003b instead of"); DRW_DBGH(pageType); DRW_DBG("\n"); + return false; + } + tmpDecompSec = new duint8[decompSize]; + parseSysPage(tmpDecompSec, decompSize); + +//reads sections: + DRW_DBG("\n*** dwgReader18: reads sections:"); + dwgBuffer buff3(tmpDecompSec, decompSize, &decoder); + duint32 numDescriptions = buff3.getRawLong32(); + DRW_DBG("\nnumDescriptions (sections)= "); DRW_DBG(numDescriptions); + DRW_DBG("\n0x02 long= "); DRW_DBGH(buff3.getRawLong32()); + DRW_DBG("\n0x00007400 long= "); DRW_DBGH(buff3.getRawLong32()); + DRW_DBG("\n0x00 long= "); DRW_DBGH(buff3.getRawLong32()); + DRW_DBG("\nunknown long (numDescriptions?)= "); DRW_DBG(buff3.getRawLong32()); DRW_DBG("\n"); + + for (unsigned int i = 0; i < numDescriptions; i++) { + dwgSectionInfo secInfo; + secInfo.size = buff3.getRawLong64(); + DRW_DBG("\nSize of section= "); DRW_DBGH(secInfo.size); + secInfo.pageCount = buff3.getRawLong32(); + DRW_DBG("\nPage count= "); DRW_DBGH(secInfo.pageCount); + secInfo.maxSize = buff3.getRawLong32(); + DRW_DBG("\nMax Decompressed Size= "); DRW_DBGH(secInfo.maxSize); + DRW_DBG("\nunknown long= "); DRW_DBGH(buff3.getRawLong32()); + secInfo.compresed = buff3.getRawLong32(); + DRW_DBG("\nis Compressed? 1:no, 2:yes= "); DRW_DBGH(secInfo.compresed); + secInfo.Id = buff3.getRawLong32(); + DRW_DBG("\nSection Id= "); DRW_DBGH(secInfo.Id); + secInfo.encrypted = buff3.getRawLong32(); + //encrypted (doc: 0 no, 1 yes, 2 unkn) on read: objects 0 and encrypted yes + DRW_DBG("\nEncrypted= "); DRW_DBGH(secInfo.encrypted); + duint8 nameCStr[64]; + buff3.getBytes(nameCStr, 64); + secInfo.name = reinterpret_cast(nameCStr); + DRW_DBG("\nSection std::Name= "); DRW_DBG( secInfo.name.c_str() ); DRW_DBG("\n"); + for (unsigned int i = 0; i < secInfo.pageCount; i++){ + duint32 pn = buff3.getRawLong32(); + dwgPageInfo pi = sectionPageMapTmp[pn]; //get a copy + DRW_DBG(" reading pag num = "); DRW_DBGH(pn); + pi.dataSize = buff3.getRawLong32(); + pi.startOffset = buff3.getRawLong64(); + secInfo.pages[pn]= pi;//complete copy in secInfo + DRW_DBG("\n Page number= "); DRW_DBGH(secInfo.pages[pn].Id); + DRW_DBG("\n size in file= "); DRW_DBGH(secInfo.pages[pn].size); + DRW_DBG("\n address in file= "); DRW_DBGH(secInfo.pages[pn].address); + DRW_DBG("\n Data size= "); DRW_DBGH(secInfo.pages[pn].dataSize); + DRW_DBG("\n Start offset= "); DRW_DBGH(secInfo.pages[pn].startOffset); DRW_DBG("\n"); + } + //do not save empty section + if (!secInfo.name.empty()) { + DRW_DBG("Saved section Name= "); DRW_DBG( secInfo.name.c_str() ); DRW_DBG("\n"); + sections[secEnum::getEnum(secInfo.name)] = secInfo; + } + } + delete[]tmpDecompSec; + + if (! fileBuf->isGood()) + return false; + DRW_DBG("\ndwgReader18::readFileHeader END\n\n"); + return true; +} + +bool dwgReader18::readDwgHeader(DRW_Header& hdr){ + DRW_DBG("dwgReader18::readDwgHeader\n"); + dwgSectionInfo si = sections[secEnum::HEADER]; + if (si.Id<0)//not found, ends + return false; + bool ret = parseDataPage(si/*, objData*/); + //global store for uncompressed data of all pages + uncompSize=si.size; + if (ret) { + dwgBuffer dataBuf(objData, si.size, &decoder); + DRW_DBG("Header section sentinel= "); + checkSentinel(&dataBuf, secEnum::HEADER, true); + if (version == DRW::AC1018){ + ret = dwgReader::readDwgHeader(hdr, &dataBuf, &dataBuf); + } else { + dwgBuffer handleBuf(objData, si.size, &decoder); + ret = dwgReader::readDwgHeader(hdr, &dataBuf, &handleBuf); + } + } + //Cleanup: global store for uncompressed data of all pages + if (objData != NULL){ + delete[] objData; + objData = NULL; + } + return ret; +} + + +bool dwgReader18::readDwgClasses(){ + DRW_DBG("\ndwgReader18::readDwgClasses\n"); + dwgSectionInfo si = sections[secEnum::CLASSES]; + if (si.Id<0)//not found, ends + return false; + bool ret = parseDataPage(si/*, objData*/); + //global store for uncompressed data of all pages + uncompSize=si.size; + if (ret) { + + dwgBuffer dataBuf(objData, uncompSize, &decoder); + + DRW_DBG("classes section sentinel= "); + checkSentinel(&dataBuf, secEnum::CLASSES, true); + + duint32 size = dataBuf.getRawLong32(); + DRW_DBG("\ndata size in bytes "); DRW_DBG(size); + if (version > DRW::AC1021 && maintenanceVersion > 3) { //2010+ + duint32 hSize = dataBuf.getRawLong32(); + DRW_DBG("\n2010+ & MV> 3, higth 32b: "); DRW_DBG(hSize); + } + duint32 bitSize = 0; + if (version > DRW::AC1021) {//2007+ + bitSize = dataBuf.getRawLong32(); + DRW_DBG("\ntotal size in bits "); DRW_DBG(bitSize); +} + duint32 maxClassNum = dataBuf.getBitShort(); + DRW_DBG("\nMaximum class number "); DRW_DBG(maxClassNum); + DRW_DBG("\nRc 1 "); DRW_DBG(dataBuf.getRawChar8()); + DRW_DBG("\nRc 2 "); DRW_DBG(dataBuf.getRawChar8()); + DRW_DBG("\nBit "); DRW_DBG(dataBuf.getBit()); + + /*******************************/ + dwgBuffer *strBuf = &dataBuf; + dwgBuffer strBuff(objData, uncompSize, &decoder); + //prepare string stream for 2007+ + if (version > DRW::AC1021) {//2007+ + strBuf = &strBuff; + duint32 strStartPos = bitSize+191;//size in bits + 24 bytes (sn+size+hSize) - 1 bit (endbit) + DRW_DBG("\nstrStartPos: "); DRW_DBG(strStartPos); + strBuff.setPosition(strStartPos >> 3); + strBuff.setBitPos(strStartPos & 7); + DRW_DBG("\nclasses strings buff.getPosition: "); DRW_DBG(strBuff.getPosition()); + DRW_DBG("\nclasses strings buff.getBitPos: "); DRW_DBG(strBuff.getBitPos()); + DRW_DBG("\nendBit "); DRW_DBG(strBuff.getBit()); + strStartPos -= 16;//decrement 16 bits + DRW_DBG("\nstrStartPos: "); DRW_DBG(strStartPos); + strBuff.setPosition(strStartPos >> 3); + strBuff.setBitPos(strStartPos & 7); + DRW_DBG("\nclasses strings buff.getPosition: "); DRW_DBG(strBuff.getPosition()); + DRW_DBG("\nclasses strings buff.getBitPos: "); DRW_DBG(strBuff.getBitPos()); + duint32 strDataSize = strBuff.getRawShort16(); + DRW_DBG("\nstrDataSize: "); DRW_DBG(strDataSize); + if (strDataSize & 0x8000) { + strStartPos -= 16;//decrement 16 bits + strDataSize &= 0x7FFF; //strip 0x8000; + strBuff.setPosition(strStartPos >> 3); + strBuff.setBitPos(strStartPos & 7); + duint32 hiSize = strBuff.getRawShort16(); + strDataSize |= (hiSize << 15); + } + strStartPos -= strDataSize; + DRW_DBG("\nstrStartPos: "); DRW_DBG(strStartPos); + strBuff.setPosition(strStartPos >> 3); + strBuff.setBitPos(strStartPos & 7); + DRW_DBG("\nclasses strings buff.getPosition: "); DRW_DBG(strBuff.getPosition()); + DRW_DBG("\nclasses strings buff.getBitPos: "); DRW_DBG(strBuff.getBitPos()); + } + + /*******************************/ + + duint32 endDataPos = maxClassNum-499; + DRW_DBG("\nbuff.getPosition: "); DRW_DBG(dataBuf.getPosition()); + for (duint32 i= 0; iparseDwg(version, &dataBuf, strBuf); + classesmap[cl->classNum] = cl; + DRW_DBG("\nbuff.getPosition: "); DRW_DBG(dataBuf.getPosition()); + } + DRW_DBG("\nend classes data buff.getPosition: "); DRW_DBG(dataBuf.getPosition()); + DRW_DBG("\nend classes data buff.getBitPos: "); DRW_DBG(dataBuf.getBitPos()); + DRW_DBG("\nend classes strings buff.getPosition: "); DRW_DBG(strBuf->getPosition()); + DRW_DBG("\nend classes strings buff.getBitPos: "); DRW_DBG(strBuf->getBitPos()); + +/***************/ + + strBuf->setPosition(strBuf->getPosition()+1);//skip remaining bits + DRW_DBG("\nCRC: "); DRW_DBGH(strBuf->getRawShort16()); + if (version > DRW::AC1018){ + DRW_DBG("\nunknown CRC: "); DRW_DBGH(strBuf->getRawShort16()); + } + DRW_DBG("\nclasses section end sentinel= "); + checkSentinel(strBuf, secEnum::CLASSES, false); + + ret = strBuf->isGood(); + } + //Cleanup: global store for uncompressed data of all pages + if (objData != NULL){ + delete[] objData; + objData = NULL; + } + return ret; +} + + +/*********** objects map ************************/ +/** Note: object map are split in sections with max size 2035? + * heach section are 2 bytes size + data bytes + 2 bytes crc + * size value are data bytes + 2 and to calculate crc are used + * 2 bytes size + data bytes + * last section are 2 bytes size + 2 bytes crc (size value always 2) +**/ +bool dwgReader18::readDwgHandles() { + DRW_DBG("\ndwgReader18::readDwgHandles\n"); + dwgSectionInfo si = sections[secEnum::HANDLES]; + if (si.Id<0)//not found, ends + return false; + bool ret = parseDataPage(si); + //global store for uncompressed data of all pages + uncompSize=si.size; + if (ret) { + + dwgBuffer dataBuf(objData, uncompSize, &decoder); + + ret = dwgReader::readDwgHandles(&dataBuf, 0, si.size); + } + //Cleanup: global store for uncompressed data of all pages + if (objData != NULL){ + delete[] objData; + objData = NULL; + uncompSize = 0; + } + return ret; +} + + +/*********** objects ************************/ +/** + * Reads all the object referenced in the object map section of the DWG file + * (using their object file offsets) + */ +bool dwgReader18::readDwgTables(DRW_Header& hdr) { + DRW_DBG("\ndwgReader18::readDwgTables\n"); + dwgSectionInfo si = sections[secEnum::OBJECTS]; + + if (si.Id<0)//not found, ends + return false; + bool ret = parseDataPage(si/*, objData*/); + //global store for uncompressed data of all pages + uncompSize=si.size; + if (ret) { + + dwgBuffer dataBuf(objData, uncompSize, &decoder); + + ret = dwgReader::readDwgTables(hdr, &dataBuf); + + } + //Do not delete objData in this point, needed in the remaining code + return ret; +} diff --git a/extlib/libdxfrw/intern/dwgreader18.h b/extlib/libdxfrw/intern/dwgreader18.h new file mode 100644 index 0000000..f814096 --- /dev/null +++ b/extlib/libdxfrw/intern/dwgreader18.h @@ -0,0 +1,99 @@ +/****************************************************************************** +** libDXFrw - Library to read/write DXF files (ascii & binary) ** +** ** +** Copyright (C) 2011-2015 José F. Soriano, rallazz@gmail.com ** +** ** +** This library is free software, licensed under the terms of the GNU ** +** General Public License as published by the Free Software Foundation, ** +** either version 2 of the License, or (at your option) any later version. ** +** You should have received a copy of the GNU General Public License ** +** along with this program. If not, see . ** +******************************************************************************/ + +#ifndef DWGREADER18_H +#define DWGREADER18_H + +#include +#include +#include "dwgreader.h" +//#include "../drw_textcodec.h" +#include "dwgbuffer.h" + +static const int DRW_magicNum18[] = { + 0x29, 0x23, 0xbe, 0x84, 0xe1, 0x6c, 0xd6, 0xae, + 0x52, 0x90, 0x49, 0xf1, 0xf1, 0xbb, 0xe9, 0xeb, + 0xb3, 0xa6, 0xdb, 0x3c, 0x87, 0x0c, 0x3e, 0x99, + 0x24, 0x5e, 0x0d, 0x1c, 0x06, 0xb7, 0x47, 0xde, + 0xb3, 0x12, 0x4d, 0xc8, 0x43, 0xbb, 0x8b, 0xa6, + 0x1f, 0x03, 0x5a, 0x7d, 0x09, 0x38, 0x25, 0x1f, + 0x5d, 0xd4, 0xcb, 0xfc, 0x96, 0xf5, 0x45, 0x3b, + 0x13, 0x0d, 0x89, 0x0a, 0x1c, 0xdb, 0xae, 0x32, + 0x20, 0x9a, 0x50, 0xee, 0x40, 0x78, 0x36, 0xfd, + 0x12, 0x49, 0x32, 0xf6, 0x9e, 0x7d, 0x49, 0xdc, + 0xad, 0x4f, 0x14, 0xf2, 0x44, 0x40, 0x66, 0xd0, + 0x6b, 0xc4, 0x30, 0xb7, 0x32, 0x3b, 0xa1, 0x22, + 0xf6, 0x22, 0x91, 0x9d, 0xe1, 0x8b, 0x1f, 0xda, + 0xb0, 0xca, 0x99, 0x02 +}; + +static const int DRW_magicNumEnd18[] = { + 0xf8, 0x46, 0x6a, 0x04, 0x96, 0x73, 0x0e, 0xd9, + 0x16, 0x2f, 0x67, 0x68, 0xd4, 0xf7, 0x4a, 0x4a, + 0xd0, 0x57, 0x68, 0x76}; + +class dwgReader18 : public dwgReader { +public: + dwgReader18(std::istream *stream, dwgR *p):dwgReader(stream, p){ + objData = NULL; + } + virtual ~dwgReader18(){ + if (objData != NULL) + delete[] objData; + } + bool readMetaData(); + bool readFileHeader(); + bool readDwgHeader(DRW_Header& hdr); + bool readDwgClasses(); + bool readDwgHandles(); + bool readDwgTables(DRW_Header& hdr); + bool readDwgBlocks(DRW_Interface& intfa){ + bool ret = true; + dwgBuffer dataBuf(objData, uncompSize, &decoder); + ret = dwgReader::readDwgBlocks(intfa, &dataBuf); + return ret; + } + + virtual bool readDwgEntities(DRW_Interface& intfa){ + bool ret = true; + dwgBuffer dataBuf(objData, uncompSize, &decoder); + ret = dwgReader::readDwgEntities(intfa, &dataBuf); + return ret; + } + virtual bool readDwgObjects(DRW_Interface& intfa){ + bool ret = true; + dwgBuffer dataBuf(objData, uncompSize, &decoder); + ret = dwgReader::readDwgObjects(intfa, &dataBuf); + return ret; + } + +// bool readDwgEntity(objHandle& obj, DRW_Interface& intfa){ +// bool ret = true; +// return ret; +// } + +protected: + duint8 *objData; + duint64 uncompSize; + +private: + void genMagicNumber(); +// dwgBuffer* bufObj; + void parseSysPage(duint8 *decompSec, duint32 decompSize); //called: Section page map: 0x41630e3b + bool parseDataPage(dwgSectionInfo si/*, duint8 *dData*/); //called ???: Section map: 0x4163003b + duint32 checksum(duint32 seed, duint8* data, duint32 sz); + +private: +duint32 securityFlags; +}; + +#endif // DWGREADER18_H diff --git a/extlib/libdxfrw/intern/dwgreader21.cpp b/extlib/libdxfrw/intern/dwgreader21.cpp new file mode 100644 index 0000000..9d4f23c --- /dev/null +++ b/extlib/libdxfrw/intern/dwgreader21.cpp @@ -0,0 +1,487 @@ +/****************************************************************************** +** libDXFrw - Library to read/write DXF files (ascii & binary) ** +** ** +** Copyright (C) 2011-2015 José F. Soriano, rallazz@gmail.com ** +** ** +** This library is free software, licensed under the terms of the GNU ** +** General Public License as published by the Free Software Foundation, ** +** either version 2 of the License, or (at your option) any later version. ** +** You should have received a copy of the GNU General Public License ** +** along with this program. If not, see . ** +******************************************************************************/ + +#include +#include +#include +#include +#include +#include "drw_dbg.h" +#include "dwgreader21.h" +#include "drw_textcodec.h" +#include "../libdwgr.h" + +bool dwgReader21::readMetaData() { + version = parent->getVersion(); + decoder.setVersion(version, false); + DRW_DBG("dwgReader21::readFileHeader()\n"); + DRW_DBG("dwgReader21::parsing metadata\n"); + if (! fileBuf->setPosition(11)) + return false; + maintenanceVersion = fileBuf->getRawChar8(); + DRW_DBG("maintenance verion= "); DRW_DBGH(maintenanceVersion); + DRW_DBG("\nbyte at 0x0C= "); DRW_DBG(fileBuf->getRawChar8()); + previewImagePos = fileBuf->getRawLong32(); + DRW_DBG("previewImagePos (seekerImageData) = "); DRW_DBG(previewImagePos); + DRW_DBG("\n\napp writer version= "); DRW_DBGH(fileBuf->getRawChar8()); + DRW_DBG("\napp writer maintenance version= "); DRW_DBGH(fileBuf->getRawChar8()); + duint16 cp = fileBuf->getRawShort16(); + DRW_DBG("\ncodepage= "); DRW_DBG(cp); + if (cp == 30) + decoder.setCodePage("ANSI_1252", false); + /* UNKNOUWN SECTION 2 bytes*/ + DRW_DBG("\nUNKNOWN SECTION= "); DRW_DBG(fileBuf->getRawShort16()); + DRW_DBG("\nUNKNOUWN SECTION 3b= "); DRW_DBG(fileBuf->getRawChar8()); + duint32 secType = fileBuf->getRawLong32(); + DRW_DBG("\nsecurity type flag= "); DRW_DBGH(secType); + /* UNKNOWN2 SECTION 4 bytes*/ + DRW_DBG("\nUNKNOWN SECTION 4bytes= "); DRW_DBG(fileBuf->getRawLong32()); + + DRW_DBG("\nSummary info address= "); DRW_DBGH(fileBuf->getRawLong32()); + DRW_DBG("\nVBA project address= "); DRW_DBGH(fileBuf->getRawLong32()); + DRW_DBG("\n0x00000080 32b= "); DRW_DBGH(fileBuf->getRawLong32()); + DRW_DBG("\nApp info address= "); DRW_DBGH(fileBuf->getRawLong32()); + //current position are 0x30 from here to 0x80 are undocumented + DRW_DBG("\nAnother address? = "); DRW_DBGH(fileBuf->getRawLong32()); + return true; +} + +bool dwgReader21::parseSysPage(duint64 sizeCompressed, duint64 sizeUncompressed, duint64 correctionFactor, duint64 offset, duint8 *decompData){ + //round to 8 + duint64 alsize = (sizeCompressed + 7) &(-8); + //minimum RS chunk: + duint32 chunks = (((alsize * correctionFactor)+238)/239); + duint64 fpsize = chunks * 255; + + if (! fileBuf->setPosition(offset)) + return false; + duint8 *tmpDataRaw = new duint8[fpsize]; + fileBuf->getBytes(tmpDataRaw, fpsize); + duint8 *tmpDataRS = new duint8[fpsize]; + dwgRSCodec::decode239I(tmpDataRaw, tmpDataRS, fpsize/255); + dwgCompressor::decompress21(tmpDataRS, decompData, sizeCompressed, sizeUncompressed); + delete[]tmpDataRaw; + delete[]tmpDataRS; + return true; +} + +bool dwgReader21::parseDataPage(dwgSectionInfo si, duint8 *dData){ + DRW_DBG("parseDataPage, section size: "); DRW_DBG(si.size); + for (std::map::iterator it=si.pages.begin(); it!=si.pages.end(); ++it){ + dwgPageInfo pi = it->second; + if (!fileBuf->setPosition(pi.address)) + return false; + + duint8 *tmpPageRaw = new duint8[pi.size]; + fileBuf->getBytes(tmpPageRaw, pi.size); + #ifdef DRW_DBG_DUMP + DRW_DBG("\nSection OBJECTS raw data=\n"); + for (unsigned int i=0, j=0; i< pi.size;i++) { + DRW_DBGH( (unsigned char)tmpPageRaw[i]); + if (j == 7) { DRW_DBG("\n"); j = 0; + } else { DRW_DBG(", "); j++; } + } DRW_DBG("\n"); + #endif + + duint8 *tmpPageRS = new duint8[pi.size]; + duint8 chunks =pi.size / 255; + dwgRSCodec::decode251I(tmpPageRaw, tmpPageRS, chunks); + #ifdef DRW_DBG_DUMP + DRW_DBG("\nSection OBJECTS RS data=\n"); + for (unsigned int i=0, j=0; i< pi.size;i++) { + DRW_DBGH( (unsigned char)tmpPageRS[i]); + if (j == 7) { DRW_DBG("\n"); j = 0; + } else { DRW_DBG(", "); j++; } + } DRW_DBG("\n"); + #endif + + DRW_DBG("\npage uncomp size: "); DRW_DBG(pi.uSize); DRW_DBG(" comp size: "); DRW_DBG(pi.cSize); + DRW_DBG("\noffset: "); DRW_DBG(pi.startOffset); + duint8 *pageData = dData + pi.startOffset; + dwgCompressor::decompress21(tmpPageRS, pageData, pi.cSize, pi.uSize); + + #ifdef DRW_DBG_DUMP + DRW_DBG("\n\nSection OBJECTS decompresed data=\n"); + for (unsigned int i=0, j=0; i< pi.uSize;i++) { + DRW_DBGH( (unsigned char)pageData[i]); + if (j == 7) { DRW_DBG("\n"); j = 0; + } else { DRW_DBG(", "); j++; } + } DRW_DBG("\n"); + #endif + + delete[]tmpPageRaw; + delete[]tmpPageRS; + } + DRW_DBG("\n"); + return true; +} + +bool dwgReader21::readFileHeader() { + + DRW_DBG("\n\ndwgReader21::parsing file header\n"); + if (! fileBuf->setPosition(0x80)) + return false; + duint8 fileHdrRaw[0x2FD];//0x3D8 + fileBuf->getBytes(fileHdrRaw, 0x2FD); + duint8 fileHdrdRS[0x2CD]; + dwgRSCodec::decode239I(fileHdrRaw, fileHdrdRS, 3); + +#ifdef DRW_DBG_DUMP + DRW_DBG("\ndwgReader21::parsed Reed Solomon decode:\n"); + int j = 0; + for (int i=0, j=0; i<0x2CD; i++){ + DRW_DBGH( (unsigned char)fileHdrdRS[i]); + if (j== 15){ j=0; DRW_DBG("\n"); + } else{ j++; DRW_DBG(", "); } + } DRW_DBG("\n"); +#endif + + dwgBuffer fileHdrBuf(fileHdrdRS, 0x2CD, &decoder); + DRW_DBG("\nCRC 64b= "); DRW_DBGH(fileHdrBuf.getRawLong64()); + DRW_DBG("\nunknown key 64b= "); DRW_DBGH(fileHdrBuf.getRawLong64()); + DRW_DBG("\ncomp data CRC 64b= "); DRW_DBGH(fileHdrBuf.getRawLong64()); + dint32 fileHdrCompLength = fileHdrBuf.getRawLong32(); + DRW_DBG("\ncompr len 4bytes= "); DRW_DBG(fileHdrCompLength); + dint32 fileHdrCompLength2 = fileHdrBuf.getRawLong32(); + DRW_DBG("\nlength2 4bytes= "); DRW_DBG(fileHdrCompLength2); + + int fileHdrDataLength = 0x110; + duint8 *fileHdrData; + if (fileHdrCompLength < 0) { + fileHdrDataLength = fileHdrCompLength * -1; + fileHdrData = new duint8[fileHdrDataLength]; + fileHdrBuf.getBytes(fileHdrData, fileHdrDataLength); + }else { + DRW_DBG("\ndwgReader21:: file header are compresed:\n"); + duint8 *compByteStr = new duint8[fileHdrCompLength]; + fileHdrBuf.getBytes(compByteStr, fileHdrCompLength); + fileHdrData = new duint8[fileHdrDataLength]; + dwgCompressor::decompress21(compByteStr, fileHdrData, fileHdrCompLength, fileHdrDataLength); + delete[] compByteStr; + } + +#ifdef DRW_DBG_DUMP + DRW_DBG("\ndwgReader21::parsed file header:\n"); + for (int i=0, j=0; isectionPageMapTmp; + +// dwgPageInfo *m_pages= new dwgPageInfo[PagesMaxId+1]; + while (PagesMapSizeUncompressed > i ) { + duint64 size = PagesMapBuf.getRawLong64(); + dint64 id = PagesMapBuf.getRawLong64(); + duint64 ind = id > 0 ? id : -id; + i += 16; + + DRW_DBG("Page gap= "); DRW_DBG(id); DRW_DBG(" Page num= "); DRW_DBG(ind); DRW_DBG(" size= "); DRW_DBGH(size); + DRW_DBG(" address= "); DRW_DBGH(address); DRW_DBG("\n"); + sectionPageMapTmp[ind] = dwgPageInfo(ind, address,size); + address += size; + //TODO num can be negative indicating gap +// seek += offset; + } + delete[]PagesMapData; + + DRW_DBG("\n*** dwgReader21: Processing Section Map ***\n"); + duint8 *SectionsMapData = new duint8[SectionsMapSizeUncompressed]; + dwgPageInfo sectionMap = sectionPageMapTmp[SectionsMapId]; + ret = parseSysPage(SectionsMapSizeCompressed, SectionsMapSizeUncompressed, SectionsMapCorrectionFactor, sectionMap.address, SectionsMapData); + if (!ret) + return false; + +//reads sections: + //Note: compressed value are not stored in file then, commpresed field are use to store + // encoding value + dwgBuffer SectionsMapBuf(SectionsMapData, SectionsMapSizeUncompressed, &decoder); + duint8 nextId =1; + while(SectionsMapBuf.getPosition() < SectionsMapBuf.size()){ + dwgSectionInfo secInfo; + secInfo.size = SectionsMapBuf.getRawLong64(); + DRW_DBG("\nSize of section (data size)= "); DRW_DBGH(secInfo.size); + secInfo.maxSize = SectionsMapBuf.getRawLong64(); + DRW_DBG("\nMax Decompressed Size= "); DRW_DBGH(secInfo.maxSize); + secInfo.encrypted = SectionsMapBuf.getRawLong64(); + //encrypted (doc: 0 no, 1 yes, 2 unkn) on read: objects 0 and encrypted yes + DRW_DBG("\nencription= "); DRW_DBGH(secInfo.encrypted); + DRW_DBG("\nHashCode = "); DRW_DBGH(SectionsMapBuf.getRawLong64()); + duint64 SectionNameLength = SectionsMapBuf.getRawLong64(); + DRW_DBG("\nSectionNameLength = "); DRW_DBG(SectionNameLength); + DRW_DBG("\nUnknown = "); DRW_DBGH(SectionsMapBuf.getRawLong64()); + secInfo.compresed = SectionsMapBuf.getRawLong64(); + DRW_DBG("\nEncoding (compresed) = "); DRW_DBGH(secInfo.compresed); + secInfo.pageCount = SectionsMapBuf.getRawLong64(); + DRW_DBG("\nPage count= "); DRW_DBGH(secInfo.pageCount); + secInfo.name = SectionsMapBuf.getUCSStr(SectionNameLength); + DRW_DBG("\nSection name = "); DRW_DBG(secInfo.name); DRW_DBG("\n"); + + for (unsigned int i=0; i< secInfo.pageCount; i++){ + duint64 po = SectionsMapBuf.getRawLong64(); + duint32 ds = SectionsMapBuf.getRawLong64(); + duint32 pn = SectionsMapBuf.getRawLong64(); + DRW_DBG(" pag Id = "); DRW_DBGH(pn); DRW_DBG(" data size = "); DRW_DBGH(ds); + dwgPageInfo pi = sectionPageMapTmp[pn]; //get a copy + pi.dataSize = ds; + pi.startOffset = po; + pi.uSize = SectionsMapBuf.getRawLong64(); + pi.cSize = SectionsMapBuf.getRawLong64(); + secInfo.pages[pn]= pi;//complete copy in secInfo + DRW_DBG("\n Page number= "); DRW_DBGH(secInfo.pages[pn].Id); + DRW_DBG("\n address in file= "); DRW_DBGH(secInfo.pages[pn].address); + DRW_DBG("\n size in file= "); DRW_DBGH(secInfo.pages[pn].size); + DRW_DBG("\n Data size= "); DRW_DBGH(secInfo.pages[pn].dataSize); + DRW_DBG("\n Start offset= "); DRW_DBGH(secInfo.pages[pn].startOffset); + DRW_DBG("\n Page uncompressed size = "); DRW_DBGH(secInfo.pages[pn].uSize); + DRW_DBG("\n Page compressed size = "); DRW_DBGH(secInfo.pages[pn].cSize); + + DRW_DBG("\n Page checksum = "); DRW_DBGH(SectionsMapBuf.getRawLong64()); + DRW_DBG("\n Page CRC = "); DRW_DBGH(SectionsMapBuf.getRawLong64()); DRW_DBG("\n"); + } + + if (!secInfo.name.empty()) { + secInfo.Id = nextId++; + DRW_DBG("Saved section Name= "); DRW_DBG( secInfo.name.c_str() ); DRW_DBG("\n"); + sections[secEnum::getEnum(secInfo.name)] = secInfo; + } + } + delete[]SectionsMapData; + + if (! fileBuf->isGood()) + return false; + + DRW_DBG("\ndwgReader21::readFileHeader END\n"); + return true; +} + +bool dwgReader21::readDwgHeader(DRW_Header& hdr){ + DRW_DBG("\ndwgReader21::readDwgHeader\n"); + dwgSectionInfo si = sections[secEnum::HEADER]; + if (si.Id<0)//not found, ends + return false; + DRW_DBG("\nprepare section of size "); DRW_DBG(si.size);DRW_DBG("\n"); + duint8 *tmpHeaderData = new duint8[si.size]; + bool ret = dwgReader21::parseDataPage(si, tmpHeaderData); + if (!ret) { + delete[]tmpHeaderData; + return ret; + } + + dwgBuffer dataBuf(tmpHeaderData, si.size, &decoder); + dwgBuffer handleBuf(tmpHeaderData, si.size, &decoder); + DRW_DBG("Header section sentinel= "); + checkSentinel(&dataBuf, secEnum::HEADER, true); + ret = dwgReader::readDwgHeader(hdr, &dataBuf, &handleBuf); + delete[]tmpHeaderData; + return ret; +} + +bool dwgReader21::readDwgClasses(){ + DRW_DBG("\ndwgReader21::readDwgClasses"); + dwgSectionInfo si = sections[secEnum::CLASSES]; + if (si.Id<0)//not found, ends + return false; + + DRW_DBG("\nprepare section of size "); DRW_DBG(si.size);DRW_DBG("\n"); + duint8 *tmpClassesData = new duint8[si.size]; + bool ret = dwgReader21::parseDataPage(si, tmpClassesData); + if (!ret) + return ret; + + dwgBuffer buff(tmpClassesData, si.size, &decoder); + DRW_DBG("classes section sentinel= "); + checkSentinel(&buff, secEnum::CLASSES, true); + + duint32 size = buff.getRawLong32(); + DRW_DBG("\ndata size in bytes "); DRW_DBG(size); + + duint32 bitSize = buff.getRawLong32(); + DRW_DBG("\ntotal size in bits "); DRW_DBG(bitSize); + + duint32 maxClassNum = buff.getBitShort(); + DRW_DBG("\nMaximum class number "); DRW_DBG(maxClassNum); + DRW_DBG("\nRc 1 "); DRW_DBG(buff.getRawChar8()); + DRW_DBG("\nRc 2 "); DRW_DBG(buff.getRawChar8()); + DRW_DBG("\nBit "); DRW_DBG(buff.getBit()); + + /*******************************/ + //prepare string stream + dwgBuffer strBuff(tmpClassesData, si.size, &decoder); + duint32 strStartPos = bitSize + 159;//size in bits + 20 bytes (sn+size) - 1 bit (endbit) + DRW_DBG("\nstrStartPos: "); DRW_DBG(strStartPos); + strBuff.setPosition(strStartPos >> 3); + strBuff.setBitPos(strStartPos & 7); + DRW_DBG("\nclasses strings buff.getPosition: "); DRW_DBG(strBuff.getPosition()); + DRW_DBG("\nclasses strings buff.getBitPos: "); DRW_DBG(strBuff.getBitPos()); + DRW_DBG("\nendBit "); DRW_DBG(strBuff.getBit()); + strStartPos -= 16;//decrement 16 bits + DRW_DBG("\nstrStartPos: "); DRW_DBG(strStartPos); + strBuff.setPosition(strStartPos >> 3); + strBuff.setBitPos(strStartPos & 7); + DRW_DBG("\nclasses strings buff.getPosition: "); DRW_DBG(strBuff.getPosition()); + DRW_DBG("\nclasses strings buff.getBitPos: "); DRW_DBG(strBuff.getBitPos()); + duint32 strDataSize = strBuff.getRawShort16(); + DRW_DBG("\nstrDataSize: "); DRW_DBG(strDataSize); + if (strDataSize & 0x8000) { + strStartPos -= 16;//decrement 16 bits + strDataSize &= 0x7FFF; //strip 0x8000; + strBuff.setPosition(strStartPos >> 3); + strBuff.setBitPos(strStartPos & 7); + duint32 hiSize = strBuff.getRawShort16(); + strDataSize |= (hiSize << 15); + } + strStartPos -= strDataSize; + DRW_DBG("\nstrStartPos: "); DRW_DBG(strStartPos); + strBuff.setPosition(strStartPos >> 3); + strBuff.setBitPos(strStartPos & 7); + DRW_DBG("\nclasses strings buff.getPosition: "); DRW_DBG(strBuff.getPosition()); + DRW_DBG("\nclasses strings buff.getBitPos: "); DRW_DBG(strBuff.getBitPos()); + + + /*******************************/ + + duint32 endDataPos = maxClassNum-499; + DRW_DBG("\nbuff.getPosition: "); DRW_DBG(buff.getPosition()); + for (duint32 i= 0; iparseDwg(version, &buff, &strBuff); + classesmap[cl->classNum] = cl; + DRW_DBG("\nbuff.getPosition: "); DRW_DBG(buff.getPosition()); + } + DRW_DBG("\nend classes data buff.getPosition: "); DRW_DBG(buff.getPosition()); + DRW_DBG("\nend classes data buff.getBitPos: "); DRW_DBG(buff.getBitPos()); + + buff.setPosition(size+20);//sizeVal+sn+32bSize + DRW_DBG("\nCRC: "); DRW_DBGH(buff.getRawShort16()); + DRW_DBG("\nclasses section end sentinel= "); + checkSentinel(&buff, secEnum::CLASSES, true); + delete[]tmpClassesData; + return buff.isGood(); +} + + +bool dwgReader21::readDwgHandles(){ + DRW_DBG("\ndwgReader21::readDwgHandles"); + dwgSectionInfo si = sections[secEnum::HANDLES]; + if (si.Id<0)//not found, ends + return false; + + DRW_DBG("\nprepare section of size "); DRW_DBG(si.size);DRW_DBG("\n"); + duint8 *tmpHandlesData = new duint8[si.size]; + bool ret = dwgReader21::parseDataPage(si, tmpHandlesData); + if (!ret) + return ret; + + dwgBuffer dataBuf(tmpHandlesData, si.size, &decoder); + + ret = dwgReader::readDwgHandles(&dataBuf, 0, si.size); + delete[]tmpHandlesData; + return ret; +} + +/*********** objects ************************/ +/** + * Reads all the object referenced in the object map section of the DWG file + * (using their object file offsets) + */ +bool dwgReader21::readDwgTables(DRW_Header& hdr) { + DRW_DBG("\ndwgReader21::readDwgTables\n"); + dwgSectionInfo si = sections[secEnum::OBJECTS]; + if (si.Id<0)//not found, ends + return false; + + DRW_DBG("\nprepare section of size "); DRW_DBG(si.size);DRW_DBG("\n"); + dataSize = si.size; + objData = new duint8 [dataSize]; + bool ret = dwgReader21::parseDataPage(si, objData); + if (!ret) + return ret; + + DRW_DBG("readDwgTables total data size= "); DRW_DBG(dataSize); DRW_DBG("\n"); + dwgBuffer dataBuf(objData, dataSize, &decoder); + ret = dwgReader::readDwgTables(hdr, &dataBuf); + + return ret; +} + + +bool dwgReader21::readDwgBlocks(DRW_Interface& intfa){ + bool ret = true; + dwgBuffer dataBuf(objData, dataSize, &decoder); + ret = dwgReader::readDwgBlocks(intfa, &dataBuf); + return ret; + + return false; +} diff --git a/extlib/libdxfrw/intern/dwgreader21.h b/extlib/libdxfrw/intern/dwgreader21.h new file mode 100644 index 0000000..f95c77a --- /dev/null +++ b/extlib/libdxfrw/intern/dwgreader21.h @@ -0,0 +1,65 @@ +/****************************************************************************** +** libDXFrw - Library to read/write DXF files (ascii & binary) ** +** ** +** Copyright (C) 2011-2015 José F. Soriano, rallazz@gmail.com ** +** ** +** This library is free software, licensed under the terms of the GNU ** +** General Public License as published by the Free Software Foundation, ** +** either version 2 of the License, or (at your option) any later version. ** +** You should have received a copy of the GNU General Public License ** +** along with this program. If not, see . ** +******************************************************************************/ + +#ifndef DWGREADER21_H +#define DWGREADER21_H + +#include +#include +#include "drw_textcodec.h" +#include "dwgbuffer.h" +#include "dwgreader.h" + +//reader for AC1021 aka v2007, chapter 5 +class dwgReader21 : public dwgReader { +public: + dwgReader21(std::istream *stream, dwgR *p):dwgReader(stream, p){ + objData = NULL; + dataSize = 0; + } + virtual ~dwgReader21(){ + if (objData != NULL) + delete[] objData; + } + bool readMetaData(); + bool readFileHeader(); + bool readDwgHeader(DRW_Header& hdr); + bool readDwgClasses(); + bool readDwgHandles(); + bool readDwgTables(DRW_Header& hdr); + bool readDwgBlocks(DRW_Interface& intfa); + virtual bool readDwgEntities(DRW_Interface& intfa){ + bool ret = true; + dwgBuffer dataBuf(objData, dataSize, &decoder); + ret = dwgReader::readDwgEntities(intfa, &dataBuf); + return ret; + } + virtual bool readDwgObjects(DRW_Interface& intfa){ + bool ret = true; + dwgBuffer dataBuf(objData, dataSize, &decoder); + ret = dwgReader::readDwgObjects(intfa, &dataBuf); + return ret; + } +//bool readDwgEntity(objHandle& obj, DRW_Interface& intfa){ +// return false; +//} + +private: + bool parseSysPage(duint64 sizeCompressed, duint64 sizeUncompressed, duint64 correctionFactor, duint64 offset, duint8 *decompData); + bool parseDataPage(dwgSectionInfo si, duint8 *dData); + + duint8 *objData; + duint64 dataSize; + +}; + +#endif // DWGREADER21_H diff --git a/extlib/libdxfrw/intern/dwgreader24.cpp b/extlib/libdxfrw/intern/dwgreader24.cpp new file mode 100644 index 0000000..295032c --- /dev/null +++ b/extlib/libdxfrw/intern/dwgreader24.cpp @@ -0,0 +1,43 @@ +/****************************************************************************** +** libDXFrw - Library to read/write DXF files (ascii & binary) ** +** ** +** Copyright (C) 2011-2015 José F. Soriano, rallazz@gmail.com ** +** ** +** This library is free software, licensed under the terms of the GNU ** +** General Public License as published by the Free Software Foundation, ** +** either version 2 of the License, or (at your option) any later version. ** +** You should have received a copy of the GNU General Public License ** +** along with this program. If not, see . ** +******************************************************************************/ + +#include +#include +#include +#include +#include +#include "drw_dbg.h" +#include "dwgreader24.h" +#include "drw_textcodec.h" +#include "../libdwgr.h" + + +bool dwgReader24::readFileHeader() { + DRW_DBG("dwgReader24::readFileHeader\n"); + bool ret = dwgReader18::readFileHeader(); + DRW_DBG("dwgReader24::readFileHeader END\n"); + return ret; +} + +bool dwgReader24::readDwgHeader(DRW_Header& hdr){ + DRW_DBG("dwgReader24::readDwgHeader\n"); + bool ret = dwgReader18::readDwgHeader(hdr); + DRW_DBG("dwgReader24::readDwgHeader END\n"); + return ret; +} + +bool dwgReader24::readDwgClasses(){ + DRW_DBG("\ndwgReader24::readDwgClasses"); + bool ret = dwgReader18::readDwgClasses(); + DRW_DBG("\ndwgReader24::readDwgClasses END\n"); + return ret; +} diff --git a/extlib/libdxfrw/intern/dwgreader24.h b/extlib/libdxfrw/intern/dwgreader24.h new file mode 100644 index 0000000..e5fc43a --- /dev/null +++ b/extlib/libdxfrw/intern/dwgreader24.h @@ -0,0 +1,56 @@ +/****************************************************************************** +** libDXFrw - Library to read/write DXF files (ascii & binary) ** +** ** +** Copyright (C) 2011-2015 José F. Soriano, rallazz@gmail.com ** +** ** +** This library is free software, licensed under the terms of the GNU ** +** General Public License as published by the Free Software Foundation, ** +** either version 2 of the License, or (at your option) any later version. ** +** You should have received a copy of the GNU General Public License ** +** along with this program. If not, see . ** +******************************************************************************/ + +#ifndef DWGREADER24_H +#define DWGREADER24_H + +#include +#include +#include "drw_textcodec.h" +#include "dwgbuffer.h" +#include "dwgreader18.h" + +class dwgReader24 : public dwgReader18 { +public: + dwgReader24(std::istream *stream, dwgR *p):dwgReader18(stream, p){ } + virtual ~dwgReader24(){} + bool readFileHeader(); + bool readDwgHeader(DRW_Header& hdr); + bool readDwgClasses(); +// bool readDwgHandles(){return false;} +// bool readDwgTables(){return false;} + bool readDwgBlocks(DRW_Interface& intfa){ + bool ret = true; + dwgBuffer dataBuf(objData, uncompSize, &decoder); + ret = dwgReader::readDwgBlocks(intfa, &dataBuf); + return ret; + } + virtual bool readDwgEntities(DRW_Interface& intfa){ + bool ret = true; + dwgBuffer dataBuf(objData, uncompSize, &decoder); + ret = dwgReader::readDwgEntities(intfa, &dataBuf); + return ret; + } + virtual bool readDwgObjects(DRW_Interface& intfa){ + bool ret = true; + dwgBuffer dataBuf(objData, uncompSize, &decoder); + ret = dwgReader::readDwgObjects(intfa, &dataBuf); + return ret; + } + +// bool readDwgEntity(objHandle& obj, DRW_Interface& intfa){ +// DRW_UNUSED(obj); +// DRW_UNUSED(intfa); +// return false;} +}; + +#endif // DWGREADER24_H diff --git a/extlib/libdxfrw/intern/dwgreader27.cpp b/extlib/libdxfrw/intern/dwgreader27.cpp new file mode 100644 index 0000000..dea68f6 --- /dev/null +++ b/extlib/libdxfrw/intern/dwgreader27.cpp @@ -0,0 +1,43 @@ +/****************************************************************************** +** libDXFrw - Library to read/write DXF files (ascii & binary) ** +** ** +** Copyright (C) 2011-2015 José F. Soriano, rallazz@gmail.com ** +** ** +** This library is free software, licensed under the terms of the GNU ** +** General Public License as published by the Free Software Foundation, ** +** either version 2 of the License, or (at your option) any later version. ** +** You should have received a copy of the GNU General Public License ** +** along with this program. If not, see . ** +******************************************************************************/ + +#include +#include +#include +#include +#include +#include "drw_dbg.h" +#include "dwgreader27.h" +#include "drw_textcodec.h" +#include "../libdwgr.h" + + +bool dwgReader27::readFileHeader() { + DRW_DBG("dwgReader27::readFileHeader\n"); + bool ret = dwgReader18::readFileHeader(); + DRW_DBG("dwgReader27::readFileHeader END\n"); + return ret; +} + +bool dwgReader27::readDwgHeader(DRW_Header& hdr){ + DRW_DBG("dwgReader27::readDwgHeader\n"); + bool ret = dwgReader18::readDwgHeader(hdr); + DRW_DBG("dwgReader27::readDwgHeader END\n"); + return ret; +} + +bool dwgReader27::readDwgClasses(){ + DRW_DBG("dwgReader27::readDwgClasses"); + bool ret = dwgReader18::readDwgClasses(); + DRW_DBG("\ndwgReader27::readDwgClasses END\n"); + return ret; +} diff --git a/extlib/libdxfrw/intern/dwgreader27.h b/extlib/libdxfrw/intern/dwgreader27.h new file mode 100644 index 0000000..32c67f6 --- /dev/null +++ b/extlib/libdxfrw/intern/dwgreader27.h @@ -0,0 +1,55 @@ +/****************************************************************************** +** libDXFrw - Library to read/write DXF files (ascii & binary) ** +** ** +** Copyright (C) 2011-2015 José F. Soriano, rallazz@gmail.com ** +** ** +** This library is free software, licensed under the terms of the GNU ** +** General Public License as published by the Free Software Foundation, ** +** either version 2 of the License, or (at your option) any later version. ** +** You should have received a copy of the GNU General Public License ** +** along with this program. If not, see . ** +******************************************************************************/ + +#ifndef DWGREADER27_H +#define DWGREADER27_H + +#include +#include +#include "drw_textcodec.h" +#include "dwgbuffer.h" +#include "dwgreader18.h" + +class dwgReader27 : public dwgReader18 { +public: + dwgReader27(std::istream *stream, dwgR *p):dwgReader18(stream, p){ } + virtual ~dwgReader27(){} + bool readFileHeader(); + bool readDwgHeader(DRW_Header& hdr); + bool readDwgClasses(); +// bool readDwgHandles(){return false;} +// bool readDwgTables(){return false;} + bool readDwgBlocks(DRW_Interface& intfa){ + bool ret = true; + dwgBuffer dataBuf(objData, uncompSize, &decoder); + ret = dwgReader::readDwgBlocks(intfa, &dataBuf); + return ret; + } + virtual bool readDwgEntities(DRW_Interface& intfa){ + bool ret = true; + dwgBuffer dataBuf(objData, uncompSize, &decoder); + ret = dwgReader::readDwgEntities(intfa, &dataBuf); + return ret; + } + virtual bool readDwgObjects(DRW_Interface& intfa){ + bool ret = true; + dwgBuffer dataBuf(objData, uncompSize, &decoder); + ret = dwgReader::readDwgObjects(intfa, &dataBuf); + return ret; + } +// bool readDwgEntity(objHandle& obj, DRW_Interface& intfa){ +// DRW_UNUSED(obj); +// DRW_UNUSED(intfa); +// return false;} +}; + +#endif // DWGREADER21_H diff --git a/extlib/libdxfrw/intern/dwgutil.cpp b/extlib/libdxfrw/intern/dwgutil.cpp new file mode 100644 index 0000000..10121cf --- /dev/null +++ b/extlib/libdxfrw/intern/dwgutil.cpp @@ -0,0 +1,694 @@ +/****************************************************************************** +** libDXFrw - Library to read/write DXF files (ascii & binary) ** +** ** +** Copyright (C) 2011-2015 José F. Soriano, rallazz@gmail.com ** +** ** +** This library is free software, licensed under the terms of the GNU ** +** General Public License as published by the Free Software Foundation, ** +** either version 2 of the License, or (at your option) any later version. ** +** You should have received a copy of the GNU General Public License ** +** along with this program. If not, see . ** +******************************************************************************/ + +#include +#include "drw_dbg.h" +#include "dwgutil.h" +#include "rscodec.h" +#include "../libdwgr.h" + +/** utility function + * convert a int to string in hex + **/ +namespace DRW { +std::string toHexStr(int n){ +#if defined(__APPLE__) + char buffer[9]= {'\0'}; + snprintf(buffer,9, "%X", n); + return std::string(buffer); +#else + std::ostringstream Convert; + Convert << std::uppercase << std::hex << n; + return Convert.str(); +#endif +} +} + +/** + * @brief dwgRSCodec::decode239I + * @param in : input data (at least 255*blk bytes) + * @param out : output data (at least 239*blk bytes) + * @param blk number of codewords ( 1 cw == 255 bytes) + */ +void dwgRSCodec::decode239I(unsigned char *in, unsigned char *out, duint32 blk){ + int k=0; + unsigned char data[255]; + RScodec rsc(0x96, 8, 8); //(255, 239) + for (duint32 i=0; i> 2) | (bufC[pos++] << 6); + *ll = (fb & 0x03); + return cont; +} + +duint32 dwgCompressor::longCompressionOffset(){ + duint32 cont = 0; + duint8 ll = bufC[pos++]; + while (ll == 0x00){ + cont += 0xFF; + ll = bufC[pos++]; + } + cont += ll; + return cont; +} + +duint32 dwgCompressor::long20CompressionOffset(){ +// duint32 cont = 0; + duint32 cont = 0x0F; + duint8 ll = bufC[pos++]; + while (ll == 0x00){ +// cont += 0xFF; + ll = bufC[pos++]; + } + cont += ll; + return cont; +} + +duint32 dwgCompressor::litLength18(){ + duint32 cont=0; + duint8 ll = bufC[pos++]; + //no literal length, this byte is next opCode + if (ll > 0x0F) { + pos--; + return 0; + } + + if (ll == 0x00) { + cont = 0x0F; + ll = bufC[pos++]; + while (ll == 0x00){//repeat until ll != 0x00 + cont +=0xFF; + ll = bufC[pos++]; + } + } + cont +=ll; + cont +=3; //already sum 3 + return cont; +} + +void dwgCompressor::decompress18(duint8 *cbuf, duint8 *dbuf, duint32 csize, duint32 dsize){ + bufC = cbuf; + bufD = dbuf; + sizeC = csize -2; + sizeD = dsize; + DRW_DBG("dwgCompressor::decompress, last 2 bytes: "); + DRW_DBGH(bufC[sizeC]);DRW_DBGH(bufC[sizeC+1]);DRW_DBG("\n"); + sizeC = csize; + + duint32 compBytes; + duint32 compOffset; + duint32 litCount; + + pos=0; //current position in compresed buffer + rpos=0; //current position in resulting decompresed buffer + litCount = litLength18(); + //copy first lileral lenght + for (duint32 i=0; i < litCount; ++i) { + bufD[rpos++] = bufC[pos++]; + } + + while (pos < csize && (rpos < dsize+1)){//rpos < dsize to prevent crash more robust are needed + duint8 oc = bufC[pos++]; //next opcode + if (oc == 0x10){ + compBytes = longCompressionOffset()+ 9; + compOffset = twoByteOffset(&litCount) + 0x3FFF; + if (litCount == 0) + litCount= litLength18(); + } else if (oc > 0x11 && oc< 0x20){ + compBytes = (oc & 0x0F) + 2; + compOffset = twoByteOffset(&litCount) + 0x3FFF; + if (litCount == 0) + litCount= litLength18(); + } else if (oc == 0x20){ + compBytes = longCompressionOffset() + 0x21; + compOffset = twoByteOffset(&litCount); + if (litCount == 0) + litCount= litLength18(); + else + oc = 0x00; + } else if (oc > 0x20 && oc< 0x40){ + compBytes = oc - 0x1E; + compOffset = twoByteOffset(&litCount); + if (litCount == 0) + litCount= litLength18(); + } else if ( oc > 0x3F){ + compBytes = ((oc & 0xF0) >> 4) - 1; + duint8 ll2 = bufC[pos++]; + compOffset = (ll2 << 2) | ((oc & 0x0C) >> 2); + litCount = oc & 0x03; + if (litCount < 1){ + litCount= litLength18();} + } else if (oc == 0x11){ + DRW_DBG("dwgCompressor::decompress, end of input stream, Cpos: "); + DRW_DBG(pos);DRW_DBG(", Dpos: ");DRW_DBG(rpos);DRW_DBG("\n"); + return; //end of input stream + } else { //ll < 0x10 + DRW_DBG("WARNING dwgCompressor::decompress, failed, illegal char, Cpos: "); + DRW_DBG(pos);DRW_DBG(", Dpos: ");DRW_DBG(rpos);DRW_DBG("\n"); + return; //fails, not valid + } + //copy "compresed data", TODO Needed verify out of bounds + duint32 remaining = sizeD - (litCount+rpos); + if (remaining < compBytes){ + compBytes = remaining; + DRW_DBG("WARNING dwgCompressor::decompress, bad compBytes size, Cpos: "); + DRW_DBG(pos);DRW_DBG(", Dpos: ");DRW_DBG(rpos);DRW_DBG("\n"); + } + for (duint32 i=0, j= rpos - compOffset -1; i < compBytes; i++) { + bufD[rpos++] = bufD[j++]; + } + //copy "uncompresed data", TODO Needed verify out of bounds + for (duint32 i=0; i < litCount; i++) { + bufD[rpos++] = bufC[pos++]; + } + } + DRW_DBG("WARNING dwgCompressor::decompress, bad out, Cpos: ");DRW_DBG(pos);DRW_DBG(", Dpos: ");DRW_DBG(rpos);DRW_DBG("\n"); +} + + +void dwgCompressor::decrypt18Hdr(duint8 *buf, duint32 size, duint32 offset){ + duint8 max = size / 4; + duint32 secMask = 0x4164536b ^ offset; + duint32* pHdr = (duint32*)buf; + for (duint8 j = 0; j < max; j++) + *pHdr++ ^= secMask; +} + +/*void dwgCompressor::decrypt18Data(duint8 *buf, duint32 size, duint32 offset){ + duint8 max = size / 4; + duint32 secMask = 0x4164536b ^ offset; + duint32* pHdr = (duint32*)buf; + for (duint8 j = 0; j < max; j++) + *pHdr++ ^= secMask; +}*/ + +duint32 dwgCompressor::litLength21(duint8 *cbuf, duint8 oc, duint32 *si){ + + duint32 srcIndex=*si; + + duint32 length = oc + 8; + if (length == 0x17) { + duint32 n = cbuf[srcIndex++]; + length += n; + if (n == 0xff) { + do { + n = cbuf[srcIndex++]; + n |= (duint32)(cbuf[srcIndex++] << 8); + length += n; + } while (n == 0xffff); + } + } + + *si = srcIndex; + return length; +} + +void dwgCompressor::decompress21(duint8 *cbuf, duint8 *dbuf, duint32 csize, duint32 dsize){ + duint32 srcIndex=0; + duint32 dstIndex=0; + duint32 length=0; + duint32 sourceOffset; + duint8 opCode; + + opCode = cbuf[srcIndex++]; + if ((opCode >> 4) == 2){ + srcIndex = srcIndex +2; + length = cbuf[srcIndex++] & 0x07; + } + + while (srcIndex < csize && (dstIndex < dsize+1)){//dstIndex < dsize to prevent crash more robust are needed + if (length == 0) + length = litLength21(cbuf, opCode, &srcIndex); + copyCompBytes21(cbuf, dbuf, length, srcIndex, dstIndex); + srcIndex += length; + dstIndex += length; + if (dstIndex >=dsize) break; //check if last chunk are compresed & terminate + + length = 0; + opCode = cbuf[srcIndex++]; + readInstructions21(cbuf, &srcIndex, &opCode, &sourceOffset, &length); + while (true) { + //prevent crash with corrupted data + if (sourceOffset > dstIndex){ + DRW_DBG("\nWARNING dwgCompressor::decompress21 => sourceOffset> dstIndex.\n"); + DRW_DBG("csize = "); DRW_DBG(csize); DRW_DBG(" srcIndex = "); DRW_DBG(srcIndex); + DRW_DBG("\ndsize = "); DRW_DBG(dsize); DRW_DBG(" dstIndex = "); DRW_DBG(dstIndex); + sourceOffset = dstIndex; + } + //prevent crash with corrupted data + if (length > dsize - dstIndex){ + DRW_DBG("\nWARNING dwgCompressor::decompress21 => length > dsize - dstIndex.\n"); + DRW_DBG("csize = "); DRW_DBG(csize); DRW_DBG(" srcIndex = "); DRW_DBG(srcIndex); + DRW_DBG("\ndsize = "); DRW_DBG(dsize); DRW_DBG(" dstIndex = "); DRW_DBG(dstIndex); + length = dsize - dstIndex; + srcIndex = csize;//force exit + } + sourceOffset = dstIndex-sourceOffset; + for (duint32 i=0; i< length; i++) + dbuf[dstIndex++] = dbuf[sourceOffset+i]; + + length = opCode & 7; + if ((length != 0) || (srcIndex >= csize)) { + break; + } + opCode = cbuf[srcIndex++]; + if ((opCode >> 4) == 0) { + break; + } + if ((opCode >> 4) == 15) { + opCode &= 15; + } + readInstructions21(cbuf, &srcIndex, &opCode, &sourceOffset, &length); + } + } + DRW_DBG("\ncsize = "); DRW_DBG(csize); DRW_DBG(" srcIndex = "); DRW_DBG(srcIndex); + DRW_DBG("\ndsize = "); DRW_DBG(dsize); DRW_DBG(" dstIndex = "); DRW_DBG(dstIndex);DRW_DBG("\n"); +} + +void dwgCompressor::readInstructions21(duint8 *cbuf, duint32 *si, duint8 *oc, duint32 *so, duint32 *l){ + duint32 length; + duint32 srcIndex = *si; + duint32 sourceOffset; + unsigned char opCode = *oc; + switch ((opCode >> 4)) { + case 0: + length = (opCode & 0xf) + 0x13; + sourceOffset = cbuf[srcIndex++]; + opCode = cbuf[srcIndex++]; + length = ((opCode >> 3) & 0x10) + length; + sourceOffset = ((opCode & 0x78) << 5) + 1 + sourceOffset; + break; + case 1: + length = (opCode & 0xf) + 3; + sourceOffset = cbuf[srcIndex++]; + opCode = cbuf[srcIndex++]; + sourceOffset = ((opCode & 0xf8) << 5) + 1 + sourceOffset; + break; + case 2: + sourceOffset = cbuf[srcIndex++]; + sourceOffset = ((cbuf[srcIndex++] << 8) & 0xff00) | sourceOffset; + length = opCode & 7; + if ((opCode & 8) == 0) { + opCode = cbuf[srcIndex++]; + length = (opCode & 0xf8) + length; + } else { + sourceOffset++; + length = (cbuf[srcIndex++] << 3) + length; + opCode = cbuf[srcIndex++]; + length = (((opCode & 0xf8) << 8) + length) + 0x100; + } + break; + default: + length = opCode >> 4; + sourceOffset = opCode & 15; + opCode = cbuf[srcIndex++]; + sourceOffset = (((opCode & 0xf8) << 1) + sourceOffset) + 1; + break; + } + *oc = opCode; + *si = srcIndex; + *so = sourceOffset; + *l = length; +} + + +void dwgCompressor::copyCompBytes21(duint8 *cbuf, duint8 *dbuf, duint32 l, duint32 si, duint32 di){ + duint32 length =l; + duint32 dix = di; + duint32 six = si; + + while (length > 31){ + //in doc: 16-31, 0-15 + for (duint32 i = six+24; i. ** +******************************************************************************/ + +#ifndef DWGUTIL_H +#define DWGUTIL_H + +#include "../drw_base.h" + +namespace DRW { +std::string toHexStr(int n); +} + +class dwgRSCodec { +public: + dwgRSCodec(){} + ~dwgRSCodec(){} + static void decode239I(duint8 *in, duint8 *out, duint32 blk); + static void decode251I(duint8 *in, duint8 *out, duint32 blk); +}; + +class dwgCompressor { +public: + dwgCompressor(){} + ~dwgCompressor(){} + + void decompress18(duint8 *cbuf, duint8 *dbuf, duint32 csize, duint32 dsize); + static void decrypt18Hdr(duint8 *buf, duint32 size, duint32 offset); +// static void decrypt18Data(duint8 *buf, duint32 size, duint32 offset); + static void decompress21(duint8 *cbuf, duint8 *dbuf, duint32 csize, duint32 dsize); + +private: + duint32 litLength18(); + static duint32 litLength21(duint8 *cbuf, duint8 oc, duint32 *si); + static void copyCompBytes21(duint8 *cbuf, duint8 *dbuf, duint32 l, duint32 si, duint32 di); + static void readInstructions21(duint8 *cbuf, duint32 *si, duint8 *oc, duint32 *so, duint32 *l); + + duint32 longCompressionOffset(); + duint32 long20CompressionOffset(); + duint32 twoByteOffset(duint32 *ll); + + duint8 *bufC; + duint8 *bufD; + duint32 sizeC; + duint32 sizeD; + duint32 pos; + duint32 rpos; + +}; + +class secEnum { +public: + enum DWGSection { + UNKNOWNS, /*!< UNKNOWN section. */ + FILEHEADER, /*!< File Header (in R3-R15*/ + HEADER, /*!< AcDb:Header */ + CLASSES, /*!< AcDb:Classes */ + SUMARYINFO, /*!< AcDb:SummaryInfo */ + PREVIEW, /*!< AcDb:Preview */ + VBAPROY, /*!< AcDb:VBAProject */ + APPINFO, /*!< AcDb:AppInfo */ + FILEDEP, /*!< AcDb:FileDepList */ + REVHISTORY, /*!< AcDb:RevHistory */ + SECURITY, /*!< AcDb:Security */ + OBJECTS, /*!< AcDb:AcDbObjects */ + OBJFREESPACE, /*!< AcDb:ObjFreeSpace */ + TEMPLATE, /*!< AcDb:Template */ + HANDLES, /*!< AcDb:Handles */ + PROTOTYPE, /*!< AcDb:AcDsPrototype_1b */ + AUXHEADER, /*!< AcDb:AuxHeader, in (R13-R15) second file header */ + SIGNATURE, /*!< AcDb:Signature */ + APPINFOHISTORY, /*!< AcDb:AppInfoHistory (in ac1021 may be a renamed section?*/ + EXTEDATA, /*!< Extended Entity Data */ + PROXYGRAPHICS /*!< PROXY ENTITY GRAPHICS */ + }; + + secEnum(){} + ~secEnum(){} + + static DWGSection getEnum(std::string nameSec); +}; + +#endif // DWGUTIL_H diff --git a/extlib/libdxfrw/intern/dxfreader.cpp b/extlib/libdxfrw/intern/dxfreader.cpp new file mode 100644 index 0000000..84f8641 --- /dev/null +++ b/extlib/libdxfrw/intern/dxfreader.cpp @@ -0,0 +1,263 @@ +/****************************************************************************** +** libDXFrw - Library to read/write DXF files (ascii & binary) ** +** ** +** Copyright (C) 2011-2015 José F. Soriano, rallazz@gmail.com ** +** ** +** This library is free software, licensed under the terms of the GNU ** +** General Public License as published by the Free Software Foundation, ** +** either version 2 of the License, or (at your option) any later version. ** +** You should have received a copy of the GNU General Public License ** +** along with this program. If not, see . ** +******************************************************************************/ + +#include +#include +#include +#include +#include "dxfreader.h" +#include "drw_textcodec.h" +#include "drw_dbg.h" + +bool dxfReader::readRec(int *codeData) { +// std::string text; + int code; + + if (!readCode(&code)) + return false; + *codeData = code; + + if (code < 10) + readString(); + else if (code < 60) + readDouble(); + else if (code < 80) + readInt16(); + else if (code > 89 && code < 100) //TODO this is an int 32b + readInt32(); + else if (code == 100 || code == 102 || code == 105) + readString(); + else if (code > 109 && code < 150) //skip not used at the v2012 + readDouble(); + else if (code > 159 && code < 170) //skip not used at the v2012 + readInt64(); + else if (code < 180) + readInt16(); + else if (code > 209 && code < 240) //skip not used at the v2012 + readDouble(); + else if (code > 269 && code < 290) //skip not used at the v2012 + readInt16(); + else if (code < 300) //TODO this is a boolean indicator, int in Binary? + readBool(); + else if (code < 370) + readString(); + else if (code < 390) + readInt16(); + else if (code < 400) + readString(); + else if (code < 410) + readInt16(); + else if (code < 420) + readString(); + else if (code < 430) //TODO this is an int 32b + readInt32(); + else if (code < 440) + readString(); + else if (code < 450) //TODO this is an int 32b + readInt32(); + else if (code < 460) //TODO this is long?? + readInt32(); + else if (code < 470) //TODO this is a floating point double precision?? + readDouble(); + else if (code < 481) + readString(); + else if (code > 998 && code < 1009) //skip not used at the v2012 + readString(); + else if (code < 1060) //TODO this is a floating point double precision?? + readDouble(); + else if (code < 1071) + readInt16(); + else if (code == 1071) //TODO this is an int 32b + readInt32(); + else if (skip) + //skip safely this dxf entry ( ok for ascii dxf) + readString(); + else + //break in binary files because the conduct is unpredictable + return false; + + return (filestr->good()); +} +int dxfReader::getHandleString(){ + int res; +#if defined(__APPLE__) + int Succeeded = sscanf ( strData.c_str(), "%x", &res ); + if ( !Succeeded || Succeeded == EOF ) + res = 0; +#else + std::istringstream Convert(strData); + if ( !(Convert >> std::hex >>res) ) + res = 0; +#endif + return res; +} + +bool dxfReaderBinary::readCode(int *code) { + unsigned short *int16p; + char buffer[2]; + filestr->read(buffer,2); + int16p = (unsigned short *) buffer; +//exist a 32bits int (code 90) with 2 bytes??? + if ((*code == 90) && (*int16p>2000)){ + DRW_DBG(*code); DRW_DBG(" de 16bits\n"); + filestr->seekg(-4, std::ios_base::cur); + filestr->read(buffer,2); + int16p = (unsigned short *) buffer; + } + *code = *int16p; + DRW_DBG(*code); DRW_DBG("\n"); + + return (filestr->good()); +} + +bool dxfReaderBinary::readString() { + type = STRING; + std::getline(*filestr, strData, '\0'); + DRW_DBG(strData); DRW_DBG("\n"); + return (filestr->good()); +} + +bool dxfReaderBinary::readString(std::string *text) { + type = STRING; + std::getline(*filestr, *text, '\0'); + DRW_DBG(*text); DRW_DBG("\n"); + return (filestr->good()); +} + +bool dxfReaderBinary::readInt16() { + type = INT32; + char buffer[2]; + filestr->read(buffer,2); + intData = (int)((buffer[1] << 8) | buffer[0]); + DRW_DBG(intData); DRW_DBG("\n"); + return (filestr->good()); +} + +bool dxfReaderBinary::readInt32() { + type = INT32; + unsigned int *int32p; + char buffer[4]; + filestr->read(buffer,4); + int32p = (unsigned int *) buffer; + intData = *int32p; + DRW_DBG(intData); DRW_DBG("\n"); + return (filestr->good()); +} + +bool dxfReaderBinary::readInt64() { + type = INT64; + unsigned long long int *int64p; //64 bits integer pointer + char buffer[8]; + filestr->read(buffer,8); + int64p = (unsigned long long int *) buffer; + int64 = *int64p; + DRW_DBG(int64); DRW_DBG(" int64\n"); + return (filestr->good()); +} + +bool dxfReaderBinary::readDouble() { + type = DOUBLE; + double *result; + char buffer[8]; + filestr->read(buffer,8); + result = (double *) buffer; + doubleData = *result; + DRW_DBG(doubleData); DRW_DBG("\n"); + return (filestr->good()); +} + +//saved as int or add a bool member?? +bool dxfReaderBinary::readBool() { + char buffer[1]; + filestr->read(buffer,1); + intData = (int)(buffer[0]); + DRW_DBG(intData); DRW_DBG("\n"); + return (filestr->good()); +} + +bool dxfReaderAscii::readCode(int *code) { + std::string text; + std::getline(*filestr, text); + *code = atoi(text.c_str()); + DRW_DBG(*code); DRW_DBG("\n"); + return (filestr->good()); +} +bool dxfReaderAscii::readString(std::string *text) { + type = STRING; + std::getline(*filestr, *text); + if (!text->empty() && text->at(text->size()-1) == '\r') + text->erase(text->size()-1); + return (filestr->good()); +} + +bool dxfReaderAscii::readString() { + type = STRING; + std::getline(*filestr, strData); + if (!strData.empty() && strData.at(strData.size()-1) == '\r') + strData.erase(strData.size()-1); + DRW_DBG(strData); DRW_DBG("\n"); + return (filestr->good()); +} + +bool dxfReaderAscii::readInt16() { + type = INT32; + std::string text; + if (readString(&text)){ + intData = atoi(text.c_str()); + DRW_DBG(intData); DRW_DBG("\n"); + return true; + } else + return false; +} + +bool dxfReaderAscii::readInt32() { + type = INT32; + return readInt16(); +} + +bool dxfReaderAscii::readInt64() { + type = INT64; + return readInt16(); +} + +bool dxfReaderAscii::readDouble() { + type = DOUBLE; + std::string text; + if (readString(&text)){ +#if defined(__APPLE__) + int succeeded=sscanf( & (text[0]), "%lg", &doubleData); + if(succeeded != 1) { + DRW_DBG("dxfReaderAscii::readDouble(): reading double error: "); + DRW_DBG(text); + DRW_DBG('\n'); + } +#else + std::istringstream sd(text); + sd >> doubleData; + DRW_DBG(doubleData); DRW_DBG('\n'); +#endif + return true; + } else + return false; +} + +//saved as int or add a bool member?? +bool dxfReaderAscii::readBool() { + type = BOOL; + std::string text; + if (readString(&text)){ + intData = atoi(text.c_str()); + DRW_DBG(intData); DRW_DBG("\n"); + return true; + } else + return false; +} diff --git a/extlib/libdxfrw/intern/dxfreader.h b/extlib/libdxfrw/intern/dxfreader.h new file mode 100644 index 0000000..a0fa327 --- /dev/null +++ b/extlib/libdxfrw/intern/dxfreader.h @@ -0,0 +1,99 @@ +/****************************************************************************** +** libDXFrw - Library to read/write DXF files (ascii & binary) ** +** ** +** Copyright (C) 2011-2015 José F. Soriano, rallazz@gmail.com ** +** ** +** This library is free software, licensed under the terms of the GNU ** +** General Public License as published by the Free Software Foundation, ** +** either version 2 of the License, or (at your option) any later version. ** +** You should have received a copy of the GNU General Public License ** +** along with this program. If not, see . ** +******************************************************************************/ + +#ifndef DXFREADER_H +#define DXFREADER_H + +#include "drw_textcodec.h" + +class dxfReader { +public: + enum TYPE { + STRING, + INT32, + INT64, + DOUBLE, + BOOL, + INVALID + }; + enum TYPE type; +public: + dxfReader(std::istream *stream){ + filestr = stream; + type = INVALID; + } + virtual ~dxfReader(){} + bool readRec(int *code); + + std::string getString() {return strData;} + int getHandleString();//Convert hex string to int + std::string toUtf8String(std::string t) {return decoder.toUtf8(t);} + std::string getUtf8String() {return decoder.toUtf8(strData);} + double getDouble() {return doubleData;} + int getInt32() {return intData;} + unsigned long long int getInt64() {return int64;} + bool getBool() { return (intData==0) ? false : true;} + int getVersion(){return decoder.getVersion();} + void setVersion(std::string *v, bool dxfFormat){decoder.setVersion(v, dxfFormat);} + void setCodePage(std::string *c){decoder.setCodePage(c, true);} + std::string getCodePage(){ return decoder.getCodePage();} + +protected: + virtual bool readCode(int *code) = 0; //return true if sucesful (not EOF) + virtual bool readString(std::string *text) = 0; + virtual bool readString() = 0; + virtual bool readInt16() = 0; + virtual bool readInt32() = 0; + virtual bool readInt64() = 0; + virtual bool readDouble() = 0; + virtual bool readBool() = 0; + +protected: + std::istream *filestr; + std::string strData; + double doubleData; + signed int intData; //32 bits integer + unsigned long long int int64; //64 bits integer + bool skip; //set to true for ascii dxf, false for binary +private: + DRW_TextCodec decoder; +}; + +class dxfReaderBinary : public dxfReader { +public: + dxfReaderBinary(std::istream *stream):dxfReader(stream){skip = false; } + virtual ~dxfReaderBinary() {} + virtual bool readCode(int *code); + virtual bool readString(std::string *text); + virtual bool readString(); + virtual bool readInt16(); + virtual bool readInt32(); + virtual bool readInt64(); + virtual bool readDouble(); + virtual bool readBool(); +}; + +class dxfReaderAscii : public dxfReader { +public: + dxfReaderAscii(std::istream *stream):dxfReader(stream){skip = true; } + virtual ~dxfReaderAscii(){} + virtual bool readCode(int *code); + virtual bool readString(std::string *text); + virtual bool readString(); + virtual bool readInt16(); + virtual bool readDouble(); + virtual bool readInt32(); + virtual bool readInt64(); + virtual bool readBool(); +}; + +#endif // DXFREADER_H diff --git a/extlib/libdxfrw/intern/dxfwriter.cpp b/extlib/libdxfrw/intern/dxfwriter.cpp new file mode 100644 index 0000000..2276e7c --- /dev/null +++ b/extlib/libdxfrw/intern/dxfwriter.cpp @@ -0,0 +1,269 @@ +/****************************************************************************** +** libDXFrw - Library to read/write DXF files (ascii & binary) ** +** ** +** Copyright (C) 2011-2015 José F. Soriano, rallazz@gmail.com ** +** ** +** This library is free software, licensed under the terms of the GNU ** +** General Public License as published by the Free Software Foundation, ** +** either version 2 of the License, or (at your option) any later version. ** +** You should have received a copy of the GNU General Public License ** +** along with this program. If not, see . ** +******************************************************************************/ + +#include +#include +#include +#include +#include "dxfwriter.h" + +//RLZ TODO change std::endl to x0D x0A (13 10) +/*bool dxfWriter::readRec(int *codeData, bool skip) { +// std::string text; + int code; + +#ifdef DRW_DBG + count = count+2; //DBG +#endif + + if (!readCode(&code)) + return false; + *codeData = code; + + if (code < 10) + readString(); + else if (code < 60) + readDouble(); + else if (code < 80) + readInt(); + else if (code > 89 && code < 100) //TODO this is an int 32b + readInt32(); + else if (code == 100 || code == 102 || code == 105) + readString(); + else if (code > 109 && code < 150) //skip not used at the v2012 + readDouble(); + else if (code > 159 && code < 170) //skip not used at the v2012 + readInt64(); + else if (code < 180) + readInt(); + else if (code > 209 && code < 240) //skip not used at the v2012 + readDouble(); + else if (code > 269 && code < 290) //skip not used at the v2012 + readInt(); + else if (code < 300) //TODO this is a boolean indicator, int in Binary? + readBool(); + else if (code < 370) + readString(); + else if (code < 390) + readInt(); + else if (code < 400) + readString(); + else if (code < 410) + readInt(); + else if (code < 420) + readString(); + else if (code < 430) //TODO this is an int 32b + readInt32(); + else if (code < 440) + readString(); + else if (code < 450) //TODO this is an int 32b + readInt32(); + else if (code < 460) //TODO this is long?? + readInt(); + else if (code < 470) //TODO this is a floating point double precision?? + readDouble(); + else if (code < 481) + readString(); + else if (code > 998 && code < 1009) //skip not used at the v2012 + readString(); + else if (code < 1060) //TODO this is a floating point double precision?? + readDouble(); + else if (code < 1071) + readInt(); + else if (code == 1071) //TODO this is an int 32b + readInt32(); + else if (skip) + //skip safely this dxf entry ( ok for ascii dxf) + readString(); + else + //break in binary files because the conduct is unpredictable + return false; + + return (filestr->good()); +}*/ + +bool dxfWriter::writeUtf8String(int code, std::string text) { + std::string t = encoder.fromUtf8(text); + return writeString(code, t); +} + +bool dxfWriter::writeUtf8Caps(int code, std::string text) { + std::string strname = text; + std::transform(strname.begin(), strname.end(), strname.begin(),::toupper); + std::string t = encoder.fromUtf8(strname); + return writeString(code, t); +} + +bool dxfWriterBinary::writeString(int code, std::string text) { + char bufcode[2]; + bufcode[0] =code & 0xFF; + bufcode[1] =code >> 8; + filestr->write(bufcode, 2); + *filestr << text << '\0'; + return (filestr->good()); +} + +/*bool dxfWriterBinary::readCode(int *code) { + unsigned short *int16p; + char buffer[2]; + filestr->read(buffer,2); + int16p = (unsigned short *) buffer; +//exist a 32bits int (code 90) with 2 bytes??? + if ((*code == 90) && (*int16p>2000)){ + DBG(*code); DBG(" de 16bits\n"); + filestr->seekg(-4, std::ios_base::cur); + filestr->read(buffer,2); + int16p = (unsigned short *) buffer; + } + *code = *int16p; + DBG(*code); DBG("\n"); + + return (filestr->good()); +}*/ + +/*bool dxfWriterBinary::readString() { + std::getline(*filestr, strData, '\0'); + DBG(strData); DBG("\n"); + return (filestr->good()); +}*/ + +/*bool dxfWriterBinary::readString(std::string *text) { + std::getline(*filestr, *text, '\0'); + DBG(*text); DBG("\n"); + return (filestr->good()); +}*/ + +bool dxfWriterBinary::writeInt16(int code, int data) { + char bufcode[2]; + char buffer[2]; + bufcode[0] =code & 0xFF; + bufcode[1] =code >> 8; + buffer[0] =data & 0xFF; + buffer[1] =data >> 8; + filestr->write(bufcode, 2); + filestr->write(buffer, 2); + return (filestr->good()); +} + +bool dxfWriterBinary::writeInt32(int code, int data) { + char buffer[4]; + buffer[0] =code & 0xFF; + buffer[1] =code >> 8; + filestr->write(buffer, 2); + + buffer[0] =data & 0xFF; + buffer[1] =data >> 8; + buffer[2] =data >> 16; + buffer[3] =data >> 24; + filestr->write(buffer, 4); + return (filestr->good()); +} + +bool dxfWriterBinary::writeInt64(int code, unsigned long long int data) { + char buffer[8]; + buffer[0] =code & 0xFF; + buffer[1] =code >> 8; + filestr->write(buffer, 2); + + buffer[0] =data & 0xFF; + buffer[1] =data >> 8; + buffer[2] =data >> 16; + buffer[3] =data >> 24; + buffer[4] =data >> 32; + buffer[5] =data >> 40; + buffer[6] =data >> 48; + buffer[7] =data >> 56; + filestr->write(buffer, 8); + return (filestr->good()); +} + +bool dxfWriterBinary::writeDouble(int code, double data) { + char bufcode[2]; + char buffer[8]; + bufcode[0] =code & 0xFF; + bufcode[1] =code >> 8; + filestr->write(bufcode, 2); + + unsigned char *val; + val = (unsigned char *) &data; + for (int i=0; i<8; i++) { + buffer[i] =val[i]; + } + filestr->write(buffer, 8); + return (filestr->good()); +} + +//saved as int or add a bool member?? +bool dxfWriterBinary::writeBool(int code, bool data) { + char buffer[1]; + char bufcode[2]; + bufcode[0] =code & 0xFF; + bufcode[1] =code >> 8; + filestr->write(bufcode, 2); + buffer[0] = data; + filestr->write(buffer, 1); + return (filestr->good()); +} + +dxfWriterAscii::dxfWriterAscii(std::ostream *stream):dxfWriter(stream){ + filestr->precision(16); +} + +bool dxfWriterAscii::writeString(int code, std::string text) { +// *filestr << code << std::endl << text << std::endl ; + filestr->width(3); + *filestr << std::right << code << std::endl; + filestr->width(0); + *filestr << std::left << text << std::endl; + /* std::getline(*filestr, strData, '\0'); + DBG(strData); DBG("\n");*/ + return (filestr->good()); +} + +bool dxfWriterAscii::writeInt16(int code, int data) { +// *filestr << std::right << code << std::endl << data << std::endl; + filestr->width(3); + *filestr << std::right << code << std::endl; + filestr->width(5); + *filestr << data << std::endl; + return (filestr->good()); +} + +bool dxfWriterAscii::writeInt32(int code, int data) { + return writeInt16(code, data); +} + +bool dxfWriterAscii::writeInt64(int code, unsigned long long int data) { +// *filestr << code << std::endl << data << std::endl; + filestr->width(3); + *filestr << std::right << code << std::endl; + filestr->width(5); + *filestr << data << std::endl; + return (filestr->good()); +} + +bool dxfWriterAscii::writeDouble(int code, double data) { +// std::streamsize prec = filestr->precision(); +// filestr->precision(12); +// *filestr << code << std::endl << data << std::endl; + filestr->width(3); + *filestr << std::right << code << std::endl; + *filestr << data << std::endl; +// filestr->precision(prec); + return (filestr->good()); +} + +//saved as int or add a bool member?? +bool dxfWriterAscii::writeBool(int code, bool data) { + *filestr << code << std::endl << data << std::endl; + return (filestr->good()); +} diff --git a/extlib/libdxfrw/intern/dxfwriter.h b/extlib/libdxfrw/intern/dxfwriter.h new file mode 100644 index 0000000..adabe02 --- /dev/null +++ b/extlib/libdxfrw/intern/dxfwriter.h @@ -0,0 +1,64 @@ +/****************************************************************************** +** libDXFrw - Library to read/write DXF files (ascii & binary) ** +** ** +** Copyright (C) 2011-2015 José F. Soriano, rallazz@gmail.com ** +** ** +** This library is free software, licensed under the terms of the GNU ** +** General Public License as published by the Free Software Foundation, ** +** either version 2 of the License, or (at your option) any later version. ** +** You should have received a copy of the GNU General Public License ** +** along with this program. If not, see . ** +******************************************************************************/ + +#ifndef DXFWRITER_H +#define DXFWRITER_H + +#include "drw_textcodec.h" + +class dxfWriter { +public: + dxfWriter(std::ostream *stream){filestr = stream; /*count =0;*/} + virtual ~dxfWriter(){} + virtual bool writeString(int code, std::string text) = 0; + bool writeUtf8String(int code, std::string text); + bool writeUtf8Caps(int code, std::string text); + std::string fromUtf8String(std::string t) {return encoder.fromUtf8(t);} + virtual bool writeInt16(int code, int data) = 0; + virtual bool writeInt32(int code, int data) = 0; + virtual bool writeInt64(int code, unsigned long long int data) = 0; + virtual bool writeDouble(int code, double data) = 0; + virtual bool writeBool(int code, bool data) = 0; + void setVersion(std::string *v, bool dxfFormat){encoder.setVersion(v, dxfFormat);} + void setCodePage(std::string *c){encoder.setCodePage(c, true);} + std::string getCodePage(){return encoder.getCodePage();} +protected: + std::ostream *filestr; +private: + DRW_TextCodec encoder; +}; + +class dxfWriterBinary : public dxfWriter { +public: + dxfWriterBinary(std::ostream *stream):dxfWriter(stream){} + virtual ~dxfWriterBinary() {} + virtual bool writeString(int code, std::string text); + virtual bool writeInt16(int code, int data); + virtual bool writeInt32(int code, int data); + virtual bool writeInt64(int code, unsigned long long int data); + virtual bool writeDouble(int code, double data); + virtual bool writeBool(int code, bool data); +}; + +class dxfWriterAscii : public dxfWriter { +public: + dxfWriterAscii(std::ostream *stream); + virtual ~dxfWriterAscii(){} + virtual bool writeString(int code, std::string text); + virtual bool writeInt16(int code, int data); + virtual bool writeInt32(int code, int data); + virtual bool writeInt64(int code, unsigned long long int data); + virtual bool writeDouble(int code, double data); + virtual bool writeBool(int code, bool data); +}; + +#endif // DXFWRITER_H diff --git a/extlib/libdxfrw/intern/rscodec.cpp b/extlib/libdxfrw/intern/rscodec.cpp new file mode 100644 index 0000000..78926f3 --- /dev/null +++ b/extlib/libdxfrw/intern/rscodec.cpp @@ -0,0 +1,401 @@ +/****************************************************************************** +** libDXFrw - Library to read/write DXF files (ascii & binary) ** +** ** +** Copyright (C) 2011-2014 J.F. Soriano (Rallaz), rallazz@gmail.com ** +** ** +** This library is free software, licensed under the terms of the GNU ** +** General Public License as published by the Free Software Foundation, ** +** either version 2 of the License, or (at your option) any later version. ** +** You should have received a copy of the GNU General Public License ** +** along with this program. If not, see . ** +******************************************************************************/ + +/** + * Reed-Solomon codec + * Reed Solomon code lifted from encoder/decoder for Reed-Solomon written by Simon Rockliff + * + * Original code: + * This program may be freely modified and/or given to whoever wants it. + * A condition of such distribution is that the author's contribution be + * acknowledged by his name being left in the comments heading the program, + * however no responsibility is accepted for any financial or other loss which + * may result from some unforseen errors or malfunctioning of the program + * during use. + * Simon Rockliff, 26th June 1991 + */ + + +#include "rscodec.h" +#include // std::nothrow +#include + +RScodec::RScodec(unsigned int pp, int mm, int tt) { + this->mm = mm; + this->tt = tt; + nn = (1<polynomial form alpha_to[] contains j=alpha**i; + polynomial form -> index form index_of[j=alpha**i] = i + alpha=2 is the primitive element of GF(2^mm) +*/ +void RScodec::RSgenerate_gf(unsigned int pp) { + int i, mask ; + int pb; + + mask = 1 ; + alpha_to[mm] = 0 ; + for (i=0; i>(mm-1-i)) & 1; + if (pb!=0) { + alpha_to[mm] ^= mask; + } + mask <<= 1 ; + } + index_of[alpha_to[mm]] = mm ; + mask >>= 1 ; + for (i=mm+1; i= mask) { + alpha_to[i] = alpha_to[mm] ^ ((alpha_to[i-1]^mask)<<1) ; + } else alpha_to[i] = alpha_to[i-1]<<1 ; + index_of[alpha_to[i]] = i ; + } + index_of[0] = -1 ; +} + + +/* Obtain the generator polynomial of the tt-error correcting, length + nn=(2^mm -1) Reed Solomon code from the product of (X+alpha**i), i=1..2*tt +*/ +void RScodec::RSgen_poly() { + int i,j ; + int tmp; + int bb = nn-kk;; //nn-kk length of parity data + + gg[0] = 2 ; /* primitive element alpha = 2 for GF(2**mm) */ + gg[1] = 1 ; /* g(x) = (X+alpha) initially */ + for (i=2; i<=bb; i++) { + gg[i] = 1 ; + for (j=i-1; j>0; j--) + if (gg[j] != 0) { + if (gg[j]<0) { isOk=false; return; } + tmp = (index_of[gg[j]]+i)%nn; + if (tmp<0) { isOk=false; return; } + gg[j] = gg[j-1]^ alpha_to[tmp] ; + } else { + gg[j] = gg[j-1] ; + } + gg[0] = alpha_to[(index_of[gg[0]]+i)%nn] ; /* gg[0] can never be zero */ + } + /* convert gg[] to index form for quicker encoding */ + for (i=0; i<=bb; i++) gg[i] = index_of[gg[i]] ; +} + +int RScodec::calcDecode(unsigned char* data, int* recd, int** elp, int* d, int* l, int* u_lu, int* s, int* root, int* loc, int* z, int* err, int* reg, int bb) +{ + if (!isOk) return -1; + int count = 0; + int syn_error = 0; + int i, j, u, q; + + // for (int i=0; i error */ + s[i] = index_of[s[i]]; + } + + if (!syn_error) { /* if no errors, ends */ + /* no non-zero syndromes => no errors: output is received codeword */ + return 0; + } + + /* errors are present, try and correct */ + /* compute the error location polynomial via the Berlekamp iterative algorithm, + following the terminology of Lin and Costello : d[u] is the 'mu'th + discrepancy, where u='mu'+1 and 'mu' (the Greek letter!) is the step number + ranging from -1 to 2*tt (see L&C), l[u] is the + degree of the elp at that step, and u_l[u] is the difference between the + step number and the degree of the elp. + */ + /* initialise table entries */ + d[0] = 0; /* index form */ + d[1] = s[1]; /* index form */ + elp[0][0] = 0; /* index form */ + elp[1][0] = 1; /* polynomial form */ + for (i = 1; i0)) q--; + /* have found first non-zero d[q] */ + if (q>0) { + j = q; + do { + j--; + if ((d[j] != -1) && (u_lu[q]0); + } + + /* have now found q such that d[u]!=0 and u_lu[q] is maximum */ + /* store degree of new elp polynomial */ + if (l[u]>l[q] + u - q) { + l[u + 1] = l[u]; + } + else { + l[u + 1] = l[q] + u - q; + } + + /* form new elp(x) */ + for (i = 0; itt) { /* elp has degree has degree >tt hence cannot solve */ + return -1; /* just output is received codeword as is */ + } + + /* can correct error */ + /* put elp into index form */ + for (i = 0; i <= l[u]; i++) elp[u][i] = index_of[elp[u][i]]; + + /* find roots of the error location polynomial */ + for (i = 1; i <= l[u]; i++) { + reg[i] = elp[u][i]; + } + count = 0; + for (i = 1; i <= nn; i++) { + q = 1; + for (j = 1; j <= l[u]; j++) { + if (reg[j] != -1) { + reg[j] = (reg[j] + j) % nn; + q ^= alpha_to[reg[j]]; + } + } + if (!q) { /* store root and error location number indices */ + root[count] = i; + loc[count] = nn - i; + count++; + } + } + + if (count != l[u]) { /* no. roots != degree of elp => >tt errors and cannot solve */ + return -1; /* just output is received codeword as is */ + } + + /* no. roots = degree of elp hence <= tt errors */ + /* form polynomial z(x) */ + for (i = 1; i <= l[u]; i++) { /* Z[0] = 1 always - do not need */ + if ((s[i] != -1) && (elp[u][i] != -1)) { + z[i] = alpha_to[s[i]] ^ alpha_to[elp[u][i]]; + } + else if ((s[i] != -1) && (elp[u][i] == -1)) { + z[i] = alpha_to[s[i]]; + } + else if ((s[i] == -1) && (elp[u][i] != -1)) { + z[i] = alpha_to[elp[u][i]]; + } + else { + z[i] = 0; + } + for (j = 1; j=0; i--) { + feedback = index_of[idata[i]^bd[bb-1]] ; + if (feedback != -1) { + for (j=bb-1; j>0; j--) + if (gg[j] != -1) + bd[j] = bd[j-1]^alpha_to[(gg[j]+feedback)%nn] ; + else + bd[j] = bd[j-1] ; + bd[0] = alpha_to[(gg[0]+feedback)%nn] ; + } else { + for (j=bb-1; j>0; j--) + bd[j] = bd[j-1] ; + bd[0] = 0 ; + } + } + return true; +} + + +/* assume we have received bits grouped into mm-bit symbols in recd[i], + i=0..(nn-1), and recd[i] is index form (ie as powers of alpha). + We first compute the 2*tt syndromes by substituting alpha**i into rec(X) and + evaluating, storing the syndromes in s[i], i=1..2tt (leave s[0] zero) . + Then we use the Berlekamp iteration to find the error location polynomial + elp[i]. If the degree of the elp is >tt, we cannot correct all the errors + and hence just put out the information symbols uncorrected. If the degree of + elp is <=tt, we substitute alpha**i , i=1..n into the elp to get the roots, + hence the inverse roots, the error location numbers. If the number of errors + located does not equal the degree of the elp, we have more than tt errors + and cannot correct them. Otherwise, we then solve for the error value at + the error location and correct the error. The procedure is that found in + Lin and Costello. For the cases where the number of errors is known to be too + large to correct, the information symbols as received are output (the + advantage of systematic encoding is that hopefully some of the information + symbols will be okay and that if we are in luck, the errors are in the + parity part of the transmitted codeword). Of course, these insoluble cases + can be returned as error flags to the calling routine if desired. */ +/** return value: number of corrected errors or -1 if can't correct it */ +int RScodec::decode(unsigned char *data) { + if (!isOk) return -1; + int bb = nn-kk;; //nn-kk length of parity data + + int *recd = new (std::nothrow) int[nn]; + int **elp = new int*[bb + 2]; + for (int i = 0; i < bb + 2; ++i) + elp[i] = new int[bb]; + int *d = new int[bb + 2]; + int *l = new int[bb + 2]; + int *u_lu = new int[bb + 2]; + int *s = new int[bb + 1]; + int *root = new int[tt]; + int *loc = new int[tt]; + int *z = new int[tt+1]; + int *err = new int[nn]; + int *reg = new int[tt + 1]; + + int res = calcDecode(data, recd, elp ,d ,l, u_lu, s, root, loc ,z, err, reg, bb); + + delete[] recd; + for (int i = 0; i < bb + 2; ++i) + delete[] elp[i]; + delete[] elp; + delete[] d; + delete[] l; + delete[] u_lu; + delete[] s; + delete[] root; + delete[] loc; + delete[] z; + delete[] err; + delete[] reg; + + return res; +} diff --git a/extlib/libdxfrw/intern/rscodec.h b/extlib/libdxfrw/intern/rscodec.h new file mode 100644 index 0000000..10cb2a8 --- /dev/null +++ b/extlib/libdxfrw/intern/rscodec.h @@ -0,0 +1,69 @@ +/****************************************************************************** +** libDXFrw - Library to read/write DXF files (ascii & binary) ** +** ** +** Copyright (C) 2011-2014 J.F. Soriano (Rallaz), rallazz@gmail.com ** +** ** +** This library is free software, licensed under the terms of the GNU ** +** General Public License as published by the Free Software Foundation, ** +** either version 2 of the License, or (at your option) any later version. ** +** You should have received a copy of the GNU General Public License ** +** along with this program. If not, see . ** +******************************************************************************/ + +/** + * Reed-Solomon codec + * Reed Solomon code lifted from encoder/decoder for Reed-Solomon written by Simon Rockliff + * + * Original code: + * This program may be freely modified and/or given to whoever wants it. + * A condition of such distribution is that the author's contribution be + * acknowledged by his name being left in the comments heading the program, + * however no responsibility is accepted for any financial or other loss which + * may result from some unforseen errors or malfunctioning of the program + * during use. + * Simon Rockliff, 26th June 1991 + */ + + + +#ifndef RSCODEC_H +#define RSCODEC_H +/** +mm: RS code over GF(2^4) +nn: nn= (2^mm) - 1 length of codeword +tt: number of errors that can be corrected +kk: kk = nn-2*tt +pp: irreducible polynomial coeffts, pp [mm] send as int +*/ +class RScodec { +public: + RScodec(unsigned int pp, int mm, int tt); + + ~RScodec(); +// bool encode(int *data, int *parity); +// int decode(int *recd); + bool encode(unsigned char *data, unsigned char *parity); + int decode(unsigned char *data); + bool isOkey(){return isOk;} + const unsigned int* indexOf() {return index_of;} + const int* alphaTo() {return alpha_to;} + +private: + void RSgenerate_gf(unsigned int pp); + void RSgen_poly(); + int calcDecode(unsigned char* data, int* recd, int** elp, int* d, int* l, int* u_lu, int* s, int* root, int* loc, int* z, int* err, int* reg, int bb); + + +private: + int mm; //RS code over GF(2^4) + int tt; //number of errors that can be corrected + int nn; //(2^mm) - 1 length of codeword + int kk; //nn-2*tt length of original data + + int *gg; + bool isOk; + unsigned int *index_of; + int *alpha_to; +}; + +#endif // RSCODEC_H diff --git a/extlib/libdxfrw/libdwgr.cpp b/extlib/libdxfrw/libdwgr.cpp new file mode 100644 index 0000000..adca43c --- /dev/null +++ b/extlib/libdxfrw/libdwgr.cpp @@ -0,0 +1,237 @@ +/****************************************************************************** +** libDXFrw - Library to read/write DXF files (ascii & binary) ** +** ** +** Copyright (C) 2011-2015 José F. Soriano, rallazz@gmail.com ** +** ** +** This library is free software, licensed under the terms of the GNU ** +** General Public License as published by the Free Software Foundation, ** +** either version 2 of the License, or (at your option) any later version. ** +** You should have received a copy of the GNU General Public License ** +** along with this program. If not, see . ** +******************************************************************************/ + + +#include "libdwgr.h" +#include +#include +#include +#include "intern/drw_dbg.h" +#include "intern/drw_textcodec.h" +#include "intern/dwgreader.h" +#include "intern/dwgreader15.h" +#include "intern/dwgreader18.h" +#include "intern/dwgreader21.h" +#include "intern/dwgreader24.h" +#include "intern/dwgreader27.h" + +#define FIRSTHANDLE 48 + +/*enum sections { + secUnknown, + secHeader, + secTables, + secBlocks, + secEntities, + secObjects +};*/ + +dwgR::dwgR(){ + DRW_DBGSL(DRW_dbg::NONE); + reader = NULL; +// writer = NULL; + applyExt = false; + version = DRW::UNKNOWNV; + error = DRW::BAD_NONE; +} + +dwgR::~dwgR(){ + if (reader != NULL) + delete reader; + +} + +void dwgR::setDebug(DRW::DBG_LEVEL lvl){ + switch (lvl){ + case DRW::DEBUG: + DRW_DBGSL(DRW_dbg::DEBUG); + break; + default: + DRW_DBGSL(DRW_dbg::NONE); + } +} + +/*reads metadata and loads image preview*/ +bool dwgR::getPreview(std::istream &stream){ + bool isOk = false; + + isOk = open(&stream); + if (!isOk) + return false; + + isOk = reader->readMetaData(); + if (isOk) { + isOk = reader->readPreview(); + } else + error = DRW::BAD_READ_METADATA; + + if (reader != NULL) { + delete reader; + reader = NULL; + } + return isOk; +} + +bool dwgR::read(std::istream &stream, DRW_Interface *interface_, bool ext){ + applyExt = ext; + iface = interface_; + + bool isOk = false; + + isOk = open(&stream); + if (!isOk) + return false; + + isOk = reader->readMetaData(); + if (isOk) { + isOk = reader->readFileHeader(); + if (isOk) { + isOk = processDwg(); + } else + error = DRW::BAD_READ_FILE_HEADER; + } else + error = DRW::BAD_READ_METADATA; + + if (reader != NULL) { + delete reader; + reader = NULL; + } + + return isOk; +} + +bool dwgR::open(std::istream *stream){ + char line[7]; + stream->read (line, 6); + line[6]='\0'; + DRW_DBG("dwgR::read 2\n"); + DRW_DBG("dwgR::read line version: "); + DRW_DBG(line); + DRW_DBG("\n"); + + if (strcmp(line, "AC1006") == 0) + version = DRW::AC1006; + else if (strcmp(line, "AC1009") == 0) { + version = DRW::AC1009; +// reader = new dwgReader09(&filestr, this); + }else if (strcmp(line, "AC1012") == 0){ + version = DRW::AC1012; + reader = new dwgReader15(stream, this); + } else if (strcmp(line, "AC1014") == 0) { + version = DRW::AC1014; + reader = new dwgReader15(stream, this); + } else if (strcmp(line, "AC1015") == 0) { + version = DRW::AC1015; + reader = new dwgReader15(stream, this); + } else if (strcmp(line, "AC1018") == 0){ + version = DRW::AC1018; + reader = new dwgReader18(stream, this); + } else if (strcmp(line, "AC1021") == 0) { + version = DRW::AC1021; + reader = new dwgReader21(stream, this); + } else if (strcmp(line, "AC1024") == 0) { + version = DRW::AC1024; + reader = new dwgReader24(stream, this); + } else if (strcmp(line, "AC1027") == 0) { + version = DRW::AC1027; + reader = new dwgReader27(stream, this); + } else + version = DRW::UNKNOWNV; + + if (reader == NULL) { + error = DRW::BAD_VERSION; + return false; + } + return true; +} + +/********* Reader Process *********/ + +bool dwgR::processDwg() { + DRW_DBG("dwgR::processDwg() start processing dwg\n"); + bool ret; + bool ret2; + DRW_Header hdr; + ret = reader->readDwgHeader(hdr); + if (!ret) { + error = DRW::BAD_READ_HEADER; + } + + ret2 = reader->readDwgClasses(); + if (ret && !ret2) { + error = DRW::BAD_READ_CLASSES; + ret = ret2; + } + + ret2 = reader->readDwgHandles(); + if (ret && !ret2) { + error = DRW::BAD_READ_HANDLES; + ret = ret2; + } + + ret2 = reader->readDwgTables(hdr); + if (ret && !ret2) { + error = DRW::BAD_READ_TABLES; + ret = ret2; + } + + iface->addHeader(&hdr); + + for (std::map::iterator it=reader->ltypemap.begin(); it!=reader->ltypemap.end(); ++it) { + DRW_LType *lt = it->second; + iface->addLType(const_cast(*lt) ); + } + for (std::map::iterator it=reader->layermap.begin(); it!=reader->layermap.end(); ++it) { + DRW_Layer *ly = it->second; + iface->addLayer(const_cast(*ly)); + } + + for (std::map::iterator it=reader->stylemap.begin(); it!=reader->stylemap.end(); ++it) { + DRW_Textstyle *ly = it->second; + iface->addTextStyle(const_cast(*ly)); + } + + for (std::map::iterator it=reader->dimstylemap.begin(); it!=reader->dimstylemap.end(); ++it) { + DRW_Dimstyle *ly = it->second; + iface->addDimStyle(const_cast(*ly)); + } + + for (std::map::iterator it=reader->vportmap.begin(); it!=reader->vportmap.end(); ++it) { + DRW_Vport *ly = it->second; + iface->addVport(const_cast(*ly)); + } + + for (std::map::iterator it=reader->appIdmap.begin(); it!=reader->appIdmap.end(); ++it) { + DRW_AppId *ly = it->second; + iface->addAppId(const_cast(*ly)); + } + + ret2 = reader->readDwgBlocks(*iface); + if (ret && !ret2) { + error = DRW::BAD_READ_BLOCKS; + ret = ret2; + } + + ret2 = reader->readDwgEntities(*iface); + if (ret && !ret2) { + error = DRW::BAD_READ_ENTITIES; + ret = ret2; + } + + ret2 = reader->readDwgObjects(*iface); + if (ret && !ret2) { + error = DRW::BAD_READ_OBJECTS; + ret = ret2; + } + + return ret; +} diff --git a/extlib/libdxfrw/libdwgr.h b/extlib/libdxfrw/libdwgr.h new file mode 100644 index 0000000..0601004 --- /dev/null +++ b/extlib/libdxfrw/libdwgr.h @@ -0,0 +1,50 @@ +/****************************************************************************** +** libDXFrw - Library to read/write DXF files (ascii & binary) ** +** ** +** Copyright (C) 2011-2015 José F. Soriano, rallazz@gmail.com ** +** ** +** This library is free software, licensed under the terms of the GNU ** +** General Public License as published by the Free Software Foundation, ** +** either version 2 of the License, or (at your option) any later version. ** +** You should have received a copy of the GNU General Public License ** +** along with this program. If not, see . ** +******************************************************************************/ + +#ifndef LIBDWGR_H +#define LIBDWGR_H + +#include +//#include +#include "drw_entities.h" +#include "drw_objects.h" +#include "drw_classes.h" +#include "drw_interface.h" + +class dwgReader; + +class dwgR { +public: + dwgR(); + ~dwgR(); + //read: return true if all ok + bool read(std::istream &stream, DRW_Interface *interface_, bool ext); + bool getPreview(std::istream &stream); + DRW::Version getVersion(){return version;} + DRW::error getError(){return error;} + void setDebug(DRW::DBG_LEVEL lvl); + +private: + bool open(std::istream *stream); + bool processDwg(); +private: + DRW::Version version; + DRW::error error; + std::string fileName; + bool applyExt; /*apply extrusion in entities to conv in 2D?*/ + std::string codePage; + DRW_Interface *iface; + dwgReader *reader; + +}; + +#endif // LIBDWGR_H diff --git a/extlib/libdxfrw/libdxfrw.cpp b/extlib/libdxfrw/libdxfrw.cpp new file mode 100644 index 0000000..9eecea7 --- /dev/null +++ b/extlib/libdxfrw/libdxfrw.cpp @@ -0,0 +1,2765 @@ +/****************************************************************************** +** libDXFrw - Library to read/write DXF files (ascii & binary) ** +** ** +** Copyright (C) 2011-2015 José F. Soriano, rallazz@gmail.com ** +** ** +** This library is free software, licensed under the terms of the GNU ** +** General Public License as published by the Free Software Foundation, ** +** either version 2 of the License, or (at your option) any later version. ** +** You should have received a copy of the GNU General Public License ** +** along with this program. If not, see . ** +******************************************************************************/ + + +#include "libdxfrw.h" +#include +#include +#include +#include +#include "intern/drw_textcodec.h" +#include "intern/dxfreader.h" +#include "intern/dxfwriter.h" +#include "intern/drw_dbg.h" + +#define FIRSTHANDLE 48 + +/*enum sections { + secUnknown, + secHeader, + secTables, + secBlocks, + secEntities, + secObjects +};*/ + +dxfRW::dxfRW(){ + DRW_DBGSL(DRW_dbg::NONE); + reader = NULL; + writer = NULL; + applyExt = false; + elParts = 128; //parts munber when convert ellipse to polyline +} +dxfRW::~dxfRW(){ + if (reader != NULL) + delete reader; + if (writer != NULL) + delete writer; + for (std::vector::iterator it=imageDef.begin(); it!=imageDef.end(); ++it) + delete *it; + + imageDef.clear(); +} + +void dxfRW::setDebug(DRW::DBG_LEVEL lvl){ + switch (lvl){ + case DRW::DEBUG: + DRW_DBGSL(DRW_dbg::DEBUG); + break; + default: + DRW_DBGSL(DRW_dbg::NONE); + } +} + +bool dxfRW::read(std::istream &stream, DRW_Interface *interface_, bool ext){ + applyExt = ext; + + if(interface_ == NULL) + return false; + + char line[22]; + char line2[22] = "AutoCAD Binary DXF\r\n"; + line2[20] = (char)26; + line2[21] = '\0'; + stream.read (line, 22); + iface = interface_; + DRW_DBG("dxfRW::read 2\n"); + if (strcmp(line, line2) == 0) { + binFile = true; + reader = new dxfReaderBinary(&stream); + DRW_DBG("dxfRW::read binary file\n"); + } else { + binFile = false; + stream.seekg(0, std::ios::beg); + reader = new dxfReaderAscii(&stream); + } + + bool isOk = processDxf(); + delete reader; + reader = NULL; + return isOk; +} + +bool dxfRW::write(std::ostream &stream, DRW_Interface *interface_, DRW::Version ver, bool bin){ + version = ver; + binFile = bin; + iface = interface_; + if (binFile) { + //write sentinel + stream << "AutoCAD Binary DXF\r\n" << (char)26 << '\0'; + writer = new dxfWriterBinary(&stream); + DRW_DBG("dxfRW::read binary file\n"); + } else { + writer = new dxfWriterAscii(&stream); + std::string comm = std::string("dxfrw ") + std::string(DRW_VERSION); + writer->writeString(999, comm); + } + DRW_Header header; + iface->writeHeader(header); + writer->writeString(0, "SECTION"); + entCount =FIRSTHANDLE; + header.write(writer, version); + writer->writeString(0, "ENDSEC"); + if (ver > DRW::AC1009) { + writer->writeString(0, "SECTION"); + writer->writeString(2, "CLASSES"); + writer->writeString(0, "ENDSEC"); + } + writer->writeString(0, "SECTION"); + writer->writeString(2, "TABLES"); + writeTables(); + writer->writeString(0, "ENDSEC"); + writer->writeString(0, "SECTION"); + writer->writeString(2, "BLOCKS"); + writeBlocks(); + writer->writeString(0, "ENDSEC"); + + writer->writeString(0, "SECTION"); + writer->writeString(2, "ENTITIES"); + iface->writeEntities(); + writer->writeString(0, "ENDSEC"); + + if (version > DRW::AC1009) { + writer->writeString(0, "SECTION"); + writer->writeString(2, "OBJECTS"); + writeObjects(); + writer->writeString(0, "ENDSEC"); + } + writer->writeString(0, "EOF"); + stream.flush(); + delete writer; + writer = NULL; + return true; +} + +bool dxfRW::writeEntity(DRW_Entity *ent) { + ent->handle = ++entCount; + writer->writeString(5, toHexStr(ent->handle)); + if (version > DRW::AC1009) { + writer->writeString(100, "AcDbEntity"); + } + if (ent->space == 1) + writer->writeInt16(67, 1); + if (version > DRW::AC1009) { + writer->writeUtf8String(8, ent->layer); + writer->writeUtf8String(6, ent->lineType); + } else { + writer->writeUtf8Caps(8, ent->layer); + writer->writeUtf8Caps(6, ent->lineType); + } + writer->writeInt16(62, ent->color); + if (version > DRW::AC1015 && ent->color24 >= 0) { + writer->writeInt32(420, ent->color24); + } + if (version > DRW::AC1014) { + writer->writeInt16(370, DRW_LW_Conv::lineWidth2dxfInt(ent->lWeight)); + } + return true; +} + +bool dxfRW::writeLineType(DRW_LType *ent){ + std::string strname = ent->name; + + transform(strname.begin(), strname.end(), strname.begin(),::toupper); +//do not write linetypes handled by library + if (strname == "BYLAYER" || strname == "BYBLOCK" || strname == "CONTINUOUS") { + return true; + } + writer->writeString(0, "LTYPE"); + if (version > DRW::AC1009) { + writer->writeString(5, toHexStr(++entCount)); + if (version > DRW::AC1012) { + writer->writeString(330, "5"); + } + writer->writeString(100, "AcDbSymbolTableRecord"); + writer->writeString(100, "AcDbLinetypeTableRecord"); + writer->writeUtf8String(2, ent->name); + } else + writer->writeUtf8Caps(2, ent->name); + writer->writeInt16(70, ent->flags); + writer->writeUtf8String(3, ent->desc); + ent->update(); + writer->writeInt16(72, 65); + writer->writeInt16(73, ent->size); + writer->writeDouble(40, ent->length); + + for (unsigned int i = 0; i< ent->path.size(); i++){ + writer->writeDouble(49, ent->path.at(i)); + if (version > DRW::AC1009) { + writer->writeInt16(74, 0); + } + } + return true; +} + +bool dxfRW::writeLayer(DRW_Layer *ent){ + writer->writeString(0, "LAYER"); + if (!wlayer0 && ent->name == "0") { + wlayer0 = true; + if (version > DRW::AC1009) { + writer->writeString(5, "10"); + } + } else { + if (version > DRW::AC1009) { + writer->writeString(5, toHexStr(++entCount)); + } + } + if (version > DRW::AC1012) { + writer->writeString(330, "2"); + } + if (version > DRW::AC1009) { + writer->writeString(100, "AcDbSymbolTableRecord"); + writer->writeString(100, "AcDbLayerTableRecord"); + writer->writeUtf8String(2, ent->name); + } else { + writer->writeUtf8Caps(2, ent->name); + } + writer->writeInt16(70, ent->flags); + writer->writeInt16(62, ent->color); + if (version > DRW::AC1015 && ent->color24 >= 0) { + writer->writeInt32(420, ent->color24); + } + if (version > DRW::AC1009) { + writer->writeUtf8String(6, ent->lineType); + if (! ent->plotF) + writer->writeBool(290, ent->plotF); + writer->writeInt16(370, DRW_LW_Conv::lineWidth2dxfInt(ent->lWeight)); + writer->writeString(390, "F"); + } else + writer->writeUtf8Caps(6, ent->lineType); + if (!ent->extData.empty()){ + writeExtData(ent->extData); + } +// writer->writeString(347, "10012"); + return true; +} + +bool dxfRW::writeTextstyle(DRW_Textstyle *ent){ + writer->writeString(0, "STYLE"); + if (!dimstyleStd) { + //stringstream cause crash in OS/X, bug#3597944 + std::string name=ent->name; + transform(name.begin(), name.end(), name.begin(), toupper); + if (name == "STANDARD") + dimstyleStd = true; + } + if (version > DRW::AC1009) { + writer->writeString(5, toHexStr(++entCount)); + } + + if (version > DRW::AC1012) { + writer->writeString(330, "2"); + } + if (version > DRW::AC1009) { + writer->writeString(100, "AcDbSymbolTableRecord"); + writer->writeString(100, "AcDbTextStyleTableRecord"); + writer->writeUtf8String(2, ent->name); + } else { + writer->writeUtf8Caps(2, ent->name); + } + writer->writeInt16(70, ent->flags); + writer->writeDouble(40, ent->height); + writer->writeDouble(41, ent->width); + writer->writeDouble(50, ent->oblique); + writer->writeInt16(71, ent->genFlag); + writer->writeDouble(42, ent->lastHeight); + if (version > DRW::AC1009) { + writer->writeUtf8String(3, ent->font); + writer->writeUtf8String(4, ent->bigFont); + if (ent->fontFamily != 0) + writer->writeInt32(1071, ent->fontFamily); + } else { + writer->writeUtf8Caps(3, ent->font); + writer->writeUtf8Caps(4, ent->bigFont); + } + return true; +} + +bool dxfRW::writeVport(DRW_Vport *ent){ + if (!dimstyleStd) { + ent->name = "*ACTIVE"; + dimstyleStd = true; + } + writer->writeString(0, "VPORT"); + if (version > DRW::AC1009) { + writer->writeString(5, toHexStr(++entCount)); + if (version > DRW::AC1012) + writer->writeString(330, "2"); + writer->writeString(100, "AcDbSymbolTableRecord"); + writer->writeString(100, "AcDbViewportTableRecord"); + writer->writeUtf8String(2, ent->name); + } else + writer->writeUtf8Caps(2, ent->name); + writer->writeInt16(70, ent->flags); + writer->writeDouble(10, ent->lowerLeft.x); + writer->writeDouble(20, ent->lowerLeft.y); + writer->writeDouble(11, ent->UpperRight.x); + writer->writeDouble(21, ent->UpperRight.y); + writer->writeDouble(12, ent->center.x); + writer->writeDouble(22, ent->center.y); + writer->writeDouble(13, ent->snapBase.x); + writer->writeDouble(23, ent->snapBase.y); + writer->writeDouble(14, ent->snapSpacing.x); + writer->writeDouble(24, ent->snapSpacing.y); + writer->writeDouble(15, ent->gridSpacing.x); + writer->writeDouble(25, ent->gridSpacing.y); + writer->writeDouble(16, ent->viewDir.x); + writer->writeDouble(26, ent->viewDir.y); + writer->writeDouble(36, ent->viewDir.z); + writer->writeDouble(17, ent->viewTarget.z); + writer->writeDouble(27, ent->viewTarget.z); + writer->writeDouble(37, ent->viewTarget.z); + writer->writeDouble(40, ent->height); + writer->writeDouble(41, ent->ratio); + writer->writeDouble(42, ent->lensHeight); + writer->writeDouble(43, ent->frontClip); + writer->writeDouble(44, ent->backClip); + writer->writeDouble(50, ent->snapAngle); + writer->writeDouble(51, ent->twistAngle); + writer->writeInt16(71, ent->viewMode); + writer->writeInt16(72, ent->circleZoom); + writer->writeInt16(73, ent->fastZoom); + writer->writeInt16(74, ent->ucsIcon); + writer->writeInt16(75, ent->snap); + writer->writeInt16(76, ent->grid); + writer->writeInt16(77, ent->snapStyle); + writer->writeInt16(78, ent->snapIsopair); + if (version > DRW::AC1014) { + writer->writeInt16(281, 0); + writer->writeInt16(65, 1); + writer->writeDouble(110, 0.0); + writer->writeDouble(120, 0.0); + writer->writeDouble(130, 0.0); + writer->writeDouble(111, 1.0); + writer->writeDouble(121, 0.0); + writer->writeDouble(131, 0.0); + writer->writeDouble(112, 0.0); + writer->writeDouble(122, 1.0); + writer->writeDouble(132, 0.0); + writer->writeInt16(79, 0); + writer->writeDouble(146, 0.0); + if (version > DRW::AC1018) { + writer->writeString(348, "10020"); + writer->writeInt16(60, ent->gridBehavior);//v2007 undocummented see DRW_Vport class + writer->writeInt16(61, 5); + writer->writeBool(292, 1); + writer->writeInt16(282, 1); + writer->writeDouble(141, 0.0); + writer->writeDouble(142, 0.0); + writer->writeInt16(63, 250); + writer->writeInt32(421, 3358443); + } + } + return true; +} + +bool dxfRW::writeDimstyle(DRW_Dimstyle *ent){ + writer->writeString(0, "DIMSTYLE"); + if (!dimstyleStd) { + std::string name = ent->name; + std::transform(name.begin(), name.end(), name.begin(),::toupper); + if (name == "STANDARD") + dimstyleStd = true; + } + if (version > DRW::AC1009) { + writer->writeString(105, toHexStr(++entCount)); + } + + if (version > DRW::AC1012) { + writer->writeString(330, "A"); + } + if (version > DRW::AC1009) { + writer->writeString(100, "AcDbSymbolTableRecord"); + writer->writeString(100, "AcDbDimStyleTableRecord"); + writer->writeUtf8String(2, ent->name); + } else + writer->writeUtf8Caps(2, ent->name); + writer->writeInt16(70, ent->flags); + if ( version == DRW::AC1009 || !(ent->dimpost.empty()) ) + writer->writeUtf8String(3, ent->dimpost); + if ( version == DRW::AC1009 || !(ent->dimapost.empty()) ) + writer->writeUtf8String(4, ent->dimapost); + if ( version == DRW::AC1009 || !(ent->dimblk.empty()) ) + writer->writeUtf8String(5, ent->dimblk); + if ( version == DRW::AC1009 || !(ent->dimblk1.empty()) ) + writer->writeUtf8String(6, ent->dimblk1); + if ( version == DRW::AC1009 || !(ent->dimblk2.empty()) ) + writer->writeUtf8String(7, ent->dimblk2); + writer->writeDouble(40, ent->dimscale); + writer->writeDouble(41, ent->dimasz); + writer->writeDouble(42, ent->dimexo); + writer->writeDouble(43, ent->dimdli); + writer->writeDouble(44, ent->dimexe); + writer->writeDouble(45, ent->dimrnd); + writer->writeDouble(46, ent->dimdle); + writer->writeDouble(47, ent->dimtp); + writer->writeDouble(48, ent->dimtm); + writer->writeDouble(140, ent->dimtxt); + writer->writeDouble(141, ent->dimcen); + writer->writeDouble(142, ent->dimtsz); + writer->writeDouble(143, ent->dimaltf); + writer->writeDouble(144, ent->dimlfac); + writer->writeDouble(145, ent->dimtvp); + writer->writeDouble(146, ent->dimtfac); + writer->writeDouble(147, ent->dimgap); + if (version > DRW::AC1014) { + writer->writeDouble(148, ent->dimaltrnd); + } + writer->writeInt16(71, ent->dimtol); + writer->writeInt16(72, ent->dimlim); + writer->writeInt16(73, ent->dimtih); + writer->writeInt16(74, ent->dimtoh); + writer->writeInt16(75, ent->dimse1); + writer->writeInt16(76, ent->dimse2); + writer->writeInt16(77, ent->dimtad); + writer->writeInt16(78, ent->dimzin); + if (version > DRW::AC1014) { + writer->writeInt16(79, ent->dimazin); + } + writer->writeInt16(170, ent->dimalt); + writer->writeInt16(171, ent->dimaltd); + writer->writeInt16(172, ent->dimtofl); + writer->writeInt16(173, ent->dimsah); + writer->writeInt16(174, ent->dimtix); + writer->writeInt16(175, ent->dimsoxd); + writer->writeInt16(176, ent->dimclrd); + writer->writeInt16(177, ent->dimclre); + writer->writeInt16(178, ent->dimclrt); + if (version > DRW::AC1014) { + writer->writeInt16(179, ent->dimadec); + } + if (version > DRW::AC1009) { + if (version < DRW::AC1015) + writer->writeInt16(270, ent->dimunit); + writer->writeInt16(271, ent->dimdec); + writer->writeInt16(272, ent->dimtdec); + writer->writeInt16(273, ent->dimaltu); + writer->writeInt16(274, ent->dimalttd); + writer->writeInt16(275, ent->dimaunit); + } + if (version > DRW::AC1014) { + writer->writeInt16(276, ent->dimfrac); + writer->writeInt16(277, ent->dimlunit); + writer->writeInt16(278, ent->dimdsep); + writer->writeInt16(279, ent->dimtmove); + } + if (version > DRW::AC1009) { + writer->writeInt16(280, ent->dimjust); + writer->writeInt16(281, ent->dimsd1); + writer->writeInt16(282, ent->dimsd2); + writer->writeInt16(283, ent->dimtolj); + writer->writeInt16(284, ent->dimtzin); + writer->writeInt16(285, ent->dimaltz); + writer->writeInt16(286, ent->dimaltttz); + if (version < DRW::AC1015) + writer->writeInt16(287, ent->dimfit); + writer->writeInt16(288, ent->dimupt); + } + if (version > DRW::AC1014) { + writer->writeInt16(289, ent->dimatfit); + } + if (version > DRW::AC1009 && !ent->dimtxsty.empty()) { + writer->writeUtf8String(340, ent->dimtxsty); + } + if (version > DRW::AC1014) { + writer->writeUtf8String(341, ent->dimldrblk); + writer->writeInt16(371, ent->dimlwd); + writer->writeInt16(372, ent->dimlwe); + } + return true; +} + +bool dxfRW::writeAppId(DRW_AppId *ent){ + std::string strname = ent->name; + transform(strname.begin(), strname.end(), strname.begin(),::toupper); +//do not write mandatory ACAD appId, handled by library + if (strname == "ACAD") + return true; + writer->writeString(0, "APPID"); + if (version > DRW::AC1009) { + writer->writeString(5, toHexStr(++entCount)); + if (version > DRW::AC1014) { + writer->writeString(330, "9"); + } + writer->writeString(100, "AcDbSymbolTableRecord"); + writer->writeString(100, "AcDbRegAppTableRecord"); + writer->writeUtf8String(2, ent->name); + } else { + writer->writeUtf8Caps(2, ent->name); + } + writer->writeInt16(70, ent->flags); + return true; +} + +bool dxfRW::writePoint(DRW_Point *ent) { + writer->writeString(0, "POINT"); + writeEntity(ent); + if (version > DRW::AC1009) { + writer->writeString(100, "AcDbPoint"); + } + writer->writeDouble(10, ent->basePoint.x); + writer->writeDouble(20, ent->basePoint.y); + if (ent->basePoint.z != 0.0) { + writer->writeDouble(30, ent->basePoint.z); + } + return true; +} + +bool dxfRW::writeLine(DRW_Line *ent) { + writer->writeString(0, "LINE"); + writeEntity(ent); + if (version > DRW::AC1009) { + writer->writeString(100, "AcDbLine"); + } + writer->writeDouble(10, ent->basePoint.x); + writer->writeDouble(20, ent->basePoint.y); + if (ent->basePoint.z != 0.0 || ent->secPoint.z != 0.0) { + writer->writeDouble(30, ent->basePoint.z); + writer->writeDouble(11, ent->secPoint.x); + writer->writeDouble(21, ent->secPoint.y); + writer->writeDouble(31, ent->secPoint.z); + } else { + writer->writeDouble(11, ent->secPoint.x); + writer->writeDouble(21, ent->secPoint.y); + } + return true; +} + +bool dxfRW::writeRay(DRW_Ray *ent) { + writer->writeString(0, "RAY"); + writeEntity(ent); + if (version > DRW::AC1009) { + writer->writeString(100, "AcDbRay"); + } + DRW_Coord crd = ent->secPoint; + crd.unitize(); + writer->writeDouble(10, ent->basePoint.x); + writer->writeDouble(20, ent->basePoint.y); + if (ent->basePoint.z != 0.0 || ent->secPoint.z != 0.0) { + writer->writeDouble(30, ent->basePoint.z); + writer->writeDouble(11, crd.x); + writer->writeDouble(21, crd.y); + writer->writeDouble(31, crd.z); + } else { + writer->writeDouble(11, crd.x); + writer->writeDouble(21, crd.y); + } + return true; +} + +bool dxfRW::writeXline(DRW_Xline *ent) { + writer->writeString(0, "XLINE"); + writeEntity(ent); + if (version > DRW::AC1009) { + writer->writeString(100, "AcDbXline"); + } + DRW_Coord crd = ent->secPoint; + crd.unitize(); + writer->writeDouble(10, ent->basePoint.x); + writer->writeDouble(20, ent->basePoint.y); + if (ent->basePoint.z != 0.0 || ent->secPoint.z != 0.0) { + writer->writeDouble(30, ent->basePoint.z); + writer->writeDouble(11, crd.x); + writer->writeDouble(21, crd.y); + writer->writeDouble(31, crd.z); + } else { + writer->writeDouble(11, crd.x); + writer->writeDouble(21, crd.y); + } + return true; +} + +bool dxfRW::writeCircle(DRW_Circle *ent) { + writer->writeString(0, "CIRCLE"); + writeEntity(ent); + if (version > DRW::AC1009) { + writer->writeString(100, "AcDbCircle"); + } + writer->writeDouble(10, ent->basePoint.x); + writer->writeDouble(20, ent->basePoint.y); + if (ent->basePoint.z != 0.0) { + writer->writeDouble(30, ent->basePoint.z); + } + writer->writeDouble(40, ent->radious); + return true; +} + +bool dxfRW::writeArc(DRW_Arc *ent) { + writer->writeString(0, "ARC"); + writeEntity(ent); + if (version > DRW::AC1009) { + writer->writeString(100, "AcDbCircle"); + } + writer->writeDouble(10, ent->basePoint.x); + writer->writeDouble(20, ent->basePoint.y); + if (ent->basePoint.z != 0.0) { + writer->writeDouble(30, ent->basePoint.z); + } + writer->writeDouble(40, ent->radious); + if (version > DRW::AC1009) { + writer->writeString(100, "AcDbArc"); + } + writer->writeDouble(50, ent->staangle*ARAD); + writer->writeDouble(51, ent->endangle*ARAD); + return true; +} + +bool dxfRW::writeEllipse(DRW_Ellipse *ent){ + //verify axis/ratio and params for full ellipse + ent->correctAxis(); + if (version > DRW::AC1009) { + writer->writeString(0, "ELLIPSE"); + writeEntity(ent); + if (version > DRW::AC1009) { + writer->writeString(100, "AcDbEllipse"); + } + writer->writeDouble(10, ent->basePoint.x); + writer->writeDouble(20, ent->basePoint.y); + writer->writeDouble(30, ent->basePoint.z); + writer->writeDouble(11, ent->secPoint.x); + writer->writeDouble(21, ent->secPoint.y); + writer->writeDouble(31, ent->secPoint.z); + writer->writeDouble(40, ent->ratio); + writer->writeDouble(41, ent->staparam); + writer->writeDouble(42, ent->endparam); + } else { + DRW_Polyline pol; + //RLZ: copy properties + ent->toPolyline(&pol, elParts); + writePolyline(&pol); + } + return true; +} + +bool dxfRW::writeTrace(DRW_Trace *ent){ + writer->writeString(0, "TRACE"); + writeEntity(ent); + if (version > DRW::AC1009) { + writer->writeString(100, "AcDbTrace"); + } + writer->writeDouble(10, ent->basePoint.x); + writer->writeDouble(20, ent->basePoint.y); + writer->writeDouble(30, ent->basePoint.z); + writer->writeDouble(11, ent->secPoint.x); + writer->writeDouble(21, ent->secPoint.y); + writer->writeDouble(31, ent->secPoint.z); + writer->writeDouble(12, ent->thirdPoint.x); + writer->writeDouble(22, ent->thirdPoint.y); + writer->writeDouble(32, ent->thirdPoint.z); + writer->writeDouble(13, ent->fourPoint.x); + writer->writeDouble(23, ent->fourPoint.y); + writer->writeDouble(33, ent->fourPoint.z); + return true; +} + +bool dxfRW::writeSolid(DRW_Solid *ent){ + writer->writeString(0, "SOLID"); + writeEntity(ent); + if (version > DRW::AC1009) { + writer->writeString(100, "AcDbTrace"); + } + writer->writeDouble(10, ent->basePoint.x); + writer->writeDouble(20, ent->basePoint.y); + writer->writeDouble(30, ent->basePoint.z); + writer->writeDouble(11, ent->secPoint.x); + writer->writeDouble(21, ent->secPoint.y); + writer->writeDouble(31, ent->secPoint.z); + writer->writeDouble(12, ent->thirdPoint.x); + writer->writeDouble(22, ent->thirdPoint.y); + writer->writeDouble(32, ent->thirdPoint.z); + writer->writeDouble(13, ent->fourPoint.x); + writer->writeDouble(23, ent->fourPoint.y); + writer->writeDouble(33, ent->fourPoint.z); + return true; +} + +bool dxfRW::write3dface(DRW_3Dface *ent){ + writer->writeString(0, "3DFACE"); + writeEntity(ent); + if (version > DRW::AC1009) { + writer->writeString(100, "AcDbFace"); + } + writer->writeDouble(10, ent->basePoint.x); + writer->writeDouble(20, ent->basePoint.y); + writer->writeDouble(30, ent->basePoint.z); + writer->writeDouble(11, ent->secPoint.x); + writer->writeDouble(21, ent->secPoint.y); + writer->writeDouble(31, ent->secPoint.z); + writer->writeDouble(12, ent->thirdPoint.x); + writer->writeDouble(22, ent->thirdPoint.y); + writer->writeDouble(32, ent->thirdPoint.z); + writer->writeDouble(13, ent->fourPoint.x); + writer->writeDouble(23, ent->fourPoint.y); + writer->writeDouble(33, ent->fourPoint.z); + writer->writeInt16(70, ent->invisibleflag); + return true; +} + +bool dxfRW::writeLWPolyline(DRW_LWPolyline *ent){ + if (version > DRW::AC1009) { + writer->writeString(0, "LWPOLYLINE"); + writeEntity(ent); + if (version > DRW::AC1009) { + writer->writeString(100, "AcDbPolyline"); + } + ent->vertexnum = ent->vertlist.size(); + writer->writeInt32(90, ent->vertexnum); + writer->writeInt16(70, ent->flags); + writer->writeDouble(43, ent->width); + if (ent->elevation != 0) + writer->writeDouble(38, ent->elevation); + if (ent->thickness != 0) + writer->writeDouble(39, ent->thickness); + for (int i = 0; i< ent->vertexnum; i++){ + DRW_Vertex2D *v = ent->vertlist.at(i); + writer->writeDouble(10, v->x); + writer->writeDouble(20, v->y); + if (v->stawidth != 0) + writer->writeDouble(40, v->stawidth); + if (v->endwidth != 0) + writer->writeDouble(41, v->endwidth); + if (v->bulge != 0) + writer->writeDouble(42, v->bulge); + } + } else { + //RLZ: TODO convert lwpolyline in polyline (not exist in acad 12) + } + return true; +} + +bool dxfRW::writePolyline(DRW_Polyline *ent) { + writer->writeString(0, "POLYLINE"); + writeEntity(ent); + if (version > DRW::AC1009) { + if (ent->flags & 8 || ent->flags & 16) + writer->writeString(100, "AcDb2dPolyline"); + else + writer->writeString(100, "AcDb3dPolyline"); + } else + writer->writeInt16(66, 1); + writer->writeDouble(10, 0.0); + writer->writeDouble(20, 0.0); + writer->writeDouble(30, ent->basePoint.z); + if (ent->thickness != 0) { + writer->writeDouble(39, ent->thickness); + } + writer->writeInt16(70, ent->flags); + if (ent->defstawidth != 0) { + writer->writeDouble(40, ent->defstawidth); + } + if (ent->defendwidth != 0) { + writer->writeDouble(41, ent->defendwidth); + } + if (ent->flags & 16 || ent->flags & 32) { + writer->writeInt16(71, ent->vertexcount); + writer->writeInt16(72, ent->facecount); + } + if (ent->smoothM != 0) { + writer->writeInt16(73, ent->smoothM); + } + if (ent->smoothN != 0) { + writer->writeInt16(74, ent->smoothN); + } + if (ent->curvetype != 0) { + writer->writeInt16(75, ent->curvetype); + } + DRW_Coord crd = ent->extPoint; + if (crd.x != 0 || crd.y != 0 || crd.z != 1) { + writer->writeDouble(210, crd.x); + writer->writeDouble(220, crd.y); + writer->writeDouble(230, crd.z); + } + + int vertexnum = ent->vertlist.size(); + for (int i = 0; i< vertexnum; i++){ + DRW_Vertex *v = ent->vertlist.at(i); + writer->writeString(0, "VERTEX"); + writeEntity(ent); + if (version > DRW::AC1009) + writer->writeString(100, "AcDbVertex"); + if ( (v->flags & 128) && !(v->flags & 64) ) { + writer->writeDouble(10, 0); + writer->writeDouble(20, 0); + writer->writeDouble(30, 0); + } else { + writer->writeDouble(10, v->basePoint.x); + writer->writeDouble(20, v->basePoint.y); + writer->writeDouble(30, v->basePoint.z); + } + if (v->stawidth != 0) + writer->writeDouble(40, v->stawidth); + if (v->endwidth != 0) + writer->writeDouble(41, v->endwidth); + if (v->bulge != 0) + writer->writeDouble(42, v->bulge); + if (v->flags != 0) { + writer->writeInt16(70, ent->flags); + } + if (v->flags & 2) { + writer->writeDouble(50, v->tgdir); + } + if ( v->flags & 128 ) { + if (v->vindex1 != 0) { + writer->writeInt16(71, v->vindex1); + } + if (v->vindex2 != 0) { + writer->writeInt16(72, v->vindex2); + } + if (v->vindex3 != 0) { + writer->writeInt16(73, v->vindex3); + } + if (v->vindex4 != 0) { + writer->writeInt16(74, v->vindex4); + } + if ( !(v->flags & 64) ) { + writer->writeInt32(91, v->identifier); + } + } + } + writer->writeString(0, "SEQEND"); + writeEntity(ent); + return true; +} + +bool dxfRW::writeSpline(DRW_Spline *ent){ + if (version > DRW::AC1009) { + writer->writeString(0, "SPLINE"); + writeEntity(ent); + if (version > DRW::AC1009) { + writer->writeString(100, "AcDbSpline"); + } + writer->writeDouble(210, ent->normalVec.x); + writer->writeDouble(220, ent->normalVec.y); + writer->writeDouble(230, ent->normalVec.z); + writer->writeInt16(70, ent->flags); + writer->writeInt16(71, ent->degree); + writer->writeInt16(72, ent->nknots); + writer->writeInt16(73, ent->ncontrol); + writer->writeInt16(74, ent->nfit); + writer->writeDouble(42, ent->tolknot); + writer->writeDouble(43, ent->tolcontrol); + //RLZ: warning check if nknots are correct and ncontrol + for (int i = 0; i< ent->nknots; i++){ + writer->writeDouble(40, ent->knotslist.at(i)); + } + for (int i = 0; i< (int)ent->weightlist.size(); i++) { + writer->writeDouble(41, ent->weightlist.at(i)); + } + for (int i = 0; i< ent->ncontrol; i++){ + DRW_Coord *crd = ent->controllist.at(i); + writer->writeDouble(10, crd->x); + writer->writeDouble(20, crd->y); + writer->writeDouble(30, crd->z); + } + } else { + //RLZ: TODO convert spline in polyline (not exist in acad 12) + } + return true; +} + +bool dxfRW::writeHatch(DRW_Hatch *ent){ + if (version > DRW::AC1009) { + writer->writeString(0, "HATCH"); + writeEntity(ent); + writer->writeString(100, "AcDbHatch"); + writer->writeDouble(10, 0.0); + writer->writeDouble(20, 0.0); + writer->writeDouble(30, ent->basePoint.z); + writer->writeDouble(210, ent->extPoint.x); + writer->writeDouble(220, ent->extPoint.y); + writer->writeDouble(230, ent->extPoint.z); + writer->writeString(2, ent->name); + writer->writeInt16(70, ent->solid); + writer->writeInt16(71, ent->associative); + ent->loopsnum = ent->looplist.size(); + writer->writeInt16(91, ent->loopsnum); + //write paths data + for (int i = 0; i< ent->loopsnum; i++){ + DRW_HatchLoop *loop = ent->looplist.at(i); + writer->writeInt16(92, loop->type); + if ( (loop->type & 2) == 2){ + //RLZ: polyline boundary writeme + } else { + //boundary path + loop->update(); + writer->writeInt16(93, loop->numedges); + for (int j = 0; jnumedges; ++j) { + switch ( (loop->objlist.at(j))->eType) { + case DRW::LINE: { + writer->writeInt16(72, 1); + DRW_Line* l = (DRW_Line*)loop->objlist.at(j); + writer->writeDouble(10, l->basePoint.x); + writer->writeDouble(20, l->basePoint.y); + writer->writeDouble(11, l->secPoint.x); + writer->writeDouble(21, l->secPoint.y); + break; } + case DRW::ARC: { + writer->writeInt16(72, 2); + DRW_Arc* a = (DRW_Arc*)loop->objlist.at(j); + writer->writeDouble(10, a->basePoint.x); + writer->writeDouble(20, a->basePoint.y); + writer->writeDouble(40, a->radious); + writer->writeDouble(50, a->staangle*ARAD); + writer->writeDouble(51, a->endangle*ARAD); + writer->writeInt16(73, a->isccw); + break; } + case DRW::ELLIPSE: { + writer->writeInt16(72, 3); + DRW_Ellipse* a = (DRW_Ellipse*)loop->objlist.at(j); + a->correctAxis(); + writer->writeDouble(10, a->basePoint.x); + writer->writeDouble(20, a->basePoint.y); + writer->writeDouble(11, a->secPoint.x); + writer->writeDouble(21, a->secPoint.y); + writer->writeDouble(40, a->ratio); + writer->writeDouble(50, a->staparam*ARAD); + writer->writeDouble(51, a->endparam*ARAD); + writer->writeInt16(73, a->isccw); + break; } + case DRW::SPLINE: + //RLZ: spline boundary writeme +// writer->writeInt16(72, 4); + break; + default: + break; + } + } + writer->writeInt16(97, 0); + } + } + writer->writeInt16(75, ent->hstyle); + writer->writeInt16(76, ent->hpattern); + if (!ent->solid){ + writer->writeDouble(52, ent->angle); + writer->writeDouble(41, ent->scale); + writer->writeInt16(77, ent->doubleflag); + writer->writeInt16(78, ent->deflines); + } +/* if (ent->deflines > 0){ + writer->writeInt16(78, ent->deflines); + }*/ + writer->writeInt32(98, 0); + } else { + //RLZ: TODO verify in acad12 + } + return true; +} + +bool dxfRW::writeLeader(DRW_Leader *ent){ + if (version > DRW::AC1009) { + writer->writeString(0, "LEADER"); + writeEntity(ent); + writer->writeString(100, "AcDbLeader"); + writer->writeUtf8String(3, ent->style); + writer->writeInt16(71, ent->arrow); + writer->writeInt16(72, ent->leadertype); + writer->writeInt16(73, ent->flag); + writer->writeInt16(74, ent->hookline); + writer->writeInt16(75, ent->hookflag); + writer->writeDouble(40, ent->textheight); + writer->writeDouble(41, ent->textwidth); + writer->writeDouble(76, ent->vertnum); + writer->writeDouble(76, ent->vertexlist.size()); + for (unsigned int i=0; ivertexlist.size(); i++) { + DRW_Coord *vert = ent->vertexlist.at(i); + writer->writeDouble(10, vert->x); + writer->writeDouble(20, vert->y); + writer->writeDouble(30, vert->z); + } + } else { + //RLZ: todo not supported by acad 12 saved as unnamed block + } + return true; +} +bool dxfRW::writeDimension(DRW_Dimension *ent) { + if (version > DRW::AC1009) { + writer->writeString(0, "DIMENSION"); + writeEntity(ent); + writer->writeString(100, "AcDbDimension"); + if (!ent->getName().empty()){ + writer->writeString(2, ent->getName()); + } + writer->writeDouble(10, ent->getDefPoint().x); + writer->writeDouble(20, ent->getDefPoint().y); + writer->writeDouble(30, ent->getDefPoint().z); + writer->writeDouble(11, ent->getTextPoint().x); + writer->writeDouble(21, ent->getTextPoint().y); + writer->writeDouble(31, ent->getTextPoint().z); + if ( !(ent->type & 32)) + ent->type = ent->type +32; + writer->writeInt16(70, ent->type); + if ( !(ent->getText().empty()) ) + writer->writeUtf8String(1, ent->getText()); + writer->writeInt16(71, ent->getAlign()); + if ( ent->getTextLineStyle() != 1) + writer->writeInt16(72, ent->getTextLineStyle()); + if ( ent->getTextLineFactor() != 1) + writer->writeDouble(41, ent->getTextLineFactor()); + writer->writeUtf8String(3, ent->getStyle()); + if ( ent->getTextLineFactor() != 0) + writer->writeDouble(53, ent->getDir()); + writer->writeDouble(210, ent->getExtrusion().x); + writer->writeDouble(220, ent->getExtrusion().y); + writer->writeDouble(230, ent->getExtrusion().z); + if ( ent->hasActualMeasurement()) + writer->writeDouble(42, ent->getActualMeasurement()); + + switch (ent->eType) { + case DRW::DIMALIGNED: + case DRW::DIMLINEAR: { + DRW_DimAligned * dd = (DRW_DimAligned*)ent; + writer->writeString(100, "AcDbAlignedDimension"); + DRW_Coord crd = dd->getClonepoint(); + if (crd.x != 0 || crd.y != 0 || crd.z != 0) { + writer->writeDouble(12, crd.x); + writer->writeDouble(22, crd.y); + writer->writeDouble(32, crd.z); + } + writer->writeDouble(13, dd->getDef1Point().x); + writer->writeDouble(23, dd->getDef1Point().y); + writer->writeDouble(33, dd->getDef1Point().z); + writer->writeDouble(14, dd->getDef2Point().x); + writer->writeDouble(24, dd->getDef2Point().y); + writer->writeDouble(34, dd->getDef2Point().z); + if (ent->eType == DRW::DIMLINEAR) { + DRW_DimLinear * dl = (DRW_DimLinear*)ent; + if (dl->getAngle() != 0) + writer->writeDouble(50, dl->getAngle()); + if (dl->getOblique() != 0) + writer->writeDouble(52, dl->getOblique()); + writer->writeString(100, "AcDbRotatedDimension"); + } + break; } + case DRW::DIMRADIAL: { + DRW_DimRadial * dd = (DRW_DimRadial*)ent; + writer->writeString(100, "AcDbRadialDimension"); + writer->writeDouble(15, dd->getDiameterPoint().x); + writer->writeDouble(25, dd->getDiameterPoint().y); + writer->writeDouble(35, dd->getDiameterPoint().z); + writer->writeDouble(40, dd->getLeaderLength()); + break; } + case DRW::DIMDIAMETRIC: { + DRW_DimDiametric * dd = (DRW_DimDiametric*)ent; + writer->writeString(100, "AcDbDiametricDimension"); + writer->writeDouble(15, dd->getDiameter1Point().x); + writer->writeDouble(25, dd->getDiameter1Point().y); + writer->writeDouble(35, dd->getDiameter1Point().z); + writer->writeDouble(40, dd->getLeaderLength()); + break; } + case DRW::DIMANGULAR: { + DRW_DimAngular * dd = (DRW_DimAngular*)ent; + writer->writeString(100, "AcDb2LineAngularDimension"); + writer->writeDouble(13, dd->getFirstLine1().x); + writer->writeDouble(23, dd->getFirstLine1().y); + writer->writeDouble(33, dd->getFirstLine1().z); + writer->writeDouble(14, dd->getFirstLine2().x); + writer->writeDouble(24, dd->getFirstLine2().y); + writer->writeDouble(34, dd->getFirstLine2().z); + writer->writeDouble(15, dd->getSecondLine1().x); + writer->writeDouble(25, dd->getSecondLine1().y); + writer->writeDouble(35, dd->getSecondLine1().z); + writer->writeDouble(16, dd->getDimPoint().x); + writer->writeDouble(26, dd->getDimPoint().y); + writer->writeDouble(36, dd->getDimPoint().z); + break; } + case DRW::DIMANGULAR3P: { + DRW_DimAngular3p * dd = (DRW_DimAngular3p*)ent; + writer->writeDouble(13, dd->getFirstLine().x); + writer->writeDouble(23, dd->getFirstLine().y); + writer->writeDouble(33, dd->getFirstLine().z); + writer->writeDouble(14, dd->getSecondLine().x); + writer->writeDouble(24, dd->getSecondLine().y); + writer->writeDouble(34, dd->getSecondLine().z); + writer->writeDouble(15, dd->getVertexPoint().x); + writer->writeDouble(25, dd->getVertexPoint().y); + writer->writeDouble(35, dd->getVertexPoint().z); + break; } + case DRW::DIMORDINATE: { + DRW_DimOrdinate * dd = (DRW_DimOrdinate*)ent; + writer->writeString(100, "AcDbOrdinateDimension"); + writer->writeDouble(13, dd->getFirstLine().x); + writer->writeDouble(23, dd->getFirstLine().y); + writer->writeDouble(33, dd->getFirstLine().z); + writer->writeDouble(14, dd->getSecondLine().x); + writer->writeDouble(24, dd->getSecondLine().y); + writer->writeDouble(34, dd->getSecondLine().z); + break; } + default: + break; + } + } else { + //RLZ: todo not supported by acad 12 saved as unnamed block + } + return true; +} + +bool dxfRW::writeInsert(DRW_Insert *ent){ + writer->writeString(0, "INSERT"); + writeEntity(ent); + if (version > DRW::AC1009) { + writer->writeString(100, "AcDbBlockReference"); + writer->writeUtf8String(2, ent->name); + } else + writer->writeUtf8Caps(2, ent->name); + writer->writeDouble(10, ent->basePoint.x); + writer->writeDouble(20, ent->basePoint.y); + writer->writeDouble(30, ent->basePoint.z); + writer->writeDouble(41, ent->xscale); + writer->writeDouble(42, ent->yscale); + writer->writeDouble(43, ent->zscale); + writer->writeDouble(50, (ent->angle)*ARAD); //in dxf angle is writed in degrees + writer->writeInt16(70, ent->colcount); + writer->writeInt16(71, ent->rowcount); + writer->writeDouble(44, ent->colspace); + writer->writeDouble(45, ent->rowspace); + return true; +} + +bool dxfRW::writeText(DRW_Text *ent){ + writer->writeString(0, "TEXT"); + writeEntity(ent); + if (version > DRW::AC1009) { + writer->writeString(100, "AcDbText"); + } +// writer->writeDouble(39, ent->thickness); + writer->writeDouble(10, ent->basePoint.x); + writer->writeDouble(20, ent->basePoint.y); + writer->writeDouble(30, ent->basePoint.z); + writer->writeDouble(40, ent->height); + writer->writeUtf8String(1, ent->text); + writer->writeDouble(50, ent->angle); + writer->writeDouble(41, ent->widthscale); + writer->writeDouble(51, ent->oblique); + if (version > DRW::AC1009) + writer->writeUtf8String(7, ent->style); + else + writer->writeUtf8Caps(7, ent->style); + writer->writeInt16(71, ent->textgen); + if (ent->alignH != DRW_Text::HLeft) { + writer->writeInt16(72, ent->alignH); + } + if (ent->alignH != DRW_Text::HLeft || ent->alignV != DRW_Text::VBaseLine) { + writer->writeDouble(11, ent->secPoint.x); + writer->writeDouble(21, ent->secPoint.y); + writer->writeDouble(31, ent->secPoint.z); + } + writer->writeDouble(210, ent->extPoint.x); + writer->writeDouble(220, ent->extPoint.y); + writer->writeDouble(230, ent->extPoint.z); + if (version > DRW::AC1009) { + writer->writeString(100, "AcDbText"); + } + if (ent->alignV != DRW_Text::VBaseLine) { + writer->writeInt16(73, ent->alignV); + } + return true; +} + +bool dxfRW::writeMText(DRW_MText *ent){ + if (version > DRW::AC1009) { + writer->writeString(0, "MTEXT"); + writeEntity(ent); + writer->writeString(100, "AcDbMText"); + writer->writeDouble(10, ent->basePoint.x); + writer->writeDouble(20, ent->basePoint.y); + writer->writeDouble(30, ent->basePoint.z); + writer->writeDouble(40, ent->height); + writer->writeDouble(41, ent->widthscale); + writer->writeInt16(71, ent->textgen); + writer->writeInt16(72, ent->alignH); + std::string text = writer->fromUtf8String(ent->text); + + int i; + for(i =0; (text.size()-i) > 250; ) { + writer->writeString(3, text.substr(i, 250)); + i +=250; + } + writer->writeString(1, text.substr(i)); + writer->writeString(7, ent->style); + writer->writeDouble(210, ent->extPoint.x); + writer->writeDouble(220, ent->extPoint.y); + writer->writeDouble(230, ent->extPoint.z); + writer->writeDouble(50, ent->angle); + writer->writeInt16(73, ent->alignV); + writer->writeDouble(44, ent->interlin); +//RLZ ... 11, 21, 31 needed? + } else { + //RLZ: TODO convert mtext in text lines (not exist in acad 12) + } + return true; +} + +bool dxfRW::writeViewport(DRW_Viewport *ent) { + writer->writeString(0, "VIEWPORT"); + writeEntity(ent); + if (version > DRW::AC1009) { + writer->writeString(100, "AcDbViewport"); + } + writer->writeDouble(10, ent->basePoint.x); + writer->writeDouble(20, ent->basePoint.y); + if (ent->basePoint.z != 0.0) + writer->writeDouble(30, ent->basePoint.z); + writer->writeDouble(40, ent->pswidth); + writer->writeDouble(41, ent->psheight); + writer->writeInt16(68, ent->vpstatus); + writer->writeInt16(69, ent->vpID); + writer->writeDouble(12, ent->centerPX);//RLZ: verify if exist in V12 + writer->writeDouble(22, ent->centerPY);//RLZ: verify if exist in V12 + return true; +} + +DRW_ImageDef* dxfRW::writeImage(DRW_Image *ent, std::string name){ + if (version > DRW::AC1009) { + //search if exist imagedef with this mane (image inserted more than 1 time) + //RLZ: imagedef_reactor seem needed to read in acad + DRW_ImageDef *id = NULL; + for (unsigned int i=0; iname == name ) { + id = imageDef.at(i); + continue; + } + } + if (id == NULL) { + id = new DRW_ImageDef(); + imageDef.push_back(id); + id->handle = ++entCount; + } + id->name = name; + std::string idReactor = toHexStr(++entCount); + + writer->writeString(0, "IMAGE"); + writeEntity(ent); + writer->writeString(100, "AcDbRasterImage"); + writer->writeDouble(10, ent->basePoint.x); + writer->writeDouble(20, ent->basePoint.y); + writer->writeDouble(30, ent->basePoint.z); + writer->writeDouble(11, ent->secPoint.x); + writer->writeDouble(21, ent->secPoint.y); + writer->writeDouble(31, ent->secPoint.z); + writer->writeDouble(12, ent->vVector.x); + writer->writeDouble(22, ent->vVector.y); + writer->writeDouble(32, ent->vVector.z); + writer->writeDouble(13, ent->sizeu); + writer->writeDouble(23, ent->sizev); + writer->writeString(340, toHexStr(id->handle)); + writer->writeInt16(70, 1); + writer->writeInt16(280, ent->clip); + writer->writeInt16(281, ent->brightness); + writer->writeInt16(282, ent->contrast); + writer->writeInt16(283, ent->fade); + writer->writeString(360, idReactor); + id->reactors[idReactor] = toHexStr(ent->handle); + return id; + } + return NULL; //not exist in acad 12 +} + +bool dxfRW::writeBlockRecord(std::string name){ + if (version > DRW::AC1009) { + writer->writeString(0, "BLOCK_RECORD"); + writer->writeString(5, toHexStr(++entCount)); + + blockMap[name] = entCount; + entCount = 2+entCount;//reserve 2 for BLOCK & ENDBLOCK + if (version > DRW::AC1014) { + writer->writeString(330, "1"); + } + writer->writeString(100, "AcDbSymbolTableRecord"); + writer->writeString(100, "AcDbBlockTableRecord"); + writer->writeUtf8String(2, name); + if (version > DRW::AC1018) { + // writer->writeInt16(340, 22); + writer->writeInt16(70, 0); + writer->writeInt16(280, 1); + writer->writeInt16(281, 0); + } + } + return true; +} + +bool dxfRW::writeBlock(DRW_Block *bk){ + if (writingBlock) { + writer->writeString(0, "ENDBLK"); + if (version > DRW::AC1009) { + writer->writeString(5, toHexStr(currHandle+2)); + if (version > DRW::AC1014) { + writer->writeString(330, toHexStr(currHandle)); + } + writer->writeString(100, "AcDbEntity"); + } + writer->writeString(8, "0"); + if (version > DRW::AC1009) { + writer->writeString(100, "AcDbBlockEnd"); + } + } + writingBlock = true; + writer->writeString(0, "BLOCK"); + if (version > DRW::AC1009) { + currHandle = (*(blockMap.find(bk->name))).second; + writer->writeString(5, toHexStr(currHandle+1)); + if (version > DRW::AC1014) { + writer->writeString(330, toHexStr(currHandle)); + } + writer->writeString(100, "AcDbEntity"); + } + writer->writeString(8, "0"); + if (version > DRW::AC1009) { + writer->writeString(100, "AcDbBlockBegin"); + writer->writeUtf8String(2, bk->name); + } else + writer->writeUtf8Caps(2, bk->name); + writer->writeInt16(70, bk->flags); + writer->writeDouble(10, bk->basePoint.x); + writer->writeDouble(20, bk->basePoint.y); + if (bk->basePoint.z != 0.0) { + writer->writeDouble(30, bk->basePoint.z); + } + if (version > DRW::AC1009) + writer->writeUtf8String(3, bk->name); + else + writer->writeUtf8Caps(3, bk->name); + writer->writeString(1, ""); + + return true; +} + +bool dxfRW::writeTables() { + writer->writeString(0, "TABLE"); + writer->writeString(2, "VPORT"); + if (version > DRW::AC1009) { + writer->writeString(5, "8"); + if (version > DRW::AC1014) { + writer->writeString(330, "0"); + } + writer->writeString(100, "AcDbSymbolTable"); + } + writer->writeInt16(70, 1); //end table def +/*** VPORT ***/ + dimstyleStd =false; + iface->writeVports(); + if (!dimstyleStd) { + DRW_Vport portact; + portact.name = "*ACTIVE"; + writeVport(&portact); + } + writer->writeString(0, "ENDTAB"); +/*** LTYPE ***/ + writer->writeString(0, "TABLE"); + writer->writeString(2, "LTYPE"); + if (version > DRW::AC1009) { + writer->writeString(5, "5"); + if (version > DRW::AC1014) { + writer->writeString(330, "0"); + } + writer->writeString(100, "AcDbSymbolTable"); + } + writer->writeInt16(70, 4); //end table def +//Mandatory linetypes + writer->writeString(0, "LTYPE"); + if (version > DRW::AC1009) { + writer->writeString(5, "14"); + if (version > DRW::AC1014) { + writer->writeString(330, "5"); + } + writer->writeString(100, "AcDbSymbolTableRecord"); + writer->writeString(100, "AcDbLinetypeTableRecord"); + writer->writeString(2, "ByBlock"); + } else + writer->writeString(2, "BYBLOCK"); + writer->writeInt16(70, 0); + writer->writeString(3, ""); + writer->writeInt16(72, 65); + writer->writeInt16(73, 0); + writer->writeDouble(40, 0.0); + + writer->writeString(0, "LTYPE"); + if (version > DRW::AC1009) { + writer->writeString(5, "15"); + if (version > DRW::AC1014) { + writer->writeString(330, "5"); + } + writer->writeString(100, "AcDbSymbolTableRecord"); + writer->writeString(100, "AcDbLinetypeTableRecord"); + writer->writeString(2, "ByLayer"); + } else + writer->writeString(2, "BYLAYER"); + writer->writeInt16(70, 0); + writer->writeString(3, ""); + writer->writeInt16(72, 65); + writer->writeInt16(73, 0); + writer->writeDouble(40, 0.0); + + writer->writeString(0, "LTYPE"); + if (version > DRW::AC1009) { + writer->writeString(5, "16"); + if (version > DRW::AC1014) { + writer->writeString(330, "5"); + } + writer->writeString(100, "AcDbSymbolTableRecord"); + writer->writeString(100, "AcDbLinetypeTableRecord"); + writer->writeString(2, "Continuous"); + } else { + writer->writeString(2, "CONTINUOUS"); + } + writer->writeInt16(70, 0); + writer->writeString(3, "Solid line"); + writer->writeInt16(72, 65); + writer->writeInt16(73, 0); + writer->writeDouble(40, 0.0); +//Aplication linetypes + iface->writeLTypes(); + writer->writeString(0, "ENDTAB"); +/*** LAYER ***/ + writer->writeString(0, "TABLE"); + writer->writeString(2, "LAYER"); + if (version > DRW::AC1009) { + writer->writeString(5, "2"); + if (version > DRW::AC1014) { + writer->writeString(330, "0"); + } + writer->writeString(100, "AcDbSymbolTable"); + } + writer->writeInt16(70, 1); //end table def + wlayer0 =false; + iface->writeLayers(); + if (!wlayer0) { + DRW_Layer lay0; + lay0.name = "0"; + writeLayer(&lay0); + } + writer->writeString(0, "ENDTAB"); +/*** STYLE ***/ + writer->writeString(0, "TABLE"); + writer->writeString(2, "STYLE"); + if (version > DRW::AC1009) { + writer->writeString(5, "3"); + if (version > DRW::AC1014) { + writer->writeString(330, "0"); + } + writer->writeString(100, "AcDbSymbolTable"); + } + writer->writeInt16(70, 3); //end table def + dimstyleStd =false; + iface->writeTextstyles(); + if (!dimstyleStd) { + DRW_Textstyle tsty; + tsty.name = "Standard"; + writeTextstyle(&tsty); + } + writer->writeString(0, "ENDTAB"); + + writer->writeString(0, "TABLE"); + writer->writeString(2, "VIEW"); + if (version > DRW::AC1009) { + writer->writeString(5, "6"); + if (version > DRW::AC1014) { + writer->writeString(330, "0"); + } + writer->writeString(100, "AcDbSymbolTable"); + } + writer->writeInt16(70, 0); //end table def + writer->writeString(0, "ENDTAB"); + + writer->writeString(0, "TABLE"); + writer->writeString(2, "UCS"); + if (version > DRW::AC1009) { + writer->writeString(5, "7"); + if (version > DRW::AC1014) { + writer->writeString(330, "0"); + } + writer->writeString(100, "AcDbSymbolTable"); + } + writer->writeInt16(70, 0); //end table def + writer->writeString(0, "ENDTAB"); + + writer->writeString(0, "TABLE"); + writer->writeString(2, "APPID"); + if (version > DRW::AC1009) { + writer->writeString(5, "9"); + if (version > DRW::AC1014) { + writer->writeString(330, "0"); + } + writer->writeString(100, "AcDbSymbolTable"); + } + writer->writeInt16(70, 1); //end table def + writer->writeString(0, "APPID"); + if (version > DRW::AC1009) { + writer->writeString(5, "12"); + if (version > DRW::AC1014) { + writer->writeString(330, "9"); + } + writer->writeString(100, "AcDbSymbolTableRecord"); + writer->writeString(100, "AcDbRegAppTableRecord"); + } + writer->writeString(2, "ACAD"); + writer->writeInt16(70, 0); + iface->writeAppId(); + writer->writeString(0, "ENDTAB"); + + writer->writeString(0, "TABLE"); + writer->writeString(2, "DIMSTYLE"); + if (version > DRW::AC1009) { + writer->writeString(5, "A"); + if (version > DRW::AC1014) { + writer->writeString(330, "0"); + } + writer->writeString(100, "AcDbSymbolTable"); + } + writer->writeInt16(70, 1); //end table def + if (version > DRW::AC1014) { + writer->writeString(100, "AcDbDimStyleTable"); + writer->writeInt16(71, 1); //end table def + } + dimstyleStd =false; + iface->writeDimstyles(); + if (!dimstyleStd) { + DRW_Dimstyle dsty; + dsty.name = "Standard"; + writeDimstyle(&dsty); + } + writer->writeString(0, "ENDTAB"); + + if (version > DRW::AC1009) { + writer->writeString(0, "TABLE"); + writer->writeString(2, "BLOCK_RECORD"); + writer->writeString(5, "1"); + if (version > DRW::AC1014) { + writer->writeString(330, "0"); + } + writer->writeString(100, "AcDbSymbolTable"); + writer->writeInt16(70, 2); //end table def + writer->writeString(0, "BLOCK_RECORD"); + writer->writeString(5, "1F"); + if (version > DRW::AC1014) { + writer->writeString(330, "1"); + } + writer->writeString(100, "AcDbSymbolTableRecord"); + writer->writeString(100, "AcDbBlockTableRecord"); + writer->writeString(2, "*Model_Space"); + if (version > DRW::AC1018) { + // writer->writeInt16(340, 22); + writer->writeInt16(70, 0); + writer->writeInt16(280, 1); + writer->writeInt16(281, 0); + } + writer->writeString(0, "BLOCK_RECORD"); + writer->writeString(5, "1E"); + if (version > DRW::AC1014) { + writer->writeString(330, "1"); + } + writer->writeString(100, "AcDbSymbolTableRecord"); + writer->writeString(100, "AcDbBlockTableRecord"); + writer->writeString(2, "*Paper_Space"); + if (version > DRW::AC1018) { + // writer->writeInt16(340, 22); + writer->writeInt16(70, 0); + writer->writeInt16(280, 1); + writer->writeInt16(281, 0); + } + } + /* allways call writeBlockRecords to iface for prepare unnamed blocks */ + iface->writeBlockRecords(); + if (version > DRW::AC1009) { + writer->writeString(0, "ENDTAB"); + } +return true; +} + +bool dxfRW::writeBlocks() { + writer->writeString(0, "BLOCK"); + if (version > DRW::AC1009) { + writer->writeString(5, "20"); + if (version > DRW::AC1014) { + writer->writeString(330, "1F"); + } + writer->writeString(100, "AcDbEntity"); + } + writer->writeString(8, "0"); + if (version > DRW::AC1009) { + writer->writeString(100, "AcDbBlockBegin"); + writer->writeString(2, "*Model_Space"); + } else + writer->writeString(2, "$MODEL_SPACE"); + writer->writeInt16(70, 0); + writer->writeDouble(10, 0.0); + writer->writeDouble(20, 0.0); + writer->writeDouble(30, 0.0); + if (version > DRW::AC1009) + writer->writeString(3, "*Model_Space"); + else + writer->writeString(3, "$MODEL_SPACE"); + writer->writeString(1, ""); + writer->writeString(0, "ENDBLK"); + if (version > DRW::AC1009) { + writer->writeString(5, "21"); + if (version > DRW::AC1014) { + writer->writeString(330, "1F"); + } + writer->writeString(100, "AcDbEntity"); + } + writer->writeString(8, "0"); + if (version > DRW::AC1009) + writer->writeString(100, "AcDbBlockEnd"); + + writer->writeString(0, "BLOCK"); + if (version > DRW::AC1009) { + writer->writeString(5, "1C"); + if (version > DRW::AC1014) { + writer->writeString(330, "1B"); + } + writer->writeString(100, "AcDbEntity"); + } + writer->writeString(8, "0"); + if (version > DRW::AC1009) { + writer->writeString(100, "AcDbBlockBegin"); + writer->writeString(2, "*Paper_Space"); + } else + writer->writeString(2, "$PAPER_SPACE"); + writer->writeInt16(70, 0); + writer->writeDouble(10, 0.0); + writer->writeDouble(20, 0.0); + writer->writeDouble(30, 0.0); + if (version > DRW::AC1009) + writer->writeString(3, "*Paper_Space"); + else + writer->writeString(3, "$PAPER_SPACE"); + writer->writeString(1, ""); + writer->writeString(0, "ENDBLK"); + if (version > DRW::AC1009) { + writer->writeString(5, "1D"); + if (version > DRW::AC1014) { + writer->writeString(330, "1F"); + } + writer->writeString(100, "AcDbEntity"); + } + writer->writeString(8, "0"); + if (version > DRW::AC1009) + writer->writeString(100, "AcDbBlockEnd"); + writingBlock = false; + iface->writeBlocks(); + if (writingBlock) { + writingBlock = false; + writer->writeString(0, "ENDBLK"); + if (version > DRW::AC1009) { + writer->writeString(5, toHexStr(currHandle+2)); +// writer->writeString(5, "1D"); + if (version > DRW::AC1014) { + writer->writeString(330, toHexStr(currHandle)); + } + writer->writeString(100, "AcDbEntity"); + } + writer->writeString(8, "0"); + if (version > DRW::AC1009) + writer->writeString(100, "AcDbBlockEnd"); + } + return true; +} + +bool dxfRW::writeObjects() { + writer->writeString(0, "DICTIONARY"); + std::string imgDictH; + writer->writeString(5, "C"); + if (version > DRW::AC1014) { + writer->writeString(330, "0"); + } + writer->writeString(100, "AcDbDictionary"); + writer->writeInt16(281, 1); + writer->writeString(3, "ACAD_GROUP"); + writer->writeString(350, "D"); + if (imageDef.size() != 0) { + writer->writeString(3, "ACAD_IMAGE_DICT"); + imgDictH = toHexStr(++entCount); + writer->writeString(350, imgDictH); + } + writer->writeString(0, "DICTIONARY"); + writer->writeString(5, "D"); + writer->writeString(330, "C"); + writer->writeString(100, "AcDbDictionary"); + writer->writeInt16(281, 1); +//write IMAGEDEF_REACTOR + for (unsigned int i=0; i::iterator it; + for ( it=id->reactors.begin() ; it != id->reactors.end(); ++it ) { + writer->writeString(0, "IMAGEDEF_REACTOR"); + writer->writeString(5, (*it).first); + writer->writeString(330, (*it).second); + writer->writeString(100, "AcDbRasterImageDefReactor"); + writer->writeInt16(90, 2); //version 2=R14 to v2010 + writer->writeString(330, (*it).second); + } + } + if (imageDef.size() != 0) { + writer->writeString(0, "DICTIONARY"); + writer->writeString(5, imgDictH); + writer->writeString(330, "C"); + writer->writeString(100, "AcDbDictionary"); + writer->writeInt16(281, 1); + for (unsigned int i=0; iname.find_last_of("/\\"); + f2 =imageDef.at(i)->name.find_last_of('.'); + ++f1; + writer->writeString(3, imageDef.at(i)->name.substr(f1,f2-f1)); + writer->writeString(350, toHexStr(imageDef.at(i)->handle) ); + } + } + for (unsigned int i=0; iwriteString(0, "IMAGEDEF"); + writer->writeString(5, toHexStr(id->handle) ); + if (version > DRW::AC1014) { +// writer->writeString(330, "0"); handle to DICTIONARY + } + writer->writeString(102, "{ACAD_REACTORS"); + std::map::iterator it; + for ( it=id->reactors.begin() ; it != id->reactors.end(); ++it ) { + writer->writeString(330, (*it).first); + } + writer->writeString(102, "}"); + writer->writeString(100, "AcDbRasterImageDef"); + writer->writeInt16(90, 0); //version 0=R14 to v2010 + writer->writeUtf8String(1, id->name); + writer->writeDouble(10, id->u); + writer->writeDouble(20, id->v); + writer->writeDouble(11, id->up); + writer->writeDouble(21, id->vp); + writer->writeInt16(280, id->loaded); + writer->writeInt16(281, id->resolution); + } + //no more needed imageDef, delete it + while (!imageDef.empty()) { + imageDef.pop_back(); + } + + return true; +} + +bool dxfRW::writeExtData(const std::vector &ed){ + for (std::vector::const_iterator it=ed.begin(); it!=ed.end(); ++it){ + switch ((*it)->code) { + case 1000: + case 1001: + case 1002: + case 1003: + case 1004: + case 1005: + {int cc = (*it)->code; + if ((*it)->type == DRW_Variant::STRING) + writer->writeUtf8String(cc, *(*it)->content.s); +// writer->writeUtf8String((*it)->code, (*it)->content.s); + break;} + case 1010: + case 1011: + case 1012: + case 1013: + if ((*it)->type == DRW_Variant::COORD) { + writer->writeDouble((*it)->code, (*it)->content.v->x); + writer->writeDouble((*it)->code+10 , (*it)->content.v->y); + writer->writeDouble((*it)->code+20 , (*it)->content.v->z); + } + break; + case 1040: + case 1041: + case 1042: + if ((*it)->type == DRW_Variant::DOUBLE) + writer->writeDouble((*it)->code, (*it)->content.d); + break; + case 1070: + if ((*it)->type == DRW_Variant::INTEGER) + writer->writeInt16((*it)->code, (*it)->content.i); + break; + case 1071: + if ((*it)->type == DRW_Variant::INTEGER) + writer->writeInt32((*it)->code, (*it)->content.i); + break; + default: + break; + } + } + return true; +} + +/********* Reader Process *********/ + +bool dxfRW::processDxf() { + DRW_DBG("dxfRW::processDxf() start processing dxf\n"); + int code; + bool more = true; + std::string sectionstr; +// section = secUnknown; + while (reader->readRec(&code)) { + DRW_DBG(code); DRW_DBG(" processDxf\n"); + if (code == 999) { + header.addComment(reader->getString()); + } else if (code == 0) { + sectionstr = reader->getString(); + DRW_DBG(sectionstr); DRW_DBG(" processDxf\n"); + if (sectionstr == "EOF") { + return true; //found EOF terminate + } + if (sectionstr == "SECTION") { + more = reader->readRec(&code); + DRW_DBG(code); DRW_DBG(" processDxf\n"); + if (!more) + return false; //wrong dxf file + if (code == 2) { + sectionstr = reader->getString(); + DRW_DBG(sectionstr); DRW_DBG(" processDxf\n"); + //found section, process it + if (sectionstr == "HEADER") { + processHeader(); + } else if (sectionstr == "CLASSES") { +// processClasses(); + } else if (sectionstr == "TABLES") { + processTables(); + } else if (sectionstr == "BLOCKS") { + processBlocks(); + } else if (sectionstr == "ENTITIES") { + processEntities(false); + } else if (sectionstr == "OBJECTS") { + processObjects(); + } + } + } + } +/* if (!more) + return true;*/ + } + return true; +} + +/********* Header Section *********/ + +bool dxfRW::processHeader() { + DRW_DBG("dxfRW::processHeader\n"); + int code; + std::string sectionstr; + while (reader->readRec(&code)) { + DRW_DBG(code); DRW_DBG(" processHeader\n"); + if (code == 0) { + sectionstr = reader->getString(); + DRW_DBG(sectionstr); DRW_DBG(" processHeader\n\n"); + if (sectionstr == "ENDSEC") { + iface->addHeader(&header); + return true; //found ENDSEC terminate + } + } else header.parseCode(code, reader); + } + return true; +} + +/********* Tables Section *********/ + +bool dxfRW::processTables() { + DRW_DBG("dxfRW::processTables\n"); + int code; + std::string sectionstr; + bool more = true; + while (reader->readRec(&code)) { + DRW_DBG(code); DRW_DBG("\n"); + if (code == 0) { + sectionstr = reader->getString(); + DRW_DBG(sectionstr); DRW_DBG(" processHeader\n\n"); + if (sectionstr == "TABLE") { + more = reader->readRec(&code); + DRW_DBG(code); DRW_DBG("\n"); + if (!more) + return false; //wrong dxf file + if (code == 2) { + sectionstr = reader->getString(); + DRW_DBG(sectionstr); DRW_DBG(" processHeader\n\n"); + //found section, process it + if (sectionstr == "LTYPE") { + processLType(); + } else if (sectionstr == "LAYER") { + processLayer(); + } else if (sectionstr == "STYLE") { + processTextStyle(); + } else if (sectionstr == "VPORT") { + processVports(); + } else if (sectionstr == "VIEW") { +// processView(); + } else if (sectionstr == "UCS") { +// processUCS(); + } else if (sectionstr == "APPID") { + processAppId(); + } else if (sectionstr == "DIMSTYLE") { + processDimStyle(); + } else if (sectionstr == "BLOCK_RECORD") { +// processBlockRecord(); + } + } + } else if (sectionstr == "ENDSEC") { + return true; //found ENDSEC terminate + } + } + } + return true; +} + +bool dxfRW::processLType() { + DRW_DBG("dxfRW::processLType\n"); + int code; + std::string sectionstr; + bool reading = false; + DRW_LType ltype; + while (reader->readRec(&code)) { + DRW_DBG(code); DRW_DBG("\n"); + if (code == 0) { + if (reading) { + ltype.update(); + iface->addLType(ltype); + } + sectionstr = reader->getString(); + DRW_DBG(sectionstr); DRW_DBG("\n"); + if (sectionstr == "LTYPE") { + reading = true; + ltype.reset(); + } else if (sectionstr == "ENDTAB") { + return true; //found ENDTAB terminate + } + } else if (reading) + ltype.parseCode(code, reader); + } + return true; +} + +bool dxfRW::processLayer() { + DRW_DBG("dxfRW::processLayer\n"); + int code; + std::string sectionstr; + bool reading = false; + DRW_Layer layer; + while (reader->readRec(&code)) { + DRW_DBG(code); DRW_DBG("\n"); + if (code == 0) { + if (reading) + iface->addLayer(layer); + sectionstr = reader->getString(); + DRW_DBG(sectionstr); DRW_DBG("\n"); + if (sectionstr == "LAYER") { + reading = true; + layer.reset(); + } else if (sectionstr == "ENDTAB") { + return true; //found ENDTAB terminate + } + } else if (reading) + layer.parseCode(code, reader); + } + return true; +} + +bool dxfRW::processDimStyle() { + DRW_DBG("dxfRW::processDimStyle"); + int code; + std::string sectionstr; + bool reading = false; + DRW_Dimstyle dimSty; + while (reader->readRec(&code)) { + DRW_DBG(code); DRW_DBG("\n"); + if (code == 0) { + if (reading) + iface->addDimStyle(dimSty); + sectionstr = reader->getString(); + DRW_DBG(sectionstr); DRW_DBG("\n"); + if (sectionstr == "DIMSTYLE") { + reading = true; + dimSty.reset(); + } else if (sectionstr == "ENDTAB") { + return true; //found ENDTAB terminate + } + } else if (reading) + dimSty.parseCode(code, reader); + } + return true; +} + +bool dxfRW::processTextStyle(){ + DRW_DBG("dxfRW::processTextStyle"); + int code; + std::string sectionstr; + bool reading = false; + DRW_Textstyle TxtSty; + while (reader->readRec(&code)) { + DRW_DBG(code); DRW_DBG("\n"); + if (code == 0) { + if (reading) + iface->addTextStyle(TxtSty); + sectionstr = reader->getString(); + DRW_DBG(sectionstr); DRW_DBG("\n"); + if (sectionstr == "STYLE") { + reading = true; + TxtSty.reset(); + } else if (sectionstr == "ENDTAB") { + return true; //found ENDTAB terminate + } + } else if (reading) + TxtSty.parseCode(code, reader); + } + return true; +} + +bool dxfRW::processVports(){ + DRW_DBG("dxfRW::processVports"); + int code; + std::string sectionstr; + bool reading = false; + DRW_Vport vp; + while (reader->readRec(&code)) { + DRW_DBG(code); DRW_DBG("\n"); + if (code == 0) { + if (reading) + iface->addVport(vp); + sectionstr = reader->getString(); + DRW_DBG(sectionstr); DRW_DBG("\n"); + if (sectionstr == "VPORT") { + reading = true; + vp.reset(); + } else if (sectionstr == "ENDTAB") { + return true; //found ENDTAB terminate + } + } else if (reading) + vp.parseCode(code, reader); + } + return true; +} + +bool dxfRW::processAppId(){ + DRW_DBG("dxfRW::processAppId"); + int code; + std::string sectionstr; + bool reading = false; + DRW_AppId vp; + while (reader->readRec(&code)) { + DRW_DBG(code); DRW_DBG("\n"); + if (code == 0) { + if (reading) + iface->addAppId(vp); + sectionstr = reader->getString(); + DRW_DBG(sectionstr); DRW_DBG("\n"); + if (sectionstr == "APPID") { + reading = true; + vp.reset(); + } else if (sectionstr == "ENDTAB") { + return true; //found ENDTAB terminate + } + } else if (reading) + vp.parseCode(code, reader); + } + return true; +} + +/********* Block Section *********/ + +bool dxfRW::processBlocks() { + DRW_DBG("dxfRW::processBlocks\n"); + int code; + std::string sectionstr; + while (reader->readRec(&code)) { + DRW_DBG(code); DRW_DBG("\n"); + if (code == 0) { + sectionstr = reader->getString(); + DRW_DBG(sectionstr); DRW_DBG("\n"); + if (sectionstr == "BLOCK") { + processBlock(); + } else if (sectionstr == "ENDSEC") { + return true; //found ENDSEC terminate + } + } + } + return true; +} + +bool dxfRW::processBlock() { + DRW_DBG("dxfRW::processBlock"); + int code; + DRW_Block block; + while (reader->readRec(&code)) { + DRW_DBG(code); DRW_DBG("\n"); + switch (code) { + case 0: { + nextentity = reader->getString(); + DRW_DBG(nextentity); DRW_DBG("\n"); + iface->addBlock(block); + if (nextentity == "ENDBLK") { + iface->endBlock(); + return true; //found ENDBLK, terminate + } else { + processEntities(true); + iface->endBlock(); + return true; //found ENDBLK, terminate + } + } + default: + block.parseCode(code, reader); + break; + } + } + return true; +} + + +/********* Entities Section *********/ + +bool dxfRW::processEntities(bool isblock) { + DRW_DBG("dxfRW::processEntities\n"); + int code; + if (!reader->readRec(&code)){ + return false; + } + bool next = true; + if (code == 0) { + nextentity = reader->getString(); + } else if (!isblock) { + return false; //first record in entities is 0 + } + do { + if (nextentity == "ENDSEC" || nextentity == "ENDBLK") { + return true; //found ENDSEC or ENDBLK terminate + } else if (nextentity == "POINT") { + processPoint(); + } else if (nextentity == "LINE") { + processLine(); + } else if (nextentity == "CIRCLE") { + processCircle(); + } else if (nextentity == "ARC") { + processArc(); + } else if (nextentity == "ELLIPSE") { + processEllipse(); + } else if (nextentity == "TRACE") { + processTrace(); + } else if (nextentity == "SOLID") { + processSolid(); + } else if (nextentity == "INSERT") { + processInsert(); + } else if (nextentity == "LWPOLYLINE") { + processLWPolyline(); + } else if (nextentity == "POLYLINE") { + processPolyline(); + } else if (nextentity == "TEXT") { + processText(); + } else if (nextentity == "MTEXT") { + processMText(); + } else if (nextentity == "HATCH") { + processHatch(); + } else if (nextentity == "SPLINE") { + processSpline(); + } else if (nextentity == "3DFACE") { + process3dface(); + } else if (nextentity == "VIEWPORT") { + processViewport(); + } else if (nextentity == "IMAGE") { + processImage(); + } else if (nextentity == "DIMENSION") { + processDimension(); + } else if (nextentity == "LEADER") { + processLeader(); + } else if (nextentity == "RAY") { + processRay(); + } else if (nextentity == "XLINE") { + processXline(); + } else { + if (reader->readRec(&code)){ + if (code == 0) + nextentity = reader->getString(); + } else + return false; //end of file without ENDSEC + } + + } while (next); + return true; +} + +bool dxfRW::processEllipse() { + DRW_DBG("dxfRW::processEllipse"); + int code; + DRW_Ellipse ellipse; + while (reader->readRec(&code)) { + DRW_DBG(code); DRW_DBG("\n"); + switch (code) { + case 0: { + nextentity = reader->getString(); + DRW_DBG(nextentity); DRW_DBG("\n"); + if (applyExt) + ellipse.applyExtrusion(); + iface->addEllipse(ellipse); + return true; //found new entity or ENDSEC, terminate + } + default: + ellipse.parseCode(code, reader); + break; + } + } + return true; +} + +bool dxfRW::processTrace() { + DRW_DBG("dxfRW::processTrace"); + int code; + DRW_Trace trace; + while (reader->readRec(&code)) { + DRW_DBG(code); DRW_DBG("\n"); + switch (code) { + case 0: { + nextentity = reader->getString(); + DRW_DBG(nextentity); DRW_DBG("\n"); + if (applyExt) + trace.applyExtrusion(); + iface->addTrace(trace); + return true; //found new entity or ENDSEC, terminate + } + default: + trace.parseCode(code, reader); + break; + } + } + return true; +} + +bool dxfRW::processSolid() { + DRW_DBG("dxfRW::processSolid"); + int code; + DRW_Solid solid; + while (reader->readRec(&code)) { + DRW_DBG(code); DRW_DBG("\n"); + switch (code) { + case 0: { + nextentity = reader->getString(); + DRW_DBG(nextentity); DRW_DBG("\n"); + if (applyExt) + solid.applyExtrusion(); + iface->addSolid(solid); + return true; //found new entity or ENDSEC, terminate + } + default: + solid.parseCode(code, reader); + break; + } + } + return true; +} + +bool dxfRW::process3dface() { + DRW_DBG("dxfRW::process3dface"); + int code; + DRW_3Dface face; + while (reader->readRec(&code)) { + DRW_DBG(code); DRW_DBG("\n"); + switch (code) { + case 0: { + nextentity = reader->getString(); + DRW_DBG(nextentity); DRW_DBG("\n"); + iface->add3dFace(face); + return true; //found new entity or ENDSEC, terminate + } + default: + face.parseCode(code, reader); + break; + } + } + return true; +} + +bool dxfRW::processViewport() { + DRW_DBG("dxfRW::processViewport"); + int code; + DRW_Viewport vp; + while (reader->readRec(&code)) { + DRW_DBG(code); DRW_DBG("\n"); + switch (code) { + case 0: { + nextentity = reader->getString(); + DRW_DBG(nextentity); DRW_DBG("\n"); + iface->addViewport(vp); + return true; //found new entity or ENDSEC, terminate + } + default: + vp.parseCode(code, reader); + break; + } + } + return true; +} + +bool dxfRW::processPoint() { + DRW_DBG("dxfRW::processPoint\n"); + int code; + DRW_Point point; + while (reader->readRec(&code)) { + DRW_DBG(code); DRW_DBG("\n"); + switch (code) { + case 0: { + nextentity = reader->getString(); + DRW_DBG(nextentity); DRW_DBG("\n"); + iface->addPoint(point); + return true; //found new entity or ENDSEC, terminate + } + default: + point.parseCode(code, reader); + break; + } + } + return true; +} + +bool dxfRW::processLine() { + DRW_DBG("dxfRW::processLine\n"); + int code; + DRW_Line line; + while (reader->readRec(&code)) { + DRW_DBG(code); DRW_DBG("\n"); + switch (code) { + case 0: { + nextentity = reader->getString(); + DRW_DBG(nextentity); DRW_DBG("\n"); + iface->addLine(line); + return true; //found new entity or ENDSEC, terminate + } + default: + line.parseCode(code, reader); + break; + } + } + return true; +} + +bool dxfRW::processRay() { + DRW_DBG("dxfRW::processRay\n"); + int code; + DRW_Ray line; + while (reader->readRec(&code)) { + DRW_DBG(code); DRW_DBG("\n"); + switch (code) { + case 0: { + nextentity = reader->getString(); + DRW_DBG(nextentity); DRW_DBG("\n"); + iface->addRay(line); + return true; //found new entity or ENDSEC, terminate + } + default: + line.parseCode(code, reader); + break; + } + } + return true; +} + +bool dxfRW::processXline() { + DRW_DBG("dxfRW::processXline\n"); + int code; + DRW_Xline line; + while (reader->readRec(&code)) { + DRW_DBG(code); DRW_DBG("\n"); + switch (code) { + case 0: { + nextentity = reader->getString(); + DRW_DBG(nextentity); DRW_DBG("\n"); + iface->addXline(line); + return true; //found new entity or ENDSEC, terminate + } + default: + line.parseCode(code, reader); + break; + } + } + return true; +} + +bool dxfRW::processCircle() { + DRW_DBG("dxfRW::processPoint\n"); + int code; + DRW_Circle circle; + while (reader->readRec(&code)) { + DRW_DBG(code); DRW_DBG("\n"); + switch (code) { + case 0: { + nextentity = reader->getString(); + DRW_DBG(nextentity); DRW_DBG("\n"); + if (applyExt) + circle.applyExtrusion(); + iface->addCircle(circle); + return true; //found new entity or ENDSEC, terminate + } + default: + circle.parseCode(code, reader); + break; + } + } + return true; +} + +bool dxfRW::processArc() { + DRW_DBG("dxfRW::processPoint\n"); + int code; + DRW_Arc arc; + while (reader->readRec(&code)) { + DRW_DBG(code); DRW_DBG("\n"); + switch (code) { + case 0: { + nextentity = reader->getString(); + DRW_DBG(nextentity); DRW_DBG("\n"); + if (applyExt) + arc.applyExtrusion(); + iface->addArc(arc); + return true; //found new entity or ENDSEC, terminate + } + default: + arc.parseCode(code, reader); + break; + } + } + return true; +} + +bool dxfRW::processInsert() { + DRW_DBG("dxfRW::processInsert"); + int code; + DRW_Insert insert; + while (reader->readRec(&code)) { + DRW_DBG(code); DRW_DBG("\n"); + switch (code) { + case 0: { + nextentity = reader->getString(); + DRW_DBG(nextentity); DRW_DBG("\n"); + iface->addInsert(insert); + return true; //found new entity or ENDSEC, terminate + } + default: + insert.parseCode(code, reader); + break; + } + } + return true; +} + +bool dxfRW::processLWPolyline() { + DRW_DBG("dxfRW::processLWPolyline"); + int code; + DRW_LWPolyline pl; + while (reader->readRec(&code)) { + DRW_DBG(code); DRW_DBG("\n"); + switch (code) { + case 0: { + nextentity = reader->getString(); + DRW_DBG(nextentity); DRW_DBG("\n"); + if (applyExt) + pl.applyExtrusion(); + iface->addLWPolyline(pl); + return true; //found new entity or ENDSEC, terminate + } + default: + pl.parseCode(code, reader); + break; + } + } + return true; +} + +bool dxfRW::processPolyline() { + DRW_DBG("dxfRW::processPolyline"); + int code; + DRW_Polyline pl; + while (reader->readRec(&code)) { + DRW_DBG(code); DRW_DBG("\n"); + switch (code) { + case 0: { + nextentity = reader->getString(); + DRW_DBG(nextentity); DRW_DBG("\n"); + if (nextentity != "VERTEX") { + iface->addPolyline(pl); + return true; //found new entity or ENDSEC, terminate + } else { + processVertex(&pl); + } + } + default: + pl.parseCode(code, reader); + break; + } + } + return true; +} + +bool dxfRW::processVertex(DRW_Polyline *pl) { + DRW_DBG("dxfRW::processVertex"); + int code; + DRW_Vertex *v = new DRW_Vertex(); + while (reader->readRec(&code)) { + DRW_DBG(code); DRW_DBG("\n"); + switch (code) { + case 0: { + pl->appendVertex(v); + nextentity = reader->getString(); + DRW_DBG(nextentity); DRW_DBG("\n"); + if (nextentity == "SEQEND") { + return true; //found SEQEND no more vertex, terminate + } else if (nextentity == "VERTEX"){ + v = new DRW_Vertex(); //another vertex + } + } + default: + v->parseCode(code, reader); + break; + } + } + return true; +} + +bool dxfRW::processText() { + DRW_DBG("dxfRW::processText"); + int code; + DRW_Text txt; + while (reader->readRec(&code)) { + DRW_DBG(code); DRW_DBG("\n"); + switch (code) { + case 0: { + nextentity = reader->getString(); + DRW_DBG(nextentity); DRW_DBG("\n"); + iface->addText(txt); + return true; //found new entity or ENDSEC, terminate + } + default: + txt.parseCode(code, reader); + break; + } + } + return true; +} + +bool dxfRW::processMText() { + DRW_DBG("dxfRW::processMText"); + int code; + DRW_MText txt; + while (reader->readRec(&code)) { + DRW_DBG(code); DRW_DBG("\n"); + switch (code) { + case 0: { + nextentity = reader->getString(); + DRW_DBG(nextentity); DRW_DBG("\n"); + txt.updateAngle(); + iface->addMText(txt); + return true; //found new entity or ENDSEC, terminate + } + default: + txt.parseCode(code, reader); + break; + } + } + return true; +} + +bool dxfRW::processHatch() { + DRW_DBG("dxfRW::processHatch"); + int code; + DRW_Hatch hatch; + while (reader->readRec(&code)) { + DRW_DBG(code); DRW_DBG("\n"); + switch (code) { + case 0: { + nextentity = reader->getString(); + DRW_DBG(nextentity); DRW_DBG("\n"); + iface->addHatch(&hatch); + return true; //found new entity or ENDSEC, terminate + } + default: + hatch.parseCode(code, reader); + break; + } + } + return true; +} + + +bool dxfRW::processSpline() { + DRW_DBG("dxfRW::processSpline"); + int code; + DRW_Spline sp; + while (reader->readRec(&code)) { + DRW_DBG(code); DRW_DBG("\n"); + switch (code) { + case 0: { + nextentity = reader->getString(); + DRW_DBG(nextentity); DRW_DBG("\n"); + iface->addSpline(&sp); + return true; //found new entity or ENDSEC, terminate + } + default: + sp.parseCode(code, reader); + break; + } + } + return true; +} + + +bool dxfRW::processImage() { + DRW_DBG("dxfRW::processImage"); + int code; + DRW_Image img; + while (reader->readRec(&code)) { + DRW_DBG(code); DRW_DBG("\n"); + switch (code) { + case 0: { + nextentity = reader->getString(); + DRW_DBG(nextentity); DRW_DBG("\n"); + iface->addImage(&img); + return true; //found new entity or ENDSEC, terminate + } + default: + img.parseCode(code, reader); + break; + } + } + return true; +} + + +bool dxfRW::processDimension() { + DRW_DBG("dxfRW::processDimension"); + int code; + DRW_Dimension dim; + while (reader->readRec(&code)) { + DRW_DBG(code); DRW_DBG("\n"); + switch (code) { + case 0: { + nextentity = reader->getString(); + DRW_DBG(nextentity); DRW_DBG("\n"); + int type = dim.type & 0x0F; + switch (type) { + case 0: { + DRW_DimLinear d(dim); + iface->addDimLinear(&d); + break; } + case 1: { + DRW_DimAligned d(dim); + iface->addDimAlign(&d); + break; } + case 2: { + DRW_DimAngular d(dim); + iface->addDimAngular(&d); + break;} + case 3: { + DRW_DimDiametric d(dim); + iface->addDimDiametric(&d); + break; } + case 4: { + DRW_DimRadial d(dim); + iface->addDimRadial(&d); + break; } + case 5: { + DRW_DimAngular3p d(dim); + iface->addDimAngular3P(&d); + break; } + case 6: { + DRW_DimOrdinate d(dim); + iface->addDimOrdinate(&d); + break; } + } + return true; //found new entity or ENDSEC, terminate + } + default: + dim.parseCode(code, reader); + break; + } + } + return true; +} + +bool dxfRW::processLeader() { + DRW_DBG("dxfRW::processLeader"); + int code; + DRW_Leader leader; + while (reader->readRec(&code)) { + DRW_DBG(code); DRW_DBG("\n"); + switch (code) { + case 0: { + nextentity = reader->getString(); + DRW_DBG(nextentity); DRW_DBG("\n"); + iface->addLeader(&leader); + return true; //found new entity or ENDSEC, terminate + } + default: + leader.parseCode(code, reader); + break; + } + } + return true; +} + + +/********* Objects Section *********/ + +bool dxfRW::processObjects() { + DRW_DBG("dxfRW::processObjects\n"); + int code; + if (!reader->readRec(&code)){ + return false; + } + bool next = true; + if (code == 0) { + nextentity = reader->getString(); + } else { + return false; //first record in objects is 0 + } + do { + if (nextentity == "ENDSEC") { + return true; //found ENDSEC terminate + } else if (nextentity == "IMAGEDEF") { + processImageDef(); + } else { + if (reader->readRec(&code)){ + if (code == 0) + nextentity = reader->getString(); + } else + return false; //end of file without ENDSEC + } + + } while (next); + return true; +} + +bool dxfRW::processImageDef() { + DRW_DBG("dxfRW::processImageDef"); + int code; + DRW_ImageDef img; + while (reader->readRec(&code)) { + DRW_DBG(code); DRW_DBG("\n"); + switch (code) { + case 0: { + nextentity = reader->getString(); + DRW_DBG(nextentity); DRW_DBG("\n"); + iface->linkImage(&img); + return true; //found new entity or ENDSEC, terminate + } + default: + img.parseCode(code, reader); + break; + } + } + return true; +} + +/** utility function + * convert a int to string in hex + **/ +std::string dxfRW::toHexStr(int n){ +#if defined(__APPLE__) + char buffer[9]= {'\0'}; + snprintf(buffer,9, "%X", n); + return std::string(buffer); +#else + std::ostringstream Convert; + Convert << std::uppercase << std::hex << n; + return Convert.str(); +#endif +} diff --git a/extlib/libdxfrw/libdxfrw.h b/extlib/libdxfrw/libdxfrw.h new file mode 100644 index 0000000..b3de272 --- /dev/null +++ b/extlib/libdxfrw/libdxfrw.h @@ -0,0 +1,148 @@ +/****************************************************************************** +** libDXFrw - Library to read/write DXF files (ascii & binary) ** +** ** +** Copyright (C) 2011-2015 José F. Soriano, rallazz@gmail.com ** +** ** +** This library is free software, licensed under the terms of the GNU ** +** General Public License as published by the Free Software Foundation, ** +** either version 2 of the License, or (at your option) any later version. ** +** You should have received a copy of the GNU General Public License ** +** along with this program. If not, see . ** +******************************************************************************/ + +#ifndef LIBDXFRW_H +#define LIBDXFRW_H + +#include +#include "drw_entities.h" +#include "drw_objects.h" +#include "drw_header.h" +#include "drw_interface.h" + + +class dxfReader; +class dxfWriter; + +class dxfRW { +public: + dxfRW(); + ~dxfRW(); + void setDebug(DRW::DBG_LEVEL lvl); + /// reads the file specified in constructor + /*! + * An interface must be provided. It is used by the class to signal various + * components being added. + * @param interface_ the interface to use + * @param ext should the extrusion be applied to convert in 2D? + * @return true for success + */ + bool read(std::istream &stream, DRW_Interface *interface_, bool ext); + void setBinary(bool b) {binFile = b;} + + bool write(std::ostream &stream, DRW_Interface *interface_, DRW::Version ver, bool bin); + bool writeLineType(DRW_LType *ent); + bool writeLayer(DRW_Layer *ent); + bool writeDimstyle(DRW_Dimstyle *ent); + bool writeTextstyle(DRW_Textstyle *ent); + bool writeVport(DRW_Vport *ent); + bool writeAppId(DRW_AppId *ent); + bool writePoint(DRW_Point *ent); + bool writeLine(DRW_Line *ent); + bool writeRay(DRW_Ray *ent); + bool writeXline(DRW_Xline *ent); + bool writeCircle(DRW_Circle *ent); + bool writeArc(DRW_Arc *ent); + bool writeEllipse(DRW_Ellipse *ent); + bool writeTrace(DRW_Trace *ent); + bool writeSolid(DRW_Solid *ent); + bool write3dface(DRW_3Dface *ent); + bool writeLWPolyline(DRW_LWPolyline *ent); + bool writePolyline(DRW_Polyline *ent); + bool writeSpline(DRW_Spline *ent); + bool writeBlockRecord(std::string name); + bool writeBlock(DRW_Block *ent); + bool writeInsert(DRW_Insert *ent); + bool writeMText(DRW_MText *ent); + bool writeText(DRW_Text *ent); + bool writeHatch(DRW_Hatch *ent); + bool writeViewport(DRW_Viewport *ent); + DRW_ImageDef *writeImage(DRW_Image *ent, std::string name); + bool writeLeader(DRW_Leader *ent); + bool writeDimension(DRW_Dimension *ent); + void setEllipseParts(int parts){elParts = parts;} /*!< set parts munber when convert ellipse to polyline */ + +private: + /// used by read() to parse the content of the file + bool processDxf(); + bool processHeader(); + bool processTables(); + bool processBlocks(); + bool processBlock(); + bool processEntities(bool isblock); + bool processObjects(); + + bool processLType(); + bool processLayer(); + bool processDimStyle(); + bool processTextStyle(); + bool processVports(); + bool processAppId(); + + bool processPoint(); + bool processLine(); + bool processRay(); + bool processXline(); + bool processCircle(); + bool processArc(); + bool processEllipse(); + bool processTrace(); + bool processSolid(); + bool processInsert(); + bool processLWPolyline(); + bool processPolyline(); + bool processVertex(DRW_Polyline* pl); + bool processText(); + bool processMText(); + bool processHatch(); + bool processSpline(); + bool process3dface(); + bool processViewport(); + bool processImage(); + bool processImageDef(); + bool processDimension(); + bool processLeader(); + +// bool writeHeader(); + bool writeEntity(DRW_Entity *ent); + bool writeTables(); + bool writeBlocks(); + bool writeObjects(); + bool writeExtData(const std::vector &ed); + /*use version from dwgutil.h*/ + std::string toHexStr(int n);//RLZ removeme + +private: + DRW::Version version; + std::string fileName; + std::string codePage; + bool binFile; + dxfReader *reader; + dxfWriter *writer; + DRW_Interface *iface; + DRW_Header header; +// int section; + std::string nextentity; + int entCount; + bool wlayer0; + bool dimstyleStd; + bool applyExt; + bool writingBlock; + int elParts; /*!< parts munber when convert ellipse to polyline */ + std::map blockMap; + std::vector imageDef; /*!< imageDef list */ + + int currHandle; + +}; + +#endif // LIBDXFRW_H diff --git a/include/slvs.h b/include/slvs.h new file mode 100644 index 0000000..1c97fbf --- /dev/null +++ b/include/slvs.h @@ -0,0 +1,404 @@ +/*----------------------------------------------------------------------------- + * Data structures and prototypes for slvs.lib, a geometric constraint solver. + * + * See the comments in this file, the accompanying sample code that uses + * this library, and the accompanying documentation (DOC.txt). + * + * Copyright 2009-2013 Jonathan Westhues. + *---------------------------------------------------------------------------*/ + +#ifndef __SLVS_H +#define __SLVS_H + +#ifdef WIN32 +# ifdef EXPORT_DLL +# define DLL __declspec( dllexport ) +# else +# define DLL __declspec( dllimport ) +# endif +#else +# define DLL +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef _MSC_VER +typedef unsigned __int32 uint32_t; +#else +#include +#endif + +typedef uint32_t Slvs_hParam; +typedef uint32_t Slvs_hEntity; +typedef uint32_t Slvs_hConstraint; +typedef uint32_t Slvs_hGroup; + +/* To obtain the 3d (not projected into a workplane) of a constraint or + * an entity, specify this instead of the workplane. */ +#define SLVS_FREE_IN_3D 0 + + +typedef struct { + Slvs_hParam h; + Slvs_hGroup group; + double val; +} Slvs_Param; + + +#define SLVS_E_POINT_IN_3D 50000 +#define SLVS_E_POINT_IN_2D 50001 + +#define SLVS_E_NORMAL_IN_3D 60000 +#define SLVS_E_NORMAL_IN_2D 60001 + +#define SLVS_E_DISTANCE 70000 + +/* The special point, normal, and distance types used for parametric step + * and repeat, extrude, and assembly are currently not exposed. Please + * contact us if you are interested in using these. */ + +#define SLVS_E_WORKPLANE 80000 +#define SLVS_E_LINE_SEGMENT 80001 +#define SLVS_E_CUBIC 80002 +#define SLVS_E_CIRCLE 80003 +#define SLVS_E_ARC_OF_CIRCLE 80004 + +typedef struct { + Slvs_hEntity h; + Slvs_hGroup group; + + int type; + + Slvs_hEntity wrkpl; + Slvs_hEntity point[4]; + Slvs_hEntity normal; + Slvs_hEntity distance; + + Slvs_hParam param[4]; +} Slvs_Entity; + +#define SLVS_C_POINTS_COINCIDENT 100000 +#define SLVS_C_PT_PT_DISTANCE 100001 +#define SLVS_C_PT_PLANE_DISTANCE 100002 +#define SLVS_C_PT_LINE_DISTANCE 100003 +#define SLVS_C_PT_FACE_DISTANCE 100004 +#define SLVS_C_PT_IN_PLANE 100005 +#define SLVS_C_PT_ON_LINE 100006 +#define SLVS_C_PT_ON_FACE 100007 +#define SLVS_C_EQUAL_LENGTH_LINES 100008 +#define SLVS_C_LENGTH_RATIO 100009 +#define SLVS_C_EQ_LEN_PT_LINE_D 100010 +#define SLVS_C_EQ_PT_LN_DISTANCES 100011 +#define SLVS_C_EQUAL_ANGLE 100012 +#define SLVS_C_EQUAL_LINE_ARC_LEN 100013 +#define SLVS_C_SYMMETRIC 100014 +#define SLVS_C_SYMMETRIC_HORIZ 100015 +#define SLVS_C_SYMMETRIC_VERT 100016 +#define SLVS_C_SYMMETRIC_LINE 100017 +#define SLVS_C_AT_MIDPOINT 100018 +#define SLVS_C_HORIZONTAL 100019 +#define SLVS_C_VERTICAL 100020 +#define SLVS_C_DIAMETER 100021 +#define SLVS_C_PT_ON_CIRCLE 100022 +#define SLVS_C_SAME_ORIENTATION 100023 +#define SLVS_C_ANGLE 100024 +#define SLVS_C_PARALLEL 100025 +#define SLVS_C_PERPENDICULAR 100026 +#define SLVS_C_ARC_LINE_TANGENT 100027 +#define SLVS_C_CUBIC_LINE_TANGENT 100028 +#define SLVS_C_EQUAL_RADIUS 100029 +#define SLVS_C_PROJ_PT_DISTANCE 100030 +#define SLVS_C_WHERE_DRAGGED 100031 +#define SLVS_C_CURVE_CURVE_TANGENT 100032 +#define SLVS_C_LENGTH_DIFFERENCE 100033 + +typedef struct { + Slvs_hConstraint h; + Slvs_hGroup group; + + int type; + + Slvs_hEntity wrkpl; + + double valA; + Slvs_hEntity ptA; + Slvs_hEntity ptB; + Slvs_hEntity entityA; + Slvs_hEntity entityB; + Slvs_hEntity entityC; + Slvs_hEntity entityD; + + int other; + int other2; +} Slvs_Constraint; + + +typedef struct { + /*** INPUT VARIABLES + * + * Here, we specify the parameters and their initial values, the entities, + * and the constraints. For example, param[] points to the array of + * parameters, which has length params, so that the last valid element + * is param[params-1]. + * + * param[] is actually an in/out variable; if the solver is successful, + * then the new values (that satisfy the constraints) are written to it. */ + Slvs_Param *param; + int params; + Slvs_Entity *entity; + int entities; + Slvs_Constraint *constraint; + int constraints; + + /* If a parameter corresponds to a point (distance, normal, etc.) being + * dragged, then specify it here. This will cause the solver to favor + * that parameter, and attempt to change it as little as possible even + * if that requires it to change other parameters more. + * + * Unused members of this array should be set to zero. */ + Slvs_hParam dragged[4]; + + /* If the solver fails, then it can determine which constraints are + * causing the problem. But this is a relatively slow process (for + * a system with n constraints, about n times as long as just solving). + * If calculateFaileds is true, then the solver will do so, otherwise + * not. */ + int calculateFaileds; + + /*** OUTPUT VARIABLES + * + * If the solver fails, then it can report which constraints are causing + * the problem. The caller should allocate the array failed[], and pass + * its size in faileds. + * + * The solver will set faileds equal to the number of problematic + * constraints, and write their Slvs_hConstraints into failed[]. To + * ensure that there is sufficient space for any possible set of + * failing constraints, faileds should be greater than or equal to + * constraints. */ + Slvs_hConstraint *failed; + int faileds; + + /* The solver indicates the number of unconstrained degrees of freedom. */ + int dof; + + /* The solver indicates whether the solution succeeded. */ +#define SLVS_RESULT_OKAY 0 +#define SLVS_RESULT_INCONSISTENT 1 +#define SLVS_RESULT_DIDNT_CONVERGE 2 +#define SLVS_RESULT_TOO_MANY_UNKNOWNS 3 + int result; +} Slvs_System; + +DLL void Slvs_Solve(Slvs_System *sys, Slvs_hGroup hg); + + +/* Our base coordinate system has basis vectors + * (1, 0, 0) (0, 1, 0) (0, 0, 1) + * A unit quaternion defines a rotation to a new coordinate system with + * basis vectors + * U V N + * which these functions compute from the quaternion. */ +DLL void Slvs_QuaternionU(double qw, double qx, double qy, double qz, + double *x, double *y, double *z); +DLL void Slvs_QuaternionV(double qw, double qx, double qy, double qz, + double *x, double *y, double *z); +DLL void Slvs_QuaternionN(double qw, double qx, double qy, double qz, + double *x, double *y, double *z); + +/* Similarly, compute a unit quaternion in terms of two basis vectors. */ +DLL void Slvs_MakeQuaternion(double ux, double uy, double uz, + double vx, double vy, double vz, + double *qw, double *qx, double *qy, double *qz); + + +/*------------------------------------- + * These are just convenience functions, to save you the trouble of filling + * out the structures by hand. The code is included in the header file to + * let the compiler inline them if possible. */ + +static inline Slvs_Param Slvs_MakeParam(Slvs_hParam h, Slvs_hGroup group, double val) +{ + Slvs_Param r; + r.h = h; + r.group = group; + r.val = val; + return r; +} +static inline Slvs_Entity Slvs_MakePoint2d(Slvs_hEntity h, Slvs_hGroup group, + Slvs_hEntity wrkpl, + Slvs_hParam u, Slvs_hParam v) +{ + Slvs_Entity r; + memset(&r, 0, sizeof(r)); + r.h = h; + r.group = group; + r.type = SLVS_E_POINT_IN_2D; + r.wrkpl = wrkpl; + r.param[0] = u; + r.param[1] = v; + return r; +} +static inline Slvs_Entity Slvs_MakePoint3d(Slvs_hEntity h, Slvs_hGroup group, + Slvs_hParam x, Slvs_hParam y, Slvs_hParam z) +{ + Slvs_Entity r; + memset(&r, 0, sizeof(r)); + r.h = h; + r.group = group; + r.type = SLVS_E_POINT_IN_3D; + r.wrkpl = SLVS_FREE_IN_3D; + r.param[0] = x; + r.param[1] = y; + r.param[2] = z; + return r; +} +static inline Slvs_Entity Slvs_MakeNormal3d(Slvs_hEntity h, Slvs_hGroup group, + Slvs_hParam qw, Slvs_hParam qx, + Slvs_hParam qy, Slvs_hParam qz) +{ + Slvs_Entity r; + memset(&r, 0, sizeof(r)); + r.h = h; + r.group = group; + r.type = SLVS_E_NORMAL_IN_3D; + r.wrkpl = SLVS_FREE_IN_3D; + r.param[0] = qw; + r.param[1] = qx; + r.param[2] = qy; + r.param[3] = qz; + return r; +} +static inline Slvs_Entity Slvs_MakeNormal2d(Slvs_hEntity h, Slvs_hGroup group, + Slvs_hEntity wrkpl) +{ + Slvs_Entity r; + memset(&r, 0, sizeof(r)); + r.h = h; + r.group = group; + r.type = SLVS_E_NORMAL_IN_2D; + r.wrkpl = wrkpl; + return r; +} +static inline Slvs_Entity Slvs_MakeDistance(Slvs_hEntity h, Slvs_hGroup group, + Slvs_hEntity wrkpl, Slvs_hParam d) +{ + Slvs_Entity r; + memset(&r, 0, sizeof(r)); + r.h = h; + r.group = group; + r.type = SLVS_E_DISTANCE; + r.wrkpl = wrkpl; + r.param[0] = d; + return r; +} +static inline Slvs_Entity Slvs_MakeLineSegment(Slvs_hEntity h, Slvs_hGroup group, + Slvs_hEntity wrkpl, + Slvs_hEntity ptA, Slvs_hEntity ptB) +{ + Slvs_Entity r; + memset(&r, 0, sizeof(r)); + r.h = h; + r.group = group; + r.type = SLVS_E_LINE_SEGMENT; + r.wrkpl = wrkpl; + r.point[0] = ptA; + r.point[1] = ptB; + return r; +} +static inline Slvs_Entity Slvs_MakeCubic(Slvs_hEntity h, Slvs_hGroup group, + Slvs_hEntity wrkpl, + Slvs_hEntity pt0, Slvs_hEntity pt1, + Slvs_hEntity pt2, Slvs_hEntity pt3) +{ + Slvs_Entity r; + memset(&r, 0, sizeof(r)); + r.h = h; + r.group = group; + r.type = SLVS_E_CUBIC; + r.wrkpl = wrkpl; + r.point[0] = pt0; + r.point[1] = pt1; + r.point[2] = pt2; + r.point[3] = pt3; + return r; +} +static inline Slvs_Entity Slvs_MakeArcOfCircle(Slvs_hEntity h, Slvs_hGroup group, + Slvs_hEntity wrkpl, + Slvs_hEntity normal, + Slvs_hEntity center, + Slvs_hEntity start, Slvs_hEntity end) +{ + Slvs_Entity r; + memset(&r, 0, sizeof(r)); + r.h = h; + r.group = group; + r.type = SLVS_E_ARC_OF_CIRCLE; + r.wrkpl = wrkpl; + r.normal = normal; + r.point[0] = center; + r.point[1] = start; + r.point[2] = end; + return r; +} +static inline Slvs_Entity Slvs_MakeCircle(Slvs_hEntity h, Slvs_hGroup group, + Slvs_hEntity wrkpl, + Slvs_hEntity center, + Slvs_hEntity normal, Slvs_hEntity radius) +{ + Slvs_Entity r; + memset(&r, 0, sizeof(r)); + r.h = h; + r.group = group; + r.type = SLVS_E_CIRCLE; + r.wrkpl = wrkpl; + r.point[0] = center; + r.normal = normal; + r.distance = radius; + return r; +} +static inline Slvs_Entity Slvs_MakeWorkplane(Slvs_hEntity h, Slvs_hGroup group, + Slvs_hEntity origin, Slvs_hEntity normal) +{ + Slvs_Entity r; + memset(&r, 0, sizeof(r)); + r.h = h; + r.group = group; + r.type = SLVS_E_WORKPLANE; + r.wrkpl = SLVS_FREE_IN_3D; + r.point[0] = origin; + r.normal = normal; + return r; +} + +static inline Slvs_Constraint Slvs_MakeConstraint(Slvs_hConstraint h, + Slvs_hGroup group, + int type, + Slvs_hEntity wrkpl, + double valA, + Slvs_hEntity ptA, + Slvs_hEntity ptB, + Slvs_hEntity entityA, + Slvs_hEntity entityB) +{ + Slvs_Constraint r; + memset(&r, 0, sizeof(r)); + r.h = h; + r.group = group; + r.type = type; + r.wrkpl = wrkpl; + r.valA = valA; + r.ptA = ptA; + r.ptB = ptB; + r.entityA = entityA; + r.entityB = entityB; + return r; +} + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt new file mode 100644 index 0000000..5c53130 --- /dev/null +++ b/src/CMakeLists.txt @@ -0,0 +1,406 @@ +# global + +include(GNUInstallDirs) + +include_directories( + ${OPENGL_INCLUDE_DIR} + ${PNG_INCLUDE_DIRS} + ${FREETYPE_INCLUDE_DIRS}) + +link_directories( + ${PNG_LIBRARY_DIRS} + ${FREETYPE_LIBRARY_DIRS}) + +add_definitions( + ${PNG_CFLAGS_OTHER}) + +include_directories( + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/built + ${CMAKE_CURRENT_BINARY_DIR}) + +if(SPACEWARE_FOUND) + include_directories( + ${SPACEWARE_INCLUDE_DIR}) +endif() + +set(HAVE_SPACEWARE ${SPACEWARE_FOUND}) +set(HAVE_GTK ${GTKMM_FOUND}) +configure_file(${CMAKE_CURRENT_SOURCE_DIR}/config.h.in + ${CMAKE_CURRENT_BINARY_DIR}/config.h) + +# platform utilities + +if(WIN32) + set(util_SOURCES + win32/w32util.cpp) +else() + set(util_SOURCES + unix/unixutil.cpp) +endif() + +# libslvs + +set(libslvs_SOURCES + util.cpp + entity.cpp + expr.cpp + constraint.cpp + constrainteq.cpp + system.cpp) + +set(libslvs_HEADERS + solvespace.h) + +add_library(slvs SHARED + ${libslvs_SOURCES} + ${libslvs_HEADERS} + ${util_SOURCES} + lib.cpp) + +target_compile_definitions(slvs + PRIVATE -DLIBRARY) + +target_include_directories(slvs + PUBLIC ${CMAKE_SOURCE_DIR}/include) + +set_target_properties(slvs PROPERTIES + PUBLIC_HEADER ${CMAKE_SOURCE_DIR}/include/slvs.h + VERSION ${solvespace_VERSION_MAJOR}.${solvespace_VERSION_MINOR} + SOVERSION 1) + +if(NOT WIN32) + install(TARGETS slvs + LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} + PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}) +endif() + +# generated files + +# `$` allows us to use binfmt support on Linux +# without special-casing anything; running `tool.exe` would succeed +# but unlike Windows, Linux does not have the machinery to map +# an invocation of `tool` to an executable `tool.exe` in $PATH. + +file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/generated) + +file(GLOB icons ${CMAKE_CURRENT_SOURCE_DIR}/icons/*.png) +add_custom_command( + OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/generated/icons.cpp + ${CMAKE_CURRENT_BINARY_DIR}/generated/icons.h + COMMAND $ + ${CMAKE_CURRENT_BINARY_DIR}/generated/icons.cpp + ${CMAKE_CURRENT_BINARY_DIR}/generated/icons.h + ${icons} + DEPENDS png2c ${icons} + VERBATIM) + +file(GLOB chars ${CMAKE_CURRENT_SOURCE_DIR}/fonts/private/*.png) +list(SORT chars) +add_custom_command( + OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/generated/bitmapfont.table.h + COMMAND $ + ${CMAKE_CURRENT_BINARY_DIR}/generated/bitmapfont.table.h + ${CMAKE_CURRENT_SOURCE_DIR}/fonts/unifont-8.0.01.hex.gz + ${chars} + DEPENDS unifont2c + ${CMAKE_CURRENT_SOURCE_DIR}/fonts/unifont-8.0.01.hex.gz + ${chars} + VERBATIM) + +add_custom_command( + OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/generated/vectorfont.table.h + COMMAND $ + ${CMAKE_CURRENT_BINARY_DIR}/generated/vectorfont.table.h + ${CMAKE_CURRENT_SOURCE_DIR}/fonts/unicode.lff.gz + DEPENDS lff2c + ${CMAKE_CURRENT_SOURCE_DIR}/fonts/unicode.lff.gz + VERBATIM) + +set(generated_HEADERS + ${CMAKE_CURRENT_BINARY_DIR}/generated/vectorfont.table.h + ${CMAKE_CURRENT_BINARY_DIR}/generated/bitmapfont.table.h + ${CMAKE_CURRENT_BINARY_DIR}/generated/icons.h) + +set(generated_SOURCES + ${CMAKE_CURRENT_BINARY_DIR}/generated/icons.cpp) + +# platform dependencies + +if(WIN32) + set(platform_SOURCES + win32/w32main.cpp + win32/resource.rc) + + set(platform_LIBRARIES + comctl32) +elseif(APPLE) + add_definitions( + -fobjc-arc) + + set(platform_SOURCES + cocoa/cocoamain.mm + unix/gloffscreen.cpp) + + set(platform_XIBS + cocoa/MainMenu.xib + cocoa/SaveFormatAccessory.xib) + + set(platform_ICONS + cocoa/AppIcon.iconset) + + set(platform_RESOURCES + unix/solvespace-48x48.png) + + set(platform_BUNDLED_LIBS + ${PNG_LIBRARIES} + ${FREETYPE_LIBRARIES}) + + set(platform_LIBRARIES + ${APPKIT_LIBRARY}) +elseif(HAVE_GTK) + include_directories( + ${GTKMM_INCLUDE_DIRS} + ${JSONC_INCLUDE_DIRS} + ${FONTCONFIG_INCLUDE_DIRS} + ${GLEW_INCLUDE_DIRS}) + + link_directories( + ${GTKMM_LIBRARY_DIRS} + ${JSONC_LIBRARY_DIRS} + ${FONTCONFIG_LIBRARY_DIRS} + ${GLEW_LIBRARY_DIRS}) + + add_definitions( + ${GTKMM_CFLAGS_OTHER} + ${JSONC_CFLAGS_OTHER} + ${FONTCONFIG_CFLAGS_OTHER} + ${GLEW_CFLAGS_OTHER}) + + set(platform_SOURCES + gtk/gtkmain.cpp + unix/gloffscreen.cpp) + + set(platform_LIBRARIES + ${GTKMM_LIBRARIES} + ${JSONC_LIBRARIES} + ${FONTCONFIG_LIBRARIES} + ${GLEW_LIBRARIES}) +endif() + +set(platform_BUNDLED_RESOURCES) + +foreach(xib ${platform_XIBS}) + get_filename_component(nib ${xib} NAME_WE) + set(source ${CMAKE_CURRENT_SOURCE_DIR}/${xib}) + set(target ${CMAKE_CURRENT_BINARY_DIR}/solvespace.app/Contents/Resources/${nib}.nib) + list(APPEND platform_BUNDLED_RESOURCES ${target}) + + add_custom_command( + OUTPUT ${target} + COMMAND mkdir -p ${CMAKE_CURRENT_BINARY_DIR}/solvespace.app/Contents/Resources + COMMAND ibtool --errors --warnings --notices + --output-format human-readable-text --compile + ${target} ${source} + COMMENT "Building Interface Builder file ${xib}" + DEPENDS ${xib} + VERBATIM) +endforeach() + +foreach(icon ${platform_ICONS}) + get_filename_component(name ${icon} NAME_WE) + set(source ${CMAKE_CURRENT_SOURCE_DIR}/${icon}) + set(target ${CMAKE_CURRENT_BINARY_DIR}/solvespace.app/Contents/Resources/${name}.icns) + list(APPEND platform_BUNDLED_RESOURCES ${target}) + + add_custom_command( + OUTPUT ${target} + COMMAND mkdir -p ${CMAKE_CURRENT_BINARY_DIR}/solvespace.app/Contents/Resources + COMMAND iconutil -c icns -o ${target} ${source} + COMMENT "Building icon set ${icon}" + DEPENDS ${source} + VERBATIM) +endforeach() + +foreach(res ${platform_RESOURCES}) + get_filename_component(name ${res} NAME) + set(source ${CMAKE_CURRENT_SOURCE_DIR}/${res}) + set(target ${CMAKE_CURRENT_BINARY_DIR}/solvespace.app/Contents/Resources/${name}) + list(APPEND platform_BUNDLED_RESOURCES ${target}) + + add_custom_command( + OUTPUT ${target} + COMMAND mkdir -p ${CMAKE_CURRENT_BINARY_DIR}/solvespace.app/Contents/Resources + COMMAND ${CMAKE_COMMAND} -E copy ${source} ${target} + COMMENT "Copying resource file ${res}" + DEPENDS ${res} + VERBATIM) +endforeach() + +foreach(lib ${platform_BUNDLED_LIBS}) + get_filename_component(name ${lib} NAME) + set(target ${CMAKE_CURRENT_BINARY_DIR}/solvespace.app/Contents/MacOS/${name}) + list(APPEND platform_BUNDLED_RESOURCES ${target}) + + add_custom_command( + OUTPUT ${target} + COMMAND mkdir -p ${CMAKE_CURRENT_BINARY_DIR}/solvespace.app/Contents/Resources + COMMAND ${CMAKE_COMMAND} -E copy ${lib} ${target} + COMMENT "Bundling shared library ${lib}" + DEPENDS ${lib} + VERBATIM) +endforeach() + +# solvespace executable + +set(solvespace_HEADERS + config.h + dsc.h + expr.h + polygon.h + sketch.h + solvespace.h + ui.h + srf/surface.h) + +set(solvespace_SOURCES + bsp.cpp + clipboard.cpp + confscreen.cpp + constraint.cpp + constrainteq.cpp + describescreen.cpp + draw.cpp + drawconstraint.cpp + drawentity.cpp + entity.cpp + export.cpp + exportstep.cpp + exportvector.cpp + expr.cpp + file.cpp + generate.cpp + glhelper.cpp + graphicswin.cpp + group.cpp + groupmesh.cpp + importdxf.cpp + mesh.cpp + modify.cpp + mouse.cpp + polygon.cpp + request.cpp + solvespace.cpp + style.cpp + system.cpp + textscreens.cpp + textwin.cpp + toolbar.cpp + ttf.cpp + undoredo.cpp + util.cpp + view.cpp + srf/boolean.cpp + srf/curve.cpp + srf/merge.cpp + srf/ratpoly.cpp + srf/raycast.cpp + srf/surface.cpp + srf/surfinter.cpp + srf/triangulate.cpp) + +add_executable(solvespace WIN32 MACOSX_BUNDLE + ${libslvs_HEADERS} + ${libslvs_SOURCES} + ${util_SOURCES} + ${platform_SOURCES} + ${platform_BUNDLED_RESOURCES} + ${generated_SOURCES} + ${generated_HEADERS} + ${solvespace_HEADERS} + ${solvespace_SOURCES}) + +target_link_libraries(solvespace + dxfrw + ${OPENGL_LIBRARIES} + ${PNG_LIBRARIES} + ${ZLIB_LIBRARIES} + ${FREETYPE_LIBRARIES} + ${platform_LIBRARIES}) + +if(WIN32 AND NOT MINGW) + set_target_properties(solvespace PROPERTIES + LINK_FLAGS "/MANIFEST:NO /SAFESEH:NO") +endif() + +if(SPACEWARE_FOUND) + target_link_libraries(solvespace + ${SPACEWARE_LIBRARIES}) +endif() + +if(APPLE) + set(fixups) + foreach(lib ${platform_BUNDLED_LIBS}) + get_filename_component(name ${lib} NAME) + execute_process(COMMAND otool -D ${lib} + OUTPUT_VARIABLE canonical_lib OUTPUT_STRIP_TRAILING_WHITESPACE) + string(REGEX REPLACE "^.+:\n" "" canonical_lib ${canonical_lib}) + add_custom_command(TARGET solvespace POST_BUILD + COMMAND install_name_tool -change ${canonical_lib} @executable_path/${name} + $ + COMMENT "Fixing up rpath for dylib ${name}" + VERBATIM) + endforeach() + + set(bundle solvespace) + add_custom_command(OUTPUT ${CMAKE_BINARY_DIR}/${bundle}.dmg + COMMAND ${CMAKE_COMMAND} -E remove ${CMAKE_BINARY_DIR}/${bundle}.dmg + COMMAND hdiutil create -srcfolder ${CMAKE_CURRENT_BINARY_DIR}/${bundle}.app + ${CMAKE_BINARY_DIR}/${bundle}.dmg + DEPENDS $ + COMMENT "Building ${bundle}.dmg" + VERBATIM) + + add_custom_target(${bundle}-dmg ALL + DEPENDS ${CMAKE_BINARY_DIR}/${bundle}.dmg) +endif() + +if(NOT WIN32) + install(TARGETS solvespace + RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} + BUNDLE DESTINATION .) +endif() + +install(FILES unix/solvespace.desktop + DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/applications) +foreach(SIZE 16x16 24x24 32x32 48x48) + install(FILES unix/solvespace-${SIZE}.png + DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/icons/hicolor/${SIZE}/apps + RENAME solvespace.png) + install(FILES unix/solvespace-${SIZE}.png + DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/icons/hicolor/${SIZE}/mimetypes + RENAME application.x-solvespace.png) +endforeach() +foreach(SIZE 16x16 24x24 32x32 48x48) + install(FILES unix/solvespace-${SIZE}.xpm + DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/pixmaps/) +endforeach() + +# valgrind + +add_custom_target(solvespace-valgrind + valgrind + --tool=memcheck + --verbose + --track-fds=yes + --log-file=vg.%p.out + --num-callers=50 + --error-limit=no + --read-var-info=yes + --leak-check=full + --leak-resolution=high + --show-reachable=yes + --track-origins=yes + --malloc-fill=0xac + --free-fill=0xde + $) diff --git a/src/bsp.cpp b/src/bsp.cpp new file mode 100644 index 0000000..bba7265 --- /dev/null +++ b/src/bsp.cpp @@ -0,0 +1,682 @@ +//----------------------------------------------------------------------------- +// Binary space partitioning tree, used to represent a volume in 3-space +// bounded by a triangle mesh. These are used to compute Boolean operations +// on meshes. These aren't used for anything relating to an SShell of +// ratpoly surfaces. +// +// Copyright 2008-2013 Jonathan Westhues. +//----------------------------------------------------------------------------- +#include "solvespace.h" + +SBsp2 *SBsp2::Alloc(void) { return (SBsp2 *)AllocTemporary(sizeof(SBsp2)); } +SBsp3 *SBsp3::Alloc(void) { return (SBsp3 *)AllocTemporary(sizeof(SBsp3)); } + +SBsp3 *SBsp3::FromMesh(SMesh *m) { + SBsp3 *bsp3 = NULL; + int i; + + SMesh mc = {}; + for(i = 0; i < m->l.n; i++) { + mc.AddTriangle(&(m->l.elem[i])); + } + + srand(0); // Let's be deterministic, at least! + int n = mc.l.n; + while(n > 1) { + int k = rand() % n; + n--; + swap(mc.l.elem[k], mc.l.elem[n]); + } + + for(i = 0; i < mc.l.n; i++) { + bsp3 = InsertOrCreate(bsp3, &(mc.l.elem[i]), NULL); + } + + mc.Clear(); + return bsp3; +} + +Vector SBsp3::IntersectionWith(Vector a, Vector b) { + double da = a.Dot(n) - d; + double db = b.Dot(n) - d; + if(da*db > 0) oops(); + + double dab = (db - da); + return (a.ScaledBy(db/dab)).Plus(b.ScaledBy(-da/dab)); +} + +void SBsp3::InsertInPlane(bool pos2, STriangle *tr, SMesh *m) { + Vector tc = ((tr->a).Plus(tr->b).Plus(tr->c)).ScaledBy(1.0/3); + + bool onFace = false; + bool sameNormal = false; + double maxNormalMag = -1; + + Vector lln, trn = tr->Normal(); + + SBsp3 *ll = this; + while(ll) { + if((ll->tri).ContainsPoint(tc)) { + onFace = true; + // If the mesh contains almost-zero-area triangles, and we're + // just on the edge of one of those, then don't trust its normal. + lln = (ll->tri).Normal(); + if(lln.Magnitude() > maxNormalMag) { + sameNormal = trn.Dot(lln) > 0; + maxNormalMag = lln.Magnitude(); + } + } + ll = ll->more; + } + + if(m->flipNormal && ((!pos2 && !onFace) || + (onFace && !sameNormal && m->keepCoplanar))) + { + m->AddTriangle(tr->meta, tr->c, tr->b, tr->a); + } else if(!(m->flipNormal) && ((pos2 && !onFace) || + (onFace && sameNormal && m->keepCoplanar))) + { + m->AddTriangle(tr->meta, tr->a, tr->b, tr->c); + } else { + m->atLeastOneDiscarded = true; + } +} + +void SBsp3::InsertHow(int how, STriangle *tr, SMesh *instead) { + switch(how) { + case POS: + if(instead && !pos) goto alt; + pos = InsertOrCreate(pos, tr, instead); + break; + + case NEG: + if(instead && !neg) goto alt; + neg = InsertOrCreate(neg, tr, instead); + break; + + case COPLANAR: { + if(instead) goto alt; + SBsp3 *m = Alloc(); + m->n = n; + m->d = d; + m->tri = *tr; + m->more = more; + more = m; + break; + } + default: oops(); + } + return; + +alt: + if(how == POS && !(instead->flipNormal)) { + instead->AddTriangle(tr->meta, tr->a, tr->b, tr->c); + } else if(how == NEG && instead->flipNormal) { + instead->AddTriangle(tr->meta, tr->c, tr->b, tr->a); + } else if(how == COPLANAR) { + if(edges) { + edges->InsertTriangle(tr, instead, this); + } else { + // I suppose this actually is allowed to happen, if the coplanar + // face is the leaf, and all of its neighbors are earlier in tree? + InsertInPlane(false, tr, instead); + } + } else { + instead->atLeastOneDiscarded = true; + } +} + +void SBsp3::InsertConvexHow(int how, STriMeta meta, Vector *vertex, int n, + SMesh *instead) +{ + switch(how) { + case POS: + if(pos) { + pos = pos->InsertConvex(meta, vertex, n, instead); + return; + } + break; + + case NEG: + if(neg) { + neg = neg->InsertConvex(meta, vertex, n, instead); + return; + } + break; + + default: oops(); + } + int i; + for(i = 0; i < n - 2; i++) { + STriangle tr = STriangle::From(meta, + vertex[0], vertex[i+1], vertex[i+2]); + InsertHow(how, &tr, instead); + } +} + +SBsp3 *SBsp3::InsertConvex(STriMeta meta, Vector *vertex, int cnt, + SMesh *instead) +{ + Vector e01 = (vertex[1]).Minus(vertex[0]); + Vector e12 = (vertex[2]).Minus(vertex[1]); + Vector out = e01.Cross(e12); + +#define MAX_VERTICES 50 + if(cnt+1 >= MAX_VERTICES) goto triangulate; + + int i; + Vector on[2]; + bool isPos[MAX_VERTICES]; + bool isNeg[MAX_VERTICES]; + bool isOn[MAX_VERTICES]; + int posc, negc, onc; posc = negc = onc = 0; + for(i = 0; i < cnt; i++) { + double dt = n.Dot(vertex[i]); + isPos[i] = isNeg[i] = isOn[i] = false; + if(fabs(dt - d) < LENGTH_EPS) { + isOn[i] = true; + if(onc < 2) { + on[onc] = vertex[i]; + } + onc++; + } else if(dt > d) { + isPos[i] = true; + posc++; + } else { + isNeg[i] = true; + negc++; + } + } + if(onc != 2 && onc != 1 && onc != 0) goto triangulate; + + if(onc == 2) { + if(!instead) { + SEdge se = SEdge::From(on[0], on[1]); + edges = SBsp2::InsertOrCreateEdge(edges, &se, n, out); + } + } + + if(posc == 0) { + InsertConvexHow(NEG, meta, vertex, cnt, instead); + return this; + } + if(negc == 0) { + InsertConvexHow(POS, meta, vertex, cnt, instead); + return this; + } + + Vector vpos[MAX_VERTICES]; + Vector vneg[MAX_VERTICES]; + int npos, nneg; npos = nneg = 0; + + Vector inter[2]; + int inters; inters = 0; + + for(i = 0; i < cnt; i++) { + int ip = WRAP((i + 1), cnt); + + if(isPos[i]) { + vpos[npos++] = vertex[i]; + } + if(isNeg[i]) { + vneg[nneg++] = vertex[i]; + } + if(isOn[i]) { + vneg[nneg++] = vertex[i]; + vpos[npos++] = vertex[i]; + } + if((isPos[i] && isNeg[ip]) || (isNeg[i] && isPos[ip])) { + Vector vi = IntersectionWith(vertex[i], vertex[ip]); + vpos[npos++] = vi; + vneg[nneg++] = vi; + + if(inters >= 2) goto triangulate; // XXX shouldn't happen but does + inter[inters++] = vi; + } + } + if(npos > cnt + 1 || nneg > cnt + 1) oops(); + + if(!instead) { + if(inters == 2) { + SEdge se = SEdge::From(inter[0], inter[1]); + edges = SBsp2::InsertOrCreateEdge(edges, &se, n, out); + } else if(inters == 1 && onc == 1) { + SEdge se = SEdge::From(inter[0], on[0]); + edges = SBsp2::InsertOrCreateEdge(edges, &se, n, out); + } else if(inters == 0 && onc == 2) { + // We already handled this on-plane existing edge + } else { + goto triangulate; + } + } + if(nneg < 3 || npos < 3) goto triangulate; // XXX + + InsertConvexHow(NEG, meta, vneg, nneg, instead); + InsertConvexHow(POS, meta, vpos, npos, instead); + return this; + +triangulate: + // We don't handle the special case for this; do it as triangles + SBsp3 *r = this; + for(i = 0; i < cnt - 2; i++) { + STriangle tr = STriangle::From(meta, + vertex[0], vertex[i+1], vertex[i+2]); + r = InsertOrCreate(r, &tr, instead); + } + return r; +} + +SBsp3 *SBsp3::InsertOrCreate(SBsp3 *where, STriangle *tr, SMesh *instead) { + if(where == NULL) { + if(instead) { + if(instead->flipNormal) { + instead->atLeastOneDiscarded = true; + } else { + instead->AddTriangle(tr->meta, tr->a, tr->b, tr->c); + } + return NULL; + } + + // Brand new node; so allocate for it, and fill us in. + SBsp3 *r = Alloc(); + r->n = (tr->Normal()).WithMagnitude(1); + r->d = (tr->a).Dot(r->n); + r->tri = *tr; + return r; + } + where->Insert(tr, instead); + return where; +} + +void SBsp3::Insert(STriangle *tr, SMesh *instead) { + double dt[3] = { (tr->a).Dot(n), (tr->b).Dot(n), (tr->c).Dot(n) }; + + int inc = 0, posc = 0, negc = 0; + bool isPos[3] = {}, isNeg[3] = {}, isOn[3] = {}; + // Count vertices in the plane + for(int i = 0; i < 3; i++) { + if(fabs(dt[i] - d) < LENGTH_EPS) { + inc++; + isOn[i] = true; + } else if(dt[i] > d) { + posc++; + isPos[i] = true; + } else { + negc++; + isNeg[i] = true; + } + } + + // All vertices in-plane + if(inc == 3) { + InsertHow(COPLANAR, tr, instead); + return; + } + + // No split required + if(posc == 0 || negc == 0) { + if(inc == 2) { + Vector a, b; + if (!isOn[0]) { a = tr->b; b = tr->c; } + else if(!isOn[1]) { a = tr->c; b = tr->a; } + else if(!isOn[2]) { a = tr->a; b = tr->b; } + else oops(); + if(!instead) { + SEdge se = SEdge::From(a, b); + edges = SBsp2::InsertOrCreateEdge(edges, &se, n, tr->Normal()); + } + } + + if(posc > 0) { + InsertHow(POS, tr, instead); + } else { + InsertHow(NEG, tr, instead); + } + return; + } + + // The polygon must be split into two pieces, one above, one below. + Vector a, b, c; + + if(posc == 1 && negc == 1 && inc == 1) { + bool bpos; + // Standardize so that a is on the plane + if (isOn[0]) { a = tr->a; b = tr->b; c = tr->c; bpos = isPos[1]; + } else if(isOn[1]) { a = tr->b; b = tr->c; c = tr->a; bpos = isPos[2]; + } else if(isOn[2]) { a = tr->c; b = tr->a; c = tr->b; bpos = isPos[0]; + } else oops(); + + Vector bPc = IntersectionWith(b, c); + STriangle btri = STriangle::From(tr->meta, a, b, bPc); + STriangle ctri = STriangle::From(tr->meta, c, a, bPc); + + if(bpos) { + InsertHow(POS, &btri, instead); + InsertHow(NEG, &ctri, instead); + } else { + InsertHow(POS, &ctri, instead); + InsertHow(NEG, &btri, instead); + } + + if(!instead) { + SEdge se = SEdge::From(a, bPc); + edges = SBsp2::InsertOrCreateEdge(edges, &se, n, tr->Normal()); + } + + return; + } + + if(posc == 2 && negc == 1) { + // Standardize so that a is on one side, and b and c are on the other. + if (isNeg[0]) { a = tr->a; b = tr->b; c = tr->c; + } else if(isNeg[1]) { a = tr->b; b = tr->c; c = tr->a; + } else if(isNeg[2]) { a = tr->c; b = tr->a; c = tr->b; + } else oops(); + + } else if(posc == 1 && negc == 2) { + if (isPos[0]) { a = tr->a; b = tr->b; c = tr->c; + } else if(isPos[1]) { a = tr->b; b = tr->c; c = tr->a; + } else if(isPos[2]) { a = tr->c; b = tr->a; c = tr->b; + } else oops(); + } else oops(); + + Vector aPb = IntersectionWith(a, b); + Vector cPa = IntersectionWith(c, a); + + STriangle alone = STriangle::From(tr->meta, a, aPb, cPa); + Vector quad[4] = { aPb, b, c, cPa }; + + if(posc == 2 && negc == 1) { + InsertConvexHow(POS, tr->meta, quad, 4, instead); + InsertHow(NEG, &alone, instead); + } else { + InsertConvexHow(NEG, tr->meta, quad, 4, instead); + InsertHow(POS, &alone, instead); + } + if(!instead) { + SEdge se = SEdge::From(aPb, cPa); + edges = SBsp2::InsertOrCreateEdge(edges, &se, n, alone.Normal()); + } + + return; +} + +void SBsp3::GenerateInPaintOrder(SMesh *m) { + + // Doesn't matter which branch we take if the normal has zero z + // component, so don't need a separate case for that. + if(n.z < 0) { + if(pos) pos->GenerateInPaintOrder(m); + } else { + if(neg) neg->GenerateInPaintOrder(m); + } + + SBsp3 *flip = this; + while(flip) { + m->AddTriangle(&(flip->tri)); + flip = flip->more; + } + + if(n.z < 0) { + if(neg) neg->GenerateInPaintOrder(m); + } else { + if(pos) pos->GenerateInPaintOrder(m); + } +} + +void SBsp3::DebugDraw(void) { + + if(pos) pos->DebugDraw(); + Vector norm = tri.Normal(); + glNormal3d(norm.x, norm.y, norm.z); + + glEnable(GL_DEPTH_TEST); + glEnable(GL_LIGHTING); + glBegin(GL_TRIANGLES); + ssglVertex3v(tri.a); + ssglVertex3v(tri.b); + ssglVertex3v(tri.c); + glEnd(); + + glDisable(GL_LIGHTING); + glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); + ssglDepthRangeOffset(2); + glBegin(GL_TRIANGLES); + ssglVertex3v(tri.a); + ssglVertex3v(tri.b); + ssglVertex3v(tri.c); + glEnd(); + + glDisable(GL_LIGHTING); + glPolygonMode(GL_FRONT_AND_BACK, GL_POINT); + glPointSize(10); + ssglDepthRangeOffset(2); + glBegin(GL_TRIANGLES); + ssglVertex3v(tri.a); + ssglVertex3v(tri.b); + ssglVertex3v(tri.c); + glEnd(); + + ssglDepthRangeOffset(0); + glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); + + if(more) more->DebugDraw(); + if(neg) neg->DebugDraw(); + + if(edges) edges->DebugDraw(n, d); +} + +///////////////////////////////// + +Vector SBsp2::IntersectionWith(Vector a, Vector b) { + double da = a.Dot(no) - d; + double db = b.Dot(no) - d; + if(da*db > 0) oops(); + + double dab = (db - da); + return (a.ScaledBy(db/dab)).Plus(b.ScaledBy(-da/dab)); +} + +SBsp2 *SBsp2::InsertOrCreateEdge(SBsp2 *where, SEdge *nedge, Vector nnp, Vector out) { + if(where == NULL) { + // Brand new node; so allocate for it, and fill us in. + SBsp2 *r = Alloc(); + r->np = nnp; + r->no = ((r->np).Cross((nedge->b).Minus(nedge->a))).WithMagnitude(1); + if(out.Dot(r->no) < 0) { + r->no = (r->no).ScaledBy(-1); + } + r->d = (nedge->a).Dot(r->no); + r->edge = *nedge; + return r; + } + where->InsertEdge(nedge, nnp, out); + return where; +} + +void SBsp2::InsertEdge(SEdge *nedge, Vector nnp, Vector out) { + + double dt[2] = { (nedge->a).Dot(no), (nedge->b).Dot(no) }; + + bool isPos[2] = {}, isNeg[2] = {}, isOn[2] = {}; + for(int i = 0; i < 2; i++) { + if(fabs(dt[i] - d) < LENGTH_EPS) { + isOn[i] = true; + } else if(dt[i] > d) { + isPos[i] = true; + } else { + isNeg[i] = true; + } + } + + if((isPos[0] && isPos[1])||(isPos[0] && isOn[1])||(isOn[0] && isPos[1])) { + pos = InsertOrCreateEdge(pos, nedge, nnp, out); + return; + } + if((isNeg[0] && isNeg[1])||(isNeg[0] && isOn[1])||(isOn[0] && isNeg[1])) { + neg = InsertOrCreateEdge(neg, nedge, nnp, out); + return; + } + if(isOn[0] && isOn[1]) { + SBsp2 *m = Alloc(); + + m->np = nnp; + m->no = ((m->np).Cross((nedge->b).Minus(nedge->a))).WithMagnitude(1); + if(out.Dot(m->no) < 0) { + m->no = (m->no).ScaledBy(-1); + } + m->d = (nedge->a).Dot(m->no); + m->edge = *nedge; + + m->more = more; + more = m; + return; + } + if((isPos[0] && isNeg[1]) || (isNeg[0] && isPos[1])) { + Vector aPb = IntersectionWith(nedge->a, nedge->b); + + SEdge ea = SEdge::From(nedge->a, aPb); + SEdge eb = SEdge::From(aPb, nedge->b); + + if(isPos[0]) { + pos = InsertOrCreateEdge(pos, &ea, nnp, out); + neg = InsertOrCreateEdge(neg, &eb, nnp, out); + } else { + neg = InsertOrCreateEdge(neg, &ea, nnp, out); + pos = InsertOrCreateEdge(pos, &eb, nnp, out); + } + return; + } + oops(); +} + +void SBsp2::InsertTriangleHow(int how, STriangle *tr, SMesh *m, SBsp3 *bsp3) { + switch(how) { + case POS: + if(pos) { + pos->InsertTriangle(tr, m, bsp3); + } else { + bsp3->InsertInPlane(true, tr, m); + } + break; + + case NEG: + if(neg) { + neg->InsertTriangle(tr, m, bsp3); + } else { + bsp3->InsertInPlane(false, tr, m); + } + break; + + default: oops(); + } +} + +void SBsp2::InsertTriangle(STriangle *tr, SMesh *m, SBsp3 *bsp3) { + double dt[3] = { (tr->a).Dot(no), (tr->b).Dot(no), (tr->c).Dot(no) }; + + bool isPos[3] = {}, isNeg[3] = {}, isOn[3] = {}; + int inc = 0, posc = 0, negc = 0; + for(int i = 0; i < 3; i++) { + if(fabs(dt[i] - d) < LENGTH_EPS) { + isOn[i] = true; + inc++; + } else if(dt[i] > d) { + isPos[i] = true; + posc++; + } else { + isNeg[i] = true; + negc++; + } + } + + if(inc == 3) { + // All vertices on-line; so it's a degenerate triangle, to ignore. + return; + } + + // No split required + if(posc == 0 || negc == 0) { + if(posc > 0) { + InsertTriangleHow(POS, tr, m, bsp3); + } else { + InsertTriangleHow(NEG, tr, m, bsp3); + } + return; + } + + // The polygon must be split into two pieces, one above, one below. + Vector a, b, c; + + if(posc == 1 && negc == 1 && inc == 1) { + bool bpos; + // Standardize so that a is on the plane + if (isOn[0]) { a = tr->a; b = tr->b; c = tr->c; bpos = isPos[1]; + } else if(isOn[1]) { a = tr->b; b = tr->c; c = tr->a; bpos = isPos[2]; + } else if(isOn[2]) { a = tr->c; b = tr->a; c = tr->b; bpos = isPos[0]; + } else oops(); + + Vector bPc = IntersectionWith(b, c); + STriangle btri = STriangle::From(tr->meta, a, b, bPc); + STriangle ctri = STriangle::From(tr->meta, c, a, bPc); + + if(bpos) { + InsertTriangleHow(POS, &btri, m, bsp3); + InsertTriangleHow(NEG, &ctri, m, bsp3); + } else { + InsertTriangleHow(POS, &ctri, m, bsp3); + InsertTriangleHow(NEG, &btri, m, bsp3); + } + + return; + } + + if(posc == 2 && negc == 1) { + // Standardize so that a is on one side, and b and c are on the other. + if (isNeg[0]) { a = tr->a; b = tr->b; c = tr->c; + } else if(isNeg[1]) { a = tr->b; b = tr->c; c = tr->a; + } else if(isNeg[2]) { a = tr->c; b = tr->a; c = tr->b; + } else oops(); + + } else if(posc == 1 && negc == 2) { + if (isPos[0]) { a = tr->a; b = tr->b; c = tr->c; + } else if(isPos[1]) { a = tr->b; b = tr->c; c = tr->a; + } else if(isPos[2]) { a = tr->c; b = tr->a; c = tr->b; + } else oops(); + } else oops(); + + Vector aPb = IntersectionWith(a, b); + Vector cPa = IntersectionWith(c, a); + + STriangle alone = STriangle::From(tr->meta, a, aPb, cPa); + STriangle quad1 = STriangle::From(tr->meta, aPb, b, c ); + STriangle quad2 = STriangle::From(tr->meta, aPb, c, cPa); + + if(posc == 2 && negc == 1) { + InsertTriangleHow(POS, &quad1, m, bsp3); + InsertTriangleHow(POS, &quad2, m, bsp3); + InsertTriangleHow(NEG, &alone, m, bsp3); + } else { + InsertTriangleHow(NEG, &quad1, m, bsp3); + InsertTriangleHow(NEG, &quad2, m, bsp3); + InsertTriangleHow(POS, &alone, m, bsp3); + } + + return; +} + +void SBsp2::DebugDraw(Vector n, double d) { + if(fabs((edge.a).Dot(n) - d) > LENGTH_EPS) oops(); + if(fabs((edge.b).Dot(n) - d) > LENGTH_EPS) oops(); + + ssglLineWidth(10); + glBegin(GL_LINES); + ssglVertex3v(edge.a); + ssglVertex3v(edge.b); + glEnd(); + if(pos) pos->DebugDraw(n, d); + if(neg) neg->DebugDraw(n, d); + if(more) more->DebugDraw(n, d); + ssglLineWidth(1); +} + diff --git a/src/clipboard.cpp b/src/clipboard.cpp new file mode 100644 index 0000000..c13b4fb --- /dev/null +++ b/src/clipboard.cpp @@ -0,0 +1,444 @@ +//----------------------------------------------------------------------------- +// The clipboard that gets manipulated when the user selects Edit -> Cut, +// Copy, Paste, etc.; may contain entities only, not constraints. +// +// Copyright 2008-2013 Jonathan Westhues. +//----------------------------------------------------------------------------- +#include "solvespace.h" + +void SolveSpaceUI::Clipboard::Clear(void) { + c.Clear(); + r.Clear(); +} + +bool SolveSpaceUI::Clipboard::ContainsEntity(hEntity he) { + if(he.v == Entity::NO_ENTITY.v) + return true; + + ClipboardRequest *cr; + for(cr = r.First(); cr; cr = r.NextAfter(cr)) { + if(cr->oldEnt.v == he.v) + return true; + + for(int i = 0; i < MAX_POINTS_IN_ENTITY; i++) { + if(cr->oldPointEnt[i].v == he.v) + return true; + } + } + return false; +} + +hEntity SolveSpaceUI::Clipboard::NewEntityFor(hEntity he) { + if(he.v == Entity::NO_ENTITY.v) + return Entity::NO_ENTITY; + + ClipboardRequest *cr; + for(cr = r.First(); cr; cr = r.NextAfter(cr)) { + if(cr->oldEnt.v == he.v) + return cr->newReq.entity(0); + + for(int i = 0; i < MAX_POINTS_IN_ENTITY; i++) { + if(cr->oldPointEnt[i].v == he.v) + return cr->newReq.entity(1+i); + } + } + oops(); +} + +void GraphicsWindow::DeleteSelection(void) { + SK.request.ClearTags(); + SK.constraint.ClearTags(); + List *ls = &(selection); + for(Selection *s = ls->First(); s; s = ls->NextAfter(s)) { + hRequest r = { 0 }; + if(s->entity.v && s->entity.isFromRequest()) { + r = s->entity.request(); + } + if(r.v && !r.IsFromReferences()) { + SK.request.Tag(r, 1); + } + if(s->constraint.v) { + SK.constraint.Tag(s->constraint, 1); + } + } + + SK.constraint.RemoveTagged(); + // Note that this regenerates and clears the selection, to avoid + // lingering references to the just-deleted items. + DeleteTaggedRequests(); +} + +void GraphicsWindow::CopySelection(void) { + SS.clipboard.Clear(); + + Entity *wrkpl = SK.GetEntity(ActiveWorkplane()); + Entity *wrkpln = SK.GetEntity(wrkpl->normal); + Vector u = wrkpln->NormalU(), + v = wrkpln->NormalV(), + n = wrkpln->NormalN(), + p = SK.GetEntity(wrkpl->point[0])->PointGetNum(); + + List *ls = &(selection); + for(Selection *s = ls->First(); s; s = ls->NextAfter(s)) { + if(!s->entity.v) continue; + // Work only on entities that have requests that will generate them. + Entity *e = SK.GetEntity(s->entity); + bool hasDistance; + int req, pts; + if(!EntReqTable::GetEntityInfo(e->type, e->extraPoints, + &req, &pts, NULL, &hasDistance)) + { + continue; + } + if(req == Request::WORKPLANE) continue; + + ClipboardRequest cr = {}; + cr.type = req; + cr.extraPoints = e->extraPoints; + cr.style = e->style; + cr.str = e->str; + cr.font = e->font; + cr.construction = e->construction; + {for(int i = 0; i < pts; i++) { + Vector pt = SK.GetEntity(e->point[i])->PointGetNum(); + pt = pt.Minus(p); + pt = pt.DotInToCsys(u, v, n); + cr.point[i] = pt; + }} + if(hasDistance) { + cr.distance = SK.GetEntity(e->distance)->DistanceGetNum(); + } + + cr.oldEnt = e->h; + for(int i = 0; i < pts; i++) { + cr.oldPointEnt[i] = e->point[i]; + } + + SS.clipboard.r.Add(&cr); + } + + for(Selection *s = ls->First(); s; s = ls->NextAfter(s)) { + if(!s->constraint.v) continue; + + Constraint *c = SK.GetConstraint(s->constraint); + if(c->type == Constraint::COMMENT) { + SS.clipboard.c.Add(c); + } + } + + Constraint *c; + for(c = SK.constraint.First(); c; c = SK.constraint.NextAfter(c)) { + if(!SS.clipboard.ContainsEntity(c->ptA) || + !SS.clipboard.ContainsEntity(c->ptB) || + !SS.clipboard.ContainsEntity(c->entityA) || + !SS.clipboard.ContainsEntity(c->entityB) || + !SS.clipboard.ContainsEntity(c->entityC) || + !SS.clipboard.ContainsEntity(c->entityD) || + c->type == Constraint::COMMENT) { + continue; + } + SS.clipboard.c.Add(c); + } +} + +void GraphicsWindow::PasteClipboard(Vector trans, double theta, double scale) { + Entity *wrkpl = SK.GetEntity(ActiveWorkplane()); + Entity *wrkpln = SK.GetEntity(wrkpl->normal); + Vector u = wrkpln->NormalU(), + v = wrkpln->NormalV(), + n = wrkpln->NormalN(), + p = SK.GetEntity(wrkpl->point[0])->PointGetNum(); + + ClipboardRequest *cr; + for(cr = SS.clipboard.r.First(); cr; cr = SS.clipboard.r.NextAfter(cr)) { + hRequest hr = AddRequest(cr->type, false); + Request *r = SK.GetRequest(hr); + r->extraPoints = cr->extraPoints; + r->style = cr->style; + r->str = cr->str; + r->font = cr->font; + r->construction = cr->construction; + // Need to regen to get the right number of points, if extraPoints + // changed. + SS.GenerateAll(SolveSpaceUI::GENERATE_REGEN); + SS.MarkGroupDirty(r->group); + bool hasDistance; + int i, pts; + EntReqTable::GetRequestInfo(r->type, r->extraPoints, + NULL, &pts, NULL, &hasDistance); + for(i = 0; i < pts; i++) { + Vector pt = cr->point[i]; + // We need the reflection to occur within the workplane; it may + // otherwise correspond to just a rotation as projected. + if(scale < 0) { + pt.x *= -1; + } + // Likewise the scale, which could otherwise take us out of the + // workplane. + pt = pt.ScaledBy(fabs(scale)); + pt = pt.ScaleOutOfCsys(u, v, Vector::From(0, 0, 0)); + pt = pt.Plus(p); + pt = pt.RotatedAbout(n, theta); + pt = pt.Plus(trans); + SK.GetEntity(hr.entity(i+1))->PointForceTo(pt); + } + if(hasDistance) { + SK.GetEntity(hr.entity(64))->DistanceForceTo( + cr->distance*fabs(scale)); + } + + cr->newReq = hr; + MakeSelected(hr.entity(0)); + for(i = 0; i < pts; i++) { + MakeSelected(hr.entity(i+1)); + } + } + + Constraint *cc; + for(cc = SS.clipboard.c.First(); cc; cc = SS.clipboard.c.NextAfter(cc)) { + Constraint c = {}; + c.group = SS.GW.activeGroup; + c.workplane = SS.GW.ActiveWorkplane(); + c.type = cc->type; + c.valA = cc->valA; + c.ptA = SS.clipboard.NewEntityFor(cc->ptA); + c.ptB = SS.clipboard.NewEntityFor(cc->ptB); + c.entityA = SS.clipboard.NewEntityFor(cc->entityA); + c.entityB = SS.clipboard.NewEntityFor(cc->entityB); + c.entityC = SS.clipboard.NewEntityFor(cc->entityC); + c.entityD = SS.clipboard.NewEntityFor(cc->entityD); + c.other = cc->other; + c.other2 = cc->other2; + c.reference = cc->reference; + c.disp = cc->disp; + c.comment = cc->comment; + switch(c.type) { + case Constraint::COMMENT: + c.disp.offset = c.disp.offset.Plus(trans); + break; + + case Constraint::PT_PT_DISTANCE: + case Constraint::PT_LINE_DISTANCE: + case Constraint::PROJ_PT_DISTANCE: + case Constraint::DIAMETER: + c.valA *= fabs(scale); + break; + + default: + break; + } + + hConstraint hc = Constraint::AddConstraint(&c, /*rememberForUndo=*/false); + if(c.type == Constraint::COMMENT) { + MakeSelected(hc); + } + } + + SS.ScheduleGenerateAll(); +} + +void GraphicsWindow::MenuClipboard(int id) { + if(id != MNU_DELETE && !SS.GW.LockedInWorkplane()) { + Error("Cut, paste, and copy work only in a workplane.\n\n" + "Select one with Sketch -> In Workplane."); + return; + } + + switch(id) { + case MNU_PASTE: { + SS.UndoRemember(); + Vector trans = SS.GW.projRight.ScaledBy(80/SS.GW.scale).Plus( + SS.GW.projUp .ScaledBy(40/SS.GW.scale)); + SS.GW.ClearSelection(); + SS.GW.PasteClipboard(trans, 0, 1); + break; + } + + case MNU_PASTE_TRANSFORM: { + if(SS.clipboard.r.n == 0) { + Error("Clipboard is empty; nothing to paste."); + break; + } + + Entity *wrkpl = SK.GetEntity(SS.GW.ActiveWorkplane()); + Vector p = SK.GetEntity(wrkpl->point[0])->PointGetNum(); + SS.TW.shown.paste.times = 1; + SS.TW.shown.paste.trans = Vector::From(0, 0, 0); + SS.TW.shown.paste.theta = 0; + SS.TW.shown.paste.origin = p; + SS.TW.shown.paste.scale = 1; + SS.TW.GoToScreen(TextWindow::SCREEN_PASTE_TRANSFORMED); + SS.GW.ForceTextWindowShown(); + SS.ScheduleShowTW(); + break; + } + + case MNU_COPY: + SS.GW.CopySelection(); + SS.GW.ClearSelection(); + break; + + case MNU_CUT: + SS.UndoRemember(); + SS.GW.CopySelection(); + SS.GW.DeleteSelection(); + break; + + case MNU_DELETE: + SS.UndoRemember(); + SS.GW.DeleteSelection(); + break; + + default: oops(); + } +} + +bool TextWindow::EditControlDoneForPaste(const char *s) { + Expr *e; + switch(edit.meaning) { + case EDIT_PASTE_TIMES_REPEATED: { + e = Expr::From(s, true); + if(!e) break; + int v = (int)e->Eval(); + if(v > 0) { + shown.paste.times = v; + } else { + Error("Number of copies to paste must be at least one."); + } + break; + } + case EDIT_PASTE_ANGLE: + e = Expr::From(s, true); + if(!e) break; + shown.paste.theta = WRAP_SYMMETRIC((e->Eval())*PI/180, 2*PI); + break; + + case EDIT_PASTE_SCALE: { + e = Expr::From(s, true); + double v = e->Eval(); + if(fabs(v) > 1e-6) { + shown.paste.scale = v; + } else { + Error("Scale cannot be zero."); + } + break; + } + + default: + return false; + } + return true; +} + +void TextWindow::ScreenChangePasteTransformed(int link, uint32_t v) { + switch(link) { + case 't': + SS.TW.ShowEditControl(13, ssprintf("%d", SS.TW.shown.paste.times)); + SS.TW.edit.meaning = EDIT_PASTE_TIMES_REPEATED; + break; + + case 'r': + SS.TW.ShowEditControl(13, ssprintf("%.3f", SS.TW.shown.paste.theta*180/PI)); + SS.TW.edit.meaning = EDIT_PASTE_ANGLE; + break; + + case 's': + SS.TW.ShowEditControl(13, ssprintf("%.3f", SS.TW.shown.paste.scale)); + SS.TW.edit.meaning = EDIT_PASTE_SCALE; + break; + } +} + +void TextWindow::ScreenPasteTransformed(int link, uint32_t v) { + SS.GW.GroupSelection(); + switch(link) { + case 'o': + if(SS.GW.gs.points == 1 && SS.GW.gs.n == 1) { + Entity *e = SK.GetEntity(SS.GW.gs.point[0]); + SS.TW.shown.paste.origin = e->PointGetNum(); + } else { + Error("Select one point to define origin of rotation."); + } + SS.GW.ClearSelection(); + break; + + case 't': + if(SS.GW.gs.points == 2 && SS.GW.gs.n == 2) { + Entity *pa = SK.GetEntity(SS.GW.gs.point[0]), + *pb = SK.GetEntity(SS.GW.gs.point[1]); + SS.TW.shown.paste.trans = + (pb->PointGetNum()).Minus(pa->PointGetNum()); + } else { + Error("Select two points to define translation vector."); + } + SS.GW.ClearSelection(); + break; + + case 'g': { + if(fabs(SS.TW.shown.paste.theta) < LENGTH_EPS && + SS.TW.shown.paste.trans.Magnitude() < LENGTH_EPS && + SS.TW.shown.paste.times != 1) + { + Message("Transformation is identity. So all copies will be " + "exactly on top of each other."); + } + if(SS.TW.shown.paste.times*SS.clipboard.r.n > 100) { + Error("Too many items to paste; split this into smaller " + "pastes."); + break; + } + if(!SS.GW.LockedInWorkplane()) { + Error("No workplane active."); + break; + } + Entity *wrkpl = SK.GetEntity(SS.GW.ActiveWorkplane()); + Entity *wrkpln = SK.GetEntity(wrkpl->normal); + Vector wn = wrkpln->NormalN(); + SS.UndoRemember(); + SS.GW.ClearSelection(); + for(int i = 0; i < SS.TW.shown.paste.times; i++) { + Vector trans = SS.TW.shown.paste.trans.ScaledBy(i+1), + origin = SS.TW.shown.paste.origin; + double theta = SS.TW.shown.paste.theta*(i+1); + // desired transformation is Q*(p - o) + o + t = + // Q*p - Q*o + o + t = Q*p + (t + o - Q*o) + Vector t = trans.Plus( + origin).Minus( + origin.RotatedAbout(wn, theta)); + + SS.GW.PasteClipboard(t, theta, SS.TW.shown.paste.scale); + } + SS.TW.GoToScreen(SCREEN_LIST_OF_GROUPS); + SS.ScheduleShowTW(); + break; + } + } +} + +void TextWindow::ShowPasteTransformed(void) { + Printf(true, "%FtPASTE TRANSFORMED%E"); + Printf(true, "%Ba %Ftrepeat%E %d time%s %Fl%Lt%f[change]%E", + shown.paste.times, (shown.paste.times == 1) ? "" : "s", + &ScreenChangePasteTransformed); + Printf(false, "%Bd %Ftrotate%E %@ degrees %Fl%Lr%f[change]%E", + shown.paste.theta*180/PI, + &ScreenChangePasteTransformed); + Printf(false, "%Ba %Ftabout pt%E (%s, %s, %s) %Fl%Lo%f[use selected]%E", + SS.MmToString(shown.paste.origin.x).c_str(), + SS.MmToString(shown.paste.origin.y).c_str(), + SS.MmToString(shown.paste.origin.z).c_str(), + &ScreenPasteTransformed); + Printf(false, "%Bd %Fttranslate%E (%s, %s, %s) %Fl%Lt%f[use selected]%E", + SS.MmToString(shown.paste.trans.x).c_str(), + SS.MmToString(shown.paste.trans.y).c_str(), + SS.MmToString(shown.paste.trans.z).c_str(), + &ScreenPasteTransformed); + Printf(false, "%Ba %Ftscale%E %@ %Fl%Ls%f[change]%E", + shown.paste.scale, + &ScreenChangePasteTransformed); + + Printf(true, " %Fl%Lg%fpaste transformed now%E", &ScreenPasteTransformed); + + Printf(true, "(or %Fl%Ll%fcancel operation%E)", &ScreenHome); +} + diff --git a/src/cocoa/AppIcon.iconset/icon_128x128.png b/src/cocoa/AppIcon.iconset/icon_128x128.png new file mode 100644 index 0000000..363e891 Binary files /dev/null and b/src/cocoa/AppIcon.iconset/icon_128x128.png differ diff --git a/src/cocoa/AppIcon.iconset/icon_128x128@2x.png b/src/cocoa/AppIcon.iconset/icon_128x128@2x.png new file mode 100644 index 0000000..81f40c8 Binary files /dev/null and b/src/cocoa/AppIcon.iconset/icon_128x128@2x.png differ diff --git a/src/cocoa/AppIcon.iconset/icon_16x16.png b/src/cocoa/AppIcon.iconset/icon_16x16.png new file mode 100644 index 0000000..50242e9 Binary files /dev/null and b/src/cocoa/AppIcon.iconset/icon_16x16.png differ diff --git a/src/cocoa/AppIcon.iconset/icon_16x16@2x.png b/src/cocoa/AppIcon.iconset/icon_16x16@2x.png new file mode 100644 index 0000000..d9f276a Binary files /dev/null and b/src/cocoa/AppIcon.iconset/icon_16x16@2x.png differ diff --git a/src/cocoa/AppIcon.iconset/icon_256x256.png b/src/cocoa/AppIcon.iconset/icon_256x256.png new file mode 100644 index 0000000..2030bf4 Binary files /dev/null and b/src/cocoa/AppIcon.iconset/icon_256x256.png differ diff --git a/src/cocoa/AppIcon.iconset/icon_256x256@2x.png b/src/cocoa/AppIcon.iconset/icon_256x256@2x.png new file mode 100644 index 0000000..a380eb7 Binary files /dev/null and b/src/cocoa/AppIcon.iconset/icon_256x256@2x.png differ diff --git a/src/cocoa/AppIcon.iconset/icon_32x32.png b/src/cocoa/AppIcon.iconset/icon_32x32.png new file mode 100644 index 0000000..60bf2c5 Binary files /dev/null and b/src/cocoa/AppIcon.iconset/icon_32x32.png differ diff --git a/src/cocoa/AppIcon.iconset/icon_32x32@2x.png b/src/cocoa/AppIcon.iconset/icon_32x32@2x.png new file mode 100644 index 0000000..359b341 Binary files /dev/null and b/src/cocoa/AppIcon.iconset/icon_32x32@2x.png differ diff --git a/src/cocoa/AppIcon.iconset/icon_512x512.png b/src/cocoa/AppIcon.iconset/icon_512x512.png new file mode 100644 index 0000000..6dcc757 Binary files /dev/null and b/src/cocoa/AppIcon.iconset/icon_512x512.png differ diff --git a/src/cocoa/AppIcon.iconset/icon_512x512@2x.png b/src/cocoa/AppIcon.iconset/icon_512x512@2x.png new file mode 100644 index 0000000..d451520 Binary files /dev/null and b/src/cocoa/AppIcon.iconset/icon_512x512@2x.png differ diff --git a/src/cocoa/MainMenu.xib b/src/cocoa/MainMenu.xib new file mode 100644 index 0000000..b1951c4 --- /dev/null +++ b/src/cocoa/MainMenu.xib @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/cocoa/SaveFormatAccessory.xib b/src/cocoa/SaveFormatAccessory.xib new file mode 100644 index 0000000..3962b6a --- /dev/null +++ b/src/cocoa/SaveFormatAccessory.xib @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/cocoa/cocoamain.mm b/src/cocoa/cocoamain.mm new file mode 100644 index 0000000..1b6d3e6 --- /dev/null +++ b/src/cocoa/cocoamain.mm @@ -0,0 +1,1351 @@ +//----------------------------------------------------------------------------- +// Our main() function, and Cocoa-specific stuff to set up our windows and +// otherwise handle our interface to the operating system. Everything +// outside gtk/... should be standard C++ and OpenGL. +// +// Copyright 2015 +//----------------------------------------------------------------------------- +#include +#include + +#import + +#include +#include + +#include "solvespace.h" +#include "../unix/gloffscreen.h" +#include + +using SolveSpace::dbp; + +#define GL_CHECK() \ + do { \ + int err = (int)glGetError(); \ + if(err) dbp("%s:%d: glGetError() == 0x%X", __FILE__, __LINE__, err); \ + } while (0) + +/* Settings */ + +namespace SolveSpace { +void CnfFreezeInt(uint32_t val, const std::string &key) { + [[NSUserDefaults standardUserDefaults] + setInteger:val forKey:[NSString stringWithUTF8String:key.c_str()]]; +} + +uint32_t CnfThawInt(uint32_t val, const std::string &key) { + NSString *nsKey = [NSString stringWithUTF8String:key.c_str()]; + if([[NSUserDefaults standardUserDefaults] objectForKey:nsKey]) + return [[NSUserDefaults standardUserDefaults] integerForKey:nsKey]; + return val; +} + +void CnfFreezeFloat(float val, const std::string &key) { + [[NSUserDefaults standardUserDefaults] + setFloat:val forKey:[NSString stringWithUTF8String:key.c_str()]]; +} + +float CnfThawFloat(float val, const std::string &key) { + NSString *nsKey = [NSString stringWithUTF8String:key.c_str()]; + if([[NSUserDefaults standardUserDefaults] objectForKey:nsKey]) + return [[NSUserDefaults standardUserDefaults] floatForKey:nsKey]; + return val; +} + +void CnfFreezeString(const std::string &val, const std::string &key) { + [[NSUserDefaults standardUserDefaults] + setObject:[NSString stringWithUTF8String:val.c_str()] + forKey:[NSString stringWithUTF8String:key.c_str()]]; +} + +std::string CnfThawString(const std::string &val, const std::string &key) { + NSString *nsKey = [NSString stringWithUTF8String:key.c_str()]; + if([[NSUserDefaults standardUserDefaults] objectForKey:nsKey]) { + NSString *nsNewVal = [[NSUserDefaults standardUserDefaults] stringForKey:nsKey]; + return [nsNewVal UTF8String]; + } + return val; +} +}; + +/* Timer */ + +int64_t SolveSpace::GetMilliseconds(void) { + clock_serv_t cclock; + mach_timespec_t mts; + + host_get_clock_service(mach_host_self(), SYSTEM_CLOCK, &cclock); + clock_get_time(cclock, &mts); + mach_port_deallocate(mach_task_self(), cclock); + + return mts.tv_sec * 1000 + mts.tv_nsec / 1000000; +} + +@interface DeferredHandler : NSObject ++ (void) runLater:(id)dummy; ++ (void) runCallback; ++ (void) doAutosave; +@end + +@implementation DeferredHandler ++ (void) runLater:(id)dummy { + SolveSpace::SS.DoLater(); +} ++ (void) runCallback { + SolveSpace::SS.GW.TimerCallback(); + SolveSpace::SS.TW.TimerCallback(); +} ++ (void) doAutosave { + SolveSpace::SS.Autosave(); +} +@end + +static void Schedule(SEL selector, double interval) { + NSMethodSignature *signature = [[DeferredHandler class] + methodSignatureForSelector:selector]; + NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:signature]; + [invocation setSelector:selector]; + [invocation setTarget:[DeferredHandler class]]; + [NSTimer scheduledTimerWithTimeInterval:interval + invocation:invocation repeats:NO]; +} + +void SolveSpace::SetTimerFor(int milliseconds) { + Schedule(@selector(runCallback), milliseconds / 1000.0); +} + +void SolveSpace::SetAutosaveTimerFor(int minutes) { + Schedule(@selector(doAutosave), minutes * 60.0); +} + +void SolveSpace::ScheduleLater() { + [[NSRunLoop currentRunLoop] + performSelector:@selector(runLater:) + target:[DeferredHandler class] argument:nil + order:0 modes:@[NSDefaultRunLoopMode]]; +} + +/* OpenGL view */ + +@interface GLViewWithEditor : NSView +- (void)drawGL; + +@property BOOL wantsBackingStoreScaling; + +@property(readonly, getter=isEditing) BOOL editing; +- (void)startEditing:(NSString*)text at:(NSPoint)origin withHeight:(double)fontHeight + usingMonospace:(BOOL)isMonospace; +- (void)stopEditing; +- (void)didEdit:(NSString*)text; +@end + +@implementation GLViewWithEditor +{ + GLOffscreen *offscreen; + NSOpenGLContext *glContext; +@protected + NSTextField *editor; +} + +- initWithFrame:(NSRect)frameRect { + self = [super initWithFrame:frameRect]; + [self setWantsLayer:YES]; + + NSOpenGLPixelFormatAttribute attrs[] = { + NSOpenGLPFAColorSize, 24, + NSOpenGLPFADepthSize, 24, + 0 + }; + NSOpenGLPixelFormat *pixelFormat = [[NSOpenGLPixelFormat alloc] initWithAttributes:attrs]; + glContext = [[NSOpenGLContext alloc] initWithFormat:pixelFormat shareContext:NULL]; + + editor = [[NSTextField alloc] init]; + [editor setEditable:YES]; + [[editor cell] setWraps:NO]; + [[editor cell] setScrollable:YES]; + [editor setBezeled:NO]; + [editor setTarget:self]; + [editor setAction:@selector(editorAction:)]; + + return self; +} + +- (void)dealloc { + delete offscreen; +} + +#define CONVERT1(name, to_from) \ + - (NS##name)convert##name##to_from##Backing:(NS##name)input { \ + return _wantsBackingStoreScaling ? [super convert##name##to_from##Backing:input] : input; } +#define CONVERT(name) CONVERT1(name, To) CONVERT1(name, From) +CONVERT(Size) +CONVERT(Rect) +#undef CONVERT +#undef CONVERT1 + +- (NSPoint)convertPointToBacking:(NSPoint)input { + if(_wantsBackingStoreScaling) return [super convertPointToBacking:input]; + else { + input.y *= -1; + return input; + } +} + +- (NSPoint)convertPointFromBacking:(NSPoint)input { + if(_wantsBackingStoreScaling) return [super convertPointFromBacking:input]; + else { + input.y *= -1; + return input; + } +} + +- (void)drawRect:(NSRect)aRect { + [glContext makeCurrentContext]; + + if(!offscreen) + offscreen = new GLOffscreen; + + NSSize size = [self convertSizeToBacking:[self bounds].size]; + offscreen->begin(size.width, size.height); + + [self drawGL]; + GL_CHECK(); + + uint8_t *pixels = offscreen->end(![self isFlipped]); + CGDataProviderRef provider = CGDataProviderCreateWithData( + NULL, pixels, size.width * size.height * 4, NULL); + CGColorSpaceRef colorspace = CGColorSpaceCreateDeviceRGB(); + CGImageRef image = CGImageCreate(size.width, size.height, 8, 32, + size.width * 4, colorspace, kCGBitmapByteOrder32Little | kCGImageAlphaNoneSkipFirst, + provider, NULL, true, kCGRenderingIntentDefault); + + CGContextDrawImage((CGContextRef) [[NSGraphicsContext currentContext] graphicsPort], + [self bounds], image); + + CGImageRelease(image); + CGDataProviderRelease(provider); +} + +- (void)drawGL { +} + +@synthesize editing; + +- (void)startEditing:(NSString*)text at:(NSPoint)origin withHeight:(double)fontHeight + usingMonospace:(BOOL)isMonospace { + if(!self->editing) { + [self addSubview:editor]; + self->editing = YES; + } + + NSFont *font; + if(isMonospace) + font = [NSFont fontWithName:@"Monaco" size:fontHeight]; + else + font = [NSFont controlContentFontOfSize:fontHeight]; + [editor setFont:font]; + + origin.x -= 3; /* left padding; no way to get it from NSTextField */ + origin.y -= [editor intrinsicContentSize].height; + origin.y += [editor baselineOffsetFromBottom]; + + [editor setFrameOrigin:origin]; + [editor setStringValue:text]; + [[self window] makeFirstResponder:editor]; +} + +- (void)stopEditing { + if(self->editing) { + [editor removeFromSuperview]; + self->editing = NO; + } +} + +- (void)editorAction:(id)sender { + [self didEdit:[editor stringValue]]; + [self stopEditing]; +} + +- (void)didEdit:(NSString*)text { +} +@end + +/* Graphics window */ + +@interface GraphicsWindowView : GLViewWithEditor +{ + NSTrackingArea *trackingArea; +} + +@property(readonly) NSEvent *lastContextMenuEvent; +@end + +@implementation GraphicsWindowView +- (BOOL)isFlipped { + return YES; +} + +- (void)drawGL { + SolveSpace::SS.GW.Paint(); +} + +- (BOOL)acceptsFirstResponder { + return YES; +} + +- (void) createTrackingArea { + trackingArea = [[NSTrackingArea alloc] initWithRect:[self bounds] + options:(NSTrackingMouseEnteredAndExited | NSTrackingMouseMoved | + NSTrackingActiveInKeyWindow) + owner:self userInfo:nil]; + [self addTrackingArea:trackingArea]; +} + +- (void) updateTrackingAreas +{ + [self removeTrackingArea:trackingArea]; + [self createTrackingArea]; + [super updateTrackingAreas]; +} + +- (void)mouseMoved:(NSEvent*)event { + NSPoint point = [self ij_to_xy:[self convertPoint:[event locationInWindow] fromView:nil]]; + NSUInteger flags = [event modifierFlags]; + NSUInteger buttons = [NSEvent pressedMouseButtons]; + SolveSpace::SS.GW.MouseMoved(point.x, point.y, + buttons & (1 << 0), + buttons & (1 << 2), + buttons & (1 << 1), + flags & NSShiftKeyMask, + flags & NSCommandKeyMask); +} + +- (void)mouseDragged:(NSEvent*)event { + [self mouseMoved:event]; +} + +- (void)rightMouseDragged:(NSEvent*)event { + [self mouseMoved:event]; +} + +- (void)otherMouseDragged:(NSEvent*)event { + [self mouseMoved:event]; +} + +- (void)mouseDown:(NSEvent*)event { + NSPoint point = [self ij_to_xy:[self convertPoint:[event locationInWindow] fromView:nil]]; + if([event clickCount] == 1) + SolveSpace::SS.GW.MouseLeftDown(point.x, point.y); + else if([event clickCount] == 2) + SolveSpace::SS.GW.MouseLeftDoubleClick(point.x, point.y); +} + +- (void)rightMouseDown:(NSEvent*)event { + NSPoint point = [self ij_to_xy:[self convertPoint:[event locationInWindow] fromView:nil]]; + SolveSpace::SS.GW.MouseMiddleOrRightDown(point.x, point.y); +} + +- (void)otherMouseDown:(NSEvent*)event { + [self rightMouseDown:event]; +} + +- (void)mouseUp:(NSEvent*)event { + NSPoint point = [self ij_to_xy:[self convertPoint:[event locationInWindow] fromView:nil]]; + SolveSpace::SS.GW.MouseLeftUp(point.x, point.y); +} + +- (void)rightMouseUp:(NSEvent*)event { + NSPoint point = [self ij_to_xy:[self convertPoint:[event locationInWindow] fromView:nil]]; + self->_lastContextMenuEvent = event; + SolveSpace::SS.GW.MouseRightUp(point.x, point.y); +} + +- (void)scrollWheel:(NSEvent*)event { + NSPoint point = [self ij_to_xy:[self convertPoint:[event locationInWindow] fromView:nil]]; + SolveSpace::SS.GW.MouseScroll(point.x, point.y, -[event deltaY]); +} + +- (void)mouseExited:(NSEvent*)event { + SolveSpace::SS.GW.MouseLeave(); +} + +- (void)keyDown:(NSEvent*)event { + int chr = 0; + if(NSString *nsChr = [event charactersIgnoringModifiers]) + chr = [nsChr characterAtIndex:0]; + + if(chr >= NSF1FunctionKey && chr <= NSF12FunctionKey) + chr = SolveSpace::GraphicsWindow::FUNCTION_KEY_BASE + (chr - NSF1FunctionKey); + + NSUInteger flags = [event modifierFlags]; + if(flags & NSShiftKeyMask) + chr |= SolveSpace::GraphicsWindow::SHIFT_MASK; + if(flags & NSCommandKeyMask) + chr |= SolveSpace::GraphicsWindow::CTRL_MASK; + + // override builtin behavior: "focus on next cell", "close window" + if(chr == '\t' || chr == '\x1b') + [[NSApp mainMenu] performKeyEquivalent:event]; + else if(!chr || !SolveSpace::SS.GW.KeyDown(chr)) + [super keyDown:event]; +} + +- (void)startEditing:(NSString*)text at:(NSPoint)xy withHeight:(double)fontHeight + withMinWidthInChars:(int)minWidthChars { + // Convert to ij (vs. xy) style coordinates + NSSize size = [self convertSizeToBacking:[self bounds].size]; + NSPoint point = { + .x = xy.x + size.width / 2, + .y = xy.y - size.height / 2 + }; + [[self window] makeKeyWindow]; + [super startEditing:text at:[self convertPointFromBacking:point] + withHeight:fontHeight usingMonospace:FALSE]; + [self prepareEditorWithMinWidthInChars:minWidthChars]; +} + +- (void)prepareEditorWithMinWidthInChars:(int)minWidthChars { + NSFont *font = [editor font]; + NSGlyph glyphA = [font glyphWithName:@"a"]; + if(glyphA == -1) oops(); + CGFloat glyphAWidth = [font advancementForGlyph:glyphA].width; + + [editor sizeToFit]; + + NSSize frameSize = [editor frame].size; + frameSize.width = std::max(frameSize.width, glyphAWidth * minWidthChars); + [editor setFrameSize:frameSize]; +} + +- (void)didEdit:(NSString*)text { + SolveSpace::SS.GW.EditControlDone([text UTF8String]); + [self setNeedsDisplay:YES]; +} + +- (void)cancelOperation:(id)sender { + [self stopEditing]; +} + +- (NSPoint)ij_to_xy:(NSPoint)ij { + // Convert to xy (vs. ij) style coordinates, + // with (0, 0) at center + NSSize size = [self bounds].size; + return [self convertPointToBacking:(NSPoint){ + .x = ij.x - size.width / 2, .y = ij.y - size.height / 2 }]; +} +@end + +@interface GraphicsWindowDelegate : NSObject +- (BOOL)windowShouldClose:(id)sender; + +@property(readonly, getter=isFullscreen) BOOL fullscreen; +- (void)windowDidEnterFullScreen:(NSNotification *)notification; +- (void)windowDidExitFullScreen:(NSNotification *)notification; +@end + +@implementation GraphicsWindowDelegate +- (BOOL)windowShouldClose:(id)sender { + [NSApp terminate:sender]; + return FALSE; /* in case NSApp changes its mind */ +} + +@synthesize fullscreen; +- (void)windowDidEnterFullScreen:(NSNotification *)notification { + fullscreen = true; + /* Update the menus */ + SolveSpace::SS.GW.EnsureValidActives(); +} +- (void)windowDidExitFullScreen:(NSNotification *)notification { + fullscreen = false; + /* Update the menus */ + SolveSpace::SS.GW.EnsureValidActives(); +} +@end + +static NSWindow *GW; +static GraphicsWindowView *GWView; +static GraphicsWindowDelegate *GWDelegate; + +namespace SolveSpace { +void InitGraphicsWindow() { + GW = [[NSWindow alloc] init]; + GWDelegate = [[GraphicsWindowDelegate alloc] init]; + [GW setDelegate:GWDelegate]; + [GW setStyleMask:(NSTitledWindowMask | NSClosableWindowMask | + NSMiniaturizableWindowMask | NSResizableWindowMask)]; + [GW setFrameAutosaveName:@"GraphicsWindow"]; + [GW setCollectionBehavior:NSWindowCollectionBehaviorFullScreenPrimary]; + if(![GW setFrameUsingName:[GW frameAutosaveName]]) + [GW setContentSize:(NSSize){ .width = 600, .height = 600 }]; + GWView = [[GraphicsWindowView alloc] init]; + [GW setContentView:GWView]; +} + +void GetGraphicsWindowSize(int *w, int *h) { + NSSize size = [GWView convertSizeToBacking:[GWView frame].size]; + *w = size.width; + *h = size.height; +} + +void InvalidateGraphics(void) { + [GWView setNeedsDisplay:YES]; +} + +void PaintGraphics(void) { + [GWView setNeedsDisplay:YES]; + CFRunLoopRunInMode(kCFRunLoopDefaultMode, 0, YES); +} + +void SetCurrentFilename(const std::string &filename) { + if(!filename.empty()) { + [GW setTitleWithRepresentedFilename:[NSString stringWithUTF8String:filename.c_str()]]; + } else { + [GW setTitle:@"(new sketch)"]; + [GW setRepresentedFilename:@""]; + } +} + +void ToggleFullScreen(void) { + [GW toggleFullScreen:nil]; +} + +bool FullScreenIsActive(void) { + return [GWDelegate isFullscreen]; +} + +void ShowGraphicsEditControl(int x, int y, int fontHeight, int minWidthChars, + const std::string &str) { + [GWView startEditing:[NSString stringWithUTF8String:str.c_str()] + at:(NSPoint){(CGFloat)x, (CGFloat)y} + withHeight:fontHeight + withMinWidthInChars:minWidthChars]; +} + +void HideGraphicsEditControl(void) { + [GWView stopEditing]; +} + +bool GraphicsEditControlIsVisible(void) { + return [GWView isEditing]; +} +} + +/* Context menus */ + +static int contextMenuChoice; + +@interface ContextMenuResponder : NSObject ++ (void)handleClick:(id)sender; +@end + +@implementation ContextMenuResponder ++ (void)handleClick:(id)sender { + contextMenuChoice = [sender tag]; +} +@end + +namespace SolveSpace { +NSMenu *contextMenu, *contextSubmenu; + +void AddContextMenuItem(const char *label, int id_) { + NSMenuItem *menuItem; + if(label) { + menuItem = [[NSMenuItem alloc] initWithTitle:[NSString stringWithUTF8String:label] + action:@selector(handleClick:) keyEquivalent:@""]; + [menuItem setTarget:[ContextMenuResponder class]]; + [menuItem setTag:id_]; + } else { + menuItem = [NSMenuItem separatorItem]; + } + + if(id_ == CONTEXT_SUBMENU) { + [menuItem setSubmenu:contextSubmenu]; + contextSubmenu = nil; + } + + if(contextSubmenu) { + [contextSubmenu addItem:menuItem]; + } else { + if(!contextMenu) { + contextMenu = [[NSMenu alloc] + initWithTitle:[NSString stringWithUTF8String:label]]; + } + + [contextMenu addItem:menuItem]; + } +} + +void CreateContextSubmenu(void) { + if(contextSubmenu) oops(); + + contextSubmenu = [[NSMenu alloc] initWithTitle:@""]; +} + +int ShowContextMenu(void) { + if(!contextMenu) + return -1; + + [NSMenu popUpContextMenu:contextMenu + withEvent:[GWView lastContextMenuEvent] forView:GWView]; + + contextMenu = nil; + + return contextMenuChoice; +} +}; + +/* Main menu */ + +@interface MainMenuResponder : NSObject ++ (void)handleStatic:(id)sender; ++ (void)handleRecent:(id)sender; +@end + +@implementation MainMenuResponder ++ (void)handleStatic:(id)sender { + SolveSpace::GraphicsWindow::MenuEntry *entry = + (SolveSpace::GraphicsWindow::MenuEntry*)[sender tag]; + + if(entry->fn && ![(NSMenuItem*)sender hasSubmenu]) + entry->fn(entry->id); +} + ++ (void)handleRecent:(id)sender { + int id_ = [sender tag]; + if(id_ >= RECENT_OPEN && id_ < (RECENT_OPEN + MAX_RECENT)) + SolveSpace::SolveSpaceUI::MenuFile(id_); + else if(id_ >= RECENT_LINK && id_ < (RECENT_LINK + MAX_RECENT)) + SolveSpace::Group::MenuGroup(id_); +} +@end + +namespace SolveSpace { +std::map mainMenuItems; + +void InitMainMenu(NSMenu *mainMenu) { + NSMenuItem *menuItem = NULL; + NSMenu *levels[5] = {mainMenu, 0}; + NSString *label; + + const GraphicsWindow::MenuEntry *entry = &GraphicsWindow::menu[0]; + int current_level = 0; + while(entry->level >= 0) { + if(entry->level > current_level) { + NSMenu *menu = [[NSMenu alloc] initWithTitle:label]; + [menu setAutoenablesItems:NO]; + [menuItem setSubmenu:menu]; + + if(entry->level >= sizeof(levels) / sizeof(levels[0])) + oops(); + + levels[entry->level] = menu; + } + + current_level = entry->level; + + if(entry->label) { + /* OS X does not support mnemonics */ + label = [[NSString stringWithUTF8String:entry->label] + stringByReplacingOccurrencesOfString:@"&" withString:@""]; + + unichar accelChar = entry->accel & + ~(GraphicsWindow::SHIFT_MASK | GraphicsWindow::CTRL_MASK); + if(accelChar > GraphicsWindow::FUNCTION_KEY_BASE && + accelChar <= GraphicsWindow::FUNCTION_KEY_BASE + 12) { + accelChar = NSF1FunctionKey + (accelChar - GraphicsWindow::FUNCTION_KEY_BASE - 1); + } else if(accelChar == GraphicsWindow::DELETE_KEY) { + accelChar = NSBackspaceCharacter; + } + NSString *accel = [NSString stringWithCharacters:&accelChar length:1]; + + menuItem = [levels[entry->level] addItemWithTitle:label + action:NULL keyEquivalent:[accel lowercaseString]]; + + NSUInteger modifierMask = 0; + if(entry->accel & GraphicsWindow::SHIFT_MASK) + modifierMask |= NSShiftKeyMask; + else if(entry->accel & GraphicsWindow::CTRL_MASK) + modifierMask |= NSCommandKeyMask; + [menuItem setKeyEquivalentModifierMask:modifierMask]; + + [menuItem setTag:(NSInteger)entry]; + [menuItem setTarget:[MainMenuResponder class]]; + [menuItem setAction:@selector(handleStatic:)]; + } else { + [levels[entry->level] addItem:[NSMenuItem separatorItem]]; + } + + mainMenuItems[entry->id] = menuItem; + + ++entry; + } +} + +void EnableMenuById(int id_, bool enabled) { + [mainMenuItems[id_] setEnabled:enabled]; +} + +void CheckMenuById(int id_, bool checked) { + [mainMenuItems[id_] setState:(checked ? NSOnState : NSOffState)]; +} + +void RadioMenuById(int id_, bool selected) { + CheckMenuById(id_, selected); +} + +static void RefreshRecentMenu(int id_, int base) { + NSMenuItem *recent = mainMenuItems[id_]; + NSMenu *menu = [[NSMenu alloc] initWithTitle:@""]; + [recent setSubmenu:menu]; + + if(std::string(RecentFile[0]).empty()) { + NSMenuItem *placeholder = [[NSMenuItem alloc] + initWithTitle:@"(no recent files)" action:nil keyEquivalent:@""]; + [placeholder setEnabled:NO]; + [menu addItem:placeholder]; + } else { + for(int i = 0; i < MAX_RECENT; i++) { + if(std::string(RecentFile[i]).empty()) + break; + + NSMenuItem *item = [[NSMenuItem alloc] + initWithTitle:[[NSString stringWithUTF8String:RecentFile[i].c_str()] + stringByAbbreviatingWithTildeInPath] + action:nil keyEquivalent:@""]; + [item setTag:(base + i)]; + [item setAction:@selector(handleRecent:)]; + [item setTarget:[MainMenuResponder class]]; + [menu addItem:item]; + } + } +} + +void RefreshRecentMenus(void) { + RefreshRecentMenu(GraphicsWindow::MNU_OPEN_RECENT, RECENT_OPEN); + RefreshRecentMenu(GraphicsWindow::MNU_GROUP_RECENT, RECENT_LINK); +} + +void ToggleMenuBar(void) { + [NSMenu setMenuBarVisible:![NSMenu menuBarVisible]]; +} + +bool MenuBarIsVisible(void) { + return [NSMenu menuBarVisible]; +} +} + +/* Save/load */ + +bool SolveSpace::GetOpenFile(std::string *file, const std::string &defExtension, + const FileFilter ssFilters[]) { + NSOpenPanel *panel = [NSOpenPanel openPanel]; + NSMutableArray *filters = [[NSMutableArray alloc] init]; + for(const FileFilter *ssFilter = ssFilters; ssFilter->name; ssFilter++) { + for(const char *const *ssPattern = ssFilter->patterns; *ssPattern; ssPattern++) { + [filters addObject:[NSString stringWithUTF8String:*ssPattern]]; + } + } + [filters removeObjectIdenticalTo:@"*"]; + [panel setAllowedFileTypes:filters]; + + if([panel runModal] == NSFileHandlingPanelOKButton) { + *file = [[NSFileManager defaultManager] + fileSystemRepresentationWithPath:[[panel URL] path]]; + return true; + } else { + return false; + } +} + +@interface SaveFormatController : NSViewController +@property NSSavePanel *panel; +@property NSArray *extensions; +@property (nonatomic) IBOutlet NSPopUpButton *button; +@property (nonatomic) NSInteger index; +@end + +@implementation SaveFormatController +@synthesize panel, extensions, button, index; +- (void)setIndex:(NSInteger)newIndex { + self->index = newIndex; + NSString *extension = [extensions objectAtIndex:newIndex]; + if(![extension isEqual:@"*"]) { + NSString *filename = [panel nameFieldStringValue]; + NSString *basename = [[filename componentsSeparatedByString:@"."] objectAtIndex:0]; + [panel setNameFieldStringValue:[basename stringByAppendingPathExtension:extension]]; + } +} +@end + +bool SolveSpace::GetSaveFile(std::string *file, const std::string &defExtension, + const FileFilter ssFilters[]) { + NSSavePanel *panel = [NSSavePanel savePanel]; + + SaveFormatController *controller = + [[SaveFormatController alloc] initWithNibName:@"SaveFormatAccessory" bundle:nil]; + [controller setPanel:panel]; + [panel setAccessoryView:[controller view]]; + + NSMutableArray *extensions = [[NSMutableArray alloc] init]; + [controller setExtensions:extensions]; + + NSPopUpButton *button = [controller button]; + [button removeAllItems]; + for(const FileFilter *ssFilter = ssFilters; ssFilter->name; ssFilter++) { + std::string desc; + for(const char *const *ssPattern = ssFilter->patterns; *ssPattern; ssPattern++) { + if(desc == "") { + desc = *ssPattern; + } else { + desc += ", "; + desc += *ssPattern; + } + } + std::string title = std::string(ssFilter->name) + " (" + desc + ")"; + [button addItemWithTitle:[NSString stringWithUTF8String:title.c_str()]]; + [extensions addObject:[NSString stringWithUTF8String:ssFilter->patterns[0]]]; + } + + int extensionIndex = 0; + if(defExtension != "") { + extensionIndex = [extensions indexOfObject: + [NSString stringWithUTF8String:defExtension.c_str()]]; + if(extensionIndex == -1) { + extensionIndex = 0; + } + } + + [button selectItemAtIndex:extensionIndex]; + [panel setNameFieldStringValue:[@"untitled" + stringByAppendingPathExtension:[extensions objectAtIndex:extensionIndex]]]; + + if([panel runModal] == NSFileHandlingPanelOKButton) { + *file = [[NSFileManager defaultManager] + fileSystemRepresentationWithPath:[[panel URL] path]]; + return true; + } else { + return false; + } +} + +SolveSpace::DialogChoice SolveSpace::SaveFileYesNoCancel(void) { + NSAlert *alert = [[NSAlert alloc] init]; + if(!std::string(SolveSpace::SS.saveFile).empty()) { + [alert setMessageText: + [[@"Do you want to save the changes you made to the sketch “" + stringByAppendingString: + [[NSString stringWithUTF8String:SolveSpace::SS.saveFile.c_str()] + stringByAbbreviatingWithTildeInPath]] + stringByAppendingString:@"”?"]]; + } else { + [alert setMessageText:@"Do you want to save the changes you made to the new sketch?"]; + } + [alert setInformativeText:@"Your changes will be lost if you don't save them."]; + [alert addButtonWithTitle:@"Save"]; + [alert addButtonWithTitle:@"Cancel"]; + [alert addButtonWithTitle:@"Don't Save"]; + switch([alert runModal]) { + case NSAlertFirstButtonReturn: + return DIALOG_YES; + case NSAlertSecondButtonReturn: + default: + return DIALOG_CANCEL; + case NSAlertThirdButtonReturn: + return DIALOG_NO; + } +} + +SolveSpace::DialogChoice SolveSpace::LoadAutosaveYesNo(void) { + NSAlert *alert = [[NSAlert alloc] init]; + [alert setMessageText: + @"An autosave file is availible for this project."]; + [alert setInformativeText: + @"Do you want to load the autosave file instead?"]; + [alert addButtonWithTitle:@"Load"]; + [alert addButtonWithTitle:@"Don't Load"]; + switch([alert runModal]) { + case NSAlertFirstButtonReturn: + return DIALOG_YES; + case NSAlertSecondButtonReturn: + default: + return DIALOG_NO; + } +} + +SolveSpace::DialogChoice SolveSpace::LocateImportedFileYesNoCancel( + const std::string &filename, bool canCancel) { + NSAlert *alert = [[NSAlert alloc] init]; + [alert setMessageText:[NSString stringWithUTF8String: + ("The linked file " + filename + " is not present.").c_str()]]; + [alert setInformativeText: + @"Do you want to locate it manually?\n" + "If you select \"No\", any geometry that depends on " + "the missing file will be removed."]; + [alert addButtonWithTitle:@"Yes"]; + if(canCancel) + [alert addButtonWithTitle:@"Cancel"]; + [alert addButtonWithTitle:@"No"]; + switch([alert runModal]) { + case NSAlertFirstButtonReturn: + return DIALOG_YES; + case NSAlertSecondButtonReturn: + default: + if(canCancel) + return DIALOG_CANCEL; + /* fallthrough */ + case NSAlertThirdButtonReturn: + return DIALOG_NO; + } +} + +/* Text window */ + +@interface TextWindowView : GLViewWithEditor +{ + NSTrackingArea *trackingArea; +} + +@property (nonatomic, getter=isCursorHand) BOOL cursorHand; +@end + +@implementation TextWindowView +- (BOOL)isFlipped { + return YES; +} + +- (void)drawGL { + SolveSpace::SS.TW.Paint(); +} + +- (BOOL)acceptsFirstMouse:(NSEvent*)event { + return YES; +} + +- (void) createTrackingArea { + trackingArea = [[NSTrackingArea alloc] initWithRect:[self bounds] + options:(NSTrackingMouseEnteredAndExited | NSTrackingMouseMoved | + NSTrackingActiveAlways) + owner:self userInfo:nil]; + [self addTrackingArea:trackingArea]; +} + +- (void) updateTrackingAreas +{ + [self removeTrackingArea:trackingArea]; + [self createTrackingArea]; + [super updateTrackingAreas]; +} + +- (void)mouseMoved:(NSEvent*)event { + NSPoint point = [self convertPointToBacking: + [self convertPoint:[event locationInWindow] fromView:nil]]; + SolveSpace::SS.TW.MouseEvent(/*leftClick*/ false, /*leftDown*/ false, + point.x, -point.y); +} + +- (void)mouseDown:(NSEvent*)event { + NSPoint point = [self convertPointToBacking: + [self convertPoint:[event locationInWindow] fromView:nil]]; + SolveSpace::SS.TW.MouseEvent(/*leftClick*/ true, /*leftDown*/ true, + point.x, -point.y); +} + +- (void)mouseDragged:(NSEvent*)event { + NSPoint point = [self convertPointToBacking: + [self convertPoint:[event locationInWindow] fromView:nil]]; + SolveSpace::SS.TW.MouseEvent(/*leftClick*/ false, /*leftDown*/ true, + point.x, -point.y); +} + +- (void)setCursorHand:(BOOL)cursorHand { + if(_cursorHand != cursorHand) { + if(cursorHand) + [[NSCursor pointingHandCursor] push]; + else + [NSCursor pop]; + } + _cursorHand = cursorHand; +} + +- (void)mouseExited:(NSEvent*)event { + [self setCursorHand:FALSE]; + SolveSpace::SS.TW.MouseLeave(); +} + +- (void)startEditing:(NSString*)text at:(NSPoint)point { + point = [self convertPointFromBacking:point]; + point.y = -point.y + 2; + [[self window] makeKeyWindow]; + [super startEditing:text at:point withHeight:15.0 usingMonospace:TRUE]; + [editor setFrameSize:(NSSize){ + .width = [self bounds].size.width - [editor frame].origin.x, + .height = [editor intrinsicContentSize].height }]; +} + +- (void)stopEditing { + [super stopEditing]; + [GW makeKeyWindow]; +} + +- (void)didEdit:(NSString*)text { + SolveSpace::SS.TW.EditControlDone([text UTF8String]); +} + +- (void)cancelOperation:(id)sender { + [self stopEditing]; +} +@end + +@interface TextWindowDelegate : NSObject +- (BOOL)windowShouldClose:(id)sender; +- (void)windowDidResize:(NSNotification *)notification; +@end + +@implementation TextWindowDelegate +- (BOOL)windowShouldClose:(id)sender { + SolveSpace::GraphicsWindow::MenuView(SolveSpace::GraphicsWindow::MNU_SHOW_TEXT_WND); + return NO; +} + +- (void)windowDidResize:(NSNotification *)notification { + NSClipView *view = [[[notification object] contentView] contentView]; + NSView *document = [view documentView]; + NSSize size = [document frame].size; + size.width = [view frame].size.width; + [document setFrameSize:size]; +} +@end + +static NSPanel *TW; +static TextWindowView *TWView; +static TextWindowDelegate *TWDelegate; + +namespace SolveSpace { +void InitTextWindow() { + TW = [[NSPanel alloc] init]; + TWDelegate = [[TextWindowDelegate alloc] init]; + [TW setStyleMask:(NSTitledWindowMask | NSClosableWindowMask | NSResizableWindowMask | + NSUtilityWindowMask)]; + [[TW standardWindowButton:NSWindowMiniaturizeButton] setHidden:YES]; + [[TW standardWindowButton:NSWindowZoomButton] setHidden:YES]; + [TW setTitle:@"Property Browser"]; + [TW setFrameAutosaveName:@"TextWindow"]; + [TW setFloatingPanel:YES]; + [TW setBecomesKeyOnlyIfNeeded:YES]; + + NSScrollView *scrollView = [[NSScrollView alloc] init]; + [TW setContentView:scrollView]; + [scrollView setBackgroundColor:[NSColor blackColor]]; + [scrollView setHasVerticalScroller:YES]; + [scrollView setScrollerKnobStyle:NSScrollerKnobStyleLight]; + [[scrollView contentView] setCopiesOnScroll:YES]; + + TWView = [[TextWindowView alloc] init]; + [scrollView setDocumentView:TWView]; + + [TW setDelegate:TWDelegate]; + if(![TW setFrameUsingName:[TW frameAutosaveName]]) + [TW setContentSize:(NSSize){ .width = 420, .height = 300 }]; + [TWView setFrame:[[scrollView contentView] frame]]; +} + +void ShowTextWindow(bool visible) { + if(visible) + [TW orderFront:nil]; + else + [TW close]; +} + +void GetTextWindowSize(int *w, int *h) { + NSSize size = [TWView convertSizeToBacking:[TWView frame].size]; + *w = size.width; + *h = size.height; +} + +void InvalidateText(void) { + NSSize size = [TWView convertSizeToBacking:[TWView frame].size]; + size.height = (SS.TW.top[SS.TW.rows - 1] + 1) * TextWindow::LINE_HEIGHT / 2; + [TWView setFrameSize:[TWView convertSizeFromBacking:size]]; + [TWView setNeedsDisplay:YES]; +} + +void MoveTextScrollbarTo(int pos, int maxPos, int page) { + /* unused; we draw the entire text window and scroll in Cocoa */ +} + +void SetMousePointerToHand(bool is_hand) { + [TWView setCursorHand:is_hand]; +} + +void ShowTextEditControl(int x, int y, const std::string &str) { + return [TWView startEditing:[NSString stringWithUTF8String:str.c_str()] + at:(NSPoint){(CGFloat)x, (CGFloat)y}]; +} + +void HideTextEditControl(void) { + return [TWView stopEditing]; +} + +bool TextEditControlIsVisible(void) { + return [TWView isEditing]; +} +}; + +/* Miscellanea */ + +void SolveSpace::DoMessageBox(const char *str, int rows, int cols, bool error) { + NSAlert *alert = [[NSAlert alloc] init]; + [alert setAlertStyle:(error ? NSWarningAlertStyle : NSInformationalAlertStyle)]; + [alert addButtonWithTitle:@"OK"]; + + /* do some additional formatting of the message these are + heuristics, but they are made failsafe and lead to nice results. */ + NSString *input = [NSString stringWithUTF8String:str]; + NSRange dot = [input rangeOfCharacterFromSet: + [NSCharacterSet characterSetWithCharactersInString:@".:"]]; + if(dot.location != NSNotFound) { + [alert setMessageText:[[input substringToIndex:dot.location + 1] + stringByReplacingOccurrencesOfString:@"\n" withString:@" "]]; + [alert setInformativeText: + [[input substringFromIndex:dot.location + 1] + stringByTrimmingCharactersInSet:[NSCharacterSet newlineCharacterSet]]]; + } else { + [alert setMessageText:[input + stringByReplacingOccurrencesOfString:@"\n" withString:@" "]]; + } + + [alert runModal]; +} + +void SolveSpace::OpenWebsite(const char *url) { + [[NSWorkspace sharedWorkspace] openURL: + [NSURL URLWithString:[NSString stringWithUTF8String:url]]]; +} + +std::vector SolveSpace::GetFontFiles() { + std::vector fonts; + + NSArray *fontNames = [[NSFontManager sharedFontManager] availableFonts]; + for(NSString *fontName in fontNames) { + CTFontDescriptorRef fontRef = + CTFontDescriptorCreateWithNameAndSize ((__bridge CFStringRef)fontName, 10.0); + CFURLRef url = (CFURLRef)CTFontDescriptorCopyAttribute(fontRef, kCTFontURLAttribute); + NSString *fontPath = [NSString stringWithString:[(NSURL *)CFBridgingRelease(url) path]]; + fonts.push_back([[NSFileManager defaultManager] + fileSystemRepresentationWithPath:fontPath]); + } + + return fonts; +} + +/* Application lifecycle */ + +@interface ApplicationDelegate : NSObject +- (BOOL)applicationShouldTerminateAfterLastWindowClosed:(NSApplication *)theApplication; +- (NSApplicationTerminateReply)applicationShouldTerminate:(NSApplication *)sender; +- (void)applicationWillTerminate:(NSNotification *)aNotification; +- (BOOL)application:(NSApplication *)theApplication openFile:(NSString *)filename; +- (IBAction)preferences:(id)sender; +@end + +@implementation ApplicationDelegate +- (BOOL)applicationShouldTerminateAfterLastWindowClosed:(NSApplication *)theApplication { + return YES; +} + +- (NSApplicationTerminateReply)applicationShouldTerminate:(NSApplication *)sender { + if(SolveSpace::SS.OkayToStartNewFile()) + return NSTerminateNow; + else + return NSTerminateCancel; +} + +- (void)applicationWillTerminate:(NSNotification *)aNotification { + SolveSpace::SS.Exit(); +} + +- (BOOL)application:(NSApplication *)theApplication openFile:(NSString *)filename { + return SolveSpace::SS.OpenFile([filename UTF8String]); +} + +- (IBAction)preferences:(id)sender { + SolveSpace::SS.TW.GoToScreen(SolveSpace::TextWindow::SCREEN_CONFIGURATION); + SolveSpace::SS.ScheduleShowTW(); +} +@end + +void SolveSpace::ExitNow(void) { + [NSApp stop:nil]; +} + +/* + * Normally we would just link to the 3DconnexionClient framework. + * We don't want to (are not allowed to) distribute the official + * framework, so we're trying to use the one installed on the users + * computer. There are some different versions of the framework, + * the official one and re-implementations using an open source driver + * for older devices (spacenav-plus). So weak-linking isn't an option, + * either. The only remaining way is using CFBundle to dynamically + * load the library at runtime, and also detect its availability. + * + * We're also defining everything needed from the 3DconnexionClientAPI, + * so we're not depending on the API headers. + */ + +#pragma pack(push,2) + +enum { + kConnexionClientModeTakeOver = 1, + kConnexionClientModePlugin = 2 +}; + +#define kConnexionMsgDeviceState '3dSR' +#define kConnexionMaskButtons 0x00FF +#define kConnexionMaskAxis 0x3F00 + +typedef struct { + uint16_t version; + uint16_t client; + uint16_t command; + int16_t param; + int32_t value; + UInt64 time; + uint8_t report[8]; + uint16_t buttons8; + int16_t axis[6]; + uint16_t address; + uint32_t buttons; +} ConnexionDeviceState, *ConnexionDeviceStatePtr; + +#pragma pack(pop) + +typedef void (*ConnexionAddedHandlerProc)(io_connect_t); +typedef void (*ConnexionRemovedHandlerProc)(io_connect_t); +typedef void (*ConnexionMessageHandlerProc)(io_connect_t, natural_t, void *); + +typedef OSErr (*InstallConnexionHandlersProc)(ConnexionMessageHandlerProc, ConnexionAddedHandlerProc, ConnexionRemovedHandlerProc); +typedef void (*CleanupConnexionHandlersProc)(void); +typedef UInt16 (*RegisterConnexionClientProc)(UInt32, UInt8 *, UInt16, UInt32); +typedef void (*UnregisterConnexionClientProc)(UInt16); + +static BOOL connexionShiftIsDown = NO; +static UInt16 connexionClient = 0; +static UInt32 connexionSignature = 'SoSp'; +static UInt8 *connexionName = (UInt8 *)"SolveSpace"; +static CFBundleRef spaceBundle = NULL; +static InstallConnexionHandlersProc installConnexionHandlers = NULL; +static CleanupConnexionHandlersProc cleanupConnexionHandlers = NULL; +static RegisterConnexionClientProc registerConnexionClient = NULL; +static UnregisterConnexionClientProc unregisterConnexionClient = NULL; + +static void connexionAdded(io_connect_t con) {} +static void connexionRemoved(io_connect_t con) {} +static void connexionMessage(io_connect_t con, natural_t type, void *arg) { + if (type != kConnexionMsgDeviceState) { + return; + } + + ConnexionDeviceState *device = (ConnexionDeviceState *)arg; + + dispatch_async(dispatch_get_main_queue(), ^(void){ + SolveSpace::SS.GW.SpaceNavigatorMoved( + (double)device->axis[0] * -0.25, + (double)device->axis[1] * -0.25, + (double)device->axis[2] * 0.25, + (double)device->axis[3] * -0.0005, + (double)device->axis[4] * -0.0005, + (double)device->axis[5] * -0.0005, + (connexionShiftIsDown == YES) ? 1 : 0 + ); + }); +} + +static void connexionInit() { + NSString *bundlePath = @"/Library/Frameworks/3DconnexionClient.framework"; + NSURL *bundleURL = [NSURL fileURLWithPath:bundlePath]; + spaceBundle = CFBundleCreate(kCFAllocatorDefault, (__bridge CFURLRef)bundleURL); + + // Don't continue if no Spacemouse driver is installed on this machine + if (spaceBundle == NULL) { + return; + } + + installConnexionHandlers = (InstallConnexionHandlersProc) + CFBundleGetFunctionPointerForName(spaceBundle, + CFSTR("InstallConnexionHandlers")); + + cleanupConnexionHandlers = (CleanupConnexionHandlersProc) + CFBundleGetFunctionPointerForName(spaceBundle, + CFSTR("CleanupConnexionHandlers")); + + registerConnexionClient = (RegisterConnexionClientProc) + CFBundleGetFunctionPointerForName(spaceBundle, + CFSTR("RegisterConnexionClient")); + + unregisterConnexionClient = (UnregisterConnexionClientProc) + CFBundleGetFunctionPointerForName(spaceBundle, + CFSTR("UnregisterConnexionClient")); + + // Only continue if all required symbols have been loaded + if ((installConnexionHandlers == NULL) || (cleanupConnexionHandlers == NULL) + || (registerConnexionClient == NULL) || (unregisterConnexionClient == NULL)) { + CFRelease(spaceBundle); + spaceBundle = NULL; + return; + } + + installConnexionHandlers(&connexionMessage, &connexionAdded, &connexionRemoved); + connexionClient = registerConnexionClient(connexionSignature, connexionName, + kConnexionClientModeTakeOver, kConnexionMaskButtons | kConnexionMaskAxis); + + // Monitor modifier flags to detect Shift button state changes + [NSEvent addLocalMonitorForEventsMatchingMask:(NSKeyDownMask | NSFlagsChangedMask) + handler:^(NSEvent *event) { + if (event.modifierFlags & NSShiftKeyMask) { + connexionShiftIsDown = YES; + } + return event; + }]; + + [NSEvent addLocalMonitorForEventsMatchingMask:(NSKeyUpMask | NSFlagsChangedMask) + handler:^(NSEvent *event) { + if (!(event.modifierFlags & NSShiftKeyMask)) { + connexionShiftIsDown = NO; + } + return event; + }]; +} + +static void connexionClose() { + if (spaceBundle == NULL) { + return; + } + + unregisterConnexionClient(connexionClient); + cleanupConnexionHandlers(); + + CFRelease(spaceBundle); +} + +int main(int argc, const char *argv[]) { + [NSApplication sharedApplication]; + ApplicationDelegate *delegate = [[ApplicationDelegate alloc] init]; + [NSApp setDelegate:delegate]; + + SolveSpace::InitGraphicsWindow(); + SolveSpace::InitTextWindow(); + [[NSBundle mainBundle] loadNibNamed:@"MainMenu" owner:nil topLevelObjects:nil]; + SolveSpace::InitMainMenu([NSApp mainMenu]); + + connexionInit(); + SolveSpace::SS.Init(); + + [GW makeKeyAndOrderFront:nil]; + [NSApp run]; + + connexionClose(); + SolveSpace::SK.Clear(); + SolveSpace::SS.Clear(); + + return 0; +} diff --git a/src/config.h.in b/src/config.h.in new file mode 100644 index 0000000..aca7757 --- /dev/null +++ b/src/config.h.in @@ -0,0 +1,13 @@ +#ifndef __CONFIG_H +#define __CONFIG_H + +#define PACKAGE_VERSION "@solvespace_VERSION_MAJOR@.@solvespace_VERSION_MINOR@~@solvespace_GIT_HASH@" + +/* Do we have the si library on win32, or libspnav on *nix? */ +#cmakedefine HAVE_SPACEWARE + +#cmakedefine HAVE_GTK +#cmakedefine HAVE_GTK2 +#cmakedefine HAVE_GTK3 + +#endif diff --git a/src/confscreen.cpp b/src/confscreen.cpp new file mode 100644 index 0000000..a7ad678 --- /dev/null +++ b/src/confscreen.cpp @@ -0,0 +1,463 @@ +//----------------------------------------------------------------------------- +// For the configuration screen, setup items that are not specific to the +// file being edited right now. +// +// Copyright 2008-2013 Jonathan Westhues. +//----------------------------------------------------------------------------- +#include "solvespace.h" + +void TextWindow::ScreenChangeLightDirection(int link, uint32_t v) { + SS.TW.ShowEditControl(8, ssprintf("%.2f, %.2f, %.2f", CO(SS.lightDir[v]))); + SS.TW.edit.meaning = EDIT_LIGHT_DIRECTION; + SS.TW.edit.i = v; +} + +void TextWindow::ScreenChangeLightIntensity(int link, uint32_t v) { + SS.TW.ShowEditControl(31, ssprintf("%.2f", SS.lightIntensity[v])); + SS.TW.edit.meaning = EDIT_LIGHT_INTENSITY; + SS.TW.edit.i = v; +} + +void TextWindow::ScreenChangeColor(int link, uint32_t v) { + SS.TW.ShowEditControlWithColorPicker(13, SS.modelColor[v]); + + SS.TW.edit.meaning = EDIT_COLOR; + SS.TW.edit.i = v; +} + +void TextWindow::ScreenChangeChordTolerance(int link, uint32_t v) { + SS.TW.ShowEditControl(3, ssprintf("%lg", SS.chordTol)); + SS.TW.edit.meaning = EDIT_CHORD_TOLERANCE; + SS.TW.edit.i = 0; +} + +void TextWindow::ScreenChangeMaxSegments(int link, uint32_t v) { + SS.TW.ShowEditControl(3, ssprintf("%d", SS.maxSegments)); + SS.TW.edit.meaning = EDIT_MAX_SEGMENTS; + SS.TW.edit.i = 0; +} + +void TextWindow::ScreenChangeExportChordTolerance(int link, uint32_t v) { + SS.TW.ShowEditControl(3, ssprintf("%lg", SS.exportChordTol)); + SS.TW.edit.meaning = EDIT_CHORD_TOLERANCE; + SS.TW.edit.i = 1; +} + +void TextWindow::ScreenChangeExportMaxSegments(int link, uint32_t v) { + SS.TW.ShowEditControl(3, ssprintf("%d", SS.exportMaxSegments)); + SS.TW.edit.meaning = EDIT_MAX_SEGMENTS; + SS.TW.edit.i = 1; +} + +void TextWindow::ScreenChangeCameraTangent(int link, uint32_t v) { + SS.TW.ShowEditControl(3, ssprintf("%.3f", 1000*SS.cameraTangent)); + SS.TW.edit.meaning = EDIT_CAMERA_TANGENT; +} + +void TextWindow::ScreenChangeGridSpacing(int link, uint32_t v) { + SS.TW.ShowEditControl(3, SS.MmToString(SS.gridSpacing)); + SS.TW.edit.meaning = EDIT_GRID_SPACING; +} + +void TextWindow::ScreenChangeDigitsAfterDecimal(int link, uint32_t v) { + SS.TW.ShowEditControl(3, ssprintf("%d", SS.UnitDigitsAfterDecimal())); + SS.TW.edit.meaning = EDIT_DIGITS_AFTER_DECIMAL; +} + +void TextWindow::ScreenChangeExportScale(int link, uint32_t v) { + SS.TW.ShowEditControl(5, ssprintf("%.3f", (double)SS.exportScale)); + SS.TW.edit.meaning = EDIT_EXPORT_SCALE; +} + +void TextWindow::ScreenChangeExportOffset(int link, uint32_t v) { + SS.TW.ShowEditControl(3, SS.MmToString(SS.exportOffset)); + SS.TW.edit.meaning = EDIT_EXPORT_OFFSET; +} + +void TextWindow::ScreenChangeFixExportColors(int link, uint32_t v) { + SS.fixExportColors = !SS.fixExportColors; +} + +void TextWindow::ScreenChangeBackFaces(int link, uint32_t v) { + SS.drawBackFaces = !SS.drawBackFaces; + InvalidateGraphics(); +} + +void TextWindow::ScreenChangeCheckClosedContour(int link, uint32_t v) { + SS.checkClosedContour = !SS.checkClosedContour; + InvalidateGraphics(); +} + +void TextWindow::ScreenChangeShadedTriangles(int link, uint32_t v) { + SS.exportShadedTriangles = !SS.exportShadedTriangles; + InvalidateGraphics(); +} + +void TextWindow::ScreenChangePwlCurves(int link, uint32_t v) { + SS.exportPwlCurves = !SS.exportPwlCurves; + InvalidateGraphics(); +} + +void TextWindow::ScreenChangeCanvasSizeAuto(int link, uint32_t v) { + if(link == 't') { + SS.exportCanvasSizeAuto = true; + } else { + SS.exportCanvasSizeAuto = false; + } + InvalidateGraphics(); +} + +void TextWindow::ScreenChangeCanvasSize(int link, uint32_t v) { + double d; + switch(v) { + case 0: d = SS.exportMargin.left; break; + case 1: d = SS.exportMargin.right; break; + case 2: d = SS.exportMargin.bottom; break; + case 3: d = SS.exportMargin.top; break; + + case 10: d = SS.exportCanvas.width; break; + case 11: d = SS.exportCanvas.height; break; + case 12: d = SS.exportCanvas.dx; break; + case 13: d = SS.exportCanvas.dy; break; + + default: return; + } + int col = 13; + if(v < 10) col = 11; + SS.TW.ShowEditControl(col, SS.MmToString(d)); + SS.TW.edit.meaning = EDIT_CANVAS_SIZE; + SS.TW.edit.i = v; +} + +void TextWindow::ScreenChangeGCodeParameter(int link, uint32_t v) { + std::string buf; + switch(link) { + case 'd': + SS.TW.edit.meaning = EDIT_G_CODE_DEPTH; + buf += SS.MmToString(SS.gCode.depth); + break; + + case 's': + SS.TW.edit.meaning = EDIT_G_CODE_PASSES; + buf += std::to_string(SS.gCode.passes); + break; + + case 'F': + SS.TW.edit.meaning = EDIT_G_CODE_FEED; + buf += SS.MmToString(SS.gCode.feed); + break; + + case 'P': + SS.TW.edit.meaning = EDIT_G_CODE_PLUNGE_FEED; + buf += SS.MmToString(SS.gCode.plungeFeed); + break; + } + SS.TW.ShowEditControl(14, buf); +} + +void TextWindow::ScreenChangeAutosaveInterval(int link, uint32_t v) { + SS.TW.ShowEditControl(3, std::to_string(SS.autosaveInterval)); + SS.TW.edit.meaning = EDIT_AUTOSAVE_INTERVAL; +} + +void TextWindow::ShowConfiguration(void) { + int i; + Printf(true, "%Ft user color (r, g, b)"); + + for(i = 0; i < SS.MODEL_COLORS; i++) { + Printf(false, "%Bp #%d: %Bz %Bp (%@, %@, %@) %f%D%Ll%Fl[change]%E", + (i & 1) ? 'd' : 'a', + i, &SS.modelColor[i], + (i & 1) ? 'd' : 'a', + SS.modelColor[i].redF(), + SS.modelColor[i].greenF(), + SS.modelColor[i].blueF(), + &ScreenChangeColor, i); + } + + Printf(false, ""); + Printf(false, "%Ft light direction intensity"); + for(i = 0; i < 2; i++) { + Printf(false, "%Bp #%d (%2,%2,%2)%Fl%D%f%Ll[c]%E " + "%2 %Fl%D%f%Ll[c]%E", + (i & 1) ? 'd' : 'a', i, + CO(SS.lightDir[i]), i, &ScreenChangeLightDirection, + SS.lightIntensity[i], i, &ScreenChangeLightIntensity); + } + + Printf(false, ""); + Printf(false, "%Ft chord tolerance (in percents)%E"); + Printf(false, "%Ba %@ %% %Fl%Ll%f%D[change]%E; %@ mm, %d triangles", + SS.chordTol, + &ScreenChangeChordTolerance, 0, SS.chordTolCalculated, + SK.GetGroup(SS.GW.activeGroup)->displayMesh.l.n); + Printf(false, "%Ft max piecewise linear segments%E"); + Printf(false, "%Ba %d %Fl%Ll%f[change]%E", + SS.maxSegments, + &ScreenChangeMaxSegments); + + Printf(false, ""); + Printf(false, "%Ft export chord tolerance (in mm)%E"); + Printf(false, "%Ba %@ %Fl%Ll%f%D[change]%E", + SS.exportChordTol, + &ScreenChangeExportChordTolerance, 0); + Printf(false, "%Ft export max piecewise linear segments%E"); + Printf(false, "%Ba %d %Fl%Ll%f[change]%E", + SS.exportMaxSegments, + &ScreenChangeExportMaxSegments); + + Printf(false, ""); + Printf(false, "%Ft perspective factor (0 for parallel)%E"); + Printf(false, "%Ba %# %Fl%Ll%f%D[change]%E", + SS.cameraTangent*1000, + &ScreenChangeCameraTangent, 0); + Printf(false, "%Ft snap grid spacing%E"); + Printf(false, "%Ba %s %Fl%Ll%f%D[change]%E", + SS.MmToString(SS.gridSpacing).c_str(), + &ScreenChangeGridSpacing, 0); + Printf(false, "%Ft digits after decimal point to show%E"); + Printf(false, "%Ba %d %Fl%Ll%f%D[change]%E (e.g. '%s')", + SS.UnitDigitsAfterDecimal(), + &ScreenChangeDigitsAfterDecimal, 0, + SS.MmToString(SS.StringToMm("1.23456789")).c_str()); + + Printf(false, ""); + Printf(false, "%Ft export scale factor (1:1=mm, 1:25.4=inch)"); + Printf(false, "%Ba 1:%# %Fl%Ll%f%D[change]%E", + (double)SS.exportScale, + &ScreenChangeExportScale, 0); + Printf(false, "%Ft cutter radius offset (0=no offset) "); + Printf(false, "%Ba %s %Fl%Ll%f%D[change]%E", + SS.MmToString(SS.exportOffset).c_str(), + &ScreenChangeExportOffset, 0); + + Printf(false, ""); + Printf(false, " %Fd%f%Ll%s export shaded 2d triangles%E", + &ScreenChangeShadedTriangles, + SS.exportShadedTriangles ? CHECK_TRUE : CHECK_FALSE); + if(fabs(SS.exportOffset) > LENGTH_EPS) { + Printf(false, " %Fd%s curves as piecewise linear%E " + "(since cutter radius is not zero)", CHECK_TRUE); + } else { + Printf(false, " %Fd%f%Ll%s export curves as piecewise linear%E", + &ScreenChangePwlCurves, + SS.exportPwlCurves ? CHECK_TRUE : CHECK_FALSE); + } + Printf(false, " %Fd%f%Ll%s fix white exported lines%E", + &ScreenChangeFixExportColors, + SS.fixExportColors ? CHECK_TRUE : CHECK_FALSE); + + Printf(false, ""); + Printf(false, "%Ft export canvas size: " + "%f%Fd%Lf%s fixed%E " + "%f%Fd%Lt%s auto%E", + &ScreenChangeCanvasSizeAuto, + !SS.exportCanvasSizeAuto ? RADIO_TRUE : RADIO_FALSE, + &ScreenChangeCanvasSizeAuto, + SS.exportCanvasSizeAuto ? RADIO_TRUE : RADIO_FALSE); + + if(SS.exportCanvasSizeAuto) { + Printf(false, "%Ft (by margins around exported geometry)"); + Printf(false, "%Ba%Ft left: %Fd%s %Fl%Ll%f%D[change]%E", + SS.MmToString(SS.exportMargin.left).c_str(), &ScreenChangeCanvasSize, 0); + Printf(false, "%Bd%Ft right: %Fd%s %Fl%Ll%f%D[change]%E", + SS.MmToString(SS.exportMargin.right).c_str(), &ScreenChangeCanvasSize, 1); + Printf(false, "%Ba%Ft bottom: %Fd%s %Fl%Ll%f%D[change]%E", + SS.MmToString(SS.exportMargin.bottom).c_str(), &ScreenChangeCanvasSize, 2); + Printf(false, "%Bd%Ft top: %Fd%s %Fl%Ll%f%D[change]%E", + SS.MmToString(SS.exportMargin.top).c_str(), &ScreenChangeCanvasSize, 3); + } else { + Printf(false, "%Ft (by absolute dimensions and offsets)"); + Printf(false, "%Ba%Ft width: %Fd%s %Fl%Ll%f%D[change]%E", + SS.MmToString(SS.exportCanvas.width).c_str(), &ScreenChangeCanvasSize, 10); + Printf(false, "%Bd%Ft height: %Fd%s %Fl%Ll%f%D[change]%E", + SS.MmToString(SS.exportCanvas.height).c_str(), &ScreenChangeCanvasSize, 11); + Printf(false, "%Ba%Ft offset x: %Fd%s %Fl%Ll%f%D[change]%E", + SS.MmToString(SS.exportCanvas.dx).c_str(), &ScreenChangeCanvasSize, 12); + Printf(false, "%Bd%Ft offset y: %Fd%s %Fl%Ll%f%D[change]%E", + SS.MmToString(SS.exportCanvas.dy).c_str(), &ScreenChangeCanvasSize, 13); + } + + Printf(false, ""); + Printf(false, "%Ft exported g code parameters"); + Printf(false, "%Ba%Ft depth: %Fd%s %Fl%Ld%f[change]%E", + SS.MmToString(SS.gCode.depth).c_str(), &ScreenChangeGCodeParameter); + Printf(false, "%Bd%Ft passes: %Fd%d %Fl%Ls%f[change]%E", + SS.gCode.passes, &ScreenChangeGCodeParameter); + Printf(false, "%Ba%Ft feed: %Fd%s %Fl%LF%f[change]%E", + SS.MmToString(SS.gCode.feed).c_str(), &ScreenChangeGCodeParameter); + Printf(false, "%Bd%Ft plunge fd: %Fd%s %Fl%LP%f[change]%E", + SS.MmToString(SS.gCode.plungeFeed).c_str(), &ScreenChangeGCodeParameter); + + Printf(false, ""); + Printf(false, " %Fd%f%Ll%s draw triangle back faces in red%E", + &ScreenChangeBackFaces, + SS.drawBackFaces ? CHECK_TRUE : CHECK_FALSE); + Printf(false, " %Fd%f%Ll%s check sketch for closed contour%E", + &ScreenChangeCheckClosedContour, + SS.checkClosedContour ? CHECK_TRUE : CHECK_FALSE); + + Printf(false, ""); + Printf(false, "%Ft autosave interval (in minutes)%E"); + Printf(false, "%Ba %d %Fl%Ll%f[change]%E", + SS.autosaveInterval, &ScreenChangeAutosaveInterval); + + Printf(false, ""); + Printf(false, " %Ftgl vendor %E%s", glGetString(GL_VENDOR)); + Printf(false, " %Ft renderer %E%s", glGetString(GL_RENDERER)); + Printf(false, " %Ft version %E%s", glGetString(GL_VERSION)); +} + +bool TextWindow::EditControlDoneForConfiguration(const char *s) { + switch(edit.meaning) { + case EDIT_LIGHT_INTENSITY: + SS.lightIntensity[edit.i] = min(1.0, max(0.0, atof(s))); + InvalidateGraphics(); + break; + + case EDIT_LIGHT_DIRECTION: { + double x, y, z; + if(sscanf(s, "%lf, %lf, %lf", &x, &y, &z)==3) { + SS.lightDir[edit.i] = Vector::From(x, y, z); + } else { + Error("Bad format: specify coordinates as x, y, z"); + } + InvalidateGraphics(); + break; + } + case EDIT_COLOR: { + Vector rgb; + if(sscanf(s, "%lf, %lf, %lf", &rgb.x, &rgb.y, &rgb.z)==3) { + rgb = rgb.ClampWithin(0, 1); + SS.modelColor[edit.i] = RGBf(rgb.x, rgb.y, rgb.z); + } else { + Error("Bad format: specify color as r, g, b"); + } + break; + } + case EDIT_CHORD_TOLERANCE: { + if(edit.i == 0) { + SS.chordTol = max(0.0, atof(s)); + SS.GenerateAll(SolveSpaceUI::GENERATE_ALL); + } else { + SS.exportChordTol = max(0.0, atof(s)); + } + break; + } + case EDIT_MAX_SEGMENTS: { + if(edit.i == 0) { + SS.maxSegments = min(1000, max(7, atoi(s))); + SS.GenerateAll(SolveSpaceUI::GENERATE_ALL); + } else { + SS.exportMaxSegments = min(1000, max(7, atoi(s))); + } + break; + } + case EDIT_CAMERA_TANGENT: { + SS.cameraTangent = (min(2.0, max(0.0, atof(s))))/1000.0; + if(!SS.usePerspectiveProj) { + Message("The perspective factor will have no effect until you " + "enable View -> Use Perspective Projection."); + } + InvalidateGraphics(); + break; + } + case EDIT_GRID_SPACING: { + SS.gridSpacing = (float)min(1e4, max(1e-3, SS.StringToMm(s))); + InvalidateGraphics(); + break; + } + case EDIT_DIGITS_AFTER_DECIMAL: { + int v = atoi(s); + if(v < 0 || v > 8) { + Error("Specify between 0 and 8 digits after the decimal."); + } else { + SS.SetUnitDigitsAfterDecimal(v); + } + InvalidateGraphics(); + break; + } + case EDIT_EXPORT_SCALE: { + Expr *e = Expr::From(s, true); + if(e) { + double ev = e->Eval(); + if(fabs(ev) < 0.001 || isnan(ev)) { + Error("Export scale must not be zero!"); + } else { + SS.exportScale = (float)ev; + } + } + break; + } + case EDIT_EXPORT_OFFSET: { + Expr *e = Expr::From(s, true); + if(e) { + double ev = SS.ExprToMm(e); + if(isnan(ev) || ev < 0) { + Error("Cutter radius offset must not be negative!"); + } else { + SS.exportOffset = (float)ev; + } + } + break; + } + case EDIT_CANVAS_SIZE: { + Expr *e = Expr::From(s, true); + if(!e) { + break; + } + float d = (float)SS.ExprToMm(e); + switch(edit.i) { + case 0: SS.exportMargin.left = d; break; + case 1: SS.exportMargin.right = d; break; + case 2: SS.exportMargin.bottom = d; break; + case 3: SS.exportMargin.top = d; break; + + case 10: SS.exportCanvas.width = d; break; + case 11: SS.exportCanvas.height = d; break; + case 12: SS.exportCanvas.dx = d; break; + case 13: SS.exportCanvas.dy = d; break; + } + break; + } + case EDIT_G_CODE_DEPTH: { + Expr *e = Expr::From(s, true); + if(e) SS.gCode.depth = (float)SS.ExprToMm(e); + break; + } + case EDIT_G_CODE_PASSES: { + Expr *e = Expr::From(s, true); + if(e) SS.gCode.passes = (int)(e->Eval()); + SS.gCode.passes = max(1, min(1000, SS.gCode.passes)); + break; + } + case EDIT_G_CODE_FEED: { + Expr *e = Expr::From(s, true); + if(e) SS.gCode.feed = (float)SS.ExprToMm(e); + break; + } + case EDIT_G_CODE_PLUNGE_FEED: { + Expr *e = Expr::From(s, true); + if(e) SS.gCode.plungeFeed = (float)SS.ExprToMm(e); + break; + } + case EDIT_AUTOSAVE_INTERVAL: { + int interval; + if(sscanf(s, "%d", &interval)==1) { + if(interval >= 1) { + SS.autosaveInterval = interval; + SetAutosaveTimerFor(interval); + } else { + Error("Bad value: autosave interval should be positive"); + } + } else { + Error("Bad format: specify interval in integral minutes"); + } + break; + } + + default: return false; + } + return true; +} + diff --git a/src/constraint.cpp b/src/constraint.cpp new file mode 100644 index 0000000..e5aae1b --- /dev/null +++ b/src/constraint.cpp @@ -0,0 +1,745 @@ +//----------------------------------------------------------------------------- +// Implementation of the Constraint menu, to create new constraints in +// the sketch. +// +// Copyright 2008-2013 Jonathan Westhues. +//----------------------------------------------------------------------------- +#include "solvespace.h" + +std::string Constraint::DescriptionString(void) { + const char *s; + switch(type) { + case POINTS_COINCIDENT: s = "pts-coincident"; break; + case PT_PT_DISTANCE: s = "pt-pt-distance"; break; + case PT_LINE_DISTANCE: s = "pt-line-distance"; break; + case PT_PLANE_DISTANCE: s = "pt-plane-distance"; break; + case PT_FACE_DISTANCE: s = "pt-face-distance"; break; + case PROJ_PT_DISTANCE: s = "proj-pt-pt-distance"; break; + case PT_IN_PLANE: s = "pt-in-plane"; break; + case PT_ON_LINE: s = "pt-on-line"; break; + case PT_ON_FACE: s = "pt-on-face"; break; + case EQUAL_LENGTH_LINES: s = "eq-length"; break; + case EQ_LEN_PT_LINE_D: s = "eq-length-and-pt-ln-dist"; break; + case EQ_PT_LN_DISTANCES: s = "eq-pt-line-distances"; break; + case LENGTH_RATIO: s = "length-ratio"; break; + case LENGTH_DIFFERENCE: s = "length-difference"; break; + case SYMMETRIC: s = "symmetric"; break; + case SYMMETRIC_HORIZ: s = "symmetric-h"; break; + case SYMMETRIC_VERT: s = "symmetric-v"; break; + case SYMMETRIC_LINE: s = "symmetric-line"; break; + case AT_MIDPOINT: s = "at-midpoint"; break; + case HORIZONTAL: s = "horizontal"; break; + case VERTICAL: s = "vertical"; break; + case DIAMETER: s = "diameter"; break; + case PT_ON_CIRCLE: s = "pt-on-circle"; break; + case SAME_ORIENTATION: s = "same-orientation"; break; + case ANGLE: s = "angle"; break; + case PARALLEL: s = "parallel"; break; + case ARC_LINE_TANGENT: s = "arc-line-tangent"; break; + case CUBIC_LINE_TANGENT: s = "cubic-line-tangent"; break; + case CURVE_CURVE_TANGENT: s = "curve-curve-tangent"; break; + case PERPENDICULAR: s = "perpendicular"; break; + case EQUAL_RADIUS: s = "eq-radius"; break; + case EQUAL_ANGLE: s = "eq-angle"; break; + case EQUAL_LINE_ARC_LEN: s = "eq-line-len-arc-len"; break; + case WHERE_DRAGGED: s = "lock-where-dragged"; break; + case COMMENT: s = "comment"; break; + default: s = "???"; break; + } + + return ssprintf("c%03x-%s", h.v, s); +} + +#ifndef LIBRARY + +//----------------------------------------------------------------------------- +// Delete all constraints with the specified type, entityA, ptA. We use this +// when auto-removing constraints that would become redundant. +//----------------------------------------------------------------------------- +void Constraint::DeleteAllConstraintsFor(int type, hEntity entityA, hEntity ptA) +{ + SK.constraint.ClearTags(); + for(int i = 0; i < SK.constraint.n; i++) { + ConstraintBase *ct = &(SK.constraint.elem[i]); + if(ct->type != type) continue; + + if(ct->entityA.v != entityA.v) continue; + if(ct->ptA.v != ptA.v) continue; + ct->tag = 1; + } + SK.constraint.RemoveTagged(); + // And no need to do anything special, since nothing + // ever depends on a constraint. But do clear the + // hover, in case the just-deleted constraint was + // hovered. + SS.GW.hover.Clear(); +} + +hConstraint Constraint::AddConstraint(Constraint *c) { + return AddConstraint(c, true); +} + +hConstraint Constraint::AddConstraint(Constraint *c, bool rememberForUndo) { + if(rememberForUndo) SS.UndoRemember(); + + SK.constraint.AddAndAssignId(c); + + SS.MarkGroupDirty(c->group); + SS.ScheduleGenerateAll(); + return c->h; +} + +hConstraint Constraint::Constrain(int type, hEntity ptA, hEntity ptB, + hEntity entityA, hEntity entityB, + bool other, bool other2) +{ + Constraint c = {}; + c.group = SS.GW.activeGroup; + c.workplane = SS.GW.ActiveWorkplane(); + c.type = type; + c.ptA = ptA; + c.ptB = ptB; + c.entityA = entityA; + c.entityB = entityB; + c.other = other; + c.other2 = other2; + return AddConstraint(&c, false); +} + +hConstraint Constraint::Constrain(int type, hEntity ptA, hEntity ptB, hEntity entityA){ + return Constrain(type, ptA, ptB, entityA, Entity::NO_ENTITY, false, false); +} + +hConstraint Constraint::ConstrainCoincident(hEntity ptA, hEntity ptB) { + return Constrain(POINTS_COINCIDENT, ptA, ptB, + Entity::NO_ENTITY, Entity::NO_ENTITY, false, false); +} + +void Constraint::MenuConstrain(int id) { + Constraint c = {}; + c.group = SS.GW.activeGroup; + c.workplane = SS.GW.ActiveWorkplane(); + + SS.GW.GroupSelection(); +#define gs (SS.GW.gs) + + switch(id) { + case GraphicsWindow::MNU_DISTANCE_DIA: + case GraphicsWindow::MNU_REF_DISTANCE: { + if(gs.points == 2 && gs.n == 2) { + c.type = PT_PT_DISTANCE; + c.ptA = gs.point[0]; + c.ptB = gs.point[1]; + } else if(gs.lineSegments == 1 && gs.n == 1) { + c.type = PT_PT_DISTANCE; + Entity *e = SK.GetEntity(gs.entity[0]); + c.ptA = e->point[0]; + c.ptB = e->point[1]; + } else if(gs.vectors == 1 && gs.points == 2 && gs.n == 3) { + c.type = PROJ_PT_DISTANCE; + c.ptA = gs.point[0]; + c.ptB = gs.point[1]; + c.entityA = gs.vector[0]; + } else if(gs.workplanes == 1 && gs.points == 1 && gs.n == 2) { + c.type = PT_PLANE_DISTANCE; + c.ptA = gs.point[0]; + c.entityA = gs.entity[0]; + } else if(gs.lineSegments == 1 && gs.points == 1 && gs.n == 2) { + c.type = PT_LINE_DISTANCE; + c.ptA = gs.point[0]; + c.entityA = gs.entity[0]; + } else if(gs.faces == 1 && gs.points == 1 && gs.n == 2) { + c.type = PT_FACE_DISTANCE; + c.ptA = gs.point[0]; + c.entityA = gs.face[0]; + } else if(gs.circlesOrArcs == 1 && gs.n == 1) { + c.type = DIAMETER; + c.entityA = gs.entity[0]; + } else { + Error( +"Bad selection for distance / diameter constraint. This " +"constraint can apply to:\n\n" +" * two points (distance between points)\n" +" * a line segment (length)\n" +" * two points and a line segment or normal (projected distance)\n" +" * a workplane and a point (minimum distance)\n" +" * a line segment and a point (minimum distance)\n" +" * a plane face and a point (minimum distance)\n" +" * a circle or an arc (diameter)\n"); + return; + } + if(c.type == PT_PT_DISTANCE || c.type == PROJ_PT_DISTANCE) { + Vector n = SS.GW.projRight.Cross(SS.GW.projUp); + Vector a = SK.GetEntity(c.ptA)->PointGetNum(); + Vector b = SK.GetEntity(c.ptB)->PointGetNum(); + c.disp.offset = n.Cross(a.Minus(b)); + c.disp.offset = (c.disp.offset).WithMagnitude(50/SS.GW.scale); + } else { + c.disp.offset = Vector::From(0, 0, 0); + } + + if(id == GraphicsWindow::MNU_REF_DISTANCE) { + c.reference = true; + } + + c.valA = 0; + c.ModifyToSatisfy(); + AddConstraint(&c); + break; + } + + case GraphicsWindow::MNU_ON_ENTITY: + if(gs.points == 2 && gs.n == 2) { + c.type = POINTS_COINCIDENT; + c.ptA = gs.point[0]; + c.ptB = gs.point[1]; + } else if(gs.points == 1 && gs.workplanes == 1 && gs.n == 2) { + c.type = PT_IN_PLANE; + c.ptA = gs.point[0]; + c.entityA = gs.entity[0]; + } else if(gs.points == 1 && gs.lineSegments == 1 && gs.n == 2) { + c.type = PT_ON_LINE; + c.ptA = gs.point[0]; + c.entityA = gs.entity[0]; + } else if(gs.points == 1 && gs.circlesOrArcs == 1 && gs.n == 2) { + c.type = PT_ON_CIRCLE; + c.ptA = gs.point[0]; + c.entityA = gs.entity[0]; + } else if(gs.points == 1 && gs.faces == 1 && gs.n == 2) { + c.type = PT_ON_FACE; + c.ptA = gs.point[0]; + c.entityA = gs.face[0]; + } else { + Error("Bad selection for on point / curve / plane constraint. " + "This constraint can apply to:\n\n" + " * two points (points coincident)\n" + " * a point and a workplane (point in plane)\n" + " * a point and a line segment (point on line)\n" + " * a point and a circle or arc (point on curve)\n" + " * a point and a plane face (point on face)\n"); + return; + } + AddConstraint(&c); + break; + + case GraphicsWindow::MNU_EQUAL: + if(gs.lineSegments == 2 && gs.n == 2) { + c.type = EQUAL_LENGTH_LINES; + c.entityA = gs.entity[0]; + c.entityB = gs.entity[1]; + } else if(gs.lineSegments == 2 && gs.points == 2 && gs.n == 4) { + c.type = EQ_PT_LN_DISTANCES; + c.entityA = gs.entity[0]; + c.ptA = gs.point[0]; + c.entityB = gs.entity[1]; + c.ptB = gs.point[1]; + } else if(gs.lineSegments == 1 && gs.points == 2 && gs.n == 3) { + // The same line segment for the distances, but different + // points. + c.type = EQ_PT_LN_DISTANCES; + c.entityA = gs.entity[0]; + c.ptA = gs.point[0]; + c.entityB = gs.entity[0]; + c.ptB = gs.point[1]; + } else if(gs.lineSegments == 2 && gs.points == 1 && gs.n == 3) { + c.type = EQ_LEN_PT_LINE_D; + c.entityA = gs.entity[0]; + c.entityB = gs.entity[1]; + c.ptA = gs.point[0]; + } else if(gs.vectors == 4 && gs.n == 4) { + c.type = EQUAL_ANGLE; + c.entityA = gs.vector[0]; + c.entityB = gs.vector[1]; + c.entityC = gs.vector[2]; + c.entityD = gs.vector[3]; + } else if(gs.vectors == 3 && gs.n == 3) { + c.type = EQUAL_ANGLE; + c.entityA = gs.vector[0]; + c.entityB = gs.vector[1]; + c.entityC = gs.vector[1]; + c.entityD = gs.vector[2]; + } else if(gs.circlesOrArcs == 2 && gs.n == 2) { + c.type = EQUAL_RADIUS; + c.entityA = gs.entity[0]; + c.entityB = gs.entity[1]; + } else if(gs.arcs == 1 && gs.lineSegments == 1 && gs.n == 2) { + c.type = EQUAL_LINE_ARC_LEN; + if(SK.GetEntity(gs.entity[0])->type == Entity::ARC_OF_CIRCLE) { + c.entityA = gs.entity[1]; + c.entityB = gs.entity[0]; + } else { + c.entityA = gs.entity[0]; + c.entityB = gs.entity[1]; + } + } else { + Error("Bad selection for equal length / radius constraint. " + "This constraint can apply to:\n\n" + " * two line segments (equal length)\n" + " * two line segments and two points " + "(equal point-line distances)\n" + " * a line segment and two points " + "(equal point-line distances)\n" + " * a line segment, and a point and line segment " + "(point-line distance equals length)\n" + " * four line segments or normals " + "(equal angle between A,B and C,D)\n" + " * three line segments or normals " + "(equal angle between A,B and B,C)\n" + " * two circles or arcs (equal radius)\n" + " * a line segment and an arc " + "(line segment length equals arc length)\n"); + return; + } + if(c.type == EQUAL_ANGLE) { + // Infer the nearest supplementary angle from the sketch. + Vector a1 = SK.GetEntity(c.entityA)->VectorGetNum(), + b1 = SK.GetEntity(c.entityB)->VectorGetNum(), + a2 = SK.GetEntity(c.entityC)->VectorGetNum(), + b2 = SK.GetEntity(c.entityD)->VectorGetNum(); + double d1 = a1.Dot(b1), d2 = a2.Dot(b2); + + if(d1*d2 < 0) { + c.other = true; + } + } + AddConstraint(&c); + break; + + case GraphicsWindow::MNU_RATIO: + if(gs.lineSegments == 2 && gs.n == 2) { + c.type = LENGTH_RATIO; + c.entityA = gs.entity[0]; + c.entityB = gs.entity[1]; + } else { + Error("Bad selection for length ratio constraint. This " + "constraint can apply to:\n\n" + " * two line segments\n"); + return; + } + + c.valA = 0; + c.ModifyToSatisfy(); + AddConstraint(&c); + break; + + case GraphicsWindow::MNU_DIFFERENCE: + if(gs.lineSegments == 2 && gs.n == 2) { + c.type = LENGTH_DIFFERENCE; + c.entityA = gs.entity[0]; + c.entityB = gs.entity[1]; + } else { + Error("Bad selection for length difference constraint. This " + "constraint can apply to:\n\n" + " * two line segments\n"); + return; + } + + c.valA = 0; + c.ModifyToSatisfy(); + AddConstraint(&c); + break; + + case GraphicsWindow::MNU_AT_MIDPOINT: + if(gs.lineSegments == 1 && gs.points == 1 && gs.n == 2) { + c.type = AT_MIDPOINT; + c.entityA = gs.entity[0]; + c.ptA = gs.point[0]; + + // If a point is at-midpoint, then no reason to also constrain + // it on-line; so auto-remove that. + DeleteAllConstraintsFor(PT_ON_LINE, c.entityA, c.ptA); + } else if(gs.lineSegments == 1 && gs.workplanes == 1 && gs.n == 2) { + c.type = AT_MIDPOINT; + int i = SK.GetEntity(gs.entity[0])->IsWorkplane() ? 1 : 0; + c.entityA = gs.entity[i]; + c.entityB = gs.entity[1-i]; + } else { + Error("Bad selection for at midpoint constraint. This " + "constraint can apply to:\n\n" + " * a line segment and a point " + "(point at midpoint)\n" + " * a line segment and a workplane " + "(line's midpoint on plane)\n"); + return; + } + AddConstraint(&c); + break; + + case GraphicsWindow::MNU_SYMMETRIC: + if(gs.points == 2 && + ((gs.workplanes == 1 && gs.n == 3) || + (gs.n == 2))) + { + if(gs.entities > 0) + c.entityA = gs.entity[0]; + c.ptA = gs.point[0]; + c.ptB = gs.point[1]; + } else if(gs.lineSegments == 1 && + ((gs.workplanes == 1 && gs.n == 2) || + (gs.n == 1))) + { + Entity *line; + if(SK.GetEntity(gs.entity[0])->IsWorkplane()) { + line = SK.GetEntity(gs.entity[1]); + c.entityA = gs.entity[0]; + } else { + line = SK.GetEntity(gs.entity[0]); + } + c.ptA = line->point[0]; + c.ptB = line->point[1]; + } else if(SS.GW.LockedInWorkplane() + && gs.lineSegments == 2 && gs.n == 2) + { + Entity *l0 = SK.GetEntity(gs.entity[0]), + *l1 = SK.GetEntity(gs.entity[1]); + + if((l1->group.v != SS.GW.activeGroup.v) || + (l1->construction && !(l0->construction))) + { + swap(l0, l1); + } + c.ptA = l1->point[0]; + c.ptB = l1->point[1]; + c.entityA = l0->h; + c.type = SYMMETRIC_LINE; + } else if(SS.GW.LockedInWorkplane() + && gs.lineSegments == 1 && gs.points == 2 && gs.n == 3) + { + c.ptA = gs.point[0]; + c.ptB = gs.point[1]; + c.entityA = gs.entity[0]; + c.type = SYMMETRIC_LINE; + } else { + Error("Bad selection for symmetric constraint. This constraint " + "can apply to:\n\n" + " * two points or a line segment " + "(symmetric about workplane's coordinate axis)\n" + " * line segment, and two points or a line segment " + "(symmetric about line segment)\n" + " * workplane, and two points or a line segment " + "(symmetric about workplane)\n"); + return; + } + if(c.type != 0) { + // Already done, symmetry about a line segment in a workplane + } else if(c.entityA.v == Entity::NO_ENTITY.v) { + // Horizontal / vertical symmetry, implicit symmetry plane + // normal to the workplane + if(c.workplane.v == Entity::FREE_IN_3D.v) { + Error("Must be locked in to workplane when constraining " + "symmetric without an explicit symmetry plane."); + return; + } + Vector pa = SK.GetEntity(c.ptA)->PointGetNum(); + Vector pb = SK.GetEntity(c.ptB)->PointGetNum(); + Vector dp = pa.Minus(pb); + EntityBase *norm = SK.GetEntity(c.workplane)->Normal();; + Vector u = norm->NormalU(), v = norm->NormalV(); + if(fabs(dp.Dot(u)) > fabs(dp.Dot(v))) { + c.type = SYMMETRIC_HORIZ; + } else { + c.type = SYMMETRIC_VERT; + } + if(gs.lineSegments == 1) { + // If this line segment is already constrained horiz or + // vert, then auto-remove that redundant constraint. + DeleteAllConstraintsFor(HORIZONTAL, (gs.entity[0]), + Entity::NO_ENTITY); + DeleteAllConstraintsFor(VERTICAL, (gs.entity[0]), + Entity::NO_ENTITY); + + } + } else { + // Symmetry with a symmetry plane specified explicitly. + c.type = SYMMETRIC; + } + AddConstraint(&c); + break; + + case GraphicsWindow::MNU_VERTICAL: + case GraphicsWindow::MNU_HORIZONTAL: { + hEntity ha, hb; + if(c.workplane.v == Entity::FREE_IN_3D.v) { + Error("Select workplane before constraining horiz/vert."); + return; + } + if(gs.lineSegments == 1 && gs.n == 1) { + c.entityA = gs.entity[0]; + Entity *e = SK.GetEntity(c.entityA); + ha = e->point[0]; + hb = e->point[1]; + } else if(gs.points == 2 && gs.n == 2) { + ha = c.ptA = gs.point[0]; + hb = c.ptB = gs.point[1]; + } else { + Error("Bad selection for horizontal / vertical constraint. " + "This constraint can apply to:\n\n" + " * two points\n" + " * a line segment\n"); + return; + } + if(id == GraphicsWindow::MNU_HORIZONTAL) { + c.type = HORIZONTAL; + } else { + c.type = VERTICAL; + } + AddConstraint(&c); + break; + } + + case GraphicsWindow::MNU_ORIENTED_SAME: { + if(gs.anyNormals == 2 && gs.n == 2) { + c.type = SAME_ORIENTATION; + c.entityA = gs.anyNormal[0]; + c.entityB = gs.anyNormal[1]; + } else { + Error("Bad selection for same orientation constraint. This " + "constraint can apply to:\n\n" + " * two normals\n"); + return; + } + SS.UndoRemember(); + + Entity *nfree = SK.GetEntity(c.entityA); + Entity *nref = SK.GetEntity(c.entityB); + if(nref->group.v == SS.GW.activeGroup.v) { + swap(nref, nfree); + } + if(nfree->group.v == SS.GW.activeGroup.v && + nref ->group.v != SS.GW.activeGroup.v) + { + // nfree is free, and nref is locked (since it came from a + // previous group); so let's force nfree aligned to nref, + // and make convergence easy + Vector ru = nref ->NormalU(), rv = nref ->NormalV(); + Vector fu = nfree->NormalU(), fv = nfree->NormalV(); + + if(fabs(fu.Dot(ru)) < fabs(fu.Dot(rv))) { + // There might be an odd*90 degree rotation about the + // normal vector; allow that, since the numerical + // constraint does + swap(ru, rv); + } + fu = fu.Dot(ru) > 0 ? ru : ru.ScaledBy(-1); + fv = fv.Dot(rv) > 0 ? rv : rv.ScaledBy(-1); + + nfree->NormalForceTo(Quaternion::From(fu, fv)); + } + AddConstraint(&c, false); + break; + } + + case GraphicsWindow::MNU_OTHER_ANGLE: + if(gs.constraints == 1 && gs.n == 0) { + Constraint *c = SK.GetConstraint(gs.constraint[0]); + if(c->type == ANGLE) { + SS.UndoRemember(); + c->other = !(c->other); + c->ModifyToSatisfy(); + break; + } + if(c->type == EQUAL_ANGLE) { + SS.UndoRemember(); + c->other = !(c->other); + SS.MarkGroupDirty(c->group); + SS.ScheduleGenerateAll(); + break; + } + } + Error("Must select an angle constraint."); + return; + + case GraphicsWindow::MNU_REFERENCE: + if(gs.constraints == 1 && gs.n == 0) { + Constraint *c = SK.GetConstraint(gs.constraint[0]); + if(c->HasLabel() && c->type != COMMENT) { + (c->reference) = !(c->reference); + SK.GetGroup(c->group)->clean = false; + SS.GenerateAll(); + break; + } + } + Error("Must select a constraint with associated label."); + return; + + case GraphicsWindow::MNU_ANGLE: + case GraphicsWindow::MNU_REF_ANGLE: { + if(gs.vectors == 2 && gs.n == 2) { + c.type = ANGLE; + c.entityA = gs.vector[0]; + c.entityB = gs.vector[1]; + c.valA = 0; + } else { + Error("Bad selection for angle constraint. This constraint " + "can apply to:\n\n" + " * two line segments\n" + " * a line segment and a normal\n" + " * two normals\n"); + return; + } + + Entity *ea = SK.GetEntity(c.entityA), + *eb = SK.GetEntity(c.entityB); + if(ea->type == Entity::LINE_SEGMENT && + eb->type == Entity::LINE_SEGMENT) + { + Vector a0 = SK.GetEntity(ea->point[0])->PointGetNum(), + a1 = SK.GetEntity(ea->point[1])->PointGetNum(), + b0 = SK.GetEntity(eb->point[0])->PointGetNum(), + b1 = SK.GetEntity(eb->point[1])->PointGetNum(); + if(a0.Equals(b0) || a1.Equals(b1)) { + // okay, vectors should be drawn in same sense + } else if(a0.Equals(b1) || a1.Equals(b0)) { + // vectors are in opposite sense + c.other = true; + } else { + // no shared point; not clear which intersection to draw + } + } + + if(id == GraphicsWindow::MNU_REF_ANGLE) { + c.reference = true; + } + + c.ModifyToSatisfy(); + AddConstraint(&c); + break; + } + + case GraphicsWindow::MNU_PARALLEL: + if(gs.vectors == 2 && gs.n == 2) { + c.type = PARALLEL; + c.entityA = gs.vector[0]; + c.entityB = gs.vector[1]; + } else if(gs.lineSegments == 1 && gs.arcs == 1 && gs.n == 2) { + Entity *line = SK.GetEntity(gs.entity[0]); + Entity *arc = SK.GetEntity(gs.entity[1]); + if(line->type == Entity::ARC_OF_CIRCLE) { + swap(line, arc); + } + Vector l0 = SK.GetEntity(line->point[0])->PointGetNum(), + l1 = SK.GetEntity(line->point[1])->PointGetNum(); + Vector a1 = SK.GetEntity(arc->point[1])->PointGetNum(), + a2 = SK.GetEntity(arc->point[2])->PointGetNum(); + + if(l0.Equals(a1) || l1.Equals(a1)) { + c.other = false; + } else if(l0.Equals(a2) || l1.Equals(a2)) { + c.other = true; + } else { + Error("The tangent arc and line segment must share an " + "endpoint. Constrain them with Constrain -> " + "On Point before constraining tangent."); + return; + } + c.type = ARC_LINE_TANGENT; + c.entityA = arc->h; + c.entityB = line->h; + } else if(gs.lineSegments == 1 && gs.cubics == 1 && gs.n == 2) { + Entity *line = SK.GetEntity(gs.entity[0]); + Entity *cubic = SK.GetEntity(gs.entity[1]); + if(line->type == Entity::CUBIC) { + swap(line, cubic); + } + Vector l0 = SK.GetEntity(line->point[0])->PointGetNum(), + l1 = SK.GetEntity(line->point[1])->PointGetNum(); + Vector as = cubic->CubicGetStartNum(), + af = cubic->CubicGetFinishNum(); + + if(l0.Equals(as) || l1.Equals(as)) { + c.other = false; + } else if(l0.Equals(af) || l1.Equals(af)) { + c.other = true; + } else { + Error("The tangent cubic and line segment must share an " + "endpoint. Constrain them with Constrain -> " + "On Point before constraining tangent."); + return; + } + c.type = CUBIC_LINE_TANGENT; + c.entityA = cubic->h; + c.entityB = line->h; + } else if(gs.cubics + gs.arcs == 2 && gs.n == 2) { + if(!SS.GW.LockedInWorkplane()) { + Error("Curve-curve tangency must apply in workplane."); + return; + } + Entity *eA = SK.GetEntity(gs.entity[0]), + *eB = SK.GetEntity(gs.entity[1]); + Vector as = eA->EndpointStart(), + af = eA->EndpointFinish(), + bs = eB->EndpointStart(), + bf = eB->EndpointFinish(); + if(as.Equals(bs)) { + c.other = false; c.other2 = false; + } else if(as.Equals(bf)) { + c.other = false; c.other2 = true; + } else if(af.Equals(bs)) { + c.other = true; c.other2 = false; + } else if(af.Equals(bf)) { + c.other = true; c.other2 = true; + } else { + Error("The curves must share an endpoint. Constrain them " + "with Constrain -> On Point before constraining " + "tangent."); + return; + } + c.type = CURVE_CURVE_TANGENT; + c.entityA = eA->h; + c.entityB = eB->h; + } else { + Error("Bad selection for parallel / tangent constraint. This " + "constraint can apply to:\n\n" + " * two line segments (parallel)\n" + " * a line segment and a normal (parallel)\n" + " * two normals (parallel)\n" + " * two line segments, arcs, or beziers, that share " + "an endpoint (tangent)\n"); + return; + } + AddConstraint(&c); + break; + + case GraphicsWindow::MNU_PERPENDICULAR: + if(gs.vectors == 2 && gs.n == 2) { + c.type = PERPENDICULAR; + c.entityA = gs.vector[0]; + c.entityB = gs.vector[1]; + } else { + Error("Bad selection for perpendicular constraint. This " + "constraint can apply to:\n\n" + " * two line segments\n" + " * a line segment and a normal\n" + " * two normals\n"); + return; + } + AddConstraint(&c); + break; + + case GraphicsWindow::MNU_WHERE_DRAGGED: + if(gs.points == 1 && gs.n == 1) { + c.type = WHERE_DRAGGED; + c.ptA = gs.point[0]; + } else { + Error("Bad selection for lock point where dragged constraint. " + "This constraint can apply to:\n\n" + " * a point\n"); + return; + } + AddConstraint(&c); + break; + + case GraphicsWindow::MNU_COMMENT: + SS.GW.pending.operation = GraphicsWindow::MNU_COMMENT; + SS.GW.pending.description = "click center of comment text"; + SS.ScheduleShowTW(); + break; + + default: oops(); + } + + SS.GW.ClearSelection(); + InvalidateGraphics(); +} + +#endif /* ! LIBRARY */ diff --git a/src/constrainteq.cpp b/src/constrainteq.cpp new file mode 100644 index 0000000..8acde19 --- /dev/null +++ b/src/constrainteq.cpp @@ -0,0 +1,794 @@ +//----------------------------------------------------------------------------- +// Given a constraint, generate one or more equations in our symbolic algebra +// system to represent that constraint; also various geometric helper +// functions for that. +// +// Copyright 2008-2013 Jonathan Westhues. +//----------------------------------------------------------------------------- +#include "solvespace.h" + +const hConstraint ConstraintBase::NO_CONSTRAINT = { 0 }; + +bool ConstraintBase::HasLabel(void) { + switch(type) { + case PT_LINE_DISTANCE: + case PT_PLANE_DISTANCE: + case PT_FACE_DISTANCE: + case PT_PT_DISTANCE: + case PROJ_PT_DISTANCE: + case DIAMETER: + case LENGTH_RATIO: + case LENGTH_DIFFERENCE: + case ANGLE: + case COMMENT: + return true; + + default: + return false; + } +} + +Expr *ConstraintBase::VectorsParallel(int eq, ExprVector a, ExprVector b) { + ExprVector r = a.Cross(b); + // Hairy ball theorem screws me here. There's no clean solution that I + // know, so let's pivot on the initial numerical guess. Our caller + // has ensured that if one of our input vectors is already known (e.g. + // it's from a previous group), then that one's in a; so that one's + // not going to move, and we should pivot on that one. + double mx = fabs((a.x)->Eval()); + double my = fabs((a.y)->Eval()); + double mz = fabs((a.z)->Eval()); + // The basis vector in which the vectors have the LEAST energy is the + // one that we should look at most (e.g. if both vectors lie in the xy + // plane, then the z component of the cross product is most important). + // So find the strongest component of a and b, and that's the component + // of the cross product to ignore. + Expr *e0, *e1; + if(mx > my && mx > mz) { + e0 = r.y; e1 = r.z; + } else if(my > mz) { + e0 = r.z; e1 = r.x; + } else { + e0 = r.x; e1 = r.y; + } + + if(eq == 0) return e0; + if(eq == 1) return e1; + oops(); +} + +Expr *ConstraintBase::PointLineDistance(hEntity wrkpl, hEntity hpt, hEntity hln) +{ + EntityBase *ln = SK.GetEntity(hln); + EntityBase *a = SK.GetEntity(ln->point[0]); + EntityBase *b = SK.GetEntity(ln->point[1]); + + EntityBase *p = SK.GetEntity(hpt); + + if(wrkpl.v == EntityBase::FREE_IN_3D.v) { + ExprVector ep = p->PointGetExprs(); + + ExprVector ea = a->PointGetExprs(); + ExprVector eb = b->PointGetExprs(); + ExprVector eab = ea.Minus(eb); + Expr *m = eab.Magnitude(); + + return ((eab.Cross(ea.Minus(ep))).Magnitude())->Div(m); + } else { + Expr *ua, *va, *ub, *vb; + a->PointGetExprsInWorkplane(wrkpl, &ua, &va); + b->PointGetExprsInWorkplane(wrkpl, &ub, &vb); + + Expr *du = ua->Minus(ub); + Expr *dv = va->Minus(vb); + + Expr *u, *v; + p->PointGetExprsInWorkplane(wrkpl, &u, &v); + + Expr *m = ((du->Square())->Plus(dv->Square()))->Sqrt(); + + Expr *proj = (dv->Times(ua->Minus(u)))->Minus( + (du->Times(va->Minus(v)))); + + return proj->Div(m); + } +} + +Expr *ConstraintBase::PointPlaneDistance(ExprVector p, hEntity hpl) { + ExprVector n; + Expr *d; + SK.GetEntity(hpl)->WorkplaneGetPlaneExprs(&n, &d); + return (p.Dot(n))->Minus(d); +} + +Expr *ConstraintBase::Distance(hEntity wrkpl, hEntity hpa, hEntity hpb) { + EntityBase *pa = SK.GetEntity(hpa); + EntityBase *pb = SK.GetEntity(hpb); + if(!(pa->IsPoint() && pb->IsPoint())) oops(); + + if(wrkpl.v == EntityBase::FREE_IN_3D.v) { + // This is true distance + ExprVector ea, eb, eab; + ea = pa->PointGetExprs(); + eb = pb->PointGetExprs(); + eab = ea.Minus(eb); + + return eab.Magnitude(); + } else { + // This is projected distance, in the given workplane. + Expr *au, *av, *bu, *bv; + + pa->PointGetExprsInWorkplane(wrkpl, &au, &av); + pb->PointGetExprsInWorkplane(wrkpl, &bu, &bv); + + Expr *du = au->Minus(bu); + Expr *dv = av->Minus(bv); + + return ((du->Square())->Plus(dv->Square()))->Sqrt(); + } +} + +//----------------------------------------------------------------------------- +// Return the cosine of the angle between two vectors. If a workplane is +// specified, then it's the cosine of their projections into that workplane. +//----------------------------------------------------------------------------- +Expr *ConstraintBase::DirectionCosine(hEntity wrkpl, + ExprVector ae, ExprVector be) +{ + if(wrkpl.v == EntityBase::FREE_IN_3D.v) { + Expr *mags = (ae.Magnitude())->Times(be.Magnitude()); + return (ae.Dot(be))->Div(mags); + } else { + EntityBase *w = SK.GetEntity(wrkpl); + ExprVector u = w->Normal()->NormalExprsU(); + ExprVector v = w->Normal()->NormalExprsV(); + Expr *ua = u.Dot(ae); + Expr *va = v.Dot(ae); + Expr *ub = u.Dot(be); + Expr *vb = v.Dot(be); + Expr *maga = (ua->Square()->Plus(va->Square()))->Sqrt(); + Expr *magb = (ub->Square()->Plus(vb->Square()))->Sqrt(); + Expr *dot = (ua->Times(ub))->Plus(va->Times(vb)); + return dot->Div(maga->Times(magb)); + } +} + +ExprVector ConstraintBase::PointInThreeSpace(hEntity workplane, + Expr *u, Expr *v) +{ + EntityBase *w = SK.GetEntity(workplane); + + ExprVector ub = w->Normal()->NormalExprsU(); + ExprVector vb = w->Normal()->NormalExprsV(); + ExprVector ob = w->WorkplaneGetOffsetExprs(); + + return (ub.ScaledBy(u)).Plus(vb.ScaledBy(v)).Plus(ob); +} + +void ConstraintBase::ModifyToSatisfy(void) { + if(type == ANGLE) { + Vector a = SK.GetEntity(entityA)->VectorGetNum(); + Vector b = SK.GetEntity(entityB)->VectorGetNum(); + if(other) a = a.ScaledBy(-1); + if(workplane.v != EntityBase::FREE_IN_3D.v) { + a = a.ProjectVectorInto(workplane); + b = b.ProjectVectorInto(workplane); + } + double c = (a.Dot(b))/(a.Magnitude() * b.Magnitude()); + valA = acos(c)*180/PI; + } else { + // We'll fix these ones up by looking at their symbolic equation; + // that means no extra work. + IdList l = {}; + // Generate the equations even if this is a reference dimension + GenerateReal(&l); + if(l.n != 1) oops(); + + // These equations are written in the form f(...) - d = 0, where + // d is the value of the valA. + valA += (l.elem[0].e)->Eval(); + + l.Clear(); + } +} + +void ConstraintBase::AddEq(IdList *l, Expr *expr, int index) +{ + Equation eq; + eq.e = expr; + eq.h = h.equation(index); + l->Add(&eq); +} + +void ConstraintBase::Generate(IdList *l) { + if(!reference) { + GenerateReal(l); + } +} +void ConstraintBase::GenerateReal(IdList *l) { + Expr *exA = Expr::From(valA); + + switch(type) { + case PT_PT_DISTANCE: + AddEq(l, Distance(workplane, ptA, ptB)->Minus(exA), 0); + break; + + case PROJ_PT_DISTANCE: { + ExprVector pA = SK.GetEntity(ptA)->PointGetExprs(), + pB = SK.GetEntity(ptB)->PointGetExprs(), + dp = pB.Minus(pA); + + ExprVector pp = SK.GetEntity(entityA)->VectorGetExprs(); + pp = pp.WithMagnitude(Expr::From(1.0)); + + AddEq(l, (dp.Dot(pp))->Minus(exA), 0); + break; + } + + case PT_LINE_DISTANCE: + AddEq(l, + PointLineDistance(workplane, ptA, entityA)->Minus(exA), 0); + break; + + case PT_PLANE_DISTANCE: { + ExprVector pt = SK.GetEntity(ptA)->PointGetExprs(); + AddEq(l, (PointPlaneDistance(pt, entityA))->Minus(exA), 0); + break; + } + + case PT_FACE_DISTANCE: { + ExprVector pt = SK.GetEntity(ptA)->PointGetExprs(); + EntityBase *f = SK.GetEntity(entityA); + ExprVector p0 = f->FaceGetPointExprs(); + ExprVector n = f->FaceGetNormalExprs(); + AddEq(l, (pt.Minus(p0)).Dot(n)->Minus(exA), 0); + break; + } + + case EQUAL_LENGTH_LINES: { + EntityBase *a = SK.GetEntity(entityA); + EntityBase *b = SK.GetEntity(entityB); + AddEq(l, Distance(workplane, a->point[0], a->point[1])->Minus( + Distance(workplane, b->point[0], b->point[1])), 0); + break; + } + + // These work on distance squared, since the pt-line distances are + // signed, and we want the absolute value. + case EQ_LEN_PT_LINE_D: { + EntityBase *forLen = SK.GetEntity(entityA); + Expr *d1 = Distance(workplane, forLen->point[0], forLen->point[1]); + Expr *d2 = PointLineDistance(workplane, ptA, entityB); + AddEq(l, (d1->Square())->Minus(d2->Square()), 0); + break; + } + case EQ_PT_LN_DISTANCES: { + Expr *d1 = PointLineDistance(workplane, ptA, entityA); + Expr *d2 = PointLineDistance(workplane, ptB, entityB); + AddEq(l, (d1->Square())->Minus(d2->Square()), 0); + break; + } + + case LENGTH_RATIO: { + EntityBase *a = SK.GetEntity(entityA); + EntityBase *b = SK.GetEntity(entityB); + Expr *la = Distance(workplane, a->point[0], a->point[1]); + Expr *lb = Distance(workplane, b->point[0], b->point[1]); + AddEq(l, (la->Div(lb))->Minus(exA), 0); + break; + } + + case LENGTH_DIFFERENCE: { + EntityBase *a = SK.GetEntity(entityA); + EntityBase *b = SK.GetEntity(entityB); + Expr *la = Distance(workplane, a->point[0], a->point[1]); + Expr *lb = Distance(workplane, b->point[0], b->point[1]); + AddEq(l, (la->Minus(lb))->Minus(exA), 0); + break; + } + + case DIAMETER: { + EntityBase *circle = SK.GetEntity(entityA); + Expr *r = circle->CircleGetRadiusExpr(); + AddEq(l, (r->Times(Expr::From(2)))->Minus(exA), 0); + break; + } + + case EQUAL_RADIUS: { + EntityBase *c1 = SK.GetEntity(entityA); + EntityBase *c2 = SK.GetEntity(entityB); + AddEq(l, (c1->CircleGetRadiusExpr())->Minus( + c2->CircleGetRadiusExpr()), 0); + break; + } + + case EQUAL_LINE_ARC_LEN: { + EntityBase *line = SK.GetEntity(entityA), + *arc = SK.GetEntity(entityB); + + // Get the line length + ExprVector l0 = SK.GetEntity(line->point[0])->PointGetExprs(), + l1 = SK.GetEntity(line->point[1])->PointGetExprs(); + Expr *ll = (l1.Minus(l0)).Magnitude(); + + // And get the arc radius, and the cosine of its angle + EntityBase *ao = SK.GetEntity(arc->point[0]), + *as = SK.GetEntity(arc->point[1]), + *af = SK.GetEntity(arc->point[2]); + + ExprVector aos = (as->PointGetExprs()).Minus(ao->PointGetExprs()), + aof = (af->PointGetExprs()).Minus(ao->PointGetExprs()); + Expr *r = aof.Magnitude(); + + ExprVector n = arc->Normal()->NormalExprsN(); + ExprVector u = aos.WithMagnitude(Expr::From(1.0)); + ExprVector v = n.Cross(u); + // so in our new csys, we start at (1, 0, 0) + Expr *costheta = aof.Dot(u)->Div(r); + Expr *sintheta = aof.Dot(v)->Div(r); + + double thetas, thetaf, dtheta; + arc->ArcGetAngles(&thetas, &thetaf, &dtheta); + Expr *theta; + if(dtheta < 3*PI/4) { + theta = costheta->ACos(); + } else if(dtheta < 5*PI/4) { + // As the angle crosses pi, cos theta is not invertible; + // so use the sine to stop blowing up + theta = Expr::From(PI)->Minus(sintheta->ASin()); + } else { + theta = (Expr::From(2*PI))->Minus(costheta->ACos()); + } + + // And write the equation; r*theta = L + AddEq(l, (r->Times(theta))->Minus(ll), 0); + break; + } + + case POINTS_COINCIDENT: { + EntityBase *a = SK.GetEntity(ptA); + EntityBase *b = SK.GetEntity(ptB); + if(workplane.v == EntityBase::FREE_IN_3D.v) { + ExprVector pa = a->PointGetExprs(); + ExprVector pb = b->PointGetExprs(); + AddEq(l, pa.x->Minus(pb.x), 0); + AddEq(l, pa.y->Minus(pb.y), 1); + AddEq(l, pa.z->Minus(pb.z), 2); + } else { + Expr *au, *av; + Expr *bu, *bv; + a->PointGetExprsInWorkplane(workplane, &au, &av); + b->PointGetExprsInWorkplane(workplane, &bu, &bv); + AddEq(l, au->Minus(bu), 0); + AddEq(l, av->Minus(bv), 1); + } + break; + } + + case PT_IN_PLANE: + // This one works the same, whether projected or not. + AddEq(l, PointPlaneDistance( + SK.GetEntity(ptA)->PointGetExprs(), entityA), 0); + break; + + case PT_ON_FACE: { + // a plane, n dot (p - p0) = 0 + ExprVector p = SK.GetEntity(ptA)->PointGetExprs(); + EntityBase *f = SK.GetEntity(entityA); + ExprVector p0 = f->FaceGetPointExprs(); + ExprVector n = f->FaceGetNormalExprs(); + AddEq(l, (p.Minus(p0)).Dot(n), 0); + break; + } + + case PT_ON_LINE: + if(workplane.v == EntityBase::FREE_IN_3D.v) { + EntityBase *ln = SK.GetEntity(entityA); + EntityBase *a = SK.GetEntity(ln->point[0]); + EntityBase *b = SK.GetEntity(ln->point[1]); + EntityBase *p = SK.GetEntity(ptA); + + ExprVector ep = p->PointGetExprs(); + ExprVector ea = a->PointGetExprs(); + ExprVector eb = b->PointGetExprs(); + ExprVector eab = ea.Minus(eb); + + // Construct a vector from the point to either endpoint of + // the line segment, and choose the longer of these. + ExprVector eap = ea.Minus(ep); + ExprVector ebp = eb.Minus(ep); + ExprVector elp = + (ebp.Magnitude()->Eval() > eap.Magnitude()->Eval()) ? + ebp : eap; + + if(p->group.v == group.v) { + AddEq(l, VectorsParallel(0, eab, elp), 0); + AddEq(l, VectorsParallel(1, eab, elp), 1); + } else { + AddEq(l, VectorsParallel(0, elp, eab), 0); + AddEq(l, VectorsParallel(1, elp, eab), 1); + } + } else { + AddEq(l, PointLineDistance(workplane, ptA, entityA), 0); + } + break; + + case PT_ON_CIRCLE: { + // This actually constrains the point to lie on the cylinder. + EntityBase *circle = SK.GetEntity(entityA); + ExprVector center = SK.GetEntity(circle->point[0])->PointGetExprs(); + ExprVector pt = SK.GetEntity(ptA)->PointGetExprs(); + EntityBase *normal = SK.GetEntity(circle->normal); + ExprVector u = normal->NormalExprsU(), + v = normal->NormalExprsV(); + + Expr *du = (center.Minus(pt)).Dot(u), + *dv = (center.Minus(pt)).Dot(v); + + Expr *r = circle->CircleGetRadiusExpr(); + + AddEq(l, + ((du->Square())->Plus(dv->Square()))->Minus(r->Square()), 0); + break; + } + + case AT_MIDPOINT: + if(workplane.v == EntityBase::FREE_IN_3D.v) { + EntityBase *ln = SK.GetEntity(entityA); + ExprVector a = SK.GetEntity(ln->point[0])->PointGetExprs(); + ExprVector b = SK.GetEntity(ln->point[1])->PointGetExprs(); + ExprVector m = (a.Plus(b)).ScaledBy(Expr::From(0.5)); + + if(ptA.v) { + ExprVector p = SK.GetEntity(ptA)->PointGetExprs(); + AddEq(l, (m.x)->Minus(p.x), 0); + AddEq(l, (m.y)->Minus(p.y), 1); + AddEq(l, (m.z)->Minus(p.z), 2); + } else { + AddEq(l, PointPlaneDistance(m, entityB), 0); + } + } else { + EntityBase *ln = SK.GetEntity(entityA); + EntityBase *a = SK.GetEntity(ln->point[0]); + EntityBase *b = SK.GetEntity(ln->point[1]); + + Expr *au, *av, *bu, *bv; + a->PointGetExprsInWorkplane(workplane, &au, &av); + b->PointGetExprsInWorkplane(workplane, &bu, &bv); + Expr *mu = Expr::From(0.5)->Times(au->Plus(bu)); + Expr *mv = Expr::From(0.5)->Times(av->Plus(bv)); + + if(ptA.v) { + EntityBase *p = SK.GetEntity(ptA); + Expr *pu, *pv; + p->PointGetExprsInWorkplane(workplane, &pu, &pv); + AddEq(l, pu->Minus(mu), 0); + AddEq(l, pv->Minus(mv), 1); + } else { + ExprVector m = PointInThreeSpace(workplane, mu, mv); + AddEq(l, PointPlaneDistance(m, entityB), 0); + } + } + break; + + case SYMMETRIC: + if(workplane.v == EntityBase::FREE_IN_3D.v) { + EntityBase *plane = SK.GetEntity(entityA); + EntityBase *ea = SK.GetEntity(ptA); + EntityBase *eb = SK.GetEntity(ptB); + ExprVector a = ea->PointGetExprs(); + ExprVector b = eb->PointGetExprs(); + + // The midpoint of the line connecting the symmetric points + // lies on the plane of the symmetry. + ExprVector m = (a.Plus(b)).ScaledBy(Expr::From(0.5)); + AddEq(l, PointPlaneDistance(m, plane->h), 0); + + // And projected into the plane of symmetry, the points are + // coincident. + Expr *au, *av, *bu, *bv; + ea->PointGetExprsInWorkplane(plane->h, &au, &av); + eb->PointGetExprsInWorkplane(plane->h, &bu, &bv); + AddEq(l, au->Minus(bu), 1); + AddEq(l, av->Minus(bv), 2); + } else { + EntityBase *plane = SK.GetEntity(entityA); + EntityBase *a = SK.GetEntity(ptA); + EntityBase *b = SK.GetEntity(ptB); + + Expr *au, *av, *bu, *bv; + a->PointGetExprsInWorkplane(workplane, &au, &av); + b->PointGetExprsInWorkplane(workplane, &bu, &bv); + Expr *mu = Expr::From(0.5)->Times(au->Plus(bu)); + Expr *mv = Expr::From(0.5)->Times(av->Plus(bv)); + + ExprVector m = PointInThreeSpace(workplane, mu, mv); + AddEq(l, PointPlaneDistance(m, plane->h), 0); + + // Construct a vector within the workplane that is normal + // to the symmetry pane's normal (i.e., that lies in the + // plane of symmetry). The line connecting the points is + // perpendicular to that constructed vector. + EntityBase *w = SK.GetEntity(workplane); + ExprVector u = w->Normal()->NormalExprsU(); + ExprVector v = w->Normal()->NormalExprsV(); + + ExprVector pa = a->PointGetExprs(); + ExprVector pb = b->PointGetExprs(); + ExprVector n; + Expr *d; + plane->WorkplaneGetPlaneExprs(&n, &d); + AddEq(l, (n.Cross(u.Cross(v))).Dot(pa.Minus(pb)), 1); + } + break; + + case SYMMETRIC_HORIZ: + case SYMMETRIC_VERT: { + EntityBase *a = SK.GetEntity(ptA); + EntityBase *b = SK.GetEntity(ptB); + + Expr *au, *av, *bu, *bv; + a->PointGetExprsInWorkplane(workplane, &au, &av); + b->PointGetExprsInWorkplane(workplane, &bu, &bv); + + if(type == SYMMETRIC_HORIZ) { + AddEq(l, av->Minus(bv), 0); + AddEq(l, au->Plus(bu), 1); + } else { + AddEq(l, au->Minus(bu), 0); + AddEq(l, av->Plus(bv), 1); + } + break; + } + + case SYMMETRIC_LINE: { + EntityBase *pa = SK.GetEntity(ptA); + EntityBase *pb = SK.GetEntity(ptB); + + Expr *pau, *pav, *pbu, *pbv; + pa->PointGetExprsInWorkplane(workplane, &pau, &pav); + pb->PointGetExprsInWorkplane(workplane, &pbu, &pbv); + + EntityBase *ln = SK.GetEntity(entityA); + EntityBase *la = SK.GetEntity(ln->point[0]); + EntityBase *lb = SK.GetEntity(ln->point[1]); + Expr *lau, *lav, *lbu, *lbv; + la->PointGetExprsInWorkplane(workplane, &lau, &lav); + lb->PointGetExprsInWorkplane(workplane, &lbu, &lbv); + + Expr *dpu = pbu->Minus(pau), *dpv = pbv->Minus(pav); + Expr *dlu = lbu->Minus(lau), *dlv = lbv->Minus(lav); + + // The line through the points is perpendicular to the line + // of symmetry. + AddEq(l, (dlu->Times(dpu))->Plus(dlv->Times(dpv)), 0); + + // And the signed distances of the points to the line are + // equal in magnitude and opposite in sign, so sum to zero + Expr *dista = (dlv->Times(lau->Minus(pau)))->Minus( + (dlu->Times(lav->Minus(pav)))); + Expr *distb = (dlv->Times(lau->Minus(pbu)))->Minus( + (dlu->Times(lav->Minus(pbv)))); + AddEq(l, dista->Plus(distb), 1); + + break; + } + + case HORIZONTAL: + case VERTICAL: { + hEntity ha, hb; + if(entityA.v) { + EntityBase *e = SK.GetEntity(entityA); + ha = e->point[0]; + hb = e->point[1]; + } else { + ha = ptA; + hb = ptB; + } + EntityBase *a = SK.GetEntity(ha); + EntityBase *b = SK.GetEntity(hb); + + Expr *au, *av, *bu, *bv; + a->PointGetExprsInWorkplane(workplane, &au, &av); + b->PointGetExprsInWorkplane(workplane, &bu, &bv); + + AddEq(l, (type == HORIZONTAL) ? av->Minus(bv) : au->Minus(bu), 0); + break; + } + + case SAME_ORIENTATION: { + EntityBase *a = SK.GetEntity(entityA); + EntityBase *b = SK.GetEntity(entityB); + if(b->group.v != group.v) { + swap(a, b); + } + + ExprVector au = a->NormalExprsU(), + an = a->NormalExprsN(); + ExprVector bu = b->NormalExprsU(), + bv = b->NormalExprsV(), + bn = b->NormalExprsN(); + + AddEq(l, VectorsParallel(0, an, bn), 0); + AddEq(l, VectorsParallel(1, an, bn), 1); + Expr *d1 = au.Dot(bv); + Expr *d2 = au.Dot(bu); + // Allow either orientation for the coordinate system, depending + // on how it was drawn. + if(fabs(d1->Eval()) < fabs(d2->Eval())) { + AddEq(l, d1, 2); + } else { + AddEq(l, d2, 2); + } + break; + } + + case PERPENDICULAR: + case ANGLE: { + EntityBase *a = SK.GetEntity(entityA); + EntityBase *b = SK.GetEntity(entityB); + ExprVector ae = a->VectorGetExprs(); + ExprVector be = b->VectorGetExprs(); + if(other) ae = ae.ScaledBy(Expr::From(-1)); + Expr *c = DirectionCosine(workplane, ae, be); + + if(type == ANGLE) { + // The direction cosine is equal to the cosine of the + // specified angle + Expr *rads = exA->Times(Expr::From(PI/180)), + *rc = rads->Cos(); + double arc = fabs(rc->Eval()); + // avoid false detection of inconsistent systems by gaining + // up as the difference in dot products gets small at small + // angles; doubles still have plenty of precision, only + // problem is that rank test + Expr *mult = Expr::From(arc > 0.99 ? 0.01/(1.00001 - arc) : 1); + AddEq(l, (c->Minus(rc))->Times(mult), 0); + } else { + // The dot product (and therefore the direction cosine) + // is equal to zero, perpendicular. + AddEq(l, c, 0); + } + break; + } + + case EQUAL_ANGLE: { + EntityBase *a = SK.GetEntity(entityA); + EntityBase *b = SK.GetEntity(entityB); + EntityBase *c = SK.GetEntity(entityC); + EntityBase *d = SK.GetEntity(entityD); + ExprVector ae = a->VectorGetExprs(); + ExprVector be = b->VectorGetExprs(); + ExprVector ce = c->VectorGetExprs(); + ExprVector de = d->VectorGetExprs(); + + if(other) ae = ae.ScaledBy(Expr::From(-1)); + + Expr *cab = DirectionCosine(workplane, ae, be); + Expr *ccd = DirectionCosine(workplane, ce, de); + + AddEq(l, cab->Minus(ccd), 0); + break; + } + + case ARC_LINE_TANGENT: { + EntityBase *arc = SK.GetEntity(entityA); + EntityBase *line = SK.GetEntity(entityB); + + ExprVector ac = SK.GetEntity(arc->point[0])->PointGetExprs(); + ExprVector ap = + SK.GetEntity(arc->point[other ? 2 : 1])->PointGetExprs(); + + ExprVector ld = line->VectorGetExprs(); + + // The line is perpendicular to the radius + AddEq(l, ld.Dot(ac.Minus(ap)), 0); + break; + } + + case CUBIC_LINE_TANGENT: { + EntityBase *cubic = SK.GetEntity(entityA); + EntityBase *line = SK.GetEntity(entityB); + + ExprVector a; + if(other) { + a = cubic->CubicGetFinishTangentExprs(); + } else { + a = cubic->CubicGetStartTangentExprs(); + } + + ExprVector b = line->VectorGetExprs(); + + if(workplane.v == EntityBase::FREE_IN_3D.v) { + AddEq(l, VectorsParallel(0, a, b), 0); + AddEq(l, VectorsParallel(1, a, b), 1); + } else { + EntityBase *w = SK.GetEntity(workplane); + ExprVector wn = w->Normal()->NormalExprsN(); + AddEq(l, (a.Cross(b)).Dot(wn), 0); + } + break; + } + + case CURVE_CURVE_TANGENT: { + bool parallel = true; + int i; + ExprVector dir[2]; + for(i = 0; i < 2; i++) { + EntityBase *e = SK.GetEntity((i == 0) ? entityA : entityB); + bool oth = (i == 0) ? other : other2; + + if(e->type == Entity::ARC_OF_CIRCLE) { + ExprVector center, endpoint; + center = SK.GetEntity(e->point[0])->PointGetExprs(); + endpoint = + SK.GetEntity(e->point[oth ? 2 : 1])->PointGetExprs(); + dir[i] = endpoint.Minus(center); + // We're using the vector from the center of the arc to + // an endpoint; so that's normal to the tangent, not + // parallel. + parallel = !parallel; + } else if(e->type == Entity::CUBIC) { + if(oth) { + dir[i] = e->CubicGetFinishTangentExprs(); + } else { + dir[i] = e->CubicGetStartTangentExprs(); + } + } else { + oops(); + } + } + if(parallel) { + EntityBase *w = SK.GetEntity(workplane); + ExprVector wn = w->Normal()->NormalExprsN(); + AddEq(l, ((dir[0]).Cross(dir[1])).Dot(wn), 0); + } else { + AddEq(l, (dir[0]).Dot(dir[1]), 0); + } + break; + } + + case PARALLEL: { + EntityBase *ea = SK.GetEntity(entityA), *eb = SK.GetEntity(entityB); + if(eb->group.v != group.v) { + swap(ea, eb); + } + ExprVector a = ea->VectorGetExprs(); + ExprVector b = eb->VectorGetExprs(); + + if(workplane.v == EntityBase::FREE_IN_3D.v) { + AddEq(l, VectorsParallel(0, a, b), 0); + AddEq(l, VectorsParallel(1, a, b), 1); + } else { + EntityBase *w = SK.GetEntity(workplane); + ExprVector wn = w->Normal()->NormalExprsN(); + AddEq(l, (a.Cross(b)).Dot(wn), 0); + } + break; + } + + case WHERE_DRAGGED: { + EntityBase *ep = SK.GetEntity(ptA); + if(workplane.v == EntityBase::FREE_IN_3D.v) { + ExprVector ev = ep->PointGetExprs(); + Vector v = ep->PointGetNum(); + + AddEq(l, ev.x->Minus(Expr::From(v.x)), 0); + AddEq(l, ev.y->Minus(Expr::From(v.y)), 1); + AddEq(l, ev.z->Minus(Expr::From(v.z)), 2); + } else { + Expr *u, *v; + ep->PointGetExprsInWorkplane(workplane, &u, &v); + AddEq(l, u->Minus(Expr::From(u->Eval())), 0); + AddEq(l, v->Minus(Expr::From(v->Eval())), 1); + } + break; + } + + case COMMENT: + break; + + default: oops(); + } +} + diff --git a/src/describescreen.cpp b/src/describescreen.cpp new file mode 100644 index 0000000..b91993f --- /dev/null +++ b/src/describescreen.cpp @@ -0,0 +1,377 @@ +//----------------------------------------------------------------------------- +// The screens when an entity is selected, that show some description of it-- +// endpoints of the lines, diameter of the circle, etc. +// +// Copyright 2008-2013 Jonathan Westhues. +//----------------------------------------------------------------------------- +#include "solvespace.h" + +void TextWindow::ScreenUnselectAll(int link, uint32_t v) { + GraphicsWindow::MenuEdit(GraphicsWindow::MNU_UNSELECT_ALL); +} + +void TextWindow::ScreenEditTtfText(int link, uint32_t v) { + hRequest hr = { v }; + Request *r = SK.GetRequest(hr); + + SS.TW.ShowEditControl(10, r->str); + SS.TW.edit.meaning = EDIT_TTF_TEXT; + SS.TW.edit.request = hr; +} + +#define gs (SS.GW.gs) +void TextWindow::ScreenSetTtfFont(int link, uint32_t v) { + int i = (int)v; + if(i < 0) return; + if(i >= SS.fonts.l.n) return; + + SS.GW.GroupSelection(); + if(gs.entities != 1 || gs.n != 1) return; + + Entity *e = SK.entity.FindByIdNoOops(gs.entity[0]); + if(!e || e->type != Entity::TTF_TEXT || !e->h.isFromRequest()) return; + + Request *r = SK.request.FindByIdNoOops(e->h.request()); + if(!r) return; + + SS.UndoRemember(); + r->font = SS.fonts.l.elem[i].FontFileBaseName(); + SS.MarkGroupDirty(r->group); + SS.ScheduleGenerateAll(); + SS.ScheduleShowTW(); +} + +void TextWindow::ScreenConstraintShowAsRadius(int link, uint32_t v) { + hConstraint hc = { v }; + Constraint *c = SK.GetConstraint(hc); + + SS.UndoRemember(); + c->other = !c->other; + + SS.ScheduleShowTW(); +} + +void TextWindow::DescribeSelection(void) { + Entity *e; + Vector p; + int i; + Printf(false, ""); + + if(gs.n == 1 && (gs.points == 1 || gs.entities == 1)) { + e = SK.GetEntity(gs.points == 1 ? gs.point[0] : gs.entity[0]); + +#define COSTR(p) \ + SS.MmToString((p).x).c_str(), \ + SS.MmToString((p).y).c_str(), \ + SS.MmToString((p).z).c_str() +#define PT_AS_STR "(%Fi%s%E, %Fi%s%E, %Fi%s%E)" +#define PT_AS_NUM "(%Fi%3%E, %Fi%3%E, %Fi%3%E)" + switch(e->type) { + case Entity::POINT_IN_3D: + case Entity::POINT_IN_2D: + case Entity::POINT_N_TRANS: + case Entity::POINT_N_ROT_TRANS: + case Entity::POINT_N_COPY: + case Entity::POINT_N_ROT_AA: + p = e->PointGetNum(); + Printf(false, "%FtPOINT%E at " PT_AS_STR, COSTR(p)); + break; + + case Entity::NORMAL_IN_3D: + case Entity::NORMAL_IN_2D: + case Entity::NORMAL_N_COPY: + case Entity::NORMAL_N_ROT: + case Entity::NORMAL_N_ROT_AA: { + Quaternion q = e->NormalGetNum(); + p = q.RotationN(); + Printf(false, "%FtNORMAL / COORDINATE SYSTEM%E"); + Printf(true, " basis n = " PT_AS_NUM, CO(p)); + p = q.RotationU(); + Printf(false, " u = " PT_AS_NUM, CO(p)); + p = q.RotationV(); + Printf(false, " v = " PT_AS_NUM, CO(p)); + break; + } + case Entity::WORKPLANE: { + p = SK.GetEntity(e->point[0])->PointGetNum(); + Printf(false, "%FtWORKPLANE%E"); + Printf(true, " origin = " PT_AS_STR, COSTR(p)); + Quaternion q = e->Normal()->NormalGetNum(); + p = q.RotationN(); + Printf(true, " normal = " PT_AS_NUM, CO(p)); + break; + } + case Entity::LINE_SEGMENT: { + Vector p0 = SK.GetEntity(e->point[0])->PointGetNum(); + p = p0; + Printf(false, "%FtLINE SEGMENT%E"); + Printf(true, " thru " PT_AS_STR, COSTR(p)); + Vector p1 = SK.GetEntity(e->point[1])->PointGetNum(); + p = p1; + Printf(false, " " PT_AS_STR, COSTR(p)); + Printf(true, " len = %Fi%s%E", + SS.MmToString((p1.Minus(p0).Magnitude())).c_str()); + break; + } + case Entity::CUBIC_PERIODIC: + case Entity::CUBIC: + int pts; + if(e->type == Entity::CUBIC_PERIODIC) { + Printf(false, "%FtPERIODIC C2 CUBIC SPLINE%E"); + pts = (3 + e->extraPoints); + } else if(e->extraPoints > 0) { + Printf(false, "%FtINTERPOLATING C2 CUBIC SPLINE%E"); + pts = (4 + e->extraPoints); + } else { + Printf(false, "%FtCUBIC BEZIER CURVE%E"); + pts = 4; + } + for(i = 0; i < pts; i++) { + p = SK.GetEntity(e->point[i])->PointGetNum(); + Printf((i==0), " p%d = " PT_AS_STR, i, COSTR(p)); + } + break; + + case Entity::ARC_OF_CIRCLE: { + Printf(false, "%FtARC OF A CIRCLE%E"); + p = SK.GetEntity(e->point[0])->PointGetNum(); + Printf(true, " center = " PT_AS_STR, COSTR(p)); + p = SK.GetEntity(e->point[1])->PointGetNum(); + Printf(true, " endpoints = " PT_AS_STR, COSTR(p)); + p = SK.GetEntity(e->point[2])->PointGetNum(); + Printf(false, " " PT_AS_STR, COSTR(p)); + double r = e->CircleGetRadiusNum(); + Printf(true, " diameter = %Fi%s", SS.MmToString(r*2).c_str()); + Printf(false, " radius = %Fi%s", SS.MmToString(r).c_str()); + double thetas, thetaf, dtheta; + e->ArcGetAngles(&thetas, &thetaf, &dtheta); + Printf(false, " arc len = %Fi%s", SS.MmToString(dtheta*r).c_str()); + break; + } + case Entity::CIRCLE: { + Printf(false, "%FtCIRCLE%E"); + p = SK.GetEntity(e->point[0])->PointGetNum(); + Printf(true, " center = " PT_AS_STR, COSTR(p)); + double r = e->CircleGetRadiusNum(); + Printf(true, " diameter = %Fi%s", SS.MmToString(r*2).c_str()); + Printf(false, " radius = %Fi%s", SS.MmToString(r).c_str()); + break; + } + case Entity::FACE_NORMAL_PT: + case Entity::FACE_XPROD: + case Entity::FACE_N_ROT_TRANS: + case Entity::FACE_N_ROT_AA: + case Entity::FACE_N_TRANS: + Printf(false, "%FtPLANE FACE%E"); + p = e->FaceGetNormalNum(); + Printf(true, " normal = " PT_AS_NUM, CO(p)); + p = e->FaceGetPointNum(); + Printf(false, " thru = " PT_AS_STR, COSTR(p)); + break; + + case Entity::TTF_TEXT: { + Printf(false, "%FtTRUETYPE FONT TEXT%E"); + Printf(true, " font = '%Fi%s%E'", e->font.c_str()); + if(e->h.isFromRequest()) { + Printf(false, " text = '%Fi%s%E' %Fl%Ll%f%D[change]%E", + e->str.c_str(), &ScreenEditTtfText, e->h.request().v); + Printf(true, " select new font"); + SS.fonts.LoadAll(); + int i; + for(i = 0; i < SS.fonts.l.n; i++) { + TtfFont *tf = &(SS.fonts.l.elem[i]); + if(e->font == tf->FontFileBaseName()) { + Printf(false, "%Bp %s", + (i & 1) ? 'd' : 'a', + tf->name.c_str()); + } else { + Printf(false, "%Bp %f%D%Fl%Ll%s%E%Bp", + (i & 1) ? 'd' : 'a', + &ScreenSetTtfFont, i, + tf->name.c_str(), + (i & 1) ? 'd' : 'a'); + } + } + } else { + Printf(false, " text = '%Fi%s%E'", e->str.c_str()); + } + break; + } + + default: + Printf(true, "%Ft?? ENTITY%E"); + break; + } + + Group *g = SK.GetGroup(e->group); + Printf(false, ""); + Printf(false, "%FtIN GROUP%E %s", g->DescriptionString().c_str()); + if(e->workplane.v == Entity::FREE_IN_3D.v) { + Printf(false, "%FtNOT LOCKED IN WORKPLANE%E"); + } else { + Entity *w = SK.GetEntity(e->workplane); + Printf(false, "%FtIN WORKPLANE%E %s", w->DescriptionString().c_str()); + } + if(e->style.v) { + Style *s = Style::Get(e->style); + Printf(false, "%FtIN STYLE%E %s", s->DescriptionString().c_str()); + } else { + Printf(false, "%FtIN STYLE%E none"); + } + if(e->construction) { + Printf(false, "%FtCONSTRUCTION"); + } + } else if(gs.n == 2 && gs.points == 2) { + Printf(false, "%FtTWO POINTS"); + Vector p0 = SK.GetEntity(gs.point[0])->PointGetNum(); + Printf(true, " at " PT_AS_STR, COSTR(p0)); + Vector p1 = SK.GetEntity(gs.point[1])->PointGetNum(); + Printf(false, " " PT_AS_STR, COSTR(p1)); + double d = (p1.Minus(p0)).Magnitude(); + Printf(true, " d = %Fi%s", SS.MmToString(d).c_str()); + } else if(gs.n == 2 && gs.points == 1 && gs.circlesOrArcs == 1) { + Entity *ec = SK.GetEntity(gs.entity[0]); + if(ec->type == Entity::CIRCLE) { + Printf(false, "%FtPOINT AND A CIRCLE"); + } else if(ec->type == Entity::ARC_OF_CIRCLE) { + Printf(false, "%FtPOINT AND AN ARC"); + } else oops(); + Vector p = SK.GetEntity(gs.point[0])->PointGetNum(); + Printf(true, " pt at " PT_AS_STR, COSTR(p)); + Vector c = SK.GetEntity(ec->point[0])->PointGetNum(); + Printf(true, " center = " PT_AS_STR, COSTR(c)); + double r = ec->CircleGetRadiusNum(); + Printf(false, " diameter = %Fi%s", SS.MmToString(r*2).c_str()); + Printf(false, " radius = %Fi%s", SS.MmToString(r).c_str()); + double d = (p.Minus(c)).Magnitude() - r; + Printf(true, " distance = %Fi%s", SS.MmToString(d).c_str()); + } else if(gs.n == 2 && gs.faces == 1 && gs.points == 1) { + Printf(false, "%FtA POINT AND A PLANE FACE"); + Vector pt = SK.GetEntity(gs.point[0])->PointGetNum(); + Printf(true, " point = " PT_AS_STR, COSTR(pt)); + Vector n = SK.GetEntity(gs.face[0])->FaceGetNormalNum(); + Printf(true, " plane normal = " PT_AS_NUM, CO(n)); + Vector pl = SK.GetEntity(gs.face[0])->FaceGetPointNum(); + Printf(false, " plane thru = " PT_AS_STR, COSTR(pl)); + double dd = n.Dot(pl) - n.Dot(pt); + Printf(true, " distance = %Fi%s", SS.MmToString(dd).c_str()); + } else if(gs.n == 3 && gs.points == 2 && gs.vectors == 1) { + Printf(false, "%FtTWO POINTS AND A VECTOR"); + Vector p0 = SK.GetEntity(gs.point[0])->PointGetNum(); + Printf(true, " pointA = " PT_AS_STR, COSTR(p0)); + Vector p1 = SK.GetEntity(gs.point[1])->PointGetNum(); + Printf(false, " pointB = " PT_AS_STR, COSTR(p1)); + Vector v = SK.GetEntity(gs.vector[0])->VectorGetNum(); + v = v.WithMagnitude(1); + Printf(true, " vector = " PT_AS_NUM, CO(v)); + double d = (p1.Minus(p0)).Dot(v); + Printf(true, " proj_d = %Fi%s", SS.MmToString(d).c_str()); + } else if(gs.n == 2 && gs.lineSegments == 1 && gs.points == 1) { + Entity *ln = SK.GetEntity(gs.entity[0]); + Vector lp0 = SK.GetEntity(ln->point[0])->PointGetNum(), + lp1 = SK.GetEntity(ln->point[1])->PointGetNum(); + Printf(false, "%FtLINE SEGMENT AND POINT%E"); + Printf(true, " ln thru " PT_AS_STR, COSTR(lp0)); + Printf(false, " " PT_AS_STR, COSTR(lp1)); + Vector pp = SK.GetEntity(gs.point[0])->PointGetNum(); + Printf(true, " point " PT_AS_STR, COSTR(pp)); + Printf(true, " pt-ln distance = %Fi%s%E", + SS.MmToString(pp.DistanceToLine(lp0, lp1.Minus(lp0))).c_str()); + } else if(gs.n == 2 && gs.vectors == 2) { + Printf(false, "%FtTWO VECTORS"); + + Vector v0 = SK.GetEntity(gs.entity[0])->VectorGetNum(), + v1 = SK.GetEntity(gs.entity[1])->VectorGetNum(); + v0 = v0.WithMagnitude(1); + v1 = v1.WithMagnitude(1); + + Printf(true, " vectorA = " PT_AS_NUM, CO(v0)); + Printf(false, " vectorB = " PT_AS_NUM, CO(v1)); + + double theta = acos(v0.Dot(v1)); + Printf(true, " angle = %Fi%2%E degrees", theta*180/PI); + while(theta < PI/2) theta += PI; + while(theta > PI/2) theta -= PI; + Printf(false, " or angle = %Fi%2%E (mod 180)", theta*180/PI); + } else if(gs.n == 2 && gs.faces == 2) { + Printf(false, "%FtTWO PLANE FACES"); + + Vector n0 = SK.GetEntity(gs.face[0])->FaceGetNormalNum(); + Printf(true, " planeA normal = " PT_AS_NUM, CO(n0)); + Vector p0 = SK.GetEntity(gs.face[0])->FaceGetPointNum(); + Printf(false, " planeA thru = " PT_AS_STR, COSTR(p0)); + + Vector n1 = SK.GetEntity(gs.face[1])->FaceGetNormalNum(); + Printf(true, " planeB normal = " PT_AS_NUM, CO(n1)); + Vector p1 = SK.GetEntity(gs.face[1])->FaceGetPointNum(); + Printf(false, " planeB thru = " PT_AS_STR, COSTR(p1)); + + double theta = acos(n0.Dot(n1)); + Printf(true, " angle = %Fi%2%E degrees", theta*180/PI); + while(theta < PI/2) theta += PI; + while(theta > PI/2) theta -= PI; + Printf(false, " or angle = %Fi%2%E (mod 180)", theta*180/PI); + + if(fabs(theta) < 0.01) { + double d = (p1.Minus(p0)).Dot(n0); + Printf(true, " distance = %Fi%s", SS.MmToString(d).c_str()); + } + } else if(gs.n == 0 && gs.stylables > 0) { + Printf(false, "%FtSELECTED:%E comment text"); + } else if(gs.n == 0 && gs.constraints == 1) { + Constraint *c = SK.GetConstraint(gs.constraint[0]); + + if(c->type == Constraint::DIAMETER) { + Printf(false, "%FtDIAMETER CONSTRAINT"); + + Printf(true, " %Fd%f%D%Ll%s show as radius", + &ScreenConstraintShowAsRadius, gs.constraint[0].v, + c->other ? CHECK_TRUE : CHECK_FALSE); + } else { + Printf(false, "%FtSELECTED:%E %s", + c->DescriptionString().c_str()); + } + } else { + int n = SS.GW.selection.n; + Printf(false, "%FtSELECTED:%E %d item%s", n, n == 1 ? "" : "s"); + } + + if(shown.screen == SCREEN_STYLE_INFO && + shown.style.v >= Style::FIRST_CUSTOM && gs.stylables > 0) + { + // If we are showing a screen for a particular style, then offer the + // option to assign our selected entities to that style. + Style *s = Style::Get(shown.style); + Printf(true, "%Fl%D%f%Ll(assign to style %s)%E", + shown.style.v, + &ScreenAssignSelectionToStyle, + s->DescriptionString().c_str()); + } + // If any of the selected entities have an assigned style, then offer + // the option to remove that style. + bool styleAssigned = false; + for(i = 0; i < gs.entities; i++) { + Entity *e = SK.GetEntity(gs.entity[i]); + if(e->style.v != 0) { + styleAssigned = true; + } + } + for(i = 0; i < gs.constraints; i++) { + Constraint *c = SK.GetConstraint(gs.constraint[i]); + if(c->type == Constraint::COMMENT && c->disp.style.v != 0) { + styleAssigned = true; + } + } + if(styleAssigned) { + Printf(true, "%Fl%D%f%Ll(remove assigned style)%E", + 0, + &ScreenAssignSelectionToStyle); + } + + Printf(true, "%Fl%f%Ll(unselect all)%E", &TextWindow::ScreenUnselectAll); +} + +void TextWindow::GoToScreen(int screen) { + shown.screen = screen; +} + diff --git a/src/draw.cpp b/src/draw.cpp new file mode 100644 index 0000000..64f10ca --- /dev/null +++ b/src/draw.cpp @@ -0,0 +1,872 @@ +//----------------------------------------------------------------------------- +// The root function to paint our graphics window, after setting up all the +// views and such appropriately. Also contains all the stuff to manage the +// selection. +// +// Copyright 2008-2013 Jonathan Westhues. +//----------------------------------------------------------------------------- +#include "solvespace.h" + +bool GraphicsWindow::Selection::Equals(Selection *b) { + if(entity.v != b->entity.v) return false; + if(constraint.v != b->constraint.v) return false; + return true; +} + +bool GraphicsWindow::Selection::IsEmpty(void) { + if(entity.v) return false; + if(constraint.v) return false; + return true; +} + +bool GraphicsWindow::Selection::HasEndpoints(void) { + if(!entity.v) return false; + Entity *e = SK.GetEntity(entity); + return e->HasEndpoints(); +} + +void GraphicsWindow::Selection::Clear(void) { + entity.v = constraint.v = 0; + emphasized = false; +} + +void GraphicsWindow::Selection::Draw(void) { + Vector refp = Vector::From(0, 0, 0); + if(entity.v) { + Entity *e = SK.GetEntity(entity); + e->Draw(/*drawAsHidden=*/false); + if(emphasized) refp = e->GetReferencePos(); + } + if(constraint.v) { + Constraint *c = SK.GetConstraint(constraint); + c->Draw(); + if(emphasized) refp = c->GetReferencePos(); + } + if(emphasized && (constraint.v || entity.v)) { + // We want to emphasize this constraint or entity, by drawing a thick + // line from the top left corner of the screen to the reference point + // of that entity or constraint. + double s = 0.501/SS.GW.scale; + Vector topLeft = SS.GW.projRight.ScaledBy(-SS.GW.width*s); + topLeft = topLeft.Plus(SS.GW.projUp.ScaledBy(SS.GW.height*s)); + topLeft = topLeft.Minus(SS.GW.offset); + + ssglLineWidth(40); + RgbaColor rgb = Style::Color(Style::HOVERED); + glColor4d(rgb.redF(), rgb.greenF(), rgb.blueF(), 0.2); + glBegin(GL_LINES); + ssglVertex3v(topLeft); + ssglVertex3v(refp); + glEnd(); + ssglLineWidth(1); + } +} + +void GraphicsWindow::ClearSelection(void) { + selection.Clear(); + SS.ScheduleShowTW(); + InvalidateGraphics(); +} + +void GraphicsWindow::ClearNonexistentSelectionItems(void) { + bool change = false; + Selection *s; + selection.ClearTags(); + for(s = selection.First(); s; s = selection.NextAfter(s)) { + if(s->constraint.v && !(SK.constraint.FindByIdNoOops(s->constraint))) { + s->tag = 1; + change = true; + } + if(s->entity.v && !(SK.entity.FindByIdNoOops(s->entity))) { + s->tag = 1; + change = true; + } + } + selection.RemoveTagged(); + if(change) InvalidateGraphics(); +} + +//----------------------------------------------------------------------------- +// Is this entity/constraint selected? +//----------------------------------------------------------------------------- +bool GraphicsWindow::IsSelected(hEntity he) { + Selection s = {}; + s.entity = he; + return IsSelected(&s); +} +bool GraphicsWindow::IsSelected(Selection *st) { + Selection *s; + for(s = selection.First(); s; s = selection.NextAfter(s)) { + if(s->Equals(st)) { + return true; + } + } + return false; +} + +//----------------------------------------------------------------------------- +// Unselect an item, if it is selected. We can either unselect just that item, +// or also unselect any coincident points. The latter is useful if the user +// somehow selects two coincident points (like with select all), because it +// would otherwise be impossible to de-select the lower of the two. +//----------------------------------------------------------------------------- +void GraphicsWindow::MakeUnselected(hEntity he, bool coincidentPointTrick) { + Selection stog = {}; + stog.entity = he; + MakeUnselected(&stog, coincidentPointTrick); +} +void GraphicsWindow::MakeUnselected(Selection *stog, bool coincidentPointTrick){ + if(stog->IsEmpty()) return; + + Selection *s; + + // If an item was selected, then we just un-select it. + selection.ClearTags(); + for(s = selection.First(); s; s = selection.NextAfter(s)) { + if(s->Equals(stog)) { + s->tag = 1; + } + } + // If two points are coincident, then it's impossible to hover one of + // them. But make sure to deselect both, to avoid mysterious seeming + // inability to deselect if the bottom one did somehow get selected. + if(stog->entity.v && coincidentPointTrick) { + Entity *e = SK.GetEntity(stog->entity); + if(e->IsPoint()) { + Vector ep = e->PointGetNum(); + for(s = selection.First(); s; s = selection.NextAfter(s)) { + if(!s->entity.v) continue; + if(s->entity.v == stog->entity.v) continue; + Entity *se = SK.GetEntity(s->entity); + if(!se->IsPoint()) continue; + if(ep.Equals(se->PointGetNum())) { + s->tag = 1; + } + } + } + } + selection.RemoveTagged(); +} + +//----------------------------------------------------------------------------- +// Select an item, if it isn't selected already. +//----------------------------------------------------------------------------- +void GraphicsWindow::MakeSelected(hEntity he) { + Selection stog = {}; + stog.entity = he; + MakeSelected(&stog); +} + +void GraphicsWindow::MakeSelected(hConstraint hc) { + Selection stog = {}; + stog.constraint = hc; + MakeSelected(&stog); +} + +void GraphicsWindow::MakeSelected(Selection *stog) { + if(stog->IsEmpty()) return; + if(IsSelected(stog)) return; + + if(stog->entity.v != 0 && SK.GetEntity(stog->entity)->IsFace()) { + // In the interest of speed for the triangle drawing code, + // only two faces may be selected at a time. + int c = 0; + Selection *s; + selection.ClearTags(); + for(s = selection.First(); s; s = selection.NextAfter(s)) { + hEntity he = s->entity; + if(he.v != 0 && SK.GetEntity(he)->IsFace()) { + c++; + if(c >= 2) s->tag = 1; + } + } + selection.RemoveTagged(); + } + + selection.Add(stog); +} + +//----------------------------------------------------------------------------- +// Select everything that lies within the marquee view-aligned rectangle. For +// points, we test by the point location. For normals, we test by the normal's +// associated point. For anything else, we test by any piecewise linear edge. +//----------------------------------------------------------------------------- +void GraphicsWindow::SelectByMarquee(void) { + Point2d begin = ProjectPoint(orig.marqueePoint); + double xmin = min(orig.mouse.x, begin.x), + xmax = max(orig.mouse.x, begin.x), + ymin = min(orig.mouse.y, begin.y), + ymax = max(orig.mouse.y, begin.y); + + Entity *e; + for(e = SK.entity.First(); e; e = SK.entity.NextAfter(e)) { + if(e->group.v != SS.GW.activeGroup.v) continue; + if(e->IsFace() || e->IsDistance()) continue; + if(!e->IsVisible()) continue; + + if(e->IsPoint() || e->IsNormal()) { + Vector p = e->IsPoint() ? e->PointGetNum() : + SK.GetEntity(e->point[0])->PointGetNum(); + Point2d pp = ProjectPoint(p); + if(pp.x >= xmin && pp.x <= xmax && + pp.y >= ymin && pp.y <= ymax) + { + MakeSelected(e->h); + } + } else { + // Use the 3d bounding box test routines, to avoid duplication; + // so let our bounding square become a bounding box that certainly + // includes the z = 0 plane. + Vector ptMin = Vector::From(xmin, ymin, -1), + ptMax = Vector::From(xmax, ymax, 1); + SEdgeList sel = {}; + e->GenerateEdges(&sel, true); + SEdge *se; + for(se = sel.l.First(); se; se = sel.l.NextAfter(se)) { + Point2d ppa = ProjectPoint(se->a), + ppb = ProjectPoint(se->b); + Vector ptA = Vector::From(ppa.x, ppa.y, 0), + ptB = Vector::From(ppb.x, ppb.y, 0); + if(Vector::BoundingBoxIntersectsLine(ptMax, ptMin, + ptA, ptB, true) || + !ptA.OutsideAndNotOn(ptMax, ptMin) || + !ptB.OutsideAndNotOn(ptMax, ptMin)) + { + MakeSelected(e->h); + break; + } + } + sel.Clear(); + } + } +} + +//----------------------------------------------------------------------------- +// Sort the selection according to various critieria: the entities and +// constraints separately, counts of certain types of entities (circles, +// lines, etc.), and so on. +//----------------------------------------------------------------------------- +void GraphicsWindow::GroupSelection(void) { + gs = {}; + int i; + for(i = 0; i < selection.n; i++) { + Selection *s = &(selection.elem[i]); + if(s->entity.v) { + (gs.n)++; + + Entity *e = SK.entity.FindById(s->entity); + + if(e->IsStylable()) gs.stylables++; + + // A list of points, and a list of all entities that aren't points. + if(e->IsPoint()) { + gs.points++; + gs.point.push_back(s->entity); + } else { + gs.entities++; + gs.entity.push_back(s->entity); + } + + // And an auxiliary list of normals, including normals from + // workplanes. + if(e->IsNormal()) { + gs.anyNormals++; + gs.anyNormal.push_back(s->entity); + } else if(e->IsWorkplane()) { + gs.anyNormals++; + gs.anyNormal.push_back(e->Normal()->h); + } + + // And of vectors (i.e., stuff with a direction to constrain) + if(e->HasVector()) { + gs.vectors++; + gs.vector.push_back(s->entity); + } + + // Faces (which are special, associated/drawn with triangles) + if(e->IsFace()) { + gs.faces++; + gs.face.push_back(s->entity); + } + + if(e->HasEndpoints()) { + (gs.withEndpoints)++; + } + + // And some aux counts too + switch(e->type) { + case Entity::WORKPLANE: (gs.workplanes)++; break; + case Entity::LINE_SEGMENT: (gs.lineSegments)++; break; + case Entity::CUBIC: (gs.cubics)++; break; + case Entity::CUBIC_PERIODIC: (gs.periodicCubics)++; break; + + case Entity::ARC_OF_CIRCLE: + (gs.circlesOrArcs)++; + (gs.arcs)++; + break; + + case Entity::CIRCLE: (gs.circlesOrArcs)++; break; + } + } + if(s->constraint.v) { + gs.constraints++; + gs.constraint.push_back(s->constraint); + Constraint *c = SK.GetConstraint(s->constraint); + if(c->IsStylable()) gs.stylables++; + if(c->HasLabel()) gs.constraintLabels++; + } + } +} + +void GraphicsWindow::HitTestMakeSelection(Point2d mp) { + int i; + double d, dmin = 1e12; + Selection s = {}; + + // Did the view projection change? If so, invalidate bounding boxes. + if(!offset.EqualsExactly(cached.offset) || + !projRight.EqualsExactly(cached.projRight) || + !projUp.EqualsExactly(cached.projUp) || + EXACT(scale != cached.scale)) { + cached.offset = offset; + cached.projRight = projRight; + cached.projUp = projUp; + cached.scale = scale; + for(Entity *e = SK.entity.First(); e; e = SK.entity.NextAfter(e)) { + e->screenBBoxValid = false; + } + } + + // Always do the entities; we might be dragging something that should + // be auto-constrained, and we need the hover for that. + for(i = 0; i < SK.entity.n; i++) { + Entity *e = &(SK.entity.elem[i]); + // Don't hover whatever's being dragged. + if(e->h.request().v == pending.point.request().v) { + // The one exception is when we're creating a new cubic; we + // want to be able to hover the first point, because that's + // how we turn it into a periodic spline. + if(!e->IsPoint()) continue; + if(!e->h.isFromRequest()) continue; + Request *r = SK.GetRequest(e->h.request()); + if(r->type != Request::CUBIC) continue; + if(r->extraPoints < 2) continue; + if(e->h.v != r->h.entity(1).v) continue; + } + + d = e->GetDistance(mp); + if(d < SELECTION_RADIUS && d < dmin) { + s = {}; + s.entity = e->h; + dmin = d; + } + } + + // The constraints and faces happen only when nothing's in progress. + if(pending.operation == 0) { + // Constraints + for(i = 0; i < SK.constraint.n; i++) { + d = SK.constraint.elem[i].GetDistance(mp); + if(d < SELECTION_RADIUS && d < dmin) { + s = {}; + s.constraint = SK.constraint.elem[i].h; + dmin = d; + } + } + + // Faces, from the triangle mesh; these are lowest priority + if(s.constraint.v == 0 && s.entity.v == 0 && showShaded && showFaces) { + Group *g = SK.GetGroup(activeGroup); + SMesh *m = &(g->displayMesh); + + uint32_t v = m->FirstIntersectionWith(mp); + if(v) { + s.entity.v = v; + } + } + } + + if(!s.Equals(&hover)) { + hover = s; + PaintGraphics(); + } +} + +//----------------------------------------------------------------------------- +// Project a point in model space to screen space, exactly as gl would; return +// units are pixels. +//----------------------------------------------------------------------------- +Point2d GraphicsWindow::ProjectPoint(Vector p) { + Vector p3 = ProjectPoint3(p); + Point2d p2 = { p3.x, p3.y }; + return p2; +} +//----------------------------------------------------------------------------- +// Project a point in model space to screen space, exactly as gl would; return +// units are pixels. The z coordinate is also returned, also in pixels. +//----------------------------------------------------------------------------- +Vector GraphicsWindow::ProjectPoint3(Vector p) { + double w; + Vector r = ProjectPoint4(p, &w); + return r.ScaledBy(scale/w); +} +//----------------------------------------------------------------------------- +// Project a point in model space halfway into screen space. The scale is +// not applied, and the perspective divide isn't applied; instead the w +// coordinate is returned separately. +//----------------------------------------------------------------------------- +Vector GraphicsWindow::ProjectPoint4(Vector p, double *w) { + p = p.Plus(offset); + + Vector r; + r.x = p.Dot(projRight); + r.y = p.Dot(projUp); + r.z = p.Dot(projUp.Cross(projRight)); + + *w = 1 + r.z*SS.CameraTangent()*scale; + return r; +} + +//----------------------------------------------------------------------------- +// Return a point in the plane parallel to the screen and through the offset, +// that projects onto the specified (x, y) coordinates. +//----------------------------------------------------------------------------- +Vector GraphicsWindow::UnProjectPoint(Point2d p) { + Vector orig = offset.ScaledBy(-1); + + // Note that we ignoring the effects of perspective. Since our returned + // point has the same component normal to the screen as the offset, it + // will have z = 0 after the rotation is applied, thus w = 1. So this is + // correct. + orig = orig.Plus(projRight.ScaledBy(p.x / scale)).Plus( + projUp. ScaledBy(p.y / scale)); + return orig; +} + +Vector GraphicsWindow::UnProjectPoint3(Vector p) { + p.z = p.z / (scale - p.z * SS.CameraTangent() * scale); + double w = 1 + p.z * SS.CameraTangent() * scale; + p.x *= w / scale; + p.y *= w / scale; + + Vector orig = offset.ScaledBy(-1); + orig = orig.Plus(projRight.ScaledBy(p.x)).Plus( + projUp. ScaledBy(p.y).Plus( + projRight.Cross(projUp). ScaledBy(p.z))); + return orig; +} + +void GraphicsWindow::NormalizeProjectionVectors(void) { + if(projRight.Magnitude() < LENGTH_EPS) { + projRight = Vector::From(1, 0, 0); + } + + Vector norm = projRight.Cross(projUp); + // If projRight and projUp somehow ended up parallel, then pick an + // arbitrary projUp normal to projRight. + if(norm.Magnitude() < LENGTH_EPS) { + norm = projRight.Normal(0); + } + projUp = norm.Cross(projRight); + + projUp = projUp.WithMagnitude(1); + projRight = projRight.WithMagnitude(1); +} + +Vector GraphicsWindow::VectorFromProjs(Vector rightUpForward) { + Vector n = projRight.Cross(projUp); + + Vector r = (projRight.ScaledBy(rightUpForward.x)); + r = r.Plus(projUp.ScaledBy(rightUpForward.y)); + r = r.Plus(n.ScaledBy(rightUpForward.z)); + return r; +} + +void GraphicsWindow::Paint(void) { + int i; + havePainted = true; + + int w, h; + GetGraphicsWindowSize(&w, &h); + width = w; height = h; + glViewport(0, 0, w, h); + + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + + glScaled(scale*2.0/w, scale*2.0/h, scale*1.0/30000); + + double mat[16]; + // Last thing before display is to apply the perspective + double clp = SS.CameraTangent()*scale; + MakeMatrix(mat, 1, 0, 0, 0, + 0, 1, 0, 0, + 0, 0, 1, 0, + 0, 0, clp, 1); + glMultMatrixd(mat); + // Before that, we apply the rotation + Vector n = projUp.Cross(projRight); + MakeMatrix(mat, projRight.x, projRight.y, projRight.z, 0, + projUp.x, projUp.y, projUp.z, 0, + n.x, n.y, n.z, 0, + 0, 0, 0, 1); + glMultMatrixd(mat); + // And before that, the translation + MakeMatrix(mat, 1, 0, 0, offset.x, + 0, 1, 0, offset.y, + 0, 0, 1, offset.z, + 0, 0, 0, 1); + glMultMatrixd(mat); + + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); + + glShadeModel(GL_SMOOTH); + + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + glEnable(GL_BLEND); + glEnable(GL_LINE_SMOOTH); + // don't enable GL_POLYGON_SMOOTH; that looks ugly on some graphics cards, + // drawn with leaks in the mesh + glEnable(GL_POLYGON_OFFSET_LINE); + glEnable(GL_POLYGON_OFFSET_FILL); + glEnable(GL_DEPTH_TEST); + glHint(GL_LINE_SMOOTH_HINT, GL_NICEST); + glEnable(GL_NORMALIZE); + + // At the same depth, we want later lines drawn over earlier. + glDepthFunc(GL_LEQUAL); + + if(SS.ActiveGroupsOkay()) { + glClearColor(SS.backgroundColor.redF(), + SS.backgroundColor.greenF(), + SS.backgroundColor.blueF(), 1.0f); + } else { + // Draw a different background whenever we're having solve problems. + RgbaColor rgb = Style::Color(Style::DRAW_ERROR); + glClearColor(0.4f*rgb.redF(), 0.4f*rgb.greenF(), 0.4f*rgb.blueF(), 1.0f); + // And show the text window, which has info to debug it + ForceTextWindowShown(); + } + glClear(GL_COLOR_BUFFER_BIT); + glClearDepth(1.0); + glClear(GL_DEPTH_BUFFER_BIT); + + if(SS.bgImage.fromFile) { + // If a background image is loaded, then we draw it now as a texture. + // This handles the resizing for us nicely. + glBindTexture(GL_TEXTURE_2D, TEXTURE_BACKGROUND_IMG); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP); + glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, + SS.bgImage.rw, SS.bgImage.rh, + 0, + GL_RGB, GL_UNSIGNED_BYTE, + SS.bgImage.fromFile); + + double tw = ((double)SS.bgImage.w) / SS.bgImage.rw, + th = ((double)SS.bgImage.h) / SS.bgImage.rh; + + double mmw = SS.bgImage.w / SS.bgImage.scale, + mmh = SS.bgImage.h / SS.bgImage.scale; + + Vector origin = SS.bgImage.origin; + origin = origin.DotInToCsys(projRight, projUp, n); + // Place the depth of our origin at the point that corresponds to + // w = 1, so that it's unaffected by perspective. + origin.z = (offset.ScaledBy(-1)).Dot(n); + origin = origin.ScaleOutOfCsys(projRight, projUp, n); + + // Place the background at the very back of the Z order, though, by + // mucking with the depth range. + glDepthRange(1, 1); + glEnable(GL_TEXTURE_2D); + glBegin(GL_QUADS); + glTexCoord2d(0, 0); + ssglVertex3v(origin); + + glTexCoord2d(0, th); + ssglVertex3v(origin.Plus(projUp.ScaledBy(mmh))); + + glTexCoord2d(tw, th); + ssglVertex3v(origin.Plus(projRight.ScaledBy(mmw).Plus( + projUp. ScaledBy(mmh)))); + + glTexCoord2d(tw, 0); + ssglVertex3v(origin.Plus(projRight.ScaledBy(mmw))); + glEnd(); + glDisable(GL_TEXTURE_2D); + } + ssglDepthRangeOffset(0); + + // Nasty case when we're reloading the linked files; could be that + // we get an error, so a dialog pops up, and a message loop starts, and + // we have to get called to paint ourselves. If the sketch is screwed + // up, then we could trigger an oops trying to draw. + if(!SS.allConsistent) return; + + // Let's use two lights, at the user-specified locations + GLfloat f; + glEnable(GL_LIGHT0); + f = (GLfloat)SS.lightIntensity[0]; + GLfloat li0[] = { f, f, f, 1.0f }; + glLightfv(GL_LIGHT0, GL_DIFFUSE, li0); + glLightfv(GL_LIGHT0, GL_SPECULAR, li0); + + glEnable(GL_LIGHT1); + f = (GLfloat)SS.lightIntensity[1]; + GLfloat li1[] = { f, f, f, 1.0f }; + glLightfv(GL_LIGHT1, GL_DIFFUSE, li1); + glLightfv(GL_LIGHT1, GL_SPECULAR, li1); + + Vector ld; + ld = VectorFromProjs(SS.lightDir[0]); + GLfloat ld0[4] = { (GLfloat)ld.x, (GLfloat)ld.y, (GLfloat)ld.z, 0 }; + glLightfv(GL_LIGHT0, GL_POSITION, ld0); + ld = VectorFromProjs(SS.lightDir[1]); + GLfloat ld1[4] = { (GLfloat)ld.x, (GLfloat)ld.y, (GLfloat)ld.z, 0 }; + glLightfv(GL_LIGHT1, GL_POSITION, ld1); + + GLfloat ambient[4] = { (float)SS.ambientIntensity, + (float)SS.ambientIntensity, + (float)SS.ambientIntensity, 1 }; + glLightModelfv(GL_LIGHT_MODEL_AMBIENT, ambient); + + ssglUnlockColor(); + + if(showSnapGrid && LockedInWorkplane()) { + hEntity he = ActiveWorkplane(); + EntityBase *wrkpl = SK.GetEntity(he), + *norm = wrkpl->Normal(); + Vector wu, wv, wn, wp; + wp = SK.GetEntity(wrkpl->point[0])->PointGetNum(); + wu = norm->NormalU(); + wv = norm->NormalV(); + wn = norm->NormalN(); + + double g = SS.gridSpacing; + + double umin = VERY_POSITIVE, umax = VERY_NEGATIVE, + vmin = VERY_POSITIVE, vmax = VERY_NEGATIVE; + int a; + for(a = 0; a < 4; a++) { + // Ideally, we would just do +/- half the width and height; but + // allow some extra slop for rounding. + Vector horiz = projRight.ScaledBy((0.6*width)/scale + 2*g), + vert = projUp. ScaledBy((0.6*height)/scale + 2*g); + if(a == 2 || a == 3) horiz = horiz.ScaledBy(-1); + if(a == 1 || a == 3) vert = vert. ScaledBy(-1); + Vector tp = horiz.Plus(vert).Minus(offset); + + // Project the point into our grid plane, normal to the screen + // (not to the grid plane). If the plane is on edge then this is + // impossible so don't try to draw the grid. + bool parallel; + Vector tpp = Vector::AtIntersectionOfPlaneAndLine( + wn, wn.Dot(wp), + tp, tp.Plus(n), + ¶llel); + if(parallel) goto nogrid; + + tpp = tpp.Minus(wp); + double uu = tpp.Dot(wu), + vv = tpp.Dot(wv); + + umin = min(uu, umin); + umax = max(uu, umax); + vmin = min(vv, vmin); + vmax = max(vv, vmax); + } + + int i, j, i0, i1, j0, j1; + + i0 = (int)(umin / g); + i1 = (int)(umax / g); + j0 = (int)(vmin / g); + j1 = (int)(vmax / g); + + if(i0 > i1 || i1 - i0 > 400) goto nogrid; + if(j0 > j1 || j1 - j0 > 400) goto nogrid; + + ssglLineWidth(1); + ssglColorRGBa(Style::Color(Style::DATUM), 0.3); + glBegin(GL_LINES); + for(i = i0 + 1; i < i1; i++) { + ssglVertex3v(wp.Plus(wu.ScaledBy(i*g)).Plus(wv.ScaledBy(j0*g))); + ssglVertex3v(wp.Plus(wu.ScaledBy(i*g)).Plus(wv.ScaledBy(j1*g))); + } + for(j = j0 + 1; j < j1; j++) { + ssglVertex3v(wp.Plus(wu.ScaledBy(i0*g)).Plus(wv.ScaledBy(j*g))); + ssglVertex3v(wp.Plus(wu.ScaledBy(i1*g)).Plus(wv.ScaledBy(j*g))); + } + glEnd(); + + // Clear the depth buffer, so that the grid is at the very back of + // the Z order. + glClear(GL_DEPTH_BUFFER_BIT); +nogrid:; + } + + // Draw the active group; this does stuff like the mesh and edges. + (SK.GetGroup(activeGroup))->Draw(); + + // Now draw the entities. + if(SS.GW.showHdnLines) { + ssglDepthRangeOffset(2); + glDepthFunc(GL_GREATER); + Entity::DrawAll(/*drawAsHidden=*/true); + glDepthFunc(GL_LEQUAL); + } + ssglDepthRangeOffset(0); + Entity::DrawAll(/*drawAsHidden=*/false); + + // Draw filled paths in all groups, when those filled paths were requested + // specially by assigning a style with a fill color, or when the filled + // paths are just being filled by default. This should go last, to make + // the transparency work. + for(i = 0; i < SK.groupOrder.n; i++) { + Group *g = SK.GetGroup(SK.groupOrder.elem[i]); + if(!(g->IsVisible())) continue; + g->DrawFilledPaths(); + } + + + glDisable(GL_DEPTH_TEST); + // Draw the constraints + for(i = 0; i < SK.constraint.n; i++) { + SK.constraint.elem[i].Draw(); + } + + // Draw the "pending" constraint, i.e. a constraint that would be + // placed on a line that is almost horizontal or vertical + if(SS.GW.pending.operation == DRAGGING_NEW_LINE_POINT) { + if(SS.GW.pending.suggestion != GraphicsWindow::SUGGESTED_NONE) { + Constraint c = {}; + c.group = SS.GW.activeGroup; + c.workplane = SS.GW.ActiveWorkplane(); + c.type = SS.GW.pending.suggestion; + c.ptA = Entity::NO_ENTITY; + c.ptB = Entity::NO_ENTITY; + c.entityA = SS.GW.pending.request.entity(0); + c.entityB = Entity::NO_ENTITY; + c.other = false; + c.other2 = false; + // Only draw. + c.Draw(); + } + } + + // Draw the traced path, if one exists + ssglLineWidth(Style::Width(Style::ANALYZE)); + ssglColorRGB(Style::Color(Style::ANALYZE)); + SContour *sc = &(SS.traced.path); + glBegin(GL_LINE_STRIP); + for(i = 0; i < sc->l.n; i++) { + ssglVertex3v(sc->l.elem[i].p); + } + glEnd(); + + // And the naked edges, if the user did Analyze -> Show Naked Edges. + ssglDrawEdges(&(SS.nakedEdges), true, { Style::DRAW_ERROR }); + + // Then redraw whatever the mouse is hovering over, highlighted. + glDisable(GL_DEPTH_TEST); + ssglLockColorTo(Style::Color(Style::HOVERED)); + hover.Draw(); + + // And finally draw the selection, same mechanism. + ssglLockColorTo(Style::Color(Style::SELECTED)); + for(Selection *s = selection.First(); s; s = selection.NextAfter(s)) { + s->Draw(); + } + + ssglUnlockColor(); + + // If a marquee selection is in progress, then draw the selection + // rectangle, as an outline and a transparent fill. + if(pending.operation == DRAGGING_MARQUEE) { + Point2d begin = ProjectPoint(orig.marqueePoint); + double xmin = min(orig.mouse.x, begin.x), + xmax = max(orig.mouse.x, begin.x), + ymin = min(orig.mouse.y, begin.y), + ymax = max(orig.mouse.y, begin.y); + + Vector tl = UnProjectPoint(Point2d::From(xmin, ymin)), + tr = UnProjectPoint(Point2d::From(xmax, ymin)), + br = UnProjectPoint(Point2d::From(xmax, ymax)), + bl = UnProjectPoint(Point2d::From(xmin, ymax)); + + ssglLineWidth((GLfloat)1.3); + ssglColorRGB(Style::Color(Style::HOVERED)); + glBegin(GL_LINE_LOOP); + ssglVertex3v(tl); + ssglVertex3v(tr); + ssglVertex3v(br); + ssglVertex3v(bl); + glEnd(); + ssglColorRGBa(Style::Color(Style::HOVERED), 0.10); + glBegin(GL_QUADS); + ssglVertex3v(tl); + ssglVertex3v(tr); + ssglVertex3v(br); + ssglVertex3v(bl); + glEnd(); + } + + // An extra line, used to indicate the origin when rotating within the + // plane of the monitor. + if(SS.extraLine.draw) { + ssglLineWidth(1); + ssglLockColorTo(Style::Color(Style::DATUM)); + glBegin(GL_LINES); + ssglVertex3v(SS.extraLine.ptA); + ssglVertex3v(SS.extraLine.ptB); + glEnd(); + } + + // A note to indicate the origin in the just-exported file. + if(SS.justExportedInfo.draw) { + Vector p, u, v; + if(SS.justExportedInfo.showOrigin) { + p = SS.justExportedInfo.pt, + u = SS.justExportedInfo.u, + v = SS.justExportedInfo.v; + } else { + p = SS.GW.offset.ScaledBy(-1); + u = SS.GW.projRight; + v = SS.GW.projUp; + } + + ssglColorRGB(Style::Color(Style::DATUM)); + + ssglWriteText("previewing exported geometry; press Esc to return", + Style::DefaultTextHeight(), + p.Plus(u.ScaledBy(10/scale)).Plus(v.ScaledBy(10/scale)), + u, v, NULL, NULL); + + if(SS.justExportedInfo.showOrigin) { + ssglLineWidth(1.5); + glBegin(GL_LINES); + ssglVertex3v(p.Plus(u.WithMagnitude(-15/scale))); + ssglVertex3v(p.Plus(u.WithMagnitude(30/scale))); + ssglVertex3v(p.Plus(v.WithMagnitude(-15/scale))); + ssglVertex3v(p.Plus(v.WithMagnitude(30/scale))); + glEnd(); + + ssglWriteText("(x, y) = (0, 0) for file just exported", + Style::DefaultTextHeight(), + p.Plus(u.ScaledBy(40/scale)).Plus( + v.ScaledBy(-(Style::DefaultTextHeight())/scale)), + u, v, NULL, NULL); + } + } + + // And finally the toolbar. + if(SS.showToolbar) { + ToolbarDraw(); + } +} + diff --git a/src/drawconstraint.cpp b/src/drawconstraint.cpp new file mode 100644 index 0000000..31139bc --- /dev/null +++ b/src/drawconstraint.cpp @@ -0,0 +1,1250 @@ +//----------------------------------------------------------------------------- +// Given a constraint, draw a graphical and user-selectable representation +// of that constraint on-screen. We can either draw with gl, or compute the +// distance from a point (the location of the mouse pointer) to the lines +// that we would have drawn, for selection. +// +// Copyright 2008-2013 Jonathan Westhues. +//----------------------------------------------------------------------------- +#include "solvespace.h" + +void Constraint::LineDrawOrGetDistance(Vector a, Vector b) { + if(dogd.drawing) { + hStyle hs = GetStyle(); + + if(dogd.sel) { + dogd.sel->AddEdge(a, b, hs.v); + } else { + if(Style::Width(hs) >= 3.0) { + ssglFatLine(a, b, Style::Width(hs) / SS.GW.scale); + } else { + glBegin(GL_LINE_STRIP); + ssglVertex3v(a); + ssglVertex3v(b); + glEnd(); + } + } + } else { + Point2d ap = SS.GW.ProjectPoint(a); + Point2d bp = SS.GW.ProjectPoint(b); + + double d = dogd.mp.DistanceToLine(ap, bp.Minus(ap), true); + dogd.dmin = min(dogd.dmin, d); + } + dogd.refp = (a.Plus(b)).ScaledBy(0.5); +} + +static void LineCallback(void *fndata, Vector a, Vector b) +{ + Constraint *c = (Constraint *)fndata; + c->LineDrawOrGetDistance(a, b); +} + +std::string Constraint::Label(void) { + std::string result; + if(type == ANGLE) { + if(valA == floor(valA)) { + result = ssprintf("%.0f°", valA); + } else { + result = ssprintf("%.2f°", valA); + } + } else if(type == LENGTH_RATIO) { + result = ssprintf("%.3f:1", valA); + } else if(type == COMMENT) { + result = comment; + } else if(type == DIAMETER) { + if(!other) { + result = "⌀" + SS.MmToString(valA); + } else { + result = "R" + SS.MmToString(valA / 2); + } + } else { + // valA has units of distance + result = SS.MmToString(fabs(valA)); + } + if(reference) { + result += " REF"; + } + return result; +} + +void Constraint::DoLabel(Vector ref, Vector *labelPos, Vector gr, Vector gu) { + hStyle hs = GetStyle(); + double th = Style::TextHeight(hs); + + std::string s = Label(); + double swidth = ssglStrWidth(s, th), + sheight = ssglStrCapHeight(th); + + // By default, the reference is from the center; but the style could + // specify otherwise if one is present, and it could also specify a + // rotation. + if(type == COMMENT && disp.style.v) { + Style *st = Style::Get(disp.style); + // rotation first + double rads = st->textAngle*PI/180; + double c = cos(rads), s = sin(rads); + Vector pr = gr, pu = gu; + gr = pr.ScaledBy( c).Plus(pu.ScaledBy(s)); + gu = pr.ScaledBy(-s).Plus(pu.ScaledBy(c)); + // then origin + int o = st->textOrigin; + if(o & Style::ORIGIN_LEFT) ref = ref.Plus(gr.WithMagnitude(swidth/2)); + if(o & Style::ORIGIN_RIGHT) ref = ref.Minus(gr.WithMagnitude(swidth/2)); + if(o & Style::ORIGIN_BOT) ref = ref.Plus(gu.WithMagnitude(sheight/2)); + if(o & Style::ORIGIN_TOP) ref = ref.Minus(gu.WithMagnitude(sheight/2)); + } + + if(labelPos) { + // labelPos is from the top left corner (for the text box used to + // edit things), but ref is from the center. + *labelPos = ref.Minus(gr.WithMagnitude(swidth/2)).Minus( + gu.WithMagnitude(sheight/2)); + } + + + if(dogd.drawing) { + ssglWriteTextRefCenter(s, th, ref, gr, gu, LineCallback, this); + } else { + double l = swidth/2 - sheight/2; + l = max(l, 5/SS.GW.scale); + Point2d a = SS.GW.ProjectPoint(ref.Minus(gr.WithMagnitude(l))); + Point2d b = SS.GW.ProjectPoint(ref.Plus (gr.WithMagnitude(l))); + double d = dogd.mp.DistanceToLine(a, b.Minus(a), true); + + dogd.dmin = min(dogd.dmin, d - (th / 2)); + dogd.refp = ref; + } +} + +void Constraint::StippledLine(Vector a, Vector b) { + glLineStipple(4, 0x5555); + glEnable(GL_LINE_STIPPLE); + LineDrawOrGetDistance(a, b); + glDisable(GL_LINE_STIPPLE); +} + +void Constraint::DoProjectedPoint(Vector *r) { + Vector p = r->ProjectInto(workplane); + StippledLine(p, *r); + *r = p; +} + +//----------------------------------------------------------------------------- +// There is a rectangular box, aligned to our display axes (projRight, projUp) +// centered at ref. This is where a dimension label will be drawn. We want to +// draw a line from A to B. If that line would intersect the label box, then +// trim the line to leave a gap for it, and return zero. If not, then extend +// the line to almost meet the box, and return either positive or negative, +// depending whether that extension was from A or from B. +//----------------------------------------------------------------------------- +int Constraint::DoLineTrimmedAgainstBox(Vector ref, Vector a, Vector b, bool extend) { + hStyle hs = GetStyle(); + double th = Style::TextHeight(hs); + Vector gu = SS.GW.projUp.WithMagnitude(1), + gr = SS.GW.projRight.WithMagnitude(1); + + double pixels = 1.0 / SS.GW.scale; + std::string s = Label(); + double swidth = ssglStrWidth(s, th) + 4*pixels, + sheight = ssglStrCapHeight(th) + 8*pixels; + + return DoLineTrimmedAgainstBox(ref, a, b, extend, gr, gu, swidth, sheight); +} + +int Constraint::DoLineTrimmedAgainstBox(Vector ref, Vector a, Vector b, bool extend, + Vector gr, Vector gu, double swidth, double sheight) { + struct { + Vector n; + double d; + } planes[4]; + // reference pos is the center of box occupied by text; build a rectangle + // around that, aligned to axes gr and gu, from four planes will all four + // normals pointing inward + planes[0].n = gu.ScaledBy(-1); planes[0].d = -(gu.Dot(ref) + sheight/2); + planes[1].n = gu; planes[1].d = gu.Dot(ref) - sheight/2; + planes[2].n = gr; planes[2].d = gr.Dot(ref) - swidth/2; + planes[3].n = gr.ScaledBy(-1); planes[3].d = -(gr.Dot(ref) + swidth/2); + + double tmin = VERY_POSITIVE, tmax = VERY_NEGATIVE; + Vector dl = b.Minus(a); + + for(int i = 0; i < 4; i++) { + bool parallel; + Vector p = Vector::AtIntersectionOfPlaneAndLine( + planes[i].n, planes[i].d, + a, b, ¶llel); + if(parallel) continue; + + int j; + for(j = 0; j < 4; j++) { + double d = (planes[j].n).Dot(p) - planes[j].d; + if(d < -LENGTH_EPS) break; + } + if(j < 4) continue; + + double t = (p.Minus(a)).DivPivoting(dl); + tmin = min(t, tmin); + tmax = max(t, tmax); + } + + // Both in range; so there's pieces of the line on both sides of the label box. + if(tmin >= 0.0 && tmin <= 1.0 && tmax >= 0.0 && tmax <= 1.0) { + LineDrawOrGetDistance(a, a.Plus(dl.ScaledBy(tmin))); + LineDrawOrGetDistance(a.Plus(dl.ScaledBy(tmax)), b); + return 0; + } + + // Only one intersection in range; so the box is right on top of the endpoint + if(tmin >= 0.0 && tmin <= 1.0) { + LineDrawOrGetDistance(a, a.Plus(dl.ScaledBy(tmin))); + return 0; + } + + // Likewise. + if(tmax >= 0.0 && tmax <= 1.0) { + LineDrawOrGetDistance(a.Plus(dl.ScaledBy(tmax)), b); + return 0; + } + + // The line does not intersect the label; so the line should get + // extended to just barely meet the label. + // 0 means the label lies within the line, negative means it's outside + // and closer to b, positive means outside and closer to a. + if(tmax < 0.0) { + if(extend) a = a.Plus(dl.ScaledBy(tmax)); + LineDrawOrGetDistance(a, b); + return 1; + } + + if(tmin > 1.0) { + if(extend) b = a.Plus(dl.ScaledBy(tmin)); + LineDrawOrGetDistance(a, b); + return -1; + } + + // This will happen if the entire line lies within the box. + return 0; +} + +void Constraint::DoArrow(Vector p, Vector dir, Vector n, double width, double angle, double da) { + dir = dir.WithMagnitude(width / cos(angle)); + dir = dir.RotatedAbout(n, da); + LineDrawOrGetDistance(p, p.Plus(dir.RotatedAbout(n, angle))); + LineDrawOrGetDistance(p, p.Plus(dir.RotatedAbout(n, -angle))); +} + +//----------------------------------------------------------------------------- +// Draw a line with arrows on both ends, and possibly a gap in the middle for +// the dimension. We will use these for most length dimensions. The length +// being dimensioned is from A to B; but those points get extended perpendicular +// to the line AB, until the line between the extensions crosses ref (the +// center of the label). +//----------------------------------------------------------------------------- +void Constraint::DoLineWithArrows(Vector ref, Vector a, Vector b, + bool onlyOneExt) +{ + double pixels = 1.0 / SS.GW.scale; + + Vector ab = a.Minus(b); + Vector ar = a.Minus(ref); + // Normal to a plane containing the line and the label origin. + Vector n = ab.Cross(ar); + // Within that plane, and normal to the line AB; so that's our extension + // line. + Vector out = ab.Cross(n).WithMagnitude(1); + out = out.ScaledBy(-out.Dot(ar)); + + Vector ae = a.Plus(out), be = b.Plus(out); + + // Extension lines extend 10 pixels beyond where the arrows get + // drawn (which is at the same offset perpendicular from AB as the + // label). + LineDrawOrGetDistance(a, ae.Plus(out.WithMagnitude(10*pixels))); + if(!onlyOneExt) { + LineDrawOrGetDistance(b, be.Plus(out.WithMagnitude(10*pixels))); + } + + int within = DoLineTrimmedAgainstBox(ref, ae, be); + + // Arrow heads are 13 pixels long, with an 18 degree half-angle. + double theta = 18*PI/180; + Vector arrow = (be.Minus(ae)).WithMagnitude(13*pixels); + + if(within != 0) { + arrow = arrow.ScaledBy(-1); + Vector seg = (be.Minus(ae)).WithMagnitude(18*pixels); + if(within < 0) LineDrawOrGetDistance(ae, ae.Minus(seg)); + if(within > 0) LineDrawOrGetDistance(be, be.Plus(seg)); + } + + DoArrow(ae, arrow, n, 13.0 * pixels, theta, 0.0); + DoArrow(be, arrow.Negated(), n, 13.0 * pixels, theta, 0.0); +} + +void Constraint::DoEqualLenTicks(Vector a, Vector b, Vector gn) { + Vector m = (a.ScaledBy(1.0/3)).Plus(b.ScaledBy(2.0/3)); + Vector ab = a.Minus(b); + Vector n = (gn.Cross(ab)).WithMagnitude(10/SS.GW.scale); + + LineDrawOrGetDistance(m.Minus(n), m.Plus(n)); +} + +void Constraint::DoEqualRadiusTicks(hEntity he) { + Entity *circ = SK.GetEntity(he); + + Vector center = SK.GetEntity(circ->point[0])->PointGetNum(); + double r = circ->CircleGetRadiusNum(); + Quaternion q = circ->Normal()->NormalGetNum(); + Vector u = q.RotationU(), v = q.RotationV(); + + double theta; + if(circ->type == Entity::CIRCLE) { + theta = PI/2; + } else if(circ->type == Entity::ARC_OF_CIRCLE) { + double thetaa, thetab, dtheta; + circ->ArcGetAngles(&thetaa, &thetab, &dtheta); + theta = thetaa + dtheta/2; + } else oops(); + + Vector d = u.ScaledBy(cos(theta)).Plus(v.ScaledBy(sin(theta))); + d = d.ScaledBy(r); + Vector p = center.Plus(d); + Vector tick = d.WithMagnitude(10/SS.GW.scale); + LineDrawOrGetDistance(p.Plus(tick), p.Minus(tick)); +} + +void Constraint::DoArcForAngle(Vector a0, Vector da, Vector b0, Vector db, + Vector offset, Vector *ref, bool trim) +{ + Vector gr = SS.GW.projRight.ScaledBy(1.0); + Vector gu = SS.GW.projUp.ScaledBy(1.0); + + if(workplane.v != Entity::FREE_IN_3D.v) { + a0 = a0.ProjectInto(workplane); + b0 = b0.ProjectInto(workplane); + da = da.ProjectVectorInto(workplane); + db = db.ProjectVectorInto(workplane); + } + + double px = 1.0 / SS.GW.scale; + Vector a1 = a0.Plus(da); + Vector b1 = b0.Plus(db); + + bool skew; + Vector pi = Vector::AtIntersectionOfLines(a0, a0.Plus(da), + b0, b0.Plus(db), &skew); + + if(!skew) { + *ref = pi.Plus(offset); + // We draw in a coordinate system centered at the intersection point. + // One basis vector is da, and the other is normal to da and in + // the plane that contains our lines (so normal to its normal). + da = da.WithMagnitude(1); + db = db.WithMagnitude(1); + + Vector norm = da.Cross(db); + + Vector dna = norm.Cross(da).WithMagnitude(1.0); + Vector dnb = norm.Cross(db).WithMagnitude(1.0); + + // da and db magnitudes are 1.0 + double thetaf = acos(da.Dot(db)); + + // Calculate median + Vector m = da.ScaledBy(cos(thetaf/2)).Plus( + dna.ScaledBy(sin(thetaf/2))); + Vector rm = (*ref).Minus(pi); + + // Test which side we have to place an arc + if(m.Dot(rm) < 0) { + da = da.ScaledBy(-1); dna = dna.ScaledBy(-1); + db = db.ScaledBy(-1); dnb = dnb.ScaledBy(-1); + } + + double rda = rm.Dot(da), rdna = rm.Dot(dna); + + // Introduce minimal arc radius in pixels + double r = max(sqrt(rda*rda + rdna*rdna), 15.0 * px); + + hStyle hs = disp.style; + if(hs.v == 0) hs.v = Style::CONSTRAINT; + double th = Style::TextHeight(hs); + double swidth = ssglStrWidth(Label(), th) + 4.0 * px; + double sheight = ssglStrCapHeight(th) + 8.0 * px; + double textR = sqrt(swidth * swidth + sheight * sheight) / 2.0; + *ref = pi.Plus(rm.WithMagnitude(std::max(rm.Magnitude(), 15 * px + textR))); + + // Arrow points + Vector apa = da. ScaledBy(r).Plus(pi); + Vector apb = da. ScaledBy(r*cos(thetaf)).Plus( + dna.ScaledBy(r*sin(thetaf))).Plus(pi); + + double arrowW = 13 * px; + double arrowA = 18.0 * PI / 180.0; + bool arrowVisible = apb.Minus(apa).Magnitude() > 2.5 * arrowW; + // Arrow reversing indicator + bool arrowRev = false; + + // The minimal extension length in angular representation + double extAngle = 18 * px / r; + + // Arc additional angle + double addAngle = 0.0; + // Arc start angle + double startAngle = 0.0; + + // Arc extension to db. + // We have just enlarge angle value. + if(HasLabel() && rm.Dot(dnb) > 0.0) { + // rm direction projected to plane with u = da, v = dna + Vector rmp = da.ScaledBy(rda).Plus(dna.ScaledBy(rdna)).WithMagnitude(1.0); + // rmp and db magnitudes are 1.0 + addAngle = std::max(acos(rmp.Dot(db)), extAngle); + + if(arrowVisible) { + startAngle = -extAngle; + addAngle += extAngle; + arrowRev = true; + } + } + + // Arc extension to da. + // We are enlarge angle value and rewrite basis to align along rm projection. + if(HasLabel() && rm.Dot(dna) < 0.0) { + // rm direction projected to plane with u = da, v = dna + Vector rmp = da.ScaledBy(rda).Plus(dna.ScaledBy(rdna)).WithMagnitude(1.0); + // rmp and da magnitudes are 1.0 + startAngle = -std::max(acos(rmp.Dot(da)), extAngle); + addAngle = -startAngle; + + if(arrowVisible) { + addAngle += extAngle; + arrowRev = true; + } + } + + Vector prev; + int n = 30; + for(int i = 0; i <= n; i++) { + double theta = startAngle + (i*(thetaf + addAngle))/n; + Vector p = da.ScaledBy(r*cos(theta)).Plus( + dna.ScaledBy(r*sin(theta))).Plus(pi); + if(i > 0) { + if(trim) { + DoLineTrimmedAgainstBox(*ref, prev, p, false, gr, gu, swidth, sheight); + } else { + LineDrawOrGetDistance(prev, p); + } + } + prev = p; + } + + DoLineExtend(a0, a1, apa, 5.0 * px); + DoLineExtend(b0, b1, apb, 5.0 * px); + + // Draw arrows only when we have enough space. + if(arrowVisible) { + double angleCorr = arrowW / (2.0 * r); + if(arrowRev) { + dna = dna.ScaledBy(-1.0); + angleCorr = -angleCorr; + } + DoArrow(apa, dna, norm, arrowW, arrowA, angleCorr); + DoArrow(apb, dna, norm, arrowW, arrowA, thetaf + PI - angleCorr); + } + } else { + // The lines are skew; no wonderful way to illustrate that. + *ref = a0.Plus(b0); + *ref = (*ref).ScaledBy(0.5).Plus(disp.offset); + gu = gu.WithMagnitude(1); + Vector trans = + (*ref).Plus(gu.ScaledBy(-1.5*ssglStrCapHeight(Style::DefaultTextHeight()))); + ssglWriteTextRefCenter("angle between skew lines", Style::DefaultTextHeight(), + trans, gr.WithMagnitude(px), gu.WithMagnitude(px), LineCallback, this); + } +} + +bool Constraint::IsVisible() const { + if(!SS.GW.showConstraints) return false; + Group *g = SK.GetGroup(group); + // If the group is hidden, then the constraints are hidden and not + // able to be selected. + if(!(g->visible)) return false; + // And likewise if the group is not the active group; except for comments + // with an assigned style. + if(g->h.v != SS.GW.activeGroup.v && !(type == COMMENT && disp.style.v)) { + return false; + } + if(disp.style.v) { + Style *s = Style::Get(disp.style); + if(!s->visible) return false; + } + return true; +} + +bool Constraint::DoLineExtend(Vector p0, Vector p1, Vector pt, double salient) { + Vector dir = p1.Minus(p0); + double k = dir.Dot(pt.Minus(p0)) / dir.Dot(dir); + Vector ptOnLine = p0.Plus(dir.ScaledBy(k)); + + // Draw projection line. + LineDrawOrGetDistance(pt, ptOnLine); + + // Calculate salient direction. + Vector sd = dir.WithMagnitude(1.0).ScaledBy(salient); + + Vector from; + Vector to; + + if(k < 0.0) { + from = p0; + to = ptOnLine.Minus(sd); + } else if(k > 1.0) { + from = p1; + to = ptOnLine.Plus(sd); + } else { + return false; + } + + // Draw extension line. + LineDrawOrGetDistance(from, to); + return true; +} + +void Constraint::DrawOrGetDistance(Vector *labelPos) { + + if(!IsVisible()) return; + + // Unit vectors that describe our current view of the scene. One pixel + // long, not one actual unit. + Vector gr = SS.GW.projRight.ScaledBy(1/SS.GW.scale); + Vector gu = SS.GW.projUp.ScaledBy(1/SS.GW.scale); + Vector gn = (gr.Cross(gu)).WithMagnitude(1/SS.GW.scale); + + switch(type) { + case PT_PT_DISTANCE: { + Vector ap = SK.GetEntity(ptA)->PointGetNum(); + Vector bp = SK.GetEntity(ptB)->PointGetNum(); + + if(workplane.v != Entity::FREE_IN_3D.v) { + DoProjectedPoint(&ap); + DoProjectedPoint(&bp); + } + + Vector ref = ((ap.Plus(bp)).ScaledBy(0.5)).Plus(disp.offset); + + DoLineWithArrows(ref, ap, bp, false); + DoLabel(ref, labelPos, gr, gu); + break; + } + + case PROJ_PT_DISTANCE: { + Vector ap = SK.GetEntity(ptA)->PointGetNum(), + bp = SK.GetEntity(ptB)->PointGetNum(), + dp = (bp.Minus(ap)), + pp = SK.GetEntity(entityA)->VectorGetNum(); + + Vector ref = ((ap.Plus(bp)).ScaledBy(0.5)).Plus(disp.offset); + + pp = pp.WithMagnitude(1); + double d = dp.Dot(pp); + Vector bpp = ap.Plus(pp.ScaledBy(d)); + StippledLine(ap, bpp); + StippledLine(bp, bpp); + + DoLineWithArrows(ref, ap, bpp, false); + DoLabel(ref, labelPos, gr, gu); + break; + } + + case PT_FACE_DISTANCE: + case PT_PLANE_DISTANCE: { + Vector pt = SK.GetEntity(ptA)->PointGetNum(); + Entity *enta = SK.GetEntity(entityA); + Vector n, p; + if(type == PT_PLANE_DISTANCE) { + n = enta->Normal()->NormalN(); + p = enta->WorkplaneGetOffset(); + } else { + n = enta->FaceGetNormalNum(); + p = enta->FaceGetPointNum(); + } + + double d = (p.Minus(pt)).Dot(n); + Vector closest = pt.Plus(n.WithMagnitude(d)); + + Vector ref = ((closest.Plus(pt)).ScaledBy(0.5)).Plus(disp.offset); + + if(!pt.Equals(closest)) { + DoLineWithArrows(ref, pt, closest, true); + } + + DoLabel(ref, labelPos, gr, gu); + break; + } + + case PT_LINE_DISTANCE: { + Vector pt = SK.GetEntity(ptA)->PointGetNum(); + Entity *line = SK.GetEntity(entityA); + Vector lA = SK.GetEntity(line->point[0])->PointGetNum(); + Vector lB = SK.GetEntity(line->point[1])->PointGetNum(); + Vector dl = lB.Minus(lA); + + if(workplane.v != Entity::FREE_IN_3D.v) { + lA = lA.ProjectInto(workplane); + lB = lB.ProjectInto(workplane); + DoProjectedPoint(&pt); + } + + // Find the closest point on the line + Vector closest = pt.ClosestPointOnLine(lA, dl); + + Vector ref = ((closest.Plus(pt)).ScaledBy(0.5)).Plus(disp.offset); + DoLabel(ref, labelPos, gr, gu); + + if(!pt.Equals(closest)) { + DoLineWithArrows(ref, pt, closest, true); + + // Extensions to line + double pixels = 1.0 / SS.GW.scale; + Vector refClosest = ref.ClosestPointOnLine(lA, dl); + double ddl = dl.Dot(dl); + if(fabs(ddl) > LENGTH_EPS * LENGTH_EPS) { + double t = refClosest.Minus(lA).Dot(dl) / ddl; + if(t < 0.0) { + LineDrawOrGetDistance(refClosest.Minus(dl.WithMagnitude(10.0 * pixels)), lA); + } else if(t > 1.0) { + LineDrawOrGetDistance(refClosest.Plus(dl.WithMagnitude(10.0 * pixels)), lB); + } + } + } + + if(workplane.v != Entity::FREE_IN_3D.v) { + // Draw the projection marker from the closest point on the + // projected line to the projected point on the real line. + Vector lAB = (lA.Minus(lB)); + double t = (lA.Minus(closest)).DivPivoting(lAB); + + Vector lA = SK.GetEntity(line->point[0])->PointGetNum(); + Vector lB = SK.GetEntity(line->point[1])->PointGetNum(); + + Vector c2 = (lA.ScaledBy(1-t)).Plus(lB.ScaledBy(t)); + DoProjectedPoint(&c2); + } + break; + } + + case DIAMETER: { + Entity *circle = SK.GetEntity(entityA); + Vector center = SK.GetEntity(circle->point[0])->PointGetNum(); + Quaternion q = SK.GetEntity(circle->normal)->NormalGetNum(); + Vector n = q.RotationN().WithMagnitude(1); + double r = circle->CircleGetRadiusNum(); + + Vector ref = center.Plus(disp.offset); + // Force the label into the same plane as the circle. + ref = ref.Minus(n.ScaledBy(n.Dot(ref) - n.Dot(center))); + + Vector mark = ref.Minus(center); + mark = mark.WithMagnitude(mark.Magnitude()-r); + DoLineTrimmedAgainstBox(ref, ref, ref.Minus(mark)); + + Vector topLeft; + DoLabel(ref, &topLeft, gr, gu); + if(labelPos) *labelPos = topLeft; + break; + } + + case POINTS_COINCIDENT: { + if(!dogd.drawing) { + for(int i = 0; i < 2; i++) { + Vector p = SK.GetEntity(i == 0 ? ptA : ptB)-> PointGetNum(); + Point2d pp = SS.GW.ProjectPoint(p); + // The point is selected within a radius of 7, from the + // same center; so if the point is visible, then this + // constraint cannot be selected. But that's okay. + dogd.dmin = min(dogd.dmin, pp.DistanceTo(dogd.mp) - 3); + dogd.refp = p; + } + break; + } + + if(dogd.drawing) { + // Let's adjust the color of this constraint to have the same + // rough luma as the point color, so that the constraint does not + // stand out in an ugly way. + RgbaColor cd = Style::Color(Style::DATUM), + cc = Style::Color(Style::CONSTRAINT); + // convert from 8-bit color to a vector + Vector vd = Vector::From(cd.redF(), cd.greenF(), cd.blueF()), + vc = Vector::From(cc.redF(), cc.greenF(), cc.blueF()); + // and scale the constraint color to have the same magnitude as + // the datum color, maybe a bit dimmer + vc = vc.WithMagnitude(vd.Magnitude()*0.9); + // and set the color to that. + ssglColorRGB(RGBf(vc.x, vc.y, vc.z)); + + for(int a = 0; a < 2; a++) { + Vector r = SS.GW.projRight.ScaledBy((a+1)/SS.GW.scale); + Vector d = SS.GW.projUp.ScaledBy((2-a)/SS.GW.scale); + for(int i = 0; i < 2; i++) { + Vector p = SK.GetEntity(i == 0 ? ptA : ptB)-> PointGetNum(); + glBegin(GL_QUADS); + ssglVertex3v(p.Plus (r).Plus (d)); + ssglVertex3v(p.Plus (r).Minus(d)); + ssglVertex3v(p.Minus(r).Minus(d)); + ssglVertex3v(p.Minus(r).Plus (d)); + glEnd(); + } + + } + } + break; + } + + case PT_ON_CIRCLE: + case PT_ON_LINE: + case PT_ON_FACE: + case PT_IN_PLANE: { + double s = 8/SS.GW.scale; + Vector p = SK.GetEntity(ptA)->PointGetNum(); + Vector r, d; + if(type == PT_ON_FACE) { + Vector n = SK.GetEntity(entityA)->FaceGetNormalNum(); + r = n.Normal(0); + d = n.Normal(1); + } else if(type == PT_IN_PLANE) { + EntityBase *n = SK.GetEntity(entityA)->Normal(); + r = n->NormalU(); + d = n->NormalV(); + } else { + r = gr; + d = gu; + s *= (6.0/8); // draw these a little smaller + } + r = r.WithMagnitude(s); d = d.WithMagnitude(s); + LineDrawOrGetDistance(p.Plus (r).Plus (d), p.Plus (r).Minus(d)); + LineDrawOrGetDistance(p.Plus (r).Minus(d), p.Minus(r).Minus(d)); + LineDrawOrGetDistance(p.Minus(r).Minus(d), p.Minus(r).Plus (d)); + LineDrawOrGetDistance(p.Minus(r).Plus (d), p.Plus (r).Plus (d)); + break; + } + + case WHERE_DRAGGED: { + Vector p = SK.GetEntity(ptA)->PointGetNum(), + u = p.Plus(gu.WithMagnitude(8/SS.GW.scale)).Plus( + gr.WithMagnitude(8/SS.GW.scale)), + uu = u.Minus(gu.WithMagnitude(5/SS.GW.scale)), + ur = u.Minus(gr.WithMagnitude(5/SS.GW.scale)); + // Draw four little crop marks, uniformly spaced (by ninety + // degree rotations) around the point. + int i; + for(i = 0; i < 4; i++) { + LineDrawOrGetDistance(u, uu); + LineDrawOrGetDistance(u, ur); + u = u.RotatedAbout(p, gn, PI/2); + ur = ur.RotatedAbout(p, gn, PI/2); + uu = uu.RotatedAbout(p, gn, PI/2); + } + break; + } + + case SAME_ORIENTATION: { + for(int i = 0; i < 2; i++) { + Entity *e = SK.GetEntity(i == 0 ? entityA : entityB); + Quaternion q = e->NormalGetNum(); + Vector n = q.RotationN().WithMagnitude(25/SS.GW.scale); + Vector u = q.RotationU().WithMagnitude(6/SS.GW.scale); + Vector p = SK.GetEntity(e->point[0])->PointGetNum(); + p = p.Plus(n.WithMagnitude(10/SS.GW.scale)); + + LineDrawOrGetDistance(p.Plus(u), p.Minus(u).Plus(n)); + LineDrawOrGetDistance(p.Minus(u), p.Plus(u).Plus(n)); + } + break; + } + + case EQUAL_ANGLE: { + Vector ref; + Entity *a = SK.GetEntity(entityA); + Entity *b = SK.GetEntity(entityB); + Entity *c = SK.GetEntity(entityC); + Entity *d = SK.GetEntity(entityD); + + Vector a0 = a->VectorGetStartPoint(); + Vector b0 = b->VectorGetStartPoint(); + Vector c0 = c->VectorGetStartPoint(); + Vector d0 = d->VectorGetStartPoint(); + Vector da = a->VectorGetNum(); + Vector db = b->VectorGetNum(); + Vector dc = c->VectorGetNum(); + Vector dd = d->VectorGetNum(); + + if(other) { + a0 = a0.Plus(da); + da = da.ScaledBy(-1); + } + + DoArcForAngle(a0, da, b0, db, + da.WithMagnitude(40/SS.GW.scale), &ref, /*trim=*/false); + DoArcForAngle(c0, dc, d0, dd, + dc.WithMagnitude(40/SS.GW.scale), &ref, /*trim=*/false); + + break; + } + + case ANGLE: { + Entity *a = SK.GetEntity(entityA); + Entity *b = SK.GetEntity(entityB); + + Vector a0 = a->VectorGetStartPoint(); + Vector b0 = b->VectorGetStartPoint(); + Vector da = a->VectorGetNum(); + Vector db = b->VectorGetNum(); + if(other) { + a0 = a0.Plus(da); + da = da.ScaledBy(-1); + } + + Vector ref; + DoArcForAngle(a0, da, b0, db, disp.offset, &ref, /*trim=*/true); + DoLabel(ref, labelPos, gr, gu); + break; + } + + case PERPENDICULAR: { + Vector u = Vector::From(0, 0, 0), v = Vector::From(0, 0, 0); + Vector rn, ru; + if(workplane.v == Entity::FREE_IN_3D.v) { + rn = gn; + ru = gu; + } else { + EntityBase *normal = SK.GetEntity(workplane)->Normal(); + rn = normal->NormalN(); + ru = normal->NormalV(); // ru meaning r_up, not u/v + } + + for(int i = 0; i < 2; i++) { + Entity *e = SK.GetEntity(i == 0 ? entityA : entityB); + + if(i == 0) { + // Calculate orientation of perpendicular sign only + // once, so that it's the same both times it's drawn + u = e->VectorGetNum(); + u = u.WithMagnitude(16/SS.GW.scale); + v = (rn.Cross(u)).WithMagnitude(16/SS.GW.scale); + // a bit of bias to stop it from flickering between the + // two possibilities + if(fabs(u.Dot(ru)) < fabs(v.Dot(ru)) + LENGTH_EPS) { + swap(u, v); + } + if(u.Dot(ru) < 0) u = u.ScaledBy(-1); + } + + Vector p = e->VectorGetRefPoint(); + Vector s = p.Plus(u).Plus(v); + LineDrawOrGetDistance(s, s.Plus(v)); + + Vector m = s.Plus(v.ScaledBy(0.5)); + LineDrawOrGetDistance(m, m.Plus(u)); + } + break; + } + + case CURVE_CURVE_TANGENT: + case CUBIC_LINE_TANGENT: + case ARC_LINE_TANGENT: { + Vector textAt, u, v; + + if(type == ARC_LINE_TANGENT) { + Entity *arc = SK.GetEntity(entityA); + Entity *norm = SK.GetEntity(arc->normal); + Vector c = SK.GetEntity(arc->point[0])->PointGetNum(); + Vector p = + SK.GetEntity(arc->point[other ? 2 : 1])->PointGetNum(); + Vector r = p.Minus(c); + textAt = p.Plus(r.WithMagnitude(14/SS.GW.scale)); + u = norm->NormalU(); + v = norm->NormalV(); + } else if(type == CUBIC_LINE_TANGENT) { + Vector n; + if(workplane.v == Entity::FREE_IN_3D.v) { + u = gr; + v = gu; + n = gn; + } else { + EntityBase *wn = SK.GetEntity(workplane)->Normal(); + u = wn->NormalU(); + v = wn->NormalV(); + n = wn->NormalN(); + } + + Entity *cubic = SK.GetEntity(entityA); + Vector p = other ? cubic->CubicGetFinishNum() : + cubic->CubicGetStartNum(); + Vector dir = SK.GetEntity(entityB)->VectorGetNum(); + Vector out = n.Cross(dir); + textAt = p.Plus(out.WithMagnitude(14/SS.GW.scale)); + } else { + Vector n, dir; + EntityBase *wn = SK.GetEntity(workplane)->Normal(); + u = wn->NormalU(); + v = wn->NormalV(); + n = wn->NormalN(); + EntityBase *eA = SK.GetEntity(entityA); + // Big pain; we have to get a vector tangent to the curve + // at the shared point, which could be from either a cubic + // or an arc. + if(other) { + textAt = eA->EndpointFinish(); + if(eA->type == Entity::CUBIC) { + dir = eA->CubicGetFinishTangentNum(); + } else { + dir = SK.GetEntity(eA->point[0])->PointGetNum().Minus( + SK.GetEntity(eA->point[2])->PointGetNum()); + dir = n.Cross(dir); + } + } else { + textAt = eA->EndpointStart(); + if(eA->type == Entity::CUBIC) { + dir = eA->CubicGetStartTangentNum(); + } else { + dir = SK.GetEntity(eA->point[0])->PointGetNum().Minus( + SK.GetEntity(eA->point[1])->PointGetNum()); + dir = n.Cross(dir); + } + } + dir = n.Cross(dir); + textAt = textAt.Plus(dir.WithMagnitude(14/SS.GW.scale)); + } + + if(dogd.drawing) { + ssglWriteTextRefCenter("T", Style::DefaultTextHeight(), + textAt, u, v, LineCallback, this); + } else { + dogd.refp = textAt; + Point2d ref = SS.GW.ProjectPoint(dogd.refp); + dogd.dmin = min(dogd.dmin, ref.DistanceTo(dogd.mp)-10); + } + break; + } + + case PARALLEL: { + for(int i = 0; i < 2; i++) { + Entity *e = SK.GetEntity(i == 0 ? entityA : entityB); + Vector n = e->VectorGetNum(); + n = n.WithMagnitude(25/SS.GW.scale); + Vector u = (gn.Cross(n)).WithMagnitude(4/SS.GW.scale); + Vector p = e->VectorGetRefPoint(); + + LineDrawOrGetDistance(p.Plus(u), p.Plus(u).Plus(n)); + LineDrawOrGetDistance(p.Minus(u), p.Minus(u).Plus(n)); + } + break; + } + + case EQUAL_RADIUS: { + for(int i = 0; i < 2; i++) { + DoEqualRadiusTicks(i == 0 ? entityA : entityB); + } + break; + } + + case EQUAL_LINE_ARC_LEN: { + Entity *line = SK.GetEntity(entityA); + DoEqualLenTicks( + SK.GetEntity(line->point[0])->PointGetNum(), + SK.GetEntity(line->point[1])->PointGetNum(), + gn); + + DoEqualRadiusTicks(entityB); + break; + } + + case LENGTH_RATIO: + case LENGTH_DIFFERENCE: + case EQUAL_LENGTH_LINES: { + Vector a, b = Vector::From(0, 0, 0); + for(int i = 0; i < 2; i++) { + Entity *e = SK.GetEntity(i == 0 ? entityA : entityB); + a = SK.GetEntity(e->point[0])->PointGetNum(); + b = SK.GetEntity(e->point[1])->PointGetNum(); + + if(workplane.v != Entity::FREE_IN_3D.v) { + DoProjectedPoint(&a); + DoProjectedPoint(&b); + } + + DoEqualLenTicks(a, b, gn); + } + if((type == LENGTH_RATIO) || (type == LENGTH_DIFFERENCE)) { + Vector ref = ((a.Plus(b)).ScaledBy(0.5)).Plus(disp.offset); + DoLabel(ref, labelPos, gr, gu); + } + break; + } + + case EQ_LEN_PT_LINE_D: { + Entity *forLen = SK.GetEntity(entityA); + Vector a = SK.GetEntity(forLen->point[0])->PointGetNum(), + b = SK.GetEntity(forLen->point[1])->PointGetNum(); + if(workplane.v != Entity::FREE_IN_3D.v) { + DoProjectedPoint(&a); + DoProjectedPoint(&b); + } + DoEqualLenTicks(a, b, gn); + + Entity *ln = SK.GetEntity(entityB); + Vector la = SK.GetEntity(ln->point[0])->PointGetNum(), + lb = SK.GetEntity(ln->point[1])->PointGetNum(); + Vector pt = SK.GetEntity(ptA)->PointGetNum(); + if(workplane.v != Entity::FREE_IN_3D.v) { + DoProjectedPoint(&pt); + la = la.ProjectInto(workplane); + lb = lb.ProjectInto(workplane); + } + + Vector closest = pt.ClosestPointOnLine(la, lb.Minus(la)); + LineDrawOrGetDistance(pt, closest); + DoEqualLenTicks(pt, closest, gn); + break; + } + + case EQ_PT_LN_DISTANCES: { + for(int i = 0; i < 2; i++) { + Entity *ln = SK.GetEntity(i == 0 ? entityA : entityB); + Vector la = SK.GetEntity(ln->point[0])->PointGetNum(), + lb = SK.GetEntity(ln->point[1])->PointGetNum(); + Entity *pte = SK.GetEntity(i == 0 ? ptA : ptB); + Vector pt = pte->PointGetNum(); + + if(workplane.v != Entity::FREE_IN_3D.v) { + DoProjectedPoint(&pt); + la = la.ProjectInto(workplane); + lb = lb.ProjectInto(workplane); + } + + Vector closest = pt.ClosestPointOnLine(la, lb.Minus(la)); + + LineDrawOrGetDistance(pt, closest); + DoEqualLenTicks(pt, closest, gn); + } + break; + } + + { + case SYMMETRIC: + Vector n; + n = SK.GetEntity(entityA)->Normal()->NormalN(); goto s; + case SYMMETRIC_HORIZ: + n = SK.GetEntity(workplane)->Normal()->NormalU(); goto s; + case SYMMETRIC_VERT: + n = SK.GetEntity(workplane)->Normal()->NormalV(); goto s; + case SYMMETRIC_LINE: { + Entity *ln = SK.GetEntity(entityA); + Vector la = SK.GetEntity(ln->point[0])->PointGetNum(), + lb = SK.GetEntity(ln->point[1])->PointGetNum(); + la = la.ProjectInto(workplane); + lb = lb.ProjectInto(workplane); + n = lb.Minus(la); + Vector nw = SK.GetEntity(workplane)->Normal()->NormalN(); + n = n.RotatedAbout(nw, PI/2); + goto s; + } +s: + Vector a = SK.GetEntity(ptA)->PointGetNum(); + Vector b = SK.GetEntity(ptB)->PointGetNum(); + + for(int i = 0; i < 2; i++) { + Vector tail = (i == 0) ? a : b; + Vector d = (i == 0) ? b : a; + d = d.Minus(tail); + // Project the direction in which the arrow is drawn normal + // to the symmetry plane; for projected symmetry constraints, + // they might not be in the same direction, even when the + // constraint is fully solved. + d = n.ScaledBy(d.Dot(n)); + d = d.WithMagnitude(20/SS.GW.scale); + Vector tip = tail.Plus(d); + + LineDrawOrGetDistance(tail, tip); + d = d.WithMagnitude(9/SS.GW.scale); + LineDrawOrGetDistance(tip, tip.Minus(d.RotatedAbout(gn, 0.6))); + LineDrawOrGetDistance(tip, tip.Minus(d.RotatedAbout(gn, -0.6))); + } + break; + } + + case AT_MIDPOINT: + case HORIZONTAL: + case VERTICAL: + if(entityA.v) { + Vector r, u, n; + if(workplane.v == Entity::FREE_IN_3D.v) { + r = gr; u = gu; n = gn; + } else { + r = SK.GetEntity(workplane)->Normal()->NormalU(); + u = SK.GetEntity(workplane)->Normal()->NormalV(); + n = r.Cross(u); + } + // For "at midpoint", this branch is always taken. + Entity *e = SK.GetEntity(entityA); + Vector a = SK.GetEntity(e->point[0])->PointGetNum(); + Vector b = SK.GetEntity(e->point[1])->PointGetNum(); + Vector m = (a.ScaledBy(0.5)).Plus(b.ScaledBy(0.5)); + Vector offset = (a.Minus(b)).Cross(n); + offset = offset.WithMagnitude(13/SS.GW.scale); + // Draw midpoint constraint on other side of line, so that + // a line can be midpoint and horizontal at same time. + if(type == AT_MIDPOINT) offset = offset.ScaledBy(-1); + + if(dogd.drawing) { + const char *s = (type == HORIZONTAL) ? "H" : ( + (type == VERTICAL) ? "V" : ( + (type == AT_MIDPOINT) ? "M" : NULL)); + + ssglWriteTextRefCenter(s, Style::DefaultTextHeight(), + m.Plus(offset), r, u, LineCallback, this); + } else { + dogd.refp = m.Plus(offset); + Point2d ref = SS.GW.ProjectPoint(dogd.refp); + dogd.dmin = min(dogd.dmin, ref.DistanceTo(dogd.mp)-10); + } + } else { + Vector a = SK.GetEntity(ptA)->PointGetNum(); + Vector b = SK.GetEntity(ptB)->PointGetNum(); + + Entity *w = SK.GetEntity(workplane); + Vector cu = w->Normal()->NormalU(); + Vector cv = w->Normal()->NormalV(); + Vector cn = w->Normal()->NormalN(); + + int i; + for(i = 0; i < 2; i++) { + Vector o = (i == 0) ? a : b; + Vector oo = (i == 0) ? a.Minus(b) : b.Minus(a); + Vector d = (type == HORIZONTAL) ? cu : cv; + if(oo.Dot(d) < 0) d = d.ScaledBy(-1); + + Vector dp = cn.Cross(d); + d = d.WithMagnitude(14/SS.GW.scale); + Vector c = o.Minus(d); + LineDrawOrGetDistance(o, c); + d = d.WithMagnitude(3/SS.GW.scale); + dp = dp.WithMagnitude(2/SS.GW.scale); + if(dogd.drawing) { + glBegin(GL_QUADS); + ssglVertex3v((c.Plus(d)).Plus(dp)); + ssglVertex3v((c.Minus(d)).Plus(dp)); + ssglVertex3v((c.Minus(d)).Minus(dp)); + ssglVertex3v((c.Plus(d)).Minus(dp)); + glEnd(); + } else { + Point2d ref = SS.GW.ProjectPoint(c); + dogd.dmin = min(dogd.dmin, ref.DistanceTo(dogd.mp)-6); + } + } + } + break; + + case COMMENT: { + if(dogd.drawing && disp.style.v) { + ssglLineWidth(Style::Width(disp.style)); + ssglColorRGB(Style::Color(disp.style)); + } + Vector u, v; + if(workplane.v == Entity::FREE_IN_3D.v) { + u = gr; + v = gu; + } else { + EntityBase *norm = SK.GetEntity(workplane)->Normal(); + u = norm->NormalU(); + v = norm->NormalV(); + } + DoLabel(disp.offset, labelPos, u, v); + break; + } + + default: oops(); + } +} + +void Constraint::Draw(void) { + dogd.drawing = true; + dogd.sel = NULL; + hStyle hs = GetStyle(); + + ssglLineWidth(Style::Width(hs)); + ssglColorRGB(Style::Color(hs)); + + DrawOrGetDistance(NULL); +} + +double Constraint::GetDistance(Point2d mp) { + dogd.drawing = false; + dogd.sel = NULL; + dogd.mp = mp; + dogd.dmin = 1e12; + + DrawOrGetDistance(NULL); + + return dogd.dmin; +} + +Vector Constraint::GetLabelPos(void) { + dogd.drawing = false; + dogd.sel = NULL; + dogd.mp.x = 0; dogd.mp.y = 0; + dogd.dmin = 1e12; + + Vector p; + DrawOrGetDistance(&p); + return p; +} + +Vector Constraint::GetReferencePos(void) { + dogd.drawing = false; + dogd.sel = NULL; + + dogd.refp = SS.GW.offset.ScaledBy(-1); + DrawOrGetDistance(NULL); + + return dogd.refp; +} + +void Constraint::GetEdges(SEdgeList *sel) { + dogd.drawing = true; + dogd.sel = sel; + DrawOrGetDistance(NULL); + dogd.sel = NULL; +} + +bool Constraint::IsStylable() { + if(type == COMMENT) return true; + return false; +} + +hStyle Constraint::GetStyle() const { + if(disp.style.v != 0) return disp.style; + return { Style::CONSTRAINT }; +} + +bool Constraint::HasLabel() { + switch(type) { + case COMMENT: + case PT_PT_DISTANCE: + case PT_PLANE_DISTANCE: + case PT_LINE_DISTANCE: + case PT_FACE_DISTANCE: + case PROJ_PT_DISTANCE: + case LENGTH_RATIO: + case LENGTH_DIFFERENCE: + case DIAMETER: + case ANGLE: + return true; + + default: + return false; + } +} diff --git a/src/drawentity.cpp b/src/drawentity.cpp new file mode 100644 index 0000000..39bc085 --- /dev/null +++ b/src/drawentity.cpp @@ -0,0 +1,724 @@ +//----------------------------------------------------------------------------- +// Draw a representation of an entity on-screen, in the case of curves up +// to our chord tolerance, or return the distance from the user's mouse pointer +// to the entity for selection. +// +// Copyright 2008-2013 Jonathan Westhues. +//----------------------------------------------------------------------------- +#include "solvespace.h" + +std::string Entity::DescriptionString(void) { + if(h.isFromRequest()) { + Request *r = SK.GetRequest(h.request()); + return r->DescriptionString(); + } else { + Group *g = SK.GetGroup(h.group()); + return g->DescriptionString(); + } +} + +void Entity::LineDrawOrGetDistance(Vector a, Vector b, bool maybeFat, int data) { + if(dogd.drawing) { + // Draw lines from active group in front of those from previous + ssglDepthRangeOffset((group.v == SS.GW.activeGroup.v) ? 4 : 3); + // Narrow lines are drawn as lines, but fat lines must be drawn as + // filled polygons, to get the line join style right. + ssglStippledLine(a, b, dogd.lineWidth, dogd.stippleType, dogd.stippleScale, maybeFat); + ssglDepthRangeOffset(0); + } else { + Point2d ap = SS.GW.ProjectPoint(a); + Point2d bp = SS.GW.ProjectPoint(b); + + double d = dogd.mp.DistanceToLine(ap, bp.Minus(ap), true); + // A little bit easier to select in the active group + if(group.v == SS.GW.activeGroup.v) d -= 1; + if(d < dogd.dmin) { + dogd.dmin = d; + dogd.data = data; + } + } + dogd.refp = (a.Plus(b)).ScaledBy(0.5); +} + +void Entity::DrawAll(bool drawAsHidden) { + // This handles points as a special case, because I seem to be able + // to get a huge speedup that way, by consolidating stuff to gl. + int i; + if(SS.GW.showPoints) { + double s = 3.5/SS.GW.scale; + Vector r = SS.GW.projRight.ScaledBy(s); + Vector d = SS.GW.projUp.ScaledBy(s); + ssglColorRGB(Style::Color(Style::DATUM)); + ssglDepthRangeOffset(6); + glBegin(GL_QUADS); + for(i = 0; i < SK.entity.n; i++) { + Entity *e = &(SK.entity.elem[i]); + if(!e->IsPoint()) continue; + if(!(SK.GetGroup(e->group)->IsVisible())) continue; + if(e->forceHidden) continue; + + Vector v = e->PointGetNum(); + + // If we're analyzing the sketch to show the degrees of freedom, + // then we draw big colored squares over the points that are + // free to move. + bool free = false; + if(e->type == POINT_IN_3D) { + Param *px = SK.GetParam(e->param[0]), + *py = SK.GetParam(e->param[1]), + *pz = SK.GetParam(e->param[2]); + + free = (px->free) || (py->free) || (pz->free); + } else if(e->type == POINT_IN_2D) { + Param *pu = SK.GetParam(e->param[0]), + *pv = SK.GetParam(e->param[1]); + + free = (pu->free) || (pv->free); + } + if(free) { + Vector re = r.ScaledBy(2.5), de = d.ScaledBy(2.5); + + ssglColorRGB(Style::Color(Style::ANALYZE)); + ssglVertex3v(v.Plus (re).Plus (de)); + ssglVertex3v(v.Plus (re).Minus(de)); + ssglVertex3v(v.Minus(re).Minus(de)); + ssglVertex3v(v.Minus(re).Plus (de)); + ssglColorRGB(Style::Color(Style::DATUM)); + } + + ssglVertex3v(v.Plus (r).Plus (d)); + ssglVertex3v(v.Plus (r).Minus(d)); + ssglVertex3v(v.Minus(r).Minus(d)); + ssglVertex3v(v.Minus(r).Plus (d)); + } + glEnd(); + ssglDepthRangeOffset(0); + } + + for(i = 0; i < SK.entity.n; i++) { + Entity *e = &(SK.entity.elem[i]); + if(e->IsPoint()) { + continue; // already handled + } + e->Draw(drawAsHidden); + } +} + +void Entity::Draw(bool drawAsHidden) { + hStyle hs = Style::ForEntity(h); + dogd.lineWidth = Style::Width(hs); + if(drawAsHidden) { + dogd.stippleType = Style::PatternType({ Style::HIDDEN_EDGE }); + dogd.stippleScale = Style::StippleScaleMm({ Style::HIDDEN_EDGE }); + } else { + dogd.stippleType = Style::PatternType(hs); + dogd.stippleScale = Style::StippleScaleMm(hs); + } + ssglLineWidth((float)dogd.lineWidth); + ssglColorRGB(Style::Color(hs)); + + dogd.drawing = true; + DrawOrGetDistance(); +} + +void Entity::GenerateEdges(SEdgeList *el, bool includingConstruction) { + if(construction && !includingConstruction) return; + + SBezierList *sbl = GetOrGenerateBezierCurves(); + + int i, j; + for(i = 0; i < sbl->l.n; i++) { + SBezier *sb = &(sbl->l.elem[i]); + + List lv = {}; + sb->MakePwlInto(&lv); + for(j = 1; j < lv.n; j++) { + el->AddEdge(lv.elem[j-1], lv.elem[j], style.v, i); + } + lv.Clear(); + } + +} + +SBezierList *Entity::GetOrGenerateBezierCurves() { + if(beziers.l.n == 0) + GenerateBezierCurves(&beziers); + return &beziers; +} + +SEdgeList *Entity::GetOrGenerateEdges() { + if(edges.l.n != 0) { + if(EXACT(edgesChordTol == SS.ChordTolMm())) + return &edges; + edges.l.Clear(); + } + if(edges.l.n == 0) + GenerateEdges(&edges, /*includingConstruction=*/true); + edgesChordTol = SS.ChordTolMm(); + return &edges; +} + +BBox Entity::GetOrGenerateScreenBBox(bool *hasBBox) { + SBezierList *sbl = GetOrGenerateBezierCurves(); + + // We don't bother with bounding boxes for normals, workplanes, etc. + *hasBBox = (IsPoint() || sbl->l.n > 0); + if(!*hasBBox) return {}; + + if(screenBBoxValid) + return screenBBox; + + if(IsPoint()) { + Vector proj = SS.GW.ProjectPoint3(PointGetNum()); + screenBBox = BBox::From(proj, proj); + } else if(sbl->l.n > 0) { + Vector first = SS.GW.ProjectPoint3(sbl->l.elem[0].ctrl[0]); + screenBBox = BBox::From(first, first); + for(int i = 0; i < sbl->l.n; i++) { + SBezier *sb = &sbl->l.elem[i]; + for(int i = 0; i <= sb->deg; i++) { + screenBBox.Include(SS.GW.ProjectPoint3(sb->ctrl[i])); + } + } + } else oops(); + + // Enlarge the bounding box to consider selection radius. + screenBBox.minp.x -= SELECTION_RADIUS; + screenBBox.minp.y -= SELECTION_RADIUS; + screenBBox.maxp.x += SELECTION_RADIUS; + screenBBox.maxp.y += SELECTION_RADIUS; + + screenBBoxValid = true; + return screenBBox; +} + +double Entity::GetDistance(Point2d mp) { + dogd.drawing = false; + dogd.mp = mp; + dogd.dmin = 1e12; + + DrawOrGetDistance(); + + return dogd.dmin; +} + +Vector Entity::GetReferencePos(void) { + dogd.drawing = false; + + dogd.refp = SS.GW.offset.ScaledBy(-1); + DrawOrGetDistance(); + + return dogd.refp; +} + +bool Entity::IsStylable() { + if(IsPoint()) return false; + if(IsWorkplane()) return false; + if(IsNormal()) return false; + return true; +} + +bool Entity::IsVisible(void) { + Group *g = SK.GetGroup(group); + + if(g->h.v == Group::HGROUP_REFERENCES.v && IsNormal()) { + // The reference normals are always shown + return true; + } + if(!(g->IsVisible())) return false; + + // Don't check if points are hidden; this gets called only for + // selected or hovered points, and those should always be shown. + if(IsNormal() && !SS.GW.showNormals) return false; + + if(!SS.GW.showWorkplanes) { + if(IsWorkplane() && !h.isFromRequest()) { + if(g->h.v != SS.GW.activeGroup.v) { + // The group-associated workplanes are hidden outside + // their group. + return false; + } + } + } + + if(style.v) { + Style *s = Style::Get(style); + if(!s->visible) return false; + } + + if(forceHidden) return false; + + return true; +} + +void Entity::CalculateNumerical(bool forExport) { + if(IsPoint()) actPoint = PointGetNum(); + if(IsNormal()) actNormal = NormalGetNum(); + if(type == DISTANCE || type == DISTANCE_N_COPY) { + actDistance = DistanceGetNum(); + } + if(IsFace()) { + actPoint = FaceGetPointNum(); + Vector n = FaceGetNormalNum(); + actNormal = Quaternion::From(0, n.x, n.y, n.z); + } + if(forExport) { + // Visibility in copied linked entities follows source file + actVisible = IsVisible(); + } else { + // Copied entities within a file are always visible + actVisible = true; + } +} + +bool Entity::PointIsFromReferences(void) { + return h.request().IsFromReferences(); +} + +//----------------------------------------------------------------------------- +// Compute a cubic, second derivative continuous, interpolating spline. Same +// routine for periodic splines (in a loop) or open splines (with specified +// end tangents). +//----------------------------------------------------------------------------- +void Entity::ComputeInterpolatingSpline(SBezierList *sbl, bool periodic) { + static const int MAX_N = BandedMatrix::MAX_UNKNOWNS; + int ep = extraPoints; + + // The number of unknowns to solve for. + int n = periodic ? 3 + ep : ep; + if(n >= MAX_N) oops(); + // The number of on-curve points, one more than the number of segments. + int pts = periodic ? 4 + ep : 2 + ep; + + int i, j, a; + + // The starting and finishing control points that define our end tangents + // (if the spline isn't periodic), and the on-curve points. + Vector ctrl_s = Vector::From(0, 0, 0); + Vector ctrl_f = Vector::From(0, 0, 0); + Vector pt[MAX_N+4]; + if(periodic) { + for(i = 0; i < ep + 3; i++) { + pt[i] = SK.GetEntity(point[i])->PointGetNum(); + } + pt[i++] = SK.GetEntity(point[0])->PointGetNum(); + } else { + ctrl_s = SK.GetEntity(point[1])->PointGetNum(); + ctrl_f = SK.GetEntity(point[ep+2])->PointGetNum(); + j = 0; + pt[j++] = SK.GetEntity(point[0])->PointGetNum(); + for(i = 2; i <= ep + 1; i++) { + pt[j++] = SK.GetEntity(point[i])->PointGetNum(); + } + pt[j++] = SK.GetEntity(point[ep+3])->PointGetNum(); + } + + // The unknowns that we will be solving for, a set for each coordinate. + double Xx[MAX_N], Xy[MAX_N], Xz[MAX_N]; + // For a cubic Bezier section f(t) as t goes from 0 to 1, + // f' (0) = 3*(P1 - P0) + // f' (1) = 3*(P3 - P2) + // f''(0) = 6*(P0 - 2*P1 + P2) + // f''(1) = 6*(P3 - 2*P2 + P1) + for(a = 0; a < 3; a++) { + BandedMatrix bm = {}; + bm.n = n; + + for(i = 0; i < n; i++) { + int im, it, ip; + if(periodic) { + im = WRAP(i - 1, n); + it = i; + ip = WRAP(i + 1, n); + } else { + im = i; + it = i + 1; + ip = i + 2; + } + // All of these are expressed in terms of a constant part, and + // of X[i-1], X[i], and X[i+1]; so let these be the four + // components of that vector; + Vector4 A, B, C, D, E; + // The on-curve interpolated point + C = Vector4::From((pt[it]).Element(a), 0, 0, 0); + // control point one back, C - X[i] + B = C.Plus(Vector4::From(0, 0, -1, 0)); + // control point one forward, C + X[i] + D = C.Plus(Vector4::From(0, 0, 1, 0)); + // control point two back + if(i == 0 && !periodic) { + A = Vector4::From(ctrl_s.Element(a), 0, 0, 0); + } else { + // pt[im] + X[i-1] + A = Vector4::From(pt[im].Element(a), 1, 0, 0); + } + // control point two forward + if(i == (n - 1) && !periodic) { + E = Vector4::From(ctrl_f.Element(a), 0, 0, 0); + } else { + // pt[ip] - X[i+1] + E = Vector4::From((pt[ip]).Element(a), 0, 0, -1); + } + // Write the second derivatives of each segment, dropping constant + Vector4 fprev_pp = (C.Minus(B.ScaledBy(2))).Plus(A), + fnext_pp = (C.Minus(D.ScaledBy(2))).Plus(E), + eq = fprev_pp.Minus(fnext_pp); + + bm.B[i] = -eq.w; + if(periodic) { + bm.A[i][WRAP(i-2, n)] = eq.x; + bm.A[i][WRAP(i-1, n)] = eq.y; + bm.A[i][i] = eq.z; + } else { + // The wrapping would work, except when n = 1 and everything + // wraps to zero... + if(i > 0) bm.A[i][i - 1] = eq.x; + bm.A[i][i] = eq.y; + if(i < (n-1)) bm.A[i][i + 1] = eq.z; + } + } + bm.Solve(); + double *X = (a == 0) ? Xx : + (a == 1) ? Xy : + Xz; + memcpy(X, bm.X, n*sizeof(double)); + } + + for(i = 0; i < pts - 1; i++) { + Vector p0, p1, p2, p3; + if(periodic) { + p0 = pt[i]; + int iw = WRAP(i - 1, n); + p1 = p0.Plus(Vector::From(Xx[iw], Xy[iw], Xz[iw])); + } else if(i == 0) { + p0 = pt[0]; + p1 = ctrl_s; + } else { + p0 = pt[i]; + p1 = p0.Plus(Vector::From(Xx[i-1], Xy[i-1], Xz[i-1])); + } + if(periodic) { + p3 = pt[i+1]; + int iw = WRAP(i, n); + p2 = p3.Minus(Vector::From(Xx[iw], Xy[iw], Xz[iw])); + } else if(i == (pts - 2)) { + p3 = pt[pts-1]; + p2 = ctrl_f; + } else { + p3 = pt[i+1]; + p2 = p3.Minus(Vector::From(Xx[i], Xy[i], Xz[i])); + } + SBezier sb = SBezier::From(p0, p1, p2, p3); + sbl->l.Add(&sb); + } +} + +void Entity::GenerateBezierCurves(SBezierList *sbl) { + SBezier sb; + + int i = sbl->l.n; + + switch(type) { + case LINE_SEGMENT: { + Vector a = SK.GetEntity(point[0])->PointGetNum(); + Vector b = SK.GetEntity(point[1])->PointGetNum(); + sb = SBezier::From(a, b); + sb.entity = h.v; + sbl->l.Add(&sb); + break; + } + case CUBIC: + ComputeInterpolatingSpline(sbl, false); + break; + + case CUBIC_PERIODIC: + ComputeInterpolatingSpline(sbl, true); + break; + + case CIRCLE: + case ARC_OF_CIRCLE: { + Vector center = SK.GetEntity(point[0])->PointGetNum(); + Quaternion q = SK.GetEntity(normal)->NormalGetNum(); + Vector u = q.RotationU(), v = q.RotationV(); + double r = CircleGetRadiusNum(); + double thetaa, thetab, dtheta; + + if(r < LENGTH_EPS) { + // If a circle or an arc gets dragged through zero radius, + // then we just don't generate anything. + break; + } + + if(type == CIRCLE) { + thetaa = 0; + thetab = 2*PI; + dtheta = 2*PI; + } else { + ArcGetAngles(&thetaa, &thetab, &dtheta); + } + int i, n; + if(dtheta > (3*PI/2 + 0.01)) { + n = 4; + } else if(dtheta > (PI + 0.01)) { + n = 3; + } else if(dtheta > (PI/2 + 0.01)) { + n = 2; + } else { + n = 1; + } + dtheta /= n; + + for(i = 0; i < n; i++) { + double s, c; + + c = cos(thetaa); + s = sin(thetaa); + // The start point of the curve, and the tangent vector at + // that start point. + Vector p0 = center.Plus(u.ScaledBy( r*c)).Plus(v.ScaledBy(r*s)), + t0 = u.ScaledBy(-r*s). Plus(v.ScaledBy(r*c)); + + thetaa += dtheta; + + c = cos(thetaa); + s = sin(thetaa); + Vector p2 = center.Plus(u.ScaledBy( r*c)).Plus(v.ScaledBy(r*s)), + t2 = u.ScaledBy(-r*s). Plus(v.ScaledBy(r*c)); + + // The control point must lie on both tangents. + Vector p1 = Vector::AtIntersectionOfLines(p0, p0.Plus(t0), + p2, p2.Plus(t2), + NULL); + + SBezier sb = SBezier::From(p0, p1, p2); + sb.weight[1] = cos(dtheta/2); + sbl->l.Add(&sb); + } + break; + } + + case TTF_TEXT: { + Vector topLeft = SK.GetEntity(point[0])->PointGetNum(); + Vector botLeft = SK.GetEntity(point[1])->PointGetNum(); + Vector n = Normal()->NormalN(); + Vector v = topLeft.Minus(botLeft); + Vector u = (v.Cross(n)).WithMagnitude(v.Magnitude()); + + SS.fonts.PlotString(font, str, sbl, botLeft, u, v); + break; + } + + default: + // Not a problem, points and normals and such don't generate curves + break; + } + + // Record our style for all of the Beziers that we just created. + for(; i < sbl->l.n; i++) { + sbl->l.elem[i].auxA = style.v; + } +} + +void Entity::DrawOrGetDistance(void) { + // If we're about to perform hit testing on an entity, consider + // whether the pointer is inside its bounding box first. + if(!dogd.drawing) { + bool hasBBox; + BBox box = GetOrGenerateScreenBBox(&hasBBox); + if(hasBBox && !box.Contains(dogd.mp)) + return; + } + + if(!IsVisible()) return; + + switch(type) { + case POINT_N_COPY: + case POINT_N_TRANS: + case POINT_N_ROT_TRANS: + case POINT_N_ROT_AA: + case POINT_IN_3D: + case POINT_IN_2D: { + Vector v = PointGetNum(); + dogd.refp = v; + + if(dogd.drawing) { + double s = 3.5; + Vector r = SS.GW.projRight.ScaledBy(s/SS.GW.scale); + Vector d = SS.GW.projUp.ScaledBy(s/SS.GW.scale); + + ssglColorRGB(Style::Color(Style::DATUM)); + ssglDepthRangeOffset(6); + glBegin(GL_QUADS); + ssglVertex3v(v.Plus (r).Plus (d)); + ssglVertex3v(v.Plus (r).Minus(d)); + ssglVertex3v(v.Minus(r).Minus(d)); + ssglVertex3v(v.Minus(r).Plus (d)); + glEnd(); + ssglDepthRangeOffset(0); + } else { + Point2d pp = SS.GW.ProjectPoint(v); + dogd.dmin = pp.DistanceTo(dogd.mp) - 6; + } + break; + } + + case NORMAL_N_COPY: + case NORMAL_N_ROT: + case NORMAL_N_ROT_AA: + case NORMAL_IN_3D: + case NORMAL_IN_2D: { + int i; + for(i = 0; i < 2; i++) { + if(i == 0 && !SS.GW.showNormals) { + // When the normals are hidden, we will continue to show + // the coordinate axes at the bottom left corner, but + // not at the origin. + continue; + } + + hRequest hr = h.request(); + // Always draw the x, y, and z axes in red, green, and blue; + // brighter for the ones at the bottom left of the screen, + // dimmer for the ones at the model origin. + int f = (i == 0 ? 100 : 255); + if(hr.v == Request::HREQUEST_REFERENCE_XY.v) { + if(dogd.drawing) + ssglColorRGB(RGBi(0, 0, f)); + } else if(hr.v == Request::HREQUEST_REFERENCE_YZ.v) { + if(dogd.drawing) + ssglColorRGB(RGBi(f, 0, 0)); + } else if(hr.v == Request::HREQUEST_REFERENCE_ZX.v) { + if(dogd.drawing) + ssglColorRGB(RGBi(0, f, 0)); + } else { + if(dogd.drawing) + ssglColorRGB(Style::Color(Style::NORMALS)); + if(i > 0) break; + } + + Quaternion q = NormalGetNum(); + Vector tail; + if(i == 0) { + tail = SK.GetEntity(point[0])->PointGetNum(); + if(dogd.drawing) + ssglLineWidth(1); + } else { + // Draw an extra copy of the x, y, and z axes, that's + // always in the corner of the view and at the front. + // So those are always available, perhaps useful. + double s = SS.GW.scale; + double h = 60 - SS.GW.height/2; + double w = 60 - SS.GW.width/2; + tail = SS.GW.projRight.ScaledBy(w/s).Plus( + SS.GW.projUp. ScaledBy(h/s)).Minus(SS.GW.offset); + if(dogd.drawing) { + ssglDepthRangeLockToFront(true); + ssglLineWidth(2); + } + } + + Vector v = (q.RotationN()).WithMagnitude(50/SS.GW.scale); + Vector tip = tail.Plus(v); + LineDrawOrGetDistance(tail, tip); + + v = v.WithMagnitude(12/SS.GW.scale); + Vector axis = q.RotationV(); + LineDrawOrGetDistance(tip,tip.Minus(v.RotatedAbout(axis, 0.6))); + LineDrawOrGetDistance(tip,tip.Minus(v.RotatedAbout(axis,-0.6))); + } + if(dogd.drawing) + ssglDepthRangeLockToFront(false); + break; + } + + case DISTANCE: + case DISTANCE_N_COPY: + // These are used only as data structures, nothing to display. + break; + + case WORKPLANE: { + Vector p; + p = SK.GetEntity(point[0])->PointGetNum(); + + Vector u = Normal()->NormalU(); + Vector v = Normal()->NormalV(); + + double s = (min(SS.GW.width, SS.GW.height))*0.45/SS.GW.scale; + + Vector us = u.ScaledBy(s); + Vector vs = v.ScaledBy(s); + + Vector pp = p.Plus (us).Plus (vs); + Vector pm = p.Plus (us).Minus(vs); + Vector mm = p.Minus(us).Minus(vs), mm2 = mm; + Vector mp = p.Minus(us).Plus (vs); + + if(dogd.drawing) { + ssglLineWidth(1); + ssglColorRGB(Style::Color(Style::NORMALS)); + glEnable(GL_LINE_STIPPLE); + glLineStipple(3, 0x1111); + } + + if(!h.isFromRequest()) { + mm = mm.Plus(v.ScaledBy(70/SS.GW.scale)); + mm2 = mm2.Plus(u.ScaledBy(70/SS.GW.scale)); + LineDrawOrGetDistance(mm2, mm); + } + LineDrawOrGetDistance(pp, pm); + LineDrawOrGetDistance(pm, mm2); + LineDrawOrGetDistance(mp, mm); + LineDrawOrGetDistance(pp, mp); + + if(dogd.drawing) + glDisable(GL_LINE_STIPPLE); + + std::string str = DescriptionString().substr(5); + double th = Style::DefaultTextHeight(); + if(dogd.drawing) { + Vector o = mm2.Plus(u.ScaledBy(3/SS.GW.scale)).Plus( + v.ScaledBy(3/SS.GW.scale)); + ssglWriteText(str, th, o, u, v, NULL, NULL); + } else { + Vector pos = mm2.Plus(u.ScaledBy(ssglStrWidth(str, th)/2)).Plus( + v.ScaledBy(ssglStrCapHeight(th)/2)); + Point2d pp = SS.GW.ProjectPoint(pos); + dogd.dmin = min(dogd.dmin, pp.DistanceTo(dogd.mp) - 10); + // If a line lies in a plane, then select the line, not + // the plane. + dogd.dmin += 3; + } + break; + } + + case LINE_SEGMENT: + case CIRCLE: + case ARC_OF_CIRCLE: + case CUBIC: + case CUBIC_PERIODIC: + case TTF_TEXT: + // Nothing but the curve(s). + break; + + case FACE_NORMAL_PT: + case FACE_XPROD: + case FACE_N_ROT_TRANS: + case FACE_N_TRANS: + case FACE_N_ROT_AA: + // Do nothing; these are drawn with the triangle mesh + break; + + default: + oops(); + } + + // And draw the curves; generate the rational polynomial curves for + // everything, then piecewise linearize them, and display those. + SEdgeList *sel = GetOrGenerateEdges(); + dogd.data = -1; + for(int i = 0; i < sel->l.n; i++) { + SEdge *se = &(sel->l.elem[i]); + LineDrawOrGetDistance(se->a, se->b, true, se->auxB); + } +} + diff --git a/src/dsc.h b/src/dsc.h new file mode 100644 index 0000000..c61bbf5 --- /dev/null +++ b/src/dsc.h @@ -0,0 +1,528 @@ +//----------------------------------------------------------------------------- +// Data structures used frequently in the program, various kinds of vectors +// (of real numbers, not symbolic algebra stuff) and our templated lists. +// +// Copyright 2008-2013 Jonathan Westhues. +//----------------------------------------------------------------------------- +#ifndef __DSC_H +#define __DSC_H + +#include "solvespace.h" + +class Vector; +class Vector4; +class Point2d; +class hEntity; +class hParam; + +class Quaternion { +public: + // a + (vx)*i + (vy)*j + (vz)*k + double w, vx, vy, vz; + + static const Quaternion IDENTITY; + + static Quaternion From(double w, double vx, double vy, double vz); + static Quaternion From(hParam w, hParam vx, hParam vy, hParam vz); + static Quaternion From(Vector u, Vector v); + static Quaternion From(Vector axis, double dtheta); + + Quaternion Plus(Quaternion b); + Quaternion Minus(Quaternion b); + Quaternion ScaledBy(double s); + double Magnitude(void); + Quaternion WithMagnitude(double s); + + // Call a rotation matrix [ u' v' n' ]'; this returns the first and + // second rows, where that matrix is generated by this quaternion + Vector RotationU(void); + Vector RotationV(void); + Vector RotationN(void); + Vector Rotate(Vector p); + + Quaternion ToThe(double p); + Quaternion Inverse(void); + Quaternion Times(Quaternion b); + Quaternion Mirror(void); +}; + +class Vector { +public: + double x, y, z; + + static Vector From(double x, double y, double z); + static Vector From(hParam x, hParam y, hParam z); + static Vector AtIntersectionOfPlanes(Vector n1, double d1, + Vector n2, double d2); + static Vector AtIntersectionOfLines(Vector a0, Vector a1, + Vector b0, Vector b1, + bool *skew, + double *pa=NULL, double *pb=NULL); + static Vector AtIntersectionOfPlaneAndLine(Vector n, double d, + Vector p0, Vector p1, + bool *parallel); + static Vector AtIntersectionOfPlanes(Vector na, double da, + Vector nb, double db, + Vector nc, double dc, bool *parallel); + static void ClosestPointBetweenLines(Vector pa, Vector da, + Vector pb, Vector db, + double *ta, double *tb); + + double Element(int i); + bool Equals(Vector v, double tol=LENGTH_EPS); + bool EqualsExactly(Vector v); + Vector Plus(Vector b); + Vector Minus(Vector b); + Vector Negated(void); + Vector Cross(Vector b); + double DirectionCosineWith(Vector b); + double Dot(Vector b); + Vector Normal(int which); + Vector RotatedAbout(Vector orig, Vector axis, double theta); + Vector RotatedAbout(Vector axis, double theta); + Vector DotInToCsys(Vector u, Vector v, Vector n); + Vector ScaleOutOfCsys(Vector u, Vector v, Vector n); + double DistanceToLine(Vector p0, Vector dp); + bool OnLineSegment(Vector a, Vector b, double tol=LENGTH_EPS); + Vector ClosestPointOnLine(Vector p0, Vector dp); + double Magnitude(void); + double MagSquared(void); + Vector WithMagnitude(double s); + Vector ScaledBy(double s); + Vector ProjectInto(hEntity wrkpl); + Vector ProjectVectorInto(hEntity wrkpl); + double DivPivoting(Vector delta); + Vector ClosestOrtho(void); + void MakeMaxMin(Vector *maxv, Vector *minv); + Vector ClampWithin(double minv, double maxv); + static bool BoundingBoxesDisjoint(Vector amax, Vector amin, + Vector bmax, Vector bmin); + static bool BoundingBoxIntersectsLine(Vector amax, Vector amin, + Vector p0, Vector p1, bool segment); + bool OutsideAndNotOn(Vector maxv, Vector minv); + Vector InPerspective(Vector u, Vector v, Vector n, + Vector origin, double cameraTan); + Point2d Project2d(Vector u, Vector v); + Point2d ProjectXy(void); + Vector4 Project4d(void); +}; + +class Vector4 { +public: + double w, x, y, z; + + static Vector4 From(double w, double x, double y, double z); + static Vector4 From(double w, Vector v3); + static Vector4 Blend(Vector4 a, Vector4 b, double t); + + Vector4 Plus(Vector4 b); + Vector4 Minus(Vector4 b); + Vector4 ScaledBy(double s); + Vector PerspectiveProject(void); +}; + +class Point2d { +public: + double x, y; + + static Point2d From(double x, double y); + + Point2d Plus(const Point2d &b) const; + Point2d Minus(const Point2d &b) const; + Point2d ScaledBy(double s) const; + double DivPivoting(Point2d delta) const; + double Dot(Point2d p) const; + double DistanceTo(const Point2d &p) const; + double DistanceToLine(const Point2d &p0, const Point2d &dp, bool segment) const; + double Magnitude(void) const; + double MagSquared(void) const; + Point2d WithMagnitude(double v) const; + Point2d Normal(void) const; + bool Equals(Point2d v, double tol=LENGTH_EPS) const; +}; + +// A simple list +template +class List { +public: + T *elem; + int n; + int elemsAllocated; + + void AllocForOneMore(void) { + if(n >= elemsAllocated) { + elemsAllocated = (elemsAllocated + 32)*2; + T *newElem = (T *)MemAlloc((size_t)elemsAllocated*sizeof(elem[0])); + for(int i = 0; i < n; i++) { + new(&newElem[i]) T(std::move(elem[i])); + elem[i].~T(); + } + MemFree(elem); + elem = newElem; + } + } + + void Add(T *t) { + AllocForOneMore(); + new(&elem[n++]) T(*t); + } + + void AddToBeginning(T *t) { + AllocForOneMore(); + new(&elem[n]) T(); + std::move_backward(elem, elem + 1, elem + n + 1); + elem[0] = *t; + n++; + } + + T *First(void) { + return (n == 0) ? NULL : &(elem[0]); + } + T *NextAfter(T *prev) { + if(!prev) return NULL; + if(prev - elem == (n - 1)) return NULL; + return prev + 1; + } + + void ClearTags(void) { + int i; + for(i = 0; i < n; i++) { + elem[i].tag = 0; + } + } + + void Clear(void) { + for(int i = 0; i < n; i++) + elem[i].~T(); + if(elem) MemFree(elem); + elem = NULL; + n = elemsAllocated = 0; + } + + void RemoveTagged(void) { + int src, dest; + dest = 0; + for(src = 0; src < n; src++) { + if(elem[src].tag) { + // this item should be deleted + } else { + if(src != dest) { + elem[dest] = elem[src]; + } + dest++; + } + } + for(int i = dest; i < n; i++) + elem[i].~T(); + n = dest; + // and elemsAllocated is untouched, because we didn't resize + } + + void RemoveLast(int cnt) { + if(n < cnt) oops(); + for(int i = n - cnt; i < n; i++) + elem[i].~T(); + n -= cnt; + // and elemsAllocated is untouched, same as in RemoveTagged + } + + void Reverse(void) { + int i; + for(i = 0; i < (n/2); i++) { + swap(elem[i], elem[(n-1)-i]); + } + } +}; + +// A list, where each element has an integer identifier. The list is kept +// sorted by that identifier, and items can be looked up in log n time by +// id. +template +class IdList { +public: + T *elem; + int n; + int elemsAllocated; + + uint32_t MaximumId(void) { + uint32_t id = 0; + + int i; + for(i = 0; i < n; i++) { + id = max(id, elem[i].h.v); + } + return id; + } + + H AddAndAssignId(T *t) { + t->h.v = (MaximumId() + 1); + Add(t); + + return t->h; + } + + void Add(T *t) { + if(n >= elemsAllocated) { + elemsAllocated = (elemsAllocated + 32)*2; + T *newElem = (T *)MemAlloc((size_t)elemsAllocated*sizeof(elem[0])); + for(int i = 0; i < n; i++) { + new(&newElem[i]) T(std::move(elem[i])); + elem[i].~T(); + } + MemFree(elem); + elem = newElem; + } + + int first = 0, last = n; + // We know that we must insert within the closed interval [first,last] + while(first != last) { + int mid = (first + last)/2; + H hm = elem[mid].h; + if(hm.v > t->h.v) { + last = mid; + } else if(hm.v < t->h.v) { + first = mid + 1; + } else { + dbp("can't insert in list; is handle %d not unique?", t->h.v); + oops(); + } + } + + int i = first; + new(&elem[n]) T(); + std::move_backward(elem + i, elem + n, elem + n + 1); + elem[i] = *t; + n++; + } + + T *FindById(H h) { + T *t = FindByIdNoOops(h); + if(!t) { + dbp("failed to look up item %08x, searched %d items", h.v, n); + oops(); + } + return t; + } + + int IndexOf(H h) { + int first = 0, last = n-1; + while(first <= last) { + int mid = (first + last)/2; + H hm = elem[mid].h; + if(hm.v > h.v) { + last = mid-1; // and first stays the same + } else if(hm.v < h.v) { + first = mid+1; // and last stays the same + } else { + return mid; + } + } + return -1; + } + + T *FindByIdNoOops(H h) { + int first = 0, last = n-1; + while(first <= last) { + int mid = (first + last)/2; + H hm = elem[mid].h; + if(hm.v > h.v) { + last = mid-1; // and first stays the same + } else if(hm.v < h.v) { + first = mid+1; // and last stays the same + } else { + return &(elem[mid]); + } + } + return NULL; + } + + T *First(void) { + return (n == 0) ? NULL : &(elem[0]); + } + T *NextAfter(T *prev) { + if(!prev) return NULL; + if(prev - elem == (n - 1)) return NULL; + return prev + 1; + } + + void ClearTags(void) { + int i; + for(i = 0; i < n; i++) { + elem[i].tag = 0; + } + } + + void Tag(H h, int tag) { + int i; + for(i = 0; i < n; i++) { + if(elem[i].h.v == h.v) { + elem[i].tag = tag; + } + } + } + + void RemoveTagged(void) { + int src, dest; + dest = 0; + for(src = 0; src < n; src++) { + if(elem[src].tag) { + // this item should be deleted + } else { + if(src != dest) { + elem[dest] = elem[src]; + } + dest++; + } + } + for(int i = dest; i < n; i++) + elem[i].~T(); + n = dest; + // and elemsAllocated is untouched, because we didn't resize + } + void RemoveById(H h) { + ClearTags(); + FindById(h)->tag = 1; + RemoveTagged(); + } + + void MoveSelfInto(IdList *l) { + l->Clear(); + *l = *this; + elemsAllocated = n = 0; + elem = NULL; + } + + void DeepCopyInto(IdList *l) { + l->Clear(); + l->elem = (T *)MemAlloc(elemsAllocated * sizeof(elem[0])); + for(int i = 0; i < n; i++) + new(&l->elem[i]) T(elem[i]); + l->elemsAllocated = elemsAllocated; + l->n = n; + } + + void Clear(void) { + for(int i = 0; i < n; i++) { + elem[i].Clear(); + elem[i].~T(); + } + elemsAllocated = n = 0; + if(elem) MemFree(elem); + elem = NULL; + } + +}; + +class BandedMatrix { +public: + enum { + MAX_UNKNOWNS = 16, + RIGHT_OF_DIAG = 1, + LEFT_OF_DIAG = 2 + }; + + double A[MAX_UNKNOWNS][MAX_UNKNOWNS]; + double B[MAX_UNKNOWNS]; + double X[MAX_UNKNOWNS]; + int n; + + void Solve(void); +}; + +#define RGBi(r, g, b) RgbaColor::From((r), (g), (b)) +#define RGBf(r, g, b) RgbaColor::FromFloat((float)(r), (float)(g), (float)(b)) + +// Note: sizeof(class RgbaColor) should be exactly 4 +// +class RgbaColor { +public: + uint8_t red, green, blue, alpha; + + float redF(void) const { return (float)red / 255.0f; } + float greenF(void) const { return (float)green / 255.0f; } + float blueF(void) const { return (float)blue / 255.0f; } + float alphaF(void) const { return (float)alpha / 255.0f; } + + bool Equals(RgbaColor c) const { + return + c.red == red && + c.green == green && + c.blue == blue && + c.alpha == alpha; + } + + uint32_t ToPackedIntBGRA(void) const { + return + blue | + (uint32_t)(green << 8) | + (uint32_t)(red << 16) | + (uint32_t)((255 - alpha) << 24); + } + + uint32_t ToPackedInt(void) const { + return + red | + (uint32_t)(green << 8) | + (uint32_t)(blue << 16) | + (uint32_t)((255 - alpha) << 24); + } + + uint32_t ToARGB32(void) const { + return + blue | + (uint32_t)(green << 8) | + (uint32_t)(red << 16) | + (uint32_t)(alpha << 24); + } + + static RgbaColor From(int r, int g, int b, int a = 255) { + RgbaColor c; + c.red = (uint8_t)r; + c.green = (uint8_t)g; + c.blue = (uint8_t)b; + c.alpha = (uint8_t)a; + return c; + } + + static RgbaColor FromFloat(float r, float g, float b, float a = 1.0) { + return From( + (int)(255.1f * r), + (int)(255.1f * g), + (int)(255.1f * b), + (int)(255.1f * a)); + } + + static RgbaColor FromPackedInt(uint32_t rgba) { + return From( + (int)((rgba) & 0xff), + (int)((rgba >> 8) & 0xff), + (int)((rgba >> 16) & 0xff), + (int)(255 - ((rgba >> 24) & 0xff))); + } + + static RgbaColor FromPackedIntBGRA(uint32_t bgra) { + return From( + (int)((bgra >> 16) & 0xff), + (int)((bgra >> 8) & 0xff), + (int)((bgra) & 0xff), + (int)(255 - ((bgra >> 24) & 0xff))); + } + +}; + +class BBox { +public: + Vector minp; + Vector maxp; + + static BBox From(const Vector &p0, const Vector &p1); + + Vector GetOrigin(); + Vector GetExtents(); + + void Include(const Vector &v, double r = 0.0); + bool Overlaps(BBox &b1); + bool Contains(const Point2d &p); +}; + +#endif diff --git a/src/entity.cpp b/src/entity.cpp new file mode 100644 index 0000000..7f4a3a7 --- /dev/null +++ b/src/entity.cpp @@ -0,0 +1,793 @@ +//----------------------------------------------------------------------------- +// The implementation of our entities in the symbolic algebra system, methods +// to return a symbolic representation of the entity (line by its endpoints, +// circle by center and radius, etc.). +// +// Copyright 2008-2013 Jonathan Westhues. +//----------------------------------------------------------------------------- +#include "solvespace.h" + +const hEntity EntityBase::FREE_IN_3D = { 0 }; +const hEntity EntityBase::NO_ENTITY = { 0 }; + +bool EntityBase::HasVector(void) { + switch(type) { + case LINE_SEGMENT: + case NORMAL_IN_3D: + case NORMAL_IN_2D: + case NORMAL_N_COPY: + case NORMAL_N_ROT: + case NORMAL_N_ROT_AA: + return true; + + default: + return false; + } +} + +ExprVector EntityBase::VectorGetExprs(void) { + switch(type) { + case LINE_SEGMENT: + return (SK.GetEntity(point[0])->PointGetExprs()).Minus( + SK.GetEntity(point[1])->PointGetExprs()); + + case NORMAL_IN_3D: + case NORMAL_IN_2D: + case NORMAL_N_COPY: + case NORMAL_N_ROT: + case NORMAL_N_ROT_AA: + return NormalExprsN(); + + default: oops(); + } +} + +Vector EntityBase::VectorGetNum(void) { + switch(type) { + case LINE_SEGMENT: + return (SK.GetEntity(point[0])->PointGetNum()).Minus( + SK.GetEntity(point[1])->PointGetNum()); + + case NORMAL_IN_3D: + case NORMAL_IN_2D: + case NORMAL_N_COPY: + case NORMAL_N_ROT: + case NORMAL_N_ROT_AA: + return NormalN(); + + default: oops(); + } +} + +Vector EntityBase::VectorGetRefPoint(void) { + switch(type) { + case LINE_SEGMENT: + return ((SK.GetEntity(point[0])->PointGetNum()).Plus( + SK.GetEntity(point[1])->PointGetNum())).ScaledBy(0.5); + + case NORMAL_IN_3D: + case NORMAL_IN_2D: + case NORMAL_N_COPY: + case NORMAL_N_ROT: + case NORMAL_N_ROT_AA: + return SK.GetEntity(point[0])->PointGetNum(); + + default: oops(); + } +} + +Vector EntityBase::VectorGetStartPoint(void) { + switch(type) { + case LINE_SEGMENT: + return SK.GetEntity(point[1])->PointGetNum(); + + case NORMAL_IN_3D: + case NORMAL_IN_2D: + case NORMAL_N_COPY: + case NORMAL_N_ROT: + case NORMAL_N_ROT_AA: + return SK.GetEntity(point[0])->PointGetNum(); + + default: oops(); + } +} + +bool EntityBase::IsCircle(void) { + return (type == CIRCLE) || (type == ARC_OF_CIRCLE); +} + +Expr *EntityBase::CircleGetRadiusExpr(void) { + if(type == CIRCLE) { + return SK.GetEntity(distance)->DistanceGetExpr(); + } else if(type == ARC_OF_CIRCLE) { + return Constraint::Distance(workplane, point[0], point[1]); + } else oops(); +} + +double EntityBase::CircleGetRadiusNum(void) { + if(type == CIRCLE) { + return SK.GetEntity(distance)->DistanceGetNum(); + } else if(type == ARC_OF_CIRCLE) { + Vector c = SK.GetEntity(point[0])->PointGetNum(); + Vector pa = SK.GetEntity(point[1])->PointGetNum(); + return (pa.Minus(c)).Magnitude(); + } else oops(); +} + +void EntityBase::ArcGetAngles(double *thetaa, double *thetab, double *dtheta) { + if(type != ARC_OF_CIRCLE) oops(); + + Quaternion q = Normal()->NormalGetNum(); + Vector u = q.RotationU(), v = q.RotationV(); + + Vector c = SK.GetEntity(point[0])->PointGetNum(); + Vector pa = SK.GetEntity(point[1])->PointGetNum(); + Vector pb = SK.GetEntity(point[2])->PointGetNum(); + + Point2d c2 = c.Project2d(u, v); + Point2d pa2 = (pa.Project2d(u, v)).Minus(c2); + Point2d pb2 = (pb.Project2d(u, v)).Minus(c2); + + *thetaa = atan2(pa2.y, pa2.x); + *thetab = atan2(pb2.y, pb2.x); + *dtheta = *thetab - *thetaa; + // If the endpoints are coincident, call it a full arc, not a zero arc; + // useful concept to have when splitting + while(*dtheta < 1e-6) *dtheta += 2*PI; + while(*dtheta > (2*PI)) *dtheta -= 2*PI; +} + +Vector EntityBase::CubicGetStartNum(void) { + return SK.GetEntity(point[0])->PointGetNum(); +} +Vector EntityBase::CubicGetFinishNum(void) { + return SK.GetEntity(point[3+extraPoints])->PointGetNum(); +} +ExprVector EntityBase::CubicGetStartTangentExprs(void) { + ExprVector pon = SK.GetEntity(point[0])->PointGetExprs(), + poff = SK.GetEntity(point[1])->PointGetExprs(); + return (pon.Minus(poff)); +} +ExprVector EntityBase::CubicGetFinishTangentExprs(void) { + ExprVector pon = SK.GetEntity(point[3+extraPoints])->PointGetExprs(), + poff = SK.GetEntity(point[2+extraPoints])->PointGetExprs(); + return (pon.Minus(poff)); +} +Vector EntityBase::CubicGetStartTangentNum(void) { + Vector pon = SK.GetEntity(point[0])->PointGetNum(), + poff = SK.GetEntity(point[1])->PointGetNum(); + return (pon.Minus(poff)); +} +Vector EntityBase::CubicGetFinishTangentNum(void) { + Vector pon = SK.GetEntity(point[3+extraPoints])->PointGetNum(), + poff = SK.GetEntity(point[2+extraPoints])->PointGetNum(); + return (pon.Minus(poff)); +} + +bool EntityBase::IsWorkplane(void) { + return (type == WORKPLANE); +} + +ExprVector EntityBase::WorkplaneGetOffsetExprs(void) { + return SK.GetEntity(point[0])->PointGetExprs(); +} + +Vector EntityBase::WorkplaneGetOffset(void) { + return SK.GetEntity(point[0])->PointGetNum(); +} + +void EntityBase::WorkplaneGetPlaneExprs(ExprVector *n, Expr **dn) { + if(type == WORKPLANE) { + *n = Normal()->NormalExprsN(); + + ExprVector p0 = SK.GetEntity(point[0])->PointGetExprs(); + // The plane is n dot (p - p0) = 0, or + // n dot p - n dot p0 = 0 + // so dn = n dot p0 + *dn = p0.Dot(*n); + } else { + oops(); + } +} + +bool EntityBase::IsDistance(void) { + return (type == DISTANCE) || + (type == DISTANCE_N_COPY); +} +double EntityBase::DistanceGetNum(void) { + if(type == DISTANCE) { + return SK.GetParam(param[0])->val; + } else if(type == DISTANCE_N_COPY) { + return numDistance; + } else oops(); +} +Expr *EntityBase::DistanceGetExpr(void) { + if(type == DISTANCE) { + return Expr::From(param[0]); + } else if(type == DISTANCE_N_COPY) { + return Expr::From(numDistance); + } else oops(); +} +void EntityBase::DistanceForceTo(double v) { + if(type == DISTANCE) { + (SK.GetParam(param[0]))->val = v; + } else if(type == DISTANCE_N_COPY) { + // do nothing, it's locked + } else oops(); +} + +EntityBase *EntityBase::Normal(void) { + return SK.GetEntity(normal); +} + +bool EntityBase::IsPoint(void) { + switch(type) { + case POINT_IN_3D: + case POINT_IN_2D: + case POINT_N_COPY: + case POINT_N_TRANS: + case POINT_N_ROT_TRANS: + case POINT_N_ROT_AA: + return true; + + default: + return false; + } +} + +bool EntityBase::IsNormal(void) { + switch(type) { + case NORMAL_IN_3D: + case NORMAL_IN_2D: + case NORMAL_N_COPY: + case NORMAL_N_ROT: + case NORMAL_N_ROT_AA: + return true; + + default: return false; + } +} + +Quaternion EntityBase::NormalGetNum(void) { + Quaternion q; + switch(type) { + case NORMAL_IN_3D: + q = Quaternion::From(param[0], param[1], param[2], param[3]); + break; + + case NORMAL_IN_2D: { + EntityBase *wrkpl = SK.GetEntity(workplane); + EntityBase *norm = SK.GetEntity(wrkpl->normal); + q = norm->NormalGetNum(); + break; + } + case NORMAL_N_COPY: + q = numNormal; + break; + + case NORMAL_N_ROT: + q = Quaternion::From(param[0], param[1], param[2], param[3]); + q = q.Times(numNormal); + break; + + case NORMAL_N_ROT_AA: { + q = GetAxisAngleQuaternion(0); + q = q.Times(numNormal); + break; + } + + default: oops(); + } + return q; +} + +void EntityBase::NormalForceTo(Quaternion q) { + switch(type) { + case NORMAL_IN_3D: + SK.GetParam(param[0])->val = q.w; + SK.GetParam(param[1])->val = q.vx; + SK.GetParam(param[2])->val = q.vy; + SK.GetParam(param[3])->val = q.vz; + break; + + case NORMAL_IN_2D: + case NORMAL_N_COPY: + // There's absolutely nothing to do; these are locked. + break; + case NORMAL_N_ROT: { + Quaternion qp = q.Times(numNormal.Inverse()); + + SK.GetParam(param[0])->val = qp.w; + SK.GetParam(param[1])->val = qp.vx; + SK.GetParam(param[2])->val = qp.vy; + SK.GetParam(param[3])->val = qp.vz; + break; + } + + case NORMAL_N_ROT_AA: + // Not sure if I'll bother implementing this one + break; + + default: oops(); + } +} + +Vector EntityBase::NormalU(void) { + return NormalGetNum().RotationU(); +} +Vector EntityBase::NormalV(void) { + return NormalGetNum().RotationV(); +} +Vector EntityBase::NormalN(void) { + return NormalGetNum().RotationN(); +} + +ExprVector EntityBase::NormalExprsU(void) { + return NormalGetExprs().RotationU(); +} +ExprVector EntityBase::NormalExprsV(void) { + return NormalGetExprs().RotationV(); +} +ExprVector EntityBase::NormalExprsN(void) { + return NormalGetExprs().RotationN(); +} + +ExprQuaternion EntityBase::NormalGetExprs(void) { + ExprQuaternion q; + switch(type) { + case NORMAL_IN_3D: + q = ExprQuaternion::From(param[0], param[1], param[2], param[3]); + break; + + case NORMAL_IN_2D: { + EntityBase *wrkpl = SK.GetEntity(workplane); + EntityBase *norm = SK.GetEntity(wrkpl->normal); + q = norm->NormalGetExprs(); + break; + } + case NORMAL_N_COPY: + q = ExprQuaternion::From(numNormal); + break; + + case NORMAL_N_ROT: { + ExprQuaternion orig = ExprQuaternion::From(numNormal); + q = ExprQuaternion::From(param[0], param[1], param[2], param[3]); + + q = q.Times(orig); + break; + } + + case NORMAL_N_ROT_AA: { + ExprQuaternion orig = ExprQuaternion::From(numNormal); + q = GetAxisAngleQuaternionExprs(0); + q = q.Times(orig); + break; + } + + default: oops(); + } + return q; +} + +void EntityBase::PointForceTo(Vector p) { + switch(type) { + case POINT_IN_3D: + SK.GetParam(param[0])->val = p.x; + SK.GetParam(param[1])->val = p.y; + SK.GetParam(param[2])->val = p.z; + break; + + case POINT_IN_2D: { + EntityBase *c = SK.GetEntity(workplane); + p = p.Minus(c->WorkplaneGetOffset()); + SK.GetParam(param[0])->val = p.Dot(c->Normal()->NormalU()); + SK.GetParam(param[1])->val = p.Dot(c->Normal()->NormalV()); + break; + } + + case POINT_N_TRANS: { + if(timesApplied == 0) break; + Vector trans = (p.Minus(numPoint)).ScaledBy(1.0/timesApplied); + SK.GetParam(param[0])->val = trans.x; + SK.GetParam(param[1])->val = trans.y; + SK.GetParam(param[2])->val = trans.z; + break; + } + + case POINT_N_ROT_TRANS: { + // Force only the translation; leave the rotation unchanged. But + // remember that we're working with respect to the rotated + // point. + Vector trans = p.Minus(PointGetQuaternion().Rotate(numPoint)); + SK.GetParam(param[0])->val = trans.x; + SK.GetParam(param[1])->val = trans.y; + SK.GetParam(param[2])->val = trans.z; + break; + } + + case POINT_N_ROT_AA: { + // Force only the angle; the axis and center of rotation stay + Vector offset = Vector::From(param[0], param[1], param[2]); + Vector normal = Vector::From(param[4], param[5], param[6]); + Vector u = normal.Normal(0), v = normal.Normal(1); + Vector po = p.Minus(offset), numo = numPoint.Minus(offset); + double thetap = atan2(v.Dot(po), u.Dot(po)); + double thetan = atan2(v.Dot(numo), u.Dot(numo)); + double thetaf = (thetap - thetan); + double thetai = (SK.GetParam(param[3])->val)*timesApplied*2; + double dtheta = thetaf - thetai; + // Take the smallest possible change in the actual step angle, + // in order to avoid jumps when you cross from +pi to -pi + while(dtheta < -PI) dtheta += 2*PI; + while(dtheta > PI) dtheta -= 2*PI; + SK.GetParam(param[3])->val = (thetai + dtheta)/(timesApplied*2); + break; + } + + case POINT_N_COPY: + // Nothing to do; it's a static copy + break; + + default: oops(); + } +} + +Vector EntityBase::PointGetNum(void) { + Vector p; + switch(type) { + case POINT_IN_3D: + p = Vector::From(param[0], param[1], param[2]); + break; + + case POINT_IN_2D: { + EntityBase *c = SK.GetEntity(workplane); + Vector u = c->Normal()->NormalU(); + Vector v = c->Normal()->NormalV(); + p = u.ScaledBy(SK.GetParam(param[0])->val); + p = p.Plus(v.ScaledBy(SK.GetParam(param[1])->val)); + p = p.Plus(c->WorkplaneGetOffset()); + break; + } + + case POINT_N_TRANS: { + Vector trans = Vector::From(param[0], param[1], param[2]); + p = numPoint.Plus(trans.ScaledBy(timesApplied)); + break; + } + + case POINT_N_ROT_TRANS: { + Vector offset = Vector::From(param[0], param[1], param[2]); + Quaternion q = PointGetQuaternion(); + p = q.Rotate(numPoint); + p = p.Plus(offset); + break; + } + + case POINT_N_ROT_AA: { + Vector offset = Vector::From(param[0], param[1], param[2]); + Quaternion q = PointGetQuaternion(); + p = numPoint.Minus(offset); + p = q.Rotate(p); + p = p.Plus(offset); + break; + } + + case POINT_N_COPY: + p = numPoint; + break; + + default: oops(); + } + return p; +} + +ExprVector EntityBase::PointGetExprs(void) { + ExprVector r; + switch(type) { + case POINT_IN_3D: + r = ExprVector::From(param[0], param[1], param[2]); + break; + + case POINT_IN_2D: { + EntityBase *c = SK.GetEntity(workplane); + ExprVector u = c->Normal()->NormalExprsU(); + ExprVector v = c->Normal()->NormalExprsV(); + r = c->WorkplaneGetOffsetExprs(); + r = r.Plus(u.ScaledBy(Expr::From(param[0]))); + r = r.Plus(v.ScaledBy(Expr::From(param[1]))); + break; + } + case POINT_N_TRANS: { + ExprVector orig = ExprVector::From(numPoint); + ExprVector trans = ExprVector::From(param[0], param[1], param[2]); + r = orig.Plus(trans.ScaledBy(Expr::From(timesApplied))); + break; + } + case POINT_N_ROT_TRANS: { + ExprVector orig = ExprVector::From(numPoint); + ExprVector trans = ExprVector::From(param[0], param[1], param[2]); + ExprQuaternion q = + ExprQuaternion::From(param[3], param[4], param[5], param[6]); + orig = q.Rotate(orig); + r = orig.Plus(trans); + break; + } + case POINT_N_ROT_AA: { + ExprVector orig = ExprVector::From(numPoint); + ExprVector trans = ExprVector::From(param[0], param[1], param[2]); + ExprQuaternion q = GetAxisAngleQuaternionExprs(3); + orig = orig.Minus(trans); + orig = q.Rotate(orig); + r = orig.Plus(trans); + break; + } + case POINT_N_COPY: + r = ExprVector::From(numPoint); + break; + + default: oops(); + } + return r; +} + +void EntityBase::PointGetExprsInWorkplane(hEntity wrkpl, Expr **u, Expr **v) { + if(type == POINT_IN_2D && workplane.v == wrkpl.v) { + // They want our coordinates in the form that we've written them, + // very nice. + *u = Expr::From(param[0]); + *v = Expr::From(param[1]); + } else { + // Get the offset and basis vectors for this weird exotic csys. + EntityBase *w = SK.GetEntity(wrkpl); + ExprVector wp = w->WorkplaneGetOffsetExprs(); + ExprVector wu = w->Normal()->NormalExprsU(); + ExprVector wv = w->Normal()->NormalExprsV(); + + // Get our coordinates in three-space, and project them into that + // coordinate system. + ExprVector ev = PointGetExprs(); + ev = ev.Minus(wp); + *u = ev.Dot(wu); + *v = ev.Dot(wv); + } +} + +void EntityBase::PointForceQuaternionTo(Quaternion q) { + if(type != POINT_N_ROT_TRANS) oops(); + + SK.GetParam(param[3])->val = q.w; + SK.GetParam(param[4])->val = q.vx; + SK.GetParam(param[5])->val = q.vy; + SK.GetParam(param[6])->val = q.vz; +} + +Quaternion EntityBase::GetAxisAngleQuaternion(int param0) { + Quaternion q; + double theta = timesApplied*SK.GetParam(param[param0+0])->val; + double s = sin(theta), c = cos(theta); + q.w = c; + q.vx = s*SK.GetParam(param[param0+1])->val; + q.vy = s*SK.GetParam(param[param0+2])->val; + q.vz = s*SK.GetParam(param[param0+3])->val; + return q; +} + +ExprQuaternion EntityBase::GetAxisAngleQuaternionExprs(int param0) { + ExprQuaternion q; + + Expr *theta = Expr::From(timesApplied)->Times( + Expr::From(param[param0+0])); + Expr *c = theta->Cos(), *s = theta->Sin(); + q.w = c; + q.vx = s->Times(Expr::From(param[param0+1])); + q.vy = s->Times(Expr::From(param[param0+2])); + q.vz = s->Times(Expr::From(param[param0+3])); + return q; +} + +Quaternion EntityBase::PointGetQuaternion(void) { + Quaternion q; + + if(type == POINT_N_ROT_AA) { + q = GetAxisAngleQuaternion(3); + } else if(type == POINT_N_ROT_TRANS) { + q = Quaternion::From(param[3], param[4], param[5], param[6]); + } else oops(); + + return q; +} + +bool EntityBase::IsFace(void) { + switch(type) { + case FACE_NORMAL_PT: + case FACE_XPROD: + case FACE_N_ROT_TRANS: + case FACE_N_TRANS: + case FACE_N_ROT_AA: + return true; + default: + return false; + } +} + +ExprVector EntityBase::FaceGetNormalExprs(void) { + ExprVector r; + if(type == FACE_NORMAL_PT) { + Vector v = Vector::From(numNormal.vx, numNormal.vy, numNormal.vz); + r = ExprVector::From(v.WithMagnitude(1)); + } else if(type == FACE_XPROD) { + ExprVector vc = ExprVector::From(param[0], param[1], param[2]); + ExprVector vn = + ExprVector::From(numNormal.vx, numNormal.vy, numNormal.vz); + r = vc.Cross(vn); + r = r.WithMagnitude(Expr::From(1.0)); + } else if(type == FACE_N_ROT_TRANS) { + // The numerical normal vector gets the rotation; the numerical + // normal has magnitude one, and the rotation doesn't change that, + // so there's no need to fix it up. + r = ExprVector::From(numNormal.vx, numNormal.vy, numNormal.vz); + ExprQuaternion q = + ExprQuaternion::From(param[3], param[4], param[5], param[6]); + r = q.Rotate(r); + } else if(type == FACE_N_TRANS) { + r = ExprVector::From(numNormal.vx, numNormal.vy, numNormal.vz); + } else if(type == FACE_N_ROT_AA) { + r = ExprVector::From(numNormal.vx, numNormal.vy, numNormal.vz); + ExprQuaternion q = GetAxisAngleQuaternionExprs(3); + r = q.Rotate(r); + } else oops(); + return r; +} + +Vector EntityBase::FaceGetNormalNum(void) { + Vector r; + if(type == FACE_NORMAL_PT) { + r = Vector::From(numNormal.vx, numNormal.vy, numNormal.vz); + } else if(type == FACE_XPROD) { + Vector vc = Vector::From(param[0], param[1], param[2]); + Vector vn = Vector::From(numNormal.vx, numNormal.vy, numNormal.vz); + r = vc.Cross(vn); + } else if(type == FACE_N_ROT_TRANS) { + // The numerical normal vector gets the rotation + r = Vector::From(numNormal.vx, numNormal.vy, numNormal.vz); + Quaternion q = Quaternion::From(param[3], param[4], param[5], param[6]); + r = q.Rotate(r); + } else if(type == FACE_N_TRANS) { + r = Vector::From(numNormal.vx, numNormal.vy, numNormal.vz); + } else if(type == FACE_N_ROT_AA) { + r = Vector::From(numNormal.vx, numNormal.vy, numNormal.vz); + Quaternion q = GetAxisAngleQuaternion(3); + r = q.Rotate(r); + } else oops(); + return r.WithMagnitude(1); +} + +ExprVector EntityBase::FaceGetPointExprs(void) { + ExprVector r; + if(type == FACE_NORMAL_PT) { + r = SK.GetEntity(point[0])->PointGetExprs(); + } else if(type == FACE_XPROD) { + r = ExprVector::From(numPoint); + } else if(type == FACE_N_ROT_TRANS) { + // The numerical point gets the rotation and translation. + ExprVector trans = ExprVector::From(param[0], param[1], param[2]); + ExprQuaternion q = + ExprQuaternion::From(param[3], param[4], param[5], param[6]); + r = ExprVector::From(numPoint); + r = q.Rotate(r); + r = r.Plus(trans); + } else if(type == FACE_N_TRANS) { + ExprVector trans = ExprVector::From(param[0], param[1], param[2]); + r = ExprVector::From(numPoint); + r = r.Plus(trans.ScaledBy(Expr::From(timesApplied))); + } else if(type == FACE_N_ROT_AA) { + ExprVector trans = ExprVector::From(param[0], param[1], param[2]); + ExprQuaternion q = GetAxisAngleQuaternionExprs(3); + r = ExprVector::From(numPoint); + r = r.Minus(trans); + r = q.Rotate(r); + r = r.Plus(trans); + } else oops(); + return r; +} + +Vector EntityBase::FaceGetPointNum(void) { + Vector r; + if(type == FACE_NORMAL_PT) { + r = SK.GetEntity(point[0])->PointGetNum(); + } else if(type == FACE_XPROD) { + r = numPoint; + } else if(type == FACE_N_ROT_TRANS) { + // The numerical point gets the rotation and translation. + Vector trans = Vector::From(param[0], param[1], param[2]); + Quaternion q = Quaternion::From(param[3], param[4], param[5], param[6]); + r = q.Rotate(numPoint); + r = r.Plus(trans); + } else if(type == FACE_N_TRANS) { + Vector trans = Vector::From(param[0], param[1], param[2]); + r = numPoint.Plus(trans.ScaledBy(timesApplied)); + } else if(type == FACE_N_ROT_AA) { + Vector trans = Vector::From(param[0], param[1], param[2]); + Quaternion q = GetAxisAngleQuaternion(3); + r = numPoint.Minus(trans); + r = q.Rotate(r); + r = r.Plus(trans); + } else oops(); + return r; +} + +bool EntityBase::HasEndpoints(void) { + return (type == LINE_SEGMENT) || + (type == CUBIC) || + (type == ARC_OF_CIRCLE); +} +Vector EntityBase::EndpointStart() { + if(type == LINE_SEGMENT) { + return SK.GetEntity(point[0])->PointGetNum(); + } else if(type == CUBIC) { + return CubicGetStartNum(); + } else if(type == ARC_OF_CIRCLE) { + return SK.GetEntity(point[1])->PointGetNum(); + } else { + oops(); + } +} +Vector EntityBase::EndpointFinish() { + if(type == LINE_SEGMENT) { + return SK.GetEntity(point[1])->PointGetNum(); + } else if(type == CUBIC) { + return CubicGetFinishNum(); + } else if(type == ARC_OF_CIRCLE) { + return SK.GetEntity(point[2])->PointGetNum(); + } else { + oops(); + } +} + +void EntityBase::AddEq(IdList *l, Expr *expr, int index) { + Equation eq; + eq.e = expr; + eq.h = h.equation(index); + l->Add(&eq); +} + +void EntityBase::GenerateEquations(IdList *l) { + switch(type) { + case NORMAL_IN_3D: { + ExprQuaternion q = NormalGetExprs(); + AddEq(l, (q.Magnitude())->Minus(Expr::From(1)), 0); + break; + } + case ARC_OF_CIRCLE: { + // If this is a copied entity, with its point already fixed + // with respect to each other, then we don't want to generate + // the distance constraint! + if(SK.GetEntity(point[0])->type != POINT_IN_2D) break; + + // If the two endpoints of the arc are constrained coincident + // (to make a complete circle), then our distance constraint + // would be redundant and therefore overconstrain things. + int i; + for(i = 0; i < SK.constraint.n; i++) { + ConstraintBase *c = &(SK.constraint.elem[i]); + if(c->group.v != group.v) continue; + if(c->type != Constraint::POINTS_COINCIDENT) continue; + + if((c->ptA.v == point[1].v && c->ptB.v == point[2].v) || + (c->ptA.v == point[2].v && c->ptB.v == point[1].v)) + { + break; + } + } + if(i < SK.constraint.n) break; + + Expr *ra = Constraint::Distance(workplane, point[0], point[1]); + Expr *rb = Constraint::Distance(workplane, point[0], point[2]); + AddEq(l, ra->Minus(rb), 0); + break; + } + default:; + // Most entities do not generate equations. + } +} + diff --git a/src/export.cpp b/src/export.cpp new file mode 100644 index 0000000..857ff60 --- /dev/null +++ b/src/export.cpp @@ -0,0 +1,1550 @@ +//----------------------------------------------------------------------------- +// The 2d vector output stuff that isn't specific to any particular file +// format: getting the appropriate lines and curves, performing hidden line +// removal, calculating bounding boxes, and so on. Also raster and triangle +// mesh output. +// +// Copyright 2008-2013 Jonathan Westhues. +//----------------------------------------------------------------------------- +#include "solvespace.h" +#ifndef WIN32 +#include +#endif +#include + +void SolveSpaceUI::ExportSectionTo(const std::string &filename) { + Vector gn = (SS.GW.projRight).Cross(SS.GW.projUp); + gn = gn.WithMagnitude(1); + + Group *g = SK.GetGroup(SS.GW.activeGroup); + g->GenerateDisplayItems(); + if(g->displayMesh.IsEmpty()) { + Error("No solid model present; draw one with extrudes and revolves, " + "or use Export 2d View to export bare lines and curves."); + return; + } + + // The plane in which the exported section lies; need this because we'll + // reorient from that plane into the xy plane before exporting. + Vector origin, u, v, n; + double d; + + SS.GW.GroupSelection(); +#define gs (SS.GW.gs) + if((gs.n == 0 && g->activeWorkplane.v != Entity::FREE_IN_3D.v)) { + Entity *wrkpl = SK.GetEntity(g->activeWorkplane); + origin = wrkpl->WorkplaneGetOffset(); + n = wrkpl->Normal()->NormalN(); + u = wrkpl->Normal()->NormalU(); + v = wrkpl->Normal()->NormalV(); + } else if(gs.n == 1 && gs.faces == 1) { + Entity *face = SK.GetEntity(gs.entity[0]); + origin = face->FaceGetPointNum(); + n = face->FaceGetNormalNum(); + if(n.Dot(gn) < 0) n = n.ScaledBy(-1); + u = n.Normal(0); + v = n.Normal(1); + } else if(gs.n == 3 && gs.vectors == 2 && gs.points == 1) { + Vector ut = SK.GetEntity(gs.entity[0])->VectorGetNum(), + vt = SK.GetEntity(gs.entity[1])->VectorGetNum(); + ut = ut.WithMagnitude(1); + vt = vt.WithMagnitude(1); + + if(fabs(SS.GW.projUp.Dot(vt)) < fabs(SS.GW.projUp.Dot(ut))) { + swap(ut, vt); + } + if(SS.GW.projRight.Dot(ut) < 0) ut = ut.ScaledBy(-1); + if(SS.GW.projUp. Dot(vt) < 0) vt = vt.ScaledBy(-1); + + origin = SK.GetEntity(gs.point[0])->PointGetNum(); + n = ut.Cross(vt); + u = ut.WithMagnitude(1); + v = (n.Cross(u)).WithMagnitude(1); + } else { + Error("Bad selection for export section. Please select:\n\n" + " * nothing, with an active workplane " + "(workplane is section plane)\n" + " * a face (section plane through face)\n" + " * a point and two line segments " + "(plane through point and parallel to lines)\n"); + return; + } + SS.GW.ClearSelection(); + + n = n.WithMagnitude(1); + d = origin.Dot(n); + + SEdgeList el = {}; + SBezierList bl = {}; + + // If there's a mesh, then grab the edges from it. + g->runningMesh.MakeEdgesInPlaneInto(&el, n, d); + + // If there's a shell, then grab the edges and possibly Beziers. + g->runningShell.MakeSectionEdgesInto(n, d, + &el, + (SS.exportPwlCurves || fabs(SS.exportOffset) > LENGTH_EPS) ? NULL : &bl); + + // All of these are solid model edges, so use the appropriate style. + SEdge *se; + for(se = el.l.First(); se; se = el.l.NextAfter(se)) { + se->auxA = Style::SOLID_EDGE; + } + SBezier *sb; + for(sb = bl.l.First(); sb; sb = bl.l.NextAfter(sb)) { + sb->auxA = Style::SOLID_EDGE; + } + + el.CullExtraneousEdges(); + bl.CullIdenticalBeziers(); + + // And write the edges. + VectorFileWriter *out = VectorFileWriter::ForFile(filename); + if(out) { + // parallel projection (no perspective), and no mesh + ExportLinesAndMesh(&el, &bl, NULL, + u, v, n, origin, 0, + out); + } + el.Clear(); + bl.Clear(); +} + +void SolveSpaceUI::ExportViewOrWireframeTo(const std::string &filename, bool wireframe) { + int i; + SEdgeList edges = {}; + SBezierList beziers = {}; + + VectorFileWriter *out = VectorFileWriter::ForFile(filename); + if(!out) return; + + SS.exportMode = true; + GenerateAll(GENERATE_ALL); + + SMesh *sm = NULL; + if(SS.GW.showShaded || SS.GW.showHdnLines) { + Group *g = SK.GetGroup(SS.GW.activeGroup); + g->GenerateDisplayItems(); + sm = &(g->displayMesh); + } + if(sm && sm->IsEmpty()) { + sm = NULL; + } + + for(i = 0; i < SK.entity.n; i++) { + Entity *e = &(SK.entity.elem[i]); + if(!e->IsVisible()) continue; + if(e->construction) continue; + + if(SS.exportPwlCurves || sm || fabs(SS.exportOffset) > LENGTH_EPS) + { + // We will be doing hidden line removal, which we can't do on + // exact curves; so we need things broken down to pwls. Same + // problem with cutter radius compensation. + e->GenerateEdges(&edges); + } else { + e->GenerateBezierCurves(&beziers); + } + } + + if(SS.GW.showEdges) { + Group *g = SK.GetGroup(SS.GW.activeGroup); + g->GenerateDisplayItems(); + SEdgeList *selr = &(g->displayEdges); + SEdge *se; + for(se = selr->l.First(); se; se = selr->l.NextAfter(se)) { + edges.AddEdge(se->a, se->b, Style::SOLID_EDGE); + } + } + + if(SS.GW.showConstraints) { + if(!out->OutputConstraints(&SK.constraint)) { + // The output format cannot represent constraints directly, + // so convert them to edges. + Constraint *c; + for(c = SK.constraint.First(); c; c = SK.constraint.NextAfter(c)) { + c->GetEdges(&edges); + } + } + } + + if(wireframe) { + Vector u = Vector::From(1.0, 0.0, 0.0), + v = Vector::From(0.0, 1.0, 0.0), + n = Vector::From(0.0, 0.0, 1.0), + origin = Vector::From(0.0, 0.0, 0.0); + double cameraTan = 0.0, + scale = 1.0; + + out->SetModelviewProjection(u, v, n, origin, cameraTan, scale); + + ExportWireframeCurves(&edges, &beziers, out); + } else { + Vector u = SS.GW.projRight, + v = SS.GW.projUp, + n = u.Cross(v), + origin = SS.GW.offset.ScaledBy(-1); + + out->SetModelviewProjection(u, v, n, origin, + SS.CameraTangent()*SS.GW.scale, SS.exportScale); + + ExportLinesAndMesh(&edges, &beziers, sm, + u, v, n, origin, SS.CameraTangent()*SS.GW.scale, + out); + + if(!out->HasCanvasSize()) { + // These file formats don't have a canvas size, so they just + // get exported in the raw coordinate system. So indicate what + // that was on-screen. + SS.justExportedInfo.showOrigin = true; + SS.justExportedInfo.pt = origin; + SS.justExportedInfo.u = u; + SS.justExportedInfo.v = v; + } else { + SS.justExportedInfo.showOrigin = false; + } + + SS.justExportedInfo.draw = true; + InvalidateGraphics(); + } + + edges.Clear(); + beziers.Clear(); +} + +void SolveSpaceUI::ExportWireframeCurves(SEdgeList *sel, SBezierList *sbl, + VectorFileWriter *out) +{ + SBezierLoopSetSet sblss = {}; + SEdge *se; + for(se = sel->l.First(); se; se = sel->l.NextAfter(se)) { + SBezier sb = SBezier::From( + (se->a).ScaledBy(1.0 / SS.exportScale), + (se->b).ScaledBy(1.0 / SS.exportScale)); + sblss.AddOpenPath(&sb); + } + + sbl->ScaleSelfBy(1.0/SS.exportScale); + SBezier *sb; + for(sb = sbl->l.First(); sb; sb = sbl->l.NextAfter(sb)) { + sblss.AddOpenPath(sb); + } + + out->OutputLinesAndMesh(&sblss, NULL); + sblss.Clear(); +} + +void SolveSpaceUI::ExportLinesAndMesh(SEdgeList *sel, SBezierList *sbl, SMesh *sm, + Vector u, Vector v, Vector n, + Vector origin, double cameraTan, + VectorFileWriter *out) +{ + double s = 1.0 / SS.exportScale; + + // Project into the export plane; so when we're done, z doesn't matter, + // and x and y are what goes in the DXF. + SEdge *e; + for(e = sel->l.First(); e; e = sel->l.NextAfter(e)) { + // project into the specified csys, and apply export scale + (e->a) = e->a.InPerspective(u, v, n, origin, cameraTan).ScaledBy(s); + (e->b) = e->b.InPerspective(u, v, n, origin, cameraTan).ScaledBy(s); + } + + SBezier *b; + if(sbl) { + for(b = sbl->l.First(); b; b = sbl->l.NextAfter(b)) { + *b = b->InPerspective(u, v, n, origin, cameraTan); + int i; + for(i = 0; i <= b->deg; i++) { + b->ctrl[i] = (b->ctrl[i]).ScaledBy(s); + } + } + } + + // If cutter radius compensation is requested, then perform it now + if(fabs(SS.exportOffset) > LENGTH_EPS) { + // assemble those edges into a polygon, and clear the edge list + SPolygon sp = {}; + sel->AssemblePolygon(&sp, NULL); + sel->Clear(); + + SPolygon compd = {}; + sp.normal = Vector::From(0, 0, -1); + sp.FixContourDirections(); + sp.OffsetInto(&compd, SS.exportOffset*s); + sp.Clear(); + + compd.MakeEdgesInto(sel); + compd.Clear(); + } + + // Now the triangle mesh; project, then build a BSP to perform + // occlusion testing and generated the shaded surfaces. + SMesh smp = {}; + if(sm) { + Vector l0 = (SS.lightDir[0]).WithMagnitude(1), + l1 = (SS.lightDir[1]).WithMagnitude(1); + STriangle *tr; + for(tr = sm->l.First(); tr; tr = sm->l.NextAfter(tr)) { + STriangle tt = *tr; + tt.a = (tt.a).InPerspective(u, v, n, origin, cameraTan).ScaledBy(s); + tt.b = (tt.b).InPerspective(u, v, n, origin, cameraTan).ScaledBy(s); + tt.c = (tt.c).InPerspective(u, v, n, origin, cameraTan).ScaledBy(s); + + // And calculate lighting for the triangle + Vector n = tt.Normal().WithMagnitude(1); + double lighting = SS.ambientIntensity + + max(0.0, (SS.lightIntensity[0])*(n.Dot(l0))) + + max(0.0, (SS.lightIntensity[1])*(n.Dot(l1))); + double r = min(1.0, tt.meta.color.redF() * lighting), + g = min(1.0, tt.meta.color.greenF() * lighting), + b = min(1.0, tt.meta.color.blueF() * lighting); + tt.meta.color = RGBf(r, g, b); + smp.AddTriangle(&tt); + } + } + + SMesh sms = {}; + + // We need the mesh for occlusion testing, but if we don't/can't export it, + // don't generate it. + if(SS.GW.showShaded && out->CanOutputMesh()) { + // Use the BSP routines to generate the split triangles in paint order. + SBsp3 *bsp = SBsp3::FromMesh(&smp); + if(bsp) bsp->GenerateInPaintOrder(&sms); + // And cull the back-facing triangles + STriangle *tr; + sms.l.ClearTags(); + for(tr = sms.l.First(); tr; tr = sms.l.NextAfter(tr)) { + Vector n = tr->Normal(); + if(n.z < 0) { + tr->tag = 1; + } + } + sms.l.RemoveTagged(); + } + + // And now we perform hidden line removal if requested + SEdgeList hlrd = {}; + if(sm) { + SKdNode *root = SKdNode::From(&smp); + + // Generate the edges where a curved surface turns from front-facing + // to back-facing. + if(SS.GW.showEdges) { + root->MakeCertainEdgesInto(sel, SKdNode::TURNING_EDGES, + /*coplanarIsInter=*/false, NULL, NULL, + GW.showOutlines ? Style::OUTLINE : Style::SOLID_EDGE); + } + + root->ClearTags(); + int cnt = 1234; + + SEdge *se; + for(se = sel->l.First(); se; se = sel->l.NextAfter(se)) { + if(se->auxA == Style::CONSTRAINT) { + // Constraints should not get hidden line removed; they're + // always on top. + hlrd.AddEdge(se->a, se->b, se->auxA); + continue; + } + + SEdgeList edges = {}; + // Split the original edge against the mesh + edges.AddEdge(se->a, se->b, se->auxA); + root->OcclusionTestLine(*se, &edges, cnt, /*removeHidden=*/!SS.GW.showHdnLines); + // the occlusion test splits unnecessarily; so fix those + edges.MergeCollinearSegments(se->a, se->b); + cnt++; + // And add the results to our output + SEdge *sen; + for(sen = edges.l.First(); sen; sen = edges.l.NextAfter(sen)) { + hlrd.AddEdge(sen->a, sen->b, sen->auxA); + } + edges.Clear(); + } + + sel = &hlrd; + } + + // Clean up: remove overlapping line segments and + // segments with zero-length projections. + sel->l.ClearTags(); + for(int i = 0; i < sel->l.n; ++i) { + SEdge *sei = &sel->l.elem[i]; + hStyle hsi = { (uint32_t)sei->auxA }; + Style *si = Style::Get(hsi); + if(sei->tag != 0) continue; + + // Remove segments with zero length projections. + Vector ai = sei->a; + ai.z = 0.0; + Vector bi = sei->b; + bi.z = 0.0; + Vector di = bi.Minus(ai); + if(fabs(di.x) < LENGTH_EPS && fabs(di.y) < LENGTH_EPS) { + sei->tag = 1; + continue; + } + + for(int j = i + 1; j < sel->l.n; ++j) { + SEdge *sej = &sel->l.elem[j]; + if(sej->tag != 0) continue; + + Vector *pAj = &sej->a; + Vector *pBj = &sej->b; + + // Remove segments with zero length projections. + Vector aj = sej->a; + aj.z = 0.0; + Vector bj = sej->b; + bj.z = 0.0; + Vector dj = bj.Minus(aj); + if(fabs(dj.x) < LENGTH_EPS && fabs(dj.y) < LENGTH_EPS) { + sej->tag = 1; + continue; + } + + // Skip non-collinear segments. + const double eps = 1e-6; + if(aj.DistanceToLine(ai, di) > eps) continue; + if(bj.DistanceToLine(ai, di) > eps) continue; + + double ta = aj.Minus(ai).Dot(di) / di.Dot(di); + double tb = bj.Minus(ai).Dot(di) / di.Dot(di); + if(ta > tb) { + std::swap(pAj, pBj); + std::swap(ta, tb); + } + + hStyle hsj = { (uint32_t)sej->auxA }; + Style *sj = Style::Get(hsj); + + bool canRemoveI = sej->auxA == sei->auxA || si->zIndex < sj->zIndex; + bool canRemoveJ = sej->auxA == sei->auxA || sj->zIndex < si->zIndex; + + if(canRemoveJ) { + // j-segment inside i-segment + if(ta > 0.0 - eps && tb < 1.0 + eps) { + sej->tag = 1; + continue; + } + + // cut segment + bool aInside = ta > 0.0 - eps && ta < 1.0 + eps; + if(tb > 1.0 - eps && aInside) { + *pAj = sei->b; + continue; + } + + // cut segment + bool bInside = tb > 0.0 - eps && tb < 1.0 + eps; + if(ta < 0.0 - eps && bInside) { + *pBj = sei->a; + continue; + } + + // split segment + if(ta < 0.0 - eps && tb > 1.0 + eps) { + sel->AddEdge(sei->b, *pBj, sej->auxA, sej->auxB); + *pBj = sei->a; + continue; + } + } + + if(canRemoveI) { + // j-segment inside i-segment + if(ta < 0.0 + eps && tb > 1.0 - eps) { + sei->tag = 1; + break; + } + + // cut segment + bool aInside = ta > 0.0 + eps && ta < 1.0 - eps; + if(tb > 1.0 - eps && aInside) { + sei->b = *pAj; + i--; + break; + } + + // cut segment + bool bInside = tb > 0.0 + eps && tb < 1.0 - eps; + if(ta < 0.0 + eps && bInside) { + sei->a = *pBj; + i--; + break; + } + + // split segment + if(ta > 0.0 + eps && tb < 1.0 - eps) { + sel->AddEdge(*pBj, sei->b, sei->auxA, sei->auxB); + sei->b = *pAj; + i--; + break; + } + } + } + } + sel->l.RemoveTagged(); + + // We kept the line segments and Beziers separate until now; but put them + // all together, and also project everything into the xy plane, since not + // all export targets ignore the z component of the points. + for(e = sel->l.First(); e; e = sel->l.NextAfter(e)) { + SBezier sb = SBezier::From(e->a, e->b); + sb.auxA = e->auxA; + sbl->l.Add(&sb); + } + for(b = sbl->l.First(); b; b = sbl->l.NextAfter(b)) { + for(int i = 0; i <= b->deg; i++) { + b->ctrl[i].z = 0; + } + } + + // If possible, then we will assemble these output curves into loops. They + // will then get exported as closed paths. + SBezierLoopSetSet sblss = {}; + SBezierList leftovers = {}; + SSurface srf = SSurface::FromPlane(Vector::From(0, 0, 0), + Vector::From(1, 0, 0), + Vector::From(0, 1, 0)); + SPolygon spxyz = {}; + bool allClosed; + SEdge notClosedAt; + sbl->l.ClearTags(); + sblss.FindOuterFacesFrom(sbl, &spxyz, &srf, + SS.ExportChordTolMm(), + &allClosed, ¬ClosedAt, + NULL, NULL, + &leftovers); + for(b = leftovers.l.First(); b; b = leftovers.l.NextAfter(b)) { + sblss.AddOpenPath(b); + } + + // Now write the lines and triangles to the output file + out->OutputLinesAndMesh(&sblss, &sms); + + leftovers.Clear(); + spxyz.Clear(); + sblss.Clear(); + smp.Clear(); + sms.Clear(); + hlrd.Clear(); +} + +double VectorFileWriter::MmToPts(double mm) { + // 72 points in an inch + return (mm/25.4)*72; +} + +VectorFileWriter *VectorFileWriter::ForFile(const std::string &filename) { + VectorFileWriter *ret; + bool needOpen = true; + if(FilenameHasExtension(filename, ".dxf")) { + static DxfFileWriter DxfWriter; + ret = &DxfWriter; + needOpen = false; + } else if(FilenameHasExtension(filename, ".ps") || FilenameHasExtension(filename, ".eps")) { + static EpsFileWriter EpsWriter; + ret = &EpsWriter; + } else if(FilenameHasExtension(filename, ".pdf")) { + static PdfFileWriter PdfWriter; + ret = &PdfWriter; + } else if(FilenameHasExtension(filename, ".svg")) { + static SvgFileWriter SvgWriter; + ret = &SvgWriter; + } else if(FilenameHasExtension(filename, ".plt")||FilenameHasExtension(filename, ".hpgl")) { + static HpglFileWriter HpglWriter; + ret = &HpglWriter; + } else if(FilenameHasExtension(filename, ".step")||FilenameHasExtension(filename, ".stp")) { + static Step2dFileWriter Step2dWriter; + ret = &Step2dWriter; + } else if(FilenameHasExtension(filename, ".txt")) { + static GCodeFileWriter GCodeWriter; + ret = &GCodeWriter; + } else { + Error("Can't identify output file type from file extension of " + "filename '%s'; try " + ".step, .stp, .dxf, .svg, .plt, .hpgl, .pdf, .txt, " + ".eps, or .ps.", + filename.c_str()); + return NULL; + } + ret->filename = filename; + if(!needOpen) return ret; + + FILE *f = ssfopen(filename, "wb"); + if(!f) { + Error("Couldn't write to '%s'", filename.c_str()); + return NULL; + } + ret->f = f; + return ret; +} + +void VectorFileWriter::SetModelviewProjection(const Vector &u, const Vector &v, const Vector &n, + const Vector &origin, double cameraTan, + double scale) { + this->u = u; + this->v = v; + this->n = n; + this->origin = origin; + this->cameraTan = cameraTan; + this->scale = scale; +} + +Vector VectorFileWriter::Transform(Vector &pos) const { + return pos.InPerspective(u, v, n, origin, cameraTan).ScaledBy(1.0 / scale); +} + +void VectorFileWriter::OutputLinesAndMesh(SBezierLoopSetSet *sblss, SMesh *sm) { + STriangle *tr; + SBezier *b; + + // First calculate the bounding box. + ptMin = Vector::From(VERY_POSITIVE, VERY_POSITIVE, VERY_POSITIVE); + ptMax = Vector::From(VERY_NEGATIVE, VERY_NEGATIVE, VERY_NEGATIVE); + if(sm) { + for(tr = sm->l.First(); tr; tr = sm->l.NextAfter(tr)) { + (tr->a).MakeMaxMin(&ptMax, &ptMin); + (tr->b).MakeMaxMin(&ptMax, &ptMin); + (tr->c).MakeMaxMin(&ptMax, &ptMin); + } + } + if(sblss) { + SBezierLoopSet *sbls; + for(sbls = sblss->l.First(); sbls; sbls = sblss->l.NextAfter(sbls)) { + SBezierLoop *sbl; + for(sbl = sbls->l.First(); sbl; sbl = sbls->l.NextAfter(sbl)) { + for(b = sbl->l.First(); b; b = sbl->l.NextAfter(b)) { + for(int i = 0; i <= b->deg; i++) { + (b->ctrl[i]).MakeMaxMin(&ptMax, &ptMin); + } + } + } + } + } + + // And now we compute the canvas size. + double s = 1.0 / SS.exportScale; + if(SS.exportCanvasSizeAuto) { + // It's based on the calculated bounding box; we grow it along each + // boundary by the specified amount. + ptMin.x -= s*SS.exportMargin.left; + ptMax.x += s*SS.exportMargin.right; + ptMin.y -= s*SS.exportMargin.bottom; + ptMax.y += s*SS.exportMargin.top; + } else { + ptMin.x = -(s*SS.exportCanvas.dx); + ptMin.y = -(s*SS.exportCanvas.dy); + ptMax.x = ptMin.x + (s*SS.exportCanvas.width); + ptMax.y = ptMin.y + (s*SS.exportCanvas.height); + } + + StartFile(); + if(sm && SS.exportShadedTriangles) { + for(tr = sm->l.First(); tr; tr = sm->l.NextAfter(tr)) { + Triangle(tr); + } + } + if(sblss) { + SBezierLoopSet *sbls; + for(sbls = sblss->l.First(); sbls; sbls = sblss->l.NextAfter(sbls)) { + SBezierLoop *sbl; + sbl = sbls->l.First(); + if(!sbl) continue; + b = sbl->l.First(); + if(!b || !Style::Exportable(b->auxA)) continue; + + hStyle hs = { (uint32_t)b->auxA }; + Style *stl = Style::Get(hs); + double lineWidth = Style::WidthMm(b->auxA)*s; + RgbaColor strokeRgb = Style::Color(hs, true); + RgbaColor fillRgb = Style::FillColor(hs, true); + + StartPath(strokeRgb, lineWidth, stl->filled, fillRgb, hs); + for(sbl = sbls->l.First(); sbl; sbl = sbls->l.NextAfter(sbl)) { + for(b = sbl->l.First(); b; b = sbl->l.NextAfter(b)) { + Bezier(b); + } + } + FinishPath(strokeRgb, lineWidth, stl->filled, fillRgb, hs); + } + } + FinishAndCloseFile(); +} + +void VectorFileWriter::BezierAsPwl(SBezier *sb) { + List lv = {}; + sb->MakePwlInto(&lv, SS.ExportChordTolMm()); + int i; + for(i = 1; i < lv.n; i++) { + SBezier sb = SBezier::From(lv.elem[i-1], lv.elem[i]); + Bezier(&sb); + } + lv.Clear(); +} + +void VectorFileWriter::BezierAsNonrationalCubic(SBezier *sb, int depth) { + Vector t0 = sb->TangentAt(0), t1 = sb->TangentAt(1); + // The curve is correct, and the first derivatives are correct, at the + // endpoints. + SBezier bnr = SBezier::From( + sb->Start(), + sb->Start().Plus(t0.ScaledBy(1.0/3)), + sb->Finish().Minus(t1.ScaledBy(1.0/3)), + sb->Finish()); + + double tol = SS.ExportChordTolMm(); + // Arbitrary choice, but make it a little finer than pwl tolerance since + // it should be easier to achieve that with the smooth curves. + tol /= 2; + + bool closeEnough = true; + int i; + for(i = 1; i <= 3; i++) { + double t = i/4.0; + Vector p0 = sb->PointAt(t), + pn = bnr.PointAt(t); + double d = (p0.Minus(pn)).Magnitude(); + if(d > tol) { + closeEnough = false; + } + } + + if(closeEnough || depth > 3) { + Bezier(&bnr); + } else { + SBezier bef, aft; + sb->SplitAt(0.5, &bef, &aft); + BezierAsNonrationalCubic(&bef, depth+1); + BezierAsNonrationalCubic(&aft, depth+1); + } +} + +//----------------------------------------------------------------------------- +// Export a triangle mesh, in the requested format. +//----------------------------------------------------------------------------- +void SolveSpaceUI::ExportMeshTo(const std::string &filename) { + SS.exportMode = true; + GenerateAll(GENERATE_ALL); + + Group *g = SK.GetGroup(SS.GW.activeGroup); + g->GenerateDisplayItems(); + + SMesh *m = &(SK.GetGroup(SS.GW.activeGroup)->displayMesh); + if(m->IsEmpty()) { + Error("Active group mesh is empty; nothing to export."); + return; + } + + FILE *f = ssfopen(filename, "wb"); + if(!f) { + Error("Couldn't write to '%s'", filename.c_str()); + return; + } + + if(FilenameHasExtension(filename, ".stl")) { + ExportMeshAsStlTo(f, m); + } else if(FilenameHasExtension(filename, ".obj")) { + ExportMeshAsObjTo(f, m); + } else if(FilenameHasExtension(filename, ".js") || + FilenameHasExtension(filename, ".html")) { + SEdgeList *e = &(SK.GetGroup(SS.GW.activeGroup)->displayEdges); + ExportMeshAsThreeJsTo(f, filename, m, e); + } else { + Error("Can't identify output file type from file extension of " + "filename '%s'; try .stl, .obj, .js.", filename.c_str()); + } + + fclose(f); + + SS.justExportedInfo.showOrigin = false; + SS.justExportedInfo.draw = true; + InvalidateGraphics(); +} + +//----------------------------------------------------------------------------- +// Export the mesh as an STL file; it should always be vertex-to-vertex and +// not self-intersecting, so not much to do. +//----------------------------------------------------------------------------- +void SolveSpaceUI::ExportMeshAsStlTo(FILE *f, SMesh *sm) { + char str[80] = {}; + strcpy(str, "STL exported mesh"); + fwrite(str, 1, 80, f); + + uint32_t n = sm->l.n; + fwrite(&n, 4, 1, f); + + double s = SS.exportScale; + int i; + for(i = 0; i < sm->l.n; i++) { + STriangle *tr = &(sm->l.elem[i]); + Vector n = tr->Normal().WithMagnitude(1); + float w; + w = (float)n.x; fwrite(&w, 4, 1, f); + w = (float)n.y; fwrite(&w, 4, 1, f); + w = (float)n.z; fwrite(&w, 4, 1, f); + w = (float)((tr->a.x)/s); fwrite(&w, 4, 1, f); + w = (float)((tr->a.y)/s); fwrite(&w, 4, 1, f); + w = (float)((tr->a.z)/s); fwrite(&w, 4, 1, f); + w = (float)((tr->b.x)/s); fwrite(&w, 4, 1, f); + w = (float)((tr->b.y)/s); fwrite(&w, 4, 1, f); + w = (float)((tr->b.z)/s); fwrite(&w, 4, 1, f); + w = (float)((tr->c.x)/s); fwrite(&w, 4, 1, f); + w = (float)((tr->c.y)/s); fwrite(&w, 4, 1, f); + w = (float)((tr->c.z)/s); fwrite(&w, 4, 1, f); + fputc(0, f); + fputc(0, f); + } +} + +//----------------------------------------------------------------------------- +// Export the mesh as Wavefront OBJ format. This requires us to reduce all the +// identical vertices to the same identifier, so do that first. +//----------------------------------------------------------------------------- +void SolveSpaceUI::ExportMeshAsObjTo(FILE *f, SMesh *sm) { + SPointList spl = {}; + STriangle *tr; + for(tr = sm->l.First(); tr; tr = sm->l.NextAfter(tr)) { + spl.IncrementTagFor(tr->a); + spl.IncrementTagFor(tr->b); + spl.IncrementTagFor(tr->c); + } + + // Output all the vertices. + SPoint *sp; + for(sp = spl.l.First(); sp; sp = spl.l.NextAfter(sp)) { + fprintf(f, "v %.10f %.10f %.10f\r\n", + sp->p.x / SS.exportScale, + sp->p.y / SS.exportScale, + sp->p.z / SS.exportScale); + } + + // And now all the triangular faces, in terms of those vertices. The + // file format counts from 1, not 0. + for(tr = sm->l.First(); tr; tr = sm->l.NextAfter(tr)) { + fprintf(f, "f %d %d %d\r\n", + spl.IndexForPoint(tr->a) + 1, + spl.IndexForPoint(tr->b) + 1, + spl.IndexForPoint(tr->c) + 1); + } + + spl.Clear(); +} + +//----------------------------------------------------------------------------- +// Export the mesh as a JavaScript script, which is compatible with Three.js. +//----------------------------------------------------------------------------- +void SolveSpaceUI::ExportMeshAsThreeJsTo(FILE *f, const std::string &filename, + SMesh *sm, SEdgeList *sel) +{ + SPointList spl = {}; + STriangle *tr; + SEdge *e; + Vector bndl, bndh; + const char htmlbegin0[] = R"( + + + + + Three.js Solvespace Mesh + + + + + + + + + +)"; + + // A default three.js viewer with OrthographicTrackballControls is + // generated as a comment preceding the data. + + // x bounds should be the range of x or y, whichever + // is larger, before aspect ratio correction is applied. + // y bounds should be the range of x or y, whichever is + // larger. No aspect ratio correction is applied. + // Near plane should be 1. + // Camera's z-position should be the range of z + 1 or the larger of + // the x or y bounds, whichever is larger. + // Far plane should be at least twice as much as the camera's + // z-position. + // Edge projection bias should be about 1/500 of the far plane's distance. + // Further corrections will be applied to the z-position and far plane in + // the default viewer, but the defaults are fine for a model which + // only rotates about the world origin. + + sm->GetBounding(&bndh, &bndl); + double largerBoundXY = max((bndh.x - bndl.x), (bndh.y - bndl.y)); + double largerBoundZ = max(largerBoundXY, (bndh.z - bndl.z + 1)); + + std::string extension = filename, + noExtFilename = filename; + size_t dot = noExtFilename.rfind('.'); + extension.erase(0, dot + 1); + noExtFilename.erase(dot); + + std::string baseFilename = noExtFilename; + size_t lastSlash = baseFilename.rfind(PATH_SEP); + if(lastSlash == std::string::npos) oops(); + baseFilename.erase(0, lastSlash + 1); + + for(size_t i = 0; i < baseFilename.length(); i++) { + if(!isalpha(baseFilename[i]) && + /* also permit UTF-8 */ !((unsigned char)baseFilename[i] >= 0x80)) + baseFilename[i] = '_'; + } + + if(extension == "html") { + fputs(htmlbegin0, f); + fputs(htmlbegin1, f); + } + + fprintf(f, "var solvespace_model_%s = {\n" + " bounds: {\n" + " x: %f, y: %f, near: %f, far: %f, z: %f, edgeBias: %f\n" + " },\n", + baseFilename.c_str(), + largerBoundXY, + largerBoundXY, + 1.0, + largerBoundZ * 2, + largerBoundZ, + largerBoundZ / 250); + + // Output lighting information. + fputs(" lights: {\n" + " d: [\n", f); + + // Directional. + int lightCount; + for(lightCount = 0; lightCount < 2; lightCount++) + { + fprintf(f, " {\n" + " intensity: %f, direction: [%f, %f, %f]\n" + " },\n", + SS.lightIntensity[lightCount], + CO(SS.lightDir[lightCount])); + } + + // Global Ambience. + fprintf(f, " ],\n" + " a: %f\n", SS.ambientIntensity); + + for(tr = sm->l.First(); tr; tr = sm->l.NextAfter(tr)) { + spl.IncrementTagFor(tr->a); + spl.IncrementTagFor(tr->b); + spl.IncrementTagFor(tr->c); + } + + // Output all the vertices. + SPoint *sp; + fputs(" },\n" + " points: [\n", f); + for(sp = spl.l.First(); sp; sp = spl.l.NextAfter(sp)) { + fprintf(f, " [%f, %f, %f],\n", + sp->p.x / SS.exportScale, + sp->p.y / SS.exportScale, + sp->p.z / SS.exportScale); + } + + fputs(" ],\n" + " faces: [\n", f); + // And now all the triangular faces, in terms of those vertices. + // This time we count from zero. + for(tr = sm->l.First(); tr; tr = sm->l.NextAfter(tr)) { + fprintf(f, " [%d, %d, %d],\n", + spl.IndexForPoint(tr->a), + spl.IndexForPoint(tr->b), + spl.IndexForPoint(tr->c)); + } + + // Output face normals. + fputs(" ],\n" + " normals: [\n", f); + for(tr = sm->l.First(); tr; tr = sm->l.NextAfter(tr)) { + fprintf(f, " [[%f, %f, %f], [%f, %f, %f], [%f, %f, %f]],\n", + CO(tr->an), CO(tr->bn), CO(tr->cn)); + } + + fputs(" ],\n" + " colors: [\n", f); + // Output triangle colors. + for(tr = sm->l.First(); tr; tr = sm->l.NextAfter(tr)) { + fprintf(f, " 0x%x,\n", tr->meta.color.ToARGB32()); + } + + fputs(" ],\n" + " edges: [\n", f); + // Output edges. Assume user's model colors do not obscure white edges. + for(e = sel->l.First(); e; e = sel->l.NextAfter(e)) { + fprintf(f, " [[%f, %f, %f], [%f, %f, %f]],\n", + e->a.x / SS.exportScale, + e->a.y / SS.exportScale, + e->a.z / SS.exportScale, + e->b.x / SS.exportScale, + e->b.y / SS.exportScale, + e->b.z / SS.exportScale); + } + + fputs(" ]\n};\n", f); + + if(extension == "html") + fprintf(f, htmlend, baseFilename.c_str()); + + spl.Clear(); +} + +//----------------------------------------------------------------------------- +// Export a view of the model as an image; we just take a screenshot, by +// rendering the view in the usual way and then copying the pixels. +//----------------------------------------------------------------------------- +void SolveSpaceUI::ExportAsPngTo(const std::string &filename) { + int w = (int)SS.GW.width, h = (int)SS.GW.height; + // No guarantee that the back buffer contains anything valid right now, + // so repaint the scene. And hide the toolbar too. + bool prevShowToolbar = SS.showToolbar; + SS.showToolbar = false; +#ifndef WIN32 + std::unique_ptr gloffscreen(new GLOffscreen); + gloffscreen->begin(w, h); +#endif + SS.GW.Paint(); + SS.showToolbar = prevShowToolbar; + + FILE *f = ssfopen(filename, "wb"); + if(!f) goto err; + + png_struct *png_ptr; png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, + NULL, NULL, NULL); + if(!png_ptr) goto err; + + png_info *info_ptr; info_ptr = png_create_info_struct(png_ptr); + if(!png_ptr) goto err; + + if(setjmp(png_jmpbuf(png_ptr))) goto err; + + png_init_io(png_ptr, f); + + // glReadPixels wants to align things on 4-boundaries, and there's 3 + // bytes per pixel. As long as the row width is divisible by 4, all + // works out. + w &= ~3; h &= ~3; + + png_set_IHDR(png_ptr, info_ptr, w, h, + 8, PNG_COLOR_TYPE_RGB, PNG_INTERLACE_NONE, + PNG_COMPRESSION_TYPE_DEFAULT,PNG_FILTER_TYPE_DEFAULT); + + png_write_info(png_ptr, info_ptr); + + // Get the pixel data from the framebuffer + uint8_t *pixels; pixels = (uint8_t *)AllocTemporary(3*w*h); + uint8_t **rowptrs; rowptrs = (uint8_t **)AllocTemporary(h*sizeof(uint8_t *)); + glReadPixels(0, 0, w, h, GL_RGB, GL_UNSIGNED_BYTE, pixels); + + int y; + for(y = 0; y < h; y++) { + // gl puts the origin at lower left, but png puts it top left + rowptrs[y] = pixels + ((h - 1) - y)*(3*w); + } + png_write_image(png_ptr, rowptrs); + + png_write_end(png_ptr, info_ptr); + png_destroy_write_struct(&png_ptr, &info_ptr); + fclose(f); + return; + +err: + Error("Error writing PNG file '%s'", filename.c_str()); + if(f) fclose(f); + return; +} + diff --git a/src/exportstep.cpp b/src/exportstep.cpp new file mode 100644 index 0000000..8e3936c --- /dev/null +++ b/src/exportstep.cpp @@ -0,0 +1,373 @@ +//----------------------------------------------------------------------------- +// Export a STEP file describing our ratpoly shell. +// +// Copyright 2008-2013 Jonathan Westhues. +//----------------------------------------------------------------------------- +#include "solvespace.h" + +void StepFileWriter::WriteHeader(void) { + fprintf(f, +"ISO-10303-21;\n" +"HEADER;\n" +"\n" +"FILE_DESCRIPTION((''), '2;1');\n" +"\n" +"FILE_NAME(\n" +" 'output_file',\n" +" '2009-06-07T17:44:47-07:00',\n" +" (''),\n" +" (''),\n" +" 'SolveSpace',\n" +" '',\n" +" ''\n" +");\n" +"\n" +"FILE_SCHEMA (('CONFIG_CONTROL_DESIGN'));\n" +"ENDSEC;\n" +"\n" +"DATA;\n" +"\n" +"/**********************************************************\n" +" * This defines the units and tolerances for the file. It\n" +" * is always the same, independent of the actual data.\n" +" **********************************************************/\n" +"#158=(\n" +"LENGTH_UNIT()\n" +"NAMED_UNIT(*)\n" +"SI_UNIT(.MILLI.,.METRE.)\n" +");\n" +"#161=(\n" +"NAMED_UNIT(*)\n" +"PLANE_ANGLE_UNIT()\n" +"SI_UNIT($,.RADIAN.)\n" +");\n" +"#166=(\n" +"NAMED_UNIT(*)\n" +"SI_UNIT($,.STERADIAN.)\n" +"SOLID_ANGLE_UNIT()\n" +");\n" +"#167=UNCERTAINTY_MEASURE_WITH_UNIT(LENGTH_MEASURE(0.001),#158,\n" +"'DISTANCE_ACCURACY_VALUE',\n" +"'string');\n" +"#168=(\n" +"GEOMETRIC_REPRESENTATION_CONTEXT(3)\n" +"GLOBAL_UNCERTAINTY_ASSIGNED_CONTEXT((#167))\n" +"GLOBAL_UNIT_ASSIGNED_CONTEXT((#166,#161,#158))\n" +"REPRESENTATION_CONTEXT('ID1','3D')\n" +");\n" +"#169=SHAPE_REPRESENTATION('',(#170),#168);\n" +"#170=AXIS2_PLACEMENT_3D('',#173,#171,#172);\n" +"#171=DIRECTION('',(0.,0.,1.));\n" +"#172=DIRECTION('',(1.,0.,0.));\n" +"#173=CARTESIAN_POINT('',(0.,0.,0.));\n" +"\n" + ); + + // Start the ID somewhere beyond the header IDs. + id = 200; +} +void StepFileWriter::WriteProductHeader(void) { + fprintf(f, + "#175 = SHAPE_DEFINITION_REPRESENTATION(#176, #169);\n" + "#176 = PRODUCT_DEFINITION_SHAPE('Version', 'Test Part', #177);\n" + "#177 = PRODUCT_DEFINITION('Version', 'Test Part', #182, #178);\n" + "#178 = DESIGN_CONTEXT('3D Mechanical Parts', #181, 'design');\n" + "#179 = PRODUCT('1', 'Product', 'Test Part', (#180));\n" + "#180 = MECHANICAL_CONTEXT('3D Mechanical Parts', #181, 'mechanical');\n" + "#181 = APPLICATION_CONTEXT(\n" + "'configuration controlled 3d designs of mechanical parts and assemblies');\n" + "#182 = PRODUCT_DEFINITION_FORMATION_WITH_SPECIFIED_SOURCE('Version',\n" + "'Test Part', #179, .MADE.);\n" + "\n" + ); +} +int StepFileWriter::ExportCurve(SBezier *sb) { + int i, ret = id; + + fprintf(f, "#%d=(\n", ret); + fprintf(f, "BOUNDED_CURVE()\n"); + fprintf(f, "B_SPLINE_CURVE(%d,(", sb->deg); + for(i = 0; i <= sb->deg; i++) { + fprintf(f, "#%d", ret + i + 1); + if(i != sb->deg) fprintf(f, ","); + } + fprintf(f, "),.UNSPECIFIED.,.F.,.F.)\n"); + fprintf(f, "B_SPLINE_CURVE_WITH_KNOTS((%d,%d),", + (sb->deg + 1), (sb-> deg + 1)); + fprintf(f, "(0.000,1.000),.UNSPECIFIED.)\n"); + fprintf(f, "CURVE()\n"); + fprintf(f, "GEOMETRIC_REPRESENTATION_ITEM()\n"); + fprintf(f, "RATIONAL_B_SPLINE_CURVE(("); + for(i = 0; i <= sb->deg; i++) { + fprintf(f, "%.10f", sb->weight[i]); + if(i != sb->deg) fprintf(f, ","); + } + fprintf(f, "))\n"); + fprintf(f, "REPRESENTATION_ITEM('')\n);\n"); + + for(i = 0; i <= sb->deg; i++) { + fprintf(f, "#%d=CARTESIAN_POINT('',(%.10f,%.10f,%.10f));\n", + id + 1 + i, + CO(sb->ctrl[i])); + } + fprintf(f, "\n"); + + id = ret + 1 + (sb->deg + 1); + return ret; +} + +int StepFileWriter::ExportCurveLoop(SBezierLoop *loop, bool inner) { + if(loop->l.n < 1) oops(); + + List listOfTrims = {}; + + SBezier *sb = &(loop->l.elem[loop->l.n - 1]); + + // Generate "exactly closed" contours, with the same vertex id for the + // finish of a previous edge and the start of the next one. So we need + // the finish of the last Bezier in the loop before we start our process. + fprintf(f, "#%d=CARTESIAN_POINT('',(%.10f,%.10f,%.10f));\n", + id, CO(sb->Finish())); + fprintf(f, "#%d=VERTEX_POINT('',#%d);\n", id+1, id); + int lastFinish = id + 1, prevFinish = lastFinish; + id += 2; + + for(sb = loop->l.First(); sb; sb = loop->l.NextAfter(sb)) { + int curveId = ExportCurve(sb); + + int thisFinish; + if(loop->l.NextAfter(sb) != NULL) { + fprintf(f, "#%d=CARTESIAN_POINT('',(%.10f,%.10f,%.10f));\n", + id, CO(sb->Finish())); + fprintf(f, "#%d=VERTEX_POINT('',#%d);\n", id+1, id); + thisFinish = id + 1; + id += 2; + } else { + thisFinish = lastFinish; + } + + fprintf(f, "#%d=EDGE_CURVE('',#%d,#%d,#%d,%s);\n", + id, prevFinish, thisFinish, curveId, ".T."); + fprintf(f, "#%d=ORIENTED_EDGE('',*,*,#%d,.T.);\n", + id+1, id); + + int oe = id+1; + listOfTrims.Add(&oe); + id += 2; + + prevFinish = thisFinish; + } + + fprintf(f, "#%d=EDGE_LOOP('',(", id); + int *oe; + for(oe = listOfTrims.First(); oe; oe = listOfTrims.NextAfter(oe)) { + fprintf(f, "#%d", *oe); + if(listOfTrims.NextAfter(oe) != NULL) fprintf(f, ","); + } + fprintf(f, "));\n"); + + int fb = id + 1; + fprintf(f, "#%d=%s('',#%d,.T.);\n", + fb, inner ? "FACE_BOUND" : "FACE_OUTER_BOUND", id); + + id += 2; + listOfTrims.Clear(); + + return fb; +} + +void StepFileWriter::ExportSurface(SSurface *ss, SBezierList *sbl) { + int i, j, srfid = id; + + // First, we create the untrimmed surface. We always specify a rational + // B-spline surface (in fact, just a Bezier surface). + fprintf(f, "#%d=(\n", srfid); + fprintf(f, "BOUNDED_SURFACE()\n"); + fprintf(f, "B_SPLINE_SURFACE(%d,%d,(", ss->degm, ss->degn); + for(i = 0; i <= ss->degm; i++) { + fprintf(f, "("); + for(j = 0; j <= ss->degn; j++) { + fprintf(f, "#%d", srfid + 1 + j + i*(ss->degn + 1)); + if(j != ss->degn) fprintf(f, ","); + } + fprintf(f, ")"); + if(i != ss->degm) fprintf(f, ","); + } + fprintf(f, "),.UNSPECIFIED.,.F.,.F.,.F.)\n"); + fprintf(f, "B_SPLINE_SURFACE_WITH_KNOTS((%d,%d),(%d,%d),", + (ss->degm + 1), (ss->degm + 1), + (ss->degn + 1), (ss->degn + 1)); + fprintf(f, "(0.000,1.000),(0.000,1.000),.UNSPECIFIED.)\n"); + fprintf(f, "GEOMETRIC_REPRESENTATION_ITEM()\n"); + fprintf(f, "RATIONAL_B_SPLINE_SURFACE(("); + for(i = 0; i <= ss->degm; i++) { + fprintf(f, "("); + for(j = 0; j <= ss->degn; j++) { + fprintf(f, "%.10f", ss->weight[i][j]); + if(j != ss->degn) fprintf(f, ","); + } + fprintf(f, ")"); + if(i != ss->degm) fprintf(f, ","); + } + fprintf(f, "))\n"); + fprintf(f, "REPRESENTATION_ITEM('')\n"); + fprintf(f, "SURFACE()\n"); + fprintf(f, ");\n"); + + // The control points for the untrimmed surface. + for(i = 0; i <= ss->degm; i++) { + for(j = 0; j <= ss->degn; j++) { + fprintf(f, "#%d=CARTESIAN_POINT('',(%.10f,%.10f,%.10f));\n", + srfid + 1 + j + i*(ss->degn + 1), + CO(ss->ctrl[i][j])); + } + } + fprintf(f, "\n"); + + id = srfid + 1 + (ss->degm + 1)*(ss->degn + 1); + + // Now we do the trim curves. We must group each outer loop separately + // along with its inner faces, so do that now. + SBezierLoopSetSet sblss = {}; + SPolygon spxyz = {}; + bool allClosed; + SEdge notClosedAt; + // We specify a surface, so it doesn't check for coplanarity; and we + // don't want it to give us any open contours. The polygon and chord + // tolerance are required, because they are used to calculate the + // contour directions and determine inner vs. outer contours. + sblss.FindOuterFacesFrom(sbl, &spxyz, ss, + SS.ExportChordTolMm(), + &allClosed, ¬ClosedAt, + NULL, NULL, + NULL); + + // So in our list of SBezierLoopSet, each set contains at least one loop + // (the outer boundary), plus any inner loops associated with that outer + // loop. + SBezierLoopSet *sbls; + for(sbls = sblss.l.First(); sbls; sbls = sblss.l.NextAfter(sbls)) { + SBezierLoop *loop = sbls->l.First(); + + List listOfLoops = {}; + // Create the face outer boundary from the outer loop. + int fob = ExportCurveLoop(loop, false); + listOfLoops.Add(&fob); + + // And create the face inner boundaries from any inner loops that + // lie within this contour. + loop = sbls->l.NextAfter(loop); + for(; loop; loop = sbls->l.NextAfter(loop)) { + int fib = ExportCurveLoop(loop, true); + listOfLoops.Add(&fib); + } + + // And now create the face that corresponds to this outer loop + // and all of its holes. + int advFaceId = id; + fprintf(f, "#%d=ADVANCED_FACE('',(", advFaceId); + int *fb; + for(fb = listOfLoops.First(); fb; fb = listOfLoops.NextAfter(fb)) { + fprintf(f, "#%d", *fb); + if(listOfLoops.NextAfter(fb) != NULL) fprintf(f, ","); + } + + fprintf(f, "),#%d,.T.);\n", srfid); + fprintf(f, "\n"); + advancedFaces.Add(&advFaceId); + + id++; + listOfLoops.Clear(); + } + sblss.Clear(); + spxyz.Clear(); +} + +void StepFileWriter::WriteFooter(void) { + fprintf(f, +"\n" +"ENDSEC;\n" +"\n" +"END-ISO-10303-21;\n" + ); +} + +void StepFileWriter::ExportSurfacesTo(const std::string &filename) { + Group *g = SK.GetGroup(SS.GW.activeGroup); + SShell *shell = &(g->runningShell); + + if(shell->surface.n == 0) { + Error("The model does not contain any surfaces to export.%s", + g->runningMesh.l.n > 0 ? + "\n\nThe model does contain triangles from a mesh, but " + "a triangle mesh cannot be exported as a STEP file. Try " + "File -> Export Mesh... instead." : ""); + return; + } + + f = ssfopen(filename, "wb"); + if(!f) { + Error("Couldn't write to '%s'", filename.c_str()); + return; + } + + WriteHeader(); + WriteProductHeader(); + + advancedFaces = {}; + + SSurface *ss; + for(ss = shell->surface.First(); ss; ss = shell->surface.NextAfter(ss)) { + if(ss->trim.n == 0) continue; + + // Get all of the loops of Beziers that trim our surface (with each + // Bezier split so that we use the section as t goes from 0 to 1), and + // the piecewise linearization of those loops in xyz space. + SBezierList sbl = {}; + ss->MakeSectionEdgesInto(shell, NULL, &sbl); + + // Apply the export scale factor. + ss->ScaleSelfBy(1.0/SS.exportScale); + sbl.ScaleSelfBy(1.0/SS.exportScale); + + ExportSurface(ss, &sbl); + + sbl.Clear(); + } + + fprintf(f, "#%d=CLOSED_SHELL('',(", id); + int *af; + for(af = advancedFaces.First(); af; af = advancedFaces.NextAfter(af)) { + fprintf(f, "#%d", *af); + if(advancedFaces.NextAfter(af) != NULL) fprintf(f, ","); + } + fprintf(f, "));\n"); + fprintf(f, "#%d=MANIFOLD_SOLID_BREP('brep',#%d);\n", id+1, id); + fprintf(f, "#%d=ADVANCED_BREP_SHAPE_REPRESENTATION('',(#%d,#170),#168);\n", + id+2, id+1); + fprintf(f, "#%d=SHAPE_REPRESENTATION_RELATIONSHIP($,$,#169,#%d);\n", + id+3, id+2); + + WriteFooter(); + + fclose(f); + advancedFaces.Clear(); +} + +void StepFileWriter::WriteWireframe(void) { + fprintf(f, "#%d=GEOMETRIC_CURVE_SET('curves',(", id); + int *c; + for(c = curves.First(); c; c = curves.NextAfter(c)) { + fprintf(f, "#%d", *c); + if(curves.NextAfter(c) != NULL) fprintf(f, ","); + } + fprintf(f, "));\n"); + fprintf(f, "#%d=GEOMETRICALLY_BOUNDED_WIREFRAME_SHAPE_REPRESENTATION" + "('',(#%d,#170),#168);\n", id+1, id); + fprintf(f, "#%d=SHAPE_REPRESENTATION_RELATIONSHIP($,$,#169,#%d);\n", + id+2, id+1); + + id += 3; + curves.Clear(); +} + diff --git a/src/exportvector.cpp b/src/exportvector.cpp new file mode 100644 index 0000000..ca625ec --- /dev/null +++ b/src/exportvector.cpp @@ -0,0 +1,1369 @@ +//----------------------------------------------------------------------------- +// The file format-specific stuff for all of the 2d vector output formats. +// +// Copyright 2008-2013 Jonathan Westhues. +//----------------------------------------------------------------------------- +#include +#include "solvespace.h" + +VectorFileWriter::~VectorFileWriter() { + // This out-of-line virtual method definition quells the following warning + // from Clang++: "'VectorFileWriter' has no out-of-line virtual method + // definitions; its vtable will be emitted in every translation unit + // [-Wweak-vtables]" +} + +class PolylineBuilder { +public: + struct Edge; + + struct Vertex { + Vector pos; + std::vector edges; + + bool getNext(hStyle hs, Vertex **next) { + auto it = std::find_if(edges.begin(), edges.end(), [&](const Edge *e) { + return e->tag == 0 && e->style.v == hs.v; + }); + if(it != edges.end()) { + (*it)->tag = 1; + *next = (*it)->getOtherVertex(this); + return true; + } else { + return false; + } + } + + size_t countEdgesWithTagAndStyle(int tag, hStyle hs) const { + return std::count_if(edges.begin(), edges.end(), [&](const Edge *e) { + return e->tag == tag && e->style.v == hs.v; + }); + } + }; + + struct Edge { + Vertex *a; + Vertex *b; + hStyle style; + int tag; + + Vertex *getOtherVertex(Vertex *v) { + if(a == v) return b; + if(b == v) return a; + return NULL; + } + + bool getStartAndNext(Vertex **start, Vertex **next, bool loop) { + size_t numA = a->countEdgesWithTagAndStyle(0, style); + size_t numB = b->countEdgesWithTagAndStyle(0, style); + + if((numA == 1 && numB > 1) || (loop && numA > 1 && numB > 1)) { + *start = a; + *next = b; + return true; + } + + if(numA > 1 && numB == 1) { + *start = b; + *next = a; + return true; + } + + return false; + } + }; + + struct VectorHash { + size_t operator()(const Vector &v) const { + static const size_t size = std::numeric_limits::max() / 2 - 1; + static const double eps = (4.0 * LENGTH_EPS); + + double x = fabs(v.x) / eps; + double y = fabs(v.y) / eps; + + size_t xs = size_t(fmod(x, double(size))); + size_t ys = size_t(fmod(y, double(size))); + + return ys * size + xs; + } + }; + + struct VectorPred { + bool operator()(Vector a, Vector b) const { + return a.Equals(b, LENGTH_EPS); + } + }; + + std::unordered_map vertices; + std::vector edges; + + ~PolylineBuilder() { + clear(); + } + + void clear() { + for(Edge *e : edges) { + delete e; + } + edges.clear(); + + for(auto &v : vertices) { + delete v.second; + } + vertices.clear(); + } + + Vertex *addVertex(const Vector &pos) { + auto it = vertices.find(pos); + if(it != vertices.end()) { + return it->second; + } + + Vertex *result = new Vertex; + result->pos = pos; + vertices.emplace(pos, result); + + return result; + } + + Edge *addEdge(const Vector &p0, const Vector &p1, int style) { + Vertex *v0 = addVertex(p0); + Vertex *v1 = addVertex(p1); + if(v0 == v1) return NULL; + + Edge *edge = new Edge { v0, v1, hStyle { (uint32_t)style }, 0 }; + edges.push_back(edge); + + v0->edges.push_back(edge); + v1->edges.push_back(edge); + + return edge; + } +}; + +//----------------------------------------------------------------------------- +// Routines for DXF export +//----------------------------------------------------------------------------- +class DxfWriteInterface : public DRW_Interface { + DxfFileWriter *writer; + dxfRW *dxf; + + static DRW_Coord toCoord(const Vector &v) { + return DRW_Coord(v.x, v.y, v.z); + } + + Vector xfrm(Vector v) { + return writer->Transform(v); + } + +public: + DxfWriteInterface(DxfFileWriter *w, dxfRW *dxfrw) : + writer(w), dxf(dxfrw) {} + + virtual void writeTextstyles() { + DRW_Textstyle ts; + ts.name = "unicode"; + ts.font = "unicode"; + dxf->writeTextstyle(&ts); + } + + virtual void writeLayers() { + DRW_Layer layer; + + layer.name = "dimensions"; + dxf->writeLayer(&layer); + layer.name = "text"; + dxf->writeLayer(&layer); + + std::set usedStyles; + + for(DxfFileWriter::BezierPath &path : writer->paths) { + for(SBezier *sb : path.beziers) { + usedStyles.insert((uint32_t)sb->auxA); + } + } + + for(uint32_t v : usedStyles) { + Style *s = Style::Get(hStyle{v}); + layer.name = s->DescriptionString(); + dxf->writeLayer(&layer); + } + } + + virtual void writeLTypes() { + for(int i = 0; i <= Style::LAST_STIPPLE; i++) { + DRW_LType type; + // LibreCAD requires the line type to have one of these exact names, + // or otherwise it overwrites it with its own (continuous) style. + type.name = DxfFileWriter::lineTypeName(i); + double sw = 1.0; + switch(i) { + case Style::STIPPLE_CONTINUOUS: + break; + + case Style::STIPPLE_DASH: + type.path.push_back(sw); + type.path.push_back(-sw); + break; + + case Style::STIPPLE_LONG_DASH: + type.path.push_back(sw * 2.0); + type.path.push_back(-sw); + break; + + case Style::STIPPLE_DASH_DOT: + type.path.push_back(sw); + type.path.push_back(-sw); + type.path.push_back(0.0); + type.path.push_back(-sw); + break; + + case Style::STIPPLE_DOT: + type.path.push_back(sw); + type.path.push_back(0.0); + break; + + case Style::STIPPLE_DASH_DOT_DOT: + type.path.push_back(sw); + type.path.push_back(-sw); + type.path.push_back(0.0); + type.path.push_back(-sw); + type.path.push_back(0.0); + type.path.push_back(-sw); + break; + } + dxf->writeLineType(&type); + } + } + + void writePolylines() { + PolylineBuilder builder; + + for(DxfFileWriter::BezierPath &path : writer->paths) { + for(SBezier *sb : path.beziers) { + if(sb->deg != 1) continue; + builder.addEdge(sb->ctrl[0], sb->ctrl[1], sb->auxA); + } + } + + bool found; + bool loop = false; + do { + found = false; + for(PolylineBuilder::Edge *e : builder.edges) { + if(e->tag != 0) continue; + + PolylineBuilder::Vertex *start; + PolylineBuilder::Vertex *next; + if(!e->getStartAndNext(&start, &next, loop)) continue; + found = true; + e->tag = 1; + + DRW_Polyline polyline; + assignEntityDefaults(&polyline, e->style); + polyline.vertlist.push_back( + new DRW_Vertex(start->pos.x, start->pos.y, start->pos.z, 0.0)); + polyline.vertlist.push_back( + new DRW_Vertex(next->pos.x, next->pos.y, next->pos.z, 0.0)); + while(next->getNext(e->style, &next)) { + polyline.vertlist.push_back( + new DRW_Vertex(next->pos.x, next->pos.y, next->pos.z, 0.0)); + } + dxf->writePolyline(&polyline); + } + + if(!found && !loop) { + loop = true; + found = true; + } + } while(found); + + for(PolylineBuilder::Edge *e : builder.edges) { + if(e->tag != 0) continue; + writeLine(e->a->pos, e->b->pos, e->style); + } + } + + virtual void writeEntities() { + writePolylines(); + + for(DxfFileWriter::BezierPath &path : writer->paths) { + for(SBezier *sb : path.beziers) { + if(sb->deg == 1) continue; + writeBezier(sb); + } + } + + if(writer->constraint) { + Constraint *c; + for(c = writer->constraint->First(); c; c = writer->constraint->NextAfter(c)) { + if(!writer->NeedToOutput(c)) continue; + switch(c->type) { + case Constraint::PT_PT_DISTANCE: { + Vector ap = SK.GetEntity(c->ptA)->PointGetNum(); + Vector bp = SK.GetEntity(c->ptB)->PointGetNum(); + Vector ref = ((ap.Plus(bp)).ScaledBy(0.5)).Plus(c->disp.offset); + writeAlignedDimension(xfrm(ap), xfrm(bp), xfrm(ref), + xfrm(ref), c->Label(), c->GetStyle(), c->valA); + break; + } + + case Constraint::PT_LINE_DISTANCE: { + Vector pt = SK.GetEntity(c->ptA)->PointGetNum(); + Entity *line = SK.GetEntity(c->entityA); + Vector lA = SK.GetEntity(line->point[0])->PointGetNum(); + Vector lB = SK.GetEntity(line->point[1])->PointGetNum(); + Vector dl = lB.Minus(lA); + + Vector closest = pt.ClosestPointOnLine(lA, dl); + + if(pt.Equals(closest)) break; + + Vector ref = ((closest.Plus(pt)).ScaledBy(0.5)).Plus(c->disp.offset); + Vector refClosest = ref.ClosestPointOnLine(lA, dl); + + double ddl = dl.Dot(dl); + if(fabs(ddl) > LENGTH_EPS * LENGTH_EPS) { + double t = refClosest.Minus(lA).Dot(dl) / ddl; + if(t < 0.0) { + refClosest = lA; + } else if(t > 1.0) { + refClosest = lB; + } + } + + Vector xdl = xfrm(lB).Minus(xfrm(lA)); + writeLinearDimension(xfrm(pt), xfrm(refClosest), xfrm(ref), + xfrm(ref), c->Label(), + atan2(xdl.y, xdl.x) / PI * 180.0 + 90.0, 0.0, + c->GetStyle(), c->valA); + break; + } + + case Constraint::DIAMETER: { + Entity *circle = SK.GetEntity(c->entityA); + Vector center = SK.GetEntity(circle->point[0])->PointGetNum(); + Quaternion q = SK.GetEntity(circle->normal)->NormalGetNum(); + Vector n = q.RotationN().WithMagnitude(1); + double r = circle->CircleGetRadiusNum(); + + Vector ref = center.Plus(c->disp.offset); + // Force the label into the same plane as the circle. + ref = ref.Minus(n.ScaledBy(n.Dot(ref) - n.Dot(center))); + + Vector rad = ref.Minus(center).WithMagnitude(r); + if(/*isRadius*/c->other) { + writeRadialDimension( + xfrm(center), xfrm(center.Plus(rad)), + xfrm(ref), c->Label(), c->GetStyle(), c->valA); + } else { + writeDiametricDimension( + xfrm(center.Minus(rad)), xfrm(center.Plus(rad)), + xfrm(ref), c->Label(), c->GetStyle(), c->valA); + } + break; + } + + case Constraint::ANGLE: { + Entity *a = SK.GetEntity(c->entityA); + Entity *b = SK.GetEntity(c->entityB); + + Vector a0 = a->VectorGetStartPoint(); + Vector b0 = b->VectorGetStartPoint(); + Vector da = a->VectorGetNum(); + Vector db = b->VectorGetNum(); + if(/*otherAngle*/c->other) { + a0 = a0.Plus(da); + da = da.ScaledBy(-1); + } + + bool skew = false; + Vector ref = c->disp.offset; + Vector pi = Vector::AtIntersectionOfLines(a0, a0.Plus(da), b0, b0.Plus(db), + &skew); + if(!skew) ref = pi.Plus(c->disp.offset); + + Vector norm = da.Cross(db); + Vector dna = norm.Cross(da).WithMagnitude(1.0); + + double thetaf = acos(da.DirectionCosineWith(db)); + + // Calculate median + Vector m = da.WithMagnitude(1.0).ScaledBy(cos(thetaf/2)).Plus( + dna.ScaledBy(sin(thetaf/2))); + Vector rm = ref.Minus(pi); + + // Test which side we have to place an arc + if(m.Dot(rm) < 0) { + da = da.ScaledBy(-1); dna = dna.ScaledBy(-1); + db = db.ScaledBy(-1); + } + + Vector bisect = da.WithMagnitude(1.0).ScaledBy(cos(thetaf / 2.0)).Plus( + dna.ScaledBy(sin(thetaf / 2.0))); + + ref = pi.Plus(bisect.WithMagnitude(c->disp.offset.Magnitude())); + + // Get lines agian to write exact line. + a0 = a->VectorGetStartPoint(); + b0 = b->VectorGetStartPoint(); + da = a->VectorGetNum(); + db = b->VectorGetNum(); + + writeAngularDimension( + xfrm(a0), xfrm(a0.Plus(da)), xfrm(b0), xfrm(b0.Plus(db)), xfrm(ref), + xfrm(ref), c->Label(), c->GetStyle(), c->valA); + break; + } + + case Constraint::COMMENT: { + Style *st = SK.style.FindById(c->GetStyle()); + writeText(xfrm(c->disp.offset), c->Label(), + Style::TextHeight(c->GetStyle()) / SS.GW.scale, + st->textAngle, st->textOrigin, c->GetStyle()); + break; + } + } + } + } + } + + int findDxfColor(const RgbaColor &src) { + int best = 0; + double minDist = VERY_POSITIVE; + Vector srcv = Vector::From(src.redF(), src.greenF(), src.blueF()); + for(int i = 1; i < 256; i++) { + RgbaColor dst = RGBi(DRW::dxfColors[i][0], DRW::dxfColors[i][1], DRW::dxfColors[i][2]); + Vector dstv = Vector::From(dst.redF(), dst.greenF(), dst.blueF()); + double dist = srcv.Minus(dstv).Magnitude(); + if(dist < minDist || best == 0) { + best = i; + minDist = dist; + } + } + return best; + } + + void assignEntityDefaults(DRW_Entity *entity, hStyle hs) { + Style *s = Style::Get(hs); + RgbaColor color = s->Color(hs, true); + entity->color24 = color.ToPackedIntBGRA(); + entity->color = findDxfColor(color); + entity->layer = s->DescriptionString(); + entity->lineType = DxfFileWriter::lineTypeName(s->stippleType); + entity->ltypeScale = Style::StippleScaleMm(s->h); + entity->setWidthMm(Style::WidthMm(hs.v)); + } + + void assignDimensionDefaults(DRW_Dimension *dimension, hStyle hs) { + assignEntityDefaults(dimension, hs); + dimension->layer = "dimensions"; + } + + void writeLine(const Vector &p0, const Vector &p1, hStyle hs) { + DRW_Line line; + assignEntityDefaults(&line, hs); + line.basePoint = toCoord(p0); + line.secPoint = toCoord(p1); + dxf->writeLine(&line); + } + + void writeArc(const Vector &c, double r, double sa, double ea, hStyle hs) { + DRW_Arc arc; + assignEntityDefaults(&arc, hs); + arc.radious = r; + arc.basePoint = toCoord(c); + arc.staangle = sa; + arc.endangle = ea; + dxf->writeArc(&arc); + } + + void writeBezierAsPwl(SBezier *sb) { + List lv = {}; + sb->MakePwlInto(&lv, SS.ExportChordTolMm()); + hStyle hs = { (uint32_t)sb->auxA }; + DRW_Polyline polyline; + assignEntityDefaults(&polyline, hs); + for(int i = 0; i < lv.n; i++) { + Vector *v = &lv.elem[i]; + DRW_Vertex *vertex = new DRW_Vertex(v->x, v->y, v->z, 0.0); + polyline.vertlist.push_back(vertex); + } + dxf->writePolyline(&polyline); + lv.Clear(); + } + + void makeKnotsFor(DRW_Spline *spline) { + // QCad/LibreCAD require this for some reason. + if(spline->degree == 3) { + spline->nknots = 8; + spline->knotslist.push_back(0.0); + spline->knotslist.push_back(0.0); + spline->knotslist.push_back(0.0); + spline->knotslist.push_back(0.0); + spline->knotslist.push_back(1.0); + spline->knotslist.push_back(1.0); + spline->knotslist.push_back(1.0); + spline->knotslist.push_back(1.0); + } else if(spline->degree == 2) { + spline->nknots = 6; + spline->knotslist.push_back(0.0); + spline->knotslist.push_back(0.0); + spline->knotslist.push_back(0.0); + spline->knotslist.push_back(1.0); + spline->knotslist.push_back(1.0); + spline->knotslist.push_back(1.0); + } else { + oops(); + } + } + + void writeSpline(SBezier *sb) { + bool isRational = sb->IsRational(); + hStyle hs = { (uint32_t)sb->auxA }; + DRW_Spline spline; + assignEntityDefaults(&spline, hs); + spline.flags = (isRational) ? 0x04 : 0x08; + spline.degree = sb->deg; + spline.ncontrol = sb->deg + 1; + makeKnotsFor(&spline); + for(int i = 0; i <= sb->deg; i++) { + spline.controllist.push_back( + new DRW_Coord(sb->ctrl[i].x, sb->ctrl[i].y, sb->ctrl[i].z)); + if(isRational) spline.weightlist.push_back(sb->weight[i]); + } + dxf->writeSpline(&spline); + } + + void writeBezier(SBezier *sb) { + hStyle hs = { (uint32_t)sb->auxA }; + Vector c; + Vector n = Vector::From(0.0, 0.0, 1.0); + double r; + + if(sb->deg == 1) { + // Line + writeLine(sb->ctrl[0], sb->ctrl[1], hs); + } else if(sb->IsInPlane(n, 0) && sb->IsCircle(n, &c, &r)) { + // Circle perpendicular to camera + double theta0 = atan2(sb->ctrl[0].y - c.y, sb->ctrl[0].x - c.x); + double theta1 = atan2(sb->ctrl[2].y - c.y, sb->ctrl[2].x - c.x); + double dtheta = WRAP_SYMMETRIC(theta1 - theta0, 2.0 * PI); + if(dtheta < 0.0) swap(theta0, theta1); + + writeArc(c, r, theta0, theta1, hs); + } else if(sb->IsRational()) { + // Rational bezier + // We'd like to export rational beziers exactly, but the resulting DXF + // files can only be read by AutoCAD; LibreCAD/QCad simply do not + // implement the feature. So, export as piecewise linear for compatiblity. + writeBezierAsPwl(sb); + } else { + // Any other curve + writeSpline(sb); + } + } + + void writeAlignedDimension(Vector def1, Vector def2, Vector dimp, + Vector textp, const std::string &text, hStyle hs, double actual) { + DRW_DimAligned dim; + assignDimensionDefaults(&dim, hs); + dim.setDef1Point(toCoord(def1)); + dim.setDef2Point(toCoord(def2)); + dim.setDimPoint(toCoord(dimp)); + dim.setTextPoint(toCoord(textp)); + dim.setText(text); + dim.setActualMeasurement(actual); + dxf->writeDimension(&dim); + } + + void writeLinearDimension(Vector def1, Vector def2, Vector dimp, + Vector textp, const std::string &text, + double angle, double oblique, hStyle hs, double actual) { + DRW_DimLinear dim; + assignDimensionDefaults(&dim, hs); + dim.setDef1Point(toCoord(def1)); + dim.setDef2Point(toCoord(def2)); + dim.setDimPoint(toCoord(dimp)); + dim.setTextPoint(toCoord(textp)); + dim.setText(text); + dim.setAngle(angle); + dim.setOblique(oblique); + dim.setActualMeasurement(actual); + dxf->writeDimension(&dim); + } + + void writeRadialDimension(Vector center, Vector radius, + Vector textp, const std::string &text, hStyle hs, double actual) { + DRW_DimRadial dim; + assignDimensionDefaults(&dim, hs); + dim.setCenterPoint(toCoord(center)); + dim.setDiameterPoint(toCoord(radius)); + dim.setTextPoint(toCoord(textp)); + dim.setText(text); + dim.setActualMeasurement(actual); + dxf->writeDimension(&dim); + } + + void writeDiametricDimension(Vector def1, Vector def2, + Vector textp, const std::string &text, hStyle hs, double actual) { + DRW_DimDiametric dim; + assignDimensionDefaults(&dim, hs); + dim.setDiameter1Point(toCoord(def1)); + dim.setDiameter2Point(toCoord(def2)); + dim.setTextPoint(toCoord(textp)); + dim.setText(text); + dim.setActualMeasurement(actual); + dxf->writeDimension(&dim); + } + + void writeAngularDimension(Vector fl1, Vector fl2, Vector sl1, Vector sl2, Vector dimp, + Vector textp, const std::string &text, hStyle hs, double actual) { + DRW_DimAngular dim; + assignDimensionDefaults(&dim, hs); + dim.setFirstLine1(toCoord(fl1)); + dim.setFirstLine2(toCoord(fl2)); + dim.setSecondLine1(toCoord(sl1)); + dim.setSecondLine2(toCoord(sl2)); + dim.setDimPoint(toCoord(dimp)); + dim.setTextPoint(toCoord(textp)); + dim.setText(text); + dim.setActualMeasurement(actual * PI / 180.0); + dxf->writeDimension(&dim); + } + + void writeText(Vector textp, const std::string &text, + double height, double angle, int origin, hStyle hs) { + DRW_Text txt; + assignEntityDefaults(&txt, hs); + txt.layer = "text"; + txt.style = "unicode"; + txt.basePoint = toCoord(textp); + txt.secPoint = txt.basePoint; + txt.text = text; + txt.height = height; + txt.angle = angle; + txt.alignH = DRW_Text::HCenter; + if(origin & Style::ORIGIN_LEFT) { + txt.alignH = DRW_Text::HLeft; + } else if(origin & Style::ORIGIN_RIGHT) { + txt.alignH = DRW_Text::HRight; + } + txt.alignV = DRW_Text::VMiddle; + if(origin & Style::ORIGIN_TOP) { + txt.alignV = DRW_Text::VTop; + } else if(origin & Style::ORIGIN_BOT) { + txt.alignV = DRW_Text::VBaseLine; + } + dxf->writeText(&txt); + } +}; + +bool DxfFileWriter::OutputConstraints(IdList *constraint) { + this->constraint = constraint; + return true; +} + +void DxfFileWriter::StartFile(void) { + paths.clear(); +} + +void DxfFileWriter::StartPath(RgbaColor strokeRgb, double lineWidth, + bool filled, RgbaColor fillRgb, hStyle hs) +{ + BezierPath path = {}; + paths.push_back(path); +} +void DxfFileWriter::FinishPath(RgbaColor strokeRgb, double lineWidth, + bool filled, RgbaColor fillRgb, hStyle hs) +{ +} + +void DxfFileWriter::Triangle(STriangle *tr) { +} + +void DxfFileWriter::Bezier(SBezier *sb) { + paths.back().beziers.push_back(sb); +} + +void DxfFileWriter::FinishAndCloseFile() { + dxfRW dxf; + + DxfWriteInterface interface(this, &dxf); + std::stringstream stream; + dxf.write(stream, &interface, DRW::AC1021, /*bin=*/false); + paths.clear(); + constraint = NULL; + + if(!WriteFile(filename, stream.str())) { + Error("Couldn't write to '%s'", filename.c_str()); + return; + } +} + +bool DxfFileWriter::NeedToOutput(Constraint *c) { + switch(c->type) { + case Constraint::PT_PT_DISTANCE: + case Constraint::PT_LINE_DISTANCE: + case Constraint::DIAMETER: + case Constraint::ANGLE: + case Constraint::COMMENT: + return c->IsVisible(); + } + return false; +} + +const char *DxfFileWriter::lineTypeName(int stippleType) { + switch(stippleType) { + case Style::STIPPLE_CONTINUOUS: return "CONTINUOUS"; + case Style::STIPPLE_DASH: return "DASHED"; + case Style::STIPPLE_LONG_DASH: return "DASHEDX2"; + case Style::STIPPLE_DASH_DOT: return "DASHDOT"; + case Style::STIPPLE_DASH_DOT_DOT: return "DIVIDE"; + case Style::STIPPLE_DOT: return "DOT"; + case Style::STIPPLE_FREEHAND: return "CONTINUOUS"; + case Style::STIPPLE_ZIGZAG: return "CONTINUOUS"; + } + + return "CONTINUOUS"; +} + +//----------------------------------------------------------------------------- +// Routines for EPS output +//----------------------------------------------------------------------------- + +static std::string MakeStipplePattern(int pattern, double scale, char delimiter, + bool inkscapeWorkaround = false) { + scale /= 2.0; + + // Inkscape ignores all elements that are exactly zero instead of drawing + // them as dots. + double zero = inkscapeWorkaround ? 1e-6 : 0; + + std::string result; + switch(pattern) { + case Style::STIPPLE_CONTINUOUS: + case Style::STIPPLE_FREEHAND: + case Style::STIPPLE_ZIGZAG: + return ""; + + case Style::STIPPLE_DASH: + result = ssprintf("%.3f_%.3f", scale, scale); + break; + case Style::STIPPLE_DASH_DOT: + result = ssprintf("%.3f_%.3f_%.6f_%.3f", + scale, scale * 0.5, zero, scale * 0.5); + break; + case Style::STIPPLE_DASH_DOT_DOT: + result = ssprintf("%.3f_%.3f_%.6f_%.3f_%.6f_%.3f", + scale, scale * 0.5, zero, + scale * 0.5, scale * 0.5, zero); + break; + case Style::STIPPLE_DOT: + result = ssprintf("%.6f_%.3f", zero, scale * 0.5); + break; + case Style::STIPPLE_LONG_DASH: + result = ssprintf("%.3f_%.3f", scale * 2.0, scale * 0.5); + break; + + default: + oops(); + } + std::replace(result.begin(), result.end(), '_', delimiter); + return result; +} + +void EpsFileWriter::StartFile(void) { + fprintf(f, +"%%!PS-Adobe-2.0\r\n" +"%%%%Creator: SolveSpace\r\n" +"%%%%Title: title\r\n" +"%%%%Pages: 0\r\n" +"%%%%PageOrder: Ascend\r\n" +"%%%%BoundingBox: 0 0 %d %d\r\n" +"%%%%HiResBoundingBox: 0 0 %.3f %.3f\r\n" +"%%%%EndComments\r\n" +"\r\n" +"gsave\r\n" +"\r\n", + (int)ceil(MmToPts(ptMax.x - ptMin.x)), + (int)ceil(MmToPts(ptMax.y - ptMin.y)), + MmToPts(ptMax.x - ptMin.x), + MmToPts(ptMax.y - ptMin.y)); +} + +void EpsFileWriter::StartPath(RgbaColor strokeRgb, double lineWidth, + bool filled, RgbaColor fillRgb, hStyle hs) +{ + fprintf(f, "newpath\r\n"); + prevPt = Vector::From(VERY_POSITIVE, VERY_POSITIVE, VERY_POSITIVE); +} +void EpsFileWriter::FinishPath(RgbaColor strokeRgb, double lineWidth, + bool filled, RgbaColor fillRgb, hStyle hs) +{ + int pattern = Style::PatternType(hs); + double stippleScale = MmToPts(Style::StippleScaleMm(hs)); + + fprintf(f, " %.3f setlinewidth\r\n" + " %.3f %.3f %.3f setrgbcolor\r\n" + " 1 setlinejoin\r\n" // rounded + " 1 setlinecap\r\n" // rounded + " [%s] 0 setdash\r\n" + " gsave stroke grestore\r\n", + MmToPts(lineWidth), + strokeRgb.redF(), strokeRgb.greenF(), strokeRgb.blueF(), + MakeStipplePattern(pattern, stippleScale, ' ').c_str() + ); + if(filled) { + fprintf(f, " %.3f %.3f %.3f setrgbcolor\r\n" + " gsave fill grestore\r\n", + fillRgb.redF(), fillRgb.greenF(), fillRgb.blueF()); + } +} + +void EpsFileWriter::MaybeMoveTo(Vector st, Vector fi) { + if(!prevPt.Equals(st)) { + fprintf(f, " %.3f %.3f moveto\r\n", + MmToPts(st.x - ptMin.x), MmToPts(st.y - ptMin.y)); + } + prevPt = fi; +} + +void EpsFileWriter::Triangle(STriangle *tr) { + fprintf(f, +"%.3f %.3f %.3f setrgbcolor\r\n" +"newpath\r\n" +" %.3f %.3f moveto\r\n" +" %.3f %.3f lineto\r\n" +" %.3f %.3f lineto\r\n" +" closepath\r\n" +"gsave fill grestore\r\n", + tr->meta.color.redF(), tr->meta.color.greenF(), tr->meta.color.blueF(), + MmToPts(tr->a.x - ptMin.x), MmToPts(tr->a.y - ptMin.y), + MmToPts(tr->b.x - ptMin.x), MmToPts(tr->b.y - ptMin.y), + MmToPts(tr->c.x - ptMin.x), MmToPts(tr->c.y - ptMin.y)); + + // same issue with cracks, stroke it to avoid them + double sw = max(ptMax.x - ptMin.x, ptMax.y - ptMin.y) / 1000; + fprintf(f, +"1 setlinejoin\r\n" +"1 setlinecap\r\n" +"%.3f setlinewidth\r\n" +"gsave stroke grestore\r\n", + MmToPts(sw)); +} + +void EpsFileWriter::Bezier(SBezier *sb) { + Vector c, n = Vector::From(0, 0, 1); + double r; + if(sb->deg == 1) { + MaybeMoveTo(sb->ctrl[0], sb->ctrl[1]); + fprintf(f, " %.3f %.3f lineto\r\n", + MmToPts(sb->ctrl[1].x - ptMin.x), + MmToPts(sb->ctrl[1].y - ptMin.y)); + } else if(sb->IsCircle(n, &c, &r)) { + Vector p0 = sb->ctrl[0], p1 = sb->ctrl[2]; + double theta0 = atan2(p0.y - c.y, p0.x - c.x), + theta1 = atan2(p1.y - c.y, p1.x - c.x), + dtheta = WRAP_SYMMETRIC(theta1 - theta0, 2*PI); + MaybeMoveTo(p0, p1); + fprintf(f, +" %.3f %.3f %.3f %.3f %.3f %s\r\n", + MmToPts(c.x - ptMin.x), MmToPts(c.y - ptMin.y), + MmToPts(r), + theta0*180/PI, theta1*180/PI, + dtheta < 0 ? "arcn" : "arc"); + } else if(sb->deg == 3 && !sb->IsRational()) { + MaybeMoveTo(sb->ctrl[0], sb->ctrl[3]); + fprintf(f, +" %.3f %.3f %.3f %.3f %.3f %.3f curveto\r\n", + MmToPts(sb->ctrl[1].x - ptMin.x), MmToPts(sb->ctrl[1].y - ptMin.y), + MmToPts(sb->ctrl[2].x - ptMin.x), MmToPts(sb->ctrl[2].y - ptMin.y), + MmToPts(sb->ctrl[3].x - ptMin.x), MmToPts(sb->ctrl[3].y - ptMin.y)); + } else { + BezierAsNonrationalCubic(sb); + } +} + +void EpsFileWriter::FinishAndCloseFile(void) { + fprintf(f, +"\r\n" +"grestore\r\n" +"\r\n"); + fclose(f); +} + +//----------------------------------------------------------------------------- +// Routines for PDF output, some extra complexity because we have to generate +// a correct xref table. +//----------------------------------------------------------------------------- +void PdfFileWriter::StartFile(void) { + if((ptMax.x - ptMin.x) > 200*25.4 || + (ptMax.y - ptMin.y) > 200*25.4) + { + Message("PDF page size exceeds 200 by 200 inches; many viewers may " + "reject this file."); + } + + fprintf(f, +"%%PDF-1.1\r\n" +"%%%c%c%c%c\r\n", + 0xe2, 0xe3, 0xcf, 0xd3); + + xref[1] = (uint32_t)ftell(f); + fprintf(f, +"1 0 obj\r\n" +" << /Type /Catalog\r\n" +" /Outlines 2 0 R\r\n" +" /Pages 3 0 R\r\n" +" >>\r\n" +"endobj\r\n"); + + xref[2] = (uint32_t)ftell(f); + fprintf(f, +"2 0 obj\r\n" +" << /Type /Outlines\r\n" +" /Count 0\r\n" +" >>\r\n" +"endobj\r\n"); + + xref[3] = (uint32_t)ftell(f); + fprintf(f, +"3 0 obj\r\n" +" << /Type /Pages\r\n" +" /Kids [4 0 R]\r\n" +" /Count 1\r\n" +" >>\r\n" +"endobj\r\n"); + + xref[4] = (uint32_t)ftell(f); + fprintf(f, +"4 0 obj\r\n" +" << /Type /Page\r\n" +" /Parent 3 0 R\r\n" +" /MediaBox [0 0 %.3f %.3f]\r\n" +" /Contents 5 0 R\r\n" +" /Resources << /ProcSet 7 0 R\r\n" +" /Font << /F1 8 0 R >>\r\n" +" >>\r\n" +" >>\r\n" +"endobj\r\n", + MmToPts(ptMax.x - ptMin.x), + MmToPts(ptMax.y - ptMin.y)); + + xref[5] = (uint32_t)ftell(f); + fprintf(f, +"5 0 obj\r\n" +" << /Length 6 0 R >>\r\n" +"stream\r\n"); + bodyStart = (uint32_t)ftell(f); +} + +void PdfFileWriter::FinishAndCloseFile(void) { + uint32_t bodyEnd = (uint32_t)ftell(f); + + fprintf(f, +"endstream\r\n" +"endobj\r\n"); + + xref[6] = (uint32_t)ftell(f); + fprintf(f, +"6 0 obj\r\n" +" %d\r\n" +"endobj\r\n", + bodyEnd - bodyStart); + + xref[7] = (uint32_t)ftell(f); + fprintf(f, +"7 0 obj\r\n" +" [/PDF /Text]\r\n" +"endobj\r\n"); + + xref[8] = (uint32_t)ftell(f); + fprintf(f, +"8 0 obj\r\n" +" << /Type /Font\r\n" +" /Subtype /Type1\r\n" +" /Name /F1\r\n" +" /BaseFont /Helvetica\r\n" +" /Encoding /WinAnsiEncoding\r\n" +" >>\r\n" +"endobj\r\n"); + + xref[9] = (uint32_t)ftell(f); + fprintf(f, +"9 0 obj\r\n" +" << /Creator (SolveSpace)\r\n" +" >>\r\n"); + + uint32_t xrefStart = (uint32_t)ftell(f); + fprintf(f, +"xref\r\n" +"0 10\r\n" +"0000000000 65535 f\r\n"); + + int i; + for(i = 1; i <= 9; i++) { + fprintf(f, "%010d %05d n\r\n", xref[i], 0); + } + + fprintf(f, +"\r\n" +"trailer\r\n" +" << /Size 10\r\n" +" /Root 1 0 R\r\n" +" /Info 9 0 R\r\n" +" >>\r\n" +"startxref\r\n" +"%d\r\n" +"%%%%EOF\r\n", + xrefStart); + + fclose(f); + +} + +void PdfFileWriter::StartPath(RgbaColor strokeRgb, double lineWidth, + bool filled, RgbaColor fillRgb, hStyle hs) +{ + int pattern = Style::PatternType(hs); + double stippleScale = MmToPts(Style::StippleScaleMm(hs)); + + fprintf(f, "1 J 1 j " // round endcaps and joins + "%.3f w [%s] 0 d " + "%.3f %.3f %.3f RG\r\n", + MmToPts(lineWidth), + MakeStipplePattern(pattern, stippleScale, ' ').c_str(), + strokeRgb.redF(), strokeRgb.greenF(), strokeRgb.blueF()); + if(filled) { + fprintf(f, "%.3f %.3f %.3f rg\r\n", + fillRgb.redF(), fillRgb.greenF(), fillRgb.blueF()); + } + + prevPt = Vector::From(VERY_POSITIVE, VERY_POSITIVE, VERY_POSITIVE); +} +void PdfFileWriter::FinishPath(RgbaColor strokeRgb, double lineWidth, + bool filled, RgbaColor fillRgb, hStyle hs) +{ + if(filled) { + fprintf(f, "b\r\n"); + } else { + fprintf(f, "S\r\n"); + } +} + +void PdfFileWriter::MaybeMoveTo(Vector st, Vector fi) { + if(!prevPt.Equals(st)) { + fprintf(f, "%.3f %.3f m\r\n", + MmToPts(st.x - ptMin.x), MmToPts(st.y - ptMin.y)); + } + prevPt = fi; +} + +void PdfFileWriter::Triangle(STriangle *tr) { + double sw = max(ptMax.x - ptMin.x, ptMax.y - ptMin.y) / 1000; + + fprintf(f, +"1 J 1 j\r\n" +"%.3f %.3f %.3f RG\r\n" +"%.3f %.3f %.3f rg\r\n" +"%.3f w\r\n" +"%.3f %.3f m\r\n" +"%.3f %.3f l\r\n" +"%.3f %.3f l\r\n" +"b\r\n", + tr->meta.color.redF(), tr->meta.color.greenF(), tr->meta.color.blueF(), + tr->meta.color.redF(), tr->meta.color.greenF(), tr->meta.color.blueF(), + MmToPts(sw), + MmToPts(tr->a.x - ptMin.x), MmToPts(tr->a.y - ptMin.y), + MmToPts(tr->b.x - ptMin.x), MmToPts(tr->b.y - ptMin.y), + MmToPts(tr->c.x - ptMin.x), MmToPts(tr->c.y - ptMin.y)); +} + +void PdfFileWriter::Bezier(SBezier *sb) { + if(sb->deg == 1) { + MaybeMoveTo(sb->ctrl[0], sb->ctrl[1]); + fprintf(f, +"%.3f %.3f l\r\n", + MmToPts(sb->ctrl[1].x - ptMin.x), MmToPts(sb->ctrl[1].y - ptMin.y)); + } else if(sb->deg == 3 && !sb->IsRational()) { + MaybeMoveTo(sb->ctrl[0], sb->ctrl[3]); + fprintf(f, +"%.3f %.3f %.3f %.3f %.3f %.3f c\r\n", + MmToPts(sb->ctrl[1].x - ptMin.x), MmToPts(sb->ctrl[1].y - ptMin.y), + MmToPts(sb->ctrl[2].x - ptMin.x), MmToPts(sb->ctrl[2].y - ptMin.y), + MmToPts(sb->ctrl[3].x - ptMin.x), MmToPts(sb->ctrl[3].y - ptMin.y)); + } else { + BezierAsNonrationalCubic(sb); + } +} + +//----------------------------------------------------------------------------- +// Routines for SVG output +//----------------------------------------------------------------------------- +void SvgFileWriter::StartFile(void) { + fprintf(f, +"\r\n" +"\r\n" +"\r\n" +"Exported SVG\r\n" +"\r\n", + (ptMax.x - ptMin.x), (ptMax.y - ptMin.y), + (ptMax.x - ptMin.x), (ptMax.y - ptMin.y)); + + fprintf(f, "\r\n"); +} + +void SvgFileWriter::StartPath(RgbaColor strokeRgb, double lineWidth, + bool filled, RgbaColor fillRgb, hStyle hs) +{ + fprintf(f, "\r\n", cls.c_str(), fill.c_str()); +} + +void SvgFileWriter::MaybeMoveTo(Vector st, Vector fi) { + // SVG uses a coordinate system with the origin at top left, +y down + if(!prevPt.Equals(st)) { + fprintf(f, "M%.3f %.3f ", (st.x - ptMin.x), (ptMax.y - st.y)); + } + prevPt = fi; +} + +void SvgFileWriter::Triangle(STriangle *tr) { + fprintf(f, +"\r\n", + (tr->a.x - ptMin.x), (ptMax.y - tr->a.y), + (tr->b.x - ptMin.x), (ptMax.y - tr->b.y), + (tr->c.x - ptMin.x), (ptMax.y - tr->c.y), + tr->meta.color.red, tr->meta.color.green, tr->meta.color.blue, + tr->meta.color.red, tr->meta.color.green, tr->meta.color.blue); +} + +void SvgFileWriter::Bezier(SBezier *sb) { + Vector c, n = Vector::From(0, 0, 1); + double r; + if(sb->deg == 1) { + MaybeMoveTo(sb->ctrl[0], sb->ctrl[1]); + fprintf(f, "L%.3f,%.3f ", + (sb->ctrl[1].x - ptMin.x), (ptMax.y - sb->ctrl[1].y)); + } else if(sb->IsCircle(n, &c, &r)) { + Vector p0 = sb->ctrl[0], p1 = sb->ctrl[2]; + double theta0 = atan2(p0.y - c.y, p0.x - c.x), + theta1 = atan2(p1.y - c.y, p1.x - c.x), + dtheta = WRAP_SYMMETRIC(theta1 - theta0, 2*PI); + // The arc must be less than 180 degrees, or else it couldn't have + // been represented as a single rational Bezier. So large-arc-flag + // must be false. sweep-flag is determined by the sign of dtheta. + // Note that clockwise and counter-clockwise are backwards in SVG's + // mirrored csys. + MaybeMoveTo(p0, p1); + fprintf(f, "A%.3f,%.3f 0 0,%d %.3f,%.3f ", + r, r, + (dtheta < 0) ? 1 : 0, + p1.x - ptMin.x, ptMax.y - p1.y); + } else if(!sb->IsRational()) { + if(sb->deg == 2) { + MaybeMoveTo(sb->ctrl[0], sb->ctrl[2]); + fprintf(f, "Q%.3f,%.3f %.3f,%.3f ", + sb->ctrl[1].x - ptMin.x, ptMax.y - sb->ctrl[1].y, + sb->ctrl[2].x - ptMin.x, ptMax.y - sb->ctrl[2].y); + } else if(sb->deg == 3) { + MaybeMoveTo(sb->ctrl[0], sb->ctrl[3]); + fprintf(f, "C%.3f,%.3f %.3f,%.3f %.3f,%.3f ", + sb->ctrl[1].x - ptMin.x, ptMax.y - sb->ctrl[1].y, + sb->ctrl[2].x - ptMin.x, ptMax.y - sb->ctrl[2].y, + sb->ctrl[3].x - ptMin.x, ptMax.y - sb->ctrl[3].y); + } + } else { + BezierAsNonrationalCubic(sb); + } +} + +void SvgFileWriter::FinishAndCloseFile(void) { + fprintf(f, "\r\n\r\n"); + fclose(f); +} + +//----------------------------------------------------------------------------- +// Routines for HPGL output +//----------------------------------------------------------------------------- +double HpglFileWriter::MmToHpglUnits(double mm) { + return mm*40; +} + +void HpglFileWriter::StartFile(void) { + fprintf(f, "IN;\r\n"); + fprintf(f, "SP1;\r\n"); +} + +void HpglFileWriter::StartPath(RgbaColor strokeRgb, double lineWidth, + bool filled, RgbaColor fillRgb, hStyle hs) +{ +} +void HpglFileWriter::FinishPath(RgbaColor strokeRgb, double lineWidth, + bool filled, RgbaColor fillRgb, hStyle hs) +{ +} + +void HpglFileWriter::Triangle(STriangle *tr) { +} + +void HpglFileWriter::Bezier(SBezier *sb) { + if(sb->deg == 1) { + fprintf(f, "PU%d,%d;\r\n", + (int)MmToHpglUnits(sb->ctrl[0].x), + (int)MmToHpglUnits(sb->ctrl[0].y)); + fprintf(f, "PD%d,%d;\r\n", + (int)MmToHpglUnits(sb->ctrl[1].x), + (int)MmToHpglUnits(sb->ctrl[1].y)); + } else { + BezierAsPwl(sb); + } +} + +void HpglFileWriter::FinishAndCloseFile(void) { + fclose(f); +} + +//----------------------------------------------------------------------------- +// Routines for G Code output. Slightly complicated by our ability to generate +// multiple passes, and to specify the feeds and depth; those parameters get +// set in the configuration screen. +//----------------------------------------------------------------------------- +void GCodeFileWriter::StartFile(void) { + sel = {}; +} +void GCodeFileWriter::StartPath(RgbaColor strokeRgb, double lineWidth, + bool filled, RgbaColor fillRgb, hStyle hs) +{ +} +void GCodeFileWriter::FinishPath(RgbaColor strokeRgb, double lineWidth, + bool filled, RgbaColor fillRgb, hStyle hs) +{ +} +void GCodeFileWriter::Triangle(STriangle *tr) { +} + +void GCodeFileWriter::Bezier(SBezier *sb) { + if(sb->deg == 1) { + sel.AddEdge(sb->ctrl[0], sb->ctrl[1]); + } else { + BezierAsPwl(sb); + } +} + +void GCodeFileWriter::FinishAndCloseFile(void) { + SPolygon sp = {}; + sel.AssemblePolygon(&sp, NULL); + + int i; + for(i = 0; i < SS.gCode.passes; i++) { + double depth = (SS.gCode.depth / SS.gCode.passes)*(i+1); + + SContour *sc; + for(sc = sp.l.First(); sc; sc = sp.l.NextAfter(sc)) { + if(sc->l.n < 2) continue; + + SPoint *pt = sc->l.First(); + fprintf(f, "G00 X%s Y%s\r\n", + SS.MmToString(pt->p.x).c_str(), SS.MmToString(pt->p.y).c_str()); + fprintf(f, "G01 Z%s F%s\r\n", + SS.MmToString(depth).c_str(), SS.MmToString(SS.gCode.plungeFeed).c_str()); + + pt = sc->l.NextAfter(pt); + for(; pt; pt = sc->l.NextAfter(pt)) { + fprintf(f, "G01 X%s Y%s F%s\r\n", + SS.MmToString(pt->p.x).c_str(), SS.MmToString(pt->p.y).c_str(), + SS.MmToString(SS.gCode.feed).c_str()); + } + // Move up to a clearance plane 5mm above the work. + fprintf(f, "G00 Z%s\r\n", + SS.MmToString(SS.gCode.depth < 0 ? +5 : -5).c_str()); + } + } + + sp.Clear(); + sel.Clear(); + fclose(f); +} + + +//----------------------------------------------------------------------------- +// Routine for STEP output; just a wrapper around the general STEP stuff that +// can also be used for surfaces or 3d curves. +//----------------------------------------------------------------------------- +void Step2dFileWriter::StartFile(void) { + sfw = {}; + sfw.f = f; + sfw.WriteHeader(); +} + +void Step2dFileWriter::Triangle(STriangle *tr) { +} + +void Step2dFileWriter::StartPath(RgbaColor strokeRgb, double lineWidth, + bool filled, RgbaColor fillRgb, hStyle hs) +{ +} +void Step2dFileWriter::FinishPath(RgbaColor strokeRgb, double lineWidth, + bool filled, RgbaColor fillRgb, hStyle hs) +{ +} + +void Step2dFileWriter::Bezier(SBezier *sb) { + int c = sfw.ExportCurve(sb); + sfw.curves.Add(&c); +} + +void Step2dFileWriter::FinishAndCloseFile(void) { + sfw.WriteWireframe(); + sfw.WriteFooter(); + fclose(f); +} + diff --git a/src/expr.cpp b/src/expr.cpp new file mode 100644 index 0000000..52e06b0 --- /dev/null +++ b/src/expr.cpp @@ -0,0 +1,808 @@ +//----------------------------------------------------------------------------- +// The symbolic algebra system used to write our constraint equations; +// routines to build expressions in software or from a user-provided string, +// and to compute the partial derivatives that we'll use when write our +// Jacobian matrix. +// +// Copyright 2008-2013 Jonathan Westhues. +//----------------------------------------------------------------------------- +#include "solvespace.h" + +ExprVector ExprVector::From(Expr *x, Expr *y, Expr *z) { + ExprVector r = { x, y, z}; + return r; +} + +ExprVector ExprVector::From(Vector vn) { + ExprVector ve; + ve.x = Expr::From(vn.x); + ve.y = Expr::From(vn.y); + ve.z = Expr::From(vn.z); + return ve; +} + +ExprVector ExprVector::From(hParam x, hParam y, hParam z) { + ExprVector ve; + ve.x = Expr::From(x); + ve.y = Expr::From(y); + ve.z = Expr::From(z); + return ve; +} + +ExprVector ExprVector::From(double x, double y, double z) { + ExprVector ve; + ve.x = Expr::From(x); + ve.y = Expr::From(y); + ve.z = Expr::From(z); + return ve; +} + +ExprVector ExprVector::Minus(ExprVector b) { + ExprVector r; + r.x = x->Minus(b.x); + r.y = y->Minus(b.y); + r.z = z->Minus(b.z); + return r; +} + +ExprVector ExprVector::Plus(ExprVector b) { + ExprVector r; + r.x = x->Plus(b.x); + r.y = y->Plus(b.y); + r.z = z->Plus(b.z); + return r; +} + +Expr *ExprVector::Dot(ExprVector b) { + Expr *r; + r = x->Times(b.x); + r = r->Plus(y->Times(b.y)); + r = r->Plus(z->Times(b.z)); + return r; +} + +ExprVector ExprVector::Cross(ExprVector b) { + ExprVector r; + r.x = (y->Times(b.z))->Minus(z->Times(b.y)); + r.y = (z->Times(b.x))->Minus(x->Times(b.z)); + r.z = (x->Times(b.y))->Minus(y->Times(b.x)); + return r; +} + +ExprVector ExprVector::ScaledBy(Expr *s) { + ExprVector r; + r.x = x->Times(s); + r.y = y->Times(s); + r.z = z->Times(s); + return r; +} + +ExprVector ExprVector::WithMagnitude(Expr *s) { + Expr *m = Magnitude(); + return ScaledBy(s->Div(m)); +} + +Expr *ExprVector::Magnitude(void) { + Expr *r; + r = x->Square(); + r = r->Plus(y->Square()); + r = r->Plus(z->Square()); + return r->Sqrt(); +} + +Vector ExprVector::Eval(void) { + Vector r; + r.x = x->Eval(); + r.y = y->Eval(); + r.z = z->Eval(); + return r; +} + +ExprQuaternion ExprQuaternion::From(hParam w, hParam vx, hParam vy, hParam vz) { + ExprQuaternion q; + q.w = Expr::From(w); + q.vx = Expr::From(vx); + q.vy = Expr::From(vy); + q.vz = Expr::From(vz); + return q; +} + +ExprQuaternion ExprQuaternion::From(Expr *w, Expr *vx, Expr *vy, Expr *vz) +{ + ExprQuaternion q; + q.w = w; + q.vx = vx; + q.vy = vy; + q.vz = vz; + return q; +} + +ExprQuaternion ExprQuaternion::From(Quaternion qn) { + ExprQuaternion qe; + qe.w = Expr::From(qn.w); + qe.vx = Expr::From(qn.vx); + qe.vy = Expr::From(qn.vy); + qe.vz = Expr::From(qn.vz); + return qe; +} + +ExprVector ExprQuaternion::RotationU(void) { + ExprVector u; + Expr *two = Expr::From(2); + + u.x = w->Square(); + u.x = (u.x)->Plus(vx->Square()); + u.x = (u.x)->Minus(vy->Square()); + u.x = (u.x)->Minus(vz->Square()); + + u.y = two->Times(w->Times(vz)); + u.y = (u.y)->Plus(two->Times(vx->Times(vy))); + + u.z = two->Times(vx->Times(vz)); + u.z = (u.z)->Minus(two->Times(w->Times(vy))); + + return u; +} + +ExprVector ExprQuaternion::RotationV(void) { + ExprVector v; + Expr *two = Expr::From(2); + + v.x = two->Times(vx->Times(vy)); + v.x = (v.x)->Minus(two->Times(w->Times(vz))); + + v.y = w->Square(); + v.y = (v.y)->Minus(vx->Square()); + v.y = (v.y)->Plus(vy->Square()); + v.y = (v.y)->Minus(vz->Square()); + + v.z = two->Times(w->Times(vx)); + v.z = (v.z)->Plus(two->Times(vy->Times(vz))); + + return v; +} + +ExprVector ExprQuaternion::RotationN(void) { + ExprVector n; + Expr *two = Expr::From(2); + + n.x = two->Times( w->Times(vy)); + n.x = (n.x)->Plus (two->Times(vx->Times(vz))); + + n.y = two->Times(vy->Times(vz)); + n.y = (n.y)->Minus(two->Times( w->Times(vx))); + + n.z = w->Square(); + n.z = (n.z)->Minus(vx->Square()); + n.z = (n.z)->Minus(vy->Square()); + n.z = (n.z)->Plus (vz->Square()); + + return n; +} + +ExprVector ExprQuaternion::Rotate(ExprVector p) { + // Express the point in the new basis + return (RotationU().ScaledBy(p.x)).Plus( + RotationV().ScaledBy(p.y)).Plus( + RotationN().ScaledBy(p.z)); +} + +ExprQuaternion ExprQuaternion::Times(ExprQuaternion b) { + Expr *sa = w, *sb = b.w; + ExprVector va = { vx, vy, vz }; + ExprVector vb = { b.vx, b.vy, b.vz }; + + ExprQuaternion r; + r.w = (sa->Times(sb))->Minus(va.Dot(vb)); + ExprVector vr = vb.ScaledBy(sa).Plus( + va.ScaledBy(sb).Plus( + va.Cross(vb))); + r.vx = vr.x; + r.vy = vr.y; + r.vz = vr.z; + return r; +} + +Expr *ExprQuaternion::Magnitude(void) { + return ((w ->Square())->Plus( + (vx->Square())->Plus( + (vy->Square())->Plus( + (vz->Square())))))->Sqrt(); +} + + +Expr *Expr::From(hParam p) { + Expr *r = AllocExpr(); + r->op = PARAM; + r->parh = p; + return r; +} + +Expr *Expr::From(double v) { + // Statically allocate common constants. + // Note: this is only valid because AllocExpr() uses AllocTemporary(), + // and Expr* is never explicitly freed. + + if(v == 0.0) { + static Expr zero(0.0); + return &zero; + } + + if(v == 1.0) { + static Expr one(1.0); + return &one; + } + + if(v == -1.0) { + static Expr mone(-1.0); + return &mone; + } + + if(v == 0.5) { + static Expr half(0.5); + return ½ + } + + if(v == -0.5) { + static Expr mhalf(-0.5); + return &mhalf; + } + + Expr *r = AllocExpr(); + r->op = CONSTANT; + r->v = v; + return r; +} + +Expr *Expr::AnyOp(int newOp, Expr *b) { + Expr *r = AllocExpr(); + r->op = newOp; + r->a = this; + r->b = b; + return r; +} + +int Expr::Children(void) { + switch(op) { + case PARAM: + case PARAM_PTR: + case CONSTANT: + return 0; + + case PLUS: + case MINUS: + case TIMES: + case DIV: + return 2; + + case NEGATE: + case SQRT: + case SQUARE: + case SIN: + case COS: + case ASIN: + case ACOS: + return 1; + + default: oops(); + } +} + +int Expr::Nodes(void) { + switch(Children()) { + case 0: return 1; + case 1: return 1 + a->Nodes(); + case 2: return 1 + a->Nodes() + b->Nodes(); + default: oops(); + } +} + +Expr *Expr::DeepCopy(void) { + Expr *n = AllocExpr(); + *n = *this; + int c = n->Children(); + if(c > 0) n->a = a->DeepCopy(); + if(c > 1) n->b = b->DeepCopy(); + return n; +} + +Expr *Expr::DeepCopyWithParamsAsPointers(IdList *firstTry, + IdList *thenTry) +{ + Expr *n = AllocExpr(); + if(op == PARAM) { + // A param that is referenced by its hParam gets rewritten to go + // straight in to the parameter table with a pointer, or simply + // into a constant if it's already known. + Param *p = firstTry->FindByIdNoOops(parh); + if(!p) p = thenTry->FindById(parh); + if(p->known) { + n->op = CONSTANT; + n->v = p->val; + } else { + n->op = PARAM_PTR; + n->parp = p; + } + return n; + } + + *n = *this; + int c = n->Children(); + if(c > 0) n->a = a->DeepCopyWithParamsAsPointers(firstTry, thenTry); + if(c > 1) n->b = b->DeepCopyWithParamsAsPointers(firstTry, thenTry); + return n; +} + +double Expr::Eval(void) { + switch(op) { + case PARAM: return SK.GetParam(parh)->val; + case PARAM_PTR: return parp->val; + + case CONSTANT: return v; + + case PLUS: return a->Eval() + b->Eval(); + case MINUS: return a->Eval() - b->Eval(); + case TIMES: return a->Eval() * b->Eval(); + case DIV: return a->Eval() / b->Eval(); + + case NEGATE: return -(a->Eval()); + case SQRT: return sqrt(a->Eval()); + case SQUARE: { double r = a->Eval(); return r*r; } + case SIN: return sin(a->Eval()); + case COS: return cos(a->Eval()); + case ACOS: return acos(a->Eval()); + case ASIN: return asin(a->Eval()); + + default: oops(); + } +} + +Expr *Expr::PartialWrt(hParam p) { + Expr *da, *db; + + switch(op) { + case PARAM_PTR: return From(p.v == parp->h.v ? 1 : 0); + case PARAM: return From(p.v == parh.v ? 1 : 0); + + case CONSTANT: return From(0.0); + + case PLUS: return (a->PartialWrt(p))->Plus(b->PartialWrt(p)); + case MINUS: return (a->PartialWrt(p))->Minus(b->PartialWrt(p)); + + case TIMES: + da = a->PartialWrt(p); + db = b->PartialWrt(p); + return (a->Times(db))->Plus(b->Times(da)); + + case DIV: + da = a->PartialWrt(p); + db = b->PartialWrt(p); + return ((da->Times(b))->Minus(a->Times(db)))->Div(b->Square()); + + case SQRT: + return (From(0.5)->Div(a->Sqrt()))->Times(a->PartialWrt(p)); + + case SQUARE: + return (From(2.0)->Times(a))->Times(a->PartialWrt(p)); + + case NEGATE: return (a->PartialWrt(p))->Negate(); + case SIN: return (a->Cos())->Times(a->PartialWrt(p)); + case COS: return ((a->Sin())->Times(a->PartialWrt(p)))->Negate(); + + case ASIN: + return (From(1)->Div((From(1)->Minus(a->Square()))->Sqrt())) + ->Times(a->PartialWrt(p)); + case ACOS: + return (From(-1)->Div((From(1)->Minus(a->Square()))->Sqrt())) + ->Times(a->PartialWrt(p)); + + default: oops(); + } +} + +uint64_t Expr::ParamsUsed(void) { + uint64_t r = 0; + if(op == PARAM) r |= ((uint64_t)1 << (parh.v % 61)); + if(op == PARAM_PTR) r |= ((uint64_t)1 << (parp->h.v % 61)); + + int c = Children(); + if(c >= 1) r |= a->ParamsUsed(); + if(c >= 2) r |= b->ParamsUsed(); + return r; +} + +bool Expr::DependsOn(hParam p) { + if(op == PARAM) return (parh.v == p.v); + if(op == PARAM_PTR) return (parp->h.v == p.v); + + int c = Children(); + if(c == 1) return a->DependsOn(p); + if(c == 2) return a->DependsOn(p) || b->DependsOn(p); + return false; +} + +bool Expr::Tol(double a, double b) { + return fabs(a - b) < 0.001; +} +Expr *Expr::FoldConstants(void) { + Expr *n = AllocExpr(); + *n = *this; + + int c = Children(); + if(c >= 1) n->a = a->FoldConstants(); + if(c >= 2) n->b = b->FoldConstants(); + + switch(op) { + case PARAM_PTR: + case PARAM: + case CONSTANT: + break; + + case MINUS: + case TIMES: + case DIV: + case PLUS: + // If both ops are known, then we can evaluate immediately + if(n->a->op == CONSTANT && n->b->op == CONSTANT) { + double nv = n->Eval(); + n->op = CONSTANT; + n->v = nv; + break; + } + // x + 0 = 0 + x = x + if(op == PLUS && n->b->op == CONSTANT && Tol(n->b->v, 0)) { + *n = *(n->a); break; + } + if(op == PLUS && n->a->op == CONSTANT && Tol(n->a->v, 0)) { + *n = *(n->b); break; + } + // 1*x = x*1 = x + if(op == TIMES && n->b->op == CONSTANT && Tol(n->b->v, 1)) { + *n = *(n->a); break; + } + if(op == TIMES && n->a->op == CONSTANT && Tol(n->a->v, 1)) { + *n = *(n->b); break; + } + // 0*x = x*0 = 0 + if(op == TIMES && n->b->op == CONSTANT && Tol(n->b->v, 0)) { + n->op = CONSTANT; n->v = 0; break; + } + if(op == TIMES && n->a->op == CONSTANT && Tol(n->a->v, 0)) { + n->op = CONSTANT; n->v = 0; break; + } + + break; + + case SQRT: + case SQUARE: + case NEGATE: + case SIN: + case COS: + case ASIN: + case ACOS: + if(n->a->op == CONSTANT) { + double nv = n->Eval(); + n->op = CONSTANT; + n->v = nv; + } + break; + + default: oops(); + } + return n; +} + +void Expr::Substitute(hParam oldh, hParam newh) { + if(op == PARAM_PTR) oops(); + + if(op == PARAM && parh.v == oldh.v) { + parh = newh; + } + int c = Children(); + if(c >= 1) a->Substitute(oldh, newh); + if(c >= 2) b->Substitute(oldh, newh); +} + +//----------------------------------------------------------------------------- +// If the expression references only one parameter that appears in pl, then +// return that parameter. If no param is referenced, then return NO_PARAMS. +// If multiple params are referenced, then return MULTIPLE_PARAMS. +//----------------------------------------------------------------------------- +const hParam Expr::NO_PARAMS = { 0 }; +const hParam Expr::MULTIPLE_PARAMS = { 1 }; +hParam Expr::ReferencedParams(ParamList *pl) { + if(op == PARAM) { + if(pl->FindByIdNoOops(parh)) { + return parh; + } else { + return NO_PARAMS; + } + } + if(op == PARAM_PTR) oops(); + + int c = Children(); + if(c == 0) { + return NO_PARAMS; + } else if(c == 1) { + return a->ReferencedParams(pl); + } else if(c == 2) { + hParam pa, pb; + pa = a->ReferencedParams(pl); + pb = b->ReferencedParams(pl); + if(pa.v == NO_PARAMS.v) { + return pb; + } else if(pb.v == NO_PARAMS.v) { + return pa; + } else if(pa.v == pb.v) { + return pa; // either, doesn't matter + } else { + return MULTIPLE_PARAMS; + } + } else oops(); +} + + +//----------------------------------------------------------------------------- +// Routines to pretty-print an expression. Mostly for debugging. +//----------------------------------------------------------------------------- + +std::string Expr::Print(void) { + + char c; + switch(op) { + case PARAM: return ssprintf("param(%08x)", parh.v); + case PARAM_PTR: return ssprintf("param(p%08x)", parp->h.v); + + case CONSTANT: return ssprintf("%.3f", v); + + case PLUS: c = '+'; goto p; + case MINUS: c = '-'; goto p; + case TIMES: c = '*'; goto p; + case DIV: c = '/'; goto p; +p: + return "(" + a->Print() + " " + c + " " + b->Print() + ")"; + break; + + case NEGATE: return "(- " + a->Print() + ")"; + case SQRT: return "(sqrt " + a->Print() + ")"; + case SQUARE: return "(square " + a->Print() + ")"; + case SIN: return "(sin " + a->Print() + ")"; + case COS: return "(cos " + a->Print() + ")"; + case ASIN: return "(asin " + a->Print() + ")"; + case ACOS: return "(acos " + a->Print() + ")"; + + default: oops(); + } +} + + +//----------------------------------------------------------------------------- +// A parser; convert a string to an expression. Infix notation, with the +// usual shift/reduce approach. I had great hopes for user-entered eq +// constraints, but those don't seem very useful, so right now this is just +// to provide calculator type functionality wherever numbers are entered. +//----------------------------------------------------------------------------- + +#define MAX_UNPARSED 1024 +static Expr *Unparsed[MAX_UNPARSED]; +static int UnparsedCnt, UnparsedP; + +static Expr *Operands[MAX_UNPARSED]; +static int OperandsP; + +static Expr *Operators[MAX_UNPARSED]; +static int OperatorsP; + +void Expr::PushOperator(Expr *e) { + if(OperatorsP >= MAX_UNPARSED) throw "operator stack full!"; + Operators[OperatorsP++] = e; +} +Expr *Expr::TopOperator(void) { + if(OperatorsP <= 0) throw "operator stack empty (get top)"; + return Operators[OperatorsP-1]; +} +Expr *Expr::PopOperator(void) { + if(OperatorsP <= 0) throw "operator stack empty (pop)"; + return Operators[--OperatorsP]; +} +void Expr::PushOperand(Expr *e) { + if(OperandsP >= MAX_UNPARSED) throw "operand stack full"; + Operands[OperandsP++] = e; +} +Expr *Expr::PopOperand(void) { + if(OperandsP <= 0) throw "operand stack empty"; + return Operands[--OperandsP]; +} +Expr *Expr::Next(void) { + if(UnparsedP >= UnparsedCnt) return NULL; + return Unparsed[UnparsedP]; +} +void Expr::Consume(void) { + if(UnparsedP >= UnparsedCnt) throw "no token to consume"; + UnparsedP++; +} + +int Expr::Precedence(Expr *e) { + if(e->op == ALL_RESOLVED) return -1; // never want to reduce this marker + if(e->op != BINARY_OP && e->op != UNARY_OP) oops(); + + switch(e->c) { + case 'q': + case 's': + case 'c': + case 'n': return 30; + + case '*': + case '/': return 20; + + case '+': + case '-': return 10; + + default: oops(); + } +} + +void Expr::Reduce(void) { + Expr *a, *b; + + Expr *op = PopOperator(); + Expr *n; + int o; + switch(op->c) { + case '+': o = PLUS; goto c; + case '-': o = MINUS; goto c; + case '*': o = TIMES; goto c; + case '/': o = DIV; goto c; +c: + b = PopOperand(); + a = PopOperand(); + n = a->AnyOp(o, b); + break; + + case 'n': n = PopOperand()->Negate(); break; + case 'q': n = PopOperand()->Sqrt(); break; + case 's': n = (PopOperand()->Times(Expr::From(PI/180)))->Sin(); break; + case 'c': n = (PopOperand()->Times(Expr::From(PI/180)))->Cos(); break; + + default: oops(); + } + PushOperand(n); +} + +void Expr::ReduceAndPush(Expr *n) { + while(Precedence(n) <= Precedence(TopOperator())) { + Reduce(); + } + PushOperator(n); +} + +void Expr::Parse(void) { + Expr *e = AllocExpr(); + e->op = ALL_RESOLVED; + PushOperator(e); + + for(;;) { + Expr *n = Next(); + if(!n) throw "end of expression unexpected"; + + if(n->op == CONSTANT) { + PushOperand(n); + Consume(); + } else if(n->op == PAREN && n->c == '(') { + Consume(); + Parse(); + n = Next(); + if(n->op != PAREN || n->c != ')') throw "expected: )"; + Consume(); + } else if(n->op == UNARY_OP) { + PushOperator(n); + Consume(); + continue; + } else if(n->op == BINARY_OP && n->c == '-') { + // The minus sign is special, because it might be binary or + // unary, depending on context. + n->op = UNARY_OP; + n->c = 'n'; + PushOperator(n); + Consume(); + continue; + } else { + throw "expected expression"; + } + + n = Next(); + if(n && n->op == BINARY_OP) { + ReduceAndPush(n); + Consume(); + } else { + break; + } + } + + while(TopOperator()->op != ALL_RESOLVED) { + Reduce(); + } + PopOperator(); // discard the ALL_RESOLVED marker +} + +void Expr::Lex(const char *in) { + while(*in) { + if(UnparsedCnt >= MAX_UNPARSED) throw "too long"; + + char c = *in; + if(isdigit(c) || c == '.') { + // A number literal + char number[70]; + int len = 0; + while((isdigit(*in) || *in == '.') && len < 30) { + number[len++] = *in; + in++; + } + number[len++] = '\0'; + Expr *e = AllocExpr(); + e->op = CONSTANT; + e->v = atof(number); + Unparsed[UnparsedCnt++] = e; + } else if(isalpha(c) || c == '_') { + char name[70]; + int len = 0; + while(isforname(*in) && len < 30) { + name[len++] = *in; + in++; + } + name[len++] = '\0'; + + Expr *e = AllocExpr(); + if(strcmp(name, "sqrt")==0) { + e->op = UNARY_OP; + e->c = 'q'; + } else if(strcmp(name, "cos")==0) { + e->op = UNARY_OP; + e->c = 'c'; + } else if(strcmp(name, "sin")==0) { + e->op = UNARY_OP; + e->c = 's'; + } else if(strcmp(name, "pi")==0) { + e->op = CONSTANT; + e->v = PI; + } else { + throw "unknown name"; + } + Unparsed[UnparsedCnt++] = e; + } else if(strchr("+-*/()", c)) { + Expr *e = AllocExpr(); + e->op = (c == '(' || c == ')') ? PAREN : BINARY_OP; + e->c = c; + Unparsed[UnparsedCnt++] = e; + in++; + } else if(isspace(c)) { + // Ignore whitespace + in++; + } else { + // This is a lex error. + throw "unexpected characters"; + } + } +} + +Expr *Expr::From(const char *in, bool popUpError) { + UnparsedCnt = 0; + UnparsedP = 0; + OperandsP = 0; + OperatorsP = 0; + + Expr *r; + try { + Lex(in); + Parse(); + r = PopOperand(); + } catch (const char *e) { + dbp("exception: parse/lex error: %s", e); + if(popUpError) { + Error("Not a valid number or expression: '%s'", in); + } + return NULL; + } + return r; +} + diff --git a/src/expr.h b/src/expr.h new file mode 100644 index 0000000..eaf79b0 --- /dev/null +++ b/src/expr.h @@ -0,0 +1,169 @@ +//----------------------------------------------------------------------------- +// An expression in our symbolic algebra system, used to write, linearize, +// and solve our constraint equations. +// +// Copyright 2008-2013 Jonathan Westhues. +//----------------------------------------------------------------------------- + +#ifndef __EXPR_H +#define __EXPR_H + +class Expr; + +class Expr { +public: + + enum { + // A parameter, by the hParam handle + PARAM = 0, + // A parameter, by a pointer straight in to the param table (faster, + // if we know that the param table won't move around) + PARAM_PTR = 1, + + CONSTANT = 20, + + PLUS = 100, + MINUS = 101, + TIMES = 102, + DIV = 103, + NEGATE = 104, + SQRT = 105, + SQUARE = 106, + SIN = 107, + COS = 108, + ASIN = 109, + ACOS = 110, + + // Special helpers for when we're parsing an expression from text. + // Initially, literals (like a constant number) appear in the same + // format as they will in the finished expression, but the operators + // are different until the parser fixes things up (and builds the + // tree from the flat list that the lexer outputs). + ALL_RESOLVED = 1000, + PAREN = 1001, + BINARY_OP = 1002, + UNARY_OP = 1003 + }; + + int op; + Expr *a; + union { + double v; + hParam parh; + Param *parp; + Expr *b; + + // For use while parsing + char c; + }; + + Expr() { } + Expr(double val) : op(CONSTANT) { v = val; } + + static inline Expr *AllocExpr(void) + { return (Expr *)AllocTemporary(sizeof(Expr)); } + + static Expr *From(hParam p); + static Expr *From(double v); + + Expr *AnyOp(int op, Expr *b); + inline Expr *Plus (Expr *b_) { return AnyOp(PLUS, b_); } + inline Expr *Minus(Expr *b_) { return AnyOp(MINUS, b_); } + inline Expr *Times(Expr *b_) { return AnyOp(TIMES, b_); } + inline Expr *Div (Expr *b_) { return AnyOp(DIV, b_); } + + inline Expr *Negate(void) { return AnyOp(NEGATE, NULL); } + inline Expr *Sqrt (void) { return AnyOp(SQRT, NULL); } + inline Expr *Square(void) { return AnyOp(SQUARE, NULL); } + inline Expr *Sin (void) { return AnyOp(SIN, NULL); } + inline Expr *Cos (void) { return AnyOp(COS, NULL); } + inline Expr *ASin (void) { return AnyOp(ASIN, NULL); } + inline Expr *ACos (void) { return AnyOp(ACOS, NULL); } + + Expr *PartialWrt(hParam p); + double Eval(void); + uint64_t ParamsUsed(void); + bool DependsOn(hParam p); + static bool Tol(double a, double b); + Expr *FoldConstants(void); + void Substitute(hParam oldh, hParam newh); + + static const hParam NO_PARAMS, MULTIPLE_PARAMS; + hParam ReferencedParams(ParamList *pl); + + void ParamsToPointers(void); + + std::string Print(void); + + // number of child nodes: 0 (e.g. constant), 1 (sqrt), or 2 (+) + int Children(void); + // total number of nodes in the tree + int Nodes(void); + + // Make a simple copy + Expr *DeepCopy(void); + // Make a copy, with the parameters (usually referenced by hParam) + // resolved to pointers to the actual value. This speeds things up + // considerably. + Expr *DeepCopyWithParamsAsPointers(IdList *firstTry, + IdList *thenTry); + + static Expr *From(const char *in, bool popUpError); + static void Lex(const char *in); + static Expr *Next(void); + static void Consume(void); + + static void PushOperator(Expr *e); + static Expr *PopOperator(void); + static Expr *TopOperator(void); + static void PushOperand(Expr *e); + static Expr *PopOperand(void); + + static void Reduce(void); + static void ReduceAndPush(Expr *e); + static int Precedence(Expr *e); + + static int Precedence(int op); + static void Parse(void); +}; + +class ExprVector { +public: + Expr *x, *y, *z; + + static ExprVector From(Expr *x, Expr *y, Expr *z); + static ExprVector From(Vector vn); + static ExprVector From(hParam x, hParam y, hParam z); + static ExprVector From(double x, double y, double z); + + ExprVector Plus(ExprVector b); + ExprVector Minus(ExprVector b); + Expr *Dot(ExprVector b); + ExprVector Cross(ExprVector b); + ExprVector ScaledBy(Expr *s); + ExprVector WithMagnitude(Expr *s); + Expr *Magnitude(void); + + Vector Eval(void); +}; + +class ExprQuaternion { +public: + Expr *w, *vx, *vy, *vz; + + static ExprQuaternion From(Expr *w, Expr *vx, Expr *vy, Expr *vz); + static ExprQuaternion From(Quaternion qn); + static ExprQuaternion From(hParam w, hParam vx, hParam vy, hParam vz); + + ExprVector RotationU(void); + ExprVector RotationV(void); + ExprVector RotationN(void); + + ExprVector Rotate(ExprVector p); + ExprQuaternion Times(ExprQuaternion b); + + Expr *Magnitude(void); +}; + +#endif + diff --git a/src/file.cpp b/src/file.cpp new file mode 100644 index 0000000..daad828 --- /dev/null +++ b/src/file.cpp @@ -0,0 +1,869 @@ +//----------------------------------------------------------------------------- +// Routines to write and read our .slvs file format. +// +// Copyright 2008-2013 Jonathan Westhues. +//----------------------------------------------------------------------------- +#include "solvespace.h" + +#define VERSION_STRING "\261\262\263" "SolveSpaceREVa" + +static int StrStartsWith(const char *str, const char *start) { + return memcmp(str, start, strlen(start)) == 0; +} + +//----------------------------------------------------------------------------- +// Clear and free all the dynamic memory associated with our currently-loaded +// sketch. This does not leave the program in an acceptable state (with the +// references created, and so on), so anyone calling this must fix that later. +//----------------------------------------------------------------------------- +void SolveSpaceUI::ClearExisting(void) { + UndoClearStack(&redo); + UndoClearStack(&undo); + + for(int i = 0; i < SK.groupOrder.n; i++) { + Group *g = SK.GetGroup(SK.groupOrder.elem[i]); + g->Clear(); + } + + SK.constraint.Clear(); + SK.request.Clear(); + SK.group.Clear(); + SK.groupOrder.Clear(); + SK.style.Clear(); + + SK.entity.Clear(); + SK.param.Clear(); +} + +hGroup SolveSpaceUI::CreateDefaultDrawingGroup(void) { + Group g = {}; + + // And an empty group, for the first stuff the user draws. + g.visible = true; + g.name = "sketch-in-plane"; + g.type = Group::DRAWING_WORKPLANE; + g.subtype = Group::WORKPLANE_BY_POINT_ORTHO; + g.order = 1; + g.predef.q = Quaternion::From(1, 0, 0, 0); + hRequest hr = Request::HREQUEST_REFERENCE_XY; + g.predef.origin = hr.entity(1); + SK.group.AddAndAssignId(&g); + SK.GetGroup(g.h)->activeWorkplane = g.h.entity(0); + return g.h; +} + +void SolveSpaceUI::NewFile(void) { + ClearExisting(); + + // Our initial group, that contains the references. + Group g = {}; + g.visible = true; + g.name = "#references"; + g.type = Group::DRAWING_3D; + g.order = 0; + g.h = Group::HGROUP_REFERENCES; + SK.group.Add(&g); + + // Let's create three two-d coordinate systems, for the coordinate + // planes; these are our references, present in every sketch. + Request r = {}; + r.type = Request::WORKPLANE; + r.group = Group::HGROUP_REFERENCES; + r.workplane = Entity::FREE_IN_3D; + + r.h = Request::HREQUEST_REFERENCE_XY; + SK.request.Add(&r); + + r.h = Request::HREQUEST_REFERENCE_YZ; + SK.request.Add(&r); + + r.h = Request::HREQUEST_REFERENCE_ZX; + SK.request.Add(&r); + + CreateDefaultDrawingGroup(); +} + +const SolveSpaceUI::SaveTable SolveSpaceUI::SAVED[] = { + { 'g', "Group.h.v", 'x', &(SS.sv.g.h.v) }, + { 'g', "Group.type", 'd', &(SS.sv.g.type) }, + { 'g', "Group.order", 'd', &(SS.sv.g.order) }, + { 'g', "Group.name", 'S', &(SS.sv.g.name) }, + { 'g', "Group.activeWorkplane.v", 'x', &(SS.sv.g.activeWorkplane.v) }, + { 'g', "Group.opA.v", 'x', &(SS.sv.g.opA.v) }, + { 'g', "Group.opB.v", 'x', &(SS.sv.g.opB.v) }, + { 'g', "Group.valA", 'f', &(SS.sv.g.valA) }, + { 'g', "Group.valB", 'f', &(SS.sv.g.valB) }, + { 'g', "Group.valC", 'f', &(SS.sv.g.valB) }, + { 'g', "Group.color", 'c', &(SS.sv.g.color) }, + { 'g', "Group.subtype", 'd', &(SS.sv.g.subtype) }, + { 'g', "Group.skipFirst", 'b', &(SS.sv.g.skipFirst) }, + { 'g', "Group.meshCombine", 'd', &(SS.sv.g.meshCombine) }, + { 'g', "Group.forceToMesh", 'd', &(SS.sv.g.forceToMesh) }, + { 'g', "Group.predef.q.w", 'f', &(SS.sv.g.predef.q.w) }, + { 'g', "Group.predef.q.vx", 'f', &(SS.sv.g.predef.q.vx) }, + { 'g', "Group.predef.q.vy", 'f', &(SS.sv.g.predef.q.vy) }, + { 'g', "Group.predef.q.vz", 'f', &(SS.sv.g.predef.q.vz) }, + { 'g', "Group.predef.origin.v", 'x', &(SS.sv.g.predef.origin.v) }, + { 'g', "Group.predef.entityB.v", 'x', &(SS.sv.g.predef.entityB.v) }, + { 'g', "Group.predef.entityC.v", 'x', &(SS.sv.g.predef.entityC.v) }, + { 'g', "Group.predef.swapUV", 'b', &(SS.sv.g.predef.swapUV) }, + { 'g', "Group.predef.negateU", 'b', &(SS.sv.g.predef.negateU) }, + { 'g', "Group.predef.negateV", 'b', &(SS.sv.g.predef.negateV) }, + { 'g', "Group.visible", 'b', &(SS.sv.g.visible) }, + { 'g', "Group.suppress", 'b', &(SS.sv.g.suppress) }, + { 'g', "Group.relaxConstraints", 'b', &(SS.sv.g.relaxConstraints) }, + { 'g', "Group.allowRedundant", 'b', &(SS.sv.g.allowRedundant) }, + { 'g', "Group.allDimsReference", 'b', &(SS.sv.g.allDimsReference) }, + { 'g', "Group.scale", 'f', &(SS.sv.g.scale) }, + { 'g', "Group.remap", 'M', &(SS.sv.g.remap) }, + { 'g', "Group.impFile", 'S', &(SS.sv.g.linkFile) }, + { 'g', "Group.impFileRel", 'S', &(SS.sv.g.linkFileRel) }, + + { 'p', "Param.h.v.", 'x', &(SS.sv.p.h.v) }, + { 'p', "Param.val", 'f', &(SS.sv.p.val) }, + + { 'r', "Request.h.v", 'x', &(SS.sv.r.h.v) }, + { 'r', "Request.type", 'd', &(SS.sv.r.type) }, + { 'r', "Request.extraPoints", 'd', &(SS.sv.r.extraPoints) }, + { 'r', "Request.workplane.v", 'x', &(SS.sv.r.workplane.v) }, + { 'r', "Request.group.v", 'x', &(SS.sv.r.group.v) }, + { 'r', "Request.construction", 'b', &(SS.sv.r.construction) }, + { 'r', "Request.style", 'x', &(SS.sv.r.style) }, + { 'r', "Request.str", 'S', &(SS.sv.r.str) }, + { 'r', "Request.font", 'S', &(SS.sv.r.font) }, + + { 'e', "Entity.h.v", 'x', &(SS.sv.e.h.v) }, + { 'e', "Entity.type", 'd', &(SS.sv.e.type) }, + { 'e', "Entity.construction", 'b', &(SS.sv.e.construction) }, + { 'e', "Entity.style", 'x', &(SS.sv.e.style) }, + { 'e', "Entity.str", 'S', &(SS.sv.e.str) }, + { 'e', "Entity.font", 'S', &(SS.sv.e.font) }, + { 'e', "Entity.point[0].v", 'x', &(SS.sv.e.point[0].v) }, + { 'e', "Entity.point[1].v", 'x', &(SS.sv.e.point[1].v) }, + { 'e', "Entity.point[2].v", 'x', &(SS.sv.e.point[2].v) }, + { 'e', "Entity.point[3].v", 'x', &(SS.sv.e.point[3].v) }, + { 'e', "Entity.point[4].v", 'x', &(SS.sv.e.point[4].v) }, + { 'e', "Entity.point[5].v", 'x', &(SS.sv.e.point[5].v) }, + { 'e', "Entity.point[6].v", 'x', &(SS.sv.e.point[6].v) }, + { 'e', "Entity.point[7].v", 'x', &(SS.sv.e.point[7].v) }, + { 'e', "Entity.point[8].v", 'x', &(SS.sv.e.point[8].v) }, + { 'e', "Entity.point[9].v", 'x', &(SS.sv.e.point[9].v) }, + { 'e', "Entity.point[10].v", 'x', &(SS.sv.e.point[10].v) }, + { 'e', "Entity.point[11].v", 'x', &(SS.sv.e.point[11].v) }, + { 'e', "Entity.extraPoints", 'd', &(SS.sv.e.extraPoints) }, + { 'e', "Entity.normal.v", 'x', &(SS.sv.e.normal.v) }, + { 'e', "Entity.distance.v", 'x', &(SS.sv.e.distance.v) }, + { 'e', "Entity.workplane.v", 'x', &(SS.sv.e.workplane.v) }, + { 'e', "Entity.actPoint.x", 'f', &(SS.sv.e.actPoint.x) }, + { 'e', "Entity.actPoint.y", 'f', &(SS.sv.e.actPoint.y) }, + { 'e', "Entity.actPoint.z", 'f', &(SS.sv.e.actPoint.z) }, + { 'e', "Entity.actNormal.w", 'f', &(SS.sv.e.actNormal.w) }, + { 'e', "Entity.actNormal.vx", 'f', &(SS.sv.e.actNormal.vx) }, + { 'e', "Entity.actNormal.vy", 'f', &(SS.sv.e.actNormal.vy) }, + { 'e', "Entity.actNormal.vz", 'f', &(SS.sv.e.actNormal.vz) }, + { 'e', "Entity.actDistance", 'f', &(SS.sv.e.actDistance) }, + { 'e', "Entity.actVisible", 'b', &(SS.sv.e.actVisible), }, + + + { 'c', "Constraint.h.v", 'x', &(SS.sv.c.h.v) }, + { 'c', "Constraint.type", 'd', &(SS.sv.c.type) }, + { 'c', "Constraint.group.v", 'x', &(SS.sv.c.group.v) }, + { 'c', "Constraint.workplane.v", 'x', &(SS.sv.c.workplane.v) }, + { 'c', "Constraint.valA", 'f', &(SS.sv.c.valA) }, + { 'c', "Constraint.ptA.v", 'x', &(SS.sv.c.ptA.v) }, + { 'c', "Constraint.ptB.v", 'x', &(SS.sv.c.ptB.v) }, + { 'c', "Constraint.entityA.v", 'x', &(SS.sv.c.entityA.v) }, + { 'c', "Constraint.entityB.v", 'x', &(SS.sv.c.entityB.v) }, + { 'c', "Constraint.entityC.v", 'x', &(SS.sv.c.entityC.v) }, + { 'c', "Constraint.entityD.v", 'x', &(SS.sv.c.entityD.v) }, + { 'c', "Constraint.other", 'b', &(SS.sv.c.other) }, + { 'c', "Constraint.other2", 'b', &(SS.sv.c.other2) }, + { 'c', "Constraint.reference", 'b', &(SS.sv.c.reference) }, + { 'c', "Constraint.comment", 'S', &(SS.sv.c.comment) }, + { 'c', "Constraint.disp.offset.x", 'f', &(SS.sv.c.disp.offset.x) }, + { 'c', "Constraint.disp.offset.y", 'f', &(SS.sv.c.disp.offset.y) }, + { 'c', "Constraint.disp.offset.z", 'f', &(SS.sv.c.disp.offset.z) }, + { 'c', "Constraint.disp.style", 'x', &(SS.sv.c.disp.style) }, + + { 's', "Style.h.v", 'x', &(SS.sv.s.h.v) }, + { 's', "Style.name", 'S', &(SS.sv.s.name) }, + { 's', "Style.width", 'f', &(SS.sv.s.width) }, + { 's', "Style.widthAs", 'd', &(SS.sv.s.widthAs) }, + { 's', "Style.textHeight", 'f', &(SS.sv.s.textHeight) }, + { 's', "Style.textHeightAs", 'd', &(SS.sv.s.textHeightAs) }, + { 's', "Style.textAngle", 'f', &(SS.sv.s.textAngle) }, + { 's', "Style.textOrigin", 'x', &(SS.sv.s.textOrigin) }, + { 's', "Style.color", 'c', &(SS.sv.s.color) }, + { 's', "Style.fillColor", 'c', &(SS.sv.s.fillColor) }, + { 's', "Style.filled", 'b', &(SS.sv.s.filled) }, + { 's', "Style.visible", 'b', &(SS.sv.s.visible) }, + { 's', "Style.exportable", 'b', &(SS.sv.s.exportable) }, + { 's', "Style.stippleType", 'd', &(SS.sv.s.stippleType) }, + { 's', "Style.stippleScale", 'f', &(SS.sv.s.stippleScale) }, + + { 0, NULL, 0, NULL } +}; + +struct SAVEDptr { + IdList &M() { return *((IdList *)this); } + std::string &S() { return *((std::string *)this); } + bool &b() { return *((bool *)this); } + RgbaColor &c() { return *((RgbaColor *)this); } + int &d() { return *((int *)this); } + double &f() { return *((double *)this); } + uint32_t &x() { return *((uint32_t *)this); } +}; + +void SolveSpaceUI::SaveUsingTable(int type) { + int i; + for(i = 0; SAVED[i].type != 0; i++) { + if(SAVED[i].type != type) continue; + + int fmt = SAVED[i].fmt; + SAVEDptr *p = (SAVEDptr *)SAVED[i].ptr; + // Any items that aren't specified are assumed to be zero + if(fmt == 'S' && p->S().empty()) continue; + if(fmt == 'd' && p->d() == 0) continue; + if(fmt == 'f' && EXACT(p->f() == 0.0)) continue; + if(fmt == 'x' && p->x() == 0) continue; + + fprintf(fh, "%s=", SAVED[i].desc); + switch(fmt) { + case 'S': fprintf(fh, "%s", p->S().c_str()); break; + case 'b': fprintf(fh, "%d", p->b() ? 1 : 0); break; + case 'c': fprintf(fh, "%08x", p->c().ToPackedInt()); break; + case 'd': fprintf(fh, "%d", p->d()); break; + case 'f': fprintf(fh, "%.20f", p->f()); break; + case 'x': fprintf(fh, "%08x", p->x()); break; + + case 'M': { + int j; + fprintf(fh, "{\n"); + for(j = 0; j < p->M().n; j++) { + EntityMap *em = &(p->M().elem[j]); + fprintf(fh, " %d %08x %d\n", + em->h.v, em->input.v, em->copyNumber); + } + fprintf(fh, "}"); + break; + } + + default: oops(); + } + fprintf(fh, "\n"); + } +} + +bool SolveSpaceUI::SaveToFile(const std::string &filename) { + // Make sure all the entities are regenerated up to date, since they + // will be exported. We reload the linked files because that rewrites + // the linkFileRel for our possibly-new filename. + SS.ScheduleShowTW(); + SS.ReloadAllImported(); + SS.GenerateAll(SolveSpaceUI::GENERATE_ALL); + + fh = ssfopen(filename, "wb"); + if(!fh) { + Error("Couldn't write to file '%s'", filename.c_str()); + return false; + } + + fprintf(fh, "%s\n\n\n", VERSION_STRING); + + int i, j; + for(i = 0; i < SK.group.n; i++) { + sv.g = SK.group.elem[i]; + SaveUsingTable('g'); + fprintf(fh, "AddGroup\n\n"); + } + + for(i = 0; i < SK.param.n; i++) { + sv.p = SK.param.elem[i]; + SaveUsingTable('p'); + fprintf(fh, "AddParam\n\n"); + } + + for(i = 0; i < SK.request.n; i++) { + sv.r = SK.request.elem[i]; + SaveUsingTable('r'); + fprintf(fh, "AddRequest\n\n"); + } + + for(i = 0; i < SK.entity.n; i++) { + (SK.entity.elem[i]).CalculateNumerical(true); + sv.e = SK.entity.elem[i]; + SaveUsingTable('e'); + fprintf(fh, "AddEntity\n\n"); + } + + for(i = 0; i < SK.constraint.n; i++) { + sv.c = SK.constraint.elem[i]; + SaveUsingTable('c'); + fprintf(fh, "AddConstraint\n\n"); + } + + for(i = 0; i < SK.style.n; i++) { + sv.s = SK.style.elem[i]; + if(sv.s.h.v >= Style::FIRST_CUSTOM) { + SaveUsingTable('s'); + fprintf(fh, "AddStyle\n\n"); + } + } + + // A group will have either a mesh or a shell, but not both; but the code + // to print either of those just does nothing if the mesh/shell is empty. + + Group *g = SK.GetGroup(SK.groupOrder.elem[SK.groupOrder.n - 1]); + SMesh *m = &g->runningMesh; + for(i = 0; i < m->l.n; i++) { + STriangle *tr = &(m->l.elem[i]); + fprintf(fh, "Triangle %08x %08x " + "%.20f %.20f %.20f %.20f %.20f %.20f %.20f %.20f %.20f\n", + tr->meta.face, tr->meta.color.ToPackedInt(), + CO(tr->a), CO(tr->b), CO(tr->c)); + } + + SShell *s = &g->runningShell; + SSurface *srf; + for(srf = s->surface.First(); srf; srf = s->surface.NextAfter(srf)) { + fprintf(fh, "Surface %08x %08x %08x %d %d\n", + srf->h.v, srf->color.ToPackedInt(), srf->face, srf->degm, srf->degn); + for(i = 0; i <= srf->degm; i++) { + for(j = 0; j <= srf->degn; j++) { + fprintf(fh, "SCtrl %d %d %.20f %.20f %.20f Weight %20.20f\n", + i, j, CO(srf->ctrl[i][j]), srf->weight[i][j]); + } + } + + STrimBy *stb; + for(stb = srf->trim.First(); stb; stb = srf->trim.NextAfter(stb)) { + fprintf(fh, "TrimBy %08x %d %.20f %.20f %.20f %.20f %.20f %.20f\n", + stb->curve.v, stb->backwards ? 1 : 0, + CO(stb->start), CO(stb->finish)); + } + + fprintf(fh, "AddSurface\n"); + } + SCurve *sc; + for(sc = s->curve.First(); sc; sc = s->curve.NextAfter(sc)) { + fprintf(fh, "Curve %08x %d %d %08x %08x\n", + sc->h.v, + sc->isExact ? 1 : 0, sc->exact.deg, + sc->surfA.v, sc->surfB.v); + + if(sc->isExact) { + for(i = 0; i <= sc->exact.deg; i++) { + fprintf(fh, "CCtrl %d %.20f %.20f %.20f Weight %.20f\n", + i, CO(sc->exact.ctrl[i]), sc->exact.weight[i]); + } + } + SCurvePt *scpt; + for(scpt = sc->pts.First(); scpt; scpt = sc->pts.NextAfter(scpt)) { + fprintf(fh, "CurvePt %d %.20f %.20f %.20f\n", + scpt->vertex ? 1 : 0, CO(scpt->p)); + } + + fprintf(fh, "AddCurve\n"); + } + + fclose(fh); + + return true; +} + +void SolveSpaceUI::LoadUsingTable(char *key, char *val) { + int i; + for(i = 0; SAVED[i].type != 0; i++) { + if(strcmp(SAVED[i].desc, key)==0) { + SAVEDptr *p = (SAVEDptr *)SAVED[i].ptr; + unsigned int u = 0; + switch(SAVED[i].fmt) { + case 'S': p->S() = val; break; + case 'b': p->b() = (atoi(val) != 0); break; + case 'd': p->d() = atoi(val); break; + case 'f': p->f() = atof(val); break; + case 'x': sscanf(val, "%x", &u); p->x()= u; break; + + case 'c': + sscanf(val, "%x", &u); + p->c() = RgbaColor::FromPackedInt(u); + break; + + case 'P': + p->S() = val; + break; + + case 'M': { + // Don't clear this list! When the group gets added, it + // makes a shallow copy, so that would result in us + // freeing memory that we want to keep around. Just + // zero it out so that new memory is allocated. + p->M() = {}; + for(;;) { + EntityMap em; + char line2[1024]; + if (fgets(line2, (int)sizeof(line2), fh) == NULL) + break; + if(sscanf(line2, "%d %x %d", &(em.h.v), &(em.input.v), + &(em.copyNumber)) == 3) + { + p->M().Add(&em); + } else { + break; + } + } + break; + } + + default: oops(); + } + break; + } + } + if(SAVED[i].type == 0) { + fileLoadError = true; + } +} + +bool SolveSpaceUI::LoadFromFile(const std::string &filename) { + allConsistent = false; + fileLoadError = false; + + fh = ssfopen(filename, "rb"); + if(!fh) { + Error("Couldn't read from file '%s'", filename.c_str()); + return false; + } + + ClearExisting(); + + sv = {}; + sv.g.scale = 1; // default is 1, not 0; so legacy files need this + Style::FillDefaultStyle(&sv.s); + + char line[1024]; + while(fgets(line, (int)sizeof(line), fh)) { + char *s = strchr(line, '\n'); + if(s) *s = '\0'; + // We should never get files with \r characters in them, but mailers + // will sometimes mangle attachments. + s = strchr(line, '\r'); + if(s) *s = '\0'; + + if(*line == '\0') continue; + + char *e = strchr(line, '='); + if(e) { + *e = '\0'; + char *key = line, *val = e+1; + LoadUsingTable(key, val); + } else if(strcmp(line, "AddGroup")==0) { + // legacy files have a spurious dependency between linked groups + // and their parent groups, remove + if(sv.g.type == Group::LINKED) + sv.g.opA.v = 0; + + SK.group.Add(&(sv.g)); + sv.g = {}; + sv.g.scale = 1; // default is 1, not 0; so legacy files need this + } else if(strcmp(line, "AddParam")==0) { + // params are regenerated, but we want to preload the values + // for initial guesses + SK.param.Add(&(sv.p)); + sv.p = {}; + } else if(strcmp(line, "AddEntity")==0) { + // entities are regenerated + } else if(strcmp(line, "AddRequest")==0) { + SK.request.Add(&(sv.r)); + sv.r = {}; + } else if(strcmp(line, "AddConstraint")==0) { + SK.constraint.Add(&(sv.c)); + sv.c = {}; + } else if(strcmp(line, "AddStyle")==0) { + SK.style.Add(&(sv.s)); + sv.s = {}; + Style::FillDefaultStyle(&sv.s); + } else if(strcmp(line, VERSION_STRING)==0) { + // do nothing, version string + } else if(StrStartsWith(line, "Triangle ") || + StrStartsWith(line, "Surface ") || + StrStartsWith(line, "SCtrl ") || + StrStartsWith(line, "TrimBy ") || + StrStartsWith(line, "Curve ") || + StrStartsWith(line, "CCtrl ") || + StrStartsWith(line, "CurvePt ") || + strcmp(line, "AddSurface")==0 || + strcmp(line, "AddCurve")==0) + { + // ignore the mesh or shell, since we regenerate that + } else { + fileLoadError = true; + } + } + + fclose(fh); + + if(fileLoadError) { + Error("Unrecognized data in file. This file may be corrupt, or " + "from a new version of the program."); + // At least leave the program in a non-crashing state. + if(SK.group.n == 0) { + NewFile(); + } + } + + return true; +} + +bool SolveSpaceUI::LoadEntitiesFromFile(const std::string &filename, EntityList *le, + SMesh *m, SShell *sh) +{ + SSurface srf = {}; + SCurve crv = {}; + + fh = ssfopen(filename, "rb"); + if(!fh) return false; + + le->Clear(); + sv = {}; + + char line[1024]; + while(fgets(line, (int)sizeof(line), fh)) { + char *s = strchr(line, '\n'); + if(s) *s = '\0'; + // We should never get files with \r characters in them, but mailers + // will sometimes mangle attachments. + s = strchr(line, '\r'); + if(s) *s = '\0'; + + if(*line == '\0') continue; + + char *e = strchr(line, '='); + if(e) { + *e = '\0'; + char *key = line, *val = e+1; + LoadUsingTable(key, val); + } else if(strcmp(line, "AddGroup")==0) { + // Don't leak memory; these get allocated whether we want them + // or not. + sv.g.remap.Clear(); + } else if(strcmp(line, "AddParam")==0) { + + } else if(strcmp(line, "AddEntity")==0) { + le->Add(&(sv.e)); + sv.e = {}; + } else if(strcmp(line, "AddRequest")==0) { + + } else if(strcmp(line, "AddConstraint")==0) { + + } else if(strcmp(line, "AddStyle")==0) { + + } else if(strcmp(line, VERSION_STRING)==0) { + + } else if(StrStartsWith(line, "Triangle ")) { + STriangle tr = {}; + unsigned int rgba = 0; + if(sscanf(line, "Triangle %x %x " + "%lf %lf %lf %lf %lf %lf %lf %lf %lf", + &(tr.meta.face), &rgba, + &(tr.a.x), &(tr.a.y), &(tr.a.z), + &(tr.b.x), &(tr.b.y), &(tr.b.z), + &(tr.c.x), &(tr.c.y), &(tr.c.z)) != 11) { + oops(); + } + tr.meta.color = RgbaColor::FromPackedInt((uint32_t)rgba); + m->AddTriangle(&tr); + } else if(StrStartsWith(line, "Surface ")) { + unsigned int rgba = 0; + if(sscanf(line, "Surface %x %x %x %d %d", + &(srf.h.v), &rgba, &(srf.face), + &(srf.degm), &(srf.degn)) != 5) { + oops(); + } + srf.color = RgbaColor::FromPackedInt((uint32_t)rgba); + } else if(StrStartsWith(line, "SCtrl ")) { + int i, j; + Vector c; + double w; + if(sscanf(line, "SCtrl %d %d %lf %lf %lf Weight %lf", + &i, &j, &(c.x), &(c.y), &(c.z), &w) != 6) + { + oops(); + } + srf.ctrl[i][j] = c; + srf.weight[i][j] = w; + } else if(StrStartsWith(line, "TrimBy ")) { + STrimBy stb = {}; + int backwards; + if(sscanf(line, "TrimBy %x %d %lf %lf %lf %lf %lf %lf", + &(stb.curve.v), &backwards, + &(stb.start.x), &(stb.start.y), &(stb.start.z), + &(stb.finish.x), &(stb.finish.y), &(stb.finish.z)) != 8) + { + oops(); + } + stb.backwards = (backwards != 0); + srf.trim.Add(&stb); + } else if(strcmp(line, "AddSurface")==0) { + sh->surface.Add(&srf); + srf = {}; + } else if(StrStartsWith(line, "Curve ")) { + int isExact; + if(sscanf(line, "Curve %x %d %d %x %x", + &(crv.h.v), + &(isExact), + &(crv.exact.deg), + &(crv.surfA.v), &(crv.surfB.v)) != 5) + { + oops(); + } + crv.isExact = (isExact != 0); + } else if(StrStartsWith(line, "CCtrl ")) { + int i; + Vector c; + double w; + if(sscanf(line, "CCtrl %d %lf %lf %lf Weight %lf", + &i, &(c.x), &(c.y), &(c.z), &w) != 5) + { + oops(); + } + crv.exact.ctrl[i] = c; + crv.exact.weight[i] = w; + } else if(StrStartsWith(line, "CurvePt ")) { + SCurvePt scpt; + int vertex; + if(sscanf(line, "CurvePt %d %lf %lf %lf", + &vertex, + &(scpt.p.x), &(scpt.p.y), &(scpt.p.z)) != 4) + { + oops(); + } + scpt.vertex = (vertex != 0); + crv.pts.Add(&scpt); + } else if(strcmp(line, "AddCurve")==0) { + sh->curve.Add(&crv); + crv = {}; + } else { + oops(); + } + } + + fclose(fh); + return true; +} + +//----------------------------------------------------------------------------- +// Handling of the relative-absolute path transformations for links +//----------------------------------------------------------------------------- +static std::vector Split(const std::string &haystack, const std::string &needle) +{ + std::vector result; + + size_t oldpos = 0, pos = 0; + while(true) { + oldpos = pos; + pos = haystack.find(needle, pos); + if(pos == std::string::npos) break; + result.push_back(haystack.substr(oldpos, pos - oldpos)); + pos += needle.length(); + } + + if(oldpos != haystack.length() - 1) + result.push_back(haystack.substr(oldpos)); + + return result; +} + +static std::string Join(const std::vector &parts, const std::string &separator) +{ + bool first = true; + std::string result; + for(auto &part : parts) { + if(!first) result += separator; + result += part; + first = false; + } + return result; +} + +static bool PlatformPathEqual(const std::string &a, const std::string &b) +{ + // Case-sensitivity is actually per-volume on both Windows and OS X, + // but it is extremely tedious to implement and test for little benefit. +#if defined(WIN32) + std::wstring wa = Widen(a), wb = Widen(b); + return std::equal(wa.begin(), wa.end(), wb.begin(), /*wb.end(),*/ + [](wchar_t wca, wchar_t wcb) { return towlower(wca) == towlower(wcb); }); +#elif defined(__APPLE__) + return !strcasecmp(a.c_str(), b.c_str()); +#else + return a == b; +#endif +} + +static std::string MakePathRelative(const std::string &base, const std::string &path) +{ + std::vector baseParts = Split(base, PATH_SEP), + pathParts = Split(path, PATH_SEP), + resultParts; + baseParts.pop_back(); + + size_t common; + for(common = 0; common < baseParts.size() && common < pathParts.size(); common++) { + if(!PlatformPathEqual(baseParts[common], pathParts[common])) + break; + } + + for(size_t i = common; i < baseParts.size(); i++) + resultParts.push_back(".."); + + resultParts.insert(resultParts.end(), + pathParts.begin() + common, pathParts.end()); + + return Join(resultParts, PATH_SEP); +} + +static std::string MakePathAbsolute(const std::string &base, const std::string &path) +{ + std::vector resultParts = Split(base, PATH_SEP), + pathParts = Split(path, PATH_SEP); + resultParts.pop_back(); + + for(auto &part : pathParts) { + if(part == ".") { + /* do nothing */ + } else if(part == "..") { + if(resultParts.empty()) oops(); + resultParts.pop_back(); + } else { + resultParts.push_back(part); + } + } + + return Join(resultParts, PATH_SEP); +} + +static void PathSepNormalize(std::string &filename) +{ + for(size_t i = 0; i < filename.length(); i++) { + if(filename[i] == '\\') + filename[i] = '/'; + } +} + +static std::string PathSepPlatformToUNIX(const std::string &filename) +{ +#if defined(WIN32) + std::string result = filename; + for(size_t i = 0; i < result.length(); i++) { + if(result[i] == '\\') + result[i] = '/'; + } + return result; +#else + return filename; +#endif +} + +static std::string PathSepUNIXToPlatform(const std::string &filename) +{ +#if defined(WIN32) + std::string result = filename; + for(size_t i = 0; i < result.length(); i++) { + if(result[i] == '/') + result[i] = '\\'; + } + return result; +#else + return filename; +#endif +} + +bool SolveSpaceUI::ReloadAllImported(bool canCancel) +{ + std::map linkMap; + allConsistent = false; + + int i; + for(i = 0; i < SK.group.n; i++) { + Group *g = &(SK.group.elem[i]); + if(g->type != Group::LINKED) continue; + + if(isalpha(g->linkFile[0]) && g->linkFile[1] == ':') { + // Make sure that g->linkFileRel always contains a relative path + // in an UNIX format, even after we load an old file which had + // the path in Windows format + PathSepNormalize(g->linkFileRel); + } + + g->impEntity.Clear(); + g->impMesh.Clear(); + g->impShell.Clear(); + + if(linkMap.count(g->linkFile)) { + std::string newPath = linkMap[g->linkFile]; + if(!newPath.empty()) + g->linkFile = newPath; + } + + // In a newly created group we only have an absolute path. + if(!g->linkFileRel.empty()) { + std::string rel = PathSepUNIXToPlatform(g->linkFileRel); + std::string fromRel = MakePathAbsolute(SS.saveFile, rel); + FILE *test = ssfopen(fromRel, "rb"); + if(test) { + fclose(test); + // Okay, exists; update the absolute path. + g->linkFile = fromRel; + } else { + // It doesn't exist. Perhaps the file was moved but the tree wasn't, and we + // can use the absolute filename to get us back. The relative path will be + // updated below. + } + } + +try_load_file: + if(LoadEntitiesFromFile(g->linkFile, &(g->impEntity), &(g->impMesh), &(g->impShell))) + { + if(!SS.saveFile.empty()) { + // Record the linked file's name relative to our filename; + // if the entire tree moves, then everything will still work + std::string rel = MakePathRelative(SS.saveFile, g->linkFile); + g->linkFileRel = PathSepPlatformToUNIX(rel); + } else { + // We're not yet saved, so can't make it absolute. + // This will only be used for display purposes, as SS.saveFile + // is always nonempty when we are actually writing anything. + g->linkFileRel = g->linkFile; + } + } else if(!linkMap.count(g->linkFile)) { + switch(LocateImportedFileYesNoCancel(g->linkFileRel, canCancel)) { + case DIALOG_YES: { + std::string oldImpFile = g->linkFile; + if(!GetOpenFile(&g->linkFile, "", SlvsFileFilter)) { + if(canCancel) + return false; + break; + } else { + linkMap[oldImpFile] = g->linkFile; + goto try_load_file; + } + } + + case DIALOG_NO: + linkMap[g->linkFile] = ""; + /* Geometry will be pruned by GenerateAll(). */ + break; + + case DIALOG_CANCEL: + return false; + } + } else { + // User was already asked to and refused to locate a missing + // linked file. + } + } + + return true; +} + diff --git a/src/fonts/private/0-check-false.png b/src/fonts/private/0-check-false.png new file mode 100644 index 0000000..b9020c3 Binary files /dev/null and b/src/fonts/private/0-check-false.png differ diff --git a/src/fonts/private/1-check-true.png b/src/fonts/private/1-check-true.png new file mode 100644 index 0000000..7f6a42c Binary files /dev/null and b/src/fonts/private/1-check-true.png differ diff --git a/src/fonts/private/2-radio-false.png b/src/fonts/private/2-radio-false.png new file mode 100644 index 0000000..f35d6ee Binary files /dev/null and b/src/fonts/private/2-radio-false.png differ diff --git a/src/fonts/private/3-radio-true.png b/src/fonts/private/3-radio-true.png new file mode 100644 index 0000000..5322f58 Binary files /dev/null and b/src/fonts/private/3-radio-true.png differ diff --git a/src/fonts/private/4-stipple-dot.png b/src/fonts/private/4-stipple-dot.png new file mode 100644 index 0000000..52fc219 Binary files /dev/null and b/src/fonts/private/4-stipple-dot.png differ diff --git a/src/fonts/private/5-stipple-dash-long.png b/src/fonts/private/5-stipple-dash-long.png new file mode 100644 index 0000000..b73853c Binary files /dev/null and b/src/fonts/private/5-stipple-dash-long.png differ diff --git a/src/fonts/private/6-stipple-dash.png b/src/fonts/private/6-stipple-dash.png new file mode 100644 index 0000000..1cec678 Binary files /dev/null and b/src/fonts/private/6-stipple-dash.png differ diff --git a/src/fonts/private/7-stipple-zigzag.png b/src/fonts/private/7-stipple-zigzag.png new file mode 100644 index 0000000..470a7f2 Binary files /dev/null and b/src/fonts/private/7-stipple-zigzag.png differ diff --git a/src/fonts/unicode.lff.gz b/src/fonts/unicode.lff.gz new file mode 100644 index 0000000..ec0501d Binary files /dev/null and b/src/fonts/unicode.lff.gz differ diff --git a/src/generate.cpp b/src/generate.cpp new file mode 100644 index 0000000..581add6 --- /dev/null +++ b/src/generate.cpp @@ -0,0 +1,552 @@ +//----------------------------------------------------------------------------- +// Generate our model based on its parametric description, by solving each +// sketch, generating surfaces from the resulting entities, performing any +// requested surface operations (e.g. Booleans) with our model so far, and +// then repeating this process for each subsequent group. +// +// Copyright 2008-2013 Jonathan Westhues. +//----------------------------------------------------------------------------- +#include "solvespace.h" + +void SolveSpaceUI::MarkGroupDirtyByEntity(hEntity he) { + Entity *e = SK.GetEntity(he); + MarkGroupDirty(e->group); +} + +void SolveSpaceUI::MarkGroupDirty(hGroup hg) { + int i; + bool go = false; + for(i = 0; i < SK.groupOrder.n; i++) { + Group *g = SK.GetGroup(SK.groupOrder.elem[i]); + if(g->h.v == hg.v) { + go = true; + } + if(go) { + g->clean = false; + } + } + unsaved = true; +} + +bool SolveSpaceUI::PruneOrphans(void) { + int i; + for(i = 0; i < SK.request.n; i++) { + Request *r = &(SK.request.elem[i]); + if(GroupExists(r->group)) continue; + + (deleted.requests)++; + SK.request.RemoveById(r->h); + return true; + } + + for(i = 0; i < SK.constraint.n; i++) { + Constraint *c = &(SK.constraint.elem[i]); + if(GroupExists(c->group)) continue; + + (deleted.constraints)++; + (deleted.nonTrivialConstraints)++; + + SK.constraint.RemoveById(c->h); + return true; + } + return false; +} + +bool SolveSpaceUI::GroupsInOrder(hGroup before, hGroup after) { + if(before.v == 0) return true; + if(after.v == 0) return true; + + int beforep = -1, afterp = -1; + int i; + for(i = 0; i < SK.groupOrder.n; i++) { + Group *g = SK.GetGroup(SK.groupOrder.elem[i]); + if(g->h.v == before.v) beforep = i; + if(g->h.v == after.v) afterp = i; + } + if(beforep < 0 || afterp < 0) return false; + if(beforep >= afterp) return false; + return true; +} + +bool SolveSpaceUI::GroupExists(hGroup hg) { + // A nonexistent group is not acceptable + return SK.group.FindByIdNoOops(hg) ? true : false; +} +bool SolveSpaceUI::EntityExists(hEntity he) { + // A nonexstient entity is acceptable, though, usually just means it + // doesn't apply. + if(he.v == Entity::NO_ENTITY.v) return true; + return SK.entity.FindByIdNoOops(he) ? true : false; +} + +bool SolveSpaceUI::PruneGroups(hGroup hg) { + Group *g = SK.GetGroup(hg); + if(GroupsInOrder(g->opA, hg) && + EntityExists(g->predef.origin) && + EntityExists(g->predef.entityB) && + EntityExists(g->predef.entityC)) + { + return false; + } + (deleted.groups)++; + SK.group.RemoveById(g->h); + return true; +} + +bool SolveSpaceUI::PruneRequests(hGroup hg) { + int i; + for(i = 0; i < SK.entity.n; i++) { + Entity *e = &(SK.entity.elem[i]); + if(e->group.v != hg.v) continue; + + if(EntityExists(e->workplane)) continue; + + if(!e->h.isFromRequest()) oops(); + + (deleted.requests)++; + SK.request.RemoveById(e->h.request()); + return true; + } + return false; +} + +bool SolveSpaceUI::PruneConstraints(hGroup hg) { + int i; + for(i = 0; i < SK.constraint.n; i++) { + Constraint *c = &(SK.constraint.elem[i]); + if(c->group.v != hg.v) continue; + + if(EntityExists(c->workplane) && + EntityExists(c->ptA) && + EntityExists(c->ptB) && + EntityExists(c->entityA) && + EntityExists(c->entityB) && + EntityExists(c->entityC) && + EntityExists(c->entityD)) + { + continue; + } + + (deleted.constraints)++; + if(c->type != Constraint::POINTS_COINCIDENT && + c->type != Constraint::HORIZONTAL && + c->type != Constraint::VERTICAL) + { + (deleted.nonTrivialConstraints)++; + } + + SK.constraint.RemoveById(c->h); + return true; + } + return false; +} + +void SolveSpaceUI::GenerateAll(GenerateType type, bool andFindFree, bool genForBBox) { + int first, last, i, j; + + SK.groupOrder.Clear(); + for(int i = 0; i < SK.group.n; i++) + SK.groupOrder.Add(&SK.group.elem[i].h); + std::sort(&SK.groupOrder.elem[0], &SK.groupOrder.elem[SK.groupOrder.n], + [](const hGroup &ha, const hGroup &hb) { + return SK.GetGroup(ha)->order < SK.GetGroup(hb)->order; + }); + + switch(type) { + case GENERATE_DIRTY: { + first = INT_MAX; + last = 0; + + // Start from the first dirty group, and solve until the active group, + // since all groups after the active group are hidden. + for(i = 0; i < SK.groupOrder.n; i++) { + Group *g = SK.GetGroup(SK.groupOrder.elem[i]); + if((!g->clean) || !g->IsSolvedOkay()) { + first = min(first, i); + } + if(g->h.v == SS.GW.activeGroup.v) { + last = i; + } + } + if(first == INT_MAX || last == 0) { + // All clean; so just regenerate the entities, and don't solve anything. + first = -1; + last = -1; + } else { + SS.nakedEdges.Clear(); + } + break; + } + + case GENERATE_ALL: + first = 0; + last = INT_MAX; + break; + + case GENERATE_REGEN: + first = -1; + last = -1; + break; + + case GENERATE_UNTIL_ACTIVE: { + for(i = 0; i < SK.groupOrder.n; i++) { + if(SK.groupOrder.elem[i].v == SS.GW.activeGroup.v) + break; + } + + first = 0; + last = i; + break; + } + + default: oops(); + } + + // If we're generating entities for display, first we need to find + // the bounding box to turn relative chord tolerance to absolute. + if(!SS.exportMode && !genForBBox) { + GenerateAll(type, andFindFree, /*genForBBox=*/true); + BBox box = SK.CalculateEntityBBox(/*includeInvisibles=*/true); + Vector size = box.maxp.Minus(box.minp); + double maxSize = std::max({ size.x, size.y, size.z }); + chordTolCalculated = maxSize * chordTol / 100.0; + } + + // Remove any requests or constraints that refer to a nonexistent + // group; can check those immediately, since we know what the list + // of groups should be. + while(PruneOrphans()) + ; + + // Don't lose our numerical guesses when we regenerate. + IdList prev = {}; + SK.param.MoveSelfInto(&prev); + SK.entity.Clear(); + + int64_t inTime = GetMilliseconds(); + + bool displayedStatusMessage = false; + for(i = 0; i < SK.groupOrder.n; i++) { + Group *g = SK.GetGroup(SK.groupOrder.elem[i]); + + int64_t now = GetMilliseconds(); + // Display the status message if we've taken more than 400 ms, or + // if we've taken 200 ms but we're not even halfway done, or if + // we've already started displaying the status message. + if( (now - inTime > 400) || + ((now - inTime > 200) && i < (SK.groupOrder.n / 2)) || + displayedStatusMessage) + { + displayedStatusMessage = true; + std::string msg = ssprintf("generating group %d/%d", i, SK.groupOrder.n); + + int w, h; + GetGraphicsWindowSize(&w, &h); + glDrawBuffer(GL_FRONT); + glViewport(0, 0, w, h); + glLoadIdentity(); + glTranslated(-1, 1, 0); + glScaled(2.0/w, 2.0/h, 1.0); + glDisable(GL_DEPTH_TEST); + + double left = 80, top = -20, width = 240, height = 24; + glColor3d(0.9, 0.8, 0.8); + ssglAxisAlignedQuad(left, left+width, top, top-height); + ssglLineWidth(1); + glColor3d(0.0, 0.0, 0.0); + ssglAxisAlignedLineLoop(left, left+width, top, top-height); + + ssglInitializeBitmapFont(); + glColor3d(0, 0, 0); + glPushMatrix(); + glTranslated(left+8, top-20, 0); + glScaled(1, -1, 1); + ssglBitmapText(msg, Vector::From(0, 0, 0)); + glPopMatrix(); + glFlush(); + glDrawBuffer(GL_BACK); + } + + // The group may depend on entities or other groups, to define its + // workplane geometry or for its operands. Those must already exist + // in a previous group, so check them before generating. + if(PruneGroups(g->h)) + goto pruned; + + for(j = 0; j < SK.request.n; j++) { + Request *r = &(SK.request.elem[j]); + if(r->group.v != g->h.v) continue; + + r->Generate(&(SK.entity), &(SK.param)); + } + g->Generate(&(SK.entity), &(SK.param)); + + // The requests and constraints depend on stuff in this or the + // previous group, so check them after generating. + if(PruneRequests(g->h) || PruneConstraints(g->h)) + goto pruned; + + // Use the previous values for params that we've seen before, as + // initial guesses for the solver. + for(j = 0; j < SK.param.n; j++) { + Param *newp = &(SK.param.elem[j]); + if(newp->known) continue; + + Param *prevp = prev.FindByIdNoOops(newp->h); + if(prevp) { + newp->val = prevp->val; + newp->free = prevp->free; + } + } + + if(g->h.v == Group::HGROUP_REFERENCES.v) { + ForceReferences(); + g->solved.how = System::SOLVED_OKAY; + g->clean = true; + } else { + if(i >= first && i <= last) { + // The group falls inside the range, so really solve it, + // and then regenerate the mesh based on the solved stuff. + if(genForBBox) { + SolveGroupAndReport(g->h, andFindFree); + } else { + g->GenerateLoops(); + g->GenerateShellAndMesh(); + g->clean = true; + } + } else { + // The group falls outside the range, so just assume that + // it's good wherever we left it. The mesh is unchanged, + // and the parameters must be marked as known. + for(j = 0; j < SK.param.n; j++) { + Param *newp = &(SK.param.elem[j]); + + Param *prevp = prev.FindByIdNoOops(newp->h); + if(prevp) newp->known = true; + } + } + } + } + + // And update any reference dimensions with their new values + for(i = 0; i < SK.constraint.n; i++) { + Constraint *c = &(SK.constraint.elem[i]); + if(c->reference) { + c->ModifyToSatisfy(); + } + } + + // Make sure the point that we're tracing exists. + if(traced.point.v && !SK.entity.FindByIdNoOops(traced.point)) { + traced.point = Entity::NO_ENTITY; + } + // And if we're tracing a point, add its new value to the path + if(traced.point.v) { + Entity *pt = SK.GetEntity(traced.point); + traced.path.AddPoint(pt->PointGetNum()); + } + + prev.Clear(); + InvalidateGraphics(); + + // Remove nonexistent selection items, for same reason we waited till + // the end to put up a dialog box. + GW.ClearNonexistentSelectionItems(); + + if(deleted.requests > 0 || deleted.constraints > 0 || deleted.groups > 0) { + // All sorts of interesting things could have happened; for example, + // the active group or active workplane could have been deleted. So + // clear all that out. + if(deleted.groups > 0) { + SS.TW.ClearSuper(); + } + ScheduleShowTW(); + GW.ClearSuper(); + + // People get annoyed if I complain whenever they delete any request, + // and I otherwise will, since those always come with pt-coincident + // constraints. + if(deleted.requests > 0 || deleted.nonTrivialConstraints > 0 || + deleted.groups > 0) + { + // Don't display any errors until we've regenerated fully. The + // sketch is not necessarily in a consistent state until we've + // pruned any orphaned etc. objects, and the message loop for the + // messagebox could allow us to repaint and crash. But now we must + // be fine. + Message("Additional sketch elements were deleted, because they " + "depend on the element that was just deleted explicitly. " + "These include: \n" + " %d request%s\n" + " %d constraint%s\n" + " %d group%s" + "%s", + deleted.requests, deleted.requests == 1 ? "" : "s", + deleted.constraints, deleted.constraints == 1 ? "" : "s", + deleted.groups, deleted.groups == 1 ? "" : "s", + undo.cnt > 0 ? "\n\nChoose Edit -> Undo to undelete all elements." : ""); + } + + deleted = {}; + } + + FreeAllTemporary(); + allConsistent = true; + return; + +pruned: + // Restore the numerical guesses + SK.param.Clear(); + prev.MoveSelfInto(&(SK.param)); + // Try again + GenerateAll(type, andFindFree, genForBBox); +} + +void SolveSpaceUI::ForceReferences(void) { + // Force the values of the parameters that define the three reference + // coordinate systems. + static const struct { + hRequest hr; + Quaternion q; + } Quat[] = { + { Request::HREQUEST_REFERENCE_XY, { 1, 0, 0, 0, } }, + { Request::HREQUEST_REFERENCE_YZ, { 0.5, 0.5, 0.5, 0.5, } }, + { Request::HREQUEST_REFERENCE_ZX, { 0.5, -0.5, -0.5, -0.5, } }, + }; + for(int i = 0; i < 3; i++) { + hRequest hr = Quat[i].hr; + Entity *wrkpl = SK.GetEntity(hr.entity(0)); + // The origin for our coordinate system, always zero + Entity *origin = SK.GetEntity(wrkpl->point[0]); + origin->PointForceTo(Vector::From(0, 0, 0)); + SK.GetParam(origin->param[0])->known = true; + SK.GetParam(origin->param[1])->known = true; + SK.GetParam(origin->param[2])->known = true; + // The quaternion that defines the rotation, from the table. + Entity *normal = SK.GetEntity(wrkpl->normal); + normal->NormalForceTo(Quat[i].q); + SK.GetParam(normal->param[0])->known = true; + SK.GetParam(normal->param[1])->known = true; + SK.GetParam(normal->param[2])->known = true; + SK.GetParam(normal->param[3])->known = true; + } +} + +void SolveSpaceUI::MarkDraggedParams(void) { + sys.dragged.Clear(); + + for(int i = -1; i < SS.GW.pending.points.n; i++) { + hEntity hp; + if(i == -1) { + hp = SS.GW.pending.point; + } else { + hp = SS.GW.pending.points.elem[i]; + } + if(!hp.v) continue; + + // The pending point could be one in a group that has not yet + // been processed, in which case the lookup will fail; but + // that's not an error. + Entity *pt = SK.entity.FindByIdNoOops(hp); + if(pt) { + switch(pt->type) { + case Entity::POINT_N_TRANS: + case Entity::POINT_IN_3D: + sys.dragged.Add(&(pt->param[0])); + sys.dragged.Add(&(pt->param[1])); + sys.dragged.Add(&(pt->param[2])); + break; + + case Entity::POINT_IN_2D: + sys.dragged.Add(&(pt->param[0])); + sys.dragged.Add(&(pt->param[1])); + break; + } + } + } + if(SS.GW.pending.circle.v) { + Entity *circ = SK.entity.FindByIdNoOops(SS.GW.pending.circle); + if(circ) { + Entity *dist = SK.GetEntity(circ->distance); + switch(dist->type) { + case Entity::DISTANCE: + sys.dragged.Add(&(dist->param[0])); + break; + } + } + } + if(SS.GW.pending.normal.v) { + Entity *norm = SK.entity.FindByIdNoOops(SS.GW.pending.normal); + if(norm) { + switch(norm->type) { + case Entity::NORMAL_IN_3D: + sys.dragged.Add(&(norm->param[0])); + sys.dragged.Add(&(norm->param[1])); + sys.dragged.Add(&(norm->param[2])); + sys.dragged.Add(&(norm->param[3])); + break; + // other types are locked, so not draggable + } + } + } +} + +void SolveSpaceUI::SolveGroupAndReport(hGroup hg, bool andFindFree) { + SolveGroup(hg, andFindFree); + + Group *g = SK.GetGroup(hg); + if(g->solved.how == System::REDUNDANT_OKAY) { + // Solve again, in case we lost a degree of freedom because of a numeric error. + SolveGroup(hg, andFindFree); + } + + bool isOkay = g->solved.how == System::SOLVED_OKAY || + (g->allowRedundant && g->solved.how == System::REDUNDANT_OKAY); + + if(!isOkay || (isOkay && !g->IsSolvedOkay())) { + TextWindow::ReportHowGroupSolved(g->h); + } +} + +void SolveSpaceUI::SolveGroup(hGroup hg, bool andFindFree) { + int i; + // Clear out the system to be solved. + sys.entity.Clear(); + sys.param.Clear(); + sys.eq.Clear(); + // And generate all the params for requests in this group + for(i = 0; i < SK.request.n; i++) { + Request *r = &(SK.request.elem[i]); + if(r->group.v != hg.v) continue; + + r->Generate(&(sys.entity), &(sys.param)); + } + // And for the group itself + Group *g = SK.GetGroup(hg); + g->Generate(&(sys.entity), &(sys.param)); + // Set the initial guesses for all the params + for(i = 0; i < sys.param.n; i++) { + Param *p = &(sys.param.elem[i]); + p->known = false; + p->val = SK.GetParam(p->h)->val; + } + + MarkDraggedParams(); + g->solved.remove.Clear(); + int how = sys.Solve(g, &(g->solved.dof), + &(g->solved.remove), true, andFindFree); + g->solved.how = how; + FreeAllTemporary(); +} + +bool SolveSpaceUI::ActiveGroupsOkay() { + for(int i = 0; i < SK.groupOrder.n; i++) { + Group *g = SK.GetGroup(SK.groupOrder.elem[i]); + if(!g->IsSolvedOkay()) + return false; + if(g->h.v == SS.GW.activeGroup.v) + break; + } + return true; +} + diff --git a/src/glhelper.cpp b/src/glhelper.cpp new file mode 100644 index 0000000..f789121 --- /dev/null +++ b/src/glhelper.cpp @@ -0,0 +1,921 @@ +//----------------------------------------------------------------------------- +// Helper functions that ultimately draw stuff with gl. +// +// Copyright 2008-2013 Jonathan Westhues. +//----------------------------------------------------------------------------- +#include +#include "solvespace.h" + +namespace SolveSpace { + +// A vector font. +#include "generated/vectorfont.table.h" + +// A bitmap font. +#include "generated/bitmapfont.table.h" + +static bool ColorLocked; +static bool DepthOffsetLocked; + +static const VectorGlyph &GetVectorGlyph(char32_t chr) { + int first = 0; + int last = sizeof(VectorFont) / sizeof(VectorGlyph); + while(first <= last) { + int mid = (first + last) / 2; + char32_t midChr = VectorFont[mid].character; + if(midChr > chr) { + last = mid - 1; // and first stays the same + continue; + } + if(midChr < chr) { + first = mid + 1; // and last stays the same + continue; + } + return VectorFont[mid]; + } + return GetVectorGlyph(0xfffd); // replacement character +} + +// Internally and in the UI, the vector font is sized using cap height. +#define FONT_SCALE(h) ((h)/(double)FONT_CAP_HEIGHT) +double ssglStrCapHeight(double h) +{ + return FONT_CAP_HEIGHT * FONT_SCALE(h) / SS.GW.scale; +} +double ssglStrFontSize(double h) +{ + return FONT_SIZE * FONT_SCALE(h) / SS.GW.scale; +} +double ssglStrWidth(const std::string &str, double h) +{ + int width = 0; + for(char32_t chr : ReadUTF8(str)) { + const VectorGlyph &glyph = GetVectorGlyph(chr); + if(glyph.baseCharacter != 0) { + const VectorGlyph &baseGlyph = GetVectorGlyph(glyph.baseCharacter); + width += max(glyph.advanceWidth, baseGlyph.advanceWidth); + } else { + width += glyph.advanceWidth; + } + } + return width * FONT_SCALE(h) / SS.GW.scale; +} +void ssglWriteTextRefCenter(const std::string &str, double h, Vector t, Vector u, Vector v, + ssglLineFn *fn, void *fndata) +{ + u = u.WithMagnitude(1); + v = v.WithMagnitude(1); + + double scale = FONT_SCALE(h)/SS.GW.scale; + double fh = ssglStrCapHeight(h); + double fw = ssglStrWidth(str, h); + + t = t.Plus(u.ScaledBy(-fw/2)); + t = t.Plus(v.ScaledBy(-fh/2)); + + // Apply additional offset to get an exact center alignment. + t = t.Plus(v.ScaledBy(-4608*scale)); + + ssglWriteText(str, h, t, u, v, fn, fndata); +} + +void ssglLineWidth(GLfloat width) { + // Intel GPUs with Mesa on *nix render thin lines poorly. + static bool workaroundChecked, workaroundEnabled; + if(!workaroundChecked) { + // ssglLineWidth can be called before GL is initialized + if(glGetString(GL_VENDOR)) { + workaroundChecked = true; + if(!strcmp((char*)glGetString(GL_VENDOR), "Intel Open Source Technology Center")) + workaroundEnabled = true; + } + } + + if(workaroundEnabled && width < 1.6f) + width = 1.6f; + + glLineWidth(width); +} + +static void LineDrawCallback(void *fndata, Vector a, Vector b) +{ + ssglLineWidth(1); + glBegin(GL_LINES); + ssglVertex3v(a); + ssglVertex3v(b); + glEnd(); +} + +Vector pixelAlign(Vector v) { + v = SS.GW.ProjectPoint3(v); + v.x = floor(v.x) + 0.5; + v.y = floor(v.y) + 0.5; + v = SS.GW.UnProjectPoint3(v); + return v; +} + +int ssglDrawCharacter(const VectorGlyph &glyph, Vector t, Vector o, Vector u, Vector v, + double scale, ssglLineFn *fn, void *fndata, bool gridFit) { + int advanceWidth = glyph.advanceWidth; + + if(glyph.baseCharacter != 0) { + const VectorGlyph &baseGlyph = GetVectorGlyph(glyph.baseCharacter); + int baseWidth = ssglDrawCharacter(baseGlyph, t, o, u, v, scale, fn, fndata, gridFit); + advanceWidth = max(glyph.advanceWidth, baseWidth); + } + + int actualWidth, offsetX; + if(gridFit) { + o.x += glyph.leftSideBearing; + offsetX = glyph.leftSideBearing; + actualWidth = glyph.boundingWidth; + if(actualWidth == 0) { + // Dot, "i", etc. + actualWidth = 1; + } + } else { + offsetX = 0; + actualWidth = advanceWidth; + } + + Vector tt = t; + tt = tt.Plus(u.ScaledBy(o.x * scale)); + tt = tt.Plus(v.ScaledBy(o.y * scale)); + + Vector tu = tt; + tu = tu.Plus(u.ScaledBy(actualWidth * scale)); + + Vector tv = tt; + tv = tv.Plus(v.ScaledBy(FONT_CAP_HEIGHT * scale)); + + if(gridFit) { + tt = pixelAlign(tt); + tu = pixelAlign(tu); + tv = pixelAlign(tv); + } + + tu = tu.Minus(tt).ScaledBy(1.0 / actualWidth); + tv = tv.Minus(tt).ScaledBy(1.0 / FONT_CAP_HEIGHT); + + const int16_t *data = glyph.data; + bool pen_up = true; + Vector prevp; + while(true) { + int16_t x = *data++; + int16_t y = *data++; + + if(x == PEN_UP && y == PEN_UP) { + if(pen_up) break; + pen_up = true; + } else { + Vector p = tt; + p = p.Plus(tu.ScaledBy(x - offsetX)); + p = p.Plus(tv.ScaledBy(y)); + if(!pen_up) fn(fndata, prevp, p); + prevp = p; + pen_up = false; + } + } + + return advanceWidth; +} + +void ssglWriteText(const std::string &str, double h, Vector t, Vector u, Vector v, + ssglLineFn *fn, void *fndata) +{ + if(!fn) fn = LineDrawCallback; + u = u.WithMagnitude(1); + v = v.WithMagnitude(1); + + // Perform grid-fitting only when the text is parallel to the view plane. + bool gridFit = !SS.exportMode && u.Equals(SS.GW.projRight) && v.Equals(SS.GW.projUp); + + double scale = FONT_SCALE(h) / SS.GW.scale; + Vector o = { 3840.0, 3840.0, 0.0 }; + for(char32_t chr : ReadUTF8(str)) { + const VectorGlyph &glyph = GetVectorGlyph(chr); + o.x += ssglDrawCharacter(glyph, t, o, u, v, scale, fn, fndata, gridFit); + } +} + +void ssglVertex3v(Vector u) +{ + glVertex3f((GLfloat)u.x, (GLfloat)u.y, (GLfloat)u.z); +} + +void ssglAxisAlignedQuad(double l, double r, double t, double b, bool lone) +{ + if(lone) glBegin(GL_QUADS); + glVertex2d(l, t); + glVertex2d(l, b); + glVertex2d(r, b); + glVertex2d(r, t); + if(lone) glEnd(); +} + +void ssglAxisAlignedLineLoop(double l, double r, double t, double b) +{ + glBegin(GL_LINE_LOOP); + glVertex2d(l, t); + glVertex2d(l, b); + glVertex2d(r, b); + glVertex2d(r, t); + glEnd(); +} + +static void FatLineEndcap(Vector p, Vector u, Vector v) +{ + // A table of cos and sin of (pi*i/10 + pi/2), as i goes from 0 to 10 + static const double Circle[11][2] = { + { 0.0000, 1.0000 }, + { -0.3090, 0.9511 }, + { -0.5878, 0.8090 }, + { -0.8090, 0.5878 }, + { -0.9511, 0.3090 }, + { -1.0000, 0.0000 }, + { -0.9511, -0.3090 }, + { -0.8090, -0.5878 }, + { -0.5878, -0.8090 }, + { -0.3090, -0.9511 }, + { 0.0000, -1.0000 }, + }; + glBegin(GL_TRIANGLE_FAN); + for(int i = 0; i <= 10; i++) { + double c = Circle[i][0], s = Circle[i][1]; + ssglVertex3v(p.Plus(u.ScaledBy(c)).Plus(v.ScaledBy(s))); + } + glEnd(); +} + +void ssglLine(const Vector &a, const Vector &b, double pixelWidth, bool maybeFat) { + if(!maybeFat || pixelWidth <= 3.0) { + glBegin(GL_LINES); + ssglVertex3v(a); + ssglVertex3v(b); + glEnd(); + } else { + ssglFatLine(a, b, pixelWidth / SS.GW.scale); + } +} + +void ssglPoint(Vector p, double pixelSize) +{ + if(/*!maybeFat || */pixelSize <= 3.0) { + glBegin(GL_LINES); + Vector u = SS.GW.projRight.WithMagnitude(pixelSize / SS.GW.scale / 2.0); + ssglVertex3v(p.Minus(u)); + ssglVertex3v(p.Plus(u)); + glEnd(); + } else { + Vector u = SS.GW.projRight.WithMagnitude(pixelSize / SS.GW.scale / 2.0); + Vector v = SS.GW.projUp.WithMagnitude(pixelSize / SS.GW.scale / 2.0); + + FatLineEndcap(p, u, v); + FatLineEndcap(p, u.ScaledBy(-1.0), v); + } +} + +void ssglStippledLine(Vector a, Vector b, double width, + int stippleType, double stippleScale, bool maybeFat) +{ + const char *stipplePattern; + switch(stippleType) { + case Style::STIPPLE_CONTINUOUS: ssglLine(a, b, width, maybeFat); return; + case Style::STIPPLE_DASH: stipplePattern = "- "; break; + case Style::STIPPLE_LONG_DASH: stipplePattern = "_ "; break; + case Style::STIPPLE_DASH_DOT: stipplePattern = "-."; break; + case Style::STIPPLE_DASH_DOT_DOT: stipplePattern = "-.."; break; + case Style::STIPPLE_DOT: stipplePattern = "."; break; + case Style::STIPPLE_FREEHAND: stipplePattern = "~"; break; + case Style::STIPPLE_ZIGZAG: stipplePattern = "~__"; break; + default: oops(); + } + ssglStippledLine(a, b, width, stipplePattern, stippleScale, maybeFat); +} + +void ssglStippledLine(Vector a, Vector b, double width, + const char *stipplePattern, double stippleScale, bool maybeFat) +{ + if(stipplePattern == NULL || *stipplePattern == 0) oops(); + + Vector dir = b.Minus(a); + double len = dir.Magnitude(); + dir = dir.WithMagnitude(1.0); + + const char *si = stipplePattern; + double end = len; + double ss = stippleScale / 2.0; + do { + double start = end; + switch(*si) { + case ' ': + end -= 1.0 * ss; + break; + + case '-': + start = max(start - 0.5 * ss, 0.0); + end = max(start - 2.0 * ss, 0.0); + if(start == end) break; + ssglLine(a.Plus(dir.ScaledBy(start)), a.Plus(dir.ScaledBy(end)), width, maybeFat); + end = max(end - 0.5 * ss, 0.0); + break; + + case '_': + end = max(end - 4.0 * ss, 0.0); + ssglLine(a.Plus(dir.ScaledBy(start)), a.Plus(dir.ScaledBy(end)), width, maybeFat); + break; + + case '.': + end = max(end - 0.5 * ss, 0.0); + if(end == 0.0) break; + ssglPoint(a.Plus(dir.ScaledBy(end)), width); + end = max(end - 0.5 * ss, 0.0); + break; + + case '~': { + Vector ab = b.Minus(a); + Vector gn = (SS.GW.projRight).Cross(SS.GW.projUp); + Vector abn = (ab.Cross(gn)).WithMagnitude(1); + abn = abn.Minus(gn.ScaledBy(gn.Dot(abn))); + double pws = 2.0 * width / SS.GW.scale; + + end = max(end - 0.5 * ss, 0.0); + Vector aa = a.Plus(dir.ScaledBy(start)); + Vector bb = a.Plus(dir.ScaledBy(end)) + .Plus(abn.ScaledBy(pws * (start - end) / (0.5 * ss))); + ssglLine(aa, bb, width, maybeFat); + if(end == 0.0) break; + + start = end; + end = max(end - 1.0 * ss, 0.0); + aa = a.Plus(dir.ScaledBy(end)) + .Plus(abn.ScaledBy(pws)) + .Minus(abn.ScaledBy(2.0 * pws * (start - end) / ss)); + ssglLine(bb, aa, width, maybeFat); + if(end == 0.0) break; + + start = end; + end = max(end - 0.5 * ss, 0.0); + bb = a.Plus(dir.ScaledBy(end)) + .Minus(abn.ScaledBy(pws)) + .Plus(abn.ScaledBy(pws * (start - end) / (0.5 * ss))); + ssglLine(aa, bb, width, maybeFat); + break; + } + + default: oops(); + } + if(*(++si) == 0) si = stipplePattern; + } while(end > 0.0); +} + +void ssglFatLine(Vector a, Vector b, double width) +{ + if(a.EqualsExactly(b)) return; + // The half-width of the line we're drawing. + double hw = width / 2; + Vector ab = b.Minus(a); + Vector gn = (SS.GW.projRight).Cross(SS.GW.projUp); + Vector abn = (ab.Cross(gn)).WithMagnitude(1); + abn = abn.Minus(gn.ScaledBy(gn.Dot(abn))); + // So now abn is normal to the projection of ab into the screen, so the + // line will always have constant thickness as the view is rotated. + + abn = abn.WithMagnitude(hw); + ab = gn.Cross(abn); + ab = ab. WithMagnitude(hw); + + // The body of a line is a quad + glBegin(GL_QUADS); + ssglVertex3v(a.Minus(abn)); + ssglVertex3v(b.Minus(abn)); + ssglVertex3v(b.Plus (abn)); + ssglVertex3v(a.Plus (abn)); + glEnd(); + // And the line has two semi-circular end caps. + FatLineEndcap(a, ab, abn); + FatLineEndcap(b, ab.ScaledBy(-1), abn); +} + + +void ssglLockColorTo(RgbaColor rgb) +{ + ColorLocked = false; + glColor3d(rgb.redF(), rgb.greenF(), rgb.blueF()); + ColorLocked = true; +} + +void ssglUnlockColor(void) +{ + ColorLocked = false; +} + +void ssglColorRGB(RgbaColor rgb) +{ + // Is there a bug in some graphics drivers where this is not equivalent + // to glColor3d? There seems to be... + ssglColorRGBa(rgb, 1.0); +} + +void ssglColorRGBa(RgbaColor rgb, double a) +{ + if(!ColorLocked) glColor4d(rgb.redF(), rgb.greenF(), rgb.blueF(), a); +} + +static void Stipple(bool forSel) +{ + static bool Init; + const int BYTES = (32*32)/8; + static GLubyte HoverMask[BYTES]; + static GLubyte SelMask[BYTES]; + if(!Init) { + int x, y; + for(x = 0; x < 32; x++) { + for(y = 0; y < 32; y++) { + int i = y*4 + x/8, b = x % 8; + int ym = y % 4, xm = x % 4; + for(int k = 0; k < 2; k++) { + if(xm >= 1 && xm <= 2 && ym >= 1 && ym <= 2) { + (k == 0 ? SelMask : HoverMask)[i] |= (0x80 >> b); + } + ym = (ym + 2) % 4; xm = (xm + 2) % 4; + } + } + } + Init = true; + } + + glEnable(GL_POLYGON_STIPPLE); + if(forSel) { + glPolygonStipple(SelMask); + } else { + glPolygonStipple(HoverMask); + } +} + +static void StippleTriangle(STriangle *tr, bool s, RgbaColor rgb) +{ + glEnd(); + glDisable(GL_LIGHTING); + ssglColorRGB(rgb); + Stipple(s); + glBegin(GL_TRIANGLES); + ssglVertex3v(tr->a); + ssglVertex3v(tr->b); + ssglVertex3v(tr->c); + glEnd(); + glEnable(GL_LIGHTING); + glDisable(GL_POLYGON_STIPPLE); + glBegin(GL_TRIANGLES); +} + +void ssglFillMesh(bool useSpecColor, RgbaColor specColor, + SMesh *m, uint32_t h, uint32_t s1, uint32_t s2) +{ + RgbaColor rgbHovered = Style::Color(Style::HOVERED), + rgbSelected = Style::Color(Style::SELECTED); + + glEnable(GL_NORMALIZE); + bool hasMaterial = false; + RgbaColor prevColor; + glBegin(GL_TRIANGLES); + for(int i = 0; i < m->l.n; i++) { + STriangle *tr = &(m->l.elem[i]); + + RgbaColor color; + if(useSpecColor) { + color = specColor; + } else { + color = tr->meta.color; + } + if(!hasMaterial || !color.Equals(prevColor)) { + GLfloat mpf[] = { color.redF(), color.greenF(), color.blueF(), color.alphaF() }; + glEnd(); + glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, mpf); + prevColor = color; + hasMaterial = true; + glBegin(GL_TRIANGLES); + } + + if(tr->an.EqualsExactly(Vector::From(0, 0, 0))) { + // Compute the normal from the vertices + Vector n = tr->Normal(); + glNormal3d(n.x, n.y, n.z); + ssglVertex3v(tr->a); + ssglVertex3v(tr->b); + ssglVertex3v(tr->c); + } else { + // Use the exact normals that are specified + glNormal3d((tr->an).x, (tr->an).y, (tr->an).z); + ssglVertex3v(tr->a); + + glNormal3d((tr->bn).x, (tr->bn).y, (tr->bn).z); + ssglVertex3v(tr->b); + + glNormal3d((tr->cn).x, (tr->cn).y, (tr->cn).z); + ssglVertex3v(tr->c); + } + + if((s1 != 0 && tr->meta.face == s1) || + (s2 != 0 && tr->meta.face == s2)) + { + StippleTriangle(tr, true, rgbSelected); + } + if(h != 0 && tr->meta.face == h) { + StippleTriangle(tr, false, rgbHovered); + } + } + glEnd(); +} + +static void SSGL_CALLBACK Vertex(Vector *p) +{ + ssglVertex3v(*p); +} +void ssglFillPolygon(SPolygon *p) +{ + GLUtesselator *gt = gluNewTess(); + gluTessCallback(gt, GLU_TESS_BEGIN, (ssglCallbackFptr *)glBegin); + gluTessCallback(gt, GLU_TESS_END, (ssglCallbackFptr *)glEnd); + gluTessCallback(gt, GLU_TESS_VERTEX, (ssglCallbackFptr *)Vertex); + + ssglTesselatePolygon(gt, p); + + gluDeleteTess(gt); +} + +static void SSGL_CALLBACK Combine(double coords[3], void *vertexData[4], + float weight[4], void **outData) +{ + Vector *n = (Vector *)AllocTemporary(sizeof(Vector)); + n->x = coords[0]; + n->y = coords[1]; + n->z = coords[2]; + + *outData = n; +} +void ssglTesselatePolygon(GLUtesselator *gt, SPolygon *p) +{ + int i, j; + + gluTessCallback(gt, GLU_TESS_COMBINE, (ssglCallbackFptr *)Combine); + gluTessProperty(gt, GLU_TESS_WINDING_RULE, GLU_TESS_WINDING_ODD); + + Vector normal = p->normal; + glNormal3d(normal.x, normal.y, normal.z); + gluTessNormal(gt, normal.x, normal.y, normal.z); + + gluTessBeginPolygon(gt, NULL); + for(i = 0; i < p->l.n; i++) { + SContour *sc = &(p->l.elem[i]); + gluTessBeginContour(gt); + for(j = 0; j < (sc->l.n-1); j++) { + SPoint *sp = &(sc->l.elem[j]); + double ap[3]; + ap[0] = sp->p.x; + ap[1] = sp->p.y; + ap[2] = sp->p.z; + gluTessVertex(gt, ap, &(sp->p)); + } + gluTessEndContour(gt); + } + gluTessEndPolygon(gt); +} + +void ssglDebugPolygon(SPolygon *p) +{ + int i, j; + ssglLineWidth(2); + glPointSize(7); + glDisable(GL_DEPTH_TEST); + for(i = 0; i < p->l.n; i++) { + SContour *sc = &(p->l.elem[i]); + for(j = 0; j < (sc->l.n-1); j++) { + Vector a = (sc->l.elem[j]).p; + Vector b = (sc->l.elem[j+1]).p; + + ssglLockColorTo(RGBi(0, 0, 255)); + Vector d = (a.Minus(b)).WithMagnitude(-0); + glBegin(GL_LINES); + ssglVertex3v(a.Plus(d)); + ssglVertex3v(b.Minus(d)); + glEnd(); + ssglLockColorTo(RGBi(255, 0, 0)); + glBegin(GL_POINTS); + ssglVertex3v(a.Plus(d)); + ssglVertex3v(b.Minus(d)); + glEnd(); + } + } +} + +void ssglDrawEdges(SEdgeList *el, bool endpointsToo, hStyle hs) +{ + double lineWidth = Style::Width(hs); + int stippleType = Style::PatternType(hs); + double stippleScale = Style::StippleScaleMm(hs); + ssglLineWidth(float(lineWidth)); + ssglColorRGB(Style::Color(hs)); + + SEdge *se; + for(se = el->l.First(); se; se = el->l.NextAfter(se)) { + ssglStippledLine(se->a, se->b, lineWidth, stippleType, stippleScale, + /*maybeFat=*/true); + } + + if(endpointsToo) { + glPointSize(12); + glBegin(GL_POINTS); + for(se = el->l.First(); se; se = el->l.NextAfter(se)) { + ssglVertex3v(se->a); + ssglVertex3v(se->b); + } + glEnd(); + } +} + +void ssglDrawOutlines(SOutlineList *sol, Vector projDir, hStyle hs) +{ + double lineWidth = Style::Width(hs); + int stippleType = Style::PatternType(hs); + double stippleScale = Style::StippleScaleMm(hs); + ssglLineWidth((float)lineWidth); + ssglColorRGB(Style::Color(hs)); + + sol->FillOutlineTags(projDir); + for(SOutline *so = sol->l.First(); so; so = sol->l.NextAfter(so)) { + if(!so->tag) continue; + ssglStippledLine(so->a, so->b, lineWidth, stippleType, stippleScale, + /*maybeFat=*/true); + } +} + +void ssglDebugMesh(SMesh *m) +{ + int i; + ssglLineWidth(1); + glPointSize(7); + ssglDepthRangeOffset(1); + ssglUnlockColor(); + glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); + ssglColorRGBa(RGBi(0, 255, 0), 1.0); + glBegin(GL_TRIANGLES); + for(i = 0; i < m->l.n; i++) { + STriangle *t = &(m->l.elem[i]); + if(t->tag) continue; + + ssglVertex3v(t->a); + ssglVertex3v(t->b); + ssglVertex3v(t->c); + } + glEnd(); + ssglDepthRangeOffset(0); + glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); +} + +void ssglMarkPolygonNormal(SPolygon *p) +{ + Vector tail = Vector::From(0, 0, 0); + int i, j, cnt = 0; + // Choose some reasonable center point. + for(i = 0; i < p->l.n; i++) { + SContour *sc = &(p->l.elem[i]); + for(j = 0; j < (sc->l.n-1); j++) { + SPoint *sp = &(sc->l.elem[j]); + tail = tail.Plus(sp->p); + cnt++; + } + } + if(cnt == 0) return; + tail = tail.ScaledBy(1.0/cnt); + + Vector gn = SS.GW.projRight.Cross(SS.GW.projUp); + Vector tip = tail.Plus((p->normal).WithMagnitude(40/SS.GW.scale)); + Vector arrow = (p->normal).WithMagnitude(15/SS.GW.scale); + + glColor3d(1, 1, 0); + glBegin(GL_LINES); + ssglVertex3v(tail); + ssglVertex3v(tip); + ssglVertex3v(tip); + ssglVertex3v(tip.Minus(arrow.RotatedAbout(gn, 0.6))); + ssglVertex3v(tip); + ssglVertex3v(tip.Minus(arrow.RotatedAbout(gn, -0.6))); + glEnd(); + glEnable(GL_LIGHTING); +} + +void ssglDepthRangeOffset(int units) +{ + if(!DepthOffsetLocked) { + // The size of this step depends on the resolution of the Z buffer; for + // a 16-bit buffer, this should be fine. + double d = units/60000.0; + glDepthRange(0.1-d, 1-d); + } +} + +void ssglDepthRangeLockToFront(bool yes) +{ + if(yes) { + DepthOffsetLocked = true; + glDepthRange(0, 0); + } else { + DepthOffsetLocked = false; + ssglDepthRangeOffset(0); + } +} + +const int BitmapFontChunkSize = 64 * 64; +static bool BitmapFontChunkInitialized[0x10000 / BitmapFontChunkSize]; +static int BitmapFontCurrentChunk = -1; + +static void CreateBitmapFontChunk(const uint8_t *source, size_t sourceLength, + int textureIndex) +{ + // Place the font in our texture in a two-dimensional grid. + // The maximum texture size that is reasonably supported is 1024x1024. + const size_t fontTextureSize = BitmapFontChunkSize*16*16; + uint8_t *fontTexture = (uint8_t *)malloc(fontTextureSize), + *mappedTexture = (uint8_t *)malloc(fontTextureSize); + + z_stream stream; + stream.zalloc = Z_NULL; + stream.zfree = Z_NULL; + stream.opaque = Z_NULL; + if(inflateInit(&stream) != Z_OK) + oops(); + + stream.next_in = (Bytef *)source; + stream.avail_in = sourceLength; + stream.next_out = fontTexture; + stream.avail_out = fontTextureSize; + if(inflate(&stream, Z_NO_FLUSH) != Z_STREAM_END) + oops(); + if(stream.avail_out != 0) + oops(); + + inflateEnd(&stream); + + for(int a = 0; a < BitmapFontChunkSize; a++) { + int row = a / 64, col = a % 64; + + for(int i = 0; i < 16; i++) { + memcpy(mappedTexture + row*64*16*16 + col*16 + i*64*16, + fontTexture + a*16*16 + i*16, + 16); + } + } + + free(fontTexture); + + glBindTexture(GL_TEXTURE_2D, textureIndex); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP); + glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); + glTexImage2D(GL_TEXTURE_2D, 0, GL_ALPHA, + 16*64, 64*16, + 0, + GL_ALPHA, GL_UNSIGNED_BYTE, + mappedTexture); + + free(mappedTexture); +} + +static void SwitchToBitmapFontChunkFor(char32_t chr) +{ + int plane = chr / BitmapFontChunkSize, + textureIndex = TEXTURE_BITMAP_FONT + plane; + + if(BitmapFontCurrentChunk != textureIndex) { + glEnd(); + + if(!BitmapFontChunkInitialized[plane]) { + CreateBitmapFontChunk(CompressedFontTexture[plane].data, + CompressedFontTexture[plane].length, + textureIndex); + BitmapFontChunkInitialized[plane] = true; + } else { + glBindTexture(GL_TEXTURE_2D, textureIndex); + } + + BitmapFontCurrentChunk = textureIndex; + + glBegin(GL_QUADS); + } +} + +void ssglInitializeBitmapFont() +{ + memset(BitmapFontChunkInitialized, 0, sizeof(BitmapFontChunkInitialized)); + BitmapFontCurrentChunk = -1; +} + +int ssglBitmapCharWidth(char32_t chr) { + if(!CodepointProperties[chr].exists) + chr = 0xfffd; // replacement character + + return CodepointProperties[chr].isWide ? 2 : 1; +} + +void ssglBitmapCharQuad(char32_t chr, double x, double y) +{ + int w, h; + + if(!CodepointProperties[chr].exists) + chr = 0xfffd; // replacement character + + h = 16; + if(chr >= 0xe000 && chr <= 0xefff) { + // Special character, like a checkbox or a radio button + w = 16; + x -= 3; + } else if(CodepointProperties[chr].isWide) { + // Wide (usually CJK or reserved) character + w = 16; + } else { + // Normal character + w = 8; + } + + if(chr != ' ' && chr != 0) { + int n = chr % BitmapFontChunkSize; + int row = n / 64, col = n % 64; + double s0 = col/64.0, + s1 = (col+1)/64.0, + t0 = row/64.0, + t1 = t0 + (w/16.0)/64; + + SwitchToBitmapFontChunkFor(chr); + + glTexCoord2d(s1, t0); + glVertex2d(x, y); + + glTexCoord2d(s1, t1); + glVertex2d(x + w, y); + + glTexCoord2d(s0, t1); + glVertex2d(x + w, y - h); + + glTexCoord2d(s0, t0); + glVertex2d(x, y - h); + } +} + +void ssglBitmapText(const std::string &str, Vector p) +{ + glEnable(GL_TEXTURE_2D); + glBegin(GL_QUADS); + for(char32_t chr : ReadUTF8(str)) { + ssglBitmapCharQuad(chr, p.x, p.y); + p.x += 8 * ssglBitmapCharWidth(chr); + } + glEnd(); + glDisable(GL_TEXTURE_2D); +} + +void ssglDrawPixelsWithTexture(uint8_t *data, int w, int h) +{ +#define MAX_DIM 32 + static uint8_t Texture[MAX_DIM*MAX_DIM*3]; + int i, j; + if(w > MAX_DIM || h > MAX_DIM) oops(); + + for(i = 0; i < w; i++) { + for(j = 0; j < h; j++) { + Texture[(j*MAX_DIM + i)*3 + 0] = data[(j*w + i)*3 + 0]; + Texture[(j*MAX_DIM + i)*3 + 1] = data[(j*w + i)*3 + 1]; + Texture[(j*MAX_DIM + i)*3 + 2] = data[(j*w + i)*3 + 2]; + } + } + + glBindTexture(GL_TEXTURE_2D, TEXTURE_DRAW_PIXELS); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP); + glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL); + + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, MAX_DIM, MAX_DIM, 0, + GL_RGB, GL_UNSIGNED_BYTE, Texture); + + glEnable(GL_TEXTURE_2D); + glBegin(GL_QUADS); + glTexCoord2d(0, 0); + glVertex2d(0, h); + + glTexCoord2d(((double)w)/MAX_DIM, 0); + glVertex2d(w, h); + + glTexCoord2d(((double)w)/MAX_DIM, ((double)h)/MAX_DIM); + glVertex2d(w, 0); + + glTexCoord2d(0, ((double)h)/MAX_DIM); + glVertex2d(0, 0); + glEnd(); + glDisable(GL_TEXTURE_2D); +} + +}; diff --git a/src/graphicswin.cpp b/src/graphicswin.cpp new file mode 100644 index 0000000..e1531e5 --- /dev/null +++ b/src/graphicswin.cpp @@ -0,0 +1,1089 @@ +//----------------------------------------------------------------------------- +// Top-level implementation of the program's main window, in which a graphical +// representation of the model is drawn and edited by the user. +// +// Copyright 2008-2013 Jonathan Westhues. +//----------------------------------------------------------------------------- +#include "solvespace.h" +#include "config.h" + +#define mView (&GraphicsWindow::MenuView) +#define mEdit (&GraphicsWindow::MenuEdit) +#define mClip (&GraphicsWindow::MenuClipboard) +#define mReq (&GraphicsWindow::MenuRequest) +#define mCon (&Constraint::MenuConstrain) +#define mFile (&SolveSpaceUI::MenuFile) +#define mGrp (&Group::MenuGroup) +#define mAna (&SolveSpaceUI::MenuAnalyze) +#define mHelp (&SolveSpaceUI::MenuHelp) +#define DEL DELETE_KEY +#define ESC ESCAPE_KEY +#define S SHIFT_MASK +#define C CTRL_MASK +#define F(k) (FUNCTION_KEY_BASE+(k)) +#define TN MENU_ITEM_NORMAL +#define TC MENU_ITEM_CHECK +#define TR MENU_ITEM_RADIO +const GraphicsWindow::MenuEntry GraphicsWindow::menu[] = { +//level +// label id accel ty fn +{ 0, "&File", 0, 0, TN, NULL }, +{ 1, "&New", MNU_NEW, C|'N', TN, mFile }, +{ 1, "&Open...", MNU_OPEN, C|'O', TN, mFile }, +{ 1, "Open &Recent", MNU_OPEN_RECENT, 0, TN, mFile }, +{ 1, "&Save", MNU_SAVE, C|'S', TN, mFile }, +{ 1, "Save &As...", MNU_SAVE_AS, 0, TN, mFile }, +{ 1, NULL, 0, 0, TN, NULL }, +{ 1, "Export &Image...", MNU_EXPORT_PNG, 0, TN, mFile }, +{ 1, "Export 2d &View...", MNU_EXPORT_VIEW, 0, TN, mFile }, +{ 1, "Export 2d &Section...", MNU_EXPORT_SECTION, 0, TN, mFile }, +{ 1, "Export 3d &Wireframe...", MNU_EXPORT_WIREFRAME, 0, TN, mFile }, +{ 1, "Export Triangle &Mesh...", MNU_EXPORT_MESH, 0, TN, mFile }, +{ 1, "Export &Surfaces...", MNU_EXPORT_SURFACES,0, TN, mFile }, +{ 1, "Im&port...", MNU_IMPORT ,0, TN, mFile }, +#ifndef __APPLE__ +{ 1, NULL, 0, 0, TN, NULL }, +{ 1, "E&xit", MNU_EXIT, C|'Q', TN, mFile }, +#endif + +{ 0, "&Edit", 0, 0, TN, NULL }, +{ 1, "&Undo", MNU_UNDO, C|'Z', TN, mEdit }, +{ 1, "&Redo", MNU_REDO, C|'Y', TN, mEdit }, +{ 1, "Re&generate All", MNU_REGEN_ALL, ' ', TN, mEdit }, +{ 1, NULL, 0, 0, TN, NULL }, +{ 1, "Snap Selection to &Grid", MNU_SNAP_TO_GRID, '.', TN, mEdit }, +{ 1, "Rotate Imported &90°", MNU_ROTATE_90, '9', TN, mEdit }, +{ 1, NULL, 0, 0, TN, NULL }, +{ 1, "Cu&t", MNU_CUT, C|'X', TN, mClip }, +{ 1, "&Copy", MNU_COPY, C|'C', TN, mClip }, +{ 1, "&Paste", MNU_PASTE, C|'V', TN, mClip }, +{ 1, "Paste &Transformed...", MNU_PASTE_TRANSFORM,C|'T', TN, mClip }, +{ 1, "&Delete", MNU_DELETE, DEL, TN, mClip }, +{ 1, NULL, 0, 0, TN, NULL }, +{ 1, "Select &Edge Chain", MNU_SELECT_CHAIN, C|'E', TN, mEdit }, +{ 1, "Select &All", MNU_SELECT_ALL, C|'A', TN, mEdit }, +{ 1, "&Unselect All", MNU_UNSELECT_ALL, ESC, TN, mEdit }, + +{ 0, "&View", 0, 0, TN, NULL }, +{ 1, "Zoom &In", MNU_ZOOM_IN, '+', TN, mView }, +{ 1, "Zoom &Out", MNU_ZOOM_OUT, '-', TN, mView }, +{ 1, "Zoom To &Fit", MNU_ZOOM_TO_FIT, 'F', TN, mView }, +{ 1, NULL, 0, 0, TN, NULL }, +{ 1, "Align View to &Workplane", MNU_ONTO_WORKPLANE, 'W', TN, mView }, +{ 1, "Nearest &Ortho View", MNU_NEAREST_ORTHO, F(2), TN, mView }, +{ 1, "Nearest &Isometric View", MNU_NEAREST_ISO, F(3), TN, mView }, +{ 1, "&Center View At Point", MNU_CENTER_VIEW, F(4), TN, mView }, +{ 1, NULL, 0, 0, TN, NULL }, +{ 1, "Show Snap &Grid", MNU_SHOW_GRID, '>', TC, mView }, +{ 1, "Use &Perspective Projection", MNU_PERSPECTIVE_PROJ,'`', TC, mView }, +{ 1, NULL, 0, 0, TN, NULL }, +#if defined(__APPLE__) +{ 1, "Show Menu &Bar", MNU_SHOW_MENU_BAR, C|F(12), TC, mView }, +#endif +{ 1, "Show &Toolbar", MNU_SHOW_TOOLBAR, 0, TC, mView }, +{ 1, "Show Property Bro&wser", MNU_SHOW_TEXT_WND, '\t', TC, mView }, +{ 1, NULL, 0, 0, TN, NULL }, +{ 1, "Dimensions in &Inches", MNU_UNITS_INCHES, 0, TR, mView }, +{ 1, "Dimensions in &Millimeters", MNU_UNITS_MM, 0, TR, mView }, +#if defined(HAVE_GTK) || defined(__APPLE__) +{ 1, NULL, 0, 0, TN, NULL }, +{ 1, "&Full Screen", MNU_FULL_SCREEN, C|F(11), TC, mView }, +#endif + +{ 0, "&New Group", 0, 0, TN, NULL }, +{ 1, "Sketch In &3d", MNU_GROUP_3D, S|'3', TN, mGrp }, +{ 1, "Sketch In New &Workplane", MNU_GROUP_WRKPL, S|'W', TN, mGrp }, +{ 1, NULL, 0, 0, TN, NULL }, +{ 1, "Step &Translating", MNU_GROUP_TRANS, S|'T', TN, mGrp }, +{ 1, "Step &Rotating", MNU_GROUP_ROT, S|'R', TN, mGrp }, +{ 1, NULL, 0, 0, TN, NULL }, +{ 1, "E&xtrude", MNU_GROUP_EXTRUDE, S|'X', TN, mGrp }, +{ 1, "&Lathe", MNU_GROUP_LATHE, S|'L', TN, mGrp }, +{ 1, NULL, 0, 0, TN, NULL }, +{ 1, "Link / Assemble...", MNU_GROUP_LINK, S|'I', TN, mGrp }, +{ 1, "Link Recent", MNU_GROUP_RECENT, 0, TN, mGrp }, + +{ 0, "&Sketch", 0, 0, TN, NULL }, +{ 1, "In &Workplane", MNU_SEL_WORKPLANE, '2', TR, mReq }, +{ 1, "Anywhere In &3d", MNU_FREE_IN_3D, '3', TR, mReq }, +{ 1, NULL, 0, 0, TN, NULL }, +{ 1, "Datum &Point", MNU_DATUM_POINT, 'P', TN, mReq }, +{ 1, "&Workplane", MNU_WORKPLANE, 0, TN, mReq }, +{ 1, NULL, 0, 0, TN, NULL }, +{ 1, "Line &Segment", MNU_LINE_SEGMENT, 'S', TN, mReq }, +{ 1, "C&onstruction Line Segment", MNU_CONSTR_SEGMENT, S|'S', TN, mReq }, +{ 1, "&Rectangle", MNU_RECTANGLE, 'R', TN, mReq }, +{ 1, "&Circle", MNU_CIRCLE, 'C', TN, mReq }, +{ 1, "&Arc of a Circle", MNU_ARC, 'A', TN, mReq }, +{ 1, "&Bezier Cubic Spline", MNU_CUBIC, 'B', TN, mReq }, +{ 1, NULL, 0, 0, TN, NULL }, +{ 1, "&Text in TrueType Font", MNU_TTF_TEXT, 'T', TN, mReq }, +{ 1, NULL, 0, 0, TN, NULL }, +{ 1, "To&ggle Construction", MNU_CONSTRUCTION, 'G', TN, mReq }, +{ 1, "Tangent &Arc at Point", MNU_TANGENT_ARC, S|'A', TN, mReq }, +{ 1, "Split Curves at &Intersection", MNU_SPLIT_CURVES, 'I', TN, mReq }, + +{ 0, "&Constrain", 0, 0, TN, NULL }, +{ 1, "&Distance / Diameter", MNU_DISTANCE_DIA, 'D', TN, mCon }, +{ 1, "Re&ference Dimension", MNU_REF_DISTANCE, S|'D', TN, mCon }, +{ 1, "A&ngle", MNU_ANGLE, 'N', TN, mCon }, +{ 1, "Reference An&gle", MNU_REF_ANGLE, S|'N', TN, mCon }, +{ 1, "Other S&upplementary Angle", MNU_OTHER_ANGLE, 'U', TN, mCon }, +{ 1, "Toggle R&eference Dim", MNU_REFERENCE, 'E', TN, mCon }, +{ 1, NULL, 0, 0, TN, NULL }, +{ 1, "&Horizontal", MNU_HORIZONTAL, 'H', TN, mCon }, +{ 1, "&Vertical", MNU_VERTICAL, 'V', TN, mCon }, +{ 1, NULL, 0, 0, TN, NULL }, +{ 1, "&On Point / Curve / Plane", MNU_ON_ENTITY, 'O', TN, mCon }, +{ 1, "E&qual Length / Radius / Angle", MNU_EQUAL, 'Q', TN, mCon }, +{ 1, "Length Ra&tio", MNU_RATIO, 'Z', TN, mCon }, +{ 1, "Length Diff&erence", MNU_DIFFERENCE, 'J', TN, mCon }, +{ 1, "At &Midpoint", MNU_AT_MIDPOINT, 'M', TN, mCon }, +{ 1, "S&ymmetric", MNU_SYMMETRIC, 'Y', TN, mCon }, +{ 1, "Para&llel / Tangent", MNU_PARALLEL, 'L', TN, mCon }, +{ 1, "&Perpendicular", MNU_PERPENDICULAR, '[', TN, mCon }, +{ 1, "Same Orient&ation", MNU_ORIENTED_SAME, 'X', TN, mCon }, +{ 1, "Lock Point Where &Dragged", MNU_WHERE_DRAGGED, ']', TN, mCon }, +{ 1, NULL, 0, 0, TN, NULL }, +{ 1, "Comment", MNU_COMMENT, ';', TN, mCon }, + +{ 0, "&Analyze", 0, 0, TN, NULL }, +{ 1, "Measure &Volume", MNU_VOLUME, C|S|'V', TN, mAna }, +{ 1, "Measure &Area", MNU_AREA, C|S|'A', TN, mAna }, +{ 1, "Show &Interfering Parts", MNU_INTERFERENCE, C|S|'I', TN, mAna }, +{ 1, "Show &Naked Edges", MNU_NAKED_EDGES, C|S|'N', TN, mAna }, +{ 1, NULL, 0, 0, TN, NULL }, +{ 1, "Show Degrees of &Freedom", MNU_SHOW_DOF, C|S|'F', TN, mAna }, +{ 1, NULL, 0, 0, TN, NULL }, +{ 1, "&Trace Point", MNU_TRACE_PT, C|S|'T', TN, mAna }, +{ 1, "&Stop Tracing...", MNU_STOP_TRACING, C|S|'S', TN, mAna }, +{ 1, "Step &Dimension...", MNU_STEP_DIM, C|S|'D', TN, mAna }, + +{ 0, "&Help", 0, 0, TN, NULL }, +{ 1, "&Website / Manual", MNU_WEBSITE, 0, TN, mHelp }, +#ifndef __APPLE__ +{ 1, "&About", MNU_ABOUT, 0, TN, mHelp }, +#endif + +{ -1, 0, 0, 0, TN, 0 } +}; + +#undef DEL +#undef ESC +#undef S +#undef C +#undef F +#undef TN +#undef TC +#undef TR + +std::string SolveSpace::MakeAcceleratorLabel(int accel) { + if(!accel) return ""; + + std::string label; + if(accel & GraphicsWindow::CTRL_MASK) { + label += "Ctrl+"; + } + if(accel & GraphicsWindow::SHIFT_MASK) { + label += "Shift+"; + } + if(accel >= GraphicsWindow::FUNCTION_KEY_BASE + 1 && + accel <= GraphicsWindow::FUNCTION_KEY_BASE + 12) { + label += ssprintf("F%d", accel - GraphicsWindow::FUNCTION_KEY_BASE); + } else if(accel == '\t') { + label += "Tab"; + } else if(accel == ' ') { + label += "Space"; + } else if(accel == GraphicsWindow::ESCAPE_KEY) { + label += "Esc"; + } else if(accel == GraphicsWindow::DELETE_KEY) { + label += "Del"; + } else { + label += (char)(accel & 0xff); + } + return label; +} + +void GraphicsWindow::Init(void) { + scale = 5; + offset = Vector::From(0, 0, 0); + projRight = Vector::From(1, 0, 0); + projUp = Vector::From(0, 1, 0); + + // Make sure those are valid; could get a mouse move without a mouse + // down if someone depresses the button, then drags into our window. + orig.projRight = projRight; + orig.projUp = projUp; + + // And with the last group active + activeGroup = SK.groupOrder.elem[SK.groupOrder.n - 1]; + SK.GetGroup(activeGroup)->Activate(); + + showWorkplanes = false; + showNormals = true; + showPoints = true; + showConstraints = true; + showHdnLines = false; + showShaded = true; + showEdges = true; + showMesh = false; + showOutlines = false; + + showTextWindow = true; + ShowTextWindow(showTextWindow); + + showSnapGrid = false; + context.active = false; + + // Do this last, so that all the menus get updated correctly. + ClearSuper(); +} + +void GraphicsWindow::AnimateOntoWorkplane(void) { + if(!LockedInWorkplane()) return; + + Entity *w = SK.GetEntity(ActiveWorkplane()); + Quaternion quatf = w->Normal()->NormalGetNum(); + Vector offsetf = (SK.GetEntity(w->point[0])->PointGetNum()).ScaledBy(-1); + + AnimateOnto(quatf, offsetf); +} + +void GraphicsWindow::AnimateOnto(Quaternion quatf, Vector offsetf) { + // Get our initial orientation and translation. + Quaternion quat0 = Quaternion::From(projRight, projUp); + Vector offset0 = offset; + + // Make sure we take the shorter of the two possible paths. + double mp = (quatf.Minus(quat0)).Magnitude(); + double mm = (quatf.Plus(quat0)).Magnitude(); + if(mp > mm) { + quatf = quatf.ScaledBy(-1); + mp = mm; + } + double mo = (offset0.Minus(offsetf)).Magnitude()*scale; + + // Animate transition, unless it's a tiny move. + int32_t dt = (mp < 0.01 && mo < 10) ? (-20) : + (int32_t)(100 + 1000*mp + 0.4*mo); + // Don't ever animate for longer than 2000 ms; we can get absurdly + // long translations (as measured in pixels) if the user zooms out, moves, + // and then zooms in again. + if(dt > 2000) dt = 2000; + int64_t tn, t0 = GetMilliseconds(); + double s = 0; + Quaternion dq = quatf.Times(quat0.Inverse()); + do { + offset = (offset0.ScaledBy(1 - s)).Plus(offsetf.ScaledBy(s)); + Quaternion quat = (dq.ToThe(s)).Times(quat0); + quat = quat.WithMagnitude(1); + + projRight = quat.RotationU(); + projUp = quat.RotationV(); + PaintGraphics(); + + tn = GetMilliseconds(); + s = (tn - t0)/((double)dt); + } while((tn - t0) < dt); + + projRight = quatf.RotationU(); + projUp = quatf.RotationV(); + offset = offsetf; + InvalidateGraphics(); + // If the view screen is open, then we need to refresh it. + SS.ScheduleShowTW(); +} + +void GraphicsWindow::HandlePointForZoomToFit(Vector p, Point2d *pmax, Point2d *pmin, + double *wmin, bool usePerspective) +{ + double w; + Vector pp = ProjectPoint4(p, &w); + // If usePerspective is true, then we calculate a perspective projection of the point. + // If not, then we do a parallel projection regardless of the current + // scale factor. + if(usePerspective) { + pp = pp.ScaledBy(1.0/w); + } + + pmax->x = max(pmax->x, pp.x); + pmax->y = max(pmax->y, pp.y); + pmin->x = min(pmin->x, pp.x); + pmin->y = min(pmin->y, pp.y); + *wmin = min(*wmin, w); +} +void GraphicsWindow::LoopOverPoints(const std::vector &entities, + const std::vector &faces, + Point2d *pmax, Point2d *pmin, double *wmin, + bool usePerspective, bool includeMesh) { + + int i, j; + for(Entity *e : entities) { + if(e->IsPoint()) { + HandlePointForZoomToFit(e->PointGetNum(), pmax, pmin, wmin, usePerspective); + } else if(e->type == Entity::CIRCLE) { + // Lots of entities can extend outside the bbox of their points, + // but circles are particularly bad. We want to get things halfway + // reasonable without the mesh, because a zoom to fit is used to + // set the zoom level to set the chord tol. + double r = e->CircleGetRadiusNum(); + Vector c = SK.GetEntity(e->point[0])->PointGetNum(); + Quaternion q = SK.GetEntity(e->normal)->NormalGetNum(); + for(j = 0; j < 4; j++) { + Vector p = (j == 0) ? (c.Plus(q.RotationU().ScaledBy( r))) : + (j == 1) ? (c.Plus(q.RotationU().ScaledBy(-r))) : + (j == 2) ? (c.Plus(q.RotationV().ScaledBy( r))) : + (c.Plus(q.RotationV().ScaledBy(-r))); + HandlePointForZoomToFit(p, pmax, pmin, wmin, usePerspective); + } + } else { + // We have to iterate children points, because we can select entites without points + for(int i = 0; i < MAX_POINTS_IN_ENTITY; i++) { + if(e->point[i].v == 0) break; + Vector p = SK.GetEntity(e->point[i])->PointGetNum(); + HandlePointForZoomToFit(p, pmax, pmin, wmin, usePerspective); + } + } + } + + if(!includeMesh && faces.empty()) return; + + Group *g = SK.GetGroup(activeGroup); + g->GenerateDisplayItems(); + for(i = 0; i < g->displayMesh.l.n; i++) { + STriangle *tr = &(g->displayMesh.l.elem[i]); + if(!includeMesh) { + bool found = false; + for(const hEntity &face : faces) { + if(face.v != tr->meta.face) continue; + found = true; + break; + } + if(!found) continue; + } + HandlePointForZoomToFit(tr->a, pmax, pmin, wmin, usePerspective); + HandlePointForZoomToFit(tr->b, pmax, pmin, wmin, usePerspective); + HandlePointForZoomToFit(tr->c, pmax, pmin, wmin, usePerspective); + } + if(!includeMesh) return; + for(i = 0; i < g->polyLoops.l.n; i++) { + SContour *sc = &(g->polyLoops.l.elem[i]); + for(j = 0; j < sc->l.n; j++) { + HandlePointForZoomToFit(sc->l.elem[j].p, pmax, pmin, wmin, usePerspective); + } + } +} +void GraphicsWindow::ZoomToFit(bool includingInvisibles, bool useSelection) { + std::vector entities; + std::vector faces; + + if(useSelection) { + for(int i = 0; i < selection.n; i++) { + Selection *s = &selection.elem[i]; + if(s->entity.v == 0) continue; + Entity *e = SK.entity.FindById(s->entity); + if(e->IsFace()) { + faces.push_back(e->h); + continue; + } + entities.push_back(e); + } + } + + bool selectionUsed = !entities.empty() || !faces.empty(); + + if(!selectionUsed) { + for(int i = 0; iIsPoint()) continue; + if(!includingInvisibles && !e->IsVisible()) continue; + entities.push_back(e); + } + } + + // On the first run, ignore perspective. + Point2d pmax = { -1e12, -1e12 }, pmin = { 1e12, 1e12 }; + double wmin = 1; + LoopOverPoints(entities, faces, &pmax, &pmin, &wmin, + /*usePerspective=*/false, /*includeMesh=*/!selectionUsed); + + double xm = (pmax.x + pmin.x)/2, ym = (pmax.y + pmin.y)/2; + double dx = pmax.x - pmin.x, dy = pmax.y - pmin.y; + + offset = offset.Plus(projRight.ScaledBy(-xm)).Plus( + projUp. ScaledBy(-ym)); + + // And based on this, we calculate the scale and offset + if(EXACT(dx == 0 && dy == 0)) { + scale = 5; + } else { + double scalex = 1e12, scaley = 1e12; + if(EXACT(dx != 0)) scalex = 0.9*width /dx; + if(EXACT(dy != 0)) scaley = 0.9*height/dy; + scale = min(scalex, scaley); + + scale = min(300.0, scale); + scale = max(0.003, scale); + } + + // Then do another run, considering the perspective. + pmax.x = -1e12; pmax.y = -1e12; + pmin.x = 1e12; pmin.y = 1e12; + wmin = 1; + LoopOverPoints(entities, faces, &pmax, &pmin, &wmin, + /*usePerspective=*/true, /*includeMesh=*/!selectionUsed); + + // Adjust the scale so that no points are behind the camera + if(wmin < 0.1) { + double k = SS.CameraTangent(); + // w = 1+k*scale*z + double zmin = (wmin - 1)/(k*scale); + // 0.1 = 1 + k*scale*zmin + // (0.1 - 1)/(k*zmin) = scale + scale = min(scale, (0.1 - 1)/(k*zmin)); + } +} + +void GraphicsWindow::MenuView(int id) { + switch(id) { + case MNU_ZOOM_IN: + SS.GW.scale *= 1.2; + SS.ScheduleShowTW(); + break; + + case MNU_ZOOM_OUT: + SS.GW.scale /= 1.2; + SS.ScheduleShowTW(); + break; + + case MNU_ZOOM_TO_FIT: + SS.GW.ZoomToFit(/*includingInvisibles=*/false, /*useSelection=*/true); + SS.ScheduleShowTW(); + break; + + case MNU_SHOW_GRID: + SS.GW.showSnapGrid = !SS.GW.showSnapGrid; + if(SS.GW.showSnapGrid && !SS.GW.LockedInWorkplane()) { + Message("No workplane is active, so the grid will not " + "appear."); + } + SS.GW.EnsureValidActives(); + InvalidateGraphics(); + break; + + case MNU_PERSPECTIVE_PROJ: + SS.usePerspectiveProj = !SS.usePerspectiveProj; + if(SS.cameraTangent < 1e-6) { + Error("The perspective factor is set to zero, so the view will " + "always be a parallel projection.\n\n" + "For a perspective projection, modify the perspective " + "factor in the configuration screen. A value around 0.3 " + "is typical."); + } + SS.GW.EnsureValidActives(); + InvalidateGraphics(); + break; + + case MNU_ONTO_WORKPLANE: + if(SS.GW.LockedInWorkplane()) { + SS.GW.AnimateOntoWorkplane(); + SS.ScheduleShowTW(); + break; + } // if not in 2d mode fall through and use ORTHO logic + case MNU_NEAREST_ORTHO: + case MNU_NEAREST_ISO: { + static const Vector ortho[3] = { + Vector::From(1, 0, 0), + Vector::From(0, 1, 0), + Vector::From(0, 0, 1) + }; + double sqrt2 = sqrt(2.0), sqrt6 = sqrt(6.0); + Quaternion quat0 = Quaternion::From(SS.GW.projRight, SS.GW.projUp); + Quaternion quatf = quat0; + double dmin = 1e10; + + // There are 24 possible views; 3*2*2*2 + int i, j, negi, negj; + for(i = 0; i < 3; i++) { + for(j = 0; j < 3; j++) { + if(i == j) continue; + for(negi = 0; negi < 2; negi++) { + for(negj = 0; negj < 2; negj++) { + Vector ou = ortho[i], ov = ortho[j]; + if(negi) ou = ou.ScaledBy(-1); + if(negj) ov = ov.ScaledBy(-1); + Vector on = ou.Cross(ov); + + Vector u, v; + if(id == MNU_NEAREST_ORTHO || id == MNU_ONTO_WORKPLANE) { + u = ou; + v = ov; + } else { + u = + ou.ScaledBy(1/sqrt2).Plus( + on.ScaledBy(-1/sqrt2)); + v = + ou.ScaledBy(-1/sqrt6).Plus( + ov.ScaledBy(2/sqrt6).Plus( + on.ScaledBy(-1/sqrt6))); + } + + Quaternion quatt = Quaternion::From(u, v); + double d = min( + (quatt.Minus(quat0)).Magnitude(), + (quatt.Plus(quat0)).Magnitude()); + if(d < dmin) { + dmin = d; + quatf = quatt; + } + } + } + } + } + + SS.GW.AnimateOnto(quatf, SS.GW.offset); + break; + } + + case MNU_CENTER_VIEW: + SS.GW.GroupSelection(); + if(SS.GW.gs.n == 1 && SS.GW.gs.points == 1) { + Quaternion quat0; + // Offset is the selected point, quaternion is same as before + Vector pt = SK.GetEntity(SS.GW.gs.point[0])->PointGetNum(); + quat0 = Quaternion::From(SS.GW.projRight, SS.GW.projUp); + SS.GW.AnimateOnto(quat0, pt.ScaledBy(-1)); + SS.GW.ClearSelection(); + } else { + Error("Select a point; this point will become the center " + "of the view on screen."); + } + break; + + case MNU_SHOW_MENU_BAR: + ToggleMenuBar(); + SS.GW.EnsureValidActives(); + InvalidateGraphics(); + break; + + case MNU_SHOW_TOOLBAR: + SS.showToolbar = !SS.showToolbar; + SS.GW.EnsureValidActives(); + InvalidateGraphics(); + break; + + case MNU_SHOW_TEXT_WND: + SS.GW.showTextWindow = !SS.GW.showTextWindow; + SS.GW.EnsureValidActives(); + break; + + case MNU_UNITS_INCHES: + SS.viewUnits = SolveSpaceUI::UNIT_INCHES; + SS.ScheduleShowTW(); + SS.GW.EnsureValidActives(); + break; + + case MNU_UNITS_MM: + SS.viewUnits = SolveSpaceUI::UNIT_MM; + SS.ScheduleShowTW(); + SS.GW.EnsureValidActives(); + break; + + case MNU_FULL_SCREEN: + ToggleFullScreen(); + SS.GW.EnsureValidActives(); + break; + + default: oops(); + } + InvalidateGraphics(); +} + +void GraphicsWindow::EnsureValidActives(void) { + bool change = false; + // The active group must exist, and not be the references. + Group *g = SK.group.FindByIdNoOops(activeGroup); + if((!g) || (g->h.v == Group::HGROUP_REFERENCES.v)) { + int i; + for(i = 0; i < SK.groupOrder.n; i++) { + if(SK.groupOrder.elem[i].v != Group::HGROUP_REFERENCES.v) { + break; + } + } + if(i >= SK.groupOrder.n) { + // This can happen if the user deletes all the groups in the + // sketch. It's difficult to prevent that, because the last + // group might have been deleted automatically, because it failed + // a dependency. There needs to be something, so create a plane + // drawing group and activate that. They should never be able + // to delete the references, though. + activeGroup = SS.CreateDefaultDrawingGroup(); + // We've created the default group, but not the workplane entity; + // do it now so that drawing mode isn't switched to "Free in 3d". + SS.GenerateAll(SolveSpaceUI::GENERATE_ALL); + } else { + activeGroup = SK.groupOrder.elem[i]; + } + SK.GetGroup(activeGroup)->Activate(); + change = true; + } + + // The active coordinate system must also exist. + if(LockedInWorkplane()) { + Entity *e = SK.entity.FindByIdNoOops(ActiveWorkplane()); + if(e) { + hGroup hgw = e->group; + if(hgw.v != activeGroup.v && SS.GroupsInOrder(activeGroup, hgw)) { + // The active workplane is in a group that comes after the + // active group; so any request or constraint will fail. + SetWorkplaneFreeIn3d(); + change = true; + } + } else { + SetWorkplaneFreeIn3d(); + change = true; + } + } + + // And update the checked state for various menus + bool locked = LockedInWorkplane(); + RadioMenuById(MNU_FREE_IN_3D, !locked); + RadioMenuById(MNU_SEL_WORKPLANE, locked); + + SS.UndoEnableMenus(); + + switch(SS.viewUnits) { + case SolveSpaceUI::UNIT_MM: + case SolveSpaceUI::UNIT_INCHES: + break; + default: + SS.viewUnits = SolveSpaceUI::UNIT_MM; + break; + } + RadioMenuById(MNU_UNITS_MM, SS.viewUnits == SolveSpaceUI::UNIT_MM); + RadioMenuById(MNU_UNITS_INCHES, SS.viewUnits == SolveSpaceUI::UNIT_INCHES); + + ShowTextWindow(SS.GW.showTextWindow); + CheckMenuById(MNU_SHOW_TEXT_WND, SS.GW.showTextWindow); + +#if defined(__APPLE__) + CheckMenuById(MNU_SHOW_MENU_BAR, MenuBarIsVisible()); +#endif + CheckMenuById(MNU_SHOW_TOOLBAR, SS.showToolbar); + CheckMenuById(MNU_PERSPECTIVE_PROJ, SS.usePerspectiveProj); + CheckMenuById(MNU_SHOW_GRID, SS.GW.showSnapGrid); +#if defined(HAVE_GTK) || defined(__APPLE__) + CheckMenuById(MNU_FULL_SCREEN, FullScreenIsActive()); +#endif + + if(change) SS.ScheduleShowTW(); +} + +void GraphicsWindow::SetWorkplaneFreeIn3d(void) { + SK.GetGroup(activeGroup)->activeWorkplane = Entity::FREE_IN_3D; +} +hEntity GraphicsWindow::ActiveWorkplane(void) { + Group *g = SK.group.FindByIdNoOops(activeGroup); + if(g) { + return g->activeWorkplane; + } else { + return Entity::FREE_IN_3D; + } +} +bool GraphicsWindow::LockedInWorkplane(void) { + return (SS.GW.ActiveWorkplane().v != Entity::FREE_IN_3D.v); +} + +void GraphicsWindow::ForceTextWindowShown(void) { + if(!showTextWindow) { + showTextWindow = true; + CheckMenuById(MNU_SHOW_TEXT_WND, true); + ShowTextWindow(true); + } +} + +void GraphicsWindow::DeleteTaggedRequests(void) { + // Rewrite any point-coincident constraints that were affected by this + // deletion. + Request *r; + for(r = SK.request.First(); r; r = SK.request.NextAfter(r)) { + if(!r->tag) continue; + FixConstraintsForRequestBeingDeleted(r->h); + } + // and then delete the tagged requests. + SK.request.RemoveTagged(); + + // An edit might be in progress for the just-deleted item. So + // now it's not. + HideGraphicsEditControl(); + SS.TW.HideEditControl(); + // And clear out the selection, which could contain that item. + ClearSuper(); + // And regenerate to get rid of what it generates, plus anything + // that references it (since the regen code checks for that). + SS.GenerateAll(SolveSpaceUI::GENERATE_ALL); + EnsureValidActives(); + SS.ScheduleShowTW(); +} + +Vector GraphicsWindow::SnapToGrid(Vector p) { + if(!LockedInWorkplane()) return p; + + EntityBase *wrkpl = SK.GetEntity(ActiveWorkplane()), + *norm = wrkpl->Normal(); + Vector wo = SK.GetEntity(wrkpl->point[0])->PointGetNum(), + wu = norm->NormalU(), + wv = norm->NormalV(), + wn = norm->NormalN(); + + Vector pp = (p.Minus(wo)).DotInToCsys(wu, wv, wn); + pp.x = floor((pp.x / SS.gridSpacing) + 0.5)*SS.gridSpacing; + pp.y = floor((pp.y / SS.gridSpacing) + 0.5)*SS.gridSpacing; + pp.z = 0; + + return pp.ScaleOutOfCsys(wu, wv, wn).Plus(wo); +} + +void GraphicsWindow::MenuEdit(int id) { + switch(id) { + case MNU_UNSELECT_ALL: + SS.GW.GroupSelection(); + // If there's nothing selected to de-select, and no operation + // to cancel, then perhaps they want to return to the home + // screen in the text window. + if(SS.GW.gs.n == 0 && + SS.GW.gs.constraints == 0 && + SS.GW.pending.operation == 0) + { + if(!(TextEditControlIsVisible() || + GraphicsEditControlIsVisible())) + { + if(SS.TW.shown.screen == TextWindow::SCREEN_STYLE_INFO) { + SS.TW.GoToScreen(TextWindow::SCREEN_LIST_OF_STYLES); + } else { + SS.TW.ClearSuper(); + } + } + } + SS.GW.ClearSuper(); + SS.TW.HideEditControl(); + SS.nakedEdges.Clear(); + SS.justExportedInfo.draw = false; + // This clears the marks drawn to indicate which points are + // still free to drag. + Param *p; + for(p = SK.param.First(); p; p = SK.param.NextAfter(p)) { + p->free = false; + } + if(SS.exportMode) { + SS.exportMode = false; + SS.GenerateAll(SolveSpaceUI::GENERATE_ALL); + } + break; + + case MNU_SELECT_ALL: { + Entity *e; + for(e = SK.entity.First(); e; e = SK.entity.NextAfter(e)) { + if(e->group.v != SS.GW.activeGroup.v) continue; + if(e->IsFace() || e->IsDistance()) continue; + if(!e->IsVisible()) continue; + + SS.GW.MakeSelected(e->h); + } + InvalidateGraphics(); + SS.ScheduleShowTW(); + break; + } + + case MNU_SELECT_CHAIN: { + Entity *e; + int newlySelected = 0; + bool didSomething; + do { + didSomething = false; + for(e = SK.entity.First(); e; e = SK.entity.NextAfter(e)) { + if(e->group.v != SS.GW.activeGroup.v) continue; + if(!e->HasEndpoints()) continue; + if(!e->IsVisible()) continue; + + Vector st = e->EndpointStart(), + fi = e->EndpointFinish(); + + bool onChain = false, alreadySelected = false; + List *ls = &(SS.GW.selection); + for(Selection *s = ls->First(); s; s = ls->NextAfter(s)) { + if(!s->entity.v) continue; + if(s->entity.v == e->h.v) { + alreadySelected = true; + continue; + } + Entity *se = SK.GetEntity(s->entity); + if(!se->HasEndpoints()) continue; + + Vector sst = se->EndpointStart(), + sfi = se->EndpointFinish(); + + if(sst.Equals(st) || sst.Equals(fi) || + sfi.Equals(st) || sfi.Equals(fi)) + { + onChain = true; + } + } + if(onChain && !alreadySelected) { + SS.GW.MakeSelected(e->h); + newlySelected++; + didSomething = true; + } + } + } while(didSomething); + if(newlySelected == 0) { + Error("No additional entities share endpoints with the " + "selected entities."); + } + InvalidateGraphics(); + SS.ScheduleShowTW(); + break; + } + + case MNU_ROTATE_90: { + SS.GW.GroupSelection(); + Entity *e = NULL; + if(SS.GW.gs.n == 1 && SS.GW.gs.points == 1) { + e = SK.GetEntity(SS.GW.gs.point[0]); + } else if(SS.GW.gs.n == 1 && SS.GW.gs.entities == 1) { + e = SK.GetEntity(SS.GW.gs.entity[0]); + } + SS.GW.ClearSelection(); + + hGroup hg = e ? e->group : SS.GW.activeGroup; + Group *g = SK.GetGroup(hg); + if(g->type != Group::LINKED) { + Error("To use this command, select a point or other " + "entity from an linked part, or make a link " + "group the active group."); + break; + } + + + SS.UndoRemember(); + // Rotate by ninety degrees about the coordinate axis closest + // to the screen normal. + Vector norm = SS.GW.projRight.Cross(SS.GW.projUp); + norm = norm.ClosestOrtho(); + norm = norm.WithMagnitude(1); + Quaternion qaa = Quaternion::From(norm, PI/2); + + g->TransformImportedBy(Vector::From(0, 0, 0), qaa); + + // and regenerate as necessary. + SS.MarkGroupDirty(hg); + SS.GenerateAll(); + break; + } + + case MNU_SNAP_TO_GRID: { + if(!SS.GW.LockedInWorkplane()) { + Error("No workplane is active. Select a workplane to define " + "the plane for the snap grid."); + break; + } + SS.GW.GroupSelection(); + if(SS.GW.gs.points == 0 && SS.GW.gs.constraintLabels == 0) { + Error("Can't snap these items to grid; select points, " + "text comments, or constraints with a label. " + "To snap a line, select its endpoints."); + break; + } + SS.UndoRemember(); + + List *ls = &(SS.GW.selection); + for(Selection *s = ls->First(); s; s = ls->NextAfter(s)) { + if(s->entity.v) { + hEntity hp = s->entity; + Entity *ep = SK.GetEntity(hp); + if(!ep->IsPoint()) continue; + + Vector p = ep->PointGetNum(); + ep->PointForceTo(SS.GW.SnapToGrid(p)); + SS.GW.pending.points.Add(&hp); + SS.MarkGroupDirty(ep->group); + } else if(s->constraint.v) { + Constraint *c = SK.GetConstraint(s->constraint); + Vector refp = c->GetReferencePos(); + c->disp.offset = c->disp.offset.Plus(SS.GW.SnapToGrid(refp).Minus(refp)); + } + } + // Regenerate, with these points marked as dragged so that they + // get placed as close as possible to our snap grid. + SS.GenerateAll(); + SS.GW.ClearPending(); + + SS.GW.ClearSelection(); + InvalidateGraphics(); + break; + } + + case MNU_UNDO: + SS.UndoUndo(); + break; + + case MNU_REDO: + SS.UndoRedo(); + break; + + case MNU_REGEN_ALL: + SS.ReloadAllImported(); + SS.GenerateAll(SolveSpaceUI::GENERATE_UNTIL_ACTIVE); + SS.ScheduleShowTW(); + break; + + default: oops(); + } +} + +void GraphicsWindow::MenuRequest(int id) { + const char *s; + switch(id) { + case MNU_SEL_WORKPLANE: { + SS.GW.GroupSelection(); + Group *g = SK.GetGroup(SS.GW.activeGroup); + + if(SS.GW.gs.n == 1 && SS.GW.gs.workplanes == 1) { + // A user-selected workplane + g->activeWorkplane = SS.GW.gs.entity[0]; + } else if(g->type == Group::DRAWING_WORKPLANE) { + // The group's default workplane + g->activeWorkplane = g->h.entity(0); + Message("No workplane selected. Activating default workplane " + "for this group."); + } + + if(!SS.GW.LockedInWorkplane()) { + Error("No workplane is selected, and the active group does " + "not have a default workplane. Try selecting a " + "workplane, or activating a sketch-in-new-workplane " + "group."); + break; + } + // Align the view with the selected workplane + SS.GW.AnimateOntoWorkplane(); + SS.GW.ClearSuper(); + SS.ScheduleShowTW(); + break; + } + case MNU_FREE_IN_3D: + SS.GW.SetWorkplaneFreeIn3d(); + SS.GW.EnsureValidActives(); + SS.ScheduleShowTW(); + InvalidateGraphics(); + break; + + case MNU_TANGENT_ARC: + SS.GW.GroupSelection(); + if(SS.GW.gs.n == 1 && SS.GW.gs.points == 1) { + SS.GW.MakeTangentArc(); + } else if(SS.GW.gs.n != 0) { + Error("Bad selection for tangent arc at point. Select a " + "single point, or select nothing to set up arc " + "parameters."); + } else { + SS.TW.GoToScreen(TextWindow::SCREEN_TANGENT_ARC); + SS.GW.ForceTextWindowShown(); + SS.ScheduleShowTW(); + InvalidateGraphics(); // repaint toolbar + } + break; + + case MNU_ARC: s = "click point on arc (draws anti-clockwise)"; goto c; + case MNU_DATUM_POINT: s = "click to place datum point"; goto c; + case MNU_LINE_SEGMENT: s = "click first point of line segment"; goto c; + case MNU_CONSTR_SEGMENT: s = "click first point of construction line segment"; goto c; + case MNU_CUBIC: s = "click first point of cubic segment"; goto c; + case MNU_CIRCLE: s = "click center of circle"; goto c; + case MNU_WORKPLANE: s = "click origin of workplane"; goto c; + case MNU_RECTANGLE: s = "click one corner of rectangle"; goto c; + case MNU_TTF_TEXT: s = "click top left of text"; goto c; +c: + SS.GW.pending.operation = id; + SS.GW.pending.description = s; + SS.ScheduleShowTW(); + InvalidateGraphics(); // repaint toolbar + break; + + case MNU_CONSTRUCTION: { + SS.UndoRemember(); + SS.GW.GroupSelection(); + if(SS.GW.gs.entities == 0) { + Error("No entities are selected. Select entities before " + "trying to toggle their construction state."); + } + int i; + for(i = 0; i < SS.GW.gs.entities; i++) { + hEntity he = SS.GW.gs.entity[i]; + if(!he.isFromRequest()) continue; + Request *r = SK.GetRequest(he.request()); + r->construction = !(r->construction); + SS.MarkGroupDirty(r->group); + } + SS.GW.ClearSelection(); + SS.GenerateAll(); + break; + } + + case MNU_SPLIT_CURVES: + SS.GW.SplitLinesOrCurves(); + break; + + default: oops(); + } +} + +void GraphicsWindow::ClearSuper(void) { + HideGraphicsEditControl(); + ClearPending(); + ClearSelection(); + hover.Clear(); + EnsureValidActives(); +} + +void GraphicsWindow::ToggleBool(bool *v) { + *v = !*v; + + // The faces are shown as special stippling on the shaded triangle mesh, + // so not meaningful to show them and hide the shaded. + if(!showShaded) showFaces = false; + + // We might need to regenerate the mesh and edge list, since the edges + // wouldn't have been generated if they were previously hidden. + if(showEdges) (SK.GetGroup(activeGroup))->displayDirty = true; + + SS.GenerateAll(); + InvalidateGraphics(); + SS.ScheduleShowTW(); +} + +GraphicsWindow::SuggestedConstraint GraphicsWindow::SuggestLineConstraint(hRequest request) { + if(LockedInWorkplane()) { + Entity *ptA = SK.GetEntity(request.entity(1)), + *ptB = SK.GetEntity(request.entity(2)); + + Expr *au, *av, *bu, *bv; + + ptA->PointGetExprsInWorkplane(ActiveWorkplane(), &au, &av); + ptB->PointGetExprsInWorkplane(ActiveWorkplane(), &bu, &bv); + + double du = au->Minus(bu)->Eval(); + double dv = av->Minus(bv)->Eval(); + + const double TOLERANCE_RATIO = 0.02; + if(fabs(dv) > LENGTH_EPS && fabs(du / dv) < TOLERANCE_RATIO) + return SUGGESTED_VERTICAL; + else if(fabs(du) > LENGTH_EPS && fabs(dv / du) < TOLERANCE_RATIO) + return SUGGESTED_HORIZONTAL; + else + return SUGGESTED_NONE; + } else { + return SUGGESTED_NONE; + } +} diff --git a/src/group.cpp b/src/group.cpp new file mode 100644 index 0000000..845cfff --- /dev/null +++ b/src/group.cpp @@ -0,0 +1,906 @@ +//----------------------------------------------------------------------------- +// Implementation of the Group class, which represents a set of entities and +// constraints that are solved together, in some cases followed by another +// operation, like to extrude surfaces from the entities or to step and +// repeat them parametrically. +// +// Copyright 2008-2013 Jonathan Westhues. +//----------------------------------------------------------------------------- +#include "solvespace.h" + +const hParam Param::NO_PARAM = { 0 }; +#define NO_PARAM (Param::NO_PARAM) + +const hGroup Group::HGROUP_REFERENCES = { 1 }; + +#define gs (SS.GW.gs) + +//----------------------------------------------------------------------------- +// The group structure includes pointers to other dynamically-allocated +// memory. This clears and frees them all. +//----------------------------------------------------------------------------- +void Group::Clear(void) { + polyLoops.Clear(); + bezierLoops.Clear(); + bezierOpens.Clear(); + thisMesh.Clear(); + runningMesh.Clear(); + thisShell.Clear(); + runningShell.Clear(); + displayMesh.Clear(); + displayEdges.Clear(); + displayOutlines.Clear(); + impMesh.Clear(); + impShell.Clear(); + impEntity.Clear(); + // remap is the only one that doesn't get recreated when we regen + remap.Clear(); +} + +void Group::AddParam(IdList *param, hParam hp, double v) { + Param pa = {}; + pa.h = hp; + pa.val = v; + + param->Add(&pa); +} + +bool Group::IsVisible(void) { + if(!visible) return false; + if(SS.GroupsInOrder(SS.GW.activeGroup, h)) return false; + return true; +} + +int Group::GetNumConstraints(void) { + int num = 0; + for(int i = 0; i < SK.constraint.n; i++) { + Constraint *c = &SK.constraint.elem[i]; + if(c->group.v != h.v) continue; + num++; + } + return num; +} + +Vector Group::ExtrusionGetVector() { + return Vector::From(h.param(0), h.param(1), h.param(2)); +} + +void Group::ExtrusionForceVectorTo(const Vector &v) { + SK.GetParam(h.param(0))->val = v.x; + SK.GetParam(h.param(1))->val = v.y; + SK.GetParam(h.param(2))->val = v.z; +} + +void Group::MenuGroup(int id) { + Group g = {}; + g.visible = true; + g.color = RGBi(100, 100, 100); + g.scale = 1; + + if(id >= RECENT_LINK && id < (RECENT_LINK + MAX_RECENT)) { + g.linkFile = RecentFile[id-RECENT_LINK]; + id = GraphicsWindow::MNU_GROUP_LINK; + } + + SS.GW.GroupSelection(); + + switch(id) { + case GraphicsWindow::MNU_GROUP_3D: + g.type = DRAWING_3D; + g.name = "sketch-in-3d"; + break; + + case GraphicsWindow::MNU_GROUP_WRKPL: + g.type = DRAWING_WORKPLANE; + g.name = "sketch-in-plane"; + if(gs.points == 1 && gs.n == 1) { + g.subtype = WORKPLANE_BY_POINT_ORTHO; + + Vector u = SS.GW.projRight, v = SS.GW.projUp; + u = u.ClosestOrtho(); + v = v.Minus(u.ScaledBy(v.Dot(u))); + v = v.ClosestOrtho(); + + g.predef.q = Quaternion::From(u, v); + g.predef.origin = gs.point[0]; + } else if(gs.points == 1 && gs.lineSegments == 2 && gs.n == 3) { + g.subtype = WORKPLANE_BY_LINE_SEGMENTS; + + g.predef.origin = gs.point[0]; + g.predef.entityB = gs.entity[0]; + g.predef.entityC = gs.entity[1]; + + Vector ut = SK.GetEntity(g.predef.entityB)->VectorGetNum(); + Vector vt = SK.GetEntity(g.predef.entityC)->VectorGetNum(); + ut = ut.WithMagnitude(1); + vt = vt.WithMagnitude(1); + + if(fabs(SS.GW.projUp.Dot(vt)) < fabs(SS.GW.projUp.Dot(ut))) { + swap(ut, vt); + g.predef.swapUV = true; + } + if(SS.GW.projRight.Dot(ut) < 0) g.predef.negateU = true; + if(SS.GW.projUp. Dot(vt) < 0) g.predef.negateV = true; + } else { + Error("Bad selection for new sketch in workplane. This " + "group can be created with:\n\n" + " * a point (orthogonal to coordinate axes, " + "through the point)\n" + " * a point and two line segments (parallel to the " + "lines, through the point)\n"); + return; + } + break; + + case GraphicsWindow::MNU_GROUP_EXTRUDE: + if(!SS.GW.LockedInWorkplane()) { + Error("Select a workplane (Sketch -> In Workplane) before " + "extruding. The sketch will be extruded normal to the " + "workplane."); + return; + } + g.type = EXTRUDE; + g.opA = SS.GW.activeGroup; + g.predef.entityB = SS.GW.ActiveWorkplane(); + g.subtype = ONE_SIDED; + g.name = "extrude"; + break; + + case GraphicsWindow::MNU_GROUP_LATHE: + if(gs.points == 1 && gs.vectors == 1 && gs.n == 2) { + g.predef.origin = gs.point[0]; + g.predef.entityB = gs.vector[0]; + } else if(gs.lineSegments == 1 && gs.n == 1) { + g.predef.origin = SK.GetEntity(gs.entity[0])->point[0]; + g.predef.entityB = gs.entity[0]; + // since a line segment is a vector + } else { + Error("Bad selection for new lathe group. This group can " + "be created with:\n\n" + " * a point and a line segment or normal " + "(revolved about an axis parallel to line / " + "normal, through point)\n" + " * a line segment (revolved about line segment)\n"); + return; + } + g.type = LATHE; + g.opA = SS.GW.activeGroup; + g.name = "lathe"; + break; + + case GraphicsWindow::MNU_GROUP_ROT: { + if(gs.points == 1 && gs.n == 1 && SS.GW.LockedInWorkplane()) { + g.predef.origin = gs.point[0]; + Entity *w = SK.GetEntity(SS.GW.ActiveWorkplane()); + g.predef.entityB = w->Normal()->h; + g.activeWorkplane = w->h; + } else if(gs.points == 1 && gs.vectors == 1 && gs.n == 2) { + g.predef.origin = gs.point[0]; + g.predef.entityB = gs.vector[0]; + } else { + Error("Bad selection for new rotation. This group can " + "be created with:\n\n" + " * a point, while locked in workplane (rotate " + "in plane, about that point)\n" + " * a point and a line or a normal (rotate about " + "an axis through the point, and parallel to " + "line / normal)\n"); + return; + } + g.type = ROTATE; + g.opA = SS.GW.activeGroup; + g.valA = 3; + g.subtype = ONE_SIDED; + g.name = "rotate"; + break; + } + + case GraphicsWindow::MNU_GROUP_TRANS: + g.type = TRANSLATE; + g.opA = SS.GW.activeGroup; + g.valA = 3; + g.subtype = ONE_SIDED; + g.predef.entityB = SS.GW.ActiveWorkplane(); + g.activeWorkplane = SS.GW.ActiveWorkplane(); + g.name = "translate"; + break; + + case GraphicsWindow::MNU_GROUP_LINK: { + g.type = LINKED; + if(g.linkFile.empty()) { + if(!GetOpenFile(&g.linkFile, "", SlvsFileFilter)) return; + } + + // Assign the default name of the group based on the name of + // the linked file. + std::string groupName = g.linkFile; + size_t pos; + + pos = groupName.rfind(PATH_SEP); + if(pos != std::string::npos) + groupName.erase(0, pos + 1); + + pos = groupName.rfind('.'); + if(pos != std::string::npos) + groupName.erase(pos); + + for(size_t i = 0; i < groupName.length(); i++) { + if(!(isalnum(groupName[i]) || (unsigned)groupName[i] >= 0x80)) { + // convert punctuation to dashes + groupName[i] = '-'; + } + } + + if(groupName.length() > 0) { + g.name = groupName; + } else { + g.name = "link"; + } + + g.meshCombine = COMBINE_AS_ASSEMBLE; + break; + } + + default: oops(); + } + + // Copy color from the previous mesh-contributing group. + if(g.IsMeshGroup() && SK.groupOrder.n > 0) { + Group *running = SK.GetRunningMeshGroupFor(SS.GW.activeGroup); + if(running != NULL) { + g.color = running->color; + } + } + + SS.GW.ClearSelection(); + SS.UndoRemember(); + + bool afterActive = false; + for(int i = 0; i < SK.groupOrder.n; i++) { + Group *gi = SK.GetGroup(SK.groupOrder.elem[i]); + if(afterActive) + gi->order += 1; + if(gi->h.v == SS.GW.activeGroup.v) { + g.order = gi->order + 1; + afterActive = true; + } + } + + SK.group.AddAndAssignId(&g); + Group *gg = SK.GetGroup(g.h); + + if(gg->type == LINKED) { + SS.ReloadAllImported(); + } + gg->clean = false; + SS.GW.activeGroup = gg->h; + SS.GenerateAll(); + if(gg->type == DRAWING_WORKPLANE) { + // Can't set the active workplane for this one until after we've + // regenerated, because the workplane doesn't exist until then. + gg->activeWorkplane = gg->h.entity(0); + } + gg->Activate(); + SS.GW.AnimateOntoWorkplane(); + TextWindow::ScreenSelectGroup(0, gg->h.v); + SS.ScheduleShowTW(); +} + +void Group::TransformImportedBy(Vector t, Quaternion q) { + if(type != LINKED) oops(); + + hParam tx, ty, tz, qw, qx, qy, qz; + tx = h.param(0); + ty = h.param(1); + tz = h.param(2); + qw = h.param(3); + qx = h.param(4); + qy = h.param(5); + qz = h.param(6); + + Quaternion qg = Quaternion::From(qw, qx, qy, qz); + qg = q.Times(qg); + + Vector tg = Vector::From(tx, ty, tz); + tg = tg.Plus(t); + + SK.GetParam(tx)->val = tg.x; + SK.GetParam(ty)->val = tg.y; + SK.GetParam(tz)->val = tg.z; + + SK.GetParam(qw)->val = qg.w; + SK.GetParam(qx)->val = qg.vx; + SK.GetParam(qy)->val = qg.vy; + SK.GetParam(qz)->val = qg.vz; +} + +std::string Group::DescriptionString(void) { + if(name.empty()) { + return ssprintf("g%03x-(unnamed)", h.v); + } else { + return ssprintf("g%03x-%s", h.v, name.c_str()); + } +} + +void Group::Activate(void) { + if(type == EXTRUDE || type == LINKED || type == LATHE || type == TRANSLATE || type == ROTATE) { + SS.GW.showFaces = true; + } else { + SS.GW.showFaces = false; + } + SS.MarkGroupDirty(h); // for good measure; shouldn't be needed + SS.ScheduleGenerateAll(); + SS.ScheduleShowTW(); +} + +void Group::Generate(IdList *entity, + IdList *param) +{ + Vector gn = (SS.GW.projRight).Cross(SS.GW.projUp); + Vector gp = SS.GW.projRight.Plus(SS.GW.projUp); + Vector gc = (SS.GW.offset).ScaledBy(-1); + gn = gn.WithMagnitude(200/SS.GW.scale); + gp = gp.WithMagnitude(200/SS.GW.scale); + int a, i; + switch(type) { + case DRAWING_3D: + break; + + case DRAWING_WORKPLANE: { + Quaternion q; + if(subtype == WORKPLANE_BY_LINE_SEGMENTS) { + Vector u = SK.GetEntity(predef.entityB)->VectorGetNum(); + Vector v = SK.GetEntity(predef.entityC)->VectorGetNum(); + u = u.WithMagnitude(1); + Vector n = u.Cross(v); + v = (n.Cross(u)).WithMagnitude(1); + + if(predef.swapUV) swap(u, v); + if(predef.negateU) u = u.ScaledBy(-1); + if(predef.negateV) v = v.ScaledBy(-1); + q = Quaternion::From(u, v); + } else if(subtype == WORKPLANE_BY_POINT_ORTHO) { + // Already given, numerically. + q = predef.q; + } else oops(); + + Entity normal = {}; + normal.type = Entity::NORMAL_N_COPY; + normal.numNormal = q; + normal.point[0] = h.entity(2); + normal.group = h; + normal.h = h.entity(1); + entity->Add(&normal); + + Entity point = {}; + point.type = Entity::POINT_N_COPY; + point.numPoint = SK.GetEntity(predef.origin)->PointGetNum(); + point.group = h; + point.h = h.entity(2); + entity->Add(&point); + + Entity wp = {}; + wp.type = Entity::WORKPLANE; + wp.normal = normal.h; + wp.point[0] = point.h; + wp.group = h; + wp.h = h.entity(0); + entity->Add(&wp); + break; + } + + case EXTRUDE: { + AddParam(param, h.param(0), gn.x); + AddParam(param, h.param(1), gn.y); + AddParam(param, h.param(2), gn.z); + int ai, af; + if(subtype == ONE_SIDED) { + ai = 0; af = 2; + } else if(subtype == TWO_SIDED) { + ai = -1; af = 1; + } else oops(); + + // Get some arbitrary point in the sketch, that will be used + // as a reference when defining top and bottom faces. + hEntity pt = { 0 }; + for(i = 0; i < entity->n; i++) { + Entity *e = &(entity->elem[i]); + if(e->group.v != opA.v) continue; + + if(e->IsPoint()) pt = e->h; + + e->CalculateNumerical(false); + hEntity he = e->h; e = NULL; + // As soon as I call CopyEntity, e may become invalid! That + // adds entities, which may cause a realloc. + CopyEntity(entity, SK.GetEntity(he), ai, REMAP_BOTTOM, + h.param(0), h.param(1), h.param(2), + NO_PARAM, NO_PARAM, NO_PARAM, NO_PARAM, + true, false); + CopyEntity(entity, SK.GetEntity(he), af, REMAP_TOP, + h.param(0), h.param(1), h.param(2), + NO_PARAM, NO_PARAM, NO_PARAM, NO_PARAM, + true, false); + MakeExtrusionLines(entity, he); + } + // Remapped versions of that arbitrary point will be used to + // provide points on the plane faces. + MakeExtrusionTopBottomFaces(entity, pt); + break; + } + + case LATHE: { + Vector axis_pos = SK.GetEntity(predef.origin)->PointGetNum(); + Vector axis_dir = SK.GetEntity(predef.entityB)->VectorGetNum(); + + AddParam(param, h.param(0), axis_dir.x); + AddParam(param, h.param(1), axis_dir.y); + AddParam(param, h.param(2), axis_dir.z); + + // Remapped entity index. + int ai = 1; + + for(i = 0; i < entity->n; i++) { + Entity *e = &(entity->elem[i]); + if(e->group.v != opA.v) continue; + + e->CalculateNumerical(false); + hEntity he = e->h; + + // As soon as I call CopyEntity, e may become invalid! That + // adds entities, which may cause a realloc. + CopyEntity(entity, SK.GetEntity(predef.origin), 0, ai, + h.param(0), h.param(1), h.param(2), + NO_PARAM, NO_PARAM, NO_PARAM, NO_PARAM, + true, false); + + CopyEntity(entity, SK.GetEntity(he), 0, REMAP_LATHE_START, + h.param(0), h.param(1), h.param(2), + NO_PARAM, NO_PARAM, NO_PARAM, NO_PARAM, + true, false); + + CopyEntity(entity, SK.GetEntity(he), 0, REMAP_LATHE_END, + h.param(0), h.param(1), h.param(2), + NO_PARAM, NO_PARAM, NO_PARAM, NO_PARAM, + true, false); + + MakeLatheCircles(entity, param, he, axis_pos, axis_dir, ai); + ai++; + } + break; + } + + case TRANSLATE: { + // The translation vector + AddParam(param, h.param(0), gp.x); + AddParam(param, h.param(1), gp.y); + AddParam(param, h.param(2), gp.z); + + int n = (int)valA, a0 = 0; + if(subtype == ONE_SIDED && skipFirst) { + a0++; n++; + } + + for(a = a0; a < n; a++) { + for(i = 0; i < entity->n; i++) { + Entity *e = &(entity->elem[i]); + if(e->group.v != opA.v) continue; + + e->CalculateNumerical(false); + CopyEntity(entity, e, + a*2 - (subtype == ONE_SIDED ? 0 : (n-1)), + (a == (n - 1)) ? REMAP_LAST : a, + h.param(0), h.param(1), h.param(2), + NO_PARAM, NO_PARAM, NO_PARAM, NO_PARAM, + true, false); + } + } + break; + } + case ROTATE: { + // The center of rotation + AddParam(param, h.param(0), gc.x); + AddParam(param, h.param(1), gc.y); + AddParam(param, h.param(2), gc.z); + // The rotation quaternion + AddParam(param, h.param(3), 30*PI/180); + AddParam(param, h.param(4), gn.x); + AddParam(param, h.param(5), gn.y); + AddParam(param, h.param(6), gn.z); + + int n = (int)valA, a0 = 0; + if(subtype == ONE_SIDED && skipFirst) { + a0++; n++; + } + + for(a = a0; a < n; a++) { + for(i = 0; i < entity->n; i++) { + Entity *e = &(entity->elem[i]); + if(e->group.v != opA.v) continue; + + e->CalculateNumerical(false); + CopyEntity(entity, e, + a*2 - (subtype == ONE_SIDED ? 0 : (n-1)), + (a == (n - 1)) ? REMAP_LAST : a, + h.param(0), h.param(1), h.param(2), + h.param(3), h.param(4), h.param(5), h.param(6), + false, true); + } + } + break; + } + case LINKED: + // The translation vector + AddParam(param, h.param(0), gp.x); + AddParam(param, h.param(1), gp.y); + AddParam(param, h.param(2), gp.z); + // The rotation quaternion + AddParam(param, h.param(3), 1); + AddParam(param, h.param(4), 0); + AddParam(param, h.param(5), 0); + AddParam(param, h.param(6), 0); + + for(i = 0; i < impEntity.n; i++) { + Entity *ie = &(impEntity.elem[i]); + CopyEntity(entity, ie, 0, 0, + h.param(0), h.param(1), h.param(2), + h.param(3), h.param(4), h.param(5), h.param(6), + false, false); + } + break; + + default: oops(); + } +} + +bool Group::IsSolvedOkay() { + return this->solved.how == System::SOLVED_OKAY || + (this->allowRedundant && this->solved.how == System::REDUNDANT_OKAY); +} + +void Group::AddEq(IdList *l, Expr *expr, int index) { + Equation eq; + eq.e = expr; + eq.h = h.equation(index); + l->Add(&eq); +} + +void Group::GenerateEquations(IdList *l) { + if(type == LINKED) { + // Normalize the quaternion + ExprQuaternion q = { + Expr::From(h.param(3)), + Expr::From(h.param(4)), + Expr::From(h.param(5)), + Expr::From(h.param(6)) }; + AddEq(l, (q.Magnitude())->Minus(Expr::From(1)), 0); + } else if(type == ROTATE) { + // The axis and center of rotation are specified numerically +#define EC(x) (Expr::From(x)) +#define EP(x) (Expr::From(h.param(x))) + ExprVector orig = SK.GetEntity(predef.origin)->PointGetExprs(); + AddEq(l, (orig.x)->Minus(EP(0)), 0); + AddEq(l, (orig.y)->Minus(EP(1)), 1); + AddEq(l, (orig.z)->Minus(EP(2)), 2); + // param 3 is the angle, which is free + Vector axis = SK.GetEntity(predef.entityB)->VectorGetNum(); + axis = axis.WithMagnitude(1); + AddEq(l, (EC(axis.x))->Minus(EP(4)), 3); + AddEq(l, (EC(axis.y))->Minus(EP(5)), 4); + AddEq(l, (EC(axis.z))->Minus(EP(6)), 5); +#undef EC +#undef EP + } else if(type == EXTRUDE) { + if(predef.entityB.v != Entity::FREE_IN_3D.v) { + // The extrusion path is locked along a line, normal to the + // specified workplane. + Entity *w = SK.GetEntity(predef.entityB); + ExprVector u = w->Normal()->NormalExprsU(); + ExprVector v = w->Normal()->NormalExprsV(); + ExprVector extruden = { + Expr::From(h.param(0)), + Expr::From(h.param(1)), + Expr::From(h.param(2)) }; + + AddEq(l, u.Dot(extruden), 0); + AddEq(l, v.Dot(extruden), 1); + } + } else if(type == TRANSLATE) { + if(predef.entityB.v != Entity::FREE_IN_3D.v) { + Entity *w = SK.GetEntity(predef.entityB); + ExprVector n = w->Normal()->NormalExprsN(); + ExprVector trans; + trans = ExprVector::From(h.param(0), h.param(1), h.param(2)); + + // The translation vector is parallel to the workplane + AddEq(l, trans.Dot(n), 0); + } + } +} + +hEntity Group::Remap(hEntity in, int copyNumber) { + // A hash table is used to accelerate the search + int hash = ((unsigned)(in.v*61 + copyNumber)) % REMAP_PRIME; + int i = remapCache[hash]; + if(i >= 0 && i < remap.n) { + EntityMap *em = &(remap.elem[i]); + if(em->input.v == in.v && em->copyNumber == copyNumber) { + return h.entity(em->h.v); + } + } + // but if we don't find it in the hash table, then linear search + for(i = 0; i < remap.n; i++) { + EntityMap *em = &(remap.elem[i]); + if(em->input.v == in.v && em->copyNumber == copyNumber) { + // We already have a mapping for this entity. + remapCache[hash] = i; + return h.entity(em->h.v); + } + } + // And if we still don't find it, then create a new entry. + EntityMap em; + em.input = in; + em.copyNumber = copyNumber; + remap.AddAndAssignId(&em); + return h.entity(em.h.v); +} + +void Group::MakeExtrusionLines(IdList *el, hEntity in) { + Entity *ep = SK.GetEntity(in); + + Entity en = {}; + if(ep->IsPoint()) { + // A point gets extruded to form a line segment + en.point[0] = Remap(ep->h, REMAP_TOP); + en.point[1] = Remap(ep->h, REMAP_BOTTOM); + en.group = h; + en.construction = ep->construction; + en.style = ep->style; + en.h = Remap(ep->h, REMAP_PT_TO_LINE); + en.type = Entity::LINE_SEGMENT; + el->Add(&en); + } else if(ep->type == Entity::LINE_SEGMENT) { + // A line gets extruded to form a plane face; an endpoint of the + // original line is a point in the plane, and the line is in the plane. + Vector a = SK.GetEntity(ep->point[0])->PointGetNum(); + Vector b = SK.GetEntity(ep->point[1])->PointGetNum(); + Vector ab = b.Minus(a); + + en.param[0] = h.param(0); + en.param[1] = h.param(1); + en.param[2] = h.param(2); + en.numPoint = a; + en.numNormal = Quaternion::From(0, ab.x, ab.y, ab.z); + + en.group = h; + en.construction = ep->construction; + en.style = ep->style; + en.h = Remap(ep->h, REMAP_LINE_TO_FACE); + en.type = Entity::FACE_XPROD; + el->Add(&en); + } +} + +void Group::MakeLatheCircles(IdList *el, IdList *param, hEntity in, Vector pt, Vector axis, int ai) { + Entity *ep = SK.GetEntity(in); + + Entity en = {}; + if(ep->IsPoint()) { + // A point gets revolved to form an arc. + en.point[0] = Remap(predef.origin, ai); + en.point[1] = Remap(ep->h, REMAP_LATHE_START); + en.point[2] = Remap(ep->h, REMAP_LATHE_END); + + // Get arc center and point on arc. + Entity *pc = SK.GetEntity(en.point[0]); + Entity *pp = SK.GetEntity(en.point[1]); + + // Project arc point to the revolution axis and use it for arc center. + double k = pp->numPoint.Minus(pt).Dot(axis) / axis.Dot(axis); + pc->numPoint = pt.Plus(axis.ScaledBy(k)); + + // Create arc entity. + en.group = h; + en.construction = ep->construction; + en.style = ep->style; + en.h = Remap(ep->h, REMAP_PT_TO_ARC); + en.type = Entity::ARC_OF_CIRCLE; + + // Generate a normal. + Entity n = {}; + n.workplane = en.workplane; + n.h = Remap(ep->h, REMAP_PT_TO_NORMAL); + n.group = en.group; + n.style = en.style; + n.type = Entity::NORMAL_N_COPY; + + // Create basis for the normal. + Vector nu = pp->numPoint.Minus(pc->numPoint).WithMagnitude(1.0); + Vector nv = nu.Cross(axis).WithMagnitude(1.0); + n.numNormal = Quaternion::From(nv, nu); + + // The point determines where the normal gets displayed on-screen; + // it's entirely cosmetic. + n.point[0] = en.point[0]; + el->Add(&n); + en.normal = n.h; + el->Add(&en); + } else if(ep->type == Entity::LINE_SEGMENT) { + // An axis-perpendicular line gets revolved to form a face. + Vector a = SK.GetEntity(ep->point[0])->PointGetNum(); + Vector b = SK.GetEntity(ep->point[1])->PointGetNum(); + Vector u = b.Minus(a).WithMagnitude(1.0); + + // Check for perpendicularity: calculate cosine of the angle + // between axis and line direction and check that + // cos(angle) == 0 <-> angle == +-90 deg. + if(fabs(u.Dot(axis) / axis.Magnitude()) < ANGLE_COS_EPS) { + en.param[0] = h.param(0); + en.param[1] = h.param(1); + en.param[2] = h.param(2); + Vector v = axis.Cross(u).WithMagnitude(1.0); + Vector n = u.Cross(v); + en.numNormal = Quaternion::From(0, n.x, n.y, n.z); + + en.group = h; + en.construction = ep->construction; + en.style = ep->style; + en.h = Remap(ep->h, REMAP_LINE_TO_FACE); + en.type = Entity::FACE_NORMAL_PT; + en.point[0] = ep->point[0]; + el->Add(&en); + } + } +} + +void Group::MakeExtrusionTopBottomFaces(IdList *el, hEntity pt) +{ + if(pt.v == 0) return; + Group *src = SK.GetGroup(opA); + Vector n = src->polyLoops.normal; + + Entity en = {}; + en.type = Entity::FACE_NORMAL_PT; + en.group = h; + + en.numNormal = Quaternion::From(0, n.x, n.y, n.z); + en.point[0] = Remap(pt, REMAP_TOP); + en.h = Remap(Entity::NO_ENTITY, REMAP_TOP); + el->Add(&en); + + en.point[0] = Remap(pt, REMAP_BOTTOM); + en.h = Remap(Entity::NO_ENTITY, REMAP_BOTTOM); + el->Add(&en); +} + +void Group::CopyEntity(IdList *el, + Entity *ep, int timesApplied, int remap, + hParam dx, hParam dy, hParam dz, + hParam qw, hParam qvx, hParam qvy, hParam qvz, + bool asTrans, bool asAxisAngle) +{ + Entity en = {}; + en.type = ep->type; + en.extraPoints = ep->extraPoints; + en.h = Remap(ep->h, remap); + en.timesApplied = timesApplied; + en.group = h; + en.construction = ep->construction; + en.style = ep->style; + en.str = ep->str; + en.font = ep->font; + + switch(ep->type) { + case Entity::WORKPLANE: + // Don't copy these. + return; + + case Entity::POINT_N_COPY: + case Entity::POINT_N_TRANS: + case Entity::POINT_N_ROT_TRANS: + case Entity::POINT_N_ROT_AA: + case Entity::POINT_IN_3D: + case Entity::POINT_IN_2D: + if(asTrans) { + en.type = Entity::POINT_N_TRANS; + en.param[0] = dx; + en.param[1] = dy; + en.param[2] = dz; + } else { + if(asAxisAngle) { + en.type = Entity::POINT_N_ROT_AA; + } else { + en.type = Entity::POINT_N_ROT_TRANS; + } + en.param[0] = dx; + en.param[1] = dy; + en.param[2] = dz; + en.param[3] = qw; + en.param[4] = qvx; + en.param[5] = qvy; + en.param[6] = qvz; + } + en.numPoint = (ep->actPoint).ScaledBy(scale); + break; + + case Entity::NORMAL_N_COPY: + case Entity::NORMAL_N_ROT: + case Entity::NORMAL_N_ROT_AA: + case Entity::NORMAL_IN_3D: + case Entity::NORMAL_IN_2D: + if(asTrans) { + en.type = Entity::NORMAL_N_COPY; + } else { + if(asAxisAngle) { + en.type = Entity::NORMAL_N_ROT_AA; + } else { + en.type = Entity::NORMAL_N_ROT; + } + en.param[0] = qw; + en.param[1] = qvx; + en.param[2] = qvy; + en.param[3] = qvz; + } + en.numNormal = ep->actNormal; + if(scale < 0) en.numNormal = en.numNormal.Mirror(); + + en.point[0] = Remap(ep->point[0], remap); + break; + + case Entity::DISTANCE_N_COPY: + case Entity::DISTANCE: + en.type = Entity::DISTANCE_N_COPY; + en.numDistance = ep->actDistance*fabs(scale); + break; + + case Entity::FACE_NORMAL_PT: + case Entity::FACE_XPROD: + case Entity::FACE_N_ROT_TRANS: + case Entity::FACE_N_TRANS: + case Entity::FACE_N_ROT_AA: + if(asTrans) { + en.type = Entity::FACE_N_TRANS; + en.param[0] = dx; + en.param[1] = dy; + en.param[2] = dz; + } else { + if(asAxisAngle) { + en.type = Entity::FACE_N_ROT_AA; + } else { + en.type = Entity::FACE_N_ROT_TRANS; + } + en.param[0] = dx; + en.param[1] = dy; + en.param[2] = dz; + en.param[3] = qw; + en.param[4] = qvx; + en.param[5] = qvy; + en.param[6] = qvz; + } + en.numPoint = (ep->actPoint).ScaledBy(scale); + en.numNormal = (ep->actNormal).ScaledBy(scale); + break; + + default: { + int i, points; + bool hasNormal, hasDistance; + EntReqTable::GetEntityInfo(ep->type, ep->extraPoints, + NULL, &points, &hasNormal, &hasDistance); + for(i = 0; i < points; i++) { + en.point[i] = Remap(ep->point[i], remap); + } + if(hasNormal) en.normal = Remap(ep->normal, remap); + if(hasDistance) en.distance = Remap(ep->distance, remap); + break; + } + } + + // If the entity came from an linked file where it was invisible then + // ep->actiVisble will be false, and we should hide it. Or if the entity + // came from a copy (e.g. step and repeat) of a force-hidden linked + // entity, then we also want to hide it. + en.forceHidden = (!ep->actVisible) || ep->forceHidden; + + el->Add(&en); +} + diff --git a/src/groupmesh.cpp b/src/groupmesh.cpp new file mode 100644 index 0000000..77130bc --- /dev/null +++ b/src/groupmesh.cpp @@ -0,0 +1,617 @@ +//----------------------------------------------------------------------------- +// Routines to generate our watertight brep shells from the operations +// and entities specified by the user in each group; templated to work either +// on an SShell of ratpoly surfaces or on an SMesh of triangles. +// +// Copyright 2008-2013 Jonathan Westhues. +//----------------------------------------------------------------------------- +#include "solvespace.h" + +#define gs (SS.GW.gs) + +void Group::AssembleLoops(bool *allClosed, + bool *allCoplanar, + bool *allNonZeroLen) +{ + SBezierList sbl = {}; + + int i; + for(i = 0; i < SK.entity.n; i++) { + Entity *e = &(SK.entity.elem[i]); + if(e->group.v != h.v) continue; + if(e->construction) continue; + if(e->forceHidden) continue; + + e->GenerateBezierCurves(&sbl); + } + + SBezier *sb; + *allNonZeroLen = true; + for(sb = sbl.l.First(); sb; sb = sbl.l.NextAfter(sb)) { + for(i = 1; i <= sb->deg; i++) { + if(!(sb->ctrl[i]).Equals(sb->ctrl[0])) { + break; + } + } + if(i > sb->deg) { + // This is a zero-length edge. + *allNonZeroLen = false; + polyError.errorPointAt = sb->ctrl[0]; + goto done; + } + } + + // Try to assemble all these Beziers into loops. The closed loops go into + // bezierLoops, with the outer loops grouped with their holes. The + // leftovers, if any, go in bezierOpens. + bezierLoops.FindOuterFacesFrom(&sbl, &polyLoops, NULL, + SS.ChordTolMm(), + allClosed, &(polyError.notClosedAt), + allCoplanar, &(polyError.errorPointAt), + &bezierOpens); + done: + sbl.Clear(); +} + +void Group::GenerateLoops(void) { + polyLoops.Clear(); + bezierLoops.Clear(); + bezierOpens.Clear(); + + if(type == DRAWING_3D || type == DRAWING_WORKPLANE || + type == ROTATE || type == TRANSLATE || type == LINKED) + { + bool allClosed = false, allCoplanar = false, allNonZeroLen = false; + AssembleLoops(&allClosed, &allCoplanar, &allNonZeroLen); + if(!allNonZeroLen) { + polyError.how = POLY_ZERO_LEN_EDGE; + } else if(!allCoplanar) { + polyError.how = POLY_NOT_COPLANAR; + } else if(!allClosed) { + polyError.how = POLY_NOT_CLOSED; + } else { + polyError.how = POLY_GOOD; + // The self-intersecting check is kind of slow, so don't run it + // unless requested. + if(SS.checkClosedContour) { + if(polyLoops.SelfIntersecting(&(polyError.errorPointAt))) { + polyError.how = POLY_SELF_INTERSECTING; + } + } + } + } +} + +void SShell::RemapFaces(Group *g, int remap) { + SSurface *ss; + for(ss = surface.First(); ss; ss = surface.NextAfter(ss)){ + hEntity face = { ss->face }; + if(face.v == Entity::NO_ENTITY.v) continue; + + face = g->Remap(face, remap); + ss->face = face.v; + } +} + +void SMesh::RemapFaces(Group *g, int remap) { + STriangle *tr; + for(tr = l.First(); tr; tr = l.NextAfter(tr)) { + hEntity face = { tr->meta.face }; + if(face.v == Entity::NO_ENTITY.v) continue; + + face = g->Remap(face, remap); + tr->meta.face = face.v; + } +} + +template +void Group::GenerateForStepAndRepeat(T *steps, T *outs) { + T workA, workB; + workA = {}; + workB = {}; + T *soFar = &workA, *scratch = &workB; + + int n = (int)valA, a0 = 0; + if(subtype == ONE_SIDED && skipFirst) { + a0++; n++; + } + int a; + for(a = a0; a < n; a++) { + int ap = a*2 - (subtype == ONE_SIDED ? 0 : (n-1)); + int remap = (a == (n - 1)) ? REMAP_LAST : a; + + T transd = {}; + if(type == TRANSLATE) { + Vector trans = Vector::From(h.param(0), h.param(1), h.param(2)); + trans = trans.ScaledBy(ap); + transd.MakeFromTransformationOf(steps, + trans, Quaternion::IDENTITY, 1.0); + } else { + Vector trans = Vector::From(h.param(0), h.param(1), h.param(2)); + double theta = ap * SK.GetParam(h.param(3))->val; + double c = cos(theta), s = sin(theta); + Vector axis = Vector::From(h.param(4), h.param(5), h.param(6)); + Quaternion q = Quaternion::From(c, s*axis.x, s*axis.y, s*axis.z); + // Rotation is centered at t; so A(x - t) + t = Ax + (t - At) + transd.MakeFromTransformationOf(steps, + trans.Minus(q.Rotate(trans)), q, 1.0); + } + + // We need to rewrite any plane face entities to the transformed ones. + transd.RemapFaces(this, remap); + + // And tack this transformed copy on to the return. + if(soFar->IsEmpty()) { + scratch->MakeFromCopyOf(&transd); + } else { + scratch->MakeFromUnionOf(soFar, &transd); + } + + swap(scratch, soFar); + scratch->Clear(); + transd.Clear(); + } + + outs->Clear(); + *outs = *soFar; +} + +template +void Group::GenerateForBoolean(T *prevs, T *thiss, T *outs, int how) { + // If this group contributes no new mesh, then our running mesh is the + // same as last time, no combining required. Likewise if we have a mesh + // but it's suppressed. + if(thiss->IsEmpty() || suppress) { + outs->MakeFromCopyOf(prevs); + return; + } + + // So our group's shell appears in thisShell. Combine this with the + // previous group's shell, using the requested operation. + if(how == COMBINE_AS_UNION) { + outs->MakeFromUnionOf(prevs, thiss); + } else if(how == COMBINE_AS_DIFFERENCE) { + outs->MakeFromDifferenceOf(prevs, thiss); + } else { + outs->MakeFromAssemblyOf(prevs, thiss); + } +} + +void Group::GenerateShellAndMesh(void) { + bool prevBooleanFailed = booleanFailed; + booleanFailed = false; + + Group *srcg = this; + + thisShell.Clear(); + thisMesh.Clear(); + runningShell.Clear(); + runningMesh.Clear(); + + // Don't attempt a lathe or extrusion unless the source section is good: + // planar and not self-intersecting. + bool haveSrc = true; + if(type == EXTRUDE || type == LATHE) { + Group *src = SK.GetGroup(opA); + if(src->polyError.how != POLY_GOOD) { + haveSrc = false; + } + } + + if(type == TRANSLATE || type == ROTATE) { + // A step and repeat gets merged against the group's prevous group, + // not our own previous group. + srcg = SK.GetGroup(opA); + + if(!srcg->suppress) { + GenerateForStepAndRepeat(&(srcg->thisShell), &thisShell); + GenerateForStepAndRepeat (&(srcg->thisMesh), &thisMesh); + } + } else if(type == EXTRUDE && haveSrc) { + Group *src = SK.GetGroup(opA); + Vector translate = Vector::From(h.param(0), h.param(1), h.param(2)); + + Vector tbot, ttop; + if(subtype == ONE_SIDED) { + tbot = Vector::From(0, 0, 0); ttop = translate.ScaledBy(2); + } else { + tbot = translate.ScaledBy(-1); ttop = translate.ScaledBy(1); + } + + SBezierLoopSetSet *sblss = &(src->bezierLoops); + SBezierLoopSet *sbls; + for(sbls = sblss->l.First(); sbls; sbls = sblss->l.NextAfter(sbls)) { + int is = thisShell.surface.n; + // Extrude this outer contour (plus its inner contours, if present) + thisShell.MakeFromExtrusionOf(sbls, tbot, ttop, color); + + // And for any plane faces, annotate the model with the entity for + // that face, so that the user can select them with the mouse. + Vector onOrig = sbls->point; + int i; + for(i = is; i < thisShell.surface.n; i++) { + SSurface *ss = &(thisShell.surface.elem[i]); + hEntity face = Entity::NO_ENTITY; + + Vector p = ss->PointAt(0, 0), + n = ss->NormalAt(0, 0).WithMagnitude(1); + double d = n.Dot(p); + + if(i == is || i == (is + 1)) { + // These are the top and bottom of the shell. + if(fabs((onOrig.Plus(ttop)).Dot(n) - d) < LENGTH_EPS) { + face = Remap(Entity::NO_ENTITY, REMAP_TOP); + ss->face = face.v; + } + if(fabs((onOrig.Plus(tbot)).Dot(n) - d) < LENGTH_EPS) { + face = Remap(Entity::NO_ENTITY, REMAP_BOTTOM); + ss->face = face.v; + } + continue; + } + + // So these are the sides + if(ss->degm != 1 || ss->degn != 1) continue; + + Entity *e; + for(e = SK.entity.First(); e; e = SK.entity.NextAfter(e)) { + if(e->group.v != opA.v) continue; + if(e->type != Entity::LINE_SEGMENT) continue; + + Vector a = SK.GetEntity(e->point[0])->PointGetNum(), + b = SK.GetEntity(e->point[1])->PointGetNum(); + a = a.Plus(ttop); + b = b.Plus(ttop); + // Could get taken backwards, so check all cases. + if((a.Equals(ss->ctrl[0][0]) && b.Equals(ss->ctrl[1][0])) || + (b.Equals(ss->ctrl[0][0]) && a.Equals(ss->ctrl[1][0])) || + (a.Equals(ss->ctrl[0][1]) && b.Equals(ss->ctrl[1][1])) || + (b.Equals(ss->ctrl[0][1]) && a.Equals(ss->ctrl[1][1]))) + { + face = Remap(e->h, REMAP_LINE_TO_FACE); + ss->face = face.v; + break; + } + } + } + } + } else if(type == LATHE && haveSrc) { + Group *src = SK.GetGroup(opA); + + Vector pt = SK.GetEntity(predef.origin)->PointGetNum(), + axis = SK.GetEntity(predef.entityB)->VectorGetNum(); + axis = axis.WithMagnitude(1); + + SBezierLoopSetSet *sblss = &(src->bezierLoops); + SBezierLoopSet *sbls; + for(sbls = sblss->l.First(); sbls; sbls = sblss->l.NextAfter(sbls)) { + thisShell.MakeFromRevolutionOf(sbls, pt, axis, color, this); + } + } else if(type == LINKED) { + // The imported shell or mesh are copied over, with the appropriate + // transformation applied. We also must remap the face entities. + Vector offset = { + SK.GetParam(h.param(0))->val, + SK.GetParam(h.param(1))->val, + SK.GetParam(h.param(2))->val }; + Quaternion q = { + SK.GetParam(h.param(3))->val, + SK.GetParam(h.param(4))->val, + SK.GetParam(h.param(5))->val, + SK.GetParam(h.param(6))->val }; + + thisMesh.MakeFromTransformationOf(&impMesh, offset, q, scale); + thisMesh.RemapFaces(this, 0); + + thisShell.MakeFromTransformationOf(&impShell, offset, q, scale); + thisShell.RemapFaces(this, 0); + } + + if(srcg->meshCombine != COMBINE_AS_ASSEMBLE) { + thisShell.MergeCoincidentSurfaces(); + } + + // So now we've got the mesh or shell for this group. Combine it with + // the previous group's mesh or shell with the requested Boolean, and + // we're done. + + Group *prevg = srcg->RunningMeshGroup(); + + if(prevg->runningMesh.IsEmpty() && thisMesh.IsEmpty() && !forceToMesh) { + SShell *prevs = &(prevg->runningShell); + GenerateForBoolean(prevs, &thisShell, &runningShell, + srcg->meshCombine); + + if(srcg->meshCombine != COMBINE_AS_ASSEMBLE) { + runningShell.MergeCoincidentSurfaces(); + } + + // If the Boolean failed, then we should note that in the text screen + // for this group. + booleanFailed = runningShell.booleanFailed; + if(booleanFailed != prevBooleanFailed) { + SS.ScheduleShowTW(); + } + } else { + SMesh prevm, thism; + prevm = {}; + thism = {}; + + prevm.MakeFromCopyOf(&(prevg->runningMesh)); + prevg->runningShell.TriangulateInto(&prevm); + + thism.MakeFromCopyOf(&thisMesh); + thisShell.TriangulateInto(&thism); + + SMesh outm = {}; + GenerateForBoolean(&prevm, &thism, &outm, srcg->meshCombine); + + // And make sure that the output mesh is vertex-to-vertex. + SKdNode *root = SKdNode::From(&outm); + root->SnapToMesh(&outm); + root->MakeMeshInto(&runningMesh); + + outm.Clear(); + thism.Clear(); + prevm.Clear(); + } + + displayDirty = true; +} + +void Group::GenerateDisplayItems(void) { + // This is potentially slow (since we've got to triangulate a shell, or + // to find the emphasized edges for a mesh), so we will run it only + // if its inputs have changed. + if(displayDirty) { + Group *pg = RunningMeshGroup(); + if(pg && thisMesh.IsEmpty() && thisShell.IsEmpty()) { + // We don't contribute any new solid model in this group, so our + // display items are identical to the previous group's; which means + // that we can just display those, and stop ourselves from + // recalculating for those every time we get a change in this group. + // + // Note that this can end up recursing multiple times (if multiple + // groups that contribute no solid model exist in sequence), but + // that's okay. + pg->GenerateDisplayItems(); + + displayMesh.Clear(); + displayMesh.MakeFromCopyOf(&(pg->displayMesh)); + + displayEdges.Clear(); + displayOutlines.Clear(); + if(SS.GW.showEdges) { + SEdge *se; + SEdgeList *src = &(pg->displayEdges); + for(se = src->l.First(); se; se = src->l.NextAfter(se)) { + displayEdges.l.Add(se); + } + displayOutlines.MakeFromCopyOf(&pg->displayOutlines); + } + } else { + // We do contribute new solid model, so we have to triangulate the + // shell, and edge-find the mesh. + displayMesh.Clear(); + runningShell.TriangulateInto(&displayMesh); + STriangle *t; + for(t = runningMesh.l.First(); t; t = runningMesh.l.NextAfter(t)) { + STriangle trn = *t; + Vector n = trn.Normal(); + trn.an = n; + trn.bn = n; + trn.cn = n; + displayMesh.AddTriangle(&trn); + } + + displayEdges.Clear(); + displayOutlines.Clear(); + + if(SS.GW.showEdges) { + if(runningMesh.l.n > 0) { + // Triangle mesh only; no shell or emphasized edges. + runningMesh.MakeCertainEdgesAndOutlinesInto( + &displayEdges, &displayOutlines, SKdNode::EMPHASIZED_EDGES); + } else { + displayMesh.MakeCertainEdgesAndOutlinesInto( + &displayEdges, &displayOutlines, SKdNode::SHARP_EDGES); + } + } + } + + displayDirty = false; + } +} + +Group *Group::PreviousGroup(void) { + int i; + for(i = 0; i < SK.groupOrder.n; i++) { + Group *g = SK.GetGroup(SK.groupOrder.elem[i]); + if(g->h.v == h.v) break; + } + if(i == 0 || i >= SK.groupOrder.n) return NULL; + return SK.GetGroup(SK.groupOrder.elem[i - 1]); +} + +Group *Group::RunningMeshGroup(void) { + if(type == TRANSLATE || type == ROTATE) { + return SK.GetGroup(opA)->RunningMeshGroup(); + } else { + return PreviousGroup(); + } +} + +bool Group::IsMeshGroup() { + switch(type) { + case Group::EXTRUDE: + case Group::LATHE: + case Group::ROTATE: + case Group::TRANSLATE: + return true; + } + return false; +} + +void Group::DrawDisplayItems(int t) { + RgbaColor specColor; + bool useSpecColor; + if(t == DRAWING_3D || t == DRAWING_WORKPLANE) { + // force the color to something dim + specColor = Style::Color(Style::DIM_SOLID); + useSpecColor = true; + } else { + useSpecColor = false; // use the model color + } + // The back faces are drawn in red; should never seem them, since we + // draw closed shells, so that's a debugging aid. + GLfloat mpb[] = { 1.0f, 0.1f, 0.1f, 1.0f }; + glMaterialfv(GL_BACK, GL_AMBIENT_AND_DIFFUSE, mpb); + + // When we fill the mesh, we need to know which triangles are selected + // or hovered, in order to draw them differently. + uint32_t mh = 0, ms1 = 0, ms2 = 0; + hEntity he = SS.GW.hover.entity; + if(he.v != 0 && SK.GetEntity(he)->IsFace()) { + mh = he.v; + } + SS.GW.GroupSelection(); + if(gs.faces > 0) ms1 = gs.face[0].v; + if(gs.faces > 1) ms2 = gs.face[1].v; + + if(SS.GW.showShaded || SS.GW.showHdnLines) { + if(SS.drawBackFaces && !displayMesh.isTransparent) { + // For debugging, draw the backs of the triangles in red, so that we + // notice when a shell is open + glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, 1); + } else { + glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, 0); + } + + // Draw the shaded solid into the depth buffer for hidden line removal, + // and if we're actually going to display it, to the color buffer too. + glEnable(GL_LIGHTING); + if(!SS.GW.showShaded) glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE); + ssglFillMesh(useSpecColor, specColor, &displayMesh, mh, ms1, ms2); + if(!SS.GW.showShaded) glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); + glDisable(GL_LIGHTING); + } + + if(SS.GW.showEdges) { + Vector projDir = SS.GW.projRight.Cross(SS.GW.projUp); + + glDepthMask(GL_FALSE); + if(SS.GW.showHdnLines) { + ssglDepthRangeOffset(0); + glDepthFunc(GL_GREATER); + ssglDrawEdges(&displayEdges, false, { Style::HIDDEN_EDGE }); + ssglDrawOutlines(&displayOutlines, projDir, { Style::HIDDEN_EDGE }); + glDepthFunc(GL_LEQUAL); + } + ssglDepthRangeOffset(2); + ssglDrawEdges(&displayEdges, false, { Style::SOLID_EDGE }); + if(SS.GW.showOutlines) { + ssglDrawOutlines(&displayOutlines, projDir, { Style::OUTLINE }); + } else { + ssglDrawOutlines(&displayOutlines, projDir, { Style::SOLID_EDGE }); + } + glDepthMask(GL_TRUE); + } + + if(SS.GW.showMesh) ssglDebugMesh(&displayMesh); +} + +void Group::Draw(void) { + // Everything here gets drawn whether or not the group is hidden; we + // can control this stuff independently, with show/hide solids, edges, + // mesh, etc. + + GenerateDisplayItems(); + DrawDisplayItems(type); + + if(!SS.checkClosedContour) return; + + // And finally show the polygons too, and any errors if it's not possible + // to assemble the lines into closed polygons. + if(polyError.how == POLY_NOT_CLOSED) { + // Report this error only in sketch-in-workplane groups; otherwise + // it's just a nuisance. + if(type == DRAWING_WORKPLANE) { + glDisable(GL_DEPTH_TEST); + ssglColorRGBa(Style::Color(Style::DRAW_ERROR), 0.2); + ssglLineWidth (Style::Width(Style::DRAW_ERROR)); + glBegin(GL_LINES); + ssglVertex3v(polyError.notClosedAt.a); + ssglVertex3v(polyError.notClosedAt.b); + glEnd(); + ssglColorRGB(Style::Color(Style::DRAW_ERROR)); + ssglWriteText("not closed contour, or not all same style!", + Style::DefaultTextHeight(), + polyError.notClosedAt.b, SS.GW.projRight, SS.GW.projUp, + NULL, NULL); + glEnable(GL_DEPTH_TEST); + } + } else if(polyError.how == POLY_NOT_COPLANAR || + polyError.how == POLY_SELF_INTERSECTING || + polyError.how == POLY_ZERO_LEN_EDGE) + { + // These errors occur at points, not lines + if(type == DRAWING_WORKPLANE) { + glDisable(GL_DEPTH_TEST); + ssglColorRGB(Style::Color(Style::DRAW_ERROR)); + const char *msg; + if(polyError.how == POLY_NOT_COPLANAR) { + msg = "points not all coplanar!"; + } else if(polyError.how == POLY_SELF_INTERSECTING) { + msg = "contour is self-intersecting!"; + } else { + msg = "zero-length edge!"; + } + ssglWriteText(msg, Style::DefaultTextHeight(), + polyError.errorPointAt, SS.GW.projRight, SS.GW.projUp, + NULL, NULL); + glEnable(GL_DEPTH_TEST); + } + } else { + // The contours will get filled in DrawFilledPaths. + } +} + +void Group::FillLoopSetAsPolygon(SBezierLoopSet *sbls) { + SPolygon sp = {}; + sbls->MakePwlInto(&sp); + ssglDepthRangeOffset(1); + ssglFillPolygon(&sp); + ssglDepthRangeOffset(0); + sp.Clear(); +} + +void Group::DrawFilledPaths(void) { + SBezierLoopSet *sbls; + SBezierLoopSetSet *sblss = &bezierLoops; + for(sbls = sblss->l.First(); sbls; sbls = sblss->l.NextAfter(sbls)) { + if(sbls->l.n == 0 || sbls->l.elem[0].l.n == 0) continue; + // In an assembled loop, all the styles should be the same; so doesn't + // matter which one we grab. + SBezier *sb = &(sbls->l.elem[0].l.elem[0]); + hStyle hs = { (uint32_t)sb->auxA }; + Style *s = Style::Get(hs); + if(s->filled) { + // This is a filled loop, where the user specified a fill color. + ssglColorRGBa(s->fillColor, 1); + FillLoopSetAsPolygon(sbls); + } else { + if(h.v == SS.GW.activeGroup.v && SS.checkClosedContour && + polyError.how == POLY_GOOD) + { + // If this is the active group, and we are supposed to check + // for closed contours, and we do indeed have a closed and + // non-intersecting contour, then fill it dimly. + ssglColorRGBa(Style::Color(Style::CONTOUR_FILL), 0.5); + ssglDepthRangeOffset(1); + FillLoopSetAsPolygon(sbls); + ssglDepthRangeOffset(0); + } + } + } +} + diff --git a/src/gtk/gtkmain.cpp b/src/gtk/gtkmain.cpp new file mode 100644 index 0000000..386e970 --- /dev/null +++ b/src/gtk/gtkmain.cpp @@ -0,0 +1,1611 @@ +//----------------------------------------------------------------------------- +// Our main() function, and GTK3-specific stuff to set up our windows and +// otherwise handle our interface to the operating system. Everything +// outside gtk/... should be standard C++ and OpenGL. +// +// Copyright 2015 +//----------------------------------------------------------------------------- +#include +#include +#include +#include + +#include + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#if HAVE_GTK3 +#include +#else +#include +#endif + +#include +#include +#include +#include + +#include + +#include "solvespace.h" +#include "config.h" +#include "../unix/gloffscreen.h" + +#ifdef HAVE_SPACEWARE +#include +#endif + +namespace SolveSpace { +/* Settings */ + +/* Why not just use GSettings? Two reasons. It doesn't allow to easily see + whether the setting had the default value, and it requires to install + a schema globally. */ +static json_object *settings = NULL; + +static std::string CnfPrepare() { + // Refer to http://standards.freedesktop.org/basedir-spec/latest/ + + std::string dir; + if(getenv("XDG_CONFIG_HOME")) { + dir = std::string(getenv("XDG_CONFIG_HOME")) + "/solvespace"; + } else if(getenv("HOME")) { + dir = std::string(getenv("HOME")) + "/.config/solvespace"; + } else { + dbp("neither XDG_CONFIG_HOME nor HOME are set"); + return ""; + } + + struct stat st; + if(stat(dir.c_str(), &st)) { + if(errno == ENOENT) { + if(mkdir(dir.c_str(), 0777)) { + dbp("cannot mkdir %s: %s", dir.c_str(), strerror(errno)); + return ""; + } + } else { + dbp("cannot stat %s: %s", dir.c_str(), strerror(errno)); + return ""; + } + } else if(!S_ISDIR(st.st_mode)) { + dbp("%s is not a directory", dir.c_str()); + return ""; + } + + return dir + "/settings.json"; +} + +static void CnfLoad() { + std::string path = CnfPrepare(); + if(path.empty()) + return; + + if(settings) + json_object_put(settings); // deallocate + + settings = json_object_from_file(path.c_str()); + if(!settings) { + if(errno != ENOENT) + dbp("cannot load settings: %s", strerror(errno)); + + settings = json_object_new_object(); + } +} + +static void CnfSave() { + std::string path = CnfPrepare(); + if(path.empty()) + return; + + /* json-c <0.12 has the first argument non-const here */ + if(json_object_to_file_ext((char*) path.c_str(), settings, JSON_C_TO_STRING_PRETTY)) + dbp("cannot save settings: %s", strerror(errno)); +} + +void CnfFreezeInt(uint32_t val, const std::string &key) { + struct json_object *jval = json_object_new_int(val); + json_object_object_add(settings, key.c_str(), jval); + CnfSave(); +} + +uint32_t CnfThawInt(uint32_t val, const std::string &key) { + struct json_object *jval; + if(json_object_object_get_ex(settings, key.c_str(), &jval)) + return json_object_get_int(jval); + else return val; +} + +void CnfFreezeFloat(float val, const std::string &key) { + struct json_object *jval = json_object_new_double(val); + json_object_object_add(settings, key.c_str(), jval); + CnfSave(); +} + +float CnfThawFloat(float val, const std::string &key) { + struct json_object *jval; + if(json_object_object_get_ex(settings, key.c_str(), &jval)) + return json_object_get_double(jval); + else return val; +} + +void CnfFreezeString(const std::string &val, const std::string &key) { + struct json_object *jval = json_object_new_string(val.c_str()); + json_object_object_add(settings, key.c_str(), jval); + CnfSave(); +} + +std::string CnfThawString(const std::string &val, const std::string &key) { + struct json_object *jval; + if(json_object_object_get_ex(settings, key.c_str(), &jval)) + return json_object_get_string(jval); + return val; +} + +static void CnfFreezeWindowPos(Gtk::Window *win, const std::string &key) { + int x, y, w, h; + win->get_position(x, y); + win->get_size(w, h); + + CnfFreezeInt(x, key + "_left"); + CnfFreezeInt(y, key + "_top"); + CnfFreezeInt(w, key + "_width"); + CnfFreezeInt(h, key + "_height"); +} + +static void CnfThawWindowPos(Gtk::Window *win, const std::string &key) { + int x, y, w, h; + win->get_position(x, y); + win->get_size(w, h); + + x = CnfThawInt(x, key + "_left"); + y = CnfThawInt(y, key + "_top"); + w = CnfThawInt(w, key + "_width"); + h = CnfThawInt(h, key + "_height"); + + win->move(x, y); + win->resize(w, h); +} + +/* Timers */ + +int64_t GetMilliseconds(void) { + struct timespec ts; + clock_gettime(CLOCK_MONOTONIC, &ts); + return 1000 * (uint64_t) ts.tv_sec + ts.tv_nsec / 1000000; +} + +static bool TimerCallback() { + SS.GW.TimerCallback(); + SS.TW.TimerCallback(); + return false; +} + +void SetTimerFor(int milliseconds) { + Glib::signal_timeout().connect(&TimerCallback, milliseconds); +} + +static bool AutosaveTimerCallback() { + SS.Autosave(); + return false; +} + +void SetAutosaveTimerFor(int minutes) { + Glib::signal_timeout().connect(&AutosaveTimerCallback, minutes * 60 * 1000); +} + +static bool LaterCallback() { + SS.DoLater(); + return false; +} + +void ScheduleLater() { + Glib::signal_idle().connect(&LaterCallback); +} + +/* GL wrapper */ + +#define GL_CHECK() \ + do { \ + int err = (int)glGetError(); \ + if(err) dbp("%s:%d: glGetError() == 0x%X %s", \ + __FILE__, __LINE__, err, gluErrorString(err)); \ + } while (0) + +class GlWidget : public Gtk::DrawingArea { +public: + GlWidget() : _offscreen(NULL) { + _xdisplay = gdk_x11_get_default_xdisplay(); + + int glxmajor, glxminor; + if(!glXQueryVersion(_xdisplay, &glxmajor, &glxminor)) { + dbp("OpenGL is not supported"); + oops(); + } + + if(glxmajor < 1 || (glxmajor == 1 && glxminor < 3)) { + dbp("GLX version %d.%d is too old; 1.3 required", glxmajor, glxminor); + oops(); + } + + static int fbconfig_attrs[] = { + GLX_RENDER_TYPE, GLX_RGBA_BIT, + GLX_RED_SIZE, 8, + GLX_GREEN_SIZE, 8, + GLX_BLUE_SIZE, 8, + GLX_DEPTH_SIZE, 24, + None + }; + int fbconfig_num = 0; + GLXFBConfig *fbconfigs = glXChooseFBConfig(_xdisplay, DefaultScreen(_xdisplay), + fbconfig_attrs, &fbconfig_num); + if(!fbconfigs || fbconfig_num == 0) + oops(); + + /* prefer FBConfigs with depth of 32; + * Mesa software rasterizer explodes with a BadMatch without this; + * without this, Intel on Mesa flickers horribly for some reason. + this does not seem to affect other rasterizers (ie NVidia). + + see this Mesa bug: + http://lists.freedesktop.org/archives/mesa-dev/2015-January/074693.html */ + GLXFBConfig fbconfig = fbconfigs[0]; + for(int i = 0; i < fbconfig_num; i++) { + XVisualInfo *visual_info = glXGetVisualFromFBConfig(_xdisplay, fbconfigs[i]); + /* some GL visuals, notably on Chromium GL, do not have an associated + X visual; this is not an obstacle as we always render offscreen. */ + if(!visual_info) continue; + int depth = visual_info->depth; + XFree(visual_info); + + if(depth == 32) { + fbconfig = fbconfigs[i]; + break; + } + } + + _glcontext = glXCreateNewContext(_xdisplay, + fbconfig, GLX_RGBA_TYPE, 0, True); + if(!_glcontext) { + dbp("cannot create OpenGL context"); + oops(); + } + + XFree(fbconfigs); + + /* create a dummy X window to create a rendering context against. + we could use a Pbuffer, but some implementations (Chromium GL) + don't support these. we could use an existing window, but + some implementations (Chromium GL... do you see a pattern?) + do really strange things, i.e. draw a black rectangle on + the very front of the desktop if you do this. */ + _xwindow = XCreateSimpleWindow(_xdisplay, + XRootWindow(_xdisplay, gdk_x11_get_default_screen()), + /*x*/ 0, /*y*/ 0, /*width*/ 1, /*height*/ 1, + /*border_width*/ 0, /*border*/ 0, /*background*/ 0); + } + + ~GlWidget() { + glXMakeCurrent(_xdisplay, None, NULL); + + XDestroyWindow(_xdisplay, _xwindow); + + delete _offscreen; + + glXDestroyContext(_xdisplay, _glcontext); + } + +protected: + /* Draw on a GLX framebuffer object, then read pixels out and draw them on + the Cairo context. Slower, but you get to overlay nice widgets. */ + virtual bool on_draw(const Cairo::RefPtr &cr) { + if(!glXMakeCurrent(_xdisplay, _xwindow, _glcontext)) + oops(); + + if(!_offscreen) + _offscreen = new GLOffscreen; + + Gdk::Rectangle allocation = get_allocation(); + if(!_offscreen->begin(allocation.get_width(), allocation.get_height())) + oops(); + + on_gl_draw(); + glFlush(); + GL_CHECK(); + + Cairo::RefPtr surface = Cairo::ImageSurface::create( + _offscreen->end(), Cairo::FORMAT_RGB24, + allocation.get_width(), allocation.get_height(), allocation.get_width() * 4); + cr->set_source(surface, 0, 0); + cr->paint(); + surface->finish(); + + return true; + } + +#ifdef HAVE_GTK2 + virtual bool on_expose_event(GdkEventExpose *) { + return on_draw(get_window()->create_cairo_context()); + } +#endif + + virtual void on_gl_draw() = 0; + +private: + Display *_xdisplay; + GLXContext _glcontext; + GLOffscreen *_offscreen; + ::Window _xwindow; +}; + +/* Editor overlay */ + +class EditorOverlay : public Gtk::Fixed { +public: + EditorOverlay(Gtk::Widget &underlay) : _underlay(underlay) { + set_size_request(0, 0); + + add(_underlay); + + _entry.set_no_show_all(true); + _entry.set_has_frame(false); + add(_entry); + + _entry.signal_activate(). + connect(sigc::mem_fun(this, &EditorOverlay::on_activate)); + } + + void start_editing(int x, int y, int font_height, bool is_monospace, int minWidthChars, + const std::string &val) { + Pango::FontDescription font_desc; + font_desc.set_family(is_monospace ? "monospace" : "normal"); + font_desc.set_absolute_size(font_height * Pango::SCALE); + +#ifdef HAVE_GTK3 + /* For some reason override_font doesn't take screen DPI into + account on GTK3 when working with font descriptors specified + in absolute sizes; modify_font does on GTK2. */ + Pango::FontDescription override_font_desc(font_desc); + double dpi = get_screen()->get_resolution(); + override_font_desc.set_size(font_height * 72.0 / dpi * Pango::SCALE); + _entry.override_font(override_font_desc); +#else + _entry.modify_font(font_desc); +#endif + + /* y coordinate denotes baseline */ + Pango::FontMetrics font_metrics = get_pango_context()->get_metrics(font_desc); + y -= font_metrics.get_ascent() / Pango::SCALE; + + Glib::RefPtr layout = Pango::Layout::create(get_pango_context()); + layout->set_font_description(font_desc); + layout->set_text(val + " "); /* avoid scrolling */ + int width = layout->get_logical_extents().get_width(); + +#ifdef HAVE_GTK3 + Gtk::Border border = _entry.get_style_context()->get_padding(); + move(_entry, x - border.get_left(), y - border.get_top()); + _entry.set_width_chars(minWidthChars); + _entry.set_size_request(width / Pango::SCALE, -1); +#else + /* We need _gtk_entry_effective_inner_border, but it's not + in the public API, so emulate its logic. */ + Gtk::Border border = { 2, 2, 2, 2 }, *style_border; + gtk_widget_style_get(GTK_WIDGET(_entry.gobj()), "inner-border", + &style_border, NULL); + if(style_border) border = *style_border; + move(_entry, x - border.left, y - border.top); + /* This is what set_width_chars does. */ + int minWidth = minWidthChars * std::max(font_metrics.get_approximate_digit_width(), + font_metrics.get_approximate_char_width()); + _entry.set_size_request(std::max(width, minWidth) / Pango::SCALE, -1); +#endif + + _entry.set_text(val); + if(!_entry.is_visible()) { + _entry.show(); + _entry.grab_focus(); + _entry.add_modal_grab(); + } + } + + void stop_editing() { + if(_entry.is_visible()) + _entry.remove_modal_grab(); + _entry.hide(); + } + + bool is_editing() const { + return _entry.is_visible(); + } + + sigc::signal signal_editing_done() { + return _signal_editing_done; + } + + Gtk::Entry &get_entry() { + return _entry; + } + +protected: + virtual bool on_key_press_event(GdkEventKey *event) { + if(event->keyval == GDK_KEY_Escape) { + stop_editing(); + return true; + } + + return false; + } + + virtual void on_size_allocate(Gtk::Allocation& allocation) { + Gtk::Fixed::on_size_allocate(allocation); + + _underlay.size_allocate(allocation); + } + + virtual void on_activate() { + _signal_editing_done(_entry.get_text()); + } + +private: + Gtk::Widget &_underlay; + Gtk::Entry _entry; + sigc::signal _signal_editing_done; +}; + +/* Graphics window */ + +int DeltaYOfScrollEvent(GdkEventScroll *event) { +#ifdef HAVE_GTK3 + int delta_y = event->delta_y; +#else + int delta_y = 0; +#endif + if(delta_y == 0) { + switch(event->direction) { + case GDK_SCROLL_UP: + delta_y = -1; + break; + + case GDK_SCROLL_DOWN: + delta_y = 1; + break; + + default: + /* do nothing */ + return false; + } + } + + return delta_y; +} + +class GraphicsWidget : public GlWidget { +public: + GraphicsWidget() { + set_events(Gdk::POINTER_MOTION_MASK | + Gdk::BUTTON_PRESS_MASK | Gdk::BUTTON_RELEASE_MASK | Gdk::BUTTON_MOTION_MASK | + Gdk::SCROLL_MASK | + Gdk::LEAVE_NOTIFY_MASK); + set_double_buffered(true); + } + +protected: + virtual bool on_configure_event(GdkEventConfigure *event) { + _w = event->width; + _h = event->height; + + return GlWidget::on_configure_event(event);; + } + + virtual void on_gl_draw() { + SS.GW.Paint(); + } + + virtual bool on_motion_notify_event(GdkEventMotion *event) { + int x, y; + ij_to_xy(event->x, event->y, x, y); + + SS.GW.MouseMoved(x, y, + event->state & GDK_BUTTON1_MASK, + event->state & GDK_BUTTON2_MASK, + event->state & GDK_BUTTON3_MASK, + event->state & GDK_SHIFT_MASK, + event->state & GDK_CONTROL_MASK); + + return true; + } + + virtual bool on_button_press_event(GdkEventButton *event) { + int x, y; + ij_to_xy(event->x, event->y, x, y); + + switch(event->button) { + case 1: + if(event->type == GDK_BUTTON_PRESS) + SS.GW.MouseLeftDown(x, y); + else if(event->type == GDK_2BUTTON_PRESS) + SS.GW.MouseLeftDoubleClick(x, y); + break; + + case 2: + case 3: + SS.GW.MouseMiddleOrRightDown(x, y); + break; + } + + return true; + } + + virtual bool on_button_release_event(GdkEventButton *event) { + int x, y; + ij_to_xy(event->x, event->y, x, y); + + switch(event->button) { + case 1: + SS.GW.MouseLeftUp(x, y); + break; + + case 3: + SS.GW.MouseRightUp(x, y); + break; + } + + return true; + } + + virtual bool on_scroll_event(GdkEventScroll *event) { + int x, y; + ij_to_xy(event->x, event->y, x, y); + + SS.GW.MouseScroll(x, y, -DeltaYOfScrollEvent(event)); + + return true; + } + + virtual bool on_leave_notify_event (GdkEventCrossing *) { + SS.GW.MouseLeave(); + + return true; + } + +private: + int _w, _h; + void ij_to_xy(int i, int j, int &x, int &y) { + // Convert to xy (vs. ij) style coordinates, + // with (0, 0) at center + x = i - _w / 2; + y = _h / 2 - j; + } +}; + +class GraphicsWindowGtk : public Gtk::Window { +public: + GraphicsWindowGtk() : _overlay(_widget), _is_fullscreen(false) { + set_default_size(900, 600); + + _box.pack_start(_menubar, false, true); + _box.pack_start(_overlay, true, true); + + add(_box); + + _overlay.signal_editing_done(). + connect(sigc::mem_fun(this, &GraphicsWindowGtk::on_editing_done)); + } + + GraphicsWidget &get_widget() { + return _widget; + } + + EditorOverlay &get_overlay() { + return _overlay; + } + + Gtk::MenuBar &get_menubar() { + return _menubar; + } + + bool is_fullscreen() const { + return _is_fullscreen; + } + + bool emulate_key_press(GdkEventKey *event) { + return on_key_press_event(event); + } + +protected: + virtual void on_show() { + Gtk::Window::on_show(); + + CnfThawWindowPos(this, "GraphicsWindow"); + } + + virtual void on_hide() { + CnfFreezeWindowPos(this, "GraphicsWindow"); + + Gtk::Window::on_hide(); + } + + virtual bool on_delete_event(GdkEventAny *) { + if(!SS.OkayToStartNewFile()) return true; + SS.Exit(); + + return true; + } + + virtual bool on_window_state_event(GdkEventWindowState *event) { + _is_fullscreen = event->new_window_state & GDK_WINDOW_STATE_FULLSCREEN; + + /* The event arrives too late for the caller of ToggleFullScreen + to notice state change; and it's possible that the WM will + refuse our request, so we can't just toggle the saved state */ + SS.GW.EnsureValidActives(); + + return Gtk::Window::on_window_state_event(event); + } + + virtual bool on_key_press_event(GdkEventKey *event) { + int chr; + + switch(event->keyval) { + case GDK_KEY_Escape: + chr = GraphicsWindow::ESCAPE_KEY; + break; + + case GDK_KEY_Delete: + chr = GraphicsWindow::DELETE_KEY; + break; + + case GDK_KEY_Tab: + chr = '\t'; + break; + + case GDK_KEY_BackSpace: + case GDK_KEY_Back: + chr = '\b'; + break; + + default: + if(event->keyval >= GDK_KEY_F1 && event->keyval <= GDK_KEY_F12) { + chr = GraphicsWindow::FUNCTION_KEY_BASE + (event->keyval - GDK_KEY_F1); + } else { + chr = gdk_keyval_to_unicode(event->keyval); + } + } + + if(event->state & GDK_SHIFT_MASK){ + chr |= GraphicsWindow::SHIFT_MASK; + } + if(event->state & GDK_CONTROL_MASK) { + chr |= GraphicsWindow::CTRL_MASK; + } + + if(chr && SS.GW.KeyDown(chr)) { + return true; + } + + if(chr == '\t') { + // Workaround for https://bugzilla.gnome.org/show_bug.cgi?id=123994. + GraphicsWindow::MenuView(GraphicsWindow::MNU_SHOW_TEXT_WND); + return true; + } + + return Gtk::Window::on_key_press_event(event); + } + + virtual void on_editing_done(Glib::ustring value) { + SS.GW.EditControlDone(value.c_str()); + } + +private: + GraphicsWidget _widget; + EditorOverlay _overlay; + Gtk::MenuBar _menubar; + Gtk::VBox _box; + + bool _is_fullscreen; +}; + +std::unique_ptr GW; + +void GetGraphicsWindowSize(int *w, int *h) { + Gdk::Rectangle allocation = GW->get_widget().get_allocation(); + *w = allocation.get_width(); + *h = allocation.get_height(); +} + +void InvalidateGraphics(void) { + GW->get_widget().queue_draw(); +} + +void PaintGraphics(void) { + GW->get_widget().queue_draw(); + /* Process animation */ + Glib::MainContext::get_default()->iteration(false); +} + +void SetCurrentFilename(const std::string &filename) { + if(!filename.empty()) { + GW->set_title("SolveSpace - " + filename); + } else { + GW->set_title("SolveSpace - (not yet saved)"); + } +} + +void ToggleFullScreen(void) { + if(GW->is_fullscreen()) + GW->unfullscreen(); + else + GW->fullscreen(); +} + +bool FullScreenIsActive(void) { + return GW->is_fullscreen(); +} + +void ShowGraphicsEditControl(int x, int y, int fontHeight, int minWidthChars, + const std::string &val) { + Gdk::Rectangle rect = GW->get_widget().get_allocation(); + + // Convert to ij (vs. xy) style coordinates, + // and compensate for the input widget height due to inverse coord + int i, j; + i = x + rect.get_width() / 2; + j = -y + rect.get_height() / 2; + + GW->get_overlay().start_editing(i, j, fontHeight, /*is_monospace=*/false, minWidthChars, val); +} + +void HideGraphicsEditControl(void) { + GW->get_overlay().stop_editing(); +} + +bool GraphicsEditControlIsVisible(void) { + return GW->get_overlay().is_editing(); +} + +/* TODO: removing menubar breaks accelerators. */ +void ToggleMenuBar(void) { + GW->get_menubar().set_visible(!GW->get_menubar().is_visible()); +} + +bool MenuBarIsVisible(void) { + return GW->get_menubar().is_visible(); +} + +/* Context menus */ + +class ContextMenuItem : public Gtk::MenuItem { +public: + static int choice; + + ContextMenuItem(const Glib::ustring &label, int id, bool mnemonic=false) : + Gtk::MenuItem(label, mnemonic), _id(id) { + } + +protected: + virtual void on_activate() { + Gtk::MenuItem::on_activate(); + + if(has_submenu()) + return; + + choice = _id; + } + + /* Workaround for https://bugzilla.gnome.org/show_bug.cgi?id=695488. + This is used in addition to on_activate() to catch mouse events. + Without on_activate(), it would be impossible to select a menu item + via keyboard. + This selects the item twice in some cases, but we are idempotent. + */ + virtual bool on_button_press_event(GdkEventButton *event) { + if(event->button == 1 && event->type == GDK_BUTTON_PRESS) { + on_activate(); + return true; + } + + return Gtk::MenuItem::on_button_press_event(event); + } + +private: + int _id; +}; + +int ContextMenuItem::choice = 0; + +static Gtk::Menu *context_menu = NULL, *context_submenu = NULL; + +void AddContextMenuItem(const char *label, int id) { + Gtk::MenuItem *menu_item; + if(label) + menu_item = new ContextMenuItem(label, id); + else + menu_item = new Gtk::SeparatorMenuItem(); + + if(id == CONTEXT_SUBMENU) { + menu_item->set_submenu(*context_submenu); + context_submenu = NULL; + } + + if(context_submenu) { + context_submenu->append(*menu_item); + } else { + if(!context_menu) + context_menu = new Gtk::Menu; + + context_menu->append(*menu_item); + } +} + +void CreateContextSubmenu(void) { + if(context_submenu) oops(); + + context_submenu = new Gtk::Menu; +} + +int ShowContextMenu(void) { + if(!context_menu) + return -1; + + Glib::RefPtr loop = Glib::MainLoop::create(); + context_menu->signal_deactivate(). + connect(sigc::mem_fun(loop.operator->(), &Glib::MainLoop::quit)); + + ContextMenuItem::choice = -1; + + context_menu->show_all(); + context_menu->popup(3, GDK_CURRENT_TIME); + + loop->run(); + + delete context_menu; + context_menu = NULL; + + return ContextMenuItem::choice; +} + +/* Main menu */ + +template class MainMenuItem : public MenuItem { +public: + MainMenuItem(const GraphicsWindow::MenuEntry &entry) : + MenuItem(), _entry(entry), _synthetic(false) { + Glib::ustring label(_entry.label); + for(size_t i = 0; i < label.length(); i++) { + if(label[i] == '&') + label.replace(i, 1, "_"); + } + + guint accel_key = 0; + Gdk::ModifierType accel_mods = Gdk::ModifierType(); + switch(_entry.accel) { + case GraphicsWindow::DELETE_KEY: + accel_key = GDK_KEY_Delete; + break; + + case GraphicsWindow::ESCAPE_KEY: + accel_key = GDK_KEY_Escape; + break; + + case '\t': + accel_key = GDK_KEY_Tab; + break; + + default: + accel_key = _entry.accel & ~(GraphicsWindow::SHIFT_MASK | GraphicsWindow::CTRL_MASK); + if(accel_key > GraphicsWindow::FUNCTION_KEY_BASE && + accel_key <= GraphicsWindow::FUNCTION_KEY_BASE + 12) + accel_key = GDK_KEY_F1 + (accel_key - GraphicsWindow::FUNCTION_KEY_BASE - 1); + else + accel_key = gdk_unicode_to_keyval(accel_key); + + if(_entry.accel & GraphicsWindow::SHIFT_MASK) + accel_mods |= Gdk::SHIFT_MASK; + if(_entry.accel & GraphicsWindow::CTRL_MASK) + accel_mods |= Gdk::CONTROL_MASK; + } + + MenuItem::set_label(label); + MenuItem::set_use_underline(true); + if(!(accel_key & 0x01000000)) + MenuItem::set_accel_key(Gtk::AccelKey(accel_key, accel_mods)); + } + + void set_active(bool checked) { + if(MenuItem::get_active() == checked) + return; + + _synthetic = true; + MenuItem::set_active(checked); + } + +protected: + virtual void on_activate() { + MenuItem::on_activate(); + + if(_synthetic) + _synthetic = false; + else if(!MenuItem::has_submenu() && _entry.fn) + _entry.fn(_entry.id); + } + +private: + const GraphicsWindow::MenuEntry &_entry; + bool _synthetic; +}; + +static std::map main_menu_items; + +static void InitMainMenu(Gtk::MenuShell *menu_shell) { + Gtk::MenuItem *menu_item = NULL; + Gtk::MenuShell *levels[5] = {menu_shell, 0}; + + const GraphicsWindow::MenuEntry *entry = &GraphicsWindow::menu[0]; + int current_level = 0; + while(entry->level >= 0) { + if(entry->level > current_level) { + Gtk::Menu *menu = new Gtk::Menu; + menu_item->set_submenu(*menu); + + if((unsigned)entry->level >= sizeof(levels) / sizeof(levels[0])) + oops(); + + levels[entry->level] = menu; + } + + current_level = entry->level; + + if(entry->label) { + switch(entry->kind) { + case GraphicsWindow::MENU_ITEM_NORMAL: + menu_item = new MainMenuItem(*entry); + break; + + case GraphicsWindow::MENU_ITEM_CHECK: + menu_item = new MainMenuItem(*entry); + break; + + case GraphicsWindow::MENU_ITEM_RADIO: + MainMenuItem *radio_item = + new MainMenuItem(*entry); + radio_item->set_draw_as_radio(true); + menu_item = radio_item; + break; + } + } else { + menu_item = new Gtk::SeparatorMenuItem(); + } + + levels[entry->level]->append(*menu_item); + + main_menu_items[entry->id] = menu_item; + + ++entry; + } +} + +void EnableMenuById(int id, bool enabled) { + main_menu_items[id]->set_sensitive(enabled); +} + +void CheckMenuById(int id, bool checked) { + ((MainMenuItem*)main_menu_items[id])->set_active(checked); +} + +void RadioMenuById(int id, bool selected) { + SolveSpace::CheckMenuById(id, selected); +} + +class RecentMenuItem : public Gtk::MenuItem { +public: + RecentMenuItem(const Glib::ustring& label, int id) : + MenuItem(label), _id(id) { + } + +protected: + virtual void on_activate() { + if(_id >= RECENT_OPEN && _id < (RECENT_OPEN + MAX_RECENT)) + SolveSpaceUI::MenuFile(_id); + else if(_id >= RECENT_LINK && _id < (RECENT_LINK + MAX_RECENT)) + Group::MenuGroup(_id); + } + +private: + int _id; +}; + +static void RefreshRecentMenu(int id, int base) { + Gtk::MenuItem *recent = static_cast(main_menu_items[id]); + recent->unset_submenu(); + + Gtk::Menu *menu = new Gtk::Menu; + recent->set_submenu(*menu); + + if(std::string(RecentFile[0]).empty()) { + Gtk::MenuItem *placeholder = new Gtk::MenuItem("(no recent files)"); + placeholder->set_sensitive(false); + menu->append(*placeholder); + } else { + for(int i = 0; i < MAX_RECENT; i++) { + if(std::string(RecentFile[i]).empty()) + break; + + RecentMenuItem *item = new RecentMenuItem(RecentFile[i], base + i); + menu->append(*item); + } + } + + menu->show_all(); +} + +void RefreshRecentMenus(void) { + RefreshRecentMenu(GraphicsWindow::MNU_OPEN_RECENT, RECENT_OPEN); + RefreshRecentMenu(GraphicsWindow::MNU_GROUP_RECENT, RECENT_LINK); +} + +/* Save/load */ + +static std::string ConvertFilters(std::string active, const FileFilter ssFilters[], + Gtk::FileChooser *chooser) { + for(const FileFilter *ssFilter = ssFilters; ssFilter->name; ssFilter++) { +#ifdef HAVE_GTK3 + Glib::RefPtr filter = Gtk::FileFilter::create(); +#else + Gtk::FileFilter *filter = new Gtk::FileFilter; +#endif + filter->set_name(ssFilter->name); + + bool is_active = false; + std::string desc = ""; + for(const char *const *ssPattern = ssFilter->patterns; *ssPattern; ssPattern++) { + std::string pattern = "*." + std::string(*ssPattern); + filter->add_pattern(pattern); + filter->add_pattern(Glib::ustring(pattern).uppercase()); + if(active == "") + active = pattern.substr(2); + if("*." + active == pattern) + is_active = true; + if(desc == "") + desc = pattern; + else + desc += ", " + pattern; + } + filter->set_name(filter->get_name() + " (" + desc + ")"); + +#ifdef HAVE_GTK3 + chooser->add_filter(filter); + if(is_active) + chooser->set_filter(filter); +#else + chooser->add_filter(*filter); + if(is_active) + chooser->set_filter(*filter); +#endif + } + + return active; +} + +bool GetOpenFile(std::string *filename, const std::string &activeOrEmpty, + const FileFilter filters[]) { + Gtk::FileChooserDialog chooser(*GW, "SolveSpace - Open File"); + chooser.set_filename(*filename); + chooser.add_button("_Cancel", Gtk::RESPONSE_CANCEL); + chooser.add_button("_Open", Gtk::RESPONSE_OK); + chooser.set_current_folder(CnfThawString("", "FileChooserPath")); + + ConvertFilters(activeOrEmpty, filters, &chooser); + + if(chooser.run() == Gtk::RESPONSE_OK) { + CnfFreezeString(chooser.get_current_folder(), "FileChooserPath"); + *filename = chooser.get_filename(); + return true; + } else { + return false; + } +} + +/* Glib::path_get_basename got /removed/ in 3.0?! Come on */ +static std::string Basename(std::string filename) { + int slash = filename.rfind('/'); + if(slash >= 0) + return filename.substr(slash + 1, filename.length()); + return ""; +} + +static void ChooserFilterChanged(Gtk::FileChooserDialog *chooser) +{ + /* Extract the pattern from the filter. GtkFileFilter doesn't provide + any way to list the patterns, so we extract it from the filter name. + Gross. */ + std::string filter_name = chooser->get_filter()->get_name(); + int lparen = filter_name.rfind('(') + 1; + int rdelim = filter_name.find(',', lparen); + if(rdelim < 0) + rdelim = filter_name.find(')', lparen); + if(lparen < 0 || rdelim < 0) + oops(); + + std::string extension = filter_name.substr(lparen, rdelim - lparen); + if(extension == "*") + return; + + if(extension.length() > 2 && extension.substr(0, 2) == "*.") + extension = extension.substr(2, extension.length() - 2); + + std::string basename = Basename(chooser->get_filename()); + int dot = basename.rfind('.'); + if(dot >= 0) { + basename.replace(dot + 1, basename.length() - dot - 1, extension); + chooser->set_current_name(basename); + } else { + chooser->set_current_name(basename + "." + extension); + } +} + +bool GetSaveFile(std::string *filename, const std::string &activeOrEmpty, + const FileFilter filters[]) { + Gtk::FileChooserDialog chooser(*GW, "SolveSpace - Save File", + Gtk::FILE_CHOOSER_ACTION_SAVE); + chooser.set_do_overwrite_confirmation(true); + chooser.add_button("_Cancel", Gtk::RESPONSE_CANCEL); + chooser.add_button("_Save", Gtk::RESPONSE_OK); + + std::string active = ConvertFilters(activeOrEmpty, filters, &chooser); + + chooser.set_current_folder(CnfThawString("", "FileChooserPath")); + chooser.set_current_name(std::string("untitled.") + active); + + /* Gtk's dialog doesn't change the extension when you change the filter, + and makes it extremely hard to do so. Gtk is garbage. */ + chooser.property_filter().signal_changed(). + connect(sigc::bind(sigc::ptr_fun(&ChooserFilterChanged), &chooser)); + + if(chooser.run() == Gtk::RESPONSE_OK) { + CnfFreezeString(chooser.get_current_folder(), "FileChooserPath"); + *filename = chooser.get_filename(); + return true; + } else { + return false; + } +} + +DialogChoice SaveFileYesNoCancel(void) { + Glib::ustring message = + "The file has changed since it was last saved.\n" + "Do you want to save the changes?"; + Gtk::MessageDialog dialog(*GW, message, /*use_markup*/ true, Gtk::MESSAGE_QUESTION, + Gtk::BUTTONS_NONE, /*is_modal*/ true); + dialog.set_title("SolveSpace - Modified File"); + dialog.add_button("_Save", Gtk::RESPONSE_YES); + dialog.add_button("Do_n't Save", Gtk::RESPONSE_NO); + dialog.add_button("_Cancel", Gtk::RESPONSE_CANCEL); + + switch(dialog.run()) { + case Gtk::RESPONSE_YES: + return DIALOG_YES; + + case Gtk::RESPONSE_NO: + return DIALOG_NO; + + case Gtk::RESPONSE_CANCEL: + default: + return DIALOG_CANCEL; + } +} + +DialogChoice LoadAutosaveYesNo(void) { + Glib::ustring message = + "An autosave file is availible for this project.\n" + "Do you want to load the autosave file instead?"; + Gtk::MessageDialog dialog(*GW, message, /*use_markup*/ true, Gtk::MESSAGE_QUESTION, + Gtk::BUTTONS_NONE, /*is_modal*/ true); + dialog.set_title("SolveSpace - Autosave Available"); + dialog.add_button("_Load autosave", Gtk::RESPONSE_YES); + dialog.add_button("Do_n't Load", Gtk::RESPONSE_NO); + + switch(dialog.run()) { + case Gtk::RESPONSE_YES: + return DIALOG_YES; + + case Gtk::RESPONSE_NO: + default: + return DIALOG_NO; + } +} + +DialogChoice LocateImportedFileYesNoCancel(const std::string &filename, + bool canCancel) { + Glib::ustring message = + "The linked file " + filename + " is not present.\n" + "Do you want to locate it manually?\n" + "If you select \"No\", any geometry that depends on " + "the missing file will be removed."; + Gtk::MessageDialog dialog(*GW, message, /*use_markup*/ true, Gtk::MESSAGE_QUESTION, + Gtk::BUTTONS_NONE, /*is_modal*/ true); + dialog.set_title("SolveSpace - Missing File"); + dialog.add_button("_Yes", Gtk::RESPONSE_YES); + dialog.add_button("_No", Gtk::RESPONSE_NO); + if(canCancel) + dialog.add_button("_Cancel", Gtk::RESPONSE_CANCEL); + + switch(dialog.run()) { + case Gtk::RESPONSE_YES: + return DIALOG_YES; + + case Gtk::RESPONSE_NO: + return DIALOG_NO; + + case Gtk::RESPONSE_CANCEL: + default: + return DIALOG_CANCEL; + } +} + +/* Text window */ + +class TextWidget : public GlWidget { +public: +#ifdef HAVE_GTK3 + TextWidget(Glib::RefPtr adjustment) : _adjustment(adjustment) { +#else + TextWidget(Gtk::Adjustment* adjustment) : _adjustment(adjustment) { +#endif + set_events(Gdk::POINTER_MOTION_MASK | Gdk::BUTTON_PRESS_MASK | Gdk::SCROLL_MASK | + Gdk::LEAVE_NOTIFY_MASK); + } + + void set_cursor_hand(bool is_hand) { + Glib::RefPtr gdkwin = get_window(); + if(gdkwin) { // returns NULL if not realized + Gdk::CursorType type = is_hand ? Gdk::HAND1 : Gdk::ARROW; +#ifdef HAVE_GTK3 + gdkwin->set_cursor(Gdk::Cursor::create(type)); +#else + gdkwin->set_cursor(Gdk::Cursor(type)); +#endif + } + } + +protected: + virtual void on_gl_draw() { + SS.TW.Paint(); + } + + virtual bool on_motion_notify_event(GdkEventMotion *event) { + SS.TW.MouseEvent(/*leftClick*/ false, + /*leftDown*/ event->state & GDK_BUTTON1_MASK, + event->x, event->y); + + return true; + } + + virtual bool on_button_press_event(GdkEventButton *event) { + SS.TW.MouseEvent(/*leftClick*/ event->type == GDK_BUTTON_PRESS, + /*leftDown*/ event->state & GDK_BUTTON1_MASK, + event->x, event->y); + + return true; + } + + virtual bool on_scroll_event(GdkEventScroll *event) { + _adjustment->set_value(_adjustment->get_value() + + DeltaYOfScrollEvent(event) * _adjustment->get_page_increment()); + + return true; + } + + virtual bool on_leave_notify_event (GdkEventCrossing *) { + SS.TW.MouseLeave(); + + return true; + } + +private: +#ifdef HAVE_GTK3 + Glib::RefPtr _adjustment; +#else + Gtk::Adjustment *_adjustment; +#endif +}; + +class TextWindowGtk : public Gtk::Window { +public: + TextWindowGtk() : _scrollbar(), _widget(_scrollbar.get_adjustment()), + _overlay(_widget), _box() { + set_type_hint(Gdk::WINDOW_TYPE_HINT_UTILITY); + set_skip_taskbar_hint(true); + set_skip_pager_hint(true); + set_title("SolveSpace - Property Browser"); + set_default_size(420, 300); + + _box.pack_start(_overlay, true, true); + _box.pack_start(_scrollbar, false, true); + add(_box); + + _scrollbar.get_adjustment()->signal_value_changed(). + connect(sigc::mem_fun(this, &TextWindowGtk::on_scrollbar_value_changed)); + + _overlay.signal_editing_done(). + connect(sigc::mem_fun(this, &TextWindowGtk::on_editing_done)); + + _overlay.get_entry().signal_motion_notify_event(). + connect(sigc::mem_fun(this, &TextWindowGtk::on_editor_motion_notify_event)); + _overlay.get_entry().signal_button_press_event(). + connect(sigc::mem_fun(this, &TextWindowGtk::on_editor_button_press_event)); + } + + Gtk::VScrollbar &get_scrollbar() { + return _scrollbar; + } + + TextWidget &get_widget() { + return _widget; + } + + EditorOverlay &get_overlay() { + return _overlay; + } + +protected: + virtual void on_show() { + Gtk::Window::on_show(); + + CnfThawWindowPos(this, "TextWindow"); + } + + virtual void on_hide() { + CnfFreezeWindowPos(this, "TextWindow"); + + Gtk::Window::on_hide(); + } + + virtual bool on_delete_event(GdkEventAny *) { + /* trigger the action and ignore the request */ + GraphicsWindow::MenuView(GraphicsWindow::MNU_SHOW_TEXT_WND); + + return false; + } + + virtual void on_scrollbar_value_changed() { + SS.TW.ScrollbarEvent(_scrollbar.get_adjustment()->get_value()); + } + + virtual void on_editing_done(Glib::ustring value) { + SS.TW.EditControlDone(value.c_str()); + } + + virtual bool on_editor_motion_notify_event(GdkEventMotion *event) { + return _widget.event((GdkEvent*) event); + } + + virtual bool on_editor_button_press_event(GdkEventButton *event) { + return _widget.event((GdkEvent*) event); + } + + virtual bool on_key_press_event(GdkEventKey *event) { + if(GW->emulate_key_press(event)) { + return true; + } + + return Gtk::Window::on_key_press_event(event); + } + +private: + Gtk::VScrollbar _scrollbar; + TextWidget _widget; + EditorOverlay _overlay; + Gtk::HBox _box; +}; + +std::unique_ptr TW; + +void ShowTextWindow(bool visible) { + if(visible) + TW->show(); + else + TW->hide(); +} + +void GetTextWindowSize(int *w, int *h) { + Gdk::Rectangle allocation = TW->get_widget().get_allocation(); + *w = allocation.get_width(); + *h = allocation.get_height(); +} + +void InvalidateText(void) { + TW->get_widget().queue_draw(); +} + +void MoveTextScrollbarTo(int pos, int maxPos, int page) { + TW->get_scrollbar().get_adjustment()->configure(pos, 0, maxPos, 1, 10, page); +} + +void SetMousePointerToHand(bool is_hand) { + TW->get_widget().set_cursor_hand(is_hand); +} + +void ShowTextEditControl(int x, int y, const std::string &val) { + TW->get_overlay().start_editing(x, y, TextWindow::CHAR_HEIGHT, /*is_monospace=*/true, 30, val); +} + +void HideTextEditControl(void) { + TW->get_overlay().stop_editing(); +} + +bool TextEditControlIsVisible(void) { + return TW->get_overlay().is_editing(); +} + +/* Miscellanea */ + + +void DoMessageBox(const char *message, int rows, int cols, bool error) { + Gtk::MessageDialog dialog(*GW, message, /*use_markup*/ true, + error ? Gtk::MESSAGE_ERROR : Gtk::MESSAGE_INFO, Gtk::BUTTONS_OK, + /*is_modal*/ true); + dialog.set_title(error ? "SolveSpace - Error" : "SolveSpace - Message"); + dialog.run(); +} + +void OpenWebsite(const char *url) { + gtk_show_uri(Gdk::Screen::get_default()->gobj(), url, GDK_CURRENT_TIME, NULL); +} + +/* fontconfig is already initialized by GTK */ +std::vector GetFontFiles() { + std::vector fonts; + + FcPattern *pat = FcPatternCreate(); + FcObjectSet *os = FcObjectSetBuild(FC_FILE, (char *)0); + FcFontSet *fs = FcFontList(0, pat, os); + + for(int i = 0; i < fs->nfont; i++) { + FcChar8 *filenameFC = FcPatternFormat(fs->fonts[i], (const FcChar8*) "%{file}"); + std::string filename = (char*) filenameFC; + fonts.push_back(filename); + FcStrFree(filenameFC); + } + + FcFontSetDestroy(fs); + FcObjectSetDestroy(os); + FcPatternDestroy(pat); + + return fonts; +} + +/* Space Navigator support */ + +#ifdef HAVE_SPACEWARE +static GdkFilterReturn GdkSpnavFilter(GdkXEvent *gxevent, GdkEvent *, gpointer) { + XEvent *xevent = (XEvent*) gxevent; + + spnav_event sev; + if(!spnav_x11_event(xevent, &sev)) + return GDK_FILTER_CONTINUE; + + switch(sev.type) { + case SPNAV_EVENT_MOTION: + SS.GW.SpaceNavigatorMoved( + (double)sev.motion.x, + (double)sev.motion.y, + (double)sev.motion.z * -1.0, + (double)sev.motion.rx * 0.001, + (double)sev.motion.ry * 0.001, + (double)sev.motion.rz * -0.001, + xevent->xmotion.state & ShiftMask); + break; + + case SPNAV_EVENT_BUTTON: + if(!sev.button.press && sev.button.bnum == 0) { + SS.GW.SpaceNavigatorButtonUp(); + } + break; + } + + return GDK_FILTER_REMOVE; +} +#endif + +/* Application lifecycle */ + +void ExitNow(void) { + GW->hide(); + TW->hide(); +} +}; + +int main(int argc, char** argv) { + /* It would in principle be possible to judiciously use + Glib::filename_{from,to}_utf8, but it's not really worth + the effort. + The setlocale() call is necessary for Glib::get_charset() + to detect the system character set; otherwise it thinks + it is always ANSI_X3.4-1968. + We set it back to C after all. */ + setlocale(LC_ALL, ""); + if(!Glib::get_charset()) { + std::cerr << "Sorry, only UTF-8 locales are supported." << std::endl; + return 1; + } + setlocale(LC_ALL, "C"); + + /* If we don't do this, gtk_init will set the C standard library + locale, and printf will format floats using ",". We will then + fail to parse these. Also, many text window lines will become + ambiguous. */ + gtk_disable_setlocale(); + + Gtk::Main main(argc, argv); + +#ifdef HAVE_SPACEWARE + gdk_window_add_filter(NULL, GdkSpnavFilter, NULL); +#endif + + CnfLoad(); + + TW.reset(new TextWindowGtk); + GW.reset(new GraphicsWindowGtk); + InitMainMenu(&GW->get_menubar()); + GW->get_menubar().accelerate(*TW); + TW->set_transient_for(*GW); + + TW->show_all(); + GW->show_all(); + +#ifdef HAVE_SPACEWARE +#ifdef HAVE_GTK3 + // We don't care if it can't be opened; just continue without. + spnav_x11_open(gdk_x11_get_default_xdisplay(), + gdk_x11_window_get_xid(GW->get_window()->gobj())); +#else + spnav_x11_open(gdk_x11_get_default_xdisplay(), + GDK_WINDOW_XWINDOW(GW->get_window()->gobj())); +#endif +#endif + + SS.Init(); + + if(argc >= 2) { + if(argc > 2) { + std::cerr << "Only the first file passed on command line will be opened." + << std::endl; + } + + /* Make sure the argument is valid UTF-8. */ + SS.OpenFile(Glib::ustring(argv[1])); + } + + main.run(*GW); + + TW.reset(); + GW.reset(); + + SK.Clear(); + SS.Clear(); + + return 0; +} diff --git a/src/icons/angle.png b/src/icons/angle.png new file mode 100644 index 0000000..7001a9d Binary files /dev/null and b/src/icons/angle.png differ diff --git a/src/icons/arc.png b/src/icons/arc.png new file mode 100644 index 0000000..8c09e1a Binary files /dev/null and b/src/icons/arc.png differ diff --git a/src/icons/assemble.png b/src/icons/assemble.png new file mode 100644 index 0000000..5db2d6b Binary files /dev/null and b/src/icons/assemble.png differ diff --git a/src/icons/bezier.png b/src/icons/bezier.png new file mode 100644 index 0000000..73620cd Binary files /dev/null and b/src/icons/bezier.png differ diff --git a/src/icons/circle.png b/src/icons/circle.png new file mode 100644 index 0000000..aec46a3 Binary files /dev/null and b/src/icons/circle.png differ diff --git a/src/icons/constraint.png b/src/icons/constraint.png new file mode 100644 index 0000000..a0e1889 Binary files /dev/null and b/src/icons/constraint.png differ diff --git a/src/icons/construction.png b/src/icons/construction.png new file mode 100644 index 0000000..fe3149a Binary files /dev/null and b/src/icons/construction.png differ diff --git a/src/icons/edges.png b/src/icons/edges.png new file mode 100644 index 0000000..d89c046 Binary files /dev/null and b/src/icons/edges.png differ diff --git a/src/icons/equal.png b/src/icons/equal.png new file mode 100644 index 0000000..f1ae3ff Binary files /dev/null and b/src/icons/equal.png differ diff --git a/src/icons/extrude.png b/src/icons/extrude.png new file mode 100644 index 0000000..6d4a44a Binary files /dev/null and b/src/icons/extrude.png differ diff --git a/src/icons/faces.png b/src/icons/faces.png new file mode 100644 index 0000000..8fd4e36 Binary files /dev/null and b/src/icons/faces.png differ diff --git a/src/icons/hidden-lines.png b/src/icons/hidden-lines.png new file mode 100644 index 0000000..35ea04b Binary files /dev/null and b/src/icons/hidden-lines.png differ diff --git a/src/icons/horiz.png b/src/icons/horiz.png new file mode 100644 index 0000000..5706c69 Binary files /dev/null and b/src/icons/horiz.png differ diff --git a/src/icons/in3d.png b/src/icons/in3d.png new file mode 100644 index 0000000..0d6be07 Binary files /dev/null and b/src/icons/in3d.png differ diff --git a/src/icons/lathe.png b/src/icons/lathe.png new file mode 100644 index 0000000..3596fe3 Binary files /dev/null and b/src/icons/lathe.png differ diff --git a/src/icons/length.png b/src/icons/length.png new file mode 100644 index 0000000..8396bb1 Binary files /dev/null and b/src/icons/length.png differ diff --git a/src/icons/line.png b/src/icons/line.png new file mode 100644 index 0000000..8a02224 Binary files /dev/null and b/src/icons/line.png differ diff --git a/src/icons/mesh.png b/src/icons/mesh.png new file mode 100644 index 0000000..dde867b Binary files /dev/null and b/src/icons/mesh.png differ diff --git a/src/icons/normal.png b/src/icons/normal.png new file mode 100644 index 0000000..c88c250 Binary files /dev/null and b/src/icons/normal.png differ diff --git a/src/icons/ontoworkplane.png b/src/icons/ontoworkplane.png new file mode 100644 index 0000000..b476e8f Binary files /dev/null and b/src/icons/ontoworkplane.png differ diff --git a/src/icons/other-supp.png b/src/icons/other-supp.png new file mode 100644 index 0000000..2bb6368 Binary files /dev/null and b/src/icons/other-supp.png differ diff --git a/src/icons/outlines.png b/src/icons/outlines.png new file mode 100644 index 0000000..b1c95ab Binary files /dev/null and b/src/icons/outlines.png differ diff --git a/src/icons/parallel.png b/src/icons/parallel.png new file mode 100644 index 0000000..4b8ef99 Binary files /dev/null and b/src/icons/parallel.png differ diff --git a/src/icons/perpendicular.png b/src/icons/perpendicular.png new file mode 100644 index 0000000..b93d8b3 Binary files /dev/null and b/src/icons/perpendicular.png differ diff --git a/src/icons/point.png b/src/icons/point.png new file mode 100644 index 0000000..e8a14d5 Binary files /dev/null and b/src/icons/point.png differ diff --git a/src/icons/pointonx.png b/src/icons/pointonx.png new file mode 100644 index 0000000..ad15c56 Binary files /dev/null and b/src/icons/pointonx.png differ diff --git a/src/icons/rectangle.png b/src/icons/rectangle.png new file mode 100644 index 0000000..272dbfa Binary files /dev/null and b/src/icons/rectangle.png differ diff --git a/src/icons/ref.png b/src/icons/ref.png new file mode 100644 index 0000000..afd64c3 Binary files /dev/null and b/src/icons/ref.png differ diff --git a/src/icons/same-orientation.png b/src/icons/same-orientation.png new file mode 100644 index 0000000..c612ee5 Binary files /dev/null and b/src/icons/same-orientation.png differ diff --git a/src/icons/shaded.png b/src/icons/shaded.png new file mode 100644 index 0000000..5fb452d Binary files /dev/null and b/src/icons/shaded.png differ diff --git a/src/icons/sketch-in-3d.png b/src/icons/sketch-in-3d.png new file mode 100644 index 0000000..204fd8c Binary files /dev/null and b/src/icons/sketch-in-3d.png differ diff --git a/src/icons/sketch-in-plane.png b/src/icons/sketch-in-plane.png new file mode 100644 index 0000000..86811e8 Binary files /dev/null and b/src/icons/sketch-in-plane.png differ diff --git a/src/icons/step-rotate.png b/src/icons/step-rotate.png new file mode 100644 index 0000000..6c38a16 Binary files /dev/null and b/src/icons/step-rotate.png differ diff --git a/src/icons/step-translate.png b/src/icons/step-translate.png new file mode 100644 index 0000000..faaeff0 Binary files /dev/null and b/src/icons/step-translate.png differ diff --git a/src/icons/symmetric.png b/src/icons/symmetric.png new file mode 100644 index 0000000..6eb9cad Binary files /dev/null and b/src/icons/symmetric.png differ diff --git a/src/icons/tangent-arc.png b/src/icons/tangent-arc.png new file mode 100644 index 0000000..0db8ac3 Binary files /dev/null and b/src/icons/tangent-arc.png differ diff --git a/src/icons/text.png b/src/icons/text.png new file mode 100644 index 0000000..01eb028 Binary files /dev/null and b/src/icons/text.png differ diff --git a/src/icons/trim.png b/src/icons/trim.png new file mode 100644 index 0000000..daa0878 Binary files /dev/null and b/src/icons/trim.png differ diff --git a/src/icons/vert.png b/src/icons/vert.png new file mode 100644 index 0000000..41eeb6e Binary files /dev/null and b/src/icons/vert.png differ diff --git a/src/icons/workplane.png b/src/icons/workplane.png new file mode 100644 index 0000000..c451453 Binary files /dev/null and b/src/icons/workplane.png differ diff --git a/src/importdxf.cpp b/src/importdxf.cpp new file mode 100644 index 0000000..dbd4e47 --- /dev/null +++ b/src/importdxf.cpp @@ -0,0 +1,948 @@ +#include "solvespace.h" +#include "libdxfrw.h" +#include "libdwgr.h" + +#ifdef WIN32 +// Conflicts with DRW::TEXT. +# undef TEXT +#endif + +namespace SolveSpace { + +static std::string ToUpper(std::string str) { + std::transform(str.begin(), str.end(), str.begin(), ::toupper); + return str; +} + +class DxfReadInterface : public DRW_Interface { +public: + Vector blockX; + Vector blockY; + Vector blockT; + + void invertXTransform() { + blockX.x = -blockX.x; + blockY.x = -blockY.x; + blockT.x = -blockT.x; + } + + void multBlockTransform(double x, double y, double sx, double sy, double angle) { + Vector oldX = blockX; + Vector oldY = blockY; + Vector oldT = blockT; + + Vector newX = Vector::From(sx, 0.0, 0.0).RotatedAbout(Vector::From(0.0, 0.0, 1.0), angle); + Vector newY = Vector::From(0.0, sy, 0.0).RotatedAbout(Vector::From(0.0, 0.0, 1.0), angle); + Vector newT = Vector::From(x, y, 0.0); + + blockX = oldX.ScaledBy(newX.x).Plus( + oldY.ScaledBy(newX.y)); + + blockY = oldX.ScaledBy(newY.x).Plus( + oldY.ScaledBy(newY.y)); + + blockT = oldX.ScaledBy(newT.x).Plus( + oldY.ScaledBy(newT.y)).Plus(oldT); + } + + void clearBlockTransform() { + blockX = Vector::From(1.0, 0.0, 0.0); + blockY = Vector::From(0.0, 1.0, 0.0); + blockT = Vector::From(0.0, 0.0, 0.0); + } + + Vector blockTransform(Vector v) { + Vector r = blockT; + r = r.Plus(blockX.ScaledBy(v.x)); + r = r.Plus(blockY.ScaledBy(v.y)); + return r; + } + + void blockTransformArc(Vector *c, Vector *p0, Vector *p1) { + bool oldSign = p0->Minus(*c).Cross(p1->Minus(*c)).z > 0.0; + + *c = blockTransform(*c); + *p0 = blockTransform(*p0); + *p1 = blockTransform(*p1); + + bool newSign = p0->Minus(*c).Cross(p1->Minus(*c)).z > 0.0; + if(oldSign != newSign) std::swap(*p0, *p1); + } + + Vector toVector(const DRW_Coord &c, bool transform = true) { + Vector result = Vector::From(c.x, c.y, 0.0); + if(transform) return blockTransform(result); + return result; + } + + Vector toVector(const DRW_Vertex2D &c) { + Vector result = Vector::From(c.x, c.y, 0.0); + return blockTransform(result); + } + + Vector toVector(const DRW_Vertex &c) { + Vector result = Vector::From(c.basePoint.x, c.basePoint.y, 0.0); + return blockTransform(result); + } + + double angleTo(Vector v0, Vector v1) { + Vector d = v1.Minus(v0); + double a = atan2(d.y, d.x); + return M_PI + remainder(a - M_PI, 2 * M_PI); + } + + Vector polar(double radius, double angle) { + return Vector::From(radius * cos(angle), radius * sin(angle), 0.0); + } + + hRequest createBulge(Vector p0, Vector p1, double bulge) { + bool reversed = bulge < 0.0; + double alpha = atan(bulge) * 4.0; + + Vector middle = p1.Plus(p0).ScaledBy(0.5); + double dist = p1.Minus(p0).Magnitude() / 2.0; + double angle = angleTo(p0, p1); + + // alpha can't be 0.0 at this point + double radius = fabs(dist / sin(alpha / 2.0)); + double wu = fabs(radius * radius - dist * dist); + double h = sqrt(wu); + + if(bulge > 0.0) { + angle += M_PI_2; + } else { + angle -= M_PI_2; + } + + if (fabs(alpha) > M_PI) { + h *= -1.0; + } + + Vector center = polar(h, angle); + center = center.Plus(middle); + + if(reversed) std::swap(p0, p1); + blockTransformArc(¢er, &p0, &p1); + + hRequest hr = SS.GW.AddRequest(Request::ARC_OF_CIRCLE, false); + SK.GetEntity(hr.entity(1))->PointForceTo(center); + SK.GetEntity(hr.entity(2))->PointForceTo(p0); + SK.GetEntity(hr.entity(3))->PointForceTo(p1); + processPoint(hr.entity(1)); + processPoint(hr.entity(2)); + processPoint(hr.entity(3)); + return hr; + } + + struct Block { + std::vector> entities; + DRW_Block data; + }; + + unsigned unknownEntities = 0; + std::map styles; + std::map blocks; + std::map layers; + Block *readBlock = NULL; + const DRW_Insert *insertInsert = NULL; + + template + bool addPendingBlockEntity(const T &e) { + if(readBlock == NULL) return false; + readBlock->entities.emplace_back(new T(e)); + return true; + } + + void addEntity(DRW_Entity *e) { + switch(e->eType) { + case DRW::POINT: + addPoint(*static_cast(e)); + break; + case DRW::LINE: + addLine(*static_cast(e)); + break; + case DRW::ARC: + addArc(*static_cast(e)); + break; + case DRW::CIRCLE: + addCircle(*static_cast(e)); + break; + case DRW::POLYLINE: + addPolyline(*static_cast(e)); + break; + case DRW::LWPOLYLINE: + addLWPolyline(*static_cast(e)); + break; + case DRW::SPLINE: + addSpline(static_cast(e)); + break; + case DRW::INSERT: + addInsert(*static_cast(e)); + break; + case DRW::TEXT: + addText(*static_cast(e)); + break; + case DRW::MTEXT: + addMText(*static_cast(e)); + break; + case DRW::DIMALIGNED: + addDimAlign(static_cast(e)); + break; + case DRW::DIMLINEAR: + addDimLinear(static_cast(e)); + break; + case DRW::DIMRADIAL: + addDimRadial(static_cast(e)); + break; + case DRW::DIMDIAMETRIC: + addDimDiametric(static_cast(e)); + break; + case DRW::DIMANGULAR: + addDimAngular(static_cast(e)); + break; + default: + unknownEntities++; + } + } + + int dxfAlignToOrigin(DRW_Text::HAlign alignH, DRW_Text::VAlign alignV) { + int origin = 0; + switch(alignH) { + case DRW_Text::HLeft: + origin |= Style::ORIGIN_LEFT; + break; + + case DRW_Text::HMiddle: + case DRW_Text::HCenter: + break; + + case DRW_Text::HRight: + origin |= Style::ORIGIN_RIGHT; + break; + + case DRW_Text::HAligned: + case DRW_Text::HFit: + default: + origin |= Style::ORIGIN_LEFT; + break; + } + + switch(alignV) { + case DRW_Text::VBaseLine: + case DRW_Text::VBottom: + origin |= Style::ORIGIN_BOT; + break; + + case DRW_Text::VMiddle: + break; + + case DRW_Text::VTop: + origin |= Style::ORIGIN_TOP; + break; + + default: + origin |= Style::ORIGIN_BOT; + break; + } + + return origin; + } + + DRW_Layer *getSourceLayer(const DRW_Entity *e) { + DRW_Layer *layer = NULL; + if(insertInsert != NULL) { + std::string l = insertInsert->layer; + auto bi = layers.find(l); + if(bi != layers.end()) layer = &bi->second; + } else { + std::string l = e->layer; + auto bi = layers.find(l); + if(bi != layers.end()) layer = &bi->second; + } + return layer; + } + + int getColor(const DRW_Entity *e) { + int col = e->color; + if(col == DRW::ColorByBlock) { + if(insertInsert != NULL) { + col = insertInsert->color; + } else { + col = 7; + } + } + if(col == DRW::ColorByLayer) { + DRW_Layer *layer = getSourceLayer(e); + if(layer != NULL) { + col = layer->color; + } else { + col = 7; + } + } + return col; + } + + DRW_LW_Conv::lineWidth getLineWidth(const DRW_Entity *e) { + DRW_LW_Conv::lineWidth result = e->lWeight; + if(result == DRW_LW_Conv::widthByBlock) { + if(insertInsert != NULL) { + result = insertInsert->lWeight; + } else { + result = DRW_LW_Conv::widthDefault; + } + } + if(result == DRW_LW_Conv::widthByLayer) { + DRW_Layer *layer = getSourceLayer(e); + if(layer != NULL) { + result = layer->lWeight; + } else { + result = DRW_LW_Conv::widthDefault; + } + } + return result; + } + + std::string getLineType(const DRW_Entity *e) { + std::string result = e->lineType; + if(result == "BYBLOCK") { + if(insertInsert != NULL) { + result = ToUpper(insertInsert->lineType); + } else { + result = "CONTINUOUS"; + } + } + if(result == "BYLAYER") { + DRW_Layer *layer = getSourceLayer(e); + if(layer != NULL) { + result = ToUpper(layer->lineType); + } else { + result = "CONTINUOUS"; + } + } + return result; + } + + hStyle invisibleStyle() { + std::string id = "@dxf-invisible"; + + auto si = styles.find(id); + if(si != styles.end()) { + return si->second; + } + + hStyle hs = { Style::CreateCustomStyle(/*rememberForUndo=*/false) }; + Style *s = Style::Get(hs); + s->name = id; + s->visible = false; + + styles.emplace(id, hs); + return hs; + } + + hStyle styleFor(const DRW_Entity *e) { + // Color. + // TODO: which color to choose: index or RGB one? + int col = getColor(e); + RgbaColor c = RgbaColor::From(DRW::dxfColors[col][0], + DRW::dxfColors[col][1], + DRW::dxfColors[col][2]); + + // Line width. + DRW_LW_Conv::lineWidth lw = getLineWidth(e); + double width = DRW_LW_Conv::lineWidth2dxfInt(e->lWeight) / 100.0; + if(width < 0.0) width = 1.0; + + // Line stipple. + // TODO: Probably, we can load default autocad patterns and match it with ours. + std::string lineType = getLineType(e); + int stipple = Style::STIPPLE_CONTINUOUS; + for(int i = 0; i <= Style::LAST_STIPPLE; i++) { + if(lineType == DxfFileWriter::lineTypeName(i)) { + stipple = i; + break; + } + } + + // Text properties. + DRW_Text::HAlign alignH = DRW_Text::HLeft; + DRW_Text::VAlign alignV = DRW_Text::VBaseLine; + double textAngle = 0.0; + double textHeight = Style::DefaultTextHeight(); + + if(e->eType == DRW::TEXT || e->eType == DRW::MTEXT) { + const DRW_Text *text = static_cast(e); + alignH = text->alignH; + alignV = text->alignV; + textHeight = text->height; + textAngle = text->angle; + // I have no idea why, but works + if(alignH == DRW_Text::HMiddle) { + alignV = DRW_Text::VMiddle; + } + } + + // Unique identifier based on style properties. + std::string id = "@dxf"; + if(lw != DRW_LW_Conv::widthDefault) + id += ssprintf("-w%.4g", width); + if(lineType != "CONTINUOUS") + id += ssprintf("-%s", lineType.c_str()); + if(c.red != 0 || c.green != 0 || c.blue != 0) + id += ssprintf("-#%02x%02x%02x", c.red, c.green, c.blue); + if(textHeight != Style::DefaultTextHeight()) + id += ssprintf("-h%.4g", textHeight); + if(textAngle != 0.0) + id += ssprintf("-a%.5g", textAngle); + if(alignH != DRW_Text::HLeft) + id += ssprintf("-oh%d", alignH); + if(alignV != DRW_Text::VBaseLine) + id += ssprintf("-ov%d", alignV); + + auto si = styles.find(id); + if(si != styles.end()) { + return si->second; + } + + hStyle hs = { Style::CreateCustomStyle(/*rememberForUndo=*/false) }; + Style *s = Style::Get(hs); + if(lw != DRW_LW_Conv::widthDefault) { + s->widthAs = Style::UNITS_AS_MM; + s->width = width; + s->stippleScale = 1.0 + width * 2.0; + } + s->name = id; + s->stippleType = stipple; + if(c.red != 0 || c.green != 0 || c.blue != 0) s->color = c; + s->textHeightAs = Style::UNITS_AS_MM; + s->textHeight = textHeight; + s->textAngle = textAngle; + s->textOrigin = dxfAlignToOrigin(alignH, alignV); + + styles.emplace(id, hs); + return hs; + } + + void setStyle(hRequest hr, hStyle hs) { + Request *r = SK.GetRequest(hr); + r->style = hs; + } + + struct VectorHash { + size_t operator()(const Vector &v) const { + static const size_t size = std::numeric_limits::max() / 2 - 1; + static const double eps = (4.0 * LENGTH_EPS); + + double x = fabs(v.x) / eps; + double y = fabs(v.y) / eps; + + size_t xs = size_t(fmod(x, double(size))); + size_t ys = size_t(fmod(y, double(size))); + + return ys * size + xs; + } + }; + + struct VectorPred { + bool operator()(Vector a, Vector b) const { + return a.Equals(b, LENGTH_EPS); + } + }; + + std::unordered_map points; + + void processPoint(hEntity he, bool constrain = true) { + Entity *e = SK.GetEntity(he); + Vector pos = e->PointGetNum(); + hEntity p = findPoint(pos); + if(p.v == he.v) return; + if(p.v != Entity::NO_ENTITY.v) { + if(constrain) { + Constraint::ConstrainCoincident(he, p); + } + // We don't add point because we already + // have point in this position + return; + } + points.emplace(pos, he); + } + + hEntity findPoint(const Vector &p) { + auto it = points.find(p); + if(it == points.end()) return Entity::NO_ENTITY; + return it->second; + } + + hEntity createOrGetPoint(const Vector &p) { + hEntity he = findPoint(p); + if(he.v != Entity::NO_ENTITY.v) return he; + + hRequest hr = SS.GW.AddRequest(Request::DATUM_POINT, false); + he = hr.entity(0); + SK.GetEntity(he)->PointForceTo(p); + points.emplace(p, he); + return he; + } + + hEntity createLine(Vector p0, Vector p1, uint32_t style, bool constrainHV = false) { + if(p0.Equals(p1)) return Entity::NO_ENTITY; + hRequest hr = SS.GW.AddRequest(Request::LINE_SEGMENT, false); + SK.GetEntity(hr.entity(1))->PointForceTo(p0); + SK.GetEntity(hr.entity(2))->PointForceTo(p1); + processPoint(hr.entity(1)); + processPoint(hr.entity(2)); + + if(constrainHV) { + int cType = -1; + if(fabs(p0.x - p1.x) < LENGTH_EPS) { + cType = Constraint::VERTICAL; + } + else if(fabs(p0.y - p1.y) < LENGTH_EPS) { + cType = Constraint::HORIZONTAL; + } + if(cType != -1) { + Constraint::Constrain( + cType, + Entity::NO_ENTITY, + Entity::NO_ENTITY, + hr.entity(0) + ); + } + } + + if(style != 0) { + Request *r = SK.GetRequest(hr); + r->style = hStyle{ style }; + } + return hr.entity(0); + } + + hEntity createCircle(const Vector &c, double r, uint32_t style) { + hRequest hr = SS.GW.AddRequest(Request::CIRCLE, false); + SK.GetEntity(hr.entity(1))->PointForceTo(c); + processPoint(hr.entity(1)); + SK.GetEntity(hr.entity(64))->DistanceForceTo(r); + if(style != 0) { + Request *r = SK.GetRequest(hr); + r->style = hStyle{ style }; + } + return hr.entity(0); + } + + virtual void addLayer(const DRW_Layer &data) { + layers.emplace(data.name, data); + } + + virtual void addBlock(const DRW_Block &data) { + readBlock = &blocks[data.name]; + readBlock->data = data; + } + + virtual void endBlock() { + readBlock = NULL; + } + + virtual void addPoint(const DRW_Point &data) { + if(data.space != DRW::ModelSpace) return; + if(addPendingBlockEntity(data)) return; + + hRequest hr = SS.GW.AddRequest(Request::DATUM_POINT, false); + SK.GetEntity(hr.entity(0))->PointForceTo(toVector(data.basePoint)); + processPoint(hr.entity(0)); + } + + virtual void addLine(const DRW_Line &data) { + if(data.space != DRW::ModelSpace) return; + if(addPendingBlockEntity(data)) return; + + createLine(toVector(data.basePoint), toVector(data.secPoint), styleFor(&data).v, true); + } + + virtual void addArc(const DRW_Arc &data) { + if(data.space != DRW::ModelSpace) return; + if(addPendingBlockEntity(data)) return; + + hRequest hr = SS.GW.AddRequest(Request::ARC_OF_CIRCLE, false); + double r = data.radious; + double sa = data.staangle; + double ea = data.endangle; + Vector c = Vector::From(data.basePoint.x, data.basePoint.y, 0.0); + Vector rvs = Vector::From(r * cos(sa), r * sin(sa), data.basePoint.z).Plus(c); + Vector rve = Vector::From(r * cos(ea), r * sin(ea), data.basePoint.z).Plus(c); + + if(data.extPoint.z == -1.0) { + c.x = -c.x; + rvs.x = - rvs.x; + rve.x = - rve.x; + std::swap(rvs, rve); + } + + blockTransformArc(&c, &rvs, &rve); + + SK.GetEntity(hr.entity(1))->PointForceTo(c); + SK.GetEntity(hr.entity(2))->PointForceTo(rvs); + SK.GetEntity(hr.entity(3))->PointForceTo(rve); + processPoint(hr.entity(1)); + processPoint(hr.entity(2)); + processPoint(hr.entity(3)); + setStyle(hr, styleFor(&data)); + } + + virtual void addCircle(const DRW_Circle &data) { + if(data.space != DRW::ModelSpace) return; + if(addPendingBlockEntity(data)) return; + + createCircle(toVector(data.basePoint), data.radious, styleFor(&data).v); + } + + virtual void addLWPolyline(const DRW_LWPolyline &data) { + if(data.space != DRW::ModelSpace) return; + if(addPendingBlockEntity(data)) return; + + size_t vNum = data.vertlist.size(); + + // Check for closed polyline. + if((data.flags & 1) != 1) vNum--; + + // Correct coordinate system for the case where z=-1, as described in + // http://paulbourke.net/dataformats/dxf/dxf10.html. + bool needSwapX = data.extPoint.z == -1.0; + + for(size_t i = 0; i < vNum; i++) { + DRW_Vertex2D c0 = *data.vertlist[i]; + DRW_Vertex2D c1 = *data.vertlist[(i + 1) % data.vertlist.size()]; + + if(needSwapX) { + c0.x = -c0.x; + c1.x = -c1.x; + c0.bulge = -c0.bulge; + } + + Vector p0 = Vector::From(c0.x, c0.y, 0.0); + Vector p1 = Vector::From(c1.x, c1.y, 0.0); + hStyle hs = styleFor(&data); + + if(EXACT(data.vertlist[i]->bulge == 0.0)) { + createLine(blockTransform(p0), blockTransform(p1), hs.v, true); + } else { + hRequest hr = createBulge(p0, p1, c0.bulge); + setStyle(hr, hs); + } + } + } + + virtual void addPolyline(const DRW_Polyline &data) { + if(data.space != DRW::ModelSpace) return; + if(addPendingBlockEntity(data)) return; + + int vNum = data.vertlist.size(); + + // Check for closed polyline. + if((data.flags & 1) != 1) vNum--; + + // Correct coordinate system for the case where z=-1, as described in + // http://paulbourke.net/dataformats/dxf/dxf10.html. + bool needSwapX = data.extPoint.z == -1.0; + + for(int i = 0; i < vNum; i++) { + DRW_Coord c0 = data.vertlist[i]->basePoint; + DRW_Coord c1 = data.vertlist[(i + 1) % data.vertlist.size()]->basePoint; + + double bulge = data.vertlist[i]->bulge; + if(needSwapX) { + c0.x = -c0.x; + c1.x = -c1.x; + bulge = -bulge; + } + + Vector p0 = Vector::From(c0.x, c0.y, 0.0); + Vector p1 = Vector::From(c1.x, c1.y, 0.0); + hStyle hs = styleFor(&data); + + if(EXACT(bulge == 0.0)) { + createLine(blockTransform(p0), blockTransform(p1), hs.v, true); + } else { + hRequest hr = createBulge(p0, p1, bulge); + setStyle(hr, hs); + } + } + } + + virtual void addSpline(const DRW_Spline *data) { + if(data->space != DRW::ModelSpace) return; + if(data->degree != 3) return; + if(addPendingBlockEntity(*data)) return; + + hRequest hr = SS.GW.AddRequest(Request::CUBIC, false); + for(int i = 0; i < 4; i++) { + SK.GetEntity(hr.entity(i + 1))->PointForceTo(toVector(*data->controllist[i])); + processPoint(hr.entity(i + 1)); + } + setStyle(hr, styleFor(data)); + } + + virtual void addInsert(const DRW_Insert &data) { + if(data.space != DRW::ModelSpace) return; + if(addPendingBlockEntity(data)) return; + + auto bi = blocks.find(data.name); + if(bi == blocks.end()) oops(); + Block *block = &bi->second; + + // Push transform. + Vector x = blockX; + Vector y = blockY; + Vector t = blockT; + + const DRW_Insert *oldInsert = insertInsert; + insertInsert = &data; + + if(data.extPoint.z == -1.0) invertXTransform(); + multBlockTransform(data.basePoint.x, data.basePoint.y, data.xscale, data.yscale, data.angle); + for(auto &e : block->entities) { + addEntity(&*e); + } + + insertInsert = oldInsert; + + // Pop transform. + blockX = x; + blockY = y; + blockT = t; + } + + virtual void addMText(const DRW_MText &data) { + if(data.space != DRW::ModelSpace) return; + if(addPendingBlockEntity(data)) return; + + DRW_MText text = data; + text.secPoint = text.basePoint; + addText(text); + } + + virtual void addText(const DRW_Text &data) { + if(data.space != DRW::ModelSpace) return; + if(addPendingBlockEntity(data)) return; + + Constraint c = {}; + c.group = SS.GW.activeGroup; + c.workplane = SS.GW.ActiveWorkplane(); + c.type = Constraint::COMMENT; + if(data.alignH == DRW_Text::HLeft && data.alignV == DRW_Text::VBaseLine) { + c.disp.offset = toVector(data.basePoint); + } else { + c.disp.offset = toVector(data.secPoint); + } + c.comment = data.text; + c.disp.style = styleFor(&data); + Constraint::AddConstraint(&c, false); + } + + virtual void addDimAlign(const DRW_DimAligned *data) { + if(data->space != DRW::ModelSpace) return; + if(addPendingBlockEntity(*data)) return; + + Vector p0 = toVector(data->getDef1Point()); + Vector p1 = toVector(data->getDef2Point()); + Vector p2 = toVector(data->getTextPoint()); + hConstraint hc = Constraint::Constrain( + Constraint::PT_PT_DISTANCE, + createOrGetPoint(p0), + createOrGetPoint(p1), + Entity::NO_ENTITY + ); + + Constraint *c = SK.GetConstraint(hc); + if(data->hasActualMeasurement()) { + c->valA = data->getActualMeasurement(); + } else { + c->ModifyToSatisfy(); + } + c->disp.offset = p2.Minus(p0.Plus(p1).ScaledBy(0.5)); + } + + virtual void addDimLinear(const DRW_DimLinear *data) { + if(data->space != DRW::ModelSpace) return; + if(addPendingBlockEntity(*data)) return; + + Vector p0 = toVector(data->getDef1Point(), false); + Vector p1 = toVector(data->getDef2Point(), false); + Vector p2 = toVector(data->getTextPoint(), false); + + double angle = data->getAngle() * PI / 180.0; + Vector dir = Vector::From(cos(angle), sin(angle), 0.0); + Vector p3 = p1.Minus(p1.ClosestPointOnLine(p2, dir)).Plus(p1); + if(p1.Minus(p3).Magnitude() < LENGTH_EPS) { + p3 = p0.Minus(p0.ClosestPointOnLine(p2, dir)).Plus(p1); + } + + Vector p4 = p0.ClosestPointOnLine(p1, p3.Minus(p1)).Plus(p0).ScaledBy(0.5); + + p0 = blockTransform(p0); + p1 = blockTransform(p1); + p2 = blockTransform(p2); + p3 = blockTransform(p3); + p4 = blockTransform(p4); + + hConstraint hc = Constraint::Constrain( + Constraint::PT_LINE_DISTANCE, + createOrGetPoint(p0), + Entity::NO_ENTITY, + createLine(p1, p3, invisibleStyle().v) + ); + + Constraint *c = SK.GetConstraint(hc); + if(data->hasActualMeasurement()) { + c->valA = data->getActualMeasurement(); + } else { + c->ModifyToSatisfy(); + } + c->disp.offset = p2.Minus(p4); + } + + virtual void addDimAngular(const DRW_DimAngular *data) { + if(data->space != DRW::ModelSpace) return; + if(addPendingBlockEntity(*data)) return; + + Vector l0p0 = toVector(data->getFirstLine1()); + Vector l0p1 = toVector(data->getFirstLine2()); + Vector l1p0 = toVector(data->getSecondLine1()); + Vector l1p1 = toVector(data->getSecondLine2()); + + hConstraint hc = Constraint::Constrain( + Constraint::ANGLE, + Entity::NO_ENTITY, + Entity::NO_ENTITY, + createLine(l0p0, l0p1, invisibleStyle().v), + createLine(l1p1, l1p0, invisibleStyle().v), + /*other=*/false, + /*other2=*/false + ); + + Constraint *c = SK.GetConstraint(hc); + c->ModifyToSatisfy(); + if(data->hasActualMeasurement()) { + double actual = data->getActualMeasurement() / PI * 180.0; + if(fabs(180.0 - actual - c->valA) < fabs(actual - c->valA)) { + c->other = true; + } + c->valA = actual; + } + + bool skew = false; + Vector pi = Vector::AtIntersectionOfLines(l0p0, l0p1, l1p0, l1p1, &skew); + if(!skew) { + c->disp.offset = toVector(data->getTextPoint()).Minus(pi); + } + } + + hConstraint createDiametric(Vector cp, double r, Vector tp, double actual, bool asRadius = false) { + hEntity he = createCircle(cp, r, invisibleStyle().v); + + hConstraint hc = Constraint::Constrain( + Constraint::DIAMETER, + Entity::NO_ENTITY, + Entity::NO_ENTITY, + he + ); + + Constraint *c = SK.GetConstraint(hc); + if(actual > 0.0) { + c->valA = asRadius ? actual * 2.0 : actual; + } else { + c->ModifyToSatisfy(); + } + c->disp.offset = tp.Minus(cp); + if(asRadius) c->other = true; + return hc; + } + + virtual void addDimRadial(const DRW_DimRadial *data) { + if(data->space != DRW::ModelSpace) return; + if(addPendingBlockEntity(*data)) return; + + Vector cp = toVector(data->getCenterPoint()); + Vector dp = toVector(data->getDiameterPoint()); + Vector tp = toVector(data->getTextPoint()); + double actual = -1.0; + if(data->hasActualMeasurement()) { + actual = data->getActualMeasurement(); + } + + createDiametric(cp, cp.Minus(dp).Magnitude(), tp, actual, /*asRadius=*/true); + } + + virtual void addDimDiametric(const DRW_DimDiametric *data) { + if(data->space != DRW::ModelSpace) return; + if(addPendingBlockEntity(*data)) return; + + Vector dp1 = toVector(data->getDiameter1Point()); + Vector dp2 = toVector(data->getDiameter2Point()); + + Vector cp = dp1.Plus(dp2).ScaledBy(0.5); + Vector tp = toVector(data->getTextPoint()); + double actual = -1.0; + if(data->hasActualMeasurement()) { + actual = data->getActualMeasurement(); + } + + createDiametric(cp, cp.Minus(dp1).Magnitude(), tp, actual, /*asRadius=*/false); + } + + virtual void addDimAngular3P(const DRW_DimAngular3p *data) { + if(data->space != DRW::ModelSpace) return; + if(addPendingBlockEntity(*data)) return; + + DRW_DimAngular dim = *static_cast(data); + dim.setFirstLine1(data->getVertexPoint()); + dim.setFirstLine2(data->getFirstLine()); + dim.setSecondLine1(data->getVertexPoint()); + dim.setSecondLine2(data->getSecondLine()); + addDimAngular(&dim); + } +}; + +void ImportDxf(const std::string &filename) { + DxfReadInterface interface; + interface.clearBlockTransform(); + + std::string data; + if(!ReadFile(filename, &data)) { + Error("Couldn't read from '%s'", filename.c_str()); + return; + } + + SS.UndoRemember(); + std::stringstream stream(data); + if(!dxfRW().read(stream, &interface, /*ext=*/false)) { + Error("Corrupted DXF file."); + } + + if(interface.unknownEntities > 0) { + Message(ssprintf("%u DXF entities of unknown type were ignored.", + interface.unknownEntities).c_str()); + } +} + +void ImportDwg(const std::string &filename) { + DxfReadInterface interface; + interface.clearBlockTransform(); + + std::string data; + if(!ReadFile(filename, &data)) { + Error("Couldn't read from '%s'", filename.c_str()); + return; + } + + SS.UndoRemember(); + std::stringstream stream(data); + if(!dwgR().read(stream, &interface, /*ext=*/false)) { + Error("Corrupted DWG file."); + } + + if(interface.unknownEntities > 0) { + Message(ssprintf("%u DWG entities of unknown type were ignored.", + interface.unknownEntities).c_str()); + } +} + +} diff --git a/src/lib.cpp b/src/lib.cpp new file mode 100644 index 0000000..d87a4f0 --- /dev/null +++ b/src/lib.cpp @@ -0,0 +1,263 @@ +//----------------------------------------------------------------------------- +// A library wrapper around SolveSpace, to permit someone to use its constraint +// solver without coupling their program too much to SolveSpace's internals. +// +// Copyright 2008-2013 Jonathan Westhues. +//----------------------------------------------------------------------------- +#include "solvespace.h" +#define EXPORT_DLL +#include + +Sketch SolveSpace::SK = {}; +static System SYS; + +static int IsInit = 0; + +void Group::GenerateEquations(IdList *) { + // Nothing to do for now. +} + +void SolveSpace::CnfFreezeInt(uint32_t, const std::string &) +{ + abort(); +} + +uint32_t SolveSpace::CnfThawInt(uint32_t, const std::string &) +{ + abort(); + return 0; +} + +void SolveSpace::DoMessageBox(const char *, int, int, bool) +{ + abort(); +} + +extern "C" { + +void Slvs_QuaternionU(double qw, double qx, double qy, double qz, + double *x, double *y, double *z) +{ + Quaternion q = Quaternion::From(qw, qx, qy, qz); + Vector v = q.RotationU(); + *x = v.x; + *y = v.y; + *z = v.z; +} + +void Slvs_QuaternionV(double qw, double qx, double qy, double qz, + double *x, double *y, double *z) +{ + Quaternion q = Quaternion::From(qw, qx, qy, qz); + Vector v = q.RotationV(); + *x = v.x; + *y = v.y; + *z = v.z; +} + +void Slvs_QuaternionN(double qw, double qx, double qy, double qz, + double *x, double *y, double *z) +{ + Quaternion q = Quaternion::From(qw, qx, qy, qz); + Vector v = q.RotationN(); + *x = v.x; + *y = v.y; + *z = v.z; +} + +void Slvs_MakeQuaternion(double ux, double uy, double uz, + double vx, double vy, double vz, + double *qw, double *qx, double *qy, double *qz) +{ + Vector u = Vector::From(ux, uy, uz), + v = Vector::From(vx, vy, vz); + Quaternion q = Quaternion::From(u, v); + *qw = q.w; + *qx = q.vx; + *qy = q.vy; + *qz = q.vz; +} + +void Slvs_Solve(Slvs_System *ssys, Slvs_hGroup shg) +{ + if(!IsInit) { + InitHeaps(); + IsInit = 1; + } + + int i; + for(i = 0; i < ssys->params; i++) { + Slvs_Param *sp = &(ssys->param[i]); + Param p = {}; + + p.h.v = sp->h; + p.val = sp->val; + SK.param.Add(&p); + if(sp->group == shg) { + SYS.param.Add(&p); + } + } + + for(i = 0; i < ssys->entities; i++) { + Slvs_Entity *se = &(ssys->entity[i]); + EntityBase e = {}; + + switch(se->type) { +case SLVS_E_POINT_IN_3D: e.type = Entity::POINT_IN_3D; break; +case SLVS_E_POINT_IN_2D: e.type = Entity::POINT_IN_2D; break; +case SLVS_E_NORMAL_IN_3D: e.type = Entity::NORMAL_IN_3D; break; +case SLVS_E_NORMAL_IN_2D: e.type = Entity::NORMAL_IN_2D; break; +case SLVS_E_DISTANCE: e.type = Entity::DISTANCE; break; +case SLVS_E_WORKPLANE: e.type = Entity::WORKPLANE; break; +case SLVS_E_LINE_SEGMENT: e.type = Entity::LINE_SEGMENT; break; +case SLVS_E_CUBIC: e.type = Entity::CUBIC; break; +case SLVS_E_CIRCLE: e.type = Entity::CIRCLE; break; +case SLVS_E_ARC_OF_CIRCLE: e.type = Entity::ARC_OF_CIRCLE; break; + +default: dbp("bad entity type %d", se->type); return; + } + e.h.v = se->h; + e.group.v = se->group; + e.workplane.v = se->wrkpl; + e.point[0].v = se->point[0]; + e.point[1].v = se->point[1]; + e.point[2].v = se->point[2]; + e.point[3].v = se->point[3]; + e.normal.v = se->normal; + e.distance.v = se->distance; + e.param[0].v = se->param[0]; + e.param[1].v = se->param[1]; + e.param[2].v = se->param[2]; + e.param[3].v = se->param[3]; + + SK.entity.Add(&e); + } + + for(i = 0; i < ssys->constraints; i++) { + Slvs_Constraint *sc = &(ssys->constraint[i]); + ConstraintBase c = {}; + + int t; + switch(sc->type) { +case SLVS_C_POINTS_COINCIDENT: t = Constraint::POINTS_COINCIDENT; break; +case SLVS_C_PT_PT_DISTANCE: t = Constraint::PT_PT_DISTANCE; break; +case SLVS_C_PT_PLANE_DISTANCE: t = Constraint::PT_PLANE_DISTANCE; break; +case SLVS_C_PT_LINE_DISTANCE: t = Constraint::PT_LINE_DISTANCE; break; +case SLVS_C_PT_FACE_DISTANCE: t = Constraint::PT_FACE_DISTANCE; break; +case SLVS_C_PT_IN_PLANE: t = Constraint::PT_IN_PLANE; break; +case SLVS_C_PT_ON_LINE: t = Constraint::PT_ON_LINE; break; +case SLVS_C_PT_ON_FACE: t = Constraint::PT_ON_FACE; break; +case SLVS_C_EQUAL_LENGTH_LINES: t = Constraint::EQUAL_LENGTH_LINES; break; +case SLVS_C_LENGTH_RATIO: t = Constraint::LENGTH_RATIO; break; +case SLVS_C_EQ_LEN_PT_LINE_D: t = Constraint::EQ_LEN_PT_LINE_D; break; +case SLVS_C_EQ_PT_LN_DISTANCES: t = Constraint::EQ_PT_LN_DISTANCES; break; +case SLVS_C_EQUAL_ANGLE: t = Constraint::EQUAL_ANGLE; break; +case SLVS_C_EQUAL_LINE_ARC_LEN: t = Constraint::EQUAL_LINE_ARC_LEN; break; +case SLVS_C_LENGTH_DIFFERENCE: t = Constraint::LENGTH_DIFFERENCE; break; +case SLVS_C_SYMMETRIC: t = Constraint::SYMMETRIC; break; +case SLVS_C_SYMMETRIC_HORIZ: t = Constraint::SYMMETRIC_HORIZ; break; +case SLVS_C_SYMMETRIC_VERT: t = Constraint::SYMMETRIC_VERT; break; +case SLVS_C_SYMMETRIC_LINE: t = Constraint::SYMMETRIC_LINE; break; +case SLVS_C_AT_MIDPOINT: t = Constraint::AT_MIDPOINT; break; +case SLVS_C_HORIZONTAL: t = Constraint::HORIZONTAL; break; +case SLVS_C_VERTICAL: t = Constraint::VERTICAL; break; +case SLVS_C_DIAMETER: t = Constraint::DIAMETER; break; +case SLVS_C_PT_ON_CIRCLE: t = Constraint::PT_ON_CIRCLE; break; +case SLVS_C_SAME_ORIENTATION: t = Constraint::SAME_ORIENTATION; break; +case SLVS_C_ANGLE: t = Constraint::ANGLE; break; +case SLVS_C_PARALLEL: t = Constraint::PARALLEL; break; +case SLVS_C_PERPENDICULAR: t = Constraint::PERPENDICULAR; break; +case SLVS_C_ARC_LINE_TANGENT: t = Constraint::ARC_LINE_TANGENT; break; +case SLVS_C_CUBIC_LINE_TANGENT: t = Constraint::CUBIC_LINE_TANGENT; break; +case SLVS_C_EQUAL_RADIUS: t = Constraint::EQUAL_RADIUS; break; +case SLVS_C_PROJ_PT_DISTANCE: t = Constraint::PROJ_PT_DISTANCE; break; +case SLVS_C_WHERE_DRAGGED: t = Constraint::WHERE_DRAGGED; break; +case SLVS_C_CURVE_CURVE_TANGENT:t = Constraint::CURVE_CURVE_TANGENT; break; + +default: dbp("bad constraint type %d", sc->type); return; + } + + c.type = t; + + c.h.v = sc->h; + c.group.v = sc->group; + c.workplane.v = sc->wrkpl; + c.valA = sc->valA; + c.ptA.v = sc->ptA; + c.ptB.v = sc->ptB; + c.entityA.v = sc->entityA; + c.entityB.v = sc->entityB; + c.entityC.v = sc->entityC; + c.entityD.v = sc->entityD; + c.other = (sc->other) ? true : false; + c.other2 = (sc->other2) ? true : false; + + SK.constraint.Add(&c); + } + + for(i = 0; i < (int)arraylen(ssys->dragged); i++) { + if(ssys->dragged[i]) { + hParam hp = { ssys->dragged[i] }; + SYS.dragged.Add(&hp); + } + } + + Group g = {}; + g.h.v = shg; + + List bad = {}; + + // Now we're finally ready to solve! + bool andFindBad = ssys->calculateFaileds ? true : false; + int how = SYS.Solve(&g, &(ssys->dof), &bad, andFindBad, false); + + switch(how) { + case System::SOLVED_OKAY: + ssys->result = SLVS_RESULT_OKAY; + break; + + case System::DIDNT_CONVERGE: + ssys->result = SLVS_RESULT_DIDNT_CONVERGE; + break; + + case System::REDUNDANT_DIDNT_CONVERGE: + case System::REDUNDANT_OKAY: + ssys->result = SLVS_RESULT_INCONSISTENT; + break; + + case System::TOO_MANY_UNKNOWNS: + ssys->result = SLVS_RESULT_TOO_MANY_UNKNOWNS; + break; + + default: oops(); + } + + // Write the new parameter values back to our caller. + for(i = 0; i < ssys->params; i++) { + Slvs_Param *sp = &(ssys->param[i]); + hParam hp = { sp->h }; + sp->val = SK.GetParam(hp)->val; + } + + if(ssys->failed) { + // Copy over any the list of problematic constraints. + for(i = 0; i < ssys->faileds && i < bad.n; i++) { + ssys->failed[i] = bad.elem[i].v; + } + ssys->faileds = bad.n; + } + + bad.Clear(); + SYS.param.Clear(); + SYS.entity.Clear(); + SYS.eq.Clear(); + SYS.dragged.Clear(); + + SK.param.Clear(); + SK.entity.Clear(); + SK.constraint.Clear(); + + FreeAllTemporary(); +} + +} /* extern "C" */ diff --git a/src/mesh.cpp b/src/mesh.cpp new file mode 100644 index 0000000..6458e5d --- /dev/null +++ b/src/mesh.cpp @@ -0,0 +1,1074 @@ +//----------------------------------------------------------------------------- +// Operations on triangle meshes, like our mesh Booleans using the BSP, and +// the stuff to check for watertightness. +// +// Copyright 2008-2013 Jonathan Westhues. +//----------------------------------------------------------------------------- +#include "solvespace.h" + +#include + +void SMesh::Clear(void) { + l.Clear(); +} + +void SMesh::AddTriangle(STriMeta meta, Vector n, Vector a, Vector b, Vector c) { + Vector ab = b.Minus(a), bc = c.Minus(b); + Vector np = ab.Cross(bc); + if(np.Magnitude() < 1e-10) { + // ugh; gl sometimes tesselates to collinear triangles + return; + } + if(np.Dot(n) > 0) { + AddTriangle(meta, a, b, c); + } else { + AddTriangle(meta, c, b, a); + } +} +void SMesh::AddTriangle(STriMeta meta, Vector a, Vector b, Vector c) { + STriangle t = {}; + t.meta = meta; + t.a = a; + t.b = b; + t.c = c; + AddTriangle(&t); +} +void SMesh::AddTriangle(STriangle *st) { + RgbaColor color = st->meta.color; + if(color.ToARGB32() != 0 && color.alpha != 255) isTransparent = true; + l.Add(st); +} + +void SMesh::DoBounding(Vector v, Vector *vmax, Vector *vmin) { + vmax->x = max(vmax->x, v.x); + vmax->y = max(vmax->y, v.y); + vmax->z = max(vmax->z, v.z); + + vmin->x = min(vmin->x, v.x); + vmin->y = min(vmin->y, v.y); + vmin->z = min(vmin->z, v.z); +} +void SMesh::GetBounding(Vector *vmax, Vector *vmin) { + int i; + *vmin = Vector::From( 1e12, 1e12, 1e12); + *vmax = Vector::From(-1e12, -1e12, -1e12); + for(i = 0; i < l.n; i++) { + STriangle *st = &(l.elem[i]); + DoBounding(st->a, vmax, vmin); + DoBounding(st->b, vmax, vmin); + DoBounding(st->c, vmax, vmin); + } +} + +//---------------------------------------------------------------------------- +// Report the edges of the boundary of the region(s) of our mesh that lie +// within the plane n dot p = d. +//---------------------------------------------------------------------------- +void SMesh::MakeEdgesInPlaneInto(SEdgeList *sel, Vector n, double d) { + SMesh m = {}; + m.MakeFromCopyOf(this); + + // Delete all triangles in the mesh that do not lie in our export plane. + m.l.ClearTags(); + int i; + for(i = 0; i < m.l.n; i++) { + STriangle *tr = &(m.l.elem[i]); + + if((fabs(n.Dot(tr->a) - d) >= LENGTH_EPS) || + (fabs(n.Dot(tr->b) - d) >= LENGTH_EPS) || + (fabs(n.Dot(tr->c) - d) >= LENGTH_EPS)) + { + tr->tag = 1; + } + } + m.l.RemoveTagged(); + + // Select the naked edges in our resulting open mesh. + SKdNode *root = SKdNode::From(&m); + root->SnapToMesh(&m); + root->MakeCertainEdgesInto(sel, SKdNode::NAKED_OR_SELF_INTER_EDGES, + false, NULL, NULL); + + m.Clear(); +} + +void SMesh::MakeCertainEdgesAndOutlinesInto(SEdgeList *sel, SOutlineList *sol, int type) { + SKdNode *root = SKdNode::From(this); + root->MakeCertainEdgesInto(sel, type, false, NULL, NULL); + root->MakeOutlinesInto(sol); +} + +//----------------------------------------------------------------------------- +// When we are called, all of the triangles from l.elem[start] to the end must +// be coplanar. So we try to find a set of fewer triangles that covers the +// exact same area, in order to reduce the number of triangles in the mesh. +// We use this after a triangle has been split against the BSP. +// +// This is really ugly code; basically it just pastes things together to +// form convex polygons, merging collinear edges when possible, then +// triangulates the convex poly. +//----------------------------------------------------------------------------- +void SMesh::Simplify(int start) { + int maxTriangles = (l.n - start) + 10; + + STriMeta meta = l.elem[start].meta; + + STriangle *tout = (STriangle *)AllocTemporary(maxTriangles*sizeof(*tout)); + int toutc = 0; + + Vector n = Vector::From(0, 0, 0); + Vector *conv = (Vector *)AllocTemporary(maxTriangles*3*sizeof(*conv)); + int convc = 0; + + int start0 = start; + + int i, j; + for(i = start; i < l.n; i++) { + STriangle *tr = &(l.elem[i]); + if(tr->MinAltitude() < LENGTH_EPS) { + tr->tag = 1; + } else { + tr->tag = 0; + } + } + + for(;;) { + bool didAdd; + convc = 0; + for(i = start; i < l.n; i++) { + STriangle *tr = &(l.elem[i]); + if(tr->tag) continue; + + tr->tag = 1; + n = (tr->Normal()).WithMagnitude(1); + conv[convc++] = tr->a; + conv[convc++] = tr->b; + conv[convc++] = tr->c; + + start = i+1; + break; + } + if(i >= l.n) break; + + do { + didAdd = false; + + for(j = 0; j < convc; j++) { + Vector a = conv[WRAP((j-1), convc)], + b = conv[j], + d = conv[WRAP((j+1), convc)], + e = conv[WRAP((j+2), convc)]; + + Vector c; + for(i = start; i < l.n; i++) { + STriangle *tr = &(l.elem[i]); + if(tr->tag) continue; + + if((tr->a).Equals(d) && (tr->b).Equals(b)) { + c = tr->c; + } else if((tr->b).Equals(d) && (tr->c).Equals(b)) { + c = tr->a; + } else if((tr->c).Equals(d) && (tr->a).Equals(b)) { + c = tr->b; + } else { + continue; + } + // The vertex at C must be convex; but the others must + // be tested + Vector ab = b.Minus(a); + Vector bc = c.Minus(b); + Vector cd = d.Minus(c); + Vector de = e.Minus(d); + + double bDot = (ab.Cross(bc)).Dot(n); + double dDot = (cd.Cross(de)).Dot(n); + + bDot /= min(ab.Magnitude(), bc.Magnitude()); + dDot /= min(cd.Magnitude(), de.Magnitude()); + + if(fabs(bDot) < LENGTH_EPS && fabs(dDot) < LENGTH_EPS) { + conv[WRAP((j+1), convc)] = c; + // and remove the vertex at j, which is a dup + memmove(conv+j, conv+j+1, + (convc - j - 1)*sizeof(conv[0])); + convc--; + } else if(fabs(bDot) < LENGTH_EPS && dDot > 0) { + conv[j] = c; + } else if(fabs(dDot) < LENGTH_EPS && bDot > 0) { + conv[WRAP((j+1), convc)] = c; + } else if(bDot > 0 && dDot > 0) { + // conv[j] is unchanged, conv[j+1] goes to [j+2] + memmove(conv+j+2, conv+j+1, + (convc - j - 1)*sizeof(conv[0])); + conv[j+1] = c; + convc++; + } else { + continue; + } + + didAdd = true; + tr->tag = 1; + break; + } + } + } while(didAdd); + + // I need to debug why this is required; sometimes the above code + // still generates a convex polygon + for(i = 0; i < convc; i++) { + Vector a = conv[WRAP((i-1), convc)], + b = conv[i], + c = conv[WRAP((i+1), convc)]; + Vector ab = b.Minus(a); + Vector bc = c.Minus(b); + double bDot = (ab.Cross(bc)).Dot(n); + bDot /= min(ab.Magnitude(), bc.Magnitude()); + + if(bDot < 0) return; // XXX, shouldn't happen + } + + for(i = 0; i < convc - 2; i++) { + STriangle tr = STriangle::From(meta, conv[0], conv[i+1], conv[i+2]); + if(tr.MinAltitude() > LENGTH_EPS) { + tout[toutc++] = tr; + } + } + } + + l.n = start0; + for(i = 0; i < toutc; i++) { + AddTriangle(&(tout[i])); + } + FreeTemporary(tout); + FreeTemporary(conv); +} + +void SMesh::AddAgainstBsp(SMesh *srcm, SBsp3 *bsp3) { + int i; + + for(i = 0; i < srcm->l.n; i++) { + STriangle *st = &(srcm->l.elem[i]); + int pn = l.n; + atLeastOneDiscarded = false; + SBsp3::InsertOrCreate(bsp3, st, this); + if(!atLeastOneDiscarded && (l.n != (pn+1))) { + l.n = pn; + if(flipNormal) { + AddTriangle(st->meta, st->c, st->b, st->a); + } else { + AddTriangle(st->meta, st->a, st->b, st->c); + } + } + if(l.n - pn > 1) { + Simplify(pn); + } + } +} + +void SMesh::MakeFromUnionOf(SMesh *a, SMesh *b) { + SBsp3 *bspa = SBsp3::FromMesh(a); + SBsp3 *bspb = SBsp3::FromMesh(b); + + flipNormal = false; + keepCoplanar = false; + AddAgainstBsp(b, bspa); + + flipNormal = false; + keepCoplanar = true; + AddAgainstBsp(a, bspb); +} + +void SMesh::MakeFromDifferenceOf(SMesh *a, SMesh *b) { + SBsp3 *bspa = SBsp3::FromMesh(a); + SBsp3 *bspb = SBsp3::FromMesh(b); + + flipNormal = true; + keepCoplanar = true; + AddAgainstBsp(b, bspa); + + flipNormal = false; + keepCoplanar = false; + AddAgainstBsp(a, bspb); +} + +void SMesh::MakeFromCopyOf(SMesh *a) { + int i; + for(i = 0; i < a->l.n; i++) { + AddTriangle(&(a->l.elem[i])); + } +} + +void SMesh::MakeFromAssemblyOf(SMesh *a, SMesh *b) { + MakeFromCopyOf(a); + MakeFromCopyOf(b); +} + +void SMesh::MakeFromTransformationOf(SMesh *a, + Vector trans, Quaternion q, double scale) +{ + STriangle *tr; + for(tr = a->l.First(); tr; tr = a->l.NextAfter(tr)) { + STriangle tt = *tr; + tt.a = (tt.a).ScaledBy(scale); + tt.b = (tt.b).ScaledBy(scale); + tt.c = (tt.c).ScaledBy(scale); + if(scale < 0) { + // The mirroring would otherwise turn a closed mesh inside out. + swap(tt.a, tt.b); + } + tt.a = (q.Rotate(tt.a)).Plus(trans); + tt.b = (q.Rotate(tt.b)).Plus(trans); + tt.c = (q.Rotate(tt.c)).Plus(trans); + AddTriangle(&tt); + } +} + +bool SMesh::IsEmpty(void) { + return (l.n == 0); +} + +uint32_t SMesh::FirstIntersectionWith(Point2d mp) { + Vector p0 = Vector::From(mp.x, mp.y, 0); + Vector gn = Vector::From(0, 0, 1); + + double maxT = -1e12; + uint32_t face = 0; + + int i; + for(i = 0; i < l.n; i++) { + STriangle tr = l.elem[i]; + tr.a = SS.GW.ProjectPoint3(tr.a); + tr.b = SS.GW.ProjectPoint3(tr.b); + tr.c = SS.GW.ProjectPoint3(tr.c); + + Vector n = tr.Normal(); + + if(n.Dot(gn) < LENGTH_EPS) continue; // back-facing or on edge + + if(tr.ContainsPointProjd(gn, p0)) { + // Let our line have the form r(t) = p0 + gn*t + double t = -(n.Dot((tr.a).Minus(p0)))/(n.Dot(gn)); + if(t > maxT) { + maxT = t; + face = tr.meta.face; + } + } + } + return face; +} + +STriangleLl *STriangleLl::Alloc(void) + { return (STriangleLl *)AllocTemporary(sizeof(STriangleLl)); } +SKdNode *SKdNode::Alloc(void) + { return (SKdNode *)AllocTemporary(sizeof(SKdNode)); } + +SKdNode *SKdNode::From(SMesh *m) { + int i; + STriangle *tra = (STriangle *)AllocTemporary((m->l.n) * sizeof(*tra)); + + for(i = 0; i < m->l.n; i++) { + tra[i] = m->l.elem[i]; + } + + srand(0); + int n = m->l.n; + while(n > 1) { + int k = rand() % n; + n--; + swap(tra[k], tra[n]); + } + + STriangleLl *tll = NULL; + for(i = 0; i < m->l.n; i++) { + STriangleLl *tn = STriangleLl::Alloc(); + tn->tri = &(tra[i]); + tn->next = tll; + tll = tn; + } + + return SKdNode::From(tll); +} + +SKdNode *SKdNode::From(STriangleLl *tll) { + int which = 0; + SKdNode *ret = Alloc(); + + int i; + int gtc[3] = { 0, 0, 0 }, ltc[3] = { 0, 0, 0 }, allc = 0; + double badness[3] = { 0, 0, 0 }; + double split[3] = { 0, 0, 0 }; + + if(!tll) { + goto leaf; + } + + for(i = 0; i < 3; i++) { + int tcnt = 0; + STriangleLl *ll; + for(ll = tll; ll; ll = ll->next) { + split[i] += (ll->tri->a).Element(i); + split[i] += (ll->tri->b).Element(i); + split[i] += (ll->tri->c).Element(i); + tcnt++; + } + split[i] /= (tcnt*3); + + for(ll = tll; ll; ll = ll->next) { + STriangle *tr = ll->tri; + + double a = (tr->a).Element(i), + b = (tr->b).Element(i), + c = (tr->c).Element(i); + + if(a < split[i] + KDTREE_EPS || + b < split[i] + KDTREE_EPS || + c < split[i] + KDTREE_EPS) + { + ltc[i]++; + } + if(a > split[i] - KDTREE_EPS || + b > split[i] - KDTREE_EPS || + c > split[i] - KDTREE_EPS) + { + gtc[i]++; + } + if(i == 0) allc++; + } + badness[i] = pow((double)ltc[i], 4) + pow((double)gtc[i], 4); + } + if(badness[0] < badness[1] && badness[0] < badness[2]) { + which = 0; + } else if(badness[1] < badness[2]) { + which = 1; + } else { + which = 2; + } + + if(allc < 3 || allc == gtc[which] || allc == ltc[which]) { + goto leaf; + } + + STriangleLl *ll; + STriangleLl *lgt, *llt; lgt = llt = NULL; + for(ll = tll; ll; ll = ll->next) { + STriangle *tr = ll->tri; + + double a = (tr->a).Element(which), + b = (tr->b).Element(which), + c = (tr->c).Element(which); + + if(a < split[which] + KDTREE_EPS || + b < split[which] + KDTREE_EPS || + c < split[which] + KDTREE_EPS) + { + STriangleLl *n = STriangleLl::Alloc(); + *n = *ll; + n->next = llt; + llt = n; + } + if(a > split[which] - KDTREE_EPS || + b > split[which] - KDTREE_EPS || + c > split[which] - KDTREE_EPS) + { + STriangleLl *n = STriangleLl::Alloc(); + *n = *ll; + n->next = lgt; + lgt = n; + } + } + + ret->which = which; + ret->c = split[which]; + ret->gt = SKdNode::From(lgt); + ret->lt = SKdNode::From(llt); + return ret; + +leaf: + ret->tris = tll; + return ret; +} + +void SKdNode::ClearTags(void) { + if(gt && lt) { + gt->ClearTags(); + lt->ClearTags(); + } else { + STriangleLl *ll; + for(ll = tris; ll; ll = ll->next) { + ll->tri->tag = 0; + } + } +} + +void SKdNode::AddTriangle(STriangle *tr) { + if(gt && lt) { + double ta = (tr->a).Element(which), + tb = (tr->b).Element(which), + tc = (tr->c).Element(which); + if(ta < c + KDTREE_EPS || + tb < c + KDTREE_EPS || + tc < c + KDTREE_EPS) + { + lt->AddTriangle(tr); + } + if(ta > c - KDTREE_EPS || + tb > c - KDTREE_EPS || + tc > c - KDTREE_EPS) + { + gt->AddTriangle(tr); + } + } else { + STriangleLl *tn = STriangleLl::Alloc(); + tn->tri = tr; + tn->next = tris; + tris = tn; + } +} + +void SKdNode::MakeMeshInto(SMesh *m) { + if(gt) gt->MakeMeshInto(m); + if(lt) lt->MakeMeshInto(m); + + STriangleLl *ll; + for(ll = tris; ll; ll = ll->next) { + if(ll->tri->tag) continue; + + m->AddTriangle(ll->tri); + ll->tri->tag = 1; + } +} + +void SKdNode::ListTrianglesInto(std::vector *tl) { + if(gt) gt->ListTrianglesInto(tl); + if(lt) lt->ListTrianglesInto(tl); + + STriangleLl *ll; + for(ll = tris; ll; ll = ll->next) { + if(ll->tri->tag) continue; + + tl->push_back(ll->tri); + ll->tri->tag = 1; + } +} + +//----------------------------------------------------------------------------- +// If any triangles in the mesh have an edge that goes through v (but not +// a vertex at v), then split those triangles so that they now have a vertex +// there. The existing triangle is modified, and the new triangle appears +// in extras. +//----------------------------------------------------------------------------- +void SKdNode::SnapToVertex(Vector v, SMesh *extras) { + if(gt && lt) { + double vc = v.Element(which); + if(vc < c + KDTREE_EPS) { + lt->SnapToVertex(v, extras); + } + if(vc > c - KDTREE_EPS) { + gt->SnapToVertex(v, extras); + } + // Nothing bad happens if the triangle to be split appears in both + // branches; the first call will split the triangle, so that the + // second call will do nothing, because the modified triangle will + // already contain v + } else { + STriangleLl *ll; + for(ll = tris; ll; ll = ll->next) { + STriangle *tr = ll->tri; + + // Do a cheap bbox test first + int k; + bool mightHit = true; + + for(k = 0; k < 3; k++) { + if((tr->a).Element(k) < v.Element(k) - KDTREE_EPS && + (tr->b).Element(k) < v.Element(k) - KDTREE_EPS && + (tr->c).Element(k) < v.Element(k) - KDTREE_EPS) + { + mightHit = false; + break; + } + if((tr->a).Element(k) > v.Element(k) + KDTREE_EPS && + (tr->b).Element(k) > v.Element(k) + KDTREE_EPS && + (tr->c).Element(k) > v.Element(k) + KDTREE_EPS) + { + mightHit = false; + break; + } + } + if(!mightHit) continue; + + if(tr->a.Equals(v)) { tr->a = v; continue; } + if(tr->b.Equals(v)) { tr->b = v; continue; } + if(tr->c.Equals(v)) { tr->c = v; continue; } + + if(v.OnLineSegment(tr->a, tr->b)) { + STriangle nt = STriangle::From(tr->meta, tr->a, v, tr->c); + extras->AddTriangle(&nt); + tr->a = v; + continue; + } + if(v.OnLineSegment(tr->b, tr->c)) { + STriangle nt = STriangle::From(tr->meta, tr->b, v, tr->a); + extras->AddTriangle(&nt); + tr->b = v; + continue; + } + if(v.OnLineSegment(tr->c, tr->a)) { + STriangle nt = STriangle::From(tr->meta, tr->c, v, tr->b); + extras->AddTriangle(&nt); + tr->c = v; + continue; + } + } + } +} + +//----------------------------------------------------------------------------- +// Snap to each vertex of each triangle of the given mesh. If the given mesh +// is identical to the mesh used to make this kd tree, then the result should +// be a vertex-to-vertex mesh. +//----------------------------------------------------------------------------- +void SKdNode::SnapToMesh(SMesh *m) { + int i, j, k; + for(i = 0; i < m->l.n; i++) { + STriangle *tr = &(m->l.elem[i]); + for(j = 0; j < 3; j++) { + Vector v = ((j == 0) ? tr->a : + ((j == 1) ? tr->b : + tr->c)); + + SMesh extra = {}; + SnapToVertex(v, &extra); + + for(k = 0; k < extra.l.n; k++) { + STriangle *tra = (STriangle *)AllocTemporary(sizeof(*tra)); + *tra = extra.l.elem[k]; + AddTriangle(tra); + } + extra.Clear(); + } + } +} + +//----------------------------------------------------------------------------- +// For all the edges in sel, split them against the given triangle, and test +// them for occlusion. Keep only the visible segments. sel is both our input +// and our output. +//----------------------------------------------------------------------------- +void SKdNode::SplitLinesAgainstTriangle(SEdgeList *sel, STriangle *tr, bool removeHidden) { + SEdgeList seln = {}; + + Vector tn = tr->Normal().WithMagnitude(1); + double td = tn.Dot(tr->a); + + // Consider front-facing triangles only. + if(tn.z > LENGTH_EPS) { + // If the edge crosses our triangle's plane, then split into above + // and below parts. Note that we must preserve auxA, which contains + // the style associated with this line. + SEdge *se; + for(se = sel->l.First(); se; se = sel->l.NextAfter(se)) { + double da = (se->a).Dot(tn) - td, + db = (se->b).Dot(tn) - td; + if((da < -LENGTH_EPS && db > LENGTH_EPS) || + (db < -LENGTH_EPS && da > LENGTH_EPS)) + { + Vector m = Vector::AtIntersectionOfPlaneAndLine( + tn, td, + se->a, se->b, NULL); + seln.AddEdge(m, se->b, se->auxA); + se->b = m; + } + } + for(se = seln.l.First(); se; se = seln.l.NextAfter(se)) { + sel->AddEdge(se->a, se->b, se->auxA); + } + seln.Clear(); + + for(se = sel->l.First(); se; se = sel->l.NextAfter(se)) { + Vector pt = ((se->a).Plus(se->b)).ScaledBy(0.5); + if(pt.Dot(tn) - td > -LENGTH_EPS) { + // Edge is in front of or on our plane (remember, tn.z > 0) + // so it is exempt from further splitting + se->auxB = 1; + } else { + // Edge is behind our plane, needs further splitting + se->auxB = 0; + } + } + + // Considering only the (x, y) coordinates, split the edge against our + // triangle. + Point2d a = (tr->a).ProjectXy(), + b = (tr->b).ProjectXy(), + c = (tr->c).ProjectXy(); + + Point2d n[3] = { (b.Minus(a)).Normal().WithMagnitude(1), + (c.Minus(b)).Normal().WithMagnitude(1), + (a.Minus(c)).Normal().WithMagnitude(1) }; + + double d[3] = { n[0].Dot(b), + n[1].Dot(c), + n[2].Dot(a) }; + + // Split all of the edges where they intersect the triangle edges + int i; + for(i = 0; i < 3; i++) { + for(se = sel->l.First(); se; se = sel->l.NextAfter(se)) { + if(se->auxB) continue; + + Point2d ap = (se->a).ProjectXy(), + bp = (se->b).ProjectXy(); + double da = n[i].Dot(ap) - d[i], + db = n[i].Dot(bp) - d[i]; + if((da < -LENGTH_EPS && db > LENGTH_EPS) || + (db < -LENGTH_EPS && da > LENGTH_EPS)) + { + double dab = (db - da); + Vector spl = ((se->a).ScaledBy( db/dab)).Plus( + (se->b).ScaledBy(-da/dab)); + seln.AddEdge(spl, se->b, se->auxA); + se->b = spl; + } + } + for(se = seln.l.First(); se; se = seln.l.NextAfter(se)) { + // The split pieces are all behind the triangle, since only + // edges behind the triangle got split. So their auxB is 0. + sel->AddEdge(se->a, se->b, se->auxA, 0); + } + seln.Clear(); + } + + for(se = sel->l.First(); se; se = sel->l.NextAfter(se)) { + if(se->auxB) { + // Lies above or on the triangle plane, so triangle doesn't + // occlude it. + se->tag = 0; + } else { + // Test the segment to see if it lies outside the triangle + // (i.e., outside wrt at least one edge), and keep it only + // then. + Point2d pt = ((se->a).Plus(se->b).ScaledBy(0.5)).ProjectXy(); + se->tag = 1; + for(i = 0; i < 3; i++) { + // If the test point lies on the boundary of our triangle, + // then we still discard the edge. + if(n[i].Dot(pt) - d[i] > LENGTH_EPS) se->tag = 0; + } + } + if(!removeHidden && se->tag == 1) + se->auxA = Style::HIDDEN_EDGE; + } + if(removeHidden) + sel->l.RemoveTagged(); + } +} + +//----------------------------------------------------------------------------- +// Given an edge orig, occlusion test it against our mesh. We output an edge +// list in sel, containing the visible portions of that edge. +//----------------------------------------------------------------------------- +void SKdNode::OcclusionTestLine(SEdge orig, SEdgeList *sel, int cnt, bool removeHidden) { + if(gt && lt) { + double ac = (orig.a).Element(which), + bc = (orig.b).Element(which); + // We can ignore triangles that are separated in x or y, but triangles + // that are separated in z may still contribute + if(ac < c + KDTREE_EPS || + bc < c + KDTREE_EPS || + which == 2) + { + lt->OcclusionTestLine(orig, sel, cnt, removeHidden); + } + if(ac > c - KDTREE_EPS || + bc > c - KDTREE_EPS || + which == 2) + { + gt->OcclusionTestLine(orig, sel, cnt, removeHidden); + } + } else { + STriangleLl *ll; + for(ll = tris; ll; ll = ll->next) { + STriangle *tr = ll->tri; + + if(tr->tag == cnt) continue; + + SplitLinesAgainstTriangle(sel, tr, removeHidden); + tr->tag = cnt; + } + } +} + +//----------------------------------------------------------------------------- +// Search the mesh for a triangle with an edge from b to a (i.e., the mate +// for the edge from a to b), and increment info->count each time that we +// find one. If a triangle is found, then report whether it is front- or +// back-facing using info->frontFacing. And regardless of whether a mate is +// found, report whether the edge intersects the mesh with info->intersectsMesh; +// if coplanarIsInter then we count the edge as intersecting if it's coplanar +// with a triangle in the mesh, otherwise not. +//----------------------------------------------------------------------------- +void SKdNode::FindEdgeOn(Vector a, Vector b, int cnt, bool coplanarIsInter, + EdgeOnInfo *info) +{ + if(gt && lt) { + double ac = a.Element(which), + bc = b.Element(which); + if(ac < c + KDTREE_EPS || + bc < c + KDTREE_EPS) + { + lt->FindEdgeOn(a, b, cnt, coplanarIsInter, info); + } + if(ac > c - KDTREE_EPS || + bc > c - KDTREE_EPS) + { + gt->FindEdgeOn(a, b, cnt, coplanarIsInter, info); + } + return; + } + + // We are a leaf node; so we iterate over all the triangles in our + // linked list. + STriangleLl *ll; + for(ll = tris; ll; ll = ll->next) { + STriangle *tr = ll->tri; + + if(tr->tag == cnt) continue; + + // Test if this triangle matches up with the given edge + if((a.Equals(tr->b) && b.Equals(tr->a)) || + (a.Equals(tr->c) && b.Equals(tr->b)) || + (a.Equals(tr->a) && b.Equals(tr->c))) + { + info->count++; + // Record whether this triangle is front- or back-facing. + if(tr->Normal().z > LENGTH_EPS) { + info->frontFacing = true; + } else { + info->frontFacing = false; + } + // Record the triangle + info->tr = tr; + // And record which vertexes a and b correspond to + info->ai = a.Equals(tr->a) ? 0 : (a.Equals(tr->b) ? 1 : 2); + info->bi = b.Equals(tr->a) ? 0 : (b.Equals(tr->b) ? 1 : 2); + } else if(((a.Equals(tr->a) && b.Equals(tr->b)) || + (a.Equals(tr->b) && b.Equals(tr->c)) || + (a.Equals(tr->c) && b.Equals(tr->a)))) + { + // It's an edge of this triangle, okay. + } else { + // Check for self-intersection + Vector n = (tr->Normal()).WithMagnitude(1); + double d = (tr->a).Dot(n); + double pa = a.Dot(n) - d, pb = b.Dot(n) - d; + // It's an intersection if neither point lies in-plane, + // and the edge crosses the plane (should handle in-plane + // intersections separately but don't yet). + if((pa < -LENGTH_EPS || pa > LENGTH_EPS) && + (pb < -LENGTH_EPS || pb > LENGTH_EPS) && + (pa*pb < 0)) + { + // The edge crosses the plane of the triangle; now see if + // it crosses inside the triangle. + if(tr->ContainsPointProjd(b.Minus(a), a)) { + if(coplanarIsInter) { + info->intersectsMesh = true; + } else { + Vector p = Vector::AtIntersectionOfPlaneAndLine( + n, d, a, b, NULL); + Vector ta = tr->a, + tb = tr->b, + tc = tr->c; + if((p.DistanceToLine(ta, tb.Minus(ta)) < LENGTH_EPS) || + (p.DistanceToLine(tb, tc.Minus(tb)) < LENGTH_EPS) || + (p.DistanceToLine(tc, ta.Minus(tc)) < LENGTH_EPS)) + { + // Intersection lies on edge. This happens when + // our edge is from a triangle coplanar with + // another triangle in the mesh. We don't test + // the edge against triangles whose plane contains + // that edge, but we do end up testing against + // the coplanar triangle's neighbours, which we + // will intersect on their edges. + } else { + info->intersectsMesh = true; + } + } + } + } + } + + // Ensure that we don't count this triangle twice if it appears + // in two buckets of the kd tree. + tr->tag = cnt; + } +} + +static bool CheckAndAddTrianglePair(std::set> *pairs, + STriangle *a, STriangle *b) +{ + if(pairs->find(std::make_pair(a, b)) != pairs->end() || + pairs->find(std::make_pair(b, a)) != pairs->end()) + return true; + + pairs->emplace(a, b); + return false; +} + +//----------------------------------------------------------------------------- +// Pick certain classes of edges out from our mesh. These might be: +// * naked edges (i.e., edges with no anti-parallel neighbor) and self- +// intersecting edges (i.e., edges that cross another triangle) +// * turning edges (i.e., edges where a front-facing triangle joins +// a back-facing triangle) +// * emphasized edges (i.e., edges where a triangle from one face joins +// a triangle from a different face) +//----------------------------------------------------------------------------- +void SKdNode::MakeCertainEdgesInto(SEdgeList *sel, int how, bool coplanarIsInter, + bool *inter, bool *leaky, int auxA) +{ + if(inter) *inter = false; + if(leaky) *leaky = false; + + std::vector tris; + ClearTags(); + ListTrianglesInto(&tris); + + std::set> edgeTris; + int cnt = 1234; + for(STriangle *tr : tris) { + for(int j = 0; j < 3; j++) { + Vector a = (j == 0) ? tr->a : ((j == 1) ? tr->b : tr->c); + Vector b = (j == 0) ? tr->b : ((j == 1) ? tr->c : tr->a); + + SKdNode::EdgeOnInfo info = {}; + FindEdgeOn(a, b, cnt, coplanarIsInter, &info); + + switch(how) { + case NAKED_OR_SELF_INTER_EDGES: + if(info.count != 1) { + sel->AddEdge(a, b, auxA); + if(leaky) *leaky = true; + } + if(info.intersectsMesh) { + sel->AddEdge(a, b, auxA); + if(inter) *inter = true; + } + break; + + case SELF_INTER_EDGES: + if(info.intersectsMesh) { + sel->AddEdge(a, b, auxA); + if(inter) *inter = true; + } + break; + + case TURNING_EDGES: + if((tr->Normal().z < LENGTH_EPS) && + (info.count == 1) && + info.frontFacing) + { + if(CheckAndAddTrianglePair(&edgeTris, tr, info.tr)) + break; + // This triangle is back-facing (or on edge), and + // this edge has exactly one mate, and that mate is + // front-facing. So this is a turning edge. + sel->AddEdge(a, b, auxA); + } + break; + + case EMPHASIZED_EDGES: + if(info.count == 1 && tr->meta.face != info.tr->meta.face) { + if(CheckAndAddTrianglePair(&edgeTris, tr, info.tr)) + break; + // The two triangles that join at this edge come from + // different faces; either really different faces, + // or one is from a face and the other is zero (i.e., + // not from a face). + sel->AddEdge(a, b, auxA); + } + break; + + case SHARP_EDGES: + if(info.count == 1) { + Vector na0 = (j == 0) ? tr->an : + ((j == 1) ? tr->bn : tr->cn); + Vector nb0 = (j == 0) ? tr->bn : + ((j == 1) ? tr->cn : tr->an); + Vector na1 = (info.ai == 0) ? info.tr->an : + ((info.ai == 1) ? info.tr->bn : info.tr->cn); + Vector nb1 = (info.bi == 0) ? info.tr->an : + ((info.bi == 1) ? info.tr->bn : info.tr->cn); + na0 = na0.WithMagnitude(1.0); + nb0 = nb0.WithMagnitude(1.0); + na1 = na1.WithMagnitude(1.0); + nb1 = nb1.WithMagnitude(1.0); + if(!((na0.Equals(na1) && nb0.Equals(nb1)) || + (na0.Equals(nb1) && nb0.Equals(na1)))) { + if(CheckAndAddTrianglePair(&edgeTris, tr, info.tr)) + break; + // The two triangles that join at this edge meet at a sharp + // angle. This implies they come from different faces. + sel->AddEdge(a, b, auxA); + } + } + break; + + default: oops(); + } + + cnt++; + } + } +} + +void SKdNode::MakeOutlinesInto(SOutlineList *sol) +{ + std::vector tris; + ClearTags(); + ListTrianglesInto(&tris); + + std::set> edgeTris; + int cnt = 1234; + for(STriangle *tr : tris) { + for(int j = 0; j < 3; j++) { + Vector a = (j == 0) ? tr->a : ((j == 1) ? tr->b : tr->c); + Vector b = (j == 0) ? tr->b : ((j == 1) ? tr->c : tr->a); + + SKdNode::EdgeOnInfo info = {}; + FindEdgeOn(a, b, cnt, /*coplanarIsInter=*/false, &info); + cnt++; + if(info.count != 1) continue; + if(CheckAndAddTrianglePair(&edgeTris, tr, info.tr)) + continue; + + sol->AddEdge(a, b, tr->Normal(), info.tr->Normal()); + } + } +} + +void SOutlineList::Clear() { + l.Clear(); +} + +void SOutlineList::AddEdge(Vector a, Vector b, Vector nl, Vector nr) { + SOutline so = {}; + so.a = a; + so.b = b; + so.nl = nl; + so.nr = nr; + l.Add(&so); +} + +void SOutlineList::FillOutlineTags(Vector projDir) { + for(SOutline *so = l.First(); so; so = l.NextAfter(so)) { + so->tag = ((so->nl.Dot(projDir) > 0.0) != (so->nr.Dot(projDir) > 0.0)); + } +} + +void SOutlineList::MakeFromCopyOf(SOutlineList *sol) { + for(SOutline *so = sol->l.First(); so; so = sol->l.NextAfter(so)) { + l.Add(so); + } +} diff --git a/src/modify.cpp b/src/modify.cpp new file mode 100644 index 0000000..47eee36 --- /dev/null +++ b/src/modify.cpp @@ -0,0 +1,670 @@ +//----------------------------------------------------------------------------- +// User-initiated (not parametric) operations to modify our sketch, by +// changing the requests, like to round a corner or split curves where they +// intersect. +// +// Copyright 2008-2013 Jonathan Westhues. +//----------------------------------------------------------------------------- +#include "solvespace.h" + +//----------------------------------------------------------------------------- +// Replace constraints on oldpt with the same constraints on newpt. +// Useful when splitting, tangent arcing, or removing bezier points. +//----------------------------------------------------------------------------- +void GraphicsWindow::ReplacePointInConstraints(hEntity oldpt, hEntity newpt) { + int i; + for(i = 0; i < SK.constraint.n; i++) { + Constraint *c = &(SK.constraint.elem[i]); + if(c->ptA.v == oldpt.v) c->ptA = newpt; + if(c->ptB.v == oldpt.v) c->ptB = newpt; + } +} + +//----------------------------------------------------------------------------- +// Remove constraints on hpt. Useful when removing bezier points. +//----------------------------------------------------------------------------- +void GraphicsWindow::RemoveConstraintsForPointBeingDeleted(hEntity hpt) { + SK.constraint.ClearTags(); + for(int i = 0; i < SK.constraint.n; i++) { + Constraint *c = &(SK.constraint.elem[i]); + if(c->ptA.v == hpt.v || c->ptB.v == hpt.v) { + c->tag = 1; + (SS.deleted.constraints)++; + if(c->type != Constraint::POINTS_COINCIDENT && + c->type != Constraint::HORIZONTAL && + c->type != Constraint::VERTICAL) + { + (SS.deleted.nonTrivialConstraints)++; + } + } + } + SK.constraint.RemoveTagged(); +} + +//----------------------------------------------------------------------------- +// Let's say that A is coincident with B, and B is coincident with C. This +// implies that A is coincident with C; but if we delete B, then both +// constraints must be deleted too (since they reference B), and A is no +// longer constrained to C. This routine adds back that constraint. +//----------------------------------------------------------------------------- +void GraphicsWindow::FixConstraintsForRequestBeingDeleted(hRequest hr) { + Request *r = SK.GetRequest(hr); + if(r->group.v != SS.GW.activeGroup.v) return; + + Entity *e; + for(e = SK.entity.First(); e; e = SK.entity.NextAfter(e)) { + if(!(e->h.isFromRequest())) continue; + if(e->h.request().v != hr.v) continue; + + if(e->type != Entity::POINT_IN_2D && + e->type != Entity::POINT_IN_3D) + { + continue; + } + + // This is a point generated by the request being deleted; so fix + // the constraints for that. + FixConstraintsForPointBeingDeleted(e->h); + } +} +void GraphicsWindow::FixConstraintsForPointBeingDeleted(hEntity hpt) { + List ld = {}; + + Constraint *c; + SK.constraint.ClearTags(); + for(c = SK.constraint.First(); c; c = SK.constraint.NextAfter(c)) { + if(c->type != Constraint::POINTS_COINCIDENT) continue; + if(c->group.v != SS.GW.activeGroup.v) continue; + + if(c->ptA.v == hpt.v) { + ld.Add(&(c->ptB)); + c->tag = 1; + } + if(c->ptB.v == hpt.v) { + ld.Add(&(c->ptA)); + c->tag = 1; + } + } + // Remove constraints without waiting for regeneration; this way + // if another point takes the place of the deleted one (e.g. when + // removing control points of a bezier) the constraint doesn't + // spuriously move. Similarly, subsequent calls of this function + // (if multiple coincident points are getting deleted) will work + // correctly. + SK.constraint.RemoveTagged(); + + // If more than one point was constrained coincident with hpt, then + // those two points were implicitly coincident with each other. By + // deleting hpt (and all constraints that mention it), we will delete + // that relationship. So put it back here now. + int i; + for(i = 1; i < ld.n; i++) { + Constraint::ConstrainCoincident(ld.elem[i-1], ld.elem[i]); + } + ld.Clear(); +} + +//----------------------------------------------------------------------------- +// A curve by its parametric equation, helper functions for computing tangent +// arcs by a numerical method. +//----------------------------------------------------------------------------- +void GraphicsWindow::ParametricCurve::MakeFromEntity(hEntity he, bool reverse) { + *this = {}; + Entity *e = SK.GetEntity(he); + if(e->type == Entity::LINE_SEGMENT) { + isLine = true; + p0 = e->EndpointStart(), + p1 = e->EndpointFinish(); + if(reverse) { + swap(p0, p1); + } + } else if(e->type == Entity::ARC_OF_CIRCLE) { + isLine = false; + p0 = SK.GetEntity(e->point[0])->PointGetNum(); + Vector pe = SK.GetEntity(e->point[1])->PointGetNum(); + r = (pe.Minus(p0)).Magnitude(); + e->ArcGetAngles(&theta0, &theta1, &dtheta); + if(reverse) { + swap(theta0, theta1); + dtheta = -dtheta; + } + EntityBase *wrkpln = SK.GetEntity(e->workplane)->Normal(); + u = wrkpln->NormalU(); + v = wrkpln->NormalV(); + } else { + oops(); + } +} +double GraphicsWindow::ParametricCurve::LengthForAuto(void) { + if(isLine) { + // Allow a third of the line to disappear with auto radius + return (p1.Minus(p0)).Magnitude() / 3; + } else { + // But only a twentieth of the arc; shorter means fewer numerical + // problems since the curve is more linear over shorter sections. + return (fabs(dtheta)*r)/20; + } +} +Vector GraphicsWindow::ParametricCurve::PointAt(double t) { + if(isLine) { + return p0.Plus((p1.Minus(p0)).ScaledBy(t)); + } else { + double theta = theta0 + dtheta*t; + return p0.Plus(u.ScaledBy(r*cos(theta)).Plus(v.ScaledBy(r*sin(theta)))); + } +} +Vector GraphicsWindow::ParametricCurve::TangentAt(double t) { + if(isLine) { + return p1.Minus(p0); + } else { + double theta = theta0 + dtheta*t; + Vector t = u.ScaledBy(-r*sin(theta)).Plus(v.ScaledBy(r*cos(theta))); + t = t.ScaledBy(dtheta); + return t; + } +} +hRequest GraphicsWindow::ParametricCurve::CreateRequestTrimmedTo(double t, + bool extraConstraints, hEntity orig, hEntity arc, bool arcFinish) +{ + hRequest hr; + Entity *e; + if(isLine) { + hr = SS.GW.AddRequest(Request::LINE_SEGMENT, false), + e = SK.GetEntity(hr.entity(0)); + SK.GetEntity(e->point[0])->PointForceTo(PointAt(t)); + SK.GetEntity(e->point[1])->PointForceTo(PointAt(1)); + ConstrainPointIfCoincident(e->point[0]); + ConstrainPointIfCoincident(e->point[1]); + if(extraConstraints) { + Constraint::Constrain(Constraint::PT_ON_LINE, + hr.entity(1), Entity::NO_ENTITY, orig); + } + Constraint::Constrain(Constraint::ARC_LINE_TANGENT, + Entity::NO_ENTITY, Entity::NO_ENTITY, + arc, e->h, arcFinish, false); + } else { + hr = SS.GW.AddRequest(Request::ARC_OF_CIRCLE, false), + e = SK.GetEntity(hr.entity(0)); + SK.GetEntity(e->point[0])->PointForceTo(p0); + if(dtheta > 0) { + SK.GetEntity(e->point[1])->PointForceTo(PointAt(t)); + SK.GetEntity(e->point[2])->PointForceTo(PointAt(1)); + } else { + SK.GetEntity(e->point[2])->PointForceTo(PointAt(t)); + SK.GetEntity(e->point[1])->PointForceTo(PointAt(1)); + } + ConstrainPointIfCoincident(e->point[0]); + ConstrainPointIfCoincident(e->point[1]); + ConstrainPointIfCoincident(e->point[2]); + // The tangency constraint alone is enough to fully constrain it, + // so there's no need for more. + Constraint::Constrain(Constraint::CURVE_CURVE_TANGENT, + Entity::NO_ENTITY, Entity::NO_ENTITY, + arc, e->h, arcFinish, (dtheta < 0)); + } + return hr; +} + +//----------------------------------------------------------------------------- +// If a point in the same group as hpt, and numerically coincident with hpt, +// happens to exist, then constrain that point coincident to hpt. +//----------------------------------------------------------------------------- +void GraphicsWindow::ParametricCurve::ConstrainPointIfCoincident(hEntity hpt) { + Entity *e, *pt; + pt = SK.GetEntity(hpt); + Vector ev, ptv; + ptv = pt->PointGetNum(); + + for(e = SK.entity.First(); e; e = SK.entity.NextAfter(e)) { + if(e->h.v == pt->h.v) continue; + if(!e->IsPoint()) continue; + if(e->group.v != pt->group.v) continue; + if(e->workplane.v != pt->workplane.v) continue; + + ev = e->PointGetNum(); + if(!ev.Equals(ptv)) continue; + + Constraint::ConstrainCoincident(hpt, e->h); + break; + } +} + +//----------------------------------------------------------------------------- +// A single point must be selected when this function is called. We find two +// non-construction line segments that join at this point, and create a +// tangent arc joining them. +//----------------------------------------------------------------------------- +void GraphicsWindow::MakeTangentArc(void) { + if(!LockedInWorkplane()) { + Error("Must be sketching in workplane to create tangent " + "arc."); + return; + } + + // The point corresponding to the vertex to be rounded. + Vector pshared = SK.GetEntity(gs.point[0])->PointGetNum(); + ClearSelection(); + + // First, find two requests (that are not construction, and that are + // in our group and workplane) that generate entities that have an + // endpoint at our vertex to be rounded. + int i, c = 0; + Entity *ent[2]; + Request *req[2]; + hRequest hreq[2]; + hEntity hent[2]; + bool pointf[2]; + for(i = 0; i < SK.request.n; i++) { + Request *r = &(SK.request.elem[i]); + if(r->group.v != activeGroup.v) continue; + if(r->workplane.v != ActiveWorkplane().v) continue; + if(r->construction) continue; + if(r->type != Request::LINE_SEGMENT && + r->type != Request::ARC_OF_CIRCLE) + { + continue; + } + + Entity *e = SK.GetEntity(r->h.entity(0)); + Vector ps = e->EndpointStart(), + pf = e->EndpointFinish(); + + if(ps.Equals(pshared) || pf.Equals(pshared)) { + if(c < 2) { + // We record the entity and request and their handles, + // and whether the vertex to be rounded is the start or + // finish of this entity. + ent[c] = e; + hent[c] = e->h; + req[c] = r; + hreq[c] = r->h; + pointf[c] = (pf.Equals(pshared)); + } + c++; + } + } + if(c != 2) { + Error("To create a tangent arc, select a point where two " + "non-construction lines or cicles in this group and " + "workplane join."); + return; + } + + Entity *wrkpl = SK.GetEntity(ActiveWorkplane()); + Vector wn = wrkpl->Normal()->NormalN(); + + // Based on these two entities, we make the objects that we'll use to + // numerically find the tangent arc. + ParametricCurve pc[2]; + pc[0].MakeFromEntity(ent[0]->h, pointf[0]); + pc[1].MakeFromEntity(ent[1]->h, pointf[1]); + + // And thereafter we mustn't touch the entity or req ptrs, + // because the new requests/entities we add might force a + // realloc. + memset(ent, 0, sizeof(ent)); + memset(req, 0, sizeof(req)); + + Vector pinter; + double r = 0.0, vv = 0.0; + // We now do Newton iterations to find the tangent arc, and its positions + // t back along the two curves, starting from shared point of the curves + // at t = 0. Lots of iterations helps convergence, and this is still + // ~10 ms for everything. + int iters = 1000; + double t[2] = { 0, 0 }, tp[2]; + for(i = 0; i < iters + 20; i++) { + Vector p0 = pc[0].PointAt(t[0]), + p1 = pc[1].PointAt(t[1]), + t0 = pc[0].TangentAt(t[0]), + t1 = pc[1].TangentAt(t[1]); + + pinter = Vector::AtIntersectionOfLines(p0, p0.Plus(t0), + p1, p1.Plus(t1), + NULL, NULL, NULL); + + // The sign of vv determines whether shortest distance is + // clockwise or anti-clockwise. + Vector v = (wn.Cross(t0)).WithMagnitude(1); + vv = t1.Dot(v); + + double dot = (t0.WithMagnitude(1)).Dot(t1.WithMagnitude(1)); + double theta = acos(dot); + + if(SS.tangentArcManual) { + r = SS.tangentArcRadius; + } else { + r = 200/scale; + // Set the radius so that no more than one third of the + // line segment disappears. + r = min(r, pc[0].LengthForAuto()*tan(theta/2)); + r = min(r, pc[1].LengthForAuto()*tan(theta/2));; + } + // We are source-stepping the radius, to improve convergence. So + // ramp that for most of the iterations, and then do a few at + // the end with that constant for polishing. + if(i < iters) { + r *= 0.1 + 0.9*i/((double)iters); + } + + // The distance from the intersection of the lines to the endpoint + // of the arc, along each line. + double el = r/tan(theta/2); + + // Compute the endpoints of the arc, for each curve + Vector pa0 = pinter.Plus(t0.WithMagnitude(el)), + pa1 = pinter.Plus(t1.WithMagnitude(el)); + + tp[0] = t[0]; + tp[1] = t[1]; + + // And convert those points to parameter values along the curve. + t[0] += (pa0.Minus(p0)).DivPivoting(t0); + t[1] += (pa1.Minus(p1)).DivPivoting(t1); + } + + // Stupid check for convergence, and for an out of range result (as + // we would get, for example, if the line is too short to fit the + // rounding arc). + if(fabs(tp[0] - t[0]) > 1e-3 || fabs(tp[1] - t[1]) > 1e-3 || + t[0] < 0.01 || t[1] < 0.01 || + t[0] > 0.99 || t[1] > 0.99 || + isnan(t[0]) || isnan(t[1])) + { + Error("Couldn't round this corner. Try a smaller radius, or try " + "creating the desired geometry by hand with tangency " + "constraints."); + return; + } + + // Compute the location of the center of the arc + Vector center = pc[0].PointAt(t[0]), + v0inter = pinter.Minus(center); + int a, b; + if(vv < 0) { + a = 1; b = 2; + center = center.Minus(v0inter.Cross(wn).WithMagnitude(r)); + } else { + a = 2; b = 1; + center = center.Plus(v0inter.Cross(wn).WithMagnitude(r)); + } + + SS.UndoRemember(); + + hRequest harc = AddRequest(Request::ARC_OF_CIRCLE, false); + Entity *earc = SK.GetEntity(harc.entity(0)); + hEntity hearc = earc->h; + + SK.GetEntity(earc->point[0])->PointForceTo(center); + SK.GetEntity(earc->point[a])->PointForceTo(pc[0].PointAt(t[0])); + SK.GetEntity(earc->point[b])->PointForceTo(pc[1].PointAt(t[1])); + + earc = NULL; + + pc[0].CreateRequestTrimmedTo(t[0], !SS.tangentArcDeleteOld, + hent[0], hearc, (b == 1)); + pc[1].CreateRequestTrimmedTo(t[1], !SS.tangentArcDeleteOld, + hent[1], hearc, (a == 1)); + + // Now either make the original entities construction, or delete them + // entirely, according to user preference. + Request *re; + SK.request.ClearTags(); + for(re = SK.request.First(); re; re = SK.request.NextAfter(re)) { + if(re->h.v == hreq[0].v || re->h.v == hreq[1].v) { + if(SS.tangentArcDeleteOld) { + re->tag = 1; + } else { + re->construction = true; + } + } + } + if(SS.tangentArcDeleteOld) { + DeleteTaggedRequests(); + } + + SS.ScheduleGenerateAll(); +} + +hEntity GraphicsWindow::SplitLine(hEntity he, Vector pinter) { + // Save the original endpoints, since we're about to delete this entity. + Entity *e01 = SK.GetEntity(he); + hEntity hep0 = e01->point[0], hep1 = e01->point[1]; + Vector p0 = SK.GetEntity(hep0)->PointGetNum(), + p1 = SK.GetEntity(hep1)->PointGetNum(); + + // Add the two line segments this one gets split into. + hRequest r0i = AddRequest(Request::LINE_SEGMENT, false), + ri1 = AddRequest(Request::LINE_SEGMENT, false); + // Don't get entities till after adding, realloc issues + + Entity *e0i = SK.GetEntity(r0i.entity(0)), + *ei1 = SK.GetEntity(ri1.entity(0)); + + SK.GetEntity(e0i->point[0])->PointForceTo(p0); + SK.GetEntity(e0i->point[1])->PointForceTo(pinter); + SK.GetEntity(ei1->point[0])->PointForceTo(pinter); + SK.GetEntity(ei1->point[1])->PointForceTo(p1); + + ReplacePointInConstraints(hep0, e0i->point[0]); + ReplacePointInConstraints(hep1, ei1->point[1]); + Constraint::ConstrainCoincident(e0i->point[1], ei1->point[0]); + return e0i->point[1]; +} + +hEntity GraphicsWindow::SplitCircle(hEntity he, Vector pinter) { + Entity *circle = SK.GetEntity(he); + if(circle->type == Entity::CIRCLE) { + // Start with an unbroken circle, split it into a 360 degree arc. + Vector center = SK.GetEntity(circle->point[0])->PointGetNum(); + + circle = NULL; // shortly invalid! + hRequest hr = AddRequest(Request::ARC_OF_CIRCLE, false); + + Entity *arc = SK.GetEntity(hr.entity(0)); + + SK.GetEntity(arc->point[0])->PointForceTo(center); + SK.GetEntity(arc->point[1])->PointForceTo(pinter); + SK.GetEntity(arc->point[2])->PointForceTo(pinter); + + Constraint::ConstrainCoincident(arc->point[1], arc->point[2]); + return arc->point[1]; + } else { + // Start with an arc, break it in to two arcs + hEntity hc = circle->point[0], + hs = circle->point[1], + hf = circle->point[2]; + Vector center = SK.GetEntity(hc)->PointGetNum(), + start = SK.GetEntity(hs)->PointGetNum(), + finish = SK.GetEntity(hf)->PointGetNum(); + + circle = NULL; // shortly invalid! + hRequest hr0 = AddRequest(Request::ARC_OF_CIRCLE, false), + hr1 = AddRequest(Request::ARC_OF_CIRCLE, false); + + Entity *arc0 = SK.GetEntity(hr0.entity(0)), + *arc1 = SK.GetEntity(hr1.entity(0)); + + SK.GetEntity(arc0->point[0])->PointForceTo(center); + SK.GetEntity(arc0->point[1])->PointForceTo(start); + SK.GetEntity(arc0->point[2])->PointForceTo(pinter); + + SK.GetEntity(arc1->point[0])->PointForceTo(center); + SK.GetEntity(arc1->point[1])->PointForceTo(pinter); + SK.GetEntity(arc1->point[2])->PointForceTo(finish); + + ReplacePointInConstraints(hs, arc0->point[1]); + ReplacePointInConstraints(hf, arc1->point[2]); + Constraint::ConstrainCoincident(arc0->point[2], arc1->point[1]); + return arc0->point[2]; + } +} + +hEntity GraphicsWindow::SplitCubic(hEntity he, Vector pinter) { + // Save the original endpoints, since we're about to delete this entity. + Entity *e01 = SK.GetEntity(he); + SBezierList sbl = {}; + e01->GenerateBezierCurves(&sbl); + + hEntity hep0 = e01->point[0], + hep1 = e01->point[3+e01->extraPoints], + hep0n = Entity::NO_ENTITY, // the new start point + hep1n = Entity::NO_ENTITY, // the new finish point + hepin = Entity::NO_ENTITY; // the intersection point + + // The curve may consist of multiple cubic segments. So find which one + // contains the intersection point. + double t; + int i, j; + for(i = 0; i < sbl.l.n; i++) { + SBezier *sb = &(sbl.l.elem[i]); + if(sb->deg != 3) oops(); + + sb->ClosestPointTo(pinter, &t, false); + if(pinter.Equals(sb->PointAt(t))) { + // Split that segment at the intersection. + SBezier b0i, bi1, b01 = *sb; + b01.SplitAt(t, &b0i, &bi1); + + // Add the two cubic segments this one gets split into. + hRequest r0i = AddRequest(Request::CUBIC, false), + ri1 = AddRequest(Request::CUBIC, false); + // Don't get entities till after adding, realloc issues + + Entity *e0i = SK.GetEntity(r0i.entity(0)), + *ei1 = SK.GetEntity(ri1.entity(0)); + + for(j = 0; j <= 3; j++) { + SK.GetEntity(e0i->point[j])->PointForceTo(b0i.ctrl[j]); + } + for(j = 0; j <= 3; j++) { + SK.GetEntity(ei1->point[j])->PointForceTo(bi1.ctrl[j]); + } + + Constraint::ConstrainCoincident(e0i->point[3], ei1->point[0]); + if(i == 0) hep0n = e0i->point[0]; + hep1n = ei1->point[3]; + hepin = e0i->point[3]; + } else { + hRequest r = AddRequest(Request::CUBIC, false); + Entity *e = SK.GetEntity(r.entity(0)); + + for(j = 0; j <= 3; j++) { + SK.GetEntity(e->point[j])->PointForceTo(sb->ctrl[j]); + } + + if(i == 0) hep0n = e->point[0]; + hep1n = e->point[3]; + } + } + + sbl.Clear(); + + ReplacePointInConstraints(hep0, hep0n); + ReplacePointInConstraints(hep1, hep1n); + return hepin; +} + +hEntity GraphicsWindow::SplitEntity(hEntity he, Vector pinter) { + Entity *e = SK.GetEntity(he); + int entityType = e->type; + + hEntity ret; + if(e->IsCircle()) { + ret = SplitCircle(he, pinter); + } else if(e->type == Entity::LINE_SEGMENT) { + ret = SplitLine(he, pinter); + } else if(e->type == Entity::CUBIC || e->type == Entity::CUBIC_PERIODIC) { + ret = SplitCubic(he, pinter); + } else { + Error("Couldn't split this entity; lines, circles, or cubics only."); + return Entity::NO_ENTITY; + } + + // Finally, delete the request that generated the original entity. + int reqType = EntReqTable::GetRequestForEntity(entityType); + SK.request.ClearTags(); + for(int i = 0; i < SK.request.n; i++) { + Request *r = &(SK.request.elem[i]); + if(r->group.v != activeGroup.v) continue; + if(r->type != reqType) continue; + + // If the user wants to keep the old entities around, they can just + // mark them construction first. + if(he.v == r->h.entity(0).v && !r->construction) { + r->tag = 1; + break; + } + } + DeleteTaggedRequests(); + + return ret; +} + +void GraphicsWindow::SplitLinesOrCurves(void) { + if(!LockedInWorkplane()) { + Error("Must be sketching in workplane to split."); + return; + } + + GroupSelection(); + if(!(gs.n == 2 &&(gs.lineSegments + + gs.circlesOrArcs + + gs.cubics + + gs.periodicCubics) == 2)) + { + Error("Select two entities that intersect each other (e.g. two lines " + "or two circles or a circle and a line)."); + return; + } + + hEntity ha = gs.entity[0], + hb = gs.entity[1]; + Entity *ea = SK.GetEntity(ha), + *eb = SK.GetEntity(hb); + + // Compute the possibly-rational Bezier curves for each of these entities + SBezierList sbla, sblb; + sbla = {}; + sblb = {}; + ea->GenerateBezierCurves(&sbla); + eb->GenerateBezierCurves(&sblb); + // and then compute the points where they intersect, based on those curves. + SPointList inters = {}; + sbla.AllIntersectionsWith(&sblb, &inters); + + if(inters.l.n > 0) { + Vector pi = Vector::From(0, 0, 0); + // If there's multiple points, then take the one closest to the + // mouse pointer. + double dmin = VERY_POSITIVE; + SPoint *sp; + for(sp = inters.l.First(); sp; sp = inters.l.NextAfter(sp)) { + double d = ProjectPoint(sp->p).DistanceTo(currentMousePosition); + if(d < dmin) { + dmin = d; + pi = sp->p; + } + } + + SS.UndoRemember(); + hEntity hia = SplitEntity(ha, pi), + hib = SplitEntity(hb, pi); + // SplitEntity adds the coincident constraints to join the split halves + // of each original entity; and then we add the constraint to join + // the two entities together at the split point. + if(hia.v && hib.v) { + Constraint::ConstrainCoincident(hia, hib); + } + } else { + Error("Can't split; no intersection found."); + } + + // All done, clean up and regenerate. + inters.Clear(); + sbla.Clear(); + sblb.Clear(); + ClearSelection(); + SS.ScheduleGenerateAll(); +} + diff --git a/src/mouse.cpp b/src/mouse.cpp new file mode 100644 index 0000000..700b765 --- /dev/null +++ b/src/mouse.cpp @@ -0,0 +1,1513 @@ +//----------------------------------------------------------------------------- +// Anything relating to mouse, keyboard, or 6-DOF mouse input. +// +// Copyright 2008-2013 Jonathan Westhues. +//----------------------------------------------------------------------------- +#include "solvespace.h" + +void GraphicsWindow::UpdateDraggedPoint(hEntity hp, double mx, double my) { + Entity *p = SK.GetEntity(hp); + Vector pos = p->PointGetNum(); + UpdateDraggedNum(&pos, mx, my); + p->PointForceTo(pos); +} + +void GraphicsWindow::UpdateDraggedNum(Vector *pos, double mx, double my) { + *pos = pos->Plus(projRight.ScaledBy((mx - orig.mouse.x)/scale)); + *pos = pos->Plus(projUp.ScaledBy((my - orig.mouse.y)/scale)); +} + +void GraphicsWindow::AddPointToDraggedList(hEntity hp) { + Entity *p = SK.GetEntity(hp); + // If an entity and its points are both selected, then its points could + // end up in the list twice. This would be bad, because it would move + // twice as far as the mouse pointer... + List *lhe = &(pending.points); + for(hEntity *hee = lhe->First(); hee; hee = lhe->NextAfter(hee)) { + if(hee->v == hp.v) { + // Exact same point. + return; + } + Entity *pe = SK.GetEntity(*hee); + if(pe->type == p->type && + pe->type != Entity::POINT_IN_2D && + pe->type != Entity::POINT_IN_3D && + pe->group.v == p->group.v) + { + // Transform-type point, from the same group. So it handles the + // same unknowns. + return; + } + } + pending.points.Add(&hp); +} + +void GraphicsWindow::StartDraggingByEntity(hEntity he) { + Entity *e = SK.GetEntity(he); + if(e->IsPoint()) { + AddPointToDraggedList(e->h); + } else if(e->type == Entity::LINE_SEGMENT || + e->type == Entity::ARC_OF_CIRCLE || + e->type == Entity::CUBIC || + e->type == Entity::CUBIC_PERIODIC || + e->type == Entity::CIRCLE || + e->type == Entity::TTF_TEXT) + { + int pts; + EntReqTable::GetEntityInfo(e->type, e->extraPoints, + NULL, &pts, NULL, NULL); + for(int i = 0; i < pts; i++) { + AddPointToDraggedList(e->point[i]); + } + } +} + +void GraphicsWindow::StartDraggingBySelection(void) { + List *ls = &(selection); + for(Selection *s = ls->First(); s; s = ls->NextAfter(s)) { + if(!s->entity.v) continue; + + StartDraggingByEntity(s->entity); + } + // The user might select a point, and then click it again to start + // dragging; but the point just got unselected by that click. So drag + // the hovered item too, and they'll always have it. + if(hover.entity.v) StartDraggingByEntity(hover.entity); +} + +void GraphicsWindow::MouseMoved(double x, double y, bool leftDown, + bool middleDown, bool rightDown, bool shiftDown, bool ctrlDown) +{ + if(GraphicsEditControlIsVisible()) return; + if(context.active) return; + + SS.extraLine.draw = false; + + if(!orig.mouseDown) { + // If someone drags the mouse into our window with the left button + // already depressed, then we don't have our starting point; so + // don't try. + leftDown = false; + } + + if(rightDown) { + middleDown = true; + shiftDown = !shiftDown; + } + + if(SS.showToolbar) { + if(ToolbarMouseMoved((int)x, (int)y)) { + hover.Clear(); + return; + } + } + + if(!leftDown && (pending.operation == DRAGGING_POINTS || + pending.operation == DRAGGING_MARQUEE)) + { + ClearPending(); + InvalidateGraphics(); + } + + Point2d mp = Point2d::From(x, y); + currentMousePosition = mp; + + if(rightDown && orig.mouse.DistanceTo(mp) < 5 && !orig.startedMoving) { + // Avoid accidentally panning (or rotating if shift is down) if the + // user wants a context menu. + return; + } + orig.startedMoving = true; + + // If the middle button is down, then mouse movement is used to pan and + // rotate our view. This wins over everything else. + if(middleDown) { + hover.Clear(); + + double dx = (x - orig.mouse.x) / scale; + double dy = (y - orig.mouse.y) / scale; + + if(!(shiftDown || ctrlDown)) { + double s = 0.3*(PI/180)*scale; // degrees per pixel + projRight = orig.projRight.RotatedAbout(orig.projUp, -s*dx); + projUp = orig.projUp.RotatedAbout(orig.projRight, s*dy); + + NormalizeProjectionVectors(); + } else if(ctrlDown) { + double theta = atan2(orig.mouse.y, orig.mouse.x); + theta -= atan2(y, x); + SS.extraLine.draw = true; + SS.extraLine.ptA = UnProjectPoint(Point2d::From(0, 0)); + SS.extraLine.ptB = UnProjectPoint(mp); + + Vector normal = orig.projRight.Cross(orig.projUp); + projRight = orig.projRight.RotatedAbout(normal, theta); + projUp = orig.projUp.RotatedAbout(normal, theta); + + NormalizeProjectionVectors(); + } else { + offset.x = orig.offset.x + dx*projRight.x + dy*projUp.x; + offset.y = orig.offset.y + dx*projRight.y + dy*projUp.y; + offset.z = orig.offset.z + dx*projRight.z + dy*projUp.z; + } + + orig.projRight = projRight; + orig.projUp = projUp; + orig.offset = offset; + orig.mouse.x = x; + orig.mouse.y = y; + + if(SS.TW.shown.screen == TextWindow::SCREEN_EDIT_VIEW) { + if(havePainted) { + SS.ScheduleShowTW(); + } + } + InvalidateGraphics(); + havePainted = false; + return; + } + + if(pending.operation == 0) { + double dm = orig.mouse.DistanceTo(mp); + // If we're currently not doing anything, then see if we should + // start dragging something. + if(leftDown && dm > 3) { + Entity *e = NULL; + if(hover.entity.v) e = SK.GetEntity(hover.entity); + if(e && e->type != Entity::WORKPLANE) { + Entity *e = SK.GetEntity(hover.entity); + if(e->type == Entity::CIRCLE && selection.n <= 1) { + // Drag the radius. + ClearSelection(); + pending.circle = hover.entity; + pending.operation = DRAGGING_RADIUS; + } else if(e->IsNormal()) { + ClearSelection(); + pending.normal = hover.entity; + pending.operation = DRAGGING_NORMAL; + } else { + if(!hoverWasSelectedOnMousedown) { + // The user clicked an unselected entity, which + // means they're dragging just the hovered thing, + // not the full selection. So clear all the selection + // except that entity. + ClearSelection(); + MakeSelected(e->h); + } + StartDraggingBySelection(); + if(!hoverWasSelectedOnMousedown) { + // And then clear the selection again, since they + // probably didn't want that selected if they just + // were dragging it. + ClearSelection(); + } + hover.Clear(); + pending.operation = DRAGGING_POINTS; + } + } else if(hover.constraint.v && + SK.GetConstraint(hover.constraint)->HasLabel()) + { + ClearSelection(); + pending.constraint = hover.constraint; + pending.operation = DRAGGING_CONSTRAINT; + } + if(pending.operation != 0) { + // We just started a drag, so remember for the undo before + // the drag changes anything. + SS.UndoRemember(); + } else { + if(!hover.constraint.v) { + // That's just marquee selection, which should not cause + // an undo remember. + if(dm > 10) { + if(hover.entity.v) { + // Avoid accidentally selecting workplanes when + // starting drags. + MakeUnselected(hover.entity, false); + hover.Clear(); + } + pending.operation = DRAGGING_MARQUEE; + orig.marqueePoint = + UnProjectPoint(orig.mouseOnButtonDown); + } + } + } + } else { + // Otherwise, just hit test and give up; but don't hit test + // if the mouse is down, because then the user could hover + // a point, mouse down (thus selecting it), and drag, in an + // effort to drag the point, but instead hover a different + // entity before we move far enough to start the drag. + if(!leftDown) { + // Hit testing can potentially take a lot of time. + // If we haven't painted since last time we highlighted + // something, don't hit test again, since this just causes + // a lag. + if(!havePainted) return; + HitTestMakeSelection(mp); + } + } + return; + } + + // If the user has started an operation from the menu, but not + // completed it, then just do the selection. + if(pending.operation < FIRST_PENDING) { + HitTestMakeSelection(mp); + return; + } + + // We're currently dragging something; so do that. But if we haven't + // painted since the last time we solved, do nothing, because there's + // no sense solving a frame and not displaying it. + if(!havePainted) { + if(pending.operation == DRAGGING_POINTS && ctrlDown) { + SS.extraLine.ptA = UnProjectPoint(orig.mouseOnButtonDown); + SS.extraLine.ptB = UnProjectPoint(mp); + SS.extraLine.draw = true; + } + return; + } + + havePainted = false; + switch(pending.operation) { + case DRAGGING_CONSTRAINT: { + Constraint *c = SK.constraint.FindById(pending.constraint); + UpdateDraggedNum(&(c->disp.offset), x, y); + orig.mouse = mp; + InvalidateGraphics(); + break; + } + + case DRAGGING_NEW_LINE_POINT: + if(!ctrlDown) { + SS.GW.pending.suggestion = + SS.GW.SuggestLineConstraint(SS.GW.pending.request); + } else { + SS.GW.pending.suggestion = SUGGESTED_NONE; + } + case DRAGGING_NEW_POINT: + UpdateDraggedPoint(pending.point, x, y); + HitTestMakeSelection(mp); + SS.MarkGroupDirtyByEntity(pending.point); + orig.mouse = mp; + InvalidateGraphics(); + break; + + case DRAGGING_POINTS: + if(shiftDown || ctrlDown) { + // Edit the rotation associated with a POINT_N_ROT_TRANS, + // either within (ctrlDown) or out of (shiftDown) the plane + // of the screen. So first get the rotation to apply, in qt. + Quaternion qt; + if(ctrlDown) { + double d = mp.DistanceTo(orig.mouseOnButtonDown); + if(d < 25) { + // Don't start dragging the position about the normal + // until we're a little ways out, to get a reasonable + // reference pos + orig.mouse = mp; + break; + } + double theta = atan2(orig.mouse.y-orig.mouseOnButtonDown.y, + orig.mouse.x-orig.mouseOnButtonDown.x); + theta -= atan2(y-orig.mouseOnButtonDown.y, + x-orig.mouseOnButtonDown.x); + + Vector gn = projRight.Cross(projUp); + qt = Quaternion::From(gn, -theta); + + SS.extraLine.draw = true; + SS.extraLine.ptA = UnProjectPoint(orig.mouseOnButtonDown); + SS.extraLine.ptB = UnProjectPoint(mp); + } else { + double dx = -(x - orig.mouse.x); + double dy = -(y - orig.mouse.y); + double s = 0.3*(PI/180); // degrees per pixel + qt = Quaternion::From(projUp, -s*dx).Times( + Quaternion::From(projRight, s*dy)); + } + orig.mouse = mp; + + // Now apply this rotation to the points being dragged. + List *lhe = &(pending.points); + for(hEntity *he = lhe->First(); he; he = lhe->NextAfter(he)) { + Entity *e = SK.GetEntity(*he); + if(e->type != Entity::POINT_N_ROT_TRANS) { + if(ctrlDown) { + Vector p = e->PointGetNum(); + p = p.Minus(SS.extraLine.ptA); + p = qt.Rotate(p); + p = p.Plus(SS.extraLine.ptA); + e->PointForceTo(p); + SS.MarkGroupDirtyByEntity(e->h); + } + continue; + } + + Quaternion q = e->PointGetQuaternion(); + Vector p = e->PointGetNum(); + q = qt.Times(q); + e->PointForceQuaternionTo(q); + // Let's rotate about the selected point; so fix up the + // translation so that that point didn't move. + e->PointForceTo(p); + SS.MarkGroupDirtyByEntity(e->h); + } + } else { + List *lhe = &(pending.points); + for(hEntity *he = lhe->First(); he; he = lhe->NextAfter(he)) { + UpdateDraggedPoint(*he, x, y); + SS.MarkGroupDirtyByEntity(*he); + } + orig.mouse = mp; + } + break; + + case DRAGGING_NEW_CUBIC_POINT: { + UpdateDraggedPoint(pending.point, x, y); + HitTestMakeSelection(mp); + + hRequest hr = pending.point.request(); + if(pending.point.v == hr.entity(4).v) { + // The very first segment; dragging final point drags both + // tangent points. + Vector p0 = SK.GetEntity(hr.entity(1))->PointGetNum(), + p3 = SK.GetEntity(hr.entity(4))->PointGetNum(), + p1 = p0.ScaledBy(2.0/3).Plus(p3.ScaledBy(1.0/3)), + p2 = p0.ScaledBy(1.0/3).Plus(p3.ScaledBy(2.0/3)); + SK.GetEntity(hr.entity(1+1))->PointForceTo(p1); + SK.GetEntity(hr.entity(1+2))->PointForceTo(p2); + } else { + // A subsequent segment; dragging point drags only final + // tangent point. + int i = SK.GetEntity(hr.entity(0))->extraPoints; + Vector pn = SK.GetEntity(hr.entity(4+i))->PointGetNum(), + pnm2 = SK.GetEntity(hr.entity(2+i))->PointGetNum(), + pnm1 = (pn.Plus(pnm2)).ScaledBy(0.5); + SK.GetEntity(hr.entity(3+i))->PointForceTo(pnm1); + } + + orig.mouse = mp; + SS.MarkGroupDirtyByEntity(pending.point); + break; + } + case DRAGGING_NEW_ARC_POINT: { + UpdateDraggedPoint(pending.point, x, y); + HitTestMakeSelection(mp); + + hRequest hr = pending.point.request(); + Vector ona = SK.GetEntity(hr.entity(2))->PointGetNum(); + Vector onb = SK.GetEntity(hr.entity(3))->PointGetNum(); + Vector center = (ona.Plus(onb)).ScaledBy(0.5); + + SK.GetEntity(hr.entity(1))->PointForceTo(center); + + orig.mouse = mp; + SS.MarkGroupDirtyByEntity(pending.point); + break; + } + case DRAGGING_NEW_RADIUS: + case DRAGGING_RADIUS: { + Entity *circle = SK.GetEntity(pending.circle); + Vector center = SK.GetEntity(circle->point[0])->PointGetNum(); + Point2d c2 = ProjectPoint(center); + double r = c2.DistanceTo(mp)/scale; + SK.GetEntity(circle->distance)->DistanceForceTo(r); + + SS.MarkGroupDirtyByEntity(pending.circle); + break; + } + + case DRAGGING_NORMAL: { + Entity *normal = SK.GetEntity(pending.normal); + Vector p = SK.GetEntity(normal->point[0])->PointGetNum(); + Point2d p2 = ProjectPoint(p); + + Quaternion q = normal->NormalGetNum(); + Vector u = q.RotationU(), v = q.RotationV(); + + if(ctrlDown) { + double theta = atan2(orig.mouse.y-p2.y, orig.mouse.x-p2.x); + theta -= atan2(y-p2.y, x-p2.x); + + Vector normal = projRight.Cross(projUp); + u = u.RotatedAbout(normal, -theta); + v = v.RotatedAbout(normal, -theta); + } else { + double dx = -(x - orig.mouse.x); + double dy = -(y - orig.mouse.y); + double s = 0.3*(PI/180); // degrees per pixel + u = u.RotatedAbout(projUp, -s*dx); + u = u.RotatedAbout(projRight, s*dy); + v = v.RotatedAbout(projUp, -s*dx); + v = v.RotatedAbout(projRight, s*dy); + } + orig.mouse = mp; + normal->NormalForceTo(Quaternion::From(u, v)); + + SS.MarkGroupDirtyByEntity(pending.normal); + break; + } + + case DRAGGING_MARQUEE: + orig.mouse = mp; + InvalidateGraphics(); + break; + + default: oops(); + } + + if(pending.operation != 0 && + pending.operation != DRAGGING_CONSTRAINT && + pending.operation != DRAGGING_MARQUEE) + { + SS.GenerateAll(); + + // Activate degraded mode, and regenerate display items without edges. + if(activeGroup.v != 0) { + bool showEdges = SS.GW.showEdges; + SS.GW.showEdges = false; + SK.GetGroup(activeGroup)->GenerateDisplayItems(); + SS.GW.showEdges = showEdges; + isDegraded = true; + } + } +} + +void GraphicsWindow::ClearPending(void) { + pending.points.Clear(); + pending = {}; + SS.ScheduleShowTW(); + + // If degraded mode was enabled, we need to regenerate again to get edges back. + if(isDegraded) { + isDegraded = false; + SK.GetGroup(activeGroup)->displayDirty = true; + } +} + +void GraphicsWindow::MouseMiddleOrRightDown(double x, double y) { + if(GraphicsEditControlIsVisible()) return; + + orig.offset = offset; + orig.projUp = projUp; + orig.projRight = projRight; + orig.mouse.x = x; + orig.mouse.y = y; + orig.startedMoving = false; +} + +void GraphicsWindow::ContextMenuListStyles(void) { + CreateContextSubmenu(); + Style *s; + bool empty = true; + for(s = SK.style.First(); s; s = SK.style.NextAfter(s)) { + if(s->h.v < Style::FIRST_CUSTOM) continue; + + AddContextMenuItem(s->DescriptionString().c_str(), CMNU_FIRST_STYLE + s->h.v); + empty = false; + } + + if(!empty) AddContextMenuItem(NULL, CONTEXT_SEPARATOR); + + AddContextMenuItem("No Style", CMNU_NO_STYLE); + AddContextMenuItem("Newly Created Custom Style...", CMNU_NEW_CUSTOM_STYLE); +} + +void GraphicsWindow::MouseRightUp(double x, double y) { + SS.extraLine.draw = false; + InvalidateGraphics(); + + // Don't show a context menu if the user is right-clicking the toolbar, + // or if they are finishing a pan. + if(ToolbarMouseMoved((int)x, (int)y)) return; + if(orig.startedMoving) return; + + if(context.active) return; + + if(pending.operation == DRAGGING_NEW_LINE_POINT) { + if(SS.GW.pending.suggestion != SUGGESTED_NONE) { + Constraint::Constrain(SS.GW.pending.suggestion, + Entity::NO_ENTITY, Entity::NO_ENTITY, pending.request.entity(0)); + } + } + + if(pending.operation == DRAGGING_NEW_LINE_POINT || + pending.operation == DRAGGING_NEW_CUBIC_POINT) + { + // Special case; use a right click to stop drawing lines, since + // a left click would draw another one. This is quicker and more + // intuitive than hitting escape. Likewise for new cubic segments. + ClearPending(); + return; + } + + // The current mouse location + Vector v = offset.ScaledBy(-1); + v = v.Plus(projRight.ScaledBy(x/scale)); + v = v.Plus(projUp.ScaledBy(y/scale)); + + context.active = true; + + if(!hover.IsEmpty()) { + MakeSelected(&hover); + SS.ScheduleShowTW(); + } + GroupSelection(); + + bool itemsSelected = (gs.n > 0 || gs.constraints > 0); + int addAfterPoint = -1; + + if(itemsSelected) { + if(gs.stylables > 0) { + ContextMenuListStyles(); + AddContextMenuItem("Assign to Style", CONTEXT_SUBMENU); + } + if(gs.n + gs.constraints == 1) { + AddContextMenuItem("Group Info", CMNU_GROUP_INFO); + } + if(gs.n + gs.constraints == 1 && gs.stylables == 1) { + AddContextMenuItem("Style Info", CMNU_STYLE_INFO); + } + if(gs.withEndpoints > 0) { + AddContextMenuItem("Select Edge Chain", CMNU_SELECT_CHAIN); + } + if(gs.constraints == 1 && gs.n == 0) { + Constraint *c = SK.GetConstraint(gs.constraint[0]); + if(c->HasLabel() && c->type != Constraint::COMMENT) { + AddContextMenuItem("Toggle Reference Dimension", + CMNU_REFERENCE_DIM); + } + if(c->type == Constraint::ANGLE || + c->type == Constraint::EQUAL_ANGLE) + { + AddContextMenuItem("Other Supplementary Angle", + CMNU_OTHER_ANGLE); + } + } + if(gs.constraintLabels > 0 || gs.points > 0) { + AddContextMenuItem("Snap to Grid", CMNU_SNAP_TO_GRID); + } + + + if(gs.points == 1 && gs.point[0].isFromRequest()) { + Request *r = SK.GetRequest(gs.point[0].request()); + int index = r->IndexOfPoint(gs.point[0]); + if((r->type == Request::CUBIC && (index > 1 && index < r->extraPoints + 2)) || + r->type == Request::CUBIC_PERIODIC) { + AddContextMenuItem("Remove Spline Point", CMNU_REMOVE_SPLINE_PT); + } + } + if(gs.entities == 1 && gs.entity[0].isFromRequest()) { + Request *r = SK.GetRequest(gs.entity[0].request()); + if(r->type == Request::CUBIC || r->type == Request::CUBIC_PERIODIC) { + Entity *e = SK.GetEntity(gs.entity[0]); + e->GetDistance(Point2d::From(x, y)); + addAfterPoint = e->dogd.data; + if(addAfterPoint == -1) oops(); + // Skip derivative point. + if(r->type == Request::CUBIC) addAfterPoint++; + AddContextMenuItem("Add Spline Point", CMNU_ADD_SPLINE_PT); + } + } + + if(gs.points == 1) { + Entity *p = SK.GetEntity(gs.point[0]); + Constraint *c; + IdList *lc = &(SK.constraint); + for(c = lc->First(); c; c = lc->NextAfter(c)) { + if(c->type != Constraint::POINTS_COINCIDENT) continue; + if(c->ptA.v == p->h.v || c->ptB.v == p->h.v) { + break; + } + } + if(c) { + AddContextMenuItem("Delete Point-Coincident Constraint", + CMNU_DEL_COINCIDENT); + } + } + AddContextMenuItem(NULL, CONTEXT_SEPARATOR); + if(LockedInWorkplane()) { + AddContextMenuItem("Cut", CMNU_CUT_SEL); + AddContextMenuItem("Copy", CMNU_COPY_SEL); + } + } + + if((SS.clipboard.r.n > 0 || SS.clipboard.c.n > 0) && LockedInWorkplane()) { + AddContextMenuItem("Paste", CMNU_PASTE); + AddContextMenuItem("Paste Transformed...", CMNU_PASTE_XFRM); + } + + if(itemsSelected) { + AddContextMenuItem("Delete", CMNU_DELETE_SEL); + AddContextMenuItem(NULL, CONTEXT_SEPARATOR); + AddContextMenuItem("Unselect All", CMNU_UNSELECT_ALL); + } + // If only one item is selected, then it must be the one that we just + // selected from the hovered item; in which case unselect all and hovered + // are equivalent. + if(!hover.IsEmpty() && selection.n > 1) { + AddContextMenuItem("Unselect Hovered", CMNU_UNSELECT_HOVERED); + } + + int ret = ShowContextMenu(); + switch(ret) { + case CMNU_UNSELECT_ALL: + MenuEdit(MNU_UNSELECT_ALL); + break; + + case CMNU_UNSELECT_HOVERED: + if(!hover.IsEmpty()) { + MakeUnselected(&hover, true); + } + break; + + case CMNU_SELECT_CHAIN: + MenuEdit(MNU_SELECT_CHAIN); + break; + + case CMNU_CUT_SEL: + MenuClipboard(MNU_CUT); + break; + + case CMNU_COPY_SEL: + MenuClipboard(MNU_COPY); + break; + + case CMNU_PASTE: + MenuClipboard(MNU_PASTE); + break; + + case CMNU_PASTE_XFRM: + MenuClipboard(MNU_PASTE_TRANSFORM); + break; + + case CMNU_DELETE_SEL: + MenuClipboard(MNU_DELETE); + break; + + case CMNU_REFERENCE_DIM: + Constraint::MenuConstrain(MNU_REFERENCE); + break; + + case CMNU_OTHER_ANGLE: + Constraint::MenuConstrain(MNU_OTHER_ANGLE); + break; + + case CMNU_DEL_COINCIDENT: { + SS.UndoRemember(); + if(!gs.point[0].v) break; + Entity *p = SK.GetEntity(gs.point[0]); + if(!p->IsPoint()) break; + + SK.constraint.ClearTags(); + Constraint *c; + for(c = SK.constraint.First(); c; c = SK.constraint.NextAfter(c)) { + if(c->type != Constraint::POINTS_COINCIDENT) continue; + if(c->ptA.v == p->h.v || c->ptB.v == p->h.v) { + c->tag = 1; + } + } + SK.constraint.RemoveTagged(); + ClearSelection(); + break; + } + + case CMNU_SNAP_TO_GRID: + MenuEdit(MNU_SNAP_TO_GRID); + break; + + case CMNU_REMOVE_SPLINE_PT: { + hRequest hr = gs.point[0].request(); + Request *r = SK.GetRequest(hr); + + int index = r->IndexOfPoint(gs.point[0]); + if(r->extraPoints == 0) oops(); + + SS.UndoRemember(); + Entity *e = SK.GetEntity(r->h.entity(0)); + + // First, fix point-coincident constraints involving this point. + // Then, remove all other constraints, since they would otherwise + // jump to an adjacent one and mess up the bezier after generation. + FixConstraintsForPointBeingDeleted(e->point[index]); + RemoveConstraintsForPointBeingDeleted(e->point[index]); + + for(int i = index; i < MAX_POINTS_IN_ENTITY - 1; i++) { + if(e->point[i + 1].v == 0) break; + Entity *p0 = SK.GetEntity(e->point[i]); + Entity *p1 = SK.GetEntity(e->point[i + 1]); + ReplacePointInConstraints(p1->h, p0->h); + p0->PointForceTo(p1->PointGetNum()); + } + r->extraPoints--; + SS.MarkGroupDirtyByEntity(gs.point[0]); + SS.ScheduleGenerateAll(); + ClearSelection(); + break; + } + + case CMNU_ADD_SPLINE_PT: { + hRequest hr = gs.entity[0].request(); + Request *r = SK.GetRequest(hr); + + int pointCount = r->extraPoints + ((r->type == Request::CUBIC_PERIODIC) ? 3 : 4); + if(pointCount < MAX_POINTS_IN_ENTITY) { + SS.UndoRemember(); + r->extraPoints++; + SS.MarkGroupDirtyByEntity(gs.entity[0]); + SS.GenerateAll(SolveSpaceUI::GENERATE_REGEN); + + Entity *e = SK.GetEntity(r->h.entity(0)); + for(int i = MAX_POINTS_IN_ENTITY; i > addAfterPoint + 1; i--) { + Entity *p0 = SK.entity.FindByIdNoOops(e->point[i]); + if(p0 == NULL) continue; + Entity *p1 = SK.GetEntity(e->point[i - 1]); + ReplacePointInConstraints(p1->h, p0->h); + p0->PointForceTo(p1->PointGetNum()); + } + Entity *p = SK.GetEntity(e->point[addAfterPoint + 1]); + p->PointForceTo(v); + SS.MarkGroupDirtyByEntity(gs.entity[0]); + SS.ScheduleGenerateAll(); + ClearSelection(); + } else { + Error("Cannot add spline point: maximum number of points reached."); + } + break; + } + + case CMNU_GROUP_INFO: { + hGroup hg; + if(gs.entities == 1) { + hg = SK.GetEntity(gs.entity[0])->group; + } else if(gs.points == 1) { + hg = SK.GetEntity(gs.point[0])->group; + } else if(gs.constraints == 1) { + hg = SK.GetConstraint(gs.constraint[0])->group; + } else { + break; + } + ClearSelection(); + + SS.TW.GoToScreen(TextWindow::SCREEN_GROUP_INFO); + SS.TW.shown.group = hg; + SS.ScheduleShowTW(); + ForceTextWindowShown(); + break; + } + + case CMNU_STYLE_INFO: { + hStyle hs; + if(gs.entities == 1) { + hs = Style::ForEntity(gs.entity[0]); + } else if(gs.points == 1) { + hs = Style::ForEntity(gs.point[0]); + } else if(gs.constraints == 1) { + hs = SK.GetConstraint(gs.constraint[0])->GetStyle(); + } else { + break; + } + ClearSelection(); + + SS.TW.GoToScreen(TextWindow::SCREEN_STYLE_INFO); + SS.TW.shown.style = hs; + SS.ScheduleShowTW(); + ForceTextWindowShown(); + break; + } + + case CMNU_NEW_CUSTOM_STYLE: { + uint32_t v = Style::CreateCustomStyle(); + Style::AssignSelectionToStyle(v); + ForceTextWindowShown(); + break; + } + + case CMNU_NO_STYLE: + Style::AssignSelectionToStyle(0); + break; + + default: + if(ret >= CMNU_FIRST_STYLE) { + Style::AssignSelectionToStyle(ret - CMNU_FIRST_STYLE); + } else { + // otherwise it was cancelled, so do nothing + contextMenuCancelTime = GetMilliseconds(); + } + break; + } + + context.active = false; + SS.ScheduleShowTW(); +} + +hRequest GraphicsWindow::AddRequest(int type) { + return AddRequest(type, true); +} +hRequest GraphicsWindow::AddRequest(int type, bool rememberForUndo) { + if(rememberForUndo) SS.UndoRemember(); + + Request r = {}; + r.group = activeGroup; + Group *g = SK.GetGroup(activeGroup); + if(g->type == Group::DRAWING_3D || g->type == Group::DRAWING_WORKPLANE) { + r.construction = false; + } else { + r.construction = true; + } + r.workplane = ActiveWorkplane(); + r.type = type; + SK.request.AddAndAssignId(&r); + + // We must regenerate the parameters, so that the code that tries to + // place this request's entities where the mouse is can do so. But + // we mustn't try to solve until reasonable values have been supplied + // for these new parameters, or else we'll get a numerical blowup. + SS.GenerateAll(SolveSpaceUI::GENERATE_REGEN); + SS.MarkGroupDirty(r.group); + return r.h; +} + +bool GraphicsWindow::ConstrainPointByHovered(hEntity pt) { + if(!hover.entity.v) return false; + + Entity *e = SK.GetEntity(hover.entity); + if(e->IsPoint()) { + Constraint::ConstrainCoincident(e->h, pt); + return true; + } + if(e->IsCircle()) { + Constraint::Constrain(Constraint::PT_ON_CIRCLE, + pt, Entity::NO_ENTITY, e->h); + return true; + } + if(e->type == Entity::LINE_SEGMENT) { + Constraint::Constrain(Constraint::PT_ON_LINE, + pt, Entity::NO_ENTITY, e->h); + return true; + } + + return false; +} + +void GraphicsWindow::MouseLeftDown(double mx, double my) { + orig.mouseDown = true; + + if(GraphicsEditControlIsVisible()) { + orig.mouse = Point2d::From(mx, my); + orig.mouseOnButtonDown = orig.mouse; + HideGraphicsEditControl(); + return; + } + SS.TW.HideEditControl(); + + if(SS.showToolbar) { + if(ToolbarMouseDown((int)mx, (int)my)) return; + } + + // This will be clobbered by MouseMoved below. + SuggestedConstraint constraintSuggestion = SS.GW.pending.suggestion; + + // Make sure the hover is up to date. + MouseMoved(mx, my, false, false, false, false, false); + orig.mouse.x = mx; + orig.mouse.y = my; + orig.mouseOnButtonDown = orig.mouse; + + // The current mouse location + Vector v = offset.ScaledBy(-1); + v = v.Plus(projRight.ScaledBy(mx/scale)); + v = v.Plus(projUp.ScaledBy(my/scale)); + + hRequest hr = {}; + hConstraint hc = {}; + switch(pending.operation) { + case MNU_DATUM_POINT: + hr = AddRequest(Request::DATUM_POINT); + SK.GetEntity(hr.entity(0))->PointForceTo(v); + ConstrainPointByHovered(hr.entity(0)); + + ClearSuper(); + break; + + case MNU_LINE_SEGMENT: + case MNU_CONSTR_SEGMENT: + hr = AddRequest(Request::LINE_SEGMENT); + SK.GetRequest(hr)->construction = (pending.operation == MNU_CONSTR_SEGMENT); + SK.GetEntity(hr.entity(1))->PointForceTo(v); + ConstrainPointByHovered(hr.entity(1)); + + ClearSuper(); + + pending.operation = DRAGGING_NEW_LINE_POINT; + pending.request = hr; + pending.point = hr.entity(2); + pending.description = "click next point of line, or press Esc"; + SK.GetEntity(pending.point)->PointForceTo(v); + break; + + case MNU_RECTANGLE: { + if(!SS.GW.LockedInWorkplane()) { + Error("Can't draw rectangle in 3d; select a workplane first."); + ClearSuper(); + break; + } + hRequest lns[4]; + int i; + SS.UndoRemember(); + for(i = 0; i < 4; i++) { + lns[i] = AddRequest(Request::LINE_SEGMENT, false); + } + for(i = 0; i < 4; i++) { + Constraint::ConstrainCoincident( + lns[i].entity(1), lns[(i+1)%4].entity(2)); + SK.GetEntity(lns[i].entity(1))->PointForceTo(v); + SK.GetEntity(lns[i].entity(2))->PointForceTo(v); + } + for(i = 0; i < 4; i++) { + Constraint::Constrain( + (i % 2) ? Constraint::HORIZONTAL : Constraint::VERTICAL, + Entity::NO_ENTITY, Entity::NO_ENTITY, + lns[i].entity(0)); + } + ConstrainPointByHovered(lns[2].entity(1)); + + pending.operation = DRAGGING_NEW_POINT; + pending.point = lns[1].entity(2); + pending.description = "click to place other corner of rectangle"; + hr = lns[0]; + break; + } + case MNU_CIRCLE: + hr = AddRequest(Request::CIRCLE); + // Centered where we clicked + SK.GetEntity(hr.entity(1))->PointForceTo(v); + // Normal to the screen + SK.GetEntity(hr.entity(32))->NormalForceTo( + Quaternion::From(SS.GW.projRight, SS.GW.projUp)); + // Initial radius zero + SK.GetEntity(hr.entity(64))->DistanceForceTo(0); + + ConstrainPointByHovered(hr.entity(1)); + + ClearSuper(); + + pending.operation = DRAGGING_NEW_RADIUS; + pending.circle = hr.entity(0); + pending.description = "click to set radius"; + break; + + case MNU_ARC: { + if(!SS.GW.LockedInWorkplane()) { + Error("Can't draw arc in 3d; select a workplane first."); + ClearPending(); + break; + } + hr = AddRequest(Request::ARC_OF_CIRCLE); + // This fudge factor stops us from immediately failing to solve + // because of the arc's implicit (equal radius) tangent. + Vector adj = SS.GW.projRight.WithMagnitude(2/SS.GW.scale); + SK.GetEntity(hr.entity(1))->PointForceTo(v.Minus(adj)); + SK.GetEntity(hr.entity(2))->PointForceTo(v); + SK.GetEntity(hr.entity(3))->PointForceTo(v); + ConstrainPointByHovered(hr.entity(2)); + + ClearSuper(); + + pending.operation = DRAGGING_NEW_ARC_POINT; + pending.point = hr.entity(3); + pending.description = "click to place point"; + break; + } + case MNU_CUBIC: + hr = AddRequest(Request::CUBIC); + SK.GetEntity(hr.entity(1))->PointForceTo(v); + SK.GetEntity(hr.entity(2))->PointForceTo(v); + SK.GetEntity(hr.entity(3))->PointForceTo(v); + SK.GetEntity(hr.entity(4))->PointForceTo(v); + ConstrainPointByHovered(hr.entity(1)); + + ClearSuper(); + + pending.operation = DRAGGING_NEW_CUBIC_POINT; + pending.point = hr.entity(4); + pending.description = "click next point of cubic, or press Esc"; + break; + + case MNU_WORKPLANE: + if(LockedInWorkplane()) { + Error("Sketching in a workplane already; sketch in 3d before " + "creating new workplane."); + ClearSuper(); + break; + } + hr = AddRequest(Request::WORKPLANE); + SK.GetEntity(hr.entity(1))->PointForceTo(v); + SK.GetEntity(hr.entity(32))->NormalForceTo( + Quaternion::From(SS.GW.projRight, SS.GW.projUp)); + ConstrainPointByHovered(hr.entity(1)); + + ClearSuper(); + break; + + case MNU_TTF_TEXT: { + if(!SS.GW.LockedInWorkplane()) { + Error("Can't draw text in 3d; select a workplane first."); + ClearSuper(); + break; + } + hr = AddRequest(Request::TTF_TEXT); + Request *r = SK.GetRequest(hr); + r->str = "Abc"; + r->font = "arial.ttf"; + + SK.GetEntity(hr.entity(1))->PointForceTo(v); + SK.GetEntity(hr.entity(2))->PointForceTo(v); + + pending.operation = DRAGGING_NEW_POINT; + pending.point = hr.entity(2); + pending.description = "click to place bottom left of text"; + break; + } + + case MNU_COMMENT: { + ClearSuper(); + Constraint c = {}; + c.group = SS.GW.activeGroup; + c.workplane = SS.GW.ActiveWorkplane(); + c.type = Constraint::COMMENT; + c.disp.offset = v; + c.comment = "NEW COMMENT -- DOUBLE-CLICK TO EDIT"; + hc = Constraint::AddConstraint(&c); + break; + } + + case DRAGGING_RADIUS: + case DRAGGING_NEW_POINT: + // The MouseMoved event has already dragged it as desired. + ClearPending(); + break; + + case DRAGGING_NEW_ARC_POINT: + ConstrainPointByHovered(pending.point); + ClearPending(); + break; + + case DRAGGING_NEW_CUBIC_POINT: { + hRequest hr = pending.point.request(); + Request *r = SK.GetRequest(hr); + + if(hover.entity.v == hr.entity(1).v && r->extraPoints >= 2) { + // They want the endpoints coincident, which means a periodic + // spline instead. + r->type = Request::CUBIC_PERIODIC; + // Remove the off-curve control points, which are no longer + // needed here; so move [2,ep+1] down, skipping first pt. + int i; + for(i = 2; i <= r->extraPoints+1; i++) { + SK.GetEntity(hr.entity((i-1)+1))->PointForceTo( + SK.GetEntity(hr.entity(i+1))->PointGetNum()); + } + // and move ep+3 down by two, skipping both + SK.GetEntity(hr.entity((r->extraPoints+1)+1))->PointForceTo( + SK.GetEntity(hr.entity((r->extraPoints+3)+1))->PointGetNum()); + r->extraPoints -= 2; + // And we're done. + SS.MarkGroupDirty(r->group); + SS.ScheduleGenerateAll(); + ClearPending(); + break; + } + + if(ConstrainPointByHovered(pending.point)) { + ClearPending(); + break; + } + + Entity e; + if(r->extraPoints >= (int)arraylen(e.point) - 4) { + ClearPending(); + break; + } + + (SK.GetRequest(hr)->extraPoints)++; + SS.GenerateAll(SolveSpaceUI::GENERATE_REGEN); + + int ep = r->extraPoints; + Vector last = SK.GetEntity(hr.entity(3+ep))->PointGetNum(); + + SK.GetEntity(hr.entity(2+ep))->PointForceTo(last); + SK.GetEntity(hr.entity(3+ep))->PointForceTo(v); + SK.GetEntity(hr.entity(4+ep))->PointForceTo(v); + pending.point = hr.entity(4+ep); + break; + } + + case DRAGGING_NEW_LINE_POINT: { + // Constrain the line segment horizontal or vertical if close enough + if(constraintSuggestion != SUGGESTED_NONE) { + Constraint::Constrain(constraintSuggestion, + Entity::NO_ENTITY, Entity::NO_ENTITY, pending.request.entity(0)); + } + + if(hover.entity.v) { + Entity *e = SK.GetEntity(hover.entity); + if(e->IsPoint()) { + hRequest hrl = pending.point.request(); + Entity *sp = SK.GetEntity(hrl.entity(1)); + if(( e->PointGetNum()).Equals( + (sp->PointGetNum()))) + { + // If we constrained by the hovered point, then we + // would create a zero-length line segment. That's + // not good, so just stop drawing. + ClearPending(); + break; + } + } + } + + if(ConstrainPointByHovered(pending.point)) { + ClearPending(); + break; + } + + // Create a new line segment, so that we continue drawing. + hRequest hr = AddRequest(Request::LINE_SEGMENT); + SK.GetRequest(hr)->construction = SK.GetRequest(pending.request)->construction; + SK.GetEntity(hr.entity(1))->PointForceTo(v); + // Displace the second point of the new line segment slightly, + // to avoid creating zero-length edge warnings. + SK.GetEntity(hr.entity(2))->PointForceTo( + v.Plus(projRight.ScaledBy(0.5/scale))); + + // Constrain the line segments to share an endpoint + Constraint::ConstrainCoincident(pending.point, hr.entity(1)); + + // And drag an endpoint of the new line segment + pending.operation = DRAGGING_NEW_LINE_POINT; + pending.request = hr; + pending.point = hr.entity(2); + pending.description = "click next point of line, or press Esc"; + + break; + } + + case 0: + default: + ClearPending(); + if(!hover.IsEmpty()) { + hoverWasSelectedOnMousedown = IsSelected(&hover); + MakeSelected(&hover); + } + break; + } + + // Activate group with newly created request/constraint + Group *g = NULL; + if(hr.v != 0) { + Request *req = SK.GetRequest(hr); + g = SK.GetGroup(req->group); + } + if(hc.v != 0) { + Constraint *c = SK.GetConstraint(hc); + g = SK.GetGroup(c->group); + } + if(g != NULL) { + g->visible = true; + } + + SS.ScheduleShowTW(); + InvalidateGraphics(); +} + +void GraphicsWindow::MouseLeftUp(double mx, double my) { + orig.mouseDown = false; + hoverWasSelectedOnMousedown = false; + + switch(pending.operation) { + case DRAGGING_POINTS: + SS.extraLine.draw = false; + // fall through + case DRAGGING_CONSTRAINT: + case DRAGGING_NORMAL: + case DRAGGING_RADIUS: + ClearPending(); + InvalidateGraphics(); + break; + + case DRAGGING_MARQUEE: + SelectByMarquee(); + ClearPending(); + InvalidateGraphics(); + break; + + case 0: + // We need to clear the selection here, and not in the mouse down + // event, since a mouse down without anything hovered could also + // be the start of marquee selection. But don't do that on the + // left click to cancel a context menu. The time delay is an ugly + // hack. + if(hover.IsEmpty() && + (contextMenuCancelTime == 0 || + (GetMilliseconds() - contextMenuCancelTime) > 200)) + { + ClearSelection(); + } + break; + + default: + break; // do nothing + } +} + +void GraphicsWindow::MouseLeftDoubleClick(double mx, double my) { + if(GraphicsEditControlIsVisible()) return; + SS.TW.HideEditControl(); + + if(hover.constraint.v) { + constraintBeingEdited = hover.constraint; + ClearSuper(); + + Constraint *c = SK.GetConstraint(constraintBeingEdited); + if(!c->HasLabel()) { + // Not meaningful to edit a constraint without a dimension + return; + } + if(c->reference) { + // Not meaningful to edit a reference dimension + return; + } + + Vector p3 = c->GetLabelPos(); + Point2d p2 = ProjectPoint(p3); + + std::string editValue; + int editMinWidthChar; + switch(c->type) { + case Constraint::COMMENT: + editValue = c->comment; + editMinWidthChar = 30; + break; + + case Constraint::ANGLE: + case Constraint::LENGTH_RATIO: + editValue = ssprintf("%.3f", c->valA); + editMinWidthChar = 5; + break; + + default: { + double v = fabs(c->valA); + + // If displayed as radius, also edit as radius. + if(c->type == Constraint::DIAMETER && c->other) + v /= 2; + + std::string def = SS.MmToString(v); + double eps = 1e-12; + if(fabs(SS.StringToMm(def) - v) < eps) { + // Show value with default number of digits after decimal, + // which is at least enough to represent it exactly. + editValue = def; + } else { + // Show value with as many digits after decimal as + // required to represent it exactly, up to 10. + v /= SS.MmPerUnit(); + int i; + for(i = 0; i <= 10; i++) { + editValue = ssprintf("%.*f", i, v); + if(fabs(std::stod(editValue) - v) < eps) break; + } + } + editMinWidthChar = 5; + break; + } + } + hStyle hs = c->disp.style; + if(hs.v == 0) hs.v = Style::CONSTRAINT; + ShowGraphicsEditControl((int)p2.x, (int)p2.y, + ssglStrFontSize(Style::TextHeight(hs)) * scale, + editMinWidthChar, editValue); + } +} + +void GraphicsWindow::EditControlDone(const char *s) { + HideGraphicsEditControl(); + Constraint *c = SK.GetConstraint(constraintBeingEdited); + + if(c->type == Constraint::COMMENT) { + SS.UndoRemember(); + c->comment = s; + return; + } + + Expr *e = Expr::From(s, true); + if(e) { + SS.UndoRemember(); + + switch(c->type) { + case Constraint::PROJ_PT_DISTANCE: + case Constraint::PT_LINE_DISTANCE: + case Constraint::PT_FACE_DISTANCE: + case Constraint::PT_PLANE_DISTANCE: + case Constraint::LENGTH_DIFFERENCE: { + // The sign is not displayed to the user, but this is a signed + // distance internally. To flip the sign, the user enters a + // negative distance. + bool wasNeg = (c->valA < 0); + if(wasNeg) { + c->valA = -SS.ExprToMm(e); + } else { + c->valA = SS.ExprToMm(e); + } + break; + } + case Constraint::ANGLE: + case Constraint::LENGTH_RATIO: + // These don't get the units conversion for distance, and + // they're always positive + c->valA = fabs(e->Eval()); + break; + + case Constraint::DIAMETER: + c->valA = fabs(SS.ExprToMm(e)); + + // If displayed and edited as radius, convert back + // to diameter + if(c->other) + c->valA *= 2; + break; + + default: + // These are always positive, and they get the units conversion. + c->valA = fabs(SS.ExprToMm(e)); + break; + } + SS.MarkGroupDirty(c->group); + SS.GenerateAll(); + } +} + +bool GraphicsWindow::KeyDown(int c) { + if(c == '\b') { + // Treat backspace identically to escape. + MenuEdit(MNU_UNSELECT_ALL); + return true; + } + + return false; +} + +void GraphicsWindow::MouseScroll(double x, double y, int delta) { + double offsetRight = offset.Dot(projRight); + double offsetUp = offset.Dot(projUp); + + double righti = x/scale - offsetRight; + double upi = y/scale - offsetUp; + + if(delta > 0) { + scale *= 1.2; + } else if(delta < 0) { + scale /= 1.2; + } else return; + + double rightf = x/scale - offsetRight; + double upf = y/scale - offsetUp; + + offset = offset.Plus(projRight.ScaledBy(rightf - righti)); + offset = offset.Plus(projUp.ScaledBy(upf - upi)); + + if(SS.TW.shown.screen == TextWindow::SCREEN_EDIT_VIEW) { + if(havePainted) { + SS.ScheduleShowTW(); + } + } + havePainted = false; + InvalidateGraphics(); +} + +void GraphicsWindow::MouseLeave(void) { + // Un-hover everything when the mouse leaves our window, unless there's + // currently a context menu shown. + if(!context.active) { + hover.Clear(); + toolbarTooltipped = 0; + toolbarHovered = 0; + PaintGraphics(); + } + SS.extraLine.draw = false; +} + +void GraphicsWindow::SpaceNavigatorMoved(double tx, double ty, double tz, + double rx, double ry, double rz, + bool shiftDown) +{ + if(!havePainted) return; + Vector out = projRight.Cross(projUp); + + // rotation vector is axis of rotation, and its magnitude is angle + Vector aa = Vector::From(rx, ry, rz); + // but it's given with respect to screen projection frame + aa = aa.ScaleOutOfCsys(projRight, projUp, out); + double aam = aa.Magnitude(); + if(aam > 0.0) aa = aa.WithMagnitude(1); + + // This can either transform our view, or transform a linked part. + GroupSelection(); + Entity *e = NULL; + Group *g = NULL; + if(gs.points == 1 && gs.n == 1) e = SK.GetEntity(gs.point [0]); + if(gs.entities == 1 && gs.n == 1) e = SK.GetEntity(gs.entity[0]); + if(e) g = SK.GetGroup(e->group); + if(g && g->type == Group::LINKED && !shiftDown) { + // Apply the transformation to a linked part. Gain down the Z + // axis, since it's hard to see what you're doing on that one since + // it's normal to the screen. + Vector t = projRight.ScaledBy(tx/scale).Plus( + projUp .ScaledBy(ty/scale).Plus( + out .ScaledBy(0.1*tz/scale))); + Quaternion q = Quaternion::From(aa, aam); + + // If we go five seconds without SpaceNavigator input, or if we've + // switched groups, then consider that a new action and save an undo + // point. + int64_t now = GetMilliseconds(); + if(now - lastSpaceNavigatorTime > 5000 || + lastSpaceNavigatorGroup.v != g->h.v) + { + SS.UndoRemember(); + } + + g->TransformImportedBy(t, q); + + lastSpaceNavigatorTime = now; + lastSpaceNavigatorGroup = g->h; + SS.MarkGroupDirty(g->h); + SS.ScheduleGenerateAll(); + } else { + // Apply the transformation to the view of the everything. The + // x and y components are translation; but z component is scale, + // not translation, or else it would do nothing in a parallel + // projection + offset = offset.Plus(projRight.ScaledBy(tx/scale)); + offset = offset.Plus(projUp.ScaledBy(ty/scale)); + scale *= exp(0.001*tz); + + if(aam > 0.0) { + projRight = projRight.RotatedAbout(aa, -aam); + projUp = projUp. RotatedAbout(aa, -aam); + NormalizeProjectionVectors(); + } + } + + havePainted = false; + InvalidateGraphics(); +} + +void GraphicsWindow::SpaceNavigatorButtonUp(void) { + ZoomToFit(/*includingInvisibles=*/false, /*useSelection=*/true); + InvalidateGraphics(); +} + diff --git a/src/polygon.cpp b/src/polygon.cpp new file mode 100644 index 0000000..eae40fe --- /dev/null +++ b/src/polygon.cpp @@ -0,0 +1,865 @@ +//----------------------------------------------------------------------------- +// Operations on polygons (planar, of line segment edges). +// +// Copyright 2008-2013 Jonathan Westhues. +//----------------------------------------------------------------------------- +#include "solvespace.h" + +Vector STriangle::Normal(void) { + Vector ab = b.Minus(a), bc = c.Minus(b); + return ab.Cross(bc); +} + +double STriangle::MinAltitude(void) { + double altA = a.DistanceToLine(b, c.Minus(b)), + altB = b.DistanceToLine(c, a.Minus(c)), + altC = c.DistanceToLine(a, b.Minus(a)); + + return min(altA, min(altB, altC)); +} + +bool STriangle::ContainsPoint(Vector p) { + Vector n = Normal(); + if(MinAltitude() < LENGTH_EPS) { + // shouldn't happen; zero-area triangle + return false; + } + return ContainsPointProjd(n.WithMagnitude(1), p); +} + +bool STriangle::ContainsPointProjd(Vector n, Vector p) { + Vector ab = b.Minus(a), bc = c.Minus(b), ca = a.Minus(c); + + Vector no_ab = n.Cross(ab); + if(no_ab.Dot(p) < no_ab.Dot(a) - LENGTH_EPS) return false; + + Vector no_bc = n.Cross(bc); + if(no_bc.Dot(p) < no_bc.Dot(b) - LENGTH_EPS) return false; + + Vector no_ca = n.Cross(ca); + if(no_ca.Dot(p) < no_ca.Dot(c) - LENGTH_EPS) return false; + + return true; +} + +void STriangle::FlipNormal(void) { + swap(a, b); + swap(an, bn); +} + +STriangle STriangle::From(STriMeta meta, Vector a, Vector b, Vector c) { + STriangle tr = {}; + tr.meta = meta; + tr.a = a; + tr.b = b; + tr.c = c; + return tr; +} + +SEdge SEdge::From(Vector a, Vector b) { + SEdge se = {}; + se.a = a; + se.b = b; + return se; +} + +bool SEdge::EdgeCrosses(Vector ea, Vector eb, Vector *ppi, SPointList *spl) { + Vector d = eb.Minus(ea); + double t_eps = LENGTH_EPS/d.Magnitude(); + + double t, tthis; + bool skew; + Vector pi; + bool inOrEdge0, inOrEdge1; + + Vector dthis = b.Minus(a); + double tthis_eps = LENGTH_EPS/dthis.Magnitude(); + + if((ea.Equals(a) && eb.Equals(b)) || + (eb.Equals(a) && ea.Equals(b))) + { + if(ppi) *ppi = a; + if(spl) spl->Add(a); + return true; + } + + // Can't just test if distance between d and a equals distance between d and b; + // they could be on opposite sides, since we don't have the sign. + double m = sqrt(d.Magnitude()*dthis.Magnitude()); + if(sqrt(fabs(d.Dot(dthis))) > (m - LENGTH_EPS)) { + // The edges are parallel. + if(fabs(a.DistanceToLine(ea, d)) > LENGTH_EPS) { + // and not coincident, so can't be interesecting + return false; + } + // The edges are coincident. Make sure that neither endpoint lies + // on the other + bool inters = false; + double t; + t = a.Minus(ea).DivPivoting(d); + if(t > t_eps && t < (1 - t_eps)) inters = true; + t = b.Minus(ea).DivPivoting(d); + if(t > t_eps && t < (1 - t_eps)) inters = true; + t = ea.Minus(a).DivPivoting(dthis); + if(t > tthis_eps && t < (1 - tthis_eps)) inters = true; + t = eb.Minus(a).DivPivoting(dthis); + if(t > tthis_eps && t < (1 - tthis_eps)) inters = true; + + if(inters) { + if(ppi) *ppi = a; + if(spl) spl->Add(a); + return true; + } else { + // So coincident but disjoint, okay. + return false; + } + } + + // Lines are not parallel, so look for an intersection. + pi = Vector::AtIntersectionOfLines(ea, eb, a, b, + &skew, + &t, &tthis); + if(skew) return false; + + inOrEdge0 = (t > -t_eps) && (t < (1 + t_eps)); + inOrEdge1 = (tthis > -tthis_eps) && (tthis < (1 + tthis_eps)); + + if(inOrEdge0 && inOrEdge1) { + if(a.Equals(ea) || b.Equals(ea) || + a.Equals(eb) || b.Equals(eb)) + { + // Not an intersection if we share an endpoint with an edge + return false; + } + // But it's an intersection if a vertex of one edge lies on the + // inside of the other (or if they cross away from either's + // vertex). + if(ppi) *ppi = pi; + if(spl) spl->Add(pi); + return true; + } + return false; +} + +void SEdgeList::Clear(void) { + l.Clear(); +} + +void SEdgeList::AddEdge(Vector a, Vector b, int auxA, int auxB) { + SEdge e = {}; + e.a = a; + e.b = b; + e.auxA = auxA; + e.auxB = auxB; + l.Add(&e); +} + +bool SEdgeList::AssembleContour(Vector first, Vector last, SContour *dest, + SEdge *errorAt, bool keepDir) +{ + int i; + + dest->AddPoint(first); + dest->AddPoint(last); + + do { + for(i = 0; i < l.n; i++) { + SEdge *se = &(l.elem[i]); + if(se->tag) continue; + + if(se->a.Equals(last)) { + dest->AddPoint(se->b); + last = se->b; + se->tag = 1; + break; + } + // Don't allow backwards edges if keepDir is true. + if(!keepDir && se->b.Equals(last)) { + dest->AddPoint(se->a); + last = se->a; + se->tag = 1; + break; + } + } + if(i >= l.n) { + // Couldn't assemble a closed contour; mark where. + if(errorAt) { + errorAt->a = first; + errorAt->b = last; + } + return false; + } + + } while(!last.Equals(first)); + + return true; +} + +bool SEdgeList::AssemblePolygon(SPolygon *dest, SEdge *errorAt, bool keepDir) { + dest->Clear(); + + bool allClosed = true; + for(;;) { + Vector first = Vector::From(0, 0, 0); + Vector last = Vector::From(0, 0, 0); + int i; + for(i = 0; i < l.n; i++) { + if(!l.elem[i].tag) { + first = l.elem[i].a; + last = l.elem[i].b; + l.elem[i].tag = 1; + break; + } + } + if(i >= l.n) { + return allClosed; + } + + // Create a new empty contour in our polygon, and finish assembling + // into that contour. + dest->AddEmptyContour(); + if(!AssembleContour(first, last, &(dest->l.elem[dest->l.n-1]), + errorAt, keepDir)) + { + allClosed = false; + } + // But continue assembling, even if some of the contours are open + } +} + +//----------------------------------------------------------------------------- +// Test if the specified edge crosses any of the edges in our list. Two edges +// are not considered to cross if they share an endpoint (within LENGTH_EPS), +// but they are considered to cross if they are coincident and overlapping. +// If pi is not NULL, then a crossing is returned in that. +//----------------------------------------------------------------------------- +int SEdgeList::AnyEdgeCrossings(Vector a, Vector b, + Vector *ppi, SPointList *spl) +{ + int cnt = 0; + SEdge *se; + for(se = l.First(); se; se = l.NextAfter(se)) { + if(se->EdgeCrosses(a, b, ppi, spl)) { + cnt++; + } + } + return cnt; +} + +//----------------------------------------------------------------------------- +// Returns true if the intersecting edge list contains an edge that shares +// an endpoint with one of our edges. +//----------------------------------------------------------------------------- +bool SEdgeList::ContainsEdgeFrom(SEdgeList *sel) { + SEdge *se; + for(se = l.First(); se; se = l.NextAfter(se)) { + if(sel->ContainsEdge(se)) return true; + } + return false; +} +bool SEdgeList::ContainsEdge(SEdge *set) { + SEdge *se; + for(se = l.First(); se; se = l.NextAfter(se)) { + if((se->a).Equals(set->a) && (se->b).Equals(set->b)) return true; + if((se->b).Equals(set->a) && (se->a).Equals(set->b)) return true; + } + return false; +} + +//----------------------------------------------------------------------------- +// Remove unnecessary edges: if two are anti-parallel then remove both, and if +// two are parallel then remove one. +//----------------------------------------------------------------------------- +void SEdgeList::CullExtraneousEdges(void) { + l.ClearTags(); + int i, j; + for(i = 0; i < l.n; i++) { + SEdge *se = &(l.elem[i]); + for(j = i+1; j < l.n; j++) { + SEdge *set = &(l.elem[j]); + if((set->a).Equals(se->a) && (set->b).Equals(se->b)) { + // Two parallel edges exist; so keep only the first one. + set->tag = 1; + } + if((set->a).Equals(se->b) && (set->b).Equals(se->a)) { + // Two anti-parallel edges exist; so keep neither. + se->tag = 1; + set->tag = 1; + } + } + } + l.RemoveTagged(); +} + +//----------------------------------------------------------------------------- +// Make a kd-tree of edges. This is used for O(log(n)) implementations of stuff +// that would naively be O(n). +//----------------------------------------------------------------------------- +SKdNodeEdges *SKdNodeEdges::Alloc(void) { + SKdNodeEdges *ne = (SKdNodeEdges *)AllocTemporary(sizeof(SKdNodeEdges)); + *ne = {}; + return ne; +} +SEdgeLl *SEdgeLl::Alloc(void) { + SEdgeLl *sell = (SEdgeLl *)AllocTemporary(sizeof(SEdgeLl)); + *sell = {}; + return sell; +} +SKdNodeEdges *SKdNodeEdges::From(SEdgeList *sel) { + SEdgeLl *sell = NULL; + SEdge *se; + for(se = sel->l.First(); se; se = sel->l.NextAfter(se)) { + SEdgeLl *n = SEdgeLl::Alloc(); + n->se = se; + n->next = sell; + sell = n; + } + return SKdNodeEdges::From(sell); +} +SKdNodeEdges *SKdNodeEdges::From(SEdgeLl *sell) { + SKdNodeEdges *n = SKdNodeEdges::Alloc(); + + // Compute the midpoints (just mean, though median would be better) of + // each component. + Vector ptAve = Vector::From(0, 0, 0); + SEdgeLl *flip; + int totaln = 0; + for(flip = sell; flip; flip = flip->next) { + ptAve = ptAve.Plus(flip->se->a); + ptAve = ptAve.Plus(flip->se->b); + totaln++; + } + ptAve = ptAve.ScaledBy(1.0 / (2*totaln)); + + // For each component, see how it splits. + int ltln[3] = { 0, 0, 0 }, gtln[3] = { 0, 0, 0 }; + double badness[3]; + for(flip = sell; flip; flip = flip->next) { + for(int i = 0; i < 3; i++) { + if(flip->se->a.Element(i) < ptAve.Element(i) + KDTREE_EPS || + flip->se->b.Element(i) < ptAve.Element(i) + KDTREE_EPS) + { + ltln[i]++; + } + if(flip->se->a.Element(i) > ptAve.Element(i) - KDTREE_EPS || + flip->se->b.Element(i) > ptAve.Element(i) - KDTREE_EPS) + { + gtln[i]++; + } + } + } + for(int i = 0; i < 3; i++) { + badness[i] = pow((double)ltln[i], 4) + pow((double)gtln[i], 4); + } + + // Choose the least bad coordinate to split along. + if(badness[0] < badness[1] && badness[0] < badness[2]) { + n->which = 0; + } else if(badness[1] < badness[2]) { + n->which = 1; + } else { + n->which = 2; + } + n->c = ptAve.Element(n->which); + + if(totaln < 3 || totaln == gtln[n->which] || totaln == ltln[n->which]) { + n->edges = sell; + // and we're a leaf node + return n; + } + + // Sort the edges according to which side(s) of the split plane they're on. + SEdgeLl *gtl = NULL, *ltl = NULL; + for(flip = sell; flip; flip = flip->next) { + if(flip->se->a.Element(n->which) < n->c + KDTREE_EPS || + flip->se->b.Element(n->which) < n->c + KDTREE_EPS) + { + SEdgeLl *selln = SEdgeLl::Alloc(); + selln->se = flip->se; + selln->next = ltl; + ltl = selln; + } + if(flip->se->a.Element(n->which) > n->c - KDTREE_EPS || + flip->se->b.Element(n->which) > n->c - KDTREE_EPS) + { + SEdgeLl *selln = SEdgeLl::Alloc(); + selln->se = flip->se; + selln->next = gtl; + gtl = selln; + } + } + + n->lt = SKdNodeEdges::From(ltl); + n->gt = SKdNodeEdges::From(gtl); + return n; +} + +int SKdNodeEdges::AnyEdgeCrossings(Vector a, Vector b, int cnt, + Vector *pi, SPointList *spl) +{ + int inters = 0; + if(gt && lt) { + if(a.Element(which) < c + KDTREE_EPS || + b.Element(which) < c + KDTREE_EPS) + { + inters += lt->AnyEdgeCrossings(a, b, cnt, pi, spl); + } + if(a.Element(which) > c - KDTREE_EPS || + b.Element(which) > c - KDTREE_EPS) + { + inters += gt->AnyEdgeCrossings(a, b, cnt, pi, spl); + } + } else { + SEdgeLl *sell; + for(sell = edges; sell; sell = sell->next) { + SEdge *se = sell->se; + if(se->tag == cnt) continue; + if(se->EdgeCrosses(a, b, pi, spl)) { + inters++; + } + se->tag = cnt; + } + } + return inters; +} + +//----------------------------------------------------------------------------- +// We have an edge list that contains only collinear edges, maybe with more +// splits than necessary. Merge any collinear segments that join. +//----------------------------------------------------------------------------- +static Vector LineStart, LineDirection; +static int ByTAlongLine(const void *av, const void *bv) +{ + SEdge *a = (SEdge *)av, + *b = (SEdge *)bv; + + double ta = (a->a.Minus(LineStart)).DivPivoting(LineDirection), + tb = (b->a.Minus(LineStart)).DivPivoting(LineDirection); + + return (ta > tb) ? 1 : -1; +} +void SEdgeList::MergeCollinearSegments(Vector a, Vector b) { + LineStart = a; + LineDirection = b.Minus(a); + qsort(l.elem, l.n, sizeof(l.elem[0]), ByTAlongLine); + + l.ClearTags(); + int i; + for(i = 1; i < l.n; i++) { + SEdge *prev = &(l.elem[i-1]), + *now = &(l.elem[i]); + + if((prev->b).Equals(now->a) && prev->auxA == now->auxA) { + // The previous segment joins up to us; so merge it into us. + prev->tag = 1; + now->a = prev->a; + } + } + l.RemoveTagged(); +} + +void SPointList::Clear(void) { + l.Clear(); +} + +bool SPointList::ContainsPoint(Vector pt) { + return (IndexForPoint(pt) >= 0); +} + +int SPointList::IndexForPoint(Vector pt) { + int i; + for(i = 0; i < l.n; i++) { + SPoint *p = &(l.elem[i]); + if(pt.Equals(p->p)) { + return i; + } + } + // Not found, so return negative to indicate that. + return -1; +} + +void SPointList::IncrementTagFor(Vector pt) { + SPoint *p; + for(p = l.First(); p; p = l.NextAfter(p)) { + if(pt.Equals(p->p)) { + (p->tag)++; + return; + } + } + SPoint pa; + pa.p = pt; + pa.tag = 1; + l.Add(&pa); +} + +void SPointList::Add(Vector pt) { + SPoint p = {}; + p.p = pt; + l.Add(&p); +} + +void SContour::AddPoint(Vector p) { + SPoint sp; + sp.tag = 0; + sp.p = p; + + l.Add(&sp); +} + +void SContour::MakeEdgesInto(SEdgeList *el) { + int i; + for(i = 0; i < (l.n - 1); i++) { + el->AddEdge(l.elem[i].p, l.elem[i+1].p); + } +} + +void SContour::CopyInto(SContour *dest) { + SPoint *sp; + for(sp = l.First(); sp; sp = l.NextAfter(sp)) { + dest->AddPoint(sp->p); + } +} + +void SContour::FindPointWithMinX(void) { + SPoint *sp; + xminPt = Vector::From(1e10, 1e10, 1e10); + for(sp = l.First(); sp; sp = l.NextAfter(sp)) { + if(sp->p.x < xminPt.x) { + xminPt = sp->p; + } + } +} + +Vector SContour::ComputeNormal(void) { + Vector n = Vector::From(0, 0, 0); + + for(int i = 0; i < l.n - 2; i++) { + Vector u = (l.elem[i+1].p).Minus(l.elem[i+0].p).WithMagnitude(1); + Vector v = (l.elem[i+2].p).Minus(l.elem[i+1].p).WithMagnitude(1); + Vector nt = u.Cross(v); + if(nt.Magnitude() > n.Magnitude()) { + n = nt; + } + } + return n.WithMagnitude(1); +} + +Vector SContour::AnyEdgeMidpoint(void) { + if(l.n < 2) oops(); + return ((l.elem[0].p).Plus(l.elem[1].p)).ScaledBy(0.5); +} + +bool SContour::IsClockwiseProjdToNormal(Vector n) { + // Degenerate things might happen as we draw; doesn't really matter + // what we do then. + if(n.Magnitude() < 0.01) return true; + + return (SignedAreaProjdToNormal(n) < 0); +} + +double SContour::SignedAreaProjdToNormal(Vector n) { + // An arbitrary 2d coordinate system that has n as its normal + Vector u = n.Normal(0); + Vector v = n.Normal(1); + + double area = 0; + for(int i = 0; i < (l.n - 1); i++) { + double u0 = (l.elem[i ].p).Dot(u); + double v0 = (l.elem[i ].p).Dot(v); + double u1 = (l.elem[i+1].p).Dot(u); + double v1 = (l.elem[i+1].p).Dot(v); + + area += ((v0 + v1)/2)*(u1 - u0); + } + return area; +} + +bool SContour::ContainsPointProjdToNormal(Vector n, Vector p) { + Vector u = n.Normal(0); + Vector v = n.Normal(1); + + double up = p.Dot(u); + double vp = p.Dot(v); + + bool inside = false; + for(int i = 0; i < (l.n - 1); i++) { + double ua = (l.elem[i ].p).Dot(u); + double va = (l.elem[i ].p).Dot(v); + // The curve needs to be exactly closed; approximation is death. + double ub = (l.elem[(i+1)%(l.n-1)].p).Dot(u); + double vb = (l.elem[(i+1)%(l.n-1)].p).Dot(v); + + if ((((va <= vp) && (vp < vb)) || + ((vb <= vp) && (vp < va))) && + (up < (ub - ua) * (vp - va) / (vb - va) + ua)) + { + inside = !inside; + } + } + + return inside; +} + +void SContour::Reverse(void) { + l.Reverse(); +} + + +void SPolygon::Clear(void) { + int i; + for(i = 0; i < l.n; i++) { + (l.elem[i]).l.Clear(); + } + l.Clear(); +} + +void SPolygon::AddEmptyContour(void) { + SContour c = {}; + l.Add(&c); +} + +void SPolygon::MakeEdgesInto(SEdgeList *el) { + int i; + for(i = 0; i < l.n; i++) { + (l.elem[i]).MakeEdgesInto(el); + } +} + +Vector SPolygon::ComputeNormal(void) { + if(l.n < 1) return Vector::From(0, 0, 0); + return (l.elem[0]).ComputeNormal(); +} + +double SPolygon::SignedArea(void) { + SContour *sc; + double area = 0; + // This returns the true area only if the contours are all oriented + // correctly, with the holes backwards from the outer contours. + for(sc = l.First(); sc; sc = l.NextAfter(sc)) { + area += sc->SignedAreaProjdToNormal(normal); + } + return area; +} + +bool SPolygon::ContainsPoint(Vector p) { + return (WindingNumberForPoint(p) % 2) == 1; +} + +int SPolygon::WindingNumberForPoint(Vector p) { + int winding = 0; + int i; + for(i = 0; i < l.n; i++) { + SContour *sc = &(l.elem[i]); + if(sc->ContainsPointProjdToNormal(normal, p)) { + winding++; + } + } + return winding; +} + +void SPolygon::FixContourDirections(void) { + // At output, the contour's tag will be 1 if we reversed it, else 0. + l.ClearTags(); + + // Outside curve looks counterclockwise, projected against our normal. + int i, j; + for(i = 0; i < l.n; i++) { + SContour *sc = &(l.elem[i]); + if(sc->l.n < 2) continue; + // The contours may not intersect, but they may share vertices; so + // testing a vertex for point-in-polygon may fail, but the midpoint + // of an edge is okay. + Vector pt = (((sc->l.elem[0]).p).Plus(sc->l.elem[1].p)).ScaledBy(0.5); + + sc->timesEnclosed = 0; + bool outer = true; + for(j = 0; j < l.n; j++) { + if(i == j) continue; + SContour *sct = &(l.elem[j]); + if(sct->ContainsPointProjdToNormal(normal, pt)) { + outer = !outer; + (sc->timesEnclosed)++; + } + } + + bool clockwise = sc->IsClockwiseProjdToNormal(normal); + if((clockwise && outer) || (!clockwise && !outer)) { + sc->Reverse(); + sc->tag = 1; + } + } +} + +bool SPolygon::IsEmpty(void) { + if(l.n == 0 || l.elem[0].l.n == 0) return true; + return false; +} + +Vector SPolygon::AnyPoint(void) { + if(IsEmpty()) oops(); + return l.elem[0].l.elem[0].p; +} + +bool SPolygon::SelfIntersecting(Vector *intersectsAt) { + SEdgeList el = {}; + MakeEdgesInto(&el); + SKdNodeEdges *kdtree = SKdNodeEdges::From(&el); + + int cnt = 1; + el.l.ClearTags(); + + bool ret = false; + SEdge *se; + for(se = el.l.First(); se; se = el.l.NextAfter(se)) { + int inters = kdtree->AnyEdgeCrossings(se->a, se->b, cnt, intersectsAt); + if(inters != 1) { + ret = true; + break; + } + cnt++; + } + + el.Clear(); + return ret; +} + +//----------------------------------------------------------------------------- +// Low-quality routines to cutter radius compensate a polygon. Assumes the +// polygon is in the xy plane, and the contours all go in the right direction +// with respect to normal (0, 0, -1). +//----------------------------------------------------------------------------- +void SPolygon::OffsetInto(SPolygon *dest, double r) { + int i; + dest->Clear(); + for(i = 0; i < l.n; i++) { + SContour *sc = &(l.elem[i]); + dest->AddEmptyContour(); + sc->OffsetInto(&(dest->l.elem[dest->l.n-1]), r); + } +} +//----------------------------------------------------------------------------- +// Calculate the intersection point of two lines. Returns true for success, +// false if they're parallel. +//----------------------------------------------------------------------------- +static bool IntersectionOfLines(double x0A, double y0A, double dxA, double dyA, + double x0B, double y0B, double dxB, double dyB, + double *xi, double *yi) +{ + double A[2][2]; + double b[2]; + + // The line is given to us in the form: + // (x(t), y(t)) = (x0, y0) + t*(dx, dy) + // so first rewrite it as + // (x - x0, y - y0) dot (dy, -dx) = 0 + // x*dy - x0*dy - y*dx + y0*dx = 0 + // x*dy - y*dx = (x0*dy - y0*dx) + + // So write the matrix, pre-pivoted. + if(fabs(dyA) > fabs(dyB)) { + A[0][0] = dyA; A[0][1] = -dxA; b[0] = x0A*dyA - y0A*dxA; + A[1][0] = dyB; A[1][1] = -dxB; b[1] = x0B*dyB - y0B*dxB; + } else { + A[1][0] = dyA; A[1][1] = -dxA; b[1] = x0A*dyA - y0A*dxA; + A[0][0] = dyB; A[0][1] = -dxB; b[0] = x0B*dyB - y0B*dxB; + } + + // Check the determinant; if it's zero then no solution. + if(fabs(A[0][0]*A[1][1] - A[0][1]*A[1][0]) < LENGTH_EPS) { + return false; + } + + // Solve + double v = A[1][0] / A[0][0]; + A[1][0] -= A[0][0]*v; + A[1][1] -= A[0][1]*v; + b[1] -= b[0]*v; + + // Back-substitute. + *yi = b[1] / A[1][1]; + *xi = (b[0] - A[0][1]*(*yi)) / A[0][0]; + + return true; +} +void SContour::OffsetInto(SContour *dest, double r) { + int i; + + for(i = 0; i < l.n; i++) { + Vector a, b, c; + Vector dp, dn; + double thetan, thetap; + + a = l.elem[WRAP(i-1, (l.n-1))].p; + b = l.elem[WRAP(i, (l.n-1))].p; + c = l.elem[WRAP(i+1, (l.n-1))].p; + + dp = a.Minus(b); + thetap = atan2(dp.y, dp.x); + + dn = b.Minus(c); + thetan = atan2(dn.y, dn.x); + + // A short line segment in a badly-generated polygon might look + // okay but screw up our sense of direction. + if(dp.Magnitude() < LENGTH_EPS || dn.Magnitude() < LENGTH_EPS) { + continue; + } + + if(thetan > thetap && (thetan - thetap) > PI) { + thetap += 2*PI; + } + if(thetan < thetap && (thetap - thetan) > PI) { + thetan += 2*PI; + } + + if(fabs(thetan - thetap) < (1*PI)/180) { + Vector p = { b.x - r*sin(thetap), b.y + r*cos(thetap), 0 }; + dest->AddPoint(p); + } else if(thetan < thetap) { + // This is an inside corner. We have two edges, Ep and En. Move + // out from their intersection by radius, normal to En, and + // then draw a line parallel to En. Move out from their + // intersection by radius, normal to Ep, and then draw a second + // line parallel to Ep. The point that we want to generate is + // the intersection of these two lines--it removes as much + // material as we can without removing any that we shouldn't. + double px0, py0, pdx, pdy; + double nx0, ny0, ndx, ndy; + double x = 0.0, y = 0.0; + + px0 = b.x - r*sin(thetap); + py0 = b.y + r*cos(thetap); + pdx = cos(thetap); + pdy = sin(thetap); + + nx0 = b.x - r*sin(thetan); + ny0 = b.y + r*cos(thetan); + ndx = cos(thetan); + ndy = sin(thetan); + + IntersectionOfLines(px0, py0, pdx, pdy, + nx0, ny0, ndx, ndy, + &x, &y); + + dest->AddPoint(Vector::From(x, y, 0)); + } else { + if(fabs(thetap - thetan) < (6*PI)/180) { + Vector pp = { b.x - r*sin(thetap), + b.y + r*cos(thetap), 0 }; + dest->AddPoint(pp); + + Vector pn = { b.x - r*sin(thetan), + b.y + r*cos(thetan), 0 }; + dest->AddPoint(pn); + } else { + double theta; + for(theta = thetap; theta <= thetan; theta += (6*PI)/180) { + Vector p = { b.x - r*sin(theta), + b.y + r*cos(theta), 0 }; + dest->AddPoint(p); + } + } + } + } +} + diff --git a/src/polygon.h b/src/polygon.h new file mode 100644 index 0000000..7d2907b --- /dev/null +++ b/src/polygon.h @@ -0,0 +1,337 @@ +//----------------------------------------------------------------------------- +// Anything relating to plane polygons and triangles, and (generally, non- +// planar) meshes thereof. +// +// Copyright 2008-2013 Jonathan Westhues. +//----------------------------------------------------------------------------- + +#ifndef __POLYGON_H +#define __POLYGON_H + +class SPointList; +class SPolygon; +class SContour; +class SMesh; +class SBsp3; +class SOutlineList; + +class SEdge { +public: + int tag; + int auxA, auxB; + Vector a, b; + + static SEdge From(Vector a, Vector b); + bool EdgeCrosses(Vector a, Vector b, Vector *pi=NULL, SPointList *spl=NULL); +}; + +class SEdgeList { +public: + List l; + + void Clear(void); + void AddEdge(Vector a, Vector b, int auxA=0, int auxB=0); + bool AssemblePolygon(SPolygon *dest, SEdge *errorAt, bool keepDir=false); + bool AssembleContour(Vector first, Vector last, SContour *dest, + SEdge *errorAt, bool keepDir); + int AnyEdgeCrossings(Vector a, Vector b, + Vector *pi=NULL, SPointList *spl=NULL); + bool ContainsEdgeFrom(SEdgeList *sel); + bool ContainsEdge(SEdge *se); + void CullExtraneousEdges(void); + void MergeCollinearSegments(Vector a, Vector b); +}; + +// A kd-tree element needs to go on a side of a node if it's when KDTREE_EPS +// of the boundary. So increasing this number never breaks anything, but may +// result in more duplicated elements. So it's conservative to be sloppy here. +#define KDTREE_EPS (20*LENGTH_EPS) + +class SEdgeLl { +public: + SEdge *se; + SEdgeLl *next; + + static SEdgeLl *Alloc(void); +}; + +class SKdNodeEdges { +public: + int which; // whether c is x, y, or z + double c; + SKdNodeEdges *gt; + SKdNodeEdges *lt; + + SEdgeLl *edges; + + static SKdNodeEdges *From(SEdgeList *sel); + static SKdNodeEdges *From(SEdgeLl *sell); + static SKdNodeEdges *Alloc(void); + int AnyEdgeCrossings(Vector a, Vector b, int cnt, + Vector *pi=NULL, SPointList *spl=NULL); +}; + +class SPoint { +public: + int tag; + + enum { + UNKNOWN = 0, + NOT_EAR = 1, + EAR = 2 + }; + int ear; + + Vector p; + Vector auxv; +}; + +class SPointList { +public: + List l; + + void Clear(void); + bool ContainsPoint(Vector pt); + int IndexForPoint(Vector pt); + void IncrementTagFor(Vector pt); + void Add(Vector pt); +}; + +class SContour { +public: + int tag; + int timesEnclosed; + Vector xminPt; + List l; + + void AddPoint(Vector p); + void MakeEdgesInto(SEdgeList *el); + void Reverse(void); + Vector ComputeNormal(void); + double SignedAreaProjdToNormal(Vector n); + bool IsClockwiseProjdToNormal(Vector n); + bool ContainsPointProjdToNormal(Vector n, Vector p); + void OffsetInto(SContour *dest, double r); + void CopyInto(SContour *dest); + void FindPointWithMinX(void); + Vector AnyEdgeMidpoint(void); + + bool IsEar(int bp, double scaledEps); + bool BridgeToContour(SContour *sc, SEdgeList *el, List *vl); + void ClipEarInto(SMesh *m, int bp, double scaledEps); + void UvTriangulateInto(SMesh *m, SSurface *srf); +}; + +typedef struct { + uint32_t face; + RgbaColor color; +} STriMeta; + +class SPolygon { +public: + List l; + Vector normal; + + Vector ComputeNormal(void); + void AddEmptyContour(void); + int WindingNumberForPoint(Vector p); + double SignedArea(void); + bool ContainsPoint(Vector p); + void MakeEdgesInto(SEdgeList *el); + void FixContourDirections(void); + void Clear(void); + bool SelfIntersecting(Vector *intersectsAt); + bool IsEmpty(void); + Vector AnyPoint(void); + void OffsetInto(SPolygon *dest, double r); + void UvTriangulateInto(SMesh *m, SSurface *srf); + void UvGridTriangulateInto(SMesh *m, SSurface *srf); +}; + +class STriangle { +public: + int tag; + STriMeta meta; + Vector a, b, c; + Vector an, bn, cn; + + static STriangle From(STriMeta meta, Vector a, Vector b, Vector c); + Vector Normal(void); + void FlipNormal(void); + double MinAltitude(void); + int WindingNumberForPoint(Vector p); + bool ContainsPoint(Vector p); + bool ContainsPointProjd(Vector n, Vector p); +}; + +class SBsp2 { +public: + Vector np; // normal to the plane + + Vector no; // outer normal to the edge + double d; + SEdge edge; + + SBsp2 *pos; + SBsp2 *neg; + + SBsp2 *more; + + enum { POS = 100, NEG = 101, COPLANAR = 200 }; + void InsertTriangleHow(int how, STriangle *tr, SMesh *m, SBsp3 *bsp3); + void InsertTriangle(STriangle *tr, SMesh *m, SBsp3 *bsp3); + Vector IntersectionWith(Vector a, Vector b); + void InsertEdge(SEdge *nedge, Vector nnp, Vector out); + static SBsp2 *InsertOrCreateEdge(SBsp2 *where, SEdge *nedge, Vector nnp, Vector out); + static SBsp2 *Alloc(void); + + void DebugDraw(Vector n, double d); +}; + +class SBsp3 { +public: + Vector n; + double d; + + STriangle tri; + SBsp3 *pos; + SBsp3 *neg; + + SBsp3 *more; + + SBsp2 *edges; + + static SBsp3 *Alloc(void); + static SBsp3 *FromMesh(SMesh *m); + + Vector IntersectionWith(Vector a, Vector b); + + enum { POS = 100, NEG = 101, COPLANAR = 200 }; + void InsertHow(int how, STriangle *str, SMesh *instead); + void Insert(STriangle *str, SMesh *instead); + static SBsp3 *InsertOrCreate(SBsp3 *where, STriangle *str, SMesh *instead); + + void InsertConvexHow(int how, STriMeta meta, Vector *vertex, int n, + SMesh *instead); + SBsp3 *InsertConvex(STriMeta meta, Vector *vertex, int n, SMesh *instead); + + void InsertInPlane(bool pos2, STriangle *tr, SMesh *m); + + void GenerateInPaintOrder(SMesh *m); + + void DebugDraw(void); +}; + +class SMesh { +public: + List l; + + bool flipNormal; + bool keepCoplanar; + bool atLeastOneDiscarded; + bool isTransparent; + + void Clear(void); + void AddTriangle(STriangle *st); + void AddTriangle(STriMeta meta, Vector a, Vector b, Vector c); + void AddTriangle(STriMeta meta, Vector n, Vector a, Vector b, Vector c); + void DoBounding(Vector v, Vector *vmax, Vector *vmin); + void GetBounding(Vector *vmax, Vector *vmin); + + void Simplify(int start); + + void AddAgainstBsp(SMesh *srcm, SBsp3 *bsp3); + void MakeFromUnionOf(SMesh *a, SMesh *b); + void MakeFromDifferenceOf(SMesh *a, SMesh *b); + + void MakeFromCopyOf(SMesh *a); + void MakeFromTransformationOf(SMesh *a, + Vector trans, Quaternion q, double scale); + void MakeFromAssemblyOf(SMesh *a, SMesh *b); + + void MakeEdgesInPlaneInto(SEdgeList *sel, Vector n, double d); + void MakeCertainEdgesAndOutlinesInto(SEdgeList *sel, SOutlineList *sol, int type); + + bool IsEmpty(void); + void RemapFaces(Group *g, int remap); + + uint32_t FirstIntersectionWith(Point2d mp); +}; + +// A linked list of triangles +class STriangleLl { +public: + STriangle *tri; + + STriangleLl *next; + + static STriangleLl *Alloc(void); +}; + +class SOutline { +public: + int tag; + Vector a, b, nl, nr; +}; + +class SOutlineList { +public: + List l; + + void Clear(); + void AddEdge(Vector a, Vector b, Vector nl, Vector nr); + + void MakeFromCopyOf(SOutlineList *ol); + + void FillOutlineTags(Vector projDir); +}; + +class SKdNode { +public: + struct EdgeOnInfo { + int count; + bool frontFacing; + bool intersectsMesh; + STriangle *tr; + int ai; + int bi; + }; + + int which; // whether c is x, y, or z + double c; + + SKdNode *gt; + SKdNode *lt; + + STriangleLl *tris; + + static SKdNode *Alloc(void); + static SKdNode *From(SMesh *m); + static SKdNode *From(STriangleLl *tll); + + void AddTriangle(STriangle *tr); + void MakeMeshInto(SMesh *m); + void ListTrianglesInto(std::vector *tl); + void ClearTags(void); + + void FindEdgeOn(Vector a, Vector b, int cnt, bool coplanarIsInter, EdgeOnInfo *info); + enum { + NAKED_OR_SELF_INTER_EDGES = 100, + SELF_INTER_EDGES = 200, + TURNING_EDGES = 300, + EMPHASIZED_EDGES = 400, + SHARP_EDGES = 500, + }; + void MakeCertainEdgesInto(SEdgeList *sel, int how, bool coplanarIsInter, + bool *inter, bool *leaky, int auxA=0); + void MakeOutlinesInto(SOutlineList *sel); + + void OcclusionTestLine(SEdge orig, SEdgeList *sel, int cnt, bool removeHidden); + void SplitLinesAgainstTriangle(SEdgeList *sel, STriangle *tr, bool removeHidden); + + void SnapToMesh(SMesh *m); + void SnapToVertex(Vector v, SMesh *extras); +}; + +#endif + diff --git a/src/request.cpp b/src/request.cpp new file mode 100644 index 0000000..b770e06 --- /dev/null +++ b/src/request.cpp @@ -0,0 +1,205 @@ +//----------------------------------------------------------------------------- +// Implementation of our Request class; a request is a user-created thing +// that will generate an entity (line, curve) when the sketch is generated, +// in the same way that other entities are generated automatically, like +// by an extrude or a step and repeat. +// +// Copyright 2008-2013 Jonathan Westhues. +//----------------------------------------------------------------------------- +#include "solvespace.h" + +const hRequest Request::HREQUEST_REFERENCE_XY = { 1 }; +const hRequest Request::HREQUEST_REFERENCE_YZ = { 2 }; +const hRequest Request::HREQUEST_REFERENCE_ZX = { 3 }; + +const EntReqTable::TableEntry EntReqTable::Table[] = { +// request type entity type pts xtra? norml dist description +{ Request::WORKPLANE, Entity::WORKPLANE, 1, false, true, false, "workplane" }, +{ Request::DATUM_POINT, 0, 1, false, false, false, "datum-point" }, +{ Request::LINE_SEGMENT, Entity::LINE_SEGMENT, 2, false, false, false, "line-segment" }, +{ Request::CUBIC, Entity::CUBIC, 4, true, false, false, "cubic-bezier" }, +{ Request::CUBIC_PERIODIC, Entity::CUBIC_PERIODIC, 3, true, false, false, "periodic-cubic" }, +{ Request::CIRCLE, Entity::CIRCLE, 1, false, true, true, "circle" }, +{ Request::ARC_OF_CIRCLE, Entity::ARC_OF_CIRCLE, 3, false, true, false, "arc-of-circle" }, +{ Request::TTF_TEXT, Entity::TTF_TEXT, 2, false, true, false, "ttf-text" }, +{ 0, 0, 0, false, false, false, 0 }, +}; + +const char *EntReqTable::DescriptionForRequest(int req) { + for(int i = 0; Table[i].reqType; i++) { + if(req == Table[i].reqType) { + return Table[i].description; + } + } + return "???"; +} + +void EntReqTable::CopyEntityInfo(const TableEntry *te, int extraPoints, + int *ent, int *req, int *pts, bool *hasNormal, bool *hasDistance) +{ + int points = te->points; + if(te->useExtraPoints) points += extraPoints; + + if(ent) *ent = te->entType; + if(req) *req = te->reqType; + if(pts) *pts = points; + if(hasNormal) *hasNormal = te->hasNormal; + if(hasDistance) *hasDistance = te->hasDistance; +} + +bool EntReqTable::GetRequestInfo(int req, int extraPoints, + int *ent, int *pts, bool *hasNormal, bool *hasDistance) +{ + for(int i = 0; Table[i].reqType; i++) { + const TableEntry *te = &(Table[i]); + if(req == te->reqType) { + CopyEntityInfo(te, extraPoints, + ent, NULL, pts, hasNormal, hasDistance); + return true; + } + } + return false; +} + +bool EntReqTable::GetEntityInfo(int ent, int extraPoints, + int *req, int *pts, bool *hasNormal, bool *hasDistance) +{ + for(int i = 0; Table[i].reqType; i++) { + const TableEntry *te = &(Table[i]); + if(ent == te->entType) { + CopyEntityInfo(te, extraPoints, + NULL, req, pts, hasNormal, hasDistance); + return true; + } + } + return false; +} + +int EntReqTable::GetRequestForEntity(int ent) { + int req = 0; + GetEntityInfo(ent, 0, &req, NULL, NULL, NULL); + return req; +} + + +void Request::Generate(IdList *entity, + IdList *param) +{ + int points = 0; + int et = 0; + bool hasNormal = false; + bool hasDistance = false; + int i; + + Entity e = {}; + EntReqTable::GetRequestInfo(type, extraPoints, + &et, &points, &hasNormal, &hasDistance); + + // Generate the entity that's specific to this request. + e.type = et; + e.extraPoints = extraPoints; + e.group = group; + e.style = style; + e.workplane = workplane; + e.construction = construction; + e.str = str; + e.font = font; + e.h = h.entity(0); + + // And generate entities for the points + for(i = 0; i < points; i++) { + Entity p = {}; + p.workplane = workplane; + // points start from entity 1, except for datum point case + p.h = h.entity(i+(et ? 1 : 0)); + p.group = group; + p.style = style; + + if(workplane.v == Entity::FREE_IN_3D.v) { + p.type = Entity::POINT_IN_3D; + // params for x y z + p.param[0] = AddParam(param, h.param(16 + 3*i + 0)); + p.param[1] = AddParam(param, h.param(16 + 3*i + 1)); + p.param[2] = AddParam(param, h.param(16 + 3*i + 2)); + } else { + p.type = Entity::POINT_IN_2D; + // params for u v + p.param[0] = AddParam(param, h.param(16 + 3*i + 0)); + p.param[1] = AddParam(param, h.param(16 + 3*i + 1)); + } + entity->Add(&p); + e.point[i] = p.h; + } + if(hasNormal) { + Entity n = {}; + n.workplane = workplane; + n.h = h.entity(32); + n.group = group; + n.style = style; + if(workplane.v == Entity::FREE_IN_3D.v) { + n.type = Entity::NORMAL_IN_3D; + n.param[0] = AddParam(param, h.param(32+0)); + n.param[1] = AddParam(param, h.param(32+1)); + n.param[2] = AddParam(param, h.param(32+2)); + n.param[3] = AddParam(param, h.param(32+3)); + } else { + n.type = Entity::NORMAL_IN_2D; + // and this is just a copy of the workplane quaternion, + // so no params required + } + if(points < 1) oops(); + // The point determines where the normal gets displayed on-screen; + // it's entirely cosmetic. + n.point[0] = e.point[0]; + entity->Add(&n); + e.normal = n.h; + } + if(hasDistance) { + Entity d = {}; + d.workplane = workplane; + d.h = h.entity(64); + d.group = group; + d.style = style; + d.type = Entity::DISTANCE; + d.param[0] = AddParam(param, h.param(64)); + entity->Add(&d); + e.distance = d.h; + } + + if(et) entity->Add(&e); +} + +std::string Request::DescriptionString(void) { + const char *s; + if(h.v == Request::HREQUEST_REFERENCE_XY.v) { + s = "#XY"; + } else if(h.v == Request::HREQUEST_REFERENCE_YZ.v) { + s = "#YZ"; + } else if(h.v == Request::HREQUEST_REFERENCE_ZX.v) { + s = "#ZX"; + } else { + s = EntReqTable::DescriptionForRequest(type); + } + + return ssprintf("r%03x-%s", h.v, s); +} + +int Request::IndexOfPoint(hEntity he) { + if(type == DATUM_POINT) { + return (he.v == h.entity(0).v) ? 0 : -1; + } + for(int i = 0; i < MAX_POINTS_IN_ENTITY; i++) { + if(he.v == h.entity(i + 1).v) { + return i; + } + } + return -1; +} + +hParam Request::AddParam(IdList *param, hParam hp) { + Param pa = {}; + pa.h = hp; + param->Add(&pa); + return hp; +} + diff --git a/src/sketch.h b/src/sketch.h new file mode 100644 index 0000000..d9f1794 --- /dev/null +++ b/src/sketch.h @@ -0,0 +1,916 @@ +//----------------------------------------------------------------------------- +// The parametric structure of our sketch, in multiple groups, that generate +// geometric entities and surfaces. +// +// Copyright 2008-2013 Jonathan Westhues. +//----------------------------------------------------------------------------- + +#ifndef __SKETCH_H +#define __SKETCH_H + +class hGroup; +class hRequest; +class hEntity; +class hParam; +class hStyle; +class hConstraint; +class hEquation; + +class Entity; +class Param; +class Equation; +class Style; + + +// All of the hWhatever handles are a 32-bit ID, that is used to represent +// some data structure in the sketch. +class hGroup { +public: + // bits 15: 0 -- group index + uint32_t v; + + inline hEntity entity(int i); + inline hParam param(int i); + inline hEquation equation(int i); +}; +class hRequest { +public: + // bits 15: 0 -- request index + uint32_t v; + + inline hEntity entity(int i); + inline hParam param(int i); + + inline bool IsFromReferences(void); +}; +class hEntity { +public: + // bits 15: 0 -- entity index + // 31:16 -- request index + uint32_t v; + + inline bool isFromRequest(void); + inline hRequest request(void); + inline hGroup group(void); + inline hEquation equation(int i); +}; +class hParam { +public: + // bits 15: 0 -- param index + // 31:16 -- request index + uint32_t v; + + inline hRequest request(void); +}; + +class hStyle { +public: + uint32_t v; +}; + + +class EntityId { +public: + uint32_t v; // entity ID, starting from 0 +}; +class EntityMap { +public: + int tag; + + EntityId h; + hEntity input; + int copyNumber; + // (input, copyNumber) gets mapped to ((Request)xxx).entity(h.v) + + void Clear(void) {} +}; + +// A set of requests. Every request must have an associated group. +class Group { +public: + static const hGroup HGROUP_REFERENCES; + + int tag; + hGroup h; + + enum { + DRAWING_3D = 5000, + DRAWING_WORKPLANE = 5001, + EXTRUDE = 5100, + LATHE = 5101, + ROTATE = 5200, + TRANSLATE = 5201, + LINKED = 5300 + }; + int type; + + int order; + + hGroup opA; + hGroup opB; + bool visible; + bool suppress; + bool relaxConstraints; + bool allowRedundant; + bool allDimsReference; + double scale; + + bool clean; + hEntity activeWorkplane; + double valA; + double valB; + double valC; + RgbaColor color; + + struct { + int how; + int dof; + List remove; + } solved; + + enum { + // For drawings in 2d + WORKPLANE_BY_POINT_ORTHO = 6000, + WORKPLANE_BY_LINE_SEGMENTS = 6001, + // For extrudes, translates, and rotates + ONE_SIDED = 7000, + TWO_SIDED = 7001 + }; + int subtype; + + bool skipFirst; // for step and repeat ops + + struct { + Quaternion q; + hEntity origin; + hEntity entityB; + hEntity entityC; + bool swapUV; + bool negateU; + bool negateV; + } predef; + + SPolygon polyLoops; + SBezierLoopSetSet bezierLoops; + SBezierList bezierOpens; + enum { + POLY_GOOD = 0, + POLY_NOT_CLOSED = 1, + POLY_NOT_COPLANAR = 2, + POLY_SELF_INTERSECTING = 3, + POLY_ZERO_LEN_EDGE = 4 + }; + struct { + int how; + SEdge notClosedAt; + Vector errorPointAt; + } polyError; + + bool booleanFailed; + + SShell thisShell; + SShell runningShell; + + SMesh thisMesh; + SMesh runningMesh; + + bool displayDirty; + SMesh displayMesh; + SEdgeList displayEdges; + SOutlineList displayOutlines; + + enum { + COMBINE_AS_UNION = 0, + COMBINE_AS_DIFFERENCE = 1, + COMBINE_AS_ASSEMBLE = 2 + }; + int meshCombine; + + bool forceToMesh; + + IdList remap; + enum { REMAP_PRIME = 19477 }; + int remapCache[REMAP_PRIME]; + + std::string linkFile; + std::string linkFileRel; + SMesh impMesh; + SShell impShell; + EntityList impEntity; + + std::string name; + + + void Activate(void); + std::string DescriptionString(void); + void Clear(void); + + static void AddParam(ParamList *param, hParam hp, double v); + void Generate(EntityList *entity, ParamList *param); + bool IsSolvedOkay(); + void TransformImportedBy(Vector t, Quaternion q); + // When a request generates entities from entities, and the source + // entities may have come from multiple requests, it's necessary to + // remap the entity ID so that it's still unique. We do this with a + // mapping list. + enum { + REMAP_LAST = 1000, + REMAP_TOP = 1001, + REMAP_BOTTOM = 1002, + REMAP_PT_TO_LINE = 1003, + REMAP_LINE_TO_FACE = 1004, + REMAP_LATHE_START = 1006, + REMAP_LATHE_END = 1007, + REMAP_PT_TO_ARC = 1008, + REMAP_PT_TO_NORMAL = 1009, + }; + hEntity Remap(hEntity in, int copyNumber); + void MakeExtrusionLines(EntityList *el, hEntity in); + void MakeLatheCircles(IdList *el, IdList *param, hEntity in, Vector pt, Vector axis, int ai); + void MakeExtrusionTopBottomFaces(EntityList *el, hEntity pt); + void CopyEntity(EntityList *el, + Entity *ep, int timesApplied, int remap, + hParam dx, hParam dy, hParam dz, + hParam qw, hParam qvx, hParam qvy, hParam qvz, + bool asTrans, bool asAxisAngle); + + void AddEq(IdList *l, Expr *expr, int index); + void GenerateEquations(IdList *l); + bool IsVisible(void); + int GetNumConstraints(); + Vector ExtrusionGetVector(); + void ExtrusionForceVectorTo(const Vector &v); + + // Assembling the curves into loops, and into a piecewise linear polygon + // at the same time. + void AssembleLoops(bool *allClosed, bool *allCoplanar, bool *allNonZeroLen); + void GenerateLoops(void); + // And the mesh stuff + Group *PreviousGroup(void); + Group *RunningMeshGroup(void); + bool IsMeshGroup(); + void GenerateShellAndMesh(void); + template void GenerateForStepAndRepeat(T *steps, T *outs); + template void GenerateForBoolean(T *a, T *b, T *o, int how); + void GenerateDisplayItems(void); + void DrawDisplayItems(int t); + void Draw(void); + RgbaColor GetLoopSetFillColor(SBezierLoopSet *sbls, + bool *allSame, Vector *errorAt); + void FillLoopSetAsPolygon(SBezierLoopSet *sbls); + void DrawFilledPaths(void); + + SPolygon GetPolygon(void); + + static void MenuGroup(int id); +}; + +// A user request for some primitive or derived operation; for example a +// line, or a step and repeat. +class Request { +public: + // Some predefined requests, that are present in every sketch. + static const hRequest HREQUEST_REFERENCE_XY; + static const hRequest HREQUEST_REFERENCE_YZ; + static const hRequest HREQUEST_REFERENCE_ZX; + + int tag; + hRequest h; + + // Types of requests + enum { + WORKPLANE = 100, + DATUM_POINT = 101, + LINE_SEGMENT = 200, + CUBIC = 300, + CUBIC_PERIODIC = 301, + CIRCLE = 400, + ARC_OF_CIRCLE = 500, + TTF_TEXT = 600 + }; + + int type; + int extraPoints; + + hEntity workplane; // or Entity::FREE_IN_3D + hGroup group; + hStyle style; + + bool construction; + std::string str; + std::string font; + + static hParam AddParam(ParamList *param, hParam hp); + void Generate(EntityList *entity, ParamList *param); + + std::string DescriptionString(void); + int IndexOfPoint(hEntity he); + + void Clear(void) {} +}; + +#define MAX_POINTS_IN_ENTITY (12) +class EntityBase { +public: + int tag; + hEntity h; + + static const hEntity FREE_IN_3D; + static const hEntity NO_ENTITY; + + enum { + POINT_IN_3D = 2000, + POINT_IN_2D = 2001, + POINT_N_TRANS = 2010, + POINT_N_ROT_TRANS = 2011, + POINT_N_COPY = 2012, + POINT_N_ROT_AA = 2013, + + NORMAL_IN_3D = 3000, + NORMAL_IN_2D = 3001, + NORMAL_N_COPY = 3010, + NORMAL_N_ROT = 3011, + NORMAL_N_ROT_AA = 3012, + + DISTANCE = 4000, + DISTANCE_N_COPY = 4001, + + FACE_NORMAL_PT = 5000, + FACE_XPROD = 5001, + FACE_N_ROT_TRANS = 5002, + FACE_N_TRANS = 5003, + FACE_N_ROT_AA = 5004, + + + WORKPLANE = 10000, + LINE_SEGMENT = 11000, + CUBIC = 12000, + CUBIC_PERIODIC = 12001, + CIRCLE = 13000, + ARC_OF_CIRCLE = 14000, + TTF_TEXT = 15000 + }; + + int type; + + hGroup group; + hEntity workplane; // or Entity::FREE_IN_3D + + // When it comes time to draw an entity, we look here to get the + // defining variables. + hEntity point[MAX_POINTS_IN_ENTITY]; + int extraPoints; + hEntity normal; + hEntity distance; + // The only types that have their own params are points, normals, + // and directions. + hParam param[7]; + + // Transformed points/normals/distances have their numerical base + Vector numPoint; + Quaternion numNormal; + double numDistance; + + std::string str; + std::string font; + + // For entities that are derived by a transformation, the number of + // times to apply the transformation. + int timesApplied; + + Quaternion GetAxisAngleQuaternion(int param0); + ExprQuaternion GetAxisAngleQuaternionExprs(int param0); + + bool IsCircle(void); + Expr *CircleGetRadiusExpr(void); + double CircleGetRadiusNum(void); + void ArcGetAngles(double *thetaa, double *thetab, double *dtheta); + + bool HasVector(void); + ExprVector VectorGetExprs(void); + Vector VectorGetNum(void); + Vector VectorGetRefPoint(void); + Vector VectorGetStartPoint(void); + + // For distances + bool IsDistance(void); + double DistanceGetNum(void); + Expr *DistanceGetExpr(void); + void DistanceForceTo(double v); + + bool IsWorkplane(void); + // The plane is points P such that P dot (xn, yn, zn) - d = 0 + void WorkplaneGetPlaneExprs(ExprVector *n, Expr **d); + ExprVector WorkplaneGetOffsetExprs(void); + Vector WorkplaneGetOffset(void); + EntityBase *Normal(void); + + bool IsFace(void); + ExprVector FaceGetNormalExprs(void); + Vector FaceGetNormalNum(void); + ExprVector FaceGetPointExprs(void); + Vector FaceGetPointNum(void); + + bool IsPoint(void); + // Applies for any of the point types + Vector PointGetNum(void); + ExprVector PointGetExprs(void); + void PointGetExprsInWorkplane(hEntity wrkpl, Expr **u, Expr **v); + void PointForceTo(Vector v); + // These apply only the POINT_N_ROT_TRANS, which has an assoc rotation + Quaternion PointGetQuaternion(void); + void PointForceQuaternionTo(Quaternion q); + + bool IsNormal(void); + // Applies for any of the normal types + Quaternion NormalGetNum(void); + ExprQuaternion NormalGetExprs(void); + void NormalForceTo(Quaternion q); + + Vector NormalU(void); + Vector NormalV(void); + Vector NormalN(void); + ExprVector NormalExprsU(void); + ExprVector NormalExprsV(void); + ExprVector NormalExprsN(void); + + Vector CubicGetStartNum(void); + Vector CubicGetFinishNum(void); + ExprVector CubicGetStartTangentExprs(void); + ExprVector CubicGetFinishTangentExprs(void); + Vector CubicGetStartTangentNum(void); + Vector CubicGetFinishTangentNum(void); + + bool HasEndpoints(void); + Vector EndpointStart(); + Vector EndpointFinish(); + + void AddEq(IdList *l, Expr *expr, int index); + void GenerateEquations(IdList *l); + + void Clear(void) {} +}; + +class Entity : public EntityBase { +public: + // Necessary for Entity e = {} to zero-initialize, since + // classes with base classes are not aggregates and + // the default constructor does not initialize members. + // + // Note EntityBase({}); without explicitly value-initializing + // the base class, MSVC2013 will default-initialize it, leaving + // POD members with indeterminate value. + Entity() : EntityBase({}), forceHidden(), actPoint(), actNormal(), + actDistance(), actVisible(), style(), construction(), + beziers(), edges(), edgesChordTol(), screenBBox(), screenBBoxValid(), + dogd() {}; + + // A linked entity that was hidden in the source file ends up hidden + // here too. + bool forceHidden; + + // All points/normals/distances have their numerical value; this is + // a convenience, to simplify the link/assembly code, so that the + // part is entirely described by the entities. + Vector actPoint; + Quaternion actNormal; + double actDistance; + // and the shown state also gets saved here, for later import + bool actVisible; + + hStyle style; + bool construction; + + SBezierList beziers; + SEdgeList edges; + double edgesChordTol; + BBox screenBBox; + bool screenBBoxValid; + + // Routines to draw and hit-test the representation of the entity + // on-screen. + struct { + bool drawing; + Point2d mp; + double dmin; + Vector refp; + double lineWidth; + double stippleScale; + int stippleType; + int data; + } dogd; // state for drawing or getting distance (for hit testing) + void LineDrawOrGetDistance(Vector a, Vector b, bool maybeFat=false, int userData = -1); + void DrawOrGetDistance(void); + + bool IsStylable(); + bool IsVisible(void); + bool PointIsFromReferences(void); + + void ComputeInterpolatingSpline(SBezierList *sbl, bool periodic); + void GenerateBezierCurves(SBezierList *sbl); + void GenerateEdges(SEdgeList *el, bool includingConstruction=false); + + static void DrawAll(bool drawAsHidden); + void Draw(bool drawAsHidden); + double GetDistance(Point2d mp); + Vector GetReferencePos(void); + + void CalculateNumerical(bool forExport); + + std::string DescriptionString(void); + + SBezierList *GetOrGenerateBezierCurves(); + SEdgeList *GetOrGenerateEdges(); + BBox GetOrGenerateScreenBBox(bool *hasBBox); + + void Clear() { + beziers.l.Clear(); + edges.l.Clear(); + } +}; + +class EntReqTable { +public: + typedef struct { + int reqType; + int entType; + int points; + bool useExtraPoints; + bool hasNormal; + bool hasDistance; + const char *description; + } TableEntry; + + static const TableEntry Table[]; + + static const char *DescriptionForRequest(int req); + static void CopyEntityInfo(const TableEntry *te, int extraPoints, + int *ent, int *req, int *pts, bool *hasNormal, bool *hasDistance); + static bool GetRequestInfo(int req, int extraPoints, + int *ent, int *pts, bool *hasNormal, bool *hasDistance); + static bool GetEntityInfo(int ent, int extraPoints, + int *req, int *pts, bool *hasNormal, bool *hasDistance); + static int GetRequestForEntity(int ent); +}; + +class Param { +public: + int tag; + hParam h; + + double val; + bool known; + bool free; + + // Used only in the solver + hParam substd; + + static const hParam NO_PARAM; + + void Clear(void) {} +}; + + +class hConstraint { +public: + uint32_t v; + + inline hEquation equation(int i); +}; + +class ConstraintBase { +public: + int tag; + hConstraint h; + + static const hConstraint NO_CONSTRAINT; + + enum { + POINTS_COINCIDENT = 20, + PT_PT_DISTANCE = 30, + PT_PLANE_DISTANCE = 31, + PT_LINE_DISTANCE = 32, + PT_FACE_DISTANCE = 33, + PROJ_PT_DISTANCE = 34, + PT_IN_PLANE = 41, + PT_ON_LINE = 42, + PT_ON_FACE = 43, + EQUAL_LENGTH_LINES = 50, + LENGTH_RATIO = 51, + EQ_LEN_PT_LINE_D = 52, + EQ_PT_LN_DISTANCES = 53, + EQUAL_ANGLE = 54, + EQUAL_LINE_ARC_LEN = 55, + LENGTH_DIFFERENCE = 56, + SYMMETRIC = 60, + SYMMETRIC_HORIZ = 61, + SYMMETRIC_VERT = 62, + SYMMETRIC_LINE = 63, + AT_MIDPOINT = 70, + HORIZONTAL = 80, + VERTICAL = 81, + DIAMETER = 90, + PT_ON_CIRCLE = 100, + SAME_ORIENTATION = 110, + ANGLE = 120, + PARALLEL = 121, + PERPENDICULAR = 122, + ARC_LINE_TANGENT = 123, + CUBIC_LINE_TANGENT = 124, + CURVE_CURVE_TANGENT = 125, + EQUAL_RADIUS = 130, + WHERE_DRAGGED = 200, + + COMMENT = 1000 + }; + + int type; + + hGroup group; + hEntity workplane; + + // These are the parameters for the constraint. + double valA; + hEntity ptA; + hEntity ptB; + hEntity entityA; + hEntity entityB; + hEntity entityC; + hEntity entityD; + bool other; + bool other2; + + bool reference; // a ref dimension, that generates no eqs + std::string comment; // since comments are represented as constraints + + bool HasLabel(void); + + void Generate(IdList *l); + void GenerateReal(IdList *l); + // Some helpers when generating symbolic constraint equations + void ModifyToSatisfy(void); + void AddEq(IdList *l, Expr *expr, int index); + static Expr *DirectionCosine(hEntity wrkpl, ExprVector ae, ExprVector be); + static Expr *Distance(hEntity workplane, hEntity pa, hEntity pb); + static Expr *PointLineDistance(hEntity workplane, hEntity pt, hEntity ln); + static Expr *PointPlaneDistance(ExprVector p, hEntity plane); + static Expr *VectorsParallel(int eq, ExprVector a, ExprVector b); + static ExprVector PointInThreeSpace(hEntity workplane, Expr *u, Expr *v); + + void Clear(void) {} +}; + +class Constraint : public ConstraintBase { +public: + // See Entity::Entity(). + Constraint() : ConstraintBase({}), disp(), dogd() {} + + // These define how the constraint is drawn on-screen. + struct { + Vector offset; + hStyle style; + } disp; + + // State for drawing or getting distance (for hit testing). + struct { + bool drawing; + Point2d mp; + double dmin; + Vector refp; + SEdgeList *sel; + } dogd; + + double GetDistance(Point2d mp); + Vector GetLabelPos(void); + Vector GetReferencePos(void); + void Draw(void); + void GetEdges(SEdgeList *sel); + bool IsStylable(); + hStyle GetStyle() const; + bool HasLabel(); + + void LineDrawOrGetDistance(Vector a, Vector b); + bool IsVisible() const; + void DrawOrGetDistance(Vector *labelPos); + std::string Label(void); + bool DoLineExtend(Vector p0, Vector p1, Vector pt, double salient); + void DoArcForAngle(Vector a0, Vector da, Vector b0, Vector db, + Vector offset, Vector *ref, bool trim); + void DoArrow(Vector p, Vector dir, Vector n, double width, double angle, double da); + void DoLineWithArrows(Vector ref, Vector a, Vector b, bool onlyOneExt); + int DoLineTrimmedAgainstBox(Vector ref, Vector a, Vector b, bool extend, Vector gr, Vector gu, double swidth, double sheight); + int DoLineTrimmedAgainstBox(Vector ref, Vector a, Vector b, bool extend = true); + void DoLabel(Vector ref, Vector *labelPos, Vector gr, Vector gu); + void StippledLine(Vector a, Vector b); + void DoProjectedPoint(Vector *p); + void DoEqualLenTicks(Vector a, Vector b, Vector gn); + void DoEqualRadiusTicks(hEntity he); + + std::string DescriptionString(void); + + static hConstraint AddConstraint(Constraint *c, bool rememberForUndo); + static hConstraint AddConstraint(Constraint *c); + static void MenuConstrain(int id); + static void DeleteAllConstraintsFor(int type, hEntity entityA, hEntity ptA); + + static hConstraint ConstrainCoincident(hEntity ptA, hEntity ptB); + static hConstraint Constrain(int type, hEntity ptA, hEntity ptB, hEntity entityA); + static hConstraint Constrain(int type, hEntity ptA, hEntity ptB, + hEntity entityA, hEntity entityB, + bool other, bool other2); +}; + +class hEquation { +public: + uint32_t v; + + inline bool isFromConstraint(void); + inline hConstraint constraint(void); +}; + +class Equation { +public: + int tag; + hEquation h; + + Expr *e; + + void Clear(void) {} +}; + + +class Style { +public: + int tag; + hStyle h; + + enum { + STIPPLE_CONTINUOUS = 0, + STIPPLE_DASH = 1, + STIPPLE_LONG_DASH = 2, + STIPPLE_DASH_DOT = 3, + STIPPLE_DASH_DOT_DOT = 4, + STIPPLE_DOT = 5, + STIPPLE_FREEHAND = 6, + STIPPLE_ZIGZAG = 7, + + LAST_STIPPLE = STIPPLE_ZIGZAG + }; + + enum { + // If an entity has no style, then it will be colored according to + // whether the group that it's in is active or not, whether it's + // construction or not, and so on. + NO_STYLE = 0, + + ACTIVE_GRP = 1, + CONSTRUCTION = 2, + INACTIVE_GRP = 3, + DATUM = 4, + SOLID_EDGE = 5, + CONSTRAINT = 6, + SELECTED = 7, + HOVERED = 8, + CONTOUR_FILL = 9, + NORMALS = 10, + ANALYZE = 11, + DRAW_ERROR = 12, + DIM_SOLID = 13, + HIDDEN_EDGE = 14, + OUTLINE = 15, + + FIRST_CUSTOM = 0x100 + }; + + std::string name; + + enum { + UNITS_AS_PIXELS = 0, + UNITS_AS_MM = 1 + }; + double width; + int widthAs; + double textHeight; + int textHeightAs; + enum { + ORIGIN_LEFT = 0x01, + ORIGIN_RIGHT = 0x02, + ORIGIN_BOT = 0x04, + ORIGIN_TOP = 0x08 + }; + int textOrigin; + double textAngle; + RgbaColor color; + bool filled; + RgbaColor fillColor; + bool visible; + bool exportable; + int stippleType; + double stippleScale; + int zIndex; + + // The default styles, for entities that don't have a style assigned yet, + // and for datums and such. + typedef struct { + hStyle h; + const char *cnfPrefix; + RgbaColor color; + double width; + int zIndex; + } Default; + static const Default Defaults[]; + + static std::string CnfColor(const std::string &prefix); + static std::string CnfWidth(const std::string &prefix); + static std::string CnfTextHeight(const std::string &prefix); + static std::string CnfPrefixToName(const std::string &prefix); + + static void CreateAllDefaultStyles(void); + static void CreateDefaultStyle(hStyle h); + static void FillDefaultStyle(Style *s, const Default *d = NULL, bool factory = false); + static void FreezeDefaultStyles(void); + static void LoadFactoryDefaults(void); + + static void AssignSelectionToStyle(uint32_t v); + static uint32_t CreateCustomStyle(bool rememberForUndo = true); + + static RgbaColor RewriteColor(RgbaColor rgb); + + static Style *Get(hStyle hs); + static RgbaColor Color(hStyle hs, bool forExport=false); + static RgbaColor FillColor(hStyle hs, bool forExport=false); + static float Width(hStyle hs); + static RgbaColor Color(int hs, bool forExport=false); + static float Width(int hs); + static double WidthMm(int hs); + static double TextHeight(hStyle hs); + static double DefaultTextHeight(); + static bool Exportable(int hs); + static hStyle ForEntity(hEntity he); + static int PatternType(hStyle hs); + static double StippleScaleMm(hStyle hs); + + std::string DescriptionString(void); + + void Clear(void) {} +}; + + +inline hEntity hGroup::entity(int i) + { hEntity r; r.v = 0x80000000 | (v << 16) | (uint32_t)i; return r; } +inline hParam hGroup::param(int i) + { hParam r; r.v = 0x80000000 | (v << 16) | (uint32_t)i; return r; } +inline hEquation hGroup::equation(int i) + { hEquation r; r.v = (v << 16) | 0x80000000 | (uint32_t)i; return r; } + +inline bool hRequest::IsFromReferences(void) { + if(v == Request::HREQUEST_REFERENCE_XY.v) return true; + if(v == Request::HREQUEST_REFERENCE_YZ.v) return true; + if(v == Request::HREQUEST_REFERENCE_ZX.v) return true; + return false; +} +inline hEntity hRequest::entity(int i) + { hEntity r; r.v = (v << 16) | (uint32_t)i; return r; } +inline hParam hRequest::param(int i) + { hParam r; r.v = (v << 16) | (uint32_t)i; return r; } + +inline bool hEntity::isFromRequest(void) + { if(v & 0x80000000) return false; else return true; } +inline hRequest hEntity::request(void) + { hRequest r; r.v = (v >> 16); return r; } +inline hGroup hEntity::group(void) + { hGroup r; r.v = (v >> 16) & 0x3fff; return r; } +inline hEquation hEntity::equation(int i) + { if(i != 0) oops(); hEquation r; r.v = v | 0x40000000; return r; } + +inline hRequest hParam::request(void) + { hRequest r; r.v = (v >> 16); return r; } + + +inline hEquation hConstraint::equation(int i) + { hEquation r; r.v = (v << 16) | (uint32_t)i; return r; } + +inline bool hEquation::isFromConstraint(void) + { if(v & 0xc0000000) return false; else return true; } +inline hConstraint hEquation::constraint(void) + { hConstraint r; r.v = (v >> 16); return r; } + +// The format for entities stored on the clipboard. +class ClipboardRequest { +public: + int type; + int extraPoints; + hStyle style; + std::string str; + std::string font; + bool construction; + + Vector point[MAX_POINTS_IN_ENTITY]; + double distance; + + hEntity oldEnt; + hEntity oldPointEnt[MAX_POINTS_IN_ENTITY]; + hRequest newReq; +}; + +#endif diff --git a/src/solvespace.cpp b/src/solvespace.cpp new file mode 100644 index 0000000..c923b7b --- /dev/null +++ b/src/solvespace.cpp @@ -0,0 +1,888 @@ +//----------------------------------------------------------------------------- +// Entry point in to the program, our registry-stored settings and top-level +// housekeeping when we open, save, and create new files. +// +// Copyright 2008-2013 Jonathan Westhues. +//----------------------------------------------------------------------------- +#include "solvespace.h" +#include "config.h" + +SolveSpaceUI SolveSpace::SS = {}; +Sketch SolveSpace::SK = {}; + +std::string SolveSpace::RecentFile[MAX_RECENT] = {}; + +void SolveSpaceUI::Init() { + SS.tangentArcRadius = 10.0; + + // Then, load the registry settings. + int i; + // Default list of colors for the model material + modelColor[0] = CnfThawColor(RGBi(150, 150, 150), "ModelColor_0"); + modelColor[1] = CnfThawColor(RGBi(100, 100, 100), "ModelColor_1"); + modelColor[2] = CnfThawColor(RGBi( 30, 30, 30), "ModelColor_2"); + modelColor[3] = CnfThawColor(RGBi(150, 0, 0), "ModelColor_3"); + modelColor[4] = CnfThawColor(RGBi( 0, 100, 0), "ModelColor_4"); + modelColor[5] = CnfThawColor(RGBi( 0, 80, 80), "ModelColor_5"); + modelColor[6] = CnfThawColor(RGBi( 0, 0, 130), "ModelColor_6"); + modelColor[7] = CnfThawColor(RGBi( 80, 0, 80), "ModelColor_7"); + // Light intensities + lightIntensity[0] = CnfThawFloat(1.0f, "LightIntensity_0"); + lightIntensity[1] = CnfThawFloat(0.5f, "LightIntensity_1"); + ambientIntensity = 0.3; // no setting for that yet + // Light positions + lightDir[0].x = CnfThawFloat(-1.0f, "LightDir_0_Right" ); + lightDir[0].y = CnfThawFloat( 1.0f, "LightDir_0_Up" ); + lightDir[0].z = CnfThawFloat( 0.0f, "LightDir_0_Forward" ); + lightDir[1].x = CnfThawFloat( 1.0f, "LightDir_1_Right" ); + lightDir[1].y = CnfThawFloat( 0.0f, "LightDir_1_Up" ); + lightDir[1].z = CnfThawFloat( 0.0f, "LightDir_1_Forward" ); + + exportMode = false; + // Chord tolerance + chordTol = CnfThawFloat(0.5f, "ChordTolerancePct"); + // Max pwl segments to generate + maxSegments = CnfThawInt(10, "MaxSegments"); + // Chord tolerance + exportChordTol = CnfThawFloat(0.1f, "ExportChordTolerance"); + // Max pwl segments to generate + exportMaxSegments = CnfThawInt(64, "ExportMaxSegments"); + // View units + viewUnits = (Unit)CnfThawInt((uint32_t)UNIT_MM, "ViewUnits"); + // Number of digits after the decimal point + afterDecimalMm = CnfThawInt(2, "AfterDecimalMm"); + afterDecimalInch = CnfThawInt(3, "AfterDecimalInch"); + // Camera tangent (determines perspective) + cameraTangent = CnfThawFloat(0.3f/1e3f, "CameraTangent"); + // Grid spacing + gridSpacing = CnfThawFloat(5.0f, "GridSpacing"); + // Export scale factor + exportScale = CnfThawFloat(1.0f, "ExportScale"); + // Export offset (cutter radius comp) + exportOffset = CnfThawFloat(0.0f, "ExportOffset"); + // Rewrite exported colors close to white into black (assuming white bg) + fixExportColors = CnfThawBool(true, "FixExportColors"); + // Draw back faces of triangles (when mesh is leaky/self-intersecting) + drawBackFaces = CnfThawBool(true, "DrawBackFaces"); + // Check that contours are closed and not self-intersecting + checkClosedContour = CnfThawBool(true, "CheckClosedContour"); + // Export shaded triangles in a 2d view + exportShadedTriangles = CnfThawBool(true, "ExportShadedTriangles"); + // Export pwl curves (instead of exact) always + exportPwlCurves = CnfThawBool(false, "ExportPwlCurves"); + // Background color on-screen + backgroundColor = CnfThawColor(RGBi(0, 0, 0), "BackgroundColor"); + // Whether export canvas size is fixed or derived from bbox + exportCanvasSizeAuto = CnfThawBool(true, "ExportCanvasSizeAuto"); + // Margins for automatic canvas size + exportMargin.left = CnfThawFloat(5.0f, "ExportMargin_Left"); + exportMargin.right = CnfThawFloat(5.0f, "ExportMargin_Right"); + exportMargin.bottom = CnfThawFloat(5.0f, "ExportMargin_Bottom"); + exportMargin.top = CnfThawFloat(5.0f, "ExportMargin_Top"); + // Dimensions for fixed canvas size + exportCanvas.width = CnfThawFloat(100.0f, "ExportCanvas_Width"); + exportCanvas.height = CnfThawFloat(100.0f, "ExportCanvas_Height"); + exportCanvas.dx = CnfThawFloat( 5.0f, "ExportCanvas_Dx"); + exportCanvas.dy = CnfThawFloat( 5.0f, "ExportCanvas_Dy"); + // Extra parameters when exporting G code + gCode.depth = CnfThawFloat(10.0f, "GCode_Depth"); + gCode.passes = CnfThawInt(1, "GCode_Passes"); + gCode.feed = CnfThawFloat(10.0f, "GCode_Feed"); + gCode.plungeFeed = CnfThawFloat(10.0f, "GCode_PlungeFeed"); + // Show toolbar in the graphics window + showToolbar = CnfThawBool(true, "ShowToolbar"); + // Recent files menus + for(i = 0; i < MAX_RECENT; i++) { + RecentFile[i] = CnfThawString("", "RecentFile_" + std::to_string(i)); + } + RefreshRecentMenus(); + // Autosave timer + autosaveInterval = CnfThawInt(5, "AutosaveInterval"); + + // The default styles (colors, line widths, etc.) are also stored in the + // configuration file, but we will automatically load those as we need + // them. + + SetAutosaveTimerFor(autosaveInterval); + + NewFile(); + AfterNewFile(); +} + +bool SolveSpaceUI::LoadAutosaveFor(const std::string &filename) { + std::string autosaveFile = filename + AUTOSAVE_SUFFIX; + + FILE *f = ssfopen(autosaveFile, "rb"); + if(!f) + return false; + fclose(f); + + if(LoadAutosaveYesNo() == DIALOG_YES) { + unsaved = true; + return LoadFromFile(autosaveFile); + } + + return false; +} + +bool SolveSpaceUI::OpenFile(const std::string &filename) { + bool autosaveLoaded = LoadAutosaveFor(filename); + bool fileLoaded = autosaveLoaded || LoadFromFile(filename); + if(fileLoaded) + saveFile = filename; + bool success = fileLoaded && ReloadAllImported(/*canCancel=*/true); + if(success) { + AddToRecentList(filename); + } else { + saveFile = ""; + NewFile(); + } + AfterNewFile(); + unsaved = autosaveLoaded; + return success; +} + +void SolveSpaceUI::Exit(void) { + // Recent files + for(int i = 0; i < MAX_RECENT; i++) + CnfFreezeString(RecentFile[i], "RecentFile_" + std::to_string(i)); + // Model colors + for(int i = 0; i < MODEL_COLORS; i++) + CnfFreezeColor(modelColor[i], "ModelColor_" + std::to_string(i)); + // Light intensities + CnfFreezeFloat((float)lightIntensity[0], "LightIntensity_0"); + CnfFreezeFloat((float)lightIntensity[1], "LightIntensity_1"); + // Light directions + CnfFreezeFloat((float)lightDir[0].x, "LightDir_0_Right"); + CnfFreezeFloat((float)lightDir[0].y, "LightDir_0_Up"); + CnfFreezeFloat((float)lightDir[0].z, "LightDir_0_Forward"); + CnfFreezeFloat((float)lightDir[1].x, "LightDir_1_Right"); + CnfFreezeFloat((float)lightDir[1].y, "LightDir_1_Up"); + CnfFreezeFloat((float)lightDir[1].z, "LightDir_1_Forward"); + // Chord tolerance + CnfFreezeFloat((float)chordTol, "ChordTolerancePct"); + // Max pwl segments to generate + CnfFreezeInt((uint32_t)maxSegments, "MaxSegments"); + // Export Chord tolerance + CnfFreezeFloat((float)exportChordTol, "ExportChordTolerance"); + // Export Max pwl segments to generate + CnfFreezeInt((uint32_t)exportMaxSegments, "ExportMaxSegments"); + // View units + CnfFreezeInt((uint32_t)viewUnits, "ViewUnits"); + // Number of digits after the decimal point + CnfFreezeInt((uint32_t)afterDecimalMm, "AfterDecimalMm"); + CnfFreezeInt((uint32_t)afterDecimalInch, "AfterDecimalInch"); + // Camera tangent (determines perspective) + CnfFreezeFloat((float)cameraTangent, "CameraTangent"); + // Grid spacing + CnfFreezeFloat(gridSpacing, "GridSpacing"); + // Export scale + CnfFreezeFloat(exportScale, "ExportScale"); + // Export offset (cutter radius comp) + CnfFreezeFloat(exportOffset, "ExportOffset"); + // Rewrite exported colors close to white into black (assuming white bg) + CnfFreezeBool(fixExportColors, "FixExportColors"); + // Draw back faces of triangles (when mesh is leaky/self-intersecting) + CnfFreezeBool(drawBackFaces, "DrawBackFaces"); + // Check that contours are closed and not self-intersecting + CnfFreezeBool(checkClosedContour, "CheckClosedContour"); + // Export shaded triangles in a 2d view + CnfFreezeBool(exportShadedTriangles, "ExportShadedTriangles"); + // Export pwl curves (instead of exact) always + CnfFreezeBool(exportPwlCurves, "ExportPwlCurves"); + // Background color on-screen + CnfFreezeColor(backgroundColor, "BackgroundColor"); + // Whether export canvas size is fixed or derived from bbox + CnfFreezeBool(exportCanvasSizeAuto, "ExportCanvasSizeAuto"); + // Margins for automatic canvas size + CnfFreezeFloat(exportMargin.left, "ExportMargin_Left"); + CnfFreezeFloat(exportMargin.right, "ExportMargin_Right"); + CnfFreezeFloat(exportMargin.bottom, "ExportMargin_Bottom"); + CnfFreezeFloat(exportMargin.top, "ExportMargin_Top"); + // Dimensions for fixed canvas size + CnfFreezeFloat(exportCanvas.width, "ExportCanvas_Width"); + CnfFreezeFloat(exportCanvas.height, "ExportCanvas_Height"); + CnfFreezeFloat(exportCanvas.dx, "ExportCanvas_Dx"); + CnfFreezeFloat(exportCanvas.dy, "ExportCanvas_Dy"); + // Extra parameters when exporting G code + CnfFreezeFloat(gCode.depth, "GCode_Depth"); + CnfFreezeInt(gCode.passes, "GCode_Passes"); + CnfFreezeFloat(gCode.feed, "GCode_Feed"); + CnfFreezeFloat(gCode.plungeFeed, "GCode_PlungeFeed"); + // Show toolbar in the graphics window + CnfFreezeBool(showToolbar, "ShowToolbar"); + // Autosave timer + CnfFreezeInt(autosaveInterval, "AutosaveInterval"); + + // And the default styles, colors and line widths and such. + Style::FreezeDefaultStyles(); + + ExitNow(); +} + +void SolveSpaceUI::ScheduleGenerateAll() { + if(!later.scheduled) ScheduleLater(); + later.scheduled = true; + later.generateAll = true; +} + +void SolveSpaceUI::ScheduleShowTW() { + if(!later.scheduled) ScheduleLater(); + later.scheduled = true; + later.showTW = true; +} + +void SolveSpaceUI::DoLater(void) { + if(later.generateAll) GenerateAll(); + if(later.showTW) TW.Show(); + later = {}; +} + +double SolveSpaceUI::MmPerUnit(void) { + if(viewUnits == UNIT_INCHES) { + return 25.4; + } else { + return 1.0; + } +} +const char *SolveSpaceUI::UnitName(void) { + if(viewUnits == UNIT_INCHES) { + return "inch"; + } else { + return "mm"; + } +} +std::string SolveSpaceUI::MmToString(double v) { + if(viewUnits == UNIT_INCHES) { + return ssprintf("%.*f", afterDecimalInch, v/25.4); + } else { + return ssprintf("%.*f", afterDecimalMm, v); + } +} +double SolveSpaceUI::ExprToMm(Expr *e) { + return (e->Eval()) * MmPerUnit(); +} +double SolveSpaceUI::StringToMm(const std::string &str) { + return std::stod(str) * MmPerUnit(); +} +double SolveSpaceUI::ChordTolMm(void) { + if(exportMode) return ExportChordTolMm(); + return chordTolCalculated; +} +double SolveSpaceUI::ExportChordTolMm(void) { + return exportChordTol / exportScale; +} +int SolveSpaceUI::GetMaxSegments(void) { + if(exportMode) return exportMaxSegments; + return maxSegments; +} +int SolveSpaceUI::UnitDigitsAfterDecimal(void) { + return (viewUnits == UNIT_INCHES) ? afterDecimalInch : afterDecimalMm; +} +void SolveSpaceUI::SetUnitDigitsAfterDecimal(int v) { + if(viewUnits == UNIT_INCHES) { + afterDecimalInch = v; + } else { + afterDecimalMm = v; + } +} + +double SolveSpaceUI::CameraTangent(void) { + if(!usePerspectiveProj) { + return 0; + } else { + return cameraTangent; + } +} + +void SolveSpaceUI::AfterNewFile(void) { + // Clear out the traced point, which is no longer valid + traced.point = Entity::NO_ENTITY; + traced.path.l.Clear(); + // and the naked edges + nakedEdges.Clear(); + + // Quit export mode + justExportedInfo.draw = false; + exportMode = false; + + // GenerateAll() expects the view to be valid, because it uses that to + // fill in default values for extrusion depths etc. (which won't matter + // here, but just don't let it work on garbage) + SS.GW.offset = Vector::From(0, 0, 0); + SS.GW.projRight = Vector::From(1, 0, 0); + SS.GW.projUp = Vector::From(0, 1, 0); + + GenerateAll(GENERATE_REGEN); + + TW.Init(); + GW.Init(); + + unsaved = false; + + int w, h; + GetGraphicsWindowSize(&w, &h); + GW.width = w; + GW.height = h; + + // The triangles haven't been generated yet, but zoom to fit the entities + // roughly in the window, since that sets the mesh tolerance. Consider + // invisible entities, so we still get something reasonable if the only + // thing visible is the not-yet-generated surfaces. + GW.ZoomToFit(true); + + GenerateAll(GENERATE_ALL); + SS.ScheduleShowTW(); + // Then zoom to fit again, to fit the triangles + GW.ZoomToFit(false); + + // Create all the default styles; they'll get created on the fly anyways, + // but can't hurt to do it now. + Style::CreateAllDefaultStyles(); + + UpdateWindowTitle(); +} + +void SolveSpaceUI::RemoveFromRecentList(const std::string &filename) { + int src, dest; + dest = 0; + for(src = 0; src < MAX_RECENT; src++) { + if(filename != RecentFile[src]) { + if(src != dest) RecentFile[dest] = RecentFile[src]; + dest++; + } + } + while(dest < MAX_RECENT) RecentFile[dest++].clear(); + RefreshRecentMenus(); +} +void SolveSpaceUI::AddToRecentList(const std::string &filename) { + RemoveFromRecentList(filename); + + int src; + for(src = MAX_RECENT - 2; src >= 0; src--) { + RecentFile[src+1] = RecentFile[src]; + } + RecentFile[0] = filename; + RefreshRecentMenus(); +} + +bool SolveSpaceUI::GetFilenameAndSave(bool saveAs) { + std::string prevSaveFile = saveFile; + + if(saveAs || saveFile.empty()) { + if(!GetSaveFile(&saveFile, "", SlvsFileFilter)) return false; + // need to get new filename directly into saveFile, since that + // determines linkFileRel path + } + + if(SaveToFile(saveFile)) { + AddToRecentList(saveFile); + RemoveAutosave(); + unsaved = false; + return true; + } else { + // don't store an invalid save filename + saveFile = prevSaveFile; + return false; + } +} + +bool SolveSpaceUI::Autosave() +{ + SetAutosaveTimerFor(autosaveInterval); + + if(!saveFile.empty() && unsaved) + return SaveToFile(saveFile + AUTOSAVE_SUFFIX); + + return false; +} + +void SolveSpaceUI::RemoveAutosave() +{ + std::string autosaveFile = saveFile + AUTOSAVE_SUFFIX; + ssremove(autosaveFile); +} + +bool SolveSpaceUI::OkayToStartNewFile(void) { + if(!unsaved) return true; + + switch(SaveFileYesNoCancel()) { + case DIALOG_YES: + return GetFilenameAndSave(false); + + case DIALOG_NO: + RemoveAutosave(); + return true; + + case DIALOG_CANCEL: + return false; + + default: oops(); break; + } +} + +void SolveSpaceUI::UpdateWindowTitle(void) { + SetCurrentFilename(saveFile); +} + +static std::string Extension(const std::string &filename) { + int dot = filename.rfind('.'); + if(dot >= 0) { + std::string ext = filename.substr(dot + 1, filename.length()); + std::transform(ext.begin(), ext.end(), ext.begin(), ::tolower); + return ext; + } + return ""; +} + +void SolveSpaceUI::MenuFile(int id) { + if(id >= RECENT_OPEN && id < (RECENT_OPEN+MAX_RECENT)) { + if(!SS.OkayToStartNewFile()) return; + + std::string newFile = RecentFile[id - RECENT_OPEN]; + SS.OpenFile(newFile); + return; + } + + switch(id) { + case GraphicsWindow::MNU_NEW: + if(!SS.OkayToStartNewFile()) break; + + SS.saveFile = ""; + SS.NewFile(); + SS.AfterNewFile(); + break; + + case GraphicsWindow::MNU_OPEN: { + if(!SS.OkayToStartNewFile()) break; + + std::string newFile; + if(GetOpenFile(&newFile, "", SlvsFileFilter)) { + SS.OpenFile(newFile); + } + break; + } + + case GraphicsWindow::MNU_SAVE: + SS.GetFilenameAndSave(false); + break; + + case GraphicsWindow::MNU_SAVE_AS: + SS.GetFilenameAndSave(true); + break; + + case GraphicsWindow::MNU_EXPORT_PNG: { + std::string exportFile; + if(!GetSaveFile(&exportFile, "", PngFileFilter)) break; + SS.ExportAsPngTo(exportFile); + break; + } + + case GraphicsWindow::MNU_EXPORT_VIEW: { + std::string exportFile; + if(!GetSaveFile(&exportFile, CnfThawString("", "ViewExportFormat"), + VectorFileFilter)) break; + CnfFreezeString(Extension(exportFile), "ViewExportFormat"); + + // If the user is exporting something where it would be + // inappropriate to include the constraints, then warn. + if(SS.GW.showConstraints && + (FilenameHasExtension(exportFile, ".txt") || + fabs(SS.exportOffset) > LENGTH_EPS)) + { + Message("Constraints are currently shown, and will be exported " + "in the toolpath. This is probably not what you want; " + "hide them by clicking the link at the top of the " + "text window."); + } + + SS.ExportViewOrWireframeTo(exportFile, false); + break; + } + + case GraphicsWindow::MNU_EXPORT_WIREFRAME: { + std::string exportFile; + if(!GetSaveFile(&exportFile, CnfThawString("", "WireframeExportFormat"), + Vector3dFileFilter)) break; + CnfFreezeString(Extension(exportFile), "WireframeExportFormat"); + + SS.ExportViewOrWireframeTo(exportFile, true); + break; + } + + case GraphicsWindow::MNU_EXPORT_SECTION: { + std::string exportFile; + if(!GetSaveFile(&exportFile, CnfThawString("", "SectionExportFormat"), + VectorFileFilter)) break; + CnfFreezeString(Extension(exportFile), "SectionExportFormat"); + + SS.ExportSectionTo(exportFile); + break; + } + + case GraphicsWindow::MNU_EXPORT_MESH: { + std::string exportFile; + if(!GetSaveFile(&exportFile, CnfThawString("", "MeshExportFormat"), + MeshFileFilter)) break; + CnfFreezeString(Extension(exportFile), "MeshExportFormat"); + + SS.ExportMeshTo(exportFile); + break; + } + + case GraphicsWindow::MNU_EXPORT_SURFACES: { + std::string exportFile; + if(!GetSaveFile(&exportFile, CnfThawString("", "SurfacesExportFormat"), + SurfaceFileFilter)) break; + CnfFreezeString(Extension(exportFile), "SurfacesExportFormat"); + + StepFileWriter sfw = {}; + sfw.ExportSurfacesTo(exportFile); + break; + } + + case GraphicsWindow::MNU_IMPORT: { + std::string importFile; + if(!GetOpenFile(&importFile, CnfThawString("", "ImportFormat"), + ImportableFileFilter)) break; + CnfFreezeString(Extension(importFile), "ImportFormat"); + + if(Extension(importFile) == "dxf") { + ImportDxf(importFile); + } else if(Extension(importFile) == "dwg") { + ImportDwg(importFile); + } else { + Error("Can't identify file type from file extension of " + "filename '%s'; try .dxf or .dwg.", importFile.c_str()); + } + + SS.GenerateAll(SolveSpaceUI::GENERATE_UNTIL_ACTIVE); + SS.ScheduleShowTW(); + break; + } + + case GraphicsWindow::MNU_EXIT: + if(!SS.OkayToStartNewFile()) break; + SS.Exit(); + break; + + default: oops(); + } + + SS.UpdateWindowTitle(); +} + +void SolveSpaceUI::MenuAnalyze(int id) { + SS.GW.GroupSelection(); +#define gs (SS.GW.gs) + + switch(id) { + case GraphicsWindow::MNU_STEP_DIM: + if(gs.constraints == 1 && gs.n == 0) { + Constraint *c = SK.GetConstraint(gs.constraint[0]); + if(c->HasLabel() && !c->reference) { + SS.TW.shown.dimFinish = c->valA; + SS.TW.shown.dimSteps = 10; + SS.TW.shown.dimIsDistance = + (c->type != Constraint::ANGLE) && + (c->type != Constraint::LENGTH_RATIO) && + (c->type != Constraint::LENGTH_DIFFERENCE); + SS.TW.shown.constraint = c->h; + SS.TW.shown.screen = TextWindow::SCREEN_STEP_DIMENSION; + + // The step params are specified in the text window, + // so force that to be shown. + SS.GW.ForceTextWindowShown(); + + SS.ScheduleShowTW(); + SS.GW.ClearSelection(); + } else { + Error("Constraint must have a label, and must not be " + "a reference dimension."); + } + } else { + Error("Bad selection for step dimension; select a constraint."); + } + break; + + case GraphicsWindow::MNU_NAKED_EDGES: { + SS.nakedEdges.Clear(); + + Group *g = SK.GetGroup(SS.GW.activeGroup); + SMesh *m = &(g->displayMesh); + SKdNode *root = SKdNode::From(m); + bool inters, leaks; + root->MakeCertainEdgesInto(&(SS.nakedEdges), + SKdNode::NAKED_OR_SELF_INTER_EDGES, true, &inters, &leaks); + + InvalidateGraphics(); + + const char *intersMsg = inters ? + "The mesh is self-intersecting (NOT okay, invalid)." : + "The mesh is not self-intersecting (okay, valid)."; + const char *leaksMsg = leaks ? + "The mesh has naked edges (NOT okay, invalid)." : + "The mesh is watertight (okay, valid)."; + + std::string cntMsg = ssprintf("\n\nThe model contains %d triangles, from " + "%d surfaces.", g->displayMesh.l.n, g->runningShell.surface.n); + + if(SS.nakedEdges.l.n == 0) { + Message("%s\n\n%s\n\nZero problematic edges, good.%s", + intersMsg, leaksMsg, cntMsg.c_str()); + } else { + Error("%s\n\n%s\n\n%d problematic edges, bad.%s", + intersMsg, leaksMsg, SS.nakedEdges.l.n, cntMsg.c_str()); + } + break; + } + + case GraphicsWindow::MNU_INTERFERENCE: { + SS.nakedEdges.Clear(); + + SMesh *m = &(SK.GetGroup(SS.GW.activeGroup)->displayMesh); + SKdNode *root = SKdNode::From(m); + bool inters, leaks; + root->MakeCertainEdgesInto(&(SS.nakedEdges), + SKdNode::SELF_INTER_EDGES, false, &inters, &leaks); + + InvalidateGraphics(); + + if(inters) { + Error("%d edges interfere with other triangles, bad.", + SS.nakedEdges.l.n); + } else { + Message("The assembly does not interfere, good."); + } + break; + } + + case GraphicsWindow::MNU_VOLUME: { + SMesh *m = &(SK.GetGroup(SS.GW.activeGroup)->displayMesh); + + double vol = 0; + int i; + for(i = 0; i < m->l.n; i++) { + STriangle tr = m->l.elem[i]; + + // Translate to place vertex A at (x, y, 0) + Vector trans = Vector::From(tr.a.x, tr.a.y, 0); + tr.a = (tr.a).Minus(trans); + tr.b = (tr.b).Minus(trans); + tr.c = (tr.c).Minus(trans); + + // Rotate to place vertex B on the y-axis. Depending on + // whether the triangle is CW or CCW, C is either to the + // right or to the left of the y-axis. This handles the + // sign of our normal. + Vector u = Vector::From(-tr.b.y, tr.b.x, 0); + u = u.WithMagnitude(1); + Vector v = Vector::From(tr.b.x, tr.b.y, 0); + v = v.WithMagnitude(1); + Vector n = Vector::From(0, 0, 1); + + tr.a = (tr.a).DotInToCsys(u, v, n); + tr.b = (tr.b).DotInToCsys(u, v, n); + tr.c = (tr.c).DotInToCsys(u, v, n); + + n = tr.Normal().WithMagnitude(1); + + // Triangles on edge don't contribute + if(fabs(n.z) < LENGTH_EPS) continue; + + // The plane has equation p dot n = a dot n + double d = (tr.a).Dot(n); + // nx*x + ny*y + nz*z = d + // nz*z = d - nx*x - ny*y + double A = -n.x/n.z, B = -n.y/n.z, C = d/n.z; + + double mac = tr.c.y/tr.c.x, mbc = (tr.c.y - tr.b.y)/tr.c.x; + double xc = tr.c.x, yb = tr.b.y; + + // I asked Maple for + // int(int(A*x + B*y +C, y=mac*x..(mbc*x + yb)), x=0..xc); + double integral = + (1.0/3)*( + A*(mbc-mac)+ + (1.0/2)*B*(mbc*mbc-mac*mac) + )*(xc*xc*xc)+ + (1.0/2)*(A*yb+B*yb*mbc+C*(mbc-mac))*xc*xc+ + C*yb*xc+ + (1.0/2)*B*yb*yb*xc; + + vol += integral; + } + + std::string msg = ssprintf("The volume of the solid model is:\n\n"" %.3f %s^3", + vol / pow(SS.MmPerUnit(), 3), + SS.UnitName()); + + if(SS.viewUnits == SolveSpaceUI::UNIT_MM) { + msg += ssprintf("\n %.2f mL", vol/(10*10*10)); + } + msg += "\n\nCurved surfaces have been approximated as triangles.\n" + "This introduces error, typically of around 1%."; + Message("%s", msg.c_str()); + break; + } + + case GraphicsWindow::MNU_AREA: { + Group *g = SK.GetGroup(SS.GW.activeGroup); + if(g->polyError.how != Group::POLY_GOOD) { + Error("This group does not contain a correctly-formed " + "2d closed area. It is open, not coplanar, or self-" + "intersecting."); + break; + } + SEdgeList sel = {}; + g->polyLoops.MakeEdgesInto(&sel); + SPolygon sp = {}; + sel.AssemblePolygon(&sp, NULL, true); + sp.normal = sp.ComputeNormal(); + sp.FixContourDirections(); + double area = sp.SignedArea(); + double scale = SS.MmPerUnit(); + Message("The area of the region sketched in this group is:\n\n" + " %.3f %s^2\n\n" + "Curves have been approximated as piecewise linear.\n" + "This introduces error, typically of around 1%%.", + area / (scale*scale), + SS.UnitName()); + sel.Clear(); + sp.Clear(); + break; + } + + case GraphicsWindow::MNU_SHOW_DOF: + // This works like a normal solve, except that it calculates + // which variables are free/bound at the same time. + SS.GenerateAll(SolveSpaceUI::GENERATE_ALL, true); + break; + + case GraphicsWindow::MNU_TRACE_PT: + if(gs.points == 1 && gs.n == 1) { + SS.traced.point = gs.point[0]; + SS.GW.ClearSelection(); + } else { + Error("Bad selection for trace; select a single point."); + } + break; + + case GraphicsWindow::MNU_STOP_TRACING: { + std::string exportFile; + if(GetSaveFile(&exportFile, "", CsvFileFilter)) { + FILE *f = ssfopen(exportFile, "wb"); + if(f) { + int i; + SContour *sc = &(SS.traced.path); + for(i = 0; i < sc->l.n; i++) { + Vector p = sc->l.elem[i].p; + double s = SS.exportScale; + fprintf(f, "%.10f, %.10f, %.10f\r\n", + p.x/s, p.y/s, p.z/s); + } + fclose(f); + } else { + Error("Couldn't write to '%s'", exportFile.c_str()); + } + } + // Clear the trace, and stop tracing + SS.traced.point = Entity::NO_ENTITY; + SS.traced.path.l.Clear(); + InvalidateGraphics(); + break; + } + + default: oops(); + } +} + +void SolveSpaceUI::MenuHelp(int id) { + switch(id) { + case GraphicsWindow::MNU_WEBSITE: + OpenWebsite("http://solvespace.com/helpmenu"); + break; + + case GraphicsWindow::MNU_ABOUT: + Message( +"This is SolveSpace version " PACKAGE_VERSION ".\n" +"\n" +"For more information, see http://solvespace.com/\n" +"\n" +"SolveSpace is free software: you are free to modify\n" +"and/or redistribute it under the terms of the GNU\n" +"General Public License (GPL) version 3 or later.\n" +"\n" +"There is NO WARRANTY, to the extent permitted by\n" +"law. For details, visit http://gnu.org/licenses/\n" +"\n" +"© 2008-2016 Jonathan Westhues and other authors.\n" +); + break; + + default: oops(); + } +} + +void SolveSpaceUI::Clear(void) { + sys.Clear(); + for(int i = 0; i < MAX_UNDO; i++) { + if(i < undo.cnt) undo.d[i].Clear(); + if(i < redo.cnt) redo.d[i].Clear(); + } +} + +void Sketch::Clear(void) { + group.Clear(); + groupOrder.Clear(); + constraint.Clear(); + request.Clear(); + style.Clear(); + entity.Clear(); + param.Clear(); +} + +BBox Sketch::CalculateEntityBBox(bool includingInvisible) { + BBox box = {}; + bool first = true; + for(int i = 0; i < entity.n; i++) { + Entity *e = (Entity *)&entity.elem[i]; + if(!(e->IsVisible() || includingInvisible)) continue; + + Vector point; + double r = 0.0; + if(e->IsPoint()) { + point = e->PointGetNum(); + } else { + switch(e->type) { + case Entity::ARC_OF_CIRCLE: + case Entity::CIRCLE: + r = e->CircleGetRadiusNum(); + point = GetEntity(e->point[0])->PointGetNum(); + break; + default: continue; + } + } + + if(first) { + box.minp = point; + box.maxp = point; + box.Include(point, r); + first = false; + } else { + box.Include(point, r); + } + } + return box; +} + +Group *Sketch::GetRunningMeshGroupFor(hGroup h) { + Group *g = GetGroup(h); + while(g != NULL) { + if(g->IsMeshGroup()) { + return g; + } + g = g->PreviousGroup(); + } + return NULL; +} diff --git a/src/solvespace.h b/src/solvespace.h new file mode 100644 index 0000000..6cb59c7 --- /dev/null +++ b/src/solvespace.h @@ -0,0 +1,971 @@ +//----------------------------------------------------------------------------- +// All declarations not grouped specially elsewhere. +// +// Copyright 2008-2013 Jonathan Westhues. +//----------------------------------------------------------------------------- + +#ifndef __SOLVESPACE_H +#define __SOLVESPACE_H + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#ifdef WIN32 +# include // required by GL headers +#endif +#ifdef __APPLE__ +# include // for strcasecmp in file.cpp +# include +# include +#else +# include +# include +#endif + +// We declare these in advance instead of simply using FT_Library +// (defined as typedef FT_LibraryRec_* FT_Library) because including +// freetype.h invokes indescribable horrors and we would like to avoid +// doing that every time we include solvespace.h. +struct FT_LibraryRec_; +struct FT_FaceRec_; + +// The few floating-point equality comparisons in SolveSpace have been +// carefully considered, so we disable the -Wfloat-equal warning for them +#ifdef __clang__ +# define EXACT(expr) \ + (_Pragma("clang diagnostic push") \ + _Pragma("clang diagnostic ignored \"-Wfloat-equal\"") \ + (expr) \ + _Pragma("clang diagnostic pop")) +#else +# define EXACT(expr) (expr) +#endif + +// Debugging functions +#ifdef NDEBUG +#define oops() do { dbp("oops at line %d, file %s\n", __LINE__, __FILE__); \ + exit(-1); } while(0) +#else +#define oops() do { dbp("oops at line %d, file %s\n", __LINE__, __FILE__); \ + abort(); } while(0) +#endif + +#ifndef isnan +# define isnan(x) (((x) != (x)) || (x > 1e11) || (x < -1e11)) +#endif + +namespace SolveSpace { + +using std::min; +using std::max; +using std::swap; + +#if defined(__GNUC__) +__attribute__((__format__ (__printf__, 1, 2))) +#endif +std::string ssprintf(const char *fmt, ...); + +inline int WRAP(int v, int n) { + // Clamp it to the range [0, n) + while(v >= n) v -= n; + while(v < 0) v += n; + return v; +} +inline double WRAP_NOT_0(double v, double n) { + // Clamp it to the range (0, n] + while(v > n) v -= n; + while(v <= 0) v += n; + return v; +} +inline double WRAP_SYMMETRIC(double v, double n) { + // Clamp it to the range (-n/2, n/2] + while(v > n/2) v -= n; + while(v <= -n/2) v += n; + return v; +} + +// Why is this faster than the library function? +inline double ffabs(double v) { return (v > 0) ? v : (-v); } + +#define CO(v) (v).x, (v).y, (v).z + +#define ANGLE_COS_EPS (1e-6) +#define LENGTH_EPS (1e-6) +#define VERY_POSITIVE (1e10) +#define VERY_NEGATIVE (-1e10) + +#define isforname(c) (isalnum(c) || (c) == '_' || (c) == '-' || (c) == '#') + +#if defined(WIN32) +std::string Narrow(const wchar_t *s); +std::wstring Widen(const char *s); +std::string Narrow(const std::wstring &s); +std::wstring Widen(const std::string &s); +#endif + +inline double Random(double vmax) { + return (vmax*rand()) / RAND_MAX; +} + +class Expr; +class ExprVector; +class ExprQuaternion; +class RgbaColor; + +//================ +// From the platform-specific code. +#if defined(WIN32) +#define PATH_SEP "\\" +#else +#define PATH_SEP "/" +#endif + +FILE *ssfopen(const std::string &filename, const char *mode); +std::fstream ssfstream(const std::string &filename, std::ios_base::openmode mode); +void ssremove(const std::string &filename); + +#define MAX_RECENT 8 +#define RECENT_OPEN (0xf000) +#define RECENT_LINK (0xf100) +extern std::string RecentFile[MAX_RECENT]; +void RefreshRecentMenus(void); + +enum DialogChoice { DIALOG_YES = 1, DIALOG_NO = -1, DIALOG_CANCEL = 0 }; +DialogChoice SaveFileYesNoCancel(void); +DialogChoice LoadAutosaveYesNo(void); +DialogChoice LocateImportedFileYesNoCancel(const std::string &filename, + bool canCancel); + +#define AUTOSAVE_SUFFIX "~" + +struct FileFilter { + const char *name; + const char *patterns[3]; +}; + +// SolveSpace native file format +const FileFilter SlvsFileFilter[] = { + { "SolveSpace models", { "slvs" } }, + { NULL, {} } +}; +// PNG format bitmap +const FileFilter PngFileFilter[] = { + { "PNG", { "png" } }, + { NULL, {} } +}; +// Triangle mesh +const FileFilter MeshFileFilter[] = { + { "STL mesh", { "stl" } }, + { "Wavefront OBJ mesh", { "obj" } }, + { "Three.js-compatible mesh, with viewer", { "html" } }, + { "Three.js-compatible mesh, mesh only", { "js" } }, + { NULL, {} } +}; +// NURBS surfaces +const FileFilter SurfaceFileFilter[] = { + { "STEP file", { "step", "stp" } }, + { NULL, {} } +}; +// 2d vector (lines and curves) format +const FileFilter VectorFileFilter[] = { + { "PDF file", { "pdf" } }, + { "Encapsulated PostScript", { "eps", "ps" } }, + { "Scalable Vector Graphics", { "svg" } }, + { "STEP file", { "step", "stp" } }, + { "DXF file (AutoCAD 2007)", { "dxf" } }, + { "HPGL file", { "plt", "hpgl" } }, + { "G Code", { "ngc", "txt" } }, + { NULL, {} } +}; +// 3d vector (wireframe lines and curves) format +const FileFilter Vector3dFileFilter[] = { + { "STEP file", { "step", "stp" } }, + { "DXF file (AutoCAD 2007)", { "dxf" } }, + { NULL, {} } +}; +// All Importable formats +const FileFilter ImportableFileFilter[] = { + { "AutoCAD DXF and DWG files", { "dxf", "dwg" } }, + { NULL, {} } +}; +// Comma-separated value, like a spreadsheet would use +const FileFilter CsvFileFilter[] = { + { "CSV", { "csv" } }, + { NULL, {} } +}; + +bool GetSaveFile(std::string *filename, const std::string &defExtension, + const FileFilter filters[]); +bool GetOpenFile(std::string *filename, const std::string &defExtension, + const FileFilter filters[]); +std::vector GetFontFiles(); + +void OpenWebsite(const char *url); + +void CheckMenuById(int id, bool checked); +void RadioMenuById(int id, bool selected); +void EnableMenuById(int id, bool enabled); + +void ShowGraphicsEditControl(int x, int y, int fontHeight, int minWidthChars, + const std::string &str); +void HideGraphicsEditControl(void); +bool GraphicsEditControlIsVisible(void); +void ShowTextEditControl(int x, int y, const std::string &str); +void HideTextEditControl(void); +bool TextEditControlIsVisible(void); +void MoveTextScrollbarTo(int pos, int maxPos, int page); + +#define CONTEXT_SUBMENU (-1) +#define CONTEXT_SEPARATOR (-2) +void AddContextMenuItem(const char *legend, int id); +void CreateContextSubmenu(void); +int ShowContextMenu(void); + +void ToggleMenuBar(void); +bool MenuBarIsVisible(void); +void ShowTextWindow(bool visible); +void InvalidateText(void); +void InvalidateGraphics(void); +void PaintGraphics(void); +void ToggleFullScreen(void); +bool FullScreenIsActive(void); +void GetGraphicsWindowSize(int *w, int *h); +void GetTextWindowSize(int *w, int *h); +int64_t GetMilliseconds(void); +int64_t GetUnixTime(void); + +void dbp(const char *str, ...); +#define DBPTRI(tri) \ + dbp("tri: (%.3f %.3f %.3f) (%.3f %.3f %.3f) (%.3f %.3f %.3f)", \ + CO((tri).a), CO((tri).b), CO((tri).c)) + +void SetCurrentFilename(const std::string &filename); +void SetMousePointerToHand(bool yes); +void DoMessageBox(const char *str, int rows, int cols, bool error); +void SetTimerFor(int milliseconds); +void SetAutosaveTimerFor(int minutes); +void ScheduleLater(); +void ExitNow(void); + +void CnfFreezeInt(uint32_t val, const std::string &name); +void CnfFreezeFloat(float val, const std::string &name); +void CnfFreezeString(const std::string &val, const std::string &name); +std::string CnfThawString(const std::string &val, const std::string &name); +uint32_t CnfThawInt(uint32_t val, const std::string &name); +float CnfThawFloat(float val, const std::string &name); + +void *AllocTemporary(size_t n); +void FreeTemporary(void *p); +void FreeAllTemporary(void); +void *MemAlloc(size_t n); +void MemFree(void *p); +void InitHeaps(void); +void vl(void); // debug function to validate heaps + +// End of platform-specific functions +//================ + +class Group; +class SSurface; +#include "dsc.h" +#include "polygon.h" +#include "srf/surface.h" + +class Entity; +class hEntity; +class Param; +class hParam; +typedef IdList EntityList; +typedef IdList ParamList; + +#include "sketch.h" +#include "ui.h" +#include "expr.h" + + +// Utility functions that are provided in the platform-independent code. +class utf8_iterator : std::iterator { + const char *p, *n; +public: + utf8_iterator(const char *p) : p(p), n(NULL) {} + bool operator==(const utf8_iterator &i) const { return p==i.p; } + bool operator!=(const utf8_iterator &i) const { return p!=i.p; } + ptrdiff_t operator- (const utf8_iterator &i) const { return p -i.p; } + utf8_iterator& operator++() { **this; p=n; n=NULL; return *this; } + utf8_iterator operator++(int) { utf8_iterator t(*this); operator++(); return t; } + char32_t operator*(); +}; +class ReadUTF8 { + const std::string &str; +public: + ReadUTF8(const std::string &str) : str(str) {} + utf8_iterator begin() const { return utf8_iterator(&str[0]); } + utf8_iterator end() const { return utf8_iterator(&str[str.length()]); } +}; + +void ssglLineWidth(GLfloat width); +void ssglVertex3v(Vector u); +void ssglAxisAlignedQuad(double l, double r, double t, double b, bool lone = true); +void ssglAxisAlignedLineLoop(double l, double r, double t, double b); +#ifdef WIN32 +# define SSGL_CALLBACK __stdcall +#else +# define SSGL_CALLBACK +#endif +extern "C" { typedef void SSGL_CALLBACK ssglCallbackFptr(void); } +void ssglTesselatePolygon(GLUtesselator *gt, SPolygon *p); +void ssglFillPolygon(SPolygon *p); +void ssglFillMesh(bool useSpecColor, RgbaColor color, + SMesh *m, uint32_t h, uint32_t s1, uint32_t s2); +void ssglDebugPolygon(SPolygon *p); +void ssglDrawEdges(SEdgeList *l, bool endpointsToo, hStyle hs); +void ssglDrawOutlines(SOutlineList *l, Vector projDir, hStyle hs); +void ssglDebugMesh(SMesh *m); +void ssglMarkPolygonNormal(SPolygon *p); +typedef void ssglLineFn(void *data, Vector a, Vector b); +void ssglWriteText(const std::string &str, double h, Vector t, Vector u, Vector v, + ssglLineFn *fn, void *fndata); +void ssglWriteTextRefCenter(const std::string &str, double h, Vector t, Vector u, Vector v, + ssglLineFn *fn, void *fndata); +double ssglStrCapHeight(double h); +double ssglStrFontSize(double h); +double ssglStrWidth(const std::string &str, double h); +void ssglLockColorTo(RgbaColor rgb); +void ssglStippledLine(Vector a, Vector b, double width, + int stippleType, double stippleScale, bool maybeFat); +void ssglStippledLine(Vector a, Vector b, double width, + const char *stipplePattern, double stippleScale, bool maybeFat); +void ssglFatLine(Vector a, Vector b, double width); +void ssglUnlockColor(void); +void ssglColorRGB(RgbaColor rgb); +void ssglColorRGBa(RgbaColor rgb, double a); +void ssglDepthRangeOffset(int units); +void ssglDepthRangeLockToFront(bool yes); +void ssglDrawPixelsWithTexture(uint8_t *data, int w, int h); +void ssglInitializeBitmapFont(); +void ssglBitmapText(const std::string &str, Vector p); +void ssglBitmapCharQuad(char32_t chr, double x, double y); +int ssglBitmapCharWidth(char32_t chr); +#define TEXTURE_BACKGROUND_IMG 10 +#define TEXTURE_DRAW_PIXELS 20 +#define TEXTURE_COLOR_PICKER_2D 30 +#define TEXTURE_COLOR_PICKER_1D 40 +#define TEXTURE_BITMAP_FONT 50 + + +#define arraylen(x) (sizeof((x))/sizeof((x)[0])) +#define PI (3.1415926535897931) +void MakeMatrix(double *mat, double a11, double a12, double a13, double a14, + double a21, double a22, double a23, double a24, + double a31, double a32, double a33, double a34, + double a41, double a42, double a43, double a44); +std::string MakeAcceleratorLabel(int accel); +bool FilenameHasExtension(const std::string &str, const char *ext); +bool ReadFile(const std::string &filename, std::string *data); +bool WriteFile(const std::string &filename, const std::string &data); +void Message(const char *str, ...); +void Error(const char *str, ...); +void CnfFreezeBool(bool v, const std::string &name); +void CnfFreezeColor(RgbaColor v, const std::string &name); +bool CnfThawBool(bool v, const std::string &name); +RgbaColor CnfThawColor(RgbaColor v, const std::string &name); + +class System { +public: + enum { MAX_UNKNOWNS = 1024 }; + + EntityList entity; + ParamList param; + IdList eq; + + // A list of parameters that are being dragged; these are the ones that + // we should put as close as possible to their initial positions. + List dragged; + + enum { + // In general, the tag indicates the subsys that a variable/equation + // has been assigned to; these are exceptions for variables: + VAR_SUBSTITUTED = 10000, + VAR_DOF_TEST = 10001, + // and for equations: + EQ_SUBSTITUTED = 20000 + }; + + // The system Jacobian matrix + struct { + // The corresponding equation for each row + hEquation eq[MAX_UNKNOWNS]; + + // The corresponding parameter for each column + hParam param[MAX_UNKNOWNS]; + + // We're solving AX = B + int m, n; + struct { + Expr *sym[MAX_UNKNOWNS][MAX_UNKNOWNS]; + double num[MAX_UNKNOWNS][MAX_UNKNOWNS]; + } A; + + double scale[MAX_UNKNOWNS]; + + // Some helpers for the least squares solve + double AAt[MAX_UNKNOWNS][MAX_UNKNOWNS]; + double Z[MAX_UNKNOWNS]; + + double X[MAX_UNKNOWNS]; + + struct { + Expr *sym[MAX_UNKNOWNS]; + double num[MAX_UNKNOWNS]; + } B; + } mat; + + static const double RANK_MAG_TOLERANCE, CONVERGE_TOLERANCE; + int CalculateRank(void); + bool TestRank(void); + static bool SolveLinearSystem(double X[], double A[][MAX_UNKNOWNS], + double B[], int N); + bool SolveLeastSquares(void); + + bool WriteJacobian(int tag); + void EvalJacobian(void); + + void WriteEquationsExceptFor(hConstraint hc, Group *g); + void FindWhichToRemoveToFixJacobian(Group *g, List *bad); + void SolveBySubstitution(void); + + bool IsDragged(hParam p); + + bool NewtonSolve(int tag); + + enum { + SOLVED_OKAY = 0, + DIDNT_CONVERGE = 10, + REDUNDANT_OKAY = 11, + REDUNDANT_DIDNT_CONVERGE = 12, + TOO_MANY_UNKNOWNS = 20 + }; + int Solve(Group *g, int *dof, List *bad, + bool andFindBad, bool andFindFree); + + void Clear(void); +}; + +#include "ttf.h" + +class StepFileWriter { +public: + void ExportSurfacesTo(const std::string &filename); + void WriteHeader(void); + void WriteProductHeader(void); + int ExportCurve(SBezier *sb); + int ExportCurveLoop(SBezierLoop *loop, bool inner); + void ExportSurface(SSurface *ss, SBezierList *sbl); + void WriteWireframe(void); + void WriteFooter(void); + + List curves; + List advancedFaces; + FILE *f; + int id; +}; + +class VectorFileWriter { +protected: + Vector u, v, n, origin; + double cameraTan, scale; + +public: + FILE *f; + std::string filename; + Vector ptMin, ptMax; + + static double MmToPts(double mm); + + static VectorFileWriter *ForFile(const std::string &filename); + + ~VectorFileWriter(); + + void SetModelviewProjection(const Vector &u, const Vector &v, const Vector &n, + const Vector &origin, double cameraTan, double scale); + Vector Transform(Vector &pos) const; + + void OutputLinesAndMesh(SBezierLoopSetSet *sblss, SMesh *sm); + + void BezierAsPwl(SBezier *sb); + void BezierAsNonrationalCubic(SBezier *sb, int depth=0); + + virtual bool OutputConstraints(IdList *) { return false; } + virtual bool CanOutputMesh() const { return false; } + + virtual void StartPath( RgbaColor strokeRgb, double lineWidth, + bool filled, RgbaColor fillRgb, hStyle hs) = 0; + virtual void FinishPath(RgbaColor strokeRgb, double lineWidth, + bool filled, RgbaColor fillRgb, hStyle hs) = 0; + virtual void Bezier(SBezier *sb) = 0; + virtual void Triangle(STriangle *tr) = 0; + virtual void StartFile(void) = 0; + virtual void FinishAndCloseFile(void) = 0; + virtual bool HasCanvasSize(void) = 0; +}; +class DxfFileWriter : public VectorFileWriter { +public: + struct BezierPath { + std::vector beziers; + }; + + std::vector paths; + IdList *constraint; + + bool OutputConstraints(IdList *constraint); + + void StartPath( RgbaColor strokeRgb, double lineWidth, + bool filled, RgbaColor fillRgb, hStyle hs); + void FinishPath(RgbaColor strokeRgb, double lineWidth, + bool filled, RgbaColor fillRgb, hStyle hs); + void Triangle(STriangle *tr); + void Bezier(SBezier *sb); + void StartFile(void); + void FinishAndCloseFile(void); + bool HasCanvasSize(void) { return false; } + bool NeedToOutput(Constraint *c); + + static const char *lineTypeName(int stippleType); + +}; +class EpsFileWriter : public VectorFileWriter { +public: + Vector prevPt; + void MaybeMoveTo(Vector s, Vector f); + + void StartPath( RgbaColor strokeRgb, double lineWidth, + bool filled, RgbaColor fillRgb, hStyle hs); + void FinishPath(RgbaColor strokeRgb, double lineWidth, + bool filled, RgbaColor fillRgb, hStyle hs); + void Triangle(STriangle *tr); + void Bezier(SBezier *sb); + void StartFile(void); + void FinishAndCloseFile(void); + bool HasCanvasSize(void) { return true; } + bool CanOutputMesh() const { return true; } +}; +class PdfFileWriter : public VectorFileWriter { +public: + uint32_t xref[10]; + uint32_t bodyStart; + Vector prevPt; + void MaybeMoveTo(Vector s, Vector f); + + void StartPath( RgbaColor strokeRgb, double lineWidth, + bool filled, RgbaColor fillRgb, hStyle hs); + void FinishPath(RgbaColor strokeRgb, double lineWidth, + bool filled, RgbaColor fillRgb, hStyle hs); + void Triangle(STriangle *tr); + void Bezier(SBezier *sb); + void StartFile(void); + void FinishAndCloseFile(void); + bool HasCanvasSize(void) { return true; } + bool CanOutputMesh() const { return true; } +}; +class SvgFileWriter : public VectorFileWriter { +public: + Vector prevPt; + void MaybeMoveTo(Vector s, Vector f); + + void StartPath( RgbaColor strokeRgb, double lineWidth, + bool filled, RgbaColor fillRgb, hStyle hs); + void FinishPath(RgbaColor strokeRgb, double lineWidth, + bool filled, RgbaColor fillRgb, hStyle hs); + void Triangle(STriangle *tr); + void Bezier(SBezier *sb); + void StartFile(void); + void FinishAndCloseFile(void); + bool HasCanvasSize(void) { return true; } + bool CanOutputMesh() const { return true; } +}; +class HpglFileWriter : public VectorFileWriter { +public: + static double MmToHpglUnits(double mm); + void StartPath( RgbaColor strokeRgb, double lineWidth, + bool filled, RgbaColor fillRgb, hStyle hs); + void FinishPath(RgbaColor strokeRgb, double lineWidth, + bool filled, RgbaColor fillRgb, hStyle hs); + void Triangle(STriangle *tr); + void Bezier(SBezier *sb); + void StartFile(void); + void FinishAndCloseFile(void); + bool HasCanvasSize(void) { return false; } +}; +class Step2dFileWriter : public VectorFileWriter { + StepFileWriter sfw; + void StartPath( RgbaColor strokeRgb, double lineWidth, + bool filled, RgbaColor fillRgb, hStyle hs); + void FinishPath(RgbaColor strokeRgb, double lineWidth, + bool filled, RgbaColor fillRgb, hStyle hs); + void Triangle(STriangle *tr); + void Bezier(SBezier *sb); + void StartFile(void); + void FinishAndCloseFile(void); + bool HasCanvasSize(void) { return false; } +}; +class GCodeFileWriter : public VectorFileWriter { +public: + SEdgeList sel; + void StartPath( RgbaColor strokeRgb, double lineWidth, + bool filled, RgbaColor fillRgb, hStyle hs); + void FinishPath(RgbaColor strokeRgb, double lineWidth, + bool filled, RgbaColor fillRgb, hStyle hs); + void Triangle(STriangle *tr); + void Bezier(SBezier *sb); + void StartFile(void); + void FinishAndCloseFile(void); + bool HasCanvasSize(void) { return false; } +}; + +#ifdef LIBRARY +# define ENTITY EntityBase +# define CONSTRAINT ConstraintBase +#else +# define ENTITY Entity +# define CONSTRAINT Constraint +#endif +class Sketch { +public: + // These are user-editable, and define the sketch. + IdList group; + List
groupOrder; + IdList constraint; + IdList request; + IdList style; + + // These are generated from the above. + IdList entity; + IdList param; + + inline CONSTRAINT *GetConstraint(hConstraint h) + { return constraint.FindById(h); } + inline ENTITY *GetEntity (hEntity h) { return entity. FindById(h); } + inline Param *GetParam (hParam h) { return param. FindById(h); } + inline Request *GetRequest(hRequest h) { return request.FindById(h); } + inline Group *GetGroup (hGroup h) { return group. FindById(h); } + // Styles are handled a bit differently. + + void Clear(void); + + BBox CalculateEntityBBox(bool includingInvisible); + Group *GetRunningMeshGroupFor(hGroup h); +}; +#undef ENTITY +#undef CONSTRAINT + +class SolveSpaceUI { +public: + TextWindow *pTW; + TextWindow &TW; + GraphicsWindow GW; + + // The state for undo/redo + typedef struct { + IdList group; + List
groupOrder; + IdList request; + IdList constraint; + IdList param; + IdList style; + hGroup activeGroup; + + void Clear(void) { + group.Clear(); + request.Clear(); + constraint.Clear(); + param.Clear(); + style.Clear(); + } + } UndoState; + enum { MAX_UNDO = 16 }; + typedef struct { + UndoState d[MAX_UNDO]; + int cnt; + int write; + } UndoStack; + UndoStack undo; + UndoStack redo; + void UndoEnableMenus(void); + void UndoRemember(void); + void UndoUndo(void); + void UndoRedo(void); + void PushFromCurrentOnto(UndoStack *uk); + void PopOntoCurrentFrom(UndoStack *uk); + void UndoClearState(UndoState *ut); + void UndoClearStack(UndoStack *uk); + + // Little bits of extra configuration state + enum { MODEL_COLORS = 8 }; + RgbaColor modelColor[MODEL_COLORS]; + Vector lightDir[2]; + double lightIntensity[2]; + double ambientIntensity; + double chordTol; + double chordTolCalculated; + int maxSegments; + double exportChordTol; + int exportMaxSegments; + double cameraTangent; + float gridSpacing; + float exportScale; + float exportOffset; + bool fixExportColors; + bool drawBackFaces; + bool checkClosedContour; + bool showToolbar; + RgbaColor backgroundColor; + bool exportShadedTriangles; + bool exportPwlCurves; + bool exportCanvasSizeAuto; + bool exportMode; + struct { + float left; + float right; + float bottom; + float top; + } exportMargin; + struct { + float width; + float height; + float dx; + float dy; + } exportCanvas; + struct { + float depth; + int passes; + float feed; + float plungeFeed; + } gCode; + + typedef enum { + UNIT_MM = 0, + UNIT_INCHES + } Unit; + Unit viewUnits; + int afterDecimalMm; + int afterDecimalInch; + int autosaveInterval; // in minutes + + std::string MmToString(double v); + double ExprToMm(Expr *e); + double StringToMm(const std::string &s); + const char *UnitName(void); + double MmPerUnit(void); + int UnitDigitsAfterDecimal(void); + void SetUnitDigitsAfterDecimal(int v); + double ChordTolMm(void); + double ExportChordTolMm(void); + int GetMaxSegments(void); + bool usePerspectiveProj; + double CameraTangent(void); + + // Some stuff relating to the tangent arcs created non-parametrically + // as special requests. + double tangentArcRadius; + bool tangentArcManual; + bool tangentArcDeleteOld; + + // The platform-dependent code calls this before entering the msg loop + void Init(void); + bool OpenFile(const std::string &filename); + void Exit(void); + + // File load/save routines, including the additional files that get + // loaded when we have link groups. + FILE *fh; + void AfterNewFile(void); + static void RemoveFromRecentList(const std::string &filename); + static void AddToRecentList(const std::string &filename); + std::string saveFile; + bool fileLoadError; + bool unsaved; + typedef struct { + char type; + const char *desc; + char fmt; + void *ptr; + } SaveTable; + static const SaveTable SAVED[]; + void SaveUsingTable(int type); + void LoadUsingTable(char *key, char *val); + struct { + Group g; + Request r; + Entity e; + Param p; + Constraint c; + Style s; + } sv; + static void MenuFile(int id); + bool Autosave(); + void RemoveAutosave(); + bool GetFilenameAndSave(bool saveAs); + bool OkayToStartNewFile(void); + hGroup CreateDefaultDrawingGroup(void); + void UpdateWindowTitle(void); + void ClearExisting(void); + void NewFile(void); + bool SaveToFile(const std::string &filename); + bool LoadAutosaveFor(const std::string &filename); + bool LoadFromFile(const std::string &filename); + bool LoadEntitiesFromFile(const std::string &filename, EntityList *le, + SMesh *m, SShell *sh); + bool ReloadAllImported(bool canCancel=false); + // And the various export options + void ExportAsPngTo(const std::string &filename); + void ExportMeshTo(const std::string &filename); + void ExportMeshAsStlTo(FILE *f, SMesh *sm); + void ExportMeshAsObjTo(FILE *f, SMesh *sm); + void ExportMeshAsThreeJsTo(FILE *f, const std::string &filename, + SMesh *sm, SEdgeList *sel); + void ExportViewOrWireframeTo(const std::string &filename, bool wireframe); + void ExportSectionTo(const std::string &filename); + void ExportWireframeCurves(SEdgeList *sel, SBezierList *sbl, + VectorFileWriter *out); + void ExportLinesAndMesh(SEdgeList *sel, SBezierList *sbl, SMesh *sm, + Vector u, Vector v, Vector n, Vector origin, + double cameraTan, + VectorFileWriter *out); + + static void MenuAnalyze(int id); + + // Additional display stuff + struct { + SContour path; + hEntity point; + } traced; + SEdgeList nakedEdges; + struct { + bool draw; + Vector ptA; + Vector ptB; + } extraLine; + struct { + uint8_t *fromFile; + int w, h; + int rw, rh; + double scale; // pixels per mm + Vector origin; + } bgImage; + struct { + bool draw, showOrigin; + Vector pt, u, v; + } justExportedInfo; + + class Clipboard { + public: + List r; + List c; + + void Clear(void); + bool ContainsEntity(hEntity old); + hEntity NewEntityFor(hEntity old); + }; + Clipboard clipboard; + + void MarkGroupDirty(hGroup hg); + void MarkGroupDirtyByEntity(hEntity he); + + // Consistency checking on the sketch: stuff with missing dependencies + // will get deleted automatically. + struct { + int requests; + int groups; + int constraints; + int nonTrivialConstraints; + } deleted; + bool GroupExists(hGroup hg); + bool PruneOrphans(void); + bool EntityExists(hEntity he); + bool GroupsInOrder(hGroup before, hGroup after); + bool PruneGroups(hGroup hg); + bool PruneRequests(hGroup hg); + bool PruneConstraints(hGroup hg); + + enum GenerateType { + GENERATE_DIRTY, + GENERATE_ALL, + GENERATE_REGEN, + GENERATE_UNTIL_ACTIVE, + }; + + void GenerateAll(GenerateType type = GENERATE_DIRTY, bool andFindFree = false, + bool genForBBox = false); + void SolveGroup(hGroup hg, bool andFindFree); + void SolveGroupAndReport(hGroup hg, bool andFindFree); + void MarkDraggedParams(void); + void ForceReferences(void); + + bool ActiveGroupsOkay(void); + + // The system to be solved. + System *pSys; + System &sys; + + // All the TrueType fonts in memory + TtfFontList fonts; + + // Everything has been pruned, so we know there's no dangling references + // to entities that don't exist. Before that, we mustn't try to display + // the sketch! + bool allConsistent; + + struct { + bool scheduled; + bool showTW; + bool generateAll; + } later; + void ScheduleShowTW(); + void ScheduleGenerateAll(); + void DoLater(void); + + static void MenuHelp(int id); + + void Clear(void); + + // We allocate TW and sys on the heap to work around an MSVC problem + // where it puts zero-initialized global data in the binary (~30M of zeroes) + // in release builds. + SolveSpaceUI() + : pTW(new TextWindow({})), TW(*pTW), + pSys(new System({})), sys(*pSys) {} + + ~SolveSpaceUI() { + delete pTW; + delete pSys; + } +}; + +void ImportDxf(const std::string &file); +void ImportDwg(const std::string &file); + +extern SolveSpaceUI SS; +extern Sketch SK; + +}; + +#ifndef __OBJC__ +using namespace SolveSpace; +#endif + +#endif diff --git a/src/srf/boolean.cpp b/src/srf/boolean.cpp new file mode 100644 index 0000000..d064952 --- /dev/null +++ b/src/srf/boolean.cpp @@ -0,0 +1,956 @@ +//----------------------------------------------------------------------------- +// Top-level functions to compute the Boolean union or difference between +// two shells of rational polynomial surfaces. +// +// Copyright 2008-2013 Jonathan Westhues. +//----------------------------------------------------------------------------- +#include "solvespace.h" + +static int I; + +void SShell::MakeFromUnionOf(SShell *a, SShell *b) { + MakeFromBoolean(a, b, AS_UNION); +} + +void SShell::MakeFromDifferenceOf(SShell *a, SShell *b) { + MakeFromBoolean(a, b, AS_DIFFERENCE); +} + +//----------------------------------------------------------------------------- +// Take our original pwl curve. Wherever an edge intersects a surface within +// either agnstA or agnstB, split the piecewise linear element. Then refine +// the intersection so that it lies on all three relevant surfaces: the +// intersecting surface, srfA, and srfB. (So the pwl curve should lie at +// the intersection of srfA and srfB.) Return a new pwl curve with everything +// split. +//----------------------------------------------------------------------------- +static Vector LineStart, LineDirection; +static int ByTAlongLine(const void *av, const void *bv) +{ + SInter *a = (SInter *)av, + *b = (SInter *)bv; + + double ta = (a->p.Minus(LineStart)).DivPivoting(LineDirection), + tb = (b->p.Minus(LineStart)).DivPivoting(LineDirection); + + return (ta > tb) ? 1 : -1; +} +SCurve SCurve::MakeCopySplitAgainst(SShell *agnstA, SShell *agnstB, + SSurface *srfA, SSurface *srfB) +{ + SCurve ret; + ret = *this; + ret.pts = {}; + + SCurvePt *p = pts.First(); + if(!p) oops(); + SCurvePt prev = *p; + ret.pts.Add(p); + p = pts.NextAfter(p); + + for(; p; p = pts.NextAfter(p)) { + List il = {}; + + // Find all the intersections with the two passed shells + if(agnstA) + agnstA->AllPointsIntersecting(prev.p, p->p, &il, true, false, true); + if(agnstB) + agnstB->AllPointsIntersecting(prev.p, p->p, &il, true, false, true); + + if(il.n > 0) { + // The intersections were generated by intersecting the pwl + // edge against a surface; so they must be refined to lie + // exactly on the original curve. + il.ClearTags(); + SInter *pi; + for(pi = il.First(); pi; pi = il.NextAfter(pi)) { + if(pi->srf == srfA || pi->srf == srfB) { + // The edge certainly intersects the surfaces that it + // trims (at its endpoints), but those ones don't count. + // They are culled later, but no sense calculating them + // and they will cause numerical problems (since two + // of the three surfaces they're refined to lie on will + // be identical, so the matrix will be singular). + pi->tag = 1; + continue; + } + + Point2d puv; + (pi->srf)->ClosestPointTo(pi->p, &puv, false); + + // Split the edge if the intersection lies within the surface's + // trim curves, or within the chord tol of the trim curve; want + // some slop if points are close to edge and pwl is too coarse, + // and it doesn't hurt to split unnecessarily. + Point2d dummy = { 0, 0 }; + int c = (pi->srf->bsp) ? pi->srf->bsp->ClassifyPoint(puv, dummy, pi->srf) : SBspUv::OUTSIDE; + if(c == SBspUv::OUTSIDE) { + double d = VERY_POSITIVE; + if(pi->srf->bsp) d = pi->srf->bsp->MinimumDistanceToEdge(puv, pi->srf); + if(d > SS.ChordTolMm()) { + pi->tag = 1; + continue; + } + } + + // We're keeping the intersection, so actually refine it. + (pi->srf)->PointOnSurfaces(srfA, srfB, &(puv.x), &(puv.y)); + pi->p = (pi->srf)->PointAt(puv); + } + il.RemoveTagged(); + + // And now sort them in order along the line. Note that we must + // do that after refining, in case the refining would make two + // points switch places. + LineStart = prev.p; + LineDirection = (p->p).Minus(prev.p); + qsort(il.elem, il.n, sizeof(il.elem[0]), ByTAlongLine); + + // And now uses the intersections to generate our split pwl edge(s) + Vector prev = Vector::From(VERY_POSITIVE, 0, 0); + for(pi = il.First(); pi; pi = il.NextAfter(pi)) { + // On-edge intersection will generate same split point for + // both surfaces, so don't create zero-length edge. + if(!prev.Equals(pi->p)) { + SCurvePt scpt; + scpt.tag = 0; + scpt.p = pi->p; + scpt.vertex = true; + ret.pts.Add(&scpt); + } + prev = pi->p; + } + } + + il.Clear(); + ret.pts.Add(p); + prev = *p; + } + return ret; +} + +void SShell::CopyCurvesSplitAgainst(bool opA, SShell *agnst, SShell *into) { + SCurve *sc; + for(sc = curve.First(); sc; sc = curve.NextAfter(sc)) { + SCurve scn = sc->MakeCopySplitAgainst(agnst, NULL, + surface.FindById(sc->surfA), + surface.FindById(sc->surfB)); + scn.source = opA ? SCurve::FROM_A : SCurve::FROM_B; + + hSCurve hsc = into->curve.AddAndAssignId(&scn); + // And note the new ID so that we can rewrite the trims appropriately + sc->newH = hsc; + } +} + +void SSurface::TrimFromEdgeList(SEdgeList *el, bool asUv) { + el->l.ClearTags(); + + STrimBy stb = {}; + for(;;) { + // Find an edge, any edge; we'll start from there. + SEdge *se; + for(se = el->l.First(); se; se = el->l.NextAfter(se)) { + if(se->tag) continue; + break; + } + if(!se) break; + se->tag = 1; + stb.start = se->a; + stb.finish = se->b; + stb.curve.v = se->auxA; + stb.backwards = se->auxB ? true : false; + + // Find adjoining edges from the same curve; those should be + // merged into a single trim. + bool merged; + do { + merged = false; + for(se = el->l.First(); se; se = el->l.NextAfter(se)) { + if(se->tag) continue; + if(se->auxA != (int)stb.curve.v) continue; + if(( se->auxB && !stb.backwards) || + (!se->auxB && stb.backwards)) continue; + + if((se->a).Equals(stb.finish)) { + stb.finish = se->b; + se->tag = 1; + merged = true; + } else if((se->b).Equals(stb.start)) { + stb.start = se->a; + se->tag = 1; + merged = true; + } + } + } while(merged); + + if(asUv) { + stb.start = PointAt(stb.start.x, stb.start.y); + stb.finish = PointAt(stb.finish.x, stb.finish.y); + } + + // And add the merged trim, with xyz (not uv like the polygon) pts + trim.Add(&stb); + } +} + +static bool KeepRegion(int type, bool opA, int shell, int orig) +{ + bool inShell = (shell == SShell::INSIDE), + inSame = (shell == SShell::COINC_SAME), + inOpp = (shell == SShell::COINC_OPP), + inOrig = (orig == SShell::INSIDE); + + bool inFace = inSame || inOpp; + + // If these are correct, then they should be independent of inShell + // if inFace is true. + if(!inOrig) return false; + switch(type) { + case SShell::AS_UNION: + if(opA) { + return (!inShell && !inFace); + } else { + return (!inShell && !inFace) || inSame; + } + + case SShell::AS_DIFFERENCE: + if(opA) { + return (!inShell && !inFace); + } else { + return (inShell && !inFace) || inSame; + } + + default: oops(); + } +} +static bool KeepEdge(int type, bool opA, + int indir_shell, int outdir_shell, + int indir_orig, int outdir_orig) +{ + bool keepIn = KeepRegion(type, opA, indir_shell, indir_orig), + keepOut = KeepRegion(type, opA, outdir_shell, outdir_orig); + + // If the regions to the left and right of this edge are both in or both + // out, then this edge is not useful and should be discarded. + if(keepIn && !keepOut) return true; + return false; +} + +static void TagByClassifiedEdge(int bspclass, int *indir, int *outdir) +{ + switch(bspclass) { + case SBspUv::INSIDE: + *indir = SShell::INSIDE; + *outdir = SShell::INSIDE; + break; + + case SBspUv::OUTSIDE: + *indir = SShell::OUTSIDE; + *outdir = SShell::OUTSIDE; + break; + + case SBspUv::EDGE_PARALLEL: + *indir = SShell::INSIDE; + *outdir = SShell::OUTSIDE; + break; + + case SBspUv::EDGE_ANTIPARALLEL: + *indir = SShell::OUTSIDE; + *outdir = SShell::INSIDE; + break; + + default: + dbp("TagByClassifiedEdge: fail!"); + *indir = SShell::OUTSIDE; + *outdir = SShell::OUTSIDE; + break; + } +} + +static void DEBUGEDGELIST(SEdgeList *sel, SSurface *surf) { + dbp("print %d edges", sel->l.n); + SEdge *se; + for(se = sel->l.First(); se; se = sel->l.NextAfter(se)) { + Vector mid = (se->a).Plus(se->b).ScaledBy(0.5); + Vector arrow = (se->b).Minus(se->a); + swap(arrow.x, arrow.y); + arrow.x *= -1; + arrow = arrow.WithMagnitude(0.01); + arrow = arrow.Plus(mid); + + SS.nakedEdges.AddEdge(surf->PointAt(se->a.x, se->a.y), + surf->PointAt(se->b.x, se->b.y)); + SS.nakedEdges.AddEdge(surf->PointAt(mid.x, mid.y), + surf->PointAt(arrow.x, arrow.y)); + } +} + +//----------------------------------------------------------------------------- +// We are given src, with at least one edge, and avoid, a list of points to +// avoid. We return a chain of edges (that share endpoints), such that no +// point within the avoid list ever occurs in the middle of a chain. And we +// delete the edges in that chain from our source list. +//----------------------------------------------------------------------------- +void SSurface::FindChainAvoiding(SEdgeList *src, SEdgeList *dest, + SPointList *avoid) +{ + if(src->l.n < 1) oops(); + // Start with an arbitrary edge. + dest->l.Add(&(src->l.elem[0])); + src->l.ClearTags(); + src->l.elem[0].tag = 1; + + bool added; + do { + added = false; + // The start and finish of the current edge chain + Vector s = dest->l.elem[0].a, + f = dest->l.elem[dest->l.n - 1].b; + + // We can attach a new edge at the start or finish, as long as that + // start or finish point isn't in the list of points to avoid. + bool startOkay = !avoid->ContainsPoint(s), + finishOkay = !avoid->ContainsPoint(f); + + // Now look for an unused edge that joins at the start or finish of + // our chain (if permitted by the avoid list). + SEdge *se; + for(se = src->l.First(); se; se = src->l.NextAfter(se)) { + if(se->tag) continue; + if(startOkay && s.Equals(se->b)) { + dest->l.AddToBeginning(se); + s = se->a; + se->tag = 1; + startOkay = !avoid->ContainsPoint(s); + } else if(finishOkay && f.Equals(se->a)) { + dest->l.Add(se); + f = se->b; + se->tag = 1; + finishOkay = !avoid->ContainsPoint(f); + } else { + continue; + } + + added = true; + } + } while(added); + + src->l.RemoveTagged(); +} + +void SSurface::EdgeNormalsWithinSurface(Point2d auv, Point2d buv, + Vector *pt, + Vector *enin, Vector *enout, + Vector *surfn, + uint32_t auxA, + SShell *shell, SShell *sha, SShell *shb) +{ + // the midpoint of the edge + Point2d muv = (auv.Plus(buv)).ScaledBy(0.5); + + *pt = PointAt(muv); + + // If this edge just approximates a curve, then refine our midpoint so + // so that it actually lies on that curve too. Otherwise stuff like + // point-on-face tests will fail, since the point won't actually lie + // on the other face. + hSCurve hc = { auxA }; + SCurve *sc = shell->curve.FindById(hc); + if(sc->isExact && sc->exact.deg != 1) { + double t; + sc->exact.ClosestPointTo(*pt, &t, false); + *pt = sc->exact.PointAt(t); + ClosestPointTo(*pt, &muv); + } else if(!sc->isExact) { + SSurface *trimmedA = sc->GetSurfaceA(sha, shb), + *trimmedB = sc->GetSurfaceB(sha, shb); + *pt = trimmedA->ClosestPointOnThisAndSurface(trimmedB, *pt); + ClosestPointTo(*pt, &muv); + } + + *surfn = NormalAt(muv.x, muv.y); + + // Compute the edge's inner normal in xyz space. + Vector ab = (PointAt(auv)).Minus(PointAt(buv)), + enxyz = (ab.Cross(*surfn)).WithMagnitude(SS.ChordTolMm()); + // And based on that, compute the edge's inner normal in uv space. This + // vector is perpendicular to the edge in xyz, but not necessarily in uv. + Vector tu, tv; + TangentsAt(muv.x, muv.y, &tu, &tv); + Point2d enuv; + enuv.x = enxyz.Dot(tu) / tu.MagSquared(); + enuv.y = enxyz.Dot(tv) / tv.MagSquared(); + + // Compute the inner and outer normals of this edge (within the srf), + // in xyz space. These are not necessarily antiparallel, if the + // surface is curved. + Vector pin = PointAt(muv.Minus(enuv)), + pout = PointAt(muv.Plus(enuv)); + *enin = pin.Minus(*pt), + *enout = pout.Minus(*pt); +} + +//----------------------------------------------------------------------------- +// Trim this surface against the specified shell, in the way that's appropriate +// for the specified Boolean operation type (and which operand we are). We +// also need a pointer to the shell that contains our own surface, since that +// contains our original trim curves. +//----------------------------------------------------------------------------- +SSurface SSurface::MakeCopyTrimAgainst(SShell *parent, + SShell *sha, SShell *shb, + SShell *into, + int type) +{ + bool opA = (parent == sha); + SShell *agnst = opA ? shb : sha; + + SSurface ret; + // The returned surface is identical, just the trim curves change + ret = *this; + ret.trim = {}; + + // First, build a list of the existing trim curves; update them to use + // the split curves. + STrimBy *stb; + for(stb = trim.First(); stb; stb = trim.NextAfter(stb)) { + STrimBy stn = *stb; + stn.curve = (parent->curve.FindById(stn.curve))->newH; + ret.trim.Add(&stn); + } + + if(type == SShell::AS_DIFFERENCE && !opA) { + // The second operand of a Boolean difference gets turned inside out + ret.Reverse(); + } + + // Build up our original trim polygon; remember the coordinates could + // be changed if we just flipped the surface normal, and we are using + // the split curves (not the original curves). + SEdgeList orig = {}; + ret.MakeEdgesInto(into, &orig, AS_UV); + ret.trim.Clear(); + // which means that we can't necessarily use the old BSP... + SBspUv *origBsp = SBspUv::From(&orig, &ret); + + // And now intersect the other shell against us + SEdgeList inter = {}; + + SSurface *ss; + for(ss = agnst->surface.First(); ss; ss = agnst->surface.NextAfter(ss)) { + SCurve *sc; + for(sc = into->curve.First(); sc; sc = into->curve.NextAfter(sc)) { + if(sc->source != SCurve::FROM_INTERSECTION) continue; + if(opA) { + if(sc->surfA.v != h.v || sc->surfB.v != ss->h.v) continue; + } else { + if(sc->surfB.v != h.v || sc->surfA.v != ss->h.v) continue; + } + + int i; + for(i = 1; i < sc->pts.n; i++) { + Vector a = sc->pts.elem[i-1].p, + b = sc->pts.elem[i].p; + + Point2d auv, buv; + ss->ClosestPointTo(a, &(auv.x), &(auv.y)); + ss->ClosestPointTo(b, &(buv.x), &(buv.y)); + + int c = (ss->bsp) ? ss->bsp->ClassifyEdge(auv, buv, ss) : SBspUv::OUTSIDE; + if(c != SBspUv::OUTSIDE) { + Vector ta = Vector::From(0, 0, 0); + Vector tb = Vector::From(0, 0, 0); + ret.ClosestPointTo(a, &(ta.x), &(ta.y)); + ret.ClosestPointTo(b, &(tb.x), &(tb.y)); + + Vector tn = ret.NormalAt(ta.x, ta.y); + Vector sn = ss->NormalAt(auv.x, auv.y); + + // We are subtracting the portion of our surface that + // lies in the shell, so the in-plane edge normal should + // point opposite to the surface normal. + bool bkwds = true; + if((tn.Cross(b.Minus(a))).Dot(sn) < 0) bkwds = !bkwds; + if(type == SShell::AS_DIFFERENCE && !opA) bkwds = !bkwds; + if(bkwds) { + inter.AddEdge(tb, ta, sc->h.v, 1); + } else { + inter.AddEdge(ta, tb, sc->h.v, 0); + } + } + } + } + } + + // Record all the points where more than two edges join, which I will call + // the choosing points. If two edges join at a non-choosing point, then + // they must either both be kept or both be discarded (since that would + // otherwise create an open contour). + SPointList choosing = {}; + SEdge *se; + for(se = orig.l.First(); se; se = orig.l.NextAfter(se)) { + choosing.IncrementTagFor(se->a); + choosing.IncrementTagFor(se->b); + } + for(se = inter.l.First(); se; se = inter.l.NextAfter(se)) { + choosing.IncrementTagFor(se->a); + choosing.IncrementTagFor(se->b); + } + SPoint *sp; + for(sp = choosing.l.First(); sp; sp = choosing.l.NextAfter(sp)) { + if(sp->tag == 2) { + sp->tag = 1; + } else { + sp->tag = 0; + } + } + choosing.l.RemoveTagged(); + + // The list of edges to trim our new surface, a combination of edges from + // our original and intersecting edge lists. + SEdgeList final = {}; + + while(orig.l.n > 0) { + SEdgeList chain = {}; + FindChainAvoiding(&orig, &chain, &choosing); + + // Arbitrarily choose an edge within the chain to classify; they + // should all be the same, though. + se = &(chain.l.elem[chain.l.n/2]); + + Point2d auv = (se->a).ProjectXy(), + buv = (se->b).ProjectXy(); + + Vector pt, enin, enout, surfn; + ret.EdgeNormalsWithinSurface(auv, buv, &pt, &enin, &enout, &surfn, + se->auxA, into, sha, shb); + + int indir_shell, outdir_shell, indir_orig, outdir_orig; + + indir_orig = SShell::INSIDE; + outdir_orig = SShell::OUTSIDE; + + agnst->ClassifyEdge(&indir_shell, &outdir_shell, + ret.PointAt(auv), ret.PointAt(buv), pt, + enin, enout, surfn); + + if(KeepEdge(type, opA, indir_shell, outdir_shell, + indir_orig, outdir_orig)) + { + for(se = chain.l.First(); se; se = chain.l.NextAfter(se)) { + final.AddEdge(se->a, se->b, se->auxA, se->auxB); + } + } + chain.Clear(); + } + + while(inter.l.n > 0) { + SEdgeList chain = {}; + FindChainAvoiding(&inter, &chain, &choosing); + + // Any edge in the chain, same as above. + se = &(chain.l.elem[chain.l.n/2]); + + Point2d auv = (se->a).ProjectXy(), + buv = (se->b).ProjectXy(); + + Vector pt, enin, enout, surfn; + ret.EdgeNormalsWithinSurface(auv, buv, &pt, &enin, &enout, &surfn, + se->auxA, into, sha, shb); + + int indir_shell, outdir_shell, indir_orig, outdir_orig; + + int c_this = (origBsp) ? origBsp->ClassifyEdge(auv, buv, &ret) : SBspUv::OUTSIDE; + TagByClassifiedEdge(c_this, &indir_orig, &outdir_orig); + + agnst->ClassifyEdge(&indir_shell, &outdir_shell, + ret.PointAt(auv), ret.PointAt(buv), pt, + enin, enout, surfn); + + if(KeepEdge(type, opA, indir_shell, outdir_shell, + indir_orig, outdir_orig)) + { + for(se = chain.l.First(); se; se = chain.l.NextAfter(se)) { + final.AddEdge(se->a, se->b, se->auxA, se->auxB); + } + } + chain.Clear(); + } + + // Cull extraneous edges; duplicates or anti-parallel pairs. In particular, + // we can get duplicate edges if our surface intersects the other shell + // at an edge, so that both surfaces intersect coincident (and both + // generate an intersection edge). + final.CullExtraneousEdges(); + + // Use our reassembled edges to trim the new surface. + ret.TrimFromEdgeList(&final, true); + + SPolygon poly = {}; + final.l.ClearTags(); + if(!final.AssemblePolygon(&poly, NULL, true)) { + into->booleanFailed = true; + dbp("failed: I=%d, avoid=%d", I, choosing.l.n); + DEBUGEDGELIST(&final, &ret); + } + poly.Clear(); + + choosing.Clear(); + final.Clear(); + inter.Clear(); + orig.Clear(); + return ret; +} + +void SShell::CopySurfacesTrimAgainst(SShell *sha, SShell *shb, SShell *into, + int type) +{ + SSurface *ss; + for(ss = surface.First(); ss; ss = surface.NextAfter(ss)) { + SSurface ssn; + ssn = ss->MakeCopyTrimAgainst(this, sha, shb, into, type); + ss->newH = into->surface.AddAndAssignId(&ssn); + I++; + } +} + +void SShell::MakeIntersectionCurvesAgainst(SShell *agnst, SShell *into) { + SSurface *sa; + for(sa = surface.First(); sa; sa = surface.NextAfter(sa)) { + SSurface *sb; + for(sb = agnst->surface.First(); sb; sb = agnst->surface.NextAfter(sb)){ + // Intersect every surface from our shell against every surface + // from agnst; this will add zero or more curves to the curve + // list for into. + sa->IntersectAgainst(sb, this, agnst, into); + } + } +} + +void SShell::CleanupAfterBoolean(void) { + SSurface *ss; + for(ss = surface.First(); ss; ss = surface.NextAfter(ss)) { + ss->edges.Clear(); + } +} + +//----------------------------------------------------------------------------- +// All curves contain handles to the two surfaces that they trim. After a +// Boolean or assembly, we must rewrite those handles to refer to the curves +// by their new IDs. +//----------------------------------------------------------------------------- +void SShell::RewriteSurfaceHandlesForCurves(SShell *a, SShell *b) { + SCurve *sc; + for(sc = curve.First(); sc; sc = curve.NextAfter(sc)) { + sc->surfA = sc->GetSurfaceA(a, b)->newH, + sc->surfB = sc->GetSurfaceB(a, b)->newH; + } +} + +//----------------------------------------------------------------------------- +// Copy all the surfaces and curves from two different shells into a single +// shell. The only difficulty is to rewrite all of their handles; we don't +// look for any surface intersections, so if two objects interfere then the +// result is just self-intersecting. This is used for assembly, since it's +// much faster than merging as union. +//----------------------------------------------------------------------------- +void SShell::MakeFromAssemblyOf(SShell *a, SShell *b) { + booleanFailed = false; + + Vector t = Vector::From(0, 0, 0); + Quaternion q = Quaternion::IDENTITY; + int i = 0; + SShell *ab; + + // First, copy over all the curves. Note which shell (a or b) each curve + // came from, but assign it a new ID. + SCurve *c, cn; + for(i = 0; i < 2; i++) { + ab = (i == 0) ? a : b; + for(c = ab->curve.First(); c; c = ab->curve.NextAfter(c)) { + cn = SCurve::FromTransformationOf(c, t, q, 1.0); + cn.source = (i == 0) ? SCurve::FROM_A : SCurve::FROM_B; + // surfA and surfB are wrong now, and we can't fix them until + // we've assigned IDs to the surfaces. So we'll get that later. + c->newH = curve.AddAndAssignId(&cn); + } + } + + // Likewise copy over all the surfaces. + SSurface *s, sn; + for(i = 0; i < 2; i++) { + ab = (i == 0) ? a : b; + for(s = ab->surface.First(); s; s = ab->surface.NextAfter(s)) { + sn = SSurface::FromTransformationOf(s, t, q, 1.0, true); + // All the trim curve IDs get rewritten; we know the new handles + // to the curves since we recorded them in the previous step. + STrimBy *stb; + for(stb = sn.trim.First(); stb; stb = sn.trim.NextAfter(stb)) { + stb->curve = ab->curve.FindById(stb->curve)->newH; + } + s->newH = surface.AddAndAssignId(&sn); + } + } + + // Finally, rewrite the surfaces associated with each curve to use the + // new handles. + RewriteSurfaceHandlesForCurves(a, b); +} + +void SShell::MakeFromBoolean(SShell *a, SShell *b, int type) { + booleanFailed = false; + + a->MakeClassifyingBsps(NULL); + b->MakeClassifyingBsps(NULL); + + // Copy over all the original curves, splitting them so that a + // piecwise linear segment never crosses a surface from the other + // shell. + a->CopyCurvesSplitAgainst(true, b, this); + b->CopyCurvesSplitAgainst(false, a, this); + + // Generate the intersection curves for each surface in A against all + // the surfaces in B (which is all of the intersection curves). + a->MakeIntersectionCurvesAgainst(b, this); + + SCurve *sc; + for(sc = curve.First(); sc; sc = curve.NextAfter(sc)) { + SSurface *srfA = sc->GetSurfaceA(a, b), + *srfB = sc->GetSurfaceB(a, b); + + sc->RemoveShortSegments(srfA, srfB); + } + + // And clean up the piecewise linear things we made as a calculation aid + a->CleanupAfterBoolean(); + b->CleanupAfterBoolean(); + // Remake the classifying BSPs with the split (and short-segment-removed) + // curves + a->MakeClassifyingBsps(this); + b->MakeClassifyingBsps(this); + + if(b->surface.n == 0 || a->surface.n == 0) { + I = 1000000; + } else { + I = 0; + } + // Then trim and copy the surfaces + a->CopySurfacesTrimAgainst(a, b, this, type); + b->CopySurfacesTrimAgainst(a, b, this, type); + + // Now that we've copied the surfaces, we know their new hSurfaces, so + // rewrite the curves to refer to the surfaces by their handles in the + // result. + RewriteSurfaceHandlesForCurves(a, b); + + // And clean up the piecewise linear things we made as a calculation aid + a->CleanupAfterBoolean(); + b->CleanupAfterBoolean(); +} + +//----------------------------------------------------------------------------- +// All of the BSP routines that we use to perform and accelerate polygon ops. +//----------------------------------------------------------------------------- +void SShell::MakeClassifyingBsps(SShell *useCurvesFrom) { + SSurface *ss; + for(ss = surface.First(); ss; ss = surface.NextAfter(ss)) { + ss->MakeClassifyingBsp(this, useCurvesFrom); + } +} + +void SSurface::MakeClassifyingBsp(SShell *shell, SShell *useCurvesFrom) { + SEdgeList el = {}; + + MakeEdgesInto(shell, &el, AS_UV, useCurvesFrom); + bsp = SBspUv::From(&el, this); + el.Clear(); + + edges = {}; + MakeEdgesInto(shell, &edges, AS_XYZ, useCurvesFrom); +} + +SBspUv *SBspUv::Alloc(void) { + return (SBspUv *)AllocTemporary(sizeof(SBspUv)); +} + +static int ByLength(const void *av, const void *bv) +{ + SEdge *a = (SEdge *)av, + *b = (SEdge *)bv; + + double la = (a->a).Minus(a->b).Magnitude(), + lb = (b->a).Minus(b->b).Magnitude(); + + // Sort in descending order, longest first. This improves numerical + // stability for the normals. + return (la < lb) ? 1 : -1; +} +SBspUv *SBspUv::From(SEdgeList *el, SSurface *srf) { + SEdgeList work = {}; + + SEdge *se; + for(se = el->l.First(); se; se = el->l.NextAfter(se)) { + work.AddEdge(se->a, se->b, se->auxA, se->auxB); + } + qsort(work.l.elem, work.l.n, sizeof(work.l.elem[0]), ByLength); + + SBspUv *bsp = NULL; + for(se = work.l.First(); se; se = work.l.NextAfter(se)) { + bsp = InsertOrCreateEdge(bsp, (se->a).ProjectXy(), (se->b).ProjectXy(), srf); + } + + work.Clear(); + return bsp; +} + +//----------------------------------------------------------------------------- +// The points in this BSP are in uv space, but we want to apply our tolerances +// consistently in xyz (i.e., we want to say a point is on-edge if its xyz +// distance to that edge is less than LENGTH_EPS, irrespective of its distance +// in uv). So we linearize the surface about the point we're considering and +// then do the test. That preserves point-on-line relationships, and the only +// time we care about exact correctness is when we're very close to the line, +// which is when the linearization is accurate. +//----------------------------------------------------------------------------- +void SBspUv::ScalePoints(Point2d *pt, Point2d *a, Point2d *b, SSurface *srf) { + Vector tu, tv; + srf->TangentsAt(pt->x, pt->y, &tu, &tv); + double mu = tu.Magnitude(), mv = tv.Magnitude(); + + pt->x *= mu; pt->y *= mv; + a ->x *= mu; a ->y *= mv; + b ->x *= mu; b ->y *= mv; +} +double SBspUv::ScaledSignedDistanceToLine(Point2d pt, Point2d a, Point2d b, + SSurface *srf) +{ + ScalePoints(&pt, &a, &b, srf); + + Point2d n = ((b.Minus(a)).Normal()).WithMagnitude(1); + double d = a.Dot(n); + + return pt.Dot(n) - d; +} +double SBspUv::ScaledDistanceToLine(Point2d pt, Point2d a, Point2d b, bool seg, + SSurface *srf) +{ + ScalePoints(&pt, &a, &b, srf); + + return pt.DistanceToLine(a, b, seg); +} + +SBspUv *SBspUv::InsertOrCreateEdge(SBspUv *where, const Point2d &ea, const Point2d &eb, SSurface *srf) { + if(where == NULL) { + SBspUv *ret = Alloc(); + ret->a = ea; + ret->b = eb; + return ret; + } + where->InsertEdge(ea, eb, srf); + return where; +} + +void SBspUv::InsertEdge(Point2d ea, Point2d eb, SSurface *srf) { + double dea = ScaledSignedDistanceToLine(ea, a, b, srf), + deb = ScaledSignedDistanceToLine(eb, a, b, srf); + + if(fabs(dea) < LENGTH_EPS && fabs(deb) < LENGTH_EPS) { + // Line segment is coincident with this one, store in same node + SBspUv *m = Alloc(); + m->a = ea; + m->b = eb; + m->more = more; + more = m; + } else if(fabs(dea) < LENGTH_EPS) { + // Point A lies on this lie, but point B does not + if(deb > 0) { + pos = InsertOrCreateEdge(pos, ea, eb, srf); + } else { + neg = InsertOrCreateEdge(neg, ea, eb, srf); + } + } else if(fabs(deb) < LENGTH_EPS) { + // Point B lies on this lie, but point A does not + if(dea > 0) { + pos = InsertOrCreateEdge(pos, ea, eb, srf); + } else { + neg = InsertOrCreateEdge(neg, ea, eb, srf); + } + } else if(dea > 0 && deb > 0) { + pos = InsertOrCreateEdge(pos, ea, eb, srf); + } else if(dea < 0 && deb < 0) { + neg = InsertOrCreateEdge(neg, ea, eb, srf); + } else { + // New edge crosses this one; we need to split. + Point2d n = ((b.Minus(a)).Normal()).WithMagnitude(1); + double d = a.Dot(n); + double t = (d - n.Dot(ea)) / (n.Dot(eb.Minus(ea))); + Point2d pi = ea.Plus((eb.Minus(ea)).ScaledBy(t)); + if(dea > 0) { + pos = InsertOrCreateEdge(pos, ea, pi, srf); + neg = InsertOrCreateEdge(neg, pi, eb, srf); + } else { + neg = InsertOrCreateEdge(neg, ea, pi, srf); + pos = InsertOrCreateEdge(pos, pi, eb, srf); + } + } + return; +} + +int SBspUv::ClassifyPoint(Point2d p, Point2d eb, SSurface *srf) { + + double dp = ScaledSignedDistanceToLine(p, a, b, srf); + + if(fabs(dp) < LENGTH_EPS) { + SBspUv *f = this; + while(f) { + Point2d ba = (f->b).Minus(f->a); + if(ScaledDistanceToLine(p, f->a, ba, true, srf) < LENGTH_EPS) { + if(ScaledDistanceToLine(eb, f->a, ba, false, srf) < LENGTH_EPS){ + if(ba.Dot(eb.Minus(p)) > 0) { + return EDGE_PARALLEL; + } else { + return EDGE_ANTIPARALLEL; + } + } else { + return EDGE_OTHER; + } + } + f = f->more; + } + // Pick arbitrarily which side to send it down, doesn't matter + int c1 = neg ? neg->ClassifyPoint(p, eb, srf) : OUTSIDE; + int c2 = pos ? pos->ClassifyPoint(p, eb, srf) : INSIDE; + if(c1 != c2) { + dbp("MISMATCH: %d %d %08x %08x", c1, c2, neg, pos); + } + return c1; + } else if(dp > 0) { + return pos ? pos->ClassifyPoint(p, eb, srf) : INSIDE; + } else { + return neg ? neg->ClassifyPoint(p, eb, srf) : OUTSIDE; + } +} + +int SBspUv::ClassifyEdge(Point2d ea, Point2d eb, SSurface *srf) { + int ret = ClassifyPoint((ea.Plus(eb)).ScaledBy(0.5), eb, srf); + if(ret == EDGE_OTHER) { + // Perhaps the edge is tangent at its midpoint (and we screwed up + // somewhere earlier and failed to split it); try a different + // point on the edge. + ret = ClassifyPoint(ea.Plus((eb.Minus(ea)).ScaledBy(0.294)), eb, srf); + } + return ret; +} + +double SBspUv::MinimumDistanceToEdge(Point2d p, SSurface *srf) { + + double dn = (neg) ? neg->MinimumDistanceToEdge(p, srf) : VERY_POSITIVE; + double dp = (pos) ? pos->MinimumDistanceToEdge(p, srf) : VERY_POSITIVE; + + Point2d as = a, bs = b; + ScalePoints(&p, &as, &bs, srf); + double d = p.DistanceToLine(as, bs.Minus(as), true); + + return min(d, min(dn, dp)); +} + diff --git a/src/srf/curve.cpp b/src/srf/curve.cpp new file mode 100644 index 0000000..ba54afc --- /dev/null +++ b/src/srf/curve.cpp @@ -0,0 +1,848 @@ +//----------------------------------------------------------------------------- +// Anything involving curves and sets of curves (except for the real math, +// which is in ratpoly.cpp). +// +// Copyright 2008-2013 Jonathan Westhues. +//----------------------------------------------------------------------------- +#include "../solvespace.h" + +SBezier SBezier::From(Vector4 p0, Vector4 p1) { + SBezier ret = {}; + ret.deg = 1; + ret.weight[0] = p0.w; + ret.ctrl [0] = p0.PerspectiveProject(); + ret.weight[1] = p1.w; + ret.ctrl [1] = p1.PerspectiveProject(); + return ret; +} + +SBezier SBezier::From(Vector4 p0, Vector4 p1, Vector4 p2) { + SBezier ret = {}; + ret.deg = 2; + ret.weight[0] = p0.w; + ret.ctrl [0] = p0.PerspectiveProject(); + ret.weight[1] = p1.w; + ret.ctrl [1] = p1.PerspectiveProject(); + ret.weight[2] = p2.w; + ret.ctrl [2] = p2.PerspectiveProject(); + return ret; +} + +SBezier SBezier::From(Vector4 p0, Vector4 p1, Vector4 p2, Vector4 p3) { + SBezier ret = {}; + ret.deg = 3; + ret.weight[0] = p0.w; + ret.ctrl [0] = p0.PerspectiveProject(); + ret.weight[1] = p1.w; + ret.ctrl [1] = p1.PerspectiveProject(); + ret.weight[2] = p2.w; + ret.ctrl [2] = p2.PerspectiveProject(); + ret.weight[3] = p3.w; + ret.ctrl [3] = p3.PerspectiveProject(); + return ret; +} + +SBezier SBezier::From(Vector p0, Vector p1) { + return SBezier::From(p0.Project4d(), + p1.Project4d()); +} + +SBezier SBezier::From(Vector p0, Vector p1, Vector p2) { + return SBezier::From(p0.Project4d(), + p1.Project4d(), + p2.Project4d()); +} + +SBezier SBezier::From(Vector p0, Vector p1, Vector p2, Vector p3) { + return SBezier::From(p0.Project4d(), + p1.Project4d(), + p2.Project4d(), + p3.Project4d()); +} + +Vector SBezier::Start(void) { + return ctrl[0]; +} + +Vector SBezier::Finish(void) { + return ctrl[deg]; +} + +void SBezier::Reverse(void) { + int i; + for(i = 0; i < (deg+1)/2; i++) { + swap(ctrl[i], ctrl[deg-i]); + swap(weight[i], weight[deg-i]); + } +} + +void SBezier::ScaleSelfBy(double s) { + int i; + for(i = 0; i <= deg; i++) { + ctrl[i] = ctrl[i].ScaledBy(s); + } +} + +void SBezier::GetBoundingProjd(Vector u, Vector orig, + double *umin, double *umax) +{ + int i; + for(i = 0; i <= deg; i++) { + double ut = ((ctrl[i]).Minus(orig)).Dot(u); + if(ut < *umin) *umin = ut; + if(ut > *umax) *umax = ut; + } +} + +SBezier SBezier::TransformedBy(Vector t, Quaternion q, double scale) { + SBezier ret = *this; + int i; + for(i = 0; i <= deg; i++) { + ret.ctrl[i] = (ret.ctrl[i]).ScaledBy(scale); + ret.ctrl[i] = (q.Rotate(ret.ctrl[i])).Plus(t); + } + return ret; +} + +//----------------------------------------------------------------------------- +// Does this curve lie entirely within the specified plane? It does if all +// the control points lie in that plane. +//----------------------------------------------------------------------------- +bool SBezier::IsInPlane(Vector n, double d) { + int i; + for(i = 0; i <= deg; i++) { + if(fabs((ctrl[i]).Dot(n) - d) > LENGTH_EPS) { + return false; + } + } + return true; +} + +//----------------------------------------------------------------------------- +// Is this Bezier exactly the arc of a circle, projected along the specified +// axis? If yes, return that circle's center and radius. +//----------------------------------------------------------------------------- +bool SBezier::IsCircle(Vector axis, Vector *center, double *r) { + if(deg != 2) return false; + + if(ctrl[1].DistanceToLine(ctrl[0], ctrl[2].Minus(ctrl[0])) < LENGTH_EPS) { + // This is almost a line segment. So it's a circle with very large + // radius, which is likely to make code that tries to handle circles + // blow up. So return false. + return false; + } + + Vector t0 = (ctrl[0]).Minus(ctrl[1]), + t2 = (ctrl[2]).Minus(ctrl[1]), + r0 = axis.Cross(t0), + r2 = axis.Cross(t2); + + *center = Vector::AtIntersectionOfLines(ctrl[0], (ctrl[0]).Plus(r0), + ctrl[2], (ctrl[2]).Plus(r2), + NULL, NULL, NULL); + + double rd0 = center->Minus(ctrl[0]).Magnitude(), + rd2 = center->Minus(ctrl[2]).Magnitude(); + if(fabs(rd0 - rd2) > LENGTH_EPS) { + return false; + } + *r = rd0; + + Vector u = r0.WithMagnitude(1), + v = (axis.Cross(u)).WithMagnitude(1); + Point2d c2 = center->Project2d(u, v), + pa2 = (ctrl[0]).Project2d(u, v).Minus(c2), + pb2 = (ctrl[2]).Project2d(u, v).Minus(c2); + + double thetaa = atan2(pa2.y, pa2.x), // in fact always zero due to csys + thetab = atan2(pb2.y, pb2.x), + dtheta = WRAP_NOT_0(thetab - thetaa, 2*PI); + if(dtheta > PI) { + // Not possible with a second order Bezier arc; so we must have + // the points backwards. + dtheta = 2*PI - dtheta; + } + + if(fabs(weight[1] - cos(dtheta/2)) > LENGTH_EPS) { + return false; + } + + return true; +} + +bool SBezier::IsRational(void) { + int i; + for(i = 0; i <= deg; i++) { + if(fabs(weight[i] - 1) > LENGTH_EPS) return true; + } + return false; +} + +//----------------------------------------------------------------------------- +// Apply a perspective transformation to a rational Bezier curve, calculating +// the new weights as required. +//----------------------------------------------------------------------------- +SBezier SBezier::InPerspective(Vector u, Vector v, Vector n, + Vector origin, double cameraTan) +{ + Quaternion q = Quaternion::From(u, v); + q = q.Inverse(); + // we want Q*(p - o) = Q*p - Q*o + SBezier ret = this->TransformedBy(q.Rotate(origin).ScaledBy(-1), q, 1.0); + int i; + for(i = 0; i <= deg; i++) { + Vector4 ct = Vector4::From(ret.weight[i], ret.ctrl[i]); + // so the desired curve, before perspective, is + // (x/w, y/w, z/w) + // and after perspective is + // ((x/w)/(1 - (z/w)*cameraTan, ... + // = (x/(w - z*cameraTan), ... + // so we want to let w' = w - z*cameraTan + ct.w = ct.w - ct.z*cameraTan; + + ret.ctrl[i] = ct.PerspectiveProject(); + ret.weight[i] = ct.w; + } + return ret; +} + +bool SBezier::Equals(SBezier *b) { + // We just test of identical degree and control points, even though two + // curves could still be coincident (even sharing endpoints). + if(deg != b->deg) return false; + int i; + for(i = 0; i <= deg; i++) { + if(!(ctrl[i]).Equals(b->ctrl[i])) return false; + if(fabs(weight[i] - b->weight[i]) > LENGTH_EPS) return false; + } + return true; +} + +void SBezierList::Clear(void) { + l.Clear(); +} + +void SBezierList::ScaleSelfBy(double s) { + SBezier *sb; + for(sb = l.First(); sb; sb = l.NextAfter(sb)) { + sb->ScaleSelfBy(s); + } +} + +//----------------------------------------------------------------------------- +// If our list contains multiple identical Beziers (in either forward or +// reverse order), then cull them. +//----------------------------------------------------------------------------- +void SBezierList::CullIdenticalBeziers(void) { + int i, j; + + l.ClearTags(); + for(i = 0; i < l.n; i++) { + SBezier *bi = &(l.elem[i]), bir; + bir = *bi; + bir.Reverse(); + + for(j = i + 1; j < l.n; j++) { + SBezier *bj = &(l.elem[j]); + if(bj->Equals(bi) || + bj->Equals(&bir)) + { + bi->tag = 1; + bj->tag = 1; + } + } + } + l.RemoveTagged(); +} + +//----------------------------------------------------------------------------- +// Find all the points where a list of Bezier curves intersects another list +// of Bezier curves. We do this by intersecting their piecewise linearizations, +// and then refining any intersections that we find to lie exactly on the +// curves. So this will screw up on tangencies and stuff, but otherwise should +// be fine. +//----------------------------------------------------------------------------- +void SBezierList::AllIntersectionsWith(SBezierList *sblb, SPointList *spl) { + SBezier *sba, *sbb; + for(sba = l.First(); sba; sba = l.NextAfter(sba)) { + for(sbb = sblb->l.First(); sbb; sbb = sblb->l.NextAfter(sbb)) { + sbb->AllIntersectionsWith(sba, spl); + } + } +} +void SBezier::AllIntersectionsWith(SBezier *sbb, SPointList *spl) { + SPointList splRaw = {}; + SEdgeList sea, seb; + sea = {}; + seb = {}; + this->MakePwlInto(&sea); + sbb ->MakePwlInto(&seb); + SEdge *se; + for(se = sea.l.First(); se; se = sea.l.NextAfter(se)) { + // This isn't quite correct, since AnyEdgeCrossings doesn't count + // the case where two pairs of line segments intersect at their + // vertices. So this isn't robust, although that case isn't very + // likely. + seb.AnyEdgeCrossings(se->a, se->b, NULL, &splRaw); + } + SPoint *sp; + for(sp = splRaw.l.First(); sp; sp = splRaw.l.NextAfter(sp)) { + Vector p = sp->p; + if(PointOnThisAndCurve(sbb, &p)) { + if(!spl->ContainsPoint(p)) spl->Add(p); + } + } + sea.Clear(); + seb.Clear(); + splRaw.Clear(); +} + +//----------------------------------------------------------------------------- +// Find a plane that contains all of the curves in this list. If the curves +// are all colinear (or coincident, or empty), then that plane is not exactly +// determined but we choose the additional degree(s) of freedom arbitrarily. +// Returns true if all the curves are coplanar, otherwise false. +//----------------------------------------------------------------------------- +bool SBezierList::GetPlaneContainingBeziers(Vector *p, Vector *u, Vector *v, + Vector *notCoplanarAt) +{ + Vector pt, ptFar, ptOffLine, dp, n; + double farMax, offLineMax; + int i; + SBezier *sb; + + // Get any point on any Bezier; or an arbitrary point if list is empty. + if(l.n > 0) { + pt = l.elem[0].Start(); + } else { + pt = Vector::From(0, 0, 0); + } + ptFar = ptOffLine = pt; + + // Get the point farthest from our arbitrary point. + farMax = VERY_NEGATIVE; + for(sb = l.First(); sb; sb = l.NextAfter(sb)) { + for(i = 0; i <= sb->deg; i++) { + double m = (pt.Minus(sb->ctrl[i])).Magnitude(); + if(m > farMax) { + ptFar = sb->ctrl[i]; + farMax = m; + } + } + } + if(ptFar.Equals(pt)) { + // The points are all coincident. So neither basis vector matters. + *p = pt; + *u = Vector::From(1, 0, 0); + *v = Vector::From(0, 1, 0); + return true; + } + + // Get the point farthest from the line between pt and ptFar + dp = ptFar.Minus(pt); + offLineMax = VERY_NEGATIVE; + for(sb = l.First(); sb; sb = l.NextAfter(sb)) { + for(i = 0; i <= sb->deg; i++) { + double m = (sb->ctrl[i]).DistanceToLine(pt, dp); + if(m > offLineMax) { + ptOffLine = sb->ctrl[i]; + offLineMax = m; + } + } + } + + *p = pt; + if(offLineMax < LENGTH_EPS) { + // The points are all colinear; so choose the second basis vector + // arbitrarily. + *u = (ptFar.Minus(pt)).WithMagnitude(1); + *v = (u->Normal(0)).WithMagnitude(1); + } else { + // The points actually define a plane. + n = (ptFar.Minus(pt)).Cross(ptOffLine.Minus(pt)); + *u = (n.Normal(0)).WithMagnitude(1); + *v = (n.Normal(1)).WithMagnitude(1); + } + + // So we have a plane; but check whether all of the points lie in that + // plane. + n = u->Cross(*v); + n = n.WithMagnitude(1); + double d = p->Dot(n); + for(sb = l.First(); sb; sb = l.NextAfter(sb)) { + for(i = 0; i <= sb->deg; i++) { + if(fabs(n.Dot(sb->ctrl[i]) - d) > LENGTH_EPS) { + if(notCoplanarAt) *notCoplanarAt = sb->ctrl[i]; + return false; + } + } + } + return true; +} + +//----------------------------------------------------------------------------- +// Assemble curves in sbl into a single loop. The curves may appear in any +// direction (start to finish, or finish to start), and will be reversed if +// necessary. The curves in the returned loop are removed from sbl, even if +// the loop cannot be closed. +//----------------------------------------------------------------------------- +SBezierLoop SBezierLoop::FromCurves(SBezierList *sbl, + bool *allClosed, SEdge *errorAt) +{ + SBezierLoop loop = {}; + + if(sbl->l.n < 1) return loop; + sbl->l.ClearTags(); + + SBezier *first = &(sbl->l.elem[0]); + first->tag = 1; + loop.l.Add(first); + Vector start = first->Start(); + Vector hanging = first->Finish(); + int auxA = first->auxA; + + sbl->l.RemoveTagged(); + + while(sbl->l.n > 0 && !hanging.Equals(start)) { + int i; + bool foundNext = false; + for(i = 0; i < sbl->l.n; i++) { + SBezier *test = &(sbl->l.elem[i]); + + if((test->Finish()).Equals(hanging) && test->auxA == auxA) { + test->Reverse(); + // and let the next test catch it + } + if((test->Start()).Equals(hanging) && test->auxA == auxA) { + test->tag = 1; + loop.l.Add(test); + hanging = test->Finish(); + sbl->l.RemoveTagged(); + foundNext = true; + break; + } + } + if(!foundNext) { + // The loop completed without finding the hanging edge, so + // it's an open loop + errorAt->a = hanging; + errorAt->b = start; + *allClosed = false; + return loop; + } + } + if(hanging.Equals(start)) { + *allClosed = true; + } else { + // We ran out of edges without forming a closed loop. + errorAt->a = hanging; + errorAt->b = start; + *allClosed = false; + } + + return loop; +} + +void SBezierLoop::Reverse(void) { + l.Reverse(); + SBezier *sb; + for(sb = l.First(); sb; sb = l.NextAfter(sb)) { + // If we didn't reverse each curve, then the next curve in list would + // share your start, not your finish. + sb->Reverse(); + } +} + +void SBezierLoop::GetBoundingProjd(Vector u, Vector orig, + double *umin, double *umax) +{ + SBezier *sb; + for(sb = l.First(); sb; sb = l.NextAfter(sb)) { + sb->GetBoundingProjd(u, orig, umin, umax); + } +} + +void SBezierLoop::MakePwlInto(SContour *sc, double chordTol) { + SBezier *sb; + for(sb = l.First(); sb; sb = l.NextAfter(sb)) { + sb->MakePwlInto(sc, chordTol); + // Avoid double points at join between Beziers; except that + // first and last points should be identical. + if(l.NextAfter(sb) != NULL) { + sc->l.RemoveLast(1); + } + } + // Ensure that it's exactly closed, not just within a numerical tolerance. + if((sc->l.elem[sc->l.n - 1].p).Equals(sc->l.elem[0].p)) { + sc->l.elem[sc->l.n - 1] = sc->l.elem[0]; + } +} + +bool SBezierLoop::IsClosed(void) { + if(l.n < 1) return false; + Vector s = l.elem[0].Start(), + f = l.elem[l.n-1].Finish(); + return s.Equals(f); +} + + +//----------------------------------------------------------------------------- +// Assemble the curves in sbl into multiple loops, and piecewise linearize the +// curves into poly. If we can't close a contour, then we add it to +// openContours (if that isn't NULL) and keep going; so this works even if the +// input contains a mix of open and closed curves. +//----------------------------------------------------------------------------- +SBezierLoopSet SBezierLoopSet::From(SBezierList *sbl, SPolygon *poly, + double chordTol, + bool *allClosed, SEdge *errorAt, + SBezierList *openContours) +{ + SBezierLoopSet ret = {}; + + *allClosed = true; + while(sbl->l.n > 0) { + bool thisClosed; + SBezierLoop loop; + loop = SBezierLoop::FromCurves(sbl, &thisClosed, errorAt); + if(!thisClosed) { + // Record open loops in a separate list, if requested. + *allClosed = false; + if(openContours) { + SBezier *sb; + for(sb = loop.l.First(); sb; sb = loop.l.NextAfter(sb)) { + openContours->l.Add(sb); + } + } + loop.Clear(); + } else { + ret.l.Add(&loop); + poly->AddEmptyContour(); + loop.MakePwlInto(&(poly->l.elem[poly->l.n-1]), chordTol); + } + } + + poly->normal = poly->ComputeNormal(); + ret.normal = poly->normal; + if(poly->l.n > 0) { + ret.point = poly->AnyPoint(); + } else { + ret.point = Vector::From(0, 0, 0); + } + + return ret; +} + +void SBezierLoopSet::GetBoundingProjd(Vector u, Vector orig, + double *umin, double *umax) +{ + SBezierLoop *sbl; + for(sbl = l.First(); sbl; sbl = l.NextAfter(sbl)) { + sbl->GetBoundingProjd(u, orig, umin, umax); + } +} + +//----------------------------------------------------------------------------- +// Convert all the Beziers into piecewise linear form, and assemble that into +// a polygon, one contour per loop. +//----------------------------------------------------------------------------- +void SBezierLoopSet::MakePwlInto(SPolygon *sp) { + SBezierLoop *sbl; + for(sbl = l.First(); sbl; sbl = l.NextAfter(sbl)) { + sp->AddEmptyContour(); + sbl->MakePwlInto(&(sp->l.elem[sp->l.n - 1])); + } +} + +void SBezierLoopSet::Clear(void) { + int i; + for(i = 0; i < l.n; i++) { + (l.elem[i]).Clear(); + } + l.Clear(); +} + +//----------------------------------------------------------------------------- +// An export helper function. We start with a list of Bezier curves, and +// assemble them into loops. We find the outer loops, and find the outer loops' +// inner loops, and group them accordingly. +//----------------------------------------------------------------------------- +void SBezierLoopSetSet::FindOuterFacesFrom(SBezierList *sbl, SPolygon *spxyz, + SSurface *srfuv, + double chordTol, + bool *allClosed, SEdge *notClosedAt, + bool *allCoplanar, Vector *notCoplanarAt, + SBezierList *openContours) +{ + SSurface srfPlane; + if(!srfuv) { + Vector p, u, v; + *allCoplanar = + sbl->GetPlaneContainingBeziers(&p, &u, &v, notCoplanarAt); + if(!*allCoplanar) { + // Don't even try to assemble them into loops if they're not + // all coplanar. + if(openContours) { + SBezier *sb; + for(sb = sbl->l.First(); sb; sb = sbl->l.NextAfter(sb)) { + openContours->l.Add(sb); + } + } + return; + } + // All the curves lie in a plane through p with basis vectors u and v. + srfPlane = SSurface::FromPlane(p, u, v); + srfuv = &srfPlane; + } + + int i, j; + // Assemble the Bezier trim curves into closed loops; we also get the + // piecewise linearization of the curves (in the SPolygon spxyz), as a + // calculation aid for the loop direction. + SBezierLoopSet sbls = SBezierLoopSet::From(sbl, spxyz, chordTol, + allClosed, notClosedAt, + openContours); + if(sbls.l.n != spxyz->l.n) return; + + // Convert the xyz piecewise linear to uv piecewise linear. + SPolygon spuv = {}; + SContour *sc; + for(sc = spxyz->l.First(); sc; sc = spxyz->l.NextAfter(sc)) { + spuv.AddEmptyContour(); + SPoint *pt; + for(pt = sc->l.First(); pt; pt = sc->l.NextAfter(pt)) { + double u, v; + srfuv->ClosestPointTo(pt->p, &u, &v); + spuv.l.elem[spuv.l.n - 1].AddPoint(Vector::From(u, v, 0)); + } + } + spuv.normal = Vector::From(0, 0, 1); // must be, since it's in xy plane now + + static const int OUTER_LOOP = 10; + static const int INNER_LOOP = 20; + static const int USED_LOOP = 30; + // Fix the contour directions; we do this properly, in uv space, so it + // works for curved surfaces too (important for STEP export). + spuv.FixContourDirections(); + for(i = 0; i < spuv.l.n; i++) { + SContour *contour = &(spuv.l.elem[i]); + SBezierLoop *bl = &(sbls.l.elem[i]); + if(contour->tag) { + // This contour got reversed in the polygon to make the directions + // consistent, so the same must be necessary for the Bezier loop. + bl->Reverse(); + } + if(contour->IsClockwiseProjdToNormal(spuv.normal)) { + bl->tag = INNER_LOOP; + } else { + bl->tag = OUTER_LOOP; + } + } + + bool loopsRemaining = true; + while(loopsRemaining) { + loopsRemaining = false; + for(i = 0; i < sbls.l.n; i++) { + SBezierLoop *loop = &(sbls.l.elem[i]); + if(loop->tag != OUTER_LOOP) continue; + + // Check if this contour contains any outer loops; if it does, then + // we should do those "inner outer loops" first; otherwise we + // will steal their holes, since their holes also lie inside this + // contour. + for(j = 0; j < sbls.l.n; j++) { + SBezierLoop *outer = &(sbls.l.elem[j]); + if(i == j) continue; + if(outer->tag != OUTER_LOOP) continue; + + Vector p = spuv.l.elem[j].AnyEdgeMidpoint(); + if(spuv.l.elem[i].ContainsPointProjdToNormal(spuv.normal, p)) { + break; + } + } + if(j < sbls.l.n) { + // It does, can't do this one yet. + continue; + } + + SBezierLoopSet outerAndInners = {}; + loopsRemaining = true; + loop->tag = USED_LOOP; + outerAndInners.l.Add(loop); + int auxA = 0; + if(loop->l.n > 0) auxA = loop->l.elem[0].auxA; + + for(j = 0; j < sbls.l.n; j++) { + SBezierLoop *inner = &(sbls.l.elem[j]); + if(inner->tag != INNER_LOOP) continue; + if(inner->l.n < 1) continue; + if(inner->l.elem[0].auxA != auxA) continue; + + Vector p = spuv.l.elem[j].AnyEdgeMidpoint(); + if(spuv.l.elem[i].ContainsPointProjdToNormal(spuv.normal, p)) { + outerAndInners.l.Add(inner); + inner->tag = USED_LOOP; + } + } + + outerAndInners.point = srfuv->PointAt(0, 0); + outerAndInners.normal = srfuv->NormalAt(0, 0); + l.Add(&outerAndInners); + } + } + + // If we have poorly-formed loops--for example, overlapping zero-area + // stuff--then we can end up with leftovers. We use this function to + // group stuff into closed paths for export when possible, so it's bad + // to screw up on that stuff. So just add them onto the open curve list. + // Very ugly, but better than losing curves. + for(i = 0; i < sbls.l.n; i++) { + SBezierLoop *loop = &(sbls.l.elem[i]); + if(loop->tag == USED_LOOP) continue; + + if(openContours) { + SBezier *sb; + for(sb = loop->l.First(); sb; sb = loop->l.NextAfter(sb)) { + openContours->l.Add(sb); + } + } + loop->Clear(); + // but don't free the used loops, since we shallow-copied them to + // ourself + } + + sbls.l.Clear(); // not sbls.Clear(), since that would deep-clear + spuv.Clear(); +} + +void SBezierLoopSetSet::AddOpenPath(SBezier *sb) { + SBezierLoop sbl = {}; + sbl.l.Add(sb); + + SBezierLoopSet sbls = {}; + sbls.l.Add(&sbl); + + l.Add(&sbls); +} + +void SBezierLoopSetSet::Clear(void) { + SBezierLoopSet *sbls; + for(sbls = l.First(); sbls; sbls = l.NextAfter(sbls)) { + sbls->Clear(); + } + l.Clear(); +} + +SCurve SCurve::FromTransformationOf(SCurve *a, + Vector t, Quaternion q, double scale) +{ + SCurve ret = {}; + + ret.h = a->h; + ret.isExact = a->isExact; + ret.exact = (a->exact).TransformedBy(t, q, scale); + ret.surfA = a->surfA; + ret.surfB = a->surfB; + + SCurvePt *p; + for(p = a->pts.First(); p; p = a->pts.NextAfter(p)) { + SCurvePt pp = *p; + pp.p = (pp.p).ScaledBy(scale); + pp.p = (q.Rotate(pp.p)).Plus(t); + ret.pts.Add(&pp); + } + return ret; +} + +void SCurve::Clear(void) { + pts.Clear(); +} + +SSurface *SCurve::GetSurfaceA(SShell *a, SShell *b) { + if(source == FROM_A) { + return a->surface.FindById(surfA); + } else if(source == FROM_B) { + return b->surface.FindById(surfA); + } else if(source == FROM_INTERSECTION) { + return a->surface.FindById(surfA); + } else oops(); +} + +SSurface *SCurve::GetSurfaceB(SShell *a, SShell *b) { + if(source == FROM_A) { + return a->surface.FindById(surfB); + } else if(source == FROM_B) { + return b->surface.FindById(surfB); + } else if(source == FROM_INTERSECTION) { + return b->surface.FindById(surfB); + } else oops(); +} + +//----------------------------------------------------------------------------- +// When we split line segments wherever they intersect a surface, we introduce +// extra pwl points. This may create very short edges that could be removed +// without violating the chord tolerance. Those are ugly, and also break +// stuff in the Booleans. So remove them. +//----------------------------------------------------------------------------- +void SCurve::RemoveShortSegments(SSurface *srfA, SSurface *srfB) { + // Three, not two; curves are pwl'd to at least two edges (three points) + // even if not necessary, to avoid square holes. + if(pts.n <= 3) return; + pts.ClearTags(); + + Vector prev = pts.elem[0].p; + int i, a; + for(i = 1; i < pts.n - 1; i++) { + SCurvePt *sct = &(pts.elem[i]), + *scn = &(pts.elem[i+1]); + if(sct->vertex) { + prev = sct->p; + continue; + } + bool mustKeep = false; + + // We must check against both surfaces; the piecewise linear edge + // may have a different chord tolerance in the two surfaces. (For + // example, a circle in the surface of a cylinder is just a straight + // line, so it always has perfect chord tol, but that circle in + // a plane is a circle so it doesn't). + for(a = 0; a < 2; a++) { + SSurface *srf = (a == 0) ? srfA : srfB; + Vector puv, nuv; + srf->ClosestPointTo(prev, &(puv.x), &(puv.y)); + srf->ClosestPointTo(scn->p, &(nuv.x), &(nuv.y)); + + if(srf->ChordToleranceForEdge(nuv, puv) > SS.ChordTolMm()) { + mustKeep = true; + } + } + + if(mustKeep) { + prev = sct->p; + } else { + sct->tag = 1; + // and prev is unchanged, since there's no longer any point + // in between + } + } + + pts.RemoveTagged(); +} + +STrimBy STrimBy::EntireCurve(SShell *shell, hSCurve hsc, bool backwards) { + STrimBy stb = {}; + stb.curve = hsc; + SCurve *sc = shell->curve.FindById(hsc); + + if(backwards) { + stb.finish = sc->pts.elem[0].p; + stb.start = sc->pts.elem[sc->pts.n - 1].p; + stb.backwards = true; + } else { + stb.start = sc->pts.elem[0].p; + stb.finish = sc->pts.elem[sc->pts.n - 1].p; + stb.backwards = false; + } + + return stb; +} + diff --git a/src/srf/merge.cpp b/src/srf/merge.cpp new file mode 100644 index 0000000..487fb92 --- /dev/null +++ b/src/srf/merge.cpp @@ -0,0 +1,127 @@ +//----------------------------------------------------------------------------- +// Routines to merge multiple coincident surfaces (each with their own trim +// curves) into a single surface, with all of the trim curves. +// +// Copyright 2008-2013 Jonathan Westhues. +//----------------------------------------------------------------------------- +#include "../solvespace.h" + +void SShell::MergeCoincidentSurfaces(void) { + surface.ClearTags(); + + int i, j; + SSurface *si, *sj; + + for(i = 0; i < surface.n; i++) { + si = &(surface.elem[i]); + if(si->tag) continue; + // Let someone else clean up the empty surfaces; we can certainly merge + // them, but we don't know how to calculate a reasonable bounding box. + if(si->trim.n == 0) continue; + // And for now we handle only coincident planes, so no sense wasting + // time on other surfaces. + if(si->degm != 1 || si->degn != 1) continue; + + SEdgeList sel = {}; + si->MakeEdgesInto(this, &sel, SSurface::AS_XYZ); + + bool mergedThisTime, merged = false; + do { + mergedThisTime = false; + + for(j = i + 1; j < surface.n; j++) { + sj = &(surface.elem[j]); + if(sj->tag) continue; + if(!sj->CoincidentWith(si, true)) continue; + if(!sj->color.Equals(si->color)) continue; + // But we do merge surfaces with different face entities, since + // otherwise we'd hardly ever merge anything. + + // This surface is coincident. But let's not merge coincident + // surfaces if they contain disjoint contours; that just makes + // the bounding box tests less effective, and possibly things + // less robust. + SEdgeList tel = {}; + sj->MakeEdgesInto(this, &tel, SSurface::AS_XYZ); + if(!sel.ContainsEdgeFrom(&tel)) { + tel.Clear(); + continue; + } + tel.Clear(); + + sj->tag = 1; + merged = true; + mergedThisTime = true; + sj->MakeEdgesInto(this, &sel, SSurface::AS_XYZ); + sj->trim.Clear(); + + // All the references to this surface get replaced with the + // new srf + SCurve *sc; + for(sc = curve.First(); sc; sc = curve.NextAfter(sc)) { + if(sc->surfA.v == sj->h.v) sc->surfA = si->h; + if(sc->surfB.v == sj->h.v) sc->surfB = si->h; + } + } + + // If this iteration merged a contour onto ours, then we have to + // go through the surfaces again; that might have made a new + // surface touch us. + } while(mergedThisTime); + + if(merged) { + sel.CullExtraneousEdges(); + si->trim.Clear(); + si->TrimFromEdgeList(&sel, false); + + // And we must choose control points such that all the trims lie + // with u and v in [0, 1], so that the bbox tests work. + Vector u, v, n; + si->TangentsAt(0.5, 0.5, &u, &v); + u = u.WithMagnitude(1); + v = v.WithMagnitude(1); + n = si->NormalAt(0.5, 0.5).WithMagnitude(1); + v = (n.Cross(u)).WithMagnitude(1); + + double umax = VERY_NEGATIVE, umin = VERY_POSITIVE, + vmax = VERY_NEGATIVE, vmin = VERY_POSITIVE; + SEdge *se; + for(se = sel.l.First(); se; se = sel.l.NextAfter(se)) { + double ut = (se->a).Dot(u), vt = (se->a).Dot(v); + umax = max(umax, ut); + vmax = max(vmax, vt); + umin = min(umin, ut); + vmin = min(vmin, vt); + } + + // An interesting problem here; the real curve could extend + // slightly beyond the bounding box of the piecewise linear + // bits. Not a problem for us, but some apps won't import STEP + // in that case. So give a bit of extra room; in theory just + // a chord tolerance, but more can't hurt. + double muv = max((umax - umin), (vmax - vmin)); + double tol = muv/50 + 3*SS.ChordTolMm(); + umax += tol; + vmax += tol; + umin -= tol; + vmin -= tol; + + // We move in the +v direction as v goes from 0 to 1, and in the + // +u direction as u goes from 0 to 1. So our normal ends up + // pointed the same direction. + double nt = (si->ctrl[0][0]).Dot(n); + si->ctrl[0][0] = + Vector::From(umin, vmin, nt).ScaleOutOfCsys(u, v, n); + si->ctrl[0][1] = + Vector::From(umin, vmax, nt).ScaleOutOfCsys(u, v, n); + si->ctrl[1][1] = + Vector::From(umax, vmax, nt).ScaleOutOfCsys(u, v, n); + si->ctrl[1][0] = + Vector::From(umax, vmin, nt).ScaleOutOfCsys(u, v, n); + } + sel.Clear(); + } + + surface.RemoveTagged(); +} + diff --git a/src/srf/ratpoly.cpp b/src/srf/ratpoly.cpp new file mode 100644 index 0000000..2f6a0bb --- /dev/null +++ b/src/srf/ratpoly.cpp @@ -0,0 +1,615 @@ +//----------------------------------------------------------------------------- +// Math on rational polynomial surfaces and curves, typically in Bezier +// form. Evaluate, root-find (by Newton's methods), evaluate derivatives, +// and so on. +// +// Copyright 2008-2013 Jonathan Westhues. +//----------------------------------------------------------------------------- +#include "../solvespace.h" + +// Converge it to better than LENGTH_EPS; we want two points, each +// independently projected into uv and back, to end up equal with the +// LENGTH_EPS. Best case that requires LENGTH_EPS/2, but more is better +// and convergence should be fast by now. +#define RATPOLY_EPS (LENGTH_EPS/(1e2)) + +double SolveSpace::Bernstein(int k, int deg, double t) +{ + if(k > deg || k < 0) return 0; + + switch(deg) { + case 0: + return 1; + + case 1: + if(k == 0) { + return (1 - t); + } else if(k == 1) { + return t; + } + break; + + case 2: + if(k == 0) { + return (1 - t)*(1 - t); + } else if(k == 1) { + return 2*(1 - t)*t; + } else if(k == 2) { + return t*t; + } + break; + + case 3: + if(k == 0) { + return (1 - t)*(1 - t)*(1 - t); + } else if(k == 1) { + return 3*(1 - t)*(1 - t)*t; + } else if(k == 2) { + return 3*(1 - t)*t*t; + } else if(k == 3) { + return t*t*t; + } + break; + } + oops(); +} + +double SolveSpace::BernsteinDerivative(int k, int deg, double t) +{ + switch(deg) { + case 0: + return 0; + + case 1: + if(k == 0) { + return -1; + } else if(k == 1) { + return 1; + } + break; + + case 2: + if(k == 0) { + return -2 + 2*t; + } else if(k == 1) { + return 2 - 4*t; + } else if(k == 2) { + return 2*t; + } + break; + + case 3: + if(k == 0) { + return -3 + 6*t - 3*t*t; + } else if(k == 1) { + return 3 - 12*t + 9*t*t; + } else if(k == 2) { + return 6*t - 9*t*t; + } else if(k == 3) { + return 3*t*t; + } + break; + } + oops(); +} + +Vector SBezier::PointAt(double t) { + Vector pt = Vector::From(0, 0, 0); + double d = 0; + + int i; + for(i = 0; i <= deg; i++) { + double B = Bernstein(i, deg, t); + pt = pt.Plus(ctrl[i].ScaledBy(B*weight[i])); + d += weight[i]*B; + } + pt = pt.ScaledBy(1.0/d); + return pt; +} + +Vector SBezier::TangentAt(double t) { + Vector pt = Vector::From(0, 0, 0), pt_p = Vector::From(0, 0, 0); + double d = 0, d_p = 0; + + int i; + for(i = 0; i <= deg; i++) { + double B = Bernstein(i, deg, t), + Bp = BernsteinDerivative(i, deg, t); + + pt = pt.Plus(ctrl[i].ScaledBy(B*weight[i])); + d += weight[i]*B; + + pt_p = pt_p.Plus(ctrl[i].ScaledBy(Bp*weight[i])); + d_p += weight[i]*Bp; + } + + // quotient rule; f(t) = n(t)/d(t), so f' = (n'*d - n*d')/(d^2) + Vector ret; + ret = (pt_p.ScaledBy(d)).Minus(pt.ScaledBy(d_p)); + ret = ret.ScaledBy(1.0/(d*d)); + return ret; +} + +void SBezier::ClosestPointTo(Vector p, double *t, bool converge) { + int i; + double minDist = VERY_POSITIVE; + *t = 0; + double res = (deg <= 2) ? 7.0 : 20.0; + for(i = 0; i < (int)res; i++) { + double tryt = (i/res); + + Vector tryp = PointAt(tryt); + double d = (tryp.Minus(p)).Magnitude(); + if(d < minDist) { + *t = tryt; + minDist = d; + } + } + + Vector p0; + for(i = 0; i < (converge ? 15 : 5); i++) { + p0 = PointAt(*t); + if(p0.Equals(p, RATPOLY_EPS)) { + return; + } + + Vector dp = TangentAt(*t); + Vector pc = p.ClosestPointOnLine(p0, dp); + *t += (pc.Minus(p0)).DivPivoting(dp); + } + if(converge) { + dbp("didn't converge (closest point on bezier curve)"); + } +} + +bool SBezier::PointOnThisAndCurve(SBezier *sbb, Vector *p) { + double ta, tb; + this->ClosestPointTo(*p, &ta, false); + sbb ->ClosestPointTo(*p, &tb, false); + + int i; + for(i = 0; i < 20; i++) { + Vector pa = this->PointAt(ta), + pb = sbb ->PointAt(tb), + da = this->TangentAt(ta), + db = sbb ->TangentAt(tb); + + if(pa.Equals(pb, RATPOLY_EPS)) { + *p = pa; + return true; + } + + double tta, ttb; + Vector::ClosestPointBetweenLines(pa, da, pb, db, &tta, &ttb); + ta += tta; + tb += ttb; + } + return false; +} + +void SBezier::SplitAt(double t, SBezier *bef, SBezier *aft) { + Vector4 ct[4]; + int i; + for(i = 0; i <= deg; i++) { + ct[i] = Vector4::From(weight[i], ctrl[i]); + } + + switch(deg) { + case 1: { + Vector4 cts = Vector4::Blend(ct[0], ct[1], t); + *bef = SBezier::From(ct[0], cts); + *aft = SBezier::From(cts, ct[1]); + break; + } + case 2: { + Vector4 ct01 = Vector4::Blend(ct[0], ct[1], t), + ct12 = Vector4::Blend(ct[1], ct[2], t), + cts = Vector4::Blend(ct01, ct12, t); + + *bef = SBezier::From(ct[0], ct01, cts); + *aft = SBezier::From(cts, ct12, ct[2]); + break; + } + case 3: { + Vector4 ct01 = Vector4::Blend(ct[0], ct[1], t), + ct12 = Vector4::Blend(ct[1], ct[2], t), + ct23 = Vector4::Blend(ct[2], ct[3], t), + ct01_12 = Vector4::Blend(ct01, ct12, t), + ct12_23 = Vector4::Blend(ct12, ct23, t), + cts = Vector4::Blend(ct01_12, ct12_23, t); + + *bef = SBezier::From(ct[0], ct01, ct01_12, cts); + *aft = SBezier::From(cts, ct12_23, ct23, ct[3]); + break; + } + default: oops(); + } +} + +void SBezier::MakePwlInto(SEdgeList *sel, double chordTol) { + List lv = {}; + MakePwlInto(&lv, chordTol); + int i; + for(i = 1; i < lv.n; i++) { + sel->AddEdge(lv.elem[i-1], lv.elem[i]); + } + lv.Clear(); +} +void SBezier::MakePwlInto(List *l, double chordTol) { + List lv = {}; + MakePwlInto(&lv, chordTol); + int i; + for(i = 0; i < lv.n; i++) { + SCurvePt scpt; + scpt.tag = 0; + scpt.p = lv.elem[i]; + scpt.vertex = (i == 0) || (i == (lv.n - 1)); + l->Add(&scpt); + } + lv.Clear(); +} +void SBezier::MakePwlInto(SContour *sc, double chordTol) { + List lv = {}; + MakePwlInto(&lv, chordTol); + int i; + for(i = 0; i < lv.n; i++) { + sc->AddPoint(lv.elem[i]); + } + lv.Clear(); +} +void SBezier::MakePwlInto(List *l, double chordTol) { + if(EXACT(chordTol == 0)) { + // Use the default chord tolerance. + chordTol = SS.ChordTolMm(); + } + l->Add(&(ctrl[0])); + if(deg == 1) { + l->Add(&(ctrl[1])); + } else { + // Never do fewer than one intermediate point; people seem to get + // unhappy when their circles turn into squares, but maybe less + // unhappy with octagons. + MakePwlInitialWorker(l, 0.0, 0.5, chordTol); + MakePwlInitialWorker(l, 0.5, 1.0, chordTol); + } +} +void SBezier::MakePwlWorker(List *l, double ta, double tb, double chordTol) +{ + Vector pa = PointAt(ta); + Vector pb = PointAt(tb); + + Vector pm = PointAt((ta + tb) / 2.0); + double d = pm.DistanceToLine(pa, pb.Minus(pa)); + + double step = 1.0/SS.GetMaxSegments(); + if((tb - ta) < step || d < chordTol) { + // A previous call has already added the beginning of our interval. + l->Add(&pb); + } else { + double tm = (ta + tb) / 2; + MakePwlWorker(l, ta, tm, chordTol); + MakePwlWorker(l, tm, tb, chordTol); + } +} +void SBezier::MakePwlInitialWorker(List *l, double ta, double tb, double chordTol) +{ + Vector pa = PointAt(ta); + Vector pb = PointAt(tb); + + double tm1 = ta + (tb - ta) * 0.25; + double tm2 = ta + (tb - ta) * 0.5; + double tm3 = ta + (tb - ta) * 0.75; + + Vector pm1 = PointAt(tm1); + Vector pm2 = PointAt(tm2); + Vector pm3 = PointAt(tm3); + Vector dir = pb.Minus(pa); + + double d = max({ + pm1.DistanceToLine(pa, dir), + pm2.DistanceToLine(pa, dir), + pm3.DistanceToLine(pa, dir) + }); + + double step = 1.0/SS.GetMaxSegments(); + if((tb - ta) < step || d < chordTol) { + // A previous call has already added the beginning of our interval. + l->Add(&pb); + } else { + double tm = (ta + tb) / 2; + MakePwlWorker(l, ta, tm, chordTol); + MakePwlWorker(l, tm, tb, chordTol); + } +} + +Vector SSurface::PointAt(Point2d puv) { + return PointAt(puv.x, puv.y); +} +Vector SSurface::PointAt(double u, double v) { + Vector num = Vector::From(0, 0, 0); + double den = 0; + + int i, j; + for(i = 0; i <= degm; i++) { + for(j = 0; j <= degn; j++) { + double Bi = Bernstein(i, degm, u), + Bj = Bernstein(j, degn, v); + + num = num.Plus(ctrl[i][j].ScaledBy(Bi*Bj*weight[i][j])); + den += weight[i][j]*Bi*Bj; + } + } + num = num.ScaledBy(1.0/den); + return num; +} + +void SSurface::TangentsAt(double u, double v, Vector *tu, Vector *tv) { + Vector num = Vector::From(0, 0, 0), + num_u = Vector::From(0, 0, 0), + num_v = Vector::From(0, 0, 0); + double den = 0, + den_u = 0, + den_v = 0; + + int i, j; + for(i = 0; i <= degm; i++) { + for(j = 0; j <= degn; j++) { + double Bi = Bernstein(i, degm, u), + Bj = Bernstein(j, degn, v), + Bip = BernsteinDerivative(i, degm, u), + Bjp = BernsteinDerivative(j, degn, v); + + num = num.Plus(ctrl[i][j].ScaledBy(Bi*Bj*weight[i][j])); + den += weight[i][j]*Bi*Bj; + + num_u = num_u.Plus(ctrl[i][j].ScaledBy(Bip*Bj*weight[i][j])); + den_u += weight[i][j]*Bip*Bj; + + num_v = num_v.Plus(ctrl[i][j].ScaledBy(Bi*Bjp*weight[i][j])); + den_v += weight[i][j]*Bi*Bjp; + } + } + // quotient rule; f(t) = n(t)/d(t), so f' = (n'*d - n*d')/(d^2) + *tu = ((num_u.ScaledBy(den)).Minus(num.ScaledBy(den_u))); + *tu = tu->ScaledBy(1.0/(den*den)); + + *tv = ((num_v.ScaledBy(den)).Minus(num.ScaledBy(den_v))); + *tv = tv->ScaledBy(1.0/(den*den)); +} + +Vector SSurface::NormalAt(Point2d puv) { + return NormalAt(puv.x, puv.y); +} +Vector SSurface::NormalAt(double u, double v) { + Vector tu, tv; + TangentsAt(u, v, &tu, &tv); + return tu.Cross(tv); +} + +void SSurface::ClosestPointTo(Vector p, Point2d *puv, bool converge) { + ClosestPointTo(p, &(puv->x), &(puv->y), converge); +} +void SSurface::ClosestPointTo(Vector p, double *u, double *v, bool converge) { + // A few special cases first; when control points are coincident the + // derivative goes to zero at the conrol points, and would result in + // nonconvergence. We avoid that here, and also guarantee a consistent + // (u, v) (of the infinitely many possible in one parameter). + if(p.Equals(ctrl[0] [0] )) { *u = 0; *v = 0; return; } + if(p.Equals(ctrl[degm][0] )) { *u = 1; *v = 0; return; } + if(p.Equals(ctrl[degm][degn])) { *u = 1; *v = 1; return; } + if(p.Equals(ctrl[0] [degn])) { *u = 0; *v = 1; return; } + + // And planes are trivial, so don't waste time iterating over those. + if(degm == 1 && degn == 1) { + Vector orig = ctrl[0][0], + bu = (ctrl[1][0]).Minus(orig), + bv = (ctrl[0][1]).Minus(orig); + if((ctrl[1][1]).Equals(orig.Plus(bu).Plus(bv))) { + Vector dp = p.Minus(orig); + *u = dp.Dot(bu) / bu.MagSquared(); + *v = dp.Dot(bv) / bv.MagSquared(); + return; + } + } + + // Try whatever the previous guess was. This is likely to do something + // good if we're working our way along a curve or something else where + // we project successive points that are close to each other; something + // like a 20% speedup empirically. + if(converge) { + double ut = cached.x, vt = cached.y; + if(ClosestPointNewton(p, &ut, &vt, converge)) { + cached.x = *u = ut; + cached.y = *v = vt; + return; + } + } + + // Search for a reasonable initial guess + int i, j; + double minDist = VERY_POSITIVE; + int res = (max(degm, degn) == 2) ? 7 : 20; + for(i = 0; i < res; i++) { + for(j = 0; j < res; j++) { + double tryu = (i + 0.5)/res, tryv = (j + 0.5)/res; + + Vector tryp = PointAt(tryu, tryv); + double d = (tryp.Minus(p)).Magnitude(); + if(d < minDist) { + *u = tryu; + *v = tryv; + minDist = d; + } + } + } + + if(ClosestPointNewton(p, u, v, converge)) { + cached.x = *u; + cached.y = *v; + return; + } + + // If we failed to converge, then at least don't return NaN. + if(isnan(*u) || isnan(*v)) { + *u = *v = 0; + } +} + +bool SSurface::ClosestPointNewton(Vector p, double *u, double *v, bool converge) +{ + // Initial guess is in u, v; refine by Newton iteration. + Vector p0 = Vector::From(0, 0, 0); + for(int i = 0; i < (converge ? 25 : 5); i++) { + p0 = PointAt(*u, *v); + if(converge) { + if(p0.Equals(p, RATPOLY_EPS)) { + return true; + } + } + + Vector tu, tv; + TangentsAt(*u, *v, &tu, &tv); + + // Project the point into a plane through p0, with basis tu, tv; a + // second-order thing would converge faster but needs second + // derivatives. + Vector dp = p.Minus(p0); + double du = dp.Dot(tu), dv = dp.Dot(tv); + *u += du / (tu.MagSquared()); + *v += dv / (tv.MagSquared()); + } + + if(converge) { + dbp("didn't converge"); + dbp("have %.3f %.3f %.3f", CO(p0)); + dbp("want %.3f %.3f %.3f", CO(p)); + dbp("distance = %g", (p.Minus(p0)).Magnitude()); + } + return false; +} + +bool SSurface::PointIntersectingLine(Vector p0, Vector p1, double *u, double *v) +{ + int i; + for(i = 0; i < 15; i++) { + Vector pi, p, tu, tv; + p = PointAt(*u, *v); + TangentsAt(*u, *v, &tu, &tv); + + Vector n = (tu.Cross(tv)).WithMagnitude(1); + double d = p.Dot(n); + + bool parallel; + pi = Vector::AtIntersectionOfPlaneAndLine(n, d, p0, p1, ¶llel); + if(parallel) break; + + // Check for convergence + if(pi.Equals(p, RATPOLY_EPS)) return true; + + // Adjust our guess and iterate + Vector dp = pi.Minus(p); + double du = dp.Dot(tu), dv = dp.Dot(tv); + *u += du / (tu.MagSquared()); + *v += dv / (tv.MagSquared()); + } +// dbp("didn't converge (surface intersecting line)"); + return false; +} + +Vector SSurface::ClosestPointOnThisAndSurface(SSurface *srf2, Vector p) { + // This is untested. + int i, j; + Point2d puv[2]; + SSurface *srf[2] = { this, srf2 }; + + for(j = 0; j < 2; j++) { + (srf[j])->ClosestPointTo(p, &(puv[j]), false); + } + + for(i = 0; i < 10; i++) { + Vector tu[2], tv[2], cp[2], n[2]; + double d[2]; + + for(j = 0; j < 2; j++) { + (srf[j])->TangentsAt(puv[j].x, puv[j].y, &(tu[j]), &(tv[j])); + + cp[j] = (srf[j])->PointAt(puv[j]); + + n[j] = ((tu[j]).Cross(tv[j])).WithMagnitude(1); + d[j] = (n[j]).Dot(cp[j]); + } + + if((cp[0]).Equals(cp[1], RATPOLY_EPS)) break; + + Vector p0 = Vector::AtIntersectionOfPlanes(n[0], d[0], n[1], d[1]), + dp = (n[0]).Cross(n[1]); + + Vector pc = p.ClosestPointOnLine(p0, dp); + + // Adjust our guess and iterate + for(j = 0; j < 2; j++) { + Vector dc = pc.Minus(cp[j]); + double du = dc.Dot(tu[j]), dv = dc.Dot(tv[j]); + puv[j].x += du / ((tu[j]).MagSquared()); + puv[j].y += dv / ((tv[j]).MagSquared()); + } + } + if(i >= 10) { + dbp("this and srf, didn't converge, d=%g", + (puv[0].Minus(puv[1])).Magnitude()); + } + + // If this converged, then the two points are actually equal. + return ((srf[0])->PointAt(puv[0])).Plus( + ((srf[1])->PointAt(puv[1]))).ScaledBy(0.5); +} + +void SSurface::PointOnSurfaces(SSurface *s1, SSurface *s2, + double *up, double *vp) +{ + double u[3] = { *up, 0, 0 }, v[3] = { *vp, 0, 0 }; + SSurface *srf[3] = { this, s1, s2 }; + + // Get initial guesses for (u, v) in the other surfaces + Vector p = PointAt(*u, *v); + (srf[1])->ClosestPointTo(p, &(u[1]), &(v[1]), false); + (srf[2])->ClosestPointTo(p, &(u[2]), &(v[2]), false); + + int i, j; + for(i = 0; i < 20; i++) { + // Approximate each surface by a plane + Vector p[3], tu[3], tv[3], n[3]; + double d[3]; + for(j = 0; j < 3; j++) { + p[j] = (srf[j])->PointAt(u[j], v[j]); + (srf[j])->TangentsAt(u[j], v[j], &(tu[j]), &(tv[j])); + n[j] = ((tu[j]).Cross(tv[j])).WithMagnitude(1); + d[j] = (n[j]).Dot(p[j]); + } + + // If a = b and b = c, then does a = c? No, it doesn't. + if((p[0]).Equals(p[1], RATPOLY_EPS) && + (p[1]).Equals(p[2], RATPOLY_EPS) && + (p[2]).Equals(p[0], RATPOLY_EPS)) + { + *up = u[0]; + *vp = v[0]; + return; + } + + bool parallel; + Vector pi = Vector::AtIntersectionOfPlanes(n[0], d[0], + n[1], d[1], + n[2], d[2], ¶llel); + if(parallel) break; + + for(j = 0; j < 3; j++) { + Vector dp = pi.Minus(p[j]); + double du = dp.Dot(tu[j]), dv = dp.Dot(tv[j]); + u[j] += du / (tu[j]).MagSquared(); + v[j] += dv / (tv[j]).MagSquared(); + } + } + dbp("didn't converge (three surfaces intersecting)"); +} + diff --git a/src/srf/raycast.cpp b/src/srf/raycast.cpp new file mode 100644 index 0000000..808287f --- /dev/null +++ b/src/srf/raycast.cpp @@ -0,0 +1,611 @@ +//----------------------------------------------------------------------------- +// Routines for ray-casting: intersecting a line segment or an infinite line +// with a surface or shell. Ray-casting against a shell is used for point-in- +// shell testing, and the intersection of edge line segments against surfaces +// is used to get rough surface-curve intersections, which are later refined +// numerically. +// +// Copyright 2008-2013 Jonathan Westhues. +//----------------------------------------------------------------------------- +#include "solvespace.h" + +// Dot product tolerance for perpendicular; this is on the direction cosine, +// so it's about 0.001 degrees. +const double SShell::DOTP_TOL = 1e-5; + +extern int FLAG; + + +double SSurface::DepartureFromCoplanar(void) { + int i, j; + int ia, ja, ib = 0, jb = 0, ic = 0, jc = 0; + double best; + + // Grab three points to define a plane; first choose (0, 0) arbitrarily. + ia = ja = 0; + // Then the point farthest from pt a. + best = VERY_NEGATIVE; + for(i = 0; i <= degm; i++) { + for(j = 0; j <= degn; j++) { + if(i == ia && j == ja) continue; + + double dist = (ctrl[i][j]).Minus(ctrl[ia][ja]).Magnitude(); + if(dist > best) { + best = dist; + ib = i; + jb = j; + } + } + } + // Then biggest magnitude of ab cross ac. + best = VERY_NEGATIVE; + for(i = 0; i <= degm; i++) { + for(j = 0; j <= degn; j++) { + if(i == ia && j == ja) continue; + if(i == ib && j == jb) continue; + + double mag = + ((ctrl[ia][ja].Minus(ctrl[ib][jb]))).Cross( + (ctrl[ia][ja].Minus(ctrl[i ][j ]))).Magnitude(); + if(mag > best) { + best = mag; + ic = i; + jc = j; + } + } + } + + Vector n = ((ctrl[ia][ja].Minus(ctrl[ib][jb]))).Cross( + (ctrl[ia][ja].Minus(ctrl[ic][jc]))); + n = n.WithMagnitude(1); + double d = (ctrl[ia][ja]).Dot(n); + + // Finally, calculate the deviation from each point to the plane. + double farthest = VERY_NEGATIVE; + for(i = 0; i <= degm; i++) { + for(j = 0; j <= degn; j++) { + double dist = fabs(n.Dot(ctrl[i][j]) - d); + if(dist > farthest) { + farthest = dist; + } + } + } + return farthest; +} + +void SSurface::WeightControlPoints(void) { + int i, j; + for(i = 0; i <= degm; i++) { + for(j = 0; j <= degn; j++) { + ctrl[i][j] = (ctrl[i][j]).ScaledBy(weight[i][j]); + } + } +} +void SSurface::UnWeightControlPoints(void) { + int i, j; + for(i = 0; i <= degm; i++) { + for(j = 0; j <= degn; j++) { + ctrl[i][j] = (ctrl[i][j]).ScaledBy(1.0/weight[i][j]); + } + } +} +void SSurface::CopyRowOrCol(bool row, int this_ij, SSurface *src, int src_ij) { + if(row) { + int j; + for(j = 0; j <= degn; j++) { + ctrl [this_ij][j] = src->ctrl [src_ij][j]; + weight[this_ij][j] = src->weight[src_ij][j]; + } + } else { + int i; + for(i = 0; i <= degm; i++) { + ctrl [i][this_ij] = src->ctrl [i][src_ij]; + weight[i][this_ij] = src->weight[i][src_ij]; + } + } +} +void SSurface::BlendRowOrCol(bool row, int this_ij, SSurface *a, int a_ij, + SSurface *b, int b_ij) +{ + if(row) { + int j; + for(j = 0; j <= degn; j++) { + Vector c = (a->ctrl [a_ij][j]).Plus(b->ctrl [b_ij][j]); + double w = (a->weight[a_ij][j] + b->weight[b_ij][j]); + ctrl [this_ij][j] = c.ScaledBy(0.5); + weight[this_ij][j] = w / 2; + } + } else { + int i; + for(i = 0; i <= degm; i++) { + Vector c = (a->ctrl [i][a_ij]).Plus(b->ctrl [i][b_ij]); + double w = (a->weight[i][a_ij] + b->weight[i][b_ij]); + ctrl [i][this_ij] = c.ScaledBy(0.5); + weight[i][this_ij] = w / 2; + } + } +} +void SSurface::SplitInHalf(bool byU, SSurface *sa, SSurface *sb) { + sa->degm = sb->degm = degm; + sa->degn = sb->degn = degn; + + // by de Casteljau's algorithm in a projective space; so we must work + // on points (w*x, w*y, w*z, w) + WeightControlPoints(); + + switch(byU ? degm : degn) { + case 1: + sa->CopyRowOrCol (byU, 0, this, 0); + sb->CopyRowOrCol (byU, 1, this, 1); + + sa->BlendRowOrCol(byU, 1, this, 0, this, 1); + sb->BlendRowOrCol(byU, 0, this, 0, this, 1); + break; + + case 2: + sa->CopyRowOrCol (byU, 0, this, 0); + sb->CopyRowOrCol (byU, 2, this, 2); + + sa->BlendRowOrCol(byU, 1, this, 0, this, 1); + sb->BlendRowOrCol(byU, 1, this, 1, this, 2); + + sa->BlendRowOrCol(byU, 2, sa, 1, sb, 1); + sb->BlendRowOrCol(byU, 0, sa, 1, sb, 1); + break; + + case 3: { + SSurface st; + st.degm = degm; st.degn = degn; + + sa->CopyRowOrCol (byU, 0, this, 0); + sb->CopyRowOrCol (byU, 3, this, 3); + + sa->BlendRowOrCol(byU, 1, this, 0, this, 1); + sb->BlendRowOrCol(byU, 2, this, 2, this, 3); + st. BlendRowOrCol(byU, 0, this, 1, this, 2); // scratch var + + sa->BlendRowOrCol(byU, 2, sa, 1, &st, 0); + sb->BlendRowOrCol(byU, 1, sb, 2, &st, 0); + + sa->BlendRowOrCol(byU, 3, sa, 2, sb, 1); + sb->BlendRowOrCol(byU, 0, sa, 2, sb, 1); + break; + } + + default: oops(); + } + + sa->UnWeightControlPoints(); + sb->UnWeightControlPoints(); + UnWeightControlPoints(); +} + +//----------------------------------------------------------------------------- +// Find all points where the indicated finite (if segment) or infinite (if not +// segment) line intersects our surface. Report them in uv space in the list. +// We first do a bounding box check; if the line doesn't intersect, then we're +// done. If it does, then we check how small our surface is. If it's big, +// then we subdivide into quarters and recurse. If it's small, then we refine +// by Newton's method and record the point. +//----------------------------------------------------------------------------- +void SSurface::AllPointsIntersectingUntrimmed(Vector a, Vector b, + int *cnt, int *level, + List *l, bool segment, + SSurface *sorig) +{ + // Test if the line intersects our axis-aligned bounding box; if no, then + // no possibility of an intersection + if(LineEntirelyOutsideBbox(a, b, segment)) return; + + if(*cnt > 2000) { + dbp("!!! too many subdivisions (level=%d)!", *level); + dbp("degm = %d degn = %d", degm, degn); + return; + } + (*cnt)++; + + // If we might intersect, and the surface is small, then switch to Newton + // iterations. + if(DepartureFromCoplanar() < 0.2*SS.ChordTolMm()) { + Vector p = (ctrl[0 ][0 ]).Plus( + ctrl[0 ][degn]).Plus( + ctrl[degm][0 ]).Plus( + ctrl[degm][degn]).ScaledBy(0.25); + Inter inter; + sorig->ClosestPointTo(p, &(inter.p.x), &(inter.p.y), false); + if(sorig->PointIntersectingLine(a, b, &(inter.p.x), &(inter.p.y))) { + Vector p = sorig->PointAt(inter.p.x, inter.p.y); + // Debug check, verify that the point lies in both surfaces + // (which it ought to, since the surfaces should be coincident) + double u, v; + ClosestPointTo(p, &u, &v); + l->Add(&inter); + } else { + // Might not converge if line is almost tangent to surface... + } + return; + } + + // But the surface is big, so split it, alternating by u and v + SSurface surf0, surf1; + SplitInHalf((*level & 1) == 0, &surf0, &surf1); + + int nextLevel = (*level) + 1; + (*level) = nextLevel; + surf0.AllPointsIntersectingUntrimmed(a, b, cnt, level, l, segment, sorig); + (*level) = nextLevel; + surf1.AllPointsIntersectingUntrimmed(a, b, cnt, level, l, segment, sorig); +} + +//----------------------------------------------------------------------------- +// Find all points where a line through a and b intersects our surface, and +// add them to the list. If seg is true then report only intersections that +// lie within the finite line segment (not including the endpoints); otherwise +// we work along the infinite line. And we report either just intersections +// inside the trim curve, or any intersection with u, v in [0, 1]. And we +// either disregard or report tangent points. +//----------------------------------------------------------------------------- +void SSurface::AllPointsIntersecting(Vector a, Vector b, + List *l, + bool seg, bool trimmed, bool inclTangent) +{ + if(LineEntirelyOutsideBbox(a, b, seg)) return; + + Vector ba = b.Minus(a); + double bam = ba.Magnitude(); + + List inters = {}; + + // All the intersections between the line and the surface; either special + // cases that we can quickly solve in closed form, or general numerical. + Vector center, axis, start, finish; + double radius; + if(degm == 1 && degn == 1) { + // Against a plane, easy. + Vector n = NormalAt(0, 0).WithMagnitude(1); + double d = n.Dot(PointAt(0, 0)); + // Trim to line segment now if requested, don't generate points that + // would just get discarded later. + if(!seg || + (n.Dot(a) > d + LENGTH_EPS && n.Dot(b) < d - LENGTH_EPS) || + (n.Dot(b) > d + LENGTH_EPS && n.Dot(a) < d - LENGTH_EPS)) + { + Vector p = Vector::AtIntersectionOfPlaneAndLine(n, d, a, b, NULL); + Inter inter; + ClosestPointTo(p, &(inter.p.x), &(inter.p.y)); + inters.Add(&inter); + } + } else if(IsCylinder(&axis, ¢er, &radius, &start, &finish)) { + // This one can be solved in closed form too. + Vector ab = b.Minus(a); + if(axis.Cross(ab).Magnitude() < LENGTH_EPS) { + // edge is parallel to axis of cylinder, no intersection points + return; + } + // A coordinate system centered at the center of the circle, with + // the edge under test horizontal + Vector u, v, n = axis.WithMagnitude(1); + u = (ab.Minus(n.ScaledBy(ab.Dot(n)))).WithMagnitude(1); + v = n.Cross(u); + Point2d ap = (a.Minus(center)).DotInToCsys(u, v, n).ProjectXy(), + bp = (b.Minus(center)).DotInToCsys(u, v, n).ProjectXy(), + sp = (start. Minus(center)).DotInToCsys(u, v, n).ProjectXy(), + fp = (finish.Minus(center)).DotInToCsys(u, v, n).ProjectXy(); + + double thetas = atan2(sp.y, sp.x), thetaf = atan2(fp.y, fp.x); + + Point2d ip[2]; + int ip_n = 0; + if(fabs(fabs(ap.y) - radius) < LENGTH_EPS) { + // tangent + if(inclTangent) { + ip[0] = Point2d::From(0, ap.y); + ip_n = 1; + } + } else if(fabs(ap.y) < radius) { + // two intersections + double xint = sqrt(radius*radius - ap.y*ap.y); + ip[0] = Point2d::From(-xint, ap.y); + ip[1] = Point2d::From( xint, ap.y); + ip_n = 2; + } + int i; + for(i = 0; i < ip_n; i++) { + double t = (ip[i].Minus(ap)).DivPivoting(bp.Minus(ap)); + // This is a point on the circle; but is it on the arc? + Point2d pp = ap.Plus((bp.Minus(ap)).ScaledBy(t)); + double theta = atan2(pp.y, pp.x); + double dp = WRAP_SYMMETRIC(theta - thetas, 2*PI), + df = WRAP_SYMMETRIC(thetaf - thetas, 2*PI); + double tol = LENGTH_EPS/radius; + + if((df > 0 && ((dp < -tol) || (dp > df + tol))) || + (df < 0 && ((dp > tol) || (dp < df - tol)))) + { + continue; + } + + Vector p = a.Plus((b.Minus(a)).ScaledBy(t)); + + Inter inter; + ClosestPointTo(p, &(inter.p.x), &(inter.p.y)); + inters.Add(&inter); + } + } else { + // General numerical solution by subdivision, fallback + int cnt = 0, level = 0; + AllPointsIntersectingUntrimmed(a, b, &cnt, &level, &inters, seg, this); + } + + // Remove duplicate intersection points + inters.ClearTags(); + int i, j; + for(i = 0; i < inters.n; i++) { + for(j = i + 1; j < inters.n; j++) { + if(inters.elem[i].p.Equals(inters.elem[j].p)) { + inters.elem[j].tag = 1; + } + } + } + inters.RemoveTagged(); + + for(i = 0; i < inters.n; i++) { + Point2d puv = inters.elem[i].p; + + // Make sure the point lies within the finite line segment + Vector pxyz = PointAt(puv.x, puv.y); + double t = (pxyz.Minus(a)).DivPivoting(ba); + if(seg && (t > 1 - LENGTH_EPS/bam || t < LENGTH_EPS/bam)) { + continue; + } + + // And that it lies inside our trim region + Point2d dummy = { 0, 0 }; + int c = (bsp) ? bsp->ClassifyPoint(puv, dummy, this) : SBspUv::OUTSIDE; + if(trimmed && c == SBspUv::OUTSIDE) { + continue; + } + + // It does, so generate the intersection + SInter si; + si.p = pxyz; + si.surfNormal = NormalAt(puv.x, puv.y); + si.pinter = puv; + si.srf = this; + si.onEdge = (c != SBspUv::INSIDE); + l->Add(&si); + } + + inters.Clear(); +} + +void SShell::AllPointsIntersecting(Vector a, Vector b, + List *il, + bool seg, bool trimmed, bool inclTangent) +{ + SSurface *ss; + for(ss = surface.First(); ss; ss = surface.NextAfter(ss)) { + ss->AllPointsIntersecting(a, b, il, seg, trimmed, inclTangent); + } +} + + + +int SShell::ClassifyRegion(Vector edge_n, Vector inter_surf_n, + Vector edge_surf_n) +{ + double dot = inter_surf_n.DirectionCosineWith(edge_n); + if(fabs(dot) < DOTP_TOL) { + // The edge's surface and the edge-on-face surface + // are coincident. Test the edge's surface normal + // to see if it's with same or opposite normals. + if(inter_surf_n.Dot(edge_surf_n) > 0) { + return COINC_SAME; + } else { + return COINC_OPP; + } + } else if(dot > 0) { + return OUTSIDE; + } else { + return INSIDE; + } +} + +//----------------------------------------------------------------------------- +// Does the given point lie on our shell? There are many cases; inside and +// outside are obvious, but then there's all the edge-on-edge and edge-on-face +// possibilities. +// +// To calculate, we intersect a ray through p with our shell, and classify +// using the closest intersection point. If the ray hits a surface on edge, +// then just reattempt in a different random direction. +//----------------------------------------------------------------------------- +bool SShell::ClassifyEdge(int *indir, int *outdir, + Vector ea, Vector eb, + Vector p, + Vector edge_n_in, Vector edge_n_out, Vector surf_n) +{ + List l = {}; + + srand(0); + + // First, check for edge-on-edge + int edge_inters = 0; + Vector inter_surf_n[2], inter_edge_n[2]; + SSurface *srf; + for(srf = surface.First(); srf; srf = surface.NextAfter(srf)) { + if(srf->LineEntirelyOutsideBbox(ea, eb, true)) continue; + + SEdgeList *sel = &(srf->edges); + SEdge *se; + for(se = sel->l.First(); se; se = sel->l.NextAfter(se)) { + if((ea.Equals(se->a) && eb.Equals(se->b)) || + (eb.Equals(se->a) && ea.Equals(se->b)) || + p.OnLineSegment(se->a, se->b)) + { + if(edge_inters < 2) { + // Edge-on-edge case + Point2d pm; + srf->ClosestPointTo(p, &pm, false); + // A vector normal to the surface, at the intersection point + inter_surf_n[edge_inters] = srf->NormalAt(pm); + // A vector normal to the intersecting edge (but within the + // intersecting surface) at the intersection point, pointing + // out. + inter_edge_n[edge_inters] = + (inter_surf_n[edge_inters]).Cross((se->b).Minus((se->a))); + } + + edge_inters++; + } + } + } + + if(edge_inters == 2) { + // TODO, make this use the appropriate curved normals + double dotp[2]; + for(int i = 0; i < 2; i++) { + dotp[i] = edge_n_out.DirectionCosineWith(inter_surf_n[i]); + } + + if(fabs(dotp[1]) < DOTP_TOL) { + swap(dotp[0], dotp[1]); + swap(inter_surf_n[0], inter_surf_n[1]); + swap(inter_edge_n[0], inter_edge_n[1]); + } + + int coinc = (surf_n.Dot(inter_surf_n[0])) > 0 ? COINC_SAME : COINC_OPP; + + if(fabs(dotp[0]) < DOTP_TOL && fabs(dotp[1]) < DOTP_TOL) { + // This is actually an edge on face case, just that the face + // is split into two pieces joining at our edge. + *indir = coinc; + *outdir = coinc; + } else if(fabs(dotp[0]) < DOTP_TOL && dotp[1] > DOTP_TOL) { + if(edge_n_out.Dot(inter_edge_n[0]) > 0) { + *indir = coinc; + *outdir = OUTSIDE; + } else { + *indir = INSIDE; + *outdir = coinc; + } + } else if(fabs(dotp[0]) < DOTP_TOL && dotp[1] < -DOTP_TOL) { + if(edge_n_out.Dot(inter_edge_n[0]) > 0) { + *indir = coinc; + *outdir = INSIDE; + } else { + *indir = OUTSIDE; + *outdir = coinc; + } + } else if(dotp[0] > DOTP_TOL && dotp[1] > DOTP_TOL) { + *indir = INSIDE; + *outdir = OUTSIDE; + } else if(dotp[0] < -DOTP_TOL && dotp[1] < -DOTP_TOL) { + *indir = OUTSIDE; + *outdir = INSIDE; + } else { + // Edge is tangent to the shell at shell's edge, so can't be + // a boundary of the surface. + return false; + } + return true; + } + + if(edge_inters != 0) dbp("bad, edge_inters=%d", edge_inters); + + // Next, check for edge-on-surface. The ray-casting for edge-inside-shell + // would catch this too, but test separately, for speed (since many edges + // are on surface) and for numerical stability, so we don't pick up + // the additional error from the line intersection. + + for(srf = surface.First(); srf; srf = surface.NextAfter(srf)) { + if(srf->LineEntirelyOutsideBbox(ea, eb, true)) continue; + + Point2d puv; + srf->ClosestPointTo(p, &(puv.x), &(puv.y), false); + Vector pp = srf->PointAt(puv); + + if((pp.Minus(p)).Magnitude() > LENGTH_EPS) continue; + Point2d dummy = { 0, 0 }; + int c = (srf->bsp) ? srf->bsp->ClassifyPoint(puv, dummy, srf) : SBspUv::OUTSIDE; + if(c == SBspUv::OUTSIDE) continue; + + // Edge-on-face (unless edge-on-edge above superceded) + Point2d pin, pout; + srf->ClosestPointTo(p.Plus(edge_n_in), &pin, false); + srf->ClosestPointTo(p.Plus(edge_n_out), &pout, false); + + Vector surf_n_in = srf->NormalAt(pin), + surf_n_out = srf->NormalAt(pout); + + *indir = ClassifyRegion(edge_n_in, surf_n_in, surf_n); + *outdir = ClassifyRegion(edge_n_out, surf_n_out, surf_n); + return true; + } + + // Edge is not on face or on edge; so it's either inside or outside + // the shell, and we'll determine which by raycasting. + int cnt = 0; + for(;;) { + // Cast a ray in a random direction (two-sided so that we test if + // the point lies on a surface, but use only one side for in/out + // testing) + Vector ray = Vector::From(Random(1), Random(1), Random(1)); + + AllPointsIntersecting( + p.Minus(ray), p.Plus(ray), &l, false, true, false); + + // no intersections means it's outside + *indir = OUTSIDE; + *outdir = OUTSIDE; + double dmin = VERY_POSITIVE; + bool onEdge = false; + edge_inters = 0; + + SInter *si; + for(si = l.First(); si; si = l.NextAfter(si)) { + double t = ((si->p).Minus(p)).DivPivoting(ray); + if(t*ray.Magnitude() < -LENGTH_EPS) { + // wrong side, doesn't count + continue; + } + + double d = ((si->p).Minus(p)).Magnitude(); + + // We actually should never hit this case; it should have been + // handled above. + if(d < LENGTH_EPS && si->onEdge) { + edge_inters++; + } + + if(d < dmin) { + dmin = d; + // Edge does not lie on surface; either strictly inside + // or strictly outside + if((si->surfNormal).Dot(ray) > 0) { + *indir = INSIDE; + *outdir = INSIDE; + } else { + *indir = OUTSIDE; + *outdir = OUTSIDE; + } + onEdge = si->onEdge; + } + } + l.Clear(); + + // If the point being tested lies exactly on an edge of the shell, + // then our ray always lies on edge, and that's okay. Otherwise + // try again in a different random direction. + if(!onEdge) break; + if(cnt++ > 5) { + dbp("can't find a ray that doesn't hit on edge!"); + dbp("on edge = %d, edge_inters = %d", onEdge, edge_inters); + SS.nakedEdges.AddEdge(ea, eb); + break; + } + } + + return true; +} + diff --git a/src/srf/surface.cpp b/src/srf/surface.cpp new file mode 100644 index 0000000..3f3178c --- /dev/null +++ b/src/srf/surface.cpp @@ -0,0 +1,881 @@ +//----------------------------------------------------------------------------- +// Anything involving surfaces and sets of surfaces (i.e., shells); except +// for the real math, which is in ratpoly.cpp. +// +// Copyright 2008-2013 Jonathan Westhues. +//----------------------------------------------------------------------------- +#include "../solvespace.h" + +SSurface SSurface::FromExtrusionOf(SBezier *sb, Vector t0, Vector t1) { + SSurface ret = {}; + + ret.degm = sb->deg; + ret.degn = 1; + + int i; + for(i = 0; i <= ret.degm; i++) { + ret.ctrl[i][0] = (sb->ctrl[i]).Plus(t0); + ret.weight[i][0] = sb->weight[i]; + + ret.ctrl[i][1] = (sb->ctrl[i]).Plus(t1); + ret.weight[i][1] = sb->weight[i]; + } + + return ret; +} + +bool SSurface::IsExtrusion(SBezier *of, Vector *alongp) { + int i; + + if(degn != 1) return false; + + Vector along = (ctrl[0][1]).Minus(ctrl[0][0]); + for(i = 0; i <= degm; i++) { + if((fabs(weight[i][1] - weight[i][0]) < LENGTH_EPS) && + ((ctrl[i][1]).Minus(ctrl[i][0])).Equals(along)) + { + continue; + } + return false; + } + + // yes, we are a surface of extrusion; copy the original curve and return + if(of) { + for(i = 0; i <= degm; i++) { + of->weight[i] = weight[i][0]; + of->ctrl[i] = ctrl[i][0]; + } + of->deg = degm; + *alongp = along; + } + return true; +} + +bool SSurface::IsCylinder(Vector *axis, Vector *center, double *r, + Vector *start, Vector *finish) +{ + SBezier sb; + if(!IsExtrusion(&sb, axis)) return false; + if(!sb.IsCircle(*axis, center, r)) return false; + + *start = sb.ctrl[0]; + *finish = sb.ctrl[2]; + return true; +} + +SSurface SSurface::FromRevolutionOf(SBezier *sb, Vector pt, Vector axis, + double thetas, double thetaf) +{ + SSurface ret = {}; + + + ret.degm = sb->deg; + ret.degn = 2; + + double dtheta = fabs(WRAP_SYMMETRIC(thetaf - thetas, 2*PI)); + + // We now wish to revolve the curve about the z axis + int i; + for(i = 0; i <= ret.degm; i++) { + Vector p = sb->ctrl[i]; + + Vector ps = p.RotatedAbout(pt, axis, thetas), + pf = p.RotatedAbout(pt, axis, thetaf); + + Vector ct; + if(ps.Equals(pf)) { + // Degenerate case: a control point lies on the axis of revolution, + // so we get three coincident control points. + ct = ps; + } else { + // Normal case, the control point sweeps out a circle. + Vector c = ps.ClosestPointOnLine(pt, axis); + + Vector rs = ps.Minus(c), + rf = pf.Minus(c); + + Vector ts = axis.Cross(rs), + tf = axis.Cross(rf); + + ct = Vector::AtIntersectionOfLines(ps, ps.Plus(ts), + pf, pf.Plus(tf), + NULL, NULL, NULL); + } + + ret.ctrl[i][0] = ps; + ret.ctrl[i][1] = ct; + ret.ctrl[i][2] = pf; + + ret.weight[i][0] = sb->weight[i]; + ret.weight[i][1] = sb->weight[i]*cos(dtheta/2); + ret.weight[i][2] = sb->weight[i]; + } + + return ret; +} + +SSurface SSurface::FromPlane(Vector pt, Vector u, Vector v) { + SSurface ret = {}; + + ret.degm = 1; + ret.degn = 1; + + ret.weight[0][0] = ret.weight[0][1] = 1; + ret.weight[1][0] = ret.weight[1][1] = 1; + + ret.ctrl[0][0] = pt; + ret.ctrl[0][1] = pt.Plus(u); + ret.ctrl[1][0] = pt.Plus(v); + ret.ctrl[1][1] = pt.Plus(v).Plus(u); + + return ret; +} + +SSurface SSurface::FromTransformationOf(SSurface *a, + Vector t, Quaternion q, double scale, + bool includingTrims) +{ + SSurface ret = {}; + + ret.h = a->h; + ret.color = a->color; + ret.face = a->face; + + ret.degm = a->degm; + ret.degn = a->degn; + int i, j; + for(i = 0; i <= 3; i++) { + for(j = 0; j <= 3; j++) { + ret.ctrl[i][j] = a->ctrl[i][j]; + ret.ctrl[i][j] = (ret.ctrl[i][j]).ScaledBy(scale); + ret.ctrl[i][j] = (q.Rotate(ret.ctrl[i][j])).Plus(t); + + ret.weight[i][j] = a->weight[i][j]; + } + } + + if(includingTrims) { + STrimBy *stb; + for(stb = a->trim.First(); stb; stb = a->trim.NextAfter(stb)) { + STrimBy n = *stb; + n.start = n.start.ScaledBy(scale); + n.finish = n.finish.ScaledBy(scale); + n.start = (q.Rotate(n.start)) .Plus(t); + n.finish = (q.Rotate(n.finish)).Plus(t); + ret.trim.Add(&n); + } + } + + if(scale < 0) { + // If we mirror every surface of a shell, then it will end up inside + // out. So fix that here. + ret.Reverse(); + } + + return ret; +} + +void SSurface::GetAxisAlignedBounding(Vector *ptMax, Vector *ptMin) { + *ptMax = Vector::From(VERY_NEGATIVE, VERY_NEGATIVE, VERY_NEGATIVE); + *ptMin = Vector::From(VERY_POSITIVE, VERY_POSITIVE, VERY_POSITIVE); + + int i, j; + for(i = 0; i <= degm; i++) { + for(j = 0; j <= degn; j++) { + (ctrl[i][j]).MakeMaxMin(ptMax, ptMin); + } + } +} + +bool SSurface::LineEntirelyOutsideBbox(Vector a, Vector b, bool segment) { + Vector amax, amin; + GetAxisAlignedBounding(&amax, &amin); + if(!Vector::BoundingBoxIntersectsLine(amax, amin, a, b, segment)) { + // The line segment could fail to intersect the bbox, but lie entirely + // within it and intersect the surface. + if(a.OutsideAndNotOn(amax, amin) && b.OutsideAndNotOn(amax, amin)) { + return true; + } + } + return false; +} + +//----------------------------------------------------------------------------- +// Generate the piecewise linear approximation of the trim stb, which applies +// to the curve sc. +//----------------------------------------------------------------------------- +void SSurface::MakeTrimEdgesInto(SEdgeList *sel, int flags, + SCurve *sc, STrimBy *stb) +{ + Vector prev = Vector::From(0, 0, 0); + bool inCurve = false, empty = true; + double u = 0, v = 0; + + int i, first, last, increment; + if(stb->backwards) { + first = sc->pts.n - 1; + last = 0; + increment = -1; + } else { + first = 0; + last = sc->pts.n - 1; + increment = 1; + } + for(i = first; i != (last + increment); i += increment) { + Vector tpt, *pt = &(sc->pts.elem[i].p); + + if(flags & AS_UV) { + ClosestPointTo(*pt, &u, &v); + tpt = Vector::From(u, v, 0); + } else { + tpt = *pt; + } + + if(inCurve) { + sel->AddEdge(prev, tpt, sc->h.v, stb->backwards); + empty = false; + } + + prev = tpt; // either uv or xyz, depending on flags + + if(pt->Equals(stb->start)) inCurve = true; + if(pt->Equals(stb->finish)) inCurve = false; + } + if(inCurve) dbp("trim was unterminated"); + if(empty) dbp("trim was empty"); +} + +//----------------------------------------------------------------------------- +// Generate all of our trim curves, in piecewise linear form. We can do +// so in either uv or xyz coordinates. And if requested, then we can use +// the split curves from useCurvesFrom instead of the curves in our own +// shell. +//----------------------------------------------------------------------------- +void SSurface::MakeEdgesInto(SShell *shell, SEdgeList *sel, int flags, + SShell *useCurvesFrom) +{ + STrimBy *stb; + for(stb = trim.First(); stb; stb = trim.NextAfter(stb)) { + SCurve *sc = shell->curve.FindById(stb->curve); + + // We have the option to use the curves from another shell; this + // is relevant when generating the coincident edges while doing the + // Booleans, since the curves from the output shell will be split + // against any intersecting surfaces (and the originals aren't). + if(useCurvesFrom) { + sc = useCurvesFrom->curve.FindById(sc->newH); + } + + MakeTrimEdgesInto(sel, flags, sc, stb); + } +} + +//----------------------------------------------------------------------------- +// Compute the exact tangent to the intersection curve between two surfaces, +// by taking the cross product of the surface normals. We choose the direction +// of this tangent so that its dot product with dir is positive. +//----------------------------------------------------------------------------- +Vector SSurface::ExactSurfaceTangentAt(Vector p, SSurface *srfA, SSurface *srfB, + Vector dir) +{ + Point2d puva, puvb; + srfA->ClosestPointTo(p, &puva); + srfB->ClosestPointTo(p, &puvb); + Vector ts = (srfA->NormalAt(puva)).Cross( + (srfB->NormalAt(puvb))); + ts = ts.WithMagnitude(1); + if(ts.Dot(dir) < 0) { + ts = ts.ScaledBy(-1); + } + return ts; +} + +//----------------------------------------------------------------------------- +// Report our trim curves. If a trim curve is exact and sbl is not null, then +// add its exact form to sbl. Otherwise, add its piecewise linearization to +// sel. +//----------------------------------------------------------------------------- +void SSurface::MakeSectionEdgesInto(SShell *shell, + SEdgeList *sel, SBezierList *sbl) +{ + STrimBy *stb; + for(stb = trim.First(); stb; stb = trim.NextAfter(stb)) { + SCurve *sc = shell->curve.FindById(stb->curve); + SBezier *sb = &(sc->exact); + + if(sbl && sc->isExact && (sb->deg != 1 || !sel)) { + double ts, tf; + if(stb->backwards) { + sb->ClosestPointTo(stb->start, &tf); + sb->ClosestPointTo(stb->finish, &ts); + } else { + sb->ClosestPointTo(stb->start, &ts); + sb->ClosestPointTo(stb->finish, &tf); + } + SBezier junk_bef, keep_aft; + sb->SplitAt(ts, &junk_bef, &keep_aft); + // In the kept piece, the range that used to go from ts to 1 + // now goes from 0 to 1; so rescale tf appropriately. + tf = (tf - ts)/(1 - ts); + + SBezier keep_bef, junk_aft; + keep_aft.SplitAt(tf, &keep_bef, &junk_aft); + + sbl->l.Add(&keep_bef); + } else if(sbl && !sel && !sc->isExact) { + // We must approximate this trim curve, as piecewise cubic sections. + SSurface *srfA = shell->surface.FindById(sc->surfA), + *srfB = shell->surface.FindById(sc->surfB); + + Vector s = stb->backwards ? stb->finish : stb->start, + f = stb->backwards ? stb->start : stb->finish; + + int sp, fp; + for(sp = 0; sp < sc->pts.n; sp++) { + if(s.Equals(sc->pts.elem[sp].p)) break; + } + if(sp >= sc->pts.n) return; + for(fp = sp; fp < sc->pts.n; fp++) { + if(f.Equals(sc->pts.elem[fp].p)) break; + } + if(fp >= sc->pts.n) return; + // So now the curve we want goes from elem[sp] to elem[fp] + + while(sp < fp) { + // Initially, we'll try approximating the entire trim curve + // as a single Bezier segment + int fpt = fp; + + for(;;) { + // So construct a cubic Bezier with the correct endpoints + // and tangents for the current span. + Vector st = sc->pts.elem[sp].p, + ft = sc->pts.elem[fpt].p, + sf = ft.Minus(st); + double m = sf.Magnitude() / 3; + + Vector stan = ExactSurfaceTangentAt(st, srfA, srfB, sf), + ftan = ExactSurfaceTangentAt(ft, srfA, srfB, sf); + + SBezier sb = SBezier::From(st, + st.Plus (stan.WithMagnitude(m)), + ft.Minus(ftan.WithMagnitude(m)), + ft); + + // And test how much this curve deviates from the + // intermediate points (if any). + int i; + bool tooFar = false; + for(i = sp + 1; i <= (fpt - 1); i++) { + Vector p = sc->pts.elem[i].p; + double t; + sb.ClosestPointTo(p, &t, false); + Vector pp = sb.PointAt(t); + if((pp.Minus(p)).Magnitude() > SS.ChordTolMm()/2) { + tooFar = true; + break; + } + } + + if(tooFar) { + // Deviates by too much, so try a shorter span + fpt--; + continue; + } else { + // Okay, so use this piece and break. + sbl->l.Add(&sb); + break; + } + } + + // And continue interpolating, starting wherever the curve + // we just generated finishes. + sp = fpt; + } + } else { + if(sel) MakeTrimEdgesInto(sel, AS_XYZ, sc, stb); + } + } +} + +void SSurface::TriangulateInto(SShell *shell, SMesh *sm) { + SEdgeList el = {}; + + MakeEdgesInto(shell, &el, AS_UV); + + SPolygon poly = {}; + if(el.AssemblePolygon(&poly, NULL, true)) { + int i, start = sm->l.n; + if(degm == 1 && degn == 1) { + // A surface with curvature along one direction only; so + // choose the triangulation with chords that lie as much + // as possible within the surface. And since the trim curves + // have been pwl'd to within the desired chord tol, that will + // produce a surface good to within roughly that tol. + // + // If this is just a plane (degree (1, 1)) then the triangulation + // code will notice that, and not bother checking chord tols. + poly.UvTriangulateInto(sm, this); + } else { + // A surface with compound curvature. So we must overlay a + // two-dimensional grid, and triangulate around that. + poly.UvGridTriangulateInto(sm, this); + } + + STriMeta meta = { face, color }; + for(i = start; i < sm->l.n; i++) { + STriangle *st = &(sm->l.elem[i]); + st->meta = meta; + if(st->meta.color.alpha != 255) sm->isTransparent = true; + st->an = NormalAt(st->a.x, st->a.y); + st->bn = NormalAt(st->b.x, st->b.y); + st->cn = NormalAt(st->c.x, st->c.y); + st->a = PointAt(st->a.x, st->a.y); + st->b = PointAt(st->b.x, st->b.y); + st->c = PointAt(st->c.x, st->c.y); + // Works out that my chosen contour direction is inconsistent with + // the triangle direction, sigh. + st->FlipNormal(); + } + } else { + dbp("failed to assemble polygon to trim nurbs surface in uv space"); + } + + el.Clear(); + poly.Clear(); +} + +//----------------------------------------------------------------------------- +// Reverse the parametrisation of one of our dimensions, which flips the +// normal. We therefore must reverse all our trim curves too. The uv +// coordinates change, but trim curves are stored as xyz so nothing happens +//----------------------------------------------------------------------------- +void SSurface::Reverse(void) { + int i, j; + for(i = 0; i < (degm+1)/2; i++) { + for(j = 0; j <= degn; j++) { + swap(ctrl[i][j], ctrl[degm-i][j]); + swap(weight[i][j], weight[degm-i][j]); + } + } + + STrimBy *stb; + for(stb = trim.First(); stb; stb = trim.NextAfter(stb)) { + stb->backwards = !stb->backwards; + swap(stb->start, stb->finish); + } +} + +void SSurface::ScaleSelfBy(double s) { + int i, j; + for(i = 0; i <= degm; i++) { + for(j = 0; j <= degn; j++) { + ctrl[i][j] = ctrl[i][j].ScaledBy(s); + } + } +} + +void SSurface::Clear(void) { + trim.Clear(); +} + +typedef struct { + hSCurve hc; + hSSurface hs; +} TrimLine; + +void SShell::MakeFromExtrusionOf(SBezierLoopSet *sbls, Vector t0, Vector t1, RgbaColor color) +{ + // Make the extrusion direction consistent with respect to the normal + // of the sketch we're extruding. + if((t0.Minus(t1)).Dot(sbls->normal) < 0) { + swap(t0, t1); + } + + // Define a coordinate system to contain the original sketch, and get + // a bounding box in that csys + Vector n = sbls->normal.ScaledBy(-1); + Vector u = n.Normal(0), v = n.Normal(1); + Vector orig = sbls->point; + double umax = 1e-10, umin = 1e10; + sbls->GetBoundingProjd(u, orig, &umin, &umax); + double vmax = 1e-10, vmin = 1e10; + sbls->GetBoundingProjd(v, orig, &vmin, &vmax); + // and now fix things up so that all u and v lie between 0 and 1 + orig = orig.Plus(u.ScaledBy(umin)); + orig = orig.Plus(v.ScaledBy(vmin)); + u = u.ScaledBy(umax - umin); + v = v.ScaledBy(vmax - vmin); + + // So we can now generate the top and bottom surfaces of the extrusion, + // planes within a translated (and maybe mirrored) version of that csys. + SSurface s0, s1; + s0 = SSurface::FromPlane(orig.Plus(t0), u, v); + s0.color = color; + s1 = SSurface::FromPlane(orig.Plus(t1).Plus(u), u.ScaledBy(-1), v); + s1.color = color; + hSSurface hs0 = surface.AddAndAssignId(&s0), + hs1 = surface.AddAndAssignId(&s1); + + // Now go through the input curves. For each one, generate its surface + // of extrusion, its two translated trim curves, and one trim line. We + // go through by loops so that we can assign the lines correctly. + SBezierLoop *sbl; + for(sbl = sbls->l.First(); sbl; sbl = sbls->l.NextAfter(sbl)) { + SBezier *sb; + List trimLines = {}; + + for(sb = sbl->l.First(); sb; sb = sbl->l.NextAfter(sb)) { + // Generate the surface of extrusion of this curve, and add + // it to the list + SSurface ss = SSurface::FromExtrusionOf(sb, t0, t1); + ss.color = color; + hSSurface hsext = surface.AddAndAssignId(&ss); + + // Translate the curve by t0 and t1 to produce two trim curves + SCurve sc = {}; + sc.isExact = true; + sc.exact = sb->TransformedBy(t0, Quaternion::IDENTITY, 1.0); + (sc.exact).MakePwlInto(&(sc.pts)); + sc.surfA = hs0; + sc.surfB = hsext; + hSCurve hc0 = curve.AddAndAssignId(&sc); + + sc = {}; + sc.isExact = true; + sc.exact = sb->TransformedBy(t1, Quaternion::IDENTITY, 1.0); + (sc.exact).MakePwlInto(&(sc.pts)); + sc.surfA = hs1; + sc.surfB = hsext; + hSCurve hc1 = curve.AddAndAssignId(&sc); + + STrimBy stb0, stb1; + // The translated curves trim the flat top and bottom surfaces. + stb0 = STrimBy::EntireCurve(this, hc0, false); + stb1 = STrimBy::EntireCurve(this, hc1, true); + (surface.FindById(hs0))->trim.Add(&stb0); + (surface.FindById(hs1))->trim.Add(&stb1); + + // The translated curves also trim the surface of extrusion. + stb0 = STrimBy::EntireCurve(this, hc0, true); + stb1 = STrimBy::EntireCurve(this, hc1, false); + (surface.FindById(hsext))->trim.Add(&stb0); + (surface.FindById(hsext))->trim.Add(&stb1); + + // And form the trim line + Vector pt = sb->Finish(); + sc = {}; + sc.isExact = true; + sc.exact = SBezier::From(pt.Plus(t0), pt.Plus(t1)); + (sc.exact).MakePwlInto(&(sc.pts)); + hSCurve hl = curve.AddAndAssignId(&sc); + // save this for later + TrimLine tl; + tl.hc = hl; + tl.hs = hsext; + trimLines.Add(&tl); + } + + int i; + for(i = 0; i < trimLines.n; i++) { + TrimLine *tl = &(trimLines.elem[i]); + SSurface *ss = surface.FindById(tl->hs); + + TrimLine *tlp = &(trimLines.elem[WRAP(i-1, trimLines.n)]); + + STrimBy stb; + stb = STrimBy::EntireCurve(this, tl->hc, true); + ss->trim.Add(&stb); + stb = STrimBy::EntireCurve(this, tlp->hc, false); + ss->trim.Add(&stb); + + (curve.FindById(tl->hc))->surfA = ss->h; + (curve.FindById(tlp->hc))->surfB = ss->h; + } + trimLines.Clear(); + } +} + + +typedef struct { + hSSurface d[4]; +} Revolved; + +void SShell::MakeFromRevolutionOf(SBezierLoopSet *sbls, Vector pt, Vector axis, RgbaColor color, Group *group) +{ + SBezierLoop *sbl; + + int i0 = surface.n, i; + + // Normalize the axis direction so that the direction of revolution + // ends up parallel to the normal of the sketch, on the side of the + // axis where the sketch is. + Vector pto; + double md = VERY_NEGATIVE; + for(sbl = sbls->l.First(); sbl; sbl = sbls->l.NextAfter(sbl)) { + SBezier *sb; + for(sb = sbl->l.First(); sb; sb = sbl->l.NextAfter(sb)) { + // Choose the point farthest from the axis; we'll get garbage + // if we choose a point that lies on the axis, for example. + // (And our surface will be self-intersecting if the sketch + // spans the axis, so don't worry about that.) + Vector p = sb->Start(); + double d = p.DistanceToLine(pt, axis); + if(d > md) { + md = d; + pto = p; + } + } + } + Vector ptc = pto.ClosestPointOnLine(pt, axis), + up = (pto.Minus(ptc)).WithMagnitude(1), + vp = (sbls->normal).Cross(up); + if(vp.Dot(axis) < 0) { + axis = axis.ScaledBy(-1); + } + + // Now we actually build and trim the surfaces. + for(sbl = sbls->l.First(); sbl; sbl = sbls->l.NextAfter(sbl)) { + int i, j; + SBezier *sb; + List hsl = {}; + + for(sb = sbl->l.First(); sb; sb = sbl->l.NextAfter(sb)) { + Revolved revs; + for(j = 0; j < 4; j++) { + if(sb->deg == 1 && + (sb->ctrl[0]).DistanceToLine(pt, axis) < LENGTH_EPS && + (sb->ctrl[1]).DistanceToLine(pt, axis) < LENGTH_EPS) + { + // This is a line on the axis of revolution; it does + // not contribute a surface. + revs.d[j].v = 0; + } else { + SSurface ss = SSurface::FromRevolutionOf(sb, pt, axis, + (PI/2)*j, + (PI/2)*(j+1)); + ss.color = color; + if(sb->entity != 0) { + hEntity he; + he.v = sb->entity; + hEntity hface = group->Remap(he, Group::REMAP_LINE_TO_FACE); + if(SK.entity.FindByIdNoOops(hface) != NULL) { + ss.face = hface.v; + } + } + revs.d[j] = surface.AddAndAssignId(&ss); + } + } + hsl.Add(&revs); + } + + for(i = 0; i < sbl->l.n; i++) { + Revolved revs = hsl.elem[i], + revsp = hsl.elem[WRAP(i-1, sbl->l.n)]; + + sb = &(sbl->l.elem[i]); + + for(j = 0; j < 4; j++) { + SCurve sc; + Quaternion qs = Quaternion::From(axis, (PI/2)*j); + // we want Q*(x - p) + p = Q*x + (p - Q*p) + Vector ts = pt.Minus(qs.Rotate(pt)); + + // If this input curve generate a surface, then trim that + // surface with the rotated version of the input curve. + if(revs.d[j].v) { + sc = {}; + sc.isExact = true; + sc.exact = sb->TransformedBy(ts, qs, 1.0); + (sc.exact).MakePwlInto(&(sc.pts)); + sc.surfA = revs.d[j]; + sc.surfB = revs.d[WRAP(j-1, 4)]; + + hSCurve hcb = curve.AddAndAssignId(&sc); + + STrimBy stb; + stb = STrimBy::EntireCurve(this, hcb, true); + (surface.FindById(sc.surfA))->trim.Add(&stb); + stb = STrimBy::EntireCurve(this, hcb, false); + (surface.FindById(sc.surfB))->trim.Add(&stb); + } + + // And if this input curve and the one after it both generated + // surfaces, then trim both of those by the appropriate + // circle. + if(revs.d[j].v && revsp.d[j].v) { + SSurface *ss = surface.FindById(revs.d[j]); + + sc = {}; + sc.isExact = true; + sc.exact = SBezier::From(ss->ctrl[0][0], + ss->ctrl[0][1], + ss->ctrl[0][2]); + sc.exact.weight[1] = ss->weight[0][1]; + (sc.exact).MakePwlInto(&(sc.pts)); + sc.surfA = revs.d[j]; + sc.surfB = revsp.d[j]; + + hSCurve hcc = curve.AddAndAssignId(&sc); + + STrimBy stb; + stb = STrimBy::EntireCurve(this, hcc, false); + (surface.FindById(sc.surfA))->trim.Add(&stb); + stb = STrimBy::EntireCurve(this, hcc, true); + (surface.FindById(sc.surfB))->trim.Add(&stb); + } + } + } + + hsl.Clear(); + } + + for(i = i0; i < surface.n; i++) { + SSurface *srf = &(surface.elem[i]); + + // Revolution of a line; this is potentially a plane, which we can + // rewrite to have degree (1, 1). + if(srf->degm == 1 && srf->degn == 2) { + // close start, far start, far finish + Vector cs, fs, ff; + double d0, d1; + d0 = (srf->ctrl[0][0]).DistanceToLine(pt, axis); + d1 = (srf->ctrl[1][0]).DistanceToLine(pt, axis); + + if(d0 > d1) { + cs = srf->ctrl[1][0]; + fs = srf->ctrl[0][0]; + ff = srf->ctrl[0][2]; + } else { + cs = srf->ctrl[0][0]; + fs = srf->ctrl[1][0]; + ff = srf->ctrl[1][2]; + } + + // origin close, origin far + Vector oc = cs.ClosestPointOnLine(pt, axis), + of = fs.ClosestPointOnLine(pt, axis); + + if(oc.Equals(of)) { + // This is a plane, not a (non-degenerate) cone. + Vector oldn = srf->NormalAt(0.5, 0.5); + + Vector u = fs.Minus(of), v; + + v = (axis.Cross(u)).WithMagnitude(1); + + double vm = (ff.Minus(of)).Dot(v); + v = v.ScaledBy(vm); + + srf->degm = 1; + srf->degn = 1; + srf->ctrl[0][0] = of; + srf->ctrl[0][1] = of.Plus(u); + srf->ctrl[1][0] = of.Plus(v); + srf->ctrl[1][1] = of.Plus(u).Plus(v); + srf->weight[0][0] = 1; + srf->weight[0][1] = 1; + srf->weight[1][0] = 1; + srf->weight[1][1] = 1; + + if(oldn.Dot(srf->NormalAt(0.5, 0.5)) < 0) { + swap(srf->ctrl[0][0], srf->ctrl[1][0]); + swap(srf->ctrl[0][1], srf->ctrl[1][1]); + } + continue; + } + + if(fabs(d0 - d1) < LENGTH_EPS) { + // This is a cylinder; so transpose it so that we'll recognize + // it as a surface of extrusion. + SSurface sn = *srf; + + // Transposing u and v flips the normal, so reverse u to + // flip it again and put it back where we started. + sn.degm = 2; + sn.degn = 1; + int dm, dn; + for(dm = 0; dm <= 1; dm++) { + for(dn = 0; dn <= 2; dn++) { + sn.ctrl [dn][dm] = srf->ctrl [1-dm][dn]; + sn.weight[dn][dm] = srf->weight[1-dm][dn]; + } + } + + *srf = sn; + continue; + } + } + + } + +} + +void SShell::MakeFromCopyOf(SShell *a) { + MakeFromTransformationOf(a, + Vector::From(0, 0, 0), Quaternion::IDENTITY, 1.0); +} + +void SShell::MakeFromTransformationOf(SShell *a, + Vector t, Quaternion q, double scale) +{ + booleanFailed = false; + + SSurface *s; + for(s = a->surface.First(); s; s = a->surface.NextAfter(s)) { + SSurface n; + n = SSurface::FromTransformationOf(s, t, q, scale, true); + surface.Add(&n); // keeping the old ID + } + + SCurve *c; + for(c = a->curve.First(); c; c = a->curve.NextAfter(c)) { + SCurve n; + n = SCurve::FromTransformationOf(c, t, q, scale); + curve.Add(&n); // keeping the old ID + } +} + +void SShell::MakeEdgesInto(SEdgeList *sel) { + SSurface *s; + for(s = surface.First(); s; s = surface.NextAfter(s)) { + s->MakeEdgesInto(this, sel, SSurface::AS_XYZ); + } +} + +void SShell::MakeSectionEdgesInto(Vector n, double d, + SEdgeList *sel, SBezierList *sbl) +{ + SSurface *s; + for(s = surface.First(); s; s = surface.NextAfter(s)) { + if(s->CoincidentWithPlane(n, d)) { + s->MakeSectionEdgesInto(this, sel, sbl); + } + } +} + +void SShell::TriangulateInto(SMesh *sm) { + SSurface *s; + for(s = surface.First(); s; s = surface.NextAfter(s)) { + s->TriangulateInto(this, sm); + } +} + +bool SShell::IsEmpty(void) { + return (surface.n == 0); +} + +void SShell::Clear(void) { + SSurface *s; + for(s = surface.First(); s; s = surface.NextAfter(s)) { + s->Clear(); + } + surface.Clear(); + + SCurve *c; + for(c = curve.First(); c; c = curve.NextAfter(c)) { + c->Clear(); + } + curve.Clear(); +} + diff --git a/src/srf/surface.h b/src/srf/surface.h new file mode 100644 index 0000000..86d69db --- /dev/null +++ b/src/srf/surface.h @@ -0,0 +1,423 @@ +//----------------------------------------------------------------------------- +// Functions relating to rational polynomial surfaces, which are trimmed by +// curves (either rational polynomial curves, or piecewise linear +// approximations to curves of intersection that can't be represented +// exactly in ratpoly form), and assembled into watertight shells. +// +// Copyright 2008-2013 Jonathan Westhues. +//----------------------------------------------------------------------------- + +#ifndef __SURFACE_H +#define __SURFACE_H + +// Utility functions, Bernstein polynomials of order 1-3 and their derivatives. +double Bernstein(int k, int deg, double t); +double BernsteinDerivative(int k, int deg, double t); + +class SSurface; +class SCurvePt; + +// Utility data structure, a two-dimensional BSP to accelerate polygon +// operations. +class SBspUv { +public: + Point2d a, b; + + SBspUv *pos; + SBspUv *neg; + + SBspUv *more; + + enum { + INSIDE = 100, + OUTSIDE = 200, + EDGE_PARALLEL = 300, + EDGE_ANTIPARALLEL = 400, + EDGE_OTHER = 500 + }; + + static SBspUv *Alloc(void); + static SBspUv *From(SEdgeList *el, SSurface *srf); + + void ScalePoints(Point2d *pt, Point2d *a, Point2d *b, SSurface *srf); + double ScaledSignedDistanceToLine(Point2d pt, Point2d a, Point2d b, + SSurface *srf); + double ScaledDistanceToLine(Point2d pt, Point2d a, Point2d b, bool seg, + SSurface *srf); + + void InsertEdge(Point2d a, Point2d b, SSurface *srf); + static SBspUv *InsertOrCreateEdge(SBspUv *where, const Point2d &ea, const Point2d &eb, SSurface *srf); + int ClassifyPoint(Point2d p, Point2d eb, SSurface *srf); + int ClassifyEdge(Point2d ea, Point2d eb, SSurface *srf); + double MinimumDistanceToEdge(Point2d p, SSurface *srf); +}; + +// Now the data structures to represent a shell of trimmed rational polynomial +// surfaces. + +class SShell; + +class hSSurface { +public: + uint32_t v; +}; + +class hSCurve { +public: + uint32_t v; +}; + +// Stuff for rational polynomial curves, of degree one to three. These are +// our inputs, and are also calculated for certain exact surface-surface +// intersections. +class SBezier { +public: + int tag; + int auxA, auxB; + + int deg; + Vector ctrl[4]; + double weight[4]; + uint32_t entity; + + Vector PointAt(double t); + Vector TangentAt(double t); + void ClosestPointTo(Vector p, double *t, bool converge=true); + void SplitAt(double t, SBezier *bef, SBezier *aft); + bool PointOnThisAndCurve(SBezier *sbb, Vector *p); + + Vector Start(void); + Vector Finish(void); + bool Equals(SBezier *b); + void MakePwlInto(SEdgeList *sel, double chordTol=0); + void MakePwlInto(List *l, double chordTol=0); + void MakePwlInto(SContour *sc, double chordTol=0); + void MakePwlInto(List *l, double chordTol=0); + void MakePwlWorker(List *l, double ta, double tb, double chordTol); + void MakePwlInitialWorker(List *l, double ta, double tb, double chordTol); + + void AllIntersectionsWith(SBezier *sbb, SPointList *spl); + void GetBoundingProjd(Vector u, Vector orig, double *umin, double *umax); + void Reverse(void); + + bool IsInPlane(Vector n, double d); + bool IsCircle(Vector axis, Vector *center, double *r); + bool IsRational(void); + + SBezier TransformedBy(Vector t, Quaternion q, double scale); + SBezier InPerspective(Vector u, Vector v, Vector n, + Vector origin, double cameraTan); + void ScaleSelfBy(double s); + + static SBezier From(Vector p0, Vector p1, Vector p2, Vector p3); + static SBezier From(Vector p0, Vector p1, Vector p2); + static SBezier From(Vector p0, Vector p1); + static SBezier From(Vector4 p0, Vector4 p1, Vector4 p2, Vector4 p3); + static SBezier From(Vector4 p0, Vector4 p1, Vector4 p2); + static SBezier From(Vector4 p0, Vector4 p1); +}; + +class SBezierList { +public: + List l; + + void Clear(void); + void ScaleSelfBy(double s); + void CullIdenticalBeziers(void); + void AllIntersectionsWith(SBezierList *sblb, SPointList *spl); + bool GetPlaneContainingBeziers(Vector *p, Vector *u, Vector *v, + Vector *notCoplanarAt); +}; + +class SBezierLoop { +public: + int tag; + List l; + + inline void Clear(void) { l.Clear(); } + bool IsClosed(void); + void Reverse(void); + void MakePwlInto(SContour *sc, double chordTol=0); + void GetBoundingProjd(Vector u, Vector orig, double *umin, double *umax); + + static SBezierLoop FromCurves(SBezierList *spcl, + bool *allClosed, SEdge *errorAt); +}; + +class SBezierLoopSet { +public: + List l; + Vector normal; + Vector point; + + static SBezierLoopSet From(SBezierList *spcl, SPolygon *poly, + double chordTol, + bool *allClosed, SEdge *errorAt, + SBezierList *openContours); + + void GetBoundingProjd(Vector u, Vector orig, double *umin, double *umax); + void MakePwlInto(SPolygon *sp); + void Clear(void); +}; + +class SBezierLoopSetSet { +public: + List l; + + void FindOuterFacesFrom(SBezierList *sbl, SPolygon *spxyz, SSurface *srfuv, + double chordTol, + bool *allClosed, SEdge *notClosedAt, + bool *allCoplanar, Vector *notCoplanarAt, + SBezierList *openContours); + void AddOpenPath(SBezier *sb); + void Clear(void); +}; + +// Stuff for the surface trim curves: piecewise linear +class SCurvePt { +public: + int tag; + Vector p; + bool vertex; +}; + +class SCurve { +public: + hSCurve h; + + // In a Boolean, C = A op B. The curves in A and B get copied into C, and + // therefore must get new hSCurves assigned. For the curves in A and B, + // we use newH to record their new handle in C. + hSCurve newH; + enum { + FROM_A = 100, + FROM_B = 200, + FROM_INTERSECTION = 300 + }; + int source; + + bool isExact; + SBezier exact; + + List pts; + + hSSurface surfA; + hSSurface surfB; + + static SCurve FromTransformationOf(SCurve *a, Vector t, Quaternion q, + double scale); + SCurve MakeCopySplitAgainst(SShell *agnstA, SShell *agnstB, + SSurface *srfA, SSurface *srfB); + void RemoveShortSegments(SSurface *srfA, SSurface *srfB); + SSurface *GetSurfaceA(SShell *a, SShell *b); + SSurface *GetSurfaceB(SShell *a, SShell *b); + + void Clear(void); +}; + +// A segment of a curve by which a surface is trimmed: indicates which curve, +// by its handle, and the starting and ending points of our segment of it. +// The vector out points out of the surface; it, the surface outer normal, +// and a tangent to the beginning of the curve are all orthogonal. +class STrimBy { +public: + hSCurve curve; + bool backwards; + // If a trim runs backwards, then start and finish still correspond to + // the actual start and finish, but they appear in reverse order in + // the referenced curve. + Vector start; + Vector finish; + + static STrimBy EntireCurve(SShell *shell, hSCurve hsc, bool bkwds); +}; + +// An intersection point between a line and a surface +class SInter { +public: + int tag; + Vector p; + SSurface *srf; + Point2d pinter; + Vector surfNormal; // of the intersecting surface, at pinter + bool onEdge; // pinter is on edge of trim poly +}; + +// A rational polynomial surface in Bezier form. +class SSurface { +public: + int tag; + hSSurface h; + + // Same as newH for the curves; record what a surface gets renamed to + // when I copy things over. + hSSurface newH; + + RgbaColor color; + uint32_t face; + + int degm, degn; + Vector ctrl[4][4]; + double weight[4][4]; + + List trim; + + // For testing whether a point (u, v) on the surface lies inside the trim + SBspUv *bsp; + SEdgeList edges; + + // For caching our initial (u, v) when doing Newton iterations to project + // a point into our surface. + Point2d cached; + + static SSurface FromExtrusionOf(SBezier *spc, Vector t0, Vector t1); + static SSurface FromRevolutionOf(SBezier *sb, Vector pt, Vector axis, + double thetas, double thetaf); + static SSurface FromPlane(Vector pt, Vector u, Vector v); + static SSurface FromTransformationOf(SSurface *a, Vector t, Quaternion q, + double scale, + bool includingTrims); + void ScaleSelfBy(double s); + + void EdgeNormalsWithinSurface(Point2d auv, Point2d buv, + Vector *pt, Vector *enin, Vector *enout, + Vector *surfn, + uint32_t auxA, + SShell *shell, SShell *sha, SShell *shb); + void FindChainAvoiding(SEdgeList *src, SEdgeList *dest, SPointList *avoid); + SSurface MakeCopyTrimAgainst(SShell *parent, SShell *a, SShell *b, + SShell *into, int type); + void TrimFromEdgeList(SEdgeList *el, bool asUv); + void IntersectAgainst(SSurface *b, SShell *agnstA, SShell *agnstB, + SShell *into); + void AddExactIntersectionCurve(SBezier *sb, SSurface *srfB, + SShell *agnstA, SShell *agnstB, SShell *into); + + typedef struct { + int tag; + Point2d p; + } Inter; + void WeightControlPoints(void); + void UnWeightControlPoints(void); + void CopyRowOrCol(bool row, int this_ij, SSurface *src, int src_ij); + void BlendRowOrCol(bool row, int this_ij, SSurface *a, int a_ij, + SSurface *b, int b_ij); + double DepartureFromCoplanar(void); + void SplitInHalf(bool byU, SSurface *sa, SSurface *sb); + void AllPointsIntersecting(Vector a, Vector b, + List *l, + bool seg, bool trimmed, bool inclTangent); + void AllPointsIntersectingUntrimmed(Vector a, Vector b, + int *cnt, int *level, + List *l, bool segment, + SSurface *sorig); + + void ClosestPointTo(Vector p, Point2d *puv, bool converge=true); + void ClosestPointTo(Vector p, double *u, double *v, bool converge=true); + bool ClosestPointNewton(Vector p, double *u, double *v, bool converge=true); + + bool PointIntersectingLine(Vector p0, Vector p1, double *u, double *v); + Vector ClosestPointOnThisAndSurface(SSurface *srf2, Vector p); + void PointOnSurfaces(SSurface *s1, SSurface *s2, double *u, double *v); + Vector PointAt(double u, double v); + Vector PointAt(Point2d puv); + void TangentsAt(double u, double v, Vector *tu, Vector *tv); + Vector NormalAt(Point2d puv); + Vector NormalAt(double u, double v); + bool LineEntirelyOutsideBbox(Vector a, Vector b, bool segment); + void GetAxisAlignedBounding(Vector *ptMax, Vector *ptMin); + bool CoincidentWithPlane(Vector n, double d); + bool CoincidentWith(SSurface *ss, bool sameNormal); + bool IsExtrusion(SBezier *of, Vector *along); + bool IsCylinder(Vector *axis, Vector *center, double *r, + Vector *start, Vector *finish); + + void TriangulateInto(SShell *shell, SMesh *sm); + + // these are intended as bitmasks, even though there's just one now + enum { + AS_UV = 0x01, + AS_XYZ = 0x00 + }; + void MakeTrimEdgesInto(SEdgeList *sel, int flags, SCurve *sc, STrimBy *stb); + void MakeEdgesInto(SShell *shell, SEdgeList *sel, int flags, + SShell *useCurvesFrom=NULL); + + Vector ExactSurfaceTangentAt(Vector p, SSurface *srfA, SSurface *srfB, + Vector dir); + void MakeSectionEdgesInto(SShell *shell, SEdgeList *sel, SBezierList *sbl); + void MakeClassifyingBsp(SShell *shell, SShell *useCurvesFrom); + double ChordToleranceForEdge(Vector a, Vector b); + void MakeTriangulationGridInto(List *l, double vs, double vf, + bool swapped); + Vector PointAtMaybeSwapped(double u, double v, bool swapped); + + void Reverse(void); + void Clear(void); +}; + +class SShell { +public: + IdList curve; + IdList surface; + + bool booleanFailed; + + void MakeFromExtrusionOf(SBezierLoopSet *sbls, Vector t0, Vector t1, + RgbaColor color); + void MakeFromRevolutionOf(SBezierLoopSet *sbls, Vector pt, Vector axis, + RgbaColor color, Group *group); + + void MakeFromUnionOf(SShell *a, SShell *b); + void MakeFromDifferenceOf(SShell *a, SShell *b); + enum { + AS_UNION = 10, + AS_DIFFERENCE = 11, + AS_INTERSECT = 12 + }; + void MakeFromBoolean(SShell *a, SShell *b, int type); + void CopyCurvesSplitAgainst(bool opA, SShell *agnst, SShell *into); + void CopySurfacesTrimAgainst(SShell *sha, SShell *shb, SShell *into, + int type); + void MakeIntersectionCurvesAgainst(SShell *against, SShell *into); + void MakeClassifyingBsps(SShell *useCurvesFrom); + void AllPointsIntersecting(Vector a, Vector b, List *il, + bool seg, bool trimmed, bool inclTangent); + void MakeCoincidentEdgesInto(SSurface *proto, bool sameNormal, + SEdgeList *el, SShell *useCurvesFrom); + void RewriteSurfaceHandlesForCurves(SShell *a, SShell *b); + void CleanupAfterBoolean(void); + + // Definitions when classifying regions of a surface; it is either inside, + // outside, or coincident (with parallel or antiparallel normal) with a + // shell. + enum { + INSIDE = 100, + OUTSIDE = 200, + COINC_SAME = 300, + COINC_OPP = 400 + }; + static const double DOTP_TOL; + int ClassifyRegion(Vector edge_n, Vector inter_surf_n, Vector edge_surf_n); + bool ClassifyEdge(int *indir, int *outdir, + Vector ea, Vector eb, + Vector p, + Vector edge_n_in, Vector edge_n_out, Vector surf_n); + + void MakeFromCopyOf(SShell *a); + void MakeFromTransformationOf(SShell *a, + Vector trans, Quaternion q, double scale); + void MakeFromAssemblyOf(SShell *a, SShell *b); + void MergeCoincidentSurfaces(void); + + void TriangulateInto(SMesh *sm); + void MakeEdgesInto(SEdgeList *sel); + void MakeSectionEdgesInto(Vector n, double d, + SEdgeList *sel, SBezierList *sbl); + bool IsEmpty(void); + void RemapFaces(Group *g, int remap); + void Clear(void); +}; + +#endif + diff --git a/src/srf/surfinter.cpp b/src/srf/surfinter.cpp new file mode 100644 index 0000000..79d71cd --- /dev/null +++ b/src/srf/surfinter.cpp @@ -0,0 +1,525 @@ +//----------------------------------------------------------------------------- +// How to intersect two surfaces, to get some type of curve. This is either +// an exact special case (e.g., two planes to make a line), or a numerical +// thing. +// +// Copyright 2008-2013 Jonathan Westhues. +//----------------------------------------------------------------------------- +#include "solvespace.h" + +extern int FLAG; + +void SSurface::AddExactIntersectionCurve(SBezier *sb, SSurface *srfB, + SShell *agnstA, SShell *agnstB, SShell *into) +{ + SCurve sc = {}; + // Important to keep the order of (surfA, surfB) consistent; when we later + // rewrite the identifiers, we rewrite surfA from A and surfB from B. + sc.surfA = h; + sc.surfB = srfB->h; + sc.exact = *sb; + sc.isExact = true; + + // Now we have to piecewise linearize the curve. If there's already an + // identical curve in the shell, then follow that pwl exactly, otherwise + // calculate from scratch. + SCurve split, *existing = NULL, *se; + SBezier sbrev = *sb; + sbrev.Reverse(); + bool backwards = false; + for(se = into->curve.First(); se; se = into->curve.NextAfter(se)) { + if(se->isExact) { + if(sb->Equals(&(se->exact))) { + existing = se; + break; + } + if(sbrev.Equals(&(se->exact))) { + existing = se; + backwards = true; + break; + } + } + } + if(existing) { + SCurvePt *v; + for(v = existing->pts.First(); v; v = existing->pts.NextAfter(v)) { + sc.pts.Add(v); + } + if(backwards) sc.pts.Reverse(); + split = sc; + sc = {}; + } else { + sb->MakePwlInto(&(sc.pts)); + // and split the line where it intersects our existing surfaces + split = sc.MakeCopySplitAgainst(agnstA, agnstB, this, srfB); + sc.Clear(); + } + + // Test if the curve lies entirely outside one of the + SCurvePt *scpt; + bool withinA = false, withinB = false; + for(scpt = split.pts.First(); scpt; scpt = split.pts.NextAfter(scpt)) { + double tol = 0.01; + Point2d puv; + ClosestPointTo(scpt->p, &puv); + if(puv.x > -tol && puv.x < 1 + tol && + puv.y > -tol && puv.y < 1 + tol) + { + withinA = true; + } + srfB->ClosestPointTo(scpt->p, &puv); + if(puv.x > -tol && puv.x < 1 + tol && + puv.y > -tol && puv.y < 1 + tol) + { + withinB = true; + } + // Break out early, no sense wasting time if we already have the answer. + if(withinA && withinB) break; + } + if(!(withinA && withinB)) { + // Intersection curve lies entirely outside one of the surfaces, so + // it's fake. + split.Clear(); + return; + } + +#if 0 + if(sb->deg == 2) { + dbp(" "); + SCurvePt *prev = NULL, *v; + dbp("split.pts.n = %d", split.pts.n); + for(v = split.pts.First(); v; v = split.pts.NextAfter(v)) { + if(prev) { + Vector e = (prev->p).Minus(v->p).WithMagnitude(0); + SS.nakedEdges.AddEdge((prev->p).Plus(e), (v->p).Minus(e)); + } + prev = v; + } + } +#endif // 0 + // Nothing should be generating zero-len edges. + if((sb->Start()).Equals(sb->Finish())) oops(); + + split.source = SCurve::FROM_INTERSECTION; + into->curve.AddAndAssignId(&split); +} + +void SSurface::IntersectAgainst(SSurface *b, SShell *agnstA, SShell *agnstB, + SShell *into) +{ + Vector amax, amin, bmax, bmin; + GetAxisAlignedBounding(&amax, &amin); + b->GetAxisAlignedBounding(&bmax, &bmin); + + if(Vector::BoundingBoxesDisjoint(amax, amin, bmax, bmin)) { + // They cannot possibly intersect, no curves to generate + return; + } + + Vector alongt, alongb; + SBezier oft, ofb; + bool isExtdt = this->IsExtrusion(&oft, &alongt), + isExtdb = b->IsExtrusion(&ofb, &alongb); + + if(degm == 1 && degn == 1 && b->degm == 1 && b->degn == 1) { + // Line-line intersection; it's a plane or nothing. + Vector na = NormalAt(0, 0).WithMagnitude(1), + nb = b->NormalAt(0, 0).WithMagnitude(1); + double da = na.Dot(PointAt(0, 0)), + db = nb.Dot(b->PointAt(0, 0)); + + Vector dl = na.Cross(nb); + if(dl.Magnitude() < LENGTH_EPS) return; // parallel planes + dl = dl.WithMagnitude(1); + Vector p = Vector::AtIntersectionOfPlanes(na, da, nb, db); + + // Trim it to the region 0 <= {u,v} <= 1 for each plane; not strictly + // necessary, since line will be split and excess edges culled, but + // this improves speed and robustness. + int i; + double tmax = VERY_POSITIVE, tmin = VERY_NEGATIVE; + for(i = 0; i < 2; i++) { + SSurface *s = (i == 0) ? this : b; + Vector tu, tv; + s->TangentsAt(0, 0, &tu, &tv); + + double up, vp, ud, vd; + s->ClosestPointTo(p, &up, &vp); + ud = (dl.Dot(tu)) / tu.MagSquared(); + vd = (dl.Dot(tv)) / tv.MagSquared(); + + // so u = up + t*ud + // v = vp + t*vd + if(ud > LENGTH_EPS) { + tmin = max(tmin, -up/ud); + tmax = min(tmax, (1 - up)/ud); + } else if(ud < -LENGTH_EPS) { + tmax = min(tmax, -up/ud); + tmin = max(tmin, (1 - up)/ud); + } else { + if(up < -LENGTH_EPS || up > 1 + LENGTH_EPS) { + // u is constant, and outside [0, 1] + tmax = VERY_NEGATIVE; + } + } + if(vd > LENGTH_EPS) { + tmin = max(tmin, -vp/vd); + tmax = min(tmax, (1 - vp)/vd); + } else if(vd < -LENGTH_EPS) { + tmax = min(tmax, -vp/vd); + tmin = max(tmin, (1 - vp)/vd); + } else { + if(vp < -LENGTH_EPS || vp > 1 + LENGTH_EPS) { + // v is constant, and outside [0, 1] + tmax = VERY_NEGATIVE; + } + } + } + + if(tmax > tmin + LENGTH_EPS) { + SBezier bezier = SBezier::From(p.Plus(dl.ScaledBy(tmin)), + p.Plus(dl.ScaledBy(tmax))); + AddExactIntersectionCurve(&bezier, b, agnstA, agnstB, into); + } + } else if((degm == 1 && degn == 1 && isExtdb) || + (b->degm == 1 && b->degn == 1 && isExtdt)) + { + // The intersection between a plane and a surface of extrusion + SSurface *splane, *sext; + if(degm == 1 && degn == 1) { + splane = this; + sext = b; + } else { + splane = b; + sext = this; + } + + Vector n = splane->NormalAt(0, 0).WithMagnitude(1), along; + double d = n.Dot(splane->PointAt(0, 0)); + SBezier bezier; + (void)sext->IsExtrusion(&bezier, &along); + + if(fabs(n.Dot(along)) < LENGTH_EPS) { + // Direction of extrusion is parallel to plane; so intersection + // is zero or more lines. Build a line within the plane, and + // normal to the direction of extrusion, and intersect that line + // against the surface; each intersection point corresponds to + // a line. + Vector pm, alu, p0, dp; + // a point halfway along the extrusion + pm = ((sext->ctrl[0][0]).Plus(sext->ctrl[0][1])).ScaledBy(0.5); + alu = along.WithMagnitude(1); + dp = (n.Cross(along)).WithMagnitude(1); + // n, alu, and dp form an orthogonal csys; set n component to + // place it on the plane, alu component to lie halfway along + // extrusion, and dp component doesn't matter so zero + p0 = n.ScaledBy(d).Plus(alu.ScaledBy(pm.Dot(alu))); + + List inters = {}; + sext->AllPointsIntersecting( + p0, p0.Plus(dp), &inters, false, false, true); + + SInter *si; + for(si = inters.First(); si; si = inters.NextAfter(si)) { + Vector al = along.ScaledBy(0.5); + SBezier bezier; + bezier = SBezier::From((si->p).Minus(al), (si->p).Plus(al)); + AddExactIntersectionCurve(&bezier, b, agnstA, agnstB, into); + } + + inters.Clear(); + } else { + // Direction of extrusion is not parallel to plane; so + // intersection is projection of extruded curve into our plane. + int i; + for(i = 0; i <= bezier.deg; i++) { + Vector p0 = bezier.ctrl[i], + p1 = p0.Plus(along); + + bezier.ctrl[i] = + Vector::AtIntersectionOfPlaneAndLine(n, d, p0, p1, NULL); + } + + AddExactIntersectionCurve(&bezier, b, agnstA, agnstB, into); + } + } else if(isExtdt && isExtdb && + sqrt(fabs(alongt.Dot(alongb))) > + sqrt(alongt.Magnitude() * alongb.Magnitude()) - LENGTH_EPS) + { + // Two surfaces of extrusion along the same axis. So they might + // intersect along some number of lines parallel to the axis. + Vector axis = alongt.WithMagnitude(1); + + List inters = {}; + List lv = {}; + + double a_axis0 = ( ctrl[0][0]).Dot(axis), + a_axis1 = ( ctrl[0][1]).Dot(axis), + b_axis0 = (b->ctrl[0][0]).Dot(axis), + b_axis1 = (b->ctrl[0][1]).Dot(axis); + + if(a_axis0 > a_axis1) swap(a_axis0, a_axis1); + if(b_axis0 > b_axis1) swap(b_axis0, b_axis1); + + double ab_axis0 = max(a_axis0, b_axis0), + ab_axis1 = min(a_axis1, b_axis1); + + if(fabs(ab_axis0 - ab_axis1) < LENGTH_EPS) { + // The line would be zero-length + return; + } + + Vector axis0 = axis.ScaledBy(ab_axis0), + axis1 = axis.ScaledBy(ab_axis1), + axisc = (axis0.Plus(axis1)).ScaledBy(0.5); + + oft.MakePwlInto(&lv); + + int i; + for(i = 0; i < lv.n - 1; i++) { + Vector pa = lv.elem[i], pb = lv.elem[i+1]; + pa = pa.Minus(axis.ScaledBy(pa.Dot(axis))); + pb = pb.Minus(axis.ScaledBy(pb.Dot(axis))); + pa = pa.Plus(axisc); + pb = pb.Plus(axisc); + + b->AllPointsIntersecting(pa, pb, &inters, true, false, false); + } + + SInter *si; + for(si = inters.First(); si; si = inters.NextAfter(si)) { + Vector p = (si->p).Minus(axis.ScaledBy((si->p).Dot(axis))); + double ub, vb; + b->ClosestPointTo(p, &ub, &vb, true); + SSurface plane; + plane = SSurface::FromPlane(p, axis.Normal(0), axis.Normal(1)); + + b->PointOnSurfaces(this, &plane, &ub, &vb); + + p = b->PointAt(ub, vb); + + SBezier bezier; + bezier = SBezier::From(p.Plus(axis0), p.Plus(axis1)); + AddExactIntersectionCurve(&bezier, b, agnstA, agnstB, into); + } + + inters.Clear(); + lv.Clear(); + } else { + // Try intersecting the surfaces numerically, by a marching algorithm. + // First, we find all the intersections between a surface and the + // boundary of the other surface. + SPointList spl = {}; + int a; + for(a = 0; a < 2; a++) { + SShell *shA = (a == 0) ? agnstA : agnstB; + SSurface *srfA = (a == 0) ? this : b, + *srfB = (a == 0) ? b : this; + + SEdgeList el = {}; + srfA->MakeEdgesInto(shA, &el, AS_XYZ, NULL); + + SEdge *se; + for(se = el.l.First(); se; se = el.l.NextAfter(se)) { + List lsi = {}; + + srfB->AllPointsIntersecting(se->a, se->b, &lsi, + true, true, false); + if(lsi.n == 0) continue; + + // Find the other surface that this curve trims. + hSCurve hsc = { (uint32_t)se->auxA }; + SCurve *sc = shA->curve.FindById(hsc); + hSSurface hother = (sc->surfA.v == srfA->h.v) ? + sc->surfB : sc->surfA; + SSurface *other = shA->surface.FindById(hother); + + SInter *si; + for(si = lsi.First(); si; si = lsi.NextAfter(si)) { + Vector p = si->p; + double u, v; + srfB->ClosestPointTo(p, &u, &v); + srfB->PointOnSurfaces(srfA, other, &u, &v); + p = srfB->PointAt(u, v); + if(!spl.ContainsPoint(p)) { + SPoint sp; + sp.p = p; + // We also need the edge normal, so that we know in + // which direction to march. + srfA->ClosestPointTo(p, &u, &v); + Vector n = srfA->NormalAt(u, v); + sp.auxv = n.Cross((se->b).Minus(se->a)); + sp.auxv = (sp.auxv).WithMagnitude(1); + + spl.l.Add(&sp); + } + } + lsi.Clear(); + } + + el.Clear(); + } + + while(spl.l.n >= 2) { + SCurve sc = {}; + sc.surfA = h; + sc.surfB = b->h; + sc.isExact = false; + sc.source = SCurve::FROM_INTERSECTION; + + Vector start = spl.l.elem[0].p, + startv = spl.l.elem[0].auxv; + spl.l.ClearTags(); + spl.l.elem[0].tag = 1; + spl.l.RemoveTagged(); + + // Our chord tolerance is whatever the user specified + double maxtol = SS.ChordTolMm(); + int maxsteps = max(300, SS.GetMaxSegments()*3); + + // The curve starts at our starting point. + SCurvePt padd = {}; + padd.vertex = true; + padd.p = start; + sc.pts.Add(&padd); + + Point2d pa, pb; + Vector np, npc = Vector::From(0, 0, 0); + bool fwd = false; + // Better to start with a too-small step, so that we don't miss + // features of the curve entirely. + double tol, step = maxtol; + for(a = 0; a < maxsteps; a++) { + ClosestPointTo(start, &pa); + b->ClosestPointTo(start, &pb); + + Vector na = NormalAt(pa).WithMagnitude(1), + nb = b->NormalAt(pb).WithMagnitude(1); + + if(a == 0) { + Vector dp = nb.Cross(na); + if(dp.Dot(startv) < 0) { + // We want to march in the more inward direction. + fwd = true; + } else { + fwd = false; + } + } + + int i; + for(i = 0; i < 20; i++) { + Vector dp = nb.Cross(na); + if(!fwd) dp = dp.ScaledBy(-1); + dp = dp.WithMagnitude(step); + + np = start.Plus(dp); + npc = ClosestPointOnThisAndSurface(b, np); + tol = (npc.Minus(np)).Magnitude(); + + if(tol > maxtol*0.8) { + step *= 0.90; + } else { + step /= 0.90; + } + + if((tol < maxtol) && (tol > maxtol/2)) { + // If we meet the chord tolerance test, and we're + // not too fine, then we break out. + break; + } + } + + SPoint *sp; + for(sp = spl.l.First(); sp; sp = spl.l.NextAfter(sp)) { + if((sp->p).OnLineSegment(start, npc, 2*SS.ChordTolMm())) { + sp->tag = 1; + a = maxsteps; + npc = sp->p; + } + } + + padd.p = npc; + padd.vertex = (a == maxsteps); + sc.pts.Add(&padd); + + start = npc; + } + + spl.l.RemoveTagged(); + + // And now we split and insert the curve + SCurve split = sc.MakeCopySplitAgainst(agnstA, agnstB, this, b); + sc.Clear(); + into->curve.AddAndAssignId(&split); + } + spl.Clear(); + } +} + +//----------------------------------------------------------------------------- +// Are two surfaces coincident, with the same (or with opposite) normals? +// Currently handles planes only. +//----------------------------------------------------------------------------- +bool SSurface::CoincidentWith(SSurface *ss, bool sameNormal) { + if(degm != 1 || degn != 1) return false; + if(ss->degm != 1 || ss->degn != 1) return false; + + Vector p = ctrl[0][0]; + Vector n = NormalAt(0, 0).WithMagnitude(1); + double d = n.Dot(p); + + if(!ss->CoincidentWithPlane(n, d)) return false; + + Vector n2 = ss->NormalAt(0, 0); + if(sameNormal) { + if(n2.Dot(n) < 0) return false; + } else { + if(n2.Dot(n) > 0) return false; + } + + return true; +} + +bool SSurface::CoincidentWithPlane(Vector n, double d) { + if(degm != 1 || degn != 1) return false; + if(fabs(n.Dot(ctrl[0][0]) - d) > LENGTH_EPS) return false; + if(fabs(n.Dot(ctrl[0][1]) - d) > LENGTH_EPS) return false; + if(fabs(n.Dot(ctrl[1][0]) - d) > LENGTH_EPS) return false; + if(fabs(n.Dot(ctrl[1][1]) - d) > LENGTH_EPS) return false; + + return true; +} + +//----------------------------------------------------------------------------- +// In our shell, find all surfaces that are coincident with the prototype +// surface (with same or opposite normal, as specified), and copy all of +// their trim polygons into el. The edges are returned in uv coordinates for +// the prototype surface. +//----------------------------------------------------------------------------- +void SShell::MakeCoincidentEdgesInto(SSurface *proto, bool sameNormal, + SEdgeList *el, SShell *useCurvesFrom) +{ + SSurface *ss; + for(ss = surface.First(); ss; ss = surface.NextAfter(ss)) { + if(proto->CoincidentWith(ss, sameNormal)) { + ss->MakeEdgesInto(this, el, SSurface::AS_XYZ, useCurvesFrom); + } + } + + SEdge *se; + for(se = el->l.First(); se; se = el->l.NextAfter(se)) { + double ua, va, ub, vb; + proto->ClosestPointTo(se->a, &ua, &va); + proto->ClosestPointTo(se->b, &ub, &vb); + + if(sameNormal) { + se->a = Vector::From(ua, va, 0); + se->b = Vector::From(ub, vb, 0); + } else { + // Flip normal, so flip all edge directions + se->b = Vector::From(ua, va, 0); + se->a = Vector::From(ub, vb, 0); + } + } +} + diff --git a/src/srf/triangulate.cpp b/src/srf/triangulate.cpp new file mode 100644 index 0000000..816eb3e --- /dev/null +++ b/src/srf/triangulate.cpp @@ -0,0 +1,505 @@ +//----------------------------------------------------------------------------- +// Triangulate a surface. If the surface is curved, then we first superimpose +// a grid of quads, with spacing to achieve our chord tolerance. We then +// proceed by ear-clipping; the resulting mesh should be watertight and not +// awful numerically, but has no special properties (Delaunay, etc.). +// +// Copyright 2008-2013 Jonathan Westhues. +//----------------------------------------------------------------------------- +#include "../solvespace.h" + +void SPolygon::UvTriangulateInto(SMesh *m, SSurface *srf) { + if(l.n <= 0) return; + + //int64_t in = GetMilliseconds(); + + normal = Vector::From(0, 0, 1); + + while(l.n > 0) { + FixContourDirections(); + l.ClearTags(); + + // Find a top-level contour, and start with that. Then build bridges + // in order to merge all its islands into a single contour. + SContour *top; + for(top = l.First(); top; top = l.NextAfter(top)) { + if(top->timesEnclosed == 0) { + break; + } + } + if(!top) { + dbp("polygon has no top-level contours?"); + return; + } + + // Start with the outer contour + SContour merged = {}; + top->tag = 1; + top->CopyInto(&merged); + (merged.l.n)--; + + // List all of the edges, for testing whether bridges work. + SEdgeList el = {}; + top->MakeEdgesInto(&el); + List vl = {}; + + // And now find all of its holes. Note that we will also find any + // outer contours that lie entirely within this contour, and any + // holes for those contours. But that's okay, because we can merge + // those too. + SContour *sc; + for(sc = l.First(); sc; sc = l.NextAfter(sc)) { + if(sc->timesEnclosed != 1) continue; + if(sc->l.n < 2) continue; + + // Test the midpoint of an edge. Our polygon may not be self- + // intersecting, but two contours may share a vertex; so a + // vertex could be on the edge of another polygon, in which + // case ContainsPointProjdToNormal returns indeterminate. + Vector tp = sc->AnyEdgeMidpoint(); + if(top->ContainsPointProjdToNormal(normal, tp)) { + sc->tag = 2; + sc->MakeEdgesInto(&el); + sc->FindPointWithMinX(); + } + } + +// dbp("finished finding holes: %d ms", (int)(GetMilliseconds() - in)); + for(;;) { + double xmin = 1e10; + SContour *scmin = NULL; + + for(sc = l.First(); sc; sc = l.NextAfter(sc)) { + if(sc->tag != 2) continue; + + if(sc->xminPt.x < xmin) { + xmin = sc->xminPt.x; + scmin = sc; + } + } + if(!scmin) break; + + if(!merged.BridgeToContour(scmin, &el, &vl)) { + dbp("couldn't merge our hole"); + return; + } +// dbp(" bridged to contour: %d ms", (int)(GetMilliseconds() - in)); + scmin->tag = 3; + } +// dbp("finished merging holes: %d ms", (int)(GetMilliseconds() - in)); + + merged.UvTriangulateInto(m, srf); +// dbp("finished ear clippping: %d ms", (int)(GetMilliseconds() - in)); + merged.l.Clear(); + el.Clear(); + vl.Clear(); + + // Careful, need to free the points within the contours, and not just + // the contours themselves. This was a tricky memory leak. + for(sc = l.First(); sc; sc = l.NextAfter(sc)) { + if(sc->tag) { + sc->l.Clear(); + } + } + l.RemoveTagged(); + } +} + +bool SContour::BridgeToContour(SContour *sc, + SEdgeList *avoidEdges, List *avoidPts) +{ + int i, j; + + // Start looking for a bridge on our new hole near its leftmost (min x) + // point. + int sco = 0; + for(i = 0; i < (sc->l.n - 1); i++) { + if((sc->l.elem[i].p).EqualsExactly(sc->xminPt)) { + sco = i; + } + } + + // And start looking on our merged contour at whichever point is nearest + // to the leftmost point of the new segment. + int thiso = 0; + double dmin = 1e10; + for(i = 0; i < l.n; i++) { + Vector p = l.elem[i].p; + double d = (p.Minus(sc->xminPt)).MagSquared(); + if(d < dmin) { + dmin = d; + thiso = i; + } + } + + int thisp, scp; + + Vector a, b, *f; + + // First check if the contours share a point; in that case we should + // merge them there, without a bridge. + for(i = 0; i < l.n; i++) { + thisp = WRAP(i+thiso, l.n); + a = l.elem[thisp].p; + + for(f = avoidPts->First(); f; f = avoidPts->NextAfter(f)) { + if(f->Equals(a)) break; + } + if(f) continue; + + for(j = 0; j < (sc->l.n - 1); j++) { + scp = WRAP(j+sco, (sc->l.n - 1)); + b = sc->l.elem[scp].p; + + if(a.Equals(b)) { + goto haveEdge; + } + } + } + + // If that fails, look for a bridge that does not intersect any edges. + for(i = 0; i < l.n; i++) { + thisp = WRAP(i+thiso, l.n); + a = l.elem[thisp].p; + + for(f = avoidPts->First(); f; f = avoidPts->NextAfter(f)) { + if(f->Equals(a)) break; + } + if(f) continue; + + for(j = 0; j < (sc->l.n - 1); j++) { + scp = WRAP(j+sco, (sc->l.n - 1)); + b = sc->l.elem[scp].p; + + for(f = avoidPts->First(); f; f = avoidPts->NextAfter(f)) { + if(f->Equals(b)) break; + } + if(f) continue; + + if(avoidEdges->AnyEdgeCrossings(a, b) > 0) { + // doesn't work, bridge crosses an existing edge + } else { + goto haveEdge; + } + } + } + + // Tried all the possibilities, didn't find an edge + return false; + +haveEdge: + SContour merged = {}; + for(i = 0; i < l.n; i++) { + merged.AddPoint(l.elem[i].p); + if(i == thisp) { + // less than or equal; need to duplicate the join point + for(j = 0; j <= (sc->l.n - 1); j++) { + int jp = WRAP(j + scp, (sc->l.n - 1)); + merged.AddPoint((sc->l.elem[jp]).p); + } + // and likewise duplicate join point for the outer curve + merged.AddPoint(l.elem[i].p); + } + } + + // and future bridges mustn't cross our bridge, and it's tricky to get + // things right if two bridges come from the same point + avoidEdges->AddEdge(a, b); + avoidPts->Add(&a); + avoidPts->Add(&b); + + l.Clear(); + l = merged.l; + return true; +} + +bool SContour::IsEar(int bp, double scaledEps) { + int ap = WRAP(bp-1, l.n), + cp = WRAP(bp+1, l.n); + + STriangle tr = {}; + tr.a = l.elem[ap].p; + tr.b = l.elem[bp].p; + tr.c = l.elem[cp].p; + + if((tr.a).Equals(tr.c)) { + // This is two coincident and anti-parallel edges. Zero-area, so + // won't generate a real triangle, but we certainly can clip it. + return true; + } + + Vector n = Vector::From(0, 0, -1); + if((tr.Normal()).Dot(n) < scaledEps) { + // This vertex is reflex, or between two collinear edges; either way, + // it's not an ear. + return false; + } + + // Accelerate with an axis-aligned bounding box test + Vector maxv = tr.a, minv = tr.a; + (tr.b).MakeMaxMin(&maxv, &minv); + (tr.c).MakeMaxMin(&maxv, &minv); + + int i; + for(i = 0; i < l.n; i++) { + if(i == ap || i == bp || i == cp) continue; + + Vector p = l.elem[i].p; + if(p.OutsideAndNotOn(maxv, minv)) continue; + + // A point on the edge of the triangle is considered to be inside, + // and therefore makes it a non-ear; but a point on the vertex is + // "outside", since that's necessary to make bridges work. + if(p.EqualsExactly(tr.a)) continue; + if(p.EqualsExactly(tr.b)) continue; + if(p.EqualsExactly(tr.c)) continue; + + if(tr.ContainsPointProjd(n, p)) { + return false; + } + } + return true; +} + +void SContour::ClipEarInto(SMesh *m, int bp, double scaledEps) { + int ap = WRAP(bp-1, l.n), + cp = WRAP(bp+1, l.n); + + STriangle tr = {}; + tr.a = l.elem[ap].p; + tr.b = l.elem[bp].p; + tr.c = l.elem[cp].p; + if(tr.Normal().MagSquared() < scaledEps*scaledEps) { + // A vertex with more than two edges will cause us to generate + // zero-area triangles, which must be culled. + } else { + m->AddTriangle(&tr); + } + + // By deleting the point at bp, we may change the ear-ness of the points + // on either side. + l.elem[ap].ear = SPoint::UNKNOWN; + l.elem[cp].ear = SPoint::UNKNOWN; + + l.ClearTags(); + l.elem[bp].tag = 1; + l.RemoveTagged(); +} + +void SContour::UvTriangulateInto(SMesh *m, SSurface *srf) { + Vector tu, tv; + srf->TangentsAt(0.5, 0.5, &tu, &tv); + double s = sqrt(tu.MagSquared() + tv.MagSquared()); + // We would like to apply our tolerances in xyz; but that would be a lot + // of work, so at least scale the epsilon semi-reasonably. That's + // perfect for square planes, less perfect for anything else. + double scaledEps = LENGTH_EPS / s; + + int i; + // Clean the original contour by removing any zero-length edges. + l.ClearTags(); + for(i = 1; i < l.n; i++) { + if((l.elem[i].p).Equals(l.elem[i-1].p)) { + l.elem[i].tag = 1; + } + } + l.RemoveTagged(); + + // Now calculate the ear-ness of each vertex + for(i = 0; i < l.n; i++) { + (l.elem[i]).ear = IsEar(i, scaledEps) ? SPoint::EAR : SPoint::NOT_EAR; + } + + bool toggle = false; + while(l.n > 3) { + // Some points may have changed ear-ness, so recalculate + for(i = 0; i < l.n; i++) { + if(l.elem[i].ear == SPoint::UNKNOWN) { + (l.elem[i]).ear = IsEar(i, scaledEps) ? + SPoint::EAR : SPoint::NOT_EAR; + } + } + + int bestEar = -1; + double bestChordTol = VERY_POSITIVE; + // Alternate the starting position so we generate strip-like + // triangulations instead of fan-like + toggle = !toggle; + int offset = toggle ? -1 : 0; + for(i = 0; i < l.n; i++) { + int ear = WRAP(i+offset, l.n); + if(l.elem[ear].ear == SPoint::EAR) { + if(srf->degm == 1 && srf->degn == 1) { + // This is a plane; any ear is a good ear. + bestEar = ear; + break; + } + // If we are triangulating a curved surface, then try to + // clip ears that have a small chord tolerance from the + // surface. + Vector prev = l.elem[WRAP((i+offset-1), l.n)].p, + next = l.elem[WRAP((i+offset+1), l.n)].p; + double tol = srf->ChordToleranceForEdge(prev, next); + if(tol < bestChordTol - scaledEps) { + bestEar = ear; + bestChordTol = tol; + } + if(bestChordTol < 0.1*SS.ChordTolMm()) { + break; + } + } + } + if(bestEar < 0) { + dbp("couldn't find an ear! fail"); + return; + } + ClipEarInto(m, bestEar, scaledEps); + } + + ClipEarInto(m, 0, scaledEps); // add the last triangle +} + +double SSurface::ChordToleranceForEdge(Vector a, Vector b) { + Vector as = PointAt(a.x, a.y), bs = PointAt(b.x, b.y); + + double worst = VERY_NEGATIVE; + int i; + for(i = 1; i <= 3; i++) { + Vector p = a. Plus((b. Minus(a )).ScaledBy(i/4.0)), + ps = as.Plus((bs.Minus(as)).ScaledBy(i/4.0)); + + Vector pps = PointAt(p.x, p.y); + worst = max(worst, (pps.Minus(ps)).MagSquared()); + } + return sqrt(worst); +} + +Vector SSurface::PointAtMaybeSwapped(double u, double v, bool swapped) { + if(swapped) { + return PointAt(v, u); + } else { + return PointAt(u, v); + } +} + +void SSurface::MakeTriangulationGridInto(List *l, double vs, double vf, + bool swapped) +{ + double worst = 0; + + // Try piecewise linearizing four curves, at u = 0, 1/3, 2/3, 1; choose + // the worst chord tolerance of any of those. + int i; + for(i = 0; i <= 3; i++) { + double u = i/3.0; + + // This chord test should be identical to the one in SBezier::MakePwl + // to make the piecewise linear edges line up with the grid more or + // less. + Vector ps = PointAtMaybeSwapped(u, vs, swapped), + pf = PointAtMaybeSwapped(u, vf, swapped); + + double vm1 = (2*vs + vf) / 3, + vm2 = (vs + 2*vf) / 3; + + Vector pm1 = PointAtMaybeSwapped(u, vm1, swapped), + pm2 = PointAtMaybeSwapped(u, vm2, swapped); + + worst = max(worst, pm1.DistanceToLine(ps, pf.Minus(ps))); + worst = max(worst, pm2.DistanceToLine(ps, pf.Minus(ps))); + } + + double step = 1.0/SS.GetMaxSegments(); + if((vf - vs) < step || worst < SS.ChordTolMm()) { + l->Add(&vf); + } else { + MakeTriangulationGridInto(l, vs, (vs+vf)/2, swapped); + MakeTriangulationGridInto(l, (vs+vf)/2, vf, swapped); + } +} + +void SPolygon::UvGridTriangulateInto(SMesh *mesh, SSurface *srf) { + SEdgeList orig = {}; + MakeEdgesInto(&orig); + + SEdgeList holes = {}; + + normal = Vector::From(0, 0, 1); + FixContourDirections(); + + // Build a rectangular grid, with horizontal and vertical lines in the + // uv plane. The spacing of these lines is adaptive, so calculate that. + List li, lj; + li = {}; + lj = {}; + double v = 0; + li.Add(&v); + srf->MakeTriangulationGridInto(&li, 0, 1, true); + lj.Add(&v); + srf->MakeTriangulationGridInto(&lj, 0, 1, false); + + // Now iterate over each quad in the grid. If it's outside the polygon, + // or if it intersects the polygon, then we discard it. Otherwise we + // generate two triangles in the mesh, and cut it out of our polygon. + int i, j; + for(i = 0; i < (li.n - 1); i++) { + for(j = 0; j < (lj.n - 1); j++) { + double us = li.elem[i], uf = li.elem[i+1], + vs = lj.elem[j], vf = lj.elem[j+1]; + + Vector a = Vector::From(us, vs, 0), + b = Vector::From(us, vf, 0), + c = Vector::From(uf, vf, 0), + d = Vector::From(uf, vs, 0); + + if(orig.AnyEdgeCrossings(a, b, NULL) || + orig.AnyEdgeCrossings(b, c, NULL) || + orig.AnyEdgeCrossings(c, d, NULL) || + orig.AnyEdgeCrossings(d, a, NULL)) + { + continue; + } + + // There's no intersections, so it doesn't matter which point + // we decide to test. + if(!this->ContainsPoint(a)) { + continue; + } + + // Add the quad to our mesh + STriangle tr = {}; + tr.a = a; + tr.b = b; + tr.c = c; + mesh->AddTriangle(&tr); + tr.a = a; + tr.b = c; + tr.c = d; + mesh->AddTriangle(&tr); + + holes.AddEdge(a, b); + holes.AddEdge(b, c); + holes.AddEdge(c, d); + holes.AddEdge(d, a); + } + } + + holes.CullExtraneousEdges(); + SPolygon hp = {}; + holes.AssemblePolygon(&hp, NULL, true); + + SContour *sc; + for(sc = hp.l.First(); sc; sc = hp.l.NextAfter(sc)) { + l.Add(sc); + } + + orig.Clear(); + holes.Clear(); + li.Clear(); + lj.Clear(); + hp.l.Clear(); + + UvTriangulateInto(mesh, srf); +} + + diff --git a/src/style.cpp b/src/style.cpp new file mode 100644 index 0000000..4d437cd --- /dev/null +++ b/src/style.cpp @@ -0,0 +1,956 @@ +//----------------------------------------------------------------------------- +// Implementation of a cosmetic line style, which determines the color and +// other appearance of a line or curve on-screen and in exported files. Some +// styles are predefined, and others can be created by the user. +// +// Copyright 2008-2013 Jonathan Westhues. +//----------------------------------------------------------------------------- +#include "solvespace.h" +#include + +#define DEFAULT_TEXT_HEIGHT 11.5 + +const Style::Default Style::Defaults[] = { + { { ACTIVE_GRP }, "ActiveGrp", RGBf(1.0, 1.0, 1.0), 1.5, 4 }, + { { CONSTRUCTION }, "Construction", RGBf(0.1, 0.7, 0.1), 1.5, 0 }, + { { INACTIVE_GRP }, "InactiveGrp", RGBf(0.5, 0.3, 0.0), 1.5, 3 }, + { { DATUM }, "Datum", RGBf(0.0, 0.8, 0.0), 1.5, 0 }, + { { SOLID_EDGE }, "SolidEdge", RGBf(0.8, 0.8, 0.8), 1.0, 2 }, + { { CONSTRAINT }, "Constraint", RGBf(1.0, 0.1, 1.0), 1.0, 0 }, + { { SELECTED }, "Selected", RGBf(1.0, 0.0, 0.0), 1.5, 0 }, + { { HOVERED }, "Hovered", RGBf(1.0, 1.0, 0.0), 1.5, 0 }, + { { CONTOUR_FILL }, "ContourFill", RGBf(0.0, 0.1, 0.1), 1.0, 0 }, + { { NORMALS }, "Normals", RGBf(0.0, 0.4, 0.4), 1.0, 0 }, + { { ANALYZE }, "Analyze", RGBf(0.0, 1.0, 1.0), 1.0, 0 }, + { { DRAW_ERROR }, "DrawError", RGBf(1.0, 0.0, 0.0), 8.0, 0 }, + { { DIM_SOLID }, "DimSolid", RGBf(0.1, 0.1, 0.1), 1.0, 0 }, + { { HIDDEN_EDGE }, "HiddenEdge", RGBf(0.8, 0.8, 0.8), 2.0, 1 }, + { { OUTLINE }, "Outline", RGBf(0.8, 0.8, 0.8), 3.0, 5 }, + { { 0 }, NULL, RGBf(0.0, 0.0, 0.0), 0.0, 0 } +}; + +std::string Style::CnfColor(const std::string &prefix) { + return "Style_" + prefix + "_Color"; +} +std::string Style::CnfWidth(const std::string &prefix) { + return "Style_" + prefix + "_Width"; +} +std::string Style::CnfTextHeight(const std::string &prefix) { + return "Style_" + prefix + "_TextHeight"; +} + +std::string Style::CnfPrefixToName(const std::string &prefix) { + std::string name = "#def-"; + + for(size_t i = 0; i < prefix.length(); i++) { + if(isupper(prefix[i]) && i != 0) + name += '-'; + name += tolower(prefix[i]); + } + + return name; +} + +void Style::CreateAllDefaultStyles(void) { + const Default *d; + for(d = &(Defaults[0]); d->h.v; d++) { + (void)Get(d->h); + } +} + +void Style::CreateDefaultStyle(hStyle h) { + bool isDefaultStyle = true; + const Default *d; + for(d = &(Defaults[0]); d->h.v; d++) { + if(d->h.v == h.v) break; + } + if(!d->h.v) { + // Not a default style; so just create it the same as our default + // active group entity style. + d = &(Defaults[0]); + isDefaultStyle = false; + } + + Style ns = {}; + FillDefaultStyle(&ns, d); + ns.h = h; + if(isDefaultStyle) { + ns.name = CnfPrefixToName(d->cnfPrefix); + } else { + ns.name = "new-custom-style"; + } + + SK.style.Add(&ns); +} + +void Style::FillDefaultStyle(Style *s, const Default *d, bool factory) { + if(d == NULL) d = &Defaults[0]; + s->color = (factory) ? d->color : CnfThawColor(d->color, CnfColor(d->cnfPrefix)); + s->width = (factory) ? d->width : CnfThawFloat((float)(d->width), CnfWidth(d->cnfPrefix)); + s->widthAs = UNITS_AS_PIXELS; + s->textHeight = (factory) ? DEFAULT_TEXT_HEIGHT + : CnfThawFloat(DEFAULT_TEXT_HEIGHT, CnfTextHeight(d->cnfPrefix)); + s->textHeightAs = UNITS_AS_PIXELS; + s->textOrigin = 0; + s->textAngle = 0; + s->visible = true; + s->exportable = true; + s->filled = false; + s->fillColor = RGBf(0.3, 0.3, 0.3); + s->stippleType = (d->h.v == Style::HIDDEN_EDGE) ? Style::STIPPLE_DASH + : Style::STIPPLE_CONTINUOUS; + s->stippleScale = 15.0; + s->zIndex = d->zIndex; +} + +void Style::LoadFactoryDefaults(void) { + const Default *d; + for(d = &(Defaults[0]); d->h.v; d++) { + Style *s = Get(d->h); + FillDefaultStyle(s, d, /*factory=*/true); + } + SS.backgroundColor = RGBi(0, 0, 0); + if(SS.bgImage.fromFile) MemFree(SS.bgImage.fromFile); + SS.bgImage.fromFile = NULL; +} + +void Style::FreezeDefaultStyles(void) { + const Default *d; + for(d = &(Defaults[0]); d->h.v; d++) { + CnfFreezeColor(Color(d->h), CnfColor(d->cnfPrefix)); + CnfFreezeFloat((float)Width(d->h), CnfWidth(d->cnfPrefix)); + CnfFreezeFloat((float)TextHeight(d->h), CnfTextHeight(d->cnfPrefix)); + } +} + +uint32_t Style::CreateCustomStyle(bool rememberForUndo) { + if(rememberForUndo) SS.UndoRemember(); + uint32_t vs = max((uint32_t)Style::FIRST_CUSTOM, SK.style.MaximumId() + 1); + hStyle hs = { vs }; + (void)Style::Get(hs); + return hs.v; +} + +void Style::AssignSelectionToStyle(uint32_t v) { + bool showError = false; + SS.GW.GroupSelection(); + + SS.UndoRemember(); + int i; + for(i = 0; i < SS.GW.gs.entities; i++) { + hEntity he = SS.GW.gs.entity[i]; + Entity *e = SK.GetEntity(he); + if(!e->IsStylable()) continue; + + if(!he.isFromRequest()) { + showError = true; + continue; + } + + hRequest hr = he.request(); + Request *r = SK.GetRequest(hr); + r->style.v = v; + SS.MarkGroupDirty(r->group); + } + for(i = 0; i < SS.GW.gs.constraints; i++) { + hConstraint hc = SS.GW.gs.constraint[i]; + Constraint *c = SK.GetConstraint(hc); + if(!c->IsStylable()) continue; + + c->disp.style.v = v; + } + + if(showError) { + Error("Can't assign style to an entity that's derived from another " + "entity; try assigning a style to this entity's parent."); + } + + SS.GW.ClearSelection(); + InvalidateGraphics(); + SS.ScheduleGenerateAll(); + + // And show that style's info screen in the text window. + SS.TW.GoToScreen(TextWindow::SCREEN_STYLE_INFO); + SS.TW.shown.style.v = v; + SS.ScheduleShowTW(); +} + +//----------------------------------------------------------------------------- +// Look up a style by its handle. If that style does not exist, then create +// the style, according to our table of default styles. +//----------------------------------------------------------------------------- +Style *Style::Get(hStyle h) { + if(h.v == 0) h.v = ACTIVE_GRP; + + Style *s = SK.style.FindByIdNoOops(h); + if(s) { + // It exists, good. + return s; + } else { + // It doesn't exist; so we should create it and then return that. + CreateDefaultStyle(h); + return SK.style.FindById(h); + } +} + +//----------------------------------------------------------------------------- +// A couple of wrappers, so that I can call these functions with either an +// hStyle or with the integer corresponding to that hStyle.v. +//----------------------------------------------------------------------------- +RgbaColor Style::Color(int s, bool forExport) { + hStyle hs = { (uint32_t)s }; + return Color(hs, forExport); +} +float Style::Width(int s) { + hStyle hs = { (uint32_t)s }; + return Width(hs); +} + +//----------------------------------------------------------------------------- +// If a color is almost white, then we can rewrite it to black, just so that +// it won't disappear on file formats with a light background. +//----------------------------------------------------------------------------- +RgbaColor Style::RewriteColor(RgbaColor rgbin) { + Vector rgb = Vector::From(rgbin.redF(), rgbin.greenF(), rgbin.blueF()); + rgb = rgb.Minus(Vector::From(1, 1, 1)); + if(rgb.Magnitude() < 0.4 && SS.fixExportColors) { + // This is an almost-white color in a default style, which is + // good for the default on-screen view (black bg) but probably + // not desired in the exported files, which typically are shown + // against white backgrounds. + return RGBi(0, 0, 0); + } else { + return rgbin; + } +} + +//----------------------------------------------------------------------------- +// Return the stroke color associated with our style as 8-bit RGB. +//----------------------------------------------------------------------------- +RgbaColor Style::Color(hStyle h, bool forExport) { + Style *s = Get(h); + if(forExport) { + return RewriteColor(s->color); + } else { + return s->color; + } +} + +//----------------------------------------------------------------------------- +// Return the fill color associated with our style as 8-bit RGB. +//----------------------------------------------------------------------------- +RgbaColor Style::FillColor(hStyle h, bool forExport) { + Style *s = Get(h); + if(forExport) { + return RewriteColor(s->fillColor); + } else { + return s->fillColor; + } +} + +//----------------------------------------------------------------------------- +// Return the width associated with our style in pixels.. +//----------------------------------------------------------------------------- +float Style::Width(hStyle h) { + double r = 1.0; + Style *s = Get(h); + if(s->widthAs == UNITS_AS_MM) { + r = s->width * SS.GW.scale; + } else if(s->widthAs == UNITS_AS_PIXELS) { + r = s->width; + } + // This returns a float because ssglLineWidth expects a float, avoid casts. + return (float)r; +} + +//----------------------------------------------------------------------------- +// Return the width associated with our style in millimeters.. +//----------------------------------------------------------------------------- +double Style::WidthMm(int hs) { + double widthpx = Width(hs); + return widthpx / SS.GW.scale; +} + +//----------------------------------------------------------------------------- +// Return the associated text height, in pixels. +//----------------------------------------------------------------------------- +double Style::TextHeight(hStyle hs) { + Style *s = Get(hs); + if(s->textHeightAs == UNITS_AS_MM) { + return s->textHeight * SS.GW.scale; + } else /* s->textHeightAs == UNITS_AS_PIXELS */ { + return s->textHeight; + } +} + +double Style::DefaultTextHeight() { + hStyle hs { Style::CONSTRAINT }; + return TextHeight(hs); +} + +//----------------------------------------------------------------------------- +// Should lines and curves from this style appear in the output file? Only +// if it's both shown and exportable. +//----------------------------------------------------------------------------- +bool Style::Exportable(int si) { + hStyle hs = { (uint32_t)si }; + Style *s = Get(hs); + return (s->exportable) && (s->visible); +} + +//----------------------------------------------------------------------------- +// Return the appropriate style for our entity. If the entity has a style +// explicitly assigned, then it's that style. Otherwise it's the appropriate +// default style. +//----------------------------------------------------------------------------- +hStyle Style::ForEntity(hEntity he) { + Entity *e = SK.GetEntity(he); + // If the entity has a special style, use that. If that style doesn't + // exist yet, then it will get created automatically later. + if(e->style.v != 0) { + return e->style; + } + + // Otherwise, we use the default rules. + hStyle hs; + if(e->group.v != SS.GW.activeGroup.v) { + hs.v = INACTIVE_GRP; + } else if(e->construction) { + hs.v = CONSTRUCTION; + } else { + hs.v = ACTIVE_GRP; + } + return hs; +} + +int Style::PatternType(hStyle hs) { + Style *s = Get(hs); + return s->stippleType; +} + +double Style::StippleScaleMm(hStyle hs) { + Style *s = Get(hs); + if(s->widthAs == UNITS_AS_MM) { + return s->stippleScale; + } else if(s->widthAs == UNITS_AS_PIXELS) { + return s->stippleScale / SS.GW.scale; + } + return 1.0; +} + +std::string Style::DescriptionString(void) { + if(name.empty()) { + return ssprintf("s%03x-(unnamed)", h.v); + } else { + return ssprintf("s%03x-%s", h.v, name.c_str()); + } +} + + +void TextWindow::ScreenShowListOfStyles(int link, uint32_t v) { + SS.TW.GoToScreen(SCREEN_LIST_OF_STYLES); +} +void TextWindow::ScreenShowStyleInfo(int link, uint32_t v) { + SS.TW.GoToScreen(SCREEN_STYLE_INFO); + SS.TW.shown.style.v = v; +} + +void TextWindow::ScreenLoadFactoryDefaultStyles(int link, uint32_t v) { + Style::LoadFactoryDefaults(); + SS.TW.GoToScreen(SCREEN_LIST_OF_STYLES); +} + +void TextWindow::ScreenCreateCustomStyle(int link, uint32_t v) { + Style::CreateCustomStyle(); +} + +void TextWindow::ScreenChangeBackgroundColor(int link, uint32_t v) { + RgbaColor rgb = SS.backgroundColor; + SS.TW.ShowEditControlWithColorPicker(3, rgb); + SS.TW.edit.meaning = EDIT_BACKGROUND_COLOR; +} + +static int RoundUpToPowerOfTwo(int v) +{ + int i; + for(i = 0; i < 31; i++) { + int vt = (1 << i); + if(vt >= v) { + return vt; + } + } + return 0; +} + +void TextWindow::ScreenBackgroundImage(int link, uint32_t v) { + if(SS.bgImage.fromFile) MemFree(SS.bgImage.fromFile); + SS.bgImage.fromFile = NULL; + + if(link == 'l') { + FILE *f = NULL; + png_struct *png_ptr = NULL; + png_info *info_ptr = NULL; + + std::string importFile; + if(!GetOpenFile(&importFile, "", PngFileFilter)) goto err; + f = ssfopen(importFile, "rb"); + if(!f) goto err; + + uint8_t header[8]; + if (fread(header, 1, 8, f) != 8) + goto err; + if(png_sig_cmp(header, 0, 8)) goto err; + + png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, + NULL, NULL, NULL); + if(!png_ptr) goto err; + + info_ptr = png_create_info_struct(png_ptr); + if(!info_ptr) goto err; + + if(setjmp(png_jmpbuf(png_ptr))) goto err; + + png_init_io(png_ptr, f); + png_set_sig_bytes(png_ptr, 8); + + png_read_png(png_ptr, info_ptr, + PNG_TRANSFORM_EXPAND | PNG_TRANSFORM_STRIP_ALPHA, NULL); + + int w; w = (int)png_get_image_width(png_ptr, info_ptr); + int h; h = (int)png_get_image_height(png_ptr, info_ptr); + uint8_t **rows; rows = png_get_rows(png_ptr, info_ptr); + + // Round to next-highest powers of two, since the textures require + // that. And round up to 4, to guarantee 32-bit alignment. + int rw; rw = max(4, RoundUpToPowerOfTwo(w)); + int rh; rh = max(4, RoundUpToPowerOfTwo(h)); + + SS.bgImage.fromFile = (uint8_t *)MemAlloc(rw*rh*3); + {for(int i = 0; i < h; i++) { + memcpy(SS.bgImage.fromFile + ((h - 1) - i)*(rw*3), rows[i], w*3); + }} + SS.bgImage.w = w; + SS.bgImage.h = h; + SS.bgImage.rw = rw; + SS.bgImage.rh = rh; + SS.bgImage.scale = SS.GW.scale; + SS.bgImage.origin = SS.GW.offset.ScaledBy(-1); + +err: + if(png_ptr) png_destroy_read_struct(&png_ptr, &info_ptr, NULL); + if(f) fclose(f); + } + SS.ScheduleShowTW(); +} + +void TextWindow::ScreenChangeBackgroundImageScale(int link, uint32_t v) { + SS.TW.edit.meaning = EDIT_BACKGROUND_IMG_SCALE; + SS.TW.ShowEditControl(10, ssprintf("%.3f", SS.bgImage.scale * SS.MmPerUnit())); +} + +void TextWindow::ShowListOfStyles(void) { + Printf(true, "%Ft color style-name"); + + bool darkbg = false; + Style *s; + for(s = SK.style.First(); s; s = SK.style.NextAfter(s)) { + Printf(false, "%Bp %Bz %Bp %Fl%Ll%f%D%s%E", + darkbg ? 'd' : 'a', + &s->color, + darkbg ? 'd' : 'a', + ScreenShowStyleInfo, s->h.v, + s->DescriptionString().c_str()); + + darkbg = !darkbg; + } + + Printf(true, " %Fl%Ll%fcreate a new custom style%E", + &ScreenCreateCustomStyle); + + Printf(false, ""); + + RgbaColor rgb = SS.backgroundColor; + Printf(false, "%Ft background color (r, g, b)%E"); + Printf(false, "%Ba %@, %@, %@ %Fl%D%f%Ll[change]%E", + rgb.redF(), rgb.greenF(), rgb.blueF(), + top[rows-1] + 2, &ScreenChangeBackgroundColor); + + Printf(false, ""); + Printf(false, "%Ft background bitmap image%E"); + if(SS.bgImage.fromFile) { + Printf(false, "%Ba %Ftwidth:%E %dpx %Ftheight:%E %dpx", + SS.bgImage.w, SS.bgImage.h); + + Printf(false, " %Ftscale:%E %# px/%s %Fl%Ll%f%D[change]%E", + SS.bgImage.scale*SS.MmPerUnit(), + SS.UnitName(), + &ScreenChangeBackgroundImageScale, top[rows-1] + 2); + + Printf(false, "%Ba %Fl%Lc%fclear background image%E", + &ScreenBackgroundImage); + } else { + Printf(false, "%Ba none - %Fl%Ll%fload background image%E", + &ScreenBackgroundImage); + Printf(false, " (bottom left will be center of view)"); + } + + Printf(false, ""); + Printf(false, " %Fl%Ll%fload factory defaults%E", + &ScreenLoadFactoryDefaultStyles); +} + + +void TextWindow::ScreenChangeStyleName(int link, uint32_t v) { + hStyle hs = { v }; + Style *s = Style::Get(hs); + SS.TW.ShowEditControl(12, s->name); + SS.TW.edit.style = hs; + SS.TW.edit.meaning = EDIT_STYLE_NAME; +} + +void TextWindow::ScreenDeleteStyle(int link, uint32_t v) { + SS.UndoRemember(); + hStyle hs = { v }; + Style *s = SK.style.FindByIdNoOops(hs); + if(s) { + SK.style.RemoveById(hs); + // And it will get recreated automatically if something is still using + // the style, so no need to do anything else. + } + SS.TW.GoToScreen(SCREEN_LIST_OF_STYLES); + InvalidateGraphics(); +} + +void TextWindow::ScreenChangeStylePatternType(int link, uint32_t v) { + hStyle hs = { v }; + Style *s = Style::Get(hs); + s->stippleType = link - 1; +} + +void TextWindow::ScreenChangeStyleMetric(int link, uint32_t v) { + hStyle hs = { v }; + Style *s = Style::Get(hs); + double val; + int units, meaning, col; + switch(link) { + case 't': + val = s->textHeight; + units = s->textHeightAs; + col = 10; + meaning = EDIT_STYLE_TEXT_HEIGHT; + break; + + case 's': + val = s->stippleScale; + units = s->widthAs; + col = 17; + meaning = EDIT_STYLE_STIPPLE_PERIOD; + break; + + case 'w': + case 'W': + val = s->width; + units = s->widthAs; + col = 9; + meaning = EDIT_STYLE_WIDTH; + break; + + default: oops(); + } + + std::string edit_value; + if(units == Style::UNITS_AS_PIXELS) { + edit_value = ssprintf("%.2f", val); + } else { + edit_value = SS.MmToString(val); + } + SS.TW.ShowEditControl(col, edit_value); + SS.TW.edit.style = hs; + SS.TW.edit.meaning = meaning; +} + +void TextWindow::ScreenChangeStyleTextAngle(int link, uint32_t v) { + hStyle hs = { v }; + Style *s = Style::Get(hs); + SS.TW.ShowEditControl(9, ssprintf("%.2f", s->textAngle)); + SS.TW.edit.style = hs; + SS.TW.edit.meaning = EDIT_STYLE_TEXT_ANGLE; +} + +void TextWindow::ScreenChangeStyleColor(int link, uint32_t v) { + hStyle hs = { v }; + Style *s = Style::Get(hs); + // Same function used for stroke and fill colors + int em; + RgbaColor rgb; + if(link == 's') { + em = EDIT_STYLE_COLOR; + rgb = s->color; + } else if(link == 'f') { + em = EDIT_STYLE_FILL_COLOR; + rgb = s->fillColor; + } else { + oops(); + } + SS.TW.ShowEditControlWithColorPicker(13, rgb); + SS.TW.edit.style = hs; + SS.TW.edit.meaning = em; +} + +void TextWindow::ScreenChangeStyleYesNo(int link, uint32_t v) { + SS.UndoRemember(); + hStyle hs = { v }; + Style *s = Style::Get(hs); + switch(link) { + // Units for the width + case 'w': + if(s->widthAs != Style::UNITS_AS_MM) { + s->widthAs = Style::UNITS_AS_MM; + s->width /= SS.GW.scale; + s->stippleScale /= SS.GW.scale; + } + break; + case 'W': + if(s->widthAs != Style::UNITS_AS_PIXELS) { + s->widthAs = Style::UNITS_AS_PIXELS; + s->width *= SS.GW.scale; + s->stippleScale *= SS.GW.scale; + } + break; + + // Units for the height + case 'g': + if(s->textHeightAs != Style::UNITS_AS_MM) { + s->textHeightAs = Style::UNITS_AS_MM; + s->textHeight /= SS.GW.scale; + } + break; + + case 'G': + if(s->textHeightAs != Style::UNITS_AS_PIXELS) { + s->textHeightAs = Style::UNITS_AS_PIXELS; + s->textHeight *= SS.GW.scale; + } + break; + + case 'e': + s->exportable = !(s->exportable); + break; + + case 'v': + s->visible = !(s->visible); + break; + + case 'f': + s->filled = !(s->filled); + break; + + // Horizontal text alignment + case 'L': + s->textOrigin |= Style::ORIGIN_LEFT; + s->textOrigin &= ~Style::ORIGIN_RIGHT; + break; + case 'H': + s->textOrigin &= ~Style::ORIGIN_LEFT; + s->textOrigin &= ~Style::ORIGIN_RIGHT; + break; + case 'R': + s->textOrigin &= ~Style::ORIGIN_LEFT; + s->textOrigin |= Style::ORIGIN_RIGHT; + break; + + // Vertical text alignment + case 'B': + s->textOrigin |= Style::ORIGIN_BOT; + s->textOrigin &= ~Style::ORIGIN_TOP; + break; + case 'V': + s->textOrigin &= ~Style::ORIGIN_BOT; + s->textOrigin &= ~Style::ORIGIN_TOP; + break; + case 'T': + s->textOrigin &= ~Style::ORIGIN_BOT; + s->textOrigin |= Style::ORIGIN_TOP; + break; + } + InvalidateGraphics(); +} + +bool TextWindow::EditControlDoneForStyles(const char *str) { + Style *s; + switch(edit.meaning) { + case EDIT_STYLE_STIPPLE_PERIOD: + case EDIT_STYLE_TEXT_HEIGHT: + case EDIT_STYLE_WIDTH: { + SS.UndoRemember(); + s = Style::Get(edit.style); + + double v; + int units = (edit.meaning == EDIT_STYLE_TEXT_HEIGHT) ? + s->textHeightAs : s->widthAs; + if(units == Style::UNITS_AS_MM) { + v = SS.StringToMm(str); + } else { + v = atof(str); + } + v = max(0.0, v); + if(edit.meaning == EDIT_STYLE_TEXT_HEIGHT) { + s->textHeight = v; + } else if(edit.meaning == EDIT_STYLE_STIPPLE_PERIOD) { + s->stippleScale = v; + } else { + s->width = v; + } + break; + } + case EDIT_STYLE_TEXT_ANGLE: + SS.UndoRemember(); + s = Style::Get(edit.style); + s->textAngle = WRAP_SYMMETRIC(atof(str), 360); + break; + + case EDIT_BACKGROUND_COLOR: + case EDIT_STYLE_FILL_COLOR: + case EDIT_STYLE_COLOR: { + Vector rgb; + if(sscanf(str, "%lf, %lf, %lf", &rgb.x, &rgb.y, &rgb.z)==3) { + rgb = rgb.ClampWithin(0, 1); + if(edit.meaning == EDIT_STYLE_COLOR) { + SS.UndoRemember(); + s = Style::Get(edit.style); + s->color = RGBf(rgb.x, rgb.y, rgb.z); + } else if(edit.meaning == EDIT_STYLE_FILL_COLOR) { + SS.UndoRemember(); + s = Style::Get(edit.style); + s->fillColor = RGBf(rgb.x, rgb.y, rgb.z); + } else { + SS.backgroundColor = RGBf(rgb.x, rgb.y, rgb.z); + } + } else { + Error("Bad format: specify color as r, g, b"); + } + break; + } + case EDIT_STYLE_NAME: + if(!*str) { + Error("Style name cannot be empty"); + } else { + SS.UndoRemember(); + s = Style::Get(edit.style); + s->name = str; + } + break; + + case EDIT_BACKGROUND_IMG_SCALE: { + Expr *e = Expr::From(str, true); + if(e) { + double ev = e->Eval(); + if(ev < 0.001 || isnan(ev)) { + Error("Scale must not be zero or negative!"); + } else { + SS.bgImage.scale = ev / SS.MmPerUnit(); + } + } + break; + } + default: return false; + } + return true; +} + +void TextWindow::ShowStyleInfo(void) { + Printf(true, "%Fl%f%Ll(back to list of styles)%E", &ScreenShowListOfStyles); + + Style *s = Style::Get(shown.style); + + if(s->h.v < Style::FIRST_CUSTOM) { + Printf(true, "%FtSTYLE %E%s ", s->DescriptionString().c_str()); + } else { + Printf(true, "%FtSTYLE %E%s " + "[%Fl%Ll%D%frename%E/%Fl%Ll%D%fdel%E]", + s->DescriptionString().c_str(), + s->h.v, &ScreenChangeStyleName, + s->h.v, &ScreenDeleteStyle); + } + Printf(true, "%Ft line stroke style%E"); + Printf(false, "%Ba %Ftcolor %E%Bz %Ba (%@, %@, %@) %D%f%Ls%Fl[change]%E", + &s->color, + s->color.redF(), s->color.greenF(), s->color.blueF(), + s->h.v, ScreenChangeStyleColor); + + // The line width, and its units + if(s->widthAs == Style::UNITS_AS_PIXELS) { + Printf(false, " %Ftwidth%E %@ %D%f%Lp%Fl[change]%E", + s->width, + s->h.v, &ScreenChangeStyleMetric, + (s->h.v < Style::FIRST_CUSTOM) ? 'w' : 'W'); + } else { + Printf(false, " %Ftwidth%E %s %D%f%Lp%Fl[change]%E", + SS.MmToString(s->width).c_str(), + s->h.v, &ScreenChangeStyleMetric, + (s->h.v < Style::FIRST_CUSTOM) ? 'w' : 'W'); + } + + if(s->h.v >= Style::FIRST_CUSTOM) { + if(s->widthAs == Style::UNITS_AS_PIXELS) { + Printf(false, "%Ba %Ftstipple width%E %@ %D%f%Lp%Fl[change]%E", + s->stippleScale, + s->h.v, &ScreenChangeStyleMetric, 's'); + } else { + Printf(false, "%Ba %Ftstipple width%E %s %D%f%Lp%Fl[change]%E", + SS.MmToString(s->stippleScale).c_str(), + s->h.v, &ScreenChangeStyleMetric, 's'); + } + } + + bool widthpx = (s->widthAs == Style::UNITS_AS_PIXELS); + if(s->h.v < Style::FIRST_CUSTOM) { + Printf(false," %Ftin units of %Fdpixels%E"); + } else { + Printf(false,"%Ba %Ftin units of %Fd" + "%D%f%LW%s pixels%E " + "%D%f%Lw%s %s", + s->h.v, &ScreenChangeStyleYesNo, + widthpx ? RADIO_TRUE : RADIO_FALSE, + s->h.v, &ScreenChangeStyleYesNo, + !widthpx ? RADIO_TRUE : RADIO_FALSE, + SS.UnitName()); + } + + Printf(false,"%Ba %Ftstipple type:%E"); + + const size_t patternCount = Style::LAST_STIPPLE + 1; + const char *patternsSource[patternCount] = { + "___________", + "- - - - - -", + "__ __ __ __", + "-.-.-.-.-.-", + "..-..-..-..", + "...........", + "~~~~~~~~~~~", + "__~__~__~__" + }; + std::string patterns[patternCount]; + + for(int i = 0; i <= Style::LAST_STIPPLE; i++) { + const char *str = patternsSource[i]; + do { + switch(*str) { + case ' ': patterns[i] += " "; break; + case '.': patterns[i] += "\xEE\x80\x84"; break; + case '_': patterns[i] += "\xEE\x80\x85"; break; + case '-': patterns[i] += "\xEE\x80\x86"; break; + case '~': patterns[i] += "\xEE\x80\x87"; break; + default: oops(); + } + } while(*(++str)); + } + + for(int i = 0; i <= Style::LAST_STIPPLE; i++) { + const char *radio = s->stippleType == i ? RADIO_TRUE : RADIO_FALSE; + Printf(false, "%Bp %D%f%Lp%s %s%E", + (i % 2 == 0) ? 'd' : 'a', + s->h.v, &ScreenChangeStylePatternType, + i + 1, radio, patterns[i].c_str()); + } + + if(s->h.v >= Style::FIRST_CUSTOM) { + // The fill color, and whether contours are filled + + Printf(false, ""); + Printf(false, "%Ft contour fill style%E"); + Printf(false, + "%Ba %Ftcolor %E%Bz %Ba (%@, %@, %@) %D%f%Lf%Fl[change]%E", + &s->fillColor, + s->fillColor.redF(), s->fillColor.greenF(), s->fillColor.blueF(), + s->h.v, ScreenChangeStyleColor); + + Printf(false, "%Bd %D%f%Lf%s contours are filled%E", + s->h.v, &ScreenChangeStyleYesNo, + s->filled ? CHECK_TRUE : CHECK_FALSE); + } + + // The text height, and its units + Printf(false, ""); + Printf(false, "%Ft text style%E"); + + if(s->textHeightAs == Style::UNITS_AS_PIXELS) { + Printf(false, "%Ba %Ftheight %E%@ %D%f%Lt%Fl%s%E", + s->textHeight, + s->h.v, &ScreenChangeStyleMetric, + "[change]"); + } else { + Printf(false, "%Ba %Ftheight %E%s %D%f%Lt%Fl%s%E", + SS.MmToString(s->textHeight).c_str(), + s->h.v, &ScreenChangeStyleMetric, + "[change]"); + } + + bool textHeightpx = (s->textHeightAs == Style::UNITS_AS_PIXELS); + if(s->h.v < Style::FIRST_CUSTOM) { + Printf(false,"%Bd %Ftin units of %Fdpixels"); + } else { + Printf(false,"%Bd %Ftin units of %Fd" + "%D%f%LG%s pixels%E " + "%D%f%Lg%s %s", + s->h.v, &ScreenChangeStyleYesNo, + textHeightpx ? RADIO_TRUE : RADIO_FALSE, + s->h.v, &ScreenChangeStyleYesNo, + !textHeightpx ? RADIO_TRUE : RADIO_FALSE, + SS.UnitName()); + } + + if(s->h.v >= Style::FIRST_CUSTOM) { + Printf(false, "%Ba %Ftangle %E%@ %D%f%Ll%Fl[change]%E", + s->textAngle, + s->h.v, &ScreenChangeStyleTextAngle); + + Printf(false, ""); + Printf(false, "%Ft text comment alignment%E"); + bool neither; + neither = !(s->textOrigin & (Style::ORIGIN_LEFT | Style::ORIGIN_RIGHT)); + Printf(false, "%Ba " + "%D%f%LL%s left%E " + "%D%f%LH%s center%E " + "%D%f%LR%s right%E ", + s->h.v, &ScreenChangeStyleYesNo, + (s->textOrigin & Style::ORIGIN_LEFT) ? RADIO_TRUE : RADIO_FALSE, + s->h.v, &ScreenChangeStyleYesNo, + neither ? RADIO_TRUE : RADIO_FALSE, + s->h.v, &ScreenChangeStyleYesNo, + (s->textOrigin & Style::ORIGIN_RIGHT) ? RADIO_TRUE : RADIO_FALSE); + + neither = !(s->textOrigin & (Style::ORIGIN_BOT | Style::ORIGIN_TOP)); + Printf(false, "%Bd " + "%D%f%LB%s bottom%E " + "%D%f%LV%s center%E " + "%D%f%LT%s top%E ", + s->h.v, &ScreenChangeStyleYesNo, + (s->textOrigin & Style::ORIGIN_BOT) ? RADIO_TRUE : RADIO_FALSE, + s->h.v, &ScreenChangeStyleYesNo, + neither ? RADIO_TRUE : RADIO_FALSE, + s->h.v, &ScreenChangeStyleYesNo, + (s->textOrigin & Style::ORIGIN_TOP) ? RADIO_TRUE : RADIO_FALSE); + } + + if(s->h.v >= Style::FIRST_CUSTOM) { + Printf(false, ""); + + Printf(false, " %Fd%D%f%Lv%s show these objects on screen%E", + s->h.v, &ScreenChangeStyleYesNo, + s->visible ? CHECK_TRUE : CHECK_FALSE); + + Printf(false, " %Fd%D%f%Le%s export these objects%E", + s->h.v, &ScreenChangeStyleYesNo, + s->exportable ? CHECK_TRUE : CHECK_FALSE); + + Printf(false, ""); + Printf(false, "To assign lines or curves to this style,"); + Printf(false, "right-click them on the drawing."); + } +} + +void TextWindow::ScreenAssignSelectionToStyle(int link, uint32_t v) { + Style::AssignSelectionToStyle(v); +} + diff --git a/src/system.cpp b/src/system.cpp new file mode 100644 index 0000000..6b222b9 --- /dev/null +++ b/src/system.cpp @@ -0,0 +1,538 @@ +//----------------------------------------------------------------------------- +// Once we've written our constraint equations in the symbolic algebra system, +// these routines linearize them, and solve by a modified Newton's method. +// This also contains the routines to detect non-convergence or inconsistency, +// and report diagnostics to the user. +// +// Copyright 2008-2013 Jonathan Westhues. +//----------------------------------------------------------------------------- +#include "solvespace.h" + +// This tolerance is used to determine whether two (linearized) constraints +// are linearly dependent. If this is too small, then we will attempt to +// solve truly inconsistent systems and fail. But if it's too large, then +// we will give up on legitimate systems like a skinny right angle triangle by +// its hypotenuse and long side. +const double System::RANK_MAG_TOLERANCE = 1e-4; + +// The solver will converge all unknowns to within this tolerance. This must +// always be much less than LENGTH_EPS, and in practice should be much less. +const double System::CONVERGE_TOLERANCE = (LENGTH_EPS/(1e2)); + +bool System::WriteJacobian(int tag) { + int a, i, j; + + j = 0; + for(a = 0; a < param.n; a++) { + if(j >= MAX_UNKNOWNS) return false; + + Param *p = &(param.elem[a]); + if(p->tag != tag) continue; + mat.param[j] = p->h; + j++; + } + mat.n = j; + + i = 0; + for(a = 0; a < eq.n; a++) { + if(i >= MAX_UNKNOWNS) return false; + + Equation *e = &(eq.elem[a]); + if(e->tag != tag) continue; + + mat.eq[i] = e->h; + Expr *f = e->e->DeepCopyWithParamsAsPointers(¶m, &(SK.param)); + f = f->FoldConstants(); + + // Hash table (61 bits) to accelerate generation of zero partials. + uint64_t scoreboard = f->ParamsUsed(); + for(j = 0; j < mat.n; j++) { + Expr *pd; + if(scoreboard & ((uint64_t)1 << (mat.param[j].v % 61)) && + f->DependsOn(mat.param[j])) + { + pd = f->PartialWrt(mat.param[j]); + pd = pd->FoldConstants(); + pd = pd->DeepCopyWithParamsAsPointers(¶m, &(SK.param)); + } else { + pd = Expr::From(0.0); + } + mat.A.sym[i][j] = pd; + } + mat.B.sym[i] = f; + i++; + } + mat.m = i; + + return true; +} + +void System::EvalJacobian(void) { + int i, j; + for(i = 0; i < mat.m; i++) { + for(j = 0; j < mat.n; j++) { + mat.A.num[i][j] = (mat.A.sym[i][j])->Eval(); + } + } +} + +bool System::IsDragged(hParam p) { + hParam *pp; + for(pp = dragged.First(); pp; pp = dragged.NextAfter(pp)) { + if(p.v == pp->v) return true; + } + return false; +} + +void System::SolveBySubstitution(void) { + int i; + for(i = 0; i < eq.n; i++) { + Equation *teq = &(eq.elem[i]); + Expr *tex = teq->e; + + if(tex->op == Expr::MINUS && + tex->a->op == Expr::PARAM && + tex->b->op == Expr::PARAM) + { + hParam a = tex->a->parh; + hParam b = tex->b->parh; + if(!(param.FindByIdNoOops(a) && param.FindByIdNoOops(b))) { + // Don't substitute unless they're both solver params; + // otherwise it's an equation that can be solved immediately, + // or an error to flag later. + continue; + } + + if(IsDragged(a)) { + // A is being dragged, so A should stay, and B should go + hParam t = a; + a = b; + b = t; + } + + int j; + for(j = 0; j < eq.n; j++) { + Equation *req = &(eq.elem[j]); + (req->e)->Substitute(a, b); // A becomes B, B unchanged + } + for(j = 0; j < param.n; j++) { + Param *rp = &(param.elem[j]); + if(rp->substd.v == a.v) { + rp->substd = b; + } + } + Param *ptr = param.FindById(a); + ptr->tag = VAR_SUBSTITUTED; + ptr->substd = b; + + teq->tag = EQ_SUBSTITUTED; + } + } +} + +//----------------------------------------------------------------------------- +// Calculate the rank of the Jacobian matrix, by Gram-Schimdt orthogonalization +// in place. A row (~equation) is considered to be all zeros if its magnitude +// is less than the tolerance RANK_MAG_TOLERANCE. +//----------------------------------------------------------------------------- +int System::CalculateRank(void) { + // Actually work with magnitudes squared, not the magnitudes + double rowMag[MAX_UNKNOWNS] = {}; + double tol = RANK_MAG_TOLERANCE*RANK_MAG_TOLERANCE; + + int i, iprev, j; + int rank = 0; + + for(i = 0; i < mat.m; i++) { + // Subtract off this row's component in the direction of any + // previous rows + for(iprev = 0; iprev < i; iprev++) { + if(rowMag[iprev] <= tol) continue; // ignore zero rows + + double dot = 0; + for(j = 0; j < mat.n; j++) { + dot += (mat.A.num[iprev][j]) * (mat.A.num[i][j]); + } + for(j = 0; j < mat.n; j++) { + mat.A.num[i][j] -= (dot/rowMag[iprev])*mat.A.num[iprev][j]; + } + } + // Our row is now normal to all previous rows; calculate the + // magnitude of what's left + double mag = 0; + for(j = 0; j < mat.n; j++) { + mag += (mat.A.num[i][j]) * (mat.A.num[i][j]); + } + if(mag > tol) { + rank++; + } + rowMag[i] = mag; + } + + return rank; +} + +bool System::TestRank(void) { + EvalJacobian(); + return CalculateRank() == mat.m; +} + +bool System::SolveLinearSystem(double X[], double A[][MAX_UNKNOWNS], + double B[], int n) +{ + // Gaussian elimination, with partial pivoting. It's an error if the + // matrix is singular, because that means two constraints are + // equivalent. + int i, j, ip, jp, imax = 0; + double max, temp; + + for(i = 0; i < n; i++) { + // We are trying eliminate the term in column i, for rows i+1 and + // greater. First, find a pivot (between rows i and N-1). + max = 0; + for(ip = i; ip < n; ip++) { + if(ffabs(A[ip][i]) > max) { + imax = ip; + max = ffabs(A[ip][i]); + } + } + // Don't give up on a singular matrix unless it's really bad; the + // assumption code is responsible for identifying that condition, + // so we're not responsible for reporting that error. + if(ffabs(max) < 1e-20) continue; + + // Swap row imax with row i + for(jp = 0; jp < n; jp++) { + swap(A[i][jp], A[imax][jp]); + } + swap(B[i], B[imax]); + + // For rows i+1 and greater, eliminate the term in column i. + for(ip = i+1; ip < n; ip++) { + temp = A[ip][i]/A[i][i]; + + for(jp = i; jp < n; jp++) { + A[ip][jp] -= temp*(A[i][jp]); + } + B[ip] -= temp*B[i]; + } + } + + // We've put the matrix in upper triangular form, so at this point we + // can solve by back-substitution. + for(i = n - 1; i >= 0; i--) { + if(ffabs(A[i][i]) < 1e-20) continue; + + temp = B[i]; + for(j = n - 1; j > i; j--) { + temp -= X[j]*A[i][j]; + } + X[i] = temp / A[i][i]; + } + + return true; +} + +bool System::SolveLeastSquares(void) { + int r, c, i; + + // Scale the columns; this scale weights the parameters for the least + // squares solve, so that we can encourage the solver to make bigger + // changes in some parameters, and smaller in others. + for(c = 0; c < mat.n; c++) { + if(IsDragged(mat.param[c])) { + // It's least squares, so this parameter doesn't need to be all + // that big to get a large effect. + mat.scale[c] = 1/20.0; + } else { + mat.scale[c] = 1; + } + for(r = 0; r < mat.m; r++) { + mat.A.num[r][c] *= mat.scale[c]; + } + } + + // Write A*A' + for(r = 0; r < mat.m; r++) { + for(c = 0; c < mat.m; c++) { // yes, AAt is square + double sum = 0; + for(i = 0; i < mat.n; i++) { + sum += mat.A.num[r][i]*mat.A.num[c][i]; + } + mat.AAt[r][c] = sum; + } + } + + if(!SolveLinearSystem(mat.Z, mat.AAt, mat.B.num, mat.m)) return false; + + // And multiply that by A' to get our solution. + for(c = 0; c < mat.n; c++) { + double sum = 0; + for(i = 0; i < mat.m; i++) { + sum += mat.A.num[i][c]*mat.Z[i]; + } + mat.X[c] = sum * mat.scale[c]; + } + return true; +} + +bool System::NewtonSolve(int tag) { + + int iter = 0; + bool converged = false; + int i; + + // Evaluate the functions at our operating point. + for(i = 0; i < mat.m; i++) { + mat.B.num[i] = (mat.B.sym[i])->Eval(); + } + do { + // And evaluate the Jacobian at our initial operating point. + EvalJacobian(); + + if(!SolveLeastSquares()) break; + + // Take the Newton step; + // J(x_n) (x_{n+1} - x_n) = 0 - F(x_n) + for(i = 0; i < mat.n; i++) { + Param *p = param.FindById(mat.param[i]); + p->val -= mat.X[i]; + if(isnan(p->val)) { + // Very bad, and clearly not convergent + return false; + } + } + + // Re-evalute the functions, since the params have just changed. + for(i = 0; i < mat.m; i++) { + mat.B.num[i] = (mat.B.sym[i])->Eval(); + } + // Check for convergence + converged = true; + for(i = 0; i < mat.m; i++) { + if(isnan(mat.B.num[i])) { + return false; + } + if(ffabs(mat.B.num[i]) > CONVERGE_TOLERANCE) { + converged = false; + break; + } + } + } while(iter++ < 50 && !converged); + + return converged; +} + +void System::WriteEquationsExceptFor(hConstraint hc, Group *g) { + int i; + // Generate all the equations from constraints in this group + for(i = 0; i < SK.constraint.n; i++) { + ConstraintBase *c = &(SK.constraint.elem[i]); + if(c->group.v != g->h.v) continue; + if(c->h.v == hc.v) continue; + + if(c->HasLabel() && c->type != Constraint::COMMENT && + g->allDimsReference) + { + // When all dimensions are reference, we adjust them to display + // the correct value, and then don't generate any equations. + c->ModifyToSatisfy(); + continue; + } + if(g->relaxConstraints && c->type != Constraint::POINTS_COINCIDENT) { + // When the constraints are relaxed, we keep only the point- + // coincident constraints, and the constraints generated by + // the entities and groups. + continue; + } + + c->Generate(&eq); + } + // And the equations from entities + for(i = 0; i < SK.entity.n; i++) { + EntityBase *e = &(SK.entity.elem[i]); + if(e->group.v != g->h.v) continue; + + e->GenerateEquations(&eq); + } + // And from the groups themselves + g->GenerateEquations(&eq); +} + +void System::FindWhichToRemoveToFixJacobian(Group *g, List *bad) { + int a, i; + + for(a = 0; a < 2; a++) { + for(i = 0; i < SK.constraint.n; i++) { + ConstraintBase *c = &(SK.constraint.elem[i]); + if(c->group.v != g->h.v) continue; + if((c->type == Constraint::POINTS_COINCIDENT && a == 0) || + (c->type != Constraint::POINTS_COINCIDENT && a == 1)) + { + // Do the constraints in two passes: first everything but + // the point-coincident constraints, then only those + // constraints (so they appear last in the list). + continue; + } + + param.ClearTags(); + eq.Clear(); + WriteEquationsExceptFor(c->h, g); + eq.ClearTags(); + + // It's a major speedup to solve the easy ones by substitution here, + // and that doesn't break anything. + SolveBySubstitution(); + + WriteJacobian(0); + EvalJacobian(); + + int rank = CalculateRank(); + if(rank == mat.m) { + // We fixed it by removing this constraint + bad->Add(&(c->h)); + } + } + } +} + +int System::Solve(Group *g, int *dof, List *bad, + bool andFindBad, bool andFindFree) +{ + WriteEquationsExceptFor(Constraint::NO_CONSTRAINT, g); + + int i; + bool rankOk; + +/* + dbp("%d equations", eq.n); + for(i = 0; i < eq.n; i++) { + dbp(" %.3f = %s = 0", eq.elem[i].e->Eval(), eq.elem[i].e->Print()); + } + dbp("%d parameters", param.n); + for(i = 0; i < param.n; i++) { + dbp(" param %08x at %.3f", param.elem[i].h.v, param.elem[i].val); + } */ + + // All params and equations are assigned to group zero. + param.ClearTags(); + eq.ClearTags(); + + SolveBySubstitution(); + + // Before solving the big system, see if we can find any equations that + // are soluble alone. This can be a huge speedup. We don't know whether + // the system is consistent yet, but if it isn't then we'll catch that + // later. + int alone = 1; + for(i = 0; i < eq.n; i++) { + Equation *e = &(eq.elem[i]); + if(e->tag != 0) continue; + + hParam hp = e->e->ReferencedParams(¶m); + if(hp.v == Expr::NO_PARAMS.v) continue; + if(hp.v == Expr::MULTIPLE_PARAMS.v) continue; + + Param *p = param.FindById(hp); + if(p->tag != 0) continue; // let rank test catch inconsistency + + e->tag = alone; + p->tag = alone; + WriteJacobian(alone); + if(!NewtonSolve(alone)) { + // Failed to converge, bail out early + goto didnt_converge; + } + alone++; + } + + // Now write the Jacobian for what's left, and do a rank test; that + // tells us if the system is inconsistently constrained. + if(!WriteJacobian(0)) { + return System::TOO_MANY_UNKNOWNS; + } + + rankOk = TestRank(); + + // And do the leftovers as one big system + if(!NewtonSolve(0)) { + goto didnt_converge; + } + + rankOk = TestRank(); + if(!rankOk) { + if(!g->allowRedundant) { + if(andFindBad) FindWhichToRemoveToFixJacobian(g, bad); + } + } else { + // This is not the full Jacobian, but any substitutions or single-eq + // solves removed one equation and one unknown, therefore no effect + // on the number of DOF. + if(dof) *dof = mat.n - mat.m; + + // If requested, find all the free (unbound) variables. This might be + // more than the number of degrees of freedom. Don't always do this, + // because the display would get annoying and it's slow. + for(i = 0; i < param.n; i++) { + Param *p = &(param.elem[i]); + p->free = false; + + if(andFindFree) { + if(p->tag == 0) { + p->tag = VAR_DOF_TEST; + WriteJacobian(0); + EvalJacobian(); + int rank = CalculateRank(); + if(rank == mat.m) { + p->free = true; + } + p->tag = 0; + } + } + } + } + // System solved correctly, so write the new values back in to the + // main parameter table. + for(i = 0; i < param.n; i++) { + Param *p = &(param.elem[i]); + double val; + if(p->tag == VAR_SUBSTITUTED) { + val = param.FindById(p->substd)->val; + } else { + val = p->val; + } + Param *pp = SK.GetParam(p->h); + pp->val = val; + pp->known = true; + pp->free = p->free; + } + return rankOk ? System::SOLVED_OKAY : System::REDUNDANT_OKAY; + +didnt_converge: + SK.constraint.ClearTags(); + for(i = 0; i < eq.n; i++) { + if(ffabs(mat.B.num[i]) > CONVERGE_TOLERANCE || isnan(mat.B.num[i])) { + // This constraint is unsatisfied. + if(!mat.eq[i].isFromConstraint()) continue; + + hConstraint hc = mat.eq[i].constraint(); + ConstraintBase *c = SK.constraint.FindByIdNoOops(hc); + if(!c) continue; + // Don't double-show constraints that generated multiple + // unsatisfied equations + if(!c->tag) { + bad->Add(&(c->h)); + c->tag = 1; + } + } + } + + return rankOk ? System::DIDNT_CONVERGE : System::REDUNDANT_DIDNT_CONVERGE; +} + +void System::Clear(void) { + entity.Clear(); + param.Clear(); + eq.Clear(); + dragged.Clear(); +} diff --git a/src/textscreens.cpp b/src/textscreens.cpp new file mode 100644 index 0000000..e00b2bd --- /dev/null +++ b/src/textscreens.cpp @@ -0,0 +1,806 @@ +//----------------------------------------------------------------------------- +// The text-based browser window, used to view the structure of the model by +// groups and for other similar purposes. +// +// Copyright 2008-2013 Jonathan Westhues. +//----------------------------------------------------------------------------- +#include "solvespace.h" + +//----------------------------------------------------------------------------- +// A navigation bar that always appears at the top of the window, with a +// link to bring us back home. +//----------------------------------------------------------------------------- +void TextWindow::ScreenHome(int link, uint32_t v) { + SS.TW.GoToScreen(SCREEN_LIST_OF_GROUPS); +} +void TextWindow::ShowHeader(bool withNav) { + ClearScreen(); + + const char *header; + std::string desc; + if(SS.GW.LockedInWorkplane()) { + header = "in plane: "; + desc = SK.GetEntity(SS.GW.ActiveWorkplane())->DescriptionString(); + } else { + header = "drawing / constraining in 3d"; + desc = ""; + } + + // Navigation buttons + if(withNav) { + Printf(false, " %Fl%Lh%fhome%E %Ft%s%E%s", + (&TextWindow::ScreenHome), header, desc.c_str()); + } else { + Printf(false, " %Ft%s%E%s", header, desc.c_str()); + } + + // Leave space for the icons that are painted here. + Printf(false, ""); + Printf(false, ""); +} + +//----------------------------------------------------------------------------- +// The screen that shows a list of every group in the sketch, with options +// to hide or show them, and to view them in detail. This is our home page. +//----------------------------------------------------------------------------- +void TextWindow::ScreenSelectGroup(int link, uint32_t v) { + SS.TW.GoToScreen(SCREEN_GROUP_INFO); + SS.TW.shown.group.v = v; +} +void TextWindow::ScreenToggleGroupShown(int link, uint32_t v) { + hGroup hg = { v }; + Group *g = SK.GetGroup(hg); + g->visible = !(g->visible); + // If a group was just shown, then it might not have been generated + // previously, so regenerate. + SS.GenerateAll(); +} +void TextWindow::ScreenShowGroupsSpecial(int link, uint32_t v) { + bool state = link == 's'; + for(int i = 0; i < SK.groupOrder.n; i++) { + Group *g = SK.GetGroup(SK.groupOrder.elem[i]); + g->visible = state; + } +} +void TextWindow::ScreenActivateGroup(int link, uint32_t v) { + SS.GW.activeGroup.v = v; + SK.GetGroup(SS.GW.activeGroup)->Activate(); + SS.GW.ClearSuper(); +} +void TextWindow::ReportHowGroupSolved(hGroup hg) { + SS.GW.ClearSuper(); + SS.TW.GoToScreen(SCREEN_GROUP_SOLVE_INFO); + SS.TW.shown.group.v = hg.v; + SS.ScheduleShowTW(); +} +void TextWindow::ScreenHowGroupSolved(int link, uint32_t v) { + if(SS.GW.activeGroup.v != v) { + ScreenActivateGroup(link, v); + } + SS.TW.GoToScreen(SCREEN_GROUP_SOLVE_INFO); + SS.TW.shown.group.v = v; +} +void TextWindow::ScreenShowConfiguration(int link, uint32_t v) { + SS.TW.GoToScreen(SCREEN_CONFIGURATION); +} +void TextWindow::ScreenShowEditView(int link, uint32_t v) { + SS.TW.GoToScreen(SCREEN_EDIT_VIEW); +} +void TextWindow::ScreenGoToWebsite(int link, uint32_t v) { + OpenWebsite("http://solvespace.com/txtlink"); +} +void TextWindow::ShowListOfGroups(void) { + const char *radioTrue = " " RADIO_TRUE " ", + *radioFalse = " " RADIO_FALSE " ", + *checkTrue = " " CHECK_TRUE " ", + *checkFalse = " " CHECK_FALSE " "; + + Printf(true, "%Ft active"); + Printf(false, "%Ft shown ok group-name%E"); + int i; + bool afterActive = false; + for(i = 0; i < SK.groupOrder.n; i++) { + Group *g = SK.GetGroup(SK.groupOrder.elem[i]); + std::string s = g->DescriptionString(); + bool active = (g->h.v == SS.GW.activeGroup.v); + bool shown = g->visible; + bool ok = g->IsSolvedOkay(); + bool ref = (g->h.v == Group::HGROUP_REFERENCES.v); + Printf(false, "%Bp%Fd " + "%Ft%s%Fb%D%f%Ll%s%E " + "%Fb%s%D%f%Ll%s%E " + "%Fp%D%f%s%Ll%s%E " + "%Fl%Ll%D%f%s", + // Alternate between light and dark backgrounds, for readability + (i & 1) ? 'd' : 'a', + // Link that activates the group + ref ? " " : "", + g->h.v, (&TextWindow::ScreenActivateGroup), + ref ? "" : (active ? radioTrue : radioFalse), + // Link that hides or shows the group + afterActive ? " - " : "", + g->h.v, (&TextWindow::ScreenToggleGroupShown), + afterActive ? "" : (shown ? checkTrue : checkFalse), + // Link to the errors, if a problem occured while solving + ok ? 's' : 'x', g->h.v, (&TextWindow::ScreenHowGroupSolved), + ok ? "ok" : "", + ok ? "" : "NO", + // Link to a screen that gives more details on the group + g->h.v, (&TextWindow::ScreenSelectGroup), s.c_str()); + + if(active) afterActive = true; + } + + Printf(true, " %Fl%Ls%fshow all%E / %Fl%Lh%fhide all%E", + &(TextWindow::ScreenShowGroupsSpecial), + &(TextWindow::ScreenShowGroupsSpecial)); + Printf(true, " %Fl%Ls%fline styles%E /" + " %Fl%Ls%fview%E /" + " %Fl%Ls%fconfiguration%E", + &(TextWindow::ScreenShowListOfStyles), + &(TextWindow::ScreenShowEditView), + &(TextWindow::ScreenShowConfiguration)); +} + + +//----------------------------------------------------------------------------- +// The screen that shows information about a specific group, and allows the +// user to edit various things about it. +//----------------------------------------------------------------------------- +void TextWindow::ScreenHoverConstraint(int link, uint32_t v) { + if(!SS.GW.showConstraints) return; + + hConstraint hc = { v }; + Constraint *c = SK.GetConstraint(hc); + if(c->group.v != SS.GW.activeGroup.v) { + // Only constraints in the active group are visible + return; + } + SS.GW.hover.Clear(); + SS.GW.hover.constraint = hc; + SS.GW.hover.emphasized = true; +} +void TextWindow::ScreenHoverRequest(int link, uint32_t v) { + SS.GW.hover.Clear(); + hRequest hr = { v }; + SS.GW.hover.entity = hr.entity(0); + SS.GW.hover.emphasized = true; +} +void TextWindow::ScreenSelectConstraint(int link, uint32_t v) { + SS.GW.ClearSelection(); + GraphicsWindow::Selection sel = {}; + sel.constraint.v = v; + SS.GW.selection.Add(&sel); +} +void TextWindow::ScreenSelectRequest(int link, uint32_t v) { + SS.GW.ClearSelection(); + GraphicsWindow::Selection sel = {}; + hRequest hr = { v }; + sel.entity = hr.entity(0); + SS.GW.selection.Add(&sel); +} + +void TextWindow::ScreenChangeGroupOption(int link, uint32_t v) { + SS.UndoRemember(); + Group *g = SK.GetGroup(SS.TW.shown.group); + + switch(link) { + case 's': g->subtype = Group::ONE_SIDED; break; + case 'S': g->subtype = Group::TWO_SIDED; break; + + case 'k': g->skipFirst = true; break; + case 'K': g->skipFirst = false; break; + + case 'c': + // When an extrude group is first created, it's positioned for a union + // extrusion. If no constraints were added, flip it when we switch between + // union and difference modes to avoid manual work doing the smae. + if(g->meshCombine != (int)v && g->GetNumConstraints() == 0 && + (v == Group::COMBINE_AS_DIFFERENCE || + g->meshCombine == Group::COMBINE_AS_DIFFERENCE)) { + g->ExtrusionForceVectorTo(g->ExtrusionGetVector().Negated()); + } + g->meshCombine = v; + break; + + case 'P': g->suppress = !(g->suppress); break; + + case 'r': g->relaxConstraints = !(g->relaxConstraints); break; + + case 'e': g->allowRedundant = !(g->allowRedundant); break; + + case 'v': g->visible = !(g->visible); break; + + case 'd': g->allDimsReference = !(g->allDimsReference); break; + + case 'f': g->forceToMesh = !(g->forceToMesh); break; + } + + SS.MarkGroupDirty(g->h); + SS.GenerateAll(); + SS.GW.ClearSuper(); +} + +void TextWindow::ScreenColor(int link, uint32_t v) { + SS.UndoRemember(); + + Group *g = SK.GetGroup(SS.TW.shown.group); + SS.TW.ShowEditControlWithColorPicker(3, g->color); + SS.TW.edit.meaning = EDIT_GROUP_COLOR; +} +void TextWindow::ScreenOpacity(int link, uint32_t v) { + Group *g = SK.GetGroup(SS.TW.shown.group); + + SS.TW.ShowEditControl(11, ssprintf("%.2f", g->color.alphaF())); + SS.TW.edit.meaning = EDIT_GROUP_OPACITY; + SS.TW.edit.group.v = g->h.v; +} +void TextWindow::ScreenChangeExprA(int link, uint32_t v) { + Group *g = SK.GetGroup(SS.TW.shown.group); + + SS.TW.ShowEditControl(10, ssprintf("%d", (int)g->valA)); + SS.TW.edit.meaning = EDIT_TIMES_REPEATED; + SS.TW.edit.group.v = v; +} +void TextWindow::ScreenChangeGroupName(int link, uint32_t v) { + Group *g = SK.GetGroup(SS.TW.shown.group); + SS.TW.ShowEditControl(12, g->DescriptionString().substr(5)); + SS.TW.edit.meaning = EDIT_GROUP_NAME; + SS.TW.edit.group.v = v; +} +void TextWindow::ScreenChangeGroupScale(int link, uint32_t v) { + Group *g = SK.GetGroup(SS.TW.shown.group); + + SS.TW.ShowEditControl(13, ssprintf("%.3f", g->scale)); + SS.TW.edit.meaning = EDIT_GROUP_SCALE; + SS.TW.edit.group.v = v; +} +void TextWindow::ScreenDeleteGroup(int link, uint32_t v) { + SS.UndoRemember(); + + hGroup hg = SS.TW.shown.group; + if(hg.v == SS.GW.activeGroup.v) { + SS.GW.activeGroup = SK.GetGroup(SS.GW.activeGroup)->PreviousGroup()->h; + } + + // Reset the text window, since we're displaying information about + // the group that's about to get deleted. + SS.TW.ClearSuper(); + + // This is a major change, so let's re-solve everything. + SK.group.RemoveById(hg); + SS.GenerateAll(SolveSpaceUI::GENERATE_ALL); + + // Reset the graphics window. This will also recreate the default + // group if it was removed. + SS.GW.ClearSuper(); +} +void TextWindow::ShowGroupInfo(void) { + Group *g = SK.GetGroup(shown.group); + const char *s = "???"; + + if(shown.group.v == Group::HGROUP_REFERENCES.v) { + Printf(true, "%FtGROUP %E%s", g->DescriptionString().c_str()); + goto list_items; + } else { + Printf(true, "%FtGROUP %E%s [%Fl%Ll%D%frename%E/%Fl%Ll%D%fdel%E]", + g->DescriptionString().c_str(), + g->h.v, &TextWindow::ScreenChangeGroupName, + g->h.v, &TextWindow::ScreenDeleteGroup); + } + + if(g->type == Group::LATHE) { + Printf(true, " %Ftlathe plane sketch"); + } else if(g->type == Group::EXTRUDE || g->type == Group::ROTATE || + g->type == Group::TRANSLATE) + { + if(g->type == Group::EXTRUDE) { + s = "extrude plane sketch"; + } else if(g->type == Group::TRANSLATE) { + s = "translate original sketch"; + } else if(g->type == Group::ROTATE) { + s = "rotate original sketch"; + } + Printf(true, " %Ft%s%E", s); + + bool one = (g->subtype == Group::ONE_SIDED); + Printf(false, + "%Ba %f%Ls%Fd%s one-sided%E " + "%f%LS%Fd%s two-sided%E", + &TextWindow::ScreenChangeGroupOption, + one ? RADIO_TRUE : RADIO_FALSE, + &TextWindow::ScreenChangeGroupOption, + !one ? RADIO_TRUE : RADIO_FALSE); + + if(g->type == Group::ROTATE || g->type == Group::TRANSLATE) { + if(g->subtype == Group::ONE_SIDED) { + bool skip = g->skipFirst; + Printf(false, + "%Bd %Ftstart %f%LK%Fd%s with original%E " + "%f%Lk%Fd%s with copy #1%E", + &ScreenChangeGroupOption, + !skip ? RADIO_TRUE : RADIO_FALSE, + &ScreenChangeGroupOption, + skip ? RADIO_TRUE : RADIO_FALSE); + } + + int times = (int)(g->valA); + Printf(false, "%Bp %Ftrepeat%E %d time%s %Fl%Ll%D%f[change]%E", + (g->subtype == Group::ONE_SIDED) ? 'a' : 'd', + times, times == 1 ? "" : "s", + g->h.v, &TextWindow::ScreenChangeExprA); + } + } else if(g->type == Group::LINKED) { + Printf(true, " %Ftlink geometry from file%E"); + Printf(false, "%Ba '%s'", g->linkFileRel.c_str()); + Printf(false, "%Bd %Ftscaled by%E %# %Fl%Ll%f%D[change]%E", + g->scale, + &TextWindow::ScreenChangeGroupScale, g->h.v); + } else if(g->type == Group::DRAWING_3D) { + Printf(true, " %Ftsketch in 3d%E"); + } else if(g->type == Group::DRAWING_WORKPLANE) { + Printf(true, " %Ftsketch in new workplane%E"); + } else { + Printf(true, "???"); + } + Printf(false, ""); + + if(g->type == Group::EXTRUDE || + g->type == Group::LATHE || + g->type == Group::LINKED) + { + bool un = (g->meshCombine == Group::COMBINE_AS_UNION); + bool diff = (g->meshCombine == Group::COMBINE_AS_DIFFERENCE); + bool asy = (g->meshCombine == Group::COMBINE_AS_ASSEMBLE); + bool asa = (g->type == Group::LINKED); + + Printf(false, " %Ftsolid model as"); + Printf(false, "%Ba %f%D%Lc%Fd%s union%E " + "%f%D%Lc%Fd%s difference%E " + "%f%D%Lc%Fd%s%s%E ", + &TextWindow::ScreenChangeGroupOption, + Group::COMBINE_AS_UNION, + un ? RADIO_TRUE : RADIO_FALSE, + &TextWindow::ScreenChangeGroupOption, + Group::COMBINE_AS_DIFFERENCE, + diff ? RADIO_TRUE : RADIO_FALSE, + &TextWindow::ScreenChangeGroupOption, + Group::COMBINE_AS_ASSEMBLE, + asa ? (asy ? RADIO_TRUE : RADIO_FALSE) : " ", + asa ? " assemble" : ""); + + if(g->type == Group::EXTRUDE || + g->type == Group::LATHE) + { + Printf(false, + "%Bd %Ftcolor %E%Bz %Bd (%@, %@, %@) %f%D%Lf%Fl[change]%E", + &g->color, + g->color.redF(), g->color.greenF(), g->color.blueF(), + ScreenColor, top[rows-1] + 2); + Printf(false, "%Bd %Ftopacity%E %@ %f%Lf%Fl[change]%E", + g->color.alphaF(), + &TextWindow::ScreenOpacity); + } else if(g->type == Group::LINKED) { + Printf(false, " %Fd%f%LP%s suppress this group's solid model", + &TextWindow::ScreenChangeGroupOption, + g->suppress ? CHECK_TRUE : CHECK_FALSE); + } + + Printf(false, ""); + } + + Printf(false, " %f%Lv%Fd%s show entities from this group", + &TextWindow::ScreenChangeGroupOption, + g->visible ? CHECK_TRUE : CHECK_FALSE); + + Group *pg; pg = g->PreviousGroup(); + if(pg && pg->runningMesh.IsEmpty() && g->thisMesh.IsEmpty()) { + Printf(false, " %f%Lf%Fd%s force NURBS surfaces to triangle mesh", + &TextWindow::ScreenChangeGroupOption, + g->forceToMesh ? CHECK_TRUE : CHECK_FALSE); + } else { + Printf(false, " (model already forced to triangle mesh)"); + } + + Printf(true, " %f%Lr%Fd%s relax constraints and dimensions", + &TextWindow::ScreenChangeGroupOption, + g->relaxConstraints ? CHECK_TRUE : CHECK_FALSE); + + Printf(false, " %f%Le%Fd%s allow redundant constraints", + &TextWindow::ScreenChangeGroupOption, + g->allowRedundant ? CHECK_TRUE : CHECK_FALSE); + + Printf(false, " %f%Ld%Fd%s treat all dimensions as reference", + &TextWindow::ScreenChangeGroupOption, + g->allDimsReference ? CHECK_TRUE : CHECK_FALSE); + + if(g->booleanFailed) { + Printf(false, ""); + Printf(false, "The Boolean operation failed. It may be "); + Printf(false, "possible to fix the problem by choosing "); + Printf(false, "'force NURBS surfaces to triangle mesh'."); + } + +list_items: + Printf(false, ""); + Printf(false, "%Ft requests in group"); + + int i, a = 0; + for(i = 0; i < SK.request.n; i++) { + Request *r = &(SK.request.elem[i]); + + if(r->group.v == shown.group.v) { + std::string s = r->DescriptionString(); + Printf(false, "%Bp %Fl%Ll%D%f%h%s%E", + (a & 1) ? 'd' : 'a', + r->h.v, (&TextWindow::ScreenSelectRequest), + &(TextWindow::ScreenHoverRequest), s.c_str()); + a++; + } + } + if(a == 0) Printf(false, "%Ba (none)"); + + a = 0; + Printf(false, ""); + Printf(false, "%Ft constraints in group (%d DOF)", g->solved.dof); + for(i = 0; i < SK.constraint.n; i++) { + Constraint *c = &(SK.constraint.elem[i]); + + if(c->group.v == shown.group.v) { + std::string s = c->DescriptionString(); + Printf(false, "%Bp %Fl%Ll%D%f%h%s%E %s", + (a & 1) ? 'd' : 'a', + c->h.v, (&TextWindow::ScreenSelectConstraint), + (&TextWindow::ScreenHoverConstraint), s.c_str(), + c->reference ? "(ref)" : ""); + a++; + } + } + if(a == 0) Printf(false, "%Ba (none)"); +} + +//----------------------------------------------------------------------------- +// The screen that's displayed when the sketch fails to solve. A report of +// what failed, and (if the problem is a singular Jacobian) a list of +// constraints that could be removed to fix it. +//----------------------------------------------------------------------------- +void TextWindow::ScreenAllowRedundant(int link, uint32_t v) { + SS.UndoRemember(); + + Group *g = SK.GetGroup(SS.TW.shown.group); + g->allowRedundant = true; + SS.GenerateAll(); + + SS.TW.shown.screen = SCREEN_GROUP_INFO; + SS.TW.Show(); +} +void TextWindow::ShowGroupSolveInfo(void) { + Group *g = SK.GetGroup(shown.group); + if(g->IsSolvedOkay()) { + // Go back to the default group info screen + shown.screen = SCREEN_GROUP_INFO; + Show(); + return; + } + + Printf(true, "%FtGROUP %E%s", g->DescriptionString().c_str()); + switch(g->solved.how) { + case System::DIDNT_CONVERGE: + Printf(true, "%FxSOLVE FAILED!%Fd unsolvable constraints"); + Printf(true, "the following constraints are incompatible"); + break; + + case System::REDUNDANT_DIDNT_CONVERGE: + Printf(true, "%FxSOLVE FAILED!%Fd unsolvable constraints"); + Printf(true, "the following constraints are unsatisfied"); + break; + + case System::REDUNDANT_OKAY: + Printf(true, "%FxSOLVE FAILED!%Fd redundant constraints"); + Printf(true, "remove any one of these to fix it"); + break; + + case System::TOO_MANY_UNKNOWNS: + Printf(true, "Too many unknowns in a single group!"); + return; + } + + for(int i = 0; i < g->solved.remove.n; i++) { + hConstraint hc = g->solved.remove.elem[i]; + Constraint *c = SK.constraint.FindByIdNoOops(hc); + if(!c) continue; + + Printf(false, "%Bp %Fl%Ll%D%f%h%s%E", + (i & 1) ? 'd' : 'a', + c->h.v, (&TextWindow::ScreenSelectConstraint), + (&TextWindow::ScreenHoverConstraint), + c->DescriptionString().c_str()); + } + + Printf(true, "It may be possible to fix the problem "); + Printf(false, "by selecting Edit -> Undo."); + + if(g->solved.how == System::REDUNDANT_OKAY) { + Printf(true, "It is possible to suppress this error "); + Printf(false, "by %Fl%f%Llallowing redundant constraints%E in ", + &TextWindow::ScreenAllowRedundant); + Printf(false, "this group."); + } +} + +//----------------------------------------------------------------------------- +// When we're stepping a dimension. User specifies the finish value, and +// how many steps to take in between current and finish, re-solving each +// time. +//----------------------------------------------------------------------------- +void TextWindow::ScreenStepDimFinish(int link, uint32_t v) { + SS.TW.edit.meaning = EDIT_STEP_DIM_FINISH; + std::string edit_value; + if(SS.TW.shown.dimIsDistance) { + edit_value = SS.MmToString(SS.TW.shown.dimFinish); + } else { + edit_value = ssprintf("%.3f", SS.TW.shown.dimFinish); + } + SS.TW.ShowEditControl(12, edit_value); +} +void TextWindow::ScreenStepDimSteps(int link, uint32_t v) { + SS.TW.edit.meaning = EDIT_STEP_DIM_STEPS; + SS.TW.ShowEditControl(12, ssprintf("%d", SS.TW.shown.dimSteps)); +} +void TextWindow::ScreenStepDimGo(int link, uint32_t v) { + hConstraint hc = SS.TW.shown.constraint; + Constraint *c = SK.constraint.FindByIdNoOops(hc); + if(c) { + SS.UndoRemember(); + double start = c->valA, finish = SS.TW.shown.dimFinish; + int i, n = SS.TW.shown.dimSteps; + for(i = 1; i <= n; i++) { + c = SK.GetConstraint(hc); + c->valA = start + ((finish - start)*i)/n; + SS.MarkGroupDirty(c->group); + SS.GenerateAll(); + if(!SS.ActiveGroupsOkay()) { + // Failed to solve, so quit + break; + } + PaintGraphics(); + } + } + InvalidateGraphics(); + SS.TW.GoToScreen(SCREEN_LIST_OF_GROUPS); +} +void TextWindow::ShowStepDimension(void) { + Constraint *c = SK.constraint.FindByIdNoOops(shown.constraint); + if(!c) { + shown.screen = SCREEN_LIST_OF_GROUPS; + Show(); + return; + } + + Printf(true, "%FtSTEP DIMENSION%E %s", c->DescriptionString().c_str()); + + if(shown.dimIsDistance) { + Printf(true, "%Ba %Ftstart%E %s", SS.MmToString(c->valA).c_str()); + Printf(false, "%Bd %Ftfinish%E %s %Fl%Ll%f[change]%E", + SS.MmToString(shown.dimFinish).c_str(), &ScreenStepDimFinish); + } else { + Printf(true, "%Ba %Ftstart%E %@", c->valA); + Printf(false, "%Bd %Ftfinish%E %@ %Fl%Ll%f[change]%E", + shown.dimFinish, &ScreenStepDimFinish); + } + Printf(false, "%Ba %Ftsteps%E %d %Fl%Ll%f%D[change]%E", + shown.dimSteps, &ScreenStepDimSteps); + + Printf(true, " %Fl%Ll%fstep dimension now%E", &ScreenStepDimGo); + + Printf(true, "(or %Fl%Ll%fcancel operation%E)", &ScreenHome); +} + +//----------------------------------------------------------------------------- +// When we're creating tangent arcs (as requests, not as some parametric +// thing). User gets to specify the radius, and whether the old untrimmed +// curves are kept or deleted. +//----------------------------------------------------------------------------- +void TextWindow::ScreenChangeTangentArc(int link, uint32_t v) { + switch(link) { + case 'r': { + SS.TW.edit.meaning = EDIT_TANGENT_ARC_RADIUS; + SS.TW.ShowEditControl(3, SS.MmToString(SS.tangentArcRadius)); + break; + } + + case 'a': SS.tangentArcManual = !SS.tangentArcManual; break; + case 'd': SS.tangentArcDeleteOld = !SS.tangentArcDeleteOld; break; + } +} +void TextWindow::ShowTangentArc(void) { + Printf(true, "%FtTANGENT ARC PARAMETERS%E"); + + Printf(true, "%Ft radius of created arc%E"); + if(SS.tangentArcManual) { + Printf(false, "%Ba %s %Fl%Lr%f[change]%E", + SS.MmToString(SS.tangentArcRadius).c_str(), + &(TextWindow::ScreenChangeTangentArc)); + } else { + Printf(false, "%Ba automatic"); + } + + Printf(false, ""); + Printf(false, " %Fd%f%La%s choose radius automatically%E", + &ScreenChangeTangentArc, + !SS.tangentArcManual ? CHECK_TRUE : CHECK_FALSE); + Printf(false, " %Fd%f%Ld%s delete original entities afterward%E", + &ScreenChangeTangentArc, + SS.tangentArcDeleteOld ? CHECK_TRUE : CHECK_FALSE); + + Printf(false, ""); + Printf(false, "To create a tangent arc at a point,"); + Printf(false, "select that point and then choose"); + Printf(false, "Sketch -> Tangent Arc at Point."); + Printf(true, "(or %Fl%Ll%fback to home screen%E)", &ScreenHome); +} + +//----------------------------------------------------------------------------- +// The edit control is visible, and the user just pressed enter. +//----------------------------------------------------------------------------- +void TextWindow::EditControlDone(const char *s) { + edit.showAgain = false; + + switch(edit.meaning) { + case EDIT_TIMES_REPEATED: { + Expr *e = Expr::From(s, true); + if(e) { + SS.UndoRemember(); + + double ev = e->Eval(); + if((int)ev < 1) { + Error("Can't repeat fewer than 1 time."); + break; + } + if((int)ev > 999) { + Error("Can't repeat more than 999 times."); + break; + } + + Group *g = SK.GetGroup(edit.group); + g->valA = ev; + + if(g->type == Group::ROTATE) { + int i, c = 0; + for(i = 0; i < SK.constraint.n; i++) { + if(SK.constraint.elem[i].group.v == g->h.v) c++; + } + // If the group does not contain any constraints, then + // set the numerical guess to space the copies uniformly + // over one rotation. Don't touch the guess if we're + // already constrained, because that would break + // convergence. + if(c == 0) { + double copies = (g->skipFirst) ? (ev + 1) : ev; + SK.GetParam(g->h.param(3))->val = PI/(2*copies); + } + } + + SS.MarkGroupDirty(g->h); + SS.ScheduleGenerateAll(); + } + break; + } + case EDIT_GROUP_NAME: { + if(!*s) { + Error("Group name cannot be empty"); + } else { + SS.UndoRemember(); + + Group *g = SK.GetGroup(edit.group); + g->name = s; + } + break; + } + case EDIT_GROUP_SCALE: { + Expr *e = Expr::From(s, true); + if(e) { + double ev = e->Eval(); + if(fabs(ev) < 1e-6) { + Error("Scale cannot be zero."); + } else { + Group *g = SK.GetGroup(edit.group); + g->scale = ev; + SS.MarkGroupDirty(g->h); + SS.ScheduleGenerateAll(); + } + } + break; + } + case EDIT_GROUP_COLOR: { + Vector rgb; + if(sscanf(s, "%lf, %lf, %lf", &rgb.x, &rgb.y, &rgb.z)==3) { + rgb = rgb.ClampWithin(0, 1); + + Group *g = SK.group.FindByIdNoOops(SS.TW.shown.group); + if(!g) break; + g->color = RGBf(rgb.x, rgb.y, rgb.z); + + SS.MarkGroupDirty(g->h); + SS.ScheduleGenerateAll(); + SS.GW.ClearSuper(); + } else { + Error("Bad format: specify color as r, g, b"); + } + break; + } + case EDIT_GROUP_OPACITY: { + Expr *e = Expr::From(s, true); + if(e) { + double alpha = e->Eval(); + if(alpha < 0 || alpha > 1) { + Error("Opacity must be between zero and one."); + } else { + Group *g = SK.GetGroup(edit.group); + g->color.alpha = (int)(255.1f * alpha); + SS.MarkGroupDirty(g->h); + SS.ScheduleGenerateAll(); + SS.GW.ClearSuper(); + } + } + break; + } + case EDIT_TTF_TEXT: { + SS.UndoRemember(); + Request *r = SK.request.FindByIdNoOops(edit.request); + if(r) { + r->str = s; + SS.MarkGroupDirty(r->group); + SS.ScheduleGenerateAll(); + } + break; + } + case EDIT_STEP_DIM_FINISH: { + Expr *e = Expr::From(s, true); + if(!e) { + break; + } + if(shown.dimIsDistance) { + shown.dimFinish = SS.ExprToMm(e); + } else { + shown.dimFinish = e->Eval(); + } + break; + } + case EDIT_STEP_DIM_STEPS: + shown.dimSteps = min(300, max(1, atoi(s))); + break; + + case EDIT_TANGENT_ARC_RADIUS: { + Expr *e = Expr::From(s, true); + if(!e) break; + if(e->Eval() < LENGTH_EPS) { + Error("Radius cannot be zero or negative."); + break; + } + SS.tangentArcRadius = SS.ExprToMm(e); + break; + } + + default: { + int cnt = 0; + if(EditControlDoneForStyles(s)) cnt++; + if(EditControlDoneForConfiguration(s)) cnt++; + if(EditControlDoneForPaste(s)) cnt++; + if(EditControlDoneForView(s)) cnt++; + if(cnt > 1) { + // The identifiers were somehow assigned not uniquely? + oops(); + } + break; + } + } + InvalidateGraphics(); + SS.ScheduleShowTW(); + + if(!edit.showAgain) { + HideEditControl(); + edit.meaning = EDIT_NOTHING; + } +} + diff --git a/src/textwin.cpp b/src/textwin.cpp new file mode 100644 index 0000000..656ac62 --- /dev/null +++ b/src/textwin.cpp @@ -0,0 +1,1050 @@ +//----------------------------------------------------------------------------- +// Helper functions for the text-based browser window. +// +// Copyright 2008-2013 Jonathan Westhues. +//----------------------------------------------------------------------------- +#include "solvespace.h" +#include "generated/icons.h" + +const TextWindow::Color TextWindow::fgColors[] = { + { 'd', RGBi(255, 255, 255) }, + { 'l', RGBi(100, 100, 255) }, + { 't', RGBi(255, 200, 0) }, + { 'h', RGBi( 90, 90, 90) }, + { 's', RGBi( 40, 255, 40) }, + { 'm', RGBi(200, 200, 0) }, + { 'r', RGBi( 0, 0, 0) }, + { 'x', RGBi(255, 20, 20) }, + { 'i', RGBi( 0, 255, 255) }, + { 'g', RGBi(160, 160, 160) }, + { 'b', RGBi(200, 200, 200) }, + { 0, RGBi( 0, 0, 0) } +}; +const TextWindow::Color TextWindow::bgColors[] = { + { 'd', RGBi( 0, 0, 0) }, + { 't', RGBi( 34, 15, 15) }, + { 'a', RGBi( 25, 25, 25) }, + { 'r', RGBi(255, 255, 255) }, + { 0, RGBi( 0, 0, 0) } +}; + +bool TextWindow::SPACER = false; +TextWindow::HideShowIcon TextWindow::hideShowIcons[] = { + { &(SS.GW.showWorkplanes), Icon_workplane, "workplanes from inactive groups"}, + { &(SS.GW.showNormals), Icon_normal, "normals" }, + { &(SS.GW.showPoints), Icon_point, "points" }, + { &(SS.GW.showConstraints), Icon_constraint, "constraints and dimensions" }, + { &(SS.GW.showFaces), Icon_faces, "XXX - special cased" }, + { &SPACER, 0, 0 }, + { &(SS.GW.showShaded), Icon_shaded, "shaded view of solid model" }, + { &(SS.GW.showEdges), Icon_edges, "edges of solid model" }, + { &(SS.GW.showOutlines), Icon_outlines, "outline of solid model" }, + { &(SS.GW.showMesh), Icon_mesh, "triangle mesh of solid model" }, + { &SPACER, 0, 0 }, + { &(SS.GW.showHdnLines), Icon_hidden_lines, "hidden lines" }, + { 0, 0, 0 } +}; + +void TextWindow::MakeColorTable(const Color *in, float *out) { + int i; + for(i = 0; in[i].c != 0; i++) { + int c = in[i].c; + if(c < 0 || c > 255) oops(); + out[c*3 + 0] = in[i].color.redF(); + out[c*3 + 1] = in[i].color.greenF(); + out[c*3 + 2] = in[i].color.blueF(); + } +} + +void TextWindow::Init(void) { + ClearSuper(); +} + +void TextWindow::ClearSuper(void) { + HideEditControl(); + + // Cannot use *this = {} here because TextWindow instances + // are 2.4MB long; this causes stack overflows in prologue + // when built with MSVC, even with optimizations. + memset(this, 0, sizeof(*this)); + + MakeColorTable(fgColors, fgColorTable); + MakeColorTable(bgColors, bgColorTable); + + ClearScreen(); + Show(); +} + +void TextWindow::HideEditControl(void) { + editControl.colorPicker.show = false; + HideTextEditControl(); +} + +void TextWindow::ShowEditControl(int col, const std::string &str, int halfRow) { + if(halfRow < 0) halfRow = top[hoveredRow]; + editControl.halfRow = halfRow; + editControl.col = col; + + int x = LEFT_MARGIN + CHAR_WIDTH*col; + int y = (halfRow - SS.TW.scrollPos)*(LINE_HEIGHT/2); + + ShowTextEditControl(x, y + 18, str); +} + +void TextWindow::ShowEditControlWithColorPicker(int col, RgbaColor rgb) +{ + SS.ScheduleShowTW(); + + editControl.colorPicker.show = true; + editControl.colorPicker.rgb = rgb; + editControl.colorPicker.h = 0; + editControl.colorPicker.s = 0; + editControl.colorPicker.v = 1; + ShowEditControl(col, ssprintf("%.2f, %.2f, %.2f", rgb.redF(), rgb.greenF(), rgb.blueF())); +} + +void TextWindow::ClearScreen(void) { + int i, j; + for(i = 0; i < MAX_ROWS; i++) { + for(j = 0; j < MAX_COLS; j++) { + text[i][j] = ' '; + meta[i][j].fg = 'd'; + meta[i][j].bg = 'd'; + meta[i][j].link = NOT_A_LINK; + } + top[i] = i*2; + } + rows = 0; +} + +void TextWindow::Printf(bool halfLine, const char *fmt, ...) { + va_list vl; + va_start(vl, fmt); + + if(rows >= MAX_ROWS) return; + + int r, c; + r = rows; + top[r] = (r == 0) ? 0 : (top[r-1] + (halfLine ? 3 : 2)); + rows++; + + for(c = 0; c < MAX_COLS; c++) { + text[r][c] = ' '; + meta[r][c].link = NOT_A_LINK; + } + + char fg = 'd'; + char bg = 'd'; + RgbaColor bgRgb = RGBi(0, 0, 0); + int link = NOT_A_LINK; + uint32_t data = 0; + LinkFunction *f = NULL, *h = NULL; + + c = 0; + while(*fmt) { + char buf[1024]; + + if(*fmt == '%') { + fmt++; + if(*fmt == '\0') goto done; + strcpy(buf, ""); + switch(*fmt) { + case 'd': { + int v = va_arg(vl, int); + sprintf(buf, "%d", v); + break; + } + case 'x': { + unsigned int v = va_arg(vl, unsigned int); + sprintf(buf, "%08x", v); + break; + } + case '@': { + double v = va_arg(vl, double); + sprintf(buf, "%.2f", v); + break; + } + case '2': { + double v = va_arg(vl, double); + sprintf(buf, "%s%.2f", v < 0 ? "" : " ", v); + break; + } + case '3': { + double v = va_arg(vl, double); + sprintf(buf, "%s%.3f", v < 0 ? "" : " ", v); + break; + } + case '#': { + double v = va_arg(vl, double); + sprintf(buf, "%.3f", v); + break; + } + case 's': { + char *s = va_arg(vl, char *); + memcpy(buf, s, min(sizeof(buf), strlen(s)+1)); + break; + } + case 'c': { + // 'char' is promoted to 'int' when passed through '...' + int v = va_arg(vl, int); + if(v == 0) { + strcpy(buf, ""); + } else { + sprintf(buf, "%c", v); + } + break; + } + case 'E': + fg = 'd'; + // leave the background, though + link = NOT_A_LINK; + data = 0; + f = NULL; + h = NULL; + break; + + case 'F': + case 'B': { + char cc = fmt[1]; // color code + RgbaColor *rgbPtr = NULL; + switch(cc) { + case 0: goto done; // truncated directive + case 'p': cc = (char)va_arg(vl, int); break; + case 'z': rgbPtr = va_arg(vl, RgbaColor *); break; + } + if(*fmt == 'F') { + fg = cc; + } else { + bg = cc; + if(rgbPtr) bgRgb = *rgbPtr; + } + fmt++; + break; + } + case 'L': + if(fmt[1] == '\0') goto done; + fmt++; + if(*fmt == 'p') { + link = va_arg(vl, int); + } else { + link = *fmt; + } + break; + + case 'f': + f = va_arg(vl, LinkFunction *); + break; + + case 'h': + h = va_arg(vl, LinkFunction *); + break; + + case 'D': { + unsigned int v = va_arg(vl, unsigned int); + data = (uint32_t)v; + break; + } + case '%': + strcpy(buf, "%"); + break; + } + } else { + utf8_iterator it2(fmt), it1 = it2++; + strncpy(buf, fmt, it2 - it1); + buf[it2 - it1] = '\0'; + } + + for(utf8_iterator it(buf); *it; ++it) { + for(int i = 0; i < ssglBitmapCharWidth(*it); i++) { + if(c >= MAX_COLS) goto done; + text[r][c] = (i == 0) ? *it : ' '; + meta[r][c].fg = fg; + meta[r][c].bg = bg; + meta[r][c].bgRgb = bgRgb; + meta[r][c].link = link; + meta[r][c].data = data; + meta[r][c].f = f; + meta[r][c].h = h; + c++; + } + } + + fmt++; + } + while(c < MAX_COLS) { + meta[r][c].fg = fg; + meta[r][c].bg = bg; + meta[r][c].bgRgb = bgRgb; + c++; + } + +done: + va_end(vl); +} + +#define gs (SS.GW.gs) +void TextWindow::Show(void) { + if(!(SS.GW.pending.operation)) SS.GW.ClearPending(); + + SS.GW.GroupSelection(); + + // Make sure these tests agree with test used to draw indicator line on + // main list of groups screen. + if(SS.GW.pending.description) { + // A pending operation (that must be completed with the mouse in + // the graphics window) will preempt our usual display. + HideEditControl(); + ShowHeader(false); + Printf(false, ""); + Printf(false, "%s", SS.GW.pending.description); + Printf(true, "%Fl%f%Ll(cancel operation)%E", + &TextWindow::ScreenUnselectAll); + } else if((gs.n > 0 || gs.constraints > 0) && + shown.screen != SCREEN_PASTE_TRANSFORMED) + { + if(edit.meaning != EDIT_TTF_TEXT) HideEditControl(); + ShowHeader(false); + DescribeSelection(); + } else { + if(edit.meaning == EDIT_TTF_TEXT) HideEditControl(); + ShowHeader(true); + switch(shown.screen) { + default: + shown.screen = SCREEN_LIST_OF_GROUPS; + // fall through + case SCREEN_LIST_OF_GROUPS: ShowListOfGroups(); break; + case SCREEN_GROUP_INFO: ShowGroupInfo(); break; + case SCREEN_GROUP_SOLVE_INFO: ShowGroupSolveInfo(); break; + case SCREEN_CONFIGURATION: ShowConfiguration(); break; + case SCREEN_STEP_DIMENSION: ShowStepDimension(); break; + case SCREEN_LIST_OF_STYLES: ShowListOfStyles(); break; + case SCREEN_STYLE_INFO: ShowStyleInfo(); break; + case SCREEN_PASTE_TRANSFORMED: ShowPasteTransformed(); break; + case SCREEN_EDIT_VIEW: ShowEditView(); break; + case SCREEN_TANGENT_ARC: ShowTangentArc(); break; + } + } + Printf(false, ""); + + // Make sure there's room for the color picker + if(editControl.colorPicker.show) { + int pickerHeight = 25; + int halfRow = editControl.halfRow; + if(top[rows-1] - halfRow < pickerHeight && rows < MAX_ROWS) { + rows++; + top[rows-1] = halfRow + pickerHeight; + } + } + + InvalidateText(); +} + +void TextWindow::TimerCallback(void) +{ + tooltippedIcon = hoveredIcon; + InvalidateText(); +} + +void TextWindow::DrawOrHitTestIcons(int how, double mx, double my) +{ + int width, height; + GetTextWindowSize(&width, &height); + + int x = 20, y = 33 + LINE_HEIGHT; + y -= scrollPos*(LINE_HEIGHT/2); + + if(how == PAINT) { + double grey = 30.0/255; + double top = y - 28, bot = y + 4; + glColor4d(grey, grey, grey, 1.0); + ssglAxisAlignedQuad(0, width, top, bot); + } + + HideShowIcon *oldHovered = hoveredIcon; + if(how != PAINT) { + hoveredIcon = NULL; + } + + HideShowIcon *hsi; + for(hsi = &(hideShowIcons[0]); hsi->var; hsi++) { + if(hsi->var == &SPACER) { + // Draw a darker-grey spacer in between the groups of icons. + if(how == PAINT) { + int l = x, r = l + 4, + t = y, b = t - 24; + glColor4d(0.17, 0.17, 0.17, 1); + ssglAxisAlignedQuad(l, r, t, b); + } + x += 12; + continue; + } + + if(how == PAINT) { + glPushMatrix(); + glTranslated(x, y-24, 0); + // Only thing that matters about the color is the alpha, + // should be one for no transparency + glColor3d(0, 0, 0); + ssglDrawPixelsWithTexture(hsi->icon, 24, 24); + glPopMatrix(); + + if(hsi == hoveredIcon) { + glColor4d(1, 1, 0, 0.3); + ssglAxisAlignedQuad(x - 2, x + 26, y + 2, y - 26); + } + if(!*(hsi->var)) { + glColor4d(1, 0, 0, 0.6); + glLineWidth(2); + int s = 0, f = 24; + glBegin(GL_LINES); + glVertex2d(x+s, y-s); + glVertex2d(x+f, y-f); + glVertex2d(x+s, y-f); + glVertex2d(x+f, y-s); + glEnd(); + } + } else { + if(mx > x - 2 && mx < x + 26 && + my < y + 2 && my > y - 26) + { + // The mouse is hovered over this icon, so do the tooltip + // stuff. + if(hsi != tooltippedIcon) { + oldMousePos = Point2d::From(mx, my); + } + if(hsi != oldHovered || how == CLICK) { + SetTimerFor(1000); + } + hoveredIcon = hsi; + if(how == CLICK) { + SS.GW.ToggleBool(hsi->var); + } + } + } + + x += 32; + } + + if(how != PAINT && hoveredIcon != oldHovered) { + InvalidateText(); + } + + if(tooltippedIcon) { + if(how == PAINT) { + std::string str; + + if(tooltippedIcon->icon == Icon_faces) { + if(SS.GW.showFaces) { + str = "Don't make faces selectable with mouse"; + } else { + str = "Make faces selectable with mouse"; + } + } else { + str = ssprintf("%s %s", *(tooltippedIcon->var) ? "Hide" : "Show", + tooltippedIcon->tip); + } + + double ox = oldMousePos.x, oy = oldMousePos.y - LINE_HEIGHT; + ox += 3; + oy -= 3; + int tw = (str.length() + 1)*(CHAR_WIDTH - 1); + ox = min(ox, (double) (width - 25) - tw); + oy = max(oy, 5.0); + + ssglInitializeBitmapFont(); + glLineWidth(1); + glColor4d(1.0, 1.0, 0.6, 1.0); + ssglAxisAlignedQuad(ox, ox+tw, oy, oy+LINE_HEIGHT); + glColor4d(0.0, 0.0, 0.0, 1.0); + ssglAxisAlignedLineLoop(ox, ox+tw, oy, oy+LINE_HEIGHT); + + glColor4d(0, 0, 0, 1); + ssglBitmapText(str, Vector::From(ox+5, oy-3+LINE_HEIGHT, 0)); + } else { + if(!hoveredIcon || + (hoveredIcon != tooltippedIcon)) + { + tooltippedIcon = NULL; + InvalidateGraphics(); + } + // And if we're hovered, then we've set a timer that will cause + // us to show the tool tip later. + } + } +} + +//---------------------------------------------------------------------------- +// Given (x, y, z) = (h, s, v) in [0,6), [0,1], [0,1], return (x, y, z) = +// (r, g, b) all in [0, 1]. +//---------------------------------------------------------------------------- +Vector TextWindow::HsvToRgb(Vector hsv) { + if(hsv.x >= 6) hsv.x -= 6; + + Vector rgb; + double hmod2 = hsv.x; + while(hmod2 >= 2) hmod2 -= 2; + double x = (1 - fabs(hmod2 - 1)); + if(hsv.x < 1) { + rgb = Vector::From(1, x, 0); + } else if(hsv.x < 2) { + rgb = Vector::From(x, 1, 0); + } else if(hsv.x < 3) { + rgb = Vector::From(0, 1, x); + } else if(hsv.x < 4) { + rgb = Vector::From(0, x, 1); + } else if(hsv.x < 5) { + rgb = Vector::From(x, 0, 1); + } else { + rgb = Vector::From(1, 0, x); + } + double c = hsv.y*hsv.z; + double m = 1 - hsv.z; + rgb = rgb.ScaledBy(c); + rgb = rgb.Plus(Vector::From(m, m, m)); + + return rgb; +} + +uint8_t *TextWindow::HsvPattern2d(void) { + static uint8_t Texture[256*256*3]; + static bool Init; + + if(!Init) { + int i, j, p; + p = 0; + for(i = 0; i < 256; i++) { + for(j = 0; j < 256; j++) { + Vector hsv = Vector::From(6.0*i/255.0, 1.0*j/255.0, 1); + Vector rgb = HsvToRgb(hsv); + rgb = rgb.ScaledBy(255); + Texture[p++] = (uint8_t)rgb.x; + Texture[p++] = (uint8_t)rgb.y; + Texture[p++] = (uint8_t)rgb.z; + } + } + Init = true; + } + return Texture; +} + +uint8_t *TextWindow::HsvPattern1d(double h, double s) { + static uint8_t Texture[256*4]; + + int i, p; + p = 0; + for(i = 0; i < 256; i++) { + Vector hsv = Vector::From(6*h, s, 1.0*(255 - i)/255.0); + Vector rgb = HsvToRgb(hsv); + rgb = rgb.ScaledBy(255); + Texture[p++] = (uint8_t)rgb.x; + Texture[p++] = (uint8_t)rgb.y; + Texture[p++] = (uint8_t)rgb.z; + // Needs a padding byte, to make things four-aligned + p++; + } + return Texture; +} + +void TextWindow::ColorPickerDone(void) { + RgbaColor rgb = editControl.colorPicker.rgb; + EditControlDone(ssprintf("%.2f, %.2f, %.3f", rgb.redF(), rgb.greenF(), rgb.blueF()).c_str()); +} + +bool TextWindow::DrawOrHitTestColorPicker(int how, bool leftDown, + double x, double y) +{ + bool mousePointerAsHand = false; + + if(how == HOVER && !leftDown) { + editControl.colorPicker.picker1dActive = false; + editControl.colorPicker.picker2dActive = false; + } + + if(!editControl.colorPicker.show) return false; + if(how == CLICK || (how == HOVER && leftDown)) InvalidateText(); + + static const RgbaColor BaseColor[12] = { + RGBi(255, 0, 0), + RGBi( 0, 255, 0), + RGBi( 0, 0, 255), + + RGBi( 0, 255, 255), + RGBi(255, 0, 255), + RGBi(255, 255, 0), + + RGBi(255, 127, 0), + RGBi(255, 0, 127), + RGBi( 0, 255, 127), + RGBi(127, 255, 0), + RGBi(127, 0, 255), + RGBi( 0, 127, 255), + }; + + int width, height; + GetTextWindowSize(&width, &height); + + int px = LEFT_MARGIN + CHAR_WIDTH*editControl.col; + int py = (editControl.halfRow - SS.TW.scrollPos)*(LINE_HEIGHT/2); + + py += LINE_HEIGHT + 5; + + static const int WIDTH = 16, HEIGHT = 12; + static const int PITCH = 18, SIZE = 15; + + px = min(px, width - (WIDTH*PITCH + 40)); + + int pxm = px + WIDTH*PITCH + 11, + pym = py + HEIGHT*PITCH + 7; + + int bw = 6; + if(how == PAINT) { + glColor4d(0.2, 0.2, 0.2, 1); + ssglAxisAlignedQuad(px, pxm+bw, py, pym+bw); + glColor4d(0.0, 0.0, 0.0, 1); + ssglAxisAlignedQuad(px+(bw/2), pxm+(bw/2), py+(bw/2), pym+(bw/2)); + } else { + if(x < px || x > pxm+(bw/2) || + y < py || y > pym+(bw/2)) + { + return false; + } + } + px += (bw/2); + py += (bw/2); + + int i, j; + for(i = 0; i < WIDTH/2; i++) { + for(j = 0; j < HEIGHT; j++) { + Vector rgb; + RgbaColor d; + if(i == 0 && j < 8) { + d = SS.modelColor[j]; + rgb = Vector::From(d.redF(), d.greenF(), d.blueF()); + } else if(i == 0) { + double a = (j - 8.0)/3.0; + rgb = Vector::From(a, a, a); + } else { + d = BaseColor[j]; + rgb = Vector::From(d.redF(), d.greenF(), d.blueF()); + if(i >= 2 && i <= 4) { + double a = (i == 2) ? 0.2 : (i == 3) ? 0.3 : 0.4; + rgb = rgb.Plus(Vector::From(a, a, a)); + } + if(i >= 5 && i <= 7) { + double a = (i == 5) ? 0.7 : (i == 6) ? 0.4 : 0.18; + rgb = rgb.ScaledBy(a); + } + } + + rgb = rgb.ClampWithin(0, 1); + int sx = px + 5 + PITCH*(i + 8) + 4, sy = py + 5 + PITCH*j; + + if(how == PAINT) { + glColor4d(CO(rgb), 1); + ssglAxisAlignedQuad(sx, sx+SIZE, sy, sy+SIZE); + } else if(how == CLICK) { + if(x >= sx && x <= sx+SIZE && y >= sy && y <= sy+SIZE) { + editControl.colorPicker.rgb = RGBf(rgb.x, rgb.y, rgb.z); + ColorPickerDone(); + } + } else if(how == HOVER) { + if(x >= sx && x <= sx+SIZE && y >= sy && y <= sy+SIZE) { + mousePointerAsHand = true; + } + } + } + } + + int hxm, hym; + int hx = px + 5, hy = py + 5; + hxm = hx + PITCH*7 + SIZE; + hym = hy + PITCH*2 + SIZE; + if(how == PAINT) { + ssglColorRGB(editControl.colorPicker.rgb); + ssglAxisAlignedQuad(hx, hxm, hy, hym); + } else if(how == CLICK) { + if(x >= hx && x <= hxm && y >= hy && y <= hym) { + ColorPickerDone(); + } + } else if(how == HOVER) { + if(x >= hx && x <= hxm && y >= hy && y <= hym) { + mousePointerAsHand = true; + } + } + + hy += PITCH*3; + + hxm = hx + PITCH*7 + SIZE; + hym = hy + PITCH*1 + SIZE; + // The one-dimensional thing to pick the color's value + if(how == PAINT) { + glBindTexture(GL_TEXTURE_2D, TEXTURE_COLOR_PICKER_1D); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP); + glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL); + + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 1, 256, 0, + GL_RGB, GL_UNSIGNED_BYTE, + HsvPattern1d(editControl.colorPicker.h, + editControl.colorPicker.s)); + + glEnable(GL_TEXTURE_2D); + glBegin(GL_QUADS); + glTexCoord2d(0, 0); + glVertex2d(hx, hy); + + glTexCoord2d(1, 0); + glVertex2d(hx, hym); + + glTexCoord2d(1, 1); + glVertex2d(hxm, hym); + + glTexCoord2d(0, 1); + glVertex2d(hxm, hy); + glEnd(); + glDisable(GL_TEXTURE_2D); + + double cx = hx+(hxm-hx)*(1 - editControl.colorPicker.v); + glColor4d(0, 0, 0, 1); + glLineWidth(1); + glBegin(GL_LINES); + glVertex2d(cx, hy); + glVertex2d(cx, hym); + glEnd(); + } else if(how == CLICK || + (how == HOVER && leftDown && editControl.colorPicker.picker1dActive)) + { + if(x >= hx && x <= hxm && y >= hy && y <= hym) { + editControl.colorPicker.v = 1 - (x - hx)/(hxm - hx); + + Vector rgb = HsvToRgb(Vector::From( + 6*editControl.colorPicker.h, + editControl.colorPicker.s, + editControl.colorPicker.v)); + editControl.colorPicker.rgb = RGBf(rgb.x, rgb.y, rgb.z); + + editControl.colorPicker.picker1dActive = true; + } + } + // and advance our vertical position + hy += PITCH*2; + + hxm = hx + PITCH*7 + SIZE; + hym = hy + PITCH*6 + SIZE; + // Two-dimensional thing to pick a color by hue and saturation + if(how == PAINT) { + glBindTexture(GL_TEXTURE_2D, TEXTURE_COLOR_PICKER_2D); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP); + glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL); + + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 256, 256, 0, + GL_RGB, GL_UNSIGNED_BYTE, HsvPattern2d()); + + glEnable(GL_TEXTURE_2D); + glBegin(GL_QUADS); + glTexCoord2d(0, 0); + glVertex2d(hx, hy); + + glTexCoord2d(1, 0); + glVertex2d(hx, hym); + + glTexCoord2d(1, 1); + glVertex2d(hxm, hym); + + glTexCoord2d(0, 1); + glVertex2d(hxm, hy); + glEnd(); + glDisable(GL_TEXTURE_2D); + + glColor4d(1, 1, 1, 1); + glLineWidth(1); + double cx = hx+(hxm-hx)*editControl.colorPicker.h, + cy = hy+(hym-hy)*editControl.colorPicker.s; + glBegin(GL_LINES); + glVertex2d(cx - 5, cy); + glVertex2d(cx + 4, cy); + glVertex2d(cx, cy - 5); + glVertex2d(cx, cy + 4); + glEnd(); + } else if(how == CLICK || + (how == HOVER && leftDown && editControl.colorPicker.picker2dActive)) + { + if(x >= hx && x <= hxm && y >= hy && y <= hym) { + double h = (x - hx)/(hxm - hx), + s = (y - hy)/(hym - hy); + editControl.colorPicker.h = h; + editControl.colorPicker.s = s; + + Vector rgb = HsvToRgb(Vector::From( + 6*editControl.colorPicker.h, + editControl.colorPicker.s, + editControl.colorPicker.v)); + editControl.colorPicker.rgb = RGBf(rgb.x, rgb.y, rgb.z); + + editControl.colorPicker.picker2dActive = true; + } + } + + SetMousePointerToHand(mousePointerAsHand); + return true; +} + +void TextWindow::Paint(void) { + int width, height; + GetTextWindowSize(&width, &height); + + // We would like things pixel-exact, to avoid shimmering. + glViewport(0, 0, width, height); + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); + glClearColor(0, 0, 0, 1); + glClear(GL_COLOR_BUFFER_BIT); + glColor3d(1, 1, 1); + + glTranslated(-1, 1, 0); + glScaled(2.0/width, -2.0/height, 1); + // Make things round consistently, avoiding exact integer boundary + glTranslated(-0.1, -0.1, 0); + + halfRows = height / (LINE_HEIGHT/2); + + int bottom = top[rows-1] + 2; + scrollPos = min(scrollPos, bottom - halfRows); + scrollPos = max(scrollPos, 0); + + // Let's set up the scroll bar first + MoveTextScrollbarTo(scrollPos, top[rows - 1] + 1, halfRows); + + // Create the bitmap font that we're going to use. + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + glEnable(GL_BLEND); + + // Now paint the window. + int r, c, a; + for(a = 0; a < 2; a++) { + if(a == 0) { + glBegin(GL_QUADS); + } else if(a == 1) { + glEnable(GL_TEXTURE_2D); + ssglInitializeBitmapFont(); + glBegin(GL_QUADS); + } + + for(r = 0; r < rows; r++) { + int ltop = top[r]; + if(ltop < (scrollPos-1)) continue; + if(ltop > scrollPos+halfRows) break; + + for(c = 0; c < min((width/CHAR_WIDTH)+1, (int) MAX_COLS); c++) { + int x = LEFT_MARGIN + c*CHAR_WIDTH; + int y = (ltop-scrollPos)*(LINE_HEIGHT/2) + 4; + + int fg = meta[r][c].fg; + int bg = meta[r][c].bg; + RgbaColor bgRgb = meta[r][c].bgRgb; + + // On the first pass, all the background quads; on the next + // pass, all the foreground (i.e., font) quads. + if(a == 0) { + int bh = LINE_HEIGHT, adj = -2; + if(bg == 'z') { + glColor3f(bgRgb.redF(), bgRgb.greenF(), bgRgb.blueF()); + bh = CHAR_HEIGHT; + adj += 2; + } else { + glColor3fv(&(bgColorTable[bg*3])); + } + + if(bg != 'd') { + // Move the quad down a bit, so that the descenders + // still have the correct background. + y += adj; + ssglAxisAlignedQuad(x, x + CHAR_WIDTH, y, y + bh, false); + y -= adj; + } + } else if(a == 1) { + glColor3fv(&(fgColorTable[fg*3])); + ssglBitmapCharQuad(text[r][c], x, y + CHAR_HEIGHT); + + // If this is a link and it's hovered, then draw the + // underline + if(meta[r][c].link && meta[r][c].link != 'n' && + (r == hoveredRow && c == hoveredCol)) + { + int cs = c, cf = c; + while(cs >= 0 && meta[r][cs].link && + meta[r][cs].f == meta[r][c].f && + meta[r][cs].data == meta[r][c].data) + { + cs--; + } + cs++; + + while( meta[r][cf].link && + meta[r][cf].f == meta[r][c].f && + meta[r][cf].data == meta[r][c].data) + { + cf++; + } + + // But don't underline checkboxes or radio buttons + while(((text[r][cs] >= 0xe000 && text[r][cs] <= 0xefff) || + text[r][cs] == ' ') && + cs < cf) + { + cs++; + } + + glEnd(); + + // Always use the color of the rightmost character + // in the link, so that underline is consistent color + fg = meta[r][cf-1].fg; + glColor3fv(&(fgColorTable[fg*3])); + glDisable(GL_TEXTURE_2D); + glLineWidth(1); + glBegin(GL_LINES); + int yp = y + CHAR_HEIGHT; + glVertex2d(LEFT_MARGIN + cs*CHAR_WIDTH, yp); + glVertex2d(LEFT_MARGIN + cf*CHAR_WIDTH, yp); + glEnd(); + + glEnable(GL_TEXTURE_2D); + glBegin(GL_QUADS); + } + } + } + } + + glEnd(); + glDisable(GL_TEXTURE_2D); + } + + // The line to indicate the column of radio buttons that indicates the + // active group. + SS.GW.GroupSelection(); + // Make sure this test agrees with test to determine which screen is drawn + if(!SS.GW.pending.description && gs.n == 0 && gs.constraints == 0 && + shown.screen == SCREEN_LIST_OF_GROUPS) + { + int x = 29, y = 70 + LINE_HEIGHT; + y -= scrollPos*(LINE_HEIGHT/2); + + glLineWidth(1); + glColor3fv(&(fgColorTable['t'*3])); + glBegin(GL_LINES); + glVertex2d(x, y); + glVertex2d(x, y+40); + glEnd(); + } + + // The header has some icons that are drawn separately from the text + DrawOrHitTestIcons(PAINT, 0, 0); + + // And we may show a color picker for certain editable fields + DrawOrHitTestColorPicker(PAINT, false, 0, 0); +} + +void TextWindow::MouseEvent(bool leftClick, bool leftDown, double x, double y) { + if(TextEditControlIsVisible() || GraphicsEditControlIsVisible()) { + if(DrawOrHitTestColorPicker(leftClick ? CLICK : HOVER, leftDown, x, y)) + { + return; + } + + if(leftClick) { + HideEditControl(); + HideGraphicsEditControl(); + } else { + SetMousePointerToHand(false); + } + return; + } + + DrawOrHitTestIcons(leftClick ? CLICK : HOVER, x, y); + + GraphicsWindow::Selection ps = SS.GW.hover; + SS.GW.hover.Clear(); + + int prevHoveredRow = hoveredRow, + prevHoveredCol = hoveredCol; + hoveredRow = 0; + hoveredCol = 0; + + // Find the corresponding character in the text buffer + int c = (int)((x - LEFT_MARGIN) / CHAR_WIDTH); + int hh = (LINE_HEIGHT)/2; + y += scrollPos*hh; + int r; + for(r = 0; r < rows; r++) { + if(y >= top[r]*hh && y <= (top[r]+2)*hh) { + break; + } + } + if(r < 0 || c < 0 || r >= rows || c >= MAX_COLS) { + SetMousePointerToHand(false); + goto done; + } + + hoveredRow = r; + hoveredCol = c; + +#define META (meta[r][c]) + if(leftClick) { + if(META.link && META.f) { + (META.f)(META.link, META.data); + Show(); + InvalidateGraphics(); + } + } else { + if(META.link) { + SetMousePointerToHand(true); + if(META.h) { + (META.h)(META.link, META.data); + } + } else { + SetMousePointerToHand(false); + } + } +#undef META + +done: + if((!ps.Equals(&(SS.GW.hover))) || + prevHoveredRow != hoveredRow || + prevHoveredCol != hoveredCol) + { + InvalidateGraphics(); + InvalidateText(); + } +} + +void TextWindow::MouseLeave(void) { + tooltippedIcon = NULL; + hoveredIcon = NULL; + hoveredRow = 0; + hoveredCol = 0; + InvalidateText(); +} + +void TextWindow::ScrollbarEvent(int newPos) { + if(TextEditControlIsVisible()) + return; + + int bottom = top[rows-1] + 2; + newPos = min(newPos, bottom - halfRows); + newPos = max(newPos, 0); + + if(newPos != scrollPos) { + scrollPos = newPos; + MoveTextScrollbarTo(scrollPos, top[rows - 1] + 1, halfRows); + InvalidateText(); + } +} + diff --git a/src/toolbar.cpp b/src/toolbar.cpp new file mode 100644 index 0000000..77f795f --- /dev/null +++ b/src/toolbar.cpp @@ -0,0 +1,248 @@ +//----------------------------------------------------------------------------- +// The toolbar that appears at the top left of the graphics window, where the +// user can select icons with the mouse, to perform operations equivalent to +// selecting a menu item or using a keyboard shortcut. +// +// Copyright 2008-2013 Jonathan Westhues. +//----------------------------------------------------------------------------- +#include "solvespace.h" +#include "generated/icons.h" + +static uint8_t SPACER[1]; +static const struct { + uint8_t *image; + int menu; + const char *tip; +} Toolbar[] = { + { Icon_line, GraphicsWindow::MNU_LINE_SEGMENT, "Sketch line segment" }, + { Icon_rectangle, GraphicsWindow::MNU_RECTANGLE, "Sketch rectangle" }, + { Icon_circle, GraphicsWindow::MNU_CIRCLE, "Sketch circle" }, + { Icon_arc, GraphicsWindow::MNU_ARC, "Sketch arc of a circle" }, + { Icon_text, GraphicsWindow::MNU_TTF_TEXT, "Sketch curves from text in a TrueType font" }, + { Icon_tangent_arc, GraphicsWindow::MNU_TANGENT_ARC, "Create tangent arc at selected point" }, + { Icon_bezier, GraphicsWindow::MNU_CUBIC, "Sketch cubic Bezier spline" }, + { Icon_point, GraphicsWindow::MNU_DATUM_POINT, "Sketch datum point" }, + { Icon_construction, GraphicsWindow::MNU_CONSTRUCTION, "Toggle construction" }, + { Icon_trim, GraphicsWindow::MNU_SPLIT_CURVES, "Split lines / curves where they intersect" }, + { SPACER, 0, 0 }, + + { Icon_length, GraphicsWindow::MNU_DISTANCE_DIA, "Constrain distance / diameter / length" }, + { Icon_angle, GraphicsWindow::MNU_ANGLE, "Constrain angle" }, + { Icon_horiz, GraphicsWindow::MNU_HORIZONTAL, "Constrain to be horizontal" }, + { Icon_vert, GraphicsWindow::MNU_VERTICAL, "Constrain to be vertical" }, + { Icon_parallel, GraphicsWindow::MNU_PARALLEL, "Constrain to be parallel or tangent" }, + { Icon_perpendicular, GraphicsWindow::MNU_PERPENDICULAR, "Constrain to be perpendicular" }, + { Icon_pointonx, GraphicsWindow::MNU_ON_ENTITY, "Constrain point on line / curve / plane / point" }, + { Icon_symmetric, GraphicsWindow::MNU_SYMMETRIC, "Constrain symmetric" }, + { Icon_equal, GraphicsWindow::MNU_EQUAL, "Constrain equal length / radius / angle" }, + { Icon_same_orientation,GraphicsWindow::MNU_ORIENTED_SAME, "Constrain normals in same orientation" }, + { Icon_other_supp, GraphicsWindow::MNU_OTHER_ANGLE, "Other supplementary angle" }, + { Icon_ref, GraphicsWindow::MNU_REFERENCE, "Toggle reference dimension" }, + { SPACER, 0, 0 }, + + { Icon_extrude, GraphicsWindow::MNU_GROUP_EXTRUDE, "New group extruding active sketch" }, + { Icon_lathe, GraphicsWindow::MNU_GROUP_LATHE, "New group rotating active sketch" }, + { Icon_step_rotate, GraphicsWindow::MNU_GROUP_ROT, "New group step and repeat rotating" }, + { Icon_step_translate, GraphicsWindow::MNU_GROUP_TRANS, "New group step and repeat translating" }, + { Icon_sketch_in_plane, GraphicsWindow::MNU_GROUP_WRKPL, "New group in new workplane (thru given entities)" }, + { Icon_sketch_in_3d, GraphicsWindow::MNU_GROUP_3D, "New group in 3d" }, + { Icon_assemble, GraphicsWindow::MNU_GROUP_LINK, "New group linking / assembling file" }, + { SPACER, 0, 0 }, + + { Icon_in3d, GraphicsWindow::MNU_NEAREST_ISO, "Nearest isometric view" }, + { Icon_ontoworkplane, GraphicsWindow::MNU_ONTO_WORKPLANE, "Align view to active workplane" }, + { NULL, 0, 0 } +}; + +void GraphicsWindow::ToolbarDraw(void) { + ToolbarDrawOrHitTest(0, 0, true, NULL); +} + +bool GraphicsWindow::ToolbarMouseMoved(int x, int y) { + x += ((int)width/2); + y += ((int)height/2); + + int nh = 0; + bool withinToolbar = ToolbarDrawOrHitTest(x, y, false, &nh); + if(!withinToolbar) nh = 0; + + if(nh != toolbarTooltipped) { + // Don't let the tool tip move around if the mouse moves within the + // same item. + toolbarMouseX = x; + toolbarMouseY = y; + toolbarTooltipped = 0; + } + + if(nh != toolbarHovered) { + toolbarHovered = nh; + SetTimerFor(1000); + PaintGraphics(); + } + // So if we moved off the toolbar, then toolbarHovered is now equal to + // zero, so it doesn't matter if the tool tip timer expires. And if + // we moved from one item to another, we reset the timer, so also okay. + return withinToolbar; +} + +bool GraphicsWindow::ToolbarMouseDown(int x, int y) { + x += ((int)width/2); + y += ((int)height/2); + + int nh = -1; + bool withinToolbar = ToolbarDrawOrHitTest(x, y, false, &nh); + // They might have clicked within the toolbar, but not on a button. + if(withinToolbar && nh >= 0) { + for(int i = 0; SS.GW.menu[i].level >= 0; i++) { + if(nh == SS.GW.menu[i].id) { + (SS.GW.menu[i].fn)((GraphicsWindow::MenuId)SS.GW.menu[i].id); + break; + } + } + } + return withinToolbar; +} + +bool GraphicsWindow::ToolbarDrawOrHitTest(int mx, int my, + bool paint, int *menuHit) +{ + int i; + int x = 17, y = (int)(height - 52); + + int fudge = 8; + int h = 32*16 + 3*16 + fudge; + int aleft = 0, aright = 66, atop = y+16+fudge/2, abot = y+16-h; + + bool withinToolbar = + (mx >= aleft && mx <= aright && my <= atop && my >= abot); + + if(!paint && !withinToolbar) { + // This gets called every MouseMove event, so return quickly. + return false; + } + + if(paint) { + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + glTranslated(-1, -1, 0); + glScaled(2.0/width, 2.0/height, 0); + glDisable(GL_LIGHTING); + + double c = 30.0/255; + glColor4d(c, c, c, 1.0); + ssglAxisAlignedQuad(aleft, aright, atop, abot); + } + + struct { + bool show; + const char *str; + } toolTip = { false, NULL }; + + bool leftpos = true; + for(i = 0; Toolbar[i].image; i++) { + if(Toolbar[i].image == SPACER) { + if(!leftpos) { + leftpos = true; + y -= 32; + x -= 32; + } + y -= 16; + + if(paint) { + // Draw a separator bar in a slightly different color. + int divw = 30, divh = 2; + glColor4d(0.17, 0.17, 0.17, 1); + x += 16; + y += 24; + ssglAxisAlignedQuad(x+divw, x-divw, y+divh, y-divh); + x -= 16; + y -= 24; + } + + continue; + } + + if(paint) { + glRasterPos2i(x - 12, y - 12); + glDrawPixels(24, 24, GL_RGB, GL_UNSIGNED_BYTE, Toolbar[i].image); + + if(toolbarHovered == Toolbar[i].menu || + pending.operation == Toolbar[i].menu) { + // Highlight the hovered or pending item. + glColor4d(1, 1, 0, 0.3); + int boxhw = 15; + ssglAxisAlignedQuad(x+boxhw, x-boxhw, y+boxhw, y-boxhw); + } + + if(toolbarTooltipped == Toolbar[i].menu) { + // Display the tool tip for this item; postpone till later + // so that no one draws over us. Don't need position since + // that's just wherever the mouse is. + toolTip.show = true; + toolTip.str = Toolbar[i].tip; + } + } else { + int boxhw = 16; + if(mx < (x+boxhw) && mx > (x - boxhw) && + my < (y+boxhw) && my > (y - boxhw)) + { + if(menuHit) *menuHit = Toolbar[i].menu; + } + } + + if(leftpos) { + x += 32; + leftpos = false; + } else { + x -= 32; + y -= 32; + leftpos = true; + } + } + + if(paint) { + // Do this last so that nothing can draw over it. + if(toolTip.show) { + ssglInitializeBitmapFont(); + std::string str = toolTip.str; + + for(i = 0; SS.GW.menu[i].level >= 0; i++) { + if(toolbarTooltipped == SS.GW.menu[i].id) { + std::string accel = MakeAcceleratorLabel(SS.GW.menu[i].accel); + if(!accel.empty()) { + str += ssprintf(" (%s)", accel.c_str()); + } + break; + } + } + + int tw = str.length() * (SS.TW.CHAR_WIDTH - 1) + 10, + th = SS.TW.LINE_HEIGHT + 2; + + double ox = toolbarMouseX + 3, oy = toolbarMouseY + 3; + glLineWidth(1); + glColor4d(1.0, 1.0, 0.6, 1.0); + ssglAxisAlignedQuad(ox, ox+tw, oy, oy+th); + glColor4d(0.0, 0.0, 0.0, 1.0); + ssglAxisAlignedLineLoop(ox, ox+tw, oy, oy+th); + + glColor4d(0, 0, 0, 1); + glPushMatrix(); + glTranslated(ox+5, oy+3, 0); + glScaled(1, -1, 1); + ssglBitmapText(str, Vector::From(0, 0, 0)); + glPopMatrix(); + } + ssglDepthRangeLockToFront(false); + } + + return withinToolbar; +} + +void GraphicsWindow::TimerCallback(void) { + SS.GW.toolbarTooltipped = SS.GW.toolbarHovered; + PaintGraphics(); +} + diff --git a/src/ttf.cpp b/src/ttf.cpp new file mode 100644 index 0000000..79cbffd --- /dev/null +++ b/src/ttf.cpp @@ -0,0 +1,330 @@ +//----------------------------------------------------------------------------- +// Routines to read a TrueType font as vector outlines, and generate them +// as entities, since they're always representable as either lines or +// quadratic Bezier curves. +// +// Copyright 2016 whitequark, Peter Barfuss. +//----------------------------------------------------------------------------- +#include +#include FT_FREETYPE_H +#include FT_OUTLINE_H +#include FT_ADVANCES_H + +/* Yecch. Irritatingly, you need to do this nonsense to get the error string table, + since nobody thought to put this exact function into FreeType itsself. */ +#undef __FTERRORS_H__ +#define FT_ERRORDEF(e, v, s) { (e), (s) }, +#define FT_ERROR_START_LIST +#define FT_ERROR_END_LIST { 0, NULL } + +struct ft_error { + int err; + const char *str; +}; + +static const struct ft_error ft_errors[] = { +#include FT_ERRORS_H +}; + +extern "C" const char *ft_error_string(int err) { + const struct ft_error *e; + for(e = ft_errors; e->str; e++) + if(e->err == err) + return e->str; + return "Unknown error"; +} + +/* Okay, we're done with that. */ +#undef FT_ERRORDEF +#undef FT_ERROR_START_LIST +#undef FT_ERROR_END_LIST + +#include "solvespace.h" + +//----------------------------------------------------------------------------- +// Get the list of available font filenames, and load the name for each of +// them. Only that, though, not the glyphs too. +//----------------------------------------------------------------------------- +TtfFontList::TtfFontList() { + FT_Init_FreeType(&fontLibrary); +} + +TtfFontList::~TtfFontList() { + FT_Done_FreeType(fontLibrary); +} + +void TtfFontList::LoadAll() { + if(loaded) return; + + for(const std::string &font : GetFontFiles()) { + TtfFont tf = {}; + tf.fontFile = font; + if(tf.LoadFromFile(fontLibrary)) + l.Add(&tf); + } + + // Sort fonts according to their actual name, not filename. + std::sort(&l.elem[0], &l.elem[l.n], + [](const TtfFont &a, const TtfFont &b) { return a.name < b.name; }); + + // Filter out fonts with the same family and style name. This is not + // strictly necessarily the exact same font, but it will almost always be. + TtfFont *it = std::unique(&l.elem[0], &l.elem[l.n], + [](const TtfFont &a, const TtfFont &b) { return a.name == b.name; }); + l.RemoveLast(&l.elem[l.n] - it); + + // TODO: identify fonts by their name and not filename, which may change + // between OSes. + + loaded = true; +} + +void TtfFontList::PlotString(const std::string &font, const std::string &str, + SBezierList *sbl, Vector origin, Vector u, Vector v) +{ + LoadAll(); + + TtfFont *tf = std::find_if(&l.elem[0], &l.elem[l.n], + [&](const TtfFont &tf) { return tf.FontFileBaseName() == font; }); + + if(!str.empty() && tf != &l.elem[l.n]) { + if(tf->fontFace == NULL) { + tf->LoadFromFile(fontLibrary, /*nameOnly=*/false); + } + tf->PlotString(str, sbl, origin, u, v); + } else { + // No text or no font; so draw a big X for an error marker. + SBezier sb; + sb = SBezier::From(origin, origin.Plus(u).Plus(v)); + sbl->l.Add(&sb); + sb = SBezier::From(origin.Plus(v), origin.Plus(u)); + sbl->l.Add(&sb); + } +} + +//----------------------------------------------------------------------------- +// Return the basename of our font filename; that's how the requests and +// entities that reference us will store it. +//----------------------------------------------------------------------------- +std::string TtfFont::FontFileBaseName() const { + std::string baseName = fontFile; + size_t pos = baseName.rfind(PATH_SEP); + if(pos != std::string::npos) + return baseName.erase(0, pos + 1); + return ""; +} + +//----------------------------------------------------------------------------- +// Load a TrueType font into memory. We care about the curves that define +// the letter shapes, and about the mappings that determine which glyph goes +// with which character. +//----------------------------------------------------------------------------- +bool TtfFont::LoadFromFile(FT_Library fontLibrary, bool nameOnly) { + FT_Open_Args args = {}; + args.flags = FT_OPEN_PATHNAME; + args.pathname = &fontFile[0]; // FT_String is char* for historical reasons + + // We don't use ssfopen() here to let freetype do its own memory management. + // This is OK because on Linux/OS X we just delegate to fopen and on Windows + // we only look into C:\Windows\Fonts, which has a known short path. + if(int fterr = FT_Open_Face(fontLibrary, &args, 0, &fontFace)) { + dbp("freetype: loading font from file '%s' failed: %s", + fontFile.c_str(), ft_error_string(fterr)); + return false; + } + + if(int fterr = FT_Select_Charmap(fontFace, FT_ENCODING_UNICODE)) { + dbp("freetype: loading unicode CMap for file '%s' failed: %s", + fontFile.c_str(), ft_error_string(fterr)); + FT_Done_Face(fontFace); + fontFace = NULL; + return false; + } + + name = std::string(fontFace->family_name) + + " (" + std::string(fontFace->style_name) + ")"; + + if(nameOnly) { + FT_Done_Face(fontFace); + fontFace = NULL; + return true; + } + + // We always ask Freetype to give us a unit size character. + // It uses fixed point; put the unit size somewhere in the middle of the dynamic + // range of its 26.6 fixed point type, and adjust the factors so that the unit + // matches cap height. + FT_Size_RequestRec sizeRequest; + sizeRequest.type = FT_SIZE_REQUEST_TYPE_REAL_DIM; + sizeRequest.width = 1 << 16; + sizeRequest.height = 1 << 16; + sizeRequest.horiResolution = 128; + sizeRequest.vertResolution = 128; + if(int fterr = FT_Request_Size(fontFace, &sizeRequest)) { + dbp("freetype: cannot set character size: %s", + ft_error_string(fterr)); + FT_Done_Face(fontFace); + fontFace = NULL; + return false; + } + + char chr = 'A'; + uint32_t gid = FT_Get_Char_Index(fontFace, 'A'); + if (gid == 0) { + dbp("freetype: CID-to-GID mapping for CID 0x%04x failed: %s; using CID as GID", + chr, ft_error_string(gid)); + gid = chr; + } + + if(gid) { + if(int fterr = FT_Load_Glyph(fontFace, gid, FT_LOAD_NO_BITMAP | FT_LOAD_NO_HINTING)) { + dbp("freetype: cannot load glyph for GID 0x%04x: %s", + gid, ft_error_string(fterr)); + FT_Done_Face(fontFace); + fontFace = NULL; + return false; + } + + FT_BBox bbox; + FT_Outline_Get_CBox(&fontFace->glyph->outline, &bbox); + capHeight = (double)bbox.yMax; + } + + return true; +} + +typedef struct OutlineData { + Vector origin, u, v; // input parameters + SBezierList *beziers; // output bezier list + float factor; // ratio between freetype and solvespace coordinates + FT_Pos bx; // x offset of the current glyph + FT_Pos px, py; // current point +} OutlineData; + +static Vector Transform(OutlineData *data, FT_Pos x, FT_Pos y) { + Vector r = data->origin; + r = r.Plus(data->u.ScaledBy((float)(data->bx + x) * data->factor)); + r = r.Plus(data->v.ScaledBy((float)y * data->factor)); + return r; +} + +static int MoveTo(const FT_Vector *p, void *cc) +{ + OutlineData *data = (OutlineData *) cc; + data->px = p->x; + data->py = p->y; + return 0; +} + +static int LineTo(const FT_Vector *p, void *cc) +{ + OutlineData *data = (OutlineData *) cc; + SBezier sb = SBezier::From( + Transform(data, data->px, data->py), + Transform(data, p->x, p->y)); + data->beziers->l.Add(&sb); + data->px = p->x; + data->py = p->y; + return 0; +} + +static int ConicTo(const FT_Vector *c, const FT_Vector *p, void *cc) +{ + OutlineData *data = (OutlineData *) cc; + SBezier sb = SBezier::From( + Transform(data, data->px, data->py), + Transform(data, c->x, c->y), + Transform(data, p->x, p->y)); + data->beziers->l.Add(&sb); + data->px = p->x; + data->py = p->y; + return 0; +} + +static int CubicTo(const FT_Vector *c1, const FT_Vector *c2, const FT_Vector *p, void *cc) +{ + OutlineData *data = (OutlineData *) cc; + SBezier sb = SBezier::From( + Transform(data, data->px, data->py), + Transform(data, c1->x, c1->y), + Transform(data, c2->x, c2->y), + Transform(data, p->x, p->y)); + data->beziers->l.Add(&sb); + data->px = p->x; + data->py = p->y; + return 0; +} + +void TtfFont::PlotString(const std::string &str, + SBezierList *sbl, Vector origin, Vector u, Vector v) +{ + if(fontFace == NULL) oops(); + + FT_Outline_Funcs outlineFuncs; + outlineFuncs.move_to = MoveTo; + outlineFuncs.line_to = LineTo; + outlineFuncs.conic_to = ConicTo; + outlineFuncs.cubic_to = CubicTo; + outlineFuncs.shift = 0; + outlineFuncs.delta = 0; + + FT_Pos dx = 0; + for(char32_t cid : ReadUTF8(str)) { + uint32_t gid = FT_Get_Char_Index(fontFace, cid); + if (gid == 0) { + dbp("freetype: CID-to-GID mapping for CID 0x%04x failed: %s; using CID as GID", + cid, ft_error_string(gid)); + gid = cid; + } + + /* + * Stupid hacks: + * - if we want fake-bold, use FT_Outline_Embolden(). This actually looks + * quite good. + * - if we want fake-italic, apply a shear transform [1 s s 1 0 0] here using + * FT_Set_Transform. This looks decent at small font sizes and bad at larger + * ones, antialiasing mitigates this considerably though. + */ + if(int fterr = FT_Load_Glyph(fontFace, gid, FT_LOAD_NO_BITMAP | FT_LOAD_NO_HINTING)) { + dbp("freetype: cannot load glyph for GID 0x%04x: %s", + gid, ft_error_string(fterr)); + return; + } + + /* A point that has x = xMin should be plotted at (dx0 + lsb); fix up + * our x-position so that the curve-generating code will put stuff + * at the right place. + * + * There's no point in getting the glyph BBox here - not only can it be + * needlessly slow sometimes, but because we're about to render a single glyph, + * what we want actually *is* the CBox. + * + * This is notwithstanding that this makes extremely little sense, this + * looks like a workaround for either mishandling the start glyph on a line, + * or as a really hacky pseudo-track-kerning (in which case it works better than + * one would expect! especially since most fonts don't set track kerning). + */ + FT_BBox cbox; + FT_Outline_Get_CBox(&fontFace->glyph->outline, &cbox); + FT_Pos bx = dx - cbox.xMin; + // Yes, this is what FreeType calls left-side bearing. + // Then interchangeably uses that with "left-side bearing". Sigh. + bx += fontFace->glyph->metrics.horiBearingX; + + OutlineData data = {}; + data.origin = origin; + data.u = u; + data.v = v; + data.beziers = sbl; + data.factor = 1.0 / capHeight; + data.bx = bx; + if(int fterr = FT_Outline_Decompose(&fontFace->glyph->outline, &outlineFuncs, &data)) { + dbp("freetype: bezier decomposition failed (gid %d): %s", + gid, ft_error_string(fterr)); + } + + // And we're done, so advance our position by the requested advance + // width, plus the user-requested extra advance. + dx += fontFace->glyph->advance.x; + } +} diff --git a/src/ttf.h b/src/ttf.h new file mode 100644 index 0000000..ec91127 --- /dev/null +++ b/src/ttf.h @@ -0,0 +1,41 @@ +//----------------------------------------------------------------------------- +// Routines to read a TrueType font as vector outlines, and generate them +// as entities, since they're always representable as either lines or +// quadratic Bezier curves. +// +// Copyright 2016 whitequark, Peter Barfuss. +//----------------------------------------------------------------------------- + +#ifndef __TTF_H +#define __TTF_H + +class TtfFont { +public: + std::string fontFile; + std::string name; + FT_FaceRec_ *fontFace; + double capHeight; + + std::string FontFileBaseName() const; + bool LoadFromFile(FT_LibraryRec_ *fontLibrary, bool nameOnly = true); + + void PlotString(const std::string &str, + SBezierList *sbl, Vector origin, Vector u, Vector v); +}; + +class TtfFontList { +public: + FT_LibraryRec_ *fontLibrary; + bool loaded; + List l; + + TtfFontList(); + ~TtfFontList(); + + void LoadAll(); + + void PlotString(const std::string &font, const std::string &str, + SBezierList *sbl, Vector origin, Vector u, Vector v); +}; + +#endif diff --git a/src/ui.h b/src/ui.h new file mode 100644 index 0000000..a041ed3 --- /dev/null +++ b/src/ui.h @@ -0,0 +1,748 @@ +//----------------------------------------------------------------------------- +// Declarations relating to our user interface, in both the graphics and +// text browser window. +// +// Copyright 2008-2013 Jonathan Westhues. +//----------------------------------------------------------------------------- + +#ifndef __UI_H +#define __UI_H + +class TextWindow { +public: + enum { + MAX_COLS = 100, + MIN_COLS = 45, + MAX_ROWS = 2000 + }; + + typedef struct { + char c; + RgbaColor color; + } Color; + static const Color fgColors[]; + static const Color bgColors[]; + + float bgColorTable[256*3]; + float fgColorTable[256*3]; + + enum { + CHAR_WIDTH = 9, + CHAR_HEIGHT = 16, + LINE_HEIGHT = 20, + LEFT_MARGIN = 6, + }; + +#define CHECK_FALSE "\xEE\x80\x80" // U+E000 +#define CHECK_TRUE "\xEE\x80\x81" +#define RADIO_FALSE "\xEE\x80\x82" +#define RADIO_TRUE "\xEE\x80\x83" + + int scrollPos; // The scrollbar position, in half-row units + int halfRows; // The height of our window, in half-row units + + uint32_t text[MAX_ROWS][MAX_COLS]; + typedef void LinkFunction(int link, uint32_t v); + enum { NOT_A_LINK = 0 }; + struct { + char fg; + char bg; + RgbaColor bgRgb; + int link; + uint32_t data; + LinkFunction *f; + LinkFunction *h; + } meta[MAX_ROWS][MAX_COLS]; + int hoveredRow, hoveredCol; + + + int top[MAX_ROWS]; // in half-line units, or -1 for unused + int rows; + + // The row of icons at the top of the text window, to hide/show things + typedef struct { + bool *var; + uint8_t *icon; + const char *tip; + } HideShowIcon; + static HideShowIcon hideShowIcons[]; + static bool SPACER; + + // These are called by the platform-specific code. + void Paint(void); + void MouseEvent(bool isClick, bool leftDown, double x, double y); + void MouseScroll(double x, double y, int delta); + void MouseLeave(void); + void ScrollbarEvent(int newPos); + + enum { + PAINT = 0, + HOVER = 1, + CLICK = 2 + }; + void DrawOrHitTestIcons(int how, double mx, double my); + void TimerCallback(void); + Point2d oldMousePos; + HideShowIcon *hoveredIcon, *tooltippedIcon; + + Vector HsvToRgb(Vector hsv); + uint8_t *HsvPattern2d(void); + uint8_t *HsvPattern1d(double h, double s); + void ColorPickerDone(void); + bool DrawOrHitTestColorPicker(int how, bool leftDown, double x, double y); + + void Init(void); + void MakeColorTable(const Color *in, float *out); + void Printf(bool half, const char *fmt, ...); + void ClearScreen(void); + + void Show(void); + + // State for the screen that we are showing in the text window. + enum { + SCREEN_LIST_OF_GROUPS = 0, + SCREEN_GROUP_INFO = 1, + SCREEN_GROUP_SOLVE_INFO = 2, + SCREEN_CONFIGURATION = 3, + SCREEN_STEP_DIMENSION = 4, + SCREEN_LIST_OF_STYLES = 5, + SCREEN_STYLE_INFO = 6, + SCREEN_PASTE_TRANSFORMED = 7, + SCREEN_EDIT_VIEW = 8, + SCREEN_TANGENT_ARC = 9 + }; + typedef struct { + int screen; + + hGroup group; + hStyle style; + + hConstraint constraint; + bool dimIsDistance; + double dimFinish; + int dimSteps; + + struct { + int times; + Vector trans; + double theta; + Vector origin; + double scale; + } paste; + } ShownState; + ShownState shown; + + enum { + EDIT_NOTHING = 0, + // For multiple groups + EDIT_TIMES_REPEATED = 1, + EDIT_GROUP_NAME = 2, + EDIT_GROUP_SCALE = 3, + EDIT_GROUP_COLOR = 4, + EDIT_GROUP_OPACITY = 5, + // For the configuraiton screen + EDIT_LIGHT_DIRECTION = 100, + EDIT_LIGHT_INTENSITY = 101, + EDIT_COLOR = 102, + EDIT_CHORD_TOLERANCE = 103, + EDIT_MAX_SEGMENTS = 104, + EDIT_CAMERA_TANGENT = 105, + EDIT_GRID_SPACING = 106, + EDIT_DIGITS_AFTER_DECIMAL = 107, + EDIT_EXPORT_SCALE = 108, + EDIT_EXPORT_OFFSET = 109, + EDIT_CANVAS_SIZE = 110, + EDIT_G_CODE_DEPTH = 120, + EDIT_G_CODE_PASSES = 121, + EDIT_G_CODE_FEED = 122, + EDIT_G_CODE_PLUNGE_FEED = 123, + EDIT_AUTOSAVE_INTERVAL = 124, + // For TTF text + EDIT_TTF_TEXT = 300, + // For the step dimension screen + EDIT_STEP_DIM_FINISH = 400, + EDIT_STEP_DIM_STEPS = 401, + // For the styles stuff + EDIT_STYLE_WIDTH = 500, + EDIT_STYLE_TEXT_HEIGHT = 501, + EDIT_STYLE_TEXT_ANGLE = 502, + EDIT_STYLE_COLOR = 503, + EDIT_STYLE_FILL_COLOR = 504, + EDIT_STYLE_NAME = 505, + EDIT_BACKGROUND_COLOR = 506, + EDIT_BACKGROUND_IMG_SCALE = 507, + EDIT_STYLE_STIPPLE_PERIOD = 508, + // For paste transforming + EDIT_PASTE_TIMES_REPEATED = 600, + EDIT_PASTE_ANGLE = 601, + EDIT_PASTE_SCALE = 602, + // For view + EDIT_VIEW_SCALE = 700, + EDIT_VIEW_ORIGIN = 701, + EDIT_VIEW_PROJ_RIGHT = 702, + EDIT_VIEW_PROJ_UP = 703, + // For tangent arc + EDIT_TANGENT_ARC_RADIUS = 800 + }; + struct { + bool showAgain; + int meaning; + int i; + hGroup group; + hRequest request; + hStyle style; + } edit; + + static void ReportHowGroupSolved(hGroup hg); + + struct { + int halfRow; + int col; + + struct { + RgbaColor rgb; + double h, s, v; + bool show; + bool picker1dActive; + bool picker2dActive; + } colorPicker; + } editControl; + + void HideEditControl(void); + void ShowEditControl(int col, const std::string &str, int halfRow = -1); + void ShowEditControlWithColorPicker(int col, RgbaColor rgb); + + void ClearSuper(void); + + void ShowHeader(bool withNav); + // These are self-contained screens, that show some information about + // the sketch. + void ShowListOfGroups(void); + void ShowGroupInfo(void); + void ShowGroupSolveInfo(void); + void ShowConfiguration(void); + void ShowListOfStyles(void); + void ShowStyleInfo(void); + void ShowStepDimension(void); + void ShowPasteTransformed(void); + void ShowEditView(void); + void ShowTangentArc(void); + // Special screen, based on selection + void DescribeSelection(void); + + void GoToScreen(int screen); + + // All of these are callbacks from the GUI code; first from when + // we're describing an entity + static void ScreenEditTtfText(int link, uint32_t v); + static void ScreenSetTtfFont(int link, uint32_t v); + static void ScreenUnselectAll(int link, uint32_t v); + + // when we're describing a constraint + static void ScreenConstraintShowAsRadius(int link, uint32_t v); + + // and the rest from the stuff in textscreens.cpp + static void ScreenSelectGroup(int link, uint32_t v); + static void ScreenActivateGroup(int link, uint32_t v); + static void ScreenToggleGroupShown(int link, uint32_t v); + static void ScreenHowGroupSolved(int link, uint32_t v); + static void ScreenShowGroupsSpecial(int link, uint32_t v); + static void ScreenDeleteGroup(int link, uint32_t v); + + static void ScreenHoverConstraint(int link, uint32_t v); + static void ScreenHoverRequest(int link, uint32_t v); + static void ScreenSelectRequest(int link, uint32_t v); + static void ScreenSelectConstraint(int link, uint32_t v); + + static void ScreenChangeGroupOption(int link, uint32_t v); + static void ScreenColor(int link, uint32_t v); + static void ScreenOpacity(int link, uint32_t v); + + static void ScreenShowListOfStyles(int link, uint32_t v); + static void ScreenShowStyleInfo(int link, uint32_t v); + static void ScreenDeleteStyle(int link, uint32_t v); + static void ScreenChangeStylePatternType(int link, uint32_t v); + static void ScreenChangeStyleYesNo(int link, uint32_t v); + static void ScreenCreateCustomStyle(int link, uint32_t v); + static void ScreenLoadFactoryDefaultStyles(int link, uint32_t v); + static void ScreenAssignSelectionToStyle(int link, uint32_t v); + static void ScreenBackgroundImage(int link, uint32_t v); + + static void ScreenShowConfiguration(int link, uint32_t v); + static void ScreenShowEditView(int link, uint32_t v); + static void ScreenGoToWebsite(int link, uint32_t v); + + static void ScreenChangeFixExportColors(int link, uint32_t v); + static void ScreenChangeBackFaces(int link, uint32_t v); + static void ScreenChangeCheckClosedContour(int link, uint32_t v); + static void ScreenChangePwlCurves(int link, uint32_t v); + static void ScreenChangeCanvasSizeAuto(int link, uint32_t v); + static void ScreenChangeCanvasSize(int link, uint32_t v); + static void ScreenChangeShadedTriangles(int link, uint32_t v); + + static void ScreenAllowRedundant(int link, uint32_t v); + + static void ScreenStepDimSteps(int link, uint32_t v); + static void ScreenStepDimFinish(int link, uint32_t v); + static void ScreenStepDimGo(int link, uint32_t v); + + static void ScreenChangeTangentArc(int link, uint32_t v); + + static void ScreenPasteTransformed(int link, uint32_t v); + + static void ScreenHome(int link, uint32_t v); + + // These ones do stuff with the edit control + static void ScreenChangeExprA(int link, uint32_t v); + static void ScreenChangeGroupName(int link, uint32_t v); + static void ScreenChangeGroupScale(int link, uint32_t v); + static void ScreenChangeLightDirection(int link, uint32_t v); + static void ScreenChangeLightIntensity(int link, uint32_t v); + static void ScreenChangeColor(int link, uint32_t v); + static void ScreenChangeChordTolerance(int link, uint32_t v); + static void ScreenChangeMaxSegments(int link, uint32_t v); + static void ScreenChangeExportChordTolerance(int link, uint32_t v); + static void ScreenChangeExportMaxSegments(int link, uint32_t v); + static void ScreenChangeCameraTangent(int link, uint32_t v); + static void ScreenChangeGridSpacing(int link, uint32_t v); + static void ScreenChangeDigitsAfterDecimal(int link, uint32_t v); + static void ScreenChangeExportScale(int link, uint32_t v); + static void ScreenChangeExportOffset(int link, uint32_t v); + static void ScreenChangeGCodeParameter(int link, uint32_t v); + static void ScreenChangeAutosaveInterval(int link, uint32_t v); + static void ScreenChangeStyleName(int link, uint32_t v); + static void ScreenChangeStyleMetric(int link, uint32_t v); + static void ScreenChangeStyleTextAngle(int link, uint32_t v); + static void ScreenChangeStyleColor(int link, uint32_t v); + static void ScreenChangeBackgroundColor(int link, uint32_t v); + static void ScreenChangeBackgroundImageScale(int link, uint32_t v); + static void ScreenChangePasteTransformed(int link, uint32_t v); + static void ScreenChangeViewScale(int link, uint32_t v); + static void ScreenChangeViewOrigin(int link, uint32_t v); + static void ScreenChangeViewProjection(int link, uint32_t v); + + bool EditControlDoneForStyles(const char *s); + bool EditControlDoneForConfiguration(const char *s); + bool EditControlDoneForPaste(const char *s); + bool EditControlDoneForView(const char *s); + void EditControlDone(const char *s); +}; + +#define SELECTION_RADIUS 10.0 + +class GraphicsWindow { +public: + void Init(void); + + // This table describes the top-level menus in the graphics winodw. + typedef enum { + // File + MNU_NEW = 100, + MNU_OPEN, + MNU_OPEN_RECENT, + MNU_SAVE, + MNU_SAVE_AS, + MNU_EXPORT_PNG, + MNU_EXPORT_MESH, + MNU_EXPORT_SURFACES, + MNU_EXPORT_VIEW, + MNU_EXPORT_SECTION, + MNU_EXPORT_WIREFRAME, + MNU_IMPORT, + MNU_EXIT, + // View + MNU_ZOOM_IN, + MNU_ZOOM_OUT, + MNU_ZOOM_TO_FIT, + MNU_SHOW_GRID, + MNU_PERSPECTIVE_PROJ, + MNU_ONTO_WORKPLANE, + MNU_NEAREST_ORTHO, + MNU_NEAREST_ISO, + MNU_CENTER_VIEW, + MNU_SHOW_MENU_BAR, + MNU_SHOW_TOOLBAR, + MNU_SHOW_TEXT_WND, + MNU_UNITS_INCHES, + MNU_UNITS_MM, + MNU_FULL_SCREEN, + // Edit + MNU_UNDO, + MNU_REDO, + MNU_CUT, + MNU_COPY, + MNU_PASTE, + MNU_PASTE_TRANSFORM, + MNU_DELETE, + MNU_SELECT_CHAIN, + MNU_SELECT_ALL, + MNU_SNAP_TO_GRID, + MNU_ROTATE_90, + MNU_UNSELECT_ALL, + MNU_REGEN_ALL, + // Request + MNU_SEL_WORKPLANE, + MNU_FREE_IN_3D, + MNU_DATUM_POINT, + MNU_WORKPLANE, + MNU_LINE_SEGMENT, + MNU_CONSTR_SEGMENT, + MNU_CIRCLE, + MNU_ARC, + MNU_RECTANGLE, + MNU_CUBIC, + MNU_TTF_TEXT, + MNU_SPLIT_CURVES, + MNU_TANGENT_ARC, + MNU_CONSTRUCTION, + // Group + MNU_GROUP_3D, + MNU_GROUP_WRKPL, + MNU_GROUP_EXTRUDE, + MNU_GROUP_LATHE, + MNU_GROUP_ROT, + MNU_GROUP_TRANS, + MNU_GROUP_LINK, + MNU_GROUP_RECENT, + // Constrain + MNU_DISTANCE_DIA, + MNU_REF_DISTANCE, + MNU_ANGLE, + MNU_REF_ANGLE, + MNU_OTHER_ANGLE, + MNU_REFERENCE, + MNU_EQUAL, + MNU_RATIO, + MNU_DIFFERENCE, + MNU_ON_ENTITY, + MNU_SYMMETRIC, + MNU_AT_MIDPOINT, + MNU_HORIZONTAL, + MNU_VERTICAL, + MNU_PARALLEL, + MNU_PERPENDICULAR, + MNU_ORIENTED_SAME, + MNU_WHERE_DRAGGED, + MNU_COMMENT, + // Analyze + MNU_VOLUME, + MNU_AREA, + MNU_INTERFERENCE, + MNU_NAKED_EDGES, + MNU_SHOW_DOF, + MNU_TRACE_PT, + MNU_STOP_TRACING, + MNU_STEP_DIM, + // Help, + MNU_WEBSITE, + MNU_ABOUT + } MenuId; + typedef void MenuHandler(int id); + enum { + ESCAPE_KEY = 27, + DELETE_KEY = 127, + FUNCTION_KEY_BASE = 0xf0 + }; + enum { + SHIFT_MASK = 0x100, + CTRL_MASK = 0x200 + }; + enum MenuItemKind { + MENU_ITEM_NORMAL = 0, + MENU_ITEM_CHECK, + MENU_ITEM_RADIO + }; + typedef struct { + int level; // 0 == on menu bar, 1 == one level down + const char *label; // or NULL for a separator + int id; // unique ID + int accel; // keyboard accelerator + MenuItemKind kind; + MenuHandler *fn; + } MenuEntry; + static const MenuEntry menu[]; + static void MenuView(int id); + static void MenuEdit(int id); + static void MenuRequest(int id); + void DeleteSelection(void); + void CopySelection(void); + void PasteClipboard(Vector trans, double theta, double scale); + static void MenuClipboard(int id); + + // The width and height (in pixels) of the window. + double width, height; + // These parameters define the map from 2d screen coordinates to the + // coordinates of the 3d sketch points. We will use an axonometric + // projection. + Vector offset; + Vector projRight; + Vector projUp; + double scale; + struct { + bool mouseDown; + Vector offset; + Vector projRight; + Vector projUp; + Point2d mouse; + Point2d mouseOnButtonDown; + Vector marqueePoint; + bool startedMoving; + } orig; + // We need to detect when the projection is changed to invalidate + // caches for drawn items. + struct { + Vector offset; + Vector projRight; + Vector projUp; + double scale; + } cached; + + // Most recent mouse position, updated every time the mouse moves. + Point2d currentMousePosition; + + // When the user is dragging a point, don't solve multiple times without + // allowing a paint in between. The extra solves are wasted if they're + // not displayed. + bool havePainted; + // Similarly, don't draw edges and outlines, since that's too slow + // for real-time dragging. + bool isDegraded; + + // Some state for the context menu. + struct { + bool active; + } context; + + void NormalizeProjectionVectors(void); + Point2d ProjectPoint(Vector p); + Vector ProjectPoint3(Vector p); + Vector ProjectPoint4(Vector p, double *w); + Vector UnProjectPoint(Point2d p); + Vector UnProjectPoint3(Vector p); + void AnimateOnto(Quaternion quatf, Vector offsetf); + void AnimateOntoWorkplane(void); + Vector VectorFromProjs(Vector rightUpForward); + void HandlePointForZoomToFit(Vector p, Point2d *pmax, Point2d *pmin, + double *wmin, bool usePerspective); + void LoopOverPoints(const std::vector &entity, const std::vector &faces, Point2d *pmax, Point2d *pmin, + double *wmin, bool usePerspective, bool includeMesh); + void ZoomToFit(bool includingInvisibles, bool useSelection = false); + + hGroup activeGroup; + void EnsureValidActives(void); + bool LockedInWorkplane(void); + void SetWorkplaneFreeIn3d(void); + hEntity ActiveWorkplane(void); + void ForceTextWindowShown(void); + + // Operations that must be completed by doing something with the mouse + // are noted here. These occupy the same space as the menu ids. + enum { + FIRST_PENDING = 0x0f000000, + DRAGGING_POINTS = 0x0f000000, + DRAGGING_NEW_POINT = 0x0f000001, + DRAGGING_NEW_LINE_POINT = 0x0f000002, + DRAGGING_NEW_CUBIC_POINT = 0x0f000003, + DRAGGING_NEW_ARC_POINT = 0x0f000004, + DRAGGING_CONSTRAINT = 0x0f000005, + DRAGGING_RADIUS = 0x0f000006, + DRAGGING_NORMAL = 0x0f000007, + DRAGGING_NEW_RADIUS = 0x0f000008, + DRAGGING_MARQUEE = 0x0f000009 + }; + + enum SuggestedConstraint { + SUGGESTED_NONE = 0, + SUGGESTED_HORIZONTAL = Constraint::HORIZONTAL, + SUGGESTED_VERTICAL = Constraint::VERTICAL, + }; + + struct { + int operation; + + hRequest request; + hEntity point; + List points; + hEntity circle; + hEntity normal; + hConstraint constraint; + + const char *description; + + SuggestedConstraint suggestion; + } pending; + void ClearPending(void); + // The constraint that is being edited with the on-screen textbox. + hConstraint constraintBeingEdited; + + SuggestedConstraint SuggestLineConstraint(hRequest lineSegment); + + Vector SnapToGrid(Vector p); + bool ConstrainPointByHovered(hEntity pt); + void DeleteTaggedRequests(void); + hRequest AddRequest(int type, bool rememberForUndo); + hRequest AddRequest(int type); + + class ParametricCurve { + public: + bool isLine; // else circle + Vector p0, p1; + Vector u, v; + double r, theta0, theta1, dtheta; + + void MakeFromEntity(hEntity he, bool reverse); + Vector PointAt(double t); + Vector TangentAt(double t); + double LengthForAuto(void); + + hRequest CreateRequestTrimmedTo(double t, bool extraConstraints, + hEntity orig, hEntity arc, bool arcFinish); + void ConstrainPointIfCoincident(hEntity hpt); + }; + void MakeTangentArc(void); + void SplitLinesOrCurves(void); + hEntity SplitEntity(hEntity he, Vector pinter); + hEntity SplitLine(hEntity he, Vector pinter); + hEntity SplitCircle(hEntity he, Vector pinter); + hEntity SplitCubic(hEntity he, Vector pinter); + void ReplacePointInConstraints(hEntity oldpt, hEntity newpt); + void RemoveConstraintsForPointBeingDeleted(hEntity hpt); + void FixConstraintsForRequestBeingDeleted(hRequest hr); + void FixConstraintsForPointBeingDeleted(hEntity hpt); + + // The current selection. + class Selection { + public: + int tag; + + hEntity entity; + hConstraint constraint; + bool emphasized; + + void Draw(void); + + void Clear(void); + bool IsEmpty(void); + bool Equals(Selection *b); + bool HasEndpoints(void); + }; + Selection hover; + bool hoverWasSelectedOnMousedown; + List selection; + void HitTestMakeSelection(Point2d mp); + void ClearSelection(void); + void ClearNonexistentSelectionItems(void); + struct { + std::vector point; + std::vector entity; + std::vector anyNormal; + std::vector vector; + std::vector face; + std::vector constraint; + int points; + int entities; + int workplanes; + int faces; + int lineSegments; + int circlesOrArcs; + int arcs; + int cubics; + int periodicCubics; + int anyNormals; + int vectors; + int constraints; + int stylables; + int constraintLabels; + int withEndpoints; + int n; + } gs; + void GroupSelection(void); + bool IsSelected(Selection *s); + bool IsSelected(hEntity he); + void MakeSelected(hEntity he); + void MakeSelected(hConstraint hc); + void MakeSelected(Selection *s); + void MakeUnselected(hEntity he, bool coincidentPointTrick); + void MakeUnselected(Selection *s, bool coincidentPointTrick); + void SelectByMarquee(void); + void ClearSuper(void); + + enum { + CMNU_UNSELECT_ALL = 0x100, + CMNU_UNSELECT_HOVERED = 0x101, + CMNU_CUT_SEL = 0x102, + CMNU_COPY_SEL = 0x103, + CMNU_PASTE = 0x104, + CMNU_PASTE_XFRM = 0x105, + CMNU_DELETE_SEL = 0x106, + CMNU_SELECT_CHAIN = 0x107, + CMNU_NEW_CUSTOM_STYLE = 0x110, + CMNU_NO_STYLE = 0x111, + CMNU_GROUP_INFO = 0x120, + CMNU_STYLE_INFO = 0x121, + CMNU_REFERENCE_DIM = 0x130, + CMNU_OTHER_ANGLE = 0x131, + CMNU_DEL_COINCIDENT = 0x132, + CMNU_SNAP_TO_GRID = 0x140, + CMNU_REMOVE_SPLINE_PT = 0x141, + CMNU_ADD_SPLINE_PT = 0x142, + CMNU_FIRST_STYLE = 0x40000000 + }; + void ContextMenuListStyles(void); + int64_t contextMenuCancelTime; + + // The toolbar, in toolbar.cpp + bool ToolbarDrawOrHitTest(int x, int y, bool paint, int *menuHit); + void ToolbarDraw(void); + bool ToolbarMouseMoved(int x, int y); + bool ToolbarMouseDown(int x, int y); + static void TimerCallback(void); + int toolbarHovered; + int toolbarTooltipped; + int toolbarMouseX, toolbarMouseY; + + // This sets what gets displayed. + bool showWorkplanes; + bool showNormals; + bool showPoints; + bool showConstraints; + bool showTextWindow; + bool showShaded; + bool showEdges; + bool showOutlines; + bool showFaces; + bool showMesh; + bool showHdnLines; + void ToggleBool(bool *v); + + bool showSnapGrid; + + void AddPointToDraggedList(hEntity hp); + void StartDraggingByEntity(hEntity he); + void StartDraggingBySelection(void); + void UpdateDraggedNum(Vector *pos, double mx, double my); + void UpdateDraggedPoint(hEntity hp, double mx, double my); + + // These are called by the platform-specific code. + void Paint(void); + void MouseMoved(double x, double y, bool leftDown, bool middleDown, + bool rightDown, bool shiftDown, bool ctrlDown); + void MouseLeftDown(double x, double y); + void MouseLeftUp(double x, double y); + void MouseLeftDoubleClick(double x, double y); + void MouseMiddleOrRightDown(double x, double y); + void MouseRightUp(double x, double y); + void MouseScroll(double x, double y, int delta); + void MouseLeave(void); + bool KeyDown(int c); + void EditControlDone(const char *s); + + int64_t lastSpaceNavigatorTime; + hGroup lastSpaceNavigatorGroup; + void SpaceNavigatorMoved(double tx, double ty, double tz, + double rx, double ry, double rz, bool shiftDown); + void SpaceNavigatorButtonUp(void); +}; + + +#endif diff --git a/src/undoredo.cpp b/src/undoredo.cpp new file mode 100644 index 0000000..04b96ee --- /dev/null +++ b/src/undoredo.cpp @@ -0,0 +1,170 @@ +//----------------------------------------------------------------------------- +// The user-visible undo/redo operation; whenever they change something, we +// record our state and push it on a stack, and we pop the stack when they +// select undo. +// +// Copyright 2008-2013 Jonathan Westhues. +//----------------------------------------------------------------------------- +#include "solvespace.h" + +void SolveSpaceUI::UndoRemember(void) { + unsaved = true; + PushFromCurrentOnto(&undo); + UndoClearStack(&redo); + UndoEnableMenus(); +} + +void SolveSpaceUI::UndoUndo(void) { + if(undo.cnt <= 0) return; + + PushFromCurrentOnto(&redo); + PopOntoCurrentFrom(&undo); + UndoEnableMenus(); +} + +void SolveSpaceUI::UndoRedo(void) { + if(redo.cnt <= 0) return; + + PushFromCurrentOnto(&undo); + PopOntoCurrentFrom(&redo); + UndoEnableMenus(); +} + +void SolveSpaceUI::UndoEnableMenus(void) { + EnableMenuById(GraphicsWindow::MNU_UNDO, undo.cnt > 0); + EnableMenuById(GraphicsWindow::MNU_REDO, redo.cnt > 0); +} + +void SolveSpaceUI::PushFromCurrentOnto(UndoStack *uk) { + int i; + + if(uk->cnt == MAX_UNDO) { + UndoClearState(&(uk->d[uk->write])); + // And then write in to this one again + } else { + (uk->cnt)++; + } + + UndoState *ut = &(uk->d[uk->write]); + *ut = {}; + for(i = 0; i < SK.group.n; i++) { + Group *src = &(SK.group.elem[i]); + Group dest = *src; + // And then clean up all the stuff that needs to be a deep copy, + // and zero out all the dynamic stuff that will get regenerated. + dest.clean = false; + dest.solved = {}; + dest.polyLoops = {}; + dest.bezierLoops = {}; + dest.bezierOpens = {}; + dest.polyError = {}; + dest.thisMesh = {}; + dest.runningMesh = {}; + dest.thisShell = {}; + dest.runningShell = {}; + dest.displayMesh = {}; + dest.displayEdges = {}; + dest.displayOutlines = {}; + + dest.remap = {}; + src->remap.DeepCopyInto(&(dest.remap)); + + dest.impMesh = {}; + dest.impShell = {}; + dest.impEntity = {}; + ut->group.Add(&dest); + } + for(i = 0; i < SK.groupOrder.n; i++) { + ut->groupOrder.Add(&(SK.groupOrder.elem[i])); + } + for(i = 0; i < SK.request.n; i++) { + ut->request.Add(&(SK.request.elem[i])); + } + for(i = 0; i < SK.constraint.n; i++) { + Constraint *src = &(SK.constraint.elem[i]); + Constraint dest = *src; + dest.dogd = {}; + ut->constraint.Add(&dest); + } + for(i = 0; i < SK.param.n; i++) { + ut->param.Add(&(SK.param.elem[i])); + } + for(i = 0; i < SK.style.n; i++) { + ut->style.Add(&(SK.style.elem[i])); + } + ut->activeGroup = SS.GW.activeGroup; + + uk->write = WRAP(uk->write + 1, MAX_UNDO); +} + +void SolveSpaceUI::PopOntoCurrentFrom(UndoStack *uk) { + int i; + + if(uk->cnt <= 0) oops(); + (uk->cnt)--; + uk->write = WRAP(uk->write - 1, MAX_UNDO); + + UndoState *ut = &(uk->d[uk->write]); + + // Free everything in the main copy of the program before replacing it + for(i = 0; i < SK.groupOrder.n; i++) { + Group *g = SK.GetGroup(SK.groupOrder.elem[i]); + g->Clear(); + } + SK.group.Clear(); + SK.groupOrder.Clear(); + SK.request.Clear(); + SK.constraint.Clear(); + SK.param.Clear(); + SK.style.Clear(); + + // And then do a shallow copy of the state from the undo list + ut->group.MoveSelfInto(&(SK.group)); + for(i = 0; i < ut->groupOrder.n; i++) + SK.groupOrder.Add(&ut->groupOrder.elem[i]); + ut->request.MoveSelfInto(&(SK.request)); + ut->constraint.MoveSelfInto(&(SK.constraint)); + ut->param.MoveSelfInto(&(SK.param)); + ut->style.MoveSelfInto(&(SK.style)); + SS.GW.activeGroup = ut->activeGroup; + + // No need to free it, since a shallow copy was made above + *ut = {}; + + // And reset the state everywhere else in the program, since the + // sketch just changed a lot. + SS.GW.ClearSuper(); + SS.TW.ClearSuper(); + SS.ReloadAllImported(); + SS.GenerateAll(SolveSpaceUI::GENERATE_ALL); + SS.ScheduleShowTW(); + + // Activate the group that was active before. + Group *activeGroup = SK.GetGroup(SS.GW.activeGroup); + activeGroup->Activate(); +} + +void SolveSpaceUI::UndoClearStack(UndoStack *uk) { + while(uk->cnt > 0) { + uk->write = WRAP(uk->write - 1, MAX_UNDO); + (uk->cnt)--; + UndoClearState(&(uk->d[uk->write])); + } + *uk = {}; // for good measure +} + +void SolveSpaceUI::UndoClearState(UndoState *ut) { + int i; + for(i = 0; i < ut->group.n; i++) { + Group *g = &(ut->group.elem[i]); + + g->remap.Clear(); + } + ut->group.Clear(); + ut->request.Clear(); + ut->constraint.Clear(); + ut->param.Clear(); + ut->style.Clear(); + *ut = {}; +} + diff --git a/src/unix/gloffscreen.cpp b/src/unix/gloffscreen.cpp new file mode 100644 index 0000000..be836e2 --- /dev/null +++ b/src/unix/gloffscreen.cpp @@ -0,0 +1,86 @@ +//----------------------------------------------------------------------------- +// Offscreen rendering in OpenGL using framebuffer objects. +// +// Copyright 2015 +//----------------------------------------------------------------------------- +#ifdef __APPLE__ +#include +#else +#include +#endif + +#include "gloffscreen.h" +#include "solvespace.h" + +GLOffscreen::GLOffscreen() : _pixels(NULL), _pixels_inv(NULL), _width(0), _height(0) { +#ifndef __APPLE__ + if(glewInit() != GLEW_OK) + oops(); +#endif + + if(!GL_EXT_framebuffer_object) + oops(); + + glGenFramebuffersEXT(1, &_framebuffer); + glGenRenderbuffersEXT(1, &_color_renderbuffer); + glGenRenderbuffersEXT(1, &_depth_renderbuffer); +} + +GLOffscreen::~GLOffscreen() { + delete[] _pixels; + delete[] _pixels_inv; + glDeleteRenderbuffersEXT(1, &_depth_renderbuffer); + glDeleteRenderbuffersEXT(1, &_color_renderbuffer); + glDeleteFramebuffersEXT(1, &_framebuffer); +} + +bool GLOffscreen::begin(int width, int height) { + if(_width != width || _height != height) { + delete[] _pixels; + delete[] _pixels_inv; + + _pixels = new uint32_t[width * height * 4]; + _pixels_inv = new uint32_t[width * height * 4]; + + _width = width; + _height = height; + } + + glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, _framebuffer); + + glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, _color_renderbuffer); + glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL_RGBA8, _width, _height); + glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, + GL_RENDERBUFFER_EXT, _color_renderbuffer); + + glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, _depth_renderbuffer); + glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL_DEPTH_COMPONENT24, _width, _height); + glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, + GL_RENDERBUFFER_EXT, _depth_renderbuffer); + + if(glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT) == GL_FRAMEBUFFER_COMPLETE_EXT) + return true; + + glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0); + return false; +} + +uint8_t *GLOffscreen::end(bool flip) { +#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ + glReadPixels(0, 0, _width, _height, + GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, _pixels_inv); +#else + glReadPixels(0, 0, _width, _height, + GL_BGRA, GL_UNSIGNED_INT_8_8_8_8, _pixels_inv); +#endif + + if(flip) { + /* in OpenGL coordinates, bottom is zero Y */ + for(int i = 0; i < _height; i++) + memcpy(&_pixels[_width * i], &_pixels_inv[_width * (_height - i - 1)], _width * 4); + } + + glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0); + + return (uint8_t*) (flip ? _pixels : _pixels_inv); +} diff --git a/src/unix/gloffscreen.h b/src/unix/gloffscreen.h new file mode 100644 index 0000000..c897be3 --- /dev/null +++ b/src/unix/gloffscreen.h @@ -0,0 +1,36 @@ +//----------------------------------------------------------------------------- +// Offscreen rendering in OpenGL using framebuffer objects. +// +// Copyright 2015 +//----------------------------------------------------------------------------- +#ifndef __GLOFFSCREEN_H +#define __GLOFFSCREEN_H + +#include + +class GLOffscreen { +public: + /* these allocate and deallocate OpenGL resources. + an OpenGL context /must/ be current. */ + GLOffscreen(); + ~GLOffscreen(); + + /* prepare for drawing a frame of specified size. + returns true if OpenGL likes our configuration, false + otherwise. if it returns false, the OpenGL state is restored. */ + bool begin(int width, int height); + + /* get pixels out of the frame and restore OpenGL state. + the pixel format is ARGB32 with top row at index 0 if + flip is true and bottom row at index 0 if flip is false. + the returned array is valid until the next call to begin() */ + uint8_t *end(bool flip = true); + +private: + unsigned int _framebuffer; + unsigned int _color_renderbuffer, _depth_renderbuffer; + uint32_t *_pixels, *_pixels_inv; + int _width, _height; +}; + +#endif diff --git a/src/unix/solvespace-16x16.png b/src/unix/solvespace-16x16.png new file mode 100644 index 0000000..2d2b23f Binary files /dev/null and b/src/unix/solvespace-16x16.png differ diff --git a/src/unix/solvespace-16x16.xpm b/src/unix/solvespace-16x16.xpm new file mode 100644 index 0000000..3cd0662 --- /dev/null +++ b/src/unix/solvespace-16x16.xpm @@ -0,0 +1,27 @@ +/* XPM */ +static char *solvespace_16x16[] = { +/* columns rows colors chars-per-pixel */ +"16 16 5 1 ", +" c black", +". c #1ED500", +"X c #DE00D6", +"o c #CBCBCB", +"O c None", +/* pixels */ +"OOO OOOOOOOOOOOO", +"OOO OOOOOOOOOOOO", +"OOO OOOOOOOOOOOO", +"OOO OOOOOXOOOOOO", +"OOO OOOOOXoOOOOO", +"OOO OOOOOXoOOOOO", +"OOO OOOOOXoOOOOO", +"OOO OOOOOXoOOOOO", +"OOO OOOOOXoOOOOO", +"OOO OOXXXXXXXOOO", +"OOO OOOoooooooOO", +"OO...OOOOOOOOOOO", +" ... ", +"OO...OOOOOOOOOOO", +"OOO OOOOOOOOOOOO", +"OOO OOOOOOOOOOOO" +}; diff --git a/src/unix/solvespace-24x24.png b/src/unix/solvespace-24x24.png new file mode 100644 index 0000000..7ba03ee Binary files /dev/null and b/src/unix/solvespace-24x24.png differ diff --git a/src/unix/solvespace-24x24.xpm b/src/unix/solvespace-24x24.xpm new file mode 100644 index 0000000..9d1c02e --- /dev/null +++ b/src/unix/solvespace-24x24.xpm @@ -0,0 +1,35 @@ +/* XPM */ +static char *solvespace_24x24[] = { +/* columns rows colors chars-per-pixel */ +"24 24 5 1 ", +" c black", +". c #1ED500", +"X c #DE00D6", +"o c #CBCBCB", +"O c None", +/* pixels */ +"OOOOOOOOOOOOOOOOOOOOOOOO", +"OOOOOOOOOOOOOOOOOOOOOOOO", +"OOOOOOOOOOOOOOOOOOOOOOOO", +"OOOOOOOOOOOOOOOOOOOOOOOO", +"OOOOOOO OOOOOOOOOOOOOOOO", +"OOOOOOO OOOOOOOOOOOOOOOO", +"OOOOOOO OOOOOOOOOOOOOOOO", +"OOOOOOO OOOOOXOOOOOOOOOO", +"OOOOOOO OOOOOXoOOOOOOOOO", +"OOOOOOO OOOOOXoOOOOOOOOO", +"OOOOOOO OOOOOXoOOOOOOOOO", +"OOOOOOO OOOOOXoOOOOOOOOO", +"OOOOOOO OOOOOXoOOOOOOOOO", +"OOOOOOO OOXXXXXXXOOOOOOO", +"OOOOOOO OOOoooooooOOOOOO", +"OOOOOO...OOOOOOOOOOOOOOO", +"OOOO ... OOOO", +"OOOOOO...OOOOOOOOOOOOOOO", +"OOOOOOO OOOOOOOOOOOOOOOO", +"OOOOOOO OOOOOOOOOOOOOOOO", +"OOOOOOOOOOOOOOOOOOOOOOOO", +"OOOOOOOOOOOOOOOOOOOOOOOO", +"OOOOOOOOOOOOOOOOOOOOOOOO", +"OOOOOOOOOOOOOOOOOOOOOOOO" +}; diff --git a/src/unix/solvespace-32x32.png b/src/unix/solvespace-32x32.png new file mode 100644 index 0000000..a24bf6a Binary files /dev/null and b/src/unix/solvespace-32x32.png differ diff --git a/src/unix/solvespace-32x32.xpm b/src/unix/solvespace-32x32.xpm new file mode 100644 index 0000000..0d7c598 --- /dev/null +++ b/src/unix/solvespace-32x32.xpm @@ -0,0 +1,43 @@ +/* XPM */ +static char *solvespace_32x32[] = { +/* columns rows colors chars-per-pixel */ +"32 32 5 1 ", +" c black", +". c #1ED500", +"X c #DE00D6", +"o c #CBCBCB", +"O c None", +/* pixels */ +"OOOOOO OOOOOOOOOOOOOOOOOOOOOOOO", +"OOOOOO OOOOOOOOOOOOOOOOOOOOOOOO", +"OOOOOO OOOOOOOOOOOOOOOOOOOOOOOO", +"OOOOOO OOOOOOOOOOOOOOOOOOOOOOOO", +"OOOOOO OOOOOOOOOOOOOOOOOOOOOOOO", +"OOOOOO OOOOOOOOOXXOOOOOOOOOOOOO", +"OOOOOO OOOOOOOOOXXoOOOOOOOOOOOO", +"OOOOOO OOOOOOOOOXXoOOOOOOOOOOOO", +"OOOOOO OOOOOOOOOXXoOOOOOOOOOOOO", +"OOOOOO OOOOOOOOOXXoOOOOOOOOOOOO", +"OOOOOO OOOOOOOOOXXoOOOOOOOOOOOO", +"OOOOOO OOOOOOOOOXXoOOOOOOOOOOOO", +"OOOOOO OOOOOOOOOXXoOOOOOOOOOOOO", +"OOOOOO OOOOOOOOOXXoOOOOOOOOOOOO", +"OOOOOO OOOOOOOOOXXoOOOOOOOOOOOO", +"OOOOOO OOOOOOOOOXXoOOOOOOOOOOOO", +"OOOOOO OOOOXXXXXXXXXXXXOOOOOOOO", +"OOOOOO OOOOXXXXXXXXXXXXOOOOOOOO", +"OOOOOO OOOOOooooooooooooOOOOOOO", +"OOOOOO OOOOOOOOOOOOOOOOOOOOOOOO", +"OOOOOO OOOOOOOOOOOOOOOOOOOOOOOO", +"OOOOOO OOOOOOOOOOOOOOOOOOOOOOOO", +"OOOO......OOOOOOOOOOOOOOOOOOOOOO", +"OOOO......OOOOOOOOOOOOOOOOOOOOOO", +" ...... ", +" ...... ", +"OOOO......OOOOOOOOOOOOOOOOOOOOOO", +"OOOO......OOOOOOOOOOOOOOOOOOOOOO", +"OOOOOO OOOOOOOOOOOOOOOOOOOOOOOO", +"OOOOOO OOOOOOOOOOOOOOOOOOOOOOOO", +"OOOOOO OOOOOOOOOOOOOOOOOOOOOOOO", +"OOOOOO OOOOOOOOOOOOOOOOOOOOOOOO" +}; diff --git a/src/unix/solvespace-48x48.png b/src/unix/solvespace-48x48.png new file mode 100644 index 0000000..cd22c42 Binary files /dev/null and b/src/unix/solvespace-48x48.png differ diff --git a/src/unix/solvespace-48x48.xpm b/src/unix/solvespace-48x48.xpm new file mode 100644 index 0000000..c5adf53 --- /dev/null +++ b/src/unix/solvespace-48x48.xpm @@ -0,0 +1,59 @@ +/* XPM */ +static char *solvespace_48x48[] = { +/* columns rows colors chars-per-pixel */ +"48 48 5 1 ", +" c black", +". c #1ED500", +"X c #DE00D6", +"o c #CBCBCB", +"O c None", +/* pixels */ +"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", +"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", +"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", +"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", +"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", +"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", +"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", +"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", +"OOOOOOOOOOOOOO OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", +"OOOOOOOOOOOOOO OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", +"OOOOOOOOOOOOOO OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", +"OOOOOOOOOOOOOO OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", +"OOOOOOOOOOOOOO OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", +"OOOOOOOOOOOOOO OOOOOOOOOXXOOOOOOOOOOOOOOOOOOOOO", +"OOOOOOOOOOOOOO OOOOOOOOOXXoOOOOOOOOOOOOOOOOOOOO", +"OOOOOOOOOOOOOO OOOOOOOOOXXoOOOOOOOOOOOOOOOOOOOO", +"OOOOOOOOOOOOOO OOOOOOOOOXXoOOOOOOOOOOOOOOOOOOOO", +"OOOOOOOOOOOOOO OOOOOOOOOXXoOOOOOOOOOOOOOOOOOOOO", +"OOOOOOOOOOOOOO OOOOOOOOOXXoOOOOOOOOOOOOOOOOOOOO", +"OOOOOOOOOOOOOO OOOOOOOOOXXoOOOOOOOOOOOOOOOOOOOO", +"OOOOOOOOOOOOOO OOOOOOOOOXXoOOOOOOOOOOOOOOOOOOOO", +"OOOOOOOOOOOOOO OOOOOOOOOXXoOOOOOOOOOOOOOOOOOOOO", +"OOOOOOOOOOOOOO OOOOOOOOOXXoOOOOOOOOOOOOOOOOOOOO", +"OOOOOOOOOOOOOO OOOOOOOOOXXoOOOOOOOOOOOOOOOOOOOO", +"OOOOOOOOOOOOOO OOOOXXXXXXXXXXXXOOOOOOOOOOOOOOOO", +"OOOOOOOOOOOOOO OOOOXXXXXXXXXXXXOOOOOOOOOOOOOOOO", +"OOOOOOOOOOOOOO OOOOOooooooooooooOOOOOOOOOOOOOOO", +"OOOOOOOOOOOOOO OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", +"OOOOOOOOOOOOOO OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", +"OOOOOOOOOOOOOO OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", +"OOOOOOOOOOOO......OOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", +"OOOOOOOOOOOO......OOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", +"OOOOOOOO ...... OOOOOOOO", +"OOOOOOOO ...... OOOOOOOO", +"OOOOOOOOOOOO......OOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", +"OOOOOOOOOOOO......OOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", +"OOOOOOOOOOOOOO OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", +"OOOOOOOOOOOOOO OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", +"OOOOOOOOOOOOOO OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", +"OOOOOOOOOOOOOO OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", +"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", +"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", +"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", +"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", +"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", +"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", +"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", +"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO" +}; diff --git a/src/unix/solvespace.desktop b/src/unix/solvespace.desktop new file mode 100644 index 0000000..d2d7398 --- /dev/null +++ b/src/unix/solvespace.desktop @@ -0,0 +1,9 @@ +[Desktop Entry] +Version=1.0 +Name=SolveSpace +Comment=A parametric 2d/3d CAD +Exec=/usr/bin/solvespace +Icon=solvespace +Type=Application +Categories=Graphics +Keywords=parametric;cad;2d;3d; diff --git a/src/unix/unixutil.cpp b/src/unix/unixutil.cpp new file mode 100644 index 0000000..7c1d921 --- /dev/null +++ b/src/unix/unixutil.cpp @@ -0,0 +1,112 @@ +//----------------------------------------------------------------------------- +// Utility functions used by the Unix port. Notably, our memory allocation; +// we use two separate allocators, one for long-lived stuff and one for +// stuff that gets freed after every regeneration of the model, to save us +// the trouble of freeing the latter explicitly. +// +// Copyright 2008-2013 Jonathan Westhues. +// Copyright 2013 Daniel Richard G. +//----------------------------------------------------------------------------- +#include + +#include "solvespace.h" + +namespace SolveSpace { + +void dbp(const char *str, ...) +{ + va_list f; + static char buf[1024*50]; + va_start(f, str); + vsnprintf(buf, sizeof(buf), str, f); + va_end(f); + + fputs(buf, stderr); + fputc('\n', stderr); +} + +FILE *ssfopen(const std::string &filename, const char *mode) +{ + if(filename.length() != strlen(filename.c_str())) oops(); + return fopen(filename.c_str(), mode); +} + +void ssremove(const std::string &filename) +{ + if(filename.length() != strlen(filename.c_str())) oops(); + remove(filename.c_str()); +} + +int64_t GetUnixTime(void) +{ + time_t ret; + time(&ret); + return (int64_t)ret; +} + +//----------------------------------------------------------------------------- +// A separate heap, on which we allocate expressions. Maybe a bit faster, +// since fragmentation is less of a concern, and it also makes it possible +// to be sloppy with our memory management, and just free everything at once +// at the end. +//----------------------------------------------------------------------------- + +typedef struct _AllocTempHeader AllocTempHeader; + +typedef struct _AllocTempHeader { + AllocTempHeader *prev; + AllocTempHeader *next; +} AllocTempHeader; + +static AllocTempHeader *Head = NULL; + +void *AllocTemporary(size_t n) +{ + AllocTempHeader *h = + (AllocTempHeader *)malloc(n + sizeof(AllocTempHeader)); + h->prev = NULL; + h->next = Head; + if(Head) Head->prev = h; + Head = h; + memset(&h[1], 0, n); + return (void *)&h[1]; +} + +void FreeTemporary(void *p) +{ + AllocTempHeader *h = (AllocTempHeader *)p - 1; + if(h->prev) { + h->prev->next = h->next; + } else { + Head = h->next; + } + if(h->next) h->next->prev = h->prev; + free(h); +} + +void FreeAllTemporary(void) +{ + AllocTempHeader *h = Head; + while(h) { + AllocTempHeader *f = h; + h = h->next; + free(f); + } + Head = NULL; +} + +void *MemAlloc(size_t n) { + void *p = malloc(n); + if(!p) oops(); + return p; +} + +void MemFree(void *p) { + free(p); +} + +void InitHeaps(void) { + /* nothing to do */ +} + +}; diff --git a/src/util.cpp b/src/util.cpp new file mode 100644 index 0000000..847f378 --- /dev/null +++ b/src/util.cpp @@ -0,0 +1,1080 @@ +//----------------------------------------------------------------------------- +// Utility functions, mostly various kinds of vector math (working on real +// numbers, not working on quantities in the symbolic algebra system). +// +// Copyright 2008-2013 Jonathan Westhues. +//----------------------------------------------------------------------------- +#include "solvespace.h" + +std::string SolveSpace::ssprintf(const char *fmt, ...) +{ + va_list va; + + va_start(va, fmt); + int size = vsnprintf(NULL, 0, fmt, va); + if(size < 0) oops(); + va_end(va); + + std::string result; + result.resize(size); + + va_start(va, fmt); + vsnprintf(&result[0], size + 1, fmt, va); + va_end(va); + + return result; +} + +char32_t utf8_iterator::operator*() +{ + const uint8_t *it = (const uint8_t*) this->p; + char32_t result = *it; + + if((result & 0x80) != 0) { + unsigned int mask = 0x40; + + do { + result <<= 6; + unsigned int c = (*++it); + mask <<= 5; + result += c - 0x80; + } while((result & mask) != 0); + + result &= mask - 1; + } + + this->n = (const char*) (it + 1); + return result; +} + +bool SolveSpace::FilenameHasExtension(const std::string &str, const char *ext) +{ + int i, ls = str.length(), le = strlen(ext); + + if(ls < le) return false; + + for(i = 0; i < le; i++) { + if(tolower(ext[le-i-1]) != tolower(str[ls-i-1])) { + return false; + } + } + return true; +} + +bool SolveSpace::ReadFile(const std::string &filename, std::string *data) +{ + FILE *f = ssfopen(filename.c_str(), "rb"); + if(f == NULL) + return false; + + fseek(f, 0, SEEK_END); + data->resize(ftell(f)); + fseek(f, 0, SEEK_SET); + fread(&(*data)[0], 1, data->size(), f); + fclose(f); + + return true; +} + +bool SolveSpace::WriteFile(const std::string &filename, const std::string &data) +{ + FILE *f = ssfopen(filename.c_str(), "wb"); + if(f == NULL) + return false; + + fwrite(&data[0], 1, data.size(), f); + fclose(f); + + return true; +} + +void SolveSpace::MakeMatrix(double *mat, + double a11, double a12, double a13, double a14, + double a21, double a22, double a23, double a24, + double a31, double a32, double a33, double a34, + double a41, double a42, double a43, double a44) +{ + mat[ 0] = a11; + mat[ 1] = a21; + mat[ 2] = a31; + mat[ 3] = a41; + mat[ 4] = a12; + mat[ 5] = a22; + mat[ 6] = a32; + mat[ 7] = a42; + mat[ 8] = a13; + mat[ 9] = a23; + mat[10] = a33; + mat[11] = a43; + mat[12] = a14; + mat[13] = a24; + mat[14] = a34; + mat[15] = a44; +} + +//----------------------------------------------------------------------------- +// Word-wrap the string for our message box appropriately, and then display +// that string. +//----------------------------------------------------------------------------- +static void DoStringForMessageBox(const char *str, va_list f, bool error) +{ + char inBuf[1024*50]; + vsprintf(inBuf, str, f); + + char outBuf[1024*50]; + int i = 0, j = 0, len = 0, longestLen = 47; + int rows = 0, cols = 0; + + // Count the width of the longest line that starts with spaces; those + // are list items, that should not be split in the middle. + bool listLine = false; + while(inBuf[i]) { + if(inBuf[i] == '\r') { + // ignore these + } else if(inBuf[i] == ' ' && len == 0) { + listLine = true; + } else if(inBuf[i] == '\n') { + if(listLine) longestLen = max(longestLen, len); + len = 0; + } else { + len++; + } + i++; + } + if(listLine) longestLen = max(longestLen, len); + + // Word wrap according to our target line length longestLen. + len = 0; + i = 0; + while(inBuf[i]) { + if(inBuf[i] == '\r') { + // ignore these + } else if(inBuf[i] == '\n') { + outBuf[j++] = '\n'; + if(len == 0) rows++; + len = 0; + } else if(inBuf[i] == ' ' && len > longestLen) { + outBuf[j++] = '\n'; + len = 0; + } else { + outBuf[j++] = inBuf[i]; + // Count rows when we draw the first character; so an empty + // row doesn't end up counting. + if(len == 0) rows++; + len++; + } + cols = max(cols, len); + i++; + } + outBuf[j++] = '\0'; + + // And then display the text with our actual longest line length. + DoMessageBox(outBuf, rows, cols, error); +} +void SolveSpace::Error(const char *str, ...) +{ + va_list f; + va_start(f, str); + DoStringForMessageBox(str, f, true); + va_end(f); +} +void SolveSpace::Message(const char *str, ...) +{ + va_list f; + va_start(f, str); + DoStringForMessageBox(str, f, false); + va_end(f); +} + +void SolveSpace::CnfFreezeBool(bool v, const std::string &name) + { CnfFreezeInt(v ? 1 : 0, name); } + +void SolveSpace::CnfFreezeColor(RgbaColor v, const std::string &name) + { CnfFreezeInt(v.ToPackedInt(), name); } + +bool SolveSpace::CnfThawBool(bool v, const std::string &name) + { return CnfThawInt(v ? 1 : 0, name) != 0; } + +RgbaColor SolveSpace::CnfThawColor(RgbaColor v, const std::string &name) + { return RgbaColor::FromPackedInt(CnfThawInt(v.ToPackedInt(), name)); } + +//----------------------------------------------------------------------------- +// Solve a mostly banded matrix. In a given row, there are LEFT_OF_DIAG +// elements to the left of the diagonal element, and RIGHT_OF_DIAG elements to +// the right (so that the total band width is LEFT_OF_DIAG + RIGHT_OF_DIAG + 1). +// There also may be elements in the last two columns of any row. We solve +// without pivoting. +//----------------------------------------------------------------------------- +void BandedMatrix::Solve(void) { + int i, ip, j, jp; + double temp; + + // Reduce the matrix to upper triangular form. + for(i = 0; i < n; i++) { + for(ip = i+1; ip < n && ip <= (i + LEFT_OF_DIAG); ip++) { + temp = A[ip][i]/A[i][i]; + + for(jp = i; jp < (n - 2) && jp <= (i + RIGHT_OF_DIAG); jp++) { + A[ip][jp] -= temp*(A[i][jp]); + } + A[ip][n-2] -= temp*(A[i][n-2]); + A[ip][n-1] -= temp*(A[i][n-1]); + + B[ip] -= temp*B[i]; + } + } + + // And back-substitute. + for(i = n - 1; i >= 0; i--) { + temp = B[i]; + + if(i < n-1) temp -= X[n-1]*A[i][n-1]; + if(i < n-2) temp -= X[n-2]*A[i][n-2]; + + for(j = min(n - 3, i + RIGHT_OF_DIAG); j > i; j--) { + temp -= X[j]*A[i][j]; + } + X[i] = temp / A[i][i]; + } +} + +const Quaternion Quaternion::IDENTITY = { 1, 0, 0, 0 }; + +Quaternion Quaternion::From(double w, double vx, double vy, double vz) { + Quaternion q; + q.w = w; + q.vx = vx; + q.vy = vy; + q.vz = vz; + return q; +} + +Quaternion Quaternion::From(hParam w, hParam vx, hParam vy, hParam vz) { + Quaternion q; + q.w = SK.GetParam(w )->val; + q.vx = SK.GetParam(vx)->val; + q.vy = SK.GetParam(vy)->val; + q.vz = SK.GetParam(vz)->val; + return q; +} + +Quaternion Quaternion::From(Vector axis, double dtheta) { + Quaternion q; + double c = cos(dtheta / 2), s = sin(dtheta / 2); + axis = axis.WithMagnitude(s); + q.w = c; + q.vx = axis.x; + q.vy = axis.y; + q.vz = axis.z; + return q; +} + +Quaternion Quaternion::From(Vector u, Vector v) +{ + Vector n = u.Cross(v); + + Quaternion q; + double s, tr = 1 + u.x + v.y + n.z; + if(tr > 1e-4) { + s = 2*sqrt(tr); + q.w = s/4; + q.vx = (v.z - n.y)/s; + q.vy = (n.x - u.z)/s; + q.vz = (u.y - v.x)/s; + } else { + if(u.x > v.y && u.x > n.z) { + s = 2*sqrt(1 + u.x - v.y - n.z); + q.w = (v.z - n.y)/s; + q.vx = s/4; + q.vy = (u.y + v.x)/s; + q.vz = (n.x + u.z)/s; + } else if(v.y > n.z) { + s = 2*sqrt(1 - u.x + v.y - n.z); + q.w = (n.x - u.z)/s; + q.vx = (u.y + v.x)/s; + q.vy = s/4; + q.vz = (v.z + n.y)/s; + } else { + s = 2*sqrt(1 - u.x - v.y + n.z); + q.w = (u.y - v.x)/s; + q.vx = (n.x + u.z)/s; + q.vy = (v.z + n.y)/s; + q.vz = s/4; + } + } + + return q.WithMagnitude(1); +} + +Quaternion Quaternion::Plus(Quaternion b) { + Quaternion q; + q.w = w + b.w; + q.vx = vx + b.vx; + q.vy = vy + b.vy; + q.vz = vz + b.vz; + return q; +} + +Quaternion Quaternion::Minus(Quaternion b) { + Quaternion q; + q.w = w - b.w; + q.vx = vx - b.vx; + q.vy = vy - b.vy; + q.vz = vz - b.vz; + return q; +} + +Quaternion Quaternion::ScaledBy(double s) { + Quaternion q; + q.w = w*s; + q.vx = vx*s; + q.vy = vy*s; + q.vz = vz*s; + return q; +} + +double Quaternion::Magnitude(void) { + return sqrt(w*w + vx*vx + vy*vy + vz*vz); +} + +Quaternion Quaternion::WithMagnitude(double s) { + return ScaledBy(s/Magnitude()); +} + +Vector Quaternion::RotationU(void) { + Vector v; + v.x = w*w + vx*vx - vy*vy - vz*vz; + v.y = 2*w *vz + 2*vx*vy; + v.z = 2*vx*vz - 2*w *vy; + return v; +} + +Vector Quaternion::RotationV(void) { + Vector v; + v.x = 2*vx*vy - 2*w*vz; + v.y = w*w - vx*vx + vy*vy - vz*vz; + v.z = 2*w*vx + 2*vy*vz; + return v; +} + +Vector Quaternion::RotationN(void) { + Vector v; + v.x = 2*w*vy + 2*vx*vz; + v.y = 2*vy*vz - 2*w*vx; + v.z = w*w - vx*vx - vy*vy + vz*vz; + return v; +} + +Vector Quaternion::Rotate(Vector p) { + // Express the point in the new basis + return (RotationU().ScaledBy(p.x)).Plus( + RotationV().ScaledBy(p.y)).Plus( + RotationN().ScaledBy(p.z)); +} + +Quaternion Quaternion::Inverse(void) { + Quaternion r; + r.w = w; + r.vx = -vx; + r.vy = -vy; + r.vz = -vz; + return r.WithMagnitude(1); // not that the normalize should be reqd +} + +Quaternion Quaternion::ToThe(double p) { + // Avoid division by zero, or arccos of something not in its domain + if(w >= (1 - 1e-6)) { + return From(1, 0, 0, 0); + } else if(w <= (-1 + 1e-6)) { + return From(-1, 0, 0, 0); + } + + Quaternion r; + Vector axis = Vector::From(vx, vy, vz); + double theta = acos(w); // okay, since magnitude is 1, so -1 <= w <= 1 + theta *= p; + r.w = cos(theta); + axis = axis.WithMagnitude(sin(theta)); + r.vx = axis.x; + r.vy = axis.y; + r.vz = axis.z; + return r; +} + +Quaternion Quaternion::Times(Quaternion b) { + double sa = w, sb = b.w; + Vector va = { vx, vy, vz }; + Vector vb = { b.vx, b.vy, b.vz }; + + Quaternion r; + r.w = sa*sb - va.Dot(vb); + Vector vr = vb.ScaledBy(sa).Plus( + va.ScaledBy(sb).Plus( + va.Cross(vb))); + r.vx = vr.x; + r.vy = vr.y; + r.vz = vr.z; + return r; +} + +Quaternion Quaternion::Mirror(void) { + Vector u = RotationU(), + v = RotationV(); + u = u.ScaledBy(-1); + v = v.ScaledBy(-1); + return Quaternion::From(u, v); +} + + +Vector Vector::From(double x, double y, double z) { + Vector v; + v.x = x; v.y = y; v.z = z; + return v; +} + +Vector Vector::From(hParam x, hParam y, hParam z) { + Vector v; + v.x = SK.GetParam(x)->val; + v.y = SK.GetParam(y)->val; + v.z = SK.GetParam(z)->val; + return v; +} + +double Vector::Element(int i) { + switch(i) { + case 0: return x; + case 1: return y; + case 2: return z; + default: oops(); + } +} + +bool Vector::Equals(Vector v, double tol) { + // Quick axis-aligned tests before going further + double dx = v.x - x; if(dx < -tol || dx > tol) return false; + double dy = v.y - y; if(dy < -tol || dy > tol) return false; + double dz = v.z - z; if(dz < -tol || dz > tol) return false; + + return (this->Minus(v)).MagSquared() < tol*tol; +} + +bool Vector::EqualsExactly(Vector v) { + return EXACT(x == v.x && + y == v.y && + z == v.z); +} + +Vector Vector::Plus(Vector b) { + Vector r; + + r.x = x + b.x; + r.y = y + b.y; + r.z = z + b.z; + + return r; +} + +Vector Vector::Minus(Vector b) { + Vector r; + + r.x = x - b.x; + r.y = y - b.y; + r.z = z - b.z; + + return r; +} + +Vector Vector::Negated(void) { + Vector r; + + r.x = -x; + r.y = -y; + r.z = -z; + + return r; +} + +Vector Vector::Cross(Vector b) { + Vector r; + + r.x = -(z*b.y) + (y*b.z); + r.y = (z*b.x) - (x*b.z); + r.z = -(y*b.x) + (x*b.y); + + return r; +} + +double Vector::Dot(Vector b) { + return (x*b.x + y*b.y + z*b.z); +} + +double Vector::DirectionCosineWith(Vector b) { + Vector a = this->WithMagnitude(1); + b = b.WithMagnitude(1); + return a.Dot(b); +} + +Vector Vector::Normal(int which) { + Vector n; + + // Arbitrarily choose one vector that's normal to us, pivoting + // appropriately. + double xa = fabs(x), ya = fabs(y), za = fabs(z); + if(this->Equals(Vector::From(0, 0, 1))) { + // Make DXFs exported in the XY plane work nicely... + n = Vector::From(1, 0, 0); + } else if(xa < ya && xa < za) { + n.x = 0; + n.y = z; + n.z = -y; + } else if(ya < za) { + n.x = -z; + n.y = 0; + n.z = x; + } else { + n.x = y; + n.y = -x; + n.z = 0; + } + + if(which == 0) { + // That's the vector we return. + } else if(which == 1) { + n = this->Cross(n); + } else oops(); + + n = n.WithMagnitude(1); + + return n; +} + +Vector Vector::RotatedAbout(Vector orig, Vector axis, double theta) { + Vector r = this->Minus(orig); + r = r.RotatedAbout(axis, theta); + return r.Plus(orig); +} + +Vector Vector::RotatedAbout(Vector axis, double theta) { + double c = cos(theta); + double s = sin(theta); + + axis = axis.WithMagnitude(1); + + Vector r; + + r.x = (x)*(c + (1 - c)*(axis.x)*(axis.x)) + + (y)*((1 - c)*(axis.x)*(axis.y) - s*(axis.z)) + + (z)*((1 - c)*(axis.x)*(axis.z) + s*(axis.y)); + + r.y = (x)*((1 - c)*(axis.y)*(axis.x) + s*(axis.z)) + + (y)*(c + (1 - c)*(axis.y)*(axis.y)) + + (z)*((1 - c)*(axis.y)*(axis.z) - s*(axis.x)); + + r.z = (x)*((1 - c)*(axis.z)*(axis.x) - s*(axis.y)) + + (y)*((1 - c)*(axis.z)*(axis.y) + s*(axis.x)) + + (z)*(c + (1 - c)*(axis.z)*(axis.z)); + + return r; +} + +Vector Vector::DotInToCsys(Vector u, Vector v, Vector n) { + Vector r = { + this->Dot(u), + this->Dot(v), + this->Dot(n) + }; + return r; +} + +Vector Vector::ScaleOutOfCsys(Vector u, Vector v, Vector n) { + Vector r = u.ScaledBy(x).Plus( + v.ScaledBy(y).Plus( + n.ScaledBy(z))); + return r; +} + +Vector Vector::InPerspective(Vector u, Vector v, Vector n, + Vector origin, double cameraTan) +{ + Vector r = this->Minus(origin); + r = r.DotInToCsys(u, v, n); + // yes, minus; we are assuming a csys where u cross v equals n, backwards + // from the display stuff + double w = (1 - r.z*cameraTan); + r = r.ScaledBy(1/w); + + return r; +} + +double Vector::DistanceToLine(Vector p0, Vector dp) { + double m = dp.Magnitude(); + return ((this->Minus(p0)).Cross(dp)).Magnitude() / m; +} + +bool Vector::OnLineSegment(Vector a, Vector b, double tol) { + if(this->Equals(a, tol) || this->Equals(b, tol)) return true; + + Vector d = b.Minus(a); + + double m = d.MagSquared(); + double distsq = ((this->Minus(a)).Cross(d)).MagSquared() / m; + + if(distsq >= tol*tol) return false; + + double t = (this->Minus(a)).DivPivoting(d); + // On-endpoint already tested + if(t < 0 || t > 1) return false; + return true; +} + +Vector Vector::ClosestPointOnLine(Vector p0, Vector dp) { + dp = dp.WithMagnitude(1); + // this, p0, and (p0+dp) define a plane; the min distance is in + // that plane, so calculate its normal + Vector pn = (this->Minus(p0)).Cross(dp); + // The minimum distance line is in that plane, perpendicular + // to the line + Vector n = pn.Cross(dp); + + // Calculate the actual distance + double d = (dp.Cross(p0.Minus(*this))).Magnitude(); + return this->Plus(n.WithMagnitude(d)); +} + +double Vector::MagSquared(void) { + return x*x + y*y + z*z; +} + +double Vector::Magnitude(void) { + return sqrt(x*x + y*y + z*z); +} + +Vector Vector::ScaledBy(double v) { + Vector r; + + r.x = x * v; + r.y = y * v; + r.z = z * v; + + return r; +} + +Vector Vector::WithMagnitude(double v) { + double m = Magnitude(); + if(EXACT(m == 0)) { + // We can do a zero vector with zero magnitude, but not any other cases. + if(fabs(v) > 1e-100) { + dbp("Vector::WithMagnitude(%g) of zero vector!", v); + } + return From(0, 0, 0); + } else { + return ScaledBy(v/m); + } +} + +Vector Vector::ProjectVectorInto(hEntity wrkpl) { + EntityBase *w = SK.GetEntity(wrkpl); + Vector u = w->Normal()->NormalU(); + Vector v = w->Normal()->NormalV(); + + double up = this->Dot(u); + double vp = this->Dot(v); + + return (u.ScaledBy(up)).Plus(v.ScaledBy(vp)); +} + +Vector Vector::ProjectInto(hEntity wrkpl) { + EntityBase *w = SK.GetEntity(wrkpl); + Vector p0 = w->WorkplaneGetOffset(); + + Vector f = this->Minus(p0); + + return p0.Plus(f.ProjectVectorInto(wrkpl)); +} + +Point2d Vector::Project2d(Vector u, Vector v) { + Point2d p; + p.x = this->Dot(u); + p.y = this->Dot(v); + return p; +} + +Point2d Vector::ProjectXy(void) { + Point2d p; + p.x = x; + p.y = y; + return p; +} + +Vector4 Vector::Project4d(void) { + return Vector4::From(1, x, y, z); +} + +double Vector::DivPivoting(Vector delta) { + double mx = fabs(delta.x), my = fabs(delta.y), mz = fabs(delta.z); + + if(mx > my && mx > mz) { + return x/delta.x; + } else if(my > mz) { + return y/delta.y; + } else { + return z/delta.z; + } +} + +Vector Vector::ClosestOrtho(void) { + double mx = fabs(x), my = fabs(y), mz = fabs(z); + + if(mx > my && mx > mz) { + return From((x > 0) ? 1 : -1, 0, 0); + } else if(my > mz) { + return From(0, (y > 0) ? 1 : -1, 0); + } else { + return From(0, 0, (z > 0) ? 1 : -1); + } +} + +Vector Vector::ClampWithin(double minv, double maxv) { + Vector ret = *this; + + if(ret.x < minv) ret.x = minv; + if(ret.y < minv) ret.y = minv; + if(ret.z < minv) ret.z = minv; + + if(ret.x > maxv) ret.x = maxv; + if(ret.y > maxv) ret.y = maxv; + if(ret.z > maxv) ret.z = maxv; + + return ret; +} + +void Vector::MakeMaxMin(Vector *maxv, Vector *minv) { + maxv->x = max(maxv->x, x); + maxv->y = max(maxv->y, y); + maxv->z = max(maxv->z, z); + + minv->x = min(minv->x, x); + minv->y = min(minv->y, y); + minv->z = min(minv->z, z); +} + +bool Vector::OutsideAndNotOn(Vector maxv, Vector minv) { + return (x > maxv.x + LENGTH_EPS) || (x < minv.x - LENGTH_EPS) || + (y > maxv.y + LENGTH_EPS) || (y < minv.y - LENGTH_EPS) || + (z > maxv.z + LENGTH_EPS) || (z < minv.z - LENGTH_EPS); +} + +bool Vector::BoundingBoxesDisjoint(Vector amax, Vector amin, + Vector bmax, Vector bmin) +{ + int i; + for(i = 0; i < 3; i++) { + if(amax.Element(i) < bmin.Element(i) - LENGTH_EPS) return true; + if(amin.Element(i) > bmax.Element(i) + LENGTH_EPS) return true; + } + return false; +} + +bool Vector::BoundingBoxIntersectsLine(Vector amax, Vector amin, + Vector p0, Vector p1, bool segment) +{ + Vector dp = p1.Minus(p0); + double lp = dp.Magnitude(); + dp = dp.ScaledBy(1.0/lp); + + int i, a; + for(i = 0; i < 3; i++) { + int j = WRAP(i+1, 3), k = WRAP(i+2, 3); + if(lp*fabs(dp.Element(i)) < LENGTH_EPS) continue; // parallel to plane + + for(a = 0; a < 2; a++) { + double d = (a == 0) ? amax.Element(i) : amin.Element(i); + // n dot (p0 + t*dp) = d + // (n dot p0) + t * (n dot dp) = d + double t = (d - p0.Element(i)) / dp.Element(i); + Vector p = p0.Plus(dp.ScaledBy(t)); + + if(segment && (t < -LENGTH_EPS || t > (lp+LENGTH_EPS))) continue; + + if(p.Element(j) > amax.Element(j) + LENGTH_EPS) continue; + if(p.Element(k) > amax.Element(k) + LENGTH_EPS) continue; + + if(p.Element(j) < amin.Element(j) - LENGTH_EPS) continue; + if(p.Element(k) < amin.Element(k) - LENGTH_EPS) continue; + + return true; + } + } + + return false; +} + +Vector Vector::AtIntersectionOfPlanes(Vector n1, double d1, + Vector n2, double d2) +{ + double det = (n1.Dot(n1))*(n2.Dot(n2)) - + (n1.Dot(n2))*(n1.Dot(n2)); + double c1 = (d1*n2.Dot(n2) - d2*n1.Dot(n2))/det; + double c2 = (d2*n1.Dot(n1) - d1*n1.Dot(n2))/det; + + return (n1.ScaledBy(c1)).Plus(n2.ScaledBy(c2)); +} + +void Vector::ClosestPointBetweenLines(Vector a0, Vector da, + Vector b0, Vector db, + double *ta, double *tb) +{ + // Make a semi-orthogonal coordinate system from those directions; + // note that dna and dnb need not be perpendicular. + Vector dn = da.Cross(db); // normal to both + Vector dna = dn.Cross(da); // normal to da + Vector dnb = dn.Cross(db); // normal to db + + // At the intersection of the lines + // a0 + pa*da = b0 + pb*db (where pa, pb are scalar params) + // So dot this equation against dna and dnb to get two equations + // to solve for da and db + *tb = ((a0.Minus(b0)).Dot(dna))/(db.Dot(dna)); + *ta = -((a0.Minus(b0)).Dot(dnb))/(da.Dot(dnb)); +} + +Vector Vector::AtIntersectionOfLines(Vector a0, Vector a1, + Vector b0, Vector b1, + bool *skew, + double *parama, double *paramb) +{ + Vector da = a1.Minus(a0), db = b1.Minus(b0); + + double pa, pb; + Vector::ClosestPointBetweenLines(a0, da, b0, db, &pa, &pb); + + if(parama) *parama = pa; + if(paramb) *paramb = pb; + + // And from either of those, we get the intersection point. + Vector pi = a0.Plus(da.ScaledBy(pa)); + + if(skew) { + // Check if the intersection points on each line are actually + // coincident... + if(pi.Equals(b0.Plus(db.ScaledBy(pb)))) { + *skew = false; + } else { + *skew = true; + } + } + return pi; +} + +Vector Vector::AtIntersectionOfPlaneAndLine(Vector n, double d, + Vector p0, Vector p1, + bool *parallel) +{ + Vector dp = p1.Minus(p0); + + if(fabs(n.Dot(dp)) < LENGTH_EPS) { + if(parallel) *parallel = true; + return Vector::From(0, 0, 0); + } + + if(parallel) *parallel = false; + + // n dot (p0 + t*dp) = d + // (n dot p0) + t * (n dot dp) = d + double t = (d - n.Dot(p0)) / (n.Dot(dp)); + + return p0.Plus(dp.ScaledBy(t)); +} + +static double det2(double a1, double b1, + double a2, double b2) +{ + return (a1*b2) - (b1*a2); +} +static double det3(double a1, double b1, double c1, + double a2, double b2, double c2, + double a3, double b3, double c3) +{ + return a1*det2(b2, c2, b3, c3) - + b1*det2(a2, c2, a3, c3) + + c1*det2(a2, b2, a3, b3); +} +Vector Vector::AtIntersectionOfPlanes(Vector na, double da, + Vector nb, double db, + Vector nc, double dc, + bool *parallel) +{ + double det = det3(na.x, na.y, na.z, + nb.x, nb.y, nb.z, + nc.x, nc.y, nc.z); + if(fabs(det) < 1e-10) { // arbitrary tolerance, not so good + *parallel = true; + return Vector::From(0, 0, 0); + } + *parallel = false; + + double detx = det3(da, na.y, na.z, + db, nb.y, nb.z, + dc, nc.y, nc.z); + + double dety = det3(na.x, da, na.z, + nb.x, db, nb.z, + nc.x, dc, nc.z); + + double detz = det3(na.x, na.y, da, + nb.x, nb.y, db, + nc.x, nc.y, dc ); + + return Vector::From(detx/det, dety/det, detz/det); +} + +Vector4 Vector4::From(double w, double x, double y, double z) { + Vector4 ret; + ret.w = w; + ret.x = x; + ret.y = y; + ret.z = z; + return ret; +} + +Vector4 Vector4::From(double w, Vector v) { + return Vector4::From(w, w*v.x, w*v.y, w*v.z); +} + +Vector4 Vector4::Blend(Vector4 a, Vector4 b, double t) { + return (a.ScaledBy(1 - t)).Plus(b.ScaledBy(t)); +} + +Vector4 Vector4::Plus(Vector4 b) { + return Vector4::From(w + b.w, x + b.x, y + b.y, z + b.z); +} + +Vector4 Vector4::Minus(Vector4 b) { + return Vector4::From(w - b.w, x - b.x, y - b.y, z - b.z); +} + +Vector4 Vector4::ScaledBy(double s) { + return Vector4::From(w*s, x*s, y*s, z*s); +} + +Vector Vector4::PerspectiveProject(void) { + return Vector::From(x / w, y / w, z / w); +} + +Point2d Point2d::From(double x, double y) { + return { x, y }; +} + +Point2d Point2d::Plus(const Point2d &b) const { + return { x + b.x, y + b.y }; +} + +Point2d Point2d::Minus(const Point2d &b) const { + return { x - b.x, y - b.y }; +} + +Point2d Point2d::ScaledBy(double s) const { + return { x * s, y * s }; +} + +double Point2d::DivPivoting(Point2d delta) const { + if(fabs(delta.x) > fabs(delta.y)) { + return x/delta.x; + } else { + return y/delta.y; + } +} + +double Point2d::MagSquared(void) const { + return x*x + y*y; +} + +double Point2d::Magnitude(void) const { + return sqrt(x*x + y*y); +} + +Point2d Point2d::WithMagnitude(double v) const { + double m = Magnitude(); + if(m < 1e-20) { + dbp("!!! WithMagnitude() of zero vector"); + return { v, 0 }; + } + return { x * v / m, y * v / m }; +} + +double Point2d::DistanceTo(const Point2d &p) const { + double dx = x - p.x; + double dy = y - p.y; + return sqrt(dx*dx + dy*dy); +} + +double Point2d::Dot(Point2d p) const { + return x*p.x + y*p.y; +} + +double Point2d::DistanceToLine(const Point2d &p0, const Point2d &dp, bool segment) const { + double m = dp.x*dp.x + dp.y*dp.y; + if(m < LENGTH_EPS*LENGTH_EPS) return VERY_POSITIVE; + + // Let our line be p = p0 + t*dp, for a scalar t from 0 to 1 + double t = (dp.x*(x - p0.x) + dp.y*(y - p0.y))/m; + + if((t < 0 || t > 1) && segment) { + // The closest point is one of the endpoints; determine which. + double d0 = DistanceTo(p0); + double d1 = DistanceTo(p0.Plus(dp)); + + return min(d1, d0); + } else { + Point2d closest = p0.Plus(dp.ScaledBy(t)); + return DistanceTo(closest); + } +} + +Point2d Point2d::Normal(void) const { + return { y, -x }; +} + +bool Point2d::Equals(Point2d v, double tol) const { + double dx = v.x - x; if(dx < -tol || dx > tol) return false; + double dy = v.y - y; if(dy < -tol || dy > tol) return false; + + return (this->Minus(v)).MagSquared() < tol*tol; +} + +BBox BBox::From(const Vector &p0, const Vector &p1) { + BBox bbox; + bbox.minp.x = min(p0.x, p1.x); + bbox.minp.y = min(p0.y, p1.y); + bbox.minp.z = min(p0.z, p1.z); + + bbox.maxp.x = max(p0.x, p1.x); + bbox.maxp.y = max(p0.y, p1.y); + bbox.maxp.z = max(p0.z, p1.z); + return bbox; +} + +Vector BBox::GetOrigin() { return minp.Plus(maxp.Minus(minp)).ScaledBy(0.5); } +Vector BBox::GetExtents() { return maxp.Minus(minp).ScaledBy(0.5); } + +void BBox::Include(const Vector &v, double r) { + minp.x = min(minp.x, v.x - r); + minp.y = min(minp.y, v.y - r); + minp.z = min(minp.z, v.z - r); + + maxp.x = max(maxp.x, v.x + r); + maxp.y = max(maxp.y, v.y + r); + maxp.z = max(maxp.z, v.z + r); +} + +bool BBox::Overlaps(BBox &b1) { + + Vector t = b1.GetOrigin().Minus(GetOrigin()); + Vector e = b1.GetExtents().Plus(GetExtents()); + + return fabs(t.x) < e.x && fabs(t.y) < e.y && fabs(t.z) < e.z; +} + +bool BBox::Contains(const Point2d &p) { + return p.x >= minp.x && p.y >= minp.y && p.x <= maxp.x && p.y <= maxp.y; +} diff --git a/src/view.cpp b/src/view.cpp new file mode 100644 index 0000000..bf76ba9 --- /dev/null +++ b/src/view.cpp @@ -0,0 +1,116 @@ +//----------------------------------------------------------------------------- +// The View menu, stuff to snap to certain special vews of the model, and to +// display our current view of the model to the user. +// +// Copyright 2008-2013 Jonathan Westhues. +//----------------------------------------------------------------------------- +#include "solvespace.h" + +void TextWindow::ShowEditView(void) { + Printf(true, "%Ft3D VIEW PARAMETERS%E"); + + Printf(true, "%Bd %Ftoverall scale factor%E"); + Printf(false, "%Ba %# px/%s %Fl%Ll%f[edit]%E", + SS.GW.scale * SS.MmPerUnit(), + SS.UnitName(), + &ScreenChangeViewScale); + Printf(false, ""); + + Printf(false, "%Bd %Ftorigin (maps to center of screen)%E"); + Printf(false, "%Ba (%s, %s, %s) %Fl%Ll%f[edit]%E", + SS.MmToString(-SS.GW.offset.x).c_str(), + SS.MmToString(-SS.GW.offset.y).c_str(), + SS.MmToString(-SS.GW.offset.z).c_str(), + &ScreenChangeViewOrigin); + Printf(false, ""); + + Vector n = (SS.GW.projRight).Cross(SS.GW.projUp); + Printf(false, "%Bd %Ftprojection onto screen%E"); + Printf(false, "%Ba %Ftright%E (%3, %3, %3) %Fl%Ll%f[edit]%E", + CO(SS.GW.projRight), + &ScreenChangeViewProjection); + Printf(false, "%Bd %Ftup%E (%3, %3, %3)", CO(SS.GW.projUp)); + Printf(false, "%Ba %Ftout%E (%3, %3, %3)", CO(n)); + Printf(false, ""); + + Printf(false, "The perspective may be changed in the"); + Printf(false, "configuration screen."); +} + +void TextWindow::ScreenChangeViewScale(int link, uint32_t v) { + SS.TW.edit.meaning = EDIT_VIEW_SCALE; + SS.TW.ShowEditControl(3, ssprintf("%.3f", SS.GW.scale * SS.MmPerUnit())); +} + +void TextWindow::ScreenChangeViewOrigin(int link, uint32_t v) { + std::string edit_value = + ssprintf("%s, %s, %s", + SS.MmToString(-SS.GW.offset.x).c_str(), + SS.MmToString(-SS.GW.offset.y).c_str(), + SS.MmToString(-SS.GW.offset.z).c_str()); + + SS.TW.edit.meaning = EDIT_VIEW_ORIGIN; + SS.TW.ShowEditControl(3, edit_value); +} + +void TextWindow::ScreenChangeViewProjection(int link, uint32_t v) { + std::string edit_value = + ssprintf("%.3f, %.3f, %.3f", CO(SS.GW.projRight)); + SS.TW.edit.meaning = EDIT_VIEW_PROJ_RIGHT; + SS.TW.ShowEditControl(10, edit_value); +} + +bool TextWindow::EditControlDoneForView(const char *s) { + switch(edit.meaning) { + case EDIT_VIEW_SCALE: { + Expr *e = Expr::From(s, true); + if(e) { + double v = e->Eval() / SS.MmPerUnit(); + if(v > LENGTH_EPS) { + SS.GW.scale = v; + } else { + Error("Scale cannot be zero or negative."); + } + } + break; + } + + case EDIT_VIEW_ORIGIN: { + Vector pt; + if(sscanf(s, "%lf, %lf, %lf", &pt.x, &pt.y, &pt.z) == 3) { + pt = pt.ScaledBy(SS.MmPerUnit()); + SS.GW.offset = pt.ScaledBy(-1); + } else { + Error("Bad format: specify x, y, z"); + } + break; + } + + case EDIT_VIEW_PROJ_RIGHT: + case EDIT_VIEW_PROJ_UP: { + Vector pt; + if(sscanf(s, "%lf, %lf, %lf", &pt.x, &pt.y, &pt.z) != 3) { + Error("Bad format: specify x, y, z"); + break; + } + if(edit.meaning == EDIT_VIEW_PROJ_RIGHT) { + SS.GW.projRight = pt; + SS.GW.NormalizeProjectionVectors(); + edit.meaning = EDIT_VIEW_PROJ_UP; + HideEditControl(); + ShowEditControl(10, ssprintf("%.3f, %.3f, %.3f", CO(SS.GW.projUp)), + editControl.halfRow + 2); + edit.showAgain = true; + } else { + SS.GW.projUp = pt; + SS.GW.NormalizeProjectionVectors(); + } + break; + } + + default: + return false; + } + return true; +} + diff --git a/src/win32/icon.ico b/src/win32/icon.ico new file mode 100644 index 0000000..e545e2f Binary files /dev/null and b/src/win32/icon.ico differ diff --git a/src/win32/manifest.xml b/src/win32/manifest.xml new file mode 100644 index 0000000..f27a236 --- /dev/null +++ b/src/win32/manifest.xml @@ -0,0 +1,22 @@ + + + +Parametric 3d CAD tool. + + + + + + diff --git a/src/win32/resource.rc b/src/win32/resource.rc new file mode 100644 index 0000000..e402f8b --- /dev/null +++ b/src/win32/resource.rc @@ -0,0 +1,6 @@ + +// we need a manifest if we want visual styles; put in numbers since somethings a bit screwy +// with my SDK install (I don't think I've got *.rh right) +1 24 "manifest.xml" + +4000 ICON "icon.ico" diff --git a/src/win32/w32main.cpp b/src/win32/w32main.cpp new file mode 100644 index 0000000..562499b --- /dev/null +++ b/src/win32/w32main.cpp @@ -0,0 +1,1479 @@ +//----------------------------------------------------------------------------- +// Our WinMain() functions, and Win32-specific stuff to set up our windows +// and otherwise handle our interface to the operating system. Everything +// outside win32/... should be standard C++ and gl. +// +// Copyright 2008-2013 Jonathan Westhues. +//----------------------------------------------------------------------------- +#include +#include +#include +#include +#include + +#include "solvespace.h" +#include "config.h" + +#ifdef HAVE_SPACEWARE +# include +# include +# undef uint32_t // thanks but no thanks +#endif + +HINSTANCE Instance; + +HWND TextWnd; +HWND TextWndScrollBar; +HWND TextEditControl; +HGLRC TextGl; + +HWND GraphicsWnd; +HGLRC GraphicsGl; +HWND GraphicsEditControl; +static struct { + int x, y; +} LastMousePos; + +HMENU SubMenus[100]; +HMENU RecentOpenMenu, RecentImportMenu; + +HMENU ContextMenu, ContextSubmenu; + +int ClientIsSmallerBy; + +HFONT FixedFont; + +#ifdef HAVE_SPACEWARE +// The 6-DOF input device. +SiHdl SpaceNavigator = SI_NO_HANDLE; +#endif + +//----------------------------------------------------------------------------- +// Routines to display message boxes on screen. Do our own, instead of using +// MessageBox, because that is not consistent from version to version and +// there's word wrap problems. +//----------------------------------------------------------------------------- + +HWND MessageWnd, OkButton; +bool MessageDone; +int MessageWidth, MessageHeight; +const char *MessageString; + +static LRESULT CALLBACK MessageProc(HWND hwnd, UINT msg, WPARAM wParam, + LPARAM lParam) +{ + switch (msg) { + case WM_COMMAND: + if((HWND)lParam == OkButton && wParam == BN_CLICKED) { + MessageDone = true; + } + break; + + case WM_CLOSE: + case WM_DESTROY: + MessageDone = true; + break; + + case WM_PAINT: { + PAINTSTRUCT ps; + HDC hdc = BeginPaint(hwnd, &ps); + SelectObject(hdc, FixedFont); + SetTextColor(hdc, 0x000000); + SetBkMode(hdc, TRANSPARENT); + RECT rc; + SetRect(&rc, 10, 10, MessageWidth, MessageHeight); + std::wstring text = Widen(MessageString); + DrawText(hdc, text.c_str(), text.length(), &rc, DT_LEFT | DT_WORDBREAK); + EndPaint(hwnd, &ps); + break; + } + + default: + return DefWindowProc(hwnd, msg, wParam, lParam); + } + + return 1; +} + +HWND CreateWindowClient(DWORD exStyle, const wchar_t *className, const wchar_t *windowName, + DWORD style, int x, int y, int width, int height, HWND parent, + HMENU menu, HINSTANCE instance, void *param) +{ + HWND h = CreateWindowExW(exStyle, className, windowName, style, x, y, + width, height, parent, menu, instance, param); + + RECT r; + GetClientRect(h, &r); + width = width - (r.right - width); + height = height - (r.bottom - height); + + SetWindowPos(h, HWND_TOP, x, y, width, height, 0); + + return h; +} + +void SolveSpace::DoMessageBox(const char *str, int rows, int cols, bool error) +{ + EnableWindow(GraphicsWnd, false); + EnableWindow(TextWnd, false); + + // Register the window class for our dialog. + WNDCLASSEX wc = {}; + wc.cbSize = sizeof(wc); + wc.style = CS_BYTEALIGNCLIENT | CS_BYTEALIGNWINDOW | CS_OWNDC; + wc.lpfnWndProc = (WNDPROC)MessageProc; + wc.hInstance = Instance; + wc.hbrBackground = (HBRUSH)COLOR_BTNSHADOW; + wc.lpszClassName = L"MessageWnd"; + wc.lpszMenuName = NULL; + wc.hCursor = LoadCursor(NULL, IDC_ARROW); + wc.hIcon = (HICON)LoadImage(Instance, MAKEINTRESOURCE(4000), + IMAGE_ICON, 32, 32, 0); + wc.hIconSm = (HICON)LoadImage(Instance, MAKEINTRESOURCE(4000), + IMAGE_ICON, 16, 16, 0); + RegisterClassEx(&wc); + + // Create the window. + MessageString = str; + RECT r; + GetWindowRect(GraphicsWnd, &r); + const char *title = error ? "SolveSpace - Error" : "SolveSpace - Message"; + int width = cols*SS.TW.CHAR_WIDTH + 20, + height = rows*SS.TW.LINE_HEIGHT + 60; + MessageWidth = width; + MessageHeight = height; + MessageWnd = CreateWindowClient(0, L"MessageWnd", Widen(title).c_str(), + WS_OVERLAPPED | WS_SYSMENU, + r.left + 100, r.top + 100, width, height, NULL, NULL, Instance, NULL); + + OkButton = CreateWindowExW(0, WC_BUTTON, L"OK", + WS_CHILD | WS_TABSTOP | WS_CLIPSIBLINGS | WS_VISIBLE | BS_DEFPUSHBUTTON, + (width - 70)/2, rows*SS.TW.LINE_HEIGHT + 20, + 70, 25, MessageWnd, NULL, Instance, NULL); + SendMessage(OkButton, WM_SETFONT, (WPARAM)FixedFont, true); + + ShowWindow(MessageWnd, true); + SetFocus(OkButton); + + MSG msg; + DWORD ret; + MessageDone = false; + while((ret = GetMessage(&msg, NULL, 0, 0)) != 0 && !MessageDone) { + if((msg.message == WM_KEYDOWN && + (msg.wParam == VK_RETURN || + msg.wParam == VK_ESCAPE)) || + (msg.message == WM_KEYUP && + (msg.wParam == VK_SPACE))) + { + MessageDone = true; + break; + } + + TranslateMessage(&msg); + DispatchMessage(&msg); + } + + MessageString = NULL; + EnableWindow(TextWnd, true); + EnableWindow(GraphicsWnd, true); + SetForegroundWindow(GraphicsWnd); + DestroyWindow(MessageWnd); +} + +void SolveSpace::AddContextMenuItem(const char *label, int id) +{ + if(!ContextMenu) ContextMenu = CreatePopupMenu(); + + if(id == CONTEXT_SUBMENU) { + AppendMenuW(ContextMenu, MF_STRING | MF_POPUP, + (UINT_PTR)ContextSubmenu, Widen(label).c_str()); + ContextSubmenu = NULL; + } else { + HMENU m = ContextSubmenu ? ContextSubmenu : ContextMenu; + if(id == CONTEXT_SEPARATOR) { + AppendMenuW(m, MF_SEPARATOR, 0, L""); + } else { + AppendMenuW(m, MF_STRING, id, Widen(label).c_str()); + } + } +} + +void SolveSpace::CreateContextSubmenu(void) +{ + ContextSubmenu = CreatePopupMenu(); +} + +int SolveSpace::ShowContextMenu(void) +{ + POINT p; + GetCursorPos(&p); + int r = TrackPopupMenu(ContextMenu, + TPM_RIGHTBUTTON | TPM_RETURNCMD | TPM_TOPALIGN, + p.x, p.y, 0, GraphicsWnd, NULL); + + DestroyMenu(ContextMenu); + ContextMenu = NULL; + return r; +} + +void CALLBACK TimerCallback(HWND hwnd, UINT msg, UINT_PTR id, DWORD time) +{ + // The timer is periodic, so needs to be killed explicitly. + KillTimer(GraphicsWnd, 1); + SS.GW.TimerCallback(); + SS.TW.TimerCallback(); +} +void SolveSpace::SetTimerFor(int milliseconds) +{ + SetTimer(GraphicsWnd, 1, milliseconds, TimerCallback); +} + +void SolveSpace::ScheduleLater() +{ +} + +static void CALLBACK AutosaveCallback(HWND hwnd, UINT msg, UINT_PTR id, DWORD time) +{ + KillTimer(GraphicsWnd, 1); + SS.Autosave(); +} + +void SolveSpace::SetAutosaveTimerFor(int minutes) +{ + SetTimer(GraphicsWnd, 2, minutes * 60 * 1000, AutosaveCallback); +} + +static void GetWindowSize(HWND hwnd, int *w, int *h) +{ + RECT r; + GetClientRect(hwnd, &r); + *w = r.right - r.left; + *h = r.bottom - r.top; +} +void SolveSpace::GetGraphicsWindowSize(int *w, int *h) +{ + GetWindowSize(GraphicsWnd, w, h); +} +void SolveSpace::GetTextWindowSize(int *w, int *h) +{ + GetWindowSize(TextWnd, w, h); +} + +void SolveSpace::OpenWebsite(const char *url) { + ShellExecuteW(GraphicsWnd, L"open", Widen(url).c_str(), NULL, NULL, SW_SHOWNORMAL); +} + +void SolveSpace::ExitNow(void) { + PostQuitMessage(0); +} + +//----------------------------------------------------------------------------- +// Helpers so that we can read/write registry keys from the platform- +// independent code. +//----------------------------------------------------------------------------- +inline int CLAMP(int v, int a, int b) { + // Clamp it to the range [a, b] + if(v <= a) return a; + if(v >= b) return b; + return v; +} + +static HKEY GetRegistryKey() +{ + HKEY Software; + if(RegOpenKeyExW(HKEY_CURRENT_USER, L"Software", 0, + KEY_ALL_ACCESS, &Software) != ERROR_SUCCESS) + return NULL; + + HKEY SolveSpace; + if(RegCreateKeyExW(Software, L"SolveSpace", 0, NULL, 0, + KEY_ALL_ACCESS, NULL, &SolveSpace, NULL) != ERROR_SUCCESS) + return NULL; + + RegCloseKey(Software); + + return SolveSpace; +} + +void SolveSpace::CnfFreezeInt(uint32_t val, const std::string &name) +{ + HKEY SolveSpace = GetRegistryKey(); + RegSetValueExW(SolveSpace, &Widen(name)[0], 0, + REG_DWORD, (const BYTE*) &val, sizeof(DWORD)); + RegCloseKey(SolveSpace); +} +void SolveSpace::CnfFreezeFloat(float val, const std::string &name) +{ + static_assert(sizeof(float) == sizeof(DWORD), + "sizes of float and DWORD must match"); + HKEY SolveSpace = GetRegistryKey(); + RegSetValueExW(SolveSpace, &Widen(name)[0], 0, + REG_DWORD, (const BYTE*) &val, sizeof(DWORD)); + RegCloseKey(SolveSpace); +} +void SolveSpace::CnfFreezeString(const std::string &str, const std::string &name) +{ + HKEY SolveSpace = GetRegistryKey(); + std::wstring strW = Widen(str); + RegSetValueExW(SolveSpace, &Widen(name)[0], 0, + REG_SZ, (const BYTE*) &strW[0], (strW.length() + 1) * 2); + RegCloseKey(SolveSpace); +} +static void FreezeWindowPos(HWND hwnd, const std::string &name) +{ + RECT r; + GetWindowRect(hwnd, &r); + CnfFreezeInt(r.left, name + "_left"); + CnfFreezeInt(r.right, name + "_right"); + CnfFreezeInt(r.top, name + "_top"); + CnfFreezeInt(r.bottom, name + "_bottom"); + + CnfFreezeInt(IsZoomed(hwnd), name + "_maximized"); +} + +uint32_t SolveSpace::CnfThawInt(uint32_t val, const std::string &name) +{ + HKEY SolveSpace = GetRegistryKey(); + DWORD type, newval, len = sizeof(DWORD); + LONG result = RegQueryValueEx(SolveSpace, &Widen(name)[0], NULL, + &type, (BYTE*) &newval, &len); + RegCloseKey(SolveSpace); + + if(result == ERROR_SUCCESS && type == REG_DWORD) + return newval; + else + return val; +} +float SolveSpace::CnfThawFloat(float val, const std::string &name) +{ + HKEY SolveSpace = GetRegistryKey(); + DWORD type, len = sizeof(DWORD); + float newval; + LONG result = RegQueryValueExW(SolveSpace, &Widen(name)[0], NULL, + &type, (BYTE*) &newval, &len); + RegCloseKey(SolveSpace); + + if(result == ERROR_SUCCESS && type == REG_DWORD) + return newval; + else + return val; +} +std::string SolveSpace::CnfThawString(const std::string &val, const std::string &name) +{ + HKEY SolveSpace = GetRegistryKey(); + DWORD type, len; + if(RegQueryValueExW(SolveSpace, &Widen(name)[0], NULL, + &type, NULL, &len) != ERROR_SUCCESS || type != REG_SZ) { + RegCloseKey(SolveSpace); + return val; + } + + std::wstring newval; + newval.resize(len / 2 - 1); + if(RegQueryValueExW(SolveSpace, &Widen(name)[0], NULL, + NULL, (BYTE*) &newval[0], &len) != ERROR_SUCCESS) { + RegCloseKey(SolveSpace); + return val; + } + + RegCloseKey(SolveSpace); + return Narrow(newval); +} +static void ThawWindowPos(HWND hwnd, const std::string &name) +{ + RECT r; + GetWindowRect(hwnd, &r); + r.left = CnfThawInt(r.left, name + "_left"); + r.right = CnfThawInt(r.right, name + "_right"); + r.top = CnfThawInt(r.top, name + "_top"); + r.bottom = CnfThawInt(r.bottom, name + "_bottom"); + + HMONITOR hMonitor = MonitorFromRect(&r, MONITOR_DEFAULTTONEAREST);; + MONITORINFO mi; + mi.cbSize = sizeof(mi); + GetMonitorInfo(hMonitor, &mi); + + // If it somehow ended up off-screen, then put it back. + RECT dr = mi.rcMonitor; + r.left = CLAMP(r.left, dr.left, dr.right); + r.right = CLAMP(r.right, dr.left, dr.right); + r.top = CLAMP(r.top, dr.top, dr.bottom); + r.bottom = CLAMP(r.bottom, dr.top, dr.bottom); + MoveWindow(hwnd, r.left, r.top, r.right - r.left, r.bottom - r.top, TRUE); + + if(CnfThawInt(FALSE, name + "_maximized")) + ShowWindow(hwnd, SW_MAXIMIZE); +} + +void SolveSpace::SetCurrentFilename(const std::string &filename) { + if(!filename.empty()) { + SetWindowTextW(GraphicsWnd, Widen("SolveSpace - " + filename).c_str()); + } else { + SetWindowTextW(GraphicsWnd, L"SolveSpace - (not yet saved)"); + } +} + +void SolveSpace::SetMousePointerToHand(bool yes) { + SetCursor(LoadCursor(NULL, yes ? IDC_HAND : IDC_ARROW)); +} + +static void PaintTextWnd(HDC hdc) +{ + wglMakeCurrent(GetDC(TextWnd), TextGl); + + SS.TW.Paint(); + SwapBuffers(GetDC(TextWnd)); + + // Leave the graphics window context active, except when we're painting + // this text window. + wglMakeCurrent(GetDC(GraphicsWnd), GraphicsGl); +} + +void SolveSpace::MoveTextScrollbarTo(int pos, int maxPos, int page) +{ + SCROLLINFO si = {}; + si.cbSize = sizeof(si); + si.fMask = SIF_DISABLENOSCROLL | SIF_ALL; + si.nMin = 0; + si.nMax = maxPos; + si.nPos = pos; + si.nPage = page; + SetScrollInfo(TextWndScrollBar, SB_CTL, &si, true); +} + +void HandleTextWindowScrollBar(WPARAM wParam, LPARAM lParam) +{ + int maxPos, minPos, pos; + GetScrollRange(TextWndScrollBar, SB_CTL, &minPos, &maxPos); + pos = GetScrollPos(TextWndScrollBar, SB_CTL); + + switch(LOWORD(wParam)) { + case SB_LINEUP: pos--; break; + case SB_PAGEUP: pos -= 4; break; + + case SB_LINEDOWN: pos++; break; + case SB_PAGEDOWN: pos += 4; break; + + case SB_TOP: pos = 0; break; + + case SB_BOTTOM: pos = maxPos; break; + + case SB_THUMBTRACK: + case SB_THUMBPOSITION: pos = HIWORD(wParam); break; + } + + SS.TW.ScrollbarEvent(pos); +} + +static void MouseWheel(int thisDelta) { + static int DeltaAccum; + int delta = 0; + // Handle mouse deltas of less than 120 (like from an un-detented mouse + // wheel) correctly, even though no one ever uses those. + DeltaAccum += thisDelta; + while(DeltaAccum >= 120) { + DeltaAccum -= 120; + delta += 120; + } + while(DeltaAccum <= -120) { + DeltaAccum += 120; + delta -= 120; + } + if(delta == 0) return; + + POINT pt; + GetCursorPos(&pt); + HWND hw = WindowFromPoint(pt); + + // Make the mousewheel work according to which window the mouse is + // over, not according to which window is active. + bool inTextWindow; + if(hw == TextWnd) { + inTextWindow = true; + } else if(hw == GraphicsWnd) { + inTextWindow = false; + } else if(GetForegroundWindow() == TextWnd) { + inTextWindow = true; + } else { + inTextWindow = false; + } + + if(inTextWindow) { + int i; + for(i = 0; i < abs(delta/40); i++) { + HandleTextWindowScrollBar(delta > 0 ? SB_LINEUP : SB_LINEDOWN, 0); + } + } else { + SS.GW.MouseScroll(LastMousePos.x, LastMousePos.y, delta); + } +} + +LRESULT CALLBACK TextWndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) +{ + switch (msg) { + case WM_ERASEBKGND: + break; + + case WM_CLOSE: + case WM_DESTROY: + SolveSpaceUI::MenuFile(GraphicsWindow::MNU_EXIT); + break; + + case WM_PAINT: { + // Actually paint the text window, with gl. + PaintTextWnd(GetDC(TextWnd)); + // And then just make Windows happy. + PAINTSTRUCT ps; + HDC hdc = BeginPaint(hwnd, &ps); + EndPaint(hwnd, &ps); + break; + } + + case WM_SIZING: { + RECT *r = (RECT *)lParam; + int hc = (r->bottom - r->top) - ClientIsSmallerBy; + int extra = hc % (SS.TW.LINE_HEIGHT/2); + switch(wParam) { + case WMSZ_BOTTOM: + case WMSZ_BOTTOMLEFT: + case WMSZ_BOTTOMRIGHT: + r->bottom -= extra; + break; + + case WMSZ_TOP: + case WMSZ_TOPLEFT: + case WMSZ_TOPRIGHT: + r->top += extra; + break; + } + int tooNarrow = (SS.TW.MIN_COLS*SS.TW.CHAR_WIDTH) - + (r->right - r->left); + if(tooNarrow >= 0) { + switch(wParam) { + case WMSZ_RIGHT: + case WMSZ_BOTTOMRIGHT: + case WMSZ_TOPRIGHT: + r->right += tooNarrow; + break; + + case WMSZ_LEFT: + case WMSZ_BOTTOMLEFT: + case WMSZ_TOPLEFT: + r->left -= tooNarrow; + break; + } + } + break; + } + + case WM_MOUSELEAVE: + SS.TW.MouseLeave(); + break; + + case WM_LBUTTONDOWN: + case WM_MOUSEMOVE: { + // We need this in order to get the WM_MOUSELEAVE + TRACKMOUSEEVENT tme = {}; + tme.cbSize = sizeof(tme); + tme.dwFlags = TME_LEAVE; + tme.hwndTrack = TextWnd; + TrackMouseEvent(&tme); + + // And process the actual message + int x = LOWORD(lParam); + int y = HIWORD(lParam); + SS.TW.MouseEvent(msg == WM_LBUTTONDOWN, wParam & MK_LBUTTON, x, y); + break; + } + + case WM_SIZE: { + RECT r; + GetWindowRect(TextWndScrollBar, &r); + int sw = r.right - r.left; + GetClientRect(hwnd, &r); + MoveWindow(TextWndScrollBar, r.right - sw, r.top, sw, + (r.bottom - r.top), true); + // If the window is growing, then the scrollbar position may + // be moving, so it's as if we're dragging the scrollbar. + HandleTextWindowScrollBar((WPARAM)-1, -1); + InvalidateRect(TextWnd, NULL, false); + break; + } + + case WM_MOUSEWHEEL: + MouseWheel(GET_WHEEL_DELTA_WPARAM(wParam)); + break; + + case WM_VSCROLL: + HandleTextWindowScrollBar(wParam, lParam); + break; + + default: + return DefWindowProc(hwnd, msg, wParam, lParam); + } + + return 1; +} + +static std::string EditControlText(HWND hwnd) +{ + std::wstring result; + result.resize(GetWindowTextLength(hwnd)); + GetWindowTextW(hwnd, &result[0], result.length() + 1); + return Narrow(result); +} + +static bool ProcessKeyDown(WPARAM wParam) +{ + if(GraphicsEditControlIsVisible() && wParam != VK_ESCAPE) { + if(wParam == VK_RETURN) { + SS.GW.EditControlDone(EditControlText(GraphicsEditControl).c_str()); + return true; + } else { + return false; + } + } + if(TextEditControlIsVisible() && wParam != VK_ESCAPE) { + if(wParam == VK_RETURN) { + SS.TW.EditControlDone(EditControlText(TextEditControl).c_str()); + } else { + return false; + } + } + + int c; + switch(wParam) { + case VK_OEM_PLUS: c = '+'; break; + case VK_OEM_MINUS: c = '-'; break; + case VK_ESCAPE: c = 27; break; + case VK_OEM_1: c = ';'; break; + case VK_OEM_3: c = '`'; break; + case VK_OEM_4: c = '['; break; + case VK_OEM_6: c = ']'; break; + case VK_OEM_5: c = '\\'; break; + case VK_OEM_PERIOD: c = '.'; break; + case VK_SPACE: c = ' '; break; + case VK_DELETE: c = 127; break; + case VK_TAB: c = '\t'; break; + + case VK_BROWSER_BACK: + case VK_BACK: c = '\b'; break; + + case VK_F1: + case VK_F2: + case VK_F3: + case VK_F4: + case VK_F5: + case VK_F6: + case VK_F7: + case VK_F8: + case VK_F9: + case VK_F10: + case VK_F11: + case VK_F12: c = ((int)wParam - VK_F1) + 0xf1; break; + + // These overlap with some character codes that I'm using, so + // don't let them trigger by accident. + case VK_F16: + case VK_INSERT: + case VK_EXECUTE: + case VK_APPS: + case VK_LWIN: + case VK_RWIN: return false; + + default: + c = (int)wParam; + break; + } + if(GetAsyncKeyState(VK_SHIFT) & 0x8000) c |= GraphicsWindow::SHIFT_MASK; + if(GetAsyncKeyState(VK_CONTROL) & 0x8000) c |= GraphicsWindow::CTRL_MASK; + + switch(c) { + case GraphicsWindow::SHIFT_MASK | '.': c = '>'; break; + } + + for(int i = 0; SS.GW.menu[i].level >= 0; i++) { + if(c == SS.GW.menu[i].accel) { + (SS.GW.menu[i].fn)((GraphicsWindow::MenuId)SS.GW.menu[i].id); + break; + } + } + + if(SS.GW.KeyDown(c)) return true; + + // No accelerator; process the key as normal. + return false; +} + +void SolveSpace::ToggleMenuBar(void) +{ + // Implement me +} +bool SolveSpace::MenuBarIsVisible(void) +{ + // Implement me + return true; +} + +void SolveSpace::ShowTextWindow(bool visible) +{ + ShowWindow(TextWnd, visible ? SW_SHOWNOACTIVATE : SW_HIDE); +} + +static void CreateGlContext(HWND hwnd, HGLRC *glrc) +{ + HDC hdc = GetDC(hwnd); + + PIXELFORMATDESCRIPTOR pfd = {}; + int pixelFormat; + + pfd.nSize = sizeof(PIXELFORMATDESCRIPTOR); + pfd.nVersion = 1; + pfd.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | + PFD_DOUBLEBUFFER; + pfd.dwLayerMask = PFD_MAIN_PLANE; + pfd.iPixelType = PFD_TYPE_RGBA; + pfd.cColorBits = 32; + pfd.cDepthBits = 24; + pfd.cAccumBits = 0; + pfd.cStencilBits = 0; + + pixelFormat = ChoosePixelFormat(hdc, &pfd); + if(!pixelFormat) oops(); + + if(!SetPixelFormat(hdc, pixelFormat, &pfd)) oops(); + + *glrc = wglCreateContext(hdc); + wglMakeCurrent(hdc, *glrc); +} + +void SolveSpace::PaintGraphics(void) +{ + SS.GW.Paint(); + SwapBuffers(GetDC(GraphicsWnd)); +} +void SolveSpace::InvalidateGraphics(void) +{ + InvalidateRect(GraphicsWnd, NULL, false); +} + +void SolveSpace::ToggleFullScreen(void) +{ + // Implement me +} +bool SolveSpace::FullScreenIsActive(void) +{ + // Implement me + return false; +} + +int64_t SolveSpace::GetMilliseconds(void) +{ + LARGE_INTEGER t, f; + QueryPerformanceCounter(&t); + QueryPerformanceFrequency(&f); + LONGLONG d = t.QuadPart/(f.QuadPart/1000); + return (int64_t)d; +} + +int64_t SolveSpace::GetUnixTime(void) +{ +#ifdef __MINGW32__ + time_t ret; + time(&ret); +#else + __time64_t ret; + _time64(&ret); +#endif + return (int64_t)ret; +} + +void SolveSpace::InvalidateText(void) +{ + InvalidateRect(TextWnd, NULL, false); +} + +static void ShowEditControl(HWND h, int x, int y, int fontHeight, int minWidthChars, + bool isMonospace, const std::wstring &s) { + static HFONT hf; + if(hf) DeleteObject(hf); + hf = CreateFontW(-fontHeight, 0, 0, 0, + FW_REGULAR, false, false, false, ANSI_CHARSET, + OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, + DEFAULT_QUALITY, FF_DONTCARE, isMonospace ? L"Lucida Console" : L"Arial"); + if(hf) SendMessage(h, WM_SETFONT, (WPARAM)hf, false); + else SendMessage(h, WM_SETFONT, (WPARAM)(HFONT)GetStockObject(SYSTEM_FONT), false); + SendMessage(h, EM_SETMARGINS, EC_LEFTMARGIN|EC_RIGHTMARGIN, 0); + + HDC hdc = GetDC(h); + TEXTMETRICW tm; + SIZE ts; + SelectObject(hdc, hf); + GetTextMetrics(hdc, &tm); + GetTextExtentPoint32W(hdc, s.c_str(), s.length(), &ts); + ReleaseDC(h, hdc); + + RECT rc; + rc.left = x; + rc.top = y - tm.tmAscent; + // Add one extra char width to avoid scrolling. + rc.right = x + std::max(tm.tmAveCharWidth * minWidthChars, + ts.cx + tm.tmAveCharWidth); + rc.bottom = y + tm.tmDescent; + + AdjustWindowRectEx(&rc, 0, false, WS_EX_CLIENTEDGE); + MoveWindow(h, rc.left, rc.top, rc.right - rc.left, rc.bottom - rc.top, true); + ShowWindow(h, SW_SHOW); + if(!s.empty()) { + SendMessage(h, WM_SETTEXT, 0, (LPARAM)s.c_str()); + SendMessage(h, EM_SETSEL, 0, s.length()); + SetFocus(h); + } +} +void SolveSpace::ShowTextEditControl(int x, int y, const std::string &str) +{ + if(GraphicsEditControlIsVisible()) return; + + ShowEditControl(TextEditControl, x, y, TextWindow::CHAR_HEIGHT, 30, + /*isMonospace=*/true, Widen(str)); +} +void SolveSpace::HideTextEditControl(void) +{ + ShowWindow(TextEditControl, SW_HIDE); +} +bool SolveSpace::TextEditControlIsVisible(void) +{ + return IsWindowVisible(TextEditControl) ? true : false; +} +void SolveSpace::ShowGraphicsEditControl(int x, int y, int fontHeight, int minWidthChars, + const std::string &str) +{ + if(GraphicsEditControlIsVisible()) return; + + RECT r; + GetClientRect(GraphicsWnd, &r); + x = x + (r.right - r.left)/2; + y = (r.bottom - r.top)/2 - y; + + ShowEditControl(GraphicsEditControl, x, y, fontHeight, minWidthChars, + /*isMonospace=*/false, Widen(str)); +} +void SolveSpace::HideGraphicsEditControl(void) +{ + ShowWindow(GraphicsEditControl, SW_HIDE); +} +bool SolveSpace::GraphicsEditControlIsVisible(void) +{ + return IsWindowVisible(GraphicsEditControl) ? true : false; +} + +LRESULT CALLBACK GraphicsWndProc(HWND hwnd, UINT msg, WPARAM wParam, + LPARAM lParam) +{ + switch (msg) { + case WM_ERASEBKGND: + break; + + case WM_SIZE: + InvalidateRect(GraphicsWnd, NULL, false); + break; + + case WM_PAINT: { + // Actually paint the window, with gl. + PaintGraphics(); + // And make Windows happy. + PAINTSTRUCT ps; + HDC hdc = BeginPaint(hwnd, &ps); + EndPaint(hwnd, &ps); + break; + } + + case WM_MOUSELEAVE: + SS.GW.MouseLeave(); + break; + + case WM_MOUSEMOVE: + case WM_LBUTTONDOWN: + case WM_LBUTTONUP: + case WM_LBUTTONDBLCLK: + case WM_RBUTTONDOWN: + case WM_RBUTTONUP: + case WM_MBUTTONDOWN: { + int x = LOWORD(lParam); + int y = HIWORD(lParam); + + // We need this in order to get the WM_MOUSELEAVE + TRACKMOUSEEVENT tme = {}; + tme.cbSize = sizeof(tme); + tme.dwFlags = TME_LEAVE; + tme.hwndTrack = GraphicsWnd; + TrackMouseEvent(&tme); + + // Convert to xy (vs. ij) style coordinates, with (0, 0) at center + RECT r; + GetClientRect(GraphicsWnd, &r); + x = x - (r.right - r.left)/2; + y = (r.bottom - r.top)/2 - y; + + LastMousePos.x = x; + LastMousePos.y = y; + + if(msg == WM_LBUTTONDOWN) { + SS.GW.MouseLeftDown(x, y); + } else if(msg == WM_LBUTTONUP) { + SS.GW.MouseLeftUp(x, y); + } else if(msg == WM_LBUTTONDBLCLK) { + SS.GW.MouseLeftDoubleClick(x, y); + } else if(msg == WM_MBUTTONDOWN || msg == WM_RBUTTONDOWN) { + SS.GW.MouseMiddleOrRightDown(x, y); + } else if(msg == WM_RBUTTONUP) { + SS.GW.MouseRightUp(x, y); + } else if(msg == WM_MOUSEMOVE) { + SS.GW.MouseMoved(x, y, + !!(wParam & MK_LBUTTON), + !!(wParam & MK_MBUTTON), + !!(wParam & MK_RBUTTON), + !!(wParam & MK_SHIFT), + !!(wParam & MK_CONTROL)); + } else { + oops(); + } + break; + } + case WM_MOUSEWHEEL: + MouseWheel(GET_WHEEL_DELTA_WPARAM(wParam)); + break; + + case WM_COMMAND: { + if(HIWORD(wParam) == 0) { + int id = LOWORD(wParam); + if((id >= RECENT_OPEN && id < (RECENT_OPEN + MAX_RECENT))) { + SolveSpaceUI::MenuFile(id); + break; + } + if((id >= RECENT_LINK && id < (RECENT_LINK + MAX_RECENT))) { + Group::MenuGroup(id); + break; + } + int i; + for(i = 0; SS.GW.menu[i].level >= 0; i++) { + if(id == SS.GW.menu[i].id) { + (SS.GW.menu[i].fn)((GraphicsWindow::MenuId)id); + break; + } + } + if(SS.GW.menu[i].level < 0) oops(); + } + break; + } + + case WM_CLOSE: + case WM_DESTROY: + SolveSpaceUI::MenuFile(GraphicsWindow::MNU_EXIT); + return 1; + + default: + return DefWindowProc(hwnd, msg, wParam, lParam); + } + + return 1; +} + +//----------------------------------------------------------------------------- +// Common dialog routines, to open or save a file. +//----------------------------------------------------------------------------- +static std::string ConvertFilters(const FileFilter ssFilters[]) { + std::string filter; + for(const FileFilter *ssFilter = ssFilters; ssFilter->name; ssFilter++) { + std::string desc, patterns; + for(const char *const *ssPattern = ssFilter->patterns; *ssPattern; ssPattern++) { + std::string pattern = "*." + std::string(*ssPattern); + if(desc == "") + desc = pattern; + else + desc += ", " + pattern; + if(patterns == "") + patterns = pattern; + else + patterns += ";" + pattern; + } + filter += std::string(ssFilter->name) + " (" + desc + ")" + '\0'; + filter += patterns + '\0'; + } + filter += '\0'; + return filter; +} + +static bool OpenSaveFile(bool isOpen, std::string *filename, const std::string &defExtension, + const FileFilter filters[]) { + // UNC paths may be as long as 32767 characters. + // Unfortunately, the Get*FileName API does not provide any way to use it + // except with a preallocated buffer of fixed size, so we use something + // reasonably large. + const int len = 32768; + wchar_t filenameC[len] = {}; + wcsncpy(filenameC, Widen(*filename).c_str(), len - 1); + + std::wstring selPatternW = Widen(ConvertFilters(filters)); + std::wstring defExtensionW = Widen(defExtension); + + OPENFILENAME ofn = {}; + ofn.lStructSize = sizeof(ofn); + ofn.hInstance = Instance; + ofn.hwndOwner = GraphicsWnd; + ofn.lpstrFilter = selPatternW.c_str(); + ofn.lpstrDefExt = defExtensionW.c_str(); + ofn.lpstrFile = filenameC; + ofn.nMaxFile = len; + ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST | OFN_HIDEREADONLY; + + EnableWindow(GraphicsWnd, false); + EnableWindow(TextWnd, false); + + BOOL r; + if(isOpen) { + r = GetOpenFileNameW(&ofn); + } else { + r = GetSaveFileNameW(&ofn); + } + + EnableWindow(TextWnd, true); + EnableWindow(GraphicsWnd, true); + SetForegroundWindow(GraphicsWnd); + + if(r) *filename = Narrow(filenameC); + return r ? true : false; +} + +bool SolveSpace::GetOpenFile(std::string *filename, const std::string &defExtension, + const FileFilter filters[]) +{ + return OpenSaveFile(true, filename, defExtension, filters); +} + +bool SolveSpace::GetSaveFile(std::string *filename, const std::string &defExtension, + const FileFilter filters[]) +{ + return OpenSaveFile(false, filename, defExtension, filters); +} + +DialogChoice SolveSpace::SaveFileYesNoCancel(void) +{ + EnableWindow(GraphicsWnd, false); + EnableWindow(TextWnd, false); + + int r = MessageBoxW(GraphicsWnd, + L"The file has changed since it was last saved.\n\n" + L"Do you want to save the changes?", L"SolveSpace", + MB_YESNOCANCEL | MB_ICONWARNING); + + EnableWindow(TextWnd, true); + EnableWindow(GraphicsWnd, true); + SetForegroundWindow(GraphicsWnd); + + switch(r) { + case IDYES: + return DIALOG_YES; + case IDNO: + return DIALOG_NO; + case IDCANCEL: + default: + return DIALOG_CANCEL; + } +} + +DialogChoice SolveSpace::LoadAutosaveYesNo(void) +{ + EnableWindow(GraphicsWnd, false); + EnableWindow(TextWnd, false); + + int r = MessageBoxW(GraphicsWnd, + L"An autosave file is availible for this project.\n\n" + L"Do you want to load the autosave file instead?", L"SolveSpace", + MB_YESNO | MB_ICONWARNING); + + EnableWindow(TextWnd, true); + EnableWindow(GraphicsWnd, true); + SetForegroundWindow(GraphicsWnd); + + switch (r) { + case IDYES: + return DIALOG_YES; + case IDNO: + default: + return DIALOG_NO; + } +} + +DialogChoice SolveSpace::LocateImportedFileYesNoCancel(const std::string &filename, + bool canCancel) { + EnableWindow(GraphicsWnd, false); + EnableWindow(TextWnd, false); + + std::string message = + "The linked file " + filename + " is not present.\n\n" + "Do you want to locate it manually?\n\n" + "If you select \"No\", any geometry that depends on " + "the missing file will be removed."; + + int r = MessageBoxW(GraphicsWnd, Widen(message).c_str(), L"SolveSpace", + (canCancel ? MB_YESNOCANCEL : MB_YESNO) | MB_ICONWARNING); + + EnableWindow(TextWnd, true); + EnableWindow(GraphicsWnd, true); + SetForegroundWindow(GraphicsWnd); + + switch(r) { + case IDYES: + return DIALOG_YES; + case IDNO: + return DIALOG_NO; + case IDCANCEL: + default: + return DIALOG_CANCEL; + } +} + +std::vector SolveSpace::GetFontFiles() { + std::vector fonts; + + std::wstring fontsDir(MAX_PATH, '\0'); + fontsDir.resize(GetWindowsDirectoryW(&fontsDir[0], fontsDir.length())); + fontsDir += L"\\fonts\\"; + + WIN32_FIND_DATA wfd; + HANDLE h = FindFirstFileW((fontsDir + L"*").c_str(), &wfd); + while(h != INVALID_HANDLE_VALUE) { + fonts.push_back(Narrow(fontsDir) + Narrow(wfd.cFileName)); + if(!FindNextFileW(h, &wfd)) break; + } + + return fonts; +} + +static void MenuById(int id, bool yes, bool check) +{ + int i; + int subMenu = -1; + + for(i = 0; SS.GW.menu[i].level >= 0; i++) { + if(SS.GW.menu[i].level == 0) subMenu++; + + if(SS.GW.menu[i].id == id) { + if(subMenu < 0) oops(); + if(subMenu >= (int)arraylen(SubMenus)) oops(); + + if(check) { + CheckMenuItem(SubMenus[subMenu], id, + yes ? MF_CHECKED : MF_UNCHECKED); + } else { + EnableMenuItem(SubMenus[subMenu], id, + yes ? MF_ENABLED : MF_GRAYED); + } + return; + } + } + oops(); +} +void SolveSpace::CheckMenuById(int id, bool checked) +{ + MenuById(id, checked, true); +} +void SolveSpace::RadioMenuById(int id, bool selected) +{ + // Windows does not natively support radio-button menu items + MenuById(id, selected, true); +} +void SolveSpace::EnableMenuById(int id, bool enabled) +{ + MenuById(id, enabled, false); +} +static void DoRecent(HMENU m, int base) +{ + while(DeleteMenu(m, 0, MF_BYPOSITION)) + ; + int i, c = 0; + for(i = 0; i < MAX_RECENT; i++) { + if(!RecentFile[i].empty()) { + AppendMenuW(m, MF_STRING, base + i, Widen(RecentFile[i]).c_str()); + c++; + } + } + if(c == 0) AppendMenuW(m, MF_STRING | MF_GRAYED, 0, L"(no recent files)"); +} +void SolveSpace::RefreshRecentMenus(void) +{ + DoRecent(RecentOpenMenu, RECENT_OPEN); + DoRecent(RecentImportMenu, RECENT_LINK); +} + +HMENU CreateGraphicsWindowMenus(void) +{ + HMENU top = CreateMenu(); + HMENU m = 0; + + int i; + int subMenu = 0; + + for(i = 0; SS.GW.menu[i].level >= 0; i++) { + std::string label; + if(SS.GW.menu[i].label) { + std::string accel = MakeAcceleratorLabel(SS.GW.menu[i].accel); + const char *sep = accel.empty() ? "" : "\t"; + label = ssprintf("%s%s%s", SS.GW.menu[i].label, sep, accel.c_str()); + } + + if(SS.GW.menu[i].level == 0) { + m = CreateMenu(); + AppendMenuW(top, MF_STRING | MF_POPUP, (UINT_PTR)m, Widen(label).c_str()); + if(subMenu >= (int)arraylen(SubMenus)) oops(); + SubMenus[subMenu] = m; + subMenu++; + } else if(SS.GW.menu[i].level == 1) { + if(SS.GW.menu[i].id == GraphicsWindow::MNU_OPEN_RECENT) { + RecentOpenMenu = CreateMenu(); + AppendMenuW(m, MF_STRING | MF_POPUP, + (UINT_PTR)RecentOpenMenu, Widen(label).c_str()); + } else if(SS.GW.menu[i].id == GraphicsWindow::MNU_GROUP_RECENT) { + RecentImportMenu = CreateMenu(); + AppendMenuW(m, MF_STRING | MF_POPUP, + (UINT_PTR)RecentImportMenu, Widen(label).c_str()); + } else if(SS.GW.menu[i].label) { + AppendMenuW(m, MF_STRING, SS.GW.menu[i].id, Widen(label).c_str()); + } else { + AppendMenuW(m, MF_SEPARATOR, SS.GW.menu[i].id, L""); + } + } else oops(); + } + RefreshRecentMenus(); + + return top; +} + +static void CreateMainWindows(void) +{ + WNDCLASSEX wc = {}; + + wc.cbSize = sizeof(wc); + + // The graphics window, where the sketch is drawn and shown. + wc.style = CS_BYTEALIGNCLIENT | CS_BYTEALIGNWINDOW | CS_OWNDC | + CS_DBLCLKS; + wc.lpfnWndProc = (WNDPROC)GraphicsWndProc; + wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); + wc.lpszClassName = L"GraphicsWnd"; + wc.lpszMenuName = NULL; + wc.hCursor = LoadCursor(NULL, IDC_ARROW); + wc.hIcon = (HICON)LoadImage(Instance, MAKEINTRESOURCE(4000), + IMAGE_ICON, 32, 32, 0); + wc.hIconSm = (HICON)LoadImage(Instance, MAKEINTRESOURCE(4000), + IMAGE_ICON, 16, 16, 0); + if(!RegisterClassEx(&wc)) oops(); + + HMENU top = CreateGraphicsWindowMenus(); + GraphicsWnd = CreateWindowExW(0, L"GraphicsWnd", + L"SolveSpace (not yet saved)", + WS_OVERLAPPED | WS_THICKFRAME | WS_CLIPCHILDREN | WS_MAXIMIZEBOX | + WS_MINIMIZEBOX | WS_SYSMENU | WS_SIZEBOX | WS_CLIPSIBLINGS, + 50, 50, 900, 600, NULL, top, Instance, NULL); + if(!GraphicsWnd) oops(); + + GraphicsEditControl = CreateWindowExW(WS_EX_CLIENTEDGE, WC_EDIT, L"", + WS_CHILD | ES_AUTOHSCROLL | WS_TABSTOP | WS_CLIPSIBLINGS, + 50, 50, 100, 21, GraphicsWnd, NULL, Instance, NULL); + + // The text window, with a comand line and some textual information + // about the sketch. + wc.style &= ~CS_DBLCLKS; + wc.lpfnWndProc = (WNDPROC)TextWndProc; + wc.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH); + wc.lpszClassName = L"TextWnd"; + wc.hCursor = NULL; + if(!RegisterClassEx(&wc)) oops(); + + // We get the desired Alt+Tab behaviour by specifying that the text + // window is a child of the graphics window. + TextWnd = CreateWindowExW(0, + L"TextWnd", L"SolveSpace - Property Browser", WS_THICKFRAME | WS_CLIPCHILDREN, + 650, 500, 420, 300, GraphicsWnd, (HMENU)NULL, Instance, NULL); + if(!TextWnd) oops(); + + TextWndScrollBar = CreateWindowExW(0, WC_SCROLLBAR, L"", WS_CHILD | + SBS_VERT | SBS_LEFTALIGN | WS_VISIBLE | WS_CLIPSIBLINGS, + 200, 100, 100, 100, TextWnd, NULL, Instance, NULL); + // Force the scrollbar to get resized to the window, + TextWndProc(TextWnd, WM_SIZE, 0, 0); + + TextEditControl = CreateWindowExW(WS_EX_CLIENTEDGE, WC_EDIT, L"", + WS_CHILD | ES_AUTOHSCROLL | WS_TABSTOP | WS_CLIPSIBLINGS, + 50, 50, 100, 21, TextWnd, NULL, Instance, NULL); + + // Now that all our windows exist, set up gl contexts. + CreateGlContext(TextWnd, &TextGl); + CreateGlContext(GraphicsWnd, &GraphicsGl); + + RECT r, rc; + GetWindowRect(TextWnd, &r); + GetClientRect(TextWnd, &rc); + ClientIsSmallerBy = (r.bottom - r.top) - (rc.bottom - rc.top); +} + +#ifdef HAVE_SPACEWARE +//----------------------------------------------------------------------------- +// Test if a message comes from the SpaceNavigator device. If yes, dispatch +// it appropriately and return true. Otherwise, do nothing and return false. +//----------------------------------------------------------------------------- +static bool ProcessSpaceNavigatorMsg(MSG *msg) { + if(SpaceNavigator == SI_NO_HANDLE) return false; + + SiGetEventData sged; + SiSpwEvent sse; + + SiGetEventWinInit(&sged, msg->message, msg->wParam, msg->lParam); + int ret = SiGetEvent(SpaceNavigator, 0, &sged, &sse); + if(ret == SI_NOT_EVENT) return false; + // So the device is a SpaceNavigator event, or a SpaceNavigator error. + + if(ret == SI_IS_EVENT) { + if(sse.type == SI_MOTION_EVENT) { + // The Z axis translation and rotation are both + // backwards in the default mapping. + double tx = sse.u.spwData.mData[SI_TX]*1.0, + ty = sse.u.spwData.mData[SI_TY]*1.0, + tz = -sse.u.spwData.mData[SI_TZ]*1.0, + rx = sse.u.spwData.mData[SI_RX]*0.001, + ry = sse.u.spwData.mData[SI_RY]*0.001, + rz = -sse.u.spwData.mData[SI_RZ]*0.001; + SS.GW.SpaceNavigatorMoved(tx, ty, tz, rx, ry, rz, + !!(GetAsyncKeyState(VK_SHIFT) & 0x8000)); + } else if(sse.type == SI_BUTTON_EVENT) { + int button; + button = SiButtonReleased(&sse); + if(button == SI_APP_FIT_BUTTON) SS.GW.SpaceNavigatorButtonUp(); + } + } + return true; +} +#endif // HAVE_SPACEWARE + +//----------------------------------------------------------------------------- +// Entry point into the program. +//----------------------------------------------------------------------------- +int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, + LPSTR lpCmdLine, INT nCmdShow) +{ + Instance = hInstance; + + InitCommonControls(); + + // A monospaced font + FixedFont = CreateFontW(SS.TW.CHAR_HEIGHT, SS.TW.CHAR_WIDTH, 0, 0, + FW_REGULAR, false, + false, false, ANSI_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, + DEFAULT_QUALITY, FF_DONTCARE, L"Lucida Console"); + if(!FixedFont) + FixedFont = (HFONT)GetStockObject(SYSTEM_FONT); + + // Create the root windows: one for control, with text, and one for + // the graphics + CreateMainWindows(); + + ThawWindowPos(TextWnd, "TextWnd"); + ThawWindowPos(GraphicsWnd, "GraphicsWnd"); + + ShowWindow(TextWnd, SW_SHOWNOACTIVATE); + ShowWindow(GraphicsWnd, SW_SHOW); + + glClearColor(0, 0, 0, 1); + glClear(GL_COLOR_BUFFER_BIT); + SwapBuffers(GetDC(GraphicsWnd)); + glClearColor(0, 0, 0, 1); + glClear(GL_COLOR_BUFFER_BIT); + SwapBuffers(GetDC(GraphicsWnd)); + + // Create the heaps for all dynamic memory (AllocTemporary, MemAlloc) + InitHeaps(); + + // Pull out the Unicode command line. + int argc; + LPWSTR *argv = CommandLineToArgvW(GetCommandLineW(), &argc); + + // A filename may have been specified on the command line; if so, then + // strip any quotation marks, and make it absolute. + std::wstring filenameRel, filename; + if(argc >= 2) { + filenameRel = argv[1]; + if(filenameRel[0] == L'\"' && filenameRel[filenameRel.length() - 1] == L'\"') { + filenameRel.erase(0, 1); + filenameRel.erase(filenameRel.length() - 1, 1); + } + + DWORD len = GetFullPathNameW(&filenameRel[0], 0, NULL, NULL); + filename.resize(len - 1); + GetFullPathNameW(&filenameRel[0], len, &filename[0], NULL); + } + +#ifdef HAVE_SPACEWARE + // Initialize the SpaceBall, if present. Test if the driver is running + // first, to avoid a long timeout if it's not. + HWND swdc = FindWindowW(L"SpaceWare Driver Class", NULL); + if(swdc != NULL) { + SiOpenData sod; + SiInitialize(); + SiOpenWinInit(&sod, GraphicsWnd); + SpaceNavigator = + SiOpen("GraphicsWnd", SI_ANY_DEVICE, SI_NO_MASK, SI_EVENT, &sod); + SiSetUiMode(SpaceNavigator, SI_UI_NO_CONTROLS); + } +#endif + + // Call in to the platform-independent code, and let them do their init + SS.Init(); + if(!filename.empty()) + SS.OpenFile(Narrow(filename)); + + // And now it's the message loop. All calls in to the rest of the code + // will be from the wndprocs. + MSG msg; + DWORD ret; + while((ret = GetMessage(&msg, NULL, 0, 0)) != 0) { +#ifdef HAVE_SPACEWARE + // Is it a message from the six degree of freedom input device? + if(ProcessSpaceNavigatorMsg(&msg)) goto done; +#endif + + // A message from the keyboard, which should be processed as a keyboard + // accelerator? + if(msg.message == WM_KEYDOWN) { + if(ProcessKeyDown(msg.wParam)) goto done; + } + if(msg.message == WM_SYSKEYDOWN && msg.hwnd == TextWnd) { + // If the user presses the Alt key when the text window has focus, + // then that should probably go to the graphics window instead. + SetForegroundWindow(GraphicsWnd); + } + + // None of the above; so just a normal message to process. + TranslateMessage(&msg); + DispatchMessage(&msg); +done: + SS.DoLater(); + } + +#ifdef HAVE_SPACEWARE + if(swdc != NULL) { + if(SpaceNavigator != SI_NO_HANDLE) SiClose(SpaceNavigator); + SiTerminate(); + } +#endif + + // Write everything back to the registry + FreezeWindowPos(TextWnd, "TextWnd"); + FreezeWindowPos(GraphicsWnd, "GraphicsWnd"); + + // Free the memory we've used; anything that remains is a leak. + SK.Clear(); + SS.Clear(); + + return 0; +} diff --git a/src/win32/w32util.cpp b/src/win32/w32util.cpp new file mode 100644 index 0000000..cba9c78 --- /dev/null +++ b/src/win32/w32util.cpp @@ -0,0 +1,138 @@ +//----------------------------------------------------------------------------- +// Utility functions that depend on Win32. Notably, our memory allocation; +// we use two separate allocators, one for long-lived stuff and one for +// stuff that gets freed after every regeneration of the model, to save us +// the trouble of freeing the latter explicitly. +// +// Copyright 2008-2013 Jonathan Westhues. +//----------------------------------------------------------------------------- +#include "solvespace.h" + +namespace SolveSpace { +static HANDLE PermHeap, TempHeap; + +void dbp(const char *str, ...) +{ + va_list f; + static char buf[1024*50]; + va_start(f, str); + _vsnprintf(buf, sizeof(buf), str, f); + va_end(f); + + // The native version of OutputDebugString, unlike most others, + // is OutputDebugStringA. + OutputDebugStringA(buf); +} + +std::string Narrow(const wchar_t *in) +{ + std::string out; + DWORD len = WideCharToMultiByte(CP_UTF8, 0, in, -1, NULL, 0, NULL, NULL); + out.resize(len - 1); + if(!WideCharToMultiByte(CP_UTF8, 0, in, -1, &out[0], len, NULL, NULL)) + oops(); + return out; +} + +std::string Narrow(const std::wstring &in) +{ + if(in == L"") return ""; + + std::string out; + out.resize(WideCharToMultiByte(CP_UTF8, 0, &in[0], in.length(), NULL, 0, NULL, NULL)); + if(!WideCharToMultiByte(CP_UTF8, 0, &in[0], in.length(), + &out[0], out.length(), NULL, NULL)) + oops(); + return out; +} + +std::wstring Widen(const char *in) +{ + std::wstring out; + DWORD len = MultiByteToWideChar(CP_UTF8, 0, in, -1, NULL, 0); + out.resize(len - 1); + if(!MultiByteToWideChar(CP_UTF8, 0, in, -1, &out[0], len)) + oops(); + return out; +} + +std::wstring Widen(const std::string &in) +{ + if(in == "") return L""; + + std::wstring out; + out.resize(MultiByteToWideChar(CP_UTF8, 0, &in[0], in.length(), NULL, 0)); + if(!MultiByteToWideChar(CP_UTF8, 0, &in[0], in.length(), &out[0], out.length())) + oops(); + return out; +} + +static std::string MakeUNCFilename(const std::string &filename) +{ + // Prepend \\?\ UNC prefix unless already an UNC path. + // We never try to fopen paths that are not absolute or + // contain separators inappropriate for the platform; + // thus, it is always safe to prepend this prefix. + std::string uncFilename = filename; + if(uncFilename.substr(0, 2) != "\\\\") + uncFilename = "\\\\?\\" + uncFilename; + return uncFilename; +} + +FILE *ssfopen(const std::string &filename, const char *mode) +{ + if(filename.length() != strlen(filename.c_str())) oops(); + return _wfopen(Widen(MakeUNCFilename(filename)).c_str(), Widen(mode).c_str()); +} + +void ssremove(const std::string &filename) +{ + if(filename.length() != strlen(filename.c_str())) oops(); + _wremove(Widen(filename).c_str()); +} + +//----------------------------------------------------------------------------- +// A separate heap, on which we allocate expressions. Maybe a bit faster, +// since no fragmentation issues whatsoever, and it also makes it possible +// to be sloppy with our memory management, and just free everything at once +// at the end. +//----------------------------------------------------------------------------- +void *AllocTemporary(size_t n) +{ + void *v = HeapAlloc(TempHeap, HEAP_NO_SERIALIZE | HEAP_ZERO_MEMORY, n); + if(!v) oops(); + return v; +} +void FreeTemporary(void *p) { + HeapFree(TempHeap, HEAP_NO_SERIALIZE, p); +} +void FreeAllTemporary(void) +{ + if(TempHeap) HeapDestroy(TempHeap); + TempHeap = HeapCreate(HEAP_NO_SERIALIZE, 1024*1024*20, 0); + // This is a good place to validate, because it gets called fairly + // often. + vl(); +} + +void *MemAlloc(size_t n) { + void *p = HeapAlloc(PermHeap, HEAP_NO_SERIALIZE | HEAP_ZERO_MEMORY, n); + if(!p) oops(); + return p; +} +void MemFree(void *p) { + HeapFree(PermHeap, HEAP_NO_SERIALIZE, p); +} + +void vl(void) { + if(!HeapValidate(TempHeap, HEAP_NO_SERIALIZE, NULL)) oops(); + if(!HeapValidate(PermHeap, HEAP_NO_SERIALIZE, NULL)) oops(); +} + +void InitHeaps(void) { + // Create the heap used for long-lived stuff (that gets freed piecewise). + PermHeap = HeapCreate(HEAP_NO_SERIALIZE, 1024*1024*20, 0); + // Create the heap that we use to store Exprs and other temp stuff. + FreeAllTemporary(); +} +} diff --git a/tools/CMakeLists.txt b/tools/CMakeLists.txt new file mode 100644 index 0000000..93fb750 --- /dev/null +++ b/tools/CMakeLists.txt @@ -0,0 +1,23 @@ +include_directories( + ${PNG_INCLUDE_DIRS}) + +link_directories( + ${PNG_LIBRARY_DIRS}) + +add_executable(png2c + png2c.cpp) + +target_link_libraries(png2c + ${PNG_LIBRARIES}) + +add_executable(unifont2c + unifont2c.cpp) + +target_link_libraries(unifont2c + ${PNG_LIBRARIES} ${ZLIB_LIBRARIES}) + +add_executable(lff2c + lff2c.cpp) + +target_link_libraries(lff2c + ${ZLIB_LIBRARIES}) diff --git a/tools/lff2c.cpp b/tools/lff2c.cpp new file mode 100644 index 0000000..098fd0a --- /dev/null +++ b/tools/lff2c.cpp @@ -0,0 +1,410 @@ +#define _USE_MATH_DEFINES +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define TOLERANCE 1e-6 + +double correctAngle(double a) { + return M_PI + remainder(a - M_PI, 2 * M_PI); +} + +struct Point { + double x; + double y; + + Point operator+(const Point &o) const { return { x + o.x, y + o.y }; } + Point operator-(const Point &o) const { return { x - o.x, y - o.y }; } + Point operator*(const Point &o) const { return { x * o.x, y * o.y }; } + Point operator/(const Point &o) const { return { x / o.x, y / o.y }; } + + Point operator*(double k) const { return { x * k, y * k }; } + Point operator/(double k) const { return { x / k, y / k }; } + + double length() const{ + return sqrt(x * x + y * y); + } + + double angle() const { + return correctAngle(atan2(y, x)); + } + + double distanceTo(const Point &v) const { + return (*this - v).length(); + } + + double angleTo(const Point &v) const { + return (v - *this).angle(); + } + + static Point polar(double radius, double angle) { + return { radius * cos(angle), radius * sin(angle) }; + } + + bool operator==(const Point &o) const { return x == o.x && y == o.y; } + bool operator!=(const Point &o) const { return x != o.x || y != o.y; } + +}; + +struct Curve { + std::vector points; +}; + +struct Glyph { + char32_t character; + char32_t baseCharacter; + std::vector curves; + + void getHorizontalBounds(double *rminx, double *rmaxx) const { + double minx = 0; + double maxx = 0; + if(!curves.empty()) { + minx = curves[0].points[0].x; + maxx = minx; + for(const Curve &c : curves) { + for(const Point &p : c.points) { + maxx = std::max(maxx, p.x); + minx = std::min(minx, p.x); + } + } + } + if(rminx) *rminx = minx; + if(rmaxx) *rmaxx = maxx; + } + + void getVerticalBounds(double *rminy, double *rmaxy) const { + double miny = 0; + double maxy = 0; + if(!curves.empty()) { + miny = curves[0].points[0].y; + maxy = miny; + for(const Curve &c : curves) { + for(const Point &p : c.points) { + maxy = std::max(maxy, p.y); + miny = std::min(miny, p.y); + } + } + } + if(rminy) *rminy = miny; + if(rmaxy) *rmaxy = maxy; + } + + void getHorizontalMetrics(double *leftSideBearing, double *boundingWidth) const { + double minx, maxx; + getHorizontalBounds(&minx, &maxx); + *leftSideBearing = minx; + *boundingWidth = maxx - minx; + } + + bool operator<(const Glyph &o) const { return character < o.character; } +}; + +struct Font { + double letterSpacing; + double wordSpacing; + std::vector glyphs; + + const Glyph &findGlyph(char32_t character) { + return *std::find_if(glyphs.begin(), glyphs.end(), + [&](const Glyph &g) { return g.character == character; }); + } + + void getGlyphBound(double *rminw, double *rminh, double *rmaxw, double *rmaxh) { + if(glyphs.empty()) { + *rminw = 0.0; + *rmaxw = 0.0; + *rminh = 0.0; + *rmaxh = 0.0; + return; + } + + glyphs[0].getHorizontalBounds(rminw, rmaxw); + glyphs[0].getVerticalBounds(rminh, rmaxh); + for(const Glyph &g : glyphs) { + double minw, minh, maxw, maxh; + g.getHorizontalBounds(&minw, &maxw); + g.getVerticalBounds(&minh, &maxh); + *rminw = std::min(*rminw, minw); + *rminh = std::min(*rminh, minh); + *rmaxw = std::max(*rmaxw, maxw); + *rmaxh = std::max(*rmaxh, maxh); + } + } + + void createArc(Curve &curve, const Point &cp, double radius, + double a1, double a2, bool reversed) { + if (radius < 1e-6) return; + + double aSign = 1.0; + if(reversed) { + if(a1 <= a2 + TOLERANCE) a1 += 2.0 * M_PI; + aSign = -1.0; + } else { + if(a2 <= a1 + TOLERANCE) a2 += 2.0 * M_PI; + } + + // Angle Step (rad) + double da = fabs(a2 - a1); + int numPoints = 8; + double aStep = aSign * da / double(numPoints); + + for(int i = 0; i <= numPoints; i++) { + curve.points.push_back(cp + Point::polar(radius, a1 + aStep * i)); + } + } + + void createBulge(const Point &v, double bulge, Curve &curve) { + bool reversed = bulge < 0.0; + double alpha = atan(bulge) * 4.0; + Point &point = curve.points.back(); + + Point middle = (point + v) / 2.0; + double dist = point.distanceTo(v) / 2.0; + double angle = point.angleTo(v); + + // alpha can't be 0.0 at this point + double radius = fabs(dist / sin(alpha / 2.0)); + double wu = fabs(radius*radius - dist*dist); + double h = sqrt(wu); + + if(bulge > 0.0) { + angle += M_PI_2; + } else { + angle -= M_PI_2; + } + + if (fabs(alpha) > M_PI) { + h *= -1.0; + } + + Point center = Point::polar(h, angle); + center = center + middle; + + double a1 = center.angleTo(point); + double a2 = center.angleTo(v); + createArc(curve, center, radius, a1, a2, reversed); + } + + void readLff(const std::string &path) { + gzFile lfffont = gzopen(path.c_str(), "rb"); + if(!lfffont) { + std::cerr << path << ": gzopen failed" << std::endl; + std::exit(1); + } + + // Read line by line until we find a new letter: + Glyph *currentGlyph = nullptr; + while(!gzeof(lfffont)) { + std::string line; + do { + char buf[128] = {0}; + if(!gzgets(lfffont, buf, sizeof(buf))) + break; + line += buf; + } while(line.back() != '\n'); + + if(line.empty() || line[0] == '\n') { + continue; + } else if(line[0] == '#') { + // This is comment or metadata. + std::istringstream ss(line.substr(1)); + + std::vector tokens; + while(!ss.eof()) { + std::string token; + std::getline(ss, token, ':'); + std::istringstream(token) >> token; // trim + if(!token.empty()) + tokens.push_back(token); + } + + // If not in form of "a:b" then it's not metadata, just a comment. + if (tokens.size() != 2) + continue; + + std::string &identifier = tokens[0]; + std::string &value = tokens[1]; + + std::transform(identifier.begin(), identifier.end(), identifier.begin(), + ::tolower); + if (identifier == "letterspacing") { + std::istringstream(value) >> letterSpacing; + } else if (identifier == "wordspacing") { + std::istringstream(value) >> wordSpacing; + } else if (identifier == "linespacingfactor") { + /* don't care */ + } else if (identifier == "author") { + /* don't care */ + } else if (identifier == "name") { + /* don't care */ + } else if (identifier == "license") { + /* don't care */ + } else if (identifier == "encoding") { + /* don't care */ + } else if (identifier == "created") { + /* don't care */ + } + } else if(line[0] == '[') { + // This is a glyph. + size_t closingPos; + char32_t chr = std::stoi(line.substr(1), &closingPos, 16);; + if(line[closingPos + 1] != ']') { + std::cerr << "unrecognized character number: " << line << std::endl; + currentGlyph = nullptr; + continue; + } + + glyphs.emplace_back(); + currentGlyph = &glyphs.back(); + currentGlyph->character = chr; + currentGlyph->baseCharacter = 0; + } else if(currentGlyph != nullptr) { + if (line[0] == 'C') { + // This is a reference to another glyph. + currentGlyph->baseCharacter = std::stoi(line.substr(1), nullptr, 16); + } else { + // This is a series of curves. + currentGlyph->curves.emplace_back(); + Curve &curve = currentGlyph->curves.back(); + + std::stringstream ss(line); + while (!ss.eof()) { + std::string vertex; + std::getline(ss, vertex, ';'); + + std::stringstream ssv(vertex); + std::string coord; + Point p; + + if(!std::getline(ssv, coord, ',')) continue; + p.x = std::stod(coord); + + if(!std::getline(ssv, coord, ',')) continue; + p.y = std::stod(coord); + + if(!std::getline(ssv, coord, ',') || coord[0] != 'A') { + // This is just a point. + curve.points.push_back(p); + } else { + // This is a point with a bulge. + double bulge = std::stod(coord.substr(1)); + createBulge(p, bulge, curve); + } + } + } + } else { + std::cerr << "unrecognized line: " << line << std::endl; + } + } + gzclose(lfffont); + } + + void writeCppHeader(const std::string &hName) { + std::sort(glyphs.begin(), glyphs.end()); + + std::ofstream ts(hName, std::ios::out); + + double minX, minY, maxX, maxY; + getGlyphBound(&minX, &minY, &maxX, &maxY); + + double size = 32766.0; + double scale = size / std::max({ fabs(maxX), fabs(minX), fabs(maxY), fabs(minY) }); + + double capHeight, ascender, descender; + findGlyph('A').getVerticalBounds(nullptr, &capHeight); + findGlyph('h').getVerticalBounds(nullptr, &ascender); + findGlyph('p').getVerticalBounds(&descender, nullptr); + + // We use tabs for indentation here to make compilation slightly faster + ts << + "/**** This is a generated file - do not edit ****/\n\n" + "#ifndef __VECTORFONT_TABLE_H\n" + "#define __VECTORFONT_TABLE_H\n" + "\n" + "#define PEN_UP 32767\n" + "#define UP PEN_UP\n" + "\n" + "#define FONT_CAP_HEIGHT ((int16_t)" << (int)floor(capHeight * scale) << ")\n" << + "#define FONT_ASCENDER ((int16_t)" << (int)floor(ascender * scale) << ")\n" << + "#define FONT_DESCENDER ((int16_t)" << (int)floor(descender * scale) << ")\n" << + "#define FONT_SIZE (FONT_ASCENDER-FONT_DESCENDER)\n" + "\n" + "struct VectorGlyph {\n" + "\tchar32_t character;\n" + "\tchar32_t baseCharacter;\n" + "\tint leftSideBearing;\n" + "\tint boundingWidth;\n" + "\tint advanceWidth;\n" + "\tconst int16_t *data;\n" + "};\n" + "\n" + "const int16_t VectorFontData[] = {\n" + "\tUP, UP,\n"; + + std::map glyphIndexes; + size_t index = 2; + for(const Glyph &g : glyphs) { + ts << "\t// U+" << std::hex << g.character << std::dec << "\n"; + glyphIndexes[g.character] = index; + for(const Curve &c : g.curves) { + for(const Point &p : c.points) { + ts << "\t" << (int)floor(p.x * scale) << ", " << + (int)floor(p.y * scale) << ",\n"; + index += 2; + } + ts << "\tUP, UP,\n"; + index += 2; + } + ts << "\tUP, UP,\n"; // end-of-glyph marker + index += 2; + } + + ts << + "};\n" + "\n" + "const VectorGlyph VectorFont[] = {\n" + "\t// U+20\n" + "\t{ 32, 0, 0, 0, " << (int)floor(wordSpacing * scale) << ", &VectorFontData[0] },\n"; + + for(const Glyph &g : glyphs) { + double leftSideBearing, boundingWidth; + g.getHorizontalMetrics(&leftSideBearing, &boundingWidth); + + ts << "\t// U+" << std::hex << g.character << std::dec << "\n"; + ts << "\t{ " << g.character << ", " + << g.baseCharacter << ", " + << (int)floor(leftSideBearing * scale) << ", " + << (int)floor(boundingWidth * scale) << ", " + << (int)floor((leftSideBearing + boundingWidth + + letterSpacing) * scale) << ", "; + ts << "&VectorFontData[" << glyphIndexes[g.character] << "] },\n"; + } + + ts << + "};\n" + "\n" + "#undef UP\n" + "\n" + "#endif\n"; + } +}; + +int main(int argc, char** argv) { + if(argc != 3) { + std::cerr << "Usage: " << argv[0] << "
\n" << std::endl; + return 1; + } + + Font font; + font.readLff(argv[2]); + font.writeCppHeader(argv[1]); + + return 0; +} diff --git a/tools/png2c.cpp b/tools/png2c.cpp new file mode 100644 index 0000000..49d2249 --- /dev/null +++ b/tools/png2c.cpp @@ -0,0 +1,122 @@ +#include +#include +#include +#include +#include + +#define die(msg) do { fprintf(stderr, "%s\n", msg); abort(); } while(0) + +void write_png(FILE *out, const char *filename) { + FILE *fp = fopen(filename, "rb"); + if (!fp) + die("png fopen failed"); + + png_byte header[8] = {}; + if(fread(header, 1, 8, fp) != 8) + die("png fread failed"); + + if(png_sig_cmp(header, 0, 8)) + die("png_sig_cmp failed"); + + png_structp png = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL); + if(!png) + die("png_create_read_struct failed"); + + png_set_expand(png); + png_set_strip_alpha(png); + + png_infop png_info = png_create_info_struct(png); + if (!png_info) + die("png_create_info_struct failed"); + + if (setjmp(png_jmpbuf(png))) + die("png_init_io failed"); + + png_init_io(png, fp); + png_set_sig_bytes(png, 8); + + png_read_info(png, png_info); + + int width = png_get_image_width(png, png_info); + int height = png_get_image_height(png, png_info); + if(width != 24 || height != 24) + die("not a 24x24 png"); + + png_read_update_info(png, png_info); + + if (setjmp(png_jmpbuf(png))) + die("png_read_image failed"); + + png_bytepp image = (png_bytepp) malloc(sizeof(png_bytep) * height); + for (int y = 0; y < height; y++) + image[y] = (png_bytep) malloc(png_get_rowbytes(png, png_info)); + + png_read_image(png, (png_bytepp) image); + + for(int y = height - 1; y >= 0; y--) { + for(int x = 0; x < (int)png_get_rowbytes(png, png_info); x += 3) { + unsigned char r = image[y][x + 0], + g = image[y][x + 1], + b = image[y][x + 2]; + + if(r + g + b < 11) + r = g = b = 30; + fprintf(out, " 0x%02x, 0x%02x, 0x%02x,\n", r, g, b); + } + } + + for (int y = 0; y < height; y++) + free(image[y]); + free(image); + + fclose(fp); + + png_destroy_read_struct(&png, &png_info, NULL); +} + +int main(int argc, char** argv) { + if(argc < 3) { + fprintf(stderr, "Usage: %s
...\n", + argv[0]); + return 1; + } + + FILE *source = fopen(argv[1], "wt"); + if(!source) + die("source fopen failed"); + + FILE *header = fopen(argv[2], "wt"); + if(!header) + die("header fopen failed"); + + fprintf(source, "/**** This is a generated file - do not edit ****/\n\n"); + fprintf(header, "/**** This is a generated file - do not edit ****/\n\n"); + + for(int i = 3; i < argc; i++) { + const char *filename = argv[i]; + const char *basename = strrchr(filename, '/'); /* cmake uses / even on Windows */ + if(basename == NULL) { + basename = filename; + } else { + basename++; // skip separator + } + + char *stemname = (char*) calloc(strlen(basename), 1); + strncpy(stemname, basename, strchr(basename, '.') - basename); + for(size_t j = 0; j < strlen(stemname); j++) { + if(!isalnum(stemname[j])) + stemname[j] = '_'; + } + + fprintf(header, "extern unsigned char Icon_%s[24*24*3];\n", stemname); + + fprintf(source, "unsigned char Icon_%s[24*24*3] = {\n", stemname); + write_png(source, filename); + fprintf(source, "};\n\n"); + + free(stemname); + } + + fclose(source); + fclose(header); +} diff --git a/tools/unifont2c.cpp b/tools/unifont2c.cpp new file mode 100644 index 0000000..7e9bf7a --- /dev/null +++ b/tools/unifont2c.cpp @@ -0,0 +1,261 @@ +#include +#include +#include +#include +#include + +#define die(msg) do { fprintf(stderr, "%s\n", msg); abort(); } while(0) + +#ifdef NDEBUG +#define COMPRESSION_LEVEL 9 +#else +#define COMPRESSION_LEVEL 5 +#endif + +unsigned short* read_png(const char *filename) { + FILE *fp = fopen(filename, "rb"); + if (!fp) + die("png fopen failed"); + + png_byte header[8] = {}; + if(fread(header, 1, 8, fp) != 8) + die("png fread failed"); + + if(png_sig_cmp(header, 0, 8)) + die("png_sig_cmp failed"); + + png_structp png = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL); + if(!png) + die("png_create_read_struct failed"); + + png_set_expand(png); + png_set_strip_alpha(png); + + png_infop png_info = png_create_info_struct(png); + if (!png_info) + die("png_create_info_struct failed"); + + if (setjmp(png_jmpbuf(png))) + die("png_init_io failed"); + + png_init_io(png, fp); + png_set_sig_bytes(png, 8); + + png_read_info(png, png_info); + + int width = png_get_image_width(png, png_info); + int height = png_get_image_height(png, png_info); + if(width != 16 || height != 16) + die("not a 16x16 png"); + + png_read_update_info(png, png_info); + + if (setjmp(png_jmpbuf(png))) + die("png_read_image failed"); + + png_bytepp image = (png_bytepp) malloc(sizeof(png_bytep) * height); + for (int y = 0; y < height; y++) + image[y] = (png_bytep) malloc(png_get_rowbytes(png, png_info)); + + png_read_image(png, (png_bytepp) image); + + unsigned short *glyph = (unsigned short *) calloc(16, 2); + + for(int y = 0; y < height; y++) { + for(int x = 0; x < (int)png_get_rowbytes(png, png_info); x += 3) { + unsigned char r = image[y][x + 0], + g = image[y][x + 1], + b = image[y][x + 2]; + + if(r + g + b >= 11) { + glyph[y] |= 1 << (width - x / 3); + } + } + } + + for (int y = 0; y < height; y++) + free(image[y]); + free(image); + + fclose(fp); + + png_destroy_read_struct(&png, &png_info, NULL); + + return glyph; +} + +const static unsigned short replacement[16] = { + 0xAAAA, 0xAAAA, 0xAAAA, 0xAAAA, + 0xAAAA, 0xAAAA, 0xAAAA, 0xAAAA, + 0xAAAA, 0xAAAA, 0xAAAA, 0xAAAA, + 0xAAAA, 0xAAAA, 0xAAAA, 0xAAAA, +}; + +struct CodepointProperties { + bool exists:1; + bool isWide:1; +}; + +int main(int argc, char** argv) { + if(argc < 3) { + fprintf(stderr, "Usage: %s
...\n" + " where s are mapped into private use area\n" + " starting at U+E000.\n", + argv[0]); + return 1; + } + + const int codepoint_count = 0x10000; + unsigned short **font = + (unsigned short **)calloc(sizeof(unsigned short*), codepoint_count); + CodepointProperties *properties = + (CodepointProperties *)calloc(sizeof(CodepointProperties), codepoint_count); + + const int private_start = 0xE000; + for(int i = 3; i < argc; i++) { + int codepoint = private_start + i - 3; + font[codepoint] = read_png(argv[i]); + properties[codepoint].exists = true; + } + + gzFile unifont = gzopen(argv[2], "rb"); + if(!unifont) + die("unifont fopen failed"); + + while(1) { + char buf[100]; + if(!gzgets(unifont, buf, sizeof(buf))){ + if(gzeof(unifont)) { + break; + } else { + die("unifont gzgets failed"); + } + } + + unsigned short codepoint; + unsigned short *glyph = (unsigned short *) calloc(32, 1); + bool isWide; + if( sscanf(buf, "%4hx:%4hx%4hx%4hx%4hx%4hx%4hx%4hx%4hx" + "%4hx%4hx%4hx%4hx%4hx%4hx%4hx%4hx\n", + &codepoint, + &glyph[0], &glyph[1], &glyph[2], &glyph[3], + &glyph[4], &glyph[5], &glyph[6], &glyph[7], + &glyph[8], &glyph[9], &glyph[10], &glyph[11], + &glyph[12], &glyph[13], &glyph[14], &glyph[15]) == 17) { + /* read 16x16 character */ + isWide = true; + } else if(sscanf(buf, "%4hx:%2hx%2hx%2hx%2hx%2hx%2hx%2hx%2hx" + "%2hx%2hx%2hx%2hx%2hx%2hx%2hx%2hx\n", + &codepoint, + &glyph[0], &glyph[1], &glyph[2], &glyph[3], + &glyph[4], &glyph[5], &glyph[6], &glyph[7], + &glyph[8], &glyph[9], &glyph[10], &glyph[11], + &glyph[12], &glyph[13], &glyph[14], &glyph[15]) == 17) { + /* read 8x16 character */ + for(int i = 0; i < 16; i++) + glyph[i] <<= 8; + isWide = false; + } else { + die("parse unifont character"); + } + + font[codepoint] = glyph; + properties[codepoint].exists = true; + properties[codepoint].isWide = isWide; + } + + gzclose(unifont); + + FILE *source = fopen(argv[1], "wt"); + if(!source) + die("source fopen failed"); + + const int chunk_size = 64 * 64, + chunks = codepoint_count / chunk_size; + + const int chunk_input_size = chunk_size * 16 * 16; + unsigned int chunk_output_size[chunks] = {}; + + unsigned char *chunk_data = (unsigned char *)calloc(1, chunk_input_size); + unsigned int chunk_data_index; + + fprintf(source, "/**** This is a generated file - do not edit ****/\n\n"); + + for(int chunk_index = 0; chunk_index < chunks; chunk_index++) { + chunk_data_index = 0; + + const int chunk_start = chunk_index * chunk_size; + for(int codepoint = chunk_start; codepoint < chunk_start + chunk_size; codepoint++) { + const unsigned short *glyph = font[codepoint] != NULL ? font[codepoint] : replacement; + for(int x = 15; x >= 0; x--) { + for(int y = 0; y < 16; y++) { + chunk_data[chunk_data_index++] = (glyph[y] & (1 << x)) ? 0xff : 0; + } + } + + if(font[codepoint] != NULL) + free(font[codepoint]); + } + + fprintf(source, "static const uint8_t CompressedFontTextureChunk%d[] = {\n", + chunk_start / chunk_size); + + z_stream stream; + stream.zalloc = Z_NULL; + stream.zfree = Z_NULL; + stream.opaque = Z_NULL; + if(deflateInit(&stream, COMPRESSION_LEVEL) != Z_OK) + die("deflateInit failed"); + + stream.next_in = chunk_data; + stream.avail_in = chunk_input_size; + + do { + unsigned char compressed_chunk_data[16384] = {}; + stream.next_out = compressed_chunk_data; + stream.avail_out = sizeof(compressed_chunk_data); + deflate(&stream, Z_FINISH); + + chunk_output_size[chunk_index] += sizeof(compressed_chunk_data) - stream.avail_out; + for(size_t i = 0; i < sizeof(compressed_chunk_data) - stream.avail_out; i += 16) { + unsigned char *d = &compressed_chunk_data[i]; + fprintf(source, " %3d, %3d, %3d, %3d, %3d, %3d, %3d, %3d, " + "%3d, %3d, %3d, %3d, %3d, %3d, %3d, %3d,\n", + d[ 0], d[ 1], d[ 2], d[ 3], d[ 4], d[ 5], d[ 6], d[ 7], + d[ 8], d[ 9], d[10], d[11], d[12], d[13], d[14], d[15]); + } + } while(stream.avail_out == 0); + + deflateEnd(&stream); + + fprintf(source, "};\n\n"); + } + + free(chunk_data); + free(font); + + fprintf(source, "static const struct {\n" + " size_t length;" + " const uint8_t *data;" + "} CompressedFontTexture[%d] = {\n", chunks); + for(int i = 0; i < chunks; i++) { + fprintf(source, " { %d, CompressedFontTextureChunk%d },\n", + chunk_output_size[i], i); + } + fprintf(source, "};\n\n"); + + fprintf(source, "struct GlyphProperties {\n" + " bool exists:1;\n" + " bool isWide:1;\n" + "} CodepointProperties[%d] = {\n", codepoint_count); + for(int i = 0; i < codepoint_count; i++) { + fprintf(source, " { %s, %s },\n", + properties[i].exists ? "true" : "false", + properties[i].isWide ? "true" : "false"); + } + fprintf(source, "};\n"); + + free(properties); + + fclose(source); +} diff --git a/wishlist.txt b/wishlist.txt new file mode 100644 index 0000000..f9db34a --- /dev/null +++ b/wishlist.txt @@ -0,0 +1,19 @@ +O(n*log(n)) assembly of edges into contours +fix anti-aliased edge bug with filled contours +crude DXF, HPGL import +a request to import a plane thing +make export assemble only contours in same group +rotation of model view works about z of first point under cursor +a way to kill a slow operation + +----- +rounding, as a special group +associative entities from solid model, as a special group +better level of detail +some kind of import +faster triangulation +loop detection +IGES export +incremental regen of entities + +